Автор:
    БозданиС:2026-01-10ПослСднСС обновлСниС:2026-09-06

    Как постфактум ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Next.js многоязычным (i18n руководство 2026)

    Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ (i18n) Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Next.js с самого Π½Π°Ρ‡Π°Π»Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ просто. Но Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Ρƒ вас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅ production-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ языкС, ΠΈ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΠ·Ρ‹Ρ‡Π½Ρ‹ΠΌ постфактум?

    Π‘ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ (next-intl, next-i18next) это прСвращаСтся Π² ΠΊΠΎΡˆΠΌΠ°Ρ€:

    • Поиск Π·Π°Ρ…Π°Ρ€Π΄ΠΊΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… строк Π² сотнях Ρ„Π°ΠΉΠ»ΠΎΠ² JSX/TSX.
    • Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… JSON-словарСй ΠΈ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΡ‹Π²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° (pages.dashboard.header.title).
    • Π—Π°ΠΌΠ΅Π½Π° тСкста Π½Π° Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ…ΡƒΠΊΠΎΠ² (t('...')).
    • ΠŸΠ΅Ρ€Π΅Π½ΠΎΡ всСй ΠΏΠ°ΠΏΠΊΠΈ app/ Π² app/[locale]/..., Ρ‡Ρ‚ΠΎ Π»ΠΎΠΌΠ°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ ΠΈ SEO.

    Π’ 2026 Π³ΠΎΠ΄Ρƒ Π²Π°ΠΌ большС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π‘ Intlayer Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Next.js Π·Π° считанныС ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ благодаря автоматичСскому ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΡŽ, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ИИ ΠΈ Π³ΠΈΠ±ΠΊΠΎΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ.

    Π˜Ρ‰Π΅Ρ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ пошаговоС руководство для Next.js 16 App Router? ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ: Локализация Next.js 16 с Intlayer.

    Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

    Π”ΠΈΠ»Π΅ΠΌΠΌΠ° Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠΈ: ΠΏΠΎΡ‡Π΅ΠΌΡƒ локализация Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ прилоТСния Ρ‚Ρ€ΡƒΠ΄Π½Π°

    Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с трСмя слоТностями:

    1. ΠΠ°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹: Π ΡƒΡ‡Π½ΠΎΠΉ пСрСнос тСкста Π² JSON Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΎΠΊ ΠΏΠΎΡ‡Ρ‚ΠΈ Π²ΠΎ всСх ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ….
    2. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ: ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π² динамичСский сСгмСнт [locale].
    3. Π ΡƒΡ‚ΠΈΠ½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄: ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строк Π½Π° 5-20 языков Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

    Intlayer Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ компилятора, Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… словарСй ΠΈ Π³ΠΈΠ±ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΡƒΡ‚ΠΈΠ½Π³Π°.

    АвтоматичСскоС ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° (Π±Π΅Π· Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ поиска)

    Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ A: CLI-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° извлСчСния (npx intlayer extract)

    ЗапуститС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ извлСчСния прямо Π² вашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅:

    bash
    npx intlayer extract
    

    Команда создаст Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ (.content.ts) рядом с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ.

    Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ B: ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Intlayer (Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π²ΠΎ врСмя сборки)

    ΠŸΠΈΡˆΠΈΡ‚Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ…. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ сам ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΈ сборкС ΠΈ подставит Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅:

    src/app/page.tsx
    // Write normal React code. The compiler extracts the text automatically
    export default function HomePage() {
      return (
        <section>
          <h1>Welcome to our platform</h1>
          <p>Start exploring our modern features today.</p>
        </section>
      );
    }
    

    Под ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ Intlayer создаСт ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΈ связываСт ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ΠΎΠΌ, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π°.

    Π’ этом случаС Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрирован Ρ„Π°ΠΉΠ» src/app/page.content.ts со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:

    src/app/page.content.ts
    import { Dictionary } from "intlayer";
    
    const content = {
      key: "home-page",
      content: {
        welcomeToOurPlatform: t({ en: "Welcome to our platform" }),
        startExploringOurModernFeaturesToday: t({
          en: "Start exploring our modern features today.",
        }),
      },
    };
    
    export default content;
    

    ИИ-ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ с вашСй любимой языковой модСлью

    ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π·Π° сСкунды с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ OpenAI, Anthropic, DeepSeek ΠΈΠ»ΠΈ Mistral:

    bash
    npx intlayer fill
    
    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, Locales.GERMAN],
        defaultLocale: Locales.ENGLISH,
      },
      ai: {
        provider: "openai",
        model: "gpt-4o-mini",
        apiKey: process.env.OPENAI_API_KEY,
        applicationContext: "SaaS панСль для продуктивности ΠΈ совмСстной Ρ€Π°Π±ΠΎΡ‚Ρ‹",
      },
    };
    
    export default config;
    

    Команда npx intlayer fill автоматичСски Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°ΠΌΠΈ для всСх настроСнных Π»ΠΎΠΊΠ°Π»Π΅ΠΉ ваши Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ .content.ts:

    src/app/page.content.ts
    import { Dictionary } from "intlayer";
    
    const content = {
      key: "home-page",
      content: {
        welcomeToOurPlatform: t({
          en: "Welcome to our platform",
          fr: "Bienvenue sur notre plateforme",
          es: "Bienvenido a nuestra plataforma",
          ru: "Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π½Π°ΡˆΡƒ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ",
        }),
        startExploringOurModernFeaturesToday: t({
          en: "Start exploring our modern features today.",
          fr: "Découvrez nos fonctionnalités modernes dès aujourd'hui.",
          es: "Comience a explorar nuestras funciones modernas hoy.",
          ru: "НачнитС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ соврСмСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠΆΠ΅ сСгодня.",
        }),
      },
    };
    
    export default content;
    

    ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Intlayer ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ высокоуровнСвый applicationContext Π² LLM, сгСнСрированныС ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ тСхничСскиС Π½ΡŽΠ°Π½ΡΡ‹, голос Π±Ρ€Π΅Π½Π΄Π° ΠΈ грамматичСский контСкст Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ инструмСнты машинного ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°.

    Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° строка Π½Π΅ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π° ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½:

    bash
    npx intlayer test
    

    ΠœΡƒΠ»ΡŒΡ‚ΠΈΡΠ·Ρ‹Ρ‡Π½Π°Ρ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ Π±Π΅Π· смСны URL

    Intlayer ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚:

    • ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ запроса / Cookies (search-params): БохраняйтС структуру /app/page.tsx Π±Π΅Π· создания ΠΏΠ°ΠΏΠΊΠΈ [locale].
    • ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ (prefix / prefix-all-locales): ΠŸΡ€ΠΎΡΡ‚Π°Ρ настройка прСфиксов для SEO.

    НастройтС ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с Next.js Π·Π° считанныС сСкунды:

    next.config.ts
    import type { NextConfig } from "next";
    import { withIntlayer } from "next-intlayer/server";
    
    const nextConfig: NextConfig = {/* Your existing Next.js config */};
    
    export default withIntlayer(nextConfig);
    

    ΠžΠ±Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ layout Π² IntlayerProvider:

    src/app/layout.tsx
    import type { ReactNode } from "react";
    import { IntlayerProvider } from "next-intlayer";
    import { getLocale } from "next-intlayer/server";
    import { getHTMLTextDir } from "intlayer";
    
    export default async function RootLayout({
      children,
    }: {
      children: ReactNode;
    }) {
      const locale = await getLocale();
    
      return (
        <html lang={locale} dir={getHTMLTextDir(locale)}>
          <body>
            <IntlayerProvider defaultLocale={locale}>{children}</IntlayerProvider>
          </body>
        </html>
      );
    }
    

    ΠœΡƒΠ»ΡŒΡ‚ΠΈΡΠ·Ρ‹Ρ‡Π½Ρ‹ΠΉ SEO

    АвтоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Ρ‚Π΅Π³ΠΈ hreflang для глобальной видимости:

    src/app/page.tsx
    import type { Metadata } from "next";
    import { getLocale } from "next-intlayer/server";
    import { getIntlayer } from "intlayer";
    
    export const generateMetadata = async (): Promise<Metadata> => {
      const locale = await getLocale();
      const content = getIntlayer("home-page-metadata", locale);
    
      return {
        title: content.title,
        description: content.description,
      };
    };
    

    ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€: Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ пошаговой настройкС?

    Полная тСхничСская докумСнтация с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ middleware, SSG (generateStaticParams) ΠΈ Server Components доступна Π² руководствС:

    πŸ‘‰ ПолноС руководство ΠΏΠΎ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Next.js 16 с Intlayer

    Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы (FAQ)

    Π”Π°. Intlayer ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ search-params ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ языка ΠΏΠΎ cookies/Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ Π±Π΅Π· измСнСния структуры ΠΏΠ°ΠΏΠΎΠΊ.

    НСт. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° npx intlayer extract ΠΈΠ»ΠΈ компилятор Intlayer автоматичСски ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ тСкст.

    Благодаря ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΉ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ ΠΈ ΠΌΠ°ΠΊΡ€ΠΎ-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎ врСмя сборки.

    Π”Π°, ΠΊΠΎΠΌΠ°Π½Π΄Π° npx intlayer fill ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ LLM для контСкстного ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½Π° Π»ΡŽΠ±Ρ‹Π΅ языки.

    ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

    Пока Π½Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². Π‘ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΡ‚ΠΎ подСлится своими мыслями.

    ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ сообщСния

    ПослСдниС сообщСния