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

PHP网站多语言菜单功能异常,请求排查逻辑问题

PHP多语言菜单问题修复

原代码核心问题

  • 默认语言未处理:当URL无语言前缀时,$current_language为空,后续调用$languages[$current_language]会触发数组键不存在的错误,导致str_replace无法执行。
  • URL匹配逻辑不严谨:strpos(..., $selector) === 0仅匹配前缀完全一致的情况,无法兼容/en(无结尾斜杠)或/en/about/这类URL;同时str_replace会替换URL中所有出现的语言前缀,而非仅开头部分。
  • 语言名称错误:es对应的名称写为"Spain"(国家名),应改为"Spanish"(语言名)。

修复后的代码

<?php
$languages = array(
    "en" => array("name" => "English", "selector" => "/en/", "image" => "en.png"),
    "fr" => array("name" => "French", "selector" => "/fr/", "image" => "fr.png"),
    "de" => array("name" => "German", "selector" => "/de/", "image" => "de.png"),
    "it" => array("name" => "Italian", "selector" => "/it/", "image" => "it.png"),
    "si" => array("name" => "Slovene", "selector" => "/si/", "image" => "si.png"),
    "es" => array("name" => "Spanish", "selector" => "/es/", "image" => "es.png")
);

$current_url = $_SERVER['REQUEST_URI'];
$current_language = "en"; // 预设默认语言为英文

// 匹配当前URL的语言前缀
foreach ($languages as $code => $language) {
    // 用正则匹配开头的语言前缀,兼容/en、/en/xxx等格式
    if (preg_match("#^" . preg_quote($language['selector'], '#') . ".*#", $current_url)) {
        $current_language = $code;
        break;
    }
}

// 生成对应语言的跳转URL
function getLanguageUrl($currentUrl, $currentLangSelector, $targetLangSelector) {
    if ($currentLangSelector === $languages['en']['selector']) {
        // 默认语言URL无前缀,直接添加目标语言前缀
        return $targetLangSelector . ltrim($currentUrl, '/');
    } else {
        // 替换开头的当前语言前缀为目标前缀
        return preg_replace("#^" . preg_quote($currentLangSelector, '#') . "#", $targetLangSelector, $currentUrl);
    }
}
?>

<div id="language-menu">
    <ul>
        <?php
        foreach($languages as $code => $language){
            $current_selector = $languages[$current_language]['selector'];
            $new_url = getLanguageUrl($current_url, $current_selector, $language['selector']);
            
            if($code === $current_language){
                echo '<li class="active">'.$language['name'].'</li>';
            } else {
                echo '<li><a href="'.$new_url.'">'.$language['name'].'</a></li>';
            }
        }
        ?>
    </ul>
</div>

关键修复说明

  1. 默认语言兜底:初始化$current_language为默认语言,避免空键报错。
  2. 正则精准匹配:用preg_match匹配开头的语言前缀,兼容多种URL格式,同时用preg_quote转义特殊字符,避免正则语法冲突。
  3. 定向URL替换:自定义函数区分默认语言和带前缀URL的处理逻辑,确保仅替换开头的语言前缀,不会误改URL中间内容。
  4. 修正语言名称:将es的名称改为规范的语言名Spanish。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:45:14