有趣的是,这只发生在我们的一个系统上.特别是用Apache运行Passenger.
在我的开发系统上使用Webrick,Thin或Passenger Standalone时,一切都会好起来的.
这就是我在我的应用程序中所拥有的.rb:
config.i18n.default_locale = :de
这是在application_controller.rb中:
before_filter :set_locale def set_locale I18n.locale = @current_client ? @current_client.locale : I18n.default_locale end
(我在@current_client为零且其他部分被执行的页面上遇到问题).
所以,我基本上使用:de locale.在表单上显示验证错误时,我会遇到这样的混合翻译:
ist zu kurz (nicht weniger als 6 Zeichen) und translation missing: en.activerecord.errors.custom.password_format
如您所见,第一次失败验证的错误消息按预期转换,因为第二条错误消息尝试访问英语翻译(不存在).
即使在before_filter执行之前,我怀疑延迟加载已翻译的字符串存在问题.
任何线索为什么会发生这种情况?
记录:这是Rails 3
编辑:
我刚刚发现这取决于所使用的环境.使用开发环境时,一切都很好.在使用生产环境(或类似生产)环境时,我会遇到上述行为.
编辑2:
我发现了更多:它特别依赖于config.cache_classes.设置为true时,我会看到混合翻译.当设置为false时(如在典型的开发环境中),i18n按预期工作.
编辑3:
也许这与以下错误有关?
https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/5522
编辑4:
这与上面提到的bug有关,问题是由于急切加载的模型类,它们使用I18n字符串,但是在I18n初始化之前发生了急切的类加载,因此找不到翻译.甚至还有另一个错误:
https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/6353
不幸的是,Rails的人没有设法在最近的3.0.4版本中包含修复程序(据我所知).因此,我试图找出这样的解决方法(在我的应用程序配置中):
config.before_eager_load do I18n.load_path += Dir[Rails.root.join('config','locales','de.yml').to_s] I18n::Railtie.reloader.paths.concat I18n.load_path I18n::Railtie.reloader.execute_if_updated I18n.reload! end
不幸的是,这不起作用.有什么线索吗?
解决方法
我所做的是将其添加到production.rb:
config.before_configuration do I18n.load_path += Dir[Rails.root.join('config','*.{rb,yml}').to_s] I18n.locale = 'pt-PT' I18n.reload! end