做為一門在世界范圍內廣泛使用的編程語言,國際化能力往往是衡量一個編程語言是否能夠大范圍流行的重要內容。特別是對于 PHP 這種以 Web 頁面編程為主戰(zhàn)場的語言來說,國際化能力更是重中之重。在 PHP 中,已經為我們準備好了很多國際化相關的擴展及函數(shù)庫,今天我們先來簡單的學習一下,后面在學習到具體的 國際化與字符編碼支持 相關的函數(shù)庫時再進行深入的講解學習。
獲取當前瀏覽器用戶的所在地
首先,我們來獲取當前訪問用戶的所在地信息,也就是我們常見的 zh-cn 、 en-us 這類的地區(qū)語言編碼信息。
// $_SERVER['HTTP_ACCEPT_LANGUAGE'] = zh-CN,zh;q=0.9;
$browserLocale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
print_r($browserLocale);
echo '<br/>';
// zh
瀏覽器傳遞的這類區(qū)域信息是 zh-CN,zh;q=0.9; 這種形式的,我們可以通過 Locale::acceptFromHttp() 獲得具體的區(qū)域信息。不過需要注意的是,不管是 zh-cn 還是 zh-tw ,返回的都是 zh ,而英文則會返回具體的是 en-us 還是 en-gd 之類的內容,也就是說這個函數(shù)對于我們中文語言的結果獲取是有問題的。
$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
我們可以手動來指定區(qū)域信息,可以看出除了 zh 之外其它的都是可以獲取到正常的具體區(qū)域信息的。這點是我們使用這個函數(shù)時需要注意的地方。
獲取指定地區(qū)所在地的標準數(shù)字信息
對于我們中國人來,數(shù)字比較習慣的是百、千、萬位,一般也不太需要區(qū)分,而西方國家則喜歡三位一個逗號的分隔開來,也就是對應他們的英文數(shù)字習慣,比如 10000,在西方表示中是 10,000 ,英語是 ten thousand , 10000000 表示為 10,000,000 ,英語是 ten million 。因此,在 PHP 中,也是有相對于這種情況的數(shù)字表示形式,也就是為普通數(shù)字加上逗號以表示西方數(shù)字標準格式。
$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() 方法,就可以獲得指定地區(qū)的標準數(shù)字表示形式??梢钥闯鰜喼薜貐^(qū)的都是和歐美國家相同的,但法國則是使用空格進行分隔的。
獲取指定地區(qū)所在地的貨幣符號信息
既然有數(shù)字格式的不同了,那么貨幣形式的區(qū)別就也是類似的形式了,只不過我們在使用 NumberFormatter 類的時候需要指定后面的數(shù)字類型常量為貨幣形式 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 的貨幣符號其實就是國際通用貨幣符號,而日元和我們人民幣的符號是相同的,這也是一個有趣的歷史知識,大家可以自行查詢下。
獲取指定地區(qū)所在地的完整日期
最后就是獲取的各地的日期標準格式。其實現(xiàn)在大家通用的都是 yyyy-mm-dd 這種形式來表示日期,不過正式規(guī)范的日期標準格式各個地區(qū)還是有所不同的。
$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秒 中國標準時
是不是很方便,直接就以當?shù)氐恼Z言來表示指定地區(qū)的標準日期格式了。
總結
對于跨境項目來說,這些功能是非常重要的能力,能夠幫助我們快捷地開發(fā)或切換相關的地區(qū),等到深入學習的時候再進行詳細的學習講解,這次就全當是一次熱身吧!
測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/11.學習PHP中的國際化功能來查看貨幣及日期信息.php
參考文檔:
《PHP7編程實戰(zhàn)》
各自媒體平臺均可搜索【硬核項目經理】