V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Yesr00
V2EX  ›  PHP

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

  •  
  •   Yesr00 · 8 天前 · 1036 次点击

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

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

    return $next($request);

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

    8 条回复    2024-10-29 09:48:43 +08:00
    bugsnail
        1
    bugsnail  
       8 天前
    不知道你的 session 是怎么存的,应该顺序有问题;

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

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

    '''
    // 检查用户本地 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
        8
    ben1024  
       8 天前
    后端接口可以无状态的情况下,在前端把 cookie or local storage 设置,请求时带到接口中
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5504 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 03:41 · PVG 11:41 · LAX 19:41 · JFK 22:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.