9

例如,我有一个默认的英语语言环境文件“en.yml”,其内容:

 en:
  messages: messages
  users: users

现在,有一位客户希望在他的产品中将消息命名为讨论,但用户应该仍然是用户。所以我想做的是创建“customer.en.yml”文件

en:
 messages: discussions

这将覆盖默认的“消息”翻译,但会保持所有其他单词相同。我怎样才能实现它?

因为如果我加载 en.yml :

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

然后用

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

它只会覆盖我的“en”语言环境,“users”翻译会消失,对吗?

4

4 回答 4

7

使用 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",
}

如果您还设置config.action_view.raise_on_missing_translations = true(我在开发和测试中这样做),它只会在未在语言环境后备中找到密钥时引发。

于 2015-08-27T15:48:22.143 回答
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

如您所见,只有您在后一个翻译 yml 文件中输入的键会被覆盖。

于 2009-12-03T14:10:41.233 回答
1

当我们编写 pirate.yml 翻译时,我想要类似的东西,但我希望 pirate.yml 中未定义的任何内容都默认为 en.yml 中的内容。

我写的可以在Github上找到。

于 2009-12-03T19:13:33.810 回答
-2

我想你可能混淆了两种不同的东西。

i18n 文件用于翻译。

如果您的客户需要某个字段的特定名称,那不是翻译问题,而是功能问题。

换句话说,我认为你需要这样的东西:

 en:
   messages: messages
   users: users
   discussions: discussions

然后在其他地方添加特定功能,例如在您的视图中:

if(customer.needs_discussions?)
<%= t(:discussions) %>
else
<%= t(:messages) %>
end

或者,您可以为您的客户添加一个字符串属性,默认为“消息”。然后您的视图将如下所示:

<%= t(customer.messages_field_name) %>
于 2009-12-03T22:27:31.497 回答