【问题标题】:Rails 5: How do I reference I18n translations from another yaml config file?Rails 5:如何从另一个 yaml 配置文件中引用 I18n 翻译?
【发布时间】:2019-04-26 09:02:53
【问题描述】:

我有一个配置文件:

# config/meta.yml
base_meta:
  title: 'Top 10 Cats'

它有一个对应的初始化器:

# config/initializers/meta.rb
META = YAML.load_file("#{Rails.root.to_s}/config/meta.yml")

我可以像这样访问标题:

META['base_meta']['title'] #=> "Top 10 Cats"

但是,我想国际化我的元数据。我相信这应该由现有的locales/ yaml 文件来处理。

如何引用现有的翻译?

# config/locales/en.yml
en:
  title: 'Top 10 Cats'

我试过用erb,但是不行:

# config/meta.yml
base_meta:
  title: t(:title)

将文件重命名为config/meta.yml.erb 也无效。

有没有办法从我的配置文件中引用 I18n 键?

【问题讨论】:

  • 也许您可以使用alias node 来引用先前定义的锚点。或者通过erb手动解析文件,见YAML with erb is not parsing
  • 顺便说一句,假设您有多个语言环境,例如locales/en.ymllocales/de.yml。您是否希望 META['base_meta']['title'] 返回当前所选语言环境的值或静态值,例如en 一个?
  • 它应该返回特定于当前语言环境的值。
  • 在这种情况下,erb 不是一个选项——它会插入应用程序默认语言环境的值。 YAML 别名也不是,因为它不支持语言环境。在你的 YAML 文件中插入 I18n 键,即title: title,并在运行时通过t(META['base_meta']['title']) 检索它的值呢?
  • 是的,这听起来是一个更好的方法。

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


【解决方案1】:

您可以在 YAML 文件中为现有翻译添加 key,而不是它的值:

# config/locales/en.yml
en:
  cats:
    title: 'Top 10 Cats'

# config/locales/de.yml
de:
  cats:
    title: 'Top 10 Katzen'

# config/meta.yml
base_meta:
  title: 'cats.title'

所以它只返回那个键:

META['base_meta']['title'] #=> "cats.title"

然后可以将其传递给I18n.t

I18n.locale = :en

t(META['base_meta']['title']) #=> "Top 10 Cats"

I18n.locale = :de

t(META['base_meta']['title']) #=> "Top 10 Katzen"

【讨论】:

    【解决方案2】:

    尝试将 config.i18n.load_path 参数的 application.rb 默认值替换为:

    config.i18n.load_path += Dir[Rails.root.join('config/locales/**/*.yml').to_s]
    

    它对我有用。

    【讨论】:

    • 问题不是加载文件而是引用文件中的 I18n 值。
    • 重启应用。
    • 再读一遍问题,这也不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多