Rails 5中i18n globalize回退机制是否为无效操作?
问题拆解与解决方案
看起来你在两个不同Rails版本的应用中配置config.i18n.fallbacks = true后,遇到了不一致的行为,我来帮你理清楚背后的原因和解决办法:
一、Rails 4.2.4 + Globalize 场景的逻辑
这个版本的核心变量是你引入了globalize gem,这直接影响了I18n fallback的表现:
- 你提到
Rails.application.config.i18n.fallbacks返回nil,这大概率是配置加载顺序导致的——Globalize的初始化逻辑可能在你的application.rb配置之后运行,或者它直接接管了fallback的配置管理,导致原生Rails配置没被正确读取。 Globalize.fallbacks = [:de]说明Globalize已经生成了德语的fallback规则,而I18n.fallbacks = { :de => [:de] }是因为Globalize会自动和Rails的I18n系统集成,用自身的规则覆盖了原生设置。- 另外那个提交信息“Upgrade to Rails 2.3....”提示你用的Globalize版本可能太老了,虽然能在Rails 4.2.4上跑,但适配性可能有问题,建议换成适配Rails 4.x的Globalize版本。
二、Rails 5.0.0.1 无Globalize场景的问题
这个版本没装Globalize,所以出现的现象都是预期内的,但配置不生效是关键:
NameError: uninitialized constant Globalize很正常,毕竟没引入这个gem。I18n.fallbacks = {}且Rails.application.config.i18n.fallbacks = nil,说明你的config.i18n.fallbacks = true配置没被正确加载。在Rails 5中,这个配置必须写在config/application.rb的Rails.application.configure do代码块内,还要确保没有被其他环境配置(比如config/environments/production.rb)覆盖。
针对性解决建议
对于Rails 4.2.4 + Globalize:
- 检查Globalize版本:换掉那个适配Rails 2.3的老旧版本,改用支持Rails 4.2的版本(比如
gem 'globalize', '~> 4.0.0'),然后运行bundle update globalize。 - 自定义fallback规则:如果需要指定多语言 fallback 顺序,直接在
application.rb或初始化文件中设置:Globalize.fallbacks = { de: [:en, :de], fr: [:en, :fr] }
对于Rails 5.0.0.1:
- 修复配置加载:确保
config.i18n.fallbacks = true写在正确的位置,示例:# config/application.rb module YourAppName class Application < Rails::Application config.i18n.fallbacks = true # 或者自定义规则 # config.i18n.fallbacks = { de: [:en], es: [:en] } end end - 如果需要Globalize功能:添加适配Rails 5的版本到Gemfile:
然后运行gem 'globalize', '~> 5.1.0'bundle install,再按照Globalize的文档配置多语言模型。
内容的提问来源于stack exchange,提问作者medik
相关产品推荐
相关产品推荐

