Maison  >  Article  >  développement back-end  >  Une brève discussion sur la façon d'exploiter les informations sur les balises de langue régionale en PHP ?

Une brève discussion sur la façon d'exploiter les informations sur les balises de langue régionale en PHP ?

青灯夜游
青灯夜游avant
2021-09-09 19:53:263304parcourir

Comment exploiter les informations sur les balises de langue régionale en PHP ? L'article suivant vous présentera le fonctionnement des informations de balisage des langues régionales en PHP. J'espère qu'il vous sera utile !

Une brève discussion sur la façon d'exploiter les informations sur les balises de langue régionale en PHP ?

Je crois que tout le monde connaît certainement zh_CN Que ce soit en PHP ou sur notre page Web, vous le verrez. En fait, il s’agit de préciser à quel pays ou région correspond notre encodage d’affichage et quelle langue est utilisée. Il y a aussi beaucoup de plaisir en PHP pour le balisage des langues régionales. Aujourd'hui, la classe Locale que nous allons apprendre sert à exploiter du contenu lié aux langues régionales. Elle ne peut pas être instanciée et toutes les méthodes fonctionnelles sont statiques.

Obtenir et définir les informations linguistiques régionales actuelles

La première chose est que nous pouvons obtenir et définir dynamiquement les informations linguistiques régionales correspondantes.

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

Par défaut, l'utilisation de la méthode getDefault() obtient le contenu configuré par intl.default_locale dans le fichier php.ini. S'il n'y a pas de configuration dans php.ini, le contenu de la valeur $LANG du système d'exploitation sera pris, qui est la sortie en_US_POSIX dans notre exemple ci-dessus, POSIX représente la configuration du système d'exploitation.

Utilisez ini_set() pour modifier directement la configuration ini ou utilisez la méthode setDefault() pour modifier dynamiquement les paramètres de langue régionale actuels.

À propos des règles des balises de langue

Avant de continuer à étudier le contenu suivant, apprenons d'abord les spécifications des balises de langue. Pour la plupart des gens, ils n'ont peut-être été exposés qu'à des balises telles que en_US et zh_CN, mais en fait sa définition complète est très longue, mais lorsque nous utilisons cette abréviation, beaucoup de contenu sera fourni sous la forme par défaut. La règle de marquage complète est la suivante :

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

C'est-à-dire que notre zh_CN peut s'écrire comme ceci :

zh-cmn-Hans-CN-Latn-pinyin

représente : la langue et le type de caractère zh, le format d'écriture Hans est le chinois simplifié, le mandarin cmn, le pays et la région CN, la variante latine. Alphabet latin, variante pinyin pinyin.

Avez-vous l'impression que quelque chose d'aussi simple devient soudainement si grand ? De plus, le préfixe zh- n'est plus recommandé. zh- n'est plus le code de la langue, mais macrolang, qui est le langage macro. On utilise directement cmn, yue (cantonais), wuu (dialecte Wu), hsn (dialecte du Hunan). , dialecte du Hunan) peut être utilisé comme langue. Par conséquent, le paragraphe ci-dessus peut également être écrit comme ceci :

cmn-Hans-CN-Latn-pinyin

Dans le dernier article, lorsque nous avons parlé de NumberFormatter, nous avons dit que nous pouvions obtenir directement la sortie au format numérique chinois. Maintenant, que voulons-nous du résultat traditionnel ? C'est très simple, il suffit d'ajouter le format d'écriture du logo Hant au chinois traditionnel.

Concernant le contenu des règles de balisage linguistique, vous pouvez consulter le lien de référence sur Zhihu en fin d'article pour une introduction plus détaillée.

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

Obtenir diverses informations dans les règles de marquage de langue spécifiées

Que pouvez-vous faire après avoir appris les règles de marquage de langue ? La fonction principale de la classe Locale est d'analyser et d'obtenir ces informations d'attribut.

Acquérir diverses informations d'attribut séparément

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

Nous utilisons deux méthodes de marquage pour tester le code, et vous pouvez voir la comparaison des résultats. La méthode

  • getDisplayLanguage() est utilisée pour obtenir les informations de langue affichées, qui correspondent au contenu linguistique des règles. La méthode

  • getDisplayName() est utilisée pour obtenir le nom de la langue standard, et vous pouvez voir que le contenu est plus riche. La méthode

  • getDisplayRegion() obtient évidemment les informations sur le pays.

  • getDisplayScript() récupère les informations sur le format d'écriture.

  • getDisplayVariant() obtient des informations sur les variantes

Obtenir des informations sur les attributs par lots

Bien sûr, nous pouvons également obtenir des informations relatives à la langue par lots.

$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

Utilisez la méthode parseLocale() pour obtenir diverses informations dans une balise de langue et enregistrez-la dans un tableau. La clé est le nom de la règle de balise et la valeur est le contenu correspondant. . de.

Obtenir toutes les informations sur les variantes

Comme vous pouvez le voir dans le code ci-dessus, nous avons deux informations sur les variantes. Cela peut également être utilisé pour obtenir directement un tableau de toutes les informations sur les variantes dans la balise de langue via une méthode getAllVariants(). . La méthode

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

Obtenir des informations relatives au jeu de caractères

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() est utilisée pour afficher les informations sur les marques de langue de manière standardisée. Vous pouvez voir qu'elle change nos traits de soulignement en soulignements et convertit divers attributs ultérieurs en lettres majuscules. la manière standardisée d’écrire. Cependant, pour nos applications et pages Web, les traits de soulignement ainsi que les majuscules et les minuscules sont pris en charge. Bien entendu, il est préférable que chacun le définisse selon la méthode d’écriture standard.

getKeywords() est utilisé pour obtenir des attributs d'informations liés à la langue à partir du symbole @, tels que le zh-cn que nous avons défini, puis défini sa devise comme CMY et son jeu de caractères comme UTF-8. Vous pouvez directement utiliser getKeywords(). Obtient un tableau de propriétés de devises et de jeux de caractères.

匹配判断语言标记信息

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

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视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer