在rails 3应用程序上工作,我想在输出之前检查翻译是否存在,如果它不存在则回退到某些静态文本。我可以做类似的事情:
if I18n.t("some_translation.key").to_s.index("translation missing")
但我觉得应该有更好的方法。如果将来的rails将“缺少翻译”更改为“未找到翻译”,该怎么办?或者,如果出于某些奇怪的原因,文本包含“翻译缺失”。有什么想法吗?
答案 0 :(得分:102)
根据您所描述的内容,这应该有效:
I18n.t("some_translation.key", :default => "fallback text")
有关详细信息,请参阅documentation。
答案 1 :(得分:56)
您也可以使用
I18n.exists?(key, locale)
I18n.exists?('do_i_exist', :en)
答案 2 :(得分:34)
: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 %>
答案 3 :(得分:18)
这个怎么样?
I18n.t('some_translation.key', :default => '').empty?
我认为感觉更好,更像没有翻译
警告:如果您故意将空字符串作为翻译值,则不起作用。
答案 4 :(得分:11)
使用:默认参数:
I18n.t("some_translation.key", :default => 'some text')
答案 5 :(得分:3)
有时你想在翻译失败时做更多的事情
v = "doesnt_exist"
begin
puts I18n.t "langs.#{v}", raise: true
rescue
...
puts "Nooo #{v} has no Translation!"
end
答案 6 :(得分:2)
这是一个技巧,但我认为它有时可能有用......
假设您的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"}
答案 7 :(得分:2)
Rails 4
我正在搜索一些陪审团成员的网址。最大网址数量为2,default_lang为“de”。这是我使用的yaml
de:
jury:
urls:
url0: http://www.example.com
name0: example.com
url1:
name1:
en:
jury:
urls:
url0:
name0:
url1:
name1:
以下是我如何检查是否有给定的URL以及如果其他语言不存在,它将回退到I18n default_lang“de”。我使用了@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 %>
答案 8 :(得分:0)
某些版本以前有一种更简单的方法i18next documentation > API > t:
您可以将一个键指定为字符串,也可以将多个键指定为字符串数组。第一个解决的问题将返回。
示例:
i18next.t ( ['unknown.key', 'my.key' ] ); // It will return value for 'my.key'
您也可以使用Contexts。 t
(如果未在 context 中找到 key 会返回默认值。