【问题标题】:Different translations per environment每个环境的不同翻译
【发布时间】:2015-11-06 02:15:46
【问题描述】:

我希望某些翻译根据环境具有不同的值。

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

为了实现这一点,我可以想象几种方法:

  • 能够在 en.yml 中嵌入 ERB
  • 能够创建每个环境的语言环境文件,例如en.test.yml
  • 能够直接设置条目:I18n.set('foo', 'bar') if Rails.env.test?

但是我找不到任何可以使用的解决方案。

有吗?

【问题讨论】:

    标签: ruby-on-rails internationalization rails-i18n


    【解决方案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')
    

    【讨论】:

    • 一般来说这不是一个好的解决方案 - 它不允许使用每个 env 值覆盖任意键。
    • 然后看看pluralization rules——可能是Ruby on Rails允许另一个翻译规则,而不仅仅是复数?
    • 感谢您指出正确的方向。 I18n.backend.store_translations 允许以一种依赖于环境的方式覆盖条目,如果你愿意的话。将其添加到您的答案中,我会接受它:)
    【解决方案2】:

    聚会迟到了。我创建了一个通过使用环境变量来做到这一点的 gem。 i18n-env-var-lookup 。您可以将它与环境变量加载器结合使用,例如dotenv-rails

    我的具体用例有点独特。在我们的组织中,我们有一个现有的 Rails 应用程序,我们想为组织中另一个团队的另一个项目“贴上白标签”。我们希望为两个项目共享相同的源代码存储库,而只更改站点名称。鉴于语言环境文件中已经有数千个条目,其中近百个包含站点名称,因此更新所有模板以将站点名称作为变量传递将是一个不好的做法。我们在相关问题中找到的其他建议对我们的案例也没有好处。我们希望两个项目的语言环境文件完全相同,这样我们就可以避免混淆源代码并使用 3rd 方本地化服务轻松管理语言环境文件。

    因此我们转向实现 gem,它解决了我们的确切问题。

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      相关资源
      最近更新 更多