Come usare la localizzazione angolare di 9 $ con i plurali?


9

Da Angular 9 possiamo usare

$localize`Hello ${name}:name:`

Per i18n nel codice dattiloscritto. Ciò ha ancora alcune limitazioni in quanto il ng xi18ncomando non rileva le stringhe, ma se questi testi vengono aggiunti manualmente al file di traduzione funziona.

La $localizefunzione è abbastanza ben documentata nel JSDoc nella fonte , tuttavia non spiega come lavorare con i plurali. Quello che voglio dire è qualcosa del genere (pseudo-codice):

$localize`Hello {${count}, plural, =1 {reader} other {readers}}`

È possibile con $localize? Se sì: come? Se no: In che modo Angular compila tali espressioni da HTML a TypeScript?


questo ti aiuta <span i18n>Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{minutes}} minutes ago}}</span>? Questo è nei documenti. Abbastanza simile a quello che vuoi
Dave Pastor l'

@DavePastor: Sì, l'ho provato. L'ho cambiato nella domanda ora. Tuttavia è pseudo-codice, solo per illustrare ciò che voglio ottenere.
Yankee

@DavePastor: (riguardo al secondo commento): No, questo non aiuta. Questo è HTML, non TypeScript.
Yankee

Ok, quindi vuoi gestirlo dal lato TS. Fatto.
Dave Pastor l'

Risposte:


2

Per ora, non è possibile utilizzare le ICU con $localize, come discusso in questo numero di github . Dagli ultimi commenti, sembra che il team angolare lo stia considerando se rimane leggero.

Nel frattempo, la soluzione suggerita è quella di creare il proprio metodo di supporto che restituisca la traduzione corretta in base al parametro 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;
    } 

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.