2012-09-10 75 views
47

在導軌3應用程序上工作,我想在輸出前檢查翻譯是否存在,如果不存在,則回退到某些靜態文本。我可以做這樣的事情:Rails I18n,檢查翻譯是否存在?

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

但我覺得應該有一個比這更好的方法。如果將來rails會將「翻譯缺失」更改爲「找不到翻譯」,會怎麼樣?或者,如果出於某種奇怪的原因,該文本包含「翻譯缺失」。有任何想法嗎?

回答

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

軌道4

我迭代在一些評審團成員的網站上。網址的最大數量是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這是我如何檢查是否有獲得一個網址,如果它沒有爲另一種語言存在,它會回退到的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 %>