78

翻訳を出力する前に翻訳が存在するかどうかを確認したいRails3アプリで作業し、存在しない場合は静的テキストにフォールバックします。私は次のようなことをすることができます:

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

しかし、それよりも良い方法があるはずだと思います。将来、railsが「translationmissing」を「translationnotfound」に変更した場合はどうなりますか。または、なんらかの奇妙な理由でテキストに「翻訳がありません」が含まれている場合はどうなりますか。何か案は?

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常に解決策とは限りません。より高度なケースにはこれを使用します。

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 %>
于 2013-06-15T14:11:41.833 に答える
20

これはどうですか ?

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

翻訳がないように、気分が良くなると思います

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

于 2012-09-26T09:50:13.503 に答える
11

:default paramを使用します:

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

Rails 4

私は陪審員のいくつかの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があるかどうかを確認する方法であり、別の言語に存在しない場合は、I18ndefault_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

いくつかのバージョン前には、i18nextドキュメント> API> t:より簡単な方法があります。

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

例:

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

また、コンテキストを使用することもできます。コンテキストへのキーtが見つからない場合は、デフォルト値を返します。

于 2018-12-12T17:00:17.413 に答える