相信大家对zh_CN这个东西绝对不会陌生,不管是PHP中,还是在我们的网页上,都会见到它的身影。其实这就是指定我们的显示编码是什么国家或者地区的,使用何种语言。今天我们要学习的就是操作区域语言相关内容的Locale类。
相信大家对zh_CN这个东西绝对不会陌生,不管是PHP中,还是在我们的网页上,都会见到它的身影。其实这就是指定我们的显示编码是什么国家或者地区的,使用何种语言。对于这种区域语言的标记来说,PHP中也有很多好玩的内容。今天,我们要学习的Locale类就是操作区域语言相关内容的,它无法被实例化,所有全部功能方法都是静态的。
获取及设置当前的区域语言信息
首先就是我们可以动态地获取和设置相应的区域语言信息。
//#echo$LANG;
//en_US.UTF-8
//php.ini
//intl.default_locale=>novalue=>novalue
echoLocale::getDefault(),PHP_EOL;//en_US_POSIX
ini_set('intl.default_locale','zh_CN');
echoLocale::getDefault(),PHP_EOL;//zh_CN
Locale::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-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=newNumberFormatter('zh-Hant',NumberFormatter::SPELLOUT);
echo$fmt->format(1234567.891234567890000),PHP_EOL;
//一百二十三萬四千五百六十七點八九一二三四五六七九
获取指定语言标记规则中的各类信息
学习了语言标记的规则之后能干什么呢?Locale类最主要的功能就在于可以分析获取这些属性信息。
单独获取各种属性信息
echoLocale::getDisplayLanguage('cmn-Hans-CN-Latn-pinyin','zh_CN'),PHP_EOL;//cmn
echoLocale::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_PINYIN
echoLocale::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($arras$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);
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;collation=UTF-8');
if($keywords_arr){
foreach($keywords_arras$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":"Doesnotmatch",PHP_EOL;
echo(Locale::filterMatches('zh-CN-Latn','zh-CN',false))?"Matches":"Doesnotmatch",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类中还提供了一个从header头中的AcceptLanguage中获取客户浏览器语言信息的方法。
//Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echoLocale::acceptFromHttp('en_US'),PHP_EOL;//en_US
echoLocale::acceptFromHttp('en_AU'),PHP_EOL;//en_AU
echoLocale::acceptFromHttp('zh_CN'),PHP_EOL;//zh
echoLocale::acceptFromHttp('zh_TW'),PHP_EOL;//zh
不过从测试的结果来说,其实它只需要一个字符串参数就可以了,所以我们在命令行也可以测试它。需要注意的是,对于中文来说,它不能返回区域信息,只能返回language信息。
总结
这个Locale类相关的内容其实在笔者日常的开发中基本没怎么接触过,但相信不少做跨境项目的同学应该多少对它们会有一些了解。只能说业务接触不到,那就只能先简单地学习一下看看了,同样地,以后大家遇到相关的业务需求时,别忘了它们的存在哦!
更多此类文章,直达www.why114.com了解