r18n
DESCRIPTION
R18n is an tool to internationalize and localize your Rails, Sinatra or desktop Ruby application.TRANSCRIPT
R18n — i18n для Ruby и Rails
Андрей Ситник, Evil Martianssitnik.ru
О чём речь
I18n, internationalization, интернационализция — когда в программе можно переключить язык (делается разработчиком)
l10n, localization, локализация — перевод программы на какой-то язык (делается переводчиком)
i18n● Перевод интерфейса
t('products.robots.title') → Покупайте роботов | Buy robots
● Локализация дат и чисел l product.created_at → 15.09.2010 | 09/15/2010
● Перевод данных в БД product.title → Робот | Robot
Зачем
● Model — View — Controller — Translations● проще менять термин● проверять орографию● плюрализация («1 робот», «2 робота», «5 роботов»)
● Развивать свой язык, чтобы он стал таким же удобным, как английский
● Английский далеко и самый удобный и функциональный (см. Эсперанто, Ифкуиль)
R18n
r18n-core
sinatra-r18nr18n-desktop
r18n-railsr18n-rails-api
Веб-приложение на SinatraПриложение длярабочего стола
Веб-приложение на Ruby on Rails
Отдельно разрабатываютсяRack и Merb
R18n Rails I18n↔
● Появились в одно и то же время● Отличия в идеологии и архитектуре● R18n полностью совместим с Rails I18n
Синтаксис
/config/locales/ru.yml
ru: hello: world: Привет, мир
/app/view/index.html.erb
t('program.name')
/app/i18n/ru.yml
hello: world: Привет, мир
/app/view/index.html.erb
t.program.name
R18n
Rails I18n
Переменные
hello: Привет, %{name}
t('hello', :name => 'Иван')
hello: Привет, %1
t.hello('Иван')R18n
I18n
Плюрализация
robots: one: %{count} робот few: %{count} робота many: %{count} роботов
t('robots', :count => @robots.count)
robots: !!pl # ← задаётся явно 1: %1 робот # с помощью YAML-типа 2: %1 робота n: %1 роботов
t.robots(@robots.count)R18n
I18n
Перевод моделейclass Product include DataMapper::Resource property :title_ru, String property :title_en, String include R18n::Translated translations :titleend
Переводить можно любой класс, включаяActiveRecord, DataMapper, MongoMapper и т. д.
Загрузчики переводаclass DBLoader def available Translation.find(:all).map(&:locale) end def load(locale) Translation.find(locale).to_hash endend
set :translations, [DBLoader.new, '/path/to/dir/']
Фильтры● Можно установить фильтр для:
● YAML-типа, например, !!pl● Любых возвращаемых строк● Случая, когда перевод не был найден.
Например, чтобы записывать в лог в production и выводить красным в development
● Фильтры идут каскадом● Фильтры можно динамически
включать/выключать
Пример фильтраРазные строки, в зависимости от пола пользователя:
friendship: !!gender f: She adds a friend m: He adds a friend R18n::Filters.add('gender') do |value, c, user| if user.female? value['f'] else value['m'] endend
t.friendship(@user)
Фильтры из коробки
● Экранирование HTML
R18n::Filters.on(:global_escape_html)
● Markdown и Textile
help: !!markdown ## Help **Note:** read docs before work
● Лямбда-функция
Всё на фильтрах
● Переменные (%1) — глобальный фильтр
● Плюрализация — тоже фильтр для !!pl
● Совместимость с Rails — просто набор нужных фильтров
Вопросы?
r18n.rubyforge.org
twitter.com/andrey_sitnik