共计 3062 个字符,预计需要花费 8 分钟才能阅读完成。
做为一门在世界范畴内宽泛应用的编程语言,国际化能力往往是掂量一个编程语言是否可能大范畴风行的重要内容。特地是对于 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::DECIMAL);
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::PERCENT。
oreach($locale as $code){$numberformat = new NumberFormatter($code, NumberFormatter::PERCENT);
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-us:$1,234,567.89
// ko-kr:₩1,234,568
// ja-jp:¥1,234,568
看进去了吗,当指定了货币模式后,format() 进去的后果间接就带上了货币符号。第一个 en 的货币符号其实就是国内通用货币符号,而日元和咱们人民币的符号是雷同的,这也是一个乏味的历史常识,大家能够自行查问下。
获取指定地区所在地的残缺日期
最初就是获取的各地的日期规范格局。其实当初大家通用的都是 yyyy-mm-dd 这种模式来示意日期,不过正式标准的日期规范格局各个地区还是有所不同的。
$date = '2020-09-25 11:05:22';
foreach($locale as $code){$l = new Locale($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 PM 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 PM 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 编程实战》
各自媒体平台均可搜寻【硬核项目经理】