WordPress如何获取访客浏览器语言?get_user_locale无效问题
解决浏览器语言检测问题
首先要说明:get_user_locale() 是WordPress专属函数,它返回的是站点默认语言或者已登录用户的个人语言设置,和访客浏览器的语言偏好完全无关——这就是你切换浏览器语言后结果始终是pl_PL的原因。
要获取访客浏览器的语言,得直接读取HTTP请求头里的Accept-Language字段,下面是几种实用的实现方式:
1. 基础PHP解析方法(适配WordPress locale格式)
这个方法能解析出浏览器优先选择的语言,并转换成WordPress常用的xx_XX格式:
function get_browser_locale() { // 先判断服务器是否传递了语言头,没有就用默认值 if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { return 'en_US'; } // 分割浏览器发送的语言列表 $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); foreach ($languages as $lang) { // 去掉语言权重(比如 en-US;q=0.9 里的 ;q=0.9) $lang = trim(strtok($lang, ';')); // 把格式从 en-US 转换成 en_US $locale = str_replace('-', '_', $lang); // 可以只保留你站点支持的语言,避免无效值 $supported_locales = ['pl_PL', 'en_US']; if (in_array($locale, $supported_locales)) { return $locale; } // 如果精确匹配不到,尝试匹配语言前缀(比如 en-US 匹配 en_US) $lang_prefix = strtok($locale, '_'); foreach ($supported_locales as $supported) { if (str_starts_with($supported, $lang_prefix . '_')) { return $supported; } } } // 都匹配不到就返回默认值 return 'en_US'; } // 使用示例 $browser_locale = get_browser_locale(); echo $browser_locale;
2. 适配GTranslate的Cookie设置
如果你要给GTranslate插件设置Cookie,通常它的Cookie名称是gtranslate_lang,值是短语言代码(比如en或pl),可以用下面的代码:
function get_gtranslate_browser_lang() { if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { return 'en'; } $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); foreach ($languages as $lang) { $lang = trim(strtok($lang, ';')); // 提取短语言代码(比如 en-US → en) $short_lang = strtok($lang, '-'); // 只保留GTranslate支持的语言 $supported_langs = ['pl', 'en']; if (in_array($short_lang, $supported_langs)) { return $short_lang; } } return 'en'; } // 设置有效期30天的Cookie setcookie('gtranslate_lang', get_gtranslate_browser_lang(), time() + 30*24*60*60, '/');
注意事项
- 部分服务器可能不会传递
$_SERVER['HTTP_ACCEPT_LANGUAGE'],所以一定要设置默认 fallback 值 - 浏览器发送的语言格式可能有多种(
en-US/en/pl-PL等),要做好兼容处理 - 如果是WordPress环境,建议把代码放到主题的
functions.php里,或者自定义插件中
内容的提问来源于stack exchange,提问作者1zboro1
相关产品推荐
相关产品推荐

