2012-09-10 19 views
47

出力する前に翻訳が存在するかどうかをチェックしたい場合はレール3アプリケーションで作業し、存在しない場合は静的テキストに戻します。私は次のようなことをすることができます:Rails I18n、翻訳が存在するかどうかを確認しますか?

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

しかし、私はそこより良い方法があるはずです。将来のレールが "翻訳が見つからない"を "翻訳が見つかりません"に変更するとどうなりますか?または、何らかの奇妙な理由でテキストに「翻訳がない」と表示されている場合はどうなりますか?何か案は?

答えて

84

が、これは動作するはずです:

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

詳細はdocumentationを参照してください。

11

使用:デフォルトのparam:あなたが説明した内容に基づいて

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

これはどうですか?あなたが意図的に翻訳値として空の文字列を持っている場合は動作しません:

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

は、私はちょうどそれがより良い感じだと思い、よりようには翻訳

警告はありません。

32

: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

時々あなたが翻訳でより多くのことをしたいが

v = "doesnt_exist" 
begin 
    puts I18n.t "langs.#{v}", raise: true 
rescue 
    ... 
    puts "Nooo #{v} has no Translation!" 
end 
を失敗しました
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" 

はNBをあなたが親を見ているからです。実際に

、どのような興味深いのは、親キーを要求するときあなたが得ることができるものである...

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

また、私が反復された

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

私はこれが誰かに役立ちます願っています。この方法については、ここでは触れていません。http://www.rubydoc.info/github/svenfuchs/i18n/master/I18n/Backend/Base#exists%3F-instance_method – Cristian

+1

'I18n.exists?( 'key' )はコア評価のようだ。キー値が設定されていない場合、私はhelper_methodsでフォールバックアクションを使用しました。 'title = I18n.exists?( 'page_title.default')? t( 'page_title.default'): "フォールバックのタイトル..." –

1

Railsの4

を使用することができます陪審員のいくつかのURLにURLの最大量は2で、default_langは "de"でした。ここで私は

de: 
jury: 
    urls: 
    url0: http://www.example.com 
    name0: example.com 
    url1: 
    name1: 

en: 
jury: 
    urls: 
    url0: 
    name0: 
    url1: 
    name1: 

を使用YAMLは、ここで指定したURLがあった場合、私がチェックする方法です、それは別の言語には存在しなかった場合、それは国際化の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 %> 
関連する問題