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