Detection

Avoiding the Tar Pits of Localization with Jeff Casimir

  • Geo-location
  • Browser preferences
  • URL parameters
  • Account preferences
  • Default settings

No gettext

I18n by Sven Fuchs

svenfuchs/i18n

gem 'i18n'
I18n.locale = :ru

Features

YAML

Keys

Scopes

Interpolation

Transliteration

Pluralization

l10n

YAML

# config/locales/ru.yml
ru:
  title: Интернационализация
  statuses:
  - Активные
  - Отключённые
  - Архив

# app/views/my_view.html.slim
= t('title')                # -> Интернационализация
= t('statuses')[0]          # -> Активные
= t('statuses').join(', ')  # -> Aктивные, Отключённые, Архив

Keys

# config/locales/ru.yml
ru:
  statuses: &statuses_hash
    active: Активные
    disabled: Отключённые
    archived: Архив

  new_statuses:
    <<: *statuses_hash
    additional: Дополнительные

# app/views/my_view.html.slim
= t('statuses.active')            # -> Активные
= t('statuses').values.join(', ') # -> Aктивные, Отключённые, Архив

And scopes

# app/views/my_view.html.slim
- current_status = 'active'
= t("statuses.#{current_status}")           # -> Активные
= t(['statuses', current_status].join('.')) # -> Активные
= t(current_status, scope: 'status')        # -> Активные

Interpolation

# config/locales/ru.yml
ru:
  error:
    title: 'Опаньки, ошибочка вышла.'
    description: "Вот такая: '%{error_name}' c кодом %{error_code}."

# app/views/my_view.html.slim
= t('error.type')         # -> Опаньки, ошибочка вышла.
= t('error.description', error_name: 'Ошибка сервера', error_code: 500)
# -> "Вот такая: 'Ошибка сервера' c кодом 500."

Interpolation

# config/locales/ru.yml
ru:
  error:
    title: 'Опаньки, ошибочка вышла.'
    description: "Вот такая: '%{error_name}' c кодом %{error_code}."
  errors:
    server: Ошибка сервера

# app/views/my_view.html.slim
= t('error.type')         # -> Опаньки, ошибочка вышла.
= t('error.description', error_name: t('errors.server'), error_code: 500)
# -> "Вот такая: 'Ошибка сервера' c кодом 500."

Transliteration

# config/locales/ru.yml
i18n:
  transliterate:
    rule:
      ю: "yu"
      я: "ya"

# app/views/my_view.html.slim
= I18n.transliterate('Коля') # -> Kolya

Pluralization

# config/locales/ru.yml
ru:
  statuses:
  - "%{count} статус"
  - "%{count} статусов"

# app/views/my_view.html.slim
= t('statuses', count: 1) # -> 1 статус
= t('statuses', count: 5) # -> 5 статусов

LAMBDAS!!!

# config/locales/ru.yml
ru:
  salutation: lambda { |key, options| options[:gender] == 'm' ? "Г-н %{options[:name]}" : "Г-жа %{options[:name]}" }

# app/views/my_view.html.slim
= t('salutation', gender: 'm', name: 'Кугаевский') # -> Г-н Кугаевский

l10n - date

# config/locales/datetime.yml
ru:
  date:
    formats:
      default: "%d.%m.%Y"
      short: "%d %b"
      long: "%d %B %Y"

# app/views/my_view.html.slim
- current_date = Date.new

= l(current_date)                 # -> 18.03.2017
= l(current_date, format: 'long') # -> 18 марта 2017

l10n - time

# config/locales/datetime.yml
ru:
  time:
    formats:
      default: "%e %B %Y %H:%M"
      full: "%e %B %Y %H:%M:%S"

# app/views/my_view.html.slim
- current_time = DateTime.new

= l(current_time)                 # -> 18 марта 2017 15:01
= l(current_time, format: 'full') # -> 18 марта 2017 15:01:59