Подтвердить что ты не робот

Rails: удалить недостающие ошибки перевода

Я использую интернационализацию для english (en) и french (fr), я использовал en.yml для ограниченного использования и большинство переводов, которые я пишу в fr.yml.

С locale как fr все работает хорошо, но с en это показывает мне ошибку как отсутствующий диапазон перевода.

Например, если у меня есть что-то вроде

<%= text_field_tag( "search", params[:search], :placeholder=>t("Search"), :class=>"search_input") %>

и я получаю вывод для en:

<input class="search_input" id="search" name="search" placeholder="<span class=" translation_missing"="" title="translation missing: en.Search">

Я хочу, чтобы он отключил ошибки перевода для английского, так как английский язык по умолчанию, но для некоторых случаев я использовал en.yml.

Или, если это невозможно, следует удалить все сообщение об ошибке.

Спасибо

4b9b3361

Ответ 1

В Rails 4.1 была изменена реализация ошибок, связанных с ошибками HTML. Теперь вместо библиотеки I18n она обрабатывается на вспомогательном слое представления. А именно, в "переводить" вспомогательный метод (см. Action_view/helpers/translation_helper.rb).

Чистый способ сделать это теперь - переопределить вспомогательный метод и обработать исключение самостоятельно.

# app/helpers/i18n_helper.rb

module I18nHelper
  def translate(key, options={})
    super(key, options.merge(raise: true))
  rescue I18n::MissingTranslationData
    key
  end
  alias :t :translate
end

Ответ 2

На первый взгляд, Rails I18n guide выглядит довольно неплохо и достаточно хорошо охватывает (например, пример объявления специального обработчика исключений).

Но в соответствии с этим билетом он не работает в рельсах с версии 4.0.2 и выше (но должен быть исправлен в последних версиях rails 4.1).

По-видимому, поведение изменилось, и обработчик исключений теперь игнорируется.

Доступные опции:

  • явно добавить опцию raise: true, которая заставит использовать обработчик исключений. Например. t('.missing', raise: true).
  • в новом выпуске rails 4.1 вы можете настроить поведение по умолчанию на повышение исключения: config.action_view.raise_on_missing_translations = true (см. слияние билета для получения дополнительной информации)
  • или, альтернативно, явно добавить параметр по умолчанию: t('.missing', default: 'use this instead')

Ответ 3

Библиотека I18n использует обработчик исключений, чтобы решить, что делать с отсутствующими переводами. По умолчанию он возвращает сообщение "translation missing":

# i18n/exceptions.rb
class I18n::ExceptionHandler
  include Module.new {
    def call(exception, locale, key, options)
      if exception.is_a?(MissingTranslation)
        # Rails sets :rescue_format to :html in views
        # so that you will get span tag instead of just text message
        options[:rescue_format] == :html ? exception.html_message : exception.message
      elsif exception.is_a?(Exception)
        raise exception
      else
        throw :exception, exception
      end
    end
  }
end

Вы можете расширить обработчик исключений, чтобы просто вернуть символ перевода при отсутствии перевода:

# config/initializers/i18n.rb
module UseKeyForMissing
  def call(exception, locale, key, options)
    if exception.is_a?(I18n::MissingTranslation)
      key
    else
      super
    end
  end
end

I18n.exception_handler.extend UseKeyForMissing

Тогда, если вы предполагаете, что у вас есть только французский перевод:

I18n.t("Search", :locale => :fr) #=> "Rechercher"
I18n.t("Search", :locale => :en) #=> "Search"

Ответ 4

Если вы не хотите заполнять переводы для английского языка, возможным решением здесь может быть отказ от перевода на французский язык.

Это можно сделать, добавив следующий код в инициализатор (например, config/initalizers/i18n.rb):

require "i18n/backend/fallbacks" 
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)

Если французский язык настроен как локаль по умолчанию, это должно быть "Just Work".

В противном случае вам может потребоваться добавить настраиваемое правило возврата к инициализатору:

I18n.fallbacks.map(:en => :fr)

Ответ 5

попробуйте это

<%= text_field_tag( "search", params[:search], :placeholder=>t(:search), :class=>"search_input") %>

и в файле en.yml напишите

search: 'Search'

Ответ 6

Приведенный ниже код заключается в том, чтобы удалить отсутствующий перевод для английского, мы обезглавливаем патч MissingTranslation модуля I18n, помещая его в инициализаторы.

DEFAULT_TEMPLATE_LANG = 'en'        
# Removing missing translation errors for english
module I18n
  class MissingTranslation
    def html_message
      if DEFAULT_TEMPLATE_LANG == keys[0].to_s
        keys[1].to_s
      else
        "missing translation: #{keys.join('.')}"
      end
    end
  end
end

Ответ 7

В Rails 4.1 я не смог заставить это работать с обработчиком исключений I18n (есть некоторые ошибки, видимо, см. ответ nathanvda.
В конце концов я просто перезаписал функцию message, добавив ее в config/initializers/i18n.rb

module I18n
  class MissingTranslation
    module Base
      def message
        keys[1..-1].join('.')
      end
    end
  end
end