Zadaj pytanie i otrzymaj streszczenie dokumentu, odwołując się do tej strony i wybranego dostawcy AI
Dzięki integracji serwera Intlayer MCP z ulubionym asystentem AI możesz uzyskać dostęp do całej dokumentacji bezpośrednio z ChatGPT, DeepSeek, Cursor, VSCode itp.
Zobacz dokumentację serwera MCPHistoria wersji
- Init historyv7.3.48.12.2025
Treść tej strony została przetłumaczona przy użyciu sztucznej inteligencji.
Zobacz ostatnią wersję oryginalnej treści w języku angielskimJeśli masz pomysł na ulepszenie tej dokumentacji, zachęcamy do przesłania pull requesta na GitHubie.
Link do dokumentacji na GitHubieKopiuj dokument Markdown do schowka
Przetłumacz swoją stronę React Router v7 (File-System Routes) za pomocą Intlayer | Internacjonalizacja (i18n)
Ten przewodnik pokazuje, jak zintegrować Intlayer dla płynnej internacjonalizacji w projektach React Router v7 używając routingu opartego na systemie plików (@react-router/fs-routes) z routingiem uwzględniającym lokalizację, wsparciem TypeScript oraz nowoczesnymi praktykami programistycznymi.
Table of Contents
Czym jest Intlayer?
Intlayer to innowacyjna, otwartoźródłowa biblioteka do internacjonalizacji (i18n), zaprojektowana, aby uprościć wsparcie wielojęzyczne w nowoczesnych aplikacjach webowych.
Dzięki Intlayer możesz:
- Łatwo zarządzać tłumaczeniami za pomocą deklaratywnych słowników na poziomie komponentów.
- Dynamicznie lokalizować metadane, trasy i zawartość.
- Zapewnić wsparcie TypeScript dzięki automatycznie generowanym typom, co poprawia autouzupełnianie i wykrywanie błędów.
- Korzystaj z zaawansowanych funkcji, takich jak dynamiczne wykrywanie i przełączanie lokalizacji.
- Włącz routing uwzględniający lokalizację za pomocą systemu routingu opartego na systemie plików w React Router v7.
Przewodnik krok po kroku dotyczący konfiguracji Intlayer w aplikacji React Router v7 z trasami opartymi na systemie plików
See Application Template on GitHub.
Krok 1: Zainstaluj zależności
Zainstaluj niezbędne pakiety, używając preferowanego menedżera pakietów:
npm install intlayer react-intlayernpm install vite-intlayer --save-devnpm install @react-router/fs-routes --save-devintlayer
Główny pakiet, który dostarcza narzędzia do internacjonalizacji, zarządzania konfiguracją, tłumaczeń, deklaracji treści, transpilecji oraz poleceń CLI.
react-intlayer Pakiet integrujący Intlayer z aplikacją React. Zapewnia dostawców kontekstu oraz hooki do internacjonalizacji w React.
vite-intlayer Zawiera wtyczkę Vite do integracji Intlayer z bundlerem Vite, a także middleware do wykrywania preferowanego języka użytkownika, zarządzania ciasteczkami oraz obsługi przekierowań URL.
@react-router/fs-routes Pakiet, który umożliwia routing oparty na systemie plików dla React Router v7.
Krok 2: Konfiguracja Twojego projektu
See Application Template on GitHub.
Utwórz plik konfiguracyjny, aby skonfigurować języki swojej aplikacji:
Skopiuj kod do schowka
import { type IntlayerConfig, Locales } from "intlayer";const config: IntlayerConfig = { internationalization: { defaultLocale: Locales.ENGLISH, locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], },};export default config;Za pomocą tego pliku konfiguracyjnego możesz ustawić lokalizowane adresy URL, przekierowania w middleware, 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 konfiguracyjnej.
Krok 3: Integracja Intlayer w konfiguracji Vite
Dodaj wtyczkę intlayer do swojej konfiguracji:
Skopiuj kod do schowka
import { reactRouter } from "@react-router/dev/vite";import { defineConfig } from "vite";import { intlayer } from "vite-intlayer";import tsconfigPaths from "vite-tsconfig-paths";export default defineConfig({ plugins: [reactRouter(), tsconfigPaths(), intlayer()],});Wtyczka Vite intlayer() służy do integracji Intlayer z Vite. Zapewnia budowanie plików deklaracji zawartości i monitoruje je w trybie deweloperskim. Definiuje zmienne środowiskowe Intlayer w aplikacji Vite. Dodatkowo dostarcza aliasy w celu optymalizacji wydajności.
Krok 4: Konfiguracja tras opartych na systemie plików React Router v7
Skonfiguruj routing, aby używać tras opartych na systemie plików z flatRoutes:
Skopiuj kod do schowka
import type { RouteConfig } from "@react-router/dev/routes";import { flatRoutes } from "@react-router/fs-routes";import { configuration } from "intlayer";const routes: RouteConfig = flatRoutes({ // Ignoruj pliki deklaracji treści, aby nie były traktowane jako trasy ignoredRouteFiles: configuration.content.fileExtensions.map( (fileExtension) => `**/*${fileExtension}` ),});export default routes;Funkcja flatRoutes z @react-router/fs-routes umożliwia routing oparty na systemie plików, gdzie struktura plików w katalogu routes/ określa trasy Twojej aplikacji. Opcja ignoredRouteFiles zapewnia, że pliki deklaracji treści Intlayer (.content.ts, itp.) nie są traktowane jako pliki tras.
Krok 5: Utwórz pliki tras z konwencjami systemu plików
Przy routingu opartym na systemie plików używasz płaskiej konwencji nazewnictwa, gdzie kropki (.) reprezentują segmenty ścieżki, a nawiasy () oznaczają opcjonalne segmenty.
Utwórz następujące pliki w katalogu app/routes/:
Struktura plików
app/routes/├── ($locale)._layout.tsx # Opakowanie layoutu dla tras lokalizacji├── ($locale)._index.tsx # Strona główna (/:locale?)├── ($locale)._index.content.ts # Zawartość strony głównej├── ($locale).about.tsx # Strona O nas (/:locale?/about)└── ($locale).about.content.ts # Zawartość strony O nasKonwencje nazewnictwa:
- ($locale) - Opcjonalny dynamiczny segment dla parametru lokalizacji
- _layout - Trasa layoutu, która opakowuje trasy potomne
- _index - Trasa indeksowa (renderuje się na ścieżce nadrzędnej)
- . (kropka) - Oddziela segmenty ścieżki (np. ($locale).about → /:locale?/about)
Komponent Layoutu
Skopiuj kod do schowka
import { IntlayerProvider } from "react-intlayer";import { Outlet } from "react-router";import { useI18nHTMLAttributes } from "~/hooks/useI18nHTMLAttributes";import type { Route } from "./+types/($locale)._layout";export default function RootLayout({ params }: Route.ComponentProps) { useI18nHTMLAttributes(); const { locale } = params; return ( <IntlayerProvider locale={locale}> <Outlet /> </IntlayerProvider> );}Strona indeksowa
Skopiuj kod do schowka
import { useIntlayer } from "react-intlayer";import { LocalizedLink } from "~/components/localized-link";import type { Route } from "./+types/($locale)._index";export default function Page() { const { title, description, aboutLink } = useIntlayer("page"); return ( <div> <h1>{title}</h1> <p>{description}</p> <nav> <LocalizedLink to="/about">{aboutLink}</LocalizedLink> </nav> </div> );}Strona O nas
Skopiuj kod do schowka
import { useIntlayer } from "react-intlayer";import { LocalizedLink } from "~/components/localized-link";import type { Route } from "./+types/($locale).about";export default function AboutPage() { const { title, content, homeLink } = useIntlayer("about"); return ( <div> <h1>{title}</h1> <p>{content}</p> <nav> <LocalizedLink to="/">{homeLink}</LocalizedLink> </nav> </div> );}Krok 6: Zadeklaruj swoją zawartość
Utwórz i zarządzaj deklaracjami zawartości, aby przechowywać tłumaczenia. Umieść pliki zawartości obok plików tras:
Skopiuj kod do schowka
import { t, type Dictionary } from "intlayer";const pageContent = { key: "page", content: { title: t({ en: "Welcome to React Router v7 + Intlayer", es: "Bienvenido a React Router v7 + Intlayer", fr: "Bienvenue sur React Router v7 + Intlayer", }), description: t({ en: "Build multilingual applications with ease using React Router v7 and Intlayer.", pl: "Twórz wielojęzyczne aplikacje z łatwością, korzystając z React Router v7 i Intlayer.", es: "Cree aplicaciones multilingües fácilmente usando React Router v7 y Intlayer.", fr: "Créez des applications multilingues facilement avec React Router v7 et Intlayer.", }), aboutLink: t({ en: "Learn About Us", es: "Aprender Sobre Nosotros", fr: "En savoir plus sur nous", }), },} satisfies Dictionary;export default pageContent;Skopiuj kod do schowka
import { t, type Dictionary } from "intlayer";const aboutContent = { key: "about", content: { title: t({ en: "About Us", es: "Sobre Nosotros", fr: "À propos de nous", }), content: t({ en: "This is the about page content.", es: "Este es el contenido de la página de información.", fr: "Ceci est le contenu de la page à propos.", }), homeLink: t({ en: "Home", es: "Inicio", fr: "Accueil", }), },} satisfies Dictionary;export default aboutContent;Twoje deklaracje treści mogą być zdefiniowane w dowolnym miejscu w aplikacji, pod warunkiem, że zostaną umieszczone w katalogu contentDir (domyślnie ./app). I muszą odpowiadać rozszerzeniu pliku deklaracji treści (domyślnie .content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}).
Po więcej szczegółów odsyłamy do dokumentacji deklaracji treści.
Krok 7: Tworzenie komponentów uwzględniających lokalizację
Utwórz komponent LocalizedLink do nawigacji uwzględniającej lokalizację:
Skopiuj kod do schowka
import type { FC } from "react";import { getLocalizedUrl, type LocalesValues } from "intlayer";import { useLocale } from "react-intlayer";import { Link, type LinkProps, type To } from "react-router";const isExternalLink = (to: string) => /^(https?:)?\/\//.test(to);// Funkcja lokalizująca ścieżkę na podstawie podanego localeexport const locacalizeTo = (to: To, locale: LocalesValues): To => { if (typeof to === "string") { if (isExternalLink(to)) { return to; // Zwraca link zewnętrzny bez zmian } return getLocalizedUrl(to, locale); // Zwraca lokalizowany URL } if (isExternalLink(to.pathname ?? "")) { return to; // Zwraca link zewnętrzny bez zmian } return { ...to, pathname: getLocalizedUrl(to.pathname ?? "", locale), // Lokalizuje pathname };};// Komponent linku lokalizowanegoexport const LocalizedLink: FC<LinkProps> = (props) => { const { locale } = useLocale(); return <Link {...props} to={locacalizeTo(props.to, locale)} />;};W przypadku, gdy chcesz nawigować do lokalizowanych tras, możesz użyć hooka useLocalizedNavigate:
Skopiuj kod do schowka
import { useLocale } from "react-intlayer";import { type NavigateOptions, type To, useNavigate } from "react-router";import { locacalizeTo } from "~/components/localized-link";export const useLocalizedNavigate = () => { const navigate = useNavigate(); const { locale } = useLocale(); const localizedNavigate = (to: To, options?: NavigateOptions) => { const localedTo = locacalizeTo(to, locale); navigate(localedTo, options); }; return localizedNavigate;};Krok 8: Utwórz komponent przełącznika języka
Utwórz komponent, który pozwoli użytkownikom zmieniać języki:
Skopiuj kod do schowka
import type { FC } from "react";import { getHTMLTextDir, getLocaleName, getLocalizedUrl, getPathWithoutLocale, Locales,} from "intlayer";import { useIntlayer, useLocale } from "react-intlayer";import { Link, useLocation } from "react-router";export const LocaleSwitcher: FC = () => { const { localeSwitcherLabel } = useIntlayer("locale-switcher"); const { pathname } = useLocation(); const { availableLocales, locale } = useLocale(); const pathWithoutLocale = getPathWithoutLocale(pathname); return ( <ol> {availableLocales.map((localeItem) => ( <li key={localeItem}> <Link aria-current={localeItem === locale ? "page" : undefined} aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeItem)}`} reloadDocument // Przeładuj stronę, aby zastosować nową lokalizację to={getLocalizedUrl(pathWithoutLocale, localeItem)} > <span> {/* Lokalizacja - np. FR */} {localeItem} </span> <span> {/* Język w jego 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> </li> ))} </ol> );};Aby dowiedzieć się więcej o hooku useLocale, zapoznaj się z dokumentacją.
Krok 10: Dodaj zarządzanie atrybutami HTML (opcjonalnie)
Utwórz hook do zarządzania atrybutami lang i dir w HTML:
Skopiuj kod do schowka
import { getHTMLTextDir } from "intlayer";import { useEffect } from "react";import { useLocale } from "react-intlayer";export const useI18nHTMLAttributes = () => { const { locale } = useLocale(); useEffect(() => { document.documentElement.lang = locale; document.documentElement.dir = getHTMLTextDir(locale); }, [locale]);};Następnie użyj go w swoim komponencie root:
Skopiuj kod do schowka
import { Outlet } from "react-router";import { IntlayerProvider } from "react-intlayer";import { useI18nHTMLAttributes } from "app/hooks/useI18nHTMLAttributes"; // importuj hookexport default function RootLayout() { useI18nHTMLAttributes(); // wywołaj hook return ( <IntlayerProvider> <Outlet /> </IntlayerProvider> );}Krok 10: Dodaj middleware (opcjonalnie)
Możesz również użyć intlayerProxy, aby dodać routing po stronie serwera do swojej aplikacji. Ten plugin automatycznie wykryje aktualny locale na podstawie URL i ustawi odpowiedni cookie locale. Jeśli locale nie jest określone, plugin wybierze najbardziej odpowiedni locale na podstawie preferencji językowych przeglądarki użytkownika. Jeśli nie zostanie wykryty żaden locale, nastąpi przekierowanie do domyślnego locale.
Zauważ, że aby używać intlayerProxy w produkcji, musisz przenieść pakiet vite-intlayer z devDependencies do dependencies.
Skopiuj kod do schowka
import { reactRouter } from "@react-router/dev/vite";import { defineConfig } from "vite";import { intlayer, intlayerProxy } from "vite-intlayer";import tsconfigPaths from "vite-tsconfig-paths";export default defineConfig({ plugins: [reactRouter(), tsconfigPaths(), intlayer(), intlayerProxy()],});Konfiguracja TypeScript
Intlayer wykorzystuje rozszerzanie modułów (module augmentation), aby korzystać z zalet TypeScript i wzmocnić Twoją bazę kodu.
Upewnij się, że Twoja konfiguracja TypeScript zawiera automatycznie generowane typy:
Skopiuj kod do schowka
{ // ... twoje istniejące konfiguracje include: [ // ... twoje istniejące dołączenia ".intlayer/**/*.ts", // Uwzględnij automatycznie generowane typy ],}Konfiguracja Git
Zaleca się ignorowanie plików generowanych przez Intlayer. Pozwala to uniknąć ich zatwierdzania do repozytorium Git.
Aby to zrobić, możesz dodać następujące instrukcje do pliku .gitignore:
Skopiuj kod do schowka
# Ignoruj pliki generowane przez Intlayer.intlayerRozszerzenie VS Code
Aby poprawić doświadczenie programistyczne z Intlayer, możesz zainstalować oficjalne rozszerzenie Intlayer dla VS Code.
Zainstaluj z VS Code Marketplace
To rozszerzenie oferuje:
- Autouzupełnianie kluczy tłumaczeń.
- Wykrywanie błędów w czasie rzeczywistym dla brakujących tłumaczeń.
- Podglądy w linii przetłumaczonej zawartości.
- Szybkie akcje umożliwiające łatwe tworzenie i aktualizację tłumaczeń.
Aby uzyskać więcej informacji na temat korzystania z rozszerzenia, zapoznaj się z dokumentacją rozszerzenia Intlayer VS Code.
Idź dalej
Aby pójść dalej, możesz zaimplementować edytor wizualny lub wyodrębnić swoją zawartość, korzystając z CMS.
Odnośniki do dokumentacji
- Dokumentacja Intlayer
- Dokumentacja React Router v7
- Dokumentacja React Router fs-routes
- useIntlayer hook
- useLocale hook
- Deklaracja treści
- Konfiguracja
Ten kompleksowy przewodnik zawiera wszystko, co potrzebne do integracji Intlayer z React Router v7 używając routingu opartego na systemie plików, aby uzyskać w pełni zinternacjonalizowaną aplikację z trasowaniem uwzględniającym lokalizację oraz wsparciem dla TypeScript.