做为一门在世界范围内广泛运用的编程语言,国际化能力常常是衡量一个编程语言是不是能够大范围流行的重要内容。尤其是针对 PHP 这种以 Web 页面编程为主战场的语言来讲,国际化能力更加是重中之重。在 PHP 中,已然为咱们准备好了非常多国际化关联的扩展及函数库,今天咱们先来简单的学习一下,后面在学习到详细的 国际化与字符编码支持 关联的函数库时再进行深入的讲解学习。
获取当前浏览器用户的所在地
首要,咱们来获取当前拜访用户的所在地信息,亦便是咱们平常的 zh-cn 、 en-us 这类的地区语言编码信息。 // $_SERVER[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($locale as $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 中,亦是有相针对这种状况的数字暗示形式,亦便是为普通数字加上逗号以暗示西方数字标准格式。 $locale = [en, fr-FR, en-gb, zh-cn,en-us, ko-kr, ja-jp];
$money = 1234567.89;
foreach($locale as $code){
$numberformat =new NumberFormatter($code, NumberFormatter:ECIMAL);
echo $code, ":";
echo $numberformat->format($money), , ;
echo$numberformat->parse($numberformat->format($money)),<br/>;
}
// en:1,234,567.89, 1234567.89
// fr-FR:1 234 567,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:ERCENT 。 oreach($locale as $code){
$numberformat = new NumberFormatter($code, NumberFormatter:ERCENT);
echo $code, ":";
echo$numberformat->format($money),<br/>;
}
// en:¤1,234,567.89
// fr-FR:1 234 567,89 €
// en-gb:£1,234,567.89
// zh-cn:¥1,234,567.89
// en-us1,234,567.89
// ko-kr:₩1,234,568
// ja-jp:¥1,234,568
看出来了吗,当指定了货币形式后,format() 出来的结果直接就带上了货币符号。第1个 en 的货币符号其实便是国际通用货币符号,而日元和咱们人民币的符号是相同的,这亦是一个有趣的历史知识,大众能够自动查找下。
获取指定地区所在地的完整日期
最后便是获取的各地的日期标准格式。其实此刻大众通用的都是 yyyy-mm-dd 这种形式来暗示日期,不外正式规范的日期标准格式各个地区还是有所区别的。 $date = 2020-09-25 11:05:22;
foreach($locale as $code){
$l = newLocale($code);
$d =new IntlDateFormatter($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, September 25, 2020 at 2:48:12 M China Standard Time
// fr-FR:vendredi 25 septembre 2020 à 14:48:12 heure normale de la Chine
// en-gb:Friday, 25 September 2020 at 14:48:12 China Standard Time
// zh-cn:2020年9月25日星期五 中国标准时间 下午2:48:12
// en-us:Friday, September 25, 2020 at 2:48:12 M China Standard Time
// 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编程实战》
|