psilogic: (Default)
Мой локализатор стал еще более монстроидальным :)

"Родил" новую версию 2.0.

В ней нового:
- поддержка проектов Visual Studio 2003-2010
- поддержка сложных сборок с исходниками, разбросанными по разным папкам, не обязательно сборка "студией"
- поддержка Unicode-локализаций
- поддержка Qt-локализаций
- поддержка загрузки локализации из ресурсов
- папка с готовыми примерами
- перевод хэлпов на английский

Итого теперь есть 4 варианта локализации: ANSI (UTF8), Unicode, Qt, .rc/.rh файлы. В исходниках локализованные строки выглядят как переменные типа extern const char*, extern const wchar_t*, extern QString.
psilogic: (Default)
Обновил версию своего локализатора на сайте. В данной версии пофиксен 1 баг и добавлена возможность хранить локализации в ресурсах exe-файла.
psilogic: (Default)
(программистское)

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

Если вдруг кто-то рискнул попользоваться моим локализатором, то сегодня сделал новую версию - 1.3.3. Изменения косметические и один багфикс (интересно, сколько багинжектов). Вроде бы полгода использования тулзы на довольно большом проекте выявили только один этот баг. В общем, юзать можно спокойно :)
psilogic: (Default)
(только для программистов)

Готова версия 1.3 "Локализатора". По количеству глюкобагов программа доведена до состояния "больше не могу найти сам". По функциональности - до состояния "есть все, о чем мечтал". Сам очень доволен, так как получилось во многом лучше, чем популярный gettext.

Release notes:
- Добавлено множество опций, управляющих процессом локализации.
- Формат файла локализации улучшен - добавлены комментарии и строки в стиле C (с символом "\").
- Теперь программы с этим локализатором могут корректно работать даже при отсутствии файла с локализацией. Допускается "вшивание" одной локализации прямо в исполняемый файл.
- Неиспользуемые строки в локализации теперь не удаляются, а помечаются комментарием, чтобы потом их удалить (вручную или автоматически).

По-видимому, это последнее серьезное обновление и последний пост на эту тему. Дальше буду только исправлять баги. Самую свежую версию всегда можно будет взять на сайте.
psilogic: (ioda)
(интересно только программистам)

Вот, встала тут такая задачка. В очередной раз, не знаю, уже, в какой. Дан проект средних размеров - 200 с лишним cpp-шников. В нем - куча строковых литералов (не Unicode) на английском. Требуется сделать по крайней мере двуязычие (rus+eng).

Задачку я уже решил, но так получилось, что "на выходе" образовались кое-какие полезные идеи, которыми хочу поделиться. Вдруг кому-нибудь пригодится.

Upd:
Все плюшки здесь
Read more... )
Page generated Jul. 25th, 2017 04:49 pm
Powered by Dreamwidth Studios