Интернационализация и локализация прикладного программного обеспечения в Delphi, C++ Builder и Kylix — TsiLang Components Suite


Ранее, на примере Korzh Localizer, мы уже рассматривали интернационализацию (чаще употребляется форма написания i18n, где 18 - это число букв между 'i' and 'n' в английском варианте слова "internationalization") перевод и локализацию, осуществляемую разработчиками непосредственно на этапе создания программного продукта. В тоже время, вполне очевидно, что Korzh Localizer является не единственным решением в данном сегменте.


Для разработчиков, использующих такие IDE, как Borland (CodeGear) Delphi, C++Builder или Kylix (средство разработки приложений для платформы Linux на языках Delphi и C/C++), ещё одним вариантом решения проблемы i18n и локализации является TsiLang Components Suite — мощный и, одновременно, удобный программный продукт для разработки приложений DELPHI и C++ с мультиязычным интерфейсом.

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

Общая характеристика пакета TsiLang как инструмента i18n, перевода и локализации программных продуктов в среде Borland (CodeGear) Delphi, C++Builder и Kylix.


У читателя могут возникнуть вполне понятные вопросы: что представляет собой TsiLang, и каким образом он взаимодействует с интегрированной средой разработки (ИСР). Если просто перевести название рассматриваемого продукта (TsiLang Components Suite) на русский язык, то становится понятно, что TsiLang — это набор компонент. Как известно, логика программ, разрабатываемых в среде Borland (CodeGear) Delphi, C++Builder или Kylix, строится на использовании компонент: каждая компонента имеет ряд свойств, которые обеспечивают внутреннее и внешнее (с ОС или другими приложениями) взаимодействие приложения (это лишь грубое обобщение, — реальная схема, естественно, намного сложнее, но принципы объектно-ориентированного программирования не являются темой данного обзора.)

После установки пакета TsiLang, новые компоненты интегрируются в среду, выносятся в палитре компонент IDE на отдельную вкладку (SiComponents), после чего становятся доступны для использования. С технической точки зрения, к базовому набору библиотек IDE добавляются новые, содержащие описание родительского класса — TsiCustomLang, и его классов-потомков — TsiLang, TsiLangRT, TsiLangRTSE, TsiLangLinked, TsiLangTLV, которые и обеспечивают взаимодействие со «строковыми» свойствами остальных компонент. Именно набор из указанных компонент обычно подразумевается под названием TsiLang.

В общем виде, принцип работы TsiLang достаточно прост. На главную форму помещается специальная компонента под названием TsiLangDispatcher, предназначенная для централизованного управления компонентами TsiLang на дочерних формах. В свою очередь, все остальные компоненты TsiLang, имеют свойство LangDispatcher, через которое они связываются с диспетчером. Свойство LangNames компонента TsiLang содержит список поддерживаемых языков, а ActiveLanguage — содержит значение индекса текущего языка: для переключения с одного языка на другой достаточно, присвоить ActiveLanguage соответствующий индекс.

При изменении активного языка в диспетчере происходит автоматическое переключение языка интерфейса и всех форм приложения, связанных с диспетчером: другими словами, TsiLangDispatcher - программа для автоматического переключения языка на всех формах приложения.


Пакет TsiLang: Иерархия компонентов


Пакет TsiLang: Привязка компонентов TsiLang к TsiLangDispatcher

Механизм TsiLang позволяет иметь неограниченное количество языков приложения, причём существует возможность хранить информацию о переводах как в исполняемом файле (переводы сохраняются как свойства компонент TsiLang), так и отдельно от разрабатываемого приложения (компоненты TsiLang имеют соответствующие методы для работы с внешними данными). Интересно, что для тестирования интерфейсов программ под другим языком нет необходимости запускать приложение — TsiLang позволяет изменять язык в режиме проектирования (design-time).

С помощью TsiLang Components Suite можно переводить всё, что может быть переведено: строковые свойства компонент, строки в исходном коде, ресурсные строки, системные региональные форматы; существует возможность изменять визуальные и невизуальные характеристики компонент (например, размеры и расположение меток или кнопок может меняться в зависимости от языка). Заметим, что в набор компонент TsiLang входят стандартные диалоги («File», «Open/Save», «Print», «Find/Replace» и др.), «заточенные» под многоязыковую поддержку. Они предоставляют пользователю возможность отображать текстовую информацию в диалоговых окнах на языке приложения, т.е. независимо от языка Windows. Отдельно отметим полную поддержку набором TsiLang возможности создания IntraWeb-приложений.

Использование TsiLang для i18n, перевода и локализации программных продуктов. Примеры создания мультиязычных приложений в среде DELPHI.


После того, как TsiLang установлен, можно приступать к работе (заметим, что в процессе установки нет ничего необычного, хотя и существуют небольшие отличия при установке платной/бесплатной, VCL/CLX версий). Для начала рассмотрим вариант, когда необходимо перевести уже готовое приложение.

Пример 1.
Открываем проект, который необходимо перевести, и из меню Tools главного меню IDE вызываем TsiLang Expert — утилиту, которая входит в состав TsiLang Components Suite и устанавливается вместе с набором.

После запуска TsiLang Expert в главном окне отобразятся все формы активного проекта, а в таблице будет указан их статус: если форма не содержит компонентов TsiLang, то их можно добавить с помощью меню File | Translate. Через меню File | Language можно установить поддержку языков для каждой формы.

Кроме того, существует возможность обновить (File | Update Translations) или удалить (File | Clear Translations) имеющиеся переводы.

Следующим шагом является запуск Мастера переводов (Translation Wizard): в главном окне TsiLang Expert выбираем формы проекта, которые необходимо перевести, и запускаем мастер через меню File | Wizard.

На первом этапе работы Мастера переводов необходимо указать тип компонент, которые будут помещены на формы. Можно воспользоваться подсказкой и установить рекомендованную схему, нажав на выделенную ссылку.

На втором этапе для выбранных форм определяются языковые настройки. Для этого можно автоматически поместить TsiLangDispatcher на одну из форм проекта (обычно, диспетчер помещают на главную форму), с тем, чтобы текущий язык устанавливался в зависимости от значения соответствующего свойства диспетчера, или определять язык вручную, для каждой отдельно взятой формы.

Естественно, рекомендуемый способ заключается в использовании TsiLangDispatcher, поскольку это существенно упрощает переключение языков. По завершении работы Мастера переводов выделяем формы в главном окне TsiLang Expert и двойным щелчком открываем Редактор переводов (Translation Editor).

Основными функциями Редактора переводов являются (и это понятно из названия) добавление и изменение переводов для строковых ресурсов, причём, как напрямую, так и с подключением дополнительных утилит — например, Менеджера словарей. Кроме того, в редакторе предусмотрена возможность работы не только с формами проекта, но и с внешними .sil/.sib-файлами (несколько подробнее о них будет рассказано ниже). Главное окно Редактора переводов разделено две части.

В правой части отображается список свойств (строка, название окна, подсказка и т.п.); в левой части находится агрегированная таблица всех доступных для перевода значений данного свойства. Если какое-либо значение не должно переводиться — соответствующая ячейка (перевод) не заполняется. Для того, чтобы переводы отображались, необходимо предусмотреть переключение языков в приложении, например, через нажатие на специальные «языковые» кнопки. Для Delphi это будет выглядеть примерно так:

procedure TForm1.MenuItemEnglishClick(Sender: TObject);
begin
    siLangDispacther1ActiveLanguage:= 1;
end;
procedure TForm1.MenuItemGermanClick(Sender: TObject);
begin
    siLangDispacther1.ActiveLanguage:= 2;
end;

Очень часто в приложениях существует возможность переключения языка интерфейса «на лету», т.е. во время работы приложения. Следующий пример демонстрирует, каким образом данную опцию можно реализовать при помощи TsiLang Components Suite.

Пример 2.
В проекте используется один диспетчер TsiLangDispatcher, один TsiLang и TsiLangLinked на остальных формах. Помещаем TsiLang и TsiLangDispatcher на главный модуль проекта.
После внесения переводов (см. предыдущий пример) экспортируем их во внешний файл с помощью функции File | Save/Load Translations | Save Project из меню TsiLang Expert.

Очевидно, что построение многоязычных приложений без включения переводов в исполняемый файл является более эффективным — это позволяет уменьшить размер .exe-файла приложения и отделить файл переводов от программы, с тем, чтобы в дальнейшем была возможность корректировать и дополнять переводы.

С помощью TsiLang Expert переводы можно сохранить во внешнем .sil (текстовый) или .sib (бинарный) файле, причём рекомендуется использовать именно второй, т.к. работа с бинарными файлами гораздо быстрее.

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

  • задаём имя файла в свойстве FileName для TsiLangDispatcher (автоматический режим);
  • или
  • указываем в коде местонахождение файла с переводами (ручном режим).
  • В первом случае, диспетчер будет самостоятельно проверять наличие файла, указанного в свойстве FileName, и автоматически загружать внешние файлы перевода во время выполнения. Для второго варианта можно использовать следующий код:


procedure TMastData.DataModuleCreate(Sender: TObject);
var
sOurSibFile: string;
begin
// вычисление названия файла
sOurSibFile:=ExtractFilePath(Application.ExeName) + 'NameOfYourFile.sib';
// проверяем, существует ли такой файл
if FileExists(sOurSibFile) then
begin
// выставляем значение свойства, что позволит автоматически загружать формы, созданные позднее
siLangDispatcher1.FileName:=sOurSibFile;
// загружаем переводы в уже созданные формы
siLangDispatcher1.LoadAllFromFile(sOurSibFile);
end;
end;

Для динамического отображения доступных языков необходимо добавить новый пункт в меню приложения и прописать код, отвечающий за переключение языков.
Приведённый ниже фрагмент можно добавить, например, в код события OnShow для главной формы проекта, при этом код обновления и отображения языков должен выполняться после загрузки файла переводов.

// изменение языка при выборе пункта меню
procedure TMainForm.LanguageMenuItemClick(Sender: TObject);
begin
MastData.siLangDispatcher1.ActiveLanguage:=TMenuItem(Sender).Tag;
TMenuItem(Sender).Checked:=True;
end;
procedure TMainForm.FormShow(Sender: TObject);
var
MenuItem: TMenuItem;
I: Integer;
begin
for I:=1 to MastData.siLangDispatcher1.NumOfLanguages do
begin
MenuItem:=TMenuItem.Create(Self);
// устанавливаем заголовок
MenuItem.Caption:=MastData.siLangDispatcher1.LangNames[I - 1];
// устанавливаем тэг для удобства переключения языков
MenuItem.Tag:=I;
MenuItem.RadioItem:=True;
// отображаем текущий выбор языка
MenuItem.Checked:=I=MastData.siLangDispatcher1.ActiveLanguage;
// устанавливаем обработчик выбора языка
MenuItem.OnClick:=LanguageMenuItemClick;
// добавляем пункт меню
Language1.Add(MenuItem);
end;
end;
Естественно, что приведённые выше примеры носят ознакомительный характер. Для более детального изучения основных возможностей TsiLang Components Suite советуем ознакомиться с официальным руководством пользователя (на английском языке), которое кроме общей характеристики содержит детальную техническую информацию (пояснения к свойствам компонентов TsiLang, описание функциональных возможностей дополнительных утилит), примеры выполнения некоторых шаблонных заданий и ответы на часто задаваемые вопросы.

Дополнительные инструменты i18n, перевода и локализации в средах Borland (CodeGear) Delphi, C++Builder и Kylix при создании мультиязычных интерфейсов.


Рассмотрение функциональных возможностей набора TsiLang будет неполным, если не сказать несколько слов о дополнительных инструментах данного пакета, которые так или иначе придётся использовать в процессе разработки многоязыкового приложения. Менеджер словарей (Dictionary Manager) является мощным инструментом, который существенно ускоряет процесс перевода и локализации.

Менеджер словарей непосредственно связан с Редактором переводов через COM-интерфейс, и таким образом, пользователь может легко импортировать/экспортировать необходимые переводы. Идея Менеджера словарей предельно проста — накопление переводов из различных проектов для их последующего использования.

Другими словами, Менеджер словарей является ещё одной программой, реализующей концепцию памяти переводов. SIL-редактор (SIL Editor) — удобный инструмент для редактирования текстовых и бинарных файлов с расширением .sil и .sib, соответственно. В первую очередь, данная утилита предназначена для переводчиков, которые могут осуществлять непосредственный перевод соответствующих файлов, не используя в качестве «посредника» ИСР. SIL-редактор поддерживает работу (импорт/экспорт) со всеми наиболее распространенными форматами: .html, .htm, .csv, .doc, .xls.

Кроме того, в SIL-редакторе существует Мастер слияния (Merge Wizard), с помощью которого можно объединять (комбинировать) переводы из нескольких .sil/.sib-файлов. Заметим также, что ориентированные на переводчиков SIL Editor и Dictionary Manager распространяются бесплатно — их можно получить на странице загрузки проекта TsiLang.

 Мастер строковых ресурсов (Resource Strings Wizard) позволяет выбрать ресурсные строки, используемыми сторонними компонентами или самим Delphi, и добавить их в список переводов, даже если они используются в модулях (.dcu или .obj).

Мастер найдет все строки, которые используются в исходном коде программы, а также в секциях Const и ResourceString, автоматически добавит их и «подстроит» код для перевода «на лету». Если вы хотите, чтобы ресурсные строки отображались на языке вашего приложения, необходимо установить свойство HandleResourceStrings компонента TsiLang в положение «True», а ResourceLanguageIndex на значение, которое соответствует индексу языка в свойстве LangNames.

Авторитет и удобство программного продукта TsiLang в процессе i18n, перевода и локализации игр и программного обеспечения на DELPHI и С++. Оценка перспектив развития проекта.


На официальной странице проекта можно увидеть информацию о наградах TsiLang, а также узнать, что данную разработку компании SiComponents успешно используют такие известные организации, как Sony, Siemens, Bayer, Bourse de Paris (Парижская фондовая биржа), а также многие независимые разработчики со всего мира (последний факт, подтверждается комментариями и отзывами).

Чтобы составить собственное мнение о TsiLang, постараемся объективно оценить его достоинства и недостатки. С одной стороны, TsiLang Components Suite действительно предлагает неплохой инструмент для i18n приложений: пакет оставляет впечатления качественного продукта, работать с TsiLang Components Suite не сложнее чем с другими компонентами ИСР, а достаточно детальное руководство пользователя предоставляет всю необходимую техническую информацию.

С другой стороны, сразу обращает на себя внимание ограниченная сфера применения — фактически, существует решение только для двух Windows-ориентированных IDE. Это, в свою очередь, является немаловажным минусом, так как в последнее время, если говорить о мировых тенденциях, стремительно растёт популярность Microsoft Visual Studio — всё больше разработчиков при создании крупных проектов ориентируются именно на эту ИСР.

Таким образом, основной рынок сбыта TsiLang Components Suite переносится в постсоветские страны, где позиции «борландовских» ИСР (в особенности, Borland Delphi) по-прежнему сильны. Например, TsiLang может оказаться востребован работниками отечественных научно-исследовательских институтов, которым требуется i18n собственных программных продуктов (для демонстрации на международных конференциях и выставках), но, которые, в силу своей консервативности или отсутствия финансовых возможностей, до сих пор используют устаревшее ПО, в том числе, и ИСР, т.е. русская локализация.

Кроме того, есть некоторые опасения относительно перспектив проекта TsiLang. На момент написания статьи актуальной версией TsiLang является версия 6.5, основная особенность которой — поддержка CodeGear RAD Studio 2009. В самом же RAD Studio (его разработкой сейчас занимается Embarcadero Technologies) наметился некоторый прогресс в развитии механизма создания многоязычных приложений — в последней версии реализована полная поддержка Unicode, т.е. приложения, разработанные с помощью CodeGear RAD Studio 2009, могут функционировать во всех языковых версиях Windows и поддерживают как Unicode-строки, так и ANSI-строки.

Таким образом, со временем, если усовершенствование RAD Studio будет продолжаться теми же темпами, недешёвое дополнение (стоимость лицензионной версии набора, в зависимости от комплектации, составляет $259 или $399) в виде TsiLang Components Suite может оказаться попросту неактуальным.

Комментариев нет:

Отправить комментарий