Различные переводы в зависимости от среды

Я бы хотел, чтобы некоторые переводы имели разные значения в зависимости от среды.

Rails.env.test? && I18n.t('foo') # => 'A value'
Rails.env.development? && I18n.t('foo') # => 'A different value'

Для этого я могу представить несколько подходов:

  • Возможность встраивания ERB в en.yml
  • Возможность создавать файлы локали для каждой среды, например. en.test.yml
  • Возможность напрямую установить запись: I18n.set('foo', 'bar') if Rails.env.test?

Однако я не смог найти ни одного из этих решений, готовых к использованию.

Есть ли один?


person deprecated    schedule 06.11.2015    source источник


Ответы (1)


Я думаю, что вам нужно что-то вроде этого:

en.production.yml:

en:
  production:
    foo: "Foo"
    bar: "Bar"

en.development.yml:

en:
  development:
    foo: "foo"
    bar: "bar"

en.test.yml:

en:
  test:
    foo: "-foo-"
    bar: "-bar-"

и использование представлений и контроллеров:

I18n.t("#{Rails.env}.foo")
I18n.t("#{Rails.env}.bar")


Обновление:

Если Вам просто нужно подставить переменные для перевода, используйте интерполяцию:

en.yml:

en:
  foo: "Foo %{variable}"
  bar: "%{var} Bar"

и используя:

I18n.t('foo', :variable => 'Bar')
I18n.t('bar', :var => 'Foo')
person General Failure    schedule 07.11.2015
comment
В целом это не очень хорошее решение - оно не позволяет переопределять произвольные ключи значениями для каждой среды. - person deprecated; 07.11.2015
comment
Тогда посмотрите правила множественного числа — возможно, Ruby on Rails допускает другие правила перевода, не только для множественное число? - person General Failure; 07.11.2015
comment
Спасибо, что указали правильное направление. I18n.backend.store_translations позволяет переопределять записи зависимым от среды способом, если это необходимо. Добавьте это к своему ответу, и я приму это :) - person deprecated; 07.11.2015