Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту
Історія версій
- "Оновлення використання API useIntlayer у Solid для прямого доступу до властивостей"v8.9.004.05.2026
- "Початковий випуск"v8.0.010.01.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
Перекладіть ваш сайт Next.js 16 (без [locale] у шляху сторінки) за допомогою Intlayer | Інтернаціоналізація (i18n)
Дивіться Шаблон додатка на GitHub.
Зміст
Чому варто обрати Intlayer, а не альтернативи?
Порівняно з основними рішеннями, такими як next-intl або i18next, Intlayer — це рішення, яке має такі інтегровані оптимізації, як:
Intlayer оптимізовано для роботи з компонентами сервера для ефективного відтворення та повністю сумісно з Turbopack. Він не блокує статичний рендеринг і пропонує проміжне програмне забезпечення, а також усі функції, необхідні для інтернаціоналізації масштабування (i18n).
Intlayer сумісний із Next.js 12, 13, 14, 15 і 16. Якщо ви використовуєте маршрутизатор сторінок Next.js, ви можете переглянути цей посібник. Локальна маршрутизація корисна для SEO, розміру пакета та продуктивності. Якщо він вам не потрібен, ви можете звернутися до цього посібника. Щодо Next.js 12, 13, 14 і 15 із маршрутизатором програм див. цей посібник.
Замість того, щоб завантажувати великі файли 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 у застосунку Next.js
Встановлення залежностей
Встановіть необхідні пакети за допомогою npm:
bashКопіювати кодСкопіюйте код у буфер обміну
npm install intlayer next-intlayernpx intlayer initintlayer
Основний пакет, який надає інструменти інтернаціоналізації для управління конфігурацією, перекладів, оголошення контенту, транспіляції та команд CLI.
next-intlayer
Пакет, який інтегрує Intlayer з Next.js. Він надає провайдери контексту та хуки для інтернаціоналізації в Next.js. Крім того, він включає плагін для Next.js для інтеграції Intlayer з Webpack або Turbopack, а також proxy для визначення переважної локалі користувача, керування cookie та обробки перенаправлень URL.
Налаштуйте ваш проєкт
Ось фінальна структура, яку ми створимо:
bashКопіювати кодСкопіюйте код у буфер обміну
.├── src│ ├── app│ │ ├── layout.tsx│ │ ├── page.content.ts│ │ └── page.tsx│ ├── components│ │ ├── clientComponentExample│ │ │ ├── client-component-example.content.ts│ │ │ └── ClientComponentExample.tsx│ │ ├── localeSwitcher│ │ │ ├── localeSwitcher.content.ts│ │ │ └── LocaleSwitcher.tsx│ │ └── serverComponentExample│ │ ├── server-component-example.content.ts│ │ └── ServerComponentExample.tsx│ └── proxy.ts├── intlayer.config.ts├── next.config.ts├── package.json└── tsconfig.jsonЯкщо ви не хочете маршрутизацію за локалями, intlayer можна використовувати як простий provider / hook. Дивіться цей посібник для детальнішої інформації.
Створіть конфігураційний файл для налаштування мов вашого застосунку:
intlayer.config.tsКопіювати кодСкопіюйте код у буфер обміну
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Ваші інші локалі ], defaultLocale: Locales.ENGLISH, }, routing: { mode: "search-params", // або `no-prefix` - Корисно для виявлення в middleware }, }; export default config;Через цей файл конфігурації ви можете налаштувати локалізовані URL-адреси, перенаправлення через проксі, назви cookie, розташування та розширення декларацій вашого контенту, відключити логи Intlayer у консолі та інше. Для повного списку доступних параметрів зверніться до документації з конфігурації.
Інтегруйте Intlayer у конфігурацію Next.js
Налаштуйте ваш Next.js для використання Intlayer:
next.config.tsКопіювати кодСкопіюйте код у буфер обміну
import type { NextConfig } from "next"; import { withIntlayer } from "next-intlayer/server"; const nextConfig: NextConfig = { /* опції конфігурації тут */ }; export default withIntlayer(nextConfig);Плагін Next.js
withIntlayer()використовується для інтеграції Intlayer з Next.js. Він забезпечує побудову файлів декларацій вмісту та відстежує їх у режимі розробки. Він визначає змінні оточення Intlayer у середовищах Webpack або Turbopack. Додатково він надає aliases для оптимізації продуктивності та забезпечує сумісність із server components.Функція
withIntlayer()повертає Promise. Вона дозволяє підготувати словники Intlayer перед початком збірки. Якщо ви хочете використовувати її разом з іншими плагінами, ви можете дочекатися її виконання за допомогою await. Приклад:tsКопіювати кодСкопіюйте код у буфер обміну
const nextConfig = await withIntlayer(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;Якщо ви хочете використовувати його синхронно, ви можете використати функцію
withIntlayerSync(). Приклад:tsКопіювати кодСкопіюйте код у буфер обміну
const nextConfig = withIntlayerSync(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;Intlayer автоматично визначає, чи ваш проєкт використовує webpack чи Turbopack на основі прапорів командного рядка
--webpack,--turbo, або--turbopack, а також вашої поточної версії Next.js.Оскільки
next>=16, якщо ви використовуєте Rspack, ви повинні явно змусити Intlayer використовувати конфігурацію webpack, вимкнувши Turbopack:tsКопіювати кодСкопіюйте код у буфер обміну
withRspack(withIntlayer(nextConfig, { enableTurbopack: false }));Визначте динамічні маршрути локалей
Видаліть усе з
RootLayoutі замініть на наступний код:src/app/layout.tsxКопіювати кодСкопіюйте код у буфер обміну
import type { Metadata } from "next"; import type { ReactNode } from "react"; import "./globals.css"; import { IntlayerClientProvider, LocalPromiseParams } from "next-intlayer"; import { getHTMLTextDir, getIntlayer } from "intlayer"; import { getLocale } from "next-intlayer/server"; export { generateStaticParams } from "next-intlayer"; export const generateMetadata = async (): Promise<Metadata> => { const locale = await getLocale(); const { title, description, keywords } = getIntlayer("metadata", locale); return { title, description, keywords, }; }; const RootLayout = async ({ children, }: Readonly<{ children: ReactNode; }>) => { const locale = await getLocale(); return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <IntlayerClientProvider defaultLocale={locale}> <body>{children}</body> </IntlayerClientProvider> </html> ); }; export default RootLayout;Оголосіть свій контент
Створюйте та керуйте деклараціями контенту для збереження перекладів:
src/app/metadata.content.tsКопіювати кодСкопіюйте код у буфер обміну
import { t, type Dictionary } from "intlayer"; import { Metadata } from "next"; const metadataContent = { key: "metadata", content: { title: t({ uk: "Назва мого проєкту", en: "My Project Title", fr: "Le Titre de mon Projet", es: "El Título de mi Proyecto", }), description: t({ uk: "Відкрийте для себе нашу інноваційну платформу, розроблену для оптимізації робочого процесу та підвищення продуктивності.", en: "Discover our innovative platform designed to streamline your workflow and boost productivity.", fr: "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.", es: "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad.", }), keywords: t({ uk: ["інновації", "продуктивність", "робочий процес", "SaaS"], en: ["innovation", "productivity", "workflow", "SaaS"], uk: ["інновації", "продуктивність", "робочий процес", "SaaS"], fr: ["innovation", "productivité", "flux de travail", "SaaS"], es: ["innovación", "productividad", "flujo de trabajo", "SaaS"], }), }, } as Dictionary<Metadata>; export default metadataContent;src/app/page.content.tsКопіювати кодСкопіюйте код у буфер обміну
import { t, type Dictionary } from "intlayer"; const pageContent = { key: "page", content: { getStarted: { main: t({ uk: "Почніть з редагування", en: "Get started by editing", fr: "Commencez par éditer", es: "Comience por editar", }), pageLink: "src/app/page.tsx", }, }, } satisfies Dictionary; export default pageContent;Ваші декларації вмісту можуть бути визначені будь-де у вашому додатку, як тільки вони будуть додані до директорії
contentDir(за замовчуванням./src). І вони повинні відповідати розширенню файлу декларації вмісту (за замовчуванням.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).Для докладнішої інформації див. документацію щодо декларації вмісту.
Використання вмісту у вашому коді
Отримуйте доступ до ваших словників вмісту по всьому додатку:
src/app/page.tsxКопіювати кодСкопіюйте код у буфер обміну
import type { FC } from "react"; import { ClientComponentExample } from "@components/clientComponentExample/ClientComponentExample"; import { ServerComponentExample } from "@components/serverComponentExample/ServerComponentExample"; import { IntlayerServerProvider, useIntlayer, getLocale, } from "next-intlayer/server"; import { NextPage } from "next"; import { headers, cookies } from "next/headers"; const PageContent: FC = () => { const content = useIntlayer("page"); return ( <> <p>{content.getStarted.main}</p> <code>{content.getStarted.pageLink}</code> </> ); }; const Page: NextPage = async () => { const locale = await getLocale(); return ( <IntlayerServerProvider locale={locale}> <PageContent /> <ServerComponentExample /> <ClientComponentExample /> </IntlayerServerProvider> ); }; export default Page;IntlayerClientProviderвикористовується для надання локалі компонентам на стороні клієнта. Його можна розмістити в будь-якому батьківському компоненті, включно з layout. Однак рекомендовано розміщувати його в layout, оскільки Next.js спільно використовує код layout між сторінками, що робить це ефективнішим. ВикористовуючиIntlayerClientProviderу layout, ви уникаєте повторної ініціалізації для кожної сторінки, покращуєте продуктивність і підтримуєте послідовний контекст локалізації в усьому застосунку.IntlayerServerProviderвикористовується для надання локалі дочірнім серверним компонентам. Його не можна встановлювати в layout.Layout і сторінка не можуть ділитись загальним server context, оскільки система server context базується на сховищі даних для кожного запиту (через механізм React's cache), внаслідок чого кожен «context» створюється заново для різних сегментів застосунку. Розміщення провайдера в спільному layout порушить цю ізоляцію та перешкоджатиме правильній передачі значень server context вашим server компонентам.
src/components/clientComponentExample/ClientComponentExample.tsxКопіювати кодСкопіюйте код у буфер обміну
"use client"; import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; export const ClientComponentExample: FC = () => { const content = useIntlayer("client-component-example"); // Створити декларацію пов'язаного контенту return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };src/components/serverComponentExample/ServerComponentExample.tsxКопіювати кодСкопіюйте код у буфер обміну
import type { FC } from "react"; import { useIntlayer } from "next-intlayer/server"; export const ServerComponentExample: FC = () => { const content = useIntlayer("server-component-example"); // Створити декларацію пов'язаного контенту return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };Якщо ви хочете використовувати ваш контент у рядковому атрибуті, наприклад
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)}" />Щоб дізнатися більше про хук
useIntlayer, зверніться до документації.Налаштування проксі для визначення локалі
Необов'язковоНалаштуйте проксі для визначення преференованої локалі користувача:
src/proxy.tsКопіювати кодСкопіюйте код у буфер обміну
export { intlayerProxy as proxy } from "next-intlayer/proxy"; export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)", };Проксі
intlayerProxyвикористовується для визначення преферованої локалі користувача та перенаправлення його на відповідну URL-адресу, як зазначено в конфігурації. Крім того, воно дозволяє зберігати преферовану локаль користувача в cookie.Якщо потрібно з'єднати кілька проксі разом (наприклад,
intlayerProxyз авторизацією або власними проксі), Intlayer тепер надає допоміжну функціюmultipleProxies.tsКопіювати кодСкопіюйте код у буфер обміну
import { multipleProxies, intlayerProxy } from "next-intlayer/proxy";import { customProxy } from "@utils/customProxy";export const proxy = multipleProxies([intlayerProxy, customProxy]);Змініть мову вашого контенту
Необов'язковоЩоб змінити мову вашого контенту в Next.js, рекомендований спосіб, використовувати компонент Link для перенаправлення користувачів на відповідну локалізовану сторінку. Компонент Link забезпечує prefetch сторінки, що допомагає уникнути повного перезавантаження сторінки.
src/components/localeSwitcher/LocaleSwitcher.tsxКопіювати кодСкопіюйте код у буфер обміну
"use client"; import type { FC } from "react"; import { Locales, getHTMLTextDir, getLocaleName } from "intlayer"; import { useLocale } from "next-intlayer"; export const LocaleSwitcher: FC = () => { const { locale, availableLocales, setLocale } = useLocale(); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <button key={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={() => setLocale(localeItem)} > <span> {/* Локаль, напр., FR */} {localeItem} </span> <span> {/* Мова у власній локалі, напр., Français */} {getLocaleName(localeItem, locale)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* Мова в поточній локалі, напр., Francés коли поточна локаль встановлена на Locales.SPANISH */} {getLocaleName(localeItem)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* Мова англійською, наприклад, French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </button> ))} </div> </div> ); };Альтернативний спосіб, використати функцію
setLocale, яку надає хукuseLocale. Ця функція не дозволяє виконувати prefetch сторінки. Детальніше див. документацію хукуuseLocale.Посилання на документацію:
Отримати поточну локаль у Server Actions
Необов'язковоЯкщо вам потрібна активна локаль всередині Server Action (наприклад, для локалізації електронних листів або виконання логіки, що залежить від локалі), викличте
getLocaleзnext-intlayer/server:src/app/actions/getLocale.tsКопіювати кодСкопіюйте код у буфер обміну
"use server";import { getLocale } from "next-intlayer/server";export const myServerAction = async () => { const locale = await getLocale(); // Виконайте необхідні дії з локаллю};Функція
getLocaleвикористовує каскадну стратегію для визначення локалі користувача:- Спочатку вона перевіряє заголовки запиту на наявність значення локалі, яке могло бути встановлене проксі
- Якщо локаль не знайдена в заголовках, вона шукає локаль, збережену в cookies
- Якщо cookie не знайдено, вона намагається визначити бажану мову користувача з налаштувань браузера
- Як останній варіант, вона повертається до локалі за замовчуванням, налаштованої в застосунку
Це гарантує, що вибирається найбільш відповідна локаль на основі доступного контексту.
Оптимізуйте розмір бандла
Необов'язковоПри використанні
next-intlayerсловники за замовчуванням включаються в бандл для кожної сторінки. Щоб оптимізувати розмір бандла, Intlayer надає необов'язковий SWC-плагін, який інтелектуально замінює викликиuseIntlayerза допомогою макросів. Це гарантує, що словники включатимуться лише в бандли сторінок, які їх фактично використовують.Щоб увімкнути цю оптимізацію, встановіть пакет
@intlayer/swc. Після встановленняnext-intlayerавтоматично виявить і використає плагін:bashКопіювати кодСкопіюйте код у буфер обміну
npm install @intlayer/swc --save-devПримітка: Ця оптимізація доступна лише для Next.js 13 і новіших версій.
Примітка: Цей пакет не встановлюється за замовчуванням, оскільки SWC-плагіни в Next.js все ще є експериментальними. Це може змінитися в майбутньому.
Примітка: Якщо ви встановите опцію як
importMode: 'dynamic'абоimportMode: 'fetch'(in thedictionaryconfiguration), це залежатиме від Suspense, тож вам доведеться обгорнути викликиuseIntlayerу межіSuspense. Це означає, що ви не зможете використовуватиuseIntlayerбезпосередньо на верхньому рівні вашого компонента Page або Layout.
Стеження за змінами словників у Turbopack
При використанні Turbopack як сервера розробки з командою next dev, зміни в словниках за замовчуванням не будуть виявлятися автоматично.
Це обмеження виникає через те, що Turbopack не може запускати плагіни webpack паралельно, щоб відстежувати зміни у ваших файлах контенту. Щоб обійти це, потрібно використовувати команду intlayer watch, щоб одночасно запускати сервер розробки та спостерігача складання Intlayer.
Скопіюйте код у буфер обміну
{ // ... Ваші існуючі конфігурації package.json "scripts": { // ... Ваші існуючі налаштування скриптів "dev": "intlayer watch --with 'next dev'", },}Якщо ви використовуєте next-intlayer@<=6.x.x, потрібно зберегти прапорець --turbopack, щоб додаток Next.js 16 працював правильно з Turbopack. Ми рекомендуємо використовувати next-intlayer@>=7.x.x, щоб уникнути цього обмеження.
Налаштування TypeScript
Intlayer використовує module augmentation, щоб отримати переваги TypeScript і зміцнити вашу codebase.


Переконайтеся, що ваша конфігурація TypeScript включає автозгенеровані типи.
Скопіюйте код у буфер обміну
{ // ... Ваші існуючі конфігурації TypeScript "include": [ // ... Ваші існуючі конфігурації TypeScript ".intlayer/**/*.ts", // Include the auto-generated types ],}Налаштування Git
Рекомендується ігнорувати файли, згенеровані Intlayer. Це дозволить уникнути їх додавання до вашого Git-репозиторію.
Для цього можна додати наступні інструкції до файлу .gitignore:
Скопіюйте код у буфер обміну
# Ігнорувати файли, згенеровані Intlayer.intlayerРозширення VS Code
Щоб покращити досвід розробки з Intlayer, ви можете встановити офіційне розширення Intlayer VS Code Extension.
Встановити з VS Code Marketplace
Це розширення надає:
- Автодоповнення для ключів перекладу.
- Виявлення помилок у реальному часі для відсутніх перекладів.
- Вбудований попередній перегляд перекладеного вмісту.
- Швидкі дії для легкого створення та оновлення перекладів.
Для детальнішої інформації про використання розширення зверніться до документації Intlayer VS Code Extension.
Розширені можливості
Щоб розширити можливості, ви можете реалізувати візуальний редактор або винести свій вміст, використовуючи CMS.