2012-09-10 7 views
47

Lavorare su un'applicazione rails 3 dove voglio verificare se esiste una traduzione prima di emetterla, e se non esiste ricorrere ad un testo statico. Potrei fare qualcosa del tipo:Rails I18n, controllare se la traduzione esiste?

if I18n.t("some_translation.key").to_s.index("translation missing") 

Ma credo che ci dovrebbe essere un modo migliore di quello. Cosa succede se i binari in futuro modificano la "traduzione mancante" in "traduzione non trovata". O se per qualche strana ragione il testo contenga "traduzione mancante". Qualche idea?

risposta

84

In base a quello che hai descritto, questo dovrebbe funzionare:

I18n.t("some_translation.key", :default => "fallback text") 

Vedere la documentation per i dettagli.

11

uso: param default:

I18n.t("some_translation.key", :default => 'some text') 
17

Che dire di questo?

I18n.t('some_translation.key', :default => '').empty? 

Penso solo che ci si sente meglio, più simile non v'è alcuna traduzione

Caveat: non funziona se si dispone intenzionalmente una stringa vuota come valore di traslazione.

32

:default non è sempre una soluzione. Utilizzare questo per i casi più avanzati:

aiutanti/application.rb:

def i18n_set? key 
    I18n.t key, :raise => true rescue false 
end 

qualsiasi template ERB:

<% if i18n_set? "home.#{name}.quote" %> 
    <div class="quote"> 
    <blockquote><%= t "home.#{name}.quote" %></blockquote> 
    <cite><%= t "home.#{name}.cite" %></cite> 
    </div> 
<% end %> 
3

A volte si vuole fare più cose su traduzioni fallisce

v = "doesnt_exist" 
begin 
    puts I18n.t "langs.#{v}", raise: true 
rescue 
    ... 
    puts "Nooo #{v} has no Translation!" 
end 
2

Questo è un trucco ma penso che a volte potrebbe essere utile ...

Supponendo di avere questo nel file i18n:

en: 
    key: 
    special_value: "Special value" 
    default_value: "Default value" 

Si può fare questo:

if I18n.t('key').keys.include?(:special_value) 
    I18n.t('key.special_value') 
else 
    I18n.t('key.default_value') 
end 
# => "Special value" 

if I18n.t('key').keys.include?(:unknown_value) 
    I18n.t('key.special_value') 
else 
    I18n.t('key.default_value') 
end 
# => "Default value" 

NB: Questo funziona solo se si sta testando tutt'altro che una radice chiave visto che stai guardando il genitore.

In realtà, ciò che è interessante è quello che si può ottenere quando si richiede una chiave madre ...

I18n.t('key') 
# => {:special_value=>"Special value", :default_value=>"Default value"} 
40

È inoltre possibile utilizzare

I18n.exists?(key, locale) 
I18n.exists?('do_i_exist', :en) 
+0

Questo è in realtà di lavoro. Tuttavia, il metodo non è documentato: http://www.rubydoc.info/github/svenfuchs/i18n/master/I18n/Backend/Base#exists%3F-instance_method – Cristian

+1

'I18n.exists? ('Chiave')) 'sembra la valutazione principale. L'ho usato in helper_methods per azioni fallback se non è impostato alcun valore chiave, ad es. 'title = I18n.exists? ('page_title.default')? t ('page_title.default'): "Titolo di fallback ..." ' –

1

Rails 4

ero iterazione su alcuni URL di membri della giuria. La quantità massima di url era 2 e default_lang era "de".Ecco l'yaml che ho usato

de: 
jury: 
    urls: 
    url0: http://www.example.com 
    name0: example.com 
    url1: 
    name1: 

en: 
jury: 
    urls: 
    url0: 
    name0: 
    url1: 
    name1: 

Ecco come ho controllato se ci fosse un URL dato e se non esistesse per un'altra lingua, sarebbe ripiego al I18n default_lang "de". Ho usato la risposta di @albandiguer che ha funzionato alla grande.

Spero che questo aiuta qualcuno:

<% 2.times do |j| %> 
     <% if I18n.exists?("jury.urls.url#{j}", "de") && 
      I18n.exists?("jury.urls.name#{j}", "de") %> 
      <%= "<br/>".html_safe if j == 1%> 
      <a href="<%= t("jury.urls.url#{j}") %>" target="_blank"> 
      <%= t("jury.urls.name#{j}") %> 
      </a> 
     <% end %> 
    <% end %>