SlideShare ist ein Scribd-Unternehmen logo
1 von 31
Downloaden Sie, um offline zu lesen
Интернационализация и
локализация Ruby on Rails.
       gem russian
         Ярослав Маркин
        Москва, апрель 2009
Привет?
•   Ярослав Маркин

•   evilmartians.ru — небольшая команда рельсовиков (разработка и
    консультации)

•   Где вы меня видели? github (gem russian), контрибуты в Rails



•   В далеком 2006 вместе с Юликом Тархановым и Ильей
    Немихиным сделали лист ror2ru и начали работу над rubyonrails.ru
Локализация и
интернационализация до Rails 2.2

•   gem rutils, Brazilian Rails, monkeypatching...

•   gibberish, Localization Simplified, плагины вокруг gettext, globalite, ...

•   Globalize

•   Нет единого стандарта, ломается с каждой версией Rails
Rails I18n

•   Лето 2008, Sven Fuchs & Co — приглашены все авторы плагинов и библиотек для локализации и
    интернационализации

•   Цель — общий API для всех проектов локализации и интернационализации

•   Поддержка всех языков без monkeypatching

•   Заменяемые бекенды (любая реализация переводов с любым хранилищем — БД, файлы, GetText)

•   Основа для движков интернационализации (Globalize2)

•   Сроки — RailsConf EU 2008
Архитектура I18n


•   I18n API (работа с локалью, localize, translate)

•   Подключаемые бекэнды, реализующие API (SimpleBackend)

•   I18n для Rails: набор патчей для Rails, которые пользуются I18n
I18n API

•   I18n.t (translate) — перевод по ключу

•   I18n.l (localize) — локализация даты/времени

•   Всего два главных метода — их вы в основном и будете
    использовать
Как делать файлы переводов?


•   SimpleBackend: YAML или обычный Ruby хеш

•   Вершина дерева — название локали (например, :ru)

•   Файлы переводов загружаются из I18n.load_path (lazy loading)
Файл переводов: .rb с хешем
         {
             :'en' => {
               :foo => {
                 :bar => quot;bazquot;
               }
             }
         }
Файл переводов: .yaml

       en:
         foo:
           bar: baz
I18n API: а также...

•   load_path — путь к загружаемым локалям (в Rails — config/locales)

•   locale — акцессор для текущей локали (в рамках треда, можно устанавливать в before_filter)

•   default_locale — локаль по умолчанию (:en, забегая вперед — russian устанавливает ее в :ru)

•   exception_handler — обработчик исключений (например, сделать fallback если нет перевода — по
    умолчанию этого не делается)

•   backend — акцессор для используемого бекэнда (через него меняется класс бекэнда)
I18n.t (подробно смотрите в Rails
             Guides)
•   I18n.t :message

•   I18n.t 'message'

•   I18n.t :invalid, :scope => [:activerecord, :errors, :messages]

•   I18n.translate :quot;activerecord.errors.messages.invalidquot;

•   I18n.t :missing, :default => 'Not here'

•   I18n.t :missing, :default => :other_key

•   I18n.t :missing, :default => [:also_missing, 'Not here']
I18n.l (подробно смотрите в Rails
             Guides)
•   I18n.l(date, options)

•   I18n.l(time, options)

•   I18n.l(time, :format => :short)

•   I18n.l(time, :format => :long)

•   I18n.l(time, :format => quot;%a, %d %b %Yquot;)
Интерполяция


•   I18n.backend.store_translations :en, :thanks => 'Thanks {{name}}!'

•   I18n.translate :thanks, :name => 'Jeremy'
Плюрализация

•   В SimpleBackend «зашита» на правила английского языка

•   I18n.t :key, :count => 1 (2, 3, ..)

•   SimpleBackend: pluralize возвращает ключ, по которому происходит
    поиск, например, :’key.one’ или :’key.many’.
Явная передача локали


•   I18n.t :foo, :locale => :ru

•   I18n.l Time.now, :locale => :ru
Rails и I18n

•   Алиасы: I18n.l как l, I18n.t как t в ActionController/ActionView

•   I18n.load_path — по умолчанию смотрит в config/locales

•   Выбор view в зависимости от локали (например, app/views/posts/index.ru.html.erb)

•   Lookup в зависимости от view: (app/views/books/index.html.erb), l :”.title” будет смотреть в
    locale.books.index.title

•   Неочевидный плюс: вынос всех строковых ресурсов приложения в YAML!
ActiveRecord

•   Перевод всех сообщений для валидации (для подстановки
    доступны макросы {{model}}, {{attribute}}, {{value}}, иногда {{count}})

•   Оверрайд ошибок для каждой конкретной модели и каждого
    атрибута

•   Перевод Model.human_name — названия модели.

•   Перевод Model.human_attribute_name — названия атрибута модели
ActionView: переводы хелперов

•   number_with_delimiter, number_to_currency,
    number_to_percentage, number_to_precision

•   number_to_human_size

•   distance_of_time_in_words, distance_of_time_in_words_to_now,
    time_ago_in_words

•   error_messages_for
Проблемы

•   Поддержка «экзотических» языков никого не волновала — русский оказался «экзотическим»

•   Нет поддержки двух форм названий месяцев (августа/Август)

•   Для поддержки других механизмов плюрализации предлагалось писать бекэнд

•   В Rails были включены не все нужные для нормальной локализации функции

•   Unicode CLDR — оказалось слишком сложно на первом этапе, хотя там есть все что нужно
Соглашение по Rails I18n


•   gem i18n и поддержка I18n в Rails полностью — только для
    английского языка

•   Все остальные случаи — «делайте свои бекэнды»
gem russian
•   Тогда мы сделаем свой бекэнд, с блекджеком...

•   Цель: сначала сделать полную поддержку русского языка, потом
    сделать так чтобы она входила в core. Минимум хаков, обратная
    совместимость (никак не сломать I18n и существующие методы —
    например, ни в коем случае не перегружать strftime).

•   gem install russian, http://github.com/yaroslav/russian

•   Появился 1 сентября, к началу RailsConf EU и уже фигурировал в
    слайдах на первой презентации Rails I18n (Sven Fuchs)
Содержимое gem russian

•   gem i18n в vendor/. Можно использовать как плагин к Rails (где уже есть I18n) или как отдельный
    gem.

•   Собственный бекэнд (AdvancedBackend — поддержка двух форм названий месяцев и плюрализации,
    задаваемой как lambda в файле переводов)

•   Хаки для Rails (Дата-время, форматирование сообщений валидации, плагин i18n-label)

•   Хелперы в модуле Russian — полезны если в приложении используется только русский язык

•   Набор переводов для русского языка (само собой разумеется)
Что происходит при
           инициализации russian

•   Заменяется бэкэнд I18n со стандартного на собственный бекэнд
    Russian (I18n::Backend::Advanced)

•   Локаль русского языка (:'ru') становится локалью по умолчанию

•   Загружаются все файлы переводов для русского языка, в том числе
    переводы для Rails.
russian: Дата и время. Два варианта названий дней и названий месяцев
russian: Плюрализация (lambda)
Модуль Russian
•   Russian.locale — :’ru’

•   Russian.init_i18n — инициализация (бекэнд, локаль по умолчанию)

•   Russian.t/translate — I18n.t с форсированием русской локали

•   Russian.l/localize — I18n.l с форсированием русской локали

•   Russian.strftime — прокси для localize

•   Russian.p/pluralize — плюрализация без необходимости иметь таблицу переводов (просто
    перечислить варианты при вызове)

•   Russian.transliterate/translit — транслитерация
russian и Rails
•   Переводы для русского языка

•   DateTime helpers: ключ :use_standalone_month_name для второй формы названия месяца,
    автоопределение (если :select_month используется отдельно или есть :discard_day)

•   i18n_label: для хелпера label используются переводы (этого все еще нет в Rails)

•   Включен известный хак для сообщений валидации (“^” в начале строки не будет выводить имя
    атрибута в error_messages_for)

•   Метод parameterize обучен русскому языку — теперь легко делать пермалинки из русских букв
    (“Всем привет!”.parameterize вернет “vsem-privet”)
I18n::* vs Russian::*
•   russian полностью обратно совместим с I18n

•   Пользуйтесь I18n.l, I18n.t для мультиязычных проектов

•   Russian — набор шорткатов (strftime, pluralize) и специфичных
    (translit) методов. Хорош для проектов полностью на русском.

•   Франзузу не нужно писать gem french, украинцу — gem ukrainian.
    Полная совместимость бекендов, просто включены все
    возможности для поддержки русского — не в ущерб другим
    языкам.
Спасибо Юлику за наше
            счастливое детство


•   Юлик Тарханов (live.julik.nl): Поддержка Unicode в Rails 1.2, rutils
Что дальше
•   http://rails-i18n.org

•   http://groups.google.com/group/rails-i18n

•   Локали: http://github.com/svenfuchs/rails-i18n

•   Патчи и предложения по russian: http://github.com/yaroslav/russian

•   Поддержка lambda в переводах (Clemens Kofler)

•   Работа над поддержкой/импортом CLDR почти не начиналась но очень нужна
Вопросы?
•   yaroslav@markin.net



•   twitter.com/yaroslav

•   github.com/yaroslav



•   http://evilmartians.ru

Weitere ähnliche Inhalte

Was ist angesagt?

положение о правилах пользования библиотекой
положение о правилах пользования библиотекойположение о правилах пользования библиотекой
положение о правилах пользования библиотекой
pkgpkg
 
Asterroid презентация
Asterroid презентацияAsterroid презентация
Asterroid презентация
Liudmila Li
 
HighLoad Sites, Oleg Bunin
HighLoad Sites, Oleg BuninHighLoad Sites, Oleg Bunin
HighLoad Sites, Oleg Bunin
Ontico
 
‎Знакомство с Perl 6‎
‎Знакомство с Perl 6‎‎Знакомство с Perl 6‎
‎Знакомство с Perl 6‎
Andrew Shitov
 
Вебинар компании VMC по продуктам Parallels 2009
Вебинар компании VMC по продуктам Parallels 2009Вебинар компании VMC по продуктам Parallels 2009
Вебинар компании VMC по продуктам Parallels 2009
areconster
 
Решение по управлению web-контентом от компании Oracle.
Решение по управлению web-контентом от компании Oracle.Решение по управлению web-контентом от компании Oracle.
Решение по управлению web-контентом от компании Oracle.
Anton Shmakov
 
WUD2008 - Михаил Матвеев, Данила Корнев - Использование контекстной информаци...
WUD2008 - Михаил Матвеев, Данила Корнев - Использование контекстной информаци...WUD2008 - Михаил Матвеев, Данила Корнев - Использование контекстной информаци...
WUD2008 - Михаил Матвеев, Данила Корнев - Использование контекстной информаци...
wud
 
Аудит маркетинга УТГ 2008
Аудит маркетинга УТГ 2008Аудит маркетинга УТГ 2008
Аудит маркетинга УТГ 2008
Vadim Andreev
 
Tupitsyn High Load
Tupitsyn High LoadTupitsyn High Load
Tupitsyn High Load
Ontico
 

Was ist angesagt? (15)

Xrumme
XrummeXrumme
Xrumme
 
положение о правилах пользования библиотекой
положение о правилах пользования библиотекойположение о правилах пользования библиотекой
положение о правилах пользования библиотекой
 
Mediabarcamp2009: Редагування в нових медіа
Mediabarcamp2009: Редагування в нових медіаMediabarcamp2009: Редагування в нових медіа
Mediabarcamp2009: Редагування в нових медіа
 
Asterroid презентация
Asterroid презентацияAsterroid презентация
Asterroid презентация
 
HighLoad Sites, Oleg Bunin
HighLoad Sites, Oleg BuninHighLoad Sites, Oleg Bunin
HighLoad Sites, Oleg Bunin
 
‎Знакомство с Perl 6‎
‎Знакомство с Perl 6‎‎Знакомство с Perl 6‎
‎Знакомство с Perl 6‎
 
Scs Tu134 A V1
Scs Tu134 A V1Scs Tu134 A V1
Scs Tu134 A V1
 
Вебинар компании VMC по продуктам Parallels 2009
Вебинар компании VMC по продуктам Parallels 2009Вебинар компании VMC по продуктам Parallels 2009
Вебинар компании VMC по продуктам Parallels 2009
 
lenvendo on bitrix cms
lenvendo on bitrix cmslenvendo on bitrix cms
lenvendo on bitrix cms
 
Решение по управлению web-контентом от компании Oracle.
Решение по управлению web-контентом от компании Oracle.Решение по управлению web-контентом от компании Oracle.
Решение по управлению web-контентом от компании Oracle.
 
WUD2008 - Михаил Матвеев, Данила Корнев - Использование контекстной информаци...
WUD2008 - Михаил Матвеев, Данила Корнев - Использование контекстной информаци...WUD2008 - Михаил Матвеев, Данила Корнев - Использование контекстной информаци...
WUD2008 - Михаил Матвеев, Данила Корнев - Использование контекстной информаци...
 
Аудит маркетинга УТГ 2008
Аудит маркетинга УТГ 2008Аудит маркетинга УТГ 2008
Аудит маркетинга УТГ 2008
 
How to make your site accessible
How to make your site accessibleHow to make your site accessible
How to make your site accessible
 
кеширование в бд
кеширование в бдкеширование в бд
кеширование в бд
 
Tupitsyn High Load
Tupitsyn High LoadTupitsyn High Load
Tupitsyn High Load
 

Интернационализация и локализация Rails. gem russian

  • 1. Интернационализация и локализация Ruby on Rails. gem russian Ярослав Маркин Москва, апрель 2009
  • 2. Привет? • Ярослав Маркин • evilmartians.ru — небольшая команда рельсовиков (разработка и консультации) • Где вы меня видели? github (gem russian), контрибуты в Rails • В далеком 2006 вместе с Юликом Тархановым и Ильей Немихиным сделали лист ror2ru и начали работу над rubyonrails.ru
  • 3. Локализация и интернационализация до Rails 2.2 • gem rutils, Brazilian Rails, monkeypatching... • gibberish, Localization Simplified, плагины вокруг gettext, globalite, ... • Globalize • Нет единого стандарта, ломается с каждой версией Rails
  • 4. Rails I18n • Лето 2008, Sven Fuchs & Co — приглашены все авторы плагинов и библиотек для локализации и интернационализации • Цель — общий API для всех проектов локализации и интернационализации • Поддержка всех языков без monkeypatching • Заменяемые бекенды (любая реализация переводов с любым хранилищем — БД, файлы, GetText) • Основа для движков интернационализации (Globalize2) • Сроки — RailsConf EU 2008
  • 5. Архитектура I18n • I18n API (работа с локалью, localize, translate) • Подключаемые бекэнды, реализующие API (SimpleBackend) • I18n для Rails: набор патчей для Rails, которые пользуются I18n
  • 6. I18n API • I18n.t (translate) — перевод по ключу • I18n.l (localize) — локализация даты/времени • Всего два главных метода — их вы в основном и будете использовать
  • 7. Как делать файлы переводов? • SimpleBackend: YAML или обычный Ruby хеш • Вершина дерева — название локали (например, :ru) • Файлы переводов загружаются из I18n.load_path (lazy loading)
  • 8. Файл переводов: .rb с хешем { :'en' => { :foo => { :bar => quot;bazquot; } } }
  • 10. I18n API: а также... • load_path — путь к загружаемым локалям (в Rails — config/locales) • locale — акцессор для текущей локали (в рамках треда, можно устанавливать в before_filter) • default_locale — локаль по умолчанию (:en, забегая вперед — russian устанавливает ее в :ru) • exception_handler — обработчик исключений (например, сделать fallback если нет перевода — по умолчанию этого не делается) • backend — акцессор для используемого бекэнда (через него меняется класс бекэнда)
  • 11. I18n.t (подробно смотрите в Rails Guides) • I18n.t :message • I18n.t 'message' • I18n.t :invalid, :scope => [:activerecord, :errors, :messages] • I18n.translate :quot;activerecord.errors.messages.invalidquot; • I18n.t :missing, :default => 'Not here' • I18n.t :missing, :default => :other_key • I18n.t :missing, :default => [:also_missing, 'Not here']
  • 12. I18n.l (подробно смотрите в Rails Guides) • I18n.l(date, options) • I18n.l(time, options) • I18n.l(time, :format => :short) • I18n.l(time, :format => :long) • I18n.l(time, :format => quot;%a, %d %b %Yquot;)
  • 13. Интерполяция • I18n.backend.store_translations :en, :thanks => 'Thanks {{name}}!' • I18n.translate :thanks, :name => 'Jeremy'
  • 14. Плюрализация • В SimpleBackend «зашита» на правила английского языка • I18n.t :key, :count => 1 (2, 3, ..) • SimpleBackend: pluralize возвращает ключ, по которому происходит поиск, например, :’key.one’ или :’key.many’.
  • 15. Явная передача локали • I18n.t :foo, :locale => :ru • I18n.l Time.now, :locale => :ru
  • 16. Rails и I18n • Алиасы: I18n.l как l, I18n.t как t в ActionController/ActionView • I18n.load_path — по умолчанию смотрит в config/locales • Выбор view в зависимости от локали (например, app/views/posts/index.ru.html.erb) • Lookup в зависимости от view: (app/views/books/index.html.erb), l :”.title” будет смотреть в locale.books.index.title • Неочевидный плюс: вынос всех строковых ресурсов приложения в YAML!
  • 17. ActiveRecord • Перевод всех сообщений для валидации (для подстановки доступны макросы {{model}}, {{attribute}}, {{value}}, иногда {{count}}) • Оверрайд ошибок для каждой конкретной модели и каждого атрибута • Перевод Model.human_name — названия модели. • Перевод Model.human_attribute_name — названия атрибута модели
  • 18. ActionView: переводы хелперов • number_with_delimiter, number_to_currency, number_to_percentage, number_to_precision • number_to_human_size • distance_of_time_in_words, distance_of_time_in_words_to_now, time_ago_in_words • error_messages_for
  • 19. Проблемы • Поддержка «экзотических» языков никого не волновала — русский оказался «экзотическим» • Нет поддержки двух форм названий месяцев (августа/Август) • Для поддержки других механизмов плюрализации предлагалось писать бекэнд • В Rails были включены не все нужные для нормальной локализации функции • Unicode CLDR — оказалось слишком сложно на первом этапе, хотя там есть все что нужно
  • 20. Соглашение по Rails I18n • gem i18n и поддержка I18n в Rails полностью — только для английского языка • Все остальные случаи — «делайте свои бекэнды»
  • 21. gem russian • Тогда мы сделаем свой бекэнд, с блекджеком... • Цель: сначала сделать полную поддержку русского языка, потом сделать так чтобы она входила в core. Минимум хаков, обратная совместимость (никак не сломать I18n и существующие методы — например, ни в коем случае не перегружать strftime). • gem install russian, http://github.com/yaroslav/russian • Появился 1 сентября, к началу RailsConf EU и уже фигурировал в слайдах на первой презентации Rails I18n (Sven Fuchs)
  • 22. Содержимое gem russian • gem i18n в vendor/. Можно использовать как плагин к Rails (где уже есть I18n) или как отдельный gem. • Собственный бекэнд (AdvancedBackend — поддержка двух форм названий месяцев и плюрализации, задаваемой как lambda в файле переводов) • Хаки для Rails (Дата-время, форматирование сообщений валидации, плагин i18n-label) • Хелперы в модуле Russian — полезны если в приложении используется только русский язык • Набор переводов для русского языка (само собой разумеется)
  • 23. Что происходит при инициализации russian • Заменяется бэкэнд I18n со стандартного на собственный бекэнд Russian (I18n::Backend::Advanced) • Локаль русского языка (:'ru') становится локалью по умолчанию • Загружаются все файлы переводов для русского языка, в том числе переводы для Rails.
  • 24. russian: Дата и время. Два варианта названий дней и названий месяцев
  • 26. Модуль Russian • Russian.locale — :’ru’ • Russian.init_i18n — инициализация (бекэнд, локаль по умолчанию) • Russian.t/translate — I18n.t с форсированием русской локали • Russian.l/localize — I18n.l с форсированием русской локали • Russian.strftime — прокси для localize • Russian.p/pluralize — плюрализация без необходимости иметь таблицу переводов (просто перечислить варианты при вызове) • Russian.transliterate/translit — транслитерация
  • 27. russian и Rails • Переводы для русского языка • DateTime helpers: ключ :use_standalone_month_name для второй формы названия месяца, автоопределение (если :select_month используется отдельно или есть :discard_day) • i18n_label: для хелпера label используются переводы (этого все еще нет в Rails) • Включен известный хак для сообщений валидации (“^” в начале строки не будет выводить имя атрибута в error_messages_for) • Метод parameterize обучен русскому языку — теперь легко делать пермалинки из русских букв (“Всем привет!”.parameterize вернет “vsem-privet”)
  • 28. I18n::* vs Russian::* • russian полностью обратно совместим с I18n • Пользуйтесь I18n.l, I18n.t для мультиязычных проектов • Russian — набор шорткатов (strftime, pluralize) и специфичных (translit) методов. Хорош для проектов полностью на русском. • Франзузу не нужно писать gem french, украинцу — gem ukrainian. Полная совместимость бекендов, просто включены все возможности для поддержки русского — не в ущерб другим языкам.
  • 29. Спасибо Юлику за наше счастливое детство • Юлик Тарханов (live.julik.nl): Поддержка Unicode в Rails 1.2, rutils
  • 30. Что дальше • http://rails-i18n.org • http://groups.google.com/group/rails-i18n • Локали: http://github.com/svenfuchs/rails-i18n • Патчи и предложения по russian: http://github.com/yaroslav/russian • Поддержка lambda в переводах (Clemens Kofler) • Работа над поддержкой/импортом CLDR почти не начиналась но очень нужна
  • 31. Вопросы? • yaroslav@markin.net • twitter.com/yaroslav • github.com/yaroslav • http://evilmartians.ru