12

我使用国际的英语(en)法语(FR)缺少翻译错误,我已经使用en.yml有限使用和大多数翻译我在fr.yml正在写。的Rails:删除

区域设置为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。

或者如果这是不可能的,那么应该删除整个错误信息。

感谢

回答

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 
+0

谢谢。尽管如此,我还是无法完成此工作: - /我把它放在'config/initializers/i18n.rb'中,文件正确加载,但我仍然得到''标签...使用'I18n.method(:t).source_location'我结束了'i18n-0.6.9/lib/i18n.rb',它定义了模块'I18n',这个目录下没有'I18nHelper'模块的踪迹? (将模块更改为'I18n'没有使它工作)...我用错了吗?我错过了一步吗? – Carpetsmoker

+0

这是一个定期的帮手模块,应该进入app/helpers。我编辑了这篇文章来澄清这一点。 –

+0

谢谢,对于一名新人来说这不是太明显。 ;) – Carpetsmoker

1

试试这个

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

,并在您en.yml文件写

search: 'Search' 
+0

你的意思是它不会给翻译错误,我想写的模板,在通常英语,翻译我只希望其他语言 –

+0

T(“搜索”)transaltion是不是他们在你的en.yml文件中,以便添加此像 - 搜索:'搜索'和电话像t(:搜索) –

+0

首先阅读的问题,你告诉我要做的是添加翻译到en.yml相同,我不想那 –

2

如果你不想填写翻译英文,一个可能的解决方案在这里将会让你的翻译回到法文。

你可以通过添加如下代码到一个初始化(如:config/initalizers/i18n.rb)实现这一点:

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

如果法国被设置为默认的语言环境,这应该“只是工作”。

否则,你可能需要一个定制的后备规则添加到初始化:

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

是的,我只是使用自定义回退,谢谢 –

4

的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" 
+0

我试过使用它,但没有为我工作,我已经得到解决方案,将很快发布。谢谢 –

+0

什么都不起作用?适用于我的应用程序。 –

+0

我不明白一些对象期望错误即将到来。我想不出 –

1

考虑下面的代码是消除漏译对I18N的英语,我们猴子补丁MissingTranslation模块,通过把我t在初始化程序中。

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 
11

一见钟情Rails I18n guide似乎相当不错,并覆盖这相当不错(例如一个例子来声明一个自定义异常处理程序)。

但是根据this ticket它不适用于自4.0.2以上的rails(但应该在最新的rails 4.1发行版中修复)。

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

可用选项:

  • 明确添加选项raise: true,这将迫使的ExceptionHandler使用。例如。 t('.missing', raise: true)
  • 在最新轨4.1版本中,您可以设置默认行为回到抛出一个异常:config.action_view.raise_on_missing_translations = true(见merge ticket获取更多信息)
  • 或可选择地,明确地添加一个默认选项:t('.missing', default: 'use this instead')
+0

谢谢。改变所有的't()'只是为了帮助我进行开发是不可行的;设置异常处理程序似乎可行,但似乎根本没有任何异常被拦截(请参阅:http://pastebin.com/G8qyXtsz)...'I18n :: MissingTranslation :: Base :: to_exception'仍在调用中。 ..: -/ – Carpetsmoker

+0

附录:它*确实*从'rails c'按预期工作,但*从* HAML模板中不能* ...? – Carpetsmoker

+0

您是否尝试设置提及的配置标志?事实上,在视图中,除非你设置了配置标志,否则不会再提出异常,或者明确地给出'raise => true'选项。 – nathanvda

-1

在Rails 4.1,我是不是能够得到这对国际化异常处理工作(也有一些缺陷,显然,看到nathanvda's answer
后来我加入这个覆盖了message功能config/initializers/i18n.rb

module I18n 
    class MissingTranslation 
    module Base 
     def message 
     keys[1..-1].join('.') 
     end 
    end 
    end 
end