ГоловнаПісочницяВітринаДодатокДокументаціяБлог
    • Englishанглійська
      EN
    • русскийросійська
      RU
    • 日本語японська
      JA
    • françaisфранцузька
      FR
    • 한국어корейська
      KO
    • 中文китайська
      ZH
    • españolіспанська
      ES
    • Deutschнімецька
      DE
    • العربيةарабська
      AR
    • italianoіталійська
      IT
    • British Englishанглійська (Велика Британія)
      EN-GB
    • portuguêsпортугальська
      PT
    • हिन्दीгінді
      HI
    • Türkçeтурецька
      TR
    • polskiпольська
      PL
    • Indonesiaіндонезійська
      ID
    • Tiếng Việtвʼєтнамська
      VI
    • українськаукраїнська
      UK
    /
    Фільтрувати документи за фреймворком
    Alt+←
    Чому Intlayer?
    Почати
    Концепція
    • Як працює Intlayer
    • Конфігурація
    • TestFillBuildWatchExtractLoginPushPullConfigurationListVersionEditorLiveDebugDoc ReviewDoc TranslateSDK
    • Візуальний редактор
    • CMS
    • Інтеграція CI/CD
    • ПерекладМножинаПерелікУмоваРідВставкаФайлВкладеністьMarkdownHTMLОтримання функції
    • Файл для кожної локалі
    • Компілятор
    • Автозаповнення
    • Тестування
    • Оптимізація пакета
    Середовище
    • Next.js 14 та App Router
      Next.js 15
      Next.js без locale URL
      Next.js та Page Router
      Compiler
    • Tanstack Start Solid
    • Astro та React
      Astro та Svelte
      Astro та Vue
      Astro та Solid
      Astro та Preact
      Astro та Lit
      Astro та Vanilla JS
    • React Router v7
      React Router v7 (fs-routes)
      Compiler
    • Nuxt та Vue
    • Vite та Solid
    • SvelteKit
    • Vite та Preact
    • Vite та Vanilla JS
    • Vite та Lit
    • Angular 19 (Webpack)
      Analog
    • React CRA
    • React Native та Expo
    • Express.js
      NestJS
      Fastify
      Hono
      Adonis
    • Lynx та React
    Plugins
    • JSON
    • gettext (.po)
    Розширення VS Code
    Агент
    • Сервер MCP
    • Навички агента
    Релізи
    • v8
    • v7
    • v6
    Бенчмарк
    • Next.js
    • TanStack
    • Vue
    • Solid
    • Svelte
    Блог
    Задати питання
    1. Documentation
    2. Середовище
    3. Astro
    4. Svelte
    \n\n
    \n

    {$content.title}

    \n \n
    \n Змінити мову:\n
    \n {#each availableLocales as localeItem}\n setLocale(localeItem)}\n >\n {getLocaleName(localeItem)}\n {getLocaleName(localeItem, $currentLocale)}\n {localeItem.toUpperCase()}\n \n {/each}\n
    \n
    \n
    \n```\n\n> Проп `locale` передається зі сторінки Astro (визначення на стороні сервера) і використовується для ініціалізації `setupIntlayer`, встановлюючи початкову мову для всіх сторів у компоненті.\n\n### Крок 7: Додавання перемикача мов\n\nФункціональність перемикання мов інтегрована безпосередньо в Svelte island (див. крок 6 вище). Він використовує стор `useLocale` з `svelte-intlayer` і переходить за локалізованою URL-адресою, коли користувач обирає нову мову:\n\n```svelte fileName=\"src/components/svelte/SvelteIsland.svelte\"\n\n\n
    \n Змінити мову:\n
    \n {#each availableLocales as localeItem}\n setLocale(localeItem)}\n >\n {getLocaleName(localeItem)}\n {getLocaleName(localeItem, $currentLocale)}\n {localeItem.toUpperCase()}\n \n {/each}\n
    \n
    \n```\n\n> **Примітка щодо стійкості:**\n> Використання `onLocaleChange` для перенаправлення через `window.location.href` гарантує відвідування нової URL-адреси з мовним префіксом. Це дозволяє middleware Intlayer встановити cookie мови та запам'ятати вибір користувача для майбутніх візитів.\n\n### Крок 8: Sitemap та Robots.txt\n\nIntlayer пропонує інструменти для динамічного створення локалізованої карти сайту та файлу robots.txt.\n\n#### Sitemap\n\nIntlayer 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.\n\n> 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.\n\nСтворіть `src/pages/sitemap.xml.ts` для генерації карти сайту, що охоплює всі ваші локалізовані маршрути.\n\n```typescript fileName=\"src/pages/sitemap.xml.ts\"\nimport type { APIRoute } from \"astro\";\nimport { generateSitemap, type SitemapUrlEntry } from \"intlayer\";\n\nconst pathList: SitemapUrlEntry[] = [\n { path: \"/\", changefreq: \"daily\", priority: 1.0 },\n { path: \"/about\", changefreq: \"monthly\", priority: 0.7 },\n];\n\nconst SITE_URL = import.meta.env.SITE ?? \"http://localhost:4321\";\n\nexport const GET: APIRoute = async ({ site }) => {\n const xmlOutput = generateSitemap(pathList, { siteUrl: SITE_URL });\n\n return new Response(xmlOutput, {\n headers: { \"Content-Type\": \"application/xml\" },\n });\n};\n```\n\n#### Robots.txt\n\nСтворіть `src/pages/robots.txt.ts` для керування скануванням пошуковими системами.\n\n```typescript fileName=\"src/pages/robots.txt.ts\"\nimport type { APIRoute } from \"astro\";\nimport { getMultilingualUrls } from \"intlayer\";\n\nconst getAllMultilingualUrls = (urls: string[]) =>\n urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);\n\nconst disallowedPaths = getAllMultilingualUrls([\"/admin\", \"/private\"]);\n\nexport const GET: APIRoute = ({ site }) => {\n const robotsTxt = [\n \"User-agent: *\",\n \"Allow: /\",\n ...disallowedPaths.map((path) => `Disallow: ${path}`),\n \"\",\n `Sitemap: ${new URL(\"/sitemap.xml\", site).href}`,\n ].join(\"\\n\");\n\n return new Response(robotsTxt, {\n headers: { \"Content-Type\": \"text/plain\" },\n });\n};\n```\n\n### Конфігурація TypeScript\n\nIntlayer використовує розширення модулів (module augmentation), щоб отримати переваги від TypeScript, роблячи вашу кодову базу надійнішою.\n\n![Autocompletion](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true)\n\n![Translation Error](https://github.com/aymericzip/intlayer/blob/main/docs/assets/translation_error.png?raw=true)\n\nПереконайтеся, що ваша конфігурація TypeScript включає автоматично згенеровані типи.\n\n```json5 fileName=\"tsconfig.json\"\n{\n // ... ваша існуюча конфігурація TypeScript\n \"include\": [\n // ... ваша існуюча конфігурація TypeScript\n \".intlayer/**/*.ts\", // Включити автоматично згенеровані типи\n ],\n}\n```\n\n### Конфігурація Git\n\nМи рекомендуємо ігнорувати файли, згенеровані Intlayer. Це запобігає їх потраплянню до вашого Git-репозиторію.\n\nДля цього додайте наступні інструкції до вашого файлу `.gitignore`:\n\n```bash\n# Ігнорувати файли, згенеровані Intlayer\n.intlayer\n```\n\n### Розширення для VS Code\n\nЩоб покращити ваш досвід розробки з Intlayer, ви можете встановити **офіційне розширення Intlayer для VS Code**.\n\n[Встановити з VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)\n\nЦе розширення забезпечує:\n\n- **Автозаповнення** ключів перекладу.\n- **Виявлення помилок у реальному часі** для відсутніх перекладів.\n- **Попередній перегляд** перекладеного вмісту.\n- **Швидкі дії** для легкого створення та оновлення перекладів.\n\nДля отримання додаткової інформації про використання розширення дивіться [документацію розширення VS Code](https://intlayer.org/doc/vs-code-extension).\n\n---\n\n### (Необов'язково) Крок 1 : Витягніть вміст ваших компонентів\n\nЯкщо у вас є існуюча кодова база, перетворення тисяч файлів може зайняти багато часу.\n\nЩоб спростити цей процес, Intlayer пропонує [компілятор](/uk/doc/compiler) / [екстрактор](/uk/doc/concept/cli/extract) для перетворення ваших компонентів і витягування вмісту.\n\nЩоб налаштувати його, ви можете додати розділ `compiler` у свій файл `intlayer.config.ts`:\n\n```typescript fileName=\"intlayer.config.ts\" codeFormat={[\"typescript\", \"esm\", \"commonjs\"]}\nimport { type IntlayerConfig } from \"intlayer\";\n\nconst config: IntlayerConfig = {\n // ... Інша частина вашої конфігурації\n compiler: {\n /**\n * Вказує, чи повинен бути включений компілятор.\n */\n enabled: true,\n\n /**\n * Визначає шлях до вихідних файлів\n */\n output: ({ fileName, extension }) => `./${fileName}${extension}`,\n\n /**\n * Вказує, чи повинні компоненти зберігатися після перетворення. Таким чином, компілятор можна запустити лише один раз для перетворення програми, а потім видалити.\n */\n saveComponents: false,\n\n /**\n * Префікс ключа словника\n */\n dictionaryKeyPrefix: \"\",\n },\n};\n\nexport default config;\n```\n\n\n \n\nЗапустіть екстрактор для перетворення компонентів і витягування вмісту\n\n```bash packageManager=\"npm\"\nnpx intlayer extract\n```\n\n```bash packageManager=\"pnpm\"\npnpm intlayer extract\n```\n\n```bash packageManager=\"yarn\"\nyarn intlayer extract\n```\n\n```bash packageManager=\"bun\"\nbun x intlayer extract\n```\n\n \n \n\nОновіть свій `vite.config.ts`, щоб включити плагін `intlayerCompiler`:\n\n```ts fileName=\"vite.config.ts\"\nimport { defineConfig } from \"vite\";\nimport { intlayer, intlayerCompiler } from \"vite-intlayer\";\n\nexport default defineConfig({\n plugins: [\n intlayer(),\n intlayerCompiler(), // Додає плагін компілятора\n ],\n});\n```\n\n```bash packageManager=\"npm\"\nnpm run build # Або npm run dev\n```\n\n```bash packageManager=\"pnpm\"\npnpm run build # Or pnpm run dev\n```\n\n```bash packageManager=\"yarn\"\nyarn build # Or yarn dev\n```\n\n```bash packageManager=\"bun\"\nbun run build # Or bun run dev\n```\n\n \n\n\n---\n\n### Поглиблюйте свої знання\n\nЯкщо ви хочете дізнатися більше, ви також можете впровадити [Візуальний редактор](https://github.com/aymericzip/intlayer/blob/main/docs/uk/intlayer_visual_editor.md) або використовувати [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/uk/intlayer_CMS.md), щоб винести ваш вміст назовні.\n","about":"Дізнайтеся, як додати інтернаціоналізацію (i18n) на свій сайт Astro + Svelte за допомогою Intlayer. Дотримуйтесь цього посібника, щоб зробити свій сайт багатомовним.","url":"https://intlayer.org/uk/doc/environment/astro/svelte","datePublished":"24-04-2026","dateModified":"06-05-2026","keywords":"інтернаціоналізація, документація, Intlayer, Astro, Svelte, i18n, JavaScript","license":"https://raw.githubusercontent.com/aymericzip/intlayer/refs/heads/main/LICENSE","audience":{"@type":"Audience","audienceType":"Розробники, менеджери контенту"}}
    Дата створення:2026-04-24Останнє оновлення:2026-05-06
    Переглянути шаблон додатку на GitHub

    На цій сторінці доступний шаблон додатку.

    Переглянути демонстраційний додаток

    Ця сторінка веде на живу демонстрацію шаблону.

    Надішліть цей документ вашому улюбленому AI-асистенту
    ChatGPT
    Claude
    DeepSeek
    Google AI mode
    Gemini
    Perplexity
    Mistral
    Grok

    Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту

    Історія версій

    1. "Оновлення використання API useIntlayer у Solid для прямого доступу до властивостей"
      v8.9.004.05.2026
    2. "Початкова документація для Astro + Svelte"
      v8.7.724.04.2026

    Вміст цієї сторінки перекладено за допомогою штучного інтелекту.

    Переглянути останню версію оригінального вмісту англійською
    Редагувати цей документ

    Якщо у вас є ідея щодо покращення цієї документації, будь ласка, долучіться, надіславши pull request на GitHub.

    Посилання на документацію на GitHub
    Копіювати

    Скопіювати документацію у форматі Markdown в буфер обміну

    Перекладіть свій сайт Astro + Svelte за допомогою Intlayer | Інтернаціоналізація (i18n)

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

    Зміст

    Що таке Intlayer?

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

    З Intlayer ви можете:

    • Легко керувати перекладами: Використовуючи декларативні словники на рівні компонентів.
    • Динамічно локалізувати метадані, маршрути та вміст.
    • Забезпечити підтримку TypeScript: Завдяки автоматично згенерованим типам для кращого автовідчуття та виявлення помилок.
    • Використовувати розширені можливості: Такі як динамічне визначення мови та перемикання мов.

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

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

    Крок 1: Встановіть залежності

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

    bash
    Копіювати код

    Скопіюйте код у буфер обміну

    npm install intlayer astro-intlayer svelte svelte-intlayer @astrojs/sveltenpx intlayer init
    • intlayer Основний пакет, що надає інструменти i18n для керування конфігурацією, перекладами, декларацією вмісту, транспіляцією та командами CLI.

    • astro-intlayer Плагін інтеграції Astro для зв'язку Intlayer з бандлером Vite; він також включає middleware для визначення бажаної мови користувача, керування cookie та обробки перенаправлень URL.

    • svelte Основний пакет Svelte.

    • svelte-intlayer Пакет для інтеграції Intlayer у додатки Svelte. Він надає setupIntlayer, а також стори useIntlayer та useLocale для інтернаціоналізації у Svelte.

    • @astrojs/svelte Офіційна інтеграція Astro, яка дозволяє використовувати Svelte component islands.

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

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

    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 та інтеграцію Svelte.

    astro.config.ts
    Копіювати код

    Скопіюйте код у буфер обміну

    // @ts-checkimport { intlayer } from "astro-intlayer";import svelte from "@astrojs/svelte";import { defineConfig } from "astro/config";// https://astro.build/configexport default defineConfig({  integrations: [intlayer(), svelte()],});
    Плагін інтеграції intlayer() використовується для інтеграції Intlayer з Astro. Він забезпевує генерацію файлів декларації вмісту та стежить за ними в режимі розробки. Він визначає змінні середовища Intlayer всередині додатка Astro та надає аліаси для оптимізації продуктивності.
    Інтеграція svelte() дозволяє використовувати Svelte component islands за допомогою client:only="svelte".

    Крок 4: Декларуйте свій вміст

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

    src/app.content.ts
    Копіювати код

    Скопіюйте код у буфер обміну

    import { t, type Dictionary } from "intlayer";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}).
    Для отримання додаткової інформації дивіться документацію з декларації вмісту.

    Крок 5: Використання вмісту в Astro

    Ви можете використовувати словники безпосередньо у ваших .astro файлах, використовуючи основні допоміжні функції, експортовані з intlayer. Вам також слід додати метадані SEO (такі як hreflang та канонічні посилання) на кожній сторінці та додати Svelte island для інтерактивного вмісту на стороні клієнта.

    src/pages/[...locale]/index.astro
    Копіювати код

    Скопіюйте код у буфер обміну

    ---import {  getIntlayer,  getLocaleFromPath,  getLocalizedUrl,  getHTMLTextDir,  getPrefix,  localeMap,  defaultLocale,  type LocalesValues,} from "intlayer";import SvelteIsland from "../../components/svelte/SvelteIsland.svelte";export const getStaticPaths = () => {  return localeMap(({ locale }) => ({    params: { locale: getPrefix(locale).localePrefix },  }));};const locale = getLocaleFromPath(Astro.url.pathname) as LocalesValues;const { title } = getIntlayer("app", locale);---<!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>    <!-- Канонічне посилання: Повідомляє пошуковим системам основну версію цієї сторінки -->    <link      rel="canonical"      href={new URL(getLocalizedUrl(Astro.url.pathname, locale), Astro.site)}    />    <!-- Hreflang: Повідомляє Google про всі локалізовані версії -->    {      localeMap(({ locale: mapLocale }) => (        <link          rel="alternate"          hreflang={mapLocale}          href={new URL(            getLocalizedUrl(Astro.url.pathname, mapLocale),            Astro.site          )}        />      ))    }    <!-- x-default: Резервний варіант, коли мова не відповідає мові користувача -->    <link      rel="alternate"      hreflang="x-default"      href={new URL(        getLocalizedUrl(Astro.url.pathname, defaultLocale),        Astro.site      )}    />  </head>  <body>    <!-- Svelte island рендерить увесь інтерактивний вміст, включаючи перемикач мов -->    <SvelteIsland locale={locale} client:only="svelte" />  </body></html>
    Якщо ви хочете використовувати свій контент в атрибуті рядка, такому як alt, title, href, aria-label тощо, ви можете використовувати значення функції, наприклад:
    html
    Копіювати код

    Скопіюйте код у буфер обміну

    <img src="{content.image.src.value}" alt="{content.image.value}" /><img src="{content.image.src.toString()}" alt="{content.image.toString()}" /><img src="{String(content.image.src)}" alt="{String(content.image)}" />

    Примітка щодо налаштування маршрутизації: Структура каталогів, яку ви використовуєте, залежить від параметра middleware.routing у intlayer.config.ts:

    • prefix-no-default (за замовчуванням): Зберігає мову за замовчуванням у корені (без префікса) та додає префікси до інших. Використовуйте [...locale], щоб охопити всі випадки.
    • prefix-all: Усі URL-адреси отримують префікс мови. Ви можете використовувати стандартний [locale], якщо вам не потрібно окремо обробляти корінь.
    • search-param або no-prefix: Каталоги мов не потрібні. Мова керується за допомогою параметрів запиту або cookie.

    Крок 6: Створення компонента Svelte Island

    Створіть компонент island, який обгортає ваш додаток Svelte. Ви повинні викликати setupIntlayer з мовою, визначеною сервером, перед доступом до будь-яких сторів.

    src/components/svelte/SvelteIsland.svelte
    Копіювати код

    Скопіюйте код у буфер обміну

    <script lang="ts">  import { useIntlayer, useLocale, setupIntlayer } from "svelte-intlayer";  import { getLocalizedUrl, getLocaleName, type LocalesValues } from "intlayer";  export let locale: LocalesValues;  setupIntlayer(locale);  const content = useIntlayer("app");  const { locale: currentLocale, availableLocales, setLocale } = useLocale({    onLocaleChange: (newLocale: LocalesValues) => {      window.location.href = getLocalizedUrl(window.location.pathname, newLocale);    },  });</script><div>  <h1>{$content.title}</h1>  <!-- Перемикач мов рендериться безпосередньо всередині island -->  <div class="locale-switcher">    <span class="switcher-label">Змінити мову:</span>    <div class="locale-buttons">      {#each availableLocales as localeItem}        <button          class="locale-btn {localeItem === $currentLocale ? 'active' : ''}"          disabled={localeItem === $currentLocale}          on:click={() => setLocale(localeItem)}        >          <span class="ls-own-name">{getLocaleName(localeItem)}</span>          <span class="ls-current-name">{getLocaleName(localeItem, $currentLocale)}</span>          <span class="ls-code">{localeItem.toUpperCase()}</span>        </button>      {/each}    </div>  </div></div>
    Проп locale передається зі сторінки Astro (визначення на стороні сервера) і використовується для ініціалізації setupIntlayer, встановлюючи початкову мову для всіх сторів у компоненті.

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

    Функціональність перемикання мов інтегрована безпосередньо в Svelte island (див. крок 6 вище). Він використовує стор useLocale з svelte-intlayer і переходить за локалізованою URL-адресою, коли користувач обирає нову мову:

    src/components/svelte/SvelteIsland.svelte
    Копіювати код

    Скопіюйте код у буфер обміну

    <script lang="ts">  import { useLocale } from "svelte-intlayer";  import { getLocalizedUrl, getLocaleName, type LocalesValues } from "intlayer";  // Припустимо таку ж логіку locale/setupIntlayer з кроку 6...  const {    locale: currentLocale,    availableLocales,    setLocale,  } = useLocale({    onLocaleChange: (newLocale: LocalesValues) => {      // Перейти за локалізованою URL-адресою при зміні мови      window.location.href = getLocalizedUrl(window.location.pathname, newLocale);    },  });</script><div class="locale-switcher">  <span class="switcher-label">Змінити мову:</span>  <div class="locale-buttons">    {#each availableLocales as localeItem}      <button        class="locale-btn {localeItem === $currentLocale ? 'active' : ''}"        disabled={localeItem === $currentLocale}        on:click={() => setLocale(localeItem)}      >        <span class="ls-own-name">{getLocaleName(localeItem)}</span>        <span class="ls-current-name">{getLocaleName(localeItem, $currentLocale)}</span>        <span class="ls-code">{localeItem.toUpperCase()}</span>      </button>    {/each}  </div></div>

    Примітка щодо стійкості: Використання onLocaleChange для перенаправлення через window.location.href гарантує відвідування нової URL-адреси з мовним префіксом. Це дозволяє middleware Intlayer встановити cookie мови та запам'ятати вибір користувача для майбутніх візитів.

    Крок 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 },];const SITE_URL = import.meta.env.SITE ?? "http://localhost:4321";export const GET: APIRoute = async ({ site }) => {  const xmlOutput = generateSitemap(pathList, { siteUrl: SITE_URL });  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" },  });};

    Конфігурація 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 Marketplace

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

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

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


    (Необов'язково) Крок 1 : Витягніть вміст ваших компонентів

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

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

    Оновіть свій vite.config.ts, щоб включити плагін intlayerCompiler:

    vite.config.ts
    Копіювати код

    Скопіюйте код у буфер обміну

    import { defineConfig } from "vite";import { intlayer, intlayerCompiler } from "vite-intlayer";export default defineConfig({ plugins: [   intlayer(),   intlayerCompiler(), // Додає плагін компілятора ],});
    bash
    Копіювати код

    Скопіюйте код у буфер обміну

    npm run build # Або npm run dev

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

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

    Astro та React
    Astro та Vue
    Alt+→

    На цій сторінці

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

      npm install intlayer astro-intlayer svelte svelte-intlayer @astrojs/sveltenpx intlayer init
      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;
      // @ts-checkimport { intlayer } from "astro-intlayer";import svelte from "@astrojs/svelte";import { defineConfig } from "astro/config";// https://astro.build/configexport default defineConfig({  integrations: [intlayer(), svelte()],});
      import { t, type Dictionary } from "intlayer";const appContent = {  key: "app",  content: {    title: t({      en: "Hello World",      fr: "Bonjour le monde",      es: "Hola mundo",      uk: "Привіт Світе",    }),  },} satisfies Dictionary;export default appContent;
      ---import {  getIntlayer,  getLocaleFromPath,  getLocalizedUrl,  getHTMLTextDir,  getPrefix,  localeMap,  defaultLocale,  type LocalesValues,} from "intlayer";import SvelteIsland from "../../components/svelte/SvelteIsland.svelte";export const getStaticPaths = () => {  return localeMap(({ locale }) => ({    params: { locale: getPrefix(locale).localePrefix },  }));};const locale = getLocaleFromPath(Astro.url.pathname) as LocalesValues;const { title } = getIntlayer("app", locale);---<!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>    <!-- Канонічне посилання: Повідомляє пошуковим системам основну версію цієї сторінки -->    <link      rel="canonical"      href={new URL(getLocalizedUrl(Astro.url.pathname, locale), Astro.site)}    />    <!-- Hreflang: Повідомляє Google про всі локалізовані версії -->    {      localeMap(({ locale: mapLocale }) => (        <link          rel="alternate"          hreflang={mapLocale}          href={new URL(            getLocalizedUrl(Astro.url.pathname, mapLocale),            Astro.site          )}        />      ))    }    <!-- x-default: Резервний варіант, коли мова не відповідає мові користувача -->    <link      rel="alternate"      hreflang="x-default"      href={new URL(        getLocalizedUrl(Astro.url.pathname, defaultLocale),        Astro.site      )}    />  </head>  <body>    <!-- Svelte island рендерить увесь інтерактивний вміст, включаючи перемикач мов -->    <SvelteIsland locale={locale} client:only="svelte" />  </body></html>
      <img src="{content.image.src.value}" alt="{content.image.value}" /><img src="{content.image.src.toString()}" alt="{content.image.toString()}" /><img src="{String(content.image.src)}" alt="{String(content.image)}" />
      <script lang="ts">  import { useIntlayer, useLocale, setupIntlayer } from "svelte-intlayer";  import { getLocalizedUrl, getLocaleName, type LocalesValues } from "intlayer";  export let locale: LocalesValues;  setupIntlayer(locale);  const content = useIntlayer("app");  const { locale: currentLocale, availableLocales, setLocale } = useLocale({    onLocaleChange: (newLocale: LocalesValues) => {      window.location.href = getLocalizedUrl(window.location.pathname, newLocale);    },  });</script><div>  <h1>{$content.title}</h1>  <!-- Перемикач мов рендериться безпосередньо всередині island -->  <div class="locale-switcher">    <span class="switcher-label">Змінити мову:</span>    <div class="locale-buttons">      {#each availableLocales as localeItem}        <button          class="locale-btn {localeItem === $currentLocale ? 'active' : ''}"          disabled={localeItem === $currentLocale}          on:click={() => setLocale(localeItem)}        >          <span class="ls-own-name">{getLocaleName(localeItem)}</span>          <span class="ls-current-name">{getLocaleName(localeItem, $currentLocale)}</span>          <span class="ls-code">{localeItem.toUpperCase()}</span>        </button>      {/each}    </div>  </div></div>
      <script lang="ts">  import { useLocale } from "svelte-intlayer";  import { getLocalizedUrl, getLocaleName, type LocalesValues } from "intlayer";  // Припустимо таку ж логіку locale/setupIntlayer з кроку 6...  const {    locale: currentLocale,    availableLocales,    setLocale,  } = useLocale({    onLocaleChange: (newLocale: LocalesValues) => {      // Перейти за локалізованою URL-адресою при зміні мови      window.location.href = getLocalizedUrl(window.location.pathname, newLocale);    },  });</script><div class="locale-switcher">  <span class="switcher-label">Змінити мову:</span>  <div class="locale-buttons">    {#each availableLocales as localeItem}      <button        class="locale-btn {localeItem === $currentLocale ? 'active' : ''}"        disabled={localeItem === $currentLocale}        on:click={() => setLocale(localeItem)}      >        <span class="ls-own-name">{getLocaleName(localeItem)}</span>        <span class="ls-current-name">{getLocaleName(localeItem, $currentLocale)}</span>        <span class="ls-code">{localeItem.toUpperCase()}</span>      </button>    {/each}  </div></div>
      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 },];const SITE_URL = import.meta.env.SITE ?? "http://localhost:4321";export const GET: APIRoute = async ({ site }) => {  const xmlOutput = generateSitemap(pathList, { siteUrl: SITE_URL });  return new Response(xmlOutput, {    headers: { "Content-Type": "application/xml" },  });};
      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" },  });};
      {  // ... ваша існуюча конфігурація TypeScript  "include": [    // ... ваша існуюча конфігурація TypeScript    ".intlayer/**/*.ts", // Включити автоматично згенеровані типи  ],}
      # Ігнорувати файли, згенеровані Intlayer.intlayer
      npx intlayer extract
      import { defineConfig } from "vite";import { intlayer, intlayerCompiler } from "vite-intlayer";export default defineConfig({ plugins: [   intlayer(),   intlayerCompiler(), // Додає плагін компілятора ],});
      npm run build # Або npm run dev