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)导致的错误。
额外代码优化建议
- 封装语言处理逻辑:把语言判断、Cookie设置的代码抽成单独的函数或文件(比如
lang-handler.php),所有页面都引用这个文件,避免重复代码,也方便后续维护。 - 去掉硬编码的语言值:可以把支持的语言列表定义成一个常量,比如
define('SUPPORTED_LANGS', ['de', 'en']);,后续添加语言时只需要修改这个常量。 - 利用php-i18n的内置方法:php-i18n类其实有
getAppliedLang()方法可以直接获取当前生效的语言,你也可以用这个方法代替手动维护$language变量,比如:
// 在头部代码init()之后,直接获取当前语言 $language = $i18n->getAppliedLang();
这样就不用每次设置setForcedLang()时都同步赋值了,更省心。
内容的提问来源于stack exchange,提问作者Raefiel
相关产品推荐
相关产品推荐

