你如何解救I18n :: MissingTranslationData?

时间:2011-05-17 07:13:21

标签: ruby internationalization

我希望能够如此拯救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!

如何让它发挥作用?

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

与上述相同,但更好

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

答案 2 :(得分:0)

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

有关如何编写自定义处理程序的信息,请参阅the source code for i18n exceptionsRailsGuides guide to I18n的第6.2节

答案 3 :(得分:0)

请注意,现在只需传递: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