ruby-on-rails – 覆盖rails translation helper

前端之家收集整理的这篇文章主要介绍了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的调用使用强制特定区域设置的额外业务逻辑.

猜你在找的Ruby相关文章