78

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

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

但我觉得应该有比这更好的方法。如果将来 Rails 将“翻译缺失”更改为“未找到翻译”怎么办。或者如果由于某种奇怪的原因文本包含“翻译缺失”怎么办。有任何想法吗?

4

9 回答 9

138

根据您所描述的,这应该有效:

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

有关详细信息,请参阅文档

于 2012-09-10T14:11:16.750 回答
78

你也可以使用

I18n.exists?(key, locale)
I18n.exists?('do_i_exist', :en)
于 2015-11-06T00:49:32.777 回答
36

:default并不总是一个解决方案。将此用于更高级的情况:

助手/应用程序.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 %>
于 2013-06-15T14:11:41.833 回答
20

那这个呢 ?

I18n.t('some_translation.key', :default => '').empty?

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

警告:如果您故意将空字符串作为翻译值,则不起作用。

于 2012-09-26T09:50:13.503 回答
11

使用:默认参数:

I18n.t("some_translation.key", :default => 'some text')
于 2012-09-10T14:11:15.997 回答
4

有时你想在翻译上做更多的事情失败了

v = "doesnt_exist"
begin
  puts I18n.t "langs.#{v}", raise: true
rescue
  ...
  puts "Nooo #{v} has no Translation!"
end
于 2014-04-20T15:21:16.557 回答
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"}
于 2014-08-29T16:08:35.830 回答
2

导轨 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“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 %>
于 2016-01-14T14:09:03.333 回答
0

Some versions ago there is a easier way i18next documentation > API > t:

You can specify either one key as a String or multiple keys as an Array of String. The first one that resolves will be returned.

Example:

i18next.t ( ['unknown.key', 'my.key' ] ); // It will return value for 'my.key'

Also you can use Contexts. t if not found a key into a context returns the default value.

于 2018-12-12T17:00:17.413 回答