2014-10-13 17 views
6

voglio I18n.translate() o I18n.t() di utilizzare una specifica locale, ma non I18n.locale. Non voglio usare I18n.t(:my_key, locale: :my_locale) ogni volta, quindi sarebbe bello se potessi scavalcare la funzione stessa.Override rotaie traduzioni aiutante

Ho cercato di metterlo in un nuovo aiutante:

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

Questo funziona bene per "hard key" come t('word'), ma non trova la strada giusta "tasti dinamici", come t('.title'), che dovrebbe utilizzare il percorso del mio parziale, ovvero de.users.form.title.

Grazie per qualsiasi aiuto!

+0

penso che manchi il metodo 'I18n.with_locale' – phoet

+0

Grazie per il commento. 'I18n.with_locale (MY_LOCALE) {}' sarebbe la stessa cosa di 'I18n.t (: chiave, locale: MY_LOCALE)'. Speravo in una soluzione con la funzione standard 'I18n.t() e una definizione centralizzata delle impostazioni internazionali che voglio usare. – Railsana

+0

Non puoi semplicemente impostare la locale da un parametro, da un dominio o qualcosa di simile, come discusso qui: http://guides.rubyonrails.org/i18n.html#setting-and-passing-the-locale? In questo modo, avresti impostato la localizzazione per richiesta e poi potevi usare 'I18n.t' come normale, ma usando la locale impostata per la richiesta invece delle impostazioni locali predefinite. – Frost

risposta

6

Sembrerebbe che v'è una certa confusione tra le funzionalità di:

I18n.translate non esegue il "pigro lookups "(es. l'ambito della chiave di ricerca per il partial corrente se inizia con un punto) che stai aspettando. Questa è una funzionalità di ActionView::Helpers::TranslationHelper#translate, insieme a some others.

Il metodo sta ignorando ActionView::Helpers::TranslationHelper#translate, senza una chiamata a super per ottenere il caricamento lazy. Quindi, se si vuole persistere sul override del metodo, penso che si potrebbe desiderare:

# 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 

Personalmente, però, preferisco usare t(:my_key, locale: :my_locale) ogni volta nel mio punto di vista, senza la sostituzione, o al massimo hanno un aiutante separata metodo che avvolge una chiamata a ActionView::Helpers::TranslationHelper#translate con la logica di business extra di forzare una locale specifica.

+0

Grazie mille, questo funziona per me! – Railsana

0

Si può provare prossimo:

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

E se hai bisogno di definire diverse funzioni del modulo, sarà più facile da usare costruzione vicino al posto di ogni module_function tempo:

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

    def english 
     ... 
    end 

    def japaneese 
     ... 
    end 
    end) 
end