Rails:删除缺少的翻译错误

时间:2012-10-16 11:47:06

标签: ruby-on-rails ruby-on-rails-3 internationalization rails-i18n

我正在使用英语(en)法语(fr)的国际化,我使用en.yml进行限制使用以及我写的大多数翻译fr.yml。

语言环境作为fr 一切正常,但 zh_cn显示错误,因为缺少翻译范围。

例如,如果我有类似

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

我得到的输出是:

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

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

如果无法做到这一点,则应删除整个错误消息。

由于

7 个答案:

答案 0 :(得分:22)

在Rails 4.1中更改了HTML缺失翻译错误的实现。现在代替I18n库,它在视图辅助层上处理。即,在&#34;翻译&#34;辅助方法(参见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

答案 1 :(得分:13)

乍一看,Rails I18n guide似乎相当不错,并且很好地覆盖了这一点(例如,声明自定义异常处理程序的示例)。

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

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

可用选项:

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

答案 2 :(得分:5)

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"

答案 3 :(得分:2)

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

您可以通过将以下代码添加到初始值设定项(例如config/initalizers/i18n.rb)来实现此目的:

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

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

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

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

答案 4 :(得分:1)

试试这个

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

并在你的en.yml文件中写

search: 'Search'

答案 5 :(得分:1)

鉴于下面的代码是为了删除缺少的英语翻译,我们将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

答案 6 :(得分:-1)

在Rails 4.1中,我无法使用I18n异常处理程序(有一些错误,显然,请参阅nathanvda's answer。) 最后,我将message添加到config/initializers/i18n.rb

来覆盖module I18n class MissingTranslation module Base def message keys[1..-1].join('.') end end end end 函数
{{1}}