Strona głównaPiaskownicaPrezentacjaAplikacjaDokumentacjaBlog
    • Englishangielski
      EN
    • русскийrosyjski
      RU
    • 日本語japoński
      JA
    • françaisfrancuski
      FR
    • 한국어koreański
      KO
    • 中文chiński
      ZH
    • españolhiszpański
      ES
    • Deutschniemiecki
      DE
    • العربيةarabski
      AR
    • italianowłoski
      IT
    • British Englishangielski brytyjski
      EN-GB
    • portuguêsportugalski
      PT
    • हिन्दीhindi
      HI
    • Türkçeturecki
      TR
    • polskipolski
      PL
    • Indonesiaindonezyjski
      ID
    • Tiếng Việtwietnamski
      VI
    • українськаukraiński
      UK
    /
    Filtruj dokumenty według frameworka
    Alt+←
    Dlaczego Intlayer?
    Zacząć
    Koncepcja
    • Jak działa Intlayer
    • Konfiguracja
    • TestFillBuildWatchExtractLoginPushPullConfigurationListVersionEditorLiveDebugDoc ReviewDoc TranslateSDK
    • Edytor wizualny
    • CMS
    • Integracja CI/CD
    • TłumaczenieLiczba mnogaWyliczenieWarunekPłećWstawieniePlikZagnieżdżanieMarkdownHTMLPobieranie funkcji
    • Plik dla każdej lokalizacji
    • Kompilator
    • Automatyczne wypełnianie
    • Testowanie
    • Optymalizacja pakietu
    Środowisko
    • Next.js 14 i App Router
      Next.js 15
      Next.js bez locale URL
      Next.js dan Page Router
      Kompilator
    • Tanstack Start Solid
    • Astro dan React
      Astro dan Svelte
      Astro dan Vue
      Astro dan Solid
      Astro dan Preact
      Astro dan Lit
      Astro dan Vanilla JS
    • React Router v7
      React Router v7 (fs-routes)
      Compiler
    • Nuxt dan Vue
    • Vite dan Solid
    • SvelteKit
    • Vite dan Preact
    • Vite dan Vanilla JS
    • Vite dan Lit
    • Angular 19 (Webpack)
      Analog
    • React CRA
    • React Native dan Expo
    • Express.js
      NestJS
      Fastify
      Hono
      Adonis
    • Lynx dan React
    Plugins
    • JSON
    • gettext (.po)
    Rozszerzenie VS Code
    Agent
    • Serwer MCP
    • Umiejętności agenta
    Wersje
    • v8
    • v7
    • v6
    Benchmark
    • Next.js
    • TanStack
    • Vue
    • Solid
    • Svelte
    Blog
    Zadaj pytanie
    1. Documentation
    2. Środowisko
    3. Next.js
    Data utworzenia:2024-12-06Ostatnia aktualizacja:2026-05-06
    Zobacz szablon aplikacji na GitHubie

    Na tej stronie dostępny jest szablon aplikacji.

    Zobacz aplikację pokazową

    Ta strona prowadzi do działającej demonstracji szablonu.

    Obejrzyj samouczek wideo

    Na tej stronie dostępny jest samouczek wideo.

    Prześlij ten dokument do swojego ulubionego asystenta AI
    ChatGPT
    Claude
    DeepSeek
    Google AI mode
    Gemini
    Perplexity
    Mistral
    Grok

    Zadaj pytanie i otrzymaj streszczenie dokumentu, odwołując się do tej strony i wybranego dostawcy AI

    Historia wersji

    1. "Aktualizacja użycia API useIntlayer w Solid do bezpośredniego dostępu do właściwości"
      v8.9.04.05.2026
    2. "Dodaj polecenie init"
      v7.5.930.12.2025
    3. "Dodano wzmiankę o `x-default` w obiekcie `alternates`"
      v7.0.61.11.2025
    4. "Inicjalizacja historii"
      v7.0.029.06.2025

    Treść tej strony została przetłumaczona przy użyciu sztucznej inteligencji.

    Zobacz ostatnią wersję oryginalnej treści w języku angielskim
    Edytuj tę dokumentację

    Jeśli masz pomysł na ulepszenie tej dokumentacji, zachęcamy do przesłania pull requesta na GitHubie.

    Link do dokumentacji na GitHubie
    Kopiuj

    Kopiuj dokument Markdown do schowka

    Przetłumacz swoją stronę Next.js 16 za pomocą Intlayer | Internacjonalizacja (i18n)

    www.youtube.com
    ide.intlayer.org
    intlayer-next-16-template.vercel.app

    Zobacz Szablon aplikacji na GitHubie.

    Spis treści

    Czym jest Intlayer?

    Intlayer to innowacyjna, otwartoźródłowa biblioteka do internacjonalizacji (i18n), zaprojektowana w celu uproszczenia obsługi wielojęzyczności we współczesnych aplikacjach internetowych. Intlayer bezproblemowo integruje się z najnowszym frameworkiem Next.js 16, w tym z jego potężnym App Router. Jest zoptymalizowany do pracy z Server Components dla efektywnego renderowania i jest w pełni kompatybilny z Turbopack.

    Dzięki Intlayer możesz:

    • Łatwo zarządzać tłumaczeniami za pomocą deklaratywnych słowników na poziomie komponentu.
    • Dynamicznie lokalizować metadane, trasy i zawartość.
    • Uzyskać dostęp do tłumaczeń zarówno w komponentach po stronie klienta, jak i serwera.
    • Zapewnić wsparcie dla TypeScript dzięki automatycznie generowanym typom, co poprawia autouzupełnianie i wykrywanie błędów.
    • Korzystać z zaawansowanych funkcji, takich jak dynamiczne wykrywanie i przełączanie lokalizacji.

    Intlayer jest kompatybilny z Next.js 12, 13, 14 i 16. Jeśli używasz Next.js Page Router, możesz odnieść się do tego przewodnika. Routing lokalizacji jest przydatny dla SEO, rozmiaru pakietu i wydajności. Jeśli go nie potrzebujesz, możesz odnieść się do tego przewodnika. Dla Next.js 12, 13, 14 z App Router, odnieś się do tego przewodnika.


    Przewodnik krok po kroku, jak skonfigurować Intlayer w aplikacji Next.js

    Krok 1: Zainstaluj zależności

    Zainstaluj niezbędne pakiety za pomocą npm:

    bash
    Kopiuj kod

    Skopiuj kod do schowka

    npm install intlayer next-intlayernpx intlayer init
    • intlayer

      Podstawowy pakiet, który dostarcza narzędzia do internacjonalizacji dla zarządzania konfiguracją, tłumaczeń, deklaracji treści, transpilacji oraz poleceń CLI.

    • next-intlayer

      Pakiet integrujący Intlayer z Next.js. Dostarcza dostawców kontekstu oraz hooki do internacjonalizacji w Next.js. Dodatkowo zawiera wtyczkę Next.js do integracji Intlayer z Webpack lub Turbopack, a także proxy do wykrywania preferowanego języka użytkownika, zarządzania ciasteczkami oraz obsługi przekierowań URL.

    Krok 2: Skonfiguruj swój projekt

    Oto ostateczna struktura, którą stworzymy:

    bash
    Kopiuj kod

    Skopiuj kod do schowka

    .├── src│   ├── app│   │   ├── [locale]│   │   │   ├── layout.tsx            # Układ lokalizacji dla dostawcy Intlayer│   │   │   ├── page.content.ts│   │   │   └── page.tsx│   │   └── layout.tsx                # Główny układ dla stylów i globalnych dostawców│   ├── 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
    Jeśli nie chcesz routingu lokalizacji, intlayer może być używany jako prosty dostawca / hook. Zobacz ten przewodnik po więcej szczegółów.

    Utwórz plik konfiguracyjny, aby skonfigurować języki swojej aplikacji:

    intlayer.config.ts
    Kopiuj kod

    Skopiuj kod do schowka

    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [
          Locales.ENGLISH,
          Locales.FRENCH,
          Locales.SPANISH,
          // Twoje pozostałe lokalizacje
        ],
        defaultLocale: Locales.ENGLISH,
      },
    };
    
    export default config;
    Dzięki temu plikowi konfiguracyjnemu możesz ustawić lokalizowane adresy URL, przekierowania proxy, nazwy ciasteczek, lokalizację i rozszerzenie deklaracji zawartości, wyłączyć logi Intlayer w konsoli i wiele więcej. Pełną listę dostępnych parametrów znajdziesz w dokumentacji konfiguracji.

    Krok 3: Zintegruj Intlayer w konfiguracji Next.js

    Skonfiguruj swoje środowisko Next.js, aby korzystało z Intlayer:

    next.config.ts
    Kopiuj kod

    Skopiuj kod do schowka

    import type { NextConfig } from "next";
    import { withIntlayer } from "next-intlayer/server";
    
    const nextConfig: NextConfig = {
      /* opcje konfiguracji tutaj */
    };
    
    export default withIntlayer(nextConfig);
    Wtyczka Next.js withIntlayer() służy do integracji Intlayer z Next.js. Zapewnia budowanie plików deklaracji treści oraz monitoruje je w trybie deweloperskim. Definiuje zmienne środowiskowe Intlayer w środowiskach Webpack lub Turbopack. Dodatkowo dostarcza aliasy optymalizujące wydajność oraz zapewnia kompatybilność z komponentami serwerowymi.

    Funkcja withIntlayer() jest funkcją zwracającą obietnicę. Pozwala przygotować słowniki Intlayer przed rozpoczęciem budowania. Jeśli chcesz użyć jej z innymi wtyczkami, możesz na nią zaczekać (await). Przykład:

    ts
    Kopiuj kod

    Skopiuj kod do schowka

    const nextConfig = await withIntlayer(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;

    Jeśli chcesz używać tego synchronicznie, możesz użyć funkcji withIntlayerSync(). Przykład:

    ts
    Kopiuj kod

    Skopiuj kod do schowka

    const nextConfig = withIntlayerSync(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;

    Intlayer automatycznie wykrywa, czy Twój projekt używa webpack czy Turbopack na podstawie flag wiersza poleceń --webpack, --turbo lub --turbopack, a także bieżącej wersji Next.js.

    Od wersji next>=16, jeśli używasz Rspack, musisz jawnie wymusić na Intlayer korzystanie z konfiguracji webpack poprzez wyłączenie Turbopack:

    ts
    Kopiuj kod

    Skopiuj kod do schowka

    withRspack(withIntlayer(nextConfig, { enableTurbopack: false }));

    Krok 4: Zdefiniuj dynamiczne trasy lokalizacji

    Usuń wszystko z RootLayout i zastąp to następującym kodem:

    src/app/layout.tsx
    Kopiuj kod

    Skopiuj kod do schowka

    import type { PropsWithChildren, FC } from "react";
    import "./globals.css";
    
    const RootLayout: FC<PropsWithChildren> = ({ children }) => (
      // Nadal możesz opakować dzieci innymi dostawcami, takimi jak `next-themes`, `react-query`, `framer-motion` itp.
      <>{children}</>
    );
    
    export default RootLayout;
    Pozostawienie komponentu RootLayout pustym pozwala na ustawienie atrybutów lang oraz dir dla tagu <html>.

    Aby zaimplementować dynamiczne routowanie, podaj ścieżkę dla lokalizacji, dodając nowy layout w katalogu [locale]:

    src/app/[locale]/layout.tsx
    Kopiuj kod

    Skopiuj kod do schowka

    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;
    Segment ścieżki [locale] służy do określenia lokalizacji. Przykład: /en-US/about odnosi się do en-US, a /fr/about do fr.
    Na tym etapie napotkasz błąd: Error: Missing <html> and <body> tags in the root layout.. Jest to oczekiwane, ponieważ plik /app/page.tsx nie jest już używany i można go usunąć. Zamiast tego segment ścieżki [locale] aktywuje stronę /app/[locale]/page.tsx. W konsekwencji strony będą dostępne pod ścieżkami takimi jak /en, /fr, /es w Twojej przeglądarce. Aby ustawić domyślny język jako stronę główną, odnieś się do konfiguracji proxy w kroku 7.

    Następnie zaimplementuj funkcję generateStaticParams w układzie aplikacji.

    src/app/[locale]/layout.tsx
    Kopiuj kod

    Skopiuj kod do schowka

    export { generateStaticParams } from "next-intlayer"; // Linia do dodania
    
    const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
      /*... Reszta kodu*/
    };
    
    export default LocaleLayout;
    generateStaticParams zapewnia, że Twoja aplikacja wstępnie buduje niezbędne strony dla wszystkich lokalizacji, zmniejszając obciążenie podczas działania i poprawiając doświadczenie użytkownika. Aby uzyskać więcej informacji, zapoznaj się z dokumentacją Next.js dotyczącą generateStaticParams.
    Intlayer działa z export const dynamic = 'force-static';, aby zapewnić, że strony są wstępnie zbudowane dla wszystkich lokalizacji.

    Krok 5: Zadeklaruj swoją zawartość

    Utwórz i zarządzaj deklaracjami zawartości, aby przechowywać tłumaczenia:

    src/app/[locale]/page.content.ts
    Kopiuj kod

    Skopiuj kod do schowka

    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;
    Twoje deklaracje zawartości mogą być definiowane w dowolnym miejscu w aplikacji, pod warunkiem, że zostaną umieszczone w katalogu contentDir (domyślnie ./src). I będą miały rozszerzenie pliku deklaracji zawartości (domyślnie .content.{json,ts,tsx,js,jsx,mjs,cjs}).
    Aby uzyskać więcej szczegółów, zapoznaj się z dokumentacją deklaracji zawartości.

    Krok 6: Wykorzystaj zawartość w swoim kodzie

    Uzyskaj dostęp do swoich słowników zawartości w całej aplikacji:

    src/app/[locale]/page.tsx
    Kopiuj kod

    Skopiuj kod do schowka

    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 służy do dostarczania lokalizacji komponentom po stronie klienta. Może być umieszczony w dowolnym komponencie nadrzędnym, w tym w layoucie. Jednak zaleca się umieszczenie go w layoucie, ponieważ Next.js współdzieli kod layoutu między stronami, co jest bardziej efektywne. Używając IntlayerClientProvider w layoucie, unikasz ponownej inicjalizacji dla każdej strony, poprawiając wydajność i utrzymując spójny kontekst lokalizacji w całej aplikacji.
    • IntlayerServerProvider służy do dostarczania lokalizacji komponentom po stronie serwera. Nie może być ustawiony w layoucie.

      Layout i strona nie mogą dzielić wspólnego kontekstu serwera, ponieważ system kontekstu serwera opiera się na magazynie danych na żądanie (za pomocą mechanizmu React's cache), co powoduje, że każdy "kontekst" jest tworzony na nowo dla różnych segmentów aplikacji. Umieszczenie providera w wspólnym layoucie złamałoby tę izolację, uniemożliwiając prawidłowe propagowanie wartości kontekstu serwera do komponentów serwerowych.
    src/components/ClientComponentExample.tsx
    Kopiuj kod

    Skopiuj kod do schowka

    "use client";
    
    import type { FC } from "react";
    import { useIntlayer } from "next-intlayer";
    
    export const ClientComponentExample: FC = () => {
      const content = useIntlayer("client-component-example"); // Utwórz powiązaną deklarację zawartości
    
      return (
        <div>
          <h2>{content.title}</h2>
          <p>{content.content}</p>
        </div>
      );
    };
    src/components/ServerComponentExample.tsx
    Kopiuj kod

    Skopiuj kod do schowka

    import type { FC } from "react";
    import { useIntlayer } from "next-intlayer/server";
    
    export const ServerComponentExample: FC = () => {
      const content = useIntlayer("server-component-example"); // Utwórz powiązaną deklarację zawartości
    
      return (
        <div>
          <h2>{content.title}</h2>
          <p>{content.content}</p>
        </div>
      );
    };
    Jeśli chcesz użyć swojej zawartości w atrybucie string, takim jak alt, title, href, aria-label itp., musisz wywołać wartość funkcji, na przykład:
    html
    Kopiuj kod

    Skopiuj kod do schowka

    <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)}" />
    Aby dowiedzieć się więcej o hooku useIntlayer, zapoznaj się z dokumentacją.
    Jeśli Twoja aplikacja już istnieje, możesz użyć Intlayer Compiler w połączeniu z poleceniem extract, aby przekonwertować tysiące komponentów w jedną sekundę.

    (Opcjonalny) Krok 7: Konfiguracja proxy do wykrywania lokalizacji

    Skonfiguruj proxy, aby wykrywać preferowaną lokalizację użytkownika:

    src/proxy.ts
    Kopiuj kod

    Skopiuj kod do schowka

    export { intlayerProxy as proxy } from "next-intlayer/proxy";
    
    export const config = {
      matcher:
        "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
    };
    intlayerProxy służy do wykrywania preferowanego języka użytkownika i przekierowywania go na odpowiedni adres URL, zgodnie z konfiguracją. Dodatkowo umożliwia zapisywanie preferowanego języka użytkownika w ciasteczku.
    Jeśli potrzebujesz łączyć kilka proxy razem (na przykład intlayerProxy z uwierzytelnianiem lub niestandardowymi proxy), Intlayer udostępnia teraz pomocnika o nazwie multipleProxies.
    ts
    Kopiuj kod

    Skopiuj kod do schowka

    import { multipleProxies, intlayerProxy } from "next-intlayer/proxy";import { customProxy } from "@utils/customProxy";export const proxy = multipleProxies([intlayerProxy, customProxy]);

    (Opcjonalny) Krok 8: Internacjonalizacja metadanych

    W przypadku, gdy chcesz internacjonalizować swoje metadane, takie jak tytuł Twojej strony, możesz użyć funkcji generateMetadata dostarczanej przez Next.js. Wewnątrz możesz pobrać zawartość z funkcji getIntlayer, aby przetłumaczyć swoje metadane.

    src/app/[locale]/metadata.content.ts
    Kopiuj kod

    Skopiuj kod do schowka

    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 application 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
    Kopiuj kod

    Skopiuj kod do schowka

    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);
    
      /**
       * Generuje obiekt zawierający wszystkie url dla każdego języka.
       *
       * Przykład:
       * ```ts
       *  getMultilingualUrls('/about');
       *
       *  // Zwraca
       *  // {
       *  //   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,
        },
      };
    };
    
    // ... Reszta kodu
    Zauważ, że funkcja getIntlayer zaimportowana z next-intlayer zwraca Twoją zawartość opakowaną w IntlayerNode, co pozwala na integrację z edytorem wizualnym. Natomiast funkcja getIntlayer zaimportowana z intlayer zwraca Twoją zawartość bezpośrednio bez dodatkowych właściwości.

    Alternatywnie możesz użyć funkcji getTranslation do zadeklarowania swoich metadanych. Jednak używanie plików deklaracji treści jest zalecane, aby zautomatyzować tłumaczenie metadanych i w pewnym momencie wyodrębnić zawartość.

    src/app/[locale]/layout.tsx or src/app/[locale]/page.tsx
    Kopiuj kod

    Skopiuj kod do schowka

    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",
        }),
      };
    };
    
    // ... Reszta kodu
    Dowiedz się więcej o optymalizacji metadanych w oficjalnej dokumentacji Next.js.

    (Opcjonalny) Krok 9: Internacjonalizacja sitemap.xml i robots.txt

    Aby zinternacjonalizować swoje pliki sitemap.xml i robots.txt, możesz użyć funkcji getMultilingualUrls dostarczonej przez Intlayer. Ta funkcja pozwala na generowanie wielojęzycznych adresów URL dla Twojej mapy witryny.

    src/app/sitemap.ts
    Kopiuj kod

    Skopiuj kod do schowka

    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
    Kopiuj kod

    Skopiuj kod do schowka

    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;
    Dowiedz się więcej o optymalizacji mapy witryny w oficjalnej dokumentacji Next.js. Dowiedz się więcej o optymalizacji pliku robots.txt w oficjalnej dokumentacji Next.js.

    (Opcjonalny) Krok 10: Zmień język swojej zawartości

    Aby zmienić język swojej zawartości w Next.js, zalecanym sposobem jest użycie komponentu Link do przekierowania użytkowników na odpowiednią zlokalizowaną stronę. Komponent Link umożliwia wstępne pobieranie strony, co pomaga uniknąć pełnego przeładowania strony.

    src/components/LocaleSwitcher.tsx
    Kopiuj kod

    Skopiuj kod do schowka

    "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 // Zapewni, że przycisk "wstecz" w przeglądarce przekieruje do poprzedniej strony
              >
                <span>
                  {/* Lokalizacja - np. FR */}
                  {localeItem}
                </span>
                <span>
                  {/* Język w swojej własnej lokalizacji - np. Français */}
                  {getLocaleName(localeItem, locale)}
                </span>
                <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
                  {/* Język w bieżącej lokalizacji - np. Francés przy ustawionej lokalizacji Locales.SPANISH */}
                  {getLocaleName(localeItem)}
                </span>
                <span dir="ltr" lang={Locales.ENGLISH}>
                  {/* Język po angielsku - np. French */}
                  {getLocaleName(localeItem, Locales.ENGLISH)}
                </span>
              </Link>
            ))}
          </div>
        </div>
      );
    };
    Alternatywnym sposobem jest użycie funkcji setLocale dostarczonej przez hook useLocale. Ta funkcja nie pozwala na wstępne pobieranie strony. Zobacz dokumentację hooka useLocale po więcej szczegółów.
    Możesz również ustawić funkcję w opcji onLocaleChange, aby wywołać niestandardową funkcję, gdy zmieni się lokalizacja.
    src/components/LocaleSwitcher.tsx
    Kopiuj kod

    Skopiuj kod do schowka

    "use client";import { useRouter } from "next/navigation";import { useLocale } from "next-intlayer";import { getLocalizedUrl } from "intlayer";// ... Reszta koduconst router = useRouter();const { setLocale } = useLocale({  onLocaleChange: (locale) => {    router.push(getLocalizedUrl(pathWithoutLocale, locale));  },});return (  <button onClick={() => setLocale(Locales.FRENCH)}>Zmień na francuski</button>);

    Referencje dokumentacji:

    • useLocale hook
    • getLocaleName hook
    • getLocalizedUrl hook
    • getHTMLTextDir hook
    • atrybut hrefLang
    • atrybut lang
    • atrybut dir
    • atrybut aria-current

    (Opcjonalny) Krok 11: Tworzenie zlokalizowanego komponentu Link

    Aby upewnić się, że nawigacja w Twojej aplikacji szanuje bieżącą lokalizację, możesz stworzyć niestandardowy komponent Link. Ten komponent automatycznie poprzedza wewnętrzne adresy URL bieżącym językiem. Na przykład, gdy użytkownik francuskojęzyczny kliknie w link do strony "O nas", zostanie przekierowany do /fr/about zamiast do /about.

    To zachowanie jest przydatne z kilku powodów:

    • SEO i doświadczenie użytkownika: Zlokalizowane adresy URL pomagają wyszukiwarkom poprawnie indeksować strony specyficzne dla danego języka i dostarczają użytkownikom treści w ich preferowanym języku.
    • Spójność: Korzystając ze zlokalizowanego linku w całej aplikacji, gwarantujesz, że nawigacja pozostaje w obrębie bieżącej lokalizacji, zapobiegając nieoczekiwanym zmianom języka.
    • Utrzymywalność: Centralizacja logiki lokalizacji w jednym komponencie upraszcza zarządzanie adresami URL, czyniąc Twoją bazę kodu łatwiejszą w utrzymaniu i rozbudowie w miarę rozwoju aplikacji.

    Poniżej znajduje się implementacja zlokalizowanego komponentu Link w TypeScript:

    src/components/Link.tsx
    Kopiuj kod

    Skopiuj kod do schowka

    "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";
    
    /**
     * Funkcja pomocnicza sprawdzająca, czy dany adres URL jest zewnętrzny.
     * Jeśli adres URL zaczyna się od http:// lub https://, jest uważany za zewnętrzny.
     */
    export const checkIsExternalLink = (href?: string): boolean =>
      /^https?:\/\//.test(href ?? "");
    
    /**
     * Niestandardowy komponent Link, który dostosowuje atrybut href w oparciu o bieżącą lokalizację.
     * Dla linków wewnętrznych używa `getLocalizedUrl`, aby poprzedzić adres URL lokalizacją (np. /fr/about).
     * Zapewnia to, że nawigacja pozostaje w tym samym kontekście lokalizacji.
     */
    export const Link: FC<PropsWithChildren<NextLinkProps>> = ({
      href,
      children,
      ...props
    }) => {
      const { locale } = useLocale();
      const isExternalLink = checkIsExternalLink(href.toString());
    
      // Jeśli link jest wewnętrzny i podano prawidłowy href, pobierz zlokalizowany adres URL.
      const hrefI18n: NextLinkProps["href"] =
        href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href;
    
      return (
        <NextLink href={hrefI18n} {...props}>
          {children}
        </NextLink>
      );
    };

    Jak to działa

    • Wykrywanie linków zewnętrznych:
      Funkcja pomocnicza checkIsExternalLink określa, czy adres URL jest zewnętrzny. Linki zewnętrzne pozostają niezmienione, ponieważ nie wymagają lokalizacji.

    • Pobieranie bieżącej lokalizacji:
      Hook useLocale dostarcza bieżącą lokalizację (np. fr dla francuskiego).

    • Lokalizowanie adresu URL:
      Dla linków wewnętrznych (tj. niezewnętrznych), używa się getLocalizedUrl, aby automatycznie poprzedzić adres URL bieżącą lokalizacją. Oznacza to, że jeśli Twój użytkownik jest we francuskiej wersji językowej, przekazanie /about jako href zmieni je na /fr/about.

    • Zwracanie linku:
      Komponent zwraca element <a> ze zlokalizowanym adresem URL, zapewniając spójność nawigacji z lokalizacją.

    Dzięki zintegrowaniu tego komponentu Link w całej aplikacji zachowujesz spójne i świadome językowo doświadczenie użytkownika, jednocześnie korzystając z lepszego SEO i użyteczności.

    (Opcjonalny) Krok 12: Pobierz bieżącą lokalizację w Server Actions

    Jeśli potrzebujesz aktywnej lokalizacji wewnątrz Server Action (np. do lokalizacji e-maili lub uruchomienia logiki zależnej od języka), wywołaj getLocale z next-intlayer/server:

    src/app/actions/getLocale.ts
    Kopiuj kod

    Skopiuj kod do schowka

    "use server";import { getLocale } from "next-intlayer/server";export const myServerAction = async () => {  const locale = await getLocale();  // Zrób coś z lokalizacją};

    Funkcja getLocale stosuje strategię kaskadową, aby określić lokalizację użytkownika:

    1. Najpierw sprawdza nagłówki żądania pod kątem wartości lokalizacji, która mogła zostać ustawiona przez proxy.
    2. Jeśli nie znaleziono lokalizacji w nagłówkach, szuka lokalizacji zapisanej w ciasteczkach.
    3. Jeśli nie znaleziono ciasteczka, próbuje wykryć preferowany język użytkownika z ustawień przeglądarki.
    4. W ostateczności powraca do skonfigurowanej domyślnej lokalizacji aplikacji.

    Zapewnia to wybranie najbardziej odpowiedniej lokalizacji na podstawie dostępnego kontekstu.

    (Opcjonalny) Krok 13: Zoptymalizuj rozmiar pakietu

    Podczas korzystania z next-intlayer, słowniki są domyślnie dołączane do pakietu dla każdej strony. Aby zoptymalizować rozmiar pakietu, Intlayer dostarcza opcjonalną wtyczkę SWC, która inteligentnie zastępuje wywołania useIntlayer za pomocą makr. Gwarantuje to, że słowniki są dołączane tylko do pakietów stron, które faktycznie ich używają.

    Aby włączyć tę optymalizację, zainstaluj pakiet @intlayer/swc. Po zainstalowaniu, next-intlayer automatycznie wykryje i użyje wtyczki:

    bash
    Kopiuj kod

    Skopiuj kod do schowka

    npm install @intlayer/swc --save-dev
    Uwaga: Ta optymalizacja jest dostępna tylko dla Next.js 13 i nowszych.
    Uwaga: Ten pakiet nie jest instalowany domyślnie, ponieważ wtyczki SWC są nadal eksperymentalne w Next.js. Może się to zmienić w przyszłości.
    Uwaga: Jeśli ustawisz opcję importMode: 'dynamic' lub importMode: 'fetch' (w konfiguracji dictionary), będzie ona polegać na Suspense, więc będziesz musiał opakować wywołania useIntlayer w granicę Suspense. Oznacza to, że nie będziesz mógł używać useIntlayer bezpośrednio na najwyższym poziomie komponentu Page / Layout.

    Obserwuj zmiany słowników w Turbopack

    Podczas korzystania z Turbopack jako serwera deweloperskiego za pomocą polecenia next dev, zmiany w słownikach nie będą automatycznie wykrywane domyślnie.

    To ograniczenie występuje, ponieważ Turbopack nie może uruchamiać wtyczek webpack równolegle, aby monitorować zmiany w plikach zawartości. Aby to obejść, będziesz musiał użyć polecenia intlayer watch, aby uruchomić jednocześnie serwer deweloperski i obserwatora budowania Intlayer.

    package.json
    Kopiuj kod

    Skopiuj kod do schowka

    {  // ... Twoje istniejące konfiguracje package.json  "scripts": {    // ... Twoje istniejące konfiguracje skryptów    "dev": "intlayer watch --with 'next dev'",  },}
    Jeśli używasz next-intlayer@<=6.x.x, musisz zachować flagę --turbopack, aby aplikacja Next.js 16 działała poprawnie z Turbopack. Zalecamy używanie next-intlayer@>=7.x.x, aby uniknąć tego ograniczenia.

    Skonfiguruj TypeScript

    Intlayer wykorzystuje augmentację modułów, aby czerpać korzyści z TypeScript i wzmacniać Twoją bazę kodu.

    Autouzupełnianie

    Błąd tłumaczenia

    Upewnij się, że Twoja konfiguracja TypeScript zawiera automatycznie generowane typy.

    tsconfig.json
    Kopiuj kod

    Skopiuj kod do schowka

    {  // ... Twoje istniejące konfiguracje TypeScript  "include": [    // ... Twoje istniejące konfiguracje TypeScript    ".intlayer/**/*.ts", // Uwzględnij automatycznie generowane typy  ],}

    Konfiguracja Git

    Zaleca się ignorowanie plików generowanych przez Intlayer. Pozwala to uniknąć ich zatwierdzania w repozytorium Git.

    Aby to zrobić, możesz dodać następujące instrukcje do pliku .gitignore:

    .gitignore
    Kopiuj kod

    Skopiuj kod do schowka

    # Ignoruj pliki generowane przez Intlayer.intlayer

    Rozszerzenie VS Code

    Aby poprawić wrażenia z programowania z Intlayer, możesz zainstalować oficjalne rozszerzenie Intlayer VS Code.

    Zainstaluj z VS Code Marketplace

    To rozszerzenie zapewnia:

    • Autouzupełnianie kluczy tłumaczeń.
    • Wykrywanie błędów w czasie rzeczywistym dla brakujących tłumaczeń.
    • Podgląd wierszowy przetłumaczonej zawartości.
    • Szybkie akcje do łatwego tworzenia i aktualizowania tłumaczeń.

    Aby uzyskać więcej informacji na temat korzystania z rozszerzenia, zapoznaj się z dokumentacją rozszerzenia Intlayer VS Code.

    (Opcjonalnie) Krok 14 : Wyodrębnij zawartość swoich komponentów

    Jeśli masz istniejącą bazę kodu, transformacja tysięcy plików może być czasochłonna.

    Aby ułatwić ten proces, Intlayer proponuje kompilator / ekstraktor, aby przetransformować komponenty i wyodrębnić zawartość.

    Aby go skonfigurować, możesz dodać sekcję compiler w pliku intlayer.config.ts:

    intlayer.config.ts
    Kopiuj kod

    Skopiuj kod do schowka

    import { type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      // ... Reszta Twojej konfiguracji
      compiler: {
        /**
         * Wskazuje, czy kompilator powinien być włączony.
         */
        enabled: true,
    
        /**
         * Definiuje ścieżkę plików wyjściowych
         */
        output: ({ fileName, extension }) => `./${fileName}${extension}`,
    
        /**
         * Wskazuje, czy komponenty powinny zostać zapisane po transformacji. W ten sposób kompilator można uruchomić tylko raz, aby przetransformować aplikację, a następnie go usunąć.
         */
        saveComponents: false,
    
        /**
         * Prefiks klucza słownika
         */
        dictionaryKeyPrefix: "",
      },
    };
    
    export default config;

    Uruchom ekstraktor, aby przetransformować komponenty i wyodrębnić zawartość

    bash
    Kopiuj kod

    Skopiuj kod do schowka

    npx intlayer extract
    bash
    Kopiuj kod

    Skopiuj kod do schowka

    npm install @intlayer/babel --save-dev
    babel.config.js
    Kopiuj kod

    Skopiuj kod do schowka

    const { intlayerExtractBabelPlugin, getExtractPluginOptions,} = require("@intlayer/babel");module.exports = { presets: ["next/babel"], plugins: [   // Wyodrębnij zawartość z komponentów do słowników   [intlayerExtractBabelPlugin, getExtractPluginOptions()], ],};
    bash
    Kopiuj kod

    Skopiuj kod do schowka

    npm run build # Lub npm run dev

    Idź dalej

    Aby pójść dalej, możesz zaimplementować edytor wizualny lub wyeksportować swoją zawartość za pomocą CMS.

    Optymalizacja pakietu
    Next.js 14 i App Router
    Alt+→

    Na tej stronie

      Dyskusje są anonimowe i regularnie przeglądane w celu rozwiązania typowych problemów. Podziel się pomysłami na funkcje, opinią o dokumentacji lub czymkolwiek związanym z Intlayer, wykorzystujemy te informacje do kształtowania naszej mapy drogowej i ulepszania produktu.

      npm install intlayer next-intlayernpx intlayer init
      .├── src│   ├── app│   │   ├── [locale]│   │   │   ├── layout.tsx            # Układ lokalizacji dla dostawcy Intlayer│   │   │   ├── page.content.ts│   │   │   └── page.tsx│   │   └── layout.tsx                # Główny układ dla stylów i globalnych dostawców│   ├── 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
      const nextConfig = await withIntlayer(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;
      const nextConfig = withIntlayerSync(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;
      withRspack(withIntlayer(nextConfig, { enableTurbopack: false }));
      <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)}" />
      import { multipleProxies, intlayerProxy } from "next-intlayer/proxy";import { customProxy } from "@utils/customProxy";export const proxy = multipleProxies([intlayerProxy, customProxy]);
      "use client";import { useRouter } from "next/navigation";import { useLocale } from "next-intlayer";import { getLocalizedUrl } from "intlayer";// ... Reszta koduconst router = useRouter();const { setLocale } = useLocale({  onLocaleChange: (locale) => {    router.push(getLocalizedUrl(pathWithoutLocale, locale));  },});return (  <button onClick={() => setLocale(Locales.FRENCH)}>Zmień na francuski</button>);
      "use server";import { getLocale } from "next-intlayer/server";export const myServerAction = async () => {  const locale = await getLocale();  // Zrób coś z lokalizacją};
      npm install @intlayer/swc --save-dev
      {  // ... Twoje istniejące konfiguracje package.json  "scripts": {    // ... Twoje istniejące konfiguracje skryptów    "dev": "intlayer watch --with 'next dev'",  },}
      {  // ... Twoje istniejące konfiguracje TypeScript  "include": [    // ... Twoje istniejące konfiguracje TypeScript    ".intlayer/**/*.ts", // Uwzględnij automatycznie generowane typy  ],}
      # Ignoruj pliki generowane przez Intlayer.intlayer
      npx intlayer extract
      npm install @intlayer/babel --save-dev
      const { intlayerExtractBabelPlugin, getExtractPluginOptions,} = require("@intlayer/babel");module.exports = { presets: ["next/babel"], plugins: [   // Wyodrębnij zawartość z komponentów do słowników   [intlayerExtractBabelPlugin, getExtractPluginOptions()], ],};
      npm run build # Lub npm run dev