Помощник по переводам переопределения rails

Я хочу I18n.translate() или I18n.t() использовать определенный locale, но не как i18n.язык. Я не хочу использовать I18n.t(:my_key, locale: :my_locale) каждый раз, поэтому было бы здорово, если бы я мог переопределить саму функцию.

Я попытался поместить его в новый помощник:

# my_helper.rb
module MyHelper
  def translate(key, options = {})
    options[:locale] = MY_LOCALE
    I18n.translate key, options
  end
  alias :t :translate
end

это отлично работает для "жестких клавиш", таких как t('word'), но не находит правильный путь для "динамических ключей", таких как t('.title'), который должен использовать путь моего частичного, т. е. de.users.form.title.

спасибо за любую помощь!

2 ответов


казалось бы, существует некоторая путаница между функциональными возможностями:

I18n.translate не выполняет "ленивый поиск" (т. е. область поиска ключа для текущего частичного, если он начинается с точки), который вы ожидаете. Это особенность ActionView::Helpers::TranslationHelper#translate вместе с некоторые другие.

ваш метод пересиливание ActionView::Helpers::TranslationHelper#translate, без звонка super отложенная загрузка. Итак, если вы хотите продолжить переопределение метода, я думаю, вам может понадобиться:

# my_helper.rb
module MyHelper
  def translate(key, options = {})
    # If you don't want to ignore options[:locale] if it's passed in,
    # change to options[:locale] ||= MY_LOCALE
    options[:locale] = MY_LOCALE 
    super(key, options)
  end
  alias :t :translate
end

лично я бы предпочел использовать t(:my_key, locale: :my_locale) каждый раз в моих представлениях без переопределения или, самое большее, имеют отдельный вспомогательный метод, который обертывает вызов ActionView::Helpers::TranslationHelper#translate С дополнительной бизнес-логикой принуждения определенной локали.


вы можете попробовать следующее:

файл config/инициализаторы/реализация i18n.

module I18n
  def german(*args)
    options = args.last.is_a?(Hash) ? args.pop.dup : {}
    args << options.merge(locale: :de)
    translate(*args)
  end
  module_function :german
end

и если вам нужно определить несколько функций модуля, будет проще использовать следующую конструкцию вместо module_function каждый раз:

module I18n
  extend(Module.new do
    def german
      ...
    end

    def english
      ...
    end

    def japaneese
      ...
    end
  end)
end