psilogic: (Default)
[personal profile] psilogic
(программистское)

Мне казалось, что я уже лет пять пользуюсь своим локализатором, но оказалось - только полтора года. За это время был обнаружен только один небольшой баг при том, что пользовался им почти ежедневно для написания своего двуязычного (рус/eng) проекта-долгостроя "bard". Так что можно сказать, что это уже не бета, а надежный релиз.

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

Действие локализатора похоже на gettext: он просматривает исходники, заменяя помеченные программистом "английские" строки на локализованные, выносит эти строки в отдельные файлы, где их можно спокойно переводить.

Однако, по сравнению с gettext каждое обращение к локализованной строке не требует вызова функции и поиска перевода по строковому ключу. Каждая локализованная строка - это просто переменная const char *, которую можно использовать 'as is'.

Вот так это выглядит в gettext:
printf(gettext("My name is %s.\n"), my_name); 

-- программист отметил строку, подлежащую локализации как вызов функции gettext().
или так:
printf(_("My name is %s.\n"), my_name);

-- программист отметил строку, подлежащую локализации как вызов функции _().

А так это выглядит в localizer перед обработкой:
printf(LC"My name is %s.\n", my_name);

-- программист отметил строку, подлежащую локализации, префиксом LC.
а так получается после:
printf(LC__My_name_is_s, my_name);

-- строка заменилась на переменную const char *LC__My_name_is_s.

Да, localizer имеет наглость править исходники - и это меня самого слегка напрягало. :) Но, как я сказал, за полтора года - никаких "эксцессов", все надежно.

Так что осторожничать я перестал, и с этой недели начал юзать в крупном проекте на работе - полет нормальный, как и ожидалось. Причем, если в прежнем проекте русские строки хранились в Win-1251, то теперь - в UTF-8. Локализатору оно все равно, для него и так, и эдак получается (const char*). Но UTF-8 с полпинка преобразуется в Unicode, так что там и QT можно поюзать, если понадобится.

Что касается стандартной локализации через файл ресурсов rc/res в Windows, то там недостаток состоит еще и в том, что есть один огромный .rh-файл, где фигурируют идентификаторы всех строк. И этот .rh включается почти во все файлы. Добавление одной строки вызывает перекомпиляцию всех файлов, куда включен этот .rh. У localizer-а такой проблемы нет - он все используемые в данном файле идентификаторы строк автоматически объявляет в начале файла (после всех #include) как extern const char * (ага, и тут модификация исходников, да) - т.е. никакого глобального .h или .rh не надо.
Page generated Aug. 27th, 2025 09:29 am
Powered by Dreamwidth Studios