Ruby on rails 在Rails中临时禁用i18n回退

Ruby on rails 在Rails中临时禁用i18n回退,ruby-on-rails,internationalization,ruby-on-rails-3,globalize2,Ruby On Rails,Internationalization,Ruby On Rails 3,Globalize2,已加载I18n回退: I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks) 现在有临时禁用它的想法吗?我有一些表单,我想在其中编辑各种语言版本,如果给定的翻译还不存在,我将使用默认语言获取字段。是否使用globalize 我将I18n回退用于我的系统字符串,globalize3用于我的属性转换。我希望系统字符串回退,但不希望属性回退。我只是通过一个小的monkey补丁禁用了globalize的回退: config/ini

已加载I18n回退:

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

现在有临时禁用它的想法吗?我有一些表单,我想在其中编辑各种语言版本,如果给定的翻译还不存在,我将使用默认语言获取字段。

是否使用globalize

我将I18n回退用于我的系统字符串,globalize3用于我的属性转换。我希望系统字符串回退,但不希望属性回退。我只是通过一个小的monkey补丁禁用了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

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

您可以在
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

如果仍有人想知道如何执行此操作,您可以动态更改
I18n.回退

def foo
  I18n.fallbacks[:at] = [:at]
  # do stuff with I18n#t
ensure
  I18n.fallbacks[:at] = [:at, :de] # or whatever is was before
end
但我不确定这有多安全