你如何解救I18n :: MissingTranslationData?

我希望能够拯救I18n::MissingTranslationData如下所示:

 begin value = I18n.t('some.key.that.does.not.exist') puts value return value if value rescue I18n::MissingTranslationData puts "Kaboom!" end 

我尝试了以上,但它似乎没有进入救援区。 我只是看到,在我的控制台上(因为puts ): translation missing: some.key.that.does.not.exist 。 我从未见过Kaboom!

我如何让它工作?

IMO,这很奇怪但是在当前版本的i18n (0.5.0)你应该传递一个你想要救援的exception:

 require 'i18n' begin value = I18n.translate('some.key.that.does.not.exist', :raise => I18n::MissingTranslationData) puts value return value if value rescue I18n::MissingTranslationData puts "Kaboom!" end 

它将在未来的0.6版本中修复(你可以测试它 – https://github.com/svenfuchs/i18n

与上述相同但更好

 v = "doesnt_exist" begin puts I18n.t "langs.#{v}", raise: true rescue puts "Nooo #{v} has no Translation!" end 

要么

 puts I18n.t("langs.#{v}", default: "No Translation!") 

要么

 a = I18n.t "langs.#{v}", raise: true rescue false unless a puts "Update your YAML!" end 

在当前版本的I18n中,您正在寻找的exception实际上称为MissingTranslation 。 I18n的默认exception处理程序以静默方式解救它,并将其传递给ArgumentError以打印错误消息而不是其他内容。 如果您确实想要抛出错误,则需要覆盖处理程序。

请参阅i18nexception的源代码 ,以及有关如何编写自定义处理程序的I18n的RailsGuides指南的 6.2节

请注意,现在您只需传入:raise => true

 assert_raise(I18n::MissingTranslationData) { I18n.t(:missing, :raise => true) } 

…这会引发I18n::MissingTranslationData

请参阅https://github.com/svenfuchs/i18n/blob/master/lib/i18n/tests/lookup.rb