À propos du module de localisation Laravel

小云云
Libérer: 2023-03-19 16:38:01
original
1368 Les gens l'ont consulté

Comment pouvons-nous mieux en savoir plus sur le module de localisation de Laravel ? Nous devons d’abord connaître la composition des modules de Laravel, puis nous en apprendrons davantage.

Cet article est basé sur l'analyse et l'écriture du code du module de localisation de la version Laravel 5.4

Composition du module

La figure suivante montre la relation entre le divers fichiers du module de localisation. Et donnez une brève description


  • TranslationServiceProvider
    Le fournisseur de services du module de localisation n'est pas seulement l'entrée d'un module, mais également le centre d'interaction avec le conteneur IOC ; enregistre l'instance de traduction translation.loader, enregistre l'instance de traduction de traduction et déclare le service de chargement retardé

  • Traducteur

    Cours de gestion des traductions

  • MessageSelector

    Le filtre de message sélectionne le message approprié en jugeant la valeur complexe ; par exemple, le contenu du message est comme ceci : {0} non | un peu | 20,*] beaucoup, le nombre que nous transmettons est 18, puis les derniers messages sélectionnés sont "certains"

  • LoaderInterface

     ; Interface du traducteur ; déclare trois méthodes load, addNamespace, namespaces ;

  • FileLoader

    Hérite de LoaderInterface et obtient des données de ressources localisées à partir de fichiers

  • ArrayLoader

     ; Hérite de LoaderInterface et utilise des tableaux pour conserver les données de ressources localisées en mémoire

Les instructions de configuration


sont liées à ce module dans le répertoire de configuration config. seuls les paramètres sont locale et fallback_locale dans le fichier app.php ;

locale indique quelle est la langue de localisation par défaut, de sorte que le contenu de la traduction (conversion) soit d'abord obtenu à partir du répertoire de ressources de langue

If locale ; représente Si la langue n'existe pas, la langue de sauvegarde fallback_locale est utilisée

La langue de l'auteur est zh_CN et fallback_locale est en

Introduction à la fonction


Le Le répertoire global des ressources linguistiques se trouve dans Sous les ressources/lang du projet, chaque sous-répertoire est nommé d'après une langue, comme en, zh_CN, etc.

D'autres sous-répertoires sont nommés d'après des espaces de noms, qui sont des remplacements supplémentaires pour chargement de fichiers de ressources de bibliothèque par des tiers ;

Il peut y avoir des fichiers Json tels que en.json et zh_CN. Les projets lisent parfois des données à partir de fichiers Json, et ces données proviennent de ce fichier Json existant

Traduction Ressources linguistiques globales


Le répertoire racine des ressources linguistiques de l'auteur resources/lang a zh_CN/validation.php, le contenu est le suivant

En appelant le code
<?php
return [
 &#39;accepted&#39;  => ':attribute 必须接受。',
 'active_url'  => ':attribute 不是一个有效的网址。',
 'after'  => ':attribute 必须是一个在 :date 之后的日期。',
 ......
];
Copier après la connexion

ou la fonction d'aide globale trans
app('translator')->trans('validation.accepted', ['attribute' => '用户名'])
Copier après la connexion

affiche "Le nom d'utilisateur doit être accepté."
trans('validation.accepted', ['attribute' => '用户名'])
Copier après la connexion

Le processus d'appel est le suivant :

    Analyser le nom de la clé : analyser le nom de la clé dans un tableau ($namespace = '*', $group = 'validation', $item = 'accepted'); l'espace de noms global ; groupe, groupe, est en fait le nom du fichier, un fichier est un élément de groupe signifie élément
  • Obtenez le tableau de langue : $locale ici est nul, alors qu'est-ce que c'est ; renvoyé est un tableau composé des langues par défaut et de sauvegarde, c'est-à-dire ['zh_CN', 'en'] et effectuez une boucle for, entrez dans le répertoire des ressources de langue pour trouver la valeur de l'élément requise, si elle est trouvée, break
  • Chargement des ressources : parce que l'espace de noms est *, donc le répertoire racine de la ressource localisée est resources/lang ; la langue est zh_CN, donc le sous-répertoire est zh_CN, alors le nom du groupe est validation ; tout le contenu du fichier resources/lang/zh_CN/validation.php est chargé dans la mémoire et enregistré $this->loaded[$namespace][$group][$locale] = $lines;
  • Récupérez la ressource et remplacez les paramètres : pass Arr: : La méthode get obtient la valeur de l'élément à partir de $this->loaded[$namespace][$group][$locale] : l'attribut doit être accepté. ;À ce stade, le tableau de paramètres n'est pas vide, effectuez un remplacement en boucle et obtenez le résultat "Le nom d'utilisateur doit être accepté.";

  • Traduire les ressources linguistiques avec l'espace de noms


L'auteur a créé le fichier supplier/Faker/Provider/zh_CN/Internet.php sous le répertoire racine des ressources de langue Resource/lang. Le contenu est le suivant :

En même temps. le temps, enregistrez manuellement le tiers dans Translator L'emplacement du répertoire racine des ressources du plug-in (c'est-à-dire avec l'espace de noms
<?php
return [
 &#39;message&#39; => 'hello, Faker/Provider',
 ......
];
Copier après la connexion

Maintenant, récupérez la ressource avec l'espace de noms ;
app('translator')->addNamespace('Faker/Provider', base_path('vendor/xx/resource/lang'))
Copier après la connexion
Sortie 'bonjour, Faker/Provider' ;

Le processus d'appel est le suivant :
trans('Faker/Provider::Internet.message');
Copier après la connexion

Analyser le nom de la clé : analyser le nom de la clé dans un tableau ( $namespace = 'Faker/Provider', $group = 'Internet', $item = 'message');

  • Obtenez le tableau de langue : $locale ici est nul, alors qu'est-ce que c'est renvoyé est un tableau composé des langues par défaut et de sauvegarde, c'est-à-dire ['zh_CN', 'en'] et effectuez une boucle for, entrez dans le répertoire des ressources de langue pour trouver la valeur de l'élément requise, si elle est trouvée, break

  • 加载资源:因为命名空间为Faker/Provider,此时会分两步;第一步读取第三方插件资源库下的信息,这时读取命名空间注册的根目录为base_path('vendor/xx/resource/lang'),就读取base_path('vendor/xx/resource/lang')/zh_CN/Internet.php内容,文件不存在,返回空数组;第二步读取全局语言资源,进行补充,也就是读取base_path('resource/lang/vendor/Faker/Provider')/zh_CN/Internet.php; 最后进行保存 $this->loaded[$namespace][$group][$locale] = $lines;

  • 获取资源,并替换参数:通过Arr::get方法从$this->loaded[$namespace][$group][$locale]中获取元素值" hello, Faker/Provider";此时,参数数组为空,直接返回结果 "hello, Faker/Provider";

翻译Json文件中的资源

笔者在语言资源根目录resource/lang下,创建zh_CN.json文件,内容如下:

{
 "name": "zh_CN.json",
 "place": "../resources/lang/zh_CN.json"
}
Copier après la connexion

现在,获取Json文件中的name值;

trans('*.name')
Copier après la connexion

输出 "zh_CN.json";

调用过程如下:

  • 解析键名:将键名进行解析成数组 ($namespace = '*', $group = '*', $item = 'name');

  • 获取语言数组: 这里的$locale为null,所以返回的是默认与备用语言组成的数组,也就是['zh_CN', 'en'];并进行for循环,进入语言资源目录中寻找需要的元素值,如果找到,即 break;

  • 加载资源:因为命名空间为*,且组也为*,这时会读取语言根目录下,名字为语言值的Json文件;此时会读取resource/lang/zh_CN.json,将读取的内容,进行保存 $this->loaded[$namespace][$group][$locale] = $lines;

  • 获取资源,并替换参数:通过Arr::get方法从$this->loaded[$namespace][$group][$locale]中获取元素值"zh_CN.json";此时,参数数组为空,直接返回结果 "zh_CN.json";

运行时绑定资源

资源的内容除了放在文件中,用到的时候在读取,也可以在项目运行时,存放;

以resources/lang/zh_CN/validation.php为例,现在想要在运行时,给这个组添加一个新的元素叫 extra,需要指定放在哪个语言下,可以这样写

app('translator')->addLines(array('validation.extra' => '测试添加额外数据'), 'zh_CN');
Copier après la connexion

现在可以获取这个新添加的元素值

trans('validation.extra')
Copier après la connexion

复数资源过滤

笔者通过 运行时绑定资源 添加一条翻译内容:

app('translator')->addLines(array('validation.extra' => '{0}没有|[1,19]一些|[20,*]很多'), 'zh_CN');
Copier après la connexion

如果通过trans('validation.extra') ,获取的就是整条翻译内容,不是我们所期望的;用choice方法:

app('translator')->choice('validation.extra', 0) 得到 没有;

app('translator')->choice('validation.extra', 18) 得到 一些;

app('translator')->choice('validation.extra', 20) 得到 很多;

可以将app('translator')->choice(...)简写成全局帮助函数trans_choice(...);

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal