kavo

PHP 使用浏览器语言头和 IP 来指定国际化多语言网站

前提:使用 wordpress ,未安装多语言插件,使用主题自己开发,使用 Poedit 来制作多语言,对应 zh_CN 这种。

第一:首先判断是否存在 GET 变量,然后 COOKIE 存储。

第二:使用浏览器头部标识来判断,这里找了一个国外作者写的一个函数来更好的获取语言标识,该函数返回两个字符,比如 zh 或者 en, 当然你也可以在结合$http_accept_language判断是否为 zh 中的 cn 或者 tw

function prefered_language($http_accept_language){

    $langs = array();
    preg_match_all('~([\w-]+)(?:[^,\d]+([\d.]+))?~', strtolower($http_accept_language), $matches, PREG_SET_ORDER);
    foreach($matches as $match) {

        list($a, $b) = explode('-', $match[1]) + array('', '');
        $value = isset($match[2]) ? (float) $match[2] : 1.0;
        $langs[$a] = $value - 0.1;
    }
    if($langs) {
        arsort($langs);
        return key($langs); // We don't need the whole array of choices since we have a match
    }
}

第三使用 IP 来判断,因为有些搜索引擎不携带 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 标识:

function ip_language($locale) {
    //自定义获取 ip 函数
    $ip = get_ip();
    $request = 'https://extreme-ip-lookup.com/json/'.$ip;
    $response = json_decode(curl_get($request),true);
    //请求成功
    if($response['status'] == 'success' && $response['countryCode']) {
        //国家代码
        $countryCode = $response['countryCode'];
        //洲代码
        $continent = $response['continent'];
        if($countryCode == 'TW' || $countryCode == 'HK' || $countryCode == 'SG') {
            setcookie('language', 'zh_TW');
            return 'zh_TW';
        }

        if($countryCode == 'CN') {
            setcookie('language', 'zh_CN');
            return 'zh_CN';
        }

        //北美
        if($continent == 'North America') {
            setcookie('language', 'en_US');
            return 'en_US';
        }
        

    } else {
        //返回默认语言
        return $locale;
    }
}

因为 wordpress 的 Poedit 采用 zh_CN 这种,所以开发时记得比对。

要用到浏览器规范语言头列表,和获取国家信息的全球国家标识规范列表,这里找到了两个网站使用比对处理:

Web browser language identification codes, 浏览器语言信息大全:

https://www.metamodpro.com/browser-language-codes

iso 规范全球国家名称以及简码;

https://www.iso.org/obp/ui/#search/code/

posted on   下雨天唱情歌  阅读(12)  评论(0编辑  收藏  举报  

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示