Помощник по переводам переопределения 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