ruby-on-rails - tutorial - rails i18n with parameters
Rieles I18n, comprobar si existe traducción? (8)
Trabajando en una aplicación de Rails 3 donde quiero comprobar si existe una traducción antes de publicarla, y si no existe, retrocede a un texto estático. Yo podría hacer algo como:
if I18n.t("some_translation.key").to_s.index("translation missing")
Pero siento que debería haber una mejor manera que esa. ¿Qué pasa si los rieles en el futuro cambian la "falta de traducción" a "no se encuentra la traducción". O qué sucede si, por alguna extraña razón, el texto contiene "falta traducción". ¿Algunas ideas?
A veces quieres hacer más cosas en las traducciones falla
v = "doesnt_exist"
begin
puts I18n.t "langs.#{v}", raise: true
rescue
...
puts "Nooo #{v} has no Translation!"
end
Basado en lo que has descrito, esto debería funcionar:
I18n.t("some_translation.key", :default => "fallback text")
Consulte la documentation para más detalles.
Esto es un truco pero creo que puede ser útil a veces ...
Asumiendo que tienes esto en tu 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"
NB: Esto solo funciona si está probando algo más que una clave raíz, ya que está mirando al padre.
De hecho, lo interesante es lo que puede obtener al solicitar una clave principal ...
I18n.t(''key'')
# => {:special_value=>"Special value", :default_value=>"Default value"}
Que hay de esto
I18n.t(''some_translation.key'', :default => '''').empty?
Simplemente creo que se siente mejor, más como si no hubiera traducción
Advertencia: no funciona si intencionalmente tiene una cadena vacía como valor de traducción.
Rieles 4
Estaba iterando sobre algunos urls de miembros del jurado. La cantidad máxima de urls era 2, y default_lang era "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í es cómo comprobé si había una url dada y si no existía para otro idioma, se recurriría al I18n default_lang "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 %>
También puedes usar
I18n.exists?(key, locale)
I18n.exists?(''do_i_exist'', :en)
uso: param predeterminado
I18n.t("some_translation.key", :default => ''some text'')
:default
no siempre es una solución. Use esto para casos más avanzados:
helpers / 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 %>