Для тех, кто хочет создать мультиязыковое приложение,
проверяющее текущий локальный язык, и не хочет писать много кода посвящается
данный совет. Вот моя повесть о том, как я создал в ресурсном файле таблицу
строк, прилинковал ее к своему EXE-файлу и использовал в своих мультиязыковых
диалогах.
Вместо использования директив времени выполнения для проверки текущего языка,
для установки индекса сообщений в таблице строк и загрузки оттуда сообщений в
зависимости от языка я использовал переменные времени выполнения. Для каждого
языка вы можете создавать другие таблицы строк, затем компилируя их с
соответствующими директивами компиляции.
Вот некоторый код, дающий представление об этом методе:
unit French1;
interfaceuses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, IniFiles;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private{ Private declarations }public{ Public declarations }end;
var
Form1: TForm1;
StringIndex: Integer;
implementation{$R *.DFM}{$R MULTLANG.RES}{ Вот содержимое ресурсного файла для этого проекта:
1, "Attention"
2, "No Condition definition selected!"
3, "Always"
4, "Cannot delete the 'always' condition."
5, "Confirmation"
6, "Delete the condition?"
7, "Yes"
8, "No"
9, "Attention"
10, "Pas de condition Selectionnйe"
11, "Toulours"
12, "Ne peux effacer la condition 'Toujours'"
13, "Confirmation"
14, "Effacer cette condition?"
15, "&Oui"
16, "&Non"
}procedure TForm1.FormActivate(Sender: TObject);
var{inifile : TIniFile; Опционально}
ProgramLanguage: string;
begin{ Устанавливаем французский язык }
ProgramLanguage := 'fra';
{ Дополнительно вы можете получить текущий язык из Win.INI:}{inifile := TInifile.Create('WIN.INI');
ProgramLanguage := inifile.ReadString('intl', 'sLanguage', 'enu');
inifile.Free;}{ Простите за то, что я привожу здесь несколько языков, указанные
ниже находились в файле setup.inf моей операционной системы.
dan = Danish
nld = Dutch
enu = English (American)
eng = English (International)
fin = Finnish
fra = French
frc = French Canadian
deu = German
isl = Icelandic
ita = Italian
nor = Norwegian
ptg = Portuguese
esp = Spanish
esn = Spanish (Modern)
sve = Swedish
}if ProgramLanguage = 'enu' thenbegin
StringIndex := 0;
endelseif ProgramLanguage = 'fra' thenbegin
StringIndex := 8;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i, j, k: integer;
DialogForm: tform;
begin
Application.NormalizeTopMosts;
{No Condition definition selected!"}
DialogForm := CreateMessageDialog(LoadStr(StringIndex + 2), mtWarning,
[mbOK]);
{Attention}
DialogForm.caption := LoadStr(StringIndex + 1);
DialogForm.showmodal;
Application.RestoreTopMosts;
{Cannot delete the 'always' condition.}
DialogForm := CreateMessageDialog(LoadStr(StringIndex + 4), mtWarning,
[mbOK]);
{Always}
DialogForm.caption := LoadStr(StringIndex + 3);
DialogForm.showmodal;
Application.RestoreTopMosts;
{Delete the condition?}
DialogForm := CreateMessageDialog(LoadStr(StringIndex + 6), mtInformation,
[mbYes, mbNo]);
{confirmation}
DialogForm.caption := LoadStr(StringIndex + 5);
for j := 0 to DialogForm.controlCount - 1 dobeginif DialogForm.controls[j] is tButton thenwith tButton(DialogForm.controls[j]) dobeginif caption = '&Yes' then
caption := LoadStr(StringIndex + 7);
if caption = '&No' then
caption := LoadStr(StringIndex + 8);
end;
end;
DialogForm.showmodal;
end;
end.
Статья Мультиязыковое приложение раздела Файловая система Ресурсы может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.