DIG.BY

Дмитрий Спицын - соматика, массаж, социальные танцы, электромобили, программирование

Заметки по локализации программ на 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, размер файла инсталляции вырос на 50Kb, при размере SDATimer.ES в 179Kb).
Хотелось бы закончить данные заметки хэппи-эндом, но в результате поисков найдены исходники Demo RichEdit, поставляемые с Delphi, в них те же самые динамические библиотеки ресурсов подключаются принудительно из меню самой программы. Так что хэппи-энд будет, но уже не в рамках этой статьи.
Как иллюстрацию метода можно скачать SDATimer 1.82 здесь: http://sdisle.com/sdatimer/sdatimersetup.exe

Голосов пока нет

Когда хастл танцуется с удовольствием,
не бывает ошибок – только новые движения!
© КСТ DIG

Copyright © Dmitry Spitsyn, 2008-2013