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?
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 .
Sie können auch verwenden
I18n.exists?(key, locale)
I18n.exists?('do_i_exist', :en)
: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 %>
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.
verwenden Sie: Standardparameter:
I18n.t("some_translation.key", :default => 'some text')
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
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 %>
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"}
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.