2012-09-10 24 views
47

Trabajando en una aplicación de rails 3 donde quiero comprobar si existe una traducción antes de enviarla, y si no existe, retroceda a algún texto estático. Podría hacer algo como:Rieles I18n, compruebe si existe traducción?

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

Pero siento que debería haber una manera mejor que eso. ¿Qué pasa si los rieles en el futuro cambian la "traducción faltante" a "traducción no encontrada". O qué pasa si por alguna razón extraña el texto contiene "traducción faltante". ¿Algunas ideas?

Respuesta

84

Sobre la base de lo que has descrito, esto debería funcionar:

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

Véase el documentation para más detalles.

11

uso: param defecto:

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

¿Qué tal esto?

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

Sólo pienso que se siente mejor, más como no hay traducción

Advertencia: no funciona si tiene intencionadamente una cadena vacía como valor de la traducción.

32

:default no siempre es una solución. Utilizar esto para los casos más avanzados:

ayudantes/application.rb:

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

cualquier plantilla 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 veces se quiere hacer más cosas en traducciones falla

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

Esto es un truco, pero creo que a veces puede ser útil ...

Asumiendo que tiene esto en su archivo i18n:

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

Usted puede hacer esto:

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" 

Nota: Esto sólo funciona si se está probando cualquier cosa menos una raíz clave ya que estás mirando a los padres.

De hecho, lo que es interesante es lo que se puede obtener cuando se solicita una clave principal ...

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

También puede utilizar

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

Esto está trabajando realmente. Sin embargo, el método no está documentado, solo se menciona aquí: http://www.rubydoc.info/github/svenfuchs/i18n/master/I18n/Backend/Base#exists%3F-instance_method – Cristian

+1

'I18n.exists? ('Key') 'parece la evaluación central. Lo he usado en helper_methods para acciones secundarias si no se establece ningún valor clave, p. 'title = I18n.exists? ('page_title.default')? t ('page_title.default'): "Título alternativo ..." ' –

1

Carriles 4

me iterando sobre algunas direcciones URL de los miembros del jurado. La cantidad máxima de URL fue 2 y default_lang fue "de".Aquí está el yaml que utilicé

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

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

Aquí está cómo he comprobado si había una URL determinada y si no existiera para otro idioma, sería repliegue a la default_lang I18n "de". Utilicé la respuesta de @albandiguer, que funcionó muy bien.

espero que esto ayude a alguien:

<% 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 %>