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

Вниз

ISAPI в Delphi   Найти похожие ветки 

 
poganka ©   (2006-11-11 16:09) [0]

мне очень стыдно в этом признаваться, но я не смогла найти доступной информации по поводу того, что бы такое написать между бегином и эндом в Web Server Application, чтобы по нажатию кнопки submit запускалось ISAPI-приложение, которое, анализируя выбранную клиентом радиокнопку, передвало бы ему в формате хтмл файл, ей соответствующий.
думаю, это всего пара строчек. если кому не сложно, помогите темноте.


 
poganka ©   (2006-11-18 15:02) [1]

ыыыы. ну почему никто не знает???


 
Alexander Panov ©   (2006-11-18 15:34) [2]

А у тебя WEB-сервер есть для для использования ISAPI-приложения?


 
poganka ©   (2006-11-20 12:27) [3]

мне IISа хватит!


 
Alexander Panov ©   (2006-11-20 12:30) [4]


> poganka ©   (20.11.06 12:27) [3]
> мне IISа хватит!


Хватит, конечно.
Тогда создавай страничку с формой, на которой будет кнопка с любым из методов GET или POST, CGI, которы будет срабатывать при посылке данных этой формы. И все.


 
poganka ©   (2006-11-20 16:25) [5]

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


 
DrPass ©   (2006-11-20 16:56) [6]

Между begin и end там писать ничего не нужно. А вот если два раза щелкнуть на дизайнере модуля web-приложения, откроется редактор Action"ов. Вот там нужно добавить хотя бы один экшн, и в его обработчике смотреть объект WebRequest, который будет содержать значения полей на HTML-форме. Ну и, само собой, этот самый
> хтмл с табличками

должен содержать правильно написанную HTML-форму, ссылающуюся на твой экшн


 
poganka ©   (2006-11-20 17:15) [7]


> Между begin и end там писать ничего не нужно. А вот если
> два раза щелкнуть на дизайнере модуля web-приложения, откроется
> редактор Action"ов. Вот там нужно добавить хотя бы один
> экшн, и в его обработчике смотреть объект WebRequest, который
> будет содержать значения полей на HTML-форме. Ну и, само
> собой, этот самый
> > хтмл с табличками
>
> должен содержать правильно написанную HTML-форму, ссылающуюся
> на твой экшн

по-моему, вы для меня слишком умные :)))
привожу полную постановку задачи (без личной интерпретации):
_____________________________________________
Вывод данных по запросу пользователя. На сервере имеется три текстовых файла, первый содержит список товаров, второй – список услуг, третий – список партнеров некой абстрактной компании. Имеется HTML-страница, содержащая три радиокнопки и кнопки типа submit и reset. По нажатию кнопки типа submit запускается ISAPI-приложение, которое, анализируя выбранную клиентом радиокнопку, передает ему в формате HTML один из трех файлов.
_____________________________________________
неужели нужно еще заботиться о полях этих самых хтмл с табличками? разве нельзя туда любую текстовую байду черкануть?


 
Сергей М. ©   (2006-11-20 17:29) [8]


> разве нельзя туда любую текстовую байду черкануть?


хтмл, собственно, и есть "текстовая байда"


 
DrPass ©   (2006-11-20 18:01) [9]


> разве нельзя туда любую текстовую байду черкануть?

Совсем любую - нельзя. Обязательно должно присутствовать что-либо такого вида
<form method=POST или GET action= ссылка на твой Action>.
...вот тут можно поместить твои радиокнопки, не забыв указать им параметр name
<input type=submit>
</form>

А в экшене ты и будешь определять состояние радиокнопок по указанному тобой name. С помощью объекта WebRequest


 
isasa ©   (2006-11-20 18:22) [10]

Если GET-ом
http://<myhost>/<mylib>.dll/<actionName>?<actionParam> <- это GET

"Вынимаем" параметры,
в зависимости от метода (GET, POST) есть ньюансы

procedure TmyWebModule.CheckAction(Sender: TObject;
 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
...
<var>:=Request.QueryFields.Values[<Name>];
или
<var>:=Request.ContentFields.Values[<Name>];
...


 
isasa ©   (2006-11-20 18:28) [11]

Да, и еще :)
Если предполагается работа с БД, ну что-то типа SQL-сервера, не забыть аккуратно вляпать
 CoInitializeEx (nil, COINIT_MULTITHREADED);
в предположении, что DLL, все таки многопоточная.


 
poganka ©   (2006-11-21 15:39) [12]

если сначала, то вот мой вариант хтмл:
___________________________________________________
<html>
<body>
 <form action="myISAPI.exe" method="post">
 <input type="radio" name="myname1">Список товаров    <BR>
 <input type="radio" name="myname2">Список услуг      <BR>
 <input type="radio" name="myname3">Список партнеров  <BR>

 <input type="submit">
 <input type="reset"">
 </form>
</body>
<html>
____________________________________________________

что тут не так, к примеру?

люди, спасибо, что откликаетесь! вы классные!!!


 
poganka ©   (2006-11-21 15:54) [13]

плюс, грубо говоря, есть 3 хтмл-файла вида:
____________________________
<html>
<body>
 ТОВАРЫ
</body>
<html>
____________________________

покритикуйте, плиз.
и всё-таки поточнее хотелось бы, что в Web Server Application написать!


 
isasa ©   (2006-11-21 17:08) [14]

action="myISAPI.exe"

Это не ISAPI. В крайнем случае WinCGI, а то насоветуют тут ...


 
isasa ©   (2006-11-21 17:09) [15]

Хотя выгребать в программе одинаково
varMyname1:=Request.ContentFields.Values["myname1"];
...


 
Чапаев ©   (2006-11-21 17:14) [16]

> [0] poganka ©   (11.11.06 16:09)
В Тейксейре&Пачеко о CGI вполне вменяемо рассказано. В твоём случае с ISAPI -- точно так же, просто выбирай тип приложения ISAPI вместо CGI.


> Это не ISAPI. В крайнем случае WinCGI, а то насоветуют тут
> ...
От того, что расширение у ISAPI-приложения *.dll, суть не изменится...


 
isasa ©   (2006-11-21 17:22) [17]

В общем то так. Если о сути.
Но первое in-proc, второе out-proc. Одно отлаживается на ура(CGI), второе, с извращениями.


 
Чапаев ©   (2006-11-21 17:34) [18]

О да... Но в данном случае вопрос не об этом ведь...


 
isasa ©   (2006-11-21 17:42) [19]

:)
Ну я и написал [15].


 
poganka ©   (2006-11-22 11:38) [20]


> isasa ©   (21.11.06 17:09) [15]
>
> Хотя выгребать в программе одинаково
> varMyname1:=Request.ContentFields.Values["myname1"];
> ...


это всё, что нужно написать? только 3 раза?
и, честно говоря, я написала myname1-3, но сама не поняла, что это означает.

где же фигурируют названия самих передаваемых хтмл-файлов? (запуталась, короче)

> Чапаев ©   (21.11.06 17:14) [16]
>
> > [0] poganka ©   (11.11.06 16:09)
> В Тейксейре&Пачеко о CGI вполне вменяемо рассказано. В твоём
> случае с ISAPI -- точно так же, просто выбирай тип приложения
> ISAPI вместо CGI.

ну, в принципе, понятно, что здесь это не принципиально :)
имеет ли смысл эту книгу искать в эл. виде? я перерыла весь магазин на Лубянке- и ни фига осмысленного по вопросу не обнаружила.


 
DrPass ©   (2006-11-22 11:50) [21]


> где же фигурируют названия самих передаваемых хтмл-файлов?
>  (запуталась, короче)

В принципе, нигде. Ну разве что так:
var sl: TStringList;
sl:= TStringList.Create;
sl.LoadFromFile("1.html");
Response.Content:= sl.Text;
sl.Free;


 
Чапаев ©   (2006-11-22 11:52) [22]

> имеет ли смысл эту книгу искать в эл. виде?
Имеет, но если попадётся в бумажном -- хватай! :о)

У меня Т&П по Делфи5 -- отлично. Их книгу по Делфи6 ругают. Не читал, не знаю, что там...


 
Layner ©   (2006-11-22 11:53) [23]

Это помоему трудновато сделать для чайника, сначала как минимум надо  попробовать это сделать на PHP, а потом уж на всяких ISAPI...


 
Чапаев ©   (2006-11-22 11:58) [24]

Ну да, куда ж без РНР... Как же без него чайникам в веб соваться...


 
Anatoly Podgoretsky ©   (2006-11-22 11:58) [25]

> Чапаев  (22.11.2006 11:52:22)  [22]

> Их книгу по Делфи6 ругают.

???


 
Чапаев ©   (2006-11-22 12:00) [26]

> [25] Anatoly Podgoretsky ©   (22.11.06 11:58)
Да вот ругают... И здесь кто-то что-то говорил неприятное... Перевод, кажется, ужасный, а не само содержание книги.


 
isasa ©   (2006-11-22 12:04) [27]

Layner ©   (22.11.06 11:53) [23]
Очень мило.
Для чайника потом адаптация кода PHP в классы Дельфи, работающие с Вебом(TWebModule, TPageProducer, TWebRequest, TWebResponse...) легче?


 
Anatoly Podgoretsky ©   (2006-11-22 12:16) [28]

> Чапаев  (22.11.2006 12:00:26)  [26]

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


 
Чапаев ©   (2006-11-22 12:18) [29]

> [28] Anatoly Podgoretsky ©   (22.11.06 12:16)
Да, вспомнил, речь шла именно о якобы наличии в Делфи оператора += и такого прочего. Но в книге по Д5 таких глупостей нету.


 
poganka ©   (2006-11-22 12:34) [30]

два разных, но однозначно отзывчивых человека написали:
______________________________
var sl: TStringList;
sl:= TStringList.Create;
sl.LoadFromFile("1.html");
Response.Content:= sl.Text;
sl.Free;

varMyname1:=Request.ContentFields.Values["myname1"];
______________________________

я туплю, но всё же. как это соотнести друг с другом? нужно ли мне что-то еще дописывать?


 
Чапаев ©   (2006-11-22 12:41) [31]

> [30] poganka ©   (22.11.06 12:34)
А что смущает? Пример с реквестом показывает, как получить "выбранную клиентом радиокнопку", пример с респонсом показывает, как передать "хтмл файл, ей соответствующий"


 
DrPass ©   (2006-11-22 12:46) [32]


> poganka ©   (22.11.06 12:34) [30]

Вот так
> varMyname1:=Request.ContentFields.Values["myname1"];

ты получаешь состояние чекбокса myname1 на "начальной" странице.
А вот так
> var sl: TStringList;
> sl:= TStringList.Create;
> sl.LoadFromFile("1.html");
> Response.Content:= sl.Text;
> sl.Free;

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


 
poganka ©   (2006-11-22 12:46) [33]


> Чапаев ©   (22.11.06 12:41) [31]

если этого достаточно для нормального функционирования проги (а я не могу быть в этом стопроцентно уверена из-за незнания  Delphi), то ничего не смущает :)

так это всё, что нужно?


 
poganka ©   (2006-11-22 12:48) [34]


> DrPass ©   (22.11.06 12:46) [32]

просто не догнала, в каком месте эти два куска соотносятся друг с другом :)


 
Alien1769 ©   (2006-11-22 13:12) [35]


> так это всё, что нужно?

Для начала тестов достаточно.


 
isasa ©   (2006-11-22 13:47) [36]

Тут еще есть ньюанс по выемке значений.
Сейчас, хоть убейте не вспомню, а лезть в литературу лень, в зависимости от метода передачи параметров(GET/POST), они кладутся в разные классы
Request.QueryFields или Request.ContentFields

Кто, куда кладет, не помню, но можно определить. :)


 
Layner ©   (2006-11-22 14:06) [37]

[27] isasa ©   (22.11.06 12:04)
Для чайника потом адаптация кода PHP в классы Дельфи, работающие с Вебом(TWebModule, TPageProducer, TWebRequest, TWebResponse...) легче?
Если чел не знает что такое GET или POST, то ты хоть ему заобъясняйся про TWebModule, толку не будет :)
Тем более челу надо курсач сварганить не более.


 
isasa ©   (2006-11-22 14:15) [38]

Ага. А PHP имеет непосредственное отношение к методам GET POST


 
Anatoly Podgoretsky ©   (2006-11-22 14:27) [39]

> isasa  (22.11.2006 14:15:38)  [38]

GET POST имеют отношение только к CGI


 
isasa ©   (2006-11-22 14:36) [40]

:) Ну тогда и к IE, Opera, Mozilla ...


 
Чапаев ©   (2006-11-22 14:37) [41]

> [39] Anatoly Podgoretsky ©   (22.11.06 14:27)
Почему CGI? Это способы передачи данных серверу.


 
Anatoly Podgoretsky ©   (2006-11-22 14:39) [42]

> isasa  (22.11.2006 14:36:40)  [40]

Которые являются CGI приложениями


 
Anatoly Podgoretsky ©   (2006-11-22 14:46) [43]

> Чапаев  (22.11.2006 14:37:41)  [41]

> Это способы передачи данных серверу.
Или способы приема данных. Это унифицированый интерфейс передачи.
Данные передаются или в строке вызова через заголовок или в виде потока, сразу за заголовком в виде name=value. Определяется ключевым словом GET/POST. Сервер принимает данные и через стандартный поток вывода передает их приложению обработчику, одновременно устанавливая системные переменные, а ответы принимает через стандартный поток ввода.

Я тут лопухнулся в предыдущем ответе, браузеры к этому имеют только косвенное отношение, они передают данные серверу и принимают ответ от него, они не обязательны. И они не используют (в общем случае) стандартные потоки.


 
isasa ©   (2006-11-22 14:46) [44]

:)
CGI это Common Graphic Interface. Я правильно мысль понял?


 
Чапаев ©   (2006-11-22 14:48) [45]

> [44] isasa ©   (22.11.06 14:46)
Gateway, а не Graphic.


> Определяется ключевым словом GET/POST
Анатолий, это протокол HTTP, а никак не CGI...


 
isasa ©   (2006-11-22 14:49) [46]

Виноват. Задолбали абревиатуры ...


 
Anatoly Podgoretsky ©   (2006-11-22 14:53) [47]

> isasa  (22.11.2006 14:46:44)  [44]

Абсолютно правильно понял.
Как передавать данные от клиента до приложения. Вся нагрузка на сервер, клиент просто посылает запрос и получает ответ. Формат запроса стандартизирован, передача параметров приложению тоже.
Обязательно участвуют две части сервер и приложение, без этого об CGI говорить неприлично.


 
Anatoly Podgoretsky ©   (2006-11-22 14:57) [48]

> Чапаев  (22.11.2006 14:48:45)  [45]

Ну и где он еще используется :-)
Он для него и используется, но это все таки не протокол HTTP, хотя они и связаны.
Для HTTP не требуется приложение, хватает только сервера.
CGI часть начинается после символа ?

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

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


 
Чапаев ©   (2006-11-22 15:06) [49]

> [48] Anatoly Podgoretsky ©   (22.11.06 14:57)
Так... Покопавшись в определениях, пришёл к выводу, что таки да.

Просто как-то так уж сложилось, что под CGI принято понимать серверное CGI-приложение...


 
Anatoly Podgoretsky ©   (2006-11-22 15:22) [50]

> Чапаев  (22.11.2006 15:06:49)  [49]

> Просто как-то так уж сложилось, что под CGI принято понимать серверное CGI-приложение...

Ну так оно и есть, только через веб сервер.
Если напрямую, то это уже WEB сервис
Если без приложения, то это просто HTTP

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

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


 
poganka ©   (2006-11-23 15:35) [51]

ПРОГРАММЕРЫ!!!

компилятор на меня очень сильно ругается! что и где он хочет от меня видетьГ?
_____________________________________

unit myISAPI;

interface

uses
 SysUtils, Classes, HTTPApp;

type
 TWebModule1 = class(TWebModule)
   procedure WebModule1WebActionItem1Action(Sender: TObject;
     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 WebModule1: TWebModule1;

implementation

{$R *.dfm}

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
varMyname1:=Request.ContentFields.Values["myname1"];

var sl: TStringList;
sl:= TStringList.Create;
sl.LoadFromFile("1.html");
Response.Content:= sl.Text;
sl.Free;
end;

end.


 
Чапаев ©   (2006-11-23 15:42) [52]

> [51] poganka ©   (23.11.06 15:35)
Ох, человече... Ну зачем ты за такое берёшься, если языка не знаешь совсем?


 
poganka ©   (2006-11-23 15:46) [53]


> Ох, человече... Ну зачем ты за такое берёшься, если языка
> не знаешь совсем?

дадада, знаю. сознательно иду на позор.
не я за это берусь. это за меня в университете крепко взялись. методика преподавания у нас (причем, далеко не на первом даже курсе)- вообще отдельная тема для обсуждения.
за один семестр мы по их понятиям должны выучить Java, C++, JS, ASP, Perl и т.д. и т.п. я даже хороших книг найти не успеваю, не то что прочитать и уж тем более основательно освоить синтаксис.


 
Anatoly Podgoretsky ©   (2006-11-23 15:50) [54]

> poganka  (23.11.2006 15:35:51)  [51]

Что то ISAPI не видать, а уж ругани совсем.


 
poganka ©   (2006-11-23 15:51) [55]

:((((((((((((((((
здевайтесь. я заслужила.


 
Чапаев ©   (2006-11-23 15:52) [56]

> [55] poganka ©   (23.11.06 15:51)
Хоть текст исходной html со знаменитой радиокнопкой приведи, чтоб было от чего плясать


 
Anatoly Podgoretsky ©   (2006-11-23 15:53) [57]

> poganka  (23.11.2006 15:51:55)  [55]

Конечно заслужила, что сообщение об ругани сложно привести?


 
poganka ©   (2006-11-23 15:55) [58]

так наверху же он же ж есть!!!! one more time!

___________________________________________________
<html>
<body>
<form action="myISAPI.exe" method="post">
<input type="radio" name="myname1">Список товаров    <BR>
<input type="radio" name="myname2">Список услуг      <BR>
<input type="radio" name="myname3">Список партнеров  <BR>

<input type="submit">
<input type="reset"">
</form>
</body>
<html>
____________________________________________________

плюс, грубо говоря, есть 3 хтмл-файла вида:
____________________________
<html>
<body>
ТОВАРЫ
</body>
<html>
____________________________


 
poganka ©   (2006-11-23 15:56) [59]


> Anatoly Podgoretsky ©   (23.11.06 15:53) [57]

 [Error] myISAPI.pas(28): Unknown directive: "varMyname1"
 [Error] myISAPI.pas(30): Statement expected but "VAR" found
 [Error] myISAPI.pas(31): Identifier redeclared: "sl"
 [Error] myISAPI.pas(31): "," or ":" expected but "." found
 [Error] myISAPI.pas(32): Identifier redeclared: "sl"
 [Error] myISAPI.pas(32): "," or ":" expected but "(" found
 [Error] myISAPI.pas(33): "," or ":" expected but "." found
 [Error] myISAPI.pas(33): Identifier redeclared: "sl"
 [Error] myISAPI.pas(34): Identifier redeclared: "sl"
 [Error] myISAPI.pas(35): Type expected but "END" found
 [Fatal Error] Project2.dpr(9): Could not compile used unit "..\..\..\..\WEB_ISAPI\myISAPI.pas"


 
Anatoly Podgoretsky ©   (2006-11-23 16:03) [60]

> poganka  (23.11.2006 15:55:58)  [58]

Это CGI


 
poganka ©   (2006-11-23 16:05) [61]


> Anatoly Podgoretsky ©   (23.11.06 16:03) [60]

я думаю, это не принципиально. препод сказал, что в данном случае вся разница в том, какое именно Web Server Application выбирать. суть типа не меняется.


 
Anatoly Podgoretsky ©   (2006-11-23 16:13) [62]


> var sl: TStringList;

Вот это должно быть перед begin


> Unknown directive: "varMyname1"

Это не понятно почему, когда просто переменная не объявлена, возможно ихз-за следующего var


 
Чапаев ©   (2006-11-23 16:16) [63]

> [58] poganka ©   (23.11.06 15:55)
Действительно, наверху есть. Просю пардону. ;-)


> <input type="radio" name="myname1">Список товаров    <BR>
> <input type="radio" name="myname2">Список услуг      <BR>
> <input type="radio" name="myname3">Список партнеров  <BR>
Это неправильно, насколько я понял. Надо так:
<input type="radio" name="myname" value="tovar.html">Список товаров    <BR>
<input type="radio" name="myname" value="uslugi.html">Список услуг      <BR>
<input type="radio" name="myname" value="partnery.html">Список партнеров  <BR>
Не ручаюсь за правильность, в боевых условиях я этим уже года три не пользовался.

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
 Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
 Value:string;
begin
 Value:="c:\webapp\"+Request.ContentFields.Values["MyName"];
 Response.ContentStream:=TFileStream.Create(Value,fmOpenRead);
end;


 
poganka ©   (2006-11-24 14:55) [64]

всем соучастникам спасибо! я дид ит естэдэй! препод сам дописал мне код!
...и дал новую задачу по ASP. (кстати, никто не знает, на чем ее легче писать: на VBScript или JS?)

спэшл тэнк ю ту Донецк, Эстония и все остальные!
вэри спэшл тэнк ю ту Киев! хлопцы, вы гарны!


 
Anatoly Podgoretsky ©   (2006-11-24 14:58) [65]

> poganka  (24.11.2006 14:55:04)  [64]

Это не о чем не говорит, ASP файл, это обычный текстовый файл, в котором может быть что угодно, часто там кроме HTML кода, еще код и на VBScript или JS, или на чем ни будь еще другом.
Писать на том, на чем получится, у VBScript более человеческий синтаксис.



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

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

Наверх




Память: 0.63 MB
Время: 0.044 c
15-1164366912
dreamse
2006-11-24 14:15
2006.12.17
Подскажите компонент


1-1162539533
Gear
2006-11-03 10:38
2006.12.17
Как правильно закрыть все потоки закрывая программу?


15-1164589479
vasIzmax
2006-11-27 04:04
2006.12.17
Кто-нибудь это видел


5-1145440086
DVM
2006-04-19 13:48
2006.12.17
Переопределить OnClick у потомка TCustomControl?


2-1164644972
АртемКиН
2006-11-27 19:29
2006.12.17
разтрясти Indy Ftp Client





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