Локализация приложений средствами Delphi 2009
Интернационализация и локализация создаваемых приложений внутренними средствами Delphi 2009
(ОС : Windows Vista Home Basic SP2 )
(CP : Code Gear Delphi 2009 Architect)
Перед нами стоит задача : Создать простейшее приложение с 3-я языками интерфейса.
Как известно для того чтобы решить какую – то сложную задачу, необходимо разбить ее на более мелкие составляющие, и так :
1. Создание приложения
1.1 Запускаем Code Gear Delphi 2009 Architect
1.2 File - New - (VCL Forms Application - Delphi) = создаем новое приложение
1.3 Tool Palette - Standard - TButton(ДКЛМ – здесь и далее, двойной клик левой кнопкой мыши - на выбранном элементе) = устанавливаем один компонент - «кнопка» на форму
1.4 Object Inspector - Properties - Caption (в поле для ввода КЛКМ) меняем текст с «Button1» на « Виход» = здесь меняем название кнопки
1.5 КЛКМ на свободном месте формы = выделяем форму
1.6 Object Inspector - Properties - Caption (в поле для ввода КЛКМ) меняем текст с «Form1» на « Тестовая форма» = здесь меняем название формы
1.7 КЛКМ на Button1 = выделяем кнопку
1.8 Получаем вот такую картинку

РИС._1
1.9 Object Inspector - Events - OnClick (в поле для ввода ДКЛМ) = создаем заготовку кода для события нажатия кнопки Button1

РИС_2
1.10 В Инспекторе кода - В месте где будет мигающий курсор (между Begin - End) пишем Close; = т.е. при выполнении этой команды - наше приложение будет закрываться.
1.11 Обращаем внимание на то что в Structure - появилось сообщение компилятора об обнаруженной в коде ошибке – Undeclared Identifier ‘TButton’ at line 11 (11:14). Это сообщение говорит о том что в строке 11 кода , начиная с символа 14 – обнаружен не задекларированный идентификатор TButton - но поскольку мы добавили TButton из стандартной палитры компонентов, следовательно он уже в системе присутствует по умолчанию, просто наша программа об этом не знает - сообщим ей об этом
1.12 uses, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; добавим - StdCtrls = в этом модуле находятся процедуры описывающие TButton uses, Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms, Dialogs, StdCtrls; = в результате ошибка больше не высвечивается - возможно эта ошибка вызвана не доработками в программе Делфи 2009(кстати и в Делфи 7 тоже) или разработчики преследовали другие (только им ведомые) цели т.к. для других компонентов обычно названия модулей дописываются в раздел uses - автоматически.
1.13 Для проверки того как будут переводится текстовые строки в программе - немногоее модернизируем в Инспекторе кода implementation //здесь добавим строку или строки (в зависимости от того сколько строк надо переводить)
{$R *.dfm}
implementation
resourcestring
sClose = 'Вы действительно хотите выйти';
{$R *.dfm}
А процедуру закрытия приложения, изменим так:
procedure TForm1.Button1Click(Sender: TObject);
begin
if MessageDlg (sClose, mtConfirmation, [mbYes,mbNo], 0)= mrYes then
Close;
end;
1.14.1 Переименуем проект и форму - Это необходимо было сделать в самом начале,
но забыл, и так :
Project Manager - Project2.exe = выделяем КЛКМ
далее КПКМ – из меню выбираем Rename - и меняем название на TestLang.exe
то же повторяем для названия модуля
Progect Manager - Unit1.pas = выделяем КЛКМ
далее КПКМ – из меню выбираем Rename - и меняем название на Test.pas
1.14.2 File - Save Project As… = выбираем каталог куда сохранять - в этом каталоге
через меню новая папка создаем новую папку для сохранения нашего проекта
= через этот один диалог сохраняются и файл проекта *.dpr и файл модуля *.pas
- кроме того в этот же каталог попадают и другие файлы проекта
Dfm (формы), res(ресурсы), dproj(группы проектов)
1.15 Run - Run (или сразу F9) = компилируем проект
1.16 Проверяем что у нас получилось
- при нажатии на кнопку «Выйти» - появляется сообщения закрытия
- Yes (Да)- просто выходим из программы
- No (Нет) - возвращаемся в программу
= что пока и требовалось от программы - все выполняется

Рис_3
1.17 File – Save All = еще раз сохраняем программу и переходим к следующему этапу

2. Включение в код приложения средств перевода
2.1 Подготовка кода начинается с копирования модуля reinit.pas в папку с нашей Программой - (под Вистой он находится здесь - под ХР надо уточнить)
c:\Users\Public\Documents\RAD Studio\6.0\Demos\DelphiWin32\VCLWin32\RichEdit\reinit.pas
2.2 Project - Add to Project = находим папку нашего проекта - выбираем reinit.pas и нажимаем кнопку открыть - в итоге файл откроется в нашем проекте
2.3 КПКМ на заголовке окна reinit.pas - в появившемся меню выбираем Close Page = закрываем файл reinit.pas
2.4 File - Use Unit - в открывшемся окне выбираем reinit и нажимаем ОК = После этой операции в редакторе кода после строки implementation и перед строкой resourcestring появляется запись - uses reinit;
implementation
uses reinit;
resourcestring
= т. е. модуль reinit.pas подключен к нашему проекту и готов к использованию
2.5 Далее нам необходимо поработать с редактором кода (т.е. с кодом программы) для подготовки ее к интернационализации и локализации - как прототип используем
c:\Users\Public\Documents\RAD Studio\6.0\Demos\DelphiWin32\VCLWin32\RichEdit\remain.pas
Из справки Делфи 2009
Интернационализация - процесс дающий возможность Вашей программе работать в множестве регионов. Регион - среда пользователя, которая включает культурные соглашения целевой страны так же как и языка. Windows поддерживает много регионов, каждый из которых описан парой - страна и язык.
== интернационализация - это есть трансляция (перевод) интерфейса на другие языки, с установкой по возможности региональных стандартов (если вы их знаете), и возможностью использовать динамическое переключение языков.
Локализация - процесс трансляции приложения так, чтобы оно функционировало в определенном регионе. В дополнение к трансляции интерфейса пользователя локализация может включать настройку функциональных возможностей. Например, финансовое приложение может быть изменено для налоговых законов в различных странах. == слишком мудрено - проще говоря Ваша программа при запуске должна автоматически открываться на языке операционной системы Вашего компьютера
например если у пользователя вашей программой локализованная версия Windows немецкая - то и интерфейс вашей программы при запуске должен быть немецкий, если ваша программа не имеет в своем составе немецкой, (китайской, японской) локализации то по умолчанию она должна открыться на английском
2.6 И так продолжим - открываем в любом текстовом редакторе (Например – Блокнот)
c:\Users\Public\Documents\RAD Studio\6.0\Demos\DelphiWin32\VCLWin32\RichEdit\remain.pas
и рассмотрим из него раздел
const
RulerAdj = 4/3; - это удаляем оно нам не понадобится
GutterWid = 6; - это удаляем оно нам не понадобится
ENGLISH = (SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;
FRENCH = (SUBLANG_FRENCH shl 10) or LANG_FRENCH;
GERMAN = (SUBLANG_GERMAN shl 10) or LANG_GERMAN;
В принципе оставшиеся строки идентичны по синтаксису - поэтому , для разбора «полетов» -
возьмем одну из строк - например:
FRENCH = (SUBLANG_FRENCH shl 10) or LANG_FRENCH;
Как известно некоторые языки - имеют как - бы подъязыки (т.е. диалекты). Не является
исключением в этом отношении и французский язык, который имеет в своем составе
шесть диалектов - перечисленных ниже (для удобства восприятия сведем это во что то
типа таблицы):
_
| SUBLANG_RFENCH | LocaleID | LocaleID | LocaleID | Extention |
| Shl-10 | Hex | Dec | Bin | |
| Бельгия-10 | $0000080C | 2060 | 100000001100 | FRB |
| Канада-11 | $00000C0C | 3084 | 110000001100 | FRC |
| Люксембург-101 | $0000140C | 5132 | 1010000001100 | FRL |
| Монако-110 | $0000180C | 6156 | 1100000001100 | FRM |
| Франция-1 | $0000040C | 1036 | 10000001100 | FRA |
| Швейцария-100 | $00000100C | 4108 | 1000000001100 | FRS |
Интерфейс Делфи 2009 предусматривает для идентификации языков и диалектов
Несколько показателей – это:
LANG - здесь название языка
SUBLANG - здесь название диалекта
Locale ID - здесь числовой идентификатор диалекта в шестнадцатеричном формате
Extention - здесь символьный идентификатор диалекта
Примечания:
1. Все это можно увидеть (проверить) - перейдя в Делфи 2009, по следующему пути =
Project – Languages - Add ------------- (в новом окне видим базовый язык операционной
системы) – Next ------------- окно выбора языков (где все это находится)
2. Не возможно выполнить п.1 примечаний - если проект предварительно не сохранен
Кроме этого в приведенной таблице - вычислены некоторые другие показатели для
облегчения понимания вопроса по существу, это:
Locale ID (Dec) = тот же ID , только в десятичном формате - так легче для восприятия
человека
Locale ID (Bin) = тот же ID , только в двоичном формате - так легче для восприятия
машины
Shl - 10 = здесь находится часть кода из приведенной выше строки кода shl 10
Что из себя представляет это выражение - обратимся к справке по языку Паскаль
Вторая группа операций - это операции сдвига влево shl и сдвига вправо shr:
I shl N
I shr N.
Эти операции сдвигают двоичную последовательность значения I влево или вправо на
N двоичных разрядов. При этом биты, уходящие за пределы разрядной сетки,
теряются, а освободившиеся двоичные разряды заполняются нулями. При сдвиге
вправо отрицательных значений освободившиеся разряды заполняются единицами.
С помощью служебного слова Паскаля «shl» проверяется к какому диалекту относится
данный язык или он вовсе не имеет диалектов - если у него в десятом разряде стоит
единица (двоичное значение) - тогда это базовый язык (диалект).
2.7 Для динамического изменения локализаций языков в нашем приложении необходимо предусмотреть какой то пусковой механизм - для запуска процедуры смены языка. Лучше всего для этого подходит пункты меню - да и в Demos предусмотрен этот механизм запуска - хотя можно было бы попробовать использовать и что ни будь типа ComboBox или панель с CheckBox или панель с RadioButton.
2.8 И так добавляем на форму меню с двумя пунктами и тремя подпунктами
- Выбрать язык
- Английский
- Русский
- Украинский
- Выйти из программы
(Почему именно эти языки - я просто других не знаю)
Tool Palette - Standard - TMainMenu (ДКЛКМ)
2.9 Наполняем меню содержанием ДКЛКМ (на значке меню - который уже находится на нашей форме) = заходим в функцию редактирования меню и последовательно его заполняем нашими данными поле Caption в Object Inspector - для каждого элемента меню .
2.10 Продолжаем работу с меню - на этом этапе создаем процедуры работы с каждым элементом меню:
Object Inspector - N5 TMenuItem (Выйти из программы) - Events - OnClick (КЛКМ - в поле ввода) = выбираем cуществующее событие Button1Click - написанное для Button1
2.11 Все таки интересно как будет работать процедура перевода не для одной формы а для группы форм (окон) входящих в проект - для этого добавим к проекту еще одну форму «О проекте» - а потом продолжим работу наполнение меню содержанием:
File - New - Other ------------ ( в новом окне ItemCategories) - Delphi Projects - Delphi Files - About Box (КЛКМ – на значке, в окне справа) - ОК
Примечания: Внизу окна имеется три значка RadioButton - Copy - Копировать этот модуль (выбираем Copy)
- Inherit - Наследовать этот модуль
- Use - Использовать этот модуль в открытом проекте
2.12 Форма откроется на рабочем столе - сразу же внесем в нее необходимые коррективы, типа:
Product Name - Test Lang
Version - 1.0
Copyright - Петров П.С.
Comments - Тестовая форма для перевода
*** Для внесения коррективов - выделяем нужный элемент на форме КЛКМ и в поле для ввода Caption (Object Inspector) вводим необходимые записи.
2.13 Сразу же позаботимся о том чтобы работала кнопка «ОК» - так как ей не назначен никакой обработчик - то пока это просто заготовка
- выделяем кнопку на форме КЛКМ
- Object Inspector - Events - OnClick (ДКЛКМ – в поле для ввода)
- В открывшемся окне редактора кода – между Begin /End вставляем Close;
(эта кнопка будет закрывать форму About Box)
2.14 Заодно переименуем саму форму About Box
- выделяем форму - КЛКМ (на форме)
- Object Inspector – Properties – Caption (КЛКМ – в поле для ввода)
- меняем «About» на «О программе»
2.15 Активируем форму About (КЛКМ – на заголовке вверху окна ) и добавляем форму в наш проект:
File - Save As = сохраняем модуль на диск в каталог нашей программы
2.16 Подключаем модуль About к нашей программе
- Активируем форму Test (КЛКМ – на заголовке вверху окна ) и добавляем форму About в наш проект:
File - Use Unit ------------ OK
2.17 Таким же образом как описано на примере About - возможно подключение к проекту , необходимого количества форм (модулей)
2.18 Вернемся к скопированному фрагменту наименований языков и изменим эти фрагменты как нам необходимо - под выбранные нами языки :
const
ENGLISH = (SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;
FRENCH = (SUBLANG_FRENCH shl 10) or LANG_FRENCH;
GERMAN = (SUBLANG_GERMAN shl 10) or LANG_GERMAN;
- меняем
const
ENGLISH = (SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH;
RUSSIAN = LANG_RUSSIAN;
UKRAINIAN = LANG_UKRAINIAN;
*** SUBLANG - для русского и украинского языка убраны - так как их не существует
2.19 Если посмотреть внимательно на содержимое кода в модуле Remain.pas (Demos) то можно увидеть две основные процедуры которые реализуют функции перевода интерфейса - это:
procedure TMainForm.FormCreate(Sender: TObject); = здесь обеспечивается локализация интерфейса - при запуске
procedure TMainForm.SwitchLanguage(Sender: TObject);
= здесь обеспечивается интернационализация интерфейса - во время работы
*** Управление трансляцией осуществляется через свойство TAG компонентов
- - поменяем “Name” пунктов меню на более вразумительные перед тем как двигаться дальше: - через Object Inspector - Properties - Name
N1 = SelectLanguage
N2 = LanguageEnglish
N3 = LanguageRussian
N4 = LanguageUkrainian N5 = CloseMainForm
N6 = About - здесь добавляем в меню пункт для открытия окна (О программе)
(ДКЛКМ на значке меню - добавляем пункт - в Инспекторе объектов меняем Caption и Name - закрываем редактор меню.
2.20 Рассмотрим загрузку приложения
procedure TMainForm.FormCreate(Sender: TObject);
begin
//Application.OnHint := ShowHint;
//OpenDialog.InitialDir := ExtractFilePath(ParamStr(0));
//SaveDialog.InitialDir := OpenDialog.InitialDir;
//SetFileName(sUntitled);
//GetFontNames;
//SetupRuler;
//SelectionChange(Self);
//CurrText.Name := DefFontData.Name;
//CurrText.Size := -MulDiv(DefFontData.Height, 72, Screen.PixelsPerInch);
LanguageEnglish.Tag := ENGLISH;
LanguageFrench.Tag := FRENCH;
LanguageGerman.Tag := GERMAN;
case SysLocale.DefaultLCID of
ENGLISH: SwitchLanguage(LanguageEnglish);
FRENCH: SwitchLanguage(LanguageFrench);
GERMAN: SwitchLanguage(LanguageGerman);
end;
end;
- создаем обработчик события OnCreate для нашей основной формы
КЛКМ на форме - Object Inspector - Events – OnCreate (ДКЛКМ)
- по образу фрагмента выделенного двойной рамкой и вставляем код между
Begin/end - нашей процедуры OnCreate :
LanguageEnglish.Tag := ENGLISH;
LanguageRussian.Tag := FRENCH;
LanguageUkrainian.Tag := GERMAN;
case SysLocale.DefaultLCID of
ENGLISH: SwitchLanguage(LanguageEnglish);
RUSSIAN: SwitchLanguage(LanguageRussian);
UKRAINIAN: SwitchLanguage(LanguageUkrainian);
Здесь программа определяет LCID = LocaleID и с помощью описанной ниже
процедуры SwitchLanguage - меняет язык интерфейса
2.21 Рассмотрим часть процедуры TMainForm.SwitchLanguage отвечающую непосредственно
за динамическую смену языка в приложении
procedure TMainForm.SwitchLanguage(Sender: TObject);
var
Name : String; // для наших целей локализации не применяется
Size : Integer; // для наших целей локализации не применяется
begin
if LoadNewResourceModule(TComponent(Sender).Tag) <> 0 then
begin
Name := FontName.Text; // для наших целей локализации не применяется
Size := StrToInt(FontSize.Text); // для наших целей локализации не применяется
ReinitializeForms;
LanguageEnglish.Checked := LanguageEnglish = Sender;
LanguageFrench.Checked := LanguageFrench = Sender;
LanguageGerman.Checked := LanguageGerman = Sender;
Используем эту часть кода как прототип для создания нашей процедуры
TMainForm.SwitchLanguage
2.22 Создаем нашу процедуру TMainForm.SwitchLanguage
КЛКМ (на пункте меню LanguageEnglish - в окне Structure) – Object Inspector - Events –
- OnClick (вписывакм в поле для ввода SwitchLanguage и нажимаем Enter)
2.23 Повторяем п.22 для всех выбранных языков - но при заполнении события
OnClick уже не вводим название процедуры, а выбираем в поле из выпадающего
списка процедуру SwitchLanguage
2.24 Переходим в Инспектор кода и в созданной процедуре SwitchLanguage
между Begin/End - вводим следующие строки :
procedure TForm1.SwitchLanguage(Sender: TObject);
begin
if LoadNewResourceModule(TComponent(Sender).Tag) <> 0 then
begin
ReinitializeForms;
LanguageEnglish.Checked := LanguageEnglish = Sender;
LanguageRussian.Checked := LanguageRussian = Sender;
LanguageUkrainian.Checked := LanguageUkrainian = Sender;
end;
2.25 Сохраняем наш проект полностью
2.26 F9 - запускаем наш проект на компиляцию и выполнение. Если все проходит без сообщений об ошибках и в открывшемся окне нашего приложения все работает так как мы и задумали , то закрываем окно и еще раз сохраняем проект. Если по ходу выполнения возникают какие то ошибки или поправки то вносим необходимые изменения или дополнения и сохраняем проект.
2.27 Что у нас получилось можно увидеть на пяти ниже расположенных ScrinShots

Рис_4

Рис_5

Рис_6

Рис_7

Рис_8
3. Перевод приложения на выбранные языки
3.1. Создаем приложение
3.2. Заполняем форму компонентами, пишем необходимые процедуры.
3.3. Компилируем, запускаем программу, проверяем работу - если все нормально то переходим к следующему шагу
3.4. Project - Language - Add
3.5. Программа запрашивает куда сохранять создаваемы языковые модули - если нажимаем ОК то модули будут созданы в каталоге текущего проекта
3.6. В окне Add languages - (Выберите один или больше проектов для которых делается ресурсная DLL,s) Для изменения корневой директории или базового языка - один раз кликните (КЛКМ) на нем.
Корневой является высшая папка проекта (КЛКМ) выбираем из списка наш проект и нажимаем - Next
3.7. В открывшемся окне Add languages - из списка отметив соответствующие CheckBox,ы , выбираем языки (в необходимом количестве) и нажимаем Next
3.8. В следующем окне Add languages - выводится список выбранных языков и здесь же можно поменять пути к месту расположения языковых DLL модулей
Если мы пути не меняем, то в подтверждение выбранных мастером DLL путей - нажимаем Next.
Обязательно выделяем (КЛКМ)- один из языков перед нажатием Next - для того чтобы он был активным при запуске приложения
3.9. Выводится окно в котором в виде справки показано какие языки выбраны - и есть три кнопки:
- Finish - применить указанные изменения к приложению и закрыть мастер DLL
- Back - вернутся назад и внести необходимые изменения
- Cancel - не применять указанные изменения к приложению и закрыть мастер DLL
= нажимаем Finish - для применения указанных изменений к приложению и закрытия мастера DLL
3.10 Далее выдается сообщение с предложение скомпилировать приложение с вновь созданными DLL модулями - нажимаем "Yes"
3.11 Далее выполняется компиляция - создаются новые языковые модули и выводится справка по созданным модулям, где указывается:
- сколько создано языковых Form,
- сколько Resurse Scripts,
- сколько языков
- а так же состояние созданных модулей
= изменены, не изменены, не используются
== нажимаем ОК
3.12 Проверяем каталог с сохраненным проектом и видим что добавились новые подкаталоги по количеству выбранных языков (с соответствующими языку расширениями
т.е. ENU = английский и т.д.)
3.13 После выполнения вышеописанных процедур в меню Project - Language кроме пункта Add, становятся активными еще несколько пунктов
- Add - добавить язык
- Remove - удалить язык
- Set active (здесь язык) - установить активный язык = т.е. тот который будет выводится при запуске программы (по умолчанию)
- Update localised project = обновить проект с измененной языковой локализацией - если вносились изменения в проект
3.14 Необходимо учитывать следующие обстоятельства:
- при выполнении вышеописанных процедур происходит не только локализация приложения но и его интернационализация
т.е. если мы создаем проект и компилируем его в русскоязычной Windows (CP 1251) - то при открытии проекта приложение само определяет кодовую страницу Windows (CP 1251) и соответственно на этом языке выводит приложение = Русский
- если приложение будет открываться в другой системе предположим Windows (CP 1252) - то соответственно программа автоматически откроется на Английском и т.д.
- изменение языка при работе программы необходимо организовывать в коде программы
3.15 Далее заходим View - Translation Manager -Translation Editor - (Например:Project Manager –
Project2.ENG - Unit1.dfm) дважды (ЛКМ) на Unit1.dfm – и вручную выполняем перевод всех наименований на формах - после окончания перевода сохраняем изменения и закрываем Translation Editor (КПКМ - на Translation Editor и закрыть окно) - далее переводим форму на следующие языки выбранные ранее.
Можно не заходить View - Translation Manager -Translation Editor, а сразу щелкать дважды (КЛКМ) на Unit1.dfm и редактор формы откроется в Translation Editor - автоматически.
В Translation Editor есть встроенный двухоконный редактор с помощью которого удобно редактировать ресурсы (особенно длинные строки).
3.16 Сохраняем и закрываем приложение
3.17 Заходим в каталог где сохранено наше приложение - из подкаталога (например ENU запускаем файл TestLang.dpr) - проект откроется в Делфи – но перед этим зачем то выдается сообщение о том что: Проект TestLang будет обновлен.
Проект больше не будет пригоден для использования с предыдущими версиями Делфи. Будет создана копия проекта.

РИС_9
Нажимаем ОК - и двигаемся дальше.
Откроется окно инспектора кода - с кодом нашего модуля.
Первой строкой этого окна сообщается, что изменять в нем что-то вручную категорически
запрещено, во избежание ошибок в работе модуля.

РИС_10
скомпилировать его сразу через Run не получится (выдает предупреждение и подсказку)

РИС_11
Выдает предупреждение о том что не может найти пакет designide120.bpl
Но убедившись в том что он все таки есть на диске, просто заходим в
Project - Options - Packages = снимаем «галочку с »Build with runtime packages
и нажимаем ОК
РИС_12

Но на этом все наши приключения не заканчиваются - пытаемся компилировать F9
Выдается новое предупреждение:

РИС_13
Говорит о том что не может компилировать так как не определено приложение
для которого будет использоваться этот модуль. Необходимо перейти
Run - Parameters = нажимаем ОК и дальше делаем то что просят т.е.
Run - Parameters

РИС_14
- в открывшемся окне в строке Host application - выбираем путь к ехе - файлу приложения
в строке Working Directory – вводим путь к директории где сохранен наш проект
в строку Parametrs - ничего не вводим (так как не знаем что вводить)
в строку Sourse Path - выбираем путь к месту хранения файла TestLang.dpr -
через дополнительное диалоговое окно - в котором после выбора
нужного файла надо не забыть нажать кнопку Add - для добавления
его в список и потом ОК – для применения всех изменений.

РИС_15
3.18 Выполняем команду Run (т.е. компилируем проект) = при этом в исходном каталоге появляется файл TestLang.ENU
3.19 Повторяем п.3.17 и п.3.18 для всех выбранных языков
3.20 Сохраняем проект и закрываем Делфи.
3.21 На этом работа по локализации и интернационализации нашего приложения завершена.
4. Тестирование и отладка приложения
4.1 Казалось бы все работа завершена - пора использовать наш шедевр. Но не тут то было. При проверке на смену интерфейса при перезапуске приложения все выполняется без проблем.
Т.е. Project - Language – Set Active - F9
= хотя здесь может быть и подводный камень - ведь мы получаем нужный интерфейс через перекомпиляцию, а проверить в реальных условиях например на Англоязычной Windows у нас возможности нет.
Но надо отдать должное перекомпилированный с нужным языком TestLang.exe запускается и работает без проблем.

РИС_16
4.2 Но проблема динамической смены языка интерфейса полностью пока не решена.
При запуске у нас устанавливается активный язык.
При нажатии на пункт меню - предположим английский - интерфейс меняется.
Но при попытке повторно сменить язык или вернутся к активному языку - никакой реакции - все остается без изменений.
4.3 Скажем так наша программа уже полнофункциональна и пользоваться ей можно но с некоторыми ограничениями.
Ограничения будут заключаться в том - если мы попытаемся переключиться на другой язык, то мы сможем сделать это только один раз. Для перехода к следующему языку необходимо перезапускать приложение.
5. Дополнительные возможности Делфи 2009 по переводу приложений
5. Дополнительные возможности Делфи 2009 по переводу приложений
В своем составе Делфи 2009 имеет еще один механизм для выполнения переводов
Который возможен к применению на машинах где не установлено Делфи .
Как выполнить эту операцию описано в прилагаемой справке Делфи.
Здесь находится скорректированный машинный перевод справки Делфи 2009, где описывается как установить Внешний Администратор Перевода (ETM) на машине пользователя.
*******************************************************************************
Внешний Администратор Перевода (ETM)
*******************************************************************************
5.1. Как установить ETM на машине транслятора.
5.2. Как послать Язык программирования Delphi проекту для трансляции.
5.3. Как получить оттранслированные проекты назад в Язык программирования Delphi.
5.4. Файлы репозитория.
-------------------------------------------------------------------------------
5.1. Как установить ETM на машине транслятора.
-------------------------------------------------------------------------------
На машине транслятора:
5.1.1) Создайте каталог (например, "C:\ETM").
5.1.2) Скопируйте следующие файлы с машины разработчика в каталог, который Вы только создали:
от delphi60\bin:
- etm.exe
- itecore120.bpl
- rc120.bpl
- dfm120.bpl
- clxdesigner60.bpl (в Делфи 2009 отсутствует – видимо это библиотека для межплатформенных приложений)
- designdgm120.bpl
- designide120.bpl
- dbx120.bpl
- dbx.dbi
- indy120.bpl
- vclide120.bpl
- vclhie120.bpl
- все dcl*120.bpl файлы, кроме dclemacsedit120.bpl,
Dclite120.bpl, dclsmpedit120.bpl, dclsoap120.bpl,
и dclwebsnap120.bpl.
из Вашего соответствующего каталога системы Windows, такой как
windows\system или \WINNT\System32:
- qtintf.dll
- *120.bpl
из delphi60\help:
- etm.hlp (справочный файл ETM)
5.1.3) Запустите ETM и выберите Tools | Параметры |, Пакеты | Добавить.
5.1.4) Выделите все designtime, упакованные файлы там где они расположены (dcl*.bpl) и нажмите OK.
-------------------------------------------------------------------------------
5.2. Как послать Языку программирования Delphi проект для трансляции
-------------------------------------------------------------------------------
5.2. 1) Разработчик создаст Ресурс Мастер DLL на его проекте.
Сгенерированные файлы ETM будут сохранены согласно корневому каталогу названному в честь языка.
Например: C:\MyDelphiProjects\AFK
корневой каталог трансляции Afrikaan для проекта, сохраненного в
"C:\MyDelphiProjects".
5.2.2) Чтобы послать этот проект на трансляцию, заархивируйте этот каталог и пошлите этот комплект к транслятору.
Заметьте: В комплекте Вы должны включать .bgp и .dof файлы в файл почтового отправления, или как индивидуальные файлы или альтернативно,объединенные в ETM проектируемый файл. Если Вы хотите послать файл проекта ETM, используйте (Файл |, Сохранить), чтобы создать файл, тогда удостоверьтесь, что Вы включаете это в файл почтового отправления.
5.2.3) Транслятор разархивирует комплект в каталоге его выбора и откроет проектный файл ( .etm или .bpg) в ETM.
-------------------------------------------------------------------------------
5.3 Как получить оттранслированные проекты назад в Язык программирования Delphi.
-------------------------------------------------------------------------------
1) Скопируйте все оттранслированные .rc и .dfn файлы, полученные от транслятора в Ваш языковой корневой каталог (например, C:\MyDelphiProjects\AFK").
-------------------------------------------------------------------------------
5.4. Файлы репозитория.
-------------------------------------------------------------------------------
Файлы репозитория - автономные файлы с .rps расширением. Они могут посылаться назад и вперед с комплектами трансляции.
Вот так вот выглядит Внешний Администратор Перевода (ETM) - после его сборки из отдельных модулей.

РИС_17
И вот так вот в автономной работе:

РИС_18