Rails:删除丢失的翻译错误

我正在使用英语(en)法语(fr)的国际化 ,我使用en.yml用于有限的使用和我在fr.yml写​​的大部分翻译。

使用locale作为fr一切都很好,但是在en中它显示错误,因为缺少翻译范围。

例如,如果我有类似的东西

t("Search"), :class=>"search_input") %> 

我得到的输出是:

 <input class="search_input" id="search" name="search" placeholder=" 

我想要的是它应该关闭英语的翻译错误 ,因为英语是我的默认语言,但在某些情况下我使用了en.yml。

或者,如果这不可能,则应删除整个错误消息。

谢谢

在Rails 4.1中已经更改了HTML缺失翻译错误的实现。 现在代替I18n库,它在视图助手层上处理。 即,在“translate”辅助方法中(参见action_view / helpers / translation_helper.rb)。

现在一种干净的方法是覆盖辅助方法并自己处理exception。

 # 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 

乍一看, Rails I18n指南似乎非常好,并且很好地覆盖了它(例如声明自定义exception处理程序的示例)。

但根据此票据 ,自4.0.2及更高版本以来它在rails中不起作用(但应在最新的rails 4.1版本中修复)。

显然行为已经改变,现在忽略了exception处理程序。

可用选项:

  • 显式添加选项raise: true ,这将强制使用exceptionhandler。 例如t('.missing', raise: true)
  • 在最新的rails 4.1版本中,您可以将默认行为设置回引发exception: config.action_view.raise_on_missing_translations = true (有关详细信息,请参阅合并票证 )
  • 或者,显式添加一个默认选项: t('.missing', default: 'use this instead')

I18n库使用exception处理程序来决定如何处理缺失的翻译。 默认情况下,它返回“缺少翻译”消息:

 # 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 

您可以将exception处理程序扩展为仅在缺少翻译时返回翻译密钥:

 # 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" 

如果您不想填写英语翻译,这里可能的解决方案是让您的翻译回退到法语。

您可以通过将以下代码添加到初始化程序(例如config/initalizers/i18n.rb )来实现此config/initalizers/i18n.rb

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

如果将French设置为默认语言环境,则应该“Just Work”。

否则,您可能需要向初始化程序添加自定义回退规则:

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

试试这个

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

并在你的en.yml文件中写

 search: 'Search' 

鉴于以下代码是删除英语缺失的翻译,我们通过将其放入初始化器中来修补I18n的MissingTranslation模块。

 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 

在Rails 4.1中,我无法使用I18nexception处理程序(有一些错误,显然,请参阅nathanvda的答案 。
最后我通过将其添加到config/initializers/i18n.rb来覆盖messagefunction

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