Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Мультиязыковое приложение

Delphi , Файловая система , Ресурсы

Мультиязыковое приложение

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

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

Вот некоторый код, дающий представление об этом методе:


unit French1;

interface

uses

  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' then
  begin
    StringIndex := 0;
  end
  else if ProgramLanguage = 'fra' then
  begin
    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 do
  begin
    if DialogForm.controls[j] is tButton then
      with tButton(DialogForm.controls[j]) do
      begin
        if caption = '&Yes' then
          caption := LoadStr(StringIndex + 7);
        if caption = '&No' then
          caption := LoadStr(StringIndex + 8);
      end;
  end;
  DialogForm.showmodal;
end;

end.

Программа на Delphi, которая создает многязычное приложение с поддержкой французского и английского языков. Программа использует файлы ресурсов (RES) для хранения строк для каждого языка.

Единица French1 содержит следующие компоненты:

  • Форма (TForm1) с кнопкой (Button1)
  • Два процедуры: FormActivate и Button1Click

В процедуре FormActivate программа проверяет текущий язык, используя файл INI (Win.INI), или устанавливает его по умолчанию на французский ('fra'). Затем она использует код языка для определения таблицы строк.

Процедура Button1Click создает диалоговое окно с строками, загруженными из файла ресурсов в зависимости от выбранного языка. Программа также изменяет надписи кнопок, чтобы соответствовать выбранному языку.

Вот некоторые предложения по улучшению:

  • Вместо использования файлов INI рассмотрите использование более современной конфигурации хранения,such as JSON или XML.
  • Используйте константы или перечисления для определения кодов языков вместо жесткого кодирования строк.
  • Рассмотрите использование более модульного подхода, отделив язык-специфичные коды в отдельных единицах или модулях.
  • Функция LoadStr используется для загрузки строк из файла ресурсов. Эта функция возвращает пустую строку, если не найдено соответствующей строки. Вам может потребоваться добавление обработки ошибок для этого случая.

Вот пример кода, который демонстрирует, как можно реализовать эти предложения:

type
  TLanguages = (enu, fra); // Определите тип для кодов языков

var
  ProgramLanguage: TLanguages;

procedure TForm1.FormActivate(Sender: TObject);
begin
  ProgramLanguage := 'fra'; // Установите язык по умолчанию на французский
   // ...
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  DialogForm: TDialog;
  StringIndex: Integer;
begin
   // Загрузите строки в зависимости от выбранного языка
  case ProgramLanguage of
    enu:
      StringIndex := 0;
    fra:
      StringIndex := 8;
    else
      raise Exception.Create('Unsupported language');
  end;

   // Создайте диалоговое окно с загруженными строками
  DialogForm := TDialog.Create(Self);
  try
    DialogForm.Caption := LoadStr(StringIndex + 1);
    DialogForm.Message := LoadStr(StringIndex + 2);
    DialogForm.ShowModal;
  finally
    FreeAndNil(DialogForm);
  end;
end;

В этом коде используется тип (TLanguages) для определения кодов языков и переменная (ProgramLanguage) для хранения выбранного языка. Процедура FormActivate устанавливает язык по умолчанию на французский, а процедура Button1Click загружает строки в зависимости от выбранного языка с помощью оператора case. Если не поддерживаемый язык обнаружен, она поднимает исключение.

Обратите внимание, что это только предложение, и вам может потребоваться модификация кода для соответствия вашим конкретным требованиям.

Мультиязыковое приложение: создайте таблицу строк в ресурсном файле, связайте ее с EXE-файлом и используйте переменные времени выполнения для загрузки сообщений в зависимости от языка.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Ресурсы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-27 01:56:07/0.0039079189300537/0