--- createdAt: 2026-06-12 updatedAt: 2026-06-12 title: Bộ Sưu Tập description: Sử dụng trường siêu dữ liệu item trong các tệp nội dung Intlayer để xây dựng các bộ sưu tập có thứ tự gồm các mục được bản địa hóa có thể chọn theo chỉ mục ở runtime. keywords: - Bộ Sưu Tập - Danh Sách Nội Dung - Nội Dung Động - Intlayer - Quốc tế hóa slugs: - doc - concept - collections history: - version: 9.0.0 date: 2026-06-12 changes: "Phát hành tính năng từ điển bộ sưu tập" author: aymericzip --- # Bộ Sưu Tập Một **bộ sưu tập** (collection) là một tập hợp các tệp nội dung chia sẻ cùng một khóa từ điển (`key`) nhưng mỗi tệp khai báo một chỉ mục mục (`item`) khác nhau. Intlayer hợp nhất chúng thành một danh sách có thứ tự duy nhất tại thời điểm build. ## Khai báo các mục trong bộ sưu tập Mỗi tệp đại diện cho một mục. Trường `item` là vị trí của nó trong danh sách (bắt đầu bằng 1). ```ts fileName="faq.1.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]} import { t, type Dictionary } from "intlayer"; const dictionary = { key: "faq", item: 1, content: { question: t({ en: "What is Intlayer?", fr: "Qu'est-ce qu'Intlayer ?" }), answer: t({ en: "An i18n toolkit.", fr: "Une boîte à outils i18n." }), }, } satisfies Dictionary; export default dictionary; ``` ```ts fileName="faq.2.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]} import { t, type Dictionary } from "intlayer"; const dictionary = { key: "faq", item: 2, content: { question: t({ en: "Is it free?", fr: "Est-ce gratuit ?" }), answer: t({ en: "Yes, open-source.", fr: "Oui, open-source." }), }, } satisfies Dictionary; export default dictionary; ``` ## Sử dụng bộ sưu tập ### Tất cả các mục ```tsx fileName="FAQ.tsx" import { useIntlayer } from "react-intlayer"; export const FAQ = () => { const items = useIntlayer("faq"); // { question: string; answer: string }[] return ( ); }; ``` ```tsx fileName="FAQ.tsx" import { useIntlayer } from "next-intlayer"; export const FAQ = () => { const items = useIntlayer("faq"); // { question: string; answer: string }[] return ( ); }; ``` ```vue fileName="FAQ.vue" ``` ```svelte fileName="FAQ.svelte" ``` ```tsx fileName="FAQ.tsx" import { useIntlayer } from "preact-intlayer"; export const FAQ = () => { const items = useIntlayer("faq"); // { question: string; answer: string }[] return ( ); }; ``` ```tsx fileName="FAQ.tsx" import { useIntlayer } from "solid-intlayer"; import { For } from "solid-js"; export const FAQ = () => { const items = useIntlayer("faq"); // { question: string; answer: string }[] return ( ); }; ``` ```typescript fileName="faq.component.ts" import { Component } from "@angular/core"; import { useIntlayer } from "angular-intlayer"; @Component({ selector: "app-faq", template: ` `, }) export class FAQComponent { items = useIntlayer("faq"); } ``` ```javascript fileName="faq.js" import { useIntlayer } from "vanilla-intlayer"; const faq = useIntlayer("faq"); faq.forEach((item) => { console.log(item.question); console.log(item.answer); }); ``` ### Mục đơn theo chỉ mục (index) ```tsx const faq2 = useIntlayer("faq", { item: 2 }); // → { question: string; answer: string } ``` ### Mục đơn với ngôn ngữ (locale) rõ ràng ```tsx const faq2Vi = useIntlayer("faq", { item: 2, locale: "vi" }); ``` ## Các trường hợp sử dụng điển hình - Danh sách Câu hỏi thường gặp (FAQ) - Các gói định giá - Các slide trình chiếu / carousel - Hướng dẫn từng bước