You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel维护模式预渲染视图中如何获取用户偏好语言?

解决Laravel维护模式下无法获取用户语言偏好的问题

维护模式下Laravel确实没有完全初始化请求、会话等核心组件,所以常规的request()、session()方法无法使用。你可以通过PHP原生方法获取请求头,手动解析用户的语言偏好,再设置应用区域来实现多语言维护页面。

方法一:在维护视图中手动解析语言头

直接在你指定的Blade维护视图(比如resources/views/errors/503.blade.php)顶部添加语言解析逻辑:

<?php
// 兼容不同服务器环境的请求头获取方法
if (!function_exists('getallheaders')) {
    function getallheaders() {
        $headers = [];
        foreach ($_SERVER as $name => $value) {
            if (substr($name, 0, 5) === 'HTTP_') {
                $headerName = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))));
                $headers[$headerName] = $value;
            }
        }
        return $headers;
    }
}

// 获取并解析Accept-Language头
$headers = getallheaders();
$defaultLang = 'en';
$preferredLang = $defaultLang;

if (isset($headers['Accept-Language'])) {
    // 拆分语言列表,按优先级排序
    $languageList = explode(',', $headers['Accept-Language']);
    foreach ($languageList as $langEntry) {
        $langEntry = trim($langEntry);
        // 去除权重参数(比如fr-FR;q=0.9)
        $langCode = explode(';', $langEntry)[0];
        // 提取短语言码(比如fr-FR取fr)
        $shortLang = substr($langCode, 0, 2);
        
        // 只处理你支持的语言
        if (in_array($shortLang, ['en', 'fr'])) {
            $preferredLang = $shortLang;
            break;
        }
    }
}

// 设置应用区域
app()->setLocale($preferredLang);
?>

之后就可以在视图中使用Laravel的翻译函数加载对应语言的内容:

<div class="maintenance-container">
    <h1>{{ __('maintenance.title') }}</h1>
    <p>{{ __('maintenance.message') }}</p>
</div>

然后创建对应语言的翻译文件:

  • 英文:resources/lang/en/maintenance.php
return [
    'title' => 'Site Under Maintenance',
    'message' => 'We will be back shortly. Thank you for your patience!'
];
  • 法语:resources/lang/fr/maintenance.php
return [
    'title' => 'Site en maintenance',
    'message' => 'Nous serons de retour très bientôt. Merci pour votre patience !'
];

方法二:自定义维护模式路由逻辑

如果你不想在视图里写PHP代码,可以通过自定义路由来处理维护模式的请求,替代--render选项:

在routes/web.php中添加以下代码:

if (app()->isDownForMaintenance()) {
    Route::get('/', function () {
        // 复用请求头解析逻辑
        if (!function_exists('getallheaders')) {
            function getallheaders() {
                $headers = [];
                foreach ($_SERVER as $name => $value) {
                    if (substr($name, 0, 5) === 'HTTP_') {
                        $headerName = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))));
                        $headers[$headerName] = $value;
                    }
                }
                return $headers;
            }
        }

        $headers = getallheaders();
        $preferredLang = 'en';
        if (isset($headers['Accept-Language'])) {
            $languageList = explode(',', $headers['Accept-Language']);
            foreach ($languageList as $langEntry) {
                $langCode = explode(';', trim($langEntry))[0];
                $shortLang = substr($langCode, 0, 2);
                if (in_array($shortLang, ['en', 'fr'])) {
                    $preferredLang = $shortLang;
                    break;
                }
            }
        }

        app()->setLocale($preferredLang);
        return view('errors.503');
    });
}

之后运行php artisan down时不需要加--render参数,访问应用会自动触发这个路由,返回对应语言的维护页面。


内容的提问来源于stack exchange,提问作者Cal El

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:37:04