//$_SERVER[&#39;HTTP_ACCEPT_LANGUAGE']=zh-CN,zh;q=0.9;$browserLocale=Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);print_r($browserLocale);echo'<br/>';//zh

浏览器通报的这类区域信息是 zh-CN,zh;q=0.9; 这种形式的,我们可以通过 Locale::acceptFromHttp() 得到详细的区域信息。
不过须要把稳的是,不管是 zh-cn 还是 zh-tw ,返回的都是 zh ,而英文则会返回详细的是 en-us 还是 en-gd 之类的内容,也便是说这个函数对付我们中文措辞的结果获取是有问题的。

$locale=['en','fr-FR','da,en-gb;q=0.8,en;q=0.7','zh-cn','zh-tw','en-us','en-ca','ja-jp'];foreach($localeas$code){print_r(Locale::acceptFromHttp($code));echo'<br/>';}//en//fr_FR//da//zh//zh//en_US//en_CA//ja_JP

我们可以手动来指定区域信息,可以看出除了 zh 之外其它的都是可以获取到正常的详细区域信息的。
这点是我们利用这个函数时须要把稳的地方。

获取指定地区所在地的标准数字信息

对付我们中国人来,数字比较习气的是百、千、万位,一样平常也不太须要区分,而西方国家则喜好三位一个逗号的分别隔来,也便是对应他们的英文数字习气,比如 10000,在西方表示中是 10,000 ,英语是 ten thousand , 10000000 表示为 10,000,000 ,英语是 ten million 。
因此,在 PHP 中,也是有相对付这种情形的数字表示形式,也便是为普通数字加上逗号以表示西方数字标准格式。

php时间查询进修PHP中的国际化功效来查看泉币及日期信息 SQL

$locale=['en','fr-FR','en-gb','zh-cn','en-us','ko-kr','ja-jp'];$money=1234567.89;foreach($localeas$code){$numberformat=newNumberFormatter($code,NumberFormatter::DECIMAL);echo$code,":";echo$numberformat->format($money),',';echo$numberformat->parse($numberformat->format($money)),'<br/>';}//en:1,234,567.89,1234567.89//fr-FR:1234567,89,//en-gb:1,234,567.89,1234567.89//zh-cn:1,234,567.89,1234567.89//en-us:1,234,567.89,1234567.89//ko-kr:1,234,567.89,1234567.89//ja-jp:1,234,567.89,1234567.89

我们直策应用 format() 方法,就可以得到指定地区的标准数字表示形式。
可以看出亚洲地区的都是和欧美国家相同的,但法国则是利用空格进行分隔的。

获取指定地区所在地的货币符号信息

既然有数字格式的不同了,那么货币形式的差异就也是类似的形式了,只不过我们在利用 NumberFormatter 类的时候须要指定后面的数字类型常量为货币形式 NumberFormatter::PERCENT 。

oreach($localeas$code){$numberformat=newNumberFormatter($code,NumberFormatter::PERCENT);echo$code,":";echo$numberformat->format($money),'<br/>';}//en:¤1,234,567.89//fr-FR:1234567,89€//en-gb:£1,234,567.89//zh-cn:¥1,234,567.89//en-us:$1,234,567.89//ko-kr:₩1,234,568//ja-jp:¥1,234,568

看出来了吗,当指定了货币形式后,format() 出来的结果直接就带上了货币符号。
第一个 en 的货币符号实在便是国际通用货币符号,而日元和我们公民币的符号是相同的,这也是一个有趣的历史知识,大家可以自行查询下。

获取指定地区所在地的完整日期

末了便是获取的各地的日期标准格式。
实在现在大家通用的都是 yyyy-mm-dd 这种形式来表示日期,不过正式规范的日期标准格式各个地区还是有所不同的。

$date='2020-09-2511:05:22';foreach($localeas$code){$l=newLocale($code);$d=newIntlDateFormatter($code,IntlDateFormatter::FULL,IntlDateFormatter::FULL);$c=IntlCalendar::createInstance(NULL,$code);$c->set('2020','09','25','11','22','33');echo$code,":";echo$d->format($c),"<br/>";}//en:Friday,September25,2020at2:48:12PMChinaStandardTime//fr-FR:vendredi25septembre2020à14:48:12heurenormaledelaChine//en-gb:Friday,25September2020at14:48:12ChinaStandardTime//zh-cn:2020年9月25日星期五中国标准韶光下午2:48:12//en-us:Friday,September25,2020at2:48:12PMChinaStandardTime//ko-kr:2020년9월25일금요일오후2시48분12초중국표준시//ja-jp:2020年9月25日金曜日14時48分12秒中国標準時

是不是很方便,直接就以当地的措辞来表示指定地区的标准日期格式了。

总结

对付跨境项目来说,这些功能是非常主要的能力,能够帮助我们快捷地开拓或切换干系的地区,等到深入学习的时候再进行详细的学习讲解,这次就全当是一次热身吧!

测试代码

https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/11.学习PHP中的国际化功能来查看货币及日期信息.php

参考文档:

《PHP7编程实战》