web-dev-qa-db-fra.com

Rails I18n, vérifiez si la traduction existe?

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?

57
agmcleod

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.

97
Chris Salzberg

Vous pouvez aussi utiliser 

I18n.exists?(key, locale)
I18n.exists?('do_i_exist', :en)
52
albandiguer

: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 %>
34
Nowaker

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.

18
Jeremy F.

use: paramètre par défaut:

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

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
3
Fer Padron

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

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"}
2
rchampourlier