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

Вниз

Обработка в потоках   Найти похожие ветки 

 
Term ©   (2005-12-13 12:08) [0]

Работаю с БД из двух TThread, они между собой не пересекаются, т.е используют каждый только свои компоненты.

Так как они не пересекаются то я их и не синхронизировал. Но при работе наблюдаются глюки, то строчки в БД не пропишутся(при append"е), то TGauge начинает глючить (отрисовывается неправильно) и т.д.

Что можете посоветовать


 
Васяня   (2005-12-13 12:10) [1]

Управление трансзакциями? :)


 
Reindeer Moss Eater ©   (2005-12-13 12:14) [2]

Что можете посоветовать
Быть внимательным


 
Term ©   (2005-12-13 12:17) [3]

транзакция в каждом потоке своя...

да и если процедуру запускать не в потоке, то никаких глюков не наблюдается


 
Reindeer Moss Eater ©   (2005-12-13 12:19) [4]

У тебя ошибка в 17 строке


 
Васяня   (2005-12-13 12:21) [5]


> Term ©  

Я не имею ввиду непосредственную трансзакцию записи в БД... наверное не правильную формулировку я дал, скорее я имел ввиду что тебе надо чтобы потоки неким образом были связаны и было понятно что и какой из них что делает...

Я не знаю что именно там у тебя происходит в потоках, но может вдруг у тебя один удаляет строку, а другой ее модифицирует и отсюда калапс?


 
Term ©   (2005-12-13 12:27) [6]


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


нет в том то и дело работают с разными таблицами!!!! они вообще нигде не пересекаются!!!


 
Игорь Шевченко ©   (2005-12-13 12:28) [7]

Обычно для разных потоков рекомендуется делать свое подключение к базе данных для каждого потока.


 
Term ©   (2005-12-13 12:40) [8]


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

так и есть


 
Term ©   (2005-12-13 12:41) [9]

у каждого потока свой TDataModule, может там где обращаюсь к компонентам, всё делать в Synhronize?


 
Васяня   (2005-12-13 12:46) [10]

А что за БД?


 
Игорь Шевченко ©   (2005-12-13 12:46) [11]

Тогда без кода затруднительно диагностировать


 
Term ©   (2005-12-13 12:47) [12]

MSSQL2000


 
Васяня   (2005-12-13 12:51) [13]


> Term ©


А провайдер какой?


 
Term ©   (2005-12-13 13:01) [14]

вот коды потоков

unit Unit5;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, Halcn6db;

 procedure Great_Prihod_Pereliv(zag_dir,zag_filename:string);
 function Open_Stroki_Prihod(Stroka:string;var st_dir,st_filename:string):boolean;
 function minuts(param:real):string;
 procedure GREAT_pereliv(zag_dir,zag_filename:string);

 function Open_Stroki_Rashod(var st_dir,st_filename:string):boolean;
 function Open_Skidki:boolean;

 type
 TPrihod = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
   procedure Start;
 end;

 type
 TRashod = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
   procedure Start;
 end;

var kol_zagolovkov, kol_strok:integer;
   Kol_StrRas_Perelito, Kol_Rashod_Open,n_rashod:integer;

   kol_prihod_open, prihod_perelito,n_prihod:integer;

   Prihod_begin, Rashod_begin:boolean;

   Prihod:TPrihod;
   Rashod:TRashod;

   time1, time2:TTime;

implementation

uses Unit3, Unit3_1, Unit2, Unit4;

////////////ïîòîê ïðèõîäà/////////////////
procedure TPrihod.Execute;
begin
//Synchronize(ConectDB);
Prihod.FreeOnTerminate:=true;
Start;
end;

procedure TPrihod.Start;
begin
Prihod_Zaliv.P_Zagolovki.First;

kol_zagolovkov:=0;
kol_strok:=0;

time1:=0;
Prihod_Zaliv.Timer1.Enabled:=true;
Prihod_Zaliv.Timer2.Enabled:=true;
while not Prihod_Zaliv.P_Zagolovki.Eof do
       begin
       if FileExists(Prihod_Zaliv.P_Zagolovki.FieldByName("DIR").AsString+"\P_temp.cdx") then DeleteFile(Prihod_Zaliv.P_Zagolovki.FieldByName("DIR").AsString+"\P_temp.cdx");
       Prihod_Zaliv.HO_Inx_pr.DatabaseName:=Prihod_Zaliv.P_Zagolovki.FieldByName("DIR").AsString;
       Prihod_Zaliv.HO_Inx_pr.TableName:=Prihod_Zaliv.P_Zagolovki.FieldByName("FILE").AsString;
       Prihod_Zaliv.HO_Inx_pr.Open;
       Prihod_Zaliv.HO_Inx_pr.IndexOn("P_TEMP.cdx","NUMDC4","NUMDC4","",Duplicates, Ascending);
       Prihod_Zaliv.HO_Inx_pr.Close;

       Great_Prihod_Pereliv(Prihod_Zaliv.P_Zagolovki.FieldByName("DIR").AsString, Prihod_Zaliv.P_Zagolovki.FieldByName("FILE").AsString);
       ////////////////
       Prihod_Zaliv.P_Zagolovki.Next;
       end;
Prihod_Zaliv.Timer1.Enabled:=false;
Prihod_Zaliv.Timer2.Enabled:=false;
Prihod_begin:=false;
end;
//////////////////////////////////////////

////////ïîòîê ðàñõîäà/////////////////////
procedure TRashod.Execute;
begin
//Synchronize(ConectDB);
Rashod.FreeOnTerminate:=true;
Start;
end;

procedure TRashod.Start;
begin
Zaliv_Rashod.Zagolovki.First;
time2:=0;
Zaliv_Rashod.Timer1.Enabled:=true;
Zaliv_Rashod.Timer2.Enabled:=true;
while not Zaliv_Rashod.Zagolovki.Eof do
       begin
       GREAT_pereliv(Zaliv_Rashod.Zagolovki.FieldByName("DIR").AsString,Zaliv_Rashod.Zagolovki.FieldByName("FILE").AsString);
       ////////////
       Zaliv_Rashod.Zagolovki.Next;
       Application.ProcessMessages;
       end;
Zaliv_Rashod.Timer1.Enabled:=false;
Zaliv_Rashod.Timer2.Enabled:=false;
Rashod_begin:=false;
end;
//////////////////////////////////////////


 
Digitman ©   (2005-12-13 13:05) [15]


> Application.ProcessMessages


убрать !


 
Term ©   (2005-12-13 13:06) [16]

для работы с базой использую АДО

procedure Great_Prihod_Pereliv(zag_dir,zag_filename:string);
procedure GREAT_pereliv(zag_dir,zag_filename:string);


в них в цикле производится вставка в базу, каждая процедура использует свой конект


 
Игорь Шевченко ©   (2005-12-13 13:06) [17]

А где отдельное подключение к базе у каждого потока ?


 
Digitman ©   (2005-12-13 13:07) [18]

и зачем нужен таймер этому "самогонному аппарату" ?)


 
Term ©   (2005-12-13 13:07) [19]


> > Application.ProcessMessages
>
>
> убрать !

внутри
procedure Great_Prihod_Pereliv(zag_dir,zag_filename:string);
procedure GREAT_pereliv(zag_dir,zag_filename:string);


Application.ProcessMessages тоже есть, его тоже убрать?


 
Digitman ©   (2005-12-13 13:14) [20]

везде убрать !


 
Term ©   (2005-12-13 13:17) [21]


> А где отдельное подключение к базе у каждого потока ?

Каждый поток работает со свои TDataModule


 
Игорь Шевченко ©   (2005-12-13 13:21) [22]


> Каждый поток работает со свои TDataModule


Код датамодулей в студию


 
Term ©   (2005-12-13 13:22) [23]


> и зачем нужен таймер этому "самогонному аппарату" ?)

в таймере время до окончания считаю каждые 10 сек


 
Digitman ©   (2005-12-13 13:26) [24]

1. метод Start убрать из public в private или protected
2. убрать обращения к таймерам, да и сами таймеры - они здесь ни к чему
3. где происходит открытие НД Prihod_Zaliv.P_Zagolovki и Zaliv_Rashod.Zagolovki ?


 
Term ©   (2005-12-13 13:26) [25]

вот TDataModule, второй такойже только под номером 2
unit Unit3;

interface

uses
 SysUtils, Classes, DB, Halcn6db, Dialogs, ADODB, DBTables;

type
 TDataModule1 = class(TDataModule)
   COMPBS: THalcyonDataSet;
   FIRMBS: THalcyonDataSet;
   CNTRBS: THalcyonDataSet;
   WRMODREF: THalcyonDataSet;
   Str_In: THalcyonDataSet;
   HI: THalcyonDataSet;
   NastrBase: THalcyonDataSet;
   ADOConnection1: TADOConnection;
   Pereliv: TADOQuery;
   WSKLADBS: THalcyonDataSet;
   Pereliv1: TADOQuery;
   Spr_Aptek: TADOQuery;
   Spr_Medcine: TADOQuery;
   RFCL2005: THalcyonDataSet;
   RFDR2005: THalcyonDataSet;
   PKINDBS: THalcyonDataSet;
   WRMKCREF: THalcyonDataSet;
   Personal: TADOQuery;
   Spr_Vid_Oplata: TADOQuery;
   CDOP2BS: THalcyonDataSet;
   Spr_Code_OperRashod: TADOQuery;
   Spr_MagnCard: TADOQuery;
   DataSource1: TDataSource;
   DataSource2: TDataSource;
   LOG: THalcyonDataSet;
   Sravn_PrihBUF: TADOQuery;
   Sravn_Rash: TADOQuery;
   DataSource3: TDataSource;
   Sravn_PrihDetalBUF: TADOQuery;
   Prihod_MasterLOG: TADOQuery;
   Update_Prihod: TADOQuery;
   Update_Prihod_Detal: TADOQuery;
   DataSource4: TDataSource;
   Sravn_RashDetalBUF: TADOQuery;
   Rashod_MasterLOG: TADOQuery;
   Update_Rashod: TADOQuery;
   Update_Rashod_Detal: TADOQuery;
   CDOP1BS: THalcyonDataSet;
   Spr_Code_OperPrihod: TADOQuery;
   Prihod_MasterLOG1: TADOQuery;
   OTCH_Prihod: TADOQuery;
   OTCH_Rashod: TADOQuery;
   Rashod_MasterLOG1: TADOQuery;
   Pereliv2: TADOQuery;
   Typ_Id: TADOQuery;
   DataSource5: TDataSource;
   HO: TTable;
   OT: TTable;
   DS: TTable;
   HO1: TTable;
   OT1: TTable;
   DS1: TTable;
   Sravn_SkidkiBUF: TADOQuery;
   DataSource6: TDataSource;
   procedure DataModuleCreate(Sender: TObject);
   procedure FIRMBSFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure COMPBSAfterScroll(DataSet: TDataSet);
   procedure CNTRBSFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure ADOConnection1AfterConnect(Sender: TObject);
   procedure OT1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure DS1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure HO1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure OTFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure HOAfterScroll(DataSet: TDataSet);
   procedure DSFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure OTAfterScroll(DataSet: TDataSet);
   procedure HOFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure LOGFilterRecord(DataSet: TDataSet; var Accept: Boolean);
   procedure HIFilterRecord(DataSet: TDataSet; var Accept: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 DataModule1: TDataModule1;

implementation

uses Unit19, Unit1, Unit2;

{$R *.dfm}

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
try
NastrBase.Open;
LOG.Open;
except
ShowMessage("Ôàéë íàñòðîåê ïîâðåæä¸í èëè íåäîñòóïåí");
end;

try
DataModule1.ADOConnection1.Connected:=false;
DataModule1.ADOConnection1.ConnectionString:=
"Provider=SQLOLEDB.1;Password="+DataModule1.NastrBase.FieldByName("PASSWORD").AsString+
                             ";Persist Security Info=True;User ID="+DataModule1.NastrBase.FieldByName("LOGIN").AsString+
                             ";Initial Catalog=Apteka_New;Data Source="+DataModule1.NastrBase.FieldByName("SERVER").AsString;
DataModule1.ADOConnection1.Connected:=true;
Form1.StatusBar1.Panels[0].Text:="Ñîåäèíåíèå ñ SQL-ñåðâåðîì óñïåøíî";
except
ShowMessage("Ñåðâåð íå äîñòóïåí");
end;
end;

procedure TDataModule1.FIRMBSFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
if DataSet.FieldByName("Code0").AsInteger=DataModule1.COMPBS.FieldByName("FIRMC132").AsInteger then
       Accept:=true else Accept:=false;
end;

procedure TDataModule1.COMPBSAfterScroll(DataSet: TDataSet);
begin
DataModule1.FIRMBS.Filtered:=true;
DataModule1.CNTRBS.Filtered:=true;
end;

procedure TDataModule1.CNTRBSFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
if DataSet.FieldByName("Code0").AsInteger=DataModule1.COMPBS.FieldByName("CNTRC134").AsInteger then
       Accept:=true else Accept:=false;
end;

procedure TDataModule1.ADOConnection1AfterConnect(Sender: TObject);
begin
DataModule1.Spr_Aptek.Open;
DataModule1.Spr_Code_OperRashod.Open;
DataModule1.Spr_Code_OperPrihod.Open;
DataModule1.Spr_MagnCard.Open;
//////////////////////////////////////////
DataModule1.LOG.Open;
end;

procedure TDataModule1.OT1FilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
try
if DataSet.FieldByName("SUPPC4").AsString=DataModule1.HO.FieldByName("SUPPC8").AsString then
            Accept:=true else Accept:=false;
except
end;
end;

procedure TDataModule1.DS1FilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
try
if (DataSet.FieldByName("SUPPC4").AsString=DataModule1.OT.FieldByName("SUPPC4").AsString)and
  (DataSet.FieldByName("STRBA28").AsString=DataModule1.OT.FieldByName("STRBA14").AsString) then
       Accept:=true else Accept:=false;
except
end;

end;

procedure TDataModule1.HO1FilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
//if DataSet.FieldByName("DCMSO700").AsInteger=3 then Accept:=false
//        else Accept:=true;
end;

procedure TDataModule1.OTFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
try
if (DataSet.Active)and(DataModule1.HO.Active) then
       if DataSet.FieldByName("SUPPC4").AsInteger=DataModule1.HO.FieldByName("SUPPC8").AsInteger then
               Accept:=true else Accept:=false;
except
end;
end;



 
Term ©   (2005-12-13 13:27) [26]

еще половинка

procedure TDataModule1.HOAfterScroll(DataSet: TDataSet);
begin
if DataModule1.OT.Active then DataModule1.OT.Filtered:=true;
end;

procedure TDataModule1.DSFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
if (DataSet.FieldByName("NUMDC0").Value=DataModule1.OT.FieldByName("NUMDC0").Value)and
  (DataSet.FieldByName("SUPPC4").Value=DataModule1.OT.FieldByName("SUPPC4").Value)and
  (DataSet.FieldByName("STRBA28").AsString=DataModule1.OT.FieldByName("STRBA14").AsString)and

  (DataSet.FieldByName("COMPC8").Value=DataModule1.OT.FieldByName("COMPC8").Value)and
  (DataSet.FieldByName("COMPN10").Value=DataModule1.OT.FieldByName("COMPN10").Value)and
  (DataSet.FieldByName("MODNU12").Value=DataModule1.OT.FieldByName("MODNU12").Value)and
  (DataSet.FieldByName("UNIPR16").Value=DataModule1.OT.FieldByName("UNIPR511").Value)and
  (DataSet.FieldByName("NUMST14").Value=DataModule1.OT.FieldByName("NUMST55").Value)and

  (DataSet.FieldByName("PRICE176").Value=DataModule1.OT.FieldByName("PRICE86").Value) and
  (DataSet.FieldByName("NUMPA20").Value=DataModule1.OT.FieldByName("NUMPA106").Value) and
  (DataSet.FieldByName("NUMPA24").Value=DataModule1.OT.FieldByName("NUMPA110").Value) and

  (DataSet.FieldByName("QNT172").Value=DataModule1.OT.FieldByName("QNT45").Value)then
       Accept:=true else Accept:=false;
end;

procedure TDataModule1.OTAfterScroll(DataSet: TDataSet);
begin
if DataModule1.DS.Active then DataModule1.DS.Filtered:=true;
end;

procedure TDataModule1.HOFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
//if DataSet.FieldByName("NUMSK17").AsInteger=0 then Accept:=false
//        else Accept:=true;
end;

procedure TDataModule1.LOGFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
//if DataSet.FieldByName("DATA").AsDateTime=Log_Form.DateEdit1.Date then
//        Accept:=true else Accept:=false;
end;

procedure TDataModule1.HIFilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
//if DataSet.FieldByName("NUMSK10").AsInteger=0 then Accept:=true
//        else Accept:=false;
end;

end.


 
Term ©   (2005-12-13 13:27) [27]

одним постом не поместилось


 
Term ©   (2005-12-13 13:31) [28]

проблема в том что не в потоке все работает нормально, а в потоках начинаются глюки


 
Term ©   (2005-12-13 13:38) [29]

что нет так ??? вроде всё простенько


 
Игорь Шевченко ©   (2005-12-13 13:38) [30]

Тебе уже два раза сказали, что у каждого потока должно быть свое подключение.


 
Term ©   (2005-12-13 13:42) [31]


> Тебе уже два раза сказали, что у каждого потока должно быть
> свое подключение.


ну я же так и делаю два TDataModule, для каждого потока свой, и там для каждого потока свой TADOConnection, вроде так и есть....


 
Term ©   (2005-12-13 13:51) [32]

Удалено модератором
Примечание: Создание пустых сообщений


 
Term ©   (2005-12-13 13:52) [33]

Удалено модератором
Примечание: Создание пустых сообщений


 
Игорь Шевченко ©   (2005-12-13 13:54) [34]

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


 
evvcom ©   (2005-12-13 14:10) [35]


> в котором три дня разбираться надо

во-во, и мне лень.
2автор: Ответь-ка на вопрос. Там у тебя TDataSource есть, ты случаем где-нить в дбгриде или типа того не отображаешь эти НД?

> то TGauge начинает глючить (отрисовывается неправильно)

а его где и как показываешь?


 
Term ©   (2005-12-13 14:24) [36]


> 2автор: Ответь-ка на вопрос. Там у тебя TDataSource есть,
>  ты случаем где-нить в дбгриде или типа того не отображаешь
> эти НД?


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

значит оно так на форме есть грид в нём список файлов для обработки
по списку бежит вот этот кусок

////////////ïîòîê ïðèõîäà/////////////////
procedure TPrihod.Execute;
begin
//Synchronize(ConectDB);
Prihod.FreeOnTerminate:=true;
Start;
end;

procedure TPrihod.Start;
begin
Prihod_Zaliv.P_Zagolovki.First;

kol_zagolovkov:=0;
kol_strok:=0;

time1:=0;
Prihod_Zaliv.Timer1.Enabled:=true;
Prihod_Zaliv.Timer2.Enabled:=true;
while not Prihod_Zaliv.P_Zagolovki.Eof do
      begin
      if FileExists(Prihod_Zaliv.P_Zagolovki.FieldByName("DIR").AsString+"\P_temp.cdx") then DeleteFile(Prihod_Zaliv.P_Zagolovki.FieldByName("DIR").AsString+"\P_temp.cdx");
      Prihod_Zaliv.HO_Inx_pr.DatabaseName:=Prihod_Zaliv.P_Zagolovki.FieldByName("DIR").AsString;
      Prihod_Zaliv.HO_Inx_pr.TableName:=Prihod_Zaliv.P_Zagolovki.FieldByName("FILE").AsString;
      Prihod_Zaliv.HO_Inx_pr.Open;
      Prihod_Zaliv.HO_Inx_pr.IndexOn("P_TEMP.cdx","NUMDC4","NUMDC4","",Duplicates, Ascending);
      Prihod_Zaliv.HO_Inx_pr.Close;

      Great_Prihod_Pereliv(Prihod_Zaliv.P_Zagolovki.FieldByName("DIR").AsString, Prihod_Zaliv.P_Zagolovki.FieldByName("FILE").AsString);
      ////////////////
      Prihod_Zaliv.P_Zagolovki.Next;
      end;
Prihod_Zaliv.Timer1.Enabled:=false;
Prihod_Zaliv.Timer2.Enabled:=false;
Prihod_begin:=false;
end;
//////////////////////////////////////////


в процедуре Great_Prihod_Pereliv(Prihod_Zaliv.P_Zagolovki.FieldByName("DIR").AsString, Prihod_Zaliv.P_Zagolovki.FieldByName("FILE").AsString);

бежит по таблицам, эти данные нигде в грид не выводятся, только увеличивается прогресс у TGauga, и еще на статус бар отображается количество обработанных записей


 
Digitman ©   (2005-12-13 14:29) [37]


> Term ©   (13.12.05 14:24) [36]


обращения к визуальным VCL-контролам в контексте НЕосновного код.потока НЕдопустимы !


 
Term ©   (2005-12-13 14:33) [38]


> обращения к визуальным VCL-контролам в контексте НЕосновного
> код.потока НЕдопустимы !

а скажем если нужно чтото вывести на статус бар, это должно быть в Synchronize ?


 
Term ©   (2005-12-13 14:40) [39]


> обращения к визуальным VCL-контролам в контексте НЕосновного
> код.потока НЕдопустимы !


да же в том случае если для каждого потока DBGrid свой?


 
Term ©   (2005-12-13 14:48) [40]

Удалено модератором
Примечание: Создание пустых сообщений



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

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

Наверх





Память: 0.58 MB
Время: 0.012 c
14-1134052240
begin...end
2005-12-08 17:30
2006.01.01
С Днём рождения! 8 декабря


8-1121952080
MegaVolt
2005-07-21 17:21
2006.01.01
Как повернуть JPG не перекодируя?


14-1134222393
Pazitron_Brain
2005-12-10 16:46
2006.01.01
Помогите


14-1133873705
Бамбук
2005-12-06 15:55
2006.01.01
VC++: рантайм библиотеки


2-1134560170
sanich
2005-12-14 14:36
2006.01.01
Непонятная ошибка при работе с таблицей





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский