Dans le développement multilingue (I18N), les programmeurs doivent souvent insérer des variables, telles que le nom d'utilisateur, le temps, la quantité, etc. dans les chaînes de modèle. Si l'épissage des chaînes est utilisé directement, non seulement la lisibilité du code est mauvaise, mais elle est également difficile à maintenir. La fonction vsprintf () fournie par PHP est un outil puissant pour résoudre ce problème. Il combine des chaînes de formatage et des paramètres de tableau pour atteindre des fonctions de remplacement dynamique flexibles et puissantes, en particulier adaptées aux scénarios multilingues.
VSprintf () est une fonction de formatage de chaîne dans PHP. Son principe de travail est similaire à sprintf () , la différence est que les paramètres sont passés en tant que tableaux. Cela nous permet de passer facilement des tableaux (tels que des variables multilingues obtenues à partir de la base de données) dans un modèle de chaîne.
La syntaxe est la suivante:
string vsprintf(string $format, array $values)
$ Format : une chaîne avec des espaces réservés au format.
$ valeurs : un tableau où chaque valeur du tableau remplacera les espaces réservés dans la chaîne à son tour.
Considérez un exemple d'un système multilingue. Nous devons afficher les informations suivantes:
Anglais : Bonjour, John! Vous avez 5 messages non lus.
Chinois : Bonjour, John! Vous avez 5 messages non lus.
Afin de remplacer de manière flexible les variables (nom d'utilisateur et numéro de message), nous pouvons utiliser ces deux phrases comme modèles et les marquer par l'espace réservé % s .
<?php
// Supposons un modèle de langue chargé à partir d'un fichier de langue ou d'une base de données
$translations = [
'en' => 'Hello, %s! You have %d unread messages.',
'zh' => 'Bonjour,%s!Tu as %d Message non lu。'
];
// Informations sur l'utilisateur
$user = 'John';
$messageCount = 5;
// Langue actuelle
$lang = 'zh'; // ou 'en'
// utiliser vsprintf Faire un remplacement
$output = vsprintf($translations[$lang], [$user, $messageCount]);
echo $output;
?>
Bonjour,John!Tu as 5 Message non lu。
Comme vous pouvez le voir, nous remplaçons les deux espaces réservés % s (chaîne) et % d (entier) définis dans le modèle par le nom d'utilisateur et le numéro de message respectivement via vSprintf () .
Les positions d'accueil peuvent changer lorsque des structures linguistiques plus complexes sont nécessaires. Par exemple:
$translations = [
'en' => 'User %1$s has %2$d items in cart.',
'fr' => 'Il y a %2$d articles dans le panier de l’utilisateur %1$s.'
];
En spécifiant la position des paramètres ( % 1 $ s , % 2 $ d ), nous pouvons éviter les erreurs causées par un ordre de syntaxe différent.
<?php
$translations = [
'en' => 'User %1$s has %2$d items in cart.',
'fr' => 'Il y a %2$d articles dans le panier de l’utilisateur %1$s.'
];
$user = 'Alice';
$cartItems = 3;
$lang = 'fr';
echo vsprintf($translations[$lang], [$user, $cartItems]);
?>
Il y a 3 articles dans le panier de l’utilisateur Alice.
Supposons que nous ayons une invite: "Cliquez ici pour visiter votre page d'accueil personnelle: <a href = '% s'> lien </a>"
En usage réel, vous pouvez écrire ceci:
<?php
$translations = [
'zh' => "Cliquez ici pour visiter votre page d'accueil personnelle:<a href='%s'>Lien</a>"
];
$url = 'https://gitbox.net/user/profile';
echo vsprintf($translations['zh'], [$url]);
?>
Cliquez ici pour visiter votre page d'accueil personnelle:<a href='https://gitbox.net/user/profile'>Lien</a>
L'utilisation de vsprintf () pour implémenter le remplacement dynamique des modèles de chaîne multilingues présente les avantages suivants:
Le modèle a une structure claire et une forte entretien;
Contrôle de position du paramètre de support et s'adapter à différentes langues de structure de syntaxe;
Intégrez facilement aux données de tableau et aux packs de langue;
Toujours flexible et efficace lors de la sortie de HTML et d'URL.
Pour les projets qui utilisent des cadres tels que Laravel, Symfony, bien qu'ils aient leurs propres méthodes de traduction encapsulées, l'implémentation sous-jacente peut toujours utiliser VSprintf () en remplacement des espaces réservés de modèle.
En bref, la maîtrise de vsprintf () est une partie importante de l'écriture de code PHP élégant et amical amical.