Jak korzystać z lokalizowania kątowego 9 $ z liczbą mnogą?

10

Od Angulara 9 możemy korzystać

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

Dla i18n w kodzie maszynowym. To wciąż ma pewne ograniczenia, ponieważ ng xi18npolecenie nie wykrywa ciągów, ale jeśli te teksty zostaną dodane ręcznie do pliku tłumaczenia, zadziała.

$localizeFunkcja jest dość dobrze udokumentowane w JSDoc w źródle , jednak nie wyjaśnia, w jaki sposób pracować z liczby mnogiej. Mam na myśli coś takiego (pseudo-kod):

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

Czy to jest możliwe $localize? Jeśli tak: jak? Jeśli nie: Jak Angular kompiluje takie wyrażenia z HTML do TypeScript?

Jankes
źródło
czy to ci pomaga <span i18n>Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{minutes}} minutes ago}}</span>? To jest w dokumentach. Całkiem podobny do tego, czego chcesz
Dave Pastor
@DavePastor: Tak, próbowałem tego. Zmieniłem to teraz w pytaniu. Niemniej jednak jest to pseudo-kod, aby zilustrować to, co chcę osiągnąć.
yankee
@DavePastor: (dotyczy drugiego komentarza): Nie, to nie pomaga. To jest HTML, a nie TypeScript.
yankee
Ok, więc chcesz poradzić sobie z tym po stronie TS. Rozumiem.
Dave Pastor

Odpowiedzi:

2

Na razie nie jest możliwe korzystanie z ICU $localize, jak omówiono w tym numerze github . Z ostatnich komentarzy wygląda na to, że zespół kątowy rozważa to, jeśli pozostaje lekki.

Tymczasem sugerowanym obejściem jest utworzenie własnej metody pomocniczej, która zwraca poprawne tłumaczenie na podstawie parametru 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;
    } 
David
źródło