12

我使用國際的英語(en)法語(FR)缺少翻譯錯誤,我已經使用en.yml有限使用和大多數翻譯我在fr.yml正在寫。的Rails:刪除

區域設置爲fr一切正常,但與en它顯示我錯誤作爲缺失的翻譯範圍。

對於例如,如果我有像

<%= text_field_tag("search", params[:search], :placeholder=>t("Search"), :class=>"search_input") %> 

,我也得到輸出EN爲:

<input class="search_input" id="search" name="search" placeholder="<span class=" translation_missing"="" title="translation missing: en.Search"> 

我要的是,它應該關閉翻譯錯誤的英語,因爲英文是我的默認語言,但對於某些情況我使用了en.yml。

或者如果這是不可能的,那麼應該刪除整個錯誤信息。

感謝

回答

22

在Rails 4.1中更改了HTML缺失的轉換錯誤。現在不是I18n庫,它是在視圖幫助器層上處理的。也就是說,在「翻譯」輔助方法中(請參閱action_view/helpers/translation_helper.rb)。

現在乾淨的方法是重寫輔助方法並自己處理異常。

# app/helpers/i18n_helper.rb 

module I18nHelper 
    def translate(key, options={}) 
    super(key, options.merge(raise: true)) 
    rescue I18n::MissingTranslationData 
    key 
    end 
    alias :t :translate 
end 
+0

謝謝。儘管如此,我還是無法完成此工作: - /我把它放在'config/initializers/i18n.rb'中,文件正確加載,但我仍然得到''標籤...使用'I18n.method(:t).source_location'我結束了'i18n-0.6.9/lib/i18n.rb',它定義了模塊'I18n',這個目錄下沒有'I18nHelper'模塊的蹤跡? (將模塊更改爲'I18n'沒有使它工作)...我用錯了嗎?我錯過了一步嗎? – Carpetsmoker

+0

這是一個定期的幫手模塊,應該進入app/helpers。我編輯了這篇文章來澄清這一點。 –

+0

謝謝,對於一名新人來說這不是太明顯。 ;) – Carpetsmoker

1

試試這個

<%= text_field_tag("search", params[:search], :placeholder=>t(:search), :class=>"search_input") %> 

,並在您en.yml文件寫

search: 'Search' 
+0

你的意思是它不會給翻譯錯誤,我想寫的模板,在通常英語,翻譯我只希望其他語言 –

+0

T(「搜索」)transaltion是不是他們在你的en.yml文件中,以便添加此像 - 搜索:'搜索'和電話像t(:搜索) –

+0

首先閱讀的問題,你告訴我要做的是添加翻譯到en.yml相同,我不想那 –

2

如果你不想填寫翻譯英文,一個可能的解決方案在這裏將會讓你的翻譯回到法文。

你可以通過添加如下代碼到一個初始化(如:config/initalizers/i18n.rb)實現這一點:

require "i18n/backend/fallbacks" 
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks) 

如果法國被設置爲默認的語言環境,這應該「只是工作」。

否則,你可能需要一個定製的後備規則添加到初始化:

I18n.fallbacks.map(:en => :fr) 
+0

是的,我只是使用自定義回退,謝謝 –

4

的I18n庫使用異常處理程序來決定如何處理缺少的翻譯做。 默認情況下,它會返回「翻譯失蹤」的消息:

# i18n/exceptions.rb 
class I18n::ExceptionHandler 
    include Module.new { 
    def call(exception, locale, key, options) 
     if exception.is_a?(MissingTranslation) 
     # Rails sets :rescue_format to :html in views 
     # so that you will get span tag instead of just text message 
     options[:rescue_format] == :html ? exception.html_message : exception.message 
     elsif exception.is_a?(Exception) 
     raise exception 
     else 
     throw :exception, exception 
     end 
    end 
    } 
end 

您可以擴展異常處理程序只返回平移鍵時,翻譯是丟失:

# config/initializers/i18n.rb 
module UseKeyForMissing 
    def call(exception, locale, key, options) 
    if exception.is_a?(I18n::MissingTranslation) 
     key 
    else 
     super 
    end 
    end 
end 

I18n.exception_handler.extend UseKeyForMissing 

然後假設你只有法語翻譯:

I18n.t("Search", :locale => :fr) #=> "Rechercher" 
I18n.t("Search", :locale => :en) #=> "Search" 
+0

我試過使用它,但沒有爲我工作,我已經得到解決方案,將很快發佈。謝謝 –

+0

什麼都不起作用?適用於我的應用程序。 –

+0

我不明白一些對象期望錯誤即將到來。我想不出 –

1

考慮下面的代碼是消除漏譯對I18N的英語,我們猴子補丁MissingTranslation模塊,通過把我t在初始化程序中。

DEFAULT_TEMPLATE_LANG = 'en'   
# Removing missing translation errors for english 
module I18n 
    class MissingTranslation 
    def html_message 
     if DEFAULT_TEMPLATE_LANG == keys[0].to_s 
     keys[1].to_s 
     else 
     "missing translation: #{keys.join('.')}" 
     end 
    end 
    end 
end 
11

一見鍾情Rails I18n guide似乎相當不錯,並覆蓋這相當不錯(例如一個例子來聲明一個自定義異常處理程序)。

但是根據this ticket它不適用於自4.0.2以上的rails(但應該在最新的rails 4.1發行版中修復)。

顯然行爲已經改變,異常處理程序現在被忽略。

可用選項:

  • 明確添加選項raise: true,這將迫使的ExceptionHandler使用。例如。 t('.missing', raise: true)
  • 在最新軌4.1版本中,您可以設置默認行爲回到拋出一個異常:config.action_view.raise_on_missing_translations = true(見merge ticket獲取更多信息)
  • 或可選擇地,明確地添加一個默認選項:t('.missing', default: 'use this instead')
+0

謝謝。改變所有的't()'只是爲了幫助我進行開發是不可行的;設置異常處理程序似乎可行,但似乎根本沒有任何異常被攔截(請參閱:http://pastebin.com/G8qyXtsz)...'I18n :: MissingTranslation :: Base :: to_exception'仍在調用中。 ..: -/ – Carpetsmoker

+0

附錄:它*確實*從'rails c'按預期工作,但*從* HAML模板中不能* ...? – Carpetsmoker

+0

您是否嘗試設置提及的配置標誌?事實上,在視圖中,除非你設置了配置標誌,否則不會再提出異常,或者明確地給出'raise => true'選項。 – nathanvda

-1

在Rails 4.1,我是不是能夠得到這對國際化異常處理工作(也有一些缺陷,顯然,看到nathanvda's answer
後來我加入這個覆蓋了message功能config/initializers/i18n.rb

module I18n 
    class MissingTranslation 
    module Base 
     def message 
     keys[1..-1].join('.') 
     end 
    end 
    end 
end