如何在rails中扩展I18n.translate方法?

时间:2011-07-15 11:07:50

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

现在,如果我在我的应用程序中有一些像

这样的代码
<%= t :test %>

并且没有可用的翻译:test我在我的视图中得到了类似的内容:

<span class="translation_missing" title="translation missing: en.test">Test</span>

我想补充的是即使对于现有翻译也要包含类似的范围,因此如果翻译存在,我希望得到类似的内容:

<span class="translation_existing" title="translation existing: en.test">Translated string</span>

注意范围中的不同类名。字符串应该真正翻译。

如何通过覆盖translate方法来实现此结果?

提前谢谢

Gnagno

2 个答案:

答案 0 :(得分:2)

“t”是一个视图助手: http://api.rubyonrails.org/classes/ActionView/Helpers/TranslationHelper.html#method-i-t

很容易查看其源代码并创建自己的源代码,您也可以通过在ApplicationHelper中重新定义它来覆盖帮助程序。

但是恕我直言,你不应该重新定义它,而是用不同的名字创建你自己的。有很多情况下你会想要在你的部分视图中使用“t”帮助器,如果你插入额外的HTML标记会搞砸(例如:我在我的页面部分使用“t”帮助器翻译标题,元标记等)...

答案 1 :(得分:1)

我创建了一个覆盖't'方法的帮助器,这只是'translate'的快捷方式:

def t(*a)           # I don't care what params go in
  key = a.first     # just want to override behaviour based on the key

  #if my overrides contain the key
  if value = @i18n_overrides["#{I18n.locale}.#{key}"] 
    return value # return the overrided value
  end

  translate(*a) # otherwise letting i18n do its thing
end

这些方法会更加干净,但它们对我不起作用:

尝试使用别名,但意识到在执行类体时该范围内不存在ttranslate

尝试拨打ActionView::Helpers::TranslationHelper.translate而不是translate,但这也不起作用。