Share
Embed
Интернационализация и локализация Ruby on Rails. gem russian
Интернационализация и локализация Ruby on Rails. gem russian
Москва, апрель 2009, RailsClub.ru
Yaroslav Markin
November 07, 2011
Transcript
31 slides
-
Интернационализация и локализация 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 => "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 :"activerecord.errors.messages.invalid" • 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 => "%a, %d %b %Y") -
Интерполяция • 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.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 почти не начиналась но очень нужна