2014-10-13 12 views
6

Chcę I18n.translate() lub I18n.t() do korzystania z konkretnego locale, ale nie I18n.locale. Nie chcę używać I18n.t(:my_key, locale: :my_locale) za każdym razem, więc byłoby wspaniale, gdybym mógł nadpisać samą funkcję.Zastąp szyn tłumaczenia pomocnika

Starałem się umieścić go w nowym pomocnikiem:

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

Działa to dobrze dla „twardych” jak t('word') kluczy, ale nie znaleźliśmy właściwą drogę dla „klawiszy dynamicznych” jak t('.title'), co powinno użyj ścieżki mojego częściowego, tj. de.users.form.title.

Dzięki za pomoc!

+0

Myślę, że brakuje wam metody "I18n.with_locale". – phoet

+0

Dziękuję za komentarz. 'I18n.with_locale (MY_LOCALE) {}" to to samo, co 'I18n.t (:, key, locale: MY_LOCALE)'. Miałem nadzieję na rozwiązanie ze standardową funkcją 'I18n.t()' i scentralizowaną definicją ustawień narodowych, których chcę użyć. – Railsana

+0

Nie możesz po prostu ustawić lokalizacji z paramu, z domeny lub czegoś podobnego, jak omówiono tutaj: http://guides.rubyonrails.org/i18n.html#setting-and-passing-the-locale? W ten sposób ustawisz ustawienia regionalne dla każdego żądania, a następnie użyjesz 'I18n.t' po prostu jak normalnie, ale używając ustawienia narodowego dla żądania zamiast domyślnego ustawienia narodowego. – Frost

Odpowiedz

6

Wydaje się, że istnieje pewne zamieszanie między funkcjonalności:

I18n.translate nie wykonać „leniwy lookups "(tj. sprawdzanie klucza odnośnika do bieżącego fragmentu, jeśli zaczyna się od kropki), którego się spodziewasz. Jest to funkcja ActionView::Helpers::TranslationHelper#translate, wraz z some others.

Twoja metoda zastępuje ActionView::Helpers::TranslationHelper#translate, bez połączenia z super, aby uzyskać leniwy załadunek. Tak więc, jeśli chcesz, aby utrzymywać się na przesłanianie metody, myślę, że warto:

# 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 

Osobiście jednak wolałbym użyć t(:my_key, locale: :my_locale) za każdym razem w moich poglądów bez ręcznego, lub co najwyżej mieć osobne pomocnika metoda owijająca wywołanie do ActionView::Helpers::TranslationHelper#translate z dodatkową logiką biznesową wymuszającą określone ustawienia narodowe.

+0

Dziękuję bardzo, to działa dla mnie! – Railsana

0

Można próbować dalej:

config/inicjalizatory/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 

A jeśli trzeba zdefiniować kilka funkcji modułu, to będzie łatwiejszy w użyciu następną konstrukcję zamiast module_function każdego czas:

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

    def english 
     ... 
    end 

    def japaneese 
     ... 
    end 
    end) 
end 
Powiązane problemy