"php": ">=7.2",
"workerman/webman-framework": "^1.4.3",
"illuminate/validation": "^9.52",
"symfony/translation": "^6.0"
采用APIPOST接口请求软件,通过传header参数accept-language
实时更换语言
采用locale()设置语言中间件,本地语言包完全可以切换,但是illuminate/validation
插件无法实时切换语言,只能重启项目后生效,想大佬帮忙看看怎么回事
方式一和方式二都试过都是同样的效果
namespace hope\middleware;
use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;
class Lang implements MiddlewareInterface
{
/**
* @param Request $request
* @param callable $handler
* @return Response
*/
public function process(Request $request, callable $handler): Response
{
// 方式一:通过设置session
$session = $request->session();
$session->set('lang', getAcceptLang());
// 方式二:通过实时获取accept_language设置
locale(getAcceptLang());
var_dump(getAcceptLang());
return $handler($request);
}
}
通过手动修改语言参数translationLocale是会手动生效的(因为项目会重启),但是当第一次设置英语en参数进行接口软件APIPOST调试是可以生效的,但是第二次设置中文zh_cn参数则不生效!
public static function getInstance(string $translationLocale = 'zh_cn'): Factory
{
if (null === static::$instance) {
$translationPath = hope_path() . '/resource/translations';
$transFileLoader = new FileLoader(new Filesystem, $translationPath);
$translator = new Translator($transFileLoader, session('lang'));
static::$instance = new Factory($translator);
}
return static::$instance;
}
我想是不是代码缓存了,还是通过上次请求过的参数响应结果。希望大佬们可以帮忙看看怎么回事
整个单例模式,当然是只生效第一次,目测是这个原因造成的。
在webman里面,不要写 getInstance 这种东西
你用的单例,所以这个初始化语言代码只会执行一次,第一次是初始化的时候是 zh_cn ,那么以后所有请求都是zh_cn 了,这个应该很好理解。你应该每种语言都初始化一个instance,然后根据语言选择不同的instance
这样才对
谢谢大佬 亲测可用
大佬 请问你是如何使用illuminate/validation的?我使用的时候报错提示A facade root has not been set.