Zadaj pytanie i otrzymaj streszczenie dokumentu, odwołując się do tej strony i wybranego dostawcy AI
Historia wersji
- "Początkowa wersja"v9.5.1026.09.2026
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
Jak zinternacjonalizować aplikację TanStack Start za pomocą Paraglide JS w 2026 roku
Spis treści
Czym jest Paraglide JS?
Paraglide JS (tworzony przez inlang) to biblioteka i18n oparta na kompilatorze. Zamiast dostarczać środowisko wykonawcze (runtime), które wyszukuje klucze w obiekcie JSON, kompiluje każdy komunikat do typowanej funkcji JavaScript (m.about_title()). Nieużywane komunikaty mogą zostać usunięte przez bundler (tree-shaking), a literówka w kluczu powoduje błąd kompilacji.
Paraglide to podejście do i18n stosowane w oficjalnych przykładach TanStack Router, które integruje się z TanStack Start za pośrednictwem trzech elementów:
- wtyczki Vite, która kompiluje komunikaty oraz runtime do
src/paraglide; - middleware serwerowego, które rozpoznaje język (locale) dla każdego żądania;
- przepisywania routera (router rewrite), które mapuje zlokalizowane adresy URL (
/fr/about) na drzewo tras (/about), dzięki czemu nie potrzebujesz segmentu$locale.
Ten przewodnik konfiguruje wszystkie trzy elementy, a następnie omawia kwestie, które Paraglide pozostawia do samodzielnej implementacji: lang i dir, przełącznik języków, przetłumaczone metadane, canonical, hreflang z x-default, Open Graph, JSON-LD, sitemap, robots.txt, pre-rendering oraz zlokalizowane strony 404.
Szukasz innego stosu technologicznego? Zobacz przewodnik TanStack Start + use-intl, przewodnik TanStack Start + Lingui lub przewodnik TanStack Start + Intlayer.
Porównujesz dwa podejścia oparte na kompilatorze? Przeczytaj czy Intlayer jest lżejszy od Paraglide?.
Co benchmark mówi o Paraglide w TanStack Start
Benchmark i18n uruchamia tę samą 10-stronicową, 10-języczną aplikację TanStack Start z każdą główną biblioteką i mierzy, co przeglądarka faktycznie pobiera.
Dynamiczne ładowanie JSON
Wczytuje tłumaczenia leniwie w czasie wykonywania
Ograniczony JSON (przestrzenie nazw)
Przestrzenie nazw tłumaczeń na stronę
Benchmark wydajności I18n
Czym jest ta metryka?
Całkowity skompresowany przez gzip rozmiar pakietu biblioteki umiędzynarodowienia. Obejmuje tylko dostawcę i logikę pobierania treści po tree-shakingu i minifikacji.
Dlaczego to jest ważne?
Mniejszy rozmiar biblioteki zmniejsza obciążenie u klienta.
Zobacz jako
Kluczowe dane dla @inlang/paraglide-js@2.15.1, zmierzone 2026-09-26 (gzip):
Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość
| Konfiguracja | Rozmiar biblioteki | JS na stronę | Wyciek innych języków | Wyciek innych stron | Czas ładowania strony |
|---|---|---|---|---|---|
| Brak i18n (aplikacja bazowa) | - | 111.0 KB | 0% | 0% | 15.7 ms |
| Paraglide JS | 1.8 KB | 125.1 KB | 49.7% | 0% | 22.1 ms |
react-intlayer | 4.5 KB | 126.8 KB | 0% | 0% | 14.8 ms |
use-intl | 75.9 KB | 128.7 KB | 0% | 0% | 17.4 ms |
| Lingui | 56.7 KB | 120.2 KB | 8.6% | 0% | 21.9 ms |
Główne wnioski:
- Środowisko wykonawcze (runtime) jest miniaturowe, a strony nie przeciekają. Runtime jest generowany pod Twoją konfigurację, a komunikaty są importowane dokładnie tam, gdzie są używane.
- Występuje wyciek języków. Każda funkcja komunikatu zawiera wszystkie wersje językowe, więc około połowa przetłumaczonych ciągów znaków przesyłanych na stronę dotyczy języków, których użytkownik nie używa. Im więcej języków dodasz, tym większy staje się ten udział.
- Czas ładowania strony jest najwolniejszy w grupie, częściowo dlatego, że język jest ustalany przez strategie przy każdym wywołaniu, zamiast być odczytywany z kontekstu React.
Zobacz pełne dane: raport benchmarku TanStack Start oraz repozytorium benchmarku.
Porównanie funkcji w TanStack Start
Jak Paraglide JS wypada na tle innych bibliotek powszechnie używanych w TanStack Start:
Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość
| Funkcja | react-intlayer (Intlayer) | use-intl | Paraglide JS | Lingui |
|---|---|---|---|---|
| Tłumaczenia blisko komponentów | ✅ Współdzielona lokalizacja | ❌ Scentralizowany JSON | ❌ Jeden plik JSON na język | ⚠️ Tekst źródłowy w komponentach |
| Integracja z TypeScript | ✅ Automatycznie generowane typy | ✅ Poprzez AppConfig | ✅ Typowane funkcje komunikatów | ⚠️ Tylko makra |
| Wykrywanie brakujących tłumaczeń | ✅ Błędy typów i ostrzeżenia budowy | ⚠️ Zapasowy fallback | ⚠️ Powrót do języka bazowego | ⚠️ Powrót do tekstu źródłowego |
| Bogata treść (JSX, Markdown) | ✅ Bezpośrednie wsparcie | ⚠️ Tagi przez t.rich | ⚠️ Ciągi znaków | ✅ JSX wewnątrz <Trans> |
| Routing zlokalizowany | ✅ Wbudowany | ❌ Ręczny {-$locale} | ✅ urlPatterns + rewrite routera | ❌ Ręczny {-$locale} |
| Zmiana języka bez przeładowania | ✅ Tak | ✅ Tak | ❌ Pełne przeładowanie strony | ✅ Tak |
| Liczba mnoga (Pluralizacja) | ✅ Oparta na wyliczeniach | ✅ ICU | ✅ Warianty | ✅ ICU |
| ICU MessageFormat | ✅ Poprzez format: "icu" | ✅ Natywnie | ⚠️ Poprzez wtyczkę inlang | ✅ Natywnie |
| Formaty treści | ✅ .ts, .json, .md, .yaml... | ⚠️ .json | ⚠️ inlang JSON | ✅ PO, JSON, CSV |
| Tłumaczenie AI | ✅ Własny dostawca i klucz | ❌ Brak | ❌ Brak | ❌ Brak |
| Edytor wizualny / CMS | ✅ Lokalny edytor + opcjonalny CMS | ❌ Zewnętrzne platformy | ⚠️ Aplikacje ekosystemu inlang | ❌ Zewnętrzne platformy |
| Pomocnicy SEO (hreflang, sitemap) | ✅ Wbudowani | ❌ Ręcznie | ⚠️ Zlokalizowane URL, reszta ręcznie | ❌ Ręcznie |
| Rozmiar runtime (gzip, benchmark) | 4.5 KB | 75.9 KB | 1.8 KB | 56.7 KB |
| Wyciek, najlepsza konfiguracja (język / strona) | 0% / 0% | 0% / 0% | 49.7% / 0% | 8.6% / 0% |
| Brakujące tłumaczenia w CI | ✅ npx intlayer test | ⚠️ Brak wbudowanego | ⚠️ Brak wbudowanego | ✅ lingui compile --strict |
Wartości rozmiaru runtime i wycieków pochodzą z benchmarku TanStack Start. Wyciek jest mierzony w najlepszej konfiguracji dla każdej biblioteki.
Inne przewodniki po TanStack Start: Lingui, use-intl oraz Intlayer.
Dobre praktyki, których warto przestrzegać
- Ustaw
langidirw tagu<html>na podstawie ustalonego języka, bezpośrednio po stronie serwera. - Utrzymuj jeden adres URL na język ze strategią prefiksów (
/fr/about), aby każda wersja językowa mogła być indeksowana. - Umieść
urlna pierwszym miejscu w strategii wyboru języka, dzięki czemu adres URL jest źródłem prawdy, a roboty indeksujące otrzymują dokładnie tę stronę, o którą prosiły. - Używaj płaskich, opisowych kluczy komunikatów (
about_title), które przejrzyście mapują się na nazwy funkcji. - Zatwierdzaj w repozytorium pliki
messages/*.json, a nie wygenerowany foldersrc/paraglide, aby uniknąć konfliktów scalania w wygenerowanym kodzie. - Tłumacz metadane i deklaruj
canonical,hreflangorazx-defaultna każdej stronie. - Generuj wielojęzyczną mapę witryny (sitemap) i plik robots.txt, a także pre-renderuj każdy język.
- Używaj rzeczywistych linków w przełączniku języków, aby roboty indeksujące mogły odkryć wszystkie wersje językowe.
Zobacz nasz przewodnik na temat internacjonalizacji i SEO oraz przewodnik po hreflang.
Przewodnik krok po kroku po konfiguracji Paraglide JS w aplikacji TanStack Start
Oto struktura projektu, którą utworzymy:
Skopiuj kod do schowka
Zwróć uwagę, że nie ma folderu $locale: funkcja rewrite routera usuwa prefiks przed dopasowaniem trasy.
Zainstaluj zależności
Rozpocznij od projektu TanStack Start, a następnie zainicjalizuj Paraglide. Polecenie init tworzy plik
project.inlang/settings.json, pierwszy plikmessages/en.jsonoraz instaluje pakiet.bashKopiuj kodSkopiuj kod do schowka
- @inlang/paraglide-js: kompilator i jego wtyczka Vite. Nie ma potrzeby instalowania pakietu runtime: kod wykonawczy jest generowany bezpośrednio w Twoim projekcie.
Skonfiguruj języki (Locales)
project.inlang/settings.jsonstanowi jedyne źródło prawdy o dostępnych językach. Wtyczka formatu komunikatów odczytuje jeden plik JSON dla każdego języka.project.inlang/settings.jsonKopiuj kodSkopiuj kod do schowka
Skonfiguruj wtyczkę Vite i strategię URL
Wtyczka kompiluje komunikaty przy każdej zmianie. W przypadku TanStack Start istotne są trzy opcje:
strategy: uporządkowana lista miejsc, z których odczytywany jest język. Umieszczenieurlna pierwszym miejscu sprawia, że adres URL jest źródłem prawdy. WartościcookieorazpreferredLanguagesą używane przez middleware serwera, gdy adres URL nie determinuje języka.urlPatterns: określa sposób mapowania języka na adres URL. Języki inne niż domyślny są wymienione jako pierwsze, ponieważ wygrywa pierwszy pasujący wzorzec. Tutaj język domyślny pozostaje bez prefiksu (/about), a pozostałe języki otrzymują prefiks (/fr/about).outputStructure: "message-modules": jeden moduł na komunikat, co pozwala bundlerowi na usunięcie komunikatów, których dana strona nie importuje.
vite.config.tsKopiuj kodSkopiuj kod do schowka
Dodaj wygenerowany folder do
.gitignore. Jest on przebudowywany podczasdevibuild:.gitignoreKopiuj kodSkopiuj kod do schowka
Utwórz pliki tłumaczeń
Każdy klucz staje się funkcją wyeksportowaną z
src/paraglide/messages. Płaskie klucze w formacie snake_case zapewniają najbardziej czytelne nazwy funkcji. Zmienne korzystają z symboli zastępczych{name}.messages/en.jsonKopiuj kodSkopiuj kod do schowka
messages/fr.jsonKopiuj kodSkopiuj kod do schowka
Formy liczby mnogiej używają składni wariantów formatu komunikatów inlang:
messages/en.jsonKopiuj kodSkopiuj kod do schowka
Dodaj middleware serwerowe
Middleware ustala język dla każdego żądania zgodnie z Twoją strategią i udostępnia go dla
getLocale()podczas całego renderowania po stronie serwera za pośrednictwem zakresuAsyncLocalStorage. Dzięki temu jednoczesne żądania w różnych językach są w pełni bezpieczne.W TanStack Start opakuj domyślny punkt wejścia serwera:
src/server.tsKopiuj kodSkopiuj kod do schowka
Przepisz zlokalizowane adresy URL w routerze
Opcja
rewritew TanStack Router przekształca adresy URL na granicy działania routera:- input:
/fr/aboutjest przekształcane na/aboutprzed dopasowaniem trasy, dzięki czemu pojedyncza trasaabout.tsxobsługuje każdy język; - output: każdy wygenerowany
href(linki, przekierowania, nawigacja) jest lokalizowany dla aktywnego języka, więc<Link to="/about">renderuje/fr/aboutna stronie francuskojęzycznej.
src/router.tsxKopiuj kodSkopiuj kod do schowka
Ponieważ linki są automatycznie lokalizowane przez regułę rewrite, nie potrzebujesz własnego komponentu
LocalizedLink: używaj standardowegoLinkz TanStack Router.- input:
Utwórz dokument główny (Root Document)
Funkcja
getLocale()zwraca język ustalony przez middleware na serwerze oraz język z adresu URL w przeglądarce, dzięki czemu atrybutylangidirsą identyczne w kodzie HTML z serwera i po hydratacji.src/i18n/config.tsKopiuj kodSkopiuj kod do schowka
src/routes/__root.tsxKopiuj kodSkopiuj kod do schowka
Wykorzystaj tłumaczenia na swoich stronach
Komunikaty to zwykłe funkcje: zaimportuj
m, wywołaj funkcję i przekaż zmienne jako obiekt. Wszystko jest w pełni typowane, łącznie ze zmiennymi.src/routes/index.tsxKopiuj kodSkopiuj kod do schowka
src/routes/about.tsxKopiuj kodSkopiuj kod do schowka
Funkcja komunikatu przyjmuje również jawnie określony język:
m.about_title({}, { locale: "fr" }). Jest to przydatne w kodzie serwerowym renderującym treść w języku innym niż język bieżącego żądania, np. przy wysyłce wiadomości e-mail.Zmień język treści
OpcjonalneRenderuj przełącznik jako linki z
localizeHref, aby roboty indeksujące odkryły każdy język. FunkcjasetLocalezapisuje wybór w pliku cookie i przeładowuje stronę w nowym języku: pełne przeładowanie jest oczekiwanym zachowaniem w Paraglide, ponieważ funkcje komunikatów odczytują język przy każdym wywołaniu, zamiast subskrybować stan React.src/components/LocaleSwitcher.tsxKopiuj kodSkopiuj kod do schowka
Umiędzynarodowij swoje metadane
OpcjonalneKażda wersja językowa może pozycjonować się niezależnie, pod warunkiem że każda strona udostępnia:
- przetłumaczony tag
<title>oraz opisdescription; - kanoniczny adres URL (canonical) wskazujący na samą siebie;
- odpowiednik
hreflangdla każdego języka, plusx-default; - tagi Open Graph
og:locale,og:locale:alternateiog:url; - dane strukturalne JSON-LD z polem
inLanguage.
Funkcja
localizeUrlz Paraglide buduje alternatywne adresy URL na podstawie konfiguracjiurlPatterns, dzięki czemu nigdy nie rozbiegną się one z rzeczywistym routingiem:src/i18n/seo.tsKopiuj kodSkopiuj kod do schowka
- przetłumaczony tag
Umiędzynarodowij mapę witryny (Sitemap)
OpcjonalneWielojęzyczna mapa witryny zawiera każdy adres URL dla każdego języka, a każdy wpis deklaruje wszystkie swoje alternatywne wersje za pomocą
xhtml:link:src/routes/sitemap[.]xml.tsKopiuj kodSkopiuj kod do schowka
Umiędzynarodowij plik robots.txt
OpcjonalneTrasy prywatne istnieją w każdym języku, więc reguły
Disallowmuszą obejmować każdą zlokalizowaną ścieżkę. Usuń plikpublic/robots.txt, jeśli został wygenerowany przez szablon startowy, a następnie serwuj go bezpośrednio z trasy:src/routes/robots[.]txt.tsKopiuj kodSkopiuj kod do schowka
Włącz pre-rendering dla wszystkich języków
OpcjonalneWskaż zlokalizowaną ścieżkę każdej strony, aby TanStack Start wygenerował statycznie wszystkie wersje językowe. Funkcja
localizeHrefto wygenerowany kod bez zależności od przeglądarki, więc można go uruchomić wvite.config.ts, ale plik istnieje dopiero po pierwszej kompilacji. Ręczne wypisanie ścieżek, jak poniżej, zapobiega problemom z kolejnością budowania:vite.config.tsKopiuj kodSkopiuj kod do schowka
Ponieważ przełącznik renderuje rzeczywiste linki, opcja
crawlLinks: truepozwala dodatkowo odkryć podstrony, które mogły zostać pominięte na liście.Obsłuż zlokalizowane strony 404
OpcjonalneDzięki regule rewrite adres
/fr/does-not-existjest dopasowywany jako/does-not-exist, a funkcjagetLocale()wciąż zwracafr, więc główny komponentnotFoundComponentz kroku 7 renderuje się w języku francuskim. Trasa typu catch-all gwarantuje, że głębokie ścieżki również zostaną prawidłowo obsłużone. Oznacz stronę jakonoindex: React 19 automatycznie przenosi tag<meta>do sekcji<head>.src/components/NotFound.tsxKopiuj kodSkopiuj kod do schowka
src/routes/$.tsxKopiuj kodSkopiuj kod do schowka
Uzyskaj dostęp do języka w funkcjach serwerowych
OpcjonalneFunkcje serwerowe (Server Functions) działają wewnątrz zasięgu middleware Paraglide, więc
getLocale()działa również w nich:src/server/sendWelcomeEmail.tsKopiuj kodSkopiuj kod do schowka
Porównanie z Intlayer
OpcjonalneNie istnieje bezpośredni adapter przejściowy z Paraglide do Intlayer, ponieważ obie biblioteki opierają się na podobnej koncepcji: kompilacja treści w czasie budowania i dostarczanie minimalnego kodu runtime. Różnice tkwią w tym, co trafia do przeglądarki oraz jak organizowana jest treść:
- Języki (Locales): Intlayer ładuje słowniki dynamiczne dla wybranego języka (0% wycieku języków w benchmarku), podczas gdy każda funkcja komunikatu Paraglide zawiera wszystkie wersje językowe (49.7%).
- Organizacja treści: treść może znajdować się w plikach
.content.tsbezpośrednio obok komponentów lub w plikach scentralizowanych. Zobacz i18n per-komponent vs scentralizowany. - Przełączanie języka: treść jest odczytywana z kontekstu React, więc zmiana języka ponownie renderuje komponenty bez przeładowywania strony.
- Wygenerowany kod: nic nie jest generowane wewnątrz folderu
src, więc nie ma potrzeby ponownego generowania plików przed commitem.
Jeśli migrujesz z innej biblioteki niż Paraglide, adaptery kompatybilności zachowują API
use-intl,next-intl,react-i18next,react-intllub Lingui, podmieniając jedynie silnik wykonawczy.Zobacz artykuł czy Intlayer jest lżejszy od Paraglide? oraz przewodnik Intlayer dla TanStack Start.
Zautomatyzuj swoje tłumaczenia za pomocą Intlayer
OpcjonalneParaglide renderuje tłumaczenia, ale nie pomaga w ich tworzeniu. Intlayer jest darmowy i open source, a jego narzędzia pomagają nawet w projektach opartych na Paraglide:
- Tłumacz za pomocą AI używając własnego klucza API i dostawcy. Zobacz auto fill oraz narzędzie CLI.
- Zachowaj pliki JSON jako źródło prawdy dzięki wtyczce sync JSON.
- Testuj brakujące tłumaczenia w procesach CI. Zobacz testowanie tłumaczeń.
- Skanuj wdrożoną stronę pod kątem brakujących tagów
hreflang, nieprawidłowych linków kanonicznych i wycieków językowych za pomocą polecenia scan.
Często zadawane pytania (FAQ)
To solidny wybór: jest wykorzystywany w oficjalnych przykładach TanStack Router, ma najmniejszy rozmiar runtime w benchmarku (~1.8 KB gzip), a komunikaty są w pełni typowane. Kompromisem jest to, że każda funkcja komunikatu zawiera wszystkie języki, co powoduje wyciek około połowy przetłumaczonych ciągów znaków do użytkowników innych języków, a także fakt, że zmiana języka przeładowuje stronę.
Nie. Reguła rewrite w routerze usuwa prefiks językowy przed dopasowaniem trasy i dodaje go z powrotem do generowanych linków, dzięki czemu pojedynczy plik about.tsx obsługuje trasy /about, /fr/about oraz /es/about.
Funkcje komunikatów odczytują język w momencie ich wywołania i nie są podpięte do stanu React. Dlatego setLocale domyślnie przeładowuje stronę, aby każdy komunikat wyrenderował się ponownie w nowym języku. Możesz przekazać opcję { reload: false }, ale wtedy musisz samodzielnie zadbać o ponowne wyrenderowanie drzewa komponentów.
Lepiej tego nie robić. Folder jest generowany ponownie przy każdym uruchomieniu dev i build, a zatwierdzanie go powoduje konflikty scalania w wygenerowanych plikach. Zamiast tego dodawaj do repozytorium pliki messages/*.json oraz project.inlang/settings.json.
Użyj localizeUrl, aby zbudować jeden bezwzględny adres URL na język wewnątrz funkcji head() trasy, a także dodaj x-default wskazujący na język bazowy. Krok 10 zawiera gotową funkcję pomocniczą, a krok 11 dodaje te same wersje alternatywne do mapy witryny (sitemap).
Nieużywane komunikaty są usuwane przy włączonej opcji outputStructure: "message-modules", dzięki czemu zawartość innych podstron nie przecieka. Nieużywane języki nie są jednak usuwane: każda funkcja komunikatu zawiera wszystkie tłumaczenia, dlatego benchmark wykazuje 49.7% wycieku języków.
Komentarze
Nie ma jeszcze komentarzy. Bądź pierwszą osobą, która podzieli się swoimi przemyśleniami.
