Автор:
    Дата створення:2024-03-07Останнє оновлення:2026-09-27

    Перекладіть свій сайт Astro за допомогою Intlayer

    ide.intlayer.org
    intlayer-astro-template.vercel.app

    Зміст

    Чому варто обрати Intlayer, а не альтернативи?

    Порівняно з основними рішеннями, такими як astro-i18n або i18next, Intlayer це рішення, яке має такі інтегровані оптимізації, як:

    Intlayer оптимізовано для ідеальної роботи з Astro, пропонуючи багатомовну маршрутизацію, карту сайту та всі функції, необхідні для масштабування інтернаціоналізації (i18n).

    Замість того, щоб завантажувати великі файли JSON на свої сторінки, завантажуйте лише необхідний вміст. Intlayer допомагає зменшити розмір бандлу і сторінок до 50%.

    Організація вмісту за окремими областями (scoping) полегшує технічне обслуговування великомасштабних програм. Ви можете скопіювати або видалити окрему папку функцій без розумового навантаження перегляду всієї кодової бази вмісту. Крім того, Intlayer повністю типізований (fully typed), щоб забезпечити точність вашого вмісту.

    Спільне розміщення вмісту зменшує контекст, необхідний для великих мовних моделей (LLM). Intlayer також постачається з набором інструментів, наприклад CLI для перевірки відсутніх перекладів,LSP, MCP і agent skills, щоб зробити роботу розробника (DX) ще зручнішою для агентів ШІ.

    Використовуйте автоматизацію для перекладу в конвеєрі CI/CD за допомогою LLM за вашим вибором за рахунок вашого постачальника штучного інтелекту. Intlayer також пропонує компілятор для автоматизації екстракція вмісту, а також веб-платформу, щоб допомогти перекладати у фоновому режимі.

    Підключення великих файлів JSON до компонентів може призвести до проблем з продуктивністю та реакцією. Intlayer оптимізує завантаження вмісту під час збірки (build time).

    Більше ніж просто рішення i18n, Intlayer пропонує власний візуальний редактор і повний CMS, щоб допомогти вам керувати своїм багатомовним вмістом у реальному часі, спрощуючи співпрацю з перекладачами, копірайтерами та іншими членами команди. Контент можна зберігати локально та/або віддалено.

    Покрокова інструкція з налаштування Intlayer в Astro

    Перегляньте шаблон додатка на GitHub.

    1. Встановіть залежності

      Встановіть необхідні пакети за допомогою бажаного менеджера пакетів:

      bash
      npx intlayer init --interactive
      
      прапорець --interactive є необов'язковим. Використовуйте intlayer-cli init, якщо ви AI-агент.
      Ця команда визначить ваше середовище та встановить необхідні пакети. Наприклад:
      bash
      npm install intlayer astro-intlayer
      
      • intlayer Основний пакет, що надає інструменти i18n для керування конфігурацією, перекладами, декларацією вмісту, транспіляцією та командами CLI.

      • astro-intlayer Включає плагін інтеграції Astro для інтеграції Intlayer із бандлером Vite, middleware, що розпізнає локаль кожного запиту в Astro.locals.intlayer, та хуки useIntlayer / useDictionary / useLocale. Той самий шлях імпорту розпізнається як серверна реалізація у фронтматтері .astro та як клієнтська (на базі vanilla-intlayer) у блоках <script>.

    2. Налаштуйте свій проект

      Архітектура

      У цій архітектурі інтеграція intlayer(), зареєстрована в astro.config.ts, збирає ваші словники та додає middleware, який визначає локаль кожного запиту та надає її в Astro.locals.intlayer. Сторінки розміщуються під rest-сегментом src/pages/[...locale]/, завдяки чому локаль за замовчуванням обслуговується без префікса, а кожна інша локаль отримує власну виділену URL-адресу. Файли .astro читають вміст за допомогою хуків useIntlayer / useLocale з astro-intlayer, а оголошення вмісту розміщуються поруч із вашими компонентами в src/.

      bash
      .
      ├── src
      │   ├── app.content.tsx               # App content declaration
      │   ├── components
      │   │   └── LocaleSwitcher.astro      # Locale switcher component
      │   └── pages
      │       ├── [...locale]
      │       │   └── index.astro           # Localized page (rest param also serves the default locale)
      │       ├── robots.txt.ts             # robots.txt endpoint
      │       └── sitemap.xml.ts            # Localized sitemap endpoint
      ├── astro.config.ts                   # Astro config with the intlayer() integration
      ├── intlayer.config.ts
      ├── package.json
      └── tsconfig.json
      

      Конфігурація

      Створіть конфігураційний файл, щоб визначити мови вашого додатка:

      intlayer.config.ts
      import { Locales, type IntlayerConfig } from "intlayer";
      
      const config: IntlayerConfig = {
        internationalization: {
          locales: [
            Locales.ENGLISH,
            Locales.FRENCH,
            Locales.SPANISH,
            Locales.UKRAINIAN,
            // Ваші інші локалі
          ],
          defaultLocale: Locales.ENGLISH,
        },
      };
      
      export default config;
      
      Через цей конфігураційний файл ви можете налаштувати локалізовані URL-адреси, перенаправлення middleware, імена cookie, розташування та розширення декларацій вмісту, вимкнути логи Intlayer у консолі та багато іншого. Повний список доступних параметрів дивіться в документації з конфігурації.
    3. Інтегруйте Intlayer у вашу конфігурацію Astro

      Додайте плагін intlayer до вашої конфігурації Astro.

      astro.config.ts
      // @ts-check
      
      import { intlayer } from "astro-intlayer";
      import { defineConfig } from "astro/config";
      
      // https://astro.build/config
      export default defineConfig({
        integrations: [intlayer()],
      });
      
      Плагін інтеграції intlayer() використовується для інтеграції Intlayer з Astro. Він забезпечує генерацію файлів декларації вмісту та стежить за ними в режимі розробки. Він визначає змінні середовища Intlayer всередині додатка Astro та надає аліаси для оптимізації продуктивності.
    4. Декларуйте свій вміст

      Створюйте та керуйте своїми деклараціями вмісту для зберігання перекладів:

      src/app.content.tsx
      import { t, type Dictionary } from "intlayer";
      import type { ReactNode } from "react";
      
      const appContent = {
        key: "app",
        content: {
          title: t({
            en: "Hello World",
            fr: "Bonjour le monde",
            es: "Hola mundo",
            uk: "Привіт Світе",
          }),
        },
      } satisfies Dictionary;
      
      export default appContent;
      
      Декларації вмісту можна визначати в будь-якому місці вашого додатка, за умови, що вони включені в contentDir (за замовчуванням ./src) і відповідають розширенню файлів декларації вмісту (за замовчуванням .content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).
      Для отримання додаткової інформації дивіться документацію з декларації вмісту.
    5. Використання вмісту в Astro

      Використовуйте ваші словники у файлах .astro за допомогою хуків, що експортуються astro-intlayer. Вони мають такі ж сигнатури, як і react-intlayer: useIntlayer("key") повертає вміст словника, а useLocale() поточну локаль, без необхідності передавати аргументи.

      Локаль надходить із middleware astro-intlayer, яке інтеграція реєструє перед вашим власним src/middleware.ts. Воно визначає її для кожного запиту, на основі префікса URL, потім збереженої клієнтом локалі (cookie або заголовок), потім Accept-Language, і зберігає в Astro.locals.intlayer. Попередньо відрендерені сторінки використовують лише URL, оскільки вони рендеряться один раз для кожного відвідувача.

      Вам також слід додати SEO-метадані, такі як hreflang і канонічні посилання, на кожну сторінку та включити перемикач мов, щоб користувачі могли змінювати мову.

      src/pages/index.astro
      ---
      import { useIntlayer, useLocale } from "astro-intlayer";
      import {
        getLocalizedUrl,
        defaultLocale,
        localeMap,
        getHTMLTextDir,
      } from "intlayer";
      import LocaleSwitcher from "../components/LocaleSwitcher.astro";
      
      // Локаль, визначена middleware (напр. /uk/about -> 'uk')
      const { locale } = useLocale();
      
      // Вміст словника 'app' для цієї локалі
      const { title } = useIntlayer("app");
      ---
      
      <!doctype html>
      <html lang={locale} dir={getHTMLTextDir(locale)}>
        <head>
          <meta charset="utf-8" />
          <meta name="viewport" content="width=device-width" />
          <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
          <title>{title}</title>
      
          <!-- Canonical link: Tells search engines which is the primary version of this page -->
          <link
            rel="canonical"
            href={new URL(getLocalizedUrl(Astro.url.pathname, locale), Astro.site)}
          />
      
          <!-- Hreflang: Tell Google about all localized versions -->
          {
            localeMap(({ locale: mapLocale }) => (
              <link
                rel="alternate"
                hreflang={mapLocale}
                href={new URL(
                  getLocalizedUrl(Astro.url.pathname, mapLocale),
                  Astro.site
                )}
              />
            ))
          }
      
          <!-- x-default: Fallback for users in unmatched languages -->
          <link
            rel="alternate"
            hreflang="x-default"
            href={new URL(
              getLocalizedUrl(Astro.url.pathname, defaultLocale),
              Astro.site
            )}
          />
        </head>
        <body>
          <header>
            <LocaleSwitcher />
          </header>
          <main>
            <h1>{title}</h1>
          </main>
        </body>
      </html>
      
      Astro.locals.intlayer також надає доступ до locale, defaultLocale та availableLocales у ваших власних middleware та ендпоінтах. Передайте локаль або селектор другим аргументом (useIntlayer("app", "fr"), useIntlayer("faq", { item: 2 })), щоб перевизначити локаль запиту для одного виклику.
    6. Локалізована маршрутизація

      Створіть динамічні сегменти маршрутів (наприклад, src/pages/[locale]/index.astro) для обслуговування локалізованих сторінок:

      src/pages/[locale]/index.astro
      ---
      import { getIntlayer } from "intlayer";
      
      const { title } = getIntlayer('app');
      ---
      
      <h1>{title}</h1>
      

      Інтеграція Astro додає middleware Vite, який допомагає з маршрутизацією з урахуванням мови та визначеннями середовища під час розробки. Ви також можете використовувати власну логіку або інструменти intlayer, такі як getLocalizedUrl, для посилань між мовами.

    7. Додавання перемикача мов

      Щоб користувачі могли перемикатися між мовами, ви можете створити компонент LocaleSwitcher. Цей компонент має відображати список усіх підтримуваних мов та посилатися на ту саму сторінку кожною мовою.

      src/components/LocaleSwitcher.astro
      ---
      import { useLocale } from "astro-intlayer";
      import { getLocaleName, getLocalizedUrl, getPathWithoutLocale } from "intlayer";
      
      const { locale, availableLocales } = useLocale();
      const pathWithoutLocale = getPathWithoutLocale(Astro.url.pathname);
      ---
      
      <nav aria-label="Languages">
        <ul>
          {
            availableLocales.map((localeItem) => (
              <li key={localeItem} class="p-1">
                <a
                  href={getLocalizedUrl(pathWithoutLocale, localeItem)}
                  data-locale={localeItem}
                  aria-current={localeItem === locale ? "page" : undefined}
                >
                  {getLocaleName(localeItem)}
                </a>
              </li>
            ))
          }
        </ul>
      </nav>
      
      <script>
        // У браузері той самий імпорт розпізнається як клієнтська реалізація
        import { useLocale } from "astro-intlayer";
        import { getLocalizedUrl, type LocalesValues } from "intlayer";
      
        // Зберігає вибір у cookie локалі, після чого переходить на локалізований URL
        const { setLocale } = useLocale({
          onLocaleChange: (newLocale) => {
            window.location.href = getLocalizedUrl(window.location.pathname, newLocale);
          },
        });
      
        const localeLinks = document.querySelectorAll("[data-locale]");
      
        localeLinks.forEach((link) => {
          link.addEventListener("click", (event) => {
            const locale = link.getAttribute("data-locale") as LocalesValues;
      
            event.preventDefault();
            setLocale(locale);
          });
        });
      </script>
      
      <style>
        nav {
          display: flex;
          gap: 1rem;
        }
        ul {
          display: flex;
          list-style: none;
          padding: 0;
          margin: 0;
          gap: 0.5rem;
        }
        a[aria-current="page"] {
          font-weight: bold;
          text-decoration: underline;
        }
      </style>
      

      Примітка щодо збереження стану: setLocale із клієнтського useLocale зберігає мовні вподобання користувача в cookie. Це дозволяє Intlayer запам'ятовувати вибір і автоматично перенаправляти користувача на бажану мову під час наступних візитів: сторінки, що рендерилися на вимогу (адаптер з output: 'server' або prerender = false), перенаправляються middleware Intlayer до надсилання будь-якого HTML, тоді як попередньо згенеровані сторінки, що надаються як статичні файли, перенаправляються невеликим скриптом, який інтеграція вставляє в кожну сторінку. Встановіть routing.enableProxy в false, щоб вимкнути обидва механізми. В astro dev cookie ігнорується як джерело перенаправлення, якщо тільки routing.enableProxy не встановлено в true, тому застарілий cookie не зможе перехопити сторінки, над якими ви працюєте.

      Взаємосумісність сервера та клієнта: astro-intlayer розпізнається як серверні хуки у фронтматтері (зчитуючи Astro.locals) та як клієнтські хуки vanilla-intlayer у блоках <script> та островах (islands), з тими самими іменами та структурою даних. setLocale та onChange діють лише на клієнті, викличте installIntlayer() один раз для ініціалізації клієнтського сховища. astro-intlayer/client експортує клієнтську точку входу явно.

    8. Sitemap та Robots.txt

      Intlayer пропонує інструменти для динамічного створення локалізованої карти сайту та файлу robots.txt.

      Sitemap

      Intlayer comes with a built-in sitemap generator to help you create a sitemap for your application easily. It handles localized routes and adds the necessary metadata for search engines.

      The Intlayer generated sitemap supports the xhtml:link namespace (Hreflang XML Extensions). Unlike the default sitemap generators that only list raw URLs, Intlayer automatically creates the required bidirectional links between all language versions of a page (e.g., /about, /about?lang=fr, and /about?lang=es). This ensures search engines correctly index and serve the right language version to the right audience.

      Створіть src/pages/sitemap.xml.ts для генерації карти сайту, що охоплює всі ваші локалізовані маршрути.

      src/pages/sitemap.xml.ts
      import type { APIRoute } from "astro";
      import { generateSitemap, type SitemapUrlEntry } from "intlayer";
      
      const pathList: SitemapUrlEntry[] = [
        { path: "/", changefreq: "daily", priority: 1.0 },
        { path: "/about", changefreq: "monthly", priority: 0.7 },
      ];
      
      export const GET: APIRoute = async ({ site }) => {
        const xmlOutput = generateSitemap(pathList, {
          siteUrl: "https://example.com",
        });
      
        return new Response(xmlOutput, {
          headers: { "Content-Type": "application/xml" },
        });
      };
      

      Robots.txt

      Створіть src/pages/robots.txt.ts для керування скануванням пошуковими системами.

      src/pages/robots.txt.ts
      import type { APIRoute } from "astro";
      import { getMultilingualUrls } from "intlayer";
      
      const getAllMultilingualUrls = (urls: string[]) =>
        urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);
      
      const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);
      
      export const GET: APIRoute = ({ site }) => {
        const robotsTxt = [
          "User-agent: *",
          "Allow: /",
          ...disallowedPaths.map((path) => `Disallow: ${path}`),
          "",
          `Sitemap: ${new URL("/sitemap.xml", site).href}`,
        ].join("\n");
      
        return new Response(robotsTxt, {
          headers: { "Content-Type": "text/plain" },
        });
      };
      
    9. Продовжуйте використовувати ваш улюблений фреймворк

      Продовжуйте будувати свій додаток, використовуючи фреймворк за вашим вибором.

    10. Витягніть вміст ваших компонентів

      Необов'язково

      Якщо у вас є існуюча кодова база, перетворення тисяч файлів може зайняти багато часу.

      Щоб спростити цей процес, 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
      

      Зберіть застосунок, щоб перетворити ваші компоненти та витягти вміст

      bash
      npm run build # Або npm run dev
      

    Конфігурація TypeScript

    Intlayer використовує розширення модулів (module augmentation), щоб отримати переваги від TypeScript, роблячи вашу кодову базу надійнішою.

    Autocompletion

    Translation Error

    Переконайтеся, що ваша конфігурація TypeScript включає автоматично згенеровані типи.

    tsconfig.json
    {
      // ... ваша існуюча конфігурація TypeScript
      "include": [
        // ... ваша існуюча конфігурація TypeScript
        ".intlayer/**/*.ts", // Включити автоматично згенеровані типи
      ],
    }
    

    Конфігурація Git

    Ми рекомендуємо ігнорувати файли, згенеровані Intlayer. Це запобігає їх потраплянню до вашого Git-репозиторію.

    Для цього додайте наступні інструкції до вашого файлу .gitignore:

    bash
    # Ігнорувати файли, згенеровані Intlayer
    .intlayer
    

    Розширення для VS Code

    Щоб покращити ваш досвід розробки з Intlayer, ви можете встановити офіційне розширення Intlayer для VS Code.

    Це розширення забезпечує:

    • Автозаповнення ключів перекладу.
    • Виявлення помилок у реальному часі для відсутніх перекладів.
    • Попередній перегляд перекладеного вмісту.
    • Швидкі дії для легкого створення та оновлення перекладів.

    Для отримання додаткової інформації про використання розширення дивіться документацію розширення VS Code.

    Поглиблюйте свої знання

    Якщо ви хочете дізнатися більше, ви також можете впровадити Візуальний редактор або використовувати CMS, щоб винести ваш вміст назовні.

    Часто задавані запитання

    Astro надає маршрутизацію i18n для префіксів URL, але залишає керування вмістом розробнику:

    • Вбудований i18n в Astro плюс власні файли JSON/TS: без типізації, правил множини та інструментів виявлення пропущених перекладів.
    • i18next або окремі бібліотеки для островів (vue-i18n, svelte-i18n): повноцінна бібліотека на кожен тип острова зі своїми каталогами.
    • Intlayer: єдиний шар вмісту для сторінок Astro та будь-яких островів, оптимізований під час збирання, з повною типізацією, AI перекладом, візуальним редактором та CMS.

    Головна перевага полягає в тому, що той самий словник обслуговує як сторінку .astro, так і острови React, Vue, Svelte, Solid, Preact або Lit. Див. чому Intlayer.

    Значно менше, ніж рішення на основі просторів імен, оскільки сторінка ніколи не завантажує каталог, який вона не рендерить. Сторінки Astro рендеряться під час збирання, тому клієнту надсилається лише готовий HTML без додаткових словників; словники отримують лише інтерактивні острови (islands). Динамічні словники розділяють контент за локалями, зменшуючи бандл до 50%. Див. оптимізацію бандла та бенчмарк.

    Більшою мірою так. Дотримуйтесь посібника з міграції з i18next. Можна також мігрувати поступово через sync JSON плагін.

    Так. sync JSON плагін зберігає ваші файли /messages/{locale}/{namespace}.json як джерело істини та генерує словники Intlayer з них в обох напрямках. sync PO плагін робить те ж саме для gettext каталогів, а файли для окремих локалей дозволяють розділити вміст за мовами замість групування локалей в один файл.

    Ні. Запустіть npx intlayer extract, і Intlayer прочитає ваші файли, витягне призначені для користувача рядки і створить файл .content поруч із кожним компонентом, завдяки чому ви переглядаєте diff замість копіювання рядків у каталог вручну. Крок 15 цього посібника пояснює це.

    Для повної автоматизації Intlayer Compiler робить те саме під час збирання: сканує код під час кожної зміни, генерує словники та синхронізує їх із HMR.

    Варто знати два обмеження перед увімкненням компілятора. Він працює за допомогою статичного аналізу, тому рядки, які існують лише під час виконання, такі як коди помилок API або поля CMS, залишаються недосяжними. І він повинен відрізняти текст для користувача від логіки додатка, як-от className="active" або код статусу, що вимагає кількох анотацій у великій кодовій базі. Команда extract уникає обох проблем, тримаючи вас у курсі.

    П'ять інструментів, усі опціональні:

    • Розширення VS Code: перехід від ключа useIntlayer до файлу контенту, вилучення рядків із компонента та запуск build, fill, test, push і pull із палітри команд або вкладки Intlayer.
    • LSP сервер: та сама функціональність у будь-якому редакторі з підтримкою LSP, включно з переходом до визначення, переглядом перекладеного значення під час наведення та автодоповненням ключів. Також підтримує виклики i18next, react-i18next, next-intl та use-intl.
    • MCP сервер: надає документацію та CLI Intlayer для Cursor, VS Code, Claude Desktop, Claude Code та ChatGPT.
    • Навички агента (Agent skills): спеціалізовані навички intlayer-config, intlayer-cli та intlayer-content.
    • Плагін ESLint: правило no-raw-text відстежує жорстко закодовані рядки.