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
来覆盖message
function
module I18n class MissingTranslation module Base def message keys[1..-1].join('.') end end end end