Rails i18n: можно ли отключить ошибки «отсутствует перевод»? - PullRequest
12 голосов
/ 17 июня 2010

У меня мультитенантное приложение, и я экспериментирую с использованием гема i18n, чтобы позволить каждому из наших клиентов настроить систему по своему вкусу, изменить текст на различных страницах, настроить электронную почту и т. Д.По общему признанию, я не использую i18n, поскольку это предназначалось для использования, так как я фактически не переводил различные "языки", все на английском языке, но каждый клиент имеет РАЗНЫЙ английский, если это имеет смысл.

Тем не менее, я наткнулся на то, что я считаю ужасно плохим дизайнерским решением в жемчужине i18n: если когда-либо перевода не существует, то вместо того, чтобы просто не переводить и не распечатывать то, что обычно происходит, возникает ошибка,Например,

<%= distance_of_time_in_words_to_now @press_release.submitted_at %>

выглядит как

translation missing: en, datetime, distance_in_words, x_days

Я имею в виду, давай!Я даже не ХОЧУ переводить.

Я понимаю, что причина этого в том, что у меня не загружены переводы по умолчанию, но я использую ActiveRecord в качестве бэкэнда, и я хотелдержи в чистоте.«Решением» было бы импортировать все файлы перевода yaml в мое хранилище переводов базы данных, но это не очень хорошая идея.Что если я обновлю рельсы в будущем?Мне придется беспокоиться о синхронизации всех этих переводов.

Опять же, я не могу понять, почему это поведение по умолчанию.Когда бы кто-нибудь захотел, чтобы это странное сообщение об ошибке появилось вместо того, чтобы просто использовать значение по умолчанию «3 дня назад»?

В любом случае, мой вопрос, есть ли способ, чтобы оно автоматически отключало перевод и использовалонепереведенное сообщение, если перевода не существует?Спасибо!

Ответы [ 2 ]

7 голосов
/ 21 марта 2012

Если вы заинтересованы в обработке других исключений с помощью обработчика исключений по умолчанию, этот модифицированный код из ответа Филиппа Брокума должен помочь (версия Rails 3.2.2):

i18n_simple_backend = I18n::Backend::Simple.new
old_handler = I18n.exception_handler
I18n.exception_handler = lambda do |exception, locale, key, options|
  case exception
  when I18n::MissingTranslation
    i18n_simple_backend.translate(:en, key, options || {})
  else
    old_handler.call(exception, locale, key, options)
  end
end

Этот код позволит вам захватывать только те исключения, которые вам нужно обрабатывать по-разному.

7 голосов
/ 17 июня 2010

Похоже, это помогает.

require 'i18n' # without this, the gem will be loaded in the server but not in the console, for whatever reason

# store translations in the database's translations table
I18n.backend = I18n::Backend::ActiveRecord.new

# for translations that don't exist in the database, fallback to the Simple Backend which loads the default English Rails YAML files
I18nSimpleBackend = I18n::Backend::Simple.new
I18n.exception_handler = lambda do |exception, locale, key, options|
  case exception
  when I18n::MissingTranslationData
    I18nSimpleBackend.translate(:en, key, options || {})
  else
    raise exception
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...