Yesr00
V2EX  ›  PHP

Laravel 二手项目,语言切换问题,求解

  •  
  •   Yesr00 · Oct 28, 2024 · 3715 views
    This topic created in 746 days ago, the information mentioned may be changed or developed.

    RT,创建了一个 SetLang 中间件, 代码如下:

    if($request->input('lang')){ app()->setLocale($request->input('lang')); }

    return $next($request);

    首次设置生效,切换页面不带'lang'参的时候在控制器里用 app()->getLocale()就还是只能拿到默认语言。使用 session 也是一样。检查了中间件的顺序,应该是没什么问题,也没有其他的地方有设置语言操作。求 debug 思路

    8 replies  •  2024-10-29 09:48:43 +08:00
    bugsnail
    bugsnail
    Oct 28, 2024
    1
    不知道你的 session 是怎么存的,应该顺序有问题;

    抛开这个不谈,理论上每次请求都是需要在 header 上带上 lang 标识会好点
    Yesr00
    Yesr00
    OP
    Oct 28, 2024
    2
    @bugsnail 目前在本地跑。session 啥的都是用的 file 。不过没搭环境,直接在 php artisan serve 里跑的。。。难道是因为这个问题?
    sagaxu
    sagaxu
    Oct 28, 2024
    3
    setLocale 只针对当前 request 生效,你要 session 级的,要在 middleware 里做
    Yesr00
    Yesr00
    OP
    Oct 28, 2024
    4
    @sagaxu 用 session(['app_locale'=>'en_us‘]) 这种来做存取然后中间件里对每个 request 做 setLocale()?
    bugsnail
    bugsnail
    Oct 28, 2024
    5
    @Yesr00 #4 差不多是这个意思

    因为都是无状态的,只有 session ,所以需要每次都 set
    iOCZS
    iOCZS
    Oct 28, 2024
    6
    放 cookie 不就好了
    keller
    keller
    Oct 29, 2024
    7
    供参考:

    '''
    // 检查用户本地 cookie 是否存在语言选择
    if (!$request->hasCookie('language ')) {
    // 如果不存在,则获取浏览器语言
    $acceptLanguage = $request->headers->get('Accept-Language');

    //检查是否中文
    if (strpos($acceptLanguage, 'zh-CN') !== false) {
    $language = 'zh-CN';
    } else {
    $language = 'en';
    }

    }else{
    $language = $request->cookie('language ');
    }
    // 设置语言
    app()->setLocale($language);
    '''
    ben1024
    ben1024
    Oct 29, 2024
    8
    后端接口可以无状态的情况下,在前端把 cookie or local storage 设置,请求时带到接口中
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2144 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 01:56 · PVG 09:56 · LAX 17:56 · JFK 20:56
    ♥ Do have faith in what you're doing.