14

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

使用语言环境作为 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。

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

谢谢

4

7 回答 7

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
于 2014-04-17T16:12:14.810 回答
15

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

但是根据这张票,它在 4.0.2 及更高版本中不能在 rails 中工作(但应该在最新的 rails 4.1 版本中修复)。

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

可用选项:

  • 显式添加 option raise: true,这将强制使用异常处理程序。例如t('.missing', raise: true)
  • 在最新的 rails 4.1 版本中,您可以将默认行为设置回引发异常:(有关更多信息,config.action_view.raise_on_missing_translations = true请参阅合并票证)
  • 或者,显式添加默认选项:t('.missing', default: 'use this instead')
于 2014-04-23T10:40:32.047 回答
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

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

# 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"
于 2012-10-17T10:12:58.807 回答
2

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

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

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

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

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

I18n.fallbacks.map(:en => :fr)
于 2012-10-17T09:18:29.187 回答
1

试试这个

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

并在您的 en.yml 文件中写入

search: 'Search'
于 2012-10-16T11:52:27.463 回答
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
于 2012-12-28T11:39:14.360 回答
-1

在 Rails 4.1 中,我无法让它与 I18n 异常处理程序一起工作(显然有一些错误,请参阅nathanvda 的答案
最终我只是message通过将它添加到config/initializers/i18n.rb

module I18n
  class MissingTranslation
    module Base
      def message
        keys[1..-1].join('.')
      end
    end
  end
end
于 2014-04-23T12:28:44.137 回答