r18n

16
R18n — i18n для Ruby и Rails Андрей Ситник, Evil Martians sitnik.ru

Upload: andrey-sitnik

Post on 05-Dec-2014

2.495 views

Category:

Technology


0 download

DESCRIPTION

R18n is an tool to internationalize and localize your Rails, Sinatra or desktop Ruby application.

TRANSCRIPT

Page 1: R18n

R18n — i18n для Ruby и Rails

Андрей Ситник, Evil Martianssitnik.ru

Page 2: R18n

О чём речь

I18n, internationalization, интернационализция — когда в программе можно переключить язык (делается разработчиком)

l10n, localization, локализация — перевод программы на какой-то язык (делается переводчиком)

Page 3: R18n

i18n● Перевод интерфейса

t('products.robots.title') → Покупайте роботов | Buy robots

● Локализация дат и чисел l product.created_at → 15.09.2010 | 09/15/2010

● Перевод данных в БД product.title → Робот | Robot

Page 4: R18n

Зачем

● Model — View — Controller — Translations● проще менять термин● проверять орографию● плюрализация («1 робот», «2 робота», «5 роботов»)

● Развивать свой язык, чтобы он стал таким же удобным, как английский

● Английский далеко и самый удобный и функциональный (см. Эсперанто, Ифкуиль)

Page 5: R18n

R18n

r18n-core

sinatra-r18nr18n-desktop

r18n-railsr18n-rails-api

Веб-приложение на SinatraПриложение длярабочего стола

Веб-приложение на Ruby on Rails

Отдельно разрабатываютсяRack и Merb

Page 6: R18n

R18n Rails I18n↔

● Появились в одно и то же время● Отличия в идеологии и архитектуре● R18n полностью совместим с Rails I18n

Page 7: R18n

Синтаксис

/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

Page 8: R18n

Переменные

hello: Привет, %{name}

t('hello', :name => 'Иван')

hello: Привет, %1

t.hello('Иван')R18n

I18n

Page 9: R18n

Плюрализация

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

Page 10: R18n

Перевод моделейclass Product include DataMapper::Resource property :title_ru, String property :title_en, String include R18n::Translated translations :titleend

Переводить можно любой класс, включаяActiveRecord, DataMapper, MongoMapper и т. д.

Page 11: R18n

Загрузчики перевода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/']

Page 12: R18n

Фильтры● Можно установить фильтр для:

● YAML-типа, например, !!pl● Любых возвращаемых строк● Случая, когда перевод не был найден.

Например, чтобы записывать в лог в production и выводить красным в development

● Фильтры идут каскадом● Фильтры можно динамически

включать/выключать

Page 13: R18n

Пример фильтраРазные строки, в зависимости от пола пользователя:

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)

Page 14: R18n

Фильтры из коробки

● Экранирование HTML

R18n::Filters.on(:global_escape_html)

● Markdown и Textile

help: !!markdown ## Help **Note:** read docs before work

● Лямбда-функция

Page 15: R18n

Всё на фильтрах

● Переменные (%1) — глобальный фильтр

● Плюрализация — тоже фильтр для !!pl

● Совместимость с Rails — просто набор нужных фильтров

Page 16: R18n

Вопросы?

r18n.rubyforge.org

twitter.com/andrey_sitnik