Лекция № 14
Тема: «Создание программ с интерфейсом на разных языках»
План
1. Подготовка формы к переводу
2. Работа с библиотекой TsiLang
3. Переключение языка интерфейса
1. Интернационализация форм и сообщений
Если вы создали прекрасное приложение, которое предназначено для международного рынка или хотя бы для международной демонстрации, то вам надо позаботиться о его интернационализации.
Существует множество программных решений для перевода интерфейса программ на разные языки. Мы рассмотрим одно из них – библиотеку TsiLang.
Все текстовые надписи на компонентах и формах, все тексты всплывающих подсказок и т.п. доступны для перевода автоматически.
Что касается перевода сообщений в диалогах, то такие диалоги нужно немного видоизменить: все текстовые константы помещать в функцию Pchar (‘текст’).
Например: вместо оператора
Application.MessageBox('Выйти из программы?','Выход',mb_ok)
нужно писать
Application.MessageBox(pchar('Выйти из программы?'), pchar('Выход'),mb_ok)
2. Работа с библиотекой TsiLang
Данная библиотека содержит набор компонентов для выполнения перевода всех компонентов программы. Устанавливается библиотека с помощью стандартного инсталлятора Windows. После установки в среде Delphi появятся две новых закладки: siComponents с набором основных компонентов и siDialogs с набором компонентов для перевода стандартных диалоговых окон Windows (Открыть, Сохранить как…, Шрифт, Цвет и т.п.). Все компоненты являются невидимыми при работе программы.
Перевод формы
Пусть у Вас уже есть форма с нужными компонентами, которые нужно перевести.
Нанесите на форму компонент siLang (siComponents). В свойстве LangNames введите названия языков перевода. Можно вводить произвольные названия, но только латинскими символами. Эти названия будут отображаться только в окне ввода перевода.
Двойным щелчком на компоненте siLang откройте окно Translation Editor.

В левой части окна отображаются группы текстовых элементов, которые можно перевести:
Captions – все заголовки элементов:
Hints – все тексты всплывающих подсказок;
DisplayLabels – заголовки колонок сеток;
Fonts – имена шрифтов, которые будут использоваться при выборе нужного языка;
MultiLines – перевод многострочных элементов (обычных списков и раскрывающихся списков);
Dialogs – перевод надписей в диалоговых окнах;
Strings – перевод текстовых констант в диалоговых окнах и т.п.
В правой части отображается таблица перевода. В первой колонке таблицы отображается значения элемента на основном языке, а в остальнызх колонках необходимо ввести перевод этого значения. При этом каждая колонка обозначена тем именем языка, которое вы указали в свойстве LangNames компонента siLang.
После окончания перевода закройте окно Translation Editor и подтвердите сохранение изменений.
Если после выполнения перевода на форме появятся новые компоненты, то для их перевода достаточно двойным щелчком открыть компонент siLang. Все данные о новых компонентах автоматически появятся в окне ввода перевода.
Перевод текстовых констант
Если в окне перевода в левой части выбрать группу Strings, то никаких текстовых констант там не отобразится, даже если такие константы в коде присутствуют.
Для добавления констант в окно перевода нужно выполнить ряд действий:
Двойным щелчком откройте компонент siLang, в левой части окна выберите группу Strings и переведите все тексты на нужны языки.
Если после выполнения перевода в коде появятся новые диалоги с новыми текстовыми сообщениями, то повторите указанные выше операции повторно и переведите новые строки.
Перевод диалогов
Если в программе нужно использовать диалоговые окна для работы с файлами, шрифтами, цветом и т.п., то использовать стандартные диалоги нельзя, потому что они не подлежат переводу.
В этом случае нужно использовать аналогичные диалоги со вкладки siDialogs. После добавления любого диалога в окне перевода (открывается двойным щелчком на компоненте siLang) в группе Dialogs появятся все надписи этого диалога, которые можно перевести.
3. Переключение языка интерфейса
После того как весь перевод выполнен включить нужный язык можно с помощью команды:
siLang1.ActiveLanguage:=n;
где n – порядковый номер нужного языка в свойстве LangNames компонента siLang. При этом нумерация начинается с 1.
Например, пусть имеются три языка в следующем порядке: русский, украинский, английский. На форме размещены три кнопки для переключения между языками.
Для кнопки русского языка напишем код:
siLang1.ActiveLanguage:=1;
Для кнопки украинского языка напишем код:
siLang1.ActiveLanguage:=2;
Для кнопки английского языка напишем код:
siLang1.ActiveLanguage:=3;
Чаще всего язык выбирают из выпадающего списка. Пусть имеется компонент ComboBox1 со строками: русский, украинский, английский. При выборе нужной строки должен активироваться соответсвующий язык. Для компонента в событии OnChange напишем код:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
//к ComboBox1.ItemIndex прибавляем 1,
//потому что нумерация строк в списке начинается с 0
siLang1.ActiveLanguage:=ComboBox1.ItemIndex+1;
end;
Переключение языка на нескольких формах.
Пусть имеются две формы. Каждая форма имеет свой компонент siLang, с помощью которого эта форма переведена.
Выбор активного языка выполняется на первой форме с помощью списка ComboBox (код для компонента мы написали выше).
На этой же форме есть кнопка, которая открывает вторую форму, которая также должна отображаться на выбранном языке. Для кнопки напишем код:
procedure TForm1.Button1Click(Sender: TObject);
begin
//открываем вторую форму Form2
form2.Show;
//на второй форме устанавливаем такой же номер активного языка
form2.siLang1.ActiveLanguage:=siLang1.ActiveLanguage;
end;
Замечание: следите за тем, чтобы порядковые номера языков на всех формах были одинаковыми.
Вопросы для самоконтроля
1. Как правильно записывают текстовые константы, которые планируется переводить на другие языки с помощью siLang?
2. Приведите пример записи произвольной команды выдачи окна диалога для перевода текстовых констант?
3. Опишите принцип перевода стандартных надписей на форме с помощью siLang
4. Опишите принцип перевода текстовых констант с помощью siLang
5. Как подключить нужный язык перевода при использовании siLang?
6. Приведите код включения языка перевода с помощью списка ComboBox.