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

PHP法律详情页无法读取语言Cookie,始终显示默认德语求助

问题分析与修复方案

嘿,我来帮你搞定这个语言切换的问题!核心问题其实一眼就能看出来——你的法律详情页里用到了$language变量,但这个变量在头部代码里根本没被定义,所以当没有?lang参数时,代码会直接跳到最后的else分支,默认加载德语版本。

具体问题点

在法律详情页的这段代码里:

} else if ($language == 'de') {
    echo "german impressum b/c cookie";
    include 'impressum-de.php';
} else if ($language == 'en') {
    echo "english impressum b/c cookie";
    include 'impressum-en.php';
}

这里的$language变量完全是空的,因为你在头部代码里只通过$i18n->setForcedLang()设置了语言,但从来没把当前语言值赋值给$language,所以这两个条件永远不会成立,直接走默认的德语分支。

快速修复步骤

步骤1:在头部代码中定义$language变量

修改你的头部PHP代码,在每次调用$i18n->setForcedLang()后,同步把语言值赋值给$language:

require_once 'i18n.class.php';
$i18n = new i18n('lang/lang_{LANGUAGE}.ini', 'langcache/', 'de');

// 初始化默认语言
$language = 'de';

// 语言按钮及设置Cookie
if(isset($_GET['lang'])) {
    $lang=$_GET['lang'];
    if ($lang == 'de') {
        $i18n->setForcedLang('de');
        setcookie('language', 'lang-de', time() + 86400, '/');
        $language = 'de'; // 新增:同步赋值给$language
        // echo "german cookie set!"; // 调试语句建议上线前删除
    }
    if ($lang == 'en') {
        $i18n->setForcedLang('en');
        setcookie('language', 'lang-en', time() + 86400, '/');
        $language = 'en'; // 新增:同步赋值给$language
        // echo "english cookie set!"; // 调试语句建议上线前删除
    }
}
// 获取语言Cookie(仅当没有URL参数时生效)
else if (isset($_COOKIE['language'])) {
    if ($_COOKIE['language']== "lang-de") {
        // echo "german cookie is really set, now get it!";
        $i18n->setForcedLang('de');
        $language = 'de'; // 新增:同步赋值给$language
    } else if ($_COOKIE['language']== "lang-en") {
        // echo "english cookie is really set, now get it!";
        $i18n->setForcedLang('en');
        $language = 'en'; // 新增:同步赋值给$language
    }
} else {
    // echo "no cookie set";
    $language = 'de'; // 确认默认语言赋值
}
// 初始化对象:加载语言文件、解析缓存等
$i18n->init();

这里我还调整了逻辑顺序,让URL参数的优先级高于Cookie,同时去掉了冗余的调试echo语句(建议上线前删掉)。

步骤2:优化法律详情页的判断逻辑

现在$language变量已经有值了,你可以简化法律详情页的代码,让逻辑更清晰:

include 'templates/header.php';

// 优先使用URL参数的语言,否则用Cookie/默认的$language值
$currentLang = isset($_GET['lang']) ? $_GET['lang'] : $language;
// 验证语言合法性,防止非法参数导致加载不存在的文件
if (!in_array($currentLang, ['de', 'en'])) {
    $currentLang = 'de';
}

// 根据语言加载对应页面
echo $currentLang == 'de' ? "german impressum" : "english impressum";
include "impressum-$currentLang.php";

这样代码更简洁,还能避免用户传入非法lang参数(比如?lang=fr)导致的错误。

额外代码优化建议

  1. 封装语言处理逻辑:把语言判断、Cookie设置的代码抽成单独的函数或文件(比如lang-handler.php),所有页面都引用这个文件,避免重复代码,也方便后续维护。
  2. 去掉硬编码的语言值:可以把支持的语言列表定义成一个常量,比如define('SUPPORTED_LANGS', ['de', 'en']);,后续添加语言时只需要修改这个常量。
  3. 利用php-i18n的内置方法:php-i18n类其实有getAppliedLang()方法可以直接获取当前生效的语言,你也可以用这个方法代替手动维护$language变量,比如:
// 在头部代码init()之后,直接获取当前语言
$language = $i18n->getAppliedLang();

这样就不用每次设置setForcedLang()时都同步赋值了,更省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:06:58