如何使用Angular 9中的$localize处理复数形式?

18

自 Angular 9 起,我们可以使用

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

对于TypeScript代码中的i18n,仍存在一些限制,因为ng xi18n命令无法检测到字符串,但如果将这些文本手动添加到翻译文件中,则可以正常工作。

$localize函数在源代码的JSDoc中有相当详细的文档,但它并未解释如何处理复数。我的意思是这样的(伪代码):

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

使用$localize是否可行? 如果是,请问如何实现? 如果不行:Angular如何将这些HTML表达式编译成TypeScript代码?

这个问题能否用$localize解决并不确定。如果可以,您需要在应用程序中将其启用,并在相关位置使用$localize

如果不行,Angular会使用i18n机制从标记中提取翻译消息,并将其保存在XLIFF文件中。在构建期间,这些消息将被提取并编译到应用程序代码中,以便在运行时进行本地化。


这是否对您有帮助: <span i18n>更新于{minutes, plural, =0 {刚刚} =1 {一分钟前} other {{minutes}}分钟前}}</span>? 这在文档中有说明, 与您所需的非常相似. - Dave Pastor
@DavePastor:是的,我试过了。现在我已经在问题中更改了它。尽管如此,这只是伪代码,只是为了说明我想要实现什么。 - yankee
@DavePastor:(关于第二条评论):不,这并没有帮助。这是HTML,而不是TypeScript。 - yankee
好的,你想在TS端处理这个。明白了。 - Dave Pastor
请查看此链接 https://blog.ninja-squad.com/2019/12/10/angular-localize/。 - Dave Pastor
2个回答

9

目前,无法在$localize中使用ICUs,正如在github问题中讨论的那样。从最后的评论来看,如果保持轻量级,Angular团队正在考虑这个问题。

同时,建议的解决方法是创建自己的辅助方法,根据计数参数返回正确的翻译内容。

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

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接