RDM/2 The Russian Electronic Developer Magazine  
RDM/2 Русский электронный журнал разработчика  
ДомойОт редактораПишите намОбратная связьRU/2

Локализация с помощью GNU GETTEXT

Замечания к статье

В данной статье приведен обзор применения GNU Gettext для локализации emx runtime.

Локализация emx runtime с помощью GNU Gettext

или

Как отучить программы от EMX.DLL

В рамках проекта по переводу 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 | Добавить комментарий
---
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов
(C) Russian Underground/2