---
createdAt: 2024-12-07
updatedAt: 2025-12-30
title: Як перекласти ваш застосунок Next.js з Page Router – посібник i18n 2026
description: Дізнайтеся, як зробити ваш вебсайт на Next.js з Page Router багатомовним. Дотримуйтесь документації, щоб інтернаціоналізувати (i18n) і перекласти його.
keywords:
- Інтернаціоналізація
- Документація
- Intlayer
- Page Router
- Next.js
- JavaScript
- React
slugs:
- doc
- environment
- nextjs
- next-with-page-router
history:
- version: 7.5.9
date: 2025-12-30
changes: Додано команду init
- version: 5.6.0
date: 2025-07-06
changes: Перетворено функцію `withIntlayer()` на функцію на основі промісів
- version: 5.5.10
date: 2025-06-29
changes: Ініціалізовано історію
---
# Перекладіть свій вебсайт на Next.js із Page Router за допомогою Intlayer | Інтернаціоналізація (i18n)
## Зміст
## Що таке Intlayer?
**Intlayer** — інноваційна open-source бібліотека інтернаціоналізації (i18n), створена для спрощення підтримки багатомовності в сучасних вебдодатках. Intlayer безшовно інтегрується з останніми версіями **Next.js**, включно з традиційним **Page Router**.
За допомогою Intlayer ви можете:
- **Легко керувати перекладами**, використовуючи декларативні словники на рівні компонентів.
- **Динамічно локалізувати метадані**, маршрути та контент.
- **Забезпечити підтримку TypeScript** завдяки автогенерованим типам, що покращує автозаповнення й виявлення помилок.
- **Отримати вигоду від розширених можливостей**, таких як динамічне визначення локалі та її перемикання.
> Intlayer сумісний з Next.js 12, 13, 14 та 15. Якщо ви використовуєте Next.js App Router, див. [посібник для App Router](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_with_nextjs_14.md). Для Next.js 15 дотримуйтесь цього [посібника](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_with_nextjs_15.md).
---
## Покроковий посібник щодо налаштування Intlayer у застосунку Next.js із Page Router
### Крок 1: Встановіть залежності
Встановіть необхідні пакунки, використовуючи обраний менеджер пакетів:
```bash packageManager="npm"
npm install intlayer next-intlayer
npx intlayer init
```
```bash packageManager="pnpm"
pnpm add intlayer next-intlayer
pnpm intlayer init
```
```bash packageManager="yarn"
yarn add intlayer next-intlayer
yarn intlayer init
```
```bash packageManager="bun"
bun add intlayer next-intlayer
bunx intlayer init
```
- **intlayer**
Основний пакет, який надає інструменти інтернаціоналізації для керування конфігурацією, перекладу, [оголошення вмісту](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/dictionary/content_file.md), транспіляції та [CLI-команд](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/cli/index.md).
- **next-intlayer**
Пакет, що інтегрує Intlayer з Next.js. Забезпечує провайдери контексту та хуки для інтернаціоналізації у Next.js. Додатково містить плагін для Next.js для інтеграції Intlayer з [Webpack](https://webpack.js.org/) або [Turbopack](https://nextjs.org/docs/app/api-reference/turbopack), а також middleware для визначення переважної локалі користувача, керування cookie та обробки перенаправлення URL.
### Крок 2: Налаштуйте свій проєкт
Створіть файл конфігурації, щоб визначити мови, які підтримує ваш застосунок:
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
import { Locales, type IntlayerConfig } from "intlayer";
const config: IntlayerConfig = {
internationalization: {
// Локалі, які підтримуються вашим додатком.
locales: [
Locales.ENGLISH,
Locales.FRENCH,
Locales.SPANISH,
// Додайте тут інші локалі
],
defaultLocale: Locales.ENGLISH,
},
};
export default config;
```
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
import { Locales } from "intlayer";
/** @type {import('intlayer').IntlayerConfig} */
const config = {
internationalization: {
locales: [
Locales.ENGLISH,
Locales.FRENCH,
Locales.SPANISH,
// Додайте тут інші локалі
],
defaultLocale: Locales.ENGLISH,
},
};
export default config;
```
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
const { Locales } = require("intlayer");
/** @type {import('intlayer').IntlayerConfig} */
const config = {
internationalization: {
locales: [
Locales.ENGLISH,
Locales.FRENCH,
Locales.SPANISH,
// Додайте тут інші локалі
],
defaultLocale: Locales.ENGLISH,
},
};
module.exports = config;
```
> Через цей конфігураційний файл ви можете налаштувати локалізовані URL-адреси, перенаправлення в middleware, імена cookie, розташування та розширення файлів декларацій вмісту, вимкнути логи Intlayer у консолі тощо. Для повного переліку доступних параметрів зверніться до [документації з конфігурації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md).
### Крок 3: Інтеграція Intlayer з конфігурацією Next.js
Змініть конфігурацію Next.js, щоб інтегрувати Intlayer:
```typescript fileName="next.config.mjs"
import { withIntlayer } from "next-intlayer/server";
/** @type {import('next').NextConfig} */
const nextConfig = {
// Ваша існуюча конфігурація Next.js
};
export default withIntlayer(nextConfig);
```
> Плагін Next.js `withIntlayer()` використовується для інтеграції Intlayer з Next.js. Він забезпечує побудову файлів декларацій контенту та відстежує їх у режимі розробки. Він визначає змінні середовища Intlayer у середовищах [Webpack](https://webpack.js.org/) або [Turbopack](https://nextjs.org/docs/app/api-reference/turbopack). Крім того, він надає алиаси для оптимізації продуктивності й забезпечує сумісність із серверними компонентами.
> Функція `withIntlayer()` повертає проміс. Якщо ви хочете використовувати її разом з іншими плагінами, ви можете дочекатися її виконання за допомогою await. Приклад:
>
> ```tsx
> const nextConfig = await withIntlayer(nextConfig);
> const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);
>
> export default nextConfigWithOtherPlugins;
> ```
### Крок 4: Налаштуйте middleware для визначення локалі
Налаштуйте middleware для автоматичного визначення та обробки бажаної користувачем локалі:
```typescript fileName="src/middleware.ts" codeFormat="typescript"
export { intlayerProxy as middleware } from "next-intlayer/middleware";
export const config = {
matcher:
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
};
```
```javascript fileName="src/middleware.mjs" codeFormat="esm"
export { intlayerProxy as middleware } from "next-intlayer/middleware";
export const config = {
matcher:
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
};
```
```javascript fileName="src/middleware.cjs" codeFormat="commonjs"
const { intlayerProxy } = require("next-intlayer/middleware");
const config = {
matcher:
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
};
module.exports = { middleware: intlayerProxy, config };
```
> Налаштуйте параметр `matcher`, щоб відповідати маршрутам вашого застосунку. Для детальнішої інформації див. [документацію Next.js щодо конфігурації matcher](https://nextjs.org/docs/app/building-your-application/routing/middleware).
### Крок 5: Визначте динамічні маршрути локалей
Реалізуйте динамічну маршрутизацію для подачі локалізованого контенту залежно від локалі користувача.
1. **Створіть сторінки для конкретної локалі:**
Перейменуйте головний файл сторінки, щоб додати динамічний сегмент `[locale]`.
```bash
mv src/pages/index.tsx src/pages/[locale]/index.tsx
```
2. **Оновіть `_app.tsx`, щоб обробляти локалізацію:**
Змініть свій `_app.tsx`, щоб включити провайдери Intlayer.
```tsx fileName="src/pages/_app.tsx" codeFormat="typescript"
import type { FC } from "react";
import type { AppProps } from "next/app";
import { IntlayerClientProvider } from "next-intlayer";
const App = FC({ Component, pageProps }) => {
const { locale } = pageProps;
return (
);
}
export default MyApp;
```
```jsx fileName="src/pages/_app.mjx" codeFormat="esm"
import { IntlayerClientProvider } from "next-intlayer";
const App = ({ Component, pageProps }) => (
);
export default App;
```
```jsx fileName="src/pages/_app.csx" codeFormat="commonjs"
const { IntlayerClientProvider } = require("next-intlayer");
const App = ({ Component, pageProps }) => (
);
module.exports = App;
```
3. **Налаштуйте `getStaticPaths` та `getStaticProps`:**
У файлі `[locale]/index.tsx` визначте paths і props для обробки різних локалей.
```tsx fileName="src/pages/[locale]/index.tsx" codeFormat="typescript"
import type { FC } from "react";
import type { GetStaticPaths, GetStaticProps } from "next";
import { type Locales, getConfiguration } from "intlayer";
const HomePage: FC = () =>
{content.getStarted.pageLink}
{/* Додаткові компоненти */}
);
};
// ... Решта коду, включаючи getStaticPaths та getStaticProps
```
```tsx fileName="src/components/ComponentExample.tsx" codeFormat="typescript"
import type { FC } from "react";
import { useIntlayer } from "next-intlayer";
export const ComponentExample: FC = () => {
const content = useIntlayer("component-example"); // Переконайтесь, що у вас є відповідна декларація вмісту
return (
{content.title}
{content.content}
);
};
```
```jsx fileName="src/components/ComponentExample.mjx" codeFormat="esm"
import { useIntlayer } from "next-intlayer";
const ComponentExample = () => {
const content = useIntlayer("component-example"); // Переконайтесь, що у вас є відповідна декларація вмісту
return (
);
};
```
> Коли ви використовуєте переклади в рядкових атрибутах (наприклад, `alt`, `title`, `href`, `aria-label`), викликайте
> значення функції таким чином:
> ```jsx
>
> ```
> Щоб дізнатися більше про хук `useIntlayer`, зверніться до [документації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/next-intlayer/useIntlayer.md).
### (Необов'язково) Крок 8: Інтернаціоналізація ваших метаданих
Якщо ви хочете інтернаціоналізувати метадані, наприклад заголовок вашої сторінки, ви можете використовувати функцію `getStaticProps`, яку надає Next.js Page Router. Всередині ви можете отримати контент за допомогою функції `getIntlayer`, щоб перекласти ваші метадані.
```typescript fileName="src/pages/[locale]/metadata.content.ts" contentDeclarationFormat="typescript"
import { type Dictionary, t } from "intlayer";
import { type Metadata } from "next";
const metadataContent = {
key: "page-metadata",
content: {
title: t({
uk: "Створити додаток Next.js",
en: "Create Next App",
uk: "Створити додаток Next.js",
fr: "Créer une application Next.js",
es: "Crear una aplicación Next.js",
}),
description: t({
uk: "Згенеровано за допомогою create next app",
en: "Generated by create next app",
fr: "Généré par create next app",
es: "Generado por create next app",
}),
},
} satisfies Dictionary;
export default metadataContent;
```
```javascript fileName="src/pages/[locale]/metadata.content.mjs" contentDeclarationFormat="esm"
import { t } from "intlayer";
/** @type {import('intlayer').Dictionary} */
const metadataContent = {
key: "page-metadata",
content: {
title: t({
uk: "Створити додаток Next.js",
en: "Create Next App",
fr: "Créer une application Next.js",
es: "Crear una aplicación Next.js",
}),
description: t({
uk: "Згенеровано за допомогою create next app",
en: "Generated by create next app",
uk: "Згенеровано за допомогою create next app",
fr: "Généré par create next app",
es: "Generado por create next app",
}),
},
};
export default metadataContent;
```
```javascript fileName="src/pages/[locale]/metadata.content.cjs" contentDeclarationFormat="commonjs"
const { t } = require("intlayer");
/** @type {import('intlayer').Dictionary} */
const metadataContent = {
key: "page-metadata",
content: {
title: t({
uk: "Створити додаток Next.js",
en: "Create Next App",
fr: "Créer une application Next.js",
es: "Crear una aplicación Next.js",
}),
description: t({
uk: "Згенеровано за допомогою create next app",
en: "Generated by create next app",
fr: "Généré par create next app",
es: "Generado por create next app",
}),
},
};
module.exports = metadataContent;
```
```json fileName="src/pages/[locale]/metadata.content.json" contentDeclarationFormat="json"
{
"key": "page-metadata",
"content": {
"title": {
"nodeType": "translation",
"translation": {
"uk": "Логотип Preact",
"en": "Preact logo",
"fr": "Logo Preact",
"es": "Logo Preact",
},
},
"description": {
"nodeType": "translation",
"translation": {
"uk": "Згенеровано за допомогою create next app",
"en": "Generated by create next app",
"fr": "Généré par create next app",
"es": "Generado por create next app",
},
},
},
};
```
````tsx fileName="src/pages/[locale]/index.tsx" codeFormat="typescript"
import { GetStaticPaths, GetStaticProps } from "next";
import { getIntlayer, getMultilingualUrls } from "intlayer";
import { useIntlayer } from "next-intlayer";
`
import Head from "next/head";
import type { FC } from "react";
interface HomePageProps {
locale: string;
metadata: {
title: string;
description: string;
};
multilingualUrls: Record;
}
const HomePage: FC = ({
metadata,
multilingualUrls,
locale,
}) => {
const content = useIntlayer("page");
return (
{metadata.title}
{/* Генерує теги hreflang для SEO */}
{Object.entries(multilingualUrls).map(([lang, url]) => (
))}
{/* Вміст сторінки */}
{/* Ваш вміст сторінки тут */}
{metadata.title}
{/* Генерує теги hreflang для SEO */}
{Object.entries(multilingualUrls).map(([lang, url]) => (
))}
{/* Вміст сторінки */}
{/* Ваш вміст сторінки тут */}
{metadata.title}
{/* Генерує теги hreflang для SEO */}
{Object.entries(multilingualUrls).map(([lang, url]) => (
))}
{/* Вміст сторінки */}
{/* Тут розмістіть контент сторінки */}
);
};
const getStaticProps = async ({ params }) => {
const locale = params?.locale;
const metadata = getIntlayer("page-metadata", locale);
/**
* Генерує об'єкт, що містить всі URL для кожної локалі.
*
* Приклад:
* ```ts
* getMultilingualUrls('/about');
*
* // Повертає
* // {
* // en: '/about',
* // fr: '/fr/about',
* // es: '/es/about',
* // }
* ```
*/
const multilingualUrls = getMultilingualUrls("/");
return {
props: {
locale,
metadata,
multilingualUrls,
},
};
};
module.exports = {
getStaticProps,
getStaticPaths,
default: HomePage,
};
// ... Інші частини коду, включаючи getStaticPaths
````
> Зверніть увагу, що функція `getIntlayer`, імпортована з `next-intlayer`, повертає ваш контент, обгорнутий у `IntlayerNode`, що дозволяє інтеграцію з візуальним редактором. Натомість функція `getIntlayer`, імпортована з `intlayer`, повертає контент напряму без додаткових властивостей.
Альтернативно, ви можете використовувати функцію `getTranslation` для декларації ваших метаданих. Проте рекомендовано використовувати файли декларації контенту, щоб автоматизувати переклад метаданих та винести контент у зовнішні файли.
```tsx fileName="src/pages/[locale]/index.tsx" codeFormat="typescript"
import { GetStaticPaths, GetStaticProps } from "next";
import {
type IConfigLocales,
getTranslation,
getMultilingualUrls,
} from "intlayer";
import { useIntlayer } from "next-intlayer";
import Head from "next/head";
import type { FC } from "react";
interface HomePageProps {
locale: string;
metadata: {
title: string;
description: string;
};
multilingualUrls: Record;
}
const HomePage: FC = ({ metadata, multilingualUrls, locale }) => {
const content = useIntlayer("page");
return (
{metadata.title}
{/* Згенерувати теги hreflang для SEO */}
{Object.entries(multilingualUrls).map(([lang, url]) => (
))}
{/* Вміст сторінки */}
{/* Ваш вміст сторінки тут */}
{metadata.title}
{/* Генерує теги hreflang для SEO */}
{Object.entries(multilingualUrls).map(([lang, url]) => (
))}
{/* Вміст сторінки */}
{/* Тут розмістіть вміст сторінки */}
);
};
const getStaticProps = async ({ params }) => {
const locale = params?.locale;
const t = (content) => getTranslation(content, locale);
const metadata = {
title: t({
uk: "Мій заголовок",
en: "My title",
fr: "Mon titre",
es: "Mi título",
}),
description: t({
uk: "Мій опис",
en: "My description",
fr: "Ma description",
es: "Mi descripción",
}),
};
const multilingualUrls = getMultilingualUrls("/");
return {
props: {
locale,
metadata,
multilingualUrls,
},
};
};
module.exports = {
getStaticProps,
getStaticPaths,
default: HomePage,
};
// ... Решта коду, включно з getStaticPaths
```
> Дізнайтеся більше про оптимізацію метаданих [в офіційній документації Next.js](https://nextjs.org/docs/pages/building-your-application/optimizing/metadata).
### (Необов'язково) Крок 9: Змініть мову вашого вмісту
Щоб змінити мову вашого вмісту в Next.js, рекомендовано використовувати компонент `Link` для перенаправлення користувачів на відповідну локалізовану сторінку. Компонент `Link` дає змогу передзавантажувати (prefetch) сторінку, що допомагає уникнути повного перезавантаження сторінки.
```tsx fileName="src/components/LanguageSwitcher.tsx" codeFormat="typescript"
import {
Locales,
getHTMLTextDir,
getLocaleName,
getLocalizedUrl,
} from "intlayer";
import { useLocalePageRouter } from "next-intlayer";
import { type FC } from "react";
import Link from "next/link";
const LocaleSwitcher: FC = () => {
const { locale, pathWithoutLocale, availableLocales } = useLocalePageRouter();
return (
{availableLocales.map((localeItem) => (
setLocale(localeItem)}
>
{/* Локаль — наприклад FR */}
{localeItem}
{/* Мова у власній локалі — наприклад Français */}
{getLocaleName(localeItem, locale)}
{/* Мова в поточній локалі — наприклад Francés, коли поточна локаль встановлена на Locales.SPANISH */}
{getLocaleName(localeItem)}
{/* Мова англійською — наприклад French */}
{getLocaleName(localeItem, Locales.ENGLISH)}
))}
{availableLocales.map((localeItem) => (
setLocale(localeItem)}
>
{/* Локаль - наприклад FR */}
{localeItem}
{/* Мова в власній локалі - наприклад Français */}
{getLocaleName(localeItem, locale)}
{/* Мова в поточній локалі — наприклад, Francés при поточній локалі Locales.SPANISH */}
{getLocaleName(localeItem)}
{/* Мова англійською — наприклад, French */}
{getLocaleName(localeItem, Locales.ENGLISH)}
))}