Как использовать angular 9 $ для локализации во множественном числе? - PullRequest
9 голосов
/ 09 марта 2020

С Angular 9 мы можем использовать

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 13 марта 2020

Я только что прочитал вопрос https://github.com/angular/angular/issues/35912 и думаю, что intl-messageformat может сделать то, что вам нужно.

См. https://github.com/formatjs/formatjs/tree/master/packages/intl-messageformat.

2 голосов
/ 12 марта 2020

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

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