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?
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..."
:default
ist 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 %>
quelle
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.
quelle
use: default param:
I18n.t("some_translation.key", :default => 'some text')
quelle
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
quelle
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"}
quelle
I18n.t('key.special_value', default: I18n.t('key.default_value'))
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 %>
quelle
Vor einigen Versionen gibt es einen einfacheren Weg i18next Dokumentation> API> t :
Beispiel:
i18next.t ( ['unknown.key', 'my.key' ] ); // It will return value for 'my.key'
Sie können auch Kontexte verwenden .
t
Wenn kein Schlüssel in einem Kontext gefunden wird, wird der Standardwert zurückgegeben.quelle