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

Вниз

Впервые в команде. Думал, прикалываетесь.   Найти похожие ветки 

 
Romkin ©   (2008-05-15 11:34) [40]

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


 
Игорь Шевченко ©   (2008-05-15 11:37) [41]

Romkin ©   (15.05.08 11:34) [40]


> Глубокое заблуждение, что начинающий пишет с той же скоростью,
>  что и опытный.


Начинающий даже быстрее может писать. Вот только исправлять за ним потом дольше


 
Юрий Зотов ©   (2008-05-15 11:38) [42]

> Поп Гапон   (14.05.08 20:21) [15]

Принимаем, что зарплата ведущего равна 3-м студенческим. Получаем вот что.

1. Вариант: 3 студента плюс ведущий.

 3*1 - зарплата 3 студентов за месяц;
 0.5*3 - зарплата ведущего за консультации студентов и правку их кода в том же месяце;
 0.5*3 - зарплата ведущего за следующий месяц, в котором он писал тот код, который недописал в предыдущем месяце  из-за того, что потратил время на студентов и правку их кода.

Итого на суммарный код потрачено 1.5 месяца, 6 зарплат, отчисления конторы за 4-х человек, стоимость аренды площади 4-х рабочих мест и амортизация 4-х компов. Плюс время и зарплата, потраченные потом на ловлю оставшихся студенческих багов. Плюс недовольство заказчика (программа глючит, срок ее сдачи затягивается). Из-за этого - возможная потеря престижа конторы (а оно в немалые деньги обойтись может).

2. Вариант: два ведущих.

Итого на суммарный код потрачено 1 месяц, 6 зарплат, отчисления конторы за 2-х человек, стоимость аренды площади 2-х рабочих мест и амортизация 2-х компов.

Вот такая арифметика. Два ведущих по срокам - быстрее, по деньгам - дешевле, по качеству - лучше.


 
Romkin ©   (2008-05-15 11:42) [43]

Впрочем, не так страшен код с непонятными названиями и без комментариев, как код с большой связностью. Это когда покрутил что-то в одном месте - и гадость лезет в куче других, совершенно неожиданно :)
Вещи эти в какой-то мере взаимосвязаны: если код написан как курица лапой, то скорее всего и вся программа будет единым куском в стиле "не трогать!!!!!!!". Но иногда бывают программы "переходного периода", комментарии есть - а трогать нельзя.
Так вот, о чем я: программу такую часто легче переписать, чем привести в нормальный вид. К сожалению, такой опыт уже был :(


 
TUser ©   (2008-05-15 12:04) [44]

А откуда возьмутся ведущие, если везде кроме трех студентов посадить одного опытного?


 
MsGuns ©   (2008-05-15 12:05) [45]

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

За 2 года, что я работаю с молодежью, у меня был только один момент, когда молодому надо было не просто объяснить, но и слегка придавить "авторитетом", чтобы соблюдал.

Сейчас у нас несколько десятков проектов, написанных разными программистами. Любой из них легко въезжает" в любой проект. Правда, необходимо заметить, что очень много реализовано в библиотечных юнитах "системного" назначения.


 
Style ©   (2008-05-15 12:05) [46]


> Впрочем, не так страшен код с непонятными названиями и без
> комментариев, как код с большой связностью. Это когда покрутил
> что-то в одном месте - и гадость лезет в куче других, совершенно
> неожиданно :)
> Вещи эти в какой-то мере взаимосвязаны: если код написан
> как курица лапой, то скорее всего и вся программа будет
> единым куском в стиле "не трогать!!!!!!!". Но иногда бывают
> программы "переходного периода", комментарии есть - а трогать
> нельзя.


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


 
keymaster ©   (2008-05-15 12:10) [47]


>  Во-вторых, каждому вновь пришедшему дать эти все стандарты
> и приказать иметь их на столе в печатном формате.

Необязательно.
Когда я работал в известной компании, у нас все стандарты лежали на сервере в общем доступе.


 
MsGuns ©   (2008-05-15 12:16) [48]

Практика показывает, что печатный материал лучше "инсталлится" в мозги, чем экранный. К тому же можно карандашом пометить для Пети одни разделы, а для Тани - другие для первоочередного "усвояевания" ;)


 
Style ©   (2008-05-15 12:21) [49]


> Практика показывает, что печатный материал лучше "инсталлится"
> в мозги, чем экранный.


Это от типа мозга, зависит. Современный универсальный мозг, способен воспринимать информацию на разных носителях )


 
KSergey ©   (2008-05-15 12:23) [50]

> MsGuns ©   (15.05.08 12:05) [45]
>  но и слегка придавить "авторитетом", чтобы соблюдал.

А почему авторитетом, а не з/п? Или авторитетом - более тонкое искуство при тех же (или лучших?) результатах, а з/п - это грубо?


 
Игорь Шевченко ©   (2008-05-15 12:24) [51]


> Современный универсальный мозг, способен воспринимать информацию
> на разных носителях


Главное, чтобы он ее потом не вываливал на разные носители :)

MsGuns прав, бумажный вариант всяко лучше.


 
Style ©   (2008-05-15 12:29) [52]


> MsGuns прав, бумажный вариант всяко лучше.


ну с кпк книжки читать тоже вполне удобно )


 
Romkin ©   (2008-05-15 12:31) [53]


> Все это от лукавого! Сначала пишут программы, а потом пытаются
> менять архитектуру ) Вместо того чтобы переписать большую
> часть, начинают мудрить и делать заплатки - лишь бы работало.

Да не обязательно. Реальная история: надо было написать небольшое простое приложение, а точнее, просто переписать то, что было под ДОС на win, ну и немного расширить возможности. Наняли "вчера студент", я ему примерную структуру БД нарисовал, фигня, десяток таблиц всего там. К сожалению, я был загружен, и не проконтролировал код. Мдя. Получился уродец, но кое-как работающий :)
Через пару месяцев посадил опытного программиста чуть доделать (не менять), убрать иногда появляющийся AV, ну и пару кнопок приделать. Мелочи. Через месяц с ним случилась истерика :)


 
Romkin ©   (2008-05-15 12:34) [54]

Код был примерно такой (выдрал отрывок, весь метод не поместится точно!)
    Panel1.Height := h div 3;
    dbreQuestionText.Width := w - h div 3;

    AnswerCount := 0;
    if ((Info.AnswerPicture1.Height <> 0) or (Info.AnswerText1DataSource.DataSet.FieldByName(Info.AnswerText1DataField).AsStr ing <> "")) then
     AnswerCount := AnswerCount + 1;
    if ((Info.AnswerPicture2.Height <> 0) or (Info.AnswerText2DataSource.DataSet.FieldByName(Info.AnswerText2DataField).AsStr ing <> "")) then
     AnswerCount := AnswerCount + 1;
    if ((Info.AnswerPicture3.Height <> 0) or (Info.AnswerText3DataSource.DataSet.FieldByName(Info.AnswerText3DataField).AsStr ing <> "")) then
     AnswerCount := AnswerCount + 1;
    if ((Info.AnswerPicture4.Height <> 0) or (Info.AnswerText4DataSource.DataSet.FieldByName(Info.AnswerText4DataField).AsStr ing <> "")) then
     AnswerCount := AnswerCount + 1;
    if (AnswerCount = 0) then
     AnswerCount := 1;
    Panel4.Width := w div AnswerCount;
    Panel5.Width := w div AnswerCount;
    Panel6.Width := w div AnswerCount;
    Panel7.Width := w div AnswerCount;

    if (Info.QuestionDataSource.DataSet.FieldByName(Info.QuestionDataField).AsString = "") then
     dbreQuestionText.Visible := False;
    if (Info.QuestionPicture.Height = 0) then
     begin
     Panel2.Visible := False;
     dbreQuestionText.Align := alClient;
     Panel1.Height := h div 4;
     end;

    temp := h - (stQuestion.Height + Panel1.Height + stAnswers.Height);
    if (Info.AnswerText1DataSource.DataSet.FieldByName(Info.AnswerText1DataField).AsStr ing <> "") then
     if (Info.AnswerPicture1.Height = 0) then
      begin
      dbreAnswer1.Height := temp - bbAnswer1.Height;
      iAnswer1.Visible := False;
      end
     else
      begin
      dbreAnswer1.Height := temp - min(w div AnswerCount, temp div 2) - bbAnswer1.Height;
      iAnswer1.Height := min(w div AnswerCount, temp div 2);
      end
    else
     if (Info.AnswerPicture1.Height = 0) then
      Panel4.Visible := False
     else
      begin
      dbreAnswer1.Visible := False;
      iAnswer1.Height := temp - bbAnswer1.Height;
      end;

Так практически везде. И это еще цветочки :))) Стоило чуть поменять где-либо - все сыпалось непредсказуемым образом... Типа один метод что-то делает с таблицей, за ним запускается другой (вообще из другого модуля), который рассчитывает, что первый метод точно все сделал и спозиционировал таблицу именно так, как надо. Ну и тд..


 
Style ©   (2008-05-15 12:42) [55]

Ну не самый страшный код )
Но как минимум студента заставить именовать грамотно объекты - надо было!


 
Игорь Шевченко ©   (2008-05-15 12:58) [56]

Romkin ©   (15.05.08 12:34) [54]

Ночной кошмар программиста


 
Style ©   (2008-05-15 13:03) [57]


> Ночной кошмар программиста


ну-ну проснувшись от такого кошмара, рекомендуется пойти на кухню выпить стакан водки с перцем, покурить, вздохнуть, залезть под  одеяло и долго думать об троекратном росте свой заработной платы, до тех пор пока не уснешь!


 
Slym ©   (2008-05-15 13:37) [58]

Style ©   (15.05.08 12:42) [55]
Ночной кошмар программиста

Ц графика - нистрашно... Вот када такая "программа" на непрерывном производстве железкой рулит автоматически, а эта железка высотой в 3 этажа - вот это страшно!


 
Юрий Зотов ©   (2008-05-15 13:48) [59]

> TUser ©   (15.05.08 12:04) [44]

> А откуда возьмутся ведущие, если везде кроме трех студентов
> посадить одного опытного?

Проблема подготовки кадров - отдельный вопрос. Готовить их нужно, в том числе и на реальных проектах - но при этом не нужно говорить что проект стал дешевле.

Конечно же, он стал дороже - ровно на стоимость ресурсов, потраченных на обучение. И на соответствующее время длительнее.


 
Юрий Зотов ©   (2008-05-15 13:55) [60]

В [42] небольшая погрешность в расчетах по первому варианту. Отчисления конторы за 4-х человек, стоимость аренды площади 4-х рабочих мест и амортизация 4-х компов - все это нужно еще и умножить на 1.5, потому что на суммарный код было потрачено 1.5 месяца, а не 1.

Итого разница между двумя вариантами становится не просто немалой, а ОЧЕНЬ немалой.


 
Palladin ©   (2008-05-15 13:58) [61]


> а эта железка высотой в 3 этажа - вот это страшно!

Судный День грядет! :)


 
Slym ©   (2008-05-15 13:59) [62]

Юрий Зотов ©   (15.05.08 13:55) [60]
ОЧЕНЬ немалой

кроме амортизации компов еще совт нужен... скока лиц на дельфи стоит? :)


 
Юрий Зотов ©   (2008-05-15 14:01) [63]

> Slym ©   (15.05.08 13:59) [62]

Точно! Разница увеличилась еще на 2 лицензии (притом, не только на Delphi, а и на систему, да и вообще на ВЕСЬ используемый софт).


 
Alkid ©   (2008-05-15 14:22) [64]


> Ночной кошмар программиста

Эх, не видели вы чего тут народ творит на С++... :(
Причём творил дядька грамотный, головастый, который отреверсинджинирил кучу чужого, вскрыл разные структуры данных, интерфейсы и протоколы. Это талант.
Но какой он писал код, мама родная!


 
Игорь Шевченко ©   (2008-05-15 14:27) [65]

Alkid ©   (15.05.08 14:22) [64]

Чего я только не видел на своем веку :)
"Кривое не может сделаться прямым". (Еккл.)


 
Style ©   (2008-05-15 14:35) [66]


> Эх, не видели вы чего тут народ творит на С++... :(


Есть такая должность программист-обфускатор! )))))


 
MsGuns ©   (2008-05-15 14:39) [67]

>KSergey ©   (15.05.08 12:23) [50]

>А почему авторитетом, а не з/п? Или авторитетом - более тонкое искуство при тех же >(или лучших?) результатах, а з/п - это грубо?

Я не сторонник подобные вопросы, связанные с обучением молодых специалистов, регулировать денежкой. Надо дать человеку понять, что деньги - это стимул или розги, не более. Но никак не средство форсирования обучения или поддержки дисциплины. Если чел не хочет или не может (такое тоже бывает), то бесполезно его "воспитывать" рублем. Скорее всего, ошибся сам руководитель, который неверно выбрал для него тему или даже предметную область. Либо человек просто не на своем месте,- в этом случае с ним проще сразу расстаться, хотя я лично считаю такие случаи (благо у меня их было совсем немного) собственными промахами.

А вообще полностью согласен с Юрием, утверждающим, что кадры - это отдельная песня. Я бы даже назвал это не песней, а целой "фонотекой" ;)


 
Поп Гапон   (2008-05-15 17:05) [68]


> Игорь Шевченко ©   (15.05.08 12:58) [56]
>
> Romkin ©   (15.05.08 12:34) [54]
>
> Ночной кошмар программиста


Ну вот это мой код первого "коммерческого" проекта. Просто в НИИ куда я пришел после института про стандарты, похоже, никто не подозревал и каждый писал как думал.


unit Unit4;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Buttons, StdCtrls, ExtCtrls, registry, Spin, VasMessageBox;

type
 TForm4 = class(TForm)
   RadioGroup1: TRadioGroup;
   RadioButton1: TRadioButton;
   RadioButton2: TRadioButton;
   CheckBox2: TCheckBox;
   GroupBox1: TGroupBox;
   SpinEdit4: TSpinEdit;
   SpinEdit5: TSpinEdit;
   SpinEdit1: TSpinEdit;
   GroupBox2: TGroupBox;
   Label1: TLabel;
   SpinEdit2: TSpinEdit;
   CheckBox3: TCheckBox;
   Label2: TLabel;
   SpinEdit3: TSpinEdit;
   Label3: TLabel;
   Label4: TLabel;
   Label8: TLabel;
   Label9: TLabel;
   Label10: TLabel;
   VasMessageBox1: TVasMessageBox;
   Label5: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   SpeedButton1: TButton;
   SpeedButton2: TButton;
   ComboBox1: TComboBox;
   Label11: TLabel;
   Label12: TLabel;
   procedure SpeedButton1Click(Sender: TObject);
   procedure OnCreate(Sender: TObject);
   procedure OnClose(Sender: TObject; var Action: TCloseAction);
   procedure SpeedButton2Click(Sender: TObject);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form4: TForm4;

implementation
uses unit1;
{$R *.DFM}

procedure TForm4.SpeedButton1Click(Sender: TObject);
var Registry: TRegistry;
begin
if (SpinEdit5.Value>SpinEdit4.Value) and
(SpinEdit1.Value>SpinEdit5.Value) then
begin
Registry:=TRegistry.Create;
Registry.RootKey:=HKEY_LOCAL_MACHINE;
Registry.OpenKey("SOFTWARE\GART\CS",False);

if CheckBox2.checked=true then
Registry.WriteInteger("Default Minization",1)
else
Registry.WriteInteger("Default Minization",0);

if RadioButton1.Checked=True then
Registry.WriteInteger("Default Status",1);

if RadioButton2.Checked=True then
Registry.WriteInteger("Default Status",2);

Registry.WriteInteger("Time Good",SpinEdit4.Value);
Registry.WriteInteger("Time Normal",SpinEdit5.Value);
Registry.WriteInteger("Time Answer",SpinEdit1.Value);

Registry.WriteInteger("Packet Item",ComboBox1.ItemIndex);
Registry.WriteInteger("Packet Size",StrToInt(ComboBox1.Text));

Form1.NMPing1.PacketSize:=Registry.ReadInteger("Packet Size");

if CheckBox3.checked=true then
Registry.WriteInteger("Corupted Message",1)
else
Registry.WriteInteger("Corupted Message",0);

Registry.WriteInteger("Time Automatic",SpinEdit2.Value);
Registry.WriteInteger("Time Corupted",SpinEdit3.Value);

timealarm:=Registry.ReadInteger("Time Corupted");
CorrMess:=Registry.ReadInteger("Corupted Message");

//качество прохождения запроса
mainbedtime:=Registry.ReadInteger("Time Answer");
maingoodtime:=Registry.ReadInteger("Time Good");
mainnormaltime:=Registry.ReadInteger("Time Normal");

Registry.Free;
///автоматический режим опроса
Form1.AutoTimer.Interval:=SpinEdit2.Value*60*1000;

if RadioButton1.Checked=True then
begin
Form1.SpeedButton4.Enabled:=true;
Form1.AutoTimer.Enabled:=False;
automode:=1;
end;

if RadioButton2.Checked=True then
begin
Form1.SpeedButton4.Enabled:=false;
Form1.AutoTimer.Enabled:=True;
automode:=2;
end;

Form1.Showstatus("Настройки змінені");
Form4.Close;
end

else
VasMessageBox1.Execute;

end;

procedure TForm4.OnCreate(Sender: TObject);
var Registry: TRegistry;
begin

Registry:=TRegistry.Create;
Registry.RootKey:=HKEY_LOCAL_MACHINE;
Registry.OpenKey("SOFTWARE\GART\CS",False);

if Registry.ReadInteger("Default Minization")<>0 then
CheckBox2.checked:=true;

if Registry.ReadInteger("Default Status")=1 then
RadioButton1.Checked:=True;
if Registry.ReadInteger("Default Status")=2 then
RadioButton2.Checked:=True;

SpinEdit4.Value:=Registry.ReadInteger("Time Good");
SpinEdit5.Value:=Registry.ReadInteger("Time Normal");
SpinEdit1.Value:=Registry.ReadInteger("Time Answer");
ComboBox1.ItemIndex:=Registry.ReadInteger("Packet Item");

if Registry.ReadInteger("Corupted Message")<>0 then
CheckBox3.checked:=true;

SpinEdit2.Value:=Registry.ReadInteger("Time Automatic");
SpinEdit3.Value:=Registry.ReadInteger("Time Corupted");

Registry.Free;

Form4.ShowModal;
end;

procedure TForm4.OnClose(Sender: TObject; var Action: TCloseAction);
begin
systemloc:=0;
Action:=caFree;
end;

procedure TForm4.SpeedButton2Click(Sender: TObject);
begin
Form4.Close;
end;

procedure TForm4.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
if key=VK_ESCAPE then
SpeedButton2Click(nil);
end;

end.


 
clickmaker ©   (2008-05-15 17:07) [69]

на днях очень долго медитировал на такой код:

switch(forumAttribute)
{
 case 18:
   iSrc = imgSrc[0];
   break;
 case 530:
   goto case 18;


 
Юрий ©   (2008-05-15 17:26) [70]

> [69] clickmaker ©   (15.05.08 17:07)

Исправили бы, и не думали.

switch(forumAttribute)
{
case 18:
case 530:
  iSrc = imgSrc[0];
  break;
...


 
Юрий Зотов ©   (2008-05-15 17:37) [71]

case forumAttribute of
 18, 530:
    iSrc := imgSrc[0];
end;

Несколько элегантнее, не так ли?
:о)


 
ketmar ©   (2008-05-15 18:54) [72]

>[64] Alkid © (2008-05-15 14:22:00)
а, кстати. помнится, почитывал код хороших реверсверов для Z80. screaming fear. хотя и работал. это совсем другое мышление.

>[71] Юрий Зотов © (2008-05-15 17:37:00)
>Несколько элегантнее, не так ли?
да. только в php/c всё-таки лучше.
switch (ch) {
 case "A": wasA = true;
 case "B": printf("A or B\n"); break;
 default: printf("wtf?\n");
}
if (wasA) printf("AAAAAA!\n");

пример безмозглый, конечно.

---
Understanding is not required. Only obedience.


 
Kenny ©   (2008-05-16 14:57) [73]

У нас на днях был найден отжиг:

      if (ModularOrder.MANYTOONE_STATE == UnicmDefines.CATALOG_ORDER_STATE_FINISHED)

Обе константы. Причем обе _текстовые_ константы! (Java)


 
TUser ©   (2008-05-16 15:11) [74]


> Kenny ©   (16.05.08 14:57) [73]
>
>

А что такого? Завтра я поменяю константы и ок.


 
Kenny ©   (2008-05-16 15:16) [75]

> TUser ©

Еще один :D


 
DiamondShark ©   (2008-05-16 15:43) [76]


> switch (ch) {
>  case "A": wasA = true;
>  case "B": printf("A or B\n"); break;
>  default: printf("wtf?\n");
> }

Сквозное выполнение веток -- это, конечно, прикольный трик, но и источник глупых багов тоже.

Глядя на чужой код не всегда (чит.: практически никогда) можно определить, является ли отсутствие бряка между ветками случайной забывчивостью или фишкой. Приходится въезжать во весь код детально.


 
TUser ©   (2008-05-16 15:49) [77]


> Еще один :D
>

А зачем еще делают константы в программах?


 
han_malign ©   (2008-05-16 16:04) [78]


>> Еще один :D
> А зачем еще делают константы в программах?

- да уж всяко не для условной компиляции... Другое дело, что в Java это единственный доступный способ http://www.javapractices.com/topic/TopicAction.do?Id=64


 
Юрий Зотов ©   (2008-05-16 16:08) [79]

> TUser ©   (16.05.08 15:11) [74]

Это Java. Там строка - это объект, а переменнаяи типа "строка" - это ссылка на объект. Поэтому условие
if (строка1==строка2) ...
проверяет равенство ссылок, а не тел строк. Ясно, что если обе строки - константы, то это условие не выполнится никогда.


 
han_malign ©   (2008-05-16 17:08) [80]


> if (строка1==строка2) ...
> проверяет равенство ссылок, а не тел строк.

- сдается мне, что
String str1 = "Str";
String str2 = "Str";
- обе переменные будут указывать на один объект - "Str"...
http://www.javabeginner.com/java-string-comparison.htm



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

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

Наверх




Память: 0.65 MB
Время: 0.046 c
2-1212148738
abhtr
2008-05-30 15:58
2008.06.29
Перекрасить строку в TMemo


15-1210794714
Антенна
2008-05-14 23:51
2008.06.29
Трафик на спутниковой тарелке


15-1210593726
User1
2008-05-12 16:02
2008.06.29
override or overload ?


2-1212121612
Dymok
2008-05-30 08:26
2008.06.29
Как узнать путь к каталогу документов пользователя


11-1188917890
Vladimir Kladov
2007-09-04 18:58
2008.06.29
FastString для быстрой работы со строками Ansi





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