Rails 5:如何从另一个yaml配置文件中引用I18n翻译?

3

我有一个配置文件:

# 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键?


也许您可以使用别名节点来引用先前定义的锚点。或者通过erb手动解析文件,参见YAML with erb is not parsing - Stefan
顺便说一下,假设您有多个语言环境,例如 locales/en.ymllocales/de.yml。您是否期望 META['base_meta']['title'] 返回当前选择的语言环境的值还是静态值,例如 en 的值? - Stefan
它应该返回特定于当前语言环境的值。 - user3574603
1
在这种情况下,erb不是一个选项——它会插入应用程序默认语言环境的值。YAML别名也不行,因为它不具备语言环境意识。那么,在你的YAML文件中插入I18n键怎么样?比如title:title,然后在运行时通过t(META['base_meta']['title'])检索其值? - Stefan
是的,这听起来像是更好的方法。 - user3574603
2个回答

5

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

# 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"

-1

尝试将application.rb中config.i18n.load_path参数的默认值替换为以下内容:

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

对我来说可以正常运行。


问题不在于加载文件,而在于文件中引用I18n值。 - Stefan
重新启动应用程序。 - sam
请再次阅读问题,这也不是问题。 - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接