Сайт об электромобилях

SDIsle.com - электромобили и их компоненты

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

SDATimer SDATimer SDCalc SDHormons SDSSL Smart HTML Editor SDAssistant Послать E-mail автору Поиск

[Другие статьи автора] [Субъективный взгляд на электромобиль]

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

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

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

Resource DLL Wizard Delphi

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

Настройка текущего языка программы для режима отладки в Delphi

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

Translation Manager в Delphi

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

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

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

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

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

К началу статьи...

Copyright © Дмитрий Спицын, 2006

[Другие статьи автора] [Субъективный взгляд на электромобиль]

 
Copyright © Dmitry Spitsyn, 2003-2017.
Яндекс.Метрика