Champs formatés dans les chaînes de traduction

From Joomla! Documentation

This page is a translated version of the page Formatted fields in language translation strings and the translation is 100% complete.

Other languages:
English • ‎español • ‎français • ‎Nederlands • ‎русский

Parfois, il est nécessaire d'inclure des champs spécialement formatés dans une chaîne à traduire. Cela se produit généralement lorsque des nombres sont concernés, mais cela peut se produire pour des dates et heures ou lorsque des instructions de formatage précis sont requis. Si les chaînes n'ont pas à être traduites, les fonctions PHP standard printf et sprintf peuvent être utilisées. La fonction printf renvoie une chaîne formatée en utilisant des instructions de formatage intégrées ; la fonction sprintf renvoie une chaîne formatée en utilisant les mêmes instructions de formatage intégrées.

La classe JText fournit des méthodes de permutation (wrapper) pour les fonctions printf et sprintf permettant à du texte statique d'être traduit tout en permettant aux champs formatés d'être intégrés en utilisant la même syntaxe que les fonctions PHP.

Par exemple, supposons que vous avez une chaîne du type : "Donations of 12.45 GBP have been received" dont le montant est donné par la variable $donations. Vous pourriez alors diviser la chaîne en deux parties comme ceci :

JText::_( 'Donations of' ) .  $donations GBP  . JText::_( 'have been received' )

avec les chaînes de définition de langue :

DONATIONS OF=Donations of
HAVE BEEN RECEIVED=have been received

mais cela ne fonctionne pas correctement pour les langues lorsque les données intégrées ne sont pas au même endroit que dans la chaîne traduite. Plutôt que d'utiliser la méthode sprintf comme ceci

JText::sprintf( 'Donations have been received', $donations )

avec la chaîne de définition de langue :

DONATIONS HAVE BEEN RECEIVED=Donations of %.2f GBP have been received

Vous pouvez inclure plus d'un spécificateur de format dans une chaîne de traduction. Les substitutions sont effectuées dans l'ordre, et cela fonctionne ainsi comme attendu

JText::sprintf( 'String with numbers in it', $num1, $num2, $num3 )

avec la chaîne de définition de langue :

STRING WITH NUMBERS IN IT=First %d, second %d, third %d

Syntaxe de spécificateurs de format

Le spécificateur de format consiste en un signe de pourcentage (%), suivi par un ou plusieurs des éléments suivants, dans l'ordre :

Ordre
Type Valeurs
Description
1.
Signe + ou - Facultatif. Force l'utilisation d'un signe (+ ou -) pour les nombres. Par défaut, seul le signe - est utilisé sur un nombre s'il est négatif. Ce spécificateur force également les nombres positifs à s'adjoindre le signe +.
2.
Padding <space>

ou 0

ou '<char>

Facultatif. Caractère devant être utilisé pour la bonne dimension du padding pour les résultats. Peut-être un espace ou un 0 (zéro). Par défaut, il convient d'utiliser les espaces. Un padding alternatif peut être spécifié en préfixant avec un guillemet simple (').
3.
Alignement <null> ou - Facultatif. Détermine si le résultat doit être justifié à gauche ou à droite. La valeur par défaut est justifié à droite ; un caractère - ici va le justifier à gauche.
4.
Longueur Nombre Facultatif. Le nombre (minimum) de caractères qui devrait résulter de la conversion.
5.
Précision Nombre Facultatif. Le nombre de décimale devant être affiché pour les nombres à virgule. Lors de l'utilisation de ce spécificateur dans une chaîne, il servira comme point limite, fixant le nombre de caractère maximum de la chaîne.
6.
Type Obligatoire. Le type de données d'argument. Les types possibles sont :
%
Un caractère pourcentage. Aucun argument n'est requis.
b
L'argument est traité comme un nombre entier et présenté comme un nombre binaire.
c
L'argument est traité comme un nombre entier et présenté comme un caractère avec cette valeur ASCII.
d
L'argument est traité comme un nombre entier et présenté comme un nombre décimal.
e
L'argument est traité comme une notation scientifique (ex : 1.2e+2). Depuis PHP 5.2.1, le spécificateur de précision représente le nombre de chiffres après le point décimal. Dans les versions antérieures, il servait à définir le nombre de chiffres significatifs (un de moins).
u
L'argument est traité comme un nombre entier et présenté comme un nombre décimal.
f
L'argument est traité comme flottant et présenté comme un nombre à virgule flottante (paramètres locaux courant).
F
L'argument est traité comme flottant et présenté comme un nombre à virgule flottante (sans prise en compte des paramètres locaux).
o
L'argument est traité comme un nombre entier et présenté comme un nombre octal.
s
L'argument est traité et présenté sous forme de chaîne de caractères.
x
L'argument est traité comme un nombre entier et présenté comme un nombre hexadécimal (avec des lettres minuscules).
X
L'argument est traité comme un nombre entier et présenté comme un nombre hexadécimal (avec des lettres majuscules).

Format d'argument de permutation

La chaîne de format prend en charge l'argument de numérotation et même de permutation. C'est utile lorsque deux ou plusieurs éléments de données doivent être intégrés dans une chaîne mais que les différences dans la structure de la langue implique que l'ordre d'utilisation des éléments de données ne sont pas les mêmes.

Par exemple, supposons que nous ayons ce code :

echo JText::sprintf( 'Balls in the bucket', $number, $location );

avec cette chaine de traduction :

BALLS IN THE BUCKET=There are %d balls in the %s

Puis, si

$number = 3
$location = 'hat'

Cela affichera “There are 3 balls in the hat”. Mais présumons que vous souhaitez changer cette traduction en :

BALLS IN THE BUCKET=The %s contains %d balls

Cela affichera désormais “The 3 contains hat balls”, ce qui n'a aucun sens. Plutôt que de changer le code, vous pouvez indiquer dans la chaine de traduction à quel argument chacun des libellés se réfère. Modifiez la traduction en :

BALLS IN THE BUCKET=The %2$s contains %1$d balls

et le rendu devient comme attendu “The hat contains 3 balls”.

Un avantage supplémentaire de pouvoir numéroter les arguments est que vous pouvez répéter les libellés sans avoir à ajouter plus d'arguments au code. Par exemple, changez la traduction en :

BALLS IN THE BUCKET=The %2$s contains %1$d balls, so there are %1$d balls in the %2$s

et cela affichera correctement “The hat contains 3 balls, so there are 3 balls in the hat”.