ruby-on-rails Rails:如何提高I18n转换在测试环境中缺少异常

k4emjkb1  于 2023-05-30  发布在  Ruby
关注(0)|答案(7)|浏览(165)

我希望Rails在测试环境中缺少I18n翻译时引发异常(而不是呈现文本“翻译缺失”)。有没有一个简单的方法来实现这一点?

b5lpy0ml

b5lpy0ml1#

或者您可以将这些行添加到config/test.rb

config.action_view.raise_on_missing_translations = true
  config.i18n.exception_handler = Proc.new { |exception| raise exception.to_exception }
vatpfxk5

vatpfxk52#

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在视图和帮助程序中 Package 了对I18n.translate的调用,以防止触发异常。

kpbwa7wx

kpbwa7wx3#

我已经创建了raise的初始化器,一个异常- args被传递,所以你会知道哪个i18 n键丢失了!

# 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

来源

xkftehaa

xkftehaa4#

config.i18n.raise_on_missing_translation = true
从rails 7.0.5开始,此raises for any missing translation
(其他答案中提到的config.action_view.raise_on_missing_translations早已被弃用,最终在rails 7中被删除。

ibrsph3r

ibrsph3r5#

如果你在4.0.0到4.1.0之间使用rails,你应该这样做:

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
gcmastyq

gcmastyq6#

从Rails 4.1.0开始,现在有一个比4年前的答案更好的解决方案:在配置文件中添加以下行:

config.action_view.raise_on_missing_translations = true

我喜欢只在test环境中设置它,但您可能也想在development环境中设置它。我强烈建议不要在production中将其设置为true。

iecba09b

iecba09b7#

若要引发异常,可以定义一个类来处理本地化错误。

class TestExceptionLocalizationHandler
  def call(exception, locale, key, options)
    raise exception.to_exception
  end
end

然后将其附加到所需的测试用例

I18n.exception_handler = TestExceptionLocalizationHandler.new

通过这种方式,您会引发异常。我不知道如何提高失败(与不及格),以获得更好的结果。

相关问题