Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту
Історія версій
- "Оновлення використання API useIntlayer у Solid для прямого доступу до властивостей"v8.9.004.05.2026
- "Додати команду init"v7.5.930.12.2025
- "Додано згадку про `x-default` в об'єкті `alternates`"v7.0.601.11.2025
- "Ініціалізація історії"v7.0.029.06.2025
Вміст цієї сторінки перекладено за допомогою штучного інтелекту.
Переглянути останню версію оригінального вмісту англійською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 за допомогою 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, а також проксі для визначення пріоритетної локалі користувача, керування файлами cookie та обробки перенаправлення URL.
Налаштуйте свій проєкт
Ось остаточна структура, яку ми створимо:
bashКопіювати кодСкопіюйте код у буфер обміну
.├── src│ ├── app│ │ ├── [locale]│ │ │ ├── layout.tsx # Локальний макет для провайдера Intlayer│ │ │ ├── page.content.ts│ │ │ └── page.tsx│ │ └── layout.tsx # Кореневий макет для стилів та глобальних провайдерів│ ├── components│ │ ├── client-component-example.content.ts│ │ ├── ClientComponentExample.tsx│ │ ├── LocaleSwitcher│ │ │ ├── localeSwitcher.content.ts│ │ │ └── LocaleSwitcher.tsx│ │ ├── server-component-example.content.ts│ │ └── ServerComponentExample.tsx│ └── proxy.ts├── intlayer.config.ts├── next.config.ts├── package.json└── tsconfig.jsonЯкщо ви не хочете використовувати роутинг на основі локалі, intlayer можна використовувати як простий провайдер / хук. Дивіться цей посібник для отримання детальнішої інформації.
Створіть файл конфігурації для налаштування мов вашого додатка:
intlayer.config.tsКопіювати кодСкопіюйте код у буфер обміну
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Ваші інші локалі ], defaultLocale: Locales.ENGLISH, }, }; export default config;Через цей файл конфігурації ви можете налаштувати локалізовані URL-адреси, перенаправлення через проксі, назви файлів cookie, розташування та розширення декларацій вашого контенту, вимкнути логи Intlayer у консолі та багато іншого. Повний список доступних параметрів можна знайти в документації з конфігурації.
Інтегруйте Intlayer у конфігурацію 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. Крім того, він надає аліаси для оптимізації продуктивності та забезпечує сумісність із серверними компонентами.Функція
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 { PropsWithChildren, FC } from "react"; import "./globals.css"; const RootLayout: FC<PropsWithChildren> = ({ children }) => ( // Ви все ще можете обгорнути дочірні елементи іншими провайдерами, наприклад `next-themes`, `react-query`, `framer-motion` тощо. <>{children}</> ); export default RootLayout;Залишення компонента
RootLayoutпорожнім дозволяє встановити атрибутиlangтаdirдля тегу<html>.Щоб реалізувати динамічну маршрутизацію, вкажіть шлях для локалі, додавши новий макет у вашу директорію
[locale]:src/app/[locale]/layout.tsxКопіювати кодСкопіюйте код у буфер обміну
import { type NextLayoutIntlayer, IntlayerClientProvider } from "next-intlayer"; import { Inter } from "next/font/google"; import { getHTMLTextDir } from "intlayer"; const inter = Inter({ subsets: ["latin"] }); const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => { const { locale } = await params; return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <body className={inter.className}> <IntlayerClientProvider locale={locale}> {children} </IntlayerClientProvider> </body> </html> ); }; export default LocaleLayout;Сегмент шляху
[locale]використовується для визначення локалі. Приклад:/en-US/aboutпосилатиметься наen-US, а/fr/about, наfr.На цьому етапі ви зіткнетеся з помилкою:
Error: Missing <html> and <body> tags in the root layout.. Це очікувано, оскільки файл/app/page.tsxбільше не використовується і його можна видалити. Замість цього сегмент шляху[locale]активує сторінку/app/[locale]/page.tsx. Отже, сторінки будуть доступні за такими шляхами, як/en,/fr,/esу вашому браузері. Щоб встановити локаль за замовчуванням як кореневу сторінку, зверніться до налаштуванняproxyна кроці 7.Потім реалізуйте функцію
generateStaticParamsу макеті вашого додатка.src/app/[locale]/layout.tsxКопіювати кодСкопіюйте код у буфер обміну
export { generateStaticParams } from "next-intlayer"; // Рядок для вставки const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => { /*... Решта коду*/ }; export default LocaleLayout;generateStaticParamsгарантує, що ваш додаток попередньо збирає необхідні сторінки для всіх локалей, зменшуючи обчислення під час виконання та покращуючи взаємодію з користувачем. Для отримання додаткової інформації зверніться до документації Next.js щодо generateStaticParams.Intlayer працює з
export const dynamic = 'force-static';, щоб забезпечити попередню збірку сторінок для всіх локалей.Оголосіть свій контент
Створюйте декларації контенту та керуйте ними для зберігання перекладів:
src/app/[locale]/page.content.tsКопіювати кодСкопіюйте код у буфер обміну
import { t, type Dictionary } from "intlayer"; const pageContent = { key: "page", content: { getStarted: { main: t({ 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/[locale]/page.tsxКопіювати кодСкопіюйте код у буфер обміну
import type { FC } from "react"; import { ClientComponentExample } from "@components/ClientComponentExample"; import { ServerComponentExample } from "@components/ServerComponentExample"; import { type NextPageIntlayer } from "next-intlayer"; import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server"; const PageContent: FC = () => { const content = useIntlayer("page"); return ( <> <p>{content.getStarted.main}</p> <code>{content.getStarted.pageLink}</code> </> ); }; const Page: NextPageIntlayer = async ({ params }) => { const { locale } = await params; return ( <IntlayerServerProvider locale={locale}> <PageContent /> <ServerComponentExample /> <ClientComponentExample /> </IntlayerServerProvider> ); }; export default Page;IntlayerClientProviderвикористовується для надання локалі клієнтським компонентам. Його можна розмістити в будь-якому батьківському компоненті, включаючи макет. Однак рекомендується розміщувати його в макеті, оскільки Next.js спільно використовує код макета між сторінками, що робить його ефективнішим. ВикористовуючиIntlayerClientProviderу макеті, ви уникаєте повторної ініціалізації для кожної сторінки, підвищуючи продуктивність і підтримуючи послідовний контекст локалізації у всьому додатку.IntlayerServerProviderвикористовується для надання локалі серверним дочірнім компонентам. Його не можна встановити в макеті.Макет і сторінка не можуть ділити загальний серверний контекст, оскільки система серверного контексту базується на сховищі даних для кожного запиту (через механізм кешування React), що призводить до повторного створення кожного "контексту" для різних сегментів додатка. Розміщення провайдера в спільному макеті порушить цю ізоляцію, запобігаючи правильному поширенню значень серверного контексту до ваших серверних компонентів.
src/components/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.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, зверніться до документації.Якщо ваш застосунок уже існує, ви можете скористатися Intlayer Compiler у поєднанні з командой extract, щоб перетворити тисячі компонентів за одну секунду.
Налаштуйте проксі для виявлення локалі
Необов'язковоНалаштуйте проксі для виявлення бажаної локалі користувача:
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]);Інтернаціоналізація ваших метаданих
Необов'язковоУ випадку, якщо ви хочете інтернаціоналізувати свої метадані, наприклад заголовок вашої сторінки, ви можете скористатися функцією
generateMetadata, наданою Next.js. Всередині ви можете отримати контент за допомогою функціїgetIntlayer, щоб перекласти ваші метадані.src/app/[locale]/metadata.content.tsКопіювати кодСкопіюйте код у буфер обміну
import { type Dictionary, t } from "intlayer"; import { Metadata } from "next"; const metadataContent = { key: "page-metadata", content: { title: t({ en: "Create Next App", fr: "Créer une application Next.js", es: "Crear una aplicación Next.js", }), description: t({ en: "Generated by create next app", fr: "Généré par create next app", es: "Generado por create next app", }), }, } satisfies Dictionary<Metadata>; export default metadataContent;src/app/[locale]/layout.tsx or src/app/[locale]/page.tsxКопіювати кодСкопіюйте код у буфер обміну
import { getIntlayer, getMultilingualUrls } from "intlayer"; import type { Metadata } from "next"; import type { LocalPromiseParams } from "next-intlayer"; export const generateMetadata = async ({ params, }: LocalPromiseParams): Promise<Metadata> => { const { locale } = await params; const metadata = getIntlayer("page-metadata", locale); /** * Генерує об'єкт, що містить усі URL-адреси для кожної локалі. * * Приклад: * ```ts * getMultilingualUrls('/about'); * * // Повертає * // { * // en: '/about', * // fr: '/fr/about', * // es: '/es/about', * // } * ``` */ const multilingualUrls = getMultilingualUrls("/"); const localizedUrl = multilingualUrls[locale as keyof typeof multilingualUrls]; return { ...metadata, alternates: { canonical: localizedUrl, languages: { ...multilingualUrls, "x-default": "/" }, }, openGraph: { url: localizedUrl, }, }; }; // ... Решта кодуЗверніть увагу, що функція
getIntlayer, імпортована зnext-intlayer, повертає ваш контент, загорнутий вIntlayerNode, що дозволяє інтеграцію з візуальним редактором. На відміну від неї, функціяgetIntlayer, імпортована зintlayer, повертає ваш контент безпосередньо без додаткових властивостей.Як варіант, ви можете скористатися функцією
getTranslationдля оголошення своїх метаданих. Однак для автоматизації перекладу метаданих та подальшої екстерналізації контенту рекомендується використовувати файли декларації контенту.src/app/[locale]/layout.tsx or src/app/[locale]/page.tsxКопіювати кодСкопіюйте код у буфер обміну
import { type IConfigLocales, getTranslation, getMultilingualUrls, } from "intlayer"; import type { Metadata } from "next"; import type { LocalPromiseParams } from "next-intlayer"; export const generateMetadata = async ({ params, }: LocalPromiseParams): Promise<Metadata> => { const { locale } = await params; const t = <T>(content: IConfigLocales<T>) => getTranslation(content, locale); return { title: t<string>({ en: "My title", fr: "Mon titre", es: "Mi título", }), description: t({ en: "My description", fr: "Ma description", es: "Mi descripción", }), }; }; // ... Решта кодуДізнайтеся більше про оптимізацію метаданих в офіційній документації Next.js.
Інтернаціоналізація ваших sitemap.xml та robots.txt
Необов'язковоЩоб інтернаціоналізувати ваші
sitemap.xmlтаrobots.txt, ви можете скористатися функцієюgetMultilingualUrls, наданою Intlayer. Ця функція дозволяє генерувати багатомовні URL-адреси для вашої карти сайту.src/app/sitemap.tsКопіювати кодСкопіюйте код у буфер обміну
import { getMultilingualUrls } from "intlayer"; import type { MetadataRoute } from "next"; const sitemap = (): MetadataRoute.Sitemap => [ { url: "https://example.com", alternates: { languages: { ...getMultilingualUrls("https://example.com"), "x-default": "https://example.com", }, }, }, { url: "https://example.com/login", alternates: { languages: { ...getMultilingualUrls("https://example.com/login"), "x-default": "https://example.com/login", }, }, }, { url: "https://example.com/register", alternates: { languages: { ...getMultilingualUrls("https://example.com/register"), "x-default": "https://example.com/register", }, }, }, ]; export default sitemap;src/app/robots.tsКопіювати кодСкопіюйте код у буфер обміну
import type { MetadataRoute } from "next"; import { getMultilingualUrls } from "intlayer"; const getAllMultilingualUrls = (urls: string[]) => urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]); const robots = (): MetadataRoute.Robots => ({ rules: { userAgent: "*", allow: ["/"], disallow: getAllMultilingualUrls(["/login", "/register"]), }, host: "https://example.com", sitemap: `https://example.com/sitemap.xml`, }); export default robots;Дізнайтеся більше про оптимізацію карти сайту в офіційній документації Next.js. Дізнайтеся більше про оптимізацію robots.txt в офіційній документації Next.js.
Зміна мови вашого контенту
Необов'язковоЩоб змінити мову вашого контенту в Next.js, рекомендованим способом є використання компонента
Linkдля перенаправлення користувачів на відповідну локалізовану сторінку. КомпонентLinkдозволяє попередньо завантажувати сторінку, що допомагає уникнути повного перезавантаження сторінки.src/components/LocaleSwitcher.tsxКопіювати кодСкопіюйте код у буфер обміну
"use client"; import type { FC } from "react"; import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocale } from "next-intlayer"; import Link from "next/link"; export const LocaleSwitcher: FC = () => { const { locale, pathWithoutLocale, availableLocales, setLocale } = useLocale(); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <Link href={getLocalizedUrl(pathWithoutLocale, localeItem)} key={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={() => setLocale(localeItem)} replace // Це гарантує, що кнопка "назад" у браузері перенаправлятиме на попередню сторінку > <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> </Link> ))} </div> </div> ); };Альтернативним способом є використання функції
setLocale, наданої хукомuseLocale. Ця функція не дозволяє попередньо завантажувати сторінку. Дивіться документацію хукаuseLocaleдля отримання детальнішої інформації.Ви також можете встановити функцію в опції
onLocaleChange, щоб викликати кастомну функцію при зміні локалі.src/components/LocaleSwitcher.tsxКопіювати кодСкопіюйте код у буфер обміну
"use client";import { useRouter } from "next/navigation";import { useLocale } from "next-intlayer";import { getLocalizedUrl } from "intlayer";// ... Решта кодуconst router = useRouter();const { setLocale } = useLocale({ onLocaleChange: (locale) => { router.push(getLocalizedUrl(pathWithoutLocale, locale)); },});return ( <button onClick={() => setLocale(Locales.FRENCH)}> Переключити на французьку </button>);Посилання на документацію:
Створення локалізованого компонента Link
Необов'язковоЩоб навигація вашого додатка відповідала поточній локалі, ви можете створити кастомний компонент
Link. Цей компонент автоматично додає префікс поточної мови до внутрішніх URL-адрес. Наприклад, коли франкомовний користувач натискає на посилання на сторінку "Про нас", він перенаправляється на/fr/aboutзамість/about.Ця поведінка корисна з кількох причин:
- SEO та досвід користувача: Локалізовані URL-адреси допомагають пошуковим системам правильно індексувати сторінки на певних мовах і надають користувачам контент на їхній улюбленій мові.
- Послідовність: Використовуючи локалізоване посилання у всьому додатку, ви гарантуєте, що навігація залишається в межах поточної локалі, запобігаючи несподіваним змінам мови.
- Підтримка: Централізація логіки локалізації в одному компоненті спрощує керування URL-адресами, роблячи ваш код легшим для підтримки та розширення в міру зростання додатка.
Нижче наведено реалізацію локалізованого компонента
Linkна TypeScript:src/components/Link.tsxКопіювати кодСкопіюйте код у буфер обміну
"use client"; import { getLocalizedUrl } from "intlayer"; import NextLink, { type LinkProps as NextLinkProps } from "next/link"; import { useLocale } from "next-intlayer"; import type { PropsWithChildren, FC } from "react"; /** * Допоміжна функція для перевірки, чи є дана URL-адреса зовнішньою. * Якщо URL-адреса починається з http:// або https://, вона вважається зовнішньою. */ export const checkIsExternalLink = (href?: string): boolean => /^https?:\/\//.test(href ?? ""); /** * Кастомний компонент Link, який адаптує атрибут href залежно від поточної локалі. * Для внутрішніх посилань він використовує `getLocalizedUrl`, щоб додати префікс локалі до URL (наприклад, /fr/about). * Це гарантує, що навігація залишається в контексті тієї ж локалі. */ export const Link: FC<PropsWithChildren<NextLinkProps>> = ({ href, children, ...props }) => { const { locale } = useLocale(); const isExternalLink = checkIsExternalLink(href.toString()); // Якщо посилання внутрішнє і вказано валідний href, отримуємо локалізований URL. const hrefI18n: NextLinkProps["href"] = href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href; return ( <NextLink href={hrefI18n} {...props}> {children} </NextLink> ); };Як це працює
Виявлення зовнішніх посилань:
Допоміжна функціяcheckIsExternalLinkвизначає, чи є URL-адреса зовнішньою. Зовнішні посилання залишаються без змін, оскільки вони не потребують локалізації.Отримання поточної локалі:
ХукuseLocaleнадає поточну локаль (наприклад,frдля французької).Локалізація URL-адреси:
Для внутрішніх посилань (тобто не зовнішніх) використовуєтьсяgetLocalizedUrlдля автоматичного додавання префікса поточної локалі до URL. Це означає, що якщо ваш користувач перебуває на французькій версії сайту, передача/aboutякhrefперетворить його на/fr/about.Повернення посилання:
Компонент повертає елемент<a>з локалізованим URL, забезпечуючи відповідність навігації локалі.
Інтегруючи цей компонент
Linkу весь додаток, ви підтримуєте узгоджений та чутливий до мови інтерфейс користувача, а також отримуєте переваги від покращеного SEO та зручності використання.Отримання поточної локалі в 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використовує каскадну стратегію для визначення локалі користувача:- Спочатку вона перевіряє заголовки запиту на наявність значення локалі, яке могло бути встановлено проксі.
- Якщо локаль не знайдена в заголовках, вона шукає локаль, збережену у файлах cookie.
- Якщо файли 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'(у конфігураціїdictionary), вона буде покладатися на Suspense, тому вам доведеться обгорнути ваші викликиuseIntlayerв межуSuspense. Це означає, що ви не зможете використовуватиuseIntlayerбезпосередньо на верхньому рівні вашого компонента Page / Layout.Витягніть вміст ваших компонентів
Необов'язковоЯкщо у вас є існуюча кодова база, перетворення тисяч файлів може зайняти багато часу.
Щоб спростити цей процес, 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
Відстеження змін словників у 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 і зробити вашу кодову базу надійнішою.


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