Помощник по переводам переопределения 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, от гем i18n и -
ActionView::Helpers::TranslationHelper#translate, с рельсов
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