Rails:删除缺少的翻译错误

Par*_*ngh 13 ruby-on-rails internationalization ruby-on-rails-3 rails-i18n

我正在使用英语(en)法语(fr)的国际化,我使用en.yml进行有限的使用以及我在fr.yml中编写的大部分翻译.

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

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

<%= text_field_tag( "search", params[:search], :placeholder=>t("Search"), :class=>"search_input") %>
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

<input class="search_input" id="search" name="search" placeholder="<span class=" translation_missing"="" title="translation missing: en.Search">
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Sim*_*tsa 22

在Rails 4.1中已经更改了HTML缺失翻译错误的实现.现在代替I18n库,它在视图辅助层上处理.即,在"translate"辅助方法中(参见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
Run Code Online (Sandbox Code Playgroud)


nat*_*vda 13

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

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

显然行为已经改变,现在忽略异常处理程序.

可用选项:

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


Sim*_*tsa 6

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
Run Code Online (Sandbox Code Playgroud)

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

# 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
Run Code Online (Sandbox Code Playgroud)

假设您只有法语翻译:

I18n.t("Search", :locale => :fr) #=> "Rechercher"
I18n.t("Search", :locale => :en) #=> "Search"
Run Code Online (Sandbox Code Playgroud)