Tác giả:
    Ngày tạo:2026-07-30Cập nhật lần cuối:2026-07-30

    Nội dung dựa trên lựa chọn (Select) / Intlayer

    Select hoạt động như thế nào

    Trong Intlayer, nội dung dựa trên lựa chọn đạt được thông qua hàm select, hàm này ánh xạ các giá trị chuỗi tùy ý tới nội dung tương ứng của chúng. Hàm này tương đương với thông báo ICU {value, select, …}, hoặc giống như một câu lệnh switch trong mã ứng dụng của bạn.

    Sử dụng select khi yếu tố phân biệt (discriminant) là một chuỗi dạng tự do: trạng thái (status), gói đăng ký (plan), nền tảng (platform) hoặc vai trò (role). Đối với các yếu tố phân biệt khác, Intlayer cung cấp các nút (nodes) chuyên dụng:

    Yếu tố phân biệt (Discriminant) Nút (Node)
    Số lượng (Quantity) enu()
    Boolean cond()
    Giới tính (Gender) gender()
    Bất kỳ chuỗi nào khác select()

    Thiết lập nội dung dựa trên lựa chọn

    Để thiết lập nội dung dựa trên lựa chọn trong dự án Intlayer của bạn, hãy tạo một module nội dung bao gồm các định nghĩa lựa chọn (select) của bạn. Dưới đây là ví dụ trong các định dạng khác nhau.

    **/*.content.ts
    import { select, type Dictionary } from "intlayer";
    
    const myPostContent = {
      key: "my_key",
      content: {
        publishStatus: select({
          draft: "This post is a draft",
          published: "This post is live",
          scheduled: "This post is scheduled",
          fallback: "Unknown status", // tùy chọn (optional)
        }),
      },
    } satisfies Dictionary;
    
    export default myPostContent;
    Nếu không có fallback nào được khai báo, khóa (key) được khai báo cuối cùng sẽ được coi là dự phòng khi giá trị được cung cấp không khớp với bất kỳ trường hợp nào đã được khai báo: giống hệt như thỏa thuận (contract) của cond()gender().

    An toàn kiểu (Type Safety)

    Tham số được chấp nhận được suy luận từ các trường hợp đã được khai báo:

    • Nếu không có fallback, chỉ các trường hợp đã khai báo mới được chấp nhận: việc đánh máy sai sẽ tạo ra một lỗi kiểu (type error).
    • Nếu có fallback, bất kỳ chuỗi nào cũng được chấp nhận (bởi vì fallback bao gồm các giá trị không khớp) trong khi các trường hợp đã khai báo vẫn cung cấp tính năng tự động hoàn thành (autocompletion).

    Tại sao không sử dụng một đối tượng thông thường?

    Sẽ rất hấp dẫn nếu khai báo một đối tượng (object) thông thường và lập chỉ mục (index) vào đó bằng cách sử dụng một giá trị trong thời gian chạy (runtime value):

    tsx
    // ❌ Đừng làm điều nàyconst { publishStatus } = useIntlayer("my_key");return <p>{publishStatus[publishType]}</p>;

    Trình biên dịch (compiler) Intlayer phân tích mã nguồn của bạn để loại bỏ nội dung không sử dụng và thu nhỏ (minify) các khóa còn lại. Việc truy cập được tính toán động (obj[expr]) không thể được giải quyết tĩnh (statically resolved), do đó toàn bộ nhánh sẽ được đánh dấu là mờ (opaque): nó sẽ được giữ lại trong gói (bundle) và các khóa của nó sẽ không được thu nhỏ.

    Bằng cách sử dụng select(), việc giải quyết trường hợp (case resolution) diễn ra bên trong một lệnh gọi hàm thay vì là một truy cập thuộc tính (property access). Trình biên dịch coi nó là một truy cập trường tĩnh (static field access) đơn lẻ, và tối ưu hóa nút này một cách chính xác như những gì nó làm với enu(), cond(), hoặc gender():

    tsx
    // ✅ Hãy làm điều nàyconst { publishStatus } = useIntlayer("my_key");return <p>{publishStatus(publishType)}</p>;

    Sử dụng nội dung dựa trên lựa chọn

    Để tận dụng nội dung dựa trên lựa chọn trong một component React, hãy nhập khẩu (import) và sử dụng hook useIntlayer từ gói react-intlayer. Hook này lấy (fetch) nội dung cho khóa (key) đã chỉ định và cho phép bạn truyền một giá trị vào để chọn đầu ra thích hợp.

    **/*.tsx
    import type { FC } from "react";
    import { useIntlayer } from "react-intlayer";
    
    const PostStatus: FC = () => {
    const { publishStatus } = useIntlayer("my_key");
    
    return (
      <div>
        <p>
          {
            /* Đầu ra: This post is a draft */
            publishStatus("draft")
          }
        </p>
        <p>
          {
            /* Đầu ra: This post is live */
            publishStatus("published")
          }
        </p>
        <p>
          {
            /* Đầu ra: Unknown status */
            publishStatus("Archived")
          }
        </p>
      </div>
    );
    };
    
    export default PostStatus;

    Kết hợp Select với các Nút (Nodes) khác

    Bởi vì mỗi trường hợp (case) chứa một nút nội dung đầy đủ (full content node), select có thể được kết hợp với các nút như t(), insert(), md(), v.v.:

    **/*.content.ts
    import { insert, select, t, type Dictionary } from "intlayer";const myPostContent = {  key: "my_key",  content: {    publishStatus: select({      draft: insert(        t({          en: "{{name}} saved a draft",          fr: "{{name}} a enregistré un brouillon",          vi: "{{name}} đã lưu một bản nháp",        })      ),      published: insert(        t({          en: "{{name}} published the post",          fr: "{{name}} a publié l’article",          vi: "{{name}} đã xuất bản bài viết",        })      ),      fallback: insert(        t({          en: "{{name}} updated the post",          fr: "{{name}} a mis à jour l’article",          vi: "{{name}} đã cập nhật bài viết",        })      ),    }),  },} satisfies Dictionary;export default myPostContent;
    tsx
    publishStatus("draft")({ name: "Alice" }); // Đầu ra: Alice đã lưu một bản nháp

    Chuyển đổi từ ICU select

    Các thông báo sử dụng tham số select của ICU sẽ được nhập (imported) dưới dạng nút (node) select:

    text
    {publishType, select, draft {draft} published {published} other {Unknown}}

    Sẽ trở thành:

    typescript
    select(  {    draft: "draft",    published: "published",    fallback: "Unknown",  },  "publishType");

    Trường hợp other của ICU được đổi tên thành fallback, tên chuẩn (canonical name) trong Intlayer cho tất cả các trường hợp bao gồm (catch-all cases). Tham số thứ hai lưu lại tên biến ICU để thông báo sẽ biến đổi trở lại thành đúng chuỗi ICU đó khi xuất (export).

    Xin lưu ý, thông báo ICU select nơi các trường hợp là các giá trị giới tính (male / female / other) thay vào đó sẽ được nhập dưới dạng nút gender.

    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 xem 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 trong các môi trường và framework khác nhau.