Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Библиотека представляет собой реализацию на Ruby (не обертку) набора утилит

gettext
из проекта GNU (самый известный продукт в этой области). Ее официальный сайт находится по адресуа утилиты GNU можно найти на сайте http://www.gnu.org/software/gettext/.

4.3.1 Исторические сведения и терминология

Библиотека

gettext
на самом деле, как мы увидим, состоит из нескольких библиотек. Для доступа к основным функциям нужно включить предложение
require 'gettext'
, а для получения разного рода дополнительных средств (в частности, работы со справочниками сообщений) — предложение
require 'gettext/utils'
.

Главная причина, по которой мы используем справочники сообщений, — это, конечно, перевод сообщений на другие языки. С их помощью мы также обрабатываем случаи, когда формы единственного и множественного числа различаются (один файл, два файла). Кстати, эти правила очень сильно зависят от конкретного языка.

Обычно у каждой библиотеки и приложения имеется собственный справочник сообщений. Следовательно, в дистрибутив можно включать набор переведенных на разные языки справочников.

Учитываются переменные окружения

LANG
и
GETTEXT_PATH
. Их назначение мы рассмотрим ниже.

Для сопровождения справочника сообщений есть две основных операции (они выполняются вне вашей программы): извлечь сообщения из исходного текста Ruby-программы для формирования начального справочника и включить новые сообщения из исходного текста в существующий справочник (слияние). Операции извлечения и слияния мы рассмотрим в разделе 4.3.3.

4.3.2. Приступаем к работе со справочниками сообщений

Возможно, библиотека

gettext
на вашем компьютере уже установлена. Если нет, проще всего выполнить команду
gem install gettext
.

Для разработки вам понадобятся утилиты GNU. Если вы работаете в системе UNIX, то, скорее всего, они уже установлены. В случае платформы Win32 можно установить Glade/GTK+ для Windows; заодно вы получите и утилиты GNU. В любом случае необходимы они только на этапе разработки, а не во время выполнения.

Если у вас нет программы

rake
, установите ее из gem-пакета. Это дополнительное удобство.

Коль скоро среда настроена и все установлено, можно приступать к работе со справочниками. Но сначала познакомимся с терминологией.

• РО-файл — это переносимый объектный файл. Так называется текстовое (понятное человеку) представление справочника сообщений. У каждого такого файла есть вариант для различных поддерживаемых локалей. РОТ-файл — это шаблон.

• МО-файл — это переносимый двоичный файл справочника. Он создается из РО-файла. Библиотека для Ruby умеет читать только МО-файлы, но не РО-файлы.

• Текстовый домен — это, по существу, просто базовое имя МО-файла. Он ассоциирован с приложением (привязан к нему).

4.3.3. Локализация простого приложения

В следующем примере определяется класс Person, после чего с ним выполняются различные действия. Метод show выводит локализованные сообщения:

require 'gettext'

class Person

 include GetText

 def initialize(name, age, children_num)

@name, @age, @children_num = name, age, children_num

bindtextdomain("myapp")

 end

 def show

puts _("Information")

puts _("Name: %{name}, Age: %{age}") % {:name => @name, :age => @age}

puts n_("%{name} has a child.", "%{name} has %{num} children.",

@children_num) % {:name => @name, :num => @children_num}

 end

end

john = Person.new("John", 25, 1)

john.show

linda = Person.new("Linda", 30, 3)

linda.show

Предположим, что этот код сохранен в файле

myapp/person.rb
. Как вы скоро увидите, иерархия каталогов имеет значение. Вызов метода
bindtextdomain
связывает текстовый домен
"myapp"
с объектом
Person
во время выполнения.

В методе

show
есть три обращения к библиотеке
gettext
. Вызываемый метод называется
_
(одно подчеркивание), чтобы не отвлекать внимание.

Первое обращение просто выводит локализованное сообщение, соответствующее строке

"Information"
. Второе демонстрирует локализованное сообщение с двумя параметрами. В хэше задается список значений, подставляемых в строку. Интерполировать их напрямую нельзя, потому что это вступало бы в противоречие с основной целью: хранить в справочнике небольшое число сообщений.

Отметим также, что параметры отделены от текста сообщения, поэтому при необходимости могут подставляться в другом порядке. Ведь иногда при переводе на другой язык приходится переставлять слова.

Тот же метод можно вызвать и короче:

puts _("Name: %s, Age: %d") % [@name, @age]

Однако мы рекомендуем более длинную запись. Она понятнее и дает больше информации переводчику.

Метод

n_
предназначен для обработки единственного и множественного числа. Значение параметра
@children_num
— индекс, говорящий о том, какую из заранее заданных строк использовать. (Правило
Plural-Forms
, о котором я скоро расскажу, определяет порядок вычисления индекса.)

Поделиться:
Популярные книги

Фауст

фон Гёте Иоганн Вольфганг
50. Библиотека всемирной литературы
Поэзия:
драматургия
8.33
рейтинг книги
Фауст

Беседы

Агеев Александр Иванович
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Беседы

Дети Хедина (антология)

Перумов Ник
Миры Упорядоченного
Фантастика:
фэнтези
7.64
рейтинг книги
Дети Хедина (антология)

Я до сих пор не царь. Книга XXVII

Дрейк Сириус
27. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор не царь. Книга XXVII

Удельная. Очерки истории

Глезеров Сергей Евгеньевич
Всё о Санкт-Петербурге
Научно-образовательная:
история
культурология
5.00
рейтинг книги
Удельная. Очерки истории

Учитель из прошлого тысячелетия

Еслер Андрей
6. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Учитель из прошлого тысячелетия

Реальная угроза

Клэнси Том
4. Джек Райан
Детективы:
боевики
5.75
рейтинг книги
Реальная угроза

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Свет и Тьма

Щепетнов Евгений Владимирович
3. Нед
Фантастика:
фэнтези
9.16
рейтинг книги
Свет и Тьма

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
О чём не пишут в книгах по Delphi

Дань псам

Эриксон Стивен
8. «Малазанская империя»
Фантастика:
фэнтези
5.80
рейтинг книги
Дань псам

Хроники Тамула. Трилогия

Эддингс Дэвид
Тамули
Фантастика:
фэнтези
6.25
рейтинг книги
Хроники Тамула. Трилогия

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Студент из прошлого тысячелетия

Парижский шлейф

Машкова Диана
Любовные романы:
современные любовные романы
7.43
рейтинг книги
Парижский шлейф