Les traductions

Aucun texte visible par l'utilisateur n'est écrit en dur. Tout est une clé, résolue au moment du rendu par BSPK_Translate.

BSPK_Translate("BSPK_labelYes")                  // "Yes"
BSPK_Translate("Gene_orderNumber"; 125)          // "Order 125"    -> [[:1]]
BSPK_Translate("Gene_animal"; $animals.length)   // singular/plural

Les clés se trouvent dans Resources/Misc/lang/<code>/BSPK.json pour le composant, et dans les fichiers de langue de l'hôte pour l'application. Les fichiers sont fusionnés par ordre alphabétique.

Les macros dans un texte traduit

MacroDevient
[[BR]]<br/> : c'est ainsi qu'on obtient un saut de ligne sur le web
[[CR]]un retour chariot
[[{]] [[}]]< et >
[[ ]] 
[[:1]] … [[:9]]les paramètres de remplacement

Piège : les macros ne fonctionnent pas dans les infobulles du dev-panel. Une infobulle finit dans un attribut data-tip affiché par la règle CSS content: attr(data-tip) : aucun HTML n'y est interprété, et white-space y est normal. Écrivez les infobulles en un seul paragraphe ; environ 250 caractères tiennent sans troncature.

Les pluriels

Une traduction qui contient | est une forme plurielle, choisie par un second paramètre numérique :

animal|animaux                                  -> 2 forms: singular | plural
[[:2]] | [[:3]] propriétaire | [[:1]] propriétaires   -> 3 forms: zero | one | many

Passer un nombre à une clé sans | n'est pas une erreur : le nombre est simplement substitué comme du texte.

L'inverse n'est pas sûr : appeler une clé avec un paramètre de pluriel alors que sa traduction n'a pas de forme plurielle peut lever une assertion au lieu de se replier. Si un libellé doit compter, donnez ses formes à la clé.

Compter une sélection de listbox sans code 4D

Pour afficher « Aucun élément sélectionné » / « Un élément sélectionné » / « 3 éléments sélectionnés » sur un bouton, un libellé de champ, un bloc translation ou un bloc text : mettez une clé plurielle dans le champ Libellé habituel du bloc. C'est toute la recette : il n'y a pas de méthode dédiée.

Une clé toute prête est livrée avec le composant : BSPK_selectedItemsCount.

Le nombre vient de BSPK_vl_PluralCount, une variable process du composant remise à 0 au début de chaque requête et remplie automatiquement quand le POST porte vc_Pks (ce que sendListboxSelectRows envoie pour onSelectRows). BSPK_vc_SelectedPks reçoit en même temps les clés primaires cochées.

Au chargement de la page, le compte vaut 0 : c'est la forme « zéro » qui s'affiche. Jamais une variable indéfinie, qui désactiverait le pluriel et laisserait le | visible à l'écran.

Une traduction sans | n'est pas concernée : c'est la seule forme disponible, quel que soit le nombre. Aucun libellé existant ne change de comportement.

Une clé manquante ne se replie sur rien

Si la clé est absente de la langue courante, c'est la clé elle-même qui s'affiche. Il n'y a pas de repli sur une autre langue : une clé présente seulement en anglais s'affiche BSPK_myKey pour un utilisateur français, pas son texte anglais. C'est voulu (une traduction manquante doit se voir), et c'est pourquoi une nouvelle clé doit être ajoutée à chaque fichier de langue.

Modifier les fichiers de langue

Ne réécrivez jamais un fichier de langue avec un sérialiseur JSON. JSON Stringify / json.dump reformate tout le fichier et dédoublonne les clés en silence : on obtient un diff de milliers de lignes où la vraie modification est invisible. Insérez la ligne comme du texte, à côté de ses voisines.

La synchronisation composant → hôte ajoute les clés manquantes ; elle n'écrase jamais une valeur existante. Modifier un libellé dans le composant ne le modifie donc pas dans une application qui possède déjà cette clé : il faut aussi modifier le fichier de l'hôte, et les installations existantes ne récupéreront pas le changement.

Les propriétés de bloc traduisibles

Une propriété marquée supportTranslation dans le schéma stocke une valeur par langue :

"vt_FieldLabel": { "fr": "Nom du client", "en": "Customer name" }

Le panneau les modifie avec un widget unique qui bascule, pour chaque langue, entre une clé xliff et un texte libre. Deux choses à savoir quand vous écrivez une telle valeur :

  • le POST transporte une chaîne JSON de toutes les langues à la fois, pour le texte simple comme pour le texte riche : validez langue par langue, jamais le bloc sérialisé ;
  • le texte long et le texte riche sont encodés en base64 dans la valeur de chaque langue.

Voir aussi