Rails I18n多个文件别名

时间:2011-01-31 01:08:11

标签: ruby-on-rails internationalization locale yaml

我想知道是否可能有多个语言环境文件,可能在目录中组织并仍然使用YAML别名,例如:

在一个公共文件中:

# config/locales/common/en.yml
en:
  first_name: &first_name "First name"
  last_name: &last_name "Last name"

并在更具体的文件中:

# config/locales/models/user/en.yml
en:
  helpers:
    label:
      user:
        first_name: *first_name
        last_name: *last_name

这有助于最大限度地减少翻译和翻译的变化。在我的rails配置中,我将其设置为加载子目录中的所有语言环境文件。此设置对我不起作用,我加载页面时出现错误的别名错误。

我尝试使用一个init脚本将所有en.yml编译成一个并只使用那个文件,别名可以正常工作,但我不能让键合并。例如,如果我在其他文件中有另一个“帮助者”,它只使用最后指定的内容(事实上,“en”也会被覆盖),而不是合并键。

还是有更好的模式吗?非常感谢你!

3 个答案:

答案 0 :(得分:6)

组织区域设置的默认模式如下所示:

http://guides.rubyonrails.org/i18n.html#organization-of-locale-files

答案 1 :(得分:6)

尝试使用 application.rb 默认值* config.i18n.load_path *参数替换:

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

它对我有用。

答案 2 :(得分:6)

据我了解,您希望拥有多个.yml文件,并且仍然具有合并功能。

不幸的是,这是不可能的,因为Rails的工作方式。

技术背景:

有两个重要步骤由两个未连接的系统执行:

  • 使用 YAML库单独加载每个.yml文件。这就是解决锚和别名的地方。此步骤中不允许重复节点,即每个节点都会覆盖具有相同名称和父节点的上一个节点。
  • 然后使用Ruby将生成的哈希值与 Rails 合并。这就是YAML节点合并的地方,允许从不同的文件复制

这就是锚和别名不能跨越多个文件的原因。另一方面,您获得了YAML不支持的整洁合并功能。

换句话说:将所有内容编译成一个巨大的文件,您将获得“全局别名”功能,但是您将失去合并功能。您可以拥有一个或另一个,但不能同时拥有两个。在可维护性方面,多文件方法肯定更令人愉快。


PS:当然,你的例子中的复制也让我感到畏缩,但最好是专注于 DRY键和一个好的键结构而不是 DRY翻译

这是因为翻译经常会在时间上发生变化:在应用程序发展之后,应用程序早期阶段的相同内容可能略有不同。也许在某些地方它必须是“名字”而在另一个地方它必须是“请输入你的名字”。

我也可以想象,对于与英语无关的语法和其他语境,使用“主翻译”并不适用于所有语言。

所以我个人的建议是:坚持使用Rails建议的方法(即多个文件)并忽略一些不可避免的重复。