Как использовать угловую локализацию 9 $ с множественным числом?


9

Начиная с Angular 9 мы можем использовать

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

Для i18n в машинописном коде. Это все еще имеет некоторые ограничения, так как ng xi18nкоманда не обнаруживает строки, но если эти тексты добавляются вручную в файл перевода, это работает.

$localizeФункция достаточно хорошо документированы в JSDoc в источнике , однако это не объясняет , как работать с существительных. Я имею в виду что-то вроде этого (псевдокод):

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

Это возможно с $localize? Если да, то как? Если нет: как Angular компилирует такие выражения из HTML в TypeScript?


тебе это поможет <span i18n>Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{minutes}} minutes ago}}</span>? Это в документах. Очень похоже на то, что вы хотите
Дейв Пастор

@DavePastor: Да, я попробовал это. Я изменил это в вопросе сейчас. Тем не менее, это псевдокод, просто чтобы показать, чего я хочу достичь.
Янки

@DavePastor: (относительно второго комментария): Нет, это не помогает. Это HTML, а не TypeScript.
Янки

Итак, вы хотите справиться с этим на стороне TS. Понял.
Дейв Пастор

Ответы:


2

На данный момент невозможно использовать ICU с $localize, как обсуждалось в этом выпуске github . Из последних комментариев похоже, что угловая команда рассматривает вопрос, останется ли он легким.

Между тем, предлагаемым обходным решением является создание собственного вспомогательного метода, который возвращает правильный перевод на основе параметра 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;
    } 

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.