Làm thế nào để sử dụng 9 $ bản địa hóa với số nhiều?


9

Kể từ Angular 9, chúng ta có thể sử dụng

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

Đối với i18n trong mã bản in. Điều này vẫn có một số hạn chế vì ng xi18nlệnh không phát hiện được chuỗi, nhưng nếu các văn bản này được thêm thủ công vào tệp dịch thì nó hoạt động.

Các $localizechức năng được khá tốt tài liệu trong JSDoc trong nguồn , tuy nhiên nó không giải thích làm thế nào để làm việc với số nhiều. Ý tôi là một cái gì đó như thế này (mã giả):

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

Điều này có thể với $localize? Nếu có: Làm thế nào? Nếu không: Angular biên dịch các biểu thức như vậy từ HTML sang TypeScript như thế nào?


điều này có giúp <span i18n>Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{minutes}} minutes ago}}</span>gì cho bạn không? Đó là trong các tài liệu. Khá giống với những gì bạn muốn
Dave Pastor

@DavePastor: Vâng, tôi đã thử nó. Tôi đã thay đổi điều đó trong câu hỏi bây giờ. Tuy nhiên, đó là mã giả, chỉ để minh họa những gì tôi muốn đạt được.
yankee

@DavePastor: (liên quan đến bình luận thứ hai): Không, điều này không có ích. Đây là HTML, không phải TypeScript.
yankee

Ok vì vậy bạn muốn xử lý việc này về phía TS. Hiểu rồi.
Mục sư Dave

Câu trả lời:


2

Hiện tại, không thể sử dụng ICU với $localize, như đã thảo luận trong vấn đề github này . Từ những bình luận cuối cùng, có vẻ như đội ngũ góc cạnh đang xem xét nó nếu nó vẫn nhẹ.

Trong khi đó, cách giải quyết được đề xuất là tạo phương thức trợ giúp của riêng bạn trả về bản dịch chính xác dựa trên tham số đếm.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.