? Так отмечается тот факт, что какая-то часть не переведена или перевод вызывает сомнения. Все автоматически сгенерированные сообщения помечаются таким образом, чтобы человек знал, что их нужно проверить и изменить.
Файл
myapp.pot
нужно разослать переводчикам. (Конечно, вы можете перевести его и самостоятельно.)
Предположим, что вы переводите на японский язык. На машине установлена локаль
ja_jp.UTF-8
, что означает «Япония (
ja
), японский язык (
JP
), кодировка UTF-8».
Для
начала скопируем файл
myapp.pot
в
myapp.ро
. При наличии набора GNU-утилит
gettext
лучше воспользоваться командой
msginit
, а не просто
cp
. Эта утилита учитывает переменные окружения и правильно устанавливает некоторые переменные в заголовке. В UNIX она вызывается следующим образом:
LANG=ja_JP.UTF-8 msginit -i myapp.pot -o myapp.po
Затем отредактируйте файл
myapp.ро
, как показано в листинге 4.3. Редактировать необходимо в той кодировке, которая указана в строке
Content-Type
.
Листинг 4.3. Файл myapp.ро после редактирования
# Пример приложения.
# Copyright (С) 2006 Foo Bar
# Файл распространяется по лицензии XXX.
#
# Ваше имя <yourname@foo.com>, 2006. (Вся информация о переводчике)
msgstr[1] "%{name) ha %{num} nin no kodomo ga imasu."
Тегом
msgid
помечается исходное сообщение, а тегом
msgstr
— переведенное. При наличии строки
msgid_plural
необходимо включить отдельные строки
msgstr[i]
в соответствии с правилом
Plural-Forms
.
Индекс
i
вычисляется на основе выражения
Plural-Forms
. В данном случае при
num != 1
используется
msgstr[1]
(сообщение с существительным во множественном числе).
Истоки синтаксиса правила
Plural-Forms
следует искать в языке С. Как видим, он опирается на тот факт, что булевские выражения в С возвращают 0 или 1.
Имейте в виду, что формы единственного и множественного числа в большой степени зависят от языка. Во многих языках есть несколько форм множественного числа. Например, в польском слово «файл» в единственном числе записывается как «plik». Если количество экземпляров заканчивается на 2, 3 и 4, то во множественном числе пишется «pliki», а во всех остальных случаях — «plik'ow».
Поэтому для польского языка правило
Plural-Forms
выглядит так:
Plural-Forms: nplurals=3; \
plural=n==1 ? 0 : \
n%10>=2 && n%10<=4 && (n%100=20) ? 1 : 2;
Заголовок файла — не пустая формальность. Особенно важны разделы
Content-Type
и
Plural-Forms
. При пользовании утилитой
msginit
они вставляются автоматически, в противном случае необходимо добавить их вручную.
Закончив работу, переводчик посылает файлы обратно разработчику (или вы сами возвращаетесь к роли разработчика).
Файлы
myapp.ро
, полученные от переводчиков, помещаются в соответствующие каталоги (внутри каталога
myapp/ро
). Например, французскую версию следовало бы поместить в каталог
myapp/ро/fr/myapp.ро
, немецкую — в каталог
myapp/po/de/myapp.ро
и т.д.
Затем выполните команду
rake makemo
. Она преобразует РО-файлы в МО-файлы. Сгенерированные МО-файлы будут помещены в каталог
myapp/data/locale/
(в котором есть подкаталоги для каждого языка).
Таким образом, окончательная структура дерева каталогов выглядит так:
myapp/
Rakefile
person.rb
ро/
myapp.pot
de/myapp.po
fr/myapp.po
ja/myapp.po
:
data/
locale/
de/LC_MESSAGES/myapp.mo
fr/LC_MESSAGES/myapp.mo
ja/LC_MESSAGES/myapp.mo
:
Перевод закончен, можно протестировать пример. Но предварительно следует указать, где искать МО-файлы и для какой локали проводится тестирование. Установим переменные окружения
GETTEXT_PATH
и
LANG
, запустим программу и посмотрим, что она выведет.
export GETTEXT_PATH="data/locale"
export LANG="ja_JP.UTF-8"
ruby person.rb
Программа выводит локализованные сообщения в соответствии со значением переменной