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.
Или, если это невозможно, следует удалить все сообщение об ошибке.
Спасибо
Ответы
Ответ 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