Rails I18n, prüfen Sie, ob eine Übersetzung vorhanden ist?

73

Wenn Sie an einer Rails 3-App arbeiten, in der ich überprüfen möchte, ob eine Übersetzung vorhanden ist, bevor Sie sie ausgeben, und wenn sie nicht vorhanden ist, greifen Sie auf statischen Text zurück. Ich könnte so etwas machen wie:

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

Aber ich denke, es sollte einen besseren Weg geben. Was ist, wenn Rails in Zukunft die "Übersetzung fehlt" in "Übersetzung nicht gefunden" ändert? Oder was ist, wenn der Text aus irgendeinem seltsamen Grund "Übersetzung fehlt" enthält. Irgendwelche Ideen?

Agmcleod
quelle

Antworten:

123

Basierend auf dem, was Sie beschrieben haben, sollte dies funktionieren:

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

Einzelheiten finden Sie in der Dokumentation .

Chris Salzberg
quelle
69

Sie können auch verwenden

I18n.exists?(key, locale)
I18n.exists?('do_i_exist', :en)
albandiguer
quelle
Das funktioniert tatsächlich. Die Methode ist jedoch nicht dokumentiert, nur hier erwähnt: rubydoc.info/github/svenfuchs/i18n/master/I18n/Backend/…
Cristian
1
I18n.exists?('key')scheint wie die Kernbewertung. Ich habe es in helper_methods für Fallback-Aktionen verwendet, wenn kein Schlüsselwert festgelegt ist, z. B.title = I18n.exists?('page_title.default') ? t('page_title.default') : "Fallback title..."
Robert Travis Pierce
34

:defaultist nicht immer eine Lösung. Verwenden Sie dies für fortgeschrittenere Fälle:

helpers / application.rb:

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

jede ERB-Vorlage:

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

Was ist damit?

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

Ich denke nur, es fühlt sich besser an, eher als gäbe es keine Übersetzung

Vorsichtsmaßnahme: Funktioniert nicht, wenn Sie absichtlich eine leere Zeichenfolge als Übersetzungswert haben.

Jeremy F.
quelle
11

use: default param:

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

Manchmal möchten Sie mehr tun, wenn Übersetzungen fehlschlagen

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

Dies ist ein Trick, aber ich denke, es kann manchmal nützlich sein ...

Angenommen, Sie haben dies in Ihrer i18n-Datei:

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

Sie können dies tun:

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: Dies funktioniert nur, wenn Sie etwas anderes als einen Root-Schlüssel testen, da Sie sich das übergeordnete Element ansehen.

Interessant ist in der Tat, was Sie erhalten können, wenn Sie einen übergeordneten Schlüssel anfordern ...

I18n.t('key')
# => {:special_value=>"Special value", :default_value=>"Default value"}
Romain Champourlier
quelle
Eine Zeile:I18n.t('key.special_value', default: I18n.t('key.default_value'))
Andoke
2

Schienen 4

Ich habe einige URLs von Jurymitgliedern durchgesehen. Die maximale Anzahl von URLs betrug 2 und default_lang war "de". Hier ist das Yaml, das ich verwendet habe

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

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

Hier ist, wie ich überprüft habe, ob eine URL angegeben wurde und ob sie für eine andere Sprache nicht vorhanden war, würde sie auf das I18n default_lang "de" zurückgreifen. Ich habe die Antwort von @albandiguer verwendet, was großartig funktioniert hat.

Ich hoffe das hilft jemandem:

    <% 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 %>
Mahatmanich
quelle
0

Vor einigen Versionen gibt es einen einfacheren Weg i18next Dokumentation> API> t :

Sie können entweder einen Schlüssel als Zeichenfolge oder mehrere Schlüssel als Array von Zeichenfolgen angeben. Der erste, der aufgelöst wird, wird zurückgegeben.

Beispiel:

i18next.t ( ['unknown.key', 'my.key' ] ); // It will return value for 'my.key'

Sie können auch Kontexte verwenden . tWenn kein Schlüssel in einem Kontext gefunden wird, wird der Standardwert zurückgegeben.

Gabrielizalo
quelle