当前位置: 首页 > 后端技术 > PHP

PHP中区域语言标签信息的操作_0

时间:2023-03-29 22:09:42 PHP

相信大家对zh_CN肯定不陌生,无论是在PHP中还是在我们的网页上,你都会看到。其实这个就是指定我们的显示代码是什么国家或者地区,使用什么语言。在PHP中用这种区域性语言进行标记也有很多乐趣。今天我们要学习的Locale类是操作区域语言相关内容的,不能实例化,所有功能方法都是静态的。获取和设置当前区域语言信息首先,我们可以动态获取和设置对应的区域语言信息。//#echo$LANG;//en_US.UTF-8//php.ini//intl.default_locale=>无值=>无值echoLocale::getDefault(),PHP_EOL;//en_US_POSIXini_set('intl.default_locale','zh_CN');echoLocale::getDefault(),PHP_EOL;//zh_CNLocale::setDefault('fr');echoLocale::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-privateuselanguagetype-extendedlanguagetype-writingformat-countryandregion-variant-extension-private也就是说,我们的zh_CN可以这样写:zh-cmn-Hans-CN-Latn-pinyin代表:zh语言类型,Hans书写格式为简体中文,cmn普通话,CN国家和地区,Latn变体拉丁字母,pinyin变体拼音。有没有觉得这么简单的事情一下子就高大上了?此外,不再推荐使用前缀zh-。zh-不再是语言代码,而是macrolang,是一种宏语言。我们直接用cmn,yue(粤语),wuu(吴语),hsn(湘语,湖南话)都可以作为语言。所以,上面这段也可以这样写:cmn-Hans-CN-Latn-pinyin上一篇讲到NumberFormatter的时候说到可以直接获取中文数字格式的输出。现在我们想要繁体中文结果。?很简单,把汉字标志的书写格式加到繁体中文就可以了。关于语言标记规则的内容,可以参考文末的参考链接进行更详细的介绍。$fmt=newNumberFormatter('zh-Hant',NumberFormatter::SPELLOUT);echo$fmt->format(1234567.891234567890000),PHP_EOL;//1,234,567.8912345679获取指定语言标签规则中的各种信息学习语言标签规则后可以做什么?Locale类的主要作用就是解析获取这些属性信息。分别获取各种属性信息echoLocale::getDisplayLanguage('cmn-Hans-CN-Latn-pinyin','zh_CN'),PHP_EOL;//cmnechoLocale::getDisplayLanguage('zh-Hans-CN-Latn-pinyin','zh_CN'),PHP_EOL;//中文echoLocale::getDisplayName('cmn-Hans-CN-Latn-pinyin','zh_CN'),PHP_EOL;//cmn(简体中文,LATN_PINYIN)echoLocale::getDisplayName('zh-Hans-CN-Latn-pinyin','zh_CN'),PHP_EOL;//中文(简体,中国,LATN_PINYIN)echoLocale::getDisplayRegion('cmn-Hans-CN-Latn-pinyin','zh_CN'),PHP_EOL;//中文echoLocale::getDisplayRegion('zh-Hans-CN-Latn-pinyin','zh_CN'),PHP_EOL;//中文echoLocale::getDisplayScript('cmn-Hans-CN-Latn-pinyin','zh_CN'),PHP_EOL;//简体中文echoLocale::getDisplayScript('zh-Hans-CN-Latn-pinyin','zh_CN'),PHP_EOL;//简体中文echoLocale::getDisplayVariant('cmn-Hans-Latn-pinyin','zh_CN'),PHP_EOL;//LATN_PINYINechoLocale::getDisplayVariant('zh-Hans-CN-Latn-pinyin','zh_CN'),PHP_EOL;//LATN_PINYIN我们分别使用两种标记方式测试代码,可以看到结果对比。getDisplayLanguage()方法用于获取显示的语言信息,即规则中的语言内容。getDisplayName()方法用于获取标准语言名称,可以看到内容比较丰富。getDisplayRegion()方法显然获取了国家/地区信息。getDisplayScript()以书写格式获取信息。getDisplayVariant()获取的是变量信息,批量获取属性信息。当然,我们也可以批量获取一些语言相关的信息。$arr=Locale::parseLocale('zh-Hans-CN-Latn-pinyin');if($arr){foreach($arras$key=>$value){echo"$key:$value",PHP_EOL;}}//language:zh//script:Hans//region:CN//variant0:LATN//variant1:PINYIN使用parseLocale()方法获取语言标签中的各种信息并保存在数组中,key是标记规则的名称,value是对应的内容。检查是否和我们上面介绍的内容一样。获取所有变体信息从上面的代码可以看出,我们有两个变体信息,也可以直接通过getAllVariants()方法获取语言标签中所有变体信息的数组。$arr=Locale::getAllVariants('zh-Hans-CN-Latn-pinyin');var_export($arr);echoPHP_EOL;//array(//0=>'LATN',//1=>'PINYIN',//)获取字符集相关信息echoLocale::canonicalize('zh-Hans-CN-Latn-pinyin'),PHP_EOL;//zh_Hans_CN_LATN_PINYIN$keywords_arr=Locale::getKeywords('zh-cn@currency=CMY;collat??ion=UTF-8');if($keywords_arr){foreach($keywords_arras$key=>$value){echo"$键=$值",PHP_EOL;}}//collat??ion=UTF-8//currency=CMYcanonicalize()方法用于以标准化方式显示语言标记信息。你可以看到它把我们的中间一行变成了下划线,并且把后面的属性都变成了大写。这是规范化的写法。但是,对于我们的应用程序和网页,笔画和大小写是支持的。当然最好按照标准的写法来定义。getKeywords()用于从@符号中获取语言相关的信息属性,比如我们定义的zh-cn,然后定义其货币为CMY,其字符集为UTF-8,可以直接获取货币通过getKeywords()和一组字符集属性。匹配判断语言标签信息对于语言标签,我们可以判断给定的两个标签是否相互匹配,例如:echo(Locale::filterMatches('cmn-CN','zh-CN',false))?"匹配":"不匹配",PHP_EOL;echo(Locale::filterMatches('zh-CN-Latn','zh-CN',false))?"匹配":"不匹配",PHP_EOL;当然,我们也可以使用另一种lookup()方法来确定给定的一系列语言标记中的哪一个最接近指定的标记。$arr=['zh-hans','zh-hant','zh','zh-cn',];echoLocale::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',];echoLocale::composeLocale($arr),PHP_EOL;//en_Hans_CN_nedis_rozaj_x_prv1_prv2是的,composeLocale()方法可以根据数组格式的内容生成完整的标准语言标记格式内容。当然,这个测试代码是潦草的,相当于一个en_CN标记,一般不会这样写的。acceptFromHttp从请求头中读取语言信息此外,Locale类还提供了从请求头中的AcceptLanguage中获取客户端浏览器语言信息的方法。//Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);echoLocale::acceptFromHttp('en_US'),PHP_EOL;//en_USechoLocale::acceptFromHttp('en_AU'),PHP_EOL;//en_AUechoLocale::acceptFromHttp('zh_CN'),PHP_EOL;//zhechoLocale::acceptFromHttp('zh_TW'),PHP_EOL;//zh但是从测试结果来看,它其实只需要一个字符串参数,所以我们在命令行中测试也是可以的。需要注意的是,对于中文,它不能返回地区信息,只能返回语言信息。综上所述,Locale类相关的内容笔者在日常开发中并没有太多接触,但相信很多做跨界项目的同学都会有所了解。只能说业务不接触,只能先简单的学习一下。同样,以后遇到相关的业务需求时,也不要忘记他们的存在!测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202011/source/5.PHP.php中区域语言标签信息的操作参考文档:https://www.php。net/manual/zh/class.locale.phphttps://www.zhihu.com/question/20797118/answer/63480740===========各媒体平台均可搜索【硬核项目经理】