在Rails中临时禁用i18n后退

时间:2010-09-10 07:13:41

标签: ruby-on-rails internationalization ruby-on-rails-3 globalize2

I18n后备已加载:

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

现在有什么想法暂时禁用它吗?我有表单,我想要编辑各种语言版本,并且如果给定的翻译尚未出现,我将使用默认语言获取字段。

4 个答案:

答案 0 :(得分:4)

您可以将fallback: true选项传递给I18n.t,这会阻止I18n查找其他区域设置(see implementation here)。但它可能不是公共API的一部分...

答案 1 :(得分:2)

您可以在:fallback => 'false'来电时传递I18n.translate,但这不是公开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

答案 2 :(得分: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

不确定那是多么安全。

答案 3 :(得分:0)

您使用全球化吗?

我正在使用I18n后备作为我的系统字符串,而globalize3则用于我的属性翻译。我想要系统字符串回退,但不是属性。我只是通过一个小猴子补丁来禁用全局化的后备:

配置/初始化/ 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