Ответ 1
Основываясь на том, что вы описали, это должно работать:
I18n.t("some_translation.key", :default => "fallback text")
Подробнее см. .
Работа с приложением rails 3, где я хочу проверить, существует ли перевод, прежде чем вывести его, а если он не существует, вернитесь к некоторому статическому тексту. Я мог бы сделать что-то вроде:
if I18n.t("some_translation.key").to_s.index("translation missing")
Но я чувствую, что должен быть лучший способ. Что, если рельсы в будущем изменят "перевод отсутствует" на "перевод не найден". Или что, если по какой-то странной причине текст содержит "перевод отсутствует". Любые идеи?
Основываясь на том, что вы описали, это должно работать:
I18n.t("some_translation.key", :default => "fallback text")
Подробнее см. .
Вы также можете использовать
I18n.exists?(key, locale)
I18n.exists?('do_i_exist', :en)
:default
не всегда является решением. Используйте это для более сложных случаев:
хелперы/application.rb:
def i18n_set? key
I18n.t key, :raise => true rescue false
end
любой шаблон ERB:
<% if i18n_set? "home.#{name}.quote" %>
<div class="quote">
<blockquote><%= t "home.#{name}.quote" %></blockquote>
<cite><%= t "home.#{name}.cite" %></cite>
</div>
<% end %>
Как насчет этого?
I18n.t('some_translation.key', :default => '').empty?
Я просто думаю, что он чувствует себя лучше, больше похоже, что нет перевода
Предостережение: не работает, если вы намеренно имеете пустую строку в качестве значения перевода.
use: default param:
I18n.t("some_translation.key", :default => 'some text')
иногда вы хотите сделать больше вещей при переводах
v = "doesnt_exist"
begin
puts I18n.t "langs.#{v}", raise: true
rescue
...
puts "Nooo #{v} has no Translation!"
end
Это трюк, но я думаю, что иногда это может быть полезно...
Предположим, что у вас есть это в вашем файле i18n:
en:
key:
special_value: "Special value"
default_value: "Default value"
Вы можете сделать это:
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"
Примечание. Это работает, только если вы тестируете что-либо, кроме корневого ключа, поскольку вы смотрите на родителя.
В самом деле, что интересно, что вы можете получить при запросе родительского ключа...
I18n.t('key')
# => {:special_value=>"Special value", :default_value=>"Default value"}
Рельсы 4
Я повторял некоторые URL-адреса членов жюри. Максимальное количество URL-адресов было 2, а default_lang - "de". Вот ямль, который я использовал
de:
jury:
urls:
url0: http://www.example.com
name0: example.com
url1:
name1:
en:
jury:
urls:
url0:
name0:
url1:
name1:
Вот как я проверил, был ли указан URL-адрес, и если он не существует для другого языка, он будет возвращаться к параметру "de" I18n default_lang. Я использовал ответ @albandiguer, который отлично работал.
Надеюсь, это поможет кому-то:
<% 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 %>
В некоторых версиях назад есть более простой способ i18следующая документация> API> t:
Вы можете указать либо один ключ в виде строки, либо несколько ключей в виде массива строки. Первый, который разрешит, будет возвращен.
Пример:
i18next.t( ['unknown.key', 'my.key' ] );//It will return value for 'my.key'
Также вы можете использовать контексты. t
, если не нашли ключ в контексте возвращает значение по умолчанию.