\n\n\n```\n\n \n \n\nTo use plural content in Svelte components, retrieve it via the `useIntlayer` hook and call it with a count. The store is accessed with `$`. Here's an example:\n\n```svelte fileName=\"**/*.svelte\"\n\n\n
\n

{$content.totalOpenings(count)}

\n
\n```\n\n
\n \n\nTo use plural content in Preact components, retrieve it via the `useIntlayer` hook and call it with a count. Here's an example:\n\n```tsx fileName=\"**/*.tsx\" codeFormat={[\"typescript\", \"esm\"]}\nimport type { FC } from \"preact\";\nimport { useIntlayer } from \"preact-intlayer\";\n\nconst OpeningsComponent: FC<{ count: number }> = ({ count }) => {\n const { totalOpenings } = useIntlayer(\"total_openings\");\n\n return (\n
\n

{totalOpenings(count)}

\n
\n );\n};\n\nexport default OpeningsComponent;\n```\n\n
\n \n\nTo use plural content in SolidJS components, retrieve it via the `useIntlayer` hook and call it with a count. Here's an example:\n\n```tsx fileName=\"**/*.tsx\" codeFormat={[\"typescript\", \"esm\"]}\nimport type { Component } from \"solid-js\";\nimport { useIntlayer } from \"solid-intlayer\";\n\nconst OpeningsComponent: Component<{ count: number }> = (props) => {\n const { totalOpenings } = useIntlayer(\"total_openings\");\n\n return (\n
\n

{totalOpenings(props.count)}

\n
\n );\n};\n\nexport default OpeningsComponent;\n```\n\n
\n \n\nTo use plural content in Angular components, retrieve it via the `useIntlayer` hook and call it with a count. Here's an example:\n\n```typescript fileName=\"app.component.ts\" codeFormat=\"typescript\"\nimport { Component, Input } from \"@angular/core\";\nimport { useIntlayer } from \"angular-intlayer\";\n\n@Component({\n selector: \"app-openings\",\n template: `\n
\n

{{ content().totalOpenings(count) }}

\n
\n `,\n})\nexport class OpeningsComponent {\n @Input() count!: number;\n\n content = useIntlayer(\"total_openings\");\n}\n```\n\n
\n \n\nTo use plural content with `vanilla-intlayer`, retrieve it via the `useIntlayer` hook and call it with a count. Here's an example:\n\n```typescript fileName=\"**/*.ts\" codeFormat={[\"typescript\", \"esm\"]}\nimport { installIntlayer, useIntlayer } from \"vanilla-intlayer\";\n\ninstallIntlayer();\n\nconst content = useIntlayer(\"total_openings\").onChange((newContent) => {\n document.getElementById(\"openings\")!.textContent =\n newContent.totalOpenings(5);\n});\n\n// Initial render\ndocument.getElementById(\"openings\")!.textContent = content.totalOpenings(5);\n```\n\n \n\n\n## Thiết lập nội dung số nhiều\n\nĐể thiết lập nội dung số nhiều trong dự án Intlayer của bạn, hãy tạo một mô-đun nội dung sử dụng trợ giúp `plural`. Danh mục `other` là bắt buộc và được sử dụng làm phương án dự phòng khi một ngôn ngữ không xác định danh mục cụ thể hơn.\n\n```typescript fileName=\"**/*.content.ts\" contentDeclarationFormat={[\"typescript\", \"esm\", \"commonjs\"]}\nimport { plural, t, type Dictionary } from \"intlayer\";\n\nconst openingsContent = {\n key: \"total_openings\",\n content: {\n totalOpenings: t({\n en: plural({\n one: \"{{count}} opening\",\n other: \"{{count}} openings\",\n }),\n vi: plural({\n other: \"{{count}} vị trí đang tuyển\",\n }),\n }),\n },\n} satisfies Dictionary;\n\nexport default openingsContent;\n```\n\n```json fileName=\"**/*.content.json\" contentDeclarationFormat=\"json\"\n{\n \"$schema\": \"https://intlayer.org/schema.json\",\n \"key\": \"total_openings\",\n \"content\": {\n \"totalOpenings\": {\n \"nodeType\": \"translation\",\n \"translation\": {\n \"en\": {\n \"nodeType\": \"plural\",\n \"plural\": {\n \"one\": \"{{count}} opening\",\n \"other\": \"{{count}} openings\"\n }\n },\n \"vi\": {\n \"nodeType\": \"plural\",\n \"plural\": {\n \"other\": \"{{count}} vị trí đang tuyển\"\n }\n }\n }\n }\n }\n}\n```\n\n> Các danh mục được hỗ trợ là `zero`, `one`, `two`, `few`, `many`, `other`. Bạn chỉ cần khai báo các danh mục mà ngôn ngữ mục tiêu của bạn sử dụng, Intlayer sẽ quay lại `other` khi không có danh mục cụ thể nào khớp.\n>\n> Trình giữ chỗ `{{count}}` được thay thế tự động bằng số lượng bạn chuyển vào lúc thực thi. Bạn cũng có thể bao gồm các trình giữ chỗ khác (xem [Trình giữ chỗ tùy chỉnh](#custom-placeholders) bên dưới).\n\n## Sử dụng nội dung số nhiều với React Intlayer\n\nĐể sử dụng nội dung số nhiều bên trong một thành phần React, hãy truy xuất nó thông qua hook `useIntlayer` và gọi nó với một số lượng. Ngôn ngữ đang hoạt động và số lượng được kết hợp để chọn danh mục CLDR phù hợp.\n\n```tsx fileName=\"**/*.tsx\" codeFormat={[\"typescript\", \"esm\"]}\nimport type { FC } from \"react\";\nimport { useIntlayer } from \"react-intlayer\";\n\nconst OpeningsComponent: FC<{ count: number }> = ({ count }) => {\n const { totalOpenings } = useIntlayer(\"total_openings\");\n\n return (\n
\n {/* Trong tiếng Anh: */}\n {/* count=0 → \"0 openings\" (other) */}\n {/* count=1 → \"1 opening\" (one) */}\n {/* count=2 → \"2 openings\" (other) */}\n {/* count=21 → \"21 openings\" (other) */}\n

{totalOpenings(count)}

\n
\n );\n};\n\nexport default OpeningsComponent;\n```\n\nBạn có thể gọi hàm được trả về theo hai cách tương đương:\n\n```tsx\ntotalOpenings(21); // viết tắt: chỉ số lượng\ntotalOpenings({ count: 21 }); // dạng đầy đủ\n```\n\n## Trình giữ chỗ tùy chỉnh\n\nChuỗi số nhiều có thể bao gồm các trình giữ chỗ khác ngoài `{{count}}`. Chuyển chúng dưới dạng đối tượng cùng với `count`:\n\n```typescript fileName=\"**/*.content.ts\" contentDeclarationFormat={[\"typescript\", \"esm\", \"commonjs\"]}\nimport { plural, type Dictionary } from \"intlayer\";\n\nconst inboxContent = {\n key: \"inbox_summary\",\n content: {\n summary: plural({\n other: \"{{name}}, bạn có {{count}} tin nhắn mới\",\n }),\n },\n} satisfies Dictionary;\n\nexport default inboxContent;\n```\n\n```tsx fileName=\"**/*.tsx\" codeFormat={[\"typescript\", \"esm\"]}\nconst { summary } = useIntlayer(\"inbox_summary\");\n\nsummary({ count: 1, name: \"Alice\" });\n// → \"Alice, bạn có 1 tin nhắn mới\"\n\nsummary({ count: 7, name: \"Alice\" });\n// → \"Alice, bạn có 7 tin nhắn mới\"\n```\n\n## Sơ lược về các danh mục CLDR\n\nCác ngôn ngữ khác nhau sử dụng các tập hợp con khác nhau của các danh mục CLDR. Một vài trường hợp phổ biến:\n\n| Ngôn ngữ | Các danh mục được sử dụng |\n| ------------------------------------- | -------------------------------------------- |\n| Tiếng Anh (`en`) | `one`, `other` |\n| Tiếng Pháp (`fr`) | `one`, `many`, `other` |\n| Tiếng Nga (`ru`) | `one`, `few`, `many`, `other` |\n| Tiếng Ba Lan (`pl`) | `one`, `few`, `many`, `other` |\n| Tiếng Ả Rập (`ar`) | `zero`, `one`, `two`, `few`, `many`, `other` |\n| Tiếng Nhật / Tiếng Trung / Tiếng Việt | chỉ `other` |\n\nBạn không cần phải ghi nhớ điều này, hãy khai báo các danh mục bạn có bản dịch và Intlayer sẽ quay lại `other` khi cần thiết.\n\n## Hạn chế\n\nSo với các nút khác, `plural` chưa thể được lồng ghép với các nút con.\n\nVí dụ:\n\nHợp lệ:\n\n```ts\n totalOpenings: t({\n en: plural({\n one: \"{{count}} opening\",\n other: \"{{count}} openings\",\n }),\n fr: plural({\n one: \"{{count}} offre\",\n other: \"{{count}} offres\",\n }),\n }),\n```\n\nKhông hợp lệ:\n\n```ts\ntotalOpenings: plural({\n one: t({\n en: \"{{count}} opening\",\n fr: \"{{count}} offre\",\n }),\n other: t({\n en: \"{{count}} openings\",\n fr: \"{{count}} offres\",\n }),\n}),\n```\n\n## Tài nguyên bổ sung\n\nĐể biết thêm thông tin chi tiết về cấu hình và cách sử dụng, hãy tham khảo các tài nguyên sau:\n\n- [Tài liệu về Liệt kê (Enumeration)](/vi/doc/concept/content/enumeration)\n- [Tài liệu về Chèn (Insertion)](/vi/doc/concept/content/insertion)\n- [Tài liệu về Intlayer CLI](/vi/doc/concept/cli)\n- [Tài liệu về React Intlayer](/vi/doc/environment/create-react-app)\n- [Tài liệu về Next Intlayer](/vi/doc/environment/nextjs/15)\n\nCác tài nguyên này cung cấp thêm thông tin chi tiết về việc thiết lập và sử dụng Intlayer trên nhiều môi trường và khung làm việc khác nhau.\n","description":"Khám phá cách khai báo và sử dụng nội dung số nhiều dựa trên ngôn ngữ (dựa trên CLDR) trong trang web đa ngôn ngữ của bạn. Làm theo các bước trong tài liệu trực tuyến này để thiết lập dự án của bạn trong vài phút.","url":"https://intlayer.org/vi/doc/concept/content/plural","datePublished":"2026-05-04","dateModified":"2026-05-04","version":"8.8.0","keywords":"Số nhiều, Đa dạng hóa, CLDR, Quốc tế hóa, Tài liệu, Intlayer, Next.js, JavaScript, React","license":"https://raw.githubusercontent.com/aymericzip/intlayer/refs/heads/main/LICENSE","audience":{"@type":"Audience","audienceType":"Nhà phát triển (Developers), Quản trị nội dung (Content Managers)"}}
    Tác giả:
    Ngày tạo:2026-05-04Cập nhật lần cuối:2026-05-04

    Nội dung số nhiều / Số nhiều trong Intlayer

    Cách hoạt động của số nhiều

    Trong Intlayer, nội dung số nhiều được thực hiện thông qua hàm plural, hàm này ánh xạ các danh mục số nhiều CLDR, zero, one, two, few, many, other, tới nội dung tương ứng của chúng. Danh mục chính xác được chọn tự động dựa trên ngôn ngữ đang hoạt động và giá trị số lượng, sử dụng API Intl.PluralRules tích hợp sẵn của nền tảng.

    Không giống như enu, chọn nội dung dựa trên các phạm vi số do bạn tự xác định, plural ủy quyền việc lựa chọn cho các quy tắc CLDR. Đây là điều làm cho nó có thể mở rộng cho các ngôn ngữ có quy tắc số nhiều phức tạp, như tiếng Nga, tiếng Ba Lan, tiếng Ả Rập hoặc tiếng Wales, mà không cần phải tự viết logic modulo.

    Khi nào nên sử dụng plural so với enu

    To use plural content inside a React component, retrieve it via the useIntlayer hook and call it with a count. The active locale and the count are combined to pick the matching CLDR category.

    **/*.tsx
    import type { FC } from "react";
    import { useIntlayer } from "react-intlayer";
    
    const OpeningsComponent: FC<{ count: number }> = ({ count }) => {
    const { totalOpenings } = useIntlayer("total_openings");
    
    return (
      <div>
        <p>{totalOpenings(count)}</p>
      </div>
    );
    };
    
    export default OpeningsComponent;

    Thiết lập nội dung số nhiều

    Để thiết lập nội dung số nhiều trong dự án Intlayer của bạn, hãy tạo một mô-đun nội dung sử dụng trợ giúp plural. Danh mục other là bắt buộc và được sử dụng làm phương án dự phòng khi một ngôn ngữ không xác định danh mục cụ thể hơn.

    **/*.content.ts
    import { plural, t, type Dictionary } from "intlayer";
    
    const openingsContent = {
      key: "total_openings",
      content: {
        totalOpenings: t({
          en: plural({
            one: "{{count}} opening",
            other: "{{count}} openings",
          }),
          vi: plural({
            other: "{{count}} vị trí đang tuyển",
          }),
        }),
      },
    } satisfies Dictionary;
    
    export default openingsContent;

    Các danh mục được hỗ trợ là zero, one, two, few, many, other. Bạn chỉ cần khai báo các danh mục mà ngôn ngữ mục tiêu của bạn sử dụng, Intlayer sẽ quay lại other khi không có danh mục cụ thể nào khớp.

    Trình giữ chỗ {{count}} được thay thế tự động bằng số lượng bạn chuyển vào lúc thực thi. Bạn cũng có thể bao gồm các trình giữ chỗ khác (xem Trình giữ chỗ tùy chỉnh bên dưới).

    Sử dụng nội dung số nhiều với React Intlayer

    Để sử dụng nội dung số nhiều bên trong một thành phần React, hãy truy xuất nó thông qua hook useIntlayer và gọi nó với một số lượng. Ngôn ngữ đang hoạt động và số lượng được kết hợp để chọn danh mục CLDR phù hợp.

    **/*.tsx
    import type { FC } from "react";
    import { useIntlayer } from "react-intlayer";
    
    const OpeningsComponent: FC<{ count: number }> = ({ count }) => {
      const { totalOpenings } = useIntlayer("total_openings");
    
      return (
        <div>
          {/* Trong tiếng Anh:                                  */}
          {/*  count=0  → "0 openings"   (other)           */}
          {/*  count=1  → "1 opening"    (one)             */}
          {/*  count=2  → "2 openings"   (other)           */}
          {/*  count=21 → "21 openings"  (other)           */}
          <p>{totalOpenings(count)}</p>
        </div>
      );
    };
    
    export default OpeningsComponent;

    Bạn có thể gọi hàm được trả về theo hai cách tương đương:

    tsx
    totalOpenings(21); // viết tắt: chỉ số lượngtotalOpenings({ count: 21 }); // dạng đầy đủ

    Trình giữ chỗ tùy chỉnh

    Chuỗi số nhiều có thể bao gồm các trình giữ chỗ khác ngoài {{count}}. Chuyển chúng dưới dạng đối tượng cùng với count:

    **/*.content.ts
    import { plural, type Dictionary } from "intlayer";
    
    const inboxContent = {
      key: "inbox_summary",
      content: {
        summary: plural({
          other: "{{name}}, bạn có {{count}} tin nhắn mới",
        }),
      },
    } satisfies Dictionary;
    
    export default inboxContent;
    **/*.tsx
    const { summary } = useIntlayer("inbox_summary");
    
    summary({ count: 1, name: "Alice" });
    // → "Alice, bạn có 1 tin nhắn mới"
    
    summary({ count: 7, name: "Alice" });
    // → "Alice, bạn có 7 tin nhắn mới"

    Sơ lược về các danh mục CLDR

    Các ngôn ngữ khác nhau sử dụng các tập hợp con khác nhau của các danh mục CLDR. Một vài trường hợp phổ biến:

    Ngôn ngữ Các danh mục được sử dụng
    Tiếng Anh (en) one, other
    Tiếng Pháp (fr) one, many, other
    Tiếng Nga (ru) one, few, many, other
    Tiếng Ba Lan (pl) one, few, many, other
    Tiếng Ả Rập (ar) zero, one, two, few, many, other
    Tiếng Nhật / Tiếng Trung / Tiếng Việt chỉ other

    Bạn không cần phải ghi nhớ điều này, hãy khai báo các danh mục bạn có bản dịch và Intlayer sẽ quay lại other khi cần thiết.

    Hạn chế

    So với các nút khác, plural chưa thể được lồng ghép với các nút con.

    Ví dụ:

    Hợp lệ:

    ts
        totalOpenings: t({      en: plural({        one: "{{count}} opening",        other: "{{count}} openings",      }),      fr: plural({        one: "{{count}} offre",        other: "{{count}} offres",      }),    }),

    Không hợp lệ:

    ts
    totalOpenings: plural({  one: t({    en: "{{count}} opening",    fr: "{{count}} offre",  }),  other: t({    en: "{{count}} openings",    fr: "{{count}} offres",  }),}),

    Tài nguyên bổ sung

    Để biết thêm thông tin chi tiết về cấu hình và cách sử dụng, hãy tham khảo các tài nguyên sau:

    Các tài nguyên này cung cấp thêm thông tin chi tiết về việc thiết lập và sử dụng Intlayer trên nhiều môi trường và khung làm việc khác nhau.