最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP中针对区域语言标记信息的操作

    正文概述 转载于:掘金(PHP开源社区)   2021-07-10   45

    相信大家对 zh_CN 这个东西绝对不会陌生,不管是 php 中,还是在我们的网页上,都会见到它的身影。其实这就是指定我们的显示编码是什么国家或者地区的,使用何种语言。对于这种区域语言的标记来说,PHP 中也有很多好玩的内容。今天,我们要学习的 Locale 类就是操作区域语言相关内容的,它无法被实例化,所有全部功能方法都是静态的。

    获取及设置当前的区域语言信息
    首先就是我们可以动态地获取和设置相应的区域语言信息。

    // # echo $LANG;
    // en_US.UTF-8
    
    // php.ini
    // intl.default_locale => no value => no value
    
    echo Locale::getDefault(), PHP_EOL; // en_US_POSIX
    ini_set('intl.default_locale', 'zh_CN');
    echo Locale::getDefault(), PHP_EOL; // zh_CN
    Locale::setDefault('fr');
    echo Locale::getDefault(), PHP_EOL; // fr
    

    默认情况下,使用 getDefault() 方法获得的是 php.ini 文件中的 intl.default_locale 配置的内容。如果在 php.ini 中也没有配置的话,就会取操作系统的 $LANG 值里面的内容,也就是我们上面例子中输出的 en_US_POSIX ,POSIX 表示的就是来自操作系统的配置。

    使用 ini_set() 直接修改 ini 的配置或者使用 setDefault() 方法都是可以动态地修改当前的区域语言设置的。

    关于语言标记的规则
    在继续学习下面的内容之前,我们先来学习一下语言标记的规范。对于大多数人来说,可能只接触过 en_US 、 zh_CN 这类的标记,但其实它的完整定义是很长的,只是我们使用这种简写的方式时,很多内容会以默认的形式提供。完整的标记规则是:

    language-extlang-script-region-variant-extension-privateuse
    

    语言文字种类-扩展语言文字种类-书写格式-国家和地区-变体-扩展-私有
    也就是说,我们的 zh_CN 可以这样写:

    zh-cmn-Hans-CN-Latn-pinyin
    代表的是:zh 语言文字种类,Hans 书写格式为简体中文,cmn 普通话,CN 国家和地区,Latn 变体拉丁字母,pinyin 变体拼音。

    是不是感觉突然一下这么简单的东西一下子变得高大上了。另外,zh- 这个前缀现在已经不是推荐使用的了,zh- 现在已经不是语言 code 了,而是 macrolang 也就是宏语言,我们直接使用 cmn 、 yue(粤语)、wuu(吴语)、hsn(湘语,湖南话)这类的就可以当做 language 来使用了。因此,上面的那一段也可以这么写:

    cmn-Hans-CN-Latn-pinyin
    在上篇文章中,我们讲 NumberFormatter 时说过可以直接获得中文的数字格式的输出,现在我们想要繁体的结果呢?很简单,加上 Hant 标识书写格式为繁体中文即可。

    关于语言标记规则的内容,大家可以看看文末知乎的参考链接,介绍的更为详尽。

    $fmt = new NumberFormatter('zh-Hant', NumberFormatter::SPELLOUT);
    echo $fmt->format(1234567.891234567890000), PHP_EOL; 
    // 一百二十三萬四千五百六十七點八九一二三四五六七九
    

    获取指定语言标记规则中的各类信息
    学习了语言标记的规则之后能干什么呢?Locale 类最主要的功能就在于可以分析获取这些属性信息。

    单独获取各种属性信息

    echo Locale::getDisplayLanguage('cmn-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // cmn
    echo Locale::getDisplayLanguage('zh-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 中文
    
    echo Locale::getDisplayName('cmn-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // cmn(简体,中国,LATN_PINYIN)
    echo Locale::getDisplayName('zh-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 中文(简体,中国,LATN_PINYIN)
    
    echo Locale::getDisplayRegion('cmn-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 中国
    echo Locale::getDisplayRegion('zh-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 中国
    
    echo Locale::getDisplayScript('cmn-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 简体中文
    echo Locale::getDisplayScript('zh-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 简体中文
    
    echo Locale::getDisplayVariant('cmn-Hans-Latn-pinyin', 'zh_CN'), PHP_EOL; // LATN_PINYIN
    echo Locale::getDisplayVariant('zh-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // LATN_PINYIN
    

    我们分别使用两种标记方式来测试代码,可以看到结果的对比。

    • getDisplayLanguage() 方法用于获取显示的语言信息,也就是规则中的 language 内容。
    • getDisplayName() 方法用于获取标准的语言名称,可以看到内容更加地丰富。
    • getDisplayRegion() 方法很明显地就是获取到了国家信息。
    • getDisplayScript() 获取到的是书写格式的信息。
    • getDisplayVariant() 获取到的就是变体信息

    批量获取属性信息
    当然,我们也可以批量地获取到一些语言相关的信息。

    $arr = Locale::parseLocale('zh-Hans-CN-Latn-pinyin');
    if ($arr) {
        foreach ($arr as $key => $value) {
            echo "$key : $value ", PHP_EOL;
        }
    }
    // language : zh
    // script : Hans
    // region : CN
    // variant0 : LATN
    // variant1 : PINYIN
    

    使用 parseLocale() 方法就能获取到一个语言标记中的各类信息并保存在数组中,键为标记规则名,值为对应的内容,看看是不是和我们上面介绍的内容是一样的。

    获取所有变体信息
    从上面的代码中可以看出,我们有两个变体信息,这个也可以通过一个 getAllVariants() 方法来直接获得语言标记中的所有变体信息的数组。

    $arr = Locale::getAllVariants('zh-Hans-CN-Latn-pinyin');
    var_export($arr);
    echo PHP_EOL;
    //  array (
    //     0 => 'LATN',
    //     1 => 'PINYIN',
    //   )
    

    获取字符集相关信息

    echo Locale::canonicalize('zh-Hans-CN-Latn-pinyin'), PHP_EOL; // zh_Hans_CN_LATN_PINYIN
    
    $keywords_arr = Locale::getKeywords('zh-cn@currency=CMY;collation=UTF-8');
    if ($keywords_arr) {
        foreach ($keywords_arr as $key => $value) {
            echo "$key = $value", PHP_EOL;
        }
    }
    // collation = UTF-8
    // currency = CMY
    

    canonicalize() 方法用于规范化地显示语言标记信息,可以看到它把我们的中划线变成了下划线并且将后面的各种属性转成了大写,这就是规范化的写法。不过对于我们的应用程序和网页来说中划线以及大小写都是支持的。当然,大家最好还是按照标准的写法来定义。

    getKeywords() 用于从 @ 符号后获取语言相关的信息属性,比如我们定义的这个 zh-cn ,然后定义了它的货币为 CMY ,字符集为 UTF-8 ,直接通过 getKeywords() 就能获取货币和字符集属性的数组。

    匹配判断语言标记信息
    对于语言标记来说,我们可以判断给定的两个标记之间是否相互匹配,比如:

    echo (Locale::filterMatches('cmn-CN', 'zh-CN', false)) ? "Matches" : "Does not match", PHP_EOL;
    echo (Locale::filterMatches('zh-CN-Latn', 'zh-CN', false)) ? "Matches" : "Does not match", PHP_EOL;
    

    当然,我们也可以使用另一个 lookup() 方法来确定给定的一系列语言标记哪个与指定的标记最接近。

    $arr = [
        'zh-hans',
        'zh-hant',
        'zh',
        'zh-cn',
    ];
    echo Locale::lookup($arr, 'zh-Hans-CN-Latn-pinyin', true, 'en_US'), PHP_EOL; // zh_hans
    

    生成一个标准规则的语言标记
    既然能够获取各类语言标记的属性信息,那么我们能不能生成一个标准的语言标记内容呢?

    $arr = [
        'language' => 'en',
        'script' => 'Hans',
        'region' => 'CN',
        'variant2' => 'rozaj',
        'variant1' => 'nedis',
        'private1' => 'prv1',
        'private2' => 'prv2',
    ];
    echo Locale::composeLocale($arr), PHP_EOL; // en_Hans_CN_nedis_rozaj_x_prv1_prv2
    

    没错,composeLocale() 方法根据一个数组格式的内容,就可以生成一个完整标准的语言标记格式内容。当然,这个测试代码是乱写的,相当于是一个 en_CN 的标记,正常不会这么写的。

    acceptFromHttp 从请求头中读取语言信息
    另外,Locale 类中还提供了一个从 header 头中的 Accept Language 中获取客户浏览器语言信息的方法。

    // Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
    
    echo Locale::acceptFromHttp('en_US'), PHP_EOL; // en_US
    echo Locale::acceptFromHttp('en_AU'), PHP_EOL; // en_AU
    
    echo Locale::acceptFromHttp('zh_CN'), PHP_EOL; // zh
    echo Locale::acceptFromHttp('zh_TW'), PHP_EOL; // zh
    

    不过从测试的结果来说,其实它只需要一个字符串参数就可以了,所以我们在命令行也可以测试它。需要注意的是,对于中文来说,它不能返回区域信息,只能返回 language 信息。

    总结
    这个 Locale 类相关的内容其实在笔者日常的开发中基本没怎么接触过,但相信不少做跨境项目的同学会多少对它们会有一些了解。只能说业务接触不到,那就只能先简单地学习一下看看了,同样地,以后大家遇到相关的业务需求时,别忘了它们的存在哦!

    测试代码:

    github.com/zhangyue050…中针对区域语言标记信息的操作.php

    参考文档:

    www.php.net/manual/zh/c…

    www.zhihu.com/question/20…

    PHP中针对区域语言标记信息的操作


    起源地 » PHP中针对区域语言标记信息的操作

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元