我有一个多租户应用程序,我正在尝试使用i18n宝石,以允许我们的每个客户根据自己的喜好自定义系统,更改各种页面上的文本,自定义电子邮件等等.诚然,我没有使用i18n,因为它是打算使用,因为我没有实际翻译不同的“语言”,一切都是英文,但每个客户有一个不同的英语,如果这是有道理的.
不过,我已经看到我认为在i18n宝石中的一个可怕的设计决定:如果一个翻译不存在,而不是简单地不做翻译和打印任何通常的情况,它会引发一个错误.例如,
<%= distance_of_time_in_words_to_now @press_release.submitted_at %>
出来作为
translation missing: en,datetime,distance_in_words,x_days
我的意思是来吧!我甚至不想要翻译.
我明白这是发生的原因是因为我没有加载默认的翻译,但我正在使用ActiveRecord作为后端,我想保持干净. “解决方案”将导入所有的yaml翻译文件到我的数据库翻译商店,但似乎不是一个好主意.如果我以后升级rails怎么办?我将不得不担心所有这些翻译都保持同步.
解决方法
如果您有意使用默认的异常处理程序来处理其他异常,那么来自Philip Brocoum的回答的修改后的代码应该会做到这一点(Rails 3.2.2版本):
i18n_simple_backend = I18n::Backend::Simple.new old_handler = I18n.exception_handler I18n.exception_handler = lambda do |exception,locale,key,options| case exception when I18n::MissingTranslation i18n_simple_backend.translate(:en,options || {}) else old_handler.call(exception,options) end end
此代码将允许您仅捕获需要处理不同的异常.