Rails I18n,检查翻译是否存在?

在rails 3应用程序上工作,我想在输出之前检查翻译是否存在,如果不存在则回退到某些静态文本。 我可以做这样的事情:

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

但我觉得应该有比这更好的方法。 如果将来rails会将“翻译缺失”改为“翻译未find”。 或者,如果出于某种奇怪的原因文本包含“翻译缺失”。 有任何想法吗?

根据你所描述的,这应该工作:

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

详细信息请参阅文档 。

你也可以使用

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

:default并不总是一个解决scheme。 用于更高级的情况:

佣工/ 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? 

我只是觉得感觉好多了,更像是没有翻译

警告:如果您有意将空string作为翻译值,则不起作用。

使用:默认参数:

 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" 

注意:这只适用于你正在testing父密钥以外的其他任何东西。

实际上,有趣的是当你请求父键的时候你可以得到什么。

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

Rails 4

我正在迭代一些评委成员的网站。 url的最大数量是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“德”。 我使用了很好的@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 %>