2014-10-13 13 views
6

Ich mag I18n.translate() oder I18n.t() einen bestimmten locale, verwenden, aber nicht I18n.locale. Ich möchte nicht I18n.t(:my_key, locale: :my_locale) jedes Mal verwenden, so wäre es toll, wenn ich die Funktion selbst überschreiben könnte.Aufschalten Schienen Übersetzungen Helfer

Ich versuchte es in einem neuen Helfer zu setzen:

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

Dies funktioniert gut für „Hardkeys“ wie t('word'), aber den richtigen Weg für „dynamischen Schlüssel“ wie t('.title') nicht, zu finden, sollte benutze den Pfad meiner partiellen, dh de.users.form.title.

Danke für jede Hilfe!

+0

Ich denke, Sie vermissen die 'I18n.with_locale' Methode – phoet

+0

Vielen Dank für Ihren Kommentar. 'I18n.with_locale (MY_LOCALE) {}' wäre dasselbe wie 'I18n.t (: key, locale: MY_LOCALE)' '. Ich hoffte auf eine Lösung mit der Standardfunktion 'I18n.t()' und einer zentralisierten Definition des Gebietsschemas, das ich verwenden möchte. – Railsana

+0

Können Sie nicht einfach das Gebietsschema von einem Parameter, von einer Domäne oder etwas ähnlichem setzen, wie hier beschrieben: http://guides.rubyonrails.org/i18n.html#setting-and-passing-the-locale? Auf diese Weise würden Sie das Gebietsschema pro Anfrage festlegen und dann könnten Sie "I18n.t" genauso wie normal verwenden, aber das für die Anfrage festgelegte Gebietsschema anstelle des Standardgebietsschema verwenden. – Frost

Antwort

6

Es scheint, dass es einige Verwirrung zwischen den Funktionalitäten:

I18n.translate sich nicht mit der „lazy Suchvorgänge "(dh Festlegung des Suchschlüssels für den aktuellen Teil, wenn es mit einem Punkt beginnt), den Sie erwarten. Das ist ein Merkmal von ActionView::Helpers::TranslationHelper#translate, zusammen mit some others.

Ihre Methode überschreibt ActionView::Helpers::TranslationHelper#translate, ohne einen Aufruf an super, um faul zu laden. Also, wenn Sie auf das Überschreiben der Methode bestehen bleiben wollen, ich glaube, Sie wollen kann:

# 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 

Persönlich obwohl ich eher t(:my_key, locale: :my_locale) jedes Mal in meine Ansichten ohne die Überschreibung verwenden würde, oder höchstens einen separaten Helfer Methode, die einen Aufruf an ActionView::Helpers::TranslationHelper#translate mit der zusätzlichen Geschäftslogik des Erzwingens eines bestimmten Gebietsschemas umschließt.

+0

Vielen Dank, das funktioniert für mich! – Railsana

0

können Sie versuchen, nächste:

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

Und wenn Sie mehrere Modulfunktionen definieren müssen, wird es einfacher sein, neben Konstruktion zu verwenden, anstatt module_function jedes Zeit:

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

    def english 
     ... 
    end 

    def japaneese 
     ... 
    end 
    end) 
end