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

Вниз

вопрос по CloseQuery   Найти похожие ветки 

 
Stan   (2009-04-09 01:11) [0]

Я что -то не пойму..
вот для примера сделал простенький проект для теста.
Есть две формы, Form1 и Form2 . В Form2 создаю событие OnCloseQuery и пишу там сообщение ShowMessage("Close Form2").
Т.е. И та и другая форма создаются в autocreate.

Далее запускаю проект, - вижу только Form1, как и должно быть,  и выхожу из сесии Windows - Logoff.  И вылетает Close Form2", т.е. срабатывает OnCloseQuery второй формы.
Так и должно быть?
D 2009


 
Германн ©   (2009-04-09 01:17) [1]


> Так и должно быть?

Да.


 
ZeroDivide ©   (2009-04-09 01:20) [2]

А что смущает?


 
Eraser ©   (2009-04-09 01:29) [3]

> [0] Stan   (09.04.09 01:11)

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


 
Stan   (2009-04-09 01:30) [4]

Смущает то, что Form2 ни разу не открывался.
При закрытии программы, OnCloseQuery этой формы не отрабатывает. А при LogOff или рестарте отрабатывает.. Проверил с 5 формами, то же самое, перечисляются все невидимые формы, и вызывается OnCloseQuery  у каждой... при обычном закрытии, все ок..
разве так должно быть?


 
Кто б сомневался ©   (2009-04-09 01:31) [5]

Хм, вот специально подождал что бы кто-то ответил. И так и получилось - верять блин разработчикам, это же компания!

Капец, честно говоря неожидал такого бага от CodeGear.
Нет, такого быть не должно!!
Вообще какой идиот мог допустить подобное...
Сейчас буду у себя проверять в программах это...

По вашему, Герман, при закрытии программы, должны срабатывать всех OnCloseQuery невидимых форм? Слушайте, учиться учиться и еще раз туда же.
Кстати, при закрытии программы, OnCloseQuery невидимых форм не срабатывает, как и положено, а вот при LogOff или рестарте,  вызывается OnCloseQuery всех невидимых форм (создал несколько форм, ни одна из них ни разу не открывалась, но OnCloseQuery отработал). Т.е. если там стоит - "Вы действительно хотите закрыть эту форму" - то это будет ад для юзеров кликать...
Здец.. У меня уже ком. проекты запущены два месяца...


 
Германн ©   (2009-04-09 01:40) [6]


> Кто б сомневался ©   (09.04.09 01:31) [5]
>
> Хм, вот специально подождал что бы кто-то ответил. И так
> и получилось - верять блин разработчикам, это же компания!
>
>
> Капец, честно говоря неожидал такого бага от CodeGear.
> Нет, такого быть не должно!!
> Вообще какой идиот мог допустить подобное...
> Сейчас буду у себя проверять в программах это...
>
> По вашему, Герман, при закрытии программы, должны срабатывать
> всех OnCloseQuery невидимых форм? Слушайте, учиться учиться
> и еще раз туда же.
> Кстати, при закрытии программы, OnCloseQuery невидимых форм
> не срабатывает, как и положено, а вот при LogOff или рестарте,
>   вызывается OnCloseQuery всех невидимых форм (создал несколько
> форм, ни одна из них ни разу не открывалась, но OnCloseQuery
> отработал). Т.е. если там стоит - "Вы действительно хотите
> закрыть эту форму" - то это будет ад для юзеров кликать.
> ..
> Здец.. У меня уже ком. проекты запущены два месяца...

А что есть "невидимые формы"?


 
Кто б сомневался ©   (2009-04-09 01:41) [7]


> А что есть "невидимые формы"?


Ну елки-палки, это формы которые были созданы (в том же автоcreate), но не были показаны юзеру по ShowModal или Show итп.


 
Кто б сомневался ©   (2009-04-09 01:48) [8]

Блин.
Проверяю..
AV поймал в logoff,  cудя по стэку madexcept - как раз в форме которая еще не отображалась, в WM_QUERYENDSESSION >> OnCloseQuery. Оно.  
Пойду ругаться в саппорт..  >:|

P.s. Stan ты не постил еще это баг?


 
Германн ©   (2009-04-09 01:53) [9]


> Кто б сомневался ©   (09.04.09 01:41) [7]
>
>
> > А что есть "невидимые формы"?
>
>
> Ну елки-палки, это формы которые были созданы (в том же
> автоcreate), но не были показаны юзеру по ShowModal или
> Show итп.

А "окна" этих форм были созданы?
А не эти ли окна получают сообщение WM_CLOSE?


 
Кто б сомневался ©   (2009-04-09 01:58) [10]


> Германн ©   (09.04.09 01:53) [9]


Короче, вот шаги:
создаю проект.
Создаю еще 3 формы. т.е. получается всего 4 с главной.

В трех последних формах, я пишу OnCloseQuery и вставляю туда ShowMessage("Закрываем").
Компилирую, запускаю из Windows, делаю Logoff или restart - возбужаются события во всех 3 формах подряд. Если закрыть прогу, такого не происходит.  

как они тестировали?
Да и я тоже как тестировал.... Но я ж не думал..


 
Игорь Шевченко ©   (2009-04-09 02:00) [11]


> Я что -то не пойму..
> вот для примера сделал простенький проект для теста.
> Есть две формы, Form1 и Form2 . В Form2 создаю событие OnCloseQuery
> и пишу там сообщение ShowMessage("Close Form2").
> Т.е. И та и другая форма создаются в autocreate.
>
> Далее запускаю проект, - вижу только Form1, как и должно
> быть,  и выхожу из сесии Windows - Logoff.  И вылетает Close
> Form2", т.е. срабатывает OnCloseQuery второй формы.
> Так и должно быть?


Да, так и должно быть

Читать forms.pas до полного и окончательного просветления:

procedure TCustomForm.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
 Message.Result := Integer(CloseQuery);
end;

(D2006)


 
Кто б сомневался ©   (2009-04-09 02:05) [12]


> Игорь Шевченко ©   (09.04.09 02:00) [11]


Для чего?
и почему только на QueryEndSession, а не на закрытие программы?
И почему для невидимых форм?... И я что то этого в справке не вижу..


 
Кто б сомневался ©   (2009-04-09 02:07) [13]


> И почему для невидимых форм?


Для всех причем.
А ведь обычно туда вставляют - "Вы действительно хотите закрыть итп".
А ведь это не mdi формы.. Для них это еще понятно..


 
Eraser ©   (2009-04-09 02:07) [14]

> [12] Кто б сомневался ©   (09.04.09 02:05)

потому что WM_QUERYENDSESSION рассылается всем окнам верхнего уровня.


 
Кто б сомневался ©   (2009-04-09 02:08) [15]

Просто ответьте на вопрос.
Почему только на QueryEndSession, а не на закрытие программы?


 
Кто б сомневался ©   (2009-04-09 02:09) [16]


> Eraser ©   (09.04.09 02:07) [14]


Да не в тех. плане . Это и так понятно.


 
Eraser ©   (2009-04-09 02:11) [17]

> [16] Кто б сомневался ©   (09.04.09 02:09)

а что тут можно сказать не в тех. плане? так задумано. могу лишь повторить [3].


 
Кто б сомневался ©   (2009-04-09 02:13) [18]


> а что тут можно сказать не в тех. плане? так задумано. могу
> лишь повторить [3].


Ага, еще скажи что это фича..
Побольше б таких "фич" - тогда совсем станет весело..


 
Игорь Шевченко ©   (2009-04-09 02:23) [19]

Я советую немножко изучить как работает операционная система, под которую вы пишете программы. Для облегчения этого процесса есть специальный сайт http://msdn.microsoft.com

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

Да и вообще кругозор расширять весьма полезное занятие


 
Игорь Шевченко ©   (2009-04-09 02:25) [20]


> Для чего?


Для того, чтобы иметь возможность сохранить данные (событие OnCloseQuery преимущественно для этого предназначено)


 
Кто б сомневался ©   (2009-04-09 02:27) [21]


> Для того, чтобы иметь возможность сохранить данные


Ага, во всех формах, даже в тех, которые еще даже не показывались и есть не-ви-ди-мы-е...
Вдумайтесь в последнее слово, потом говорите.


 
Игорь Шевченко ©   (2009-04-09 02:33) [22]

Я тебе простой пример приведу

.dpr

program AutoCreate;

uses
 Forms,
 main in "main.pas" {Form1},
 f2 in "f2.pas" {Form2};

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.CreateForm(TForm2, Form2);
 Application.Run;
end.


main

unit main;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation
uses
 f2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 form2.Close;
end;

end.


f2

unit f2;

interface

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

type
 TForm2 = class(TForm)
   procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 end;

var
 Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 ShowMessage("Form2Close");
end;

end.


> Вдумайтесь в последнее слово, потом говорите.


У меня есть привычка - я обычно думаю, когда говорю.
Но если тебе эта привычка кажется странной, то я процитирую справку по Delphi:

"You can use an OnCloseQuery event handler to ask users if they are sure they really want the form closed immediately. For example, you can use the handler to display a message box that prompts the user to save a file before closing the form."


 
Игорь Шевченко ©   (2009-04-09 02:37) [23]

"В последнее время наметилась одна тенденция. Дело в том, что сейчас для того, чтобы выйти на рынок программных средств и занять в нём свою нишу, фирма, а, соответственно, и программисты должны делать продукт как можно быстрее. При этом, естественно, достаточно часто вопросы эффективности, быстродействия, минимизации размера используемой памяти и тому подобные во внимание просто не принимаются. Зачем, дескать, думать о таких «мелочах», если современные компьютеры достаточно мощные и «переваривают» почти любые объёмы. Подумаешь, мегабайт памяти туда, мегабайт сюда… Кроме того, очень сильное влияние на квалификацию программистов оказывают многочисленные средства быстрой разработки, бурное развитие которых наблюдается в последнее время. Средства, предназначенные для повышения производительности труда квалифицированных программистов, заняли на рынке совершенно другое место. Достаточно часто эти средства используются программистами низкой квалификации для того, чтобы в кратчайшее время создать работающую программу, прикладывая при этом минимум усилий. Более того, средства быстрой разработки позволяют программисту скрыть недостаток квалификации, ибо вся черновая работа делается без участия программиста. Вместо того, чтобы овладеть необходимым для профессиональной деятельности минимумом, можно недостаток квалификации скрыть посредством использования программы, которая всё сделает сама. Таким образом, средства быстрой разработки используются превратились в средства создания неэффективных программ неквалифицированными программистами. Что поделаешь, рынок диктует свои условия…

Соответственно, такой подход приводит к тому, что достаточно часто у программистов появляется завышенная самооценка. Раз я могу «накропать» программу за неделю, значит, я – ВЕЛИКИЙ ПРОГРАММИСТ, всё умею, всё могу. Зачем мне чему-то учиться, я (при помощи конкретного средства) всегда сделаю то, что хочу! Появилось даже расхожее определение – «программист, пишущий мышкой»… Но стоит у подобных, с позволения сказать, программистов, забрать средство быстрой разработки, как они становятся беспомощными. Ведь они являются программистами на конкретном средстве! Другими словами, они являются ПОЛЬЗОВАТЕЛЯМИ конкретного средства… А пользователи и программисты – это совершенно различные классы людей, использующих компьютер в своей профессиональной деятельности. И если пользователю необходимо знать только порядок использования и взаимодействие частей одной или нескольких программ (WinWord, бухгалтерская или банковская программы, программа обработки изображений и так далее), то программист помимо всего прочего должен, почти обязан понимать то, как функционирует компьютер, на основе каких принципов построена операционная система, понимать принципы организации данных и быть в состоянии написать эффективную программу, решающую поставленную перед программистом задачу. В том случае, если программист является профессионалом, то использование средств быстрой разработки только поможет ему, позволив сократить время, необходимое для разработки программы, и минимизировать усилия, необходимые для разработки таковой. "

(c) Павел Румянцев
http://www.techbook.ru/rumyantsev.html


 
Кто б сомневался ©   (2009-04-09 02:49) [24]

Послушайте, не надо меня за дурочка считать.
По меркам Windows - это сообщение передается всем окнам верхнего уровня..
Но VCL должна отрабатывать этот вариант, и проверять видимо ли окно или нет. Т.к. по меркам VCL если форма Close, то она может быть и скрыта (Hidden) (те самые варианты caHidenn, caFree итд).
А что здесь получается?
А то, что при закрытии программы, OnCloseQuery не отрабатывает для скрытых форм, а вот при Logoff и рестарте отрабатывает (форма даже еще не показывалась, данные еще даже не инициализировались, а уже просят OnCloseQuery - тут я кстати получил AV, и я думаю не один я, хотя  прекрасно знал как работает QUERYENDSESSION).
что самое интересное OnClose не отрабатывает при скрытой форме никак, втч и при LogOff. Что есть корректно.
Там просто забыли проверить видимо ли окно или нет, именно для QUERYENDSESSION.
Все я не собираюсь спорить над такой очевидной вещью.
С точки зрения API - отсылки сообщения окнам, здесь все ок, с точки зрения постобработки этого сообщения формой VCL - здесь баг. точка.


 
Игорь Шевченко ©   (2009-04-09 03:02) [25]

Кто б сомневался ©   (09.04.09 02:49) [24]


> А то, что при закрытии программы, OnCloseQuery не отрабатывает
> для скрытых форм


Потому что им не приходит сообщение WM_CLOSE и для них не вызывается метод Close.

А WM_QUERYENDSESSION посылается всем окнам верхнего уровня, независимо от наличия у окна в стилях WS_VISIBLE - ну так система устроена, это надо знать и не удивляться срабатыванию события CloseQuery.

в Borland все сделали верно - они не знают, были ли выполнены конкретно в настоящий момент невидимой формой какие-то действия до того момента, как она стала невидимой, требующие уведомления о событии EndSession и честно вызывают это уведомление.


 
Кто б сомневался ©   (2009-04-09 03:04) [26]

Посмотрел в KOL MCK - там все логично и правильно (там OnClose совмещен с OnCloseQuery - т.е. . в OnClose можно указать CanClose (Accept)), даже комментарий есть:

Called before closing the window. It is possible to set Accept        parameter to False to prevent closing the window. This event events     is not called when windows session is finishing (to handle this     event, handle WM_QUERYENDSESSION message, or assign OnQueryEndSession    event to another or the same event handler)

Т.е. KOL как обертка API корректно обрабатывает сообщение.
А вот VCL как обертка, не корректно.


 
Кто б сомневался ©   (2009-04-09 03:06) [27]


> Игорь Шевченко ©   (09.04.09 03:02) [25]


Елки палки, да не надо мне рассказывать технические детали.
Должна быть пост обработка самой обертки (VCL) для логичной работы на уровне форм, а не окон.


 
Игорь Шевченко ©   (2009-04-09 03:15) [28]

Кто б сомневался ©   (09.04.09 03:06) [27]


> Должна быть пост обработка самой обертки (VCL) для логичной
> работы на уровне форм, а не окон.


На уровне форм тоже все логично сделано.


> Called before closing the window. It is possible to set
> Accept        parameter to False to prevent closing the
> window. This event events     is not called when windows
> session is finishing (to handle this     event, handle WM_QUERYENDSESSION
> message, or assign OnQueryEndSession    event to another
> or the same event handler)


У KOL немножко меньше пользователей, чем у VCL, соответственно, меньше и репортов о проблемах, меньше и реакции.
Впрочем, это не единственный недостаток этой библиотеки.

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


 
Кто б сомневался ©   (2009-04-09 03:24) [29]


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


Вы что прикидываетесь что-ли?!

Вот например как у меня получилось после моей проверки - на второй форме при закрытии отображается диалог, "сохранить профайл?" в OnCloseQuery. На третей форме - у меня храняться настройки, там также переспрашивается "сохранить?"  Итак я запускаю программу, но не открываю вторую форму и третью, в которой создается профайл и отображаются настройки. Юзеру просто нужно быстро запустить программу по делу.
А теперь он делает LogOff - и что получает, а получает 2 диалога, которые спрашивате у юзера "сохранить профайл?" -а юзер в непонятках конечно. А потом вдруг получает - "сохранить настроки?" . А если бы я бы проверял что то, непроинициализированное, то получил бы AV - это еще лучше.

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


> У KOL немножко меньше пользователей, чем у VCL, соответственно,
>  меньше и репортов о проблемах, меньше и реакции.


Да-да, и комментарий написали тоже случайно, не подумавши..


 
Кто б сомневался ©   (2009-04-09 03:27) [30]

Все, перечитывайте еще раз [27] особенно вторую часть предложения.
Я пойду спать.
И сделайте для себя разницу между окнами и формами, не с тех. точки зрения, а с логической точки зрения VCL.


 
Eraser ©   (2009-04-09 03:33) [31]

> [30] Кто б сомневался ©   (09.04.09 03:27)

еще в делфи можно обращаться к private членам другого класса, объявленного в том же модуле, так что ж теперь хоронить её что ли? ))


 
Кто б сомневался ©   (2009-04-09 03:34) [32]


> еще в делфи можно обращаться к private членам другого класса,
>  объявленного в том же модуле, так что ж теперь хоронить
> её что ли? ))


Можно и не обращаться - strict private. Как видите исправились, косвенно признав этот ньюанс..


 
sniknik ©   (2009-04-09 09:57) [33]

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

> А теперь он делает LogOff - и что получает, а получает 2 диалога
не получает, если он ничего не менял в данных формы т.е. настройках/профайле, т.к. условие показа диалога на закрытии у меня еще включает изменение контента формы...
т.е. даже если он открыл настройки, посмотрел не трогая их, и закрыл форму диалога не будет (как и во всех нормальных программах (проверь ворд/паинт/любую профессиональную)). не говоря о том чтобы когда ее даже не показывали (также если предварительно нажал "сохранить").
у меня либо по онченж  взводится флаг необходимости (при сохранении/отмене сбрасывается), либо просто сравниваются используемые значения настроек в переменных с меняемыми в контролах.
обычно у меня даже кнопка сохранения задизейблена если нет изменений для сохранения.
и уж кстати, обычно я не рассчитываю на автосоздание (там у меня минимум, датамодули и основная форма) остальное создается по требованию. но даже если их автосоздать все то ни одного диалога не будет.

> Итого, юзер получает два вопроса с форм, которые он не запускал
не получает. если делать нормально.


 
Игорь Шевченко ©   (2009-04-09 10:55) [34]


> И сделайте для себя разницу между окнами и формами, не с
> тех. точки зрения, а с логической точки зрения VCL


С логической точки зрения делает пользователь. И если пользователь вставил обработчик события OnCloseQuery, значит, подразумевал его вызов. Вот он и вызвался. А в тех формах, где пользователь не предусмотрел обработчика события OnCloseQuery, он не вызывался.
Все логично.

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

Неужели приложения на delphi должны тихо умереть, дав возможность пользователю потерять несохраненные данные ?
На мой взгляд, не должны, на взгляд Borland тоже.


 
Anatoly Podgoretsky ©   (2009-04-09 11:50) [35]

> Кто б сомневался  (09.04.2009 2:08:15)  [15]

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


 
Anatoly Podgoretsky ©   (2009-04-09 11:52) [36]

> Кто б сомневался  (09.04.2009 2:13:18)  [18]

Слушай, а ты почему работаешь в Виндоус?


 
Anatoly Podgoretsky ©   (2009-04-09 12:09) [37]

> Кто б сомневался  (09.04.2009 3:34:32)  [32]

Ничего не признали, немного расширили да, но для признания должно быть всегда strict private и без ключевого слова, а как мы видим этого нет.


 
Кто б сомневался ©   (2009-04-09 13:28) [38]

to Игорь Шевченко и Anatoly Podgoretsky

Вчера запостил этот баг уже и он уже в статусе Open.
Вы понимаете что это? Это не Reported как обычно, и не Pending.
Это значит его сразу открыли, и уже работают над ним.


 
Кто б сомневался ©   (2009-04-09 13:31) [39]


> Потому что это сообщение Виндоус, а не Дельфи и оно действительно
> посылается всем окнам верхнего уровня.
> Иначе странно бы было, как что закрыть или запретить закрытие
> Виндоус.


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


 
Кто б сомневался ©   (2009-04-09 13:37) [40]


> А то что программист не отреагировал на эту ситуацию и выдал
> подобный запрос плохо говорит об его квалификации, это же
> не запрос на сохранение файлов.


По меркам VCL скрытая форма- это уже закрытая форма (caHidden).
Какие могут быть события перед закрытием - OnCloseQuery если форма уже закрыта?



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

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

Наверх





Память: 0.59 MB
Время: 0.006 c
2-1240761560
madmech
2009-04-26 19:59
2009.06.21
Помогите разобраться с итоговым столбцом кросс-отчета


2-1241354318
oleg_teacher
2009-05-03 16:38
2009.06.21
Как узнать количество дочерних узлов в дерева?


15-1239559328
AlexDan
2009-04-12 22:02
2009.06.21
Массовая рассылка.


6-1203672859
Strate
2008-02-22 12:34
2009.06.21
Отловить открытие (закрытие) соединения


2-1241085183
Галинка
2009-04-30 13:53
2009.06.21
перехват нажатия гиперссылки в браузере





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