Zadaj pytanie i otrzymaj streszczenie dokumentu, odwołując się do tej strony i wybranego dostawcy AI
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 wybrać odpowiednią bibliotekę i18n dla Svelte
Svelte nie dostarcza żadnych wbudowanych narzędzi do i18n. Brak $t, brak prymitywu locale, brak formatu wiadomości. Każda opcja to rozwiązanie zewnętrzne, a ekosystem Svelte to miejsce, w którym i18n w czasie kompilacji poszło najdalej, dlatego poszczególni kandydaci różnią się od siebie bardziej niż w przypadku React czy Vue.
Ten przewodnik wymienia pytania, na które warto odpowiedzieć w pierwszej kolejności, a następnie przypisuje odpowiedzi do svelte-i18n, Paraglide, typesafe-i18n, wuchale i Intlayer, zarówno dla Vite + Svelte, jak i dla SvelteKit.

Spis treści
Sześć pytań, na które należy odpowiedzieć przed porównaniem bibliotek
- Vite SPA czy SvelteKit? W SPA store na poziomie modułu jest poprawny: jedna karta, jeden użytkownik, jedno locale. W SvelteKit ten sam singleton jest współdzielony między równoległymi żądaniami na serwerze, przez co żądanie B może wyrenderować się w języku żądania A. Biblioteka albo zapewnia strukturę dla każdego żądania (context,
locals), albo pozostawia jej implementację Tobie. - Kto pisze tłumaczenia? Programiści, TMS, agencja dostarczająca ciągi ICU, czy pipeline AI.
svelte-i18nobsługuje ICU. Paraglide itypesafe-i18nużywają własnej składni. Dopasuj rozwiązanie do dostawcy treści. - Ile masz wersji językowych (locales) i podstron? Dwa języki i pięć podstron mogą wysłać wszystko do klienta. Dziesięć języków i czterdzieści tras już nie, a różnica między katalogami runtime a skompilowanymi wiadomościami staje się głównym kosztem.
- Czy potrzebujesz typowania kluczy?
$_("cart.totl")to błąd w runtime wsvelte-i18n. Biblioteki czasu kompilacji czynią z tego błąd typowania już na etapie kompilacji. - Store'y ze Svelte 4 czy runes ze Svelte 5? Runes zmieniają składnię stanu locale, a nie problem współdzielenia stanu. Jednak
$statew pliku.tskompiluje się do zwykłej zmiennej, więc runtime biblioteki musi obsługiwać runes, jeśli korzystasz ze Svelte 5. - Czy akceptujesz wygenerowane pliki w repozytorium? Zarówno Paraglide, jak i
typesafe-i18ngenerują kod JavaScript lub TypeScript bezpośrednio w Twoim drzewie źródłowym. Dla niektórych zespołów to żaden problem, inni mierzą się z konfliktami scalania (merge conflicts) na każdej równoległej gałęzi.
Zapisz swoje odpowiedzi. Wszystkie poniższe sekcje będą się do nich odnosić.
Krajobraz w jednym ujęciu
i18n w Svelte pojawiło się później niż w React czy Vue i od razu przeszło do fal opartych na kompilacji.

Katalogi JSON, ICU parsowane w przeglądarce za pomocą intl-messageformat, locale w store'ach na poziomie modułu ($locale, $_). Najbardziej popularne, dobrze udokumentowane, konfiguracja SSR leży po Twojej stronie.
Generator obserwuje Twoje katalogi i generuje typowane akcesory ($LL.cart.total()). Solidny model, pliki generowane w repozytorium, a sam projekt nie był ostatnio zbyt aktywnie rozwijany.
Paraglide kompiluje każdą wiadomość do wyeksportowanej funkcji, dzięki czemu bundler eliminuje w procesie tree-shaking to, czego dana trasa nigdy nie wywołuje. wuchale wyodrębnia ciągi znaków ze znaczników podczas budowania. Intlayer deklaruje treść dla każdego komponentu oraz generuje typy i słowniki per komponent.
Artykuł historia JavaScript i18n szczegółowo opisuje każdą z tych fal.
Decyzja, która ma największe znaczenie: gdzie znajduje się treść i kiedy jest ładowana
Dwa wybory strukturalne odpowiadają za większość różnic w rozmiarze bundle między konfiguracjami:
- Treść scentralizowana lub per komponent (scoped). Jeden plik
locales/en.jsondla całej aplikacji lub pojedyncza deklaracja obok każdego komponentu. - Import statyczny lub dynamiczny. Wszystko ładowane przy starcie albo aktywne locale (oraz optymalnie aktywna trasa) pobierane na żądanie.
Wykres szacuje payload dla teoretycznej aplikacji mającej od 1 do 10 podstron, przetłumaczonej na 1 do 10 języków, z około 30 KB tekstu na stronę.

svelte-i18n domyślnie znajduje się w lewym górnym rogu: register("fr", () => import("./fr.json")) zapewnia dynamiczne ładowanie dla każdego locale, ale katalog danego języka to jeden obiekt i załadowanie go powoduje wczytanie treści wszystkich podstron. Paraglide to interesujący przypadek: ponieważ każda wiadomość jest osobnym exportem, tree-shaking zapewnia podział na poziomie podstron bez dodatkowej pracy, a benchmark Svelte potwierdza, że działa to zgodnie z opisem w Vite + Svelte (w benchmarkach React i Next.js tak nie było). Intlayer osiąga ten sam rezultat dzięki deklaracjom na poziomie pojedynczych komponentów.
Jeśli Twoją odpowiedzią na pytanie 3 było "wiele podstron", potraktuj tę sekcję priorytetowo ponad preferencjami dotyczącymi API. Wpis i18n per komponent a scentralizowane omawia kwestię utrzymania tego samego kompromisu.
Kandydaci
Rozmiary bibliotek pochodzą z benchmarku Svelte: store wraz z akcesorem w pustym komponencie, po bundle, tree-shakingu i minifikacji, w aplikacji z 10 podstronami i 10 wersjami językowymi. Sama treść jest mierzona osobno.
Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość
| Biblioteka | Gdzie trafiają wiadomości | Stan locale | Typy na kluczach | Format wiadomości | Podział per trasa | Rozmiar biblioteki |
|---|---|---|---|---|---|---|
svelte-i18n | Katalogi JSON per locale | Svelte store na poziomie modułu | Ręczna unia | ICU | Nie | ~16.6 kB |
typesafe-i18n | Generowane moduły TS | Adapter store | Generowane | Własny | Częściowy | Mały |
| Paraglide | Projekt inlang, kompilowany do funkcji | Odczyt per wywołanie z cookie, URL lub storage | Generowane | Własny | Tak, przez tree-shaking | Bliski zeru |
wuchale | Ekstrakcja z markup podczas budowania | Store | N/D (brak kluczy) | Własny | Tak | Mały |
| Intlayer | .content.ts obok komponentu | Context plus store, obsługa runes | Generowane, domyślnie | Helpery | Tak, per komponent | Linia bazowa |
Liczby są migawką dla wersji z benchmarku. Uruchom go na własnej aplikacji przed podjęciem decyzji opartej wyłącznie na rozmiarze.
Rozmiar biblioteki Paraglide bliski zeru wynika z jej konstrukcji: runtime jest generowany bezpośrednio do Twojego repozytorium. Intlayer wymaga wtyczki vite-intlayer, więc nie działa bez kroku budowania.
Dopasuj swoje odpowiedzi do biblioteki
svelte-i18n. To najbardziej udokumentowana opcja, $_ czyta się naturalnie w markup, a register wraz z waitLocale() pokrywa lazy loading dla każdego locale. Zablokuj pierwsze renderowanie (first paint) za pomocą isLoading, w przeciwnym razie użytkownik zobaczy surowe klucze. Jeśli aplikacja może w przyszłości zyskać serwer, umieść locale w Svelte context od pierwszego dnia zamiast polegać na store modułu; teraz nic to nie kosztuje, a zapobiega trudnym do wykrycia błędom na produkcji.
Problem współdzielenia stanu jest tutaj decydujący. svelte-i18n działa w SvelteKit, ale konfiguracja per żądanie (hooks.server.ts, locals, load, a następnie setContext) leży po Twojej stronie i łatwo popełnić w niej subtelny błąd. Paraglide dostarcza integrację ze SvelteKit, która obsługuje routing i odczytuje locale przy każdym wywołaniu, co pozwala uniknąć problemu singletona. Intlayer ustawia locale z danych load do contextu. Artykuł o SvelteKit i18n wyjaśnia wybór między [[lang]] a reroute, który warto podjąć przed wyborem biblioteki.
svelte-i18n natywnie obsługuje ICU dzięki intl-messageformat, więc integruje się bezpośrednio z większością dostawców. Paraglide i typesafe-i18n używają własnej składni i wymagają konwersji. Wsparcie dla ICU w Intlayer jest częściowe, więc jeśli otrzymujesz obecnie ciągi ICU, potraktuj to jako czynnik blokujący.
Rozwiązania czasu kompilacji. Tree-shaking w Paraglide działa w Vite + Svelte, a koszt biblioteki jest bliski zeru. Słowniki per komponent w Intlayer dają ten sam rezultat bez generowania plików w repozytorium. svelte-i18n dołącza parser ICU oraz cały katalog, osiągając w benchmarku około 4,5× rozmiar svelte-intlayer jeszcze przed dodaniem jakiejkolwiek treści.
Wszystko poza podstawową konfiguracją svelte-i18n, gdzie jedynym typowaniem jest ręcznie pisana unia, która natychmiast rozjeżdża się z plikiem JSON. typesafe-i18n, Paraglide i Intlayer generują typy bezpośrednio z treści. Sprawdź aktywność repozytorium typesafe-i18n przed oparciem na nim swojej bazy kodu. Artykuł wykrywanie brakujących tłumaczeń porównuje, co poszczególne narzędzia wyłapują w czasie budowania.
To eliminuje Paraglide oraz typesafe-i18n. svelte-i18n i Intlayer trzymają swoje pliki wyjściowe w node_modules lub w katalogu budowania. W przypadku Intlayer pliki .content.ts są ręcznie pisanym kodem źródłowym, a skompilowane słowniki i typy trafiają do .intlayer/ i są ignorowane przez git.
Wtedy scentralizowany JSON traci swoje uzasadnienie. Treść współdzielona z komponentem w połączeniu z CLI uzupełniającym brakujące wersje językowe to najprostsza droga. Polecenie fill w Intlayer działa z Twoim własnym kluczem API (OpenAI, Anthropic, Mistral, Gemini) i tłumaczy ponownie tylko to, co uległo zmianie. Ekosystem inlang w Paraglide oferuje hostowane odpowiedniki z osobnymi planami.
Gdzie każda biblioteka ma słabe punkty
svelte-i18n: najcięższa z zestawu, brak typów dla kluczy, brak podziału per trasa, store na poziomie modułu, który wycieka między żądaniami w SvelteKit, chyba że samodzielnie skonfigurujesz context.typesafe-i18n: proces obserwatora (watcher), generowane pliki w repozytorium oraz repozytorium, które nie było ostatnio aktywnie rozwijane.- Paraglide: generowane pliki commitowane do repozytorium i regenerowane przed każdym pushem, konflikty scalania na równoległych gałęziach oraz locale odczytywane z cookie lub storage przy każdym wywołaniu wiadomości zamiast ze store'a, co generuje narzut przy zmianie języka.
wuchale: ciekawy pomysł na ekstrakcję, ale wciąż wczesny etap. Benchmark React napotkał problemy z reaktywnością, które wymagały wymuszania ponownego renderowania providera, a dokumentacja jest skromna.- Intlayer: wymagana wtyczka do buildera, mniejszy ekosystem, częściowe wsparcie ICU oraz treść rozproszona po całej bazie kodu z założenia, więc wyeksportowanie pojedynczego pliku JSON dla tłumacza wymaga dodatkowych narzędzi.
Jak każda opcja wygląda w kodzie
Ten sam komponent, podsumowanie koszyka z tytułem i liczbą mnogą, napisany przy użyciu każdego kandydata. Najciekawszą częścią nie jest sam markup, lecz to, gdzie znajduje się treść, jak przechowywane jest locale i co wie system typów.
Skopiuj kod do schowka
Skopiuj kod do schowka
ICU przez intl-messageformat, locale w store na poziomie modułu. $_ przyjmuje dowolny ciąg znaków; jedynym typowaniem jest unia pisana ręcznie.
Skopiuj kod do schowka
Skopiuj kod do schowka
Każda wiadomość jest wygenerowaną, typowaną funkcją, eliminowaną przez tree-shaking, jeśli nie zostanie wywołana. Folder paraglide/ jest generowany w Twoim repozytorium, a locale jest odczytywane przy każdym wywołaniu zamiast ze store'a.
Skopiuj kod do schowka
Skopiuj kod do schowka
Typowane akcesory generowane przez proces watcher. Model jest poprawny; wygenerowane pliki trafiają do repozytorium, a projekt nie notował ostatnio dużej aktywności.
Skopiuj kod do schowka
Skopiuj kod do schowka
Wszystkie wersje językowe w jednym pliku obok komponentu. useIntlayer zwraca czytelny store, więc $content to automatyczna subskrypcja, którą już znasz, a locale jest przechowywane w context (bezpiecznym dla SSR), a nie w singletonie modułu.
Korzystasz już z svelte-i18n? Adapter kompatybilności @intlayer/svelte-i18n tworzy alias dla pakietu na poziomie bundlera, dzięki czemu $_, $date, $number oraz Twoje płaskie klucze nadal działają, podczas gdy Intlayer dostarcza treść.
Zanim podejmiesz decyzję
Tabela funkcji mówi o tym, co biblioteka potrafi dzisiaj. Poniższe punkty pokazują, jak będzie wyglądać codzienna praca z nią.
Sprawdź aktywność repozytorium.
Commity, czas odpowiedzi na zgłoszenia (issues) oraz informacja, czy ostatnie wydanie minor miało miejsce w tym roku. Dobry projekt bez maintainera to odroczona w czasie migracja.
Nie wybieraj na podstawie liczby pobrań z npm.
Najczęściej instalowana biblioteka to ta, która powstała jako pierwsza, a nie ta, która najlepiej pasuje do bazy kodu Svelte w 2026 roku. Liczba pobrań mierzy historię, a nie dopasowanie.

Sprawdź, kto finansuje maintainera i co sprzedaje.
svelte-i18n jest wspierane przez Crowdin, podobnie jak next-intl czy vue-i18n. i18next jest wspierane przez Locize. Tolgee, Paraglide (inlang) oraz Intlayer prowadzą własne platformy. Dostawca, którego przychód zależy od hostowanych tłumaczeń, nie ma motywacji, aby tłumaczenie wewnątrz Twojego toolchaina było bezpłatne. Intlayer jako jedyny z tego zestawu dostarcza tłumaczenie AI przez CLI z Twoim własnym kluczem API oraz CMS, który możesz samodzielnie hostować.
Czy rozwiązanie jest gotowe na agentów AI?
Agenci AI wciąż miewają trudności z i18n: zapominają o wersjach językowych, wymyślają klucze i mieszają składnie wiadomości. Czy biblioteka dostarcza Agent Skills lub serwer MCP, aby agent mógł listować, uzupełniać i testować treści? Oraz czy ładowanie treści jest domyślnie zoptymalizowane, czy też ktoś musi co kwartał robić przegląd przestrzeni nazw (namespaces) i dynamicznych importów?
Bezpieczeństwo typów od pierwszego uruchomienia.
Nie "możliwe do otypowania po dodatkowej konfiguracji", ale "błędny klucz powoduje błąd tsc zaraz po instalacji". Sprawdź, co się dzieje z kluczem, który nie istnieje, oraz z językiem, w którym brakuje jednego tłumaczenia.
Wykrywanie nieużywanej treści.
Katalogi mają tendencję wyłącznie do rozrastania się. Build Intlayer usuwa nieużywane pola i raportuje je (build.purge). Paraglide osiąga to dzięki swojej architekturze, ponieważ niewywołana funkcja wiadomości jest usuwana w procesie tree-shaking. Każda inna biblioteka pozostawia to zadanie Tobie.
Doświadczenie programisty (Developer Experience).
Czas od konfiguracji do pierwszego przetłumaczonego tekstu, LSP lub rozszerzenie do VS Code, które wyświetla tłumaczenie po najechaniu kursorem i przenosi do deklaracji, CLI do uzupełniania, testowania i publikowania oraz sposób na edycję treści dla osób nietechnicznych (edytor wizualny lub CMS) bez konieczności tworzenia pull requesta.
Często zadawane pytania
W przypadku Vite SPA z małym katalogiem, tak. To najbardziej udokumentowana opcja, a kompatybilność z ICU ma znaczenie dla wielu zespołów. W SvelteKit lub przy kilkudziesięciu podstronach jej koszty (brak typów, brak podziału, współdzielony store) zaczynają przeważać.
W Vite + Svelte tak, benchmark to potwierdza. W React z TanStack Start lub Next.js nie przyniosło to efektu w tym samym benchmarku. Zweryfikuj to we własnym stacku zamiast bezkrytycznie polegać na którymkolwiek z wyników.
Zmieniają składnię Twojego własnego stanu locale, a nie problem współdzielenia stanu. Liczy się to, czy runtime biblioteki obsługuje runes w Svelte 5 i czy używa context zamiast store'a modułu. Sprawdź oba te aspekty.
Pośrednio. Roboty indeksujące zwracają uwagę na routing, hreflang, <html lang> oraz to, czy tekst znajduje się w kodzie HTML wyrenderowanym po stronie serwera. Zobacz przewodnik po hreflang.
Idąc dalej
- Benchmark Svelte i18n: rozmiar bundle, wycieki i czasy przełączania locale
- Svelte i18n: store'y, runes i pułapka na poziomie modułu oraz SvelteKit i18n: routing, SSR i współdzielony stan
- Gotowy adapter kompatybilności
svelte-i18n - Historia JavaScript i18n
- Kompilator a deklaratywne i18n
- i18n per komponent a scentralizowane
- Jak działa optymalizacja bundle podczas budowania
- Konfiguracja i18n w aplikacji Vite + Svelte oraz w aplikacji SvelteKit
- Ten sam przewodnik dla React, Vue oraz Solid
Komentarze
Nie ma jeszcze komentarzy. Bądź pierwszą osobą, która podzieli się swoimi przemyśleniami.
