Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту
Історія версій
- "Оновлення використання API useIntlayer у Solid для прямого доступу до властивостей"v8.9.004.05.2026
- "Додано команду `init`"v7.5.930.12.2025
- "Додано документацію для хука `useLocale` з опцією `onLocaleChange`"v6.2.009.10.2025
- "Додано документацію для функції `getLocale` у server actions"v5.6.602.10.2025
- "Додано документацію для хелпера `multipleMiddlewares`"v5.6.222.09.2025
- "Перетворено функцію `withIntlayer()` на функцію, що повертає Promise"v5.6.006.07.2025
- "Ініціалізовано історію"v5.5.1029.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 14 та App Router за допомогою Intlayer | Інтернаціоналізація (i18n)
Зміст
Чому варто обрати 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
Дивіться Шаблон додатку на GitHub.
Встановіть залежності
Встановіть необхідні пакети за допомогою npm:
bashКопіювати кодСкопіюйте код у буфер обміну
npm install intlayer next-intlayernpx intlayer initintlayer
Основний пакет, який надає інструменти інтернаціоналізації для керування конфігурацією, перекладу, оголошення вмісту, транспіляції та команд CLI.
next-intlayer
Пакет, що інтегрує Intlayer з Next.js. Він надає провайдери контексту та хуки для інтернаціоналізації в Next.js. Також включає плагін Next.js для інтеграції Intlayer з Webpack або Turbopack, а також middleware для визначення переважної локалі користувача, керування cookies та обробки перенаправлень URL.
Налаштуйте свій проєкт
Here is the final structure that we will make:
bashКопіювати кодСкопіюйте код у буфер обміну
.├── src│ ├── app│ │ ├── [locale]│ │ │ ├── layout.tsx # Locale layout for the Intlayer provider│ │ │ ├── page.content.ts│ │ │ └── page.tsx│ │ └── layout.tsx # Root layout for style and global providers│ ├── components│ │ ├── client-component-example.content.ts│ │ ├── ClientComponentExample.tsx│ │ ├── LocaleSwitcher│ │ │ ├── localeSwitcher.content.ts│ │ │ └── LocaleSwitcher.tsx│ │ ├── server-component-example.content.ts│ │ └── ServerComponentExample.tsx│ └── middleware.ts├── intlayer.config.ts├── next.config.ts├── package.json└── tsconfig.jsonIf you don't want locale routing, intlayer can be used as a simple provider / hook. See this guide for more details.
Створіть файл конфігурації для налаштування мов вашого застосунку:
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-адреси, перенаправлення в middleware, імена cookie, розташування та розширення ваших декларацій контенту, вимикати логи Intlayer у консолі та інше. Для повного списку доступних параметрів див. документацію з конфігурації.
Інтеграція Intlayer у конфігурацію Next.js
Налаштуйте Next.js для використання Intlayer:
next.config.mjsКопіювати кодСкопіюйте код у буфер обміну
import { withIntlayer } from "next-intlayer/server";/** @type {import('next').NextConfig} */const nextConfig = {};export default withIntlayer(nextConfig);Плагін Next.js
withIntlayer()використовується для інтеграції Intlayer з Next.js. Він забезпечує побудову файлів декларацій контенту та відслідковує їх у режимі розробки. Він визначає змінні середовища Intlayer у середовищах Webpack або Turbopack. Додатково він надає aliases для оптимізації продуктивності та забезпечує сумісність із серверними компонентами.Функція
withIntlayer()повертає проміс. Якщо ви хочете використовувати її з іншими плагінами, ви можете дочекатися її виконання за допомогою await. Приклад:tsxКопіювати кодСкопіюйте код у буфер обміну
const nextConfig = await withIntlayer(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;Налаштування middleware для виявлення локалі
Налаштуйте middleware, щоб виявляти переважну локаль користувача:
src/middleware.tsКопіювати кодСкопіюйте код у буфер обміну
export { intlayerMiddleware as middleware } from "next-intlayer/middleware"; export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)", };intlayerMiddlewareвикористовується для виявлення пріоритетної локалі користувача та перенаправлення його на відповідний URL згідно з конфігурацією. Додатково, воно дозволяє зберігати пріоритетну локаль користувача в cookie.Налаштуйте параметр
matcher, щоб він відповідав маршрутам вашого застосунку. Для детальнішої інформації зверніться до документації Next.js щодо конфігурації matcher.Якщо потрібно послідовно виконувати кілька middleware (наприклад,
intlayerMiddlewareразом із автентифікацією або кастомними middleware), Intlayer тепер надає хелпер під назвоюmultipleMiddlewares.tsКопіювати кодСкопіюйте код у буфер обміну
import { multipleMiddlewares, intlayerMiddleware,} from "next-intlayer/middleware";import { customMiddleware } from "@utils/customMiddleware";export const middleware = multipleMiddlewares([ intlayerMiddleware, customMiddleware,]);Визначте динамічні маршрути локалі
Видаліть усе з
RootLayoutта замініть наступним кодом:src/app/layout.tsxКопіювати кодСкопіюйте код у буфер обміну
import type { PropsWithChildren, FC } from "react"; import "./globals.css"; const RootLayout: FC<PropsWithChildren> = ({ children }) => ( // Ви все ще можете обгорнути children іншими providers, такими як `next-themes`, `react-query`, `framer-motion` тощо. <>{children}</> ); export default RootLayout;Залишаючи компонент
RootLayoutпорожнім, ви можете встановити атрибутиlangтаdirдля тегу<html>.Щоб реалізувати динамічну маршрутизацію, вкажіть шлях для локалі, додавши новий layout у вашу директорію
[locale]:src/app/[locale]/layout.tsxКопіювати кодСкопіюйте код у буфер обміну
import { type Next14LayoutIntlayer, IntlayerClientProvider, } from "next-intlayer"; import { Inter } from "next/font/google"; import { getHTMLTextDir } from "intlayer"; const inter = Inter({ subsets: ["latin"] }); const LocaleLayout: Next14LayoutIntlayer = ({ children, params: { locale }, }) => ( <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у вашому браузері. Щоб встановити локаль за замовчуванням як кореневу сторінку, зверніться до налаштуванняmiddlewareу кроці 4.Тоді реалізуйте функцію
generateStaticParamsу Layout вашого застосунку.src/app/[locale]/layout.tsxКопіювати кодСкопіюйте код у буфер обміну
export { generateStaticParams } from "next-intlayer"; // Рядок для вставки const LocaleLayout: Next14LayoutIntlayer = ({ children, params: { locale }, }) => { /*... Решта коду */ }; export default LocaleLayout;generateStaticParamsгарантує, що ваш застосунок попередньо збудує необхідні сторінки для всіх локалей (locales), зменшуючи обчислення під час виконання і покращуючи досвід користувача. Для детальнішої інформації зверніться до документації Next.js щодо generateStaticParams.Оголосіть ваш контент
Створіть і керуйте деклараціями контенту, щоб зберігати переклади:
src/app/[locale]/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}).Для докладніших відомостей зверніться до документації щодо декларацій контенту.
Використання контенту у вашому коді
Отримуйте доступ до своїх словників контенту в усьому застосунку:
src/app/[locale]/page.tsxКопіювати кодСкопіюйте код у буфер обміну
import { ClientComponentExample } from "@components/ClientComponentExample"; import { ServerComponentExample } from "@components/ServerComponentExample"; import { type Next14PageIntlayer } from "next-intlayer"; import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server"; const Page: Next14PageIntlayer = ({ params: { locale } }) => { const content = useIntlayer("page", locale); return ( <> <p> {content.getStarted.main} <code>{content.getStarted.pageLink}</code> </p> <IntlayerServerProvider locale={locale}> <ServerComponentExample /> <ClientComponentExample /> </IntlayerServerProvider> </> ); }; export default Page;IntlayerClientProviderвикористовується для надання локалі компонентам на боці клієнта. Його можна розмістити в будь-якому батьківському компоненті, включно з layout. Проте рекомендується розміщувати його в layout, оскільки Next.js ділить код layout між сторінками, що робить це більш ефективним. ВикористовуючиIntlayerClientProviderу layout, ви уникаєте повторної ініціалізації на кожній сторінці, покращуєте продуктивність і підтримуєте послідовний контекст локалізації в усьому додатку.IntlayerServerProviderвикористовується для надання локалі серверним дочірнім елементам. Його не можна встановлювати в layout.Layout and page cannot share a common server context because the server context system is based on a per-request data store (via React’s cache mechanism), causing each “context” to be re-created for different segments of the application. Placing the provider in a shared layout would break this isolation, preventing the correct propagation of the server context values to your server components. Layout and page cannot share a common server context because the server context system is based on a per-request data store (via React’s cache mechanism), causing each “context” to be re-created for different segments of the application. Placing the provider in a shared layout would break this isolation, preventing the correct propagation of the server context values to your server components.
src/components/ClientComponentExample.tsxКопіювати кодСкопіюйте код у буфер обміну
"use client"; import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; 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"; const ServerComponentExample: FC = () => { const content = useIntlayer("server-component-example"); // Створення декларації пов'язаного контенту return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };Якщо ви хочете використати свій контент в атрибуті типу
string, наприклад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, зверніться до документації.Інтернаціоналізація метаданих
Необов'язковоЯкщо ви хочете інтернаціоналізувати свої метадані, наприклад заголовок сторінки, ви можете використати функцію
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({ 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", }), }, } 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 { LocalParams } from "next-intlayer"; export const generateMetadata = ({ params: { locale }, }: LocalParams): Metadata => { 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 { LocalParams } from "next-intlayer"; export const generateMetadata = ({ params: { locale }, }: LocalParams): Metadata => { const t = <T>(content: IConfigLocales<T>) => getTranslation(content, locale); return { title: t<string>({ uk: "Мій заголовок", en: "My title", fr: "Mon titre", es: "Mi título", }), description: t({ uk: "Мій опис", en: "My description", fr: "Ma description", es: "Mi descripción", }), }; }; // ... Решта кодуДізнайтеся більше про оптимізацію метаданих в офіційній документації Next.js: on the official Next.js documentation.
Інтернаціоналізація вашого sitemap.xml та robots.txt
Необов'язковоЩоб інтернаціоналізувати ваші файли
sitemap.xmlтаrobots.txt, ви можете використовувати функціюgetMultilingualUrls, надану Intlayer. Ця функція дозволяє генерувати багатомовні URL-адреси для вашого sitemap.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;Дізнайтеся більше про оптимізацію sitemap у офіційній документації Next.js. Дізнайтеся більше про оптимізацію robots.txt у офіційній документації Next.js.
Зміна мови вашого контенту
Необов'язковоЩоб змінити мову вашого контенту в Next.js, рекомендований спосіб, використовувати компонент
Linkдля перенаправлення користувачів на відповідну локалізовану сторінку. КомпонентLinkдозволяє попередньо завантажувати сторінку (prefetch), що допомагає уникнути повного перезавантаження сторінки.src/components/LocaleSwitcher.tsxКопіювати кодСкопіюйте код у буфер обміну
"use client"; import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocale } from "next-intlayer"; import { type FC } from "react"; import Link from "next/link"; 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)} hrefLang={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. Ця функція не дозволяє prefetching сторінки. Див. документацію хуку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)}>Change to French</button>);Посилання на документацію:
Створення локалізованого компоненту `Link`
Необов'язковоЩоб переконатися, що навігація вашого застосунку відповідає поточній локалі, ви можете створити власний компонент
Link. Цей компонент автоматично додає префікс поточної мови до внутрішніх URL-адрес, так що. Наприклад, коли франкомовний користувач натисне на посилання на сторінку "About", він буде перенаправлений на/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 { forwardRef, PropsWithChildren, type ForwardedRef } from "react"; /** * Утилітна функція для перевірки, чи є заданий URL зовнішнім. * Якщо URL починається з http:// або https://, він вважається зовнішнім. */ export const checkIsExternalLink = (href?: string): boolean => /^https?:\/\//.test(href ?? ""); /** * Кастомний компонент Link, який адаптує атрибут href залежно від поточної локалі. * Для внутрішніх посилань він використовує `getLocalizedUrl`, щоб додати префікс локалі до URL (наприклад, /fr/about). * Це гарантує, що навігація відбувається в межах одного локального контексту. */ export const Link = forwardRef< HTMLAnchorElement, PropsWithChildren<NextLinkProps> >(({ href, children, ...props }, ref: ForwardedRef<HTMLAnchorElement>) => { 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} ref={ref} {...props}> {children} </NextLink> ); }); Link.displayName = "Link";Як це працює
Виявлення зовнішніх посилань:
Допоміжна функція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використовує каскадну стратегію для визначення локалі користувача:- По-перше, вона перевіряє заголовки запиту на наявність значення локалі, яке могло бути встановлене middleware
- Якщо локалі немає в заголовках, вона шукає локаль, збережену в 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.
Налаштування TypeScript
Intlayer використовує module augmentation, щоб скористатися перевагами TypeScript і зробити вашу codebase більш надійною.


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