我希望Rails在测试环境中缺少I18n转换时引发异常(而不是渲染文本'translation missing')。有没有一种简单的方法来实现这一目标?
答案 0 :(得分:22)
从Rails 4.1.0开始,现在有一个比这个问题的4年回答更好的解决方案:在配置文件中添加以下行:
config.action_view.raise_on_missing_translations = true
我只想在test
环境中设置此功能,但您可能还想在development
中设置它。我强烈建议不要在production
中将其设置为真。
答案 1 :(得分:18)
要引发异常,您可以定义一个类来处理本地化错误。
class TestExceptionLocalizationHandler
def call(exception, locale, key, options)
raise exception.to_exception
end
end
然后使用
将其附加到所需的测试用例I18n.exception_handler = TestExceptionLocalizationHandler.new
通过这种方式,您可以获得异常。我不知道如何提高失败率(使用flunk)以获得更好的结果。
答案 2 :(得分:11)
Rails 4.1 +
要提高i18n翻译缺失的例外,您需要两个的东西:
1)初始值设定项config/initializers/i18n_force_exceptions.rb
:
module I18n
class ForceMissingTranslationsHandler < ExceptionHandler
def call(exception, locale, key, options)
if Rails.env.test?
raise exception.to_exception
else
super
end
end
end
end
I18n.exception_handler = I18n::ForceMissingTranslationsHandler.new
2)config/environments/test.rb
(以及其他需要的环境)中的配置设置:
config.action_view.raise_on_missing_translations = true
注意:除了异常处理程序之外还需要配置设置,因为rails会在其视图中包含对I18n.translate
的调用,并且帮助程序会阻止触发异常。
答案 3 :(得分:9)
我已经为raise
创建了这个初始化程序一个例外 - 传递了args,因此您将知道哪个i18n键丢失了!
# only for test
if Rails.env.test?
# raises exception when there is a wrong/no i18n key
module I18n
class JustRaiseExceptionHandler < ExceptionHandler
def call(exception, locale, key, options)
if exception.is_a?(MissingTranslation)
raise exception.to_exception
else
super
end
end
end
end
I18n.exception_handler = I18n::JustRaiseExceptionHandler.new
end
答案 4 :(得分:5)
或者您也可以将这些行添加到config/test.rb
config.action_view.raise_on_missing_translations = true
config.i18n.exception_handler = Proc.new { |exception| raise exception.to_exception }
答案 5 :(得分:0)
如果您在4.0.0到4.1.0之间使用导轨,则应该以这种方式进行猴子补丁:
module ActionView::Helpers::TranslationHelper
def t_with_raise(*args)
value = t_without_raise(*args)
if value.to_s.match(/title="translation missing: (.+)"/)
raise "Translation missing: #{$1}"
else
value
end
end
alias_method :translate_with_raise, :t_with_raise
alias_method_chain :t, :raise
alias_method_chain :translate, :raise
end