домен 'myapp'
с объектом Person
во время выполнения.
В методе show
есть три обращения к библиотеке gettext
. Вызываемый метод называется _
(одно подчеркивание), чтобы не отвлекать внимание.
Первое обращение просто выводит локализованное сообщение, соответствующее строке 'Information'
. Второе демонстрирует локализованное сообщение с двумя параметрами. В хэше задается список значений, подставляемых в строку. Интерполировать их напрямую нельзя, потому что это вступало бы в противоречие с основной целью: хранить в справочнике небольшое число сообщений.
Отметим также, что параметры отделены от текста сообщения, поэтому при необходимости могут подставляться в другом порядке. Ведь иногда при переводе на другой язык приходится переставлять слова.
Тот же метод можно вызвать и короче:
puts _('Name: %s, Age: %d') % [@name, @age]
Однако мы рекомендуем более длинную запись. Она понятнее и дает больше информации переводчику.
Метод n_
предназначен для обработки единственного и множественного числа. Значение параметра @children_num
— индекс, говорящий о том, какую из заранее заданных строк использовать. (Правило Plural-Forms
, о котором я скоро расскажу, определяет порядок вычисления индекса.)
Отметим, что сообщения по умолчанию обязаны быть англоязычными (даже если родной язык программиста не английский). Нравится вам это или нет, но английский ближе всего к универсальному языку с точки зрения большинства переводчиков.
Я сказал, что нам пригодится программа rake
. Создадим файл Rakefile
(в каталоге myapp
) для сопровождения справочников сообщений. Он будет выполнять две основные операции: обновлять РО-файлы и создавать МО-файлы.
require 'gettext/utils'
desc 'Update pot/po files.'
task :updatepo do
GetText.update_pofiles('myapp', ['person.rb'], 'myapp 1.0.0')
end
desc 'Create mo-files'
task :makemo do
GetText.create_mofiles
end
Здесь мы воспользовались библиотекой gettext/utils
, в которой имеются функции для работы со справочниками сообщения. Метод update_pofiles
создает начальный файл myapp/ро/myapp.pot
на основе исходного текста person.rb
. При втором (и всех последующих) вызовах эта функция выполнит обновление, или слияние файла myapp/po/myapp.pot
и всех файлов вида myapp/po/#{lang}/myapp.ро
. Второй параметр — массив целевых файлов. Обычно он задается примерно так:
GetText.update_pofiles('myapp',
Dir.glob('{lib,bin}/**/*.{rb,rhtml}'),
'myapp 1.0.0')
Вызов метода GetText.create_mofiles
создает необходимые подкаталоги в каталоге data/locale/
и генерирует МО-файлы из РО-файлов.
Итак, выполнив команду rake updatepo
, мы создадим каталог myapp/ро
, а в нем файл myapp.pot
.
Теперь отредактируем заголовок файла po/myapp.pot
. Он содержит описание приложения (название, имя автора, адрес электронной почты, условия лицензирования и т.д.).
# Пример приложения. (Осмысленное название)
# Copyright (С) 2006 Foo Bar (Автор приложения)
# Файл распространяется по лицензии XXX. (Лицензия)
#
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. (Информация о переводчике)
#
#, fuzzy
msgid ''
msgstr ''
'Project-Id-Version: myapp 1.0.0
' (ID и версия проекта)
#...
Что такое маркер fuzzy
? Так отмечается тот факт, что какая-то часть не переведена или перевод вызывает сомнения. Все автоматически сгенерированные сообщения помечаются таким образом, чтобы человек знал, что их нужно проверить и изменить.
Файл 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
.
# Пример приложения.
# Copyright (С) 2006 Foo Bar
# Файл распространяется по лицензии XXX.
#
# Ваше имя <yourname@foo.com>, 2006. (Вся информация о переводчике)
# (Удалите строку 'fuzzy')
msgid ''
msgstr ''
'Project-Id-Version: myapp 1.0.0
'
'POT-Creation-Date: 2006-05-22 23:27+0900
'
'PO-Revision-Date: 2006-05-23 14:39+0900
'
# Информация о текущем переводчике.
'Last-Translator: Your Name <foo@bar.com>
'
'Language-Team: Japanese
' (Ваш язык)
'MIME-Version: 1.0
'
'Content-Type: text/plain; charset=UTF-8
' (Кодировка файла)
'Content-Transfer-Encoding: 8bit
.'
# Форма множественного числа.
'Plural-Forms: nplurals=2; plural=(n != l);
'
#: person.rb:12