微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – Rails i18n中的混合语言环境

Rails以某种方式混合我的语言环境,我完全不知道为什么.我翻译的大多数字符串都按预期工作,但对于某些字符串,它会混合使用语言环境.

有趣的是,这只发生在我们的一个系统上.特别是用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

不幸的是,这不起作用.有什么线索吗?

解决方法

如果您有一个也使用I18n的Gem(我在使用active_admin时遇到此问题),也可能会出现此问题. Rails将I18n设置为迟到,以便Gem能够使用相同的load_paths.

我所做的是将其添加到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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐