web-dev-qa-db-fra.com

Comment utiliser angular 9 $ localize avec des pluriels?

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?

10
yankee

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;
    } 
2
David

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 .

2
kemsky