Заметки по локализации программ на Delphi

- Чем отличается программист от шамана?

- Практически ничем: оба произносят непонятные слова, совершают непонятные действия, а потом не могут объяснить, как это работает.

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

Уже тогда, прочитав в "Кулибе" Валентина Озерова статью о локализации программ с помощью динамически подключаемых библиотек ресурсов, была сделана удачная попытка перевода программы на родную беларускую мову с помощью Resource DLL Wizard. Окрыленный успехом, не долго думая, поместил в пакет инсталляции файл localization.txt с перечислением всех надписей в программе, в надежде на добрую душу добровольца, желающего иметь интерфейс программы на родном языке.

Много воды утекло с того времени, и вот, в один прекрасный момент, такой доброволец нашелся и прислал перевод интерфейса на испанский язык. Как часто получается при программировании в Delphi, "меньше думай, больше делай" - гораздо быстрее склепать предварительную версию, немного с ней поработать, потешить свою душу ощущением собственной крутости, а потом переписать заново так, чтобы к старости не было обидно за бесцельно прожитые годы. В соответствии с этим принципом был запущен Resource DLL Wizard, определена локализация как 'Испанский (международная сортировка)', в полученном проекте все надписи были изменены, отрегулированы размеры элементов под длину надписей, все это скомпилировано. На выходе получился файл SDATimer.ESN, который и был помещен в рабочий каталог программы. В 'Панели Управления' (вкладка 'Язык и региональные стандарты') были установлены настройки локали на 'Испанский (Испания)', программа перезапущена, и, удивительно, все, вроде бы, заработало - все надписи поменялись, интерфейс стал подозрительно испанским и функциональность программы полностью сохранилась.

На радостях SDATimer.ESN отправлен на окончательное тестирование, и тут, как всегда, подкралась незаметная мысль: "А что, если бы...?". Сразу же обнаружился небольшой облом: при изменении настройки локали на любую, отличную от 'Испанский (Испания)', например, на 'Испанский (Гондурас)', интерфейс программы менялся с подозрительно испанского на другой, очень похожий на исходный английский (что на самом деле и было). В попытках понять, что произошло и почему не поддерживается гондурасский, был перелопачен Delphi Help, Windows SDK Help, Delphi World 6. Несколько раз проект перекомпилировался под разные локали, но поддержка "единого и могучего" испанского языка не получалась. В конце концов вспомнилась та древняя мудрость, почерпнутая в "Кулибе", - загрузка файла локализации происходит согласно расширению файла динамически подключаемой библиотеки ресурсов. Тогда, собрав остатки интеллекта, еще не полностью угробленного учебой и работой, все быстро соотнеслось со словами в Delphi Help о том, что первые две буквы расширения файла ресурсов отвечают за базовый язык, а третья - за конкретную локализацию для данного языка. Исходный многострадальный файл SDATimer.ESN был переименован в SDATimer.ES, и, как ни странно, интерфейс стал испанским при использовании любой испанской локали.

В качестве лирического отступления хочу отметить преимущество метода использования динамически подключаемых библиотек ресурсов для локализации программ:

  • При данном методе локализации исчезает проблема несоответствия размеров элементов интерфейса длине подписей - можно регулировать не только размеры, но и расположение как самой формы, так и элементов интерфейса формы без потери функциональности и перекомпилирования основной программы.
  • Данный метод является стандартным методом локализации в Delphi и, согласно Windows SDK Help, Windows. В комплекте Delphi есть Translation Manager для облегчения перевода строк ресурсов имеется возможность создавать репозитории строк для перевода, в настройках проекта при отладке легко установить текущий язык для тестирования.
  • При загрузке программы локализация включается автоматически, при обнаружении соответствующих языковых настроек системы, что позволяет избежать несоответствия шрифтов, установленных в системе, языку интерфейса ("кракозябры" в надписях популярности не добавляют).

Так как "бесплатный сыр бывает в мышеловке или в мышке ловкой", то и при применении динамически подключаемых библиотек ресурсов приходится решать проблему большого размера библиотек локализации. Одним из выходов является использование инсталляторов с поддержкой архивации, причем при архивации размер библиотеки уменьшается в несколько раз (в случае с SDATimer размер файла инсталляции вырос на 50 Kb, при размере SDATimer.ES в 179 Kb).

Хотелось бы закончить данные заметки хэппи-эндом, но в результате поисков найдены исходники Demo RichEdit, поставляемые с Delphi, в них те же самые динамические библиотеки ресурсов подключаются принудительно из меню самой программы. Так что хэппи-энд будет, но уже не в рамках этой статьи.

Как иллюстрацию метода можно скачать SDATimer 1.75 здесь: www.sdisle.com/sdatimer/sdatimersetup.exe

Дмитрий СПИЦЫН,
[email protected],
www.sdisle.com/rus/index.html

Версия для печатиВерсия для печати

Номер: 

24 за 2006 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!