The Russian Electronic Developer Magazine | |
Русский электронный журнал разработчика | |
В данной статье приведен обзор применения GNU Gettext для локализации emx runtime.
В рамках проекта по переводу emx была произведена локализация утилит и библиотек emx runtime. В качестве инструмента для локализации был принят пакет GNU Gettext.
Пакет GNU Gettext принят Free Software Foundation как основной инструмент для локализации и обладает одним неоспоримым преимуществом: локализация уже написанных программ сводиться к замене конструкций вида printf("lalala") на printf(gettext("lalala") и вставке двух-трех инструкций при иницаилизации программы или библиотеки.
Локализация emx.dll и пр. привела к проблеме невозможности использования готового пакета GNU Gettext, так как он сам использует данные библиотеки. Поэтому была произаедена перекомпиляция пакета без использования emx runtime (имеется ввиду, что emx.dll, emxio.dll и прочее больше пакету не требовались). Это достиглось исправлением Makefile.os2 и заменой опции -Zcrtdll на -Zso, -Zsys и -Zomf для динамических библиотек, а на -Zsys и -Zomf для исполняемых файлов. Здесь следует напомнить, что нужно предварительно сделать omf файлы. Как это сделать описано в документации по gcc+emx, а также в егойном ЧАВО.
Для программ. локализованных с помощью GNU Gettext применяется два типа переменных окружения указывающих на каталог locale, это GNULOCALEDIR для пакета gettext от, если мне память не изменяет, японцев, и LOCALEDIR для не японцев :). Таким образом, программы успользуют как ту, так и эту переменную. Для emx мной была введена переменная EMXLOCALEDIR. Все эти переменные могут указывать на один и тот же каталог, что. в принципе, и достаточно сделать.
Теперь о структуре каталога LOCALEDIR. У меня он расположен в E:\LANGUAGE\LOCALE\UNIX, куда я и сваливаю все файлы локализации юниховых программ. Сама структура такова:
LOCALEDIR\localename\localetype\domain
localename = ru для русского, en для США и т.д. Кроме этого, в каталоге LOCALEDIR может лежать файл locale.alias с псевдонимами. Это позволет использовать значение переменной окружения LANG в том виде, в каком оно опредставленор в OS/2, т.е. ru_RU. За примером файла можно отправиться в XFree86 или *nix.
localetype - тип локализации. Для большенства программ это LC_MESSAGES.
domain - имя программы или пакета.
Таким образом, чтобы получить поддержку русского в emx достаточно:
Для переключения на другой язык достаточно сменить значение LANG. Если остальные компоненты присутствуют, то сообщения автоматически будут на нужном языке.
Теперь немного о самой методике руссификации. Предположим, у вас имеется некий код:
/* hello.c */ #include <stdio.h> int main(int argc, char **argv) { printf("Hello world!\n"); } /* end of hello.c */Внеся необходимые исправления для gettext получим:
/* hello.c */ #include <stdio.h> #define ENABLE_NLS 1 /* включаем поддержку nls */ #include <libgettext.h> /* заголовки функций */ #define _(s) gettext(s) /* макрос для простоты */ int main(int argc, char **argv) { bindtextdomain ("hello", LOCALEDIR); /* инициализация gettext, можно указать и GNULOCALEDIR */ textdomain ("hello"); /* здесь hello некоторое уникальное имя */ printf(_("Hello world!\n")); /* Заметьте, что использование \r недопустимо */ } /* end of hello.c */После чего программа компилируется и работает, как работала, за одним исключением.
Пишем xgettext -k_ hello.c. Получаем файл message.po вида:
msgid "" msgstr "" "Date: 1996-08-07 21:24:31+0100\n" "From: <rommel@localhost>\n" "Content-Type: text/plain; charset=\n" "Xgettext-Options: -dhello -k_\n" "Files: hello.c\n" #: hello.c:13 msgid "Hello world!\n" msgstr ""Вникнув в смысл :), делаем так:
msgid "" msgstr "" "Date: 1996-08-07 21:24:31+0100\n" "From: <rommel@localhost>\n" "Content-Type: text/plain; charset=\n" "Xgettext-Options: -dhello -k_\n" "Files: hello.c\n" #: hello.c:13 msgid "Hello world!\n" msgstr "Здарова, пацаны \w/\n"Сказав msgfmt messages.po hello.mo получим файл hello.mo, который и кладем в LOCALEDIR\ru\LC_MESSAGES\hello.mo. Проверив, что в переменной окружения стоит LANG=ru, запускаем hello.exe и видим приветствие "чистааа, пацанам" :). Умиляясь от собственной крутости идем пить пиво ;)
В заключение я хотел бы добавить, что в OS/2 существует собственная поддержка локали. Немного поподробней о ней вы можете найти в статье в RDM/2.
Отученый от emx.dll gettext: gettextnoemx.zip, 842k
emx runtime с поддержкой национальных языков: в скором времени на http://emx.nm.ru.
Юрий Прокушев
E-Mail: prokushev@freemail.ru
NetMail: 2:5000/106.9
Интересные ссылки:
Значение слова бизнес.
Комментариев к странице: 0 | Добавить комментарий
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов