SlideShare ist ein Scribd-Unternehmen logo
1 von 31
Downloaden Sie, um offline zu lesen
Интернационализация и
локализация 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"
}
}
}
Файл переводов: .yaml
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: Плюрализация (lambda)
Модуль 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 почти не начиналась но очень нужна
Вопросы?
• yaroslav@markin.net
• twitter.com/yaroslav
• github.com/yaroslav
• http://evilmartians.ru

Weitere ähnliche Inhalte

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

Multilangaunguage Drupal
Multilangaunguage DrupalMultilangaunguage Drupal
Multilangaunguage Drupal
Inna Tuyeva
 
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Ontico
 
Не превращайте ваши логи в клинопись
Не превращайте ваши логи в клинописьНе превращайте ваши логи в клинопись
Не превращайте ваши логи в клинопись
Andrey Rebrov
 
Go для python-программистов
Go для python-программистовGo для python-программистов
Go для python-программистов
Konstantin Cherkasov
 
Multilanguage Drupal
Multilanguage DrupalMultilanguage Drupal
Multilanguage Drupal
Inna Tuyeva
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
Alex Chistyakov
 
Alex Dmitriev презентация для рит (12 14 апреля)
Alex Dmitriev презентация для рит (12 14 апреля)Alex Dmitriev презентация для рит (12 14 апреля)
Alex Dmitriev презентация для рит (12 14 апреля)
rit2010
 
To Go или не to Go
To Go или не to GoTo Go или не to Go
To Go или не to Go
Ivan Zezyulya
 

Ähnlich wie Интернационализация и локализация Ruby on Rails. gem russian (20)

Как сделать контрибут в Ruby on Rails
Как сделать контрибут в Ruby on RailsКак сделать контрибут в Ruby on Rails
Как сделать контрибут в Ruby on Rails
 
Интернационализация проекта. Михаил Шилов
Интернационализация проекта. Михаил ШиловИнтернационализация проекта. Михаил Шилов
Интернационализация проекта. Михаил Шилов
 
R18n
R18nR18n
R18n
 
Multilangaunguage Drupal
Multilangaunguage DrupalMultilangaunguage Drupal
Multilangaunguage Drupal
 
python vs ruby
python vs rubypython vs ruby
python vs ruby
 
Open Source − это не больно (Сергей Нартымов)
Open Source − это не больно (Сергей Нартымов)Open Source − это не больно (Сергей Нартымов)
Open Source − это не больно (Сергей Нартымов)
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
 
My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014
 
Не превращайте ваши логи в клинопись
Не превращайте ваши логи в клинописьНе превращайте ваши логи в клинопись
Не превращайте ваши логи в клинопись
 
Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...
Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...
Как сделать сложное простым. История создания Проект1917 / Сергей Спорышев (I...
 
I18n ruby-приложений
I18n ruby-приложенийI18n ruby-приложений
I18n ruby-приложений
 
Go для python-программистов
Go для python-программистовGo для python-программистов
Go для python-программистов
 
Multilanguage Drupal
Multilanguage DrupalMultilanguage Drupal
Multilanguage Drupal
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 
DLR Hosting
DLR HostingDLR Hosting
DLR Hosting
 
Alex Dmitriev презентация для рит (12 14 апреля)
Alex Dmitriev презентация для рит (12 14 апреля)Alex Dmitriev презентация для рит (12 14 апреля)
Alex Dmitriev презентация для рит (12 14 апреля)
 
мир без Jsp. thymeleaf 2.0
мир без Jsp. thymeleaf 2.0мир без Jsp. thymeleaf 2.0
мир без Jsp. thymeleaf 2.0
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
 
To Go или не to Go
To Go или не to GoTo Go или не to Go
To Go или не to Go
 

Mehr von Александр Ежов

Mehr von Александр Ежов (20)

Кеширование данных в БД
Кеширование данных в БДКеширование данных в БД
Кеширование данных в БД
 
Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015
 
Rails 5: awesome features and breaking changes
Rails 5: awesome features and breaking changesRails 5: awesome features and breaking changes
Rails 5: awesome features and breaking changes
 
Big Data и Ruby
Big Data и RubyBig Data и Ruby
Big Data и Ruby
 
Abstract machines for great good
Abstract machines for great goodAbstract machines for great good
Abstract machines for great good
 
Rubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секундуRubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секунду
 
Liquor, Liquid и другие безопасные языки разметки в RoR
Liquor, Liquid и другие безопасные языки разметки в RoRLiquor, Liquid и другие безопасные языки разметки в RoR
Liquor, Liquid и другие безопасные языки разметки в RoR
 
Vim or die
Vim or dieVim or die
Vim or die
 
Capistrano Rails
Capistrano RailsCapistrano Rails
Capistrano Rails
 
Умное кэширование в Rails
Умное кэширование в RailsУмное кэширование в Rails
Умное кэширование в Rails
 
Sphinx как база данных
Sphinx как база данныхSphinx как база данных
Sphinx как база данных
 
Emacs и Rails
Emacs и RailsEmacs и Rails
Emacs и Rails
 
Антикризисная презентация
Антикризисная презентацияАнтикризисная презентация
Антикризисная презентация
 
Eventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийEventmachine: структура evented-приложений
Eventmachine: структура evented-приложений
 
Дэдлоки
ДэдлокиДэдлоки
Дэдлоки
 
Обзорное сравнение серверов приложений для Rails
Обзорное сравнение серверов приложений для RailsОбзорное сравнение серверов приложений для Rails
Обзорное сравнение серверов приложений для Rails
 
Приложения в плагинах
Приложения в плагинахПриложения в плагинах
Приложения в плагинах
 
Использования PgQ и Londste в rails-приложении
Использования PgQ и Londste в rails-приложенииИспользования PgQ и Londste в rails-приложении
Использования PgQ и Londste в rails-приложении
 
Масштабирование в Rails
Масштабирование в RailsМасштабирование в Rails
Масштабирование в Rails
 
Проблемы при работе с разными версиями Ruby и разными gem
Проблемы при работе с разными версиями Ruby и разными gemПроблемы при работе с разными версиями Ruby и разными gem
Проблемы при работе с разными версиями Ruby и разными gem
 

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

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