我正在使用英语(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。
如果无法做到这一点,则应删除整个错误消息。
由于
答案 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)
。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}}