Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];

Вниз

конфликт двух DLL при совместном использовании   Найти похожие ветки 

 
pest ©   (2011-10-17 14:44) [0]

всем привет.

в проекте использую компонент TChromium (использующий libcef.dll) и TSslHttpCli (использующий ssleay32.dll). говоря простым языком, на форме лежит компонент браузера от хромиум и при этом я работаю с SSL через компонент ICS. рядом с экзешником положил две библиотеки для работы с ссл (ssleay32.dll и libeay32.dll) и еще несколько библиотек, которые использует хромиум.
когда запускаю программу и пытаюсь работать с SSL через TSslHttpCli, постоянно вылетают ошибки access violation по адресу 0000... как только убираю с формы хромиум и удаляю дллки, то все работает нормально.
мне кажется что происходит какой-то конфликт между этими библиотеками (ssleay32.dll и libcef.dll), только как решить эту проблему не знаю. подскадите куда копать? может как-то можно их раскидать по разным папкам и как-то приложению указать откуда с какой библиотекой работать??


 
Игорь Шевченко ©   (2011-10-17 19:51) [1]


> мне кажется что происходит какой-то конфликт между этими
> библиотеками


С чего бы ?


> подскадите куда копать?


в сторону отладчика, например.


 
Dennis I. Komarov ©   (2011-10-17 20:06) [2]


> мне кажется что происходит какой-то конфликт между этими
> библиотеками (ssleay32.dll и libcef.dll)

не, они конфликтуют с user32.dll, а та в свою очередь с kernel...
А AV - это глюки не программиста, а разработчиков Windows. Ну не знали они что есть try/except


 
pest ©   (2011-10-18 10:12) [3]

2Игорь Шевченко
>С чего бы ?
потому что AV выскакивает то в одной библиотеке то в другой, в непонятной для меня последовательности
>в сторону отладчика, например.
не понятно. что мне отладить DLL?

2Dennis I. Komarov
>не, они конфликтуют с user32.dll, а та в свою очередь с kernel...
выход какой-то же есть? или просто отказаться от совместного использования этих библиотек?


 
Ega23 ©   (2011-10-18 11:10) [4]


> что мне отладить DLL?


Ну да.


 
DiamondShark ©   (2011-10-18 11:18) [5]


> что мне отладить DLL?

Не DLL, а взаимодействие с ними. Если "AV выскакивает то в одной библиотеке то в другой, в непонятной для меня последовательности", то, к гадалке не ходи, это означает, что ты им пихаешь мусорные данные, или где-то своими кривыми действиями портишь память.
Сами-то DLL сторонних производителей и, скорее всего, ни при чём. Колобродиво в твоём коде.


 
pest ©   (2011-10-18 12:13) [6]

2DiamondShark
>Колобродиво в твоём коде.

создал специально проект. на форме валяется браузер хромиум. рядом с ехешником валяются:
для хромиума (взято из архива компонента dcef-r275)
 avcodec-53.dll
 avformat-53.dll
 avutil-51.dll
 d3dcompiler_43.dll
 d3dx9_43.dll
 icudt.dll
 libcef.dll
 libEGL.dll
 libGLESv2.dll

для работы с SSL (взято с сайта компонента ICS)
 libeay32.dll
 ssleay32.dll

сертификат (взято с сервера, требующего данный сертификат)
 cert.crt
 private.key


unit Unit2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, cef, OverbyteIcsHttpProt, OverbyteIcsWSocket;

type
 TForm2 = class(TForm)
   Chromium1: TChromium;
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
 ms: TStringStream;
 http: TSslHttpCli;
 trycounter: Integer;
 welldone: Boolean;
begin
 welldone := false;
 memo1.Clear;
 trycounter := 0;
 repeat
   Inc(trycounter);
   http := TSslHttpCli.Create(nil);
   http.RcvdStream := TStringStream.Create;
   ms := TStringStream.Create("{"method": "PingAPI"}");
   try
     http.URL := "https://soap.direct.yandex.ru/json-api/v4/";
     http.SendStream := ms;
     http.SslContext := TSslContext.Create(nil);
     http.SslContext.SslCertFile := "cert.crt";
     http.SslContext.SslPrivKeyFile := "private.key";
     try
       http.Post;
     except
       Continue;
     end;
     if http.StatusCode <> 200 then Continue;

     memo1.Lines.Text := Utf8ToAnsi(TStringStream(http.RcvdStream).DataString);
     welldone := true;
   finally
     ms.Free;
     http.Free;
     http := nil;
   end;
 until welldone or (trycounter >= 20);
end;

end.


что не так с кривыми руками? буду рад выпрямить


 
DiamondShark ©   (2011-10-18 12:19) [7]


> pest ©   (18.10.11 12:13) [6]

И в какой строке тут происходит исключение?


 
stas ©   (2011-10-18 12:20) [8]

pest ©   (18.10.11 12:13) [6]
Осталось обозначить в какой момент появляется AV.
И как подключены DLL


 
pest ©   (2011-10-18 14:46) [9]

DLL просто лежат в каталоге с программой.
ошибка возникает в модуле OverbyteIcsWSocket
в функции
procedure TCustomSslWSocket.HandleSslError;
begin
   FLastSslError := f_ERR_peek_error;  //AV ТУТ
   if FLastSslError = 0 then
       Exit;
{$IFNDEF NO_DEBUG_LOG}
   if CheckLogOptions(loSslErr) then begin
       Inc(TraceCount);
       DebugLog(loSslErr, _Format("%s  %d  [%d] %s",
                                 [_IntToHex(INT_PTR(Self), SizeOf(Pointer) * 2),
                                  FHSocket, TraceCount,
                                  LastOpenSslErrMsg(TRUE)]));
   end
   else
       f_ERR_clear_error;
{$ELSE}
   f_ERR_clear_error;
{$ENDIF}
end;


 
Ega23 ©   (2011-10-18 14:52) [10]


> ошибка возникает в модуле OverbyteIcsWSocket


99% даю, что экземпляр TCustomSslWSocket не создан. Или уже убит.


 
pest ©   (2011-10-18 14:59) [11]

2Ega23
>99% даю, что экземпляр TCustomSslWSocket не создан. Или уже убит.
я же им напрямую не управляю. что нужно сделать, как решить проблему?


 
Ega23 ©   (2011-10-18 15:02) [12]


> я же им напрямую не управляю. что нужно сделать, как решить
> проблему?


А я откуда знаю? Не моя же библиотека.
AV в том месте с ааафигенно большой вероятностью указывает на то, что экземпляр данного класса не создан. Почему - смотри отладчиком, у тебя есть CallStack.


 
pest ©   (2011-10-18 15:15) [13]

OverbyteIcsWSocket.pas.13771: FLastSslError := f_ERR_peek_error;
004FE4D1 A1CCC95100       mov eax,[$0051c9cc]
004FE4D6 8B00             mov eax,[eax]
004FE4D8 FFD0             call eax    AV ТУТ
004FE4DA 8B55FC           mov edx,[ebp-$04]
004FE4DD 8982F4060000     mov [edx+$000006f4],eax


не умею я им пользоваться. стек мне ни о чем не говорит :(

но все равно без библиотек, которые я кинул для хромиума, все работает на ура. только приходится вместо хромиума использовать tembeddedwb. и это поршиво.

может всетаки библиотеки хромиума чтото ломают, а не ICS виноват? ковырять их юниты не до конца понимая что да как у меня не получится


 
Ega23 ©   (2011-10-18 15:19) [14]


> не умею я им пользоваться. стек мне ни о чем не говорит  :(


Проблемы индейцев шерифа ...  Ну ты понел.


> может всетаки библиотеки хромиума чтото ломают


Сомневаюсь. Скорее кто-то что-то недопонимает.


 
pest ©   (2011-10-18 15:26) [15]

2Ega23
>Сомневаюсь. Скорее кто-то что-то недопонимает.
тогда, если ктото чтото может понимать, дай мне простой ответ на вопрос: почему без хромовских библиотек все работает без проблем???


 
Ega23 ©   (2011-10-18 15:27) [16]


>  дай мне простой ответ на вопрос: почему без хромовских
> библиотек все работает без проблем???


1. Я не знаю, что такое "хромовские библиотеки".
2. Я вообще не понимаю, что за задача решается.
3. Но я точно знаю, что чудес не бывает.


 
pest ©   (2011-10-18 15:36) [17]

2Ega23
а ты посты внимательно читал вообще? [6] например

задача заключается в том, что нужно в проекте иметь браузер от TChromium и иметь компоненты для работы с яндексом через SSL, используя сертификаты, которые яндекс мне дает сам. indy работает крайне нестабильно, в clever components я не нашел как подключить сертификаты самому не устанавливая их в систему. поэтому я взял за основу работы компонент ICS в часности TSslHttpCli. он работает замечательно, кроме случая, когда в проекте присутствует хромиум. что не понятного.


 
han_malign   (2011-10-18 15:59) [18]


> FLastSslError := f_ERR_peek_error;  //AV ТУТ

- подозреваю, что  функции f_ERR_xxx присутствуют в обоих библиотеках, но в одной контекст не инициализирован(за ненадобностью?)...
В этом случае надо явно квалифицировать модуль из которого берется символ - <заголовочник SslHttp>.f_ERR_xxx, либо поменять порядок подключаемых модулей в uses...


 
han_malign   (2011-10-18 16:05) [19]

З.Ы. Также нужно обратить внимание на конфликт имен функций инициализации контекста библиотек...


 
pest ©   (2011-10-18 16:16) [20]

>В этом случае надо явно квалифицировать модуль из которого берется символ
сделал. не помогает
procedure TCustomSslWSocket.HandleSslError;
begin
   FLastSslError := OverbyteIcsLIBEAY.f_ERR_peek_error;
   if FLastSslError = 0 then
       Exit;
{$IFNDEF NO_DEBUG_LOG}
   if CheckLogOptions(loSslErr) then begin
       Inc(TraceCount);
       DebugLog(loSslErr, _Format("%s  %d  [%d] %s",
                                 [_IntToHex(INT_PTR(Self), SizeOf(Pointer) * 2),
                                  FHSocket, TraceCount,
                                  LastOpenSslErrMsg(TRUE)]));
   end
   else
       f_ERR_clear_error;
{$ELSE}
   f_ERR_clear_error;
{$ENDIF}
end;


>либо поменять порядок подключаемых модулей в uses
тоже не помогает

>Также нужно обратить внимание на конфликт имен функций инициализации контекста библиотек...
что именно сделать и где?  я то библиотеки просто кинул в папку и сам не подключал. может самому подключать надо руками както? и как обнаружить конфликт имен функция?..


 
Ega23 ©   (2011-10-18 16:21) [21]


> что именно сделать и где?


Call Stack посмотреть.


 
pest ©   (2011-10-18 17:04) [22]

[21] ничем не помогает твой ответ. даже бесит немного. я ведь писал что не понимаю в стеке ничего, зачем писать бесполезный пост. если есть иное решение проблемы, то я буду ждать. а в стек лазить не смогу. именно поэтому я и задаю вопрос на форуме, потому что не знаю всех примочек в делфи


 
Ega23 ©   (2011-10-18 17:21) [23]


>  я ведь писал что не понимаю в стеке ничего, зачем писать
> бесполезный пост.


Тогда найми программиста.


 
han_malign   (2011-10-18 17:24) [24]


> что именно сделать и где?

- где вызывается OverbyteIcsLIBEAY.Load...


 
sniknik ©   (2011-10-18 17:34) [25]

> ssleay32.dll и libeay32.dll
какой версии библиотеки?

у меня была проблема на версии 1.0 на 64 разрядных машинах при том, что на сервере к которому подключался была версия 0,98k (вроде так).

ошибка была не AV, что то специфичное, но тем не менее...


 
pest ©   (2011-10-18 17:45) [26]

2Ega23
>Тогда найми программиста.
чувак, нечем помочь - не читай ветку

2han_malign
>- где вызывается OverbyteIcsLIBEAY.Load...

тут:
procedure LoadSsl;
var
   Tick : Cardinal;
   S    : String;
{$IFDEF LOADSSL_ERROR_FILE} // Optional define in OverbyteIcsSslDefs.inc
   F    : TextFile;
   I, J : Integer;
{$ENDIF}
begin
   _EnterCriticalSection(SslCritSect);
   try
       if SslRefCount = 0 then begin
           // Load LIBEAY DLL
           // Must be loaded before SSlEAY for the versioncheck to work!
           if not OverbyteIcsLIBEAY.Load then begin
           {$IFDEF LOADSSL_ERROR_FILE}
               AssignFile(F, _ExtractFilePath(ParamStr(0)) + "FailedIcsLIBEAY.txt");
               Rewrite(F);
               S := OverbyteIcsLIBEAY.WhichFailedToLoad;
               I := 1;
               while I < Length(S) do begin
                   J := I;
                   while (I <= Length(S)) and (S[I] <> " ") do
                       Inc(I);
                   Inc(I);
                   WriteLn(F, Copy(S, J, I - J));
               end;
               CloseFile(F);
           {$ENDIF}
               if OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle <> 0 then begin
                   _FreeLibrary(OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle);
                   OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle := 0
               end;
               raise EIcsLibeayException.Create("Unable to load LIBEAY DLL. Can""t find " + S);
           end;
           // Load SSlEAY DLL
           if not OverbyteIcsSSLEAY.Load then begin
           {$IFDEF LOADSSL_ERROR_FILE}
               AssignFile(F, _ExtractFilePath(ParamStr(0)) + "FailedIcsSSLEAY.txt");
               Rewrite(F);
               S := OverbyteIcsSSLEAY.WhichFailedToLoad;
               I := 1;
               while I < Length(S) do begin
                   J := I;
                   while (I <= Length(S)) and (S[I] <> " ") do
                       Inc(I);
                   Inc(I);
                   WriteLn(F, Copy(S, J, I - J));
               end;
               CloseFile(F);
           {$ENDIF}
               if OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle <> 0 then begin
                   _FreeLibrary(OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle);
                   OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle := 0;
               end;
               if OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle <> 0 then begin
                   _FreeLibrary(OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle);
                   OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle := 0
               end;
               raise EIcsSsleayException.Create("Unable to load SSLEAY DLL. Can""t find " + S);
           end;

           // Global system initialization
           if f_SSL_library_init <> 1 then begin
               if OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle <> 0 then begin
                   _FreeLibrary(OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle);
                   OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle := 0;
               end;
               if OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle <> 0 then begin
                   _FreeLibrary(OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle);
                   OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle := 0
               end;
           end;
           f_SSL_load_error_strings;
           Tick := _GetTickCount;           // probably weak
           f_RAND_seed(@Tick, SizeOf(Tick));
       {$IFNDEF OPENSSL_NO_ENGINE}
           //* Load all bundled ENGINEs into memory and make them visible */
           f_ENGINE_load_builtin_engines;
       {$ENDIF}
       end; // SslRefCount = 0
       Inc(SslRefCount);
   finally
       _LeaveCriticalSection(SslCritSect);
   end;
end;


нашел места где загружаются библиотеки libeay32.dll и ssleay32.dll и поменял путь загрузки на другую папку на всякий случай. но ничего не изменилось.
и еще: AV возникает до того как вызывается функция LoadSsl


 
pest ©   (2011-10-18 17:47) [27]

2sniknik
версия библиотек 0.9.8h
работаю на win7*64 delphi xe


 
_Юрий   (2011-10-18 20:03) [28]


> procedure TCustomSslWSocket.HandleSslError;
> begin
>    FLastSslError := f_ERR_peek_error;  //AV ТУТ
>


Надо поставить тут брекпоинт, и посмотреть, чему равен Self
не nil ли(не был создан?)
если не nil, то проверить, живые ли его остальные поля, корректно ли возвращается ClassName - другими словами, жив ли объект

Если не жив, поставить брекпоинты в конструкторе и деструкторе и анализировать, в какой момент экземпляр создается а в какой разрушается, и кем, и почему мы попали на метод после разрушения.
Если ошибка связана с досрочным разрушением объекта - то ее локализовать не очень трудно.
Самый плохой вариант - если память бьется вследствие некорректной работы на низком уровне - например промахнулись при вызове Move. Самый плохой потому, что труднее всего найти причину. В этом случае надо использовать дополнительные инструменты, например FastMem


 
Игорь Шевченко ©   (2011-10-18 20:21) [29]


> чувак, нечем помочь - не читай ветку


> ничем не помогает твой ответ. даже бесит немного. я ведь
> писал что не понимаю в стеке ничего


тебе в самом начале сказано - используй отладчик. Не умеешь использовать - читай доку. Не хочешь читать - иди на платные курсы.


 
pest ©   (2011-10-19 09:54) [30]

2Игорь Шевченко
>тебе в самом начале сказано - используй отладчик. Не умеешь использовать - читай доку. Не хочешь читать - иди на платные курсы.

мда..., еще один. судя по твоему "умному" комменту, такие форумы вообще не нужны. все должны читать доки или платить. а как на счет учиться постепенно? на данный момент мне нужно достигнуть результат, чтобы программа работала, но затрачивать время на изучение относительно нового для меня направления чтобы разобраться в чужом коде я сейчас не могу. именно по этому я и решил спросить у более опытных людей, может кто-то уже сталкивался с такой проблемой и сразу поделится опытом и я не буду поднимать мануалы и лазить в код ассемблера и тд. неужели так сложно удержать себя не по умничать? ведь люди отписываются и нормально пытаются помочь, без всяких "погугли" или "найми".


 
pest ©   (2011-10-19 09:59) [31]

2_Юрий
>если не nil, то проверить, живые ли его остальные поля, корректно ли возвращается ClassName - другими словами, жив ли объект

проверил он не нил и имя класса TSslWSocket и в self пошарился тоже вроде живой. я не пойму что означает такое описание:
const
  ...
   f_ERR_peek_error :                         function : Cardinal; cdecl = nil;

"cdecl" я понял что такое "= nil" естесственно тоже. но описание константы как "function : Cardinal;" я не пойму. может просто делать проверку f_ERR_peek_error на nil и чем-то самому ее заполнять?


 
Ega23 ©   (2011-10-19 10:17) [32]


> pest ©   (19.10.11 09:54) [30]


>  судя по твоему "умному" комменту,
... бла-бла-бла....
>  ведь люди отписываются и нормально пытаются помочь,


Тебе искренне пытались помочь. Советовали встать бряком на строку с AV и посмотреть Call Stack (View -> Debug Windows -> Call Stack). Это нужно, чтобы понять, что откуда вызывается. И хоть как-то изначально детектировать ситуацию.
Но нет, тебе посмотреть влом, только к 30-му посту мы узнаём, что f_ERR_peek_error это не какое-то поле, а функция и т.д.
Плюс хамишь.
Я бы принципиально такому поциэнту не ответил, честно. Даже полностью сходу зная ответ.


 
pest ©   (2011-10-19 10:27) [33]

2Ega23
>Тебе искренне пытались помочь. Советовали встать бряком на строку с AV и посмотреть Call Stack (View -> Debug Windows -> Call Stack). Это нужно, чтобы понять, что откуда вызывается. И хоть как-то изначально детектировать ситуацию.
я посмотрел и сразу же отписал что в этом Call Stack в посте [13]. после чего предупредил что им пользоваться не умею. и не влом было посмотреть а сразу же посмотрел. и не в 30 посте а в 13. и не хамил я а просто не хотел менять тему проблемы моего кода на проблему общения с тобой. а если изначально не получил от меня хамства как от первого, то откуда появится принцип не помогать? и даже если есть такой принцип, то зачем сейчас продолжать весь этот базар и гадить в ветке? для меня важнее решать проблему кода, а не обсуждать социальные недопонимания


 
Ega23 ©   (2011-10-19 10:33) [34]


> я посмотрел и сразу же отписал что в этом Call Stack в посте
> [13].


Это не Call Stack. Это CPU-Window. Тебя просили другое.


> откуда появится принцип не помогать?


Оттуда. Тебе нужна помощь в решении проблемы, или чтобы эту проблему за тебя кто-то решил? Если первое - так потрудись хотя бы выдать то, что тебя просят посмотреть. Если второе - выкладывай ТЗ и объявляй сумму, за тебя всё сделают быстро и аккуратно.


>  то зачем сейчас продолжать весь этот базар и гадить в ветке?

Ну пока что гадишь именно ты.


 
pest ©   (2011-10-19 10:57) [35]

>Это не Call Stack. Это CPU-Window. Тебя просили другое.

возникла ошибка, нажал Break и посмотрел в окошке Call Stack. там дважды кликнул на строке, на которой стоял курсор и открылось CPU.
разве не очевидно, что если я не умею пользоваться Call Stack то я могу ошибиться как в него просто посмотреть даже? при желании мог бы тогда сразу мне об этом сказать и я посмотрел бы иначе. и было бы меньше разговоров.
>Тебе нужна помощь в решении проблемы
да. и я стараюсь по мере своих знаний давать то, о чем просят на протяжении всей ветки. даже этот стек попытался посмотреть, хотя не понимаю что там.
>или чтобы эту проблему за тебя кто-то решил
за халявой никогда не обращался и не собираюсь. я сам получаю деньги за то, что делаю. и не думаю что кому-то кайф делать за меня работу. а вот поделиться профессиональным опытом не считаю чем неестественным. я не в наглую говорю сделайте мне. я пытаюсь разобраться, задаю вопросы, лезу в код. все по мере возможностей.
а если изначально смотреть на каждого кто задает вопрос как на халявщика, то зачем утруждаться и вообще читать форумы. просто не отвечай и все. кому надо тот поможет советом и без всяких мыслей что ты на нем зарабатываешь


 
Ega23 ©   (2011-10-19 11:10) [36]


> поможет советом и без всяких мыслей что ты на нем зарабатываешь


Тебе 50 раз уже сказали: используй отладчик.

З.ы. Надоело. Желаю успехов в поиске ошибки.


 
pest ©   (2011-10-19 11:24) [37]

и на том спасибо



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.025 c
15-1318427502
Бездомный
2011-10-12 17:51
2012.01.29
Юморок


1-1282384267
MSV
2010-08-21 13:51
2012.01.29
Двустрорнняя печать


2-1318932404
rammic
2011-10-18 14:06
2012.01.29
Как применить FindComponent на дочерних окнах


1-1282292479
TComponent
2010-08-20 12:21
2012.01.29
Компонент для сетевой структуры


2-1319363512
Nucer
2011-10-23 13:51
2012.01.29
Список записей с быстрым поиском по ключу int64





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский