Локализация приложений средствами Delphi 2009

Интернационализация и локализация создаваемых приложений внутренними средствами Delphi 2009

(ОС : Windows Vista Home Basic SP2 )
(CP : Code Gear Delphi 2009 Architect)

Локализация приложений средствами DelphiПеред нами стоит задача : Создать простейшее приложение с 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