溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中怎么操作區(qū)域語(yǔ)言標(biāo)記信息

發(fā)布時(shí)間:2021-07-01 15:31:12 來(lái)源:億速云 閱讀:126 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下PHP中怎么操作區(qū)域語(yǔ)言標(biāo)記信息,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

相信大家對(duì)zh_CN這個(gè)東西絕對(duì)不會(huì)陌生,不管是PHP中,還是在我們的網(wǎng)頁(yè)上,都會(huì)見(jiàn)到它的身影。其實(shí)這就是指定我們的顯示編碼是什么國(guó)家或者地區(qū)的,使用何種語(yǔ)言。今天我們要學(xué)習(xí)的就是操作區(qū)域語(yǔ)言相關(guān)內(nèi)容的Locale類。

相信大家對(duì) zh_CN 這個(gè)東西絕對(duì)不會(huì)陌生,不管是 PHP 中,還是在我們的網(wǎng)頁(yè)上,都會(huì)見(jiàn)到它的身影。其實(shí)這就是指定我們的顯示編碼是什么國(guó)家或者地區(qū)的,使用何種語(yǔ)言。對(duì)于這種區(qū)域語(yǔ)言的標(biāo)記來(lái)說(shuō),PHP 中也有很多好玩的內(nèi)容。今天,我們要學(xué)習(xí)的 Locale 類就是操作區(qū)域語(yǔ)言相關(guān)內(nèi)容的,它無(wú)法被實(shí)例化,所有全部功能方法都是靜態(tài)的。

獲取及設(shè)置當(dāng)前的區(qū)域語(yǔ)言信息

首先就是我們可以動(dòng)態(tài)地獲取和設(shè)置相應(yīng)的區(qū)域語(yǔ)言信息。

// # echo $LANG;
// en_US.UTF-8

// php.ini
// intl.default_locale => no value => no value

echo Locale::getDefault(), PHP_EOL; // en_US_POSIX
ini_set('intl.default_locale', 'zh_CN');
echo Locale::getDefault(), PHP_EOL; // zh_CN
Locale::setDefault('fr');
echo Locale::getDefault(), PHP_EOL; // fr

默認(rèn)情況下,使用 getDefault() 方法獲得的是 php.ini 文件中的 intl.default_locale 配置的內(nèi)容。如果在 php.ini 中也沒(méi)有配置的話,就會(huì)取操作系統(tǒng)的 $LANG 值里面的內(nèi)容,也就是我們上面例子中輸出的 en_US_POSIX ,POSIX 表示的就是來(lái)自操作系統(tǒng)的配置。

使用 ini_set() 直接修改 ini 的配置或者使用 setDefault() 方法都是可以動(dòng)態(tài)地修改當(dāng)前的區(qū)域語(yǔ)言設(shè)置的。

關(guān)于語(yǔ)言標(biāo)記的規(guī)則

在繼續(xù)學(xué)習(xí)下面的內(nèi)容之前,我們先來(lái)學(xué)習(xí)一下語(yǔ)言標(biāo)記的規(guī)范。對(duì)于大多數(shù)人來(lái)說(shuō),可能只接觸過(guò) en_US 、 zh_CN 這類的標(biāo)記,但其實(shí)它的完整定義是很長(zhǎng)的,只是我們使用這種簡(jiǎn)寫的方式時(shí),很多內(nèi)容會(huì)以默認(rèn)的形式提供。完整的標(biāo)記規(guī)則是:

language-extlang-script-region-variant-extension-privateuse
語(yǔ)言文字種類-擴(kuò)展語(yǔ)言文字種類-書寫格式-國(guó)家和地區(qū)-變體-擴(kuò)展-私有

也就是說(shuō),我們的 zh_CN 可以這樣寫:

zh-cmn-Hans-CN-Latn-pinyin

代表的是:zh 語(yǔ)言文字種類,Hans 書寫格式為簡(jiǎn)體中文,cmn 普通話,CN 國(guó)家和地區(qū),Latn 變體拉丁字母,pinyin 變體拼音。

是不是感覺(jué)突然一下這么簡(jiǎn)單的東西一下子變得高大上了。另外,zh- 這個(gè)前綴現(xiàn)在已經(jīng)不是推薦使用的了,zh- 現(xiàn)在已經(jīng)不是語(yǔ)言 code 了,而是 macrolang 也就是宏語(yǔ)言,我們直接使用 cmn 、 yue(粵語(yǔ))、wuu(吳語(yǔ))、hsn(湘語(yǔ),湖南話)這類的就可以當(dāng)做 language 來(lái)使用了。因此,上面的那一段也可以這么寫:

cmn-Hans-CN-Latn-pinyin

在上篇文章中,我們講 NumberFormatter 時(shí)說(shuō)過(guò)可以直接獲得中文的數(shù)字格式的輸出,現(xiàn)在我們想要繁體的結(jié)果呢?很簡(jiǎn)單,加上 Hant 標(biāo)識(shí)書寫格式為繁體中文即可。

關(guān)于語(yǔ)言標(biāo)記規(guī)則的內(nèi)容,大家可以看看文末知乎的參考鏈接,介紹的更為詳盡。

$fmt = new NumberFormatter('zh-Hant', NumberFormatter::SPELLOUT);
echo $fmt->format(1234567.891234567890000), PHP_EOL; 
// 一百二十三萬(wàn)四千五百六十七點(diǎn)八九一二三四五六七九

獲取指定語(yǔ)言標(biāo)記規(guī)則中的各類信息

學(xué)習(xí)了語(yǔ)言標(biāo)記的規(guī)則之后能干什么呢?Locale 類最主要的功能就在于可以分析獲取這些屬性信息。

單獨(dú)獲取各種屬性信息

echo Locale::getDisplayLanguage('cmn-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // cmn
echo Locale::getDisplayLanguage('zh-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 中文

echo Locale::getDisplayName('cmn-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // cmn(簡(jiǎn)體,中國(guó),LATN_PINYIN)
echo Locale::getDisplayName('zh-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 中文(簡(jiǎn)體,中國(guó),LATN_PINYIN)

echo Locale::getDisplayRegion('cmn-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 中國(guó)
echo Locale::getDisplayRegion('zh-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 中國(guó)

echo Locale::getDisplayScript('cmn-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 簡(jiǎn)體中文
echo Locale::getDisplayScript('zh-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 簡(jiǎn)體中文

echo Locale::getDisplayVariant('cmn-Hans-Latn-pinyin', 'zh_CN'), PHP_EOL; // LATN_PINYIN
echo Locale::getDisplayVariant('zh-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // LATN_PINYIN

我們分別使用兩種標(biāo)記方式來(lái)測(cè)試代碼,可以看到結(jié)果的對(duì)比。

  • getDisplayLanguage() 方法用于獲取顯示的語(yǔ)言信息,也就是規(guī)則中的 language 內(nèi)容。

  • getDisplayName() 方法用于獲取標(biāo)準(zhǔn)的語(yǔ)言名稱,可以看到內(nèi)容更加地豐富。

  • getDisplayRegion() 方法很明顯地就是獲取到了國(guó)家信息。

  • getDisplayScript() 獲取到的是書寫格式的信息。

  • getDisplayVariant() 獲取到的就是變體信息

批量獲取屬性信息

當(dāng)然,我們也可以批量地獲取到一些語(yǔ)言相關(guān)的信息。

$arr = Locale::parseLocale('zh-Hans-CN-Latn-pinyin');
if ($arr) {
    foreach ($arr as $key => $value) {
        echo "$key : $value ", PHP_EOL;
    }
}
// language : zh
// script : Hans
// region : CN
// variant0 : LATN
// variant1 : PINYIN

使用 parseLocale() 方法就能獲取到一個(gè)語(yǔ)言標(biāo)記中的各類信息并保存在數(shù)組中,鍵為標(biāo)記規(guī)則名,值為對(duì)應(yīng)的內(nèi)容,看看是不是和我們上面介紹的內(nèi)容是一樣的。

獲取所有變體信息

從上面的代碼中可以看出,我們有兩個(gè)變體信息,這個(gè)也可以通過(guò)一個(gè) getAllVariants() 方法來(lái)直接獲得語(yǔ)言標(biāo)記中的所有變體信息的數(shù)組。

$arr = Locale::getAllVariants('zh-Hans-CN-Latn-pinyin');
var_export($arr);
echo PHP_EOL;
//  array (
//     0 => 'LATN',
//     1 => 'PINYIN',
//   )

獲取字符集相關(guān)信息

echo Locale::canonicalize('zh-Hans-CN-Latn-pinyin'), PHP_EOL; // zh_Hans_CN_LATN_PINYIN

$keywords_arr = Locale::getKeywords('zh-cn@currency=CMY;collation=UTF-8');
if ($keywords_arr) {
    foreach ($keywords_arr as $key => $value) {
        echo "$key = $value", PHP_EOL;
    }
}
// collation = UTF-8
// currency = CMY

canonicalize() 方法用于規(guī)范化地顯示語(yǔ)言標(biāo)記信息,可以看到它把我們的中劃線變成了下劃線并且將后面的各種屬性轉(zhuǎn)成了大寫,這就是規(guī)范化的寫法。不過(guò)對(duì)于我們的應(yīng)用程序和網(wǎng)頁(yè)來(lái)說(shuō)中劃線以及大小寫都是支持的。當(dāng)然,大家最好還是按照標(biāo)準(zhǔn)的寫法來(lái)定義。

getKeywords() 用于從 @ 符號(hào)后獲取語(yǔ)言相關(guān)的信息屬性,比如我們定義的這個(gè) zh-cn ,然后定義了它的貨幣為 CMY ,字符集為 UTF-8 ,直接通過(guò) getKeywords() 就能獲取貨幣和字符集屬性的數(shù)組。

匹配判斷語(yǔ)言標(biāo)記信息

對(duì)于語(yǔ)言標(biāo)記來(lái)說(shuō),我們可以判斷給定的兩個(gè)標(biāo)記之間是否相互匹配,比如:

echo (Locale::filterMatches('cmn-CN', 'zh-CN', false)) ? "Matches" : "Does not match", PHP_EOL;
echo (Locale::filterMatches('zh-CN-Latn', 'zh-CN', false)) ? "Matches" : "Does not match", PHP_EOL;

當(dāng)然,我們也可以使用另一個(gè) lookup() 方法來(lái)確定給定的一系列語(yǔ)言標(biāo)記哪個(gè)與指定的標(biāo)記最接近。

$arr = [
    'zh-hans',
    'zh-hant',
    'zh',
    'zh-cn',
];
echo Locale::lookup($arr, 'zh-Hans-CN-Latn-pinyin', true, 'en_US'), PHP_EOL; // zh_hans

生成一個(gè)標(biāo)準(zhǔn)規(guī)則的語(yǔ)言標(biāo)記

既然能夠獲取各類語(yǔ)言標(biāo)記的屬性信息,那么我們能不能生成一個(gè)標(biāo)準(zhǔn)的語(yǔ)言標(biāo)記內(nèi)容呢?

$arr = [
    'language' => 'en',
    'script' => 'Hans',
    'region' => 'CN',
    'variant2' => 'rozaj',
    'variant1' => 'nedis',
    'private1' => 'prv1',
    'private2' => 'prv2',
];
echo Locale::composeLocale($arr), PHP_EOL; // en_Hans_CN_nedis_rozaj_x_prv1_prv2

沒(méi)錯(cuò),composeLocale() 方法根據(jù)一個(gè)數(shù)組格式的內(nèi)容,就可以生成一個(gè)完整標(biāo)準(zhǔn)的語(yǔ)言標(biāo)記格式內(nèi)容。當(dāng)然,這個(gè)測(cè)試代碼是亂寫的,相當(dāng)于是一個(gè) en_CN 的標(biāo)記,正常不會(huì)這么寫的。

acceptFromHttp 從請(qǐng)求頭中讀取語(yǔ)言信息

另外,Locale 類中還提供了一個(gè)從 header 頭中的 Accept Language 中獲取客戶瀏覽器語(yǔ)言信息的方法。

// Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);

echo Locale::acceptFromHttp('en_US'), PHP_EOL; // en_US
echo Locale::acceptFromHttp('en_AU'), PHP_EOL; // en_AU

echo Locale::acceptFromHttp('zh_CN'), PHP_EOL; // zh
echo Locale::acceptFromHttp('zh_TW'), PHP_EOL; // zh

不過(guò)從測(cè)試的結(jié)果來(lái)說(shuō),其實(shí)它只需要一個(gè)字符串參數(shù)就可以了,所以我們?cè)诿钚幸部梢詼y(cè)試它。需要注意的是,對(duì)于中文來(lái)說(shuō),它不能返回區(qū)域信息,只能返回 language 信息。

以上是“PHP中怎么操作區(qū)域語(yǔ)言標(biāo)記信息”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI