微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于用户权限的 Rails I18n 切换键

如何解决基于用户权限的 Rails I18n 切换键

我的路由中有一个命名空间:

namespace :fruit do
  resources :apple,only [:create,:destroy]
  resources :banana,only [:show]
end

以及我的翻译文件中的相同键:

en:
  fruit:
    apple:
      name: apple
    banana:
      name: banana

这很好用,如果我的用户具有特定权限 (user.is_a_vendor?),我想要做的是能够为命名空间部分使用全新的密钥。因此,对于供应商,例如,我希望翻译为 t('vendor.apple.name') 而不是 t('fruit.apple.name'),但我不想在我的所有视图中都必须有条件地这样做。有没有办法根据用户集中切换键?这似乎应该有一个简单的解决方案,但我似乎无法弄清楚。

我有很多视图已经设置了它们的键并且它们使用延迟加载,所以我想知道是否有一种方法可以有条件地更改延迟加载以在顶部使用不同的键。

编辑:

我不想使用我自己的自定义语言环境,因为我可能希望将这些语言翻译成英语以外的其他语言,如果我这样做,这个解决方案会导致问题。我也不想使用助手,因为它每次都会检查条件,我宁愿让它自动选择一个区域设置键。更多的研究引导我走上 i18n 自定义后端的道路:https://guides.rubyonrails.org/i18n.html#using-different-backendshttps://www.rubydoc.info/github/svenfuchs/i18n/master/I18n/Backend/Base#eager_load!-instance_method,这可能是我需要使用的东西吗?

解决方法

我会写一个帮手来为你完成转换。然后,您可以在视图中的任何地方使用自定义助手,并在助手内决定您希望将哪个父命名空间与请求的翻译连接。

,

我认为您可以创建供应商区域设置(例如 en_vendor),然后根据用户类型切换区域设置,因此在两种情况下您都可以保留键 t('fruit.apple.name') 或延迟查找 t('.apple.name')视图,根本不需要更改任何视图或替换(切换)键。

# controller
around_action :switch_locale

def switch_locale(&action)
 locale = current_user.is_a_vendor? ? :en_vendor : :en #"#{I18n.locale}_vendor"? 
 I18n.with_locale(locale,&action)
end

# en.yml
en:
  fruit:
    apple:
      name: apple
    banana:
      name: banana

en_vendor:
  fruit:
    apple:
      name: apple vendor
    banana:
      name: banana vendor

如果您已经有供应商的语言环境文件,我认为您可以复制/粘贴到或像上面的 en.yml 文件一样组织并切换语言环境,这比切换键更省力。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。