webman多语言组件严重BUG

aphper

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

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

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

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

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

1589 3 0
3个回答

ersic

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

  • aphper 2022-05-10

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

  • aphper 2022-05-10

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

  • aphper 2022-05-10

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

  • ersic 2022-05-10

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

  • aphper 2022-05-10

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

  • 鲁达 2022-05-10

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

  • 鲁达 2022-05-10

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

  • ersic 2022-05-10

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

  • aphper 2022-05-10

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

liziyu

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

  • aphper 2022-05-10

    是的 可以自己处理

  • aphper 2022-05-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

年代过于久远,无法发表回答
🔝