Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Perbincangan ringkas tentang cara mengendalikan maklumat tag bahasa serantau dalam PHP?

Perbincangan ringkas tentang cara mengendalikan maklumat tag bahasa serantau dalam PHP?

青灯夜游
青灯夜游ke hadapan
2021-09-09 19:53:263347semak imbas

Bagaimana untuk mengendalikan maklumat tag bahasa serantau dalam PHP? Artikel berikut akan memperkenalkan kepada anda pengendalian maklumat markup bahasa serantau dalam PHP. Saya harap ia akan membantu anda!

Perbincangan ringkas tentang cara mengendalikan maklumat tag bahasa serantau dalam PHP?

Saya percaya bahawa semua orang sudah pasti mengenali zh_CN sama ada dalam PHP atau halaman web kami, anda akan melihatnya. Sebenarnya, ini adalah untuk menentukan negara atau rantau mana pengekodan paparan kami dan bahasa yang digunakan. Terdapat banyak keseronokan dalam PHP untuk penandaan bahasa serantau. Hari ini, kelas Locale yang akan kita pelajari adalah untuk mengendalikan kandungan berkaitan bahasa serantau. Ia tidak boleh digunakan secara instant, dan semua kaedah berfungsi adalah statik.

Dapatkan dan tetapkan maklumat bahasa serantau semasa

Pertama ialah kami boleh mendapatkan dan menetapkan maklumat bahasa serantau yang sepadan secara dinamik.

// # 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

Secara lalai, kandungan konfigurasi intl.default_locale dalam fail php.ini diperoleh menggunakan kaedah getDefault(). Jika tiada konfigurasi dalam php.ini, kandungan nilai $LANG sistem pengendalian akan diambil, iaitu en_US_POSIX output dalam contoh kami di atas mewakili konfigurasi daripada sistem pengendalian.

Gunakan ini_set() untuk mengubah suai terus konfigurasi ini atau gunakan kaedah setDefault() untuk mengubah suai tetapan bahasa serantau semasa secara dinamik.

Peraturan tentang teg bahasa

Sebelum meneruskan mengkaji kandungan berikut, mari kita pelajari terlebih dahulu tentang spesifikasi teg bahasa. Bagi kebanyakan orang, mereka mungkin hanya terdedah kepada teg seperti en_US dan zh_CN, tetapi sebenarnya definisi lengkapnya sangat panjang, tetapi apabila kami menggunakan singkatan ini, banyak kandungan akan disediakan dalam bentuk lalai. Peraturan penandaan lengkap ialah:

language-extlang-script-region-variant-extension-privateuse
语言文字种类-扩展语言文字种类-书写格式-国家和地区-变体-扩展-私有

Dalam erti kata lain, zh_CN kami boleh ditulis seperti ini:

zh-cmn-Hans-CN-Latn-pinyin

mewakili: jenis bahasa zh, format tulisan Hans ialah Bahasa Cina Ringkas , cmn Mandarin, negara dan wilayah CN, huruf Latin varian Latn, varian pinyin Pinyin.

Tidakkah anda rasa sesuatu yang begitu mudah tiba-tiba menjadi begitu besar? Selain itu, awalan zh- bukan lagi digalakkan sebagai kod bahasa, tetapi makrolang, iaitu bahasa makro Kami secara langsung menggunakan cmn, yue (Kantonis), wuu (dialek Wu), hsn (dialek Hunan. , dialek Hunan) boleh digunakan sebagai bahasa. Oleh itu, perenggan di atas juga boleh ditulis seperti ini:

cmn-Hans-CN-Latn-pinyin

Dalam artikel sebelum ini, apabila kita bercakap tentang NumberFormatter, kita berkata bahawa kita boleh mendapatkan output format nombor Cina secara langsung keputusan Cina tradisional. Ianya sangat mudah, cuma tambahkan format penulisan logo Hant kepada Bahasa Cina Tradisional.

Mengenai kandungan peraturan penandaan bahasa, anda boleh menyemak pautan rujukan Zhihu di penghujung artikel untuk pengenalan yang lebih terperinci.

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

Dapatkan pelbagai maklumat dalam peraturan pengetegan bahasa yang ditentukan

Apakah yang boleh anda lakukan selepas mempelajari peraturan pengetegan bahasa? Fungsi utama kelas Locale adalah untuk menganalisis dan mendapatkan maklumat atribut ini.

Perolehi pelbagai maklumat atribut secara berasingan

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(简体,中国,LATN_PINYIN)
echo Locale::getDisplayName('zh-Hans-CN-Latn-pinyin', 'zh_CN'), PHP_EOL; // 中文(简体,中国,LATN_PINYIN)

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

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

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

Kami menggunakan dua kaedah penandaan untuk menguji kod dan anda boleh melihat perbandingan hasilnya.

  • Kaedah getDisplayLanguage() digunakan untuk mendapatkan maklumat bahasa yang dipaparkan, iaitu kandungan bahasa dalam peraturan.

  • kaedah getDisplayName() digunakan untuk mendapatkan nama bahasa standard dan anda boleh melihat bahawa kandungannya lebih kaya.

  • Kaedah getDisplayRegion() jelas memperoleh maklumat negara.

  • getDisplayScript() mendapat maklumat format penulisan.

  • getDisplayVariant() mendapat maklumat varian

Dapatkan maklumat atribut dalam kelompok

Sudah tentu , kami juga boleh mendapatkan beberapa maklumat berkaitan bahasa dalam kelompok.

$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

Gunakan kaedah parseLocale() untuk mendapatkan pelbagai maklumat dalam teg bahasa dan menyimpannya dalam tatasusunan ialah nama peraturan teg dan nilainya ialah kandungan yang sepadan Kandungan yang diperkenalkan di atas adalah sama.

Dapatkan semua maklumat varian

Seperti yang dapat dilihat daripada kod di atas, kami mempunyai dua maklumat varian, yang juga boleh diperolehi melalui kaedah getAllVariants() Dapatkan terus tatasusunan semua maklumat varian dalam teg bahasa.

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

Dapatkan maklumat berkaitan set aksara

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

Kaedah canonicalize() digunakan untuk memaparkan maklumat tag bahasa dengan cara yang standard ia menukar garis bawah kami menjadi garis bawah dan atribut berikut ditukar kepada huruf besar Ini ialah kaedah penulisan piawai. Walau bagaimanapun, untuk aplikasi dan halaman web kami, garis bawah dan huruf besar dan kecil disokong. Sudah tentu, adalah yang terbaik untuk semua orang mentakrifkannya mengikut kaedah penulisan standard.

getKeywords() digunakan untuk mendapatkan atribut maklumat berkaitan bahasa daripada simbol @, seperti zh-cn yang kami takrifkan, dan kemudian mentakrifkan mata wangnya sebagai CMY dan set aksara sebagai UTF-8, terus melalui getKeywords () untuk mendapatkan susunan mata wang dan atribut set aksara.

匹配判断语言标记信息

对于语言标记来说,我们可以判断给定的两个标记之间是否相互匹配,比如:

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;

当然,我们也可以使用另一个 lookup() 方法来确定给定的一系列语言标记哪个与指定的标记最接近。

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

生成一个标准规则的语言标记

既然能够获取各类语言标记的属性信息,那么我们能不能生成一个标准的语言标记内容呢?

$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

没错,composeLocale() 方法根据一个数组格式的内容,就可以生成一个完整标准的语言标记格式内容。当然,这个测试代码是乱写的,相当于是一个 en_CN 的标记,正常不会这么写的。

acceptFromHttp 从请求头中读取语言信息

另外,Locale 类中还提供了一个从 header 头中的 Accept Language 中获取客户浏览器语言信息的方法。

// 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

不过从测试的结果来说,其实它只需要一个字符串参数就可以了,所以我们在命令行也可以测试它。需要注意的是,对于中文来说,它不能返回区域信息,只能返回 language 信息。

总结

这个 Locale 类相关的内容其实在笔者日常的开发中基本没怎么接触过,但相信不少做跨境项目的同学会多少对它们会有一些了解。只能说业务接触不到,那就只能先简单地学习一下看看了,同样地,以后大家遇到相关的业务需求时,别忘了它们的存在哦!

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202011/source/5.PHP中针对区域语言标记信息的操作.php

参考文档:

https://www.php.net/manual/zh/class.locale.php

https://www.zhihu.com/question/20797118/answer/63480740

推荐学习:《PHP视频教程

Atas ialah kandungan terperinci Perbincangan ringkas tentang cara mengendalikan maklumat tag bahasa serantau dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam