Мультиязычный интерфейс

altПри разработке многоязычного интерфейса есть два пути – воспользоваться встроенным в Delphi мастером или же сделать всё самому. Мы выберем второй, тем более, что на мой взгляд – он гораздо проще.

Для начала нам нужно написать какую-нибудь программу. Один умный человек сказал, что разрабатывать изначально надо на русском языке, и это сущая правда, так как многие европейские языки более лаконичны. Хотя, если ты знаешь французский, то лучше пиши на нём. Сравни, например, «О программе», «About» и «Surle programme». Итак, у меня получилось вот что.

Это – все окна моей программы. Главное окно, окно появляющееся при нажатии на пункт меню «About», и сообщение, появляющееся после клика по кнопке «Click me!». В программе я использовал ActionMainMenuBar, ActionToolBar, SpeedButton, BitButton, Label’ы и ShowMessage. Нам также понадобятся файлы с переводом. Наша программа будет уметь разговаривать на трёх языках – английском, немецком и французском, поэтому приготовь три словаря и помести их в папку Language. Файлы эти могут быть построены по любому принципу, я выбрал такой:

[TForm1]
Open=’Open’
Open.Hint=’Open file’
В квадратных скобках указано название формы, потом условное обозначение элемента и, через знак “=” значение. Ничего не напоминает? Ini-файл? Точно! Именно их мы и будем использовать.


Для этого в секцию uses каждой формы впиши Inifiles. Также у нас будут две
глобальные переменные, их нужно инициализировать до секции implementation:

var
Form1: TForm1;
Ini:Tinifile; //переменная для работы с ini-файлом
language:string; //строка, где будет содержаться название текущего языка

При загрузке программа будет проверять, какой язык использовался последним
Запоминать это мы будем также в отдельном ini-файле – options.ini.

procedure TForm1.FormShow(Sender: TObject);
begin
Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+’options.ini’); //Открыли options.ini
language:=Ini.ReadString(‘Language’,’CurrentLang’,’english’);
{Считали язык, и записали его в переменную language, по умолчанию — english}
Ini.Free; //Закрыли файл, — не забывай освобождать объекты!
Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+’/Language/’+language+’.lng’);
{В переменной language содержится значение, совпадающее с именем нужного нам языка, мы добавляем расширение .lng и открываем соответствующий словарь. Далее, используя этот словарь, заполняем все Caption’ы и Hint’ы на форме}
ActionManager1.ActionBars[0].Items[0].Caption:=Ini.ReadString(‘TForm1′,’File’,»);
ActionManager1.ActionBars[0].Items[0].Items[0].Caption:=
Ini.ReadString(‘TForm1′,’Open’,»);
ActionManager1.ActionBars[0].Items[0].Items[1].Caption:=
Ini.ReadString(‘TForm1′,’Save’,»);
ActionManager1.ActionBars[0].Items[1].Caption:=
Ini.ReadString(‘TForm1′,’Language’,»);
ActionManager1.ActionBars[0].Items[1].Items[0].Caption:=
Ini.ReadString(‘TForm1′,’English’,»);
ActionManager1.ActionBars[0].Items[1].Items[1].Caption:=
Ini.ReadString(‘TForm1′,’French’,»);
ActionManager1.ActionBars[0].Items[1].Items[2].Caption:=
Ini.ReadString(‘TForm1′,’German’,»);
ActionManager1.ActionBars[0].Items[2].Caption:=Ini.ReadString(‘TForm1′,’About’,»);
ActionManager1.ActionBars[0].Items[3].Caption:=Ini.ReadString(‘TForm1′,’Exit’,»);
ExitAct.Hint:=Ini.ReadString(‘TForm1′,’Exit.Hint’,»);
OpenAct.Hint:=Ini.ReadString(‘TForm1′,’Open.Hint’,»);
SaveAct.Hint:=Ini.ReadString(‘TForm1′,’Save.Hint’,»);
AboutAct.Hint:=Ini.ReadString(‘TForm1′,’About.Hint’,»);
MessBut.Hint:=Ini.ReadString(‘TForm1′,’MessBut.Hint’,»);
MessBut.Caption:=Ini.ReadString(‘TForm1′,’MessBut’,»);
Ini.Free;
end;
То же самое пишем для формы About. А как быть, если пользователь захочет
переключить язык во время работы программы? Я пишу такой обработчик для каждого языка:

procedure TForm1.EngActExecute(Sender: TObject);
begin
Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+’options.ini’);
Ini.WriteString(‘Language’,’CurrentLang’,’english’);
{Перезаписываем в options.ini новое значение}
Ini.Free;
FormShow(Self); // процедуру FormShow,чтобы перевести всё на выбранный язык
end;


Еще у нас есть сообщения, их тоже не сложно перевести:
procedure TForm1.MessButClick(Sender: TObject);
begin
Ini := TIniFile.Create(ExtractFilePath(paramstr(0))+’/Language/’+language+’.lng’);
showmessage (PChar(Ini.ReadString(‘Messages’,’1′,»)));
Ini.Free;
end;

Понравилась статья? Поделиться с друзьями: