在Rails中临时禁用i18n回退

9

加载了I18n回退:

 I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)

你知道如何临时禁用它吗?我有一些表单,想要编辑不同语言版本,在启用回退的情况下,如果没有给定翻译,我会得到默认语言的字段。

4个回答

4
你可以给 I18n.t 传递 fallback: true 选项,这将防止 I18n 查找其他语言环境 (请查看实现代码)。但这可能不是公共 API 的一部分...

fallback: false 对我起作用了。 - Janosch

2

您可以在I18n.translate调用时传入:fallback => 'false',但这不是公共API的一部分。

另一种方法是尝试以下操作:

I18n.available_locales.each do
  |al| I18n.fallbacks.merge!({al => [al]})
end

这将使得每个可用的语言环境的备选项只包含其本身。因此,如果在当前语言环境中找不到翻译,则没有其他回退选项。
然而,您需要找到一种恢复默认回退选项的方法。
例如,您可以使用以下语句进行恢复:
I18n.available_locales.each do
  |al| I18n.fallbacks.merge!({al => [al, I18n.default_locale]})
end

1
如果有人仍然想知道如何做到这一点,您可以即时更改I18n.fallbacks
def foo
  I18n.fallbacks[:at] = [:at]
  # do stuff with I18n#t
ensure
  I18n.fallbacks[:at] = [:at, :de] # or whatever is was before
end

不确定那有多安全。

0
你是否在使用globalize?
我在我的系统字符串中使用I18n回退,以及在我的属性翻译中使用globalize3。我希望系统字符串可以回退,但属性不行。我只需进行了一个小的monkey patch来禁用globalize的回退:

config/initializers/i18n.rb:

require "i18n/backend/fallbacks" 
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)

# monkey patch globalize3 to not use fallbacks
module Globalize
  def self.fallbacks?
    false
  end
end

使用 globalize-6.x,我能够通过公共API 使用特定的语言环境 - x-yuri

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