Интернационализация и
локализация Ruby on Rails.
       gem russian
         Ярослав Маркин
        Москва, апрель 2009
Привет?
•   Ярослав Маркин

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

•   Где в...
Локализация и
интернационализация до Rails 2.2

•   gem rutils, Brazilian Rails, monkeypatching...

•   gibberish, Localiz...
Rails I18n

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


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

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

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

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

•   Всего два главн...
Как делать файлы переводов?


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

•   Вершина дерева — название локали (например...
Файл переводов: .rb с хешем
         {
             :'en' => {
               :foo => {
                 :bar => quot;bazq...
Файл переводов: .yaml

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

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

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

•   I18n.t 'message'

•   I18n.t :invalid, :sc...
I18n.l (подробно смотрите в Rails
             Guides)
•   I18n.l(date, options)

•   I18n.l(time, options)

•   I18n.l(ti...
Интерполяция


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

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

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

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

•   Simp...
Явная передача локали


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

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

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

•   I18n.load_path — по умолчанию смот...
ActiveRecord

•   Перевод всех сообщений для валидации (для подстановки
    доступны макросы {{model}}, {{attribute}}, {{v...
ActionView: переводы хелперов

•   number_with_delimiter, number_to_currency,
    number_to_percentage, number_to_precisio...
Проблемы

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

•   Нет поддержки дву...
Соглашение по Rails I18n


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

•   Все ост...
gem russian
•   Тогда мы сделаем свой бекэнд, с блекджеком...

•   Цель: сначала сделать полную поддержку русского языка, ...
Содержимое gem russian

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

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

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

•   Russia...
russian и Rails
•   Переводы для русского языка

•   DateTime helpers: ключ :use_standalone_month_name для второй формы на...
I18n::* vs Russian::*
•   russian полностью обратно совместим с I18n

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


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

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

•   Локали: http://github.com/svenfuc...
Вопросы?
•   yaroslav@markin.net



•   twitter.com/yaroslav

•   github.com/yaroslav



•   http://evilmartians.ru
Upcoming SlideShare
Loading in …5
×

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

10,939 views

Published on

«Интернационализация и
локализация Ruby on Rails. gem russian» — доклад Ярослава Маркина на RailsClub (Москва) 19 апреля 2009

Published in: Technology

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

  1. 1. Интернационализация и локализация Ruby on Rails. gem russian Ярослав Маркин Москва, апрель 2009
  2. 2. Привет? • Ярослав Маркин • evilmartians.ru — небольшая команда рельсовиков (разработка и консультации) • Где вы меня видели? github (gem russian), контрибуты в Rails • В далеком 2006 вместе с Юликом Тархановым и Ильей Немихиным сделали лист ror2ru и начали работу над rubyonrails.ru
  3. 3. Локализация и интернационализация до Rails 2.2 • gem rutils, Brazilian Rails, monkeypatching... • gibberish, Localization Simplified, плагины вокруг gettext, globalite, ... • Globalize • Нет единого стандарта, ломается с каждой версией Rails
  4. 4. Rails I18n • Лето 2008, Sven Fuchs & Co — приглашены все авторы плагинов и библиотек для локализации и интернационализации • Цель — общий API для всех проектов локализации и интернационализации • Поддержка всех языков без monkeypatching • Заменяемые бекенды (любая реализация переводов с любым хранилищем — БД, файлы, GetText) • Основа для движков интернационализации (Globalize2) • Сроки — RailsConf EU 2008
  5. 5. Архитектура I18n • I18n API (работа с локалью, localize, translate) • Подключаемые бекэнды, реализующие API (SimpleBackend) • I18n для Rails: набор патчей для Rails, которые пользуются I18n
  6. 6. I18n API • I18n.t (translate) — перевод по ключу • I18n.l (localize) — локализация даты/времени • Всего два главных метода — их вы в основном и будете использовать
  7. 7. Как делать файлы переводов? • SimpleBackend: YAML или обычный Ruby хеш • Вершина дерева — название локали (например, :ru) • Файлы переводов загружаются из I18n.load_path (lazy loading)
  8. 8. Файл переводов: .rb с хешем { :'en' => { :foo => { :bar => quot;bazquot; } } }
  9. 9. Файл переводов: .yaml en: foo: bar: baz
  10. 10. I18n API: а также... • load_path — путь к загружаемым локалям (в Rails — config/locales) • locale — акцессор для текущей локали (в рамках треда, можно устанавливать в before_filter) • default_locale — локаль по умолчанию (:en, забегая вперед — russian устанавливает ее в :ru) • exception_handler — обработчик исключений (например, сделать fallback если нет перевода — по умолчанию этого не делается) • backend — акцессор для используемого бекэнда (через него меняется класс бекэнда)
  11. 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. 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. 13. Интерполяция • I18n.backend.store_translations :en, :thanks => 'Thanks {{name}}!' • I18n.translate :thanks, :name => 'Jeremy'
  14. 14. Плюрализация • В SimpleBackend «зашита» на правила английского языка • I18n.t :key, :count => 1 (2, 3, ..) • SimpleBackend: pluralize возвращает ключ, по которому происходит поиск, например, :’key.one’ или :’key.many’.
  15. 15. Явная передача локали • I18n.t :foo, :locale => :ru • I18n.l Time.now, :locale => :ru
  16. 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. 17. ActiveRecord • Перевод всех сообщений для валидации (для подстановки доступны макросы {{model}}, {{attribute}}, {{value}}, иногда {{count}}) • Оверрайд ошибок для каждой конкретной модели и каждого атрибута • Перевод Model.human_name — названия модели. • Перевод Model.human_attribute_name — названия атрибута модели
  18. 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. 19. Проблемы • Поддержка «экзотических» языков никого не волновала — русский оказался «экзотическим» • Нет поддержки двух форм названий месяцев (августа/Август) • Для поддержки других механизмов плюрализации предлагалось писать бекэнд • В Rails были включены не все нужные для нормальной локализации функции • Unicode CLDR — оказалось слишком сложно на первом этапе, хотя там есть все что нужно
  20. 20. Соглашение по Rails I18n • gem i18n и поддержка I18n в Rails полностью — только для английского языка • Все остальные случаи — «делайте свои бекэнды»
  21. 21. gem russian • Тогда мы сделаем свой бекэнд, с блекджеком... • Цель: сначала сделать полную поддержку русского языка, потом сделать так чтобы она входила в core. Минимум хаков, обратная совместимость (никак не сломать I18n и существующие методы — например, ни в коем случае не перегружать strftime). • gem install russian, http://github.com/yaroslav/russian • Появился 1 сентября, к началу RailsConf EU и уже фигурировал в слайдах на первой презентации Rails I18n (Sven Fuchs)
  22. 22. Содержимое gem russian • gem i18n в vendor/. Можно использовать как плагин к Rails (где уже есть I18n) или как отдельный gem. • Собственный бекэнд (AdvancedBackend — поддержка двух форм названий месяцев и плюрализации, задаваемой как lambda в файле переводов) • Хаки для Rails (Дата-время, форматирование сообщений валидации, плагин i18n-label) • Хелперы в модуле Russian — полезны если в приложении используется только русский язык • Набор переводов для русского языка (само собой разумеется)
  23. 23. Что происходит при инициализации russian • Заменяется бэкэнд I18n со стандартного на собственный бекэнд Russian (I18n::Backend::Advanced) • Локаль русского языка (:'ru') становится локалью по умолчанию • Загружаются все файлы переводов для русского языка, в том числе переводы для Rails.
  24. 24. russian: Дата и время. Два варианта названий дней и названий месяцев
  25. 25. russian: Плюрализация (lambda)
  26. 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. 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. 28. I18n::* vs Russian::* • russian полностью обратно совместим с I18n • Пользуйтесь I18n.l, I18n.t для мультиязычных проектов • Russian — набор шорткатов (strftime, pluralize) и специфичных (translit) методов. Хорош для проектов полностью на русском. • Франзузу не нужно писать gem french, украинцу — gem ukrainian. Полная совместимость бекендов, просто включены все возможности для поддержки русского — не в ущерб другим языкам.
  29. 29. Спасибо Юлику за наше счастливое детство • Юлик Тарханов (live.julik.nl): Поддержка Unicode в Rails 1.2, rutils
  30. 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. 31. Вопросы? • yaroslav@markin.net • twitter.com/yaroslav • github.com/yaroslav • http://evilmartians.ru

×