Trang chủSandboxTrưng bàyỨng dụngTài liệuBlog
    • EnglishTiếng Anh
      EN
    • русскийTiếng Nga
      RU
    • 日本語Tiếng Nhật
      JA
    • françaisTiếng Pháp
      FR
    • 한국어Tiếng Hàn
      KO
    • 中文Tiếng Trung
      ZH
    • españolTiếng Tây Ban Nha
      ES
    • DeutschTiếng Đức
      DE
    • العربيةTiếng Ả Rập
      AR
    • italianoTiếng Italy
      IT
    • British EnglishTiếng Anh (Anh)
      EN-GB
    • portuguêsTiếng Bồ Đào Nha
      PT
    • हिन्दीTiếng Hindi
      HI
    • TürkçeTiếng Thổ Nhĩ Kỳ
      TR
    • polskiTiếng Ba Lan
      PL
    • IndonesiaTiếng Indonesia
      ID
    • Tiếng ViệtTiếng Việt
      VI
    • українськаTiếng Ukraina
      UK
    /
    Lọc tài liệu theo framework
    Alt+←
    Tại sao Intlayer?
    Bắt đầu
    Khái niệm
    • Intlayer làm việc như thế nào
    • Cấu hình
    • TestFillBuildWatchExtractLoginPushPullConfigurationListVersionEditorLiveDebugDoc ReviewDoc TranslateSDK
    • Editor visual
    • CMS
    • Tích hợp CI/CD
    • DịchSố nhiềuLiệt kêĐiều kiệnGiới tínhChènTệpNestingMarkdownHTMLLấy hàm
    • File cho mỗi ngôn ngữ
    • Biên dịch
    • Tự động điền
    • Kiểm tra
    • Tối ưu hóa gói
    Môi trường
    • Next.js 14 và App Router
      Next.js 15
      Next.js không locale URL
      Next.js và Page Router
      Trình biên dịch
    • Tanstack Start Solid
    • Astro và React
      Astro và Svelte
      Astro và Vue
      Astro và Solid
      Astro và Preact
      Astro và Lit
      Astro và Vanilla JS
    • React Router v7
      React Router v7 (fs-routes)
      Compiler
    • Nuxt và Vue
    • Vite và Solid
    • SvelteKit
    • Vite và Preact
    • Vite và Vanilla JS
    • Vite và Lit
    • Angular 19 (Webpack)
      Analog
    • React CRA
    • React Native và Expo
    • Express.js
      NestJS
      Fastify
      Hono
      Adonis
    • Lynx và React
    Plugins
    • JSON
    • gettext (.po)
    Mở rộng VS Code
    Tác nhân
    • MCP Server
    • Kỹ năng tác nhân
    Phiên bản
    • v8
    • v7
    • v6
    Benchmark
    • Next.js
    • TanStack
    • Vue
    • Solid
    • Svelte
    Blog
    Đặt câu hỏi
    1. Documentation
    2. Môi trường
    3. Vite and vanilla
    Ngày tạo:2026-03-23Cập nhật lần cuối:2026-05-06
    Xem mẫu ứng dụng trên GitHub

    Trang này có một mẫu ứng dụng có sẵn.

    Xem ứng dụng trưng bày

    Trang này liên kết đến bản demo trực tiếp của mẫu.

    Tham chiếu tài liệu này tới trợ lý AI yêu thích của bạn
    ChatGPT
    Claude
    DeepSeek
    Google AI mode
    Gemini
    Perplexity
    Mistral
    Grok

    Đặt câu hỏi và nhận tóm tắt tài liệu bằng cách tham chiếu trang này và nhà cung cấp AI bạn chọn

    Lịch sử phiên bản

    1. "Cập nhật cách sử dụng API useIntlayer của Solid sang truy cập thuộc tính trực tiếp"
      v8.9.04/5/2026
    2. "Lịch sử ban đầu"
      v8.4.1023/3/2026

    Nội dung của trang này đã được dịch bằng AI.

    Xem phiên bản mới nhất của nội dung gốc bằng tiếng Anh
    Chỉnh sửa tài liệu này

    Nếu bạn có ý tưởng để cải thiện tài liệu này, vui lòng đóng góp bằng cách gửi pull request trên GitHub.

    Liên kết GitHub tới tài liệu
    Sao chép

    Sao chép Markdown của tài liệu vào bộ nhớ tạm

    Dịch website Vite và Vanilla JS của bạn bằng Intlayer | Quốc tế hóa (i18n)

    ide.intlayer.org
    intlayer-vite-vanilla.vercel.app

    Mục lục

    Intlayer là gì?

    Intlayer là một thư viện quốc tế hóa (i18n) mã nguồn mở và sáng tạo được thiết kế để đơn giản hóa việc hỗ trợ đa ngôn ngữ trong các ứng dụng web hiện đại.

    Với Intlayer, bạn có thể:

    • Dễ dàng quản lý các bản dịch bằng cách sử dụng các từ điển khai báo ở cấp độ thành phần.
    • Bản địa hóa động metadata, route và nội dung.
    • Đảm bảo hỗ trợ TypeScript với các kiểu dữ liệu được tạo tự động, cải thiện tính năng tự động hoàn thành và phát hiện lỗi.
    • Tận dụng các tính năng nâng cao, như phát hiện và chuyển đổi ngôn ngữ động.

    Hướng dẫn từng bước để thiết lập Intlayer trong ứng dụng Vite và Vanilla JS

    Bước 1: Cài đặt các phụ thuộc

    Cài đặt các gói cần thiết bằng npm:

    bash
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    npm install intlayer vanilla-intlayernpm install vite-intlayer --save-devnpx intlayer init
    • intlayer Gói cốt lõi cung cấp các công cụ quốc tế hóa để quản lý cấu hình, dịch thuật, khai báo nội dung, chuyển đổi mã nguồn và lệnh CLI.

    • vanilla-intlayer Gói tích hợp Intlayer với các ứng dụng JavaScript / TypeScript thuần túy. Nó cung cấp một pub/sub singleton (IntlayerClient) và các hàm hỗ trợ dựa trên callback (useIntlayer, useLocale, v.v.) để bất kỳ phần nào trong ứng dụng của bạn cũng có thể phản ứng với các thay đổi ngôn ngữ mà không phụ thuộc vào framework UI.

    • vite-intlayer Bao gồm plugin Vite để tích hợp Intlayer với Vite bundler, cũng như middleware để phát hiện ngôn ngữ ưa thích của người dùng, quản lý cookie và xử lý chuyển hướng URL.

    Bước 2: Cấu hình dự án của bạn

    Tạo một tệp cấu hình để thiết lập các ngôn ngữ cho ứng dụng của bạn:

    intlayer.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [
          Locales.ENGLISH,
          Locales.FRENCH,
          Locales.SPANISH,
          // Các ngôn ngữ khác của bạn
        ],
        defaultLocale: Locales.ENGLISH,
      },
    };
    
    export default config;
    Thông qua tệp cấu hình này, bạn có thể thiết lập URL được bản địa hóa, chuyển hướng middleware, tên cookie, vị trí và phần mở rộng của các khai báo nội dung, tắt log Intlayer trong console, và nhiều hơn nữa. Để biết danh sách đầy đủ các tham số khả dụng, hãy tham khảo tài liệu cấu hình.

    Bước 3: Tích hợp Intlayer vào cấu hình Vite của bạn

    Thêm plugin intlayer vào cấu hình của bạn.

    vite.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { defineConfig } from "vite";
    import { intlayer } from "vite-intlayer";
    
    // https://vitejs.dev/config/
    export default defineConfig({
      plugins: [intlayer()],
    });
    Plugin Vite intlayer() được sử dụng để tích hợp Intlayer với Vite. Nó đảm bảo việc xây dựng các tệp khai báo nội dung và theo dõi chúng trong chế độ phát triển. Nó định nghĩa các biến môi trường Intlayer trong ứng dụng Vite. Ngoài ra, nó cung cấp các alias để tối ưu hóa hiệu suất.

    Bước 4: Khởi tạo Intlayer trong entry point của bạn

    Gọi installIntlayer() trước khi bất kỳ nội dung nào được render để ngôn ngữ singleton toàn cầu sẵn sàng.

    src/main.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { installIntlayer } from "vanilla-intlayer";// Phải được gọi trước khi render bất kỳ nội dung i18n nào.installIntlayer();// Import và chạy các module ứng dụng của bạn.import "./app.js";

    Nếu bạn cũng sử dụng khai báo nội dung md() (Markdown), hãy cài đặt thêm trình render markdown:

    src/main.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { installIntlayer, installIntlayerMarkdown } from "vanilla-intlayer";installIntlayer();installIntlayerMarkdown();import "./app.js";

    Bước 5: Khai báo nội dung của bạn

    Tạo và quản lý các khai báo nội dung để lưu trữ các bản dịch:

    src/app.content.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { insert, t, type Dictionary } from "intlayer";
    
    const appContent = {
      key: "app",
      content: {
        title: "Vite + Vanilla",
    
        viteLogoLabel: t({
          en: "Vite Logo",
          fr: "Logo Vite",
          es: "Logo Vite",
        }),
    
        count: insert(
          t({
            en: "count is {{count}}",
            fr: "le compte est {{count}}",
            es: "el recuento es {{count}}",
          })
        ),
    
        readTheDocs: t({
          en: "Click on the Vite logo to learn more",
          fr: "Cliquez sur le logo Vite pour en savoir plus",
          es: "Nhấp vào logo Vite để tìm hiểu thêm",
        }),
      },
    } satisfies Dictionary;
    
    export default appContent;

    Các khai báo nội dung của bạn có thể được định nghĩa ở bất kỳ đâu trong ứng dụng miễn là chúng được bao gồm trong thư mục contentDir (mặc định là ./src) và khớp với phần mở rộng tệp khai báo nội dung (mặc định là .content.{json,ts,tsx,js,jsx,mjs,cjs}).

    Để biết thêm chi tiết, hãy tham khảo tài liệu khai báo nội dung.

    Bước 6: Sử dụng Intlayer trong JavaScript của bạn

    vanilla-intlayer ánh xạ API của react-intlayer: useIntlayer(key, locale?) trả về nội dung đã dịch trực tiếp. Chuỗi hàm .onChange() vào kết quả để đăng ký theo dõi các thay đổi ngôn ngữ - tương đương với việc re-render trong React.

    src/main.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { installIntlayer, useIntlayer } from "vanilla-intlayer";installIntlayer();// Lấy nội dung ban đầu cho ngôn ngữ hiện tại.// Chuỗi hàm .onChange() để được thông báo mỗi khi ngôn ngữ thay đổi.const content = useIntlayer("app").onChange((newContent) => {  // Chỉ re-render hoặc cập nhật các node DOM bị ảnh hưởng  document.querySelector<HTMLHeadingElement>("h1")!.textContent = String(    newContent.title  );  document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent =    String(newContent.readTheDocs);});// Render lần đầudocument.querySelector<HTMLHeadingElement>("h1")!.textContent = String(  content.title);document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent =  String(content.readTheDocs);

    Truy cập các giá trị lá dưới dạng chuỗi bằng cách bao bọc chúng trong String(), việc này sẽ gọi phương thức toString() của node và trả về văn bản đã dịch.

    Khi bạn cần giá trị cho một thuộc tính HTML thuần (ví dụ: alt, aria-label), hãy sử dụng trực tiếp .value:

    typescript
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    img.alt = content.viteLogoLabel.value;

    (Tùy chọn) Bước 7: Thay đổi ngôn ngữ nội dung của bạn

    Để thay đổi ngôn ngữ nội dung, hãy sử dụng hàm setLocale được cung cấp bởi useLocale.

    src/locale-switcher.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { getLocaleName } from "intlayer";import { useLocale } from "vanilla-intlayer";export function setupLocaleSwitcher(container: HTMLElement): () => void {  const { locale, availableLocales, setLocale, subscribe } = useLocale();  const select = document.createElement("select");  select.setAttribute("aria-label", "Language");  const render = (currentLocale: string) => {    select.innerHTML = availableLocales      .map(        (loc) =>          `<option value="${loc}"${loc === currentLocale ? " selected" : ""}>            ${getLocaleName(loc)}          </option>`      )      .join("");  };  render(locale);  container.appendChild(select);  select.addEventListener("change", () => setLocale(select.value as any));  // Giữ dropdown đồng bộ khi ngôn ngữ thay đổi từ nơi khác  return subscribe((newLocale) => render(newLocale));}

    (Tùy chọn) Bước 8: Render nội dung Markdown và HTML

    Intlayer hỗ trợ khai báo nội dung dưới dạng md() và html(). Trong Vanilla JS, đầu ra đã biên dịch được chèn dưới dạng HTML thô qua innerHTML.

    Biên dịch và chèn HTML:

    src/main.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import {  compileMarkdown,  installIntlayerMarkdown,  useIntlayer,} from "vanilla-intlayer";installIntlayerMarkdown();const content = useIntlayer("app").onChange((newContent) => {  const el = document.querySelector<HTMLDivElement>(".edit-note")!;  el.innerHTML = compileMarkdown(String(newContent.editNote));});document.querySelector<HTMLDivElement>(".edit-note")!.innerHTML =  compileMarkdown(String(content.editNote));
    TIP
    String(content.editNote) gọi toString() trên IntlayerNode để trả về chuỗi Markdown thô. Truyền nó vào compileMarkdown để lấy chuỗi HTML, sau đó thiết lập qua innerHTML.
    WARNING

    Chỉ sử dụng innerHTML với nội dung tin cậy. Nếu markdown đến từ đầu vào của người dùng, hãy lọc sạch nó trước (ví dụ với DOMPurify). Bạn có thể cài đặt trình render lọc sạch một cách linh hoạt:

    typescript
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { installIntlayerMarkdownDynamic } from "vanilla-intlayer";await installIntlayerMarkdownDynamic(async () => {  const DOMPurify = await import("dompurify");  return (markdown) => DOMPurify.sanitize(compileMarkdown(markdown));});

    (Tùy chọn) Bước 9: Thêm Localized Routing vào ứng dụng của bạn

    Để tạo các route duy nhất cho mỗi ngôn ngữ (hữu ích cho SEO), bạn có thể sử dụng intlayerProxy trong cấu hình Vite của mình để phát hiện ngôn ngữ ở phía server.

    Đầu tiên, thêm intlayerProxy vào cấu hình Vite của bạn:

    Lưu ý rằng để sử dụng intlayerProxy trong môi trường production, bạn cần chuyển vite-intlayer từ devDependencies sang dependencies.
    vite.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { defineConfig } from "vite";
    import { intlayer, intlayerProxy } from "vite-intlayer";
    
    export default defineConfig({
      plugins: [
        intlayerProxy(), // nên đặt đầu tiên
        intlayer(),
      ],
    });

    (Tùy chọn) Bước 10: Thay đổi URL khi ngôn ngữ thay đổi

    Để cập nhật URL trình duyệt khi ngôn ngữ thay đổi, hãy gọi useRewriteURL() sau khi cài đặt Intlayer:

    src/main.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { installIntlayer, useRewriteURL } from "vanilla-intlayer";installIntlayer();// Viết lại URL ngay lập tức và mỗi khi ngôn ngữ thay đổi sau đó.// Trả về một hàm hủy đăng ký để dọn dẹp.const stopRewriteURL = useRewriteURL();

    (Tùy chọn) Bước 11: Chuyển đổi thuộc tính Language và Direction của HTML

    Cập nhật các thuộc tính lang và dir của thẻ <html> để khớp với ngôn ngữ hiện tại nhằm hỗ trợ truy cập và SEO.

    src/main.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { getHTMLTextDir } from "intlayer";import { installIntlayer, useLocale } from "vanilla-intlayer";installIntlayer();useLocale({  onLocaleChange: (locale) => {    document.documentElement.lang = locale;    document.documentElement.dir = getHTMLTextDir(locale);  },});

    (Tùy chọn) Bước 12: Lazy-load từ điển theo ngôn ngữ

    Đối với các ứng dụng lớn, bạn có thể muốn chia từ điển của mỗi ngôn ngữ thành một phần (chunk) riêng. Sử dụng useDictionaryDynamic cùng với import() động của Vite:

    src/app.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { installIntlayer, useDictionaryDynamic } from "vanilla-intlayer";installIntlayer();const unsubscribe = useDictionaryDynamic(  {    en: () => import("../.intlayer/dictionaries/en/app.mjs"),    fr: () => import("../.intlayer/dictionaries/fr/app.mjs"),    es: () => import("../.intlayer/dictionaries/es/app.mjs"),  },  "app").onChange((content) => {  document.querySelector("h1")!.textContent = String(content.title);});
    Mỗi bundle ngôn ngữ chỉ được tải khi ngôn ngữ đó được kích hoạt và kết quả được lưu vào cache - các lần chuyển đổi sau đó sang cùng một ngôn ngữ sẽ diễn ra tức thì.

    (Tùy chọn) Bước 13: Trích xuất nội dung từ các thành phần của bạn

    Nếu bạn có một codebase hiện có, việc chuyển đổi hàng ngàn tệp có thể tốn thời gian.

    Để giảm bớt quá trình này, Intlayer đề xuất một trình biên dịch / trình trích xuất để chuyển đổi các thành phần và trích xuất nội dung.

    Để thiết lập, bạn có thể thêm một phần compiler trong tệp intlayer.config.ts của mình:

    intlayer.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { type IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  // ... Cấu hình còn lại của bạn  compiler: {    /**     * Chỉ định xem trình biên dịch có nên được bật hay không.     */    enabled: true,    /**     * Định nghĩa đường dẫn các tệp đầu ra     */    output: ({ fileName, extension }) => `./${fileName}${extension}`,    /**     * Chỉ định xem các thành phần có nên được lưu lại sau khi được chuyển đổi hay không.     * Bằng cách đó, trình biên dịch có thể chỉ chạy một lần để chuyển đổi ứng dụng, và sau đó nó có thể được gỡ bỏ.     */    saveComponents: false,    /**     * Tiền tố phím từ điển     */    dictionaryKeyPrefix: "",  },};export default config;

    Chạy trình trích xuất để chuyển đổi các thành phần và trích xuất nội dung

    bash
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    npx intlayer extract

    Cập nhật vite.config.ts của bạn để bao gồm plugin intlayerCompiler:

    vite.config.ts
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import { defineConfig } from "vite";import { intlayer, intlayerCompiler } from "vite-intlayer";export default defineConfig({ plugins: [   intlayer(),   intlayerCompiler(), // Thêm plugin trình biên dịch ],});
    bash
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    npm run build # Hoặc npm run dev

    (Tuỳ chọn) Sitemap và robots.txt (sinh lúc build)

    Intlayer cung cấp generateSitemap và getMultilingualUrls để định dạng sitemap.xml đa ngôn ngữ và robots.txt cho crawler rồi tự ghi vào public/. Thường chạy một script Node nhỏ trước Vite (ví dụ hook npm predev / prebuild).

    Sitemap

    Trình tạo sitemap của Intlayer tôn trọng cấu hình locale và thêm metadata cho crawler.

    Sitemap hỗ trợ không gian tên xhtml:link (hreflang). Thay vì chỉ liệt kê URL phẳng, Intlayer nối hai chiều mọi bản địa phương của từng trang (ví dụ /about, /fr/about hoặc /about?lang=fr tùy chế độ routing).

    Robots.txt

    Dùng getMultilingualUrls để quy tắc Disallow áp dụng cho mọi biến thể URL của đường dẫn nhạy cảm.

    1. Thêm generate-seo.mjs ở thư mục gốc dự án

    generate-seo.mjs
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    import fs from "fs";import path from "path";import { fileURLToPath } from "url";import { generateSitemap, getMultilingualUrls } from "intlayer";const __dirname = path.dirname(fileURLToPath(import.meta.url));const SITE_URL = (process.env.SITE_URL || "http://localhost:5173").replace(  /\/$/,  "");const pathList = [  { path: "/", changefreq: "daily", priority: 1.0 },  { path: "/about", changefreq: "monthly", priority: 0.7 },];const sitemapXml = generateSitemap(pathList, { siteUrl: SITE_URL });fs.writeFileSync(path.join(__dirname, "public", "sitemap.xml"), sitemapXml);const getAllMultilingualUrls = (urls) =>  urls.flatMap((url) => Object.values(getMultilingualUrls(url)));const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);const robotsTxt = [  "User-agent: *",  "Allow: /",  ...disallowedPaths.map((path) => `Disallow: ${path}`),  "",  `Sitemap: ${SITE_URL}/sitemap.xml`,].join("\n");fs.writeFileSync(path.join(__dirname, "public", "robots.txt"), robotsTxt);console.log("SEO files generated successfully.");

    Cần cài intlayer để script import. Môi trường production đặt SITE_URL (ví dụ trong CI).

    Nên dùng generate-seo.mjs cho ESM của Node. Nếu dùng generate-seo.js, đặt "type": "module" trong package.json hoặc bật ESM tương đương.

    2. Chạy script trước Vite

    package.json
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    {  "scripts": {    "dev": "vite",    "prebuild": "node generate-seo.mjs",    "build": "vite build",    "preview": "vite preview"  }}

    Chỉnh lệnh nếu dùng pnpm hoặc yarn. Có thể gọi từ CI hoặc bước pipeline khác.

    Cấu hình TypeScript

    Đảm bảo cấu hình TypeScript của bạn bao gồm các kiểu dữ liệu được tạo tự động.

    tsconfig.json
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    {  "compilerOptions": {    // ...  },  "include": ["src", ".intlayer/**/*.ts"],}

    Cấu hình Git

    Khuyên dùng việc bỏ qua các tệp được tạo bởi Intlayer. Điều này cho phép bạn tránh việc commit chúng vào kho lưu trữ Git của mình.

    Để làm điều này, bạn có thể thêm các chỉ dẫn sau vào tệp .gitignore của mình:

    bash
    Sao chép mã

    Sao chép đoạn mã vào khay nhớ tạm (clipboard)

    # Bỏ qua các tệp được tạo bởi Intlayer.intlayer

    Extension VS Code

    Để cải thiện trải nghiệm phát triển của bạn với Intlayer, bạn có thể cài đặt Extension Intlayer VS Code chính thức.

    Cài đặt từ VS Code Marketplace

    Extension này cung cấp:

    • Tự động hoàn thành cho các khóa bản dịch.
    • Phát hiện lỗi theo thời gian thực cho các bản dịch bị thiếu.
    • Xem trước nội dung đã dịch trực tiếp.
    • Quick actions để dễ dàng tạo và cập nhật các bản dịch.

    Để biết thêm chi tiết về cách sử dụng extension, hãy tham khảo tài liệu Extension Intlayer VS Code.


    Đi xa hơn

    Để tìm hiểu sâu hơn, bạn có thể triển khai trình soạn thảo trực quan hoặc bên ngoài hóa nội dung của bạn bằng CMS.

    Vite và Preact
    Vite và Lit
    Alt+→

    Trong trang này

      Các cuộc thảo luận là ẩn danh và được xem xét thường xuyên để giải quyết các vấn đề phổ biến. Hãy thoải mái chia sẻ ý tưởng tính năng, phản hồi về tài liệu hoặc bất cứ điều gì liên quan đến Intlayer, chúng tôi sử dụng thông tin này để định hình lộ trình và cải thiện sản phẩm.

      npm install intlayer vanilla-intlayernpm install vite-intlayer --save-devnpx intlayer init
      import { installIntlayer } from "vanilla-intlayer";// Phải được gọi trước khi render bất kỳ nội dung i18n nào.installIntlayer();// Import và chạy các module ứng dụng của bạn.import "./app.js";
      import { installIntlayer, installIntlayerMarkdown } from "vanilla-intlayer";installIntlayer();installIntlayerMarkdown();import "./app.js";
      import { installIntlayer, useIntlayer } from "vanilla-intlayer";installIntlayer();// Lấy nội dung ban đầu cho ngôn ngữ hiện tại.// Chuỗi hàm .onChange() để được thông báo mỗi khi ngôn ngữ thay đổi.const content = useIntlayer("app").onChange((newContent) => {  // Chỉ re-render hoặc cập nhật các node DOM bị ảnh hưởng  document.querySelector<HTMLHeadingElement>("h1")!.textContent = String(    newContent.title  );  document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent =    String(newContent.readTheDocs);});// Render lần đầudocument.querySelector<HTMLHeadingElement>("h1")!.textContent = String(  content.title);document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent =  String(content.readTheDocs);
      img.alt = content.viteLogoLabel.value;
      import { getLocaleName } from "intlayer";import { useLocale } from "vanilla-intlayer";export function setupLocaleSwitcher(container: HTMLElement): () => void {  const { locale, availableLocales, setLocale, subscribe } = useLocale();  const select = document.createElement("select");  select.setAttribute("aria-label", "Language");  const render = (currentLocale: string) => {    select.innerHTML = availableLocales      .map(        (loc) =>          `<option value="${loc}"${loc === currentLocale ? " selected" : ""}>            ${getLocaleName(loc)}          </option>`      )      .join("");  };  render(locale);  container.appendChild(select);  select.addEventListener("change", () => setLocale(select.value as any));  // Giữ dropdown đồng bộ khi ngôn ngữ thay đổi từ nơi khác  return subscribe((newLocale) => render(newLocale));}
      import {  compileMarkdown,  installIntlayerMarkdown,  useIntlayer,} from "vanilla-intlayer";installIntlayerMarkdown();const content = useIntlayer("app").onChange((newContent) => {  const el = document.querySelector<HTMLDivElement>(".edit-note")!;  el.innerHTML = compileMarkdown(String(newContent.editNote));});document.querySelector<HTMLDivElement>(".edit-note")!.innerHTML =  compileMarkdown(String(content.editNote));
      import { installIntlayerMarkdownDynamic } from "vanilla-intlayer";await installIntlayerMarkdownDynamic(async () => {  const DOMPurify = await import("dompurify");  return (markdown) => DOMPurify.sanitize(compileMarkdown(markdown));});
      import { installIntlayer, useRewriteURL } from "vanilla-intlayer";installIntlayer();// Viết lại URL ngay lập tức và mỗi khi ngôn ngữ thay đổi sau đó.// Trả về một hàm hủy đăng ký để dọn dẹp.const stopRewriteURL = useRewriteURL();
      import { getHTMLTextDir } from "intlayer";import { installIntlayer, useLocale } from "vanilla-intlayer";installIntlayer();useLocale({  onLocaleChange: (locale) => {    document.documentElement.lang = locale;    document.documentElement.dir = getHTMLTextDir(locale);  },});
      import { installIntlayer, useDictionaryDynamic } from "vanilla-intlayer";installIntlayer();const unsubscribe = useDictionaryDynamic(  {    en: () => import("../.intlayer/dictionaries/en/app.mjs"),    fr: () => import("../.intlayer/dictionaries/fr/app.mjs"),    es: () => import("../.intlayer/dictionaries/es/app.mjs"),  },  "app").onChange((content) => {  document.querySelector("h1")!.textContent = String(content.title);});
      import { type IntlayerConfig } from "intlayer";const config: IntlayerConfig = {  // ... Cấu hình còn lại của bạn  compiler: {    /**     * Chỉ định xem trình biên dịch có nên được bật hay không.     */    enabled: true,    /**     * Định nghĩa đường dẫn các tệp đầu ra     */    output: ({ fileName, extension }) => `./${fileName}${extension}`,    /**     * Chỉ định xem các thành phần có nên được lưu lại sau khi được chuyển đổi hay không.     * Bằng cách đó, trình biên dịch có thể chỉ chạy một lần để chuyển đổi ứng dụng, và sau đó nó có thể được gỡ bỏ.     */    saveComponents: false,    /**     * Tiền tố phím từ điển     */    dictionaryKeyPrefix: "",  },};export default config;
      npx intlayer extract
      import { defineConfig } from "vite";import { intlayer, intlayerCompiler } from "vite-intlayer";export default defineConfig({ plugins: [   intlayer(),   intlayerCompiler(), // Thêm plugin trình biên dịch ],});
      npm run build # Hoặc npm run dev
      import fs from "fs";import path from "path";import { fileURLToPath } from "url";import { generateSitemap, getMultilingualUrls } from "intlayer";const __dirname = path.dirname(fileURLToPath(import.meta.url));const SITE_URL = (process.env.SITE_URL || "http://localhost:5173").replace(  /\/$/,  "");const pathList = [  { path: "/", changefreq: "daily", priority: 1.0 },  { path: "/about", changefreq: "monthly", priority: 0.7 },];const sitemapXml = generateSitemap(pathList, { siteUrl: SITE_URL });fs.writeFileSync(path.join(__dirname, "public", "sitemap.xml"), sitemapXml);const getAllMultilingualUrls = (urls) =>  urls.flatMap((url) => Object.values(getMultilingualUrls(url)));const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);const robotsTxt = [  "User-agent: *",  "Allow: /",  ...disallowedPaths.map((path) => `Disallow: ${path}`),  "",  `Sitemap: ${SITE_URL}/sitemap.xml`,].join("\n");fs.writeFileSync(path.join(__dirname, "public", "robots.txt"), robotsTxt);console.log("SEO files generated successfully.");
      {  "scripts": {    "dev": "vite",    "prebuild": "node generate-seo.mjs",    "build": "vite build",    "preview": "vite preview"  }}
      {  "compilerOptions": {    // ...  },  "include": ["src", ".intlayer/**/*.ts"],}
      # Bỏ qua các tệp được tạo bởi Intlayer.intlayer