ruby 如何拯救I18n::MissingTranslationData?

8fq7wneg  于 2023-04-05  发布在  Ruby
关注(0)|答案(5)|浏览(207)

我希望能够像这样拯救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!
我怎么才能让它工作?

elcex8rz

elcex8rz1#

在我看来,这很奇怪,但在当前版本的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

xt0899hw

xt0899hw2#

和上面的一样,但是更好。

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
ukxgm1gy

ukxgm1gy3#

在当前版本的I18n中,您正在查找的异常实际上称为MissingTranslation。I18n的默认异常处理程序会默默地拯救它,并将其传递给ArgumentError以打印错误消息。如果您确实希望抛出错误,则需要重写处理程序。
有关如何编写自定义处理程序,请参见the source code for i18n exceptionsRailsGuides guide to I18n的第6.2节

iklwldmw

iklwldmw4#

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

e4yzc0pl

e4yzc0pl5#

这应该可以完成任务。当使用rescue时,我总是会捕获特定的错误。使用救援而不使用特定的错误可能会导致意外的行为。

require 'i18n'
begin
  value = I18n.t 'some.key.that.does.not.exist', raise: true
  puts value
rescue I18n::MissingTranslationData
  puts "Kaboom!"
end

相关问题