it-swarm.com.de

Rails I18n, ob Übersetzung vorhanden ist?

Wenn Sie an einer Rails 3-App arbeiten, bei der ich prü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:

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

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

57
agmcleod

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

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

Einzelheiten finden Sie in der Dokumentation documentation .

97
Chris Salzberg

Sie können auch verwenden 

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

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

helfer/application.rb:

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

eine beliebige 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 %>
34
Nowaker

Was ist damit?

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

Ich denke, es fühlt sich besser an, eher wie es gibt keine Übersetzung

Achtung: funktioniert nicht, wenn Sie absichtlich einen leeren String als Übersetzungswert haben.

18
Jeremy F.

verwenden Sie: Standardparameter:

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

manchmal möchten Sie mehr für Übersetzungen tun

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

Schienen 4

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

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

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

So habe ich überprüft, ob eine URL angegeben wurde und falls diese nicht für eine andere Sprache vorhanden wäre, würde sie auf das I18n default_lang "de" zurückgreifen. Ich habe die Antwort von @albandiguer verwendet, die super 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 %>
2
mahatmanich

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

Angenommen, Sie haben folgendes 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 Stammschlüssel testen, da Sie das Elternteil betrachten.

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

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

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

Sie können entweder einen Schlüssel als String oder mehrere Schlüssel als String-Array angeben. Die erste Lösung wird zurückgegeben.

Beispiel:

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

Sie können auch Contexts verwenden. t falls kein Schlüssel in einem Kontext gefunden wurde gibt den Standardwert zurück.

0
Gabrielizalo