Rails: как повысить перевод I18n, отсутствуют исключения в среде тестирования - PullRequest
23 голосов
/ 09 ноября 2011

Я хочу, чтобы Rails вызывал исключение, когда в среде тестирования отсутствует перевод I18n (вместо того, чтобы выводить текст «отсутствует перевод»).Есть ли простой способ добиться этого?

Ответы [ 6 ]

23 голосов
/ 27 мая 2016

Начиная с Rails 4.1.0, теперь есть лучшее решение, чем 4-летние ответы на этот вопрос: добавьте следующую строку в ваш файл конфигурации:

config.action_view.raise_on_missing_translations = true

Мне нравится устанавливать это втолько для среды test, но вы также можете установить ее в development.Я бы настоятельно рекомендовал не устанавливать значение true в production.

18 голосов
/ 01 марта 2012

Чтобы вызвать исключения, вы можете определить класс для обработки ошибок локализации.

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

Затем вы присоединяете его к желаемым тестам с помощью

I18n.exception_handler = TestExceptionLocalizationHandler.new

Таким образом, вы получаете исключения. Я не знаю, как поднять ошибки (с провалом), чтобы получить лучшие результаты.

11 голосов
/ 12 января 2017

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 в его представлении и помощники, предотвращающие срабатывание исключений.

9 голосов
/ 13 марта 2012

Я создал этот инициализатор для raise исключения - передаются аргументы, чтобы вы знали, какой ключ 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

Источник

5 голосов
/ 05 июля 2018

Или вы можете просто добавить эти строки в config/test.rb

  config.action_view.raise_on_missing_translations = true
  config.i18n.exception_handler = Proc.new { |exception| raise exception.to_exception }
0 голосов
/ 08 декабря 2018

Если вы используете рельсы между 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...