Travailler sur une application Rails 3 où je veux vérifier si une traduction existe avant de la sortir, et si elle n'existe pas, retomber sur du texte statique. Je pourrais faire quelque chose comme:
if I18n.t("some_translation.key").to_s.index("translation missing")
Mais je pense qu’il devrait y avoir un meilleur moyen que cela. Que faire si Rails change la "traduction manquante" en "traduction introuvable". Ou si, pour une raison quelconque, le texte contient "traduction manquante". Des idées?
Selon ce que vous avez décrit, cela devrait fonctionner:
I18n.t("some_translation.key", :default => "fallback text")
Voir documentation pour plus de détails.
Vous pouvez aussi utiliser
I18n.exists?(key, locale)
I18n.exists?('do_i_exist', :en)
:default
n'est pas toujours une solution. Utilisez ceci pour les cas plus avancés:
helpers/application.rb:
def i18n_set? key
I18n.t key, :raise => true rescue false
end
n'importe quel 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 %>
Et ça ?
I18n.t('some_translation.key', :default => '').empty?
Je pense juste que ça va mieux, plus il n'y a pas de traduction
Avertissement: ne fonctionne pas si vous avez intentionnellement une chaîne vide comme valeur de traduction.
use: paramètre par défaut:
I18n.t("some_translation.key", :default => 'some text')
parfois vous voulez faire plus de choses sur les traductions échoue
v = "doesnt_exist"
begin
puts I18n.t "langs.#{v}", raise: true
rescue
...
puts "Nooo #{v} has no Translation!"
end
Rails 4
Je parcourais des urls de membres du jury. Le nombre maximal d'URL était de 2 et default_lang était "de". Voici le Yaml que j'ai utilisé
de:
jury:
urls:
url0: http://www.example.com
name0: example.com
url1:
name1:
en:
jury:
urls:
url0:
name0:
url1:
name1:
Voici comment j’ai vérifié s’il y avait une URL donnée et si elle n’existait pas pour une autre langue, elle se replierait sur la valeur par défaut de I18n. J'ai utilisé la réponse de @albandiguer qui a très bien fonctionné.
J'espère que ça aidera quelqu'un:
<% 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 %>
C'est un truc mais je pense que ça peut être utile parfois ...
En supposant que vous ayez ceci dans votre fichier i18n:
en:
key:
special_value: "Special value"
default_value: "Default value"
Vous pouvez faire ceci:
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: Cela ne fonctionne que si vous testez autre chose qu'une clé racine puisque vous regardez le parent.
En fait, ce qui est intéressant, c’est ce que vous pouvez obtenir lorsque vous demandez une clé parent ...
I18n.t('key')
# => {:special_value=>"Special value", :default_value=>"Default value"}