Вступление

Тем более что идеология быстрой заменяемости строковых ресурсов в проекте (следовательно, и в готовой программе) была давно и безвозвратно нарушена по причине наличия массы более важных и безотлагательных задач — пусть это будет моя личная версия истории проблемы.

Актуальность вопроса локализации современных программных приложений сегодня уже можно поставить под сомнение, так как в современные мощные средства разработки и программные платформы, как правило, изначально заложены достаточные для некоторых типовых задач возможности локализации разрабатываемых современных решений. И это справедливо не только для Windows. В то же время перед разработчиками, как и десять лет назад, встает все та же задача по обеспечению интернационализации (или локализации) давно написанного ПО. А в случае, если создавалось оно сторонними программистами и всякие контакты с ними навсегда потеряны, сюда иногда добавляется еще и пикантная проблема отсутствия исходного текста, т.е. самого проекта. В этом случае весьма нелишним будет знать те инструменты, которые существуют для решения подобных задач.

Определение

Чтобы понять важность этапа проектирования самого решения с точки зрения последующей его адаптации для конкретного региона, можно дословно привести цитату из Википедии (http://ru.wikipedia.org): «Есть важное различие между интернационализацией и локализацией. Интернационализация — это адаптация продукта для потенциального использования практически в любом месте, в то время как локализация — это добавление специальных функций для использования в некотором определенном регионе».

Отсюда для опытного разработчика напрашивается вывод: чем точнее он учтет и реализует функциональность, связанную с интернационализацией его программного продукта, тем больше шансов свести к минимуму последующие усилия по его локализации.

Круг проблем

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

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

О главном

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

Delphi: мастер добавления языков
В данную статью не вошли задачи, связанные с платформой MS.NET и проектами, основанными на VLC.NET. Также не рассматриваются вопросы локализации проектов на Borland Kylix.

Мы рассмотрим только средства для локализации проектов в среде Delphi для Win32. Кстати, стоит заметить, что в этой IDE уже реализован один из способов локализации приложения.

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

Методы решений

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

Возможные сравнительные характеристики сторонних продуктов

При выборе рассматриваемых решений мы руководствовались прежде всего такими критериями, как совместимость с Delphi 2006 (Win32), внятное указание на тип лицензии, наличие в пакете готовых примеров по локализации проектов. Наличие исходных текстов и возможность работы непосредственно с готовыми exe-модулями можно в общем случае считать дополнительными, но не обязательными характеристиками.

Во главу угла ставится удобство процесса локализации, ибо такие возможности, как динамическая смена языка, на поверку оказываются менее важны, чем, например, функциональное разграничение этапов подготовки локализации. Не будем забывать: программист зарабатывает на хлеб в основном все-таки не тем, что владеет иностранными языками... И ярче всего это проявляется, когда речь идет о переводе на экзотические языки.

Бесплатные решения

«ДеЛок»

http://deloc.narod.ru

Программный пакет «ДеЛок» («Дельфийный локализатор» — так расшифровывают название сами разработчики продукта) распространяется свободно, т.е. его можно использовать в любых проектах, включая условно бесплатные (shareware) и коммерческие.

«ДеЛок»: главное окно
Версия 1.11 предназначена для работы со средой Delphi версий 6 и 7. С помощью этой утилиты локализируются строки, объявленные в секции resourcestring, а также строковые свойства форм и компонентов. Для локализации написанного на Delphi приложения нужно с помощью программы «ДеЛок» создать файл локализации, в котором будут содержаться переведенные на нужный язык ресурсные строки и свойства форм и компонентов.

Далее надо включить в проект локализуемого приложения файл LcUnit.pas, который входит в пакет вместе с «локализатором».

«ДеЛок»: выбор языка перевода
После загрузки приложения следует вызвать функцию LoadLcf(), где в качестве параметров указать требуемый язык и имя файла локализации. Вызов функции можно поместить в исходнике проекта сразу после слова begin или в каком-либо модуле проекта в секции initialization.

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

В пакет входит файл русской справки и успешно запускаемый под Delphi 2006 демопроект, показывающий возможность переключения «на лету» русского и английского языков для основных элементов управления. Более подробно о работе модуля LcUnit.pas можно узнать из справочного файла или из файла readme_ru.txt.

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

Коммерческие пакеты

Helicon Translator

На сайте http://www.helicon.co.at/translator/ имеется 30-дневная ознакомительная версия Helicon Translator.

Важная особенность пакета заключается в том, что он позволяет работать как с файлом проекта, так и с бинарными модулями .exe, .bpl и .dll.

Helicon Translator: начало работы
Однако для работы с бинарными файлами программе все же необходим map-файл.

Helicon Translator требует map-файл для работы с бинарными файлами

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

Helicon Translator: уточнение версии Delphi во время локализации
Кроме ограничения по времени ознакомительная версия отмечает свою работу в заголовке окна программы.
Helicon Translator: уведомление о версии в заголовке окна программы
В состав пакета входят немецкий, английский, испанский и французский справочники, которые могут вам понадобиться для локализации текстовых ресурсов. Кроме того, с сайта можно загрузить дополнительные переводчики для норвежского, немецкого, итальянского, испанского, загадочного «африканского» и шведского языков. Предусмотрены типичные для таких приложений два режима работы по локализации — ручной и автоматический. Для автоматического перевода, как уже можно догадаться, необходим подходящий справочник. В целом программу можно читать современной типовой утилитой, вполне пригодной для разовых локализаций.
Рабочее окно Helicon Translator

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

Advanced Localizer

Весьма серьезная фирма — разработчик ПО EMS, славящаяся своими мощными, универсализированными средствами администрирования для различных СУБД, предлагает набор компонентов для локализации под названием EMS Advansed Localizer Component Suite 1.51 (http://sqlmanager.net/products/tools/quicklocalizer).

Продукт поддерживает все версии Delphi с 5-й до Delphi 2006.

Advanced Localizer: локализация проекта в Delphi 2006
За эти компоненты разработчики просят 95 долл. Пакет позволяет создавать альтернативные наборы текстовых ресурсов с удобной (но не всегда нужной) возможностью переключения языков во время работы программы.

Готовые наборы строк, соответствующие одному конкретному языку, хранятся отдельно в виде INI-файла. Однако при всем удобстве решения в процессе работы со встроенными редакторами этих замечательных компонентов в режиме дизайна неоднократно выдавались сообщения с загадочными программными исключениями и дважды «сваливалась» сама среда Delphi. С пакетом поставляется help-файл и три демопроекта, из которых, в частности, можно понять, что данные с языковыми переводами можно держать не только в виде обычного текстового файла, но и в базе данных.

TsiLang

TsiLang.: менеджер словарей
Пакет TsiLang (http://www.tsilang.ru) с уверенностью можно назвать самым продвинутым решением среди рассматриваемых в данной статье профессиональных коммерческих пакетов для локализации. Упор здесь делается именно на интернационализацию проектов. Разработчики декларируют поддержку неограниченного числа языков и переключение этих языков «на лету». В пакет входит набор компонентов для разных версий Delphi, Kylix и C++ Builder, включая Delphi 2006. При этом для Delphi и C++ Builder предусмотрена автоматическая инсталляция компонентов. Отдельно устанавливается менеджер словарей и редактор файлов трансляции. В пакет входит внушительный раздел демопроектов и детальное руководство разработчика. На сайте разработчика можно найти хорошую статью на русском языке «Создание многоязычных приложений, переводимых пользователями», поясняющую особенности использования TsiLang Components Suite. Данное решение предполагает два возможных формата хранения внешних файлов с переводами: SIB-файлы — «бинарники», гарантирующие высокую скорость чтения, и SIL-файлы — тестовые файлы (фактически INI-файлы), которые могут быть отредактированы в любое время любым текстовым редактором.
TsiLang: редактор
Редактор таких текстовых файлов — программа SIL Editor выделена в отдельный продукт и может быть свободно загружена с сайта разработчика (листинг 1).

Как сказано в статье, «пользователи смогут переводить ваше приложение без вашего участия и перекомпиляции».

С другой стороны, TsiLang позволяет строить многоязычные приложения и без использования дополнительных файлов. В этом случае вся информация будет храниться в исполняемом модуле.

Теперь по поводу поддержки Delphi 2007. В апреле 2007 г., когда писалась эта статья, на сайте разработчиков можно было прочитать следующее (перевод с англ. автора): «Мы много работаем над завершением версии 6.1 и ее инсталлятора, которые будут поддерживаться в Delphi 2007. В данный момент на нашем сайте доступна новейшая версия, уже поддерживаемая в Delphi 2007. Для ее применения необходимо во время инсталляции использовать опции Turbo Delphi и вручную установить TsiLang в IDE».

Фрагмент внутреннего представления компонента класса siLang из демопроекта RicheditDemo представлен в листинге 2.

В этом проекте используется внешний SIL-файл. Интересно, что почти так же этот компонент выглядит и в проекте, где внешний файл вообще не используется.
TsiLang: проект без использования внешних файлов
То есть значение параметра TranslationData в обоих случаях примерно одинаково. Разница лишь в том, что при использовании внешнего файла таблица встроенного редактора Translation Editor в режиме дизайна заполнена только в части основного языка, а для последующих переключений в режиме запуска служит компонент siLangDispatcher, у которого имеется свойство FileName. Таким образом, достигается гибкий и достаточно универсальный подход к глобализации/локализации программы.

Когда в бассейне нет воды, или Про бойцов из стройбата

Задача немного усложняется, если у вас нет ни исходных текстов, ни магического map-файла программы, но вам во что бы то ни стало надо заменить какие-то строковые ресурсы графического интерфейса программы. Как раз в таких случаях можно попробовать воспользоваться поистине замечательной программой Restorator.

Программа позиционируется как утилита для редактирования ресурсов и пользовательского интерфейса. Сейчас с сайта разработчика (http://www.bome.com/Restorator/) можно загрузить новую ознакомительную версию Restorator 2007. Конечно, использование таких вариантов локализации, мягко говоря, не стандартно, но не стоит радоваться заранее, так как этот прием годится далеко не в каждом случае... В программе есть режим просмотра и режим редактирования ресурсов, есть возможность быстрого поиска строки. Во время редактирования автоматически создаются резервные копии версии редактируемой программы. Вот так выглядит окошко знаменитой на весь дельфийский мир программы richedit.exe после прохождения через Restorator:

Restorator 2007: результат работы над программой RichEdit.exe
В заключение хочется отметить, что в этой статье намеренно ни разу не упоминалось о системных языковых настройках и кодировках, так как это смежная, но все же отдельная тема для обсуждения.