CMS:客制化之多语言 - zhonglong/TPV GitHub Wiki
Xibo语言设置保存在数据库中:
- 原生:保存在 setting 表,通过 ConfigService 访问 DEFAULT_LANGUAGE 所在行;
- 客制化:每个用户单独设置语言,保存在 user 表的 language 列;
用户语言设置有两种方式, 一是在登录界面,选择简体中文或英文,登录成功后会进行设置,在 Xibo\Controller\Login; 二是在任意界面顶部,切换中英文语言, 在 Xibo\Controller\User;
以上两种方式只写入数据库,实际上要设置到 Xibo\Helper\Translate 才会生效,按照Xibo原生的逻辑,URL变化或者刷新页面都会重新载入语言,因此在以上两个时机去设置 Translate 是不会起作用的。
Xibo原生的语言设置在 Xibo\Middleware\State 的 setState 方法,调用 Translate::InitLocale 静态方法。但是此时无法访问用户信息,所以无法根据 $app-> user 来设置用户语言。
所以问题转化为,如何在 Login 或 User 下传递用户语言给 State ,尝试过静态变量,define方法都无法实现,最后采用 $_SESSION 方式才成功。但是访问session需要在调用 session_start() 之后,因此必须在 Xibo\Helper\Session 初始化完成才能去设置语言。