Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту
Історія версій
- "Оновлення використання API useIntlayer у Solid для прямого доступу до властивостей"v8.9.004.05.2026
- "Початкова історія"v8.4.1023.03.2026
Вміст цієї сторінки перекладено за допомогою штучного інтелекту.
Переглянути останню версію оригінального вмісту англійськоюIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Перекладіть свій веб-сайт Vite та Vanilla JS за допомогою Intlayer | Інтернаціоналізація (i18n)
Зміст
Чому варто обрати Intlayer, а не альтернативи?
Порівняно з основними рішеннями, такими як i18next або i18n.js, Intlayer — це рішення, яке поставляється з інтегрованою оптимізацією, як-от:
Intlayer оптимізовано для ідеальної роботи з Vite, пропонуючи незалежне від фреймворку керування вмістом, підтримку TypeScript і всі функції, необхідні для масштабування інтернаціоналізації (i18n).
Замість того, щоб завантажувати великі файли JSON на свої сторінки, завантажуйте лише необхідний вміст. Intlayer допомагає зменшити розмір бандлу і сторінок до 50%.
Організація вмісту за окремими областями (scoping) полегшує технічне обслуговування великомасштабних програм. Ви можете скопіювати або видалити окрему папку функцій без розумового навантаження перегляду всієї кодової бази вмісту. Крім того, Intlayer повністю типізований (fully typed), щоб забезпечити точність вашого вмісту.
Спільне розміщення вмісту зменшує контекст, необхідний для великих мовних моделей (LLM). Intlayer також постачається з набором інструментів, наприклад CLI для перевірки відсутніх перекладів,LSP, MCP і навички агента, щоб зробити роботу розробника (DX) ще зручнішою для агентів ШІ.
Використовуйте автоматизацію для перекладу в конвеєрі CI/CD за допомогою LLM за вашим вибором за рахунок вашого постачальника штучного інтелекту. Intlayer також пропонує компілятор для автоматизації екстракція вмісту, а також веб-платформу, щоб допомогти перекладати у фоновому режимі.
Підключення великих файлів JSON до компонентів може призвести до проблем з продуктивністю та реакцією. Intlayer оптимізує завантаження вмісту під час збірки (build time).
Більше ніж просто рішення i18n, Intlayer пропонує власний візуальний редактор і повний CMS, щоб допомогти вам керувати своїм багатомовним вмістом у реальному часі, спрощуючи співпрацю з перекладачами, копірайтерами та іншими членами команди. Контент можна зберігати локально та/або віддалено.
Покроковий посібник із налаштування Intlayer у додатку Vite та Vanilla JS
Встановлення залежностей
Встановіть необхідні пакети за допомогою npm:
bashКопіювати кодСкопіюйте код у буфер обміну
npm install intlayer vanilla-intlayernpm install vite-intlayer --save-devnpx intlayer initintlayer Основний пакет, який надає інструменти інтернаціоналізації для керування конфігурацією, перекладу, декларування вмісту, транспіляції та команд CLI.
vanilla-intlayer Пакет, який інтегрує Intlayer із чистими додатками JavaScript / TypeScript. Він надає pub/sub синглтон (
IntlayerClient) та помічники на основі колбеків (useIntlayer,useLocaleтощо), щоб будь-яка частина вашого додатка могла реагувати на зміни локалі незалежно від фреймворку інтерфейсу.vite-intlayer Включає плагін Vite для інтеграції Intlayer із Vite bundler, а також проміжне програмне забезпечення (middleware) для визначення мови користувача, керування файлами cookie та обробки перенаправлень URL-адрес.
Конфігурація вашого проекту
Створіть конфігураційний файл для налаштування мов вашого додатка:
intlayer.config.tsКопіювати кодСкопіюйте код у буфер обміну
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Ваші інші локалі ], defaultLocale: Locales.ENGLISH, }, }; export default config;Через цей конфігураційний файл ви можете налаштувати локалізовані URL-адреси, перенаправлення проміжного ПЗ, назви файлів cookie, розташування та розширення ваших декларацій вмісту, вимкнути журнали Intlayer у консолі та багато іншого. Повний список доступних параметрів див. у документації з конфігурації.
Інтегруйте Intlayer у вашу конфігурацію Vite
Додайте плагін intlayer до вашої конфігурації.
vite.config.tsКопіювати кодСкопіюйте код у буфер обміну
import { defineConfig } from "vite"; import { intlayer } from "vite-intlayer"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [intlayer()], });Плагін Vite
intlayer()використовується для інтеграції Intlayer із Vite. Він забезпечує побудову файлів декларації вмісту та відстежує їх у режимі розробки. Він визначає змінні середовища Intlayer у додатку Vite. Крім того, він надає псевдоніми (aliases) для оптимізації продуктивності.Запустіть Intlayer у вашій точці входу
Викличте
installIntlayer()перед візуалізацією будь-якого вмісту, щоб глобальний синглтон локалі був готовий.src/main.tsКопіювати кодСкопіюйте код у буфер обміну
import { installIntlayer } from "vanilla-intlayer";// Має бути викликано перед візуалізацією будь-якого вмісту i18n.installIntlayer();// Імпортуйте та запустіть модулі програми.import "./app.js";Якщо ви також використовуєте декларації вмісту
md()(Markdown), встановіть також рендерер markdown:src/main.tsКопіювати кодСкопіюйте код у буфер обміну
import { installIntlayer, installIntlayerMarkdown } from "vanilla-intlayer";installIntlayer();installIntlayerMarkdown();import "./app.js";Декларуйте ваш контент
Створюйте та керуйте деклараціями вмісту для зберігання перекладів:
src/app.content.tsКопіювати кодСкопіюйте код у буфер обміну
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: "Натисніть на логотип Vite, щоб дізнатися більше", }), }, } satisfies Dictionary; export default appContent;Ваші декларації вмісту можна визначити будь-де у вашому додатку, якщо вони включені до каталогу
contentDir(за замовчуванням./src) і відповідають розширенню файлу декларації вмісту (за замовчуванням.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).Докладніше див. у документації з декларації вмісту.
Використовуйте Intlayer у вашому JavaScript
vanilla-intlayerвідображає API поверхніreact-intlayer:useIntlayer(key, locale?)повертає перекладений вміст безпосередньо. Приєднайте.onChange()до результату, щоб підписатися на зміни локалі - явний еквівалент перерендерингу в React.src/main.tsКопіювати кодСкопіюйте код у буфер обміну
import { installIntlayer, useIntlayer } from "vanilla-intlayer";installIntlayer();// Отримайте початковий контент для поточної локалі.// Приєднайте .onChange(), щоб отримувати сповіщення при кожній зміні локалі.const content = useIntlayer("app").onChange((newContent) => { // Перерендерить або оновіть лише зачеплені вузли DOM document.querySelector<HTMLHeadingElement>("h1")!.textContent = String( newContent.title ); document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent = String(newContent.readTheDocs);});// Початковий рендерингdocument.querySelector<HTMLHeadingElement>("h1")!.textContent = String( content.title);document.querySelector<HTMLParagraphElement>(".read-the-docs")!.textContent = String(content.readTheDocs);Отримуйте доступ до кінцевих значень як до рядків, загорнувши їх у
String(), що викликає методtoString()вузла та повертає перекладений текст.Якщо вам потрібне значення для нативного атрибута HTML (наприклад,
alt,aria-label), використовуйте безпосередньо.value:typescriptКопіювати кодСкопіюйте код у буфер обміну
img.alt = content.viteLogoLabel.value;Змініть мову вашого вмісту
Необов'язковоЩоб змінити мову вмісту, використовуйте функцію
setLocale, надануuseLocale.src/locale-switcher.tsКопіювати кодСкопіюйте код у буфер обміну
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)); // Тримайте випадаючий список синхронізованим, коли локаль змінюється деінде return subscribe((newLocale) => render(newLocale));}Рендеринг вмісту Markdown та HTML
Необов'язковоIntlayer підтримує декларації вмісту
md()таhtml(). У чистому JS скомпільований вихідний код вставляється як необроблений HTML черезinnerHTML.Скомпілюйте та вставте HTML:
src/main.tsКопіювати кодСкопіюйте код у буфер обміну
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)викликаєtoString()наIntlayerNode, що повертає необроблений рядок Markdown. Передайте його вcompileMarkdown, щоб отримати рядок HTML, а потім встановіть черезinnerHTML.WARNING Використовуйте
innerHTMLлише з довіреним вмістом. Якщо markdown надходить від користувача, спочатку очистіть його (наприклад, за допомогою DOMPurify). Ви можете встановити рендерер очищення динамічно:typescriptКопіювати кодСкопіюйте код у буфер обміну
import { installIntlayerMarkdownDynamic } from "vanilla-intlayer";await installIntlayerMarkdownDynamic(async () => { const DOMPurify = await import("dompurify"); return (markdown) => DOMPurify.sanitize(compileMarkdown(markdown));});Додайте локалізовану маршрутизацію (Localized Routing) до свого додатка
Необов'язковоЩоб створити унікальні маршрути для кожної мови (корисно для SEO), ви можете використовувати
intlayerProxyу вашій конфігурації Vite для визначення локалі на стороні сервера.Спочатку додайте
intlayerProxyдо вашої конфігурації Vite:Зверніть увагу, що для використання
intlayerProxyу продуктовому середовищі вам потрібно переміститиvite-intlayerізdevDependenciesдоdependencies.vite.config.tsКопіювати кодСкопіюйте код у буфер обміну
import { defineConfig } from "vite"; import { intlayer, intlayerProxy } from "vite-intlayer"; export default defineConfig({ plugins: [ intlayerProxy(), // має бути розміщено першим intlayer(), ], });Зміна URL при зміні локалі
Необов'язковоЩоб оновити URL браузера при зміні локалі, викличте
useRewriteURL()після встановлення Intlayer:src/main.tsКопіювати кодСкопіюйте код у буфер обміну
import { installIntlayer, useRewriteURL } from "vanilla-intlayer";installIntlayer();// Переписує URL негайно та при кожній наступній зміні локалі.// Повертає функцію скасування підписки для очищення.const stopRewriteURL = useRewriteURL();Перемикання атрибутів мови та напрямку HTML
Необов'язковоОновлюйте атрибути
langтаdirтегу<html>відповідно до поточної локалі для підтримки доступності та SEO.src/main.tsКопіювати кодСкопіюйте код у буфер обміну
import { getHTMLTextDir } from "intlayer";import { installIntlayer, useLocale } from "vanilla-intlayer";installIntlayer();useLocale({ onLocaleChange: (locale) => { document.documentElement.lang = locale; document.documentElement.dir = getHTMLTextDir(locale); },});Ліниве завантаження словників за локалями
Необов'язковоДля великих додатків ви можете розділити словник кожної локалі на власний фрагмент (chunk). Використовуйте
useDictionaryDynamicразом із динамічнимimport()від Vite:src/app.tsКопіювати кодСкопіюйте код у буфер обміну
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);});Пакет кожної локалі завантажується лише тоді, коли ця локаль стає активною, а результат кешується - наступні перемикання на ту саму локаль відбуваються миттєво.
Отримайте вміст ваших компонентів
Необов'язковоЯкщо у вас є існуюча кодова база, перетворення тисяч файлів може зайняти багато часу.
Щоб полегшити цей процес, Intlayer пропонує компілятор / екстрактор для перетворення ваших компонентів та екстракція вмісту.
Для налаштування ви можете додати розділ
compilerу ваш файлintlayer.config.ts:intlayer.config.tsКопіювати кодСкопіюйте код у буфер обміну
import { type IntlayerConfig } from "intlayer";const config: IntlayerConfig = { // ... Решта вашої конфігурації compiler: { /** * Вказує, чи має бути включений компілятор. */ enabled: true, /** * Визначає шлях вихідних файлів */ output: ({ fileName, extension }) => `./${fileName}${extension}`, /** * Вказує, чи потрібно зберігати компоненти після перетворення. * Таким чином компілятор можна запустити лише один раз для перетворення програми, а потім видалити. */ saveComponents: false, /** * Префікс ключа словника */ dictionaryKeyPrefix: "", },};export default config;Запустіть екстрактор, щоб перетворити ваші компоненти та витягти вміст
bashКопіювати кодСкопіюйте код у буфер обміну
npx intlayer extract
(Опційно) Sitemap і robots.txt (генерація під час збірки)
Intlayer надає generateSitemap і getMultilingualUrls - утиліти для формування багатомовних sitemap.xml і robots.txt для краулерів та автоматичного запису в public/. Зазвичай запускають невеликий Node-скрипт перед Vite (наприклад, npm-хуки predev / prebuild).
Sitemap
Генератор sitemap враховує локалі й додає метадані для краулерів.
Підтримується простір іменxhtml:link(hreflang). Замість плоского списку URL Intlayer пов’язує всі мовні версії сторінки в обидва боки (наприклад/about,/fr/aboutабо/about?lang=frзалежно від режиму маршрутизації).
Robots.txt
Використовуйте getMultilingualUrls, щоб правила Disallow покривали всі локалізовані варіанти шляхів.
1. Файл generate-seo.mjs у корені проєкту
Скопіюйте код у буфер обміну
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.");Пакет intlayer має бути встановлений. У продакшені задайте SITE_URL у середовищі (наприклад у CI).
Для Node ESM кращеgenerate-seo.mjs. Дляgenerate-seo.jsдодайте"type": "module"уpackage.jsonабо ввімкніть ESM інакше.
2. Запуск скрипта перед Vite
Скопіюйте код у буфер обміну
{ "scripts": { "dev": "vite", "prebuild": "node generate-seo.mjs", "build": "vite build", "preview": "vite preview" }}Підлаштуйте команди для pnpm або yarn. Можна викликати скрипт із CI.
Налаштування TypeScript
Переконайтеся, що ваша конфігурація TypeScript включає автоматично згенеровані типи.
Скопіюйте код у буфер обміну
{ "compilerOptions": { // ... }, "include": ["src", ".intlayer/**/*.ts"],}Конфігурація Git
Ми рекомендуємо ігнорувати файли, згенеровані Intlayer. Це дозволить вам уникнути їх фіксації (commit) у вашому репозиторії Git.
Для цього ви можете додати наступні інструкції у ваш файл .gitignore:
Скопіюйте код у буфер обміну
# Ігнорувати файли, згенеровані Intlayer.intlayerРозширення VS Code
Щоб покращити свій досвід розробки з Intlayer, ви можете встановити офіційне розширення Intlayer VS Code.
Встановити з VS Code Marketplace
Це розширення забезпечує:
- Автодоповнення для ключів перекладу.
- Виявлення помилок у реальному часі для відсутніх перекладів.
- Вбудований попередній перегляд перекладеного вмісту.
- Швидкі дії для легкого створення та оновлення перекладів.
Докладніше про використання розширення див. у документації розширення Intlayer VS Code.
Йдіть далі
Щоб піти далі, ви можете впровадити візуальний редактор або винести свій контент за допомогою CMS.