web-dev-qa-db-ja.com

Rails I18n、翻訳が存在するかどうかを確認しますか?

Rails 3アプリで作業して、出力する前に翻訳が存在するかどうかを確認し、存在しない場合は静的テキストにフォールバックします。

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

しかし、私はそれよりも良い方法があるべきだと感じています。 Rails将来、「翻訳が見つかりません」が「翻訳が見つかりません」に変更されます。または、何らかの奇妙な理由でテキストに「翻訳が見つかりません」が含まれる場合はどうなりますか?

61
agmcleod

あなたが説明したことに基づいて、これは動作するはずです:

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

詳細については documentation をご覧ください。

102
Chris Salzberg

使用することもできます

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

:defaultは常に解決策とは限りません。これをより高度な場合に使用します。

helpers/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 %>
34
Nowaker

これはどうですか ?

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

翻訳がないのように気分が良くなったと思う

警告:変換値として意図的に空の文字列を使用している場合は機能しません。

18
Jeremy F.

:default param:を使用します

I18n.t("some_translation.key", :default => 'some text')
11
sumskyi

時々、翻訳でもっとしたいことがありますが失敗します

v = "doesnt_exist"
begin
  puts I18n.t "langs.#{v}", raise: true
rescue
  ...
  puts "Nooo #{v} has no Translation!"
end
3
Fer Padron

Rails 4

Ju審員のURLを何度も繰り返していました。 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 %>
2
mahatmanich

これはトリックですが、時々役立つかもしれません...

国際化ファイルにこれがあると仮定します:

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"

NB:これは、親を見ているため、ルートキー以外をテストする場合にのみ機能します。

実際、面白いのは、親キーを要求するときに取得できるものです...

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

以前のバージョンでは、もっと簡単な方法がありました i18next documentation> API> t

1つのキーを文字列として指定することも、複数のキーを文字列の配列として指定することもできます。最初に解決されるものが返されます。

例:

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

また、 Contexts を使用できます。 tが見つからない場合、keyto acontextデフォルト値を返します。

0
Gabrielizalo