Zadaj pytanie i otrzymaj streszczenie dokumentu, odwołując się do tej strony i wybranego dostawcy AI
Historia wersji
- "Aktualizacja użycia API useIntlayer w Solid do bezpośredniego dostępu do właściwości"v8.9.04.05.2026
- "Pierwsze wydanie"v8.0.010.01.2026
Treść tej strony została przetłumaczona przy użyciu sztucznej inteligencji.
Zobacz ostatnią wersję oryginalnej treści w języku angielskimIf 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
Przetłumacz swoją stronę Next.js 16 (bez [locale] w ścieżce) za pomocą Intlayer | Internationalization (i18n)
Zobacz Szablon aplikacji na GitHubie.
Spis treści
Dlaczego Interlayer zamiast alternatyw?
W porównaniu do głównych rozwiązań, takich jak next-intl czy i18next, Intlayer jest rozwiązaniem wyposażonym w zintegrowane optymalizacje, takie jak:
Pełne pokrycie Next.js
Intlayer jest zoptymalizowany do współpracy z Server Components w celu wydajnego renderowania i jest w pełni kompatybilny z Turbopack. Nie blokuje renderowania statycznego i oferuje oprogramowanie pośredniczące oraz wszystkie funkcje potrzebne do skalowania internacjonalizacji (i18n).
Intlayer jest kompatybilny z Next.js 12, 13, 14, 15 i 16. Jeśli używasz routera Next.js Pages Router, możesz zapoznać się z tym [przewodnikiem] (/pl/doc/environment/nextjs/next-with-page-router). Routing lokalny jest przydatny ze względu na SEO, rozmiar bundle'a i wydajność. Jeśli go nie potrzebujesz, możesz zapoznać się z tym przewodnikiem. W przypadku Next.js 12, 13, 14 i 15 z App Router zapoznaj się z tym [przewodnikiem] (/pl/doc/environment/nextjs/14).
Rozmiar bundle'a
Zamiast ładować ogromne pliki JSON na swoje strony, ładuj tylko niezbędną treść. Intlayer pomaga zmniejszyć rozmiary bundle'a i stron nawet o 50%.
Łatwość konserwacji
Określanie zakresu zawartości aplikacji ułatwia konserwację aplikacji na dużą skalę. Możesz powielić lub usunąć pojedynczy folder funkcji bez obciążania psychicznego koniecznością przeglądania całej bazy kodu zawartości. Dodatkowo Inlayer jest w pełni napisany, aby zapewnić dokładność treści.
Agent AI
Wspólna lokalizacja treści zmniejsza potrzebny kontekst dzięki modelom dużego języka (LLM). Intlayer zawiera także zestaw narzędzi, taki jak CLI do sprawdzania brakujących tłumaczeńLSP, MCP i umiejętności agenta, aby praca programisty (DX) była jeszcze płynniejsza dla agentów AI.
Automatyzacja
Korzystaj z automatyzacji, aby tłumaczyć w swoim potoku CI/CD przy użyciu wybranego LLM na koszt dostawcy sztucznej inteligencji. Intlayer oferuje także kompilator do automatyzacji ekstrakcji treści, a także [platformę internetową] (/pl/doc/concept/cms), która pomaga tłumaczyć w tle.
Wydajność
Łączenie ogromnych plików JSON z komponentami może prowadzić do problemów z wydajnością i reaktywnością. Inlayer optymalizuje ładowanie treści w czasie kompilacji.
Skalowanie bez użycia dewelopera
Więcej niż tylko rozwiązanie i18n, Intlayer zapewnia samodzielny edytor wizualny i pełny CMS, który pomoże Ci zarządzać wielojęzyczną treścią w w czasie rzeczywistym, dzięki czemu współpraca z tłumaczami, copywriterami i innymi członkami zespołu będzie płynna. Treść może być przechowywana lokalnie i/lub zdalnie.
Krok po kroku: konfiguracja Intlayer w aplikacji Next.js
Zainstaluj zależności
Zainstaluj niezbędne pakiety używając npm:
bashKopiuj kodSkopiuj kod do schowka
npm install intlayer next-intlayernpx intlayer initintlayer
Pakiet rdzeniowy, który dostarcza narzędzia do internacjonalizacji do zarządzania konfiguracją, tłumaczeń, deklaracji treści, transpilacji oraz poleceń CLI.
next-intlayer
Pakiet integrujący Intlayer z Next.js. Zapewnia context providers i hooki do internacjonalizacji w Next.js. Dodatkowo zawiera plugin Next.js do integracji Intlayer z Webpack lub Turbopack, a także proxy do wykrywania preferowanej lokalizacji użytkownika, zarządzania cookie i obsługi przekierowań URL.
Skonfiguruj swój projekt
Oto końcowa struktura, którą utworzymy:
bashKopiuj kodSkopiuj kod do schowka
.├── src│ ├── app│ │ ├── layout.tsx│ │ ├── page.content.ts│ │ └── page.tsx│ ├── components│ │ ├── clientComponentExample│ │ │ ├── client-component-example.content.ts│ │ │ └── ClientComponentExample.tsx│ │ ├── localeSwitcher│ │ │ ├── localeSwitcher.content.ts│ │ │ └── LocaleSwitcher.tsx│ │ └── serverComponentExample│ │ ├── server-component-example.content.ts│ │ └── ServerComponentExample.tsx│ └── proxy.ts├── intlayer.config.ts├── next.config.ts├── package.json└── tsconfig.jsonJeśli nie chcesz routingu lokalizacji, intlayer może być użyty jako prosty provider / hook. Zobacz ten przewodnik, aby uzyskać więcej informacji.
Create a config file to configure the languages of your application:
intlayer.config.tsKopiuj kodSkopiuj kod do schowka
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Twoje pozostałe locales ], defaultLocale: Locales.ENGLISH, }, routing: { mode: "search-params", // lub `no-prefix` - Przydatne do wykrywania w middleware }, }; export default config;Poprzez ten plik konfiguracyjny możesz ustawić lokalizowane adresy URL, przekierowania proxy, nazwy ciasteczek, lokalizację i rozszerzenie deklaracji treści, wyłączyć logi Intlayer w konsoli i inne. Aby uzyskać pełną listę dostępnych parametrów, zapoznaj się z dokumentacją konfiguracji.
Integracja Intlayer z konfiguracją Next.js
Skonfiguruj swoje środowisko Next.js, aby używało Intlayer:
next.config.tsKopiuj kodSkopiuj 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 i monitoruje je w trybie deweloperskim. Definiuje zmienne środowiskowe Intlayer w środowiskach Webpack lub Turbopack. Dodatkowo udostępnia aliasy w celu optymalizacji wydajności i zapewnia kompatybilność z komponentami po stronie serwera.Funkcja
withIntlayer()jest funkcją zwracającą Promise. Pozwala przygotować słowniki Intlayer przed rozpoczęciem procesu build. Jeśli chcesz użyć jej razem z innymi wtyczkami, możesz użyćawait. Przykład:tsKopiuj kodSkopiuj kod do schowka
const nextConfig = await withIntlayer(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;Jeśli chcesz użyć go synchronicznie, możesz skorzystać z funkcji
withIntlayerSync(). Przykład:tsKopiuj kodSkopiuj 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,--turbolub--turbopack, oraz Twojej obecnej wersji Next.js.Ponieważ
next>=16, jeśli używasz Rspack, musisz wyraźnie wymusić użycie konfiguracji webpack przez Intlayer, wyłączając Turbopack:tsKopiuj kodSkopiuj kod do schowka
withRspack(withIntlayer(nextConfig, { enableTurbopack: false }));Zdefiniuj dynamiczne trasy lokalizacji
Usuń całą zawartość
RootLayouti zastąp ją następującym kodem:src/app/layout.tsxKopiuj kodSkopiuj kod do schowka
import type { Metadata } from "next"; import type { ReactNode } from "react"; import "./globals.css"; import { IntlayerClientProvider, LocalPromiseParams } from "next-intlayer"; import { getHTMLTextDir, getIntlayer } from "intlayer"; import { getLocale } from "next-intlayer/server"; export { generateStaticParams } from "next-intlayer"; export const generateMetadata = async (): Promise<Metadata> => { const locale = await getLocale(); const { title, description, keywords } = getIntlayer("metadata", locale); return { title, description, keywords, }; }; const RootLayout = async ({ children, }: Readonly<{ children: ReactNode; }>) => { const locale = await getLocale(); return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <IntlayerClientProvider defaultLocale={locale}> <body>{children}</body> </IntlayerClientProvider> </html> ); }; export default RootLayout;Zadeklaruj swoje treści
Utwórz i zarządzaj deklaracjami treści, aby przechowywać tłumaczenia:
src/app/metadata.content.tsKopiuj kodSkopiuj kod do schowka
import { t, type Dictionary } from "intlayer"; import { Metadata } from "next"; const metadataContent = { key: "metadata", content: { title: t({ pl: "Tytuł mojego projektu", en: "My Project Title", fr: "Le Titre de mon Projet", es: "El Título de mi Proyecto", }), description: t({ pl: "Poznaj naszą innowacyjną platformę zaprojektowaną, aby usprawnić przepływ pracy i zwiększyć produktywność.", en: "Discover our innovative platform designed to streamline your workflow and boost productivity.", fr: "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.", es: "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad.", }), keywords: t({ pl: ["innowacja", "produktywność", "przepływ pracy", "SaaS"], en: ["innovation", "productivity", "workflow", "SaaS"], pl: ["innowacja", "produktywność", "przepływ pracy", "SaaS"], fr: ["innovation", "productivité", "flux de travail", "SaaS"], es: ["innovación", "productividad", "flujo de trabajo", "SaaS"], }), }, } as Dictionary<Metadata>; export default metadataContent;src/app/page.content.tsKopiuj kodSkopiuj kod do schowka
import { t, type Dictionary } from "intlayer"; const pageContent = { key: "page", content: { getStarted: { main: t({ pl: "Zacznij od edycji", 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ć zdefiniowane w dowolnym miejscu aplikacji, pod warunkiem że zostaną umieszczone w katalogu
contentDir(domyślnie./src) i mają odpowiednie rozszerzenie pliku deklaracji zawartości (domyślnie.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).Po więcej informacji odwołaj się do dokumentacji pliku deklaracji zawartości.
Wykorzystanie zawartości w kodzie
Uzyskaj dostęp do swoich słowników zawartości w całej aplikacji:
src/app/page.tsxKopiuj kodSkopiuj kod do schowka
import type { FC } from "react"; import { ClientComponentExample } from "@components/clientComponentExample/ClientComponentExample"; import { ServerComponentExample } from "@components/serverComponentExample/ServerComponentExample"; import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server"; import { NextPage } from "next"; import { getLocale } from "next-intlayer/server"; import { headers, cookies } from "next/headers"; const PageContent: FC = () => { const content = useIntlayer("page"); return ( <> <p>{content.getStarted.main}</p> <code>{content.getStarted.pageLink}</code> </> ); }; const Page: NextPage = async () => { const locale = await getLocale(); return ( <IntlayerServerProvider locale={locale}> <PageContent /> <ServerComponentExample /> <ClientComponentExample /> </IntlayerServerProvider> ); }; export default Page;IntlayerClientProvidersłuży do dostarczania locale komponentom po stronie klienta. Można go umieścić w dowolnym komponencie nadrzędnym, w tym w layout. Jednak zaleca się umieszczenie go w layout, ponieważ Next.js współdzieli kod layoutu między stronami, co jest bardziej wydajne. UżywającIntlayerClientProviderw layout, unikasz ponownej inicjalizacji dla każdej strony, poprawiając wydajność i utrzymując spójny kontekst lokalizacji w całej aplikacji.IntlayerServerProviderjest używany do dostarczania locale dzieciom po stronie serwera. Nie można go umieścić w layoucie.Layout i page nie mogą współdzielić wspólnego kontekstu serwera, ponieważ system kontekstu serwera opiera się na magazynie danych dla każdego żądania (poprzez mechanizm React's cache), powodując, że każdy "kontekst" jest tworzony na nowo dla różnych segmentów aplikacji. Umieszczenie providera we wspólnym layoucie złamałoby tę izolację, uniemożliwiając poprawne propagowanie wartości kontekstu serwera do twoich komponentów serwerowych.
src/components/clientComponentExample/ClientComponentExample.tsxKopiuj kodSkopiuj 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 deklarację powiązanej treści return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };src/components/serverComponentExample/ServerComponentExample.tsxKopiuj kodSkopiuj 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 deklarację powiązanej zawartości return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };Jeśli chcesz użyć swojej zawartości w atrybucie typu
string, takim jakalt,title,href,aria-labelitp., musisz wywołać wartość funkcji, na przykład:htmlKopiuj kodSkopiuj 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ą.Skonfiguruj proxy do wykrywania preferowanej lokalizacji użytkownika
OpcjonalneSkonfiguruj proxy, aby wykrywało preferowaną lokalizację użytkownika:
src/proxy.tsKopiuj kodSkopiuj 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).*)", };intlayerProxyjest używany do wykrywania preferowanego języka użytkownika i przekierowywania go na odpowiedni URL, zgodnie z konfiguracją. Dodatkowo umożliwia zapisanie preferowanego języka użytkownika w ciasteczku.Jeśli potrzebujesz łączyć kilka proxy razem (na przykład
intlayerProxyz uwierzytelnianiem lub niestandardowymi proxy), Intlayer udostępnia teraz helper o nazwiemultipleProxies.tsKopiuj kodSkopiuj kod do schowka
import { multipleProxies, intlayerProxy } from "next-intlayer/proxy";import { customProxy } from "@utils/customProxy";export const proxy = multipleProxies([intlayerProxy, customProxy]);Zmień język swojej zawartości
OpcjonalneAby zmienić język treści w Next.js, zalecanym sposobem jest użycie komponentu
Linkdo przekierowania użytkowników na odpowiednio zlokalizowaną stronę. KomponentLinkumożliwia prefetching, co pomaga uniknąć pełnego przeładowania strony.src/components/localeSwitcher/LocaleSwitcher.tsxKopiuj kodSkopiuj kod do schowka
"use client"; import type { FC } from "react"; import { Locales, getHTMLTextDir, getLocaleName } from "intlayer"; import { useLocale } from "next-intlayer"; export const LocaleSwitcher: FC = () => { const { locale, availableLocales, setLocale } = useLocale(); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <button key={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={() => setLocale(localeItem)} > <span> {/* Skrót lokalizacji, np. FR */} {localeItem} </span> <span> {/* Nazwa języka w jego własnym locale, np. Français */} {getLocaleName(localeItem, locale)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* Nazwa języka w bieżącym locale, np. "Francés" jeśli bieżące locale to Locales.SPANISH */} {getLocaleName(localeItem)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* Język w wersji angielskiej, np. French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </button> ))} </div> </div> ); };Alternatywnym sposobem jest użycie funkcji
setLocaledostarczonej przez hookuseLocale. Ta funkcja nie pozwala na prefetching strony. Zobacz dokumentację hookauseLocalepo więcej szczegółów.Odnośniki w dokumentacji:
Pobierz bieżący locale w Server Actions
OpcjonalneJeśli potrzebujesz aktywnego locale wewnątrz Server Action (np. do lokalizowania e-maili lub uruchamiania logiki zależnej od locale), wywołaj
getLocaleznext-intlayer/server:src/app/actions/getLocale.tsKopiuj kodSkopiuj kod do schowka
"use server";import { getLocale } from "next-intlayer/server";export const myServerAction = async () => { const locale = await getLocale(); // Zrób coś z locale};Funkcja
getLocalestosuje strategię kaskadową, aby określić locale użytkownika:- Najpierw sprawdza nagłówki żądania w poszukiwaniu wartości locale, która mogła zostać ustawiona przez proxy
- Jeśli w nagłówkach nie znaleziono locale, szuka wartości locale przechowywanej w cookies
- Jeśli nie znaleziono cookie, próbuje wykryć preferowany język użytkownika na podstawie ustawień przeglądarki
- W ostateczności używa domyślnego locale skonfigurowanego w aplikacji
Zapewnia to wybór najbardziej odpowiedniej lokalizacji w oparciu na dostępnym kontekście.
Optymalizacja rozmiaru bundla
OpcjonalnePodczas używania
next-intlayer, słowniki są domyślnie dołączane do bundla dla każdej strony. Aby zoptymalizować rozmiar bundla, Intlayer udostępnia opcjonalny plugin SWC, który inteligentnie zastępuje wywołaniauseIntlayerza pomocą makr. Dzięki temu słowniki są dołączane tylko do bundli stron, które faktycznie ich używają.Aby włączyć tę optymalizację, zainstaluj pakiet
@intlayer/swc. Po zainstalowaniunext-intlayerautomatycznie wykryje i użyje pluginu:bashKopiuj kodSkopiuj kod do schowka
npm install @intlayer/swc --save-devUwaga: Ta optymalizacja jest dostępna tylko dla Next.js 13 i nowszych.
Uwaga: Ten pakiet nie jest instalowany domyślnie, ponieważ wtyczki SWC są w Next.js wciąż eksperymentalne. Może to ulec zmianie w przyszłości.
Uwaga: Jeśli ustawisz opcję na
importMode: 'dynamic'lubimportMode: 'fetch'(in thedictionaryconfiguration), będzie to polegać na Suspense, więc będziesz musiał otoczyć wywołaniauseIntlayergranicąSuspense. To oznacza, że nie będziesz mógł używaćuseIntlayerbezpośrednio na najwyższym poziomie komponentu Page lub Layout.
Monitorowanie zmian słowników w Turbopack
Jeśli używasz Turbopack jako serwera deweloperskiego z poleceniem next dev, zmiany w słownikach nie będą domyślnie wykrywane automatycznie.
To ograniczenie wynika z faktu, że Turbopack nie może uruchamiać wtyczek webpack równolegle w celu monitorowania zmian w plikach z treścią. Aby to obejść, musisz użyć polecenia intlayer watch, aby uruchomić jednocześnie serwer deweloperski i obserwator budowania Intlayer.
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życie next-intlayer@>=7.x.x, aby uniknąć tego ograniczenia.
Konfiguracja TypeScript
Intlayer używa module augmentation, aby skorzystać z zalet TypeScript i wzmocnić swoją codebase.


Upewnij się, że Twoja konfiguracja TypeScript zawiera autogenerowane typy.
Skopiuj kod do schowka
{ // ... Twoje istniejące konfiguracje TypeScript "include": [ // ... Twoje istniejące konfiguracje TypeScript ".intlayer/**/*.ts", // Dołącz auto-generowane typy ],}Konfiguracja Git
Zaleca się ignorowanie plików generowanych przez Intlayer. Pozwoli to uniknąć ich zatwierdzania do Twojego repozytorium Git.
Aby to zrobić, możesz dodać następujące wpisy do pliku .gitignore:
Skopiuj kod do schowka
# Ignoruj pliki generowane przez Intlayer.intlayerRozszerzenie VS Code
Aby ulepszyć doświadczenie programistyczne z Intlayer, możesz zainstalować oficjalne rozszerzenie Intlayer VS Code Extension.
Zainstaluj z VS Code Marketplace
To rozszerzenie udostępnia:
- Autouzupełnianie kluczy tłumaczeń.
- Wykrywanie błędów w czasie rzeczywistym dla brakujących tłumaczeń.
- Podglądy inline przetłumaczonej zawartości.
- Szybkie akcje umożliwiające łatwe tworzenie i aktualizowanie tłumaczeń.
Aby uzyskać więcej informacji o korzystaniu z rozszerzenia, zapoznaj się z dokumentacją Intlayer VS Code Extension.
Dalsze kroki
Aby pójść dalej, możesz wdrożyć edytor wizualny lub zewnętrznie przechowywać swoją zawartość za pomocą CMS.