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

Вниз

Новый модуль , сборник полезных процедур от ACS inc.   Найти похожие ветки 

 
Black_phoenix ©   (2005-01-04 12:26) [0]

Так как кладовка какого то не работает выкладываю модуль на narod  :(  http://club-soft.narod.ru/acs_utils_1.0.rar

Описание сдеся :

acs_utils Представляет из себя сборник полезных функций

// ******************************* Описание функций

// ----------- Функции для перевода программы на другой язык

procedure SaveLangText(FileName : String);  // Сохранение в указанном файле Caption и Text всех видимых контролов
procedure LoadLangText(FileName : String); // Загрузка из указанного файла всех надписей контролов

Внимание ! Обрабатываются эти контролы :

tOpenDialog
tsavedialog
tOpenPictureDialog
tsavePictureDialog
tPageControl
tTabControl
tRichEdit
tStatusBar1
tListView
tTreeView
TBitBtn
tSpeedButton
tCheckListBox
tStaticText
tmemo
tCombobox
tlisbox
tPanel
tLabel
tButton
tChckbox
tGroupbox
tRadionbutton
tMenu
tRadioGroup

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

// --------- Работа с приложением

procedure SaveApplicationIni(SelForm : TForm); // Записать текущее положение программы на экране в ini файл
procedure LoadApplicationIni (SelForm : TForm); // Загрузить сохраненное положение приложения на экране

// -------- Работа с ini файлом ( ini файл создается в каталоге программы )

procedure SaveParamIntToIni( IntParam : Integer; Section : String); // Записать integer данные в ini файл
procedure SaveParamBoolToIni( BoolParam : Boolean; Section : String); // Записать boolean  данные в ini файл
procedure SaveParamStrToIni( StrParam : String; Section : String); // Записать string данные в ini файл

procedure LoadParamStrToIni(var StrParam : String; Section : String); // Прочитать integer данные из ini файла
procedure LoadParamBoolToIni(var BoolParam : Boolean; Section : String); // Прочитать boolean данные из ini файла
procedure LoadParamIntToIni(var IntParam : Integer; Section : String); // Прочитать string данные из ini файла

// --------- Дополнительные функции

procedure ShowInTaskBar(ShowForm : Boolean); // Спрятать показать кнопку приложения на панели задач
function  FileList (DirName, Filter : String) : TStringList; // Поиск файлов по маске в определенном каталоге
function GetCMDLineFile (CommandLine : String) : String; // Получить командную строку приложения
function GetFileLength (FileName : String) : LongInt; // Получить размер указанного файла в байтах
function GetAmpDir : String; // Получить исходный путь каталога приложения
function AppendSlash(DirName : String) : String; // Функция возвращает путь к указанному каталогу но с установленным слешем в конце

// -------- Регистрация приложений в системе

procedure CreateRegClass (RegClassName, RegKeyDescr : String; IconIndex : Integer); // Регистрация класса и иконки ( с текущим приложением )
procedure RegExtension (RegExtName, RegClassName : String); // Регистрация класса с указаными приложением

version 1.0

Email acs_inc@mail.ru \ Black_phoenix@rambler.ru
www.omega-sector.kz/acs/
forum www.omega-sector.kz/acs/forum/


 
Чеширский_Кот ©   (2005-01-04 13:56) [1]

кол-во функций просто убивает...


 
ssk ©   (2005-01-04 14:03) [2]

убивает то, что в архиве DCU :-/

>автору
PAS нельзя было заархивировать? или исходник жутко секретный?


 
TUser ©   (2005-01-04 14:06) [3]

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


 
Black_phoenix ©   (2005-01-04 14:14) [4]

> ssk ©   (04.01.05 14:03) [2]

Даю просто так .. так вы же хотите ещё большего ! Вот что значит давать народу полезные наработки

> TUser ©   (04.01.05 14:06) [3]

Перевод программы ты в одну строчку не напишешь ! а лучше реализации я не встречал

Pas не дам ( по крайней мере сейчас ) так как я затратил и своё время на это.Функции действительно полезные ! особенно перевод.
И требовать от меня что то это просто не уважение


 
Black_phoenix ©   (2005-01-04 14:17) [5]

Тем более для начинающих этот модуль будет только в помощь.
Напрмер чтобы добавить перевод к любой своей программе нужно всего лишь затратить 3 минуты на подключение модуля и обработки 2х строк


 
ssk ©   (2005-01-04 14:24) [6]

>Black_phoenix

поверь, ничего супер-революционного в твоих функциях нет


 
Black_phoenix ©   (2005-01-04 14:29) [7]

> ssk ©   (04.01.05 14:24) [6]

Я знаю ! :)

Но многим это поможет сократить время разработки программы !
И не нужно мне говорить ничего такого. Я выложил модуль и не требую ничего в замен так что качайте , а кому будет что то нужно ещё обращайтесь поговорим :)


 
TUser ©   (2005-01-04 14:36) [8]


> > TUser ©   (04.01.05 14:06) [3]
>
> Перевод программы ты в одну строчку не напишешь ! а лучше
> реализации я не встречал

Не меньше половины - это еще не все! А в целом согласен с [6] - такой модуль был бы полезен, если бы ты открыл исходники. Его можно было бы добавить в FAQ и посылать туда начинающих. Также подобные наработки могут быть полезны для внутреннего пользования - написал туда что-то, свалил в несколько модулей то, что сам часто используешь - и подключай. Для того, чтобы подобный модуль был полезен не только тебе, там должно быть примерно в 10-20 раз больше функций, тогда и я, глядишь, чего-нибудь для себя там накопаю. А пока, мне например, перевод контролов на нужный язык нафиг не нужен, а вот исходный путь каталога приложения я и без твоего модуля вытащу.


 
250   (2005-01-04 14:49) [9]

>если есть запись на обрабатываемый контрол то данные не записываются
Жаль! А так хотелось бы большего :)


 
KSergey ©   (2005-01-04 14:58) [10]

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

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

И еще, по поводу "я же работал"
То, что часто в общем доступе в FAQ - действительно профессиональные, классно сделанные вещи. Ваш же детский лепет - нафиг не нужон.


 
KSergey ©   (2005-01-04 15:27) [11]

По работе с ini файлом несколько вопросов
1.

> ( ini файл создается в каталоге программы )

Ага, славно. А имя у него какое?

2.
> procedure LoadParamIntToIni(var IntParam : Integer; Section
> : String); // Прочитать string данные из ini файла

Ну ладно, в комментарии подозреваю ошибка.
Но вопрос по существу: если данные не прочитались (не было такого параметра, например) - как я об этом могу узнать и какое значение будет у IntParam после этого?

3. и главый вопрос: чем TIniFile не угодил?

Другие вопросы:

> procedure SaveApplicationIni(SelForm : TForm); // Записать
> текущее положение программы на экране

У программы есть положение на экране???! А если есть, то при чем тут какой-то параметр TForm?

> function GetCMDLineFile (CommandLine : String) : String;
> // Получить командную строку приложения

А использовать CmdLine из System - не прикольно? Или еще проще - сразу ParamCount + ParamStr?

> function GetAmpDir : String; // Получить исходный путь каталога
> приложения

Это в смысле

ExtractFileDir (Application.ExeName)

Оно?

> function AppendSlash(DirName : String) : String; // Функция
> возвращает путь к указанному каталогу но с установленным
> слешем в конце

Предлагаю следующую, более универсальную трактовку, аналогичную по функционалу:

//////////////////////////////////////////////////////////////////////
// Дописывает к строке указанный конечный символ, если строка
// не оканчивается на этот символ; версия с параметром по умолчанию -
// для пути к каталогу
//////////////////////////////////////////////////////////////////////

procedure SetStrEndCh (var AStr: String; const AEndCh: Char = "\");
var
 L: Integer;
begin
 L := Length(AStr);
 if L < 1 then
   AStr := AEndCh
 else
 begin
   if AStr[L] <> AEndCh then  AStr := AStr + AEndCh;
 end;
end;


PS
Прошу воспринять все как конструктивную критику.

К стати, вот до кучи, вдруг тоже сгодится
Дарю ;)


// отрезает указанное кол-во символов от строки слева
function LeftStr (const S: String; const i: Integer): String;
begin
 if i <= 0 then
   LeftStr := ""
 else
   LeftStr := Copy(S, 1, i)
end;

// отрезает указанное кол-во символов от строки справа
function RightStr (const S: String; const i: Integer): String;
begin
 if i <= 0 then
   RightStr := ""
 else
   RightStr := Copy(S, Length(S)-i+1, i)
end;

// отрезает от строки начиная с указанной позиции - и до конца
function EndingStr (const S: String; const i: Integer): String;
begin
 if i <= 0 then
   EndingStr := ""
 else
   EndingStr := Copy(S, i, Length(S)-i+1)
end;


 
TUser ©   (2005-01-04 15:36) [12]

И еще вдогонку - IncludeTrailingBackslash


 
KSergey ©   (2005-01-04 15:39) [13]

> [12] TUser ©   (04.01.05 15:36)

Гы, прикольно... ;) И не знал ;)


 
GrayFace ©   (2005-01-04 15:51) [14]

А как устанавливать DCU?
Black_phoenix ©   (04.01.05 14:14) [4]
Функции действительно полезные ! особенно перевод.

Ну, например, function AppendSlash(DirName : String) : String; дублирует стандартную функцию.


 
Чеширский_Кот ©   (2005-01-04 15:54) [15]

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


 
KSergey ©   (2005-01-04 16:09) [16]

> [15] Чеширский_Кот ©   (04.01.05 15:54)

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

Что не умаляет заслуг автора как таковых, конечно, но, увы, на самом деле...

ЗЫ.
Как, например, вычитанная сегодня на этом форуме фраза:

"Оказалось, что многие сервера работают не на Windows, а на Unix [имеются в виду Web-сервера]"

Как забавна сия наивность, как интересно наблюдать за открытиями многогранности мира ;) Я без издевки.


 
Black_phoenix ©   (2005-01-04 16:28) [17]

Удалено модератором


 
Black_phoenix ©   (2005-01-04 16:29) [18]

Удалено модератором


 
Black_phoenix ©   (2005-01-04 16:29) [19]

Блин глючный инет .. :)


 
Alexander Panov ©   (2005-01-04 16:41) [20]

Black_phoenix ©   (04.01.05 16:29) [19]

Не слушай их-)

Когда сделаешь что-то полезное, всегда приятно тебе, но не всегда другим.


 
KSergey ©   (2005-01-04 17:08) [21]

> [18] Black_phoenix ©   (04.01.05 16:29)
> Более менее полезное сообщение.

Спасибо, конечно, вот только вопросов там было больше одного... Или я зря расшибался?


 
begin...end ©   (2005-01-04 17:25) [22]

> [11] KSergey ©   (04.01.05 15:27)

> function LeftStr
> function RightStr

Уже имеются в Delphi 7.


 
Чеширский_Кот ©   (2005-01-04 17:27) [23]

Панов, зачем изобретать велосипед?


 
KSergey ©   (2005-01-04 17:30) [24]

> [22] begin...end ©   (04.01.05 17:25)
> > function LeftStr
> > function RightStr
> Уже имеются в Delphi 7.

Есть такое дело.... Но т.к. D < 7... Перейдем - выкинем, делов то ;)
Вообще, если о строках речь вести - то есть много готовых, замечательных библиотек...;)


 
Чеширский_Кот ©   (2005-01-04 17:31) [25]

не, давайте вообще весь SysUtils перепишем и никого при этом не будем слушать


 
begin...end ©   (2005-01-04 17:32) [26]

> [25] Чеширский_Кот ©   (04.01.05 17:31)

Займитесь на досуге.


 
Чеширский_Кот ©   (2005-01-04 17:37) [27]

сейчас, разбежался


 
uny ©   (2005-01-04 18:07) [28]

если первая наработка, то автора понять можно. а так - да хотя бы прога dscaler - с исходниками скачать, посмотреть, подумать))
написать им можно, образумить:D


 
Anatoly Podgoretsky ©   (2005-01-04 18:38) [29]

После 17-18 у кого то еще есть желание смотреть и теб более запускать?


 
GuAV ©   (2005-01-04 19:19) [30]

Black_phoenix ©   (04.01.05 12:26)

> Внимание ! Обрабатываются эти контролы :

Зачем такое ограничение ?
Когда я подобной фигнёй страдал я сделал для всех строковых св-в всех контролов.


> // --------- Работа с приложением

> // -------- Работа с ini файлом ( ini файл создается в
> каталоге программы )

С ини файлами я предпочёл бы работать через TCustomIniFile.

Кстати см. rxLib - там есть компоненты для сохранения свойств в ини визуально (и размеров формы тоже есть)

function  FileList (DirName, Filter : String) : TStringList; // Поиск файлов по маске в определенном каталоге
Такое лучше было бы сделать так
function  FileList (DirName, Filter : String ; Dest: TSrings)

> function GetCMDLineFile (CommandLine : String) :
> String; // Получить командную строку приложения

Не понял.


> ShowInTaskBar


> GetFileLength


> GetAmpDir


> AppendSlash

Я предпочту написать эту одну строчку кода. Вместо того чтобы использовать функции этой библиотеки.


 
Black_phoenix ©   (2005-01-05 06:40) [31]

> Anatoly Podgoretsky ©   (04.01.05 18:38) [29]

> После 17-18 у кого то еще есть желание смотреть и теб более запускать?

А после 50 есть желание унижать других ! Как это знакомо :)


 
KSergey ©   (2005-01-05 09:35) [32]

> [31] Black_phoenix ©   (05.01.05 06:40)
> А после 50 есть желание унижать других ! Как это знакомо

А по существу (в том числе и на другие вопросы) нечего ответить??!
Странно, тогда мне действительно жаль потраченного мною времени на их написание, я надеялся на большее.


 
Kair ©   (2005-01-05 10:48) [33]

А так зачем?



type
 TacsShell = class(TObject)
 private
   function regReadString(aKey: HKEY; const Path: String): String;
   procedure regWriteString(aKey: HKEY; const Path: String; const Value: String);
   procedure strStripLast(var S: String);
   function strLastCh(const S: String): Char;
   procedure regParsePath(const Path: String; var aPath: String; var aValue: String);
   function GetApplicationFileName: String;
 public
   function AppendSlash(DirName: String): String;
   function GetAmpDir: String;
   function GetFileLength(FileName: String): Longint;
   function GetCMDLineFile(CommandLine: String): String;
   procedure SaveLangText(FileName: String);
   procedure LoadLangText(FileName: String);
   procedure ShowInTaskBar(ShowForm: Boolean);
   procedure CreateRegClass(RegClassName: String; RegKeyDescr: String; IconIndex: Integer);
   procedure RegExtension(RegExtName: String; RegClassName: String);
   procedure SaveApplicationIni(SelForm: TForm);
   procedure SaveParamIntToIni(IntParam: Integer; Section: String);
   procedure SaveParamBoolToIni(BoolParam: Boolean; Section: String);
   procedure SaveParamStrToIni(StrParam: String; Section: String);
   procedure LoadApplicationIni(SelForm: TForm);
   procedure LoadParamStrToIni(var StrParam: String; Section: String);
   procedure LoadParamBoolToIni(var BoolParam: Boolean; Section: String);
   procedure LoadParamIntToIni(var IntParam: Integer; Section: String);
   procedure GetLangTags(FileName: String; var Author: String; var Lang: String; var Comment: String);
   function FileList(DirName: String; Filter: String): TStringList;
 end;

var
 PlayerShell: TacsShell;



 
KSergey ©   (2005-01-05 10:57) [34]

> [33] Kair ©   (05.01.05 10:48)
> А так зачем?

Это о чем???


 
Aristarh   (2005-01-05 10:59) [35]

>KSergey ©   (05.01.05 09:35) [32]
>Странно, тогда мне действительно жаль потраченного мною времени
>на их написание, я надеялся на большее.

Вот и ладушки. Самое время заняться работой вместо того, чтобы изгаляться над новичками.


 
KSergey ©   (2005-01-05 11:07) [36]

> [35] Aristarh   (05.01.05 10:59)
> чтобы изгаляться над новичками.

Это изгаляться??!!


 
Kair ©   (2005-01-05 11:37) [37]


> KSergey ©   (05.01.05 10:57) [34]
> > [33] Kair ©   (05.01.05 10:48)
> > А так зачем?
>
> Это о чем???


Это в его модуле написано было.
Думаю, в класс пихать было лишним.


 
esu ©   (2005-01-05 11:43) [38]


> Так что не парьтесь ! Если можете написать лучше то пишите
> , если не можете так качайте и пользуйтесь на халяву :)
>

Дык откуда ж мне знать лучше я могу или хуже если нет исходников ? :) А так в интернете множество исходников для всех твоих функций но по крайней мере я смогу их нормально отладить, оценить качество реализации... Да и для совсем новичков полезнее наверное все ж с исходниками разбираться чем некий dcu юзать.


 
Black_phoenix ©   (2005-01-06 15:32) [39]

Вышло обновление модуля до верси 1.1 : www.club-soft.narod.ru/acs_utils_1.1.rar

- Обновление коснулось перевода контролов : теперь так же обрабатываються и Hint"s в таких компонентах как

TBitBtn
tSpeedButton
tPanel
TButton
TCheckBox
TRadioButton

Данные обрабатываються только в том случае если у компонента свойство ShowHint установлено в True и если в Hint есть текст


 
TUser ©   (2005-01-06 15:41) [40]


> Вышло обновление модуля до верси 1.1

Я готов скачать билд 1.1.2.0.3А бета :)


 
KSergey ©   (2005-01-06 16:11) [41]

> [39] Black_phoenix ©   (06.01.05 15:32)

Спаршиваю последний раз: ответы на вопросы будут?


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

Дети Ивана Кулибина...


 
GuAV ©   (2005-01-06 17:49) [43]

Black_phoenix ©   (06.01.05 15:32) [39]
- Обновление коснулось перевода контролов : теперь так же обрабатываються и Hint"s в таких компонентах как


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


 
Чеширский_Кот ©   (2005-01-06 17:55) [44]

погодь, через 20 релизов усё будет...


 
GuAV ©   (2005-01-06 18:29) [45]

Не, я просто хочу понять, через RTTI реализовано, через "выскрытие" TControl, или тупо кодом для каждого из перечисленных... почему-то склонен к третьему варианту...


 
Экспериментатор   (2005-01-06 20:40) [46]

Могу на спор написать
{{{procedure SaveLangText(FileName : String);  // Сохранение в указанном файле Caption и Text всех видимых контролов
procedure LoadLangText(FileName : String); // Загрузка из указанного файла всех надписей контролов }}}

только обрабатываться(переводиться) будут все объекты у которых есть Caption Hint и.т.д.
RTTI - это сила
и это будет гораздо короче -
> Black_phoenix ©   (04.01.05 12:26)  
ты даже не представляешь насколько короче


 
Экспериментатор   (2005-01-06 20:48) [47]


> GuAV ©   (06.01.05 18:29) [45]

Думаю что реализовано кодом для каждого из перечисленных...
Если через RTTI, то список объектов был бы неограниченным.

TO

> Black_phoenix ©   (04.01.05 12:26)  

если вопросы, то прошу galera@narod.ru  в теме пишите RTTI


 
GuAV ©   (2005-01-06 21:22) [48]

Ну, может там фсё таки RTTI заюзано, а насчёт короче - так через "вскрытие" TControl ещё короче. И тоже для всех.


 
Игорь Шевченко ©   (2005-01-06 22:48) [49]

GuAV ©   (06.01.05 21:22) [48]


> Ну, может там фсё таки RTTI заюзано, а насчёт короче - так
> через "вскрытие" TControl ещё короче. И тоже для всех.


Может и короче, но нафига вообще сохранять куда-то Caption и Hint ? :)

С уважением,


 
GuAV ©   (2005-01-06 23:31) [50]

Игорь Шевченко ©   (06.01.05 22:48) [49]

Предполагаю что для локализации.

Сам как-то с подобным экспериментирвал...


 
Игорь Шевченко ©   (2005-01-06 23:53) [51]

GuAV ©   (06.01.05 23:31) [50]


> Предполагаю что для локализации.


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

(с) Толик Тенцер


 
GuAV ©   (2005-01-07 00:23) [52]

Игорь Шевченко ©   (06.01.05 23:53) [51]

LOL

Согласен.


 
Black_phoenix ©   (2005-01-07 18:27) [53]

// TBitBtn
                   if (obj is TBitBtn) then begin
                   inif.writestring(Sezione,(obj as TBitBtn).name,(obj as TBitBtn).Caption);
                   if ((obj as TBitBtn).ShowHint) and ((obj as TBitBtn).Hint <> "") then
                   inif.writestring(Sezione,(obj as TBitBtn).name+"_hint",(obj as TBitBtn).Hint);
                   end;
                   // SpeedButton
                   if (obj is TSpeedButton) then begin
                   inif.writestring(Sezione,(obj as TSpeedButton).name,(obj as TSpeedButton).Caption);
                   if ((obj as TSpeedButton).ShowHint) and ((obj as TSpeedButton).Hint <> "") then
                   inif.writestring(Sezione,(obj as TSpeedButton).name+"_hint",(obj as TSpeedButton).Hint);
                   end;

> GuAV ©   (06.01.05 18:29) [45]  

Почему то склонен считать тебя гадом !


 
GuAV ©   (2005-01-07 19:42) [54]

Black_phoenix ©   (07.01.05 18:27) [53]

Значит в [45] я угадал.

Нет, ничего против такого варианта не имею, несмотря на упомянутую не-универсальность, т.к. всё равно - см посты Игоря Шевченко © , включая [42], [49] и [51].



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

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

Наверх




Память: 0.62 MB
Время: 0.037 c
9-1097749181
Malefic
2004-10-14 14:19
2005.01.23
Как использовать AsphyreObjects?


3-1103123842
alextov
2004-12-15 18:17
2005.01.23
Надо в каждой ячейке DBGrida иметь свой выпадающий список.


14-1104773912
Aldor_
2005-01-03 20:38
2005.01.23
Обособление интерфейсной части в программе. Способы.


1-1105367591
Guest_01
2005-01-10 17:33
2005.01.23
Подскажите, в чем ошибка?


1-1105609595
Игорь нтк
2005-01-13 12:46
2005.01.23
DB Radiogroup





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