(программистское)
Мне казалось, что я уже лет пять пользуюсь
своим локализатором, но оказалось - только полтора года. За это время был обнаружен только один небольшой баг при том, что пользовался им почти ежедневно для написания своего двуязычного (рус/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 не надо.