Bagaimana cara menggunakan $ 9 sudut lokal dengan bentuk jamak?

9

Karena Angular 9 dapat kita gunakan

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

Untuk i18n dalam kode naskah. Ini masih memiliki beberapa keterbatasan karena ng xi18nperintah tidak mendeteksi string, tetapi jika teks-teks ini ditambahkan secara manual ke file terjemahan itu berfungsi.

The $localizefungsi cukup baik didokumentasikan dalam JSDoc di sumber , namun tidak menjelaskan bagaimana bekerja dengan bentuk jamak. Yang saya maksud adalah sesuatu seperti ini (pseudo-code):

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

Apakah ini mungkin $localize? Jika ya: Bagaimana? Jika tidak: Bagaimana Angular mengkompilasi ekspresi seperti itu dari HTML ke TypeScript?

yankee
sumber
apakah ini membantu anda <span i18n>Updated {minutes, plural, =0 {just now} =1 {one minute ago} other {{{minutes}} minutes ago}}</span>? Itu ada dalam dokumen. Sangat mirip dengan yang Anda inginkan
Dave Pastor
@DavePastor: Ya, saya mencobanya. Saya mengubahnya dalam pertanyaan sekarang. Namun demikian itu adalah pseudo-code, hanya untuk menggambarkan apa yang ingin saya capai.
yankee
@DavePastor: (mengenai komentar kedua): Tidak, ini tidak membantu. Ini HTML, bukan TypeScript.
yankee
Ok jadi Anda ingin menangani ini di sisi TS. Oke.
Dave Pastor

Jawaban:

2

Untuk saat ini, tidak mungkin untuk menggunakan ICU dengan $localize, seperti yang dibahas dalam masalah github ini . Dari komentar terakhir, sepertinya tim sudut sedang mempertimbangkannya jika tetap ringan.

Sementara itu, solusi yang disarankan adalah membuat metode pembantu Anda sendiri yang mengembalikan terjemahan yang benar berdasarkan parameter jumlah.

    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
sumber