Formatage
Variables
Une variable s'écrit entre deux %. Sa valeur est passée dans le second argument de t() :
{
"greeting": "Hello, %name%!"
}
ctx.t('greeting', {name: 'Alice'}); // "Hello, Alice!"
Pour écrire un % littéral, échappez-le : \%. En JSON, la barre oblique inverse s'écrit elle-même doublée :
{
"discount": "%value%\\% de réduction"
}
Une chaîne qui contient des variables exige un objet de valeurs, et chaque variable utilisée doit y figurer. Sinon, t() lève une erreur.
Expressions
Une expression s'écrit %variable:expression(paramètres)%. Les paramètres multiples sont séparés par |.
if : texte conditionnel
%variable:if(texte)% affiche le texte si la variable vaut true, rien sinon. La variable doit être un booléen.
{
"weather": "It is %temp% degrees outside. %isHot:if(Wow, that's hot...)%"
}
ctx.t('weather', {temp: 30, isHot: true});
// "It is 30 degrees outside. Wow, that's hot..."
either : l'un ou l'autre
%variable:either(si vrai|si faux)% choisit entre deux textes selon un booléen. Il faut exactement deux paramètres.
{
"status": "The raid mode is %enabled:either(on|off)%."
}
plural : pluriels
%variable:plural(singulier|pluriel|zéro)% choisit selon un nombre :
1donne le singulier ;0donne le troisième paramètre s'il est fourni, sinon le pluriel ;- toute autre valeur donne le pluriel.
{
"inbox": "You have %count% %count:plural(message|messages|no messages)%"
}
ctx.t('inbox', {count: 1}); // "You have 1 message"
ctx.t('inbox', {count: 5}); // "You have 5 messages"
La variable doit être un nombre.
date : dates
%variable:date(format)% met en forme un objet Date. Jetons disponibles :
YYYY: année sur 4 chiffres ;YY: année sur 2 chiffres ;MM: mois sur 2 chiffres ;DD: jour sur 2 chiffres ;hh: heure sur 2 chiffres ;mm: minutes sur 2 chiffres ;ss: secondes sur 2 chiffres.
{
"joined": "Member since %date:date(DD/MM/YYYY)%"
}
ctx.t('joined', {date: new Date(2026, 8, 24)}); // "Member since 24/09/2026"
Chaque jeton n'est remplacé qu'une fois par format.
switch : cas multiples
%variable:switch(cas:texte|cas:texte)% renvoie le texte du premier cas qui correspond. Un cas peut être :
- un texte exact :
%role:switch(admin:Administrator|mod:Moderator)%; - un nombre exact :
%level:switch(1:Beginner|2:Advanced)%; - un intervalle
min-max, bornes exclues par défaut. Ajoutez!après une borne pour l'inclure, et utilisez-infouinfpour un intervalle ouvert.
{
"size": "%members:switch(-inf-50:A small server|50!-1000:A growing server|1000!-inf:A large server)%"
}
ctx.t('size', {members: 50}); // "A growing server"
Si aucun cas ne correspond, t() lève une erreur : prévoyez des intervalles qui couvrent toutes les valeurs possibles. Ne mélangez pas cas texte et valeur numérique : un cas texte comparé à un nombre lève aussi une erreur. Enfin, le texte d'un cas ne peut pas contenir de deux-points (:).