Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Интернационализация и локализация Ruby on Rail...

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

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

Avatar for Yaroslav Markin

Yaroslav Markin

November 07, 2011
Tweet

More Decks by Yaroslav Markin

Other Decks in Programming

Transcript

  1. Привет? • Ярослав Маркин • evilmartians.ru — небольшая команда рельсовиков

    (разработка и консультации) • Где вы меня видели? github (gem russian), контрибуты в Rails • В далеком 2006 вместе с Юликом Тархановым и Ильей Немихиным сделали лист ror2ru и начали работу над rubyonrails.ru
  2. Локализация и интернационализация до Rails 2.2 • gem rutils, Brazilian

    Rails, monkeypatching... • gibberish, Localization Simplified, плагины вокруг gettext, globalite, ... • Globalize • Нет единого стандарта, ломается с каждой версией Rails
  3. Rails I18n • Лето 2008, Sven Fuchs & Co —

    приглашены все авторы плагинов и библиотек для локализации и интернационализации • Цель — общий API для всех проектов локализации и интернационализации • Поддержка всех языков без monkeypatching • Заменяемые бекенды (любая реализация переводов с любым хранилищем — БД, файлы, GetText) • Основа для движков интернационализации (Globalize2) • Сроки — RailsConf EU 2008
  4. Архитектура I18n • I18n API (работа с локалью, localize, translate)

    • Подключаемые бекэнды, реализующие API (SimpleBackend) • I18n для Rails: набор патчей для Rails, которые пользуются I18n
  5. I18n API • I18n.t (translate) — перевод по ключу •

    I18n.l (localize) — локализация даты/времени • Всего два главных метода — их вы в основном и будете использовать
  6. Как делать файлы переводов? • SimpleBackend: YAML или обычный Ruby

    хеш • Вершина дерева — название локали (например, :ru) • Файлы переводов загружаются из I18n.load_path (lazy loading)
  7. I18n API: а также... • load_path — путь к загружаемым

    локалям (в Rails — config/locales) • locale — акцессор для текущей локали (в рамках треда, можно устанавливать в before_filter) • default_locale — локаль по умолчанию (:en, забегая вперед — russian устанавливает ее в :ru) • exception_handler — обработчик исключений (например, сделать fallback если нет перевода — по умолчанию этого не делается) • backend — акцессор для используемого бекэнда (через него меняется класс бекэнда)
  8. I18n.t (подробно смотрите в Rails Guides) • I18n.t :message •

    I18n.t 'message' • I18n.t :invalid, :scope => [:activerecord, :errors, :messages] • I18n.translate :"activerecord.errors.messages.invalid" • I18n.t :missing, :default => 'Not here' • I18n.t :missing, :default => :other_key • I18n.t :missing, :default => [:also_missing, 'Not here']
  9. 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 => "%a, %d %b %Y")
  10. Плюрализация • В SimpleBackend «зашита» на правила английского языка •

    I18n.t :key, :count => 1 (2, 3, ..) • SimpleBackend: pluralize возвращает ключ, по которому происходит поиск, например, :’key.one’ или :’key.many’.
  11. 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!
  12. ActiveRecord • Перевод всех сообщений для валидации (для подстановки доступны

    макросы {{model}}, {{attribute}}, {{value}}, иногда {{count}}) • Оверрайд ошибок для каждой конкретной модели и каждого атрибута • Перевод Model.human_name — названия модели. • Перевод Model.human_attribute_name — названия атрибута модели
  13. 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
  14. Проблемы • Поддержка «экзотических» языков никого не волновала — русский

    оказался «экзотическим» • Нет поддержки двух форм названий месяцев (августа/Август) • Для поддержки других механизмов плюрализации предлагалось писать бекэнд • В Rails были включены не все нужные для нормальной локализации функции • Unicode CLDR — оказалось слишком сложно на первом этапе, хотя там есть все что нужно
  15. Соглашение по Rails I18n • gem i18n и поддержка I18n

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

    • Цель: сначала сделать полную поддержку русского языка, потом сделать так чтобы она входила в core. Минимум хаков, обратная совместимость (никак не сломать I18n и существующие методы — например, ни в коем случае не перегружать strftime). • gem install russian, http://github.com/yaroslav/russian • Появился 1 сентября, к началу RailsConf EU и уже фигурировал в слайдах на первой презентации Rails I18n (Sven Fuchs)
  17. Содержимое gem russian • gem i18n в vendor/. Можно использовать

    как плагин к Rails (где уже есть I18n) или как отдельный gem. • Собственный бекэнд (AdvancedBackend — поддержка двух форм названий месяцев и плюрализации, задаваемой как lambda в файле переводов) • Хаки для Rails (Дата-время, форматирование сообщений валидации, плагин i18n-label) • Хелперы в модуле Russian — полезны если в приложении используется только русский язык • Набор переводов для русского языка (само собой разумеется)
  18. Что происходит при инициализации russian • Заменяется бэкэнд I18n со

    стандартного на собственный бекэнд Russian (I18n::Backend::Advanced) • Локаль русского языка (:'ru') становится локалью по умолчанию • Загружаются все файлы переводов для русского языка, в том числе переводы для Rails.
  19. Модуль 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 — транслитерация
  20. russian и Rails • Переводы для русского языка • DateTime

    helpers: ключ :use_standalone_month_name для второй формы названия месяца, автоопределение (если :select_month используется отдельно или есть :discard_day) • i18n_label: для хелпера label используются переводы (этого все еще нет в Rails) • Включен известный хак для сообщений валидации (“^” в начале строки не будет выводить имя атрибута в error_messages_for) • Метод parameterize обучен русскому языку — теперь легко делать пермалинки из русских букв (“Всем привет!”.parameterize вернет “vsem-privet”)
  21. I18n::* vs Russian::* • russian полностью обратно совместим с I18n

    • Пользуйтесь I18n.l, I18n.t для мультиязычных проектов • Russian — набор шорткатов (strftime, pluralize) и специфичных (translit) методов. Хорош для проектов полностью на русском. • Франзузу не нужно писать gem french, украинцу — gem ukrainian. Полная совместимость бекендов, просто включены все возможности для поддержки русского — не в ущерб другим языкам.
  22. Что дальше • 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 почти не начиналась но очень нужна