ruby-on-rails – 覆盖rails translation helper

我希望I18n.translate()或I18n.t()使用特定的语言环境,但不是I18n.locale.
我不想每次都使用I18n.t(:my_key,locale :: my_locale),所以如果我可以覆盖函数本身就会很棒.

我试着把它放在一个新的帮手中:

# my_helper.rb
module MyHelper
  def translate(key,options = {})
    options[:locale] = MY_LOCALE
    I18n.translate key,options
  end
  alias :t :translate
end

这适用于像t(‘word’)这样的“硬键”,但没有找到像t(‘.title’)这样的“动态键”的正确路径,它应该使用我的部分路径,即de. users.form.title.

谢谢你的帮助!

解决方法

似乎在以下功能之间存在一些混淆:

> I18n.translate,来自I18n宝石和
> ActionView::Helpers::TranslationHelper#translate,来自Rails

I18n.translate不执行“懒惰查找”(即将查找键限定为当前的部分,如果它以点开头),这是您期望的.这是ActionView :: Helpers :: TranslationHelper#translate的一个特性,以及some others.

你的方法重写了ActionView :: Helpers :: TranslationHelper#translate,而没有调用super来获得延迟加载.所以,如果你想继续覆盖这个方法,我想你可能想要:

# my_helper.rb
module MyHelper
  def translate(key,options = {})
    # If you don't want to ignore options[:locale] if it's passed in,# change to options[:locale] ||= MY_LOCALE
    options[:locale] = MY_LOCALE 
    super(key,options)
  end
  alias :t :translate
end

就个人而言,我宁愿每次在没有覆盖的视图中使用t(:my_key,或者最多只有一个单独的辅助方法来包装对ActionView :: Helpers :: TranslationHelper#translate的调用使用强制特定区域设置的额外业务逻辑.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...