rails - 如何动态添加/覆盖对i18n yaml的措辞

Pav*_* K. 8 yaml ruby-on-rails internationalization

作为一个例子,我有一个默认的英语语言环境文件"en.yml"与内容:

 en:
  messages: messages
  users: users
Run Code Online (Sandbox Code Playgroud)

现在,有一个客户希望在他的产品中将消息命名为讨论,但用户应该保留用户.所以我想要做的是创建"customer.en.yml"文件

en:
 messages: discussions
Run Code Online (Sandbox Code Playgroud)

这将覆盖默认的"消息"翻译,但会保持所有其他单词相同.我怎么能实现它?

因为如果我加载en.yml:

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'locales', '*.{rb,yml}')] 
Run Code Online (Sandbox Code Playgroud)

然后加载customer.en.yml(APP_CONFIG ['customer_name']在之前定义)with

config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'custom_locales',  APP_CONFIG['customer_name']+'.{rb|yml}')]
Run Code Online (Sandbox Code Playgroud)

它只会覆盖我的"en"语言环境,"用户"翻译会消失,对吗?

Nat*_*ong 6

使用i18n.fallbacks

我不确定这是什么时候添加到Rails,但是在4.2.2中你可以这样做:

# application.rb
# If key is not found in a locale, we look in fallback
config.i18n.fallbacks = {
  "locale_1"    => "en",
  "locale_2"    => "en",
  "locale_3"    => "de",
}
Run Code Online (Sandbox Code Playgroud)

如果你也设置了config.action_view.raise_on_missing_translations = true(我在开发和测试中做),只有在语言环境后备中找不到键时才会引发.


Cli*_*ach 3

它不应覆盖您的“en”区域设置。翻译已合并。store_translations在简单的 I18n 后端调用中merge_translations,如下所示:

# Deep merges the given translations hash with the existing translations
# for the given locale
def merge_translations(locale, data)
  locale = locale.to_sym
  translations[locale] ||= {}
  data = deep_symbolize_keys(data)

  # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
  merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
  translations[locale].merge!(data, &merger)
end
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,只有您在后一个翻译 yml 文件中输入的密钥才会被覆盖。