12

Sto usando l'internazionalizzazione per inglese (en) e Francese (fr), ho usato en.yml per uso limitato e la maggior parte delle traduzioni sto scrivendo in fr.yml.Rails: Rimuovere manca errori di traduzione

Con locale come fr tutto funziona bene, ma con en mostra error come mancanti lasso di traduzione.

Per esempio, se ho avuto qualcosa di simile

<%= text_field_tag("search", params[:search], :placeholder=>t("Search"), :class=>"search_input") %> 

e ottengo output per en è:

<input class="search_input" id="search" name="search" placeholder="<span class=" translation_missing"="" title="translation missing: en.Search"> 

Quello che voglio è che dovrebbe spegnere errori di traduzione per l'inglese, dal momento che l'inglese è la mia lingua predefinita, ma per alcuni casi ho usato en.yml.

Oppure, se questo non è possibile, è necessario rimuovere l'intero messaggio di errore.

Grazie

risposta

22

L'implementazione di errori di traduzione mancanti in HTML è stata modificata in Rails 4.1.Ora invece della libreria I18n viene gestita sul livello helper view. Vale a dire, nel metodo helper "translate" (vedi action_view/helpers/translation_helper.rb).

Un modo pulito per eseguire questa operazione consiste nel sostituire il metodo di supporto e gestire l'eccezione autonomamente.

# app/helpers/i18n_helper.rb 

module I18nHelper 
    def translate(key, options={}) 
    super(key, options.merge(raise: true)) 
    rescue I18n::MissingTranslationData 
    key 
    end 
    alias :t :translate 
end 
+0

Grazie. Non sono in grado di farlo funzionare correttamente: -/Lo metto in 'config/initializers/i18n.rb', e i file vengono caricati correttamente, ma ottengo ancora i tag' ' 'I18n.method (: t) .source_location' Ho finito con' i18n-0.6.9/lib/i18n.rb', che ha definito il modulo 'I18n', nessuna traccia di un modulo' I18nHelper' in questa directory? (Cambiare il modulo in 'I18n' non ha funzionato) ... Ho sbagliato? Mi manca un passaggio? – Carpetsmoker

+0

Questo è un normale modulo di supporto che dovrebbe entrare in app/helper. Ho modificato il post per chiarirlo. –

+0

Grazie, non era troppo ovvio per un nuovo arrivato. ;) – Carpetsmoker

1

provare questo

<%= text_field_tag("search", params[:search], :placeholder=>t(:search), :class=>"search_input") %> 

e nel file en.yml scrivere

search: 'Search' 
+0

significa che non fornirà l'errore di traduzione, voglio scrivere normale inglese nel modello, la traduzione voglio solo per altre lingue –

+0

t ("Cerca") la transalione non è loro nel tuo file en.yml in modo che aggiungi questo come - cerca: 'Cerca' e chiama come t (: search) –

+0

leggi prima i ques, quello che mi stai dicendo è come aggiungere la traduzione a en.yml, non voglio che sia –

2

Se non si desidera compilare traduzioni per inglese, una possibile soluzione qui sarebbe quello di avere le tue traduzioni in francese.

è possibile raggiungere questo aggiungendo il seguente codice per un inizializzatore (ad es config/initalizers/i18n.rb.):

require "i18n/backend/fallbacks" 
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks) 

Se francese è impostato come la vostra località di default, questo dovrebbe "solo lavoro".

In caso contrario, potrebbe essere necessario aggiungere una regola fallback personalizzato al initializer:

I18n.fallbacks.map(:en => :fr) 
+0

sì l'ho fatto usando solo il fallback personalizzato, grazie –

4

biblioteca I18n utilizza gestore di eccezioni per decidere cosa fare con traduzioni mancanti. Per impostazione predefinita restituisce il messaggio "traduzione mancante":

# i18n/exceptions.rb 
class I18n::ExceptionHandler 
    include Module.new { 
    def call(exception, locale, key, options) 
     if exception.is_a?(MissingTranslation) 
     # Rails sets :rescue_format to :html in views 
     # so that you will get span tag instead of just text message 
     options[:rescue_format] == :html ? exception.html_message : exception.message 
     elsif exception.is_a?(Exception) 
     raise exception 
     else 
     throw :exception, exception 
     end 
    end 
    } 
end 

è possibile estendere il gestore di eccezioni al proprio ritorno chiave di traduzione quando la traduzione è mancante:

# config/initializers/i18n.rb 
module UseKeyForMissing 
    def call(exception, locale, key, options) 
    if exception.is_a?(I18n::MissingTranslation) 
     key 
    else 
     super 
    end 
    end 
end 

I18n.exception_handler.extend UseKeyForMissing 

Poi a patto di avere traduzioni solo francese:

I18n.t("Search", :locale => :fr) #=> "Rechercher" 
I18n.t("Search", :locale => :en) #=> "Search" 
+0

ho provato ad usarlo, ma non ha funzionato per me, ho trovato la soluzione, lo posterò presto. Grazie –

+0

Che cosa esattamente non ha funzionato? Funziona nella mia applicazione. –

+0

Non capisco che alcuni oggetti si aspettino che l'errore stia arrivando. Non riesco a capirlo –

1

Dato che segue codice è di rimuovere una versione mancante per inglese, abbiamo scimmia modulo di correzione di MissingTranslation I18n, mettendo i t in inizializzatori.

DEFAULT_TEMPLATE_LANG = 'en'   
# Removing missing translation errors for english 
module I18n 
    class MissingTranslation 
    def html_message 
     if DEFAULT_TEMPLATE_LANG == keys[0].to_s 
     keys[1].to_s 
     else 
     "missing translation: #{keys.join('.')}" 
     end 
    end 
    end 
end 
11

A prima vista la Rails I18n guide sembrano abbastanza buono, e coprire questo abbastanza bene (ad esempio, un esempio per dichiarare un gestore di eccezioni personalizzato).

Ma secondo lo this ticket non funziona in binari dal 4.0.2 in su (ma dovrebbe essere corretto nell'ultima release di rails 4.1).

Apparentemente il comportamento è stato modificato e il gestore di eccezioni è ora ignorato.

opzioni disponibili:

  • aggiungere esplicitamente l'opzione raise: true, che costringerà l'exceptionhandler da utilizzare. Per esempio. t('.missing', raise: true).
  • nella nuova rotaie release 4.1 è possibile impostare il comportamento predefinito di nuovo a sollevare un'eccezione: config.action_view.raise_on_missing_translations = true (vedi merge ticket per maggiori informazioni)
  • o, in alternativa, in modo esplicito aggiungere un'opzione di default: t('.missing', default: 'use this instead')
+0

Grazie.Cambiare tutto un gruppo di 't()' solo per aiutarmi con lo sviluppo non è fattibile; L'impostazione del gestore di eccezioni sembra funzionare, ma nessuna eccezione sembra essere stata intercettata (vedi: http://pastebin.com/G8qyXtsz) ... "I18n :: MissingTranslation :: Base :: to_exception' viene ancora chiamato. ..: -/ – Carpetsmoker

+0

Addendum: funziona * come previsto da 'rails c', ma * not * da un modello HAML ...? – Carpetsmoker

+0

Hai provato a impostare il flag di configurazione menzionato? Infatti, nelle viste l'eccezione non viene più sollevata, a meno che non si imposti il ​​flag di configurazione, o in modo esplicito l'opzione 'raise => true'. – nathanvda

-1

In Rails 4.1, non ero in grado di arrivare a questo lavoro con il gestore di eccezioni I18n (ci sono alcuni bug, a quanto pare, vedere nathanvda's answer.
alla fine ho appena sovrascritto la funzione message aggiungendo questo ai config/initializers/i18n.rb

Problemi correlati