2014-10-13 2 views
6

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

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

# 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.

Спасибо за помощь!

+0

Я думаю, что вам не нужен метод 'I18n.with_locale' – phoet

+0

Благодарим за комментарий. 'I18n.with_locale (MY_LOCALE) {}' будет таким же, как 'I18n.t (: key, locale: MY_LOCALE)'. Я надеялся на решение со стандартной функцией 'I18n.t()' и централизованное определение языка, который я хочу использовать. – Railsana

+0

Не можете ли вы установить локаль из параметра, из домена или чего-то подобного, как обсуждалось здесь: http://guides.rubyonrails.org/i18n.html#setting-and-passing-the-locale? Таким образом, вы должны установить локаль для каждого запроса, а затем вы можете использовать 'I18n.t', как обычно, но используя набор локалей для запроса вместо стандартного языкового стандарта. – Frost

ответ

6

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

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

Ваш метод переопределяет 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 с дополнительной бизнес-логикой форсирования определенной локали.

+0

Большое спасибо, что работает для меня! – Railsana

0

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

конфигурация/Инициализаторы/i18n.rb

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 
Смежные вопросы