webman多语言组件严重BUG

tangzhangming

translation 是共享的单例 只要一个用户使用 locale() 函数 切换了语言,将导致整个网站的用户都切换了语言

想要切换语言 只能每次输出的时候 trans('hello', [], null, 'en'); 指定语言

而在FPM模式下,每次请求设定locale,设定locale后每次trans都使用locale设定的语言 下次请求需要读取用户设置的语言再次locale。locale本质上对单次请求有效,通过把用户个性化设置的语言储存在数据库或者cookie,可以达到locale对单个用户有效的效果,比如网站默认提供英文,用户可以自定义英文 日文,而且这个设定只对这个用户自己有效

而webman中由于共享了一个单例 通过locale设定语言后 对整个网站都生效,一个用户设置了英文 整个网站的所有用户都会看到英文,想要达到fpm模式的切换语言业务效果 只能在每次调用trans函数时再设定一次语言

这显然属于是一个BUG而不是webman独有的特性

356 3 0
3个回答

ljnchn

用户语言放到 session 里呢,简单封装一下

  • tangzhangming 10天前

    思路差不多 不过你这个方案有点问题

  • tangzhangming 10天前

    新用户第一次进来还没设定语言时,展示的语言是最后一个访问的用户设定的语言

  • tangzhangming 10天前

    还是得整个全局中间件,每次请求开始都重置成config中的默认语言,这个最好是群主能在框架中处理好

  • ljnchn 10天前

    没设定语言session没值,读的是配置里的默认语言。

  • tangzhangming 10天前

    那你不是每隔页面都要locale一下

  • 鲁达 10天前

    只能每次请求都要设置下语言,因为单例的话是针对每个worker进程的

  • 鲁达 10天前

    walkor大神也没必要处理,文档说明清楚就好了

  • ljnchn 10天前

    没办法,这个类提前注入的,只能这样处理,比每次都new也快着呢。

  • tangzhangming 10天前

    是的想了组件确实没必要改 不过框架中每次请求重置语言为默认还是有必要的

liziyu

用session + 中间件来做可以的!

  • tangzhangming 10天前

    是的 可以自己处理

  • tangzhangming 10天前

    最好是框架处理下 不处理也可以在文档中注明一下 ,毕竟和大部分框架包括其他常驻内存框架使用的方法有差别 容易被惯性思维误导

walkor

这个编程时注意下就行了。webman里单例是长生命周期,所有请求共享。
用中间件处理是推荐做法,这个样可以为每个请求设置明确的语言。

手册加了说明
https://workerman.net/doc/webman/components/translation.html#%E4%B8%BA%E6%AF%8F%E4%B8%AA%E8%AF%B7%E6%B1%82%E6%98%8E%E7%A1%AE%E7%9A%84%E8%AE%BE%E7%BD%AE%E8%AF%AD%E8%A8%80

  • liziyu 10天前

    赞👍

  • tangzhangming 10天前

    棒棒

  • tangzhangming 6天前

    文档里方案有问题,简单测试下没问题,并发高的情况下,中间件locale之后 trans之前的时间空隙,locale存在被其他请求重新设定locale的情况

  • walkor 6天前

    webman里请求是一个一个排队处理的,不会出现一个请求处理一半,处理另外一个请求的情况。所以应该不存在你说的问题。

🔝