我希望I18n.translate()或I18n.t()使用特定的语言环境,但不是I18n.locale.
我不想每次都使用I18n.t(:my_key,locale :: my_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的调用使用强制特定区域设置的额外业务逻辑.