Puisque Angular 9 nous pouvons utiliser
$localize`Hello ${name}:name:`
Pour i18n dans le code TypeScript. Cela a encore quelques limitations car la commande ng xi18n
Ne détecte pas les chaînes, mais si ces textes sont ajoutés manuellement au fichier de traduction, cela fonctionne.
La fonction $localize
Est assez bien documentée dans JSDoc dans la source , mais elle n'explique pas comment travailler avec des pluriels. Ce que je veux dire, c'est quelque chose comme ça (pseudo-code):
$localize`Hello {${count}, plural, =1 {reader} other {readers}}`
Est-ce possible avec $localize
? Si oui: comment? Si non: Comment Angular compile-t-il de telles expressions du HTML vers TypeScript?
Pour l'instant, il n'est pas possible d'utiliser des ICU avec $localize
, comme discuté dans ce problème github . D'après les derniers commentaires, cela ressemble à angular le considère s'il reste léger.
Pendant ce temps, la solution de contournement suggérée consiste à créer votre propre méthode d'assistance qui renvoie la traduction correcte en fonction du paramètre count.
title = $localize `Hi ${this.name}! You have ${
plural(this.users.length. {
0: $localize `no users`,
1: $localize `one user`,
other: $localize`${this.users.length} users`,
}.`
function plural(value, options) {
// Handle 0, 1, ... cases
const directResult = options[value];
if (directResult !== undefined) { return directResult; }
// handle zero, one, two, few, many
// ...
return options.other;
}
Je viens de lire le numéro https://github.com/angular/angular/issues/35912 et je pense que intl-messageformat
peut faire ce dont vous avez besoin.
Voir https://github.com/formatjs/formatjs/tree/master/packages/intl-messageformat .