作爲一門在世界範圍內普遍使用的編程語言,國際化能力每每是衡量一個編程語言是否可以大範圍流行的重要內容。特別是對於 PHP 這種以 Web 頁面編程爲主戰場的語言來講,國際化能力更是重中之重。在 PHP 中,已經爲咱們準備好了不少國際化相關的擴展及函數庫,今天咱們先來簡單的學習一下,後面在學習到具體的 國際化與字符編碼支持 相關的函數庫時再進行深刻的講解學習。php
首先,咱們來獲取當前訪問用戶的所在地信息,也就是咱們常見的 zh-cn 、 en-us 這類的地區語言編碼信息。git
// $_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 之類的內容,也就是說這個函數對於咱們中文語言的結果獲取是有問題的。github
$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
參考文檔:
各自媒體平臺都可搜索【硬核項目經理】