Creation:2024-08-14Last update:2026-05-31

    Dlaczego warto rozważyć Intlayer?

    Czym jest Intlayer?

    Intlayer to biblioteka umiędzynarodowienia (i18n) zaprojektowana specjalnie dla programistów JavaScript. Umożliwia ona deklarowanie treści w dowolnym miejscu w kodzie. Konwertuje deklaracje treści wielojęzycznych na strukturyzowane słowniki, które można łatwo zintegrować z kodem. Dzięki użyciu TypeScript, Intlayer czyni Twój proces programowania silniejszym i bardziej wydajnym.

    Dlaczego Intlayer zamiast alternatyw?

    W porównaniu do głównych rozwiązań, takich jak next-intl czy i18next, Intlayer jest rozwiązaniem, które oferuje wbudowane optymalizacje, takie jak:

    Zamiast ładować ogromne pliki JSON na swoje strony, ładuj tylko niezbędną treść. Intlayer pomaga zmniejszyć rozmiar paczki i stron nawet o 50%.

    Ograniczenie zakresu treści aplikacji do poziomu komponentów ułatwia konserwację w przypadku aplikacji na dużą skalę. Możesz zduplikować lub usunąć pojedynczy folder z funkcjonalnością bez obciążenia psychicznego związanego z przeglądaniem całego kodu treści. Dodatkowo Intlayer jest w pełni typowany, aby zapewnić dokładność Twoich treści.

    Umieszczenie treści bezpośrednio przy komponentach (co-location) zmniejsza kontekst wymagany przez duże modele językowe (LLM). Intlayer jest również wyposażony w zestaw narzędzi, takich jak CLI do testowania brakujących tłumaczeń, LSP, MCP oraz agent skills, aby uczynić środowisko programistyczne (DX) jeszcze bardziej płynnym dla agentów AI.

    Intlayer oferuje szereg dodatkowych funkcji, których inne rozwiązania i18n nie posiadają, takich jak obsługa Markdown, pobieranie treści zewnętrznych, ładowanie treści z plików, aktualizacja treści na żywo, wizualny edytor i wiele więcej.

    Skorzystaj z automatyzacji tłumaczeń w swoim rurociągu CI/CD, używając wybranego modelu LLM po kosztach bezpośrednich u Twojego dostawcy AI. Intlayer oferuje również kompilator do automatycznego wyodrębniania treści, a także platformę internetową wspierającą tłumaczenie w tle.

    Podłączanie potężnych plików JSON do komponentów może prowadzić do problemów z wydajnością i reaktywnością. Intlayer optymalizuje ładowanie treści już na etapie budowania (build).

    Intlayer to coś więcej niż tylko rozwiązanie i18n — udostępnia on wizualny edytor z możliwością własnego hostowania oraz pełny CMS, który ułatwia zarządzanie wielojęzyczną treścią w czasie rzeczywistym. Dzięki temu współpraca z tłumaczami, copywriterami i innymi członkami zespołu jest bezproblemowa. Treści mogą być przechowywane lokalnie i/lub zdalnie.

    Jeśli używasz różnych frameworków dla różnych części swojej aplikacji (np. React, React-native, Vue, Angular, Svelte itp.), Intlayer zapewnia sposób na stosowanie wspólnej składni i implementacji we wszystkich głównych frameworkach frontendowych. Będziesz także mógł udostępniać swoje deklaracje treści w swoim design systemie, aplikacjach, backendzie itd.

    Dlaczego powstał Intlayer?

    Intlayer powstał, aby rozwiązać powszechny problem dotykający wszystkie popularne biblioteki i18n, takie jak next-intl, react-i18next, react-intl, next-i18next, react-intl oraz vue-i18n.

    Wszystkie te rozwiązania stosują scentralizowane podejście do listowania i zarządzania treściami. Na przykład:

    bash
    .├── locales│   ├── en.json│   ├── es.json│   └── fr.json├── i18n.ts└── src    └── components        └── MyComponent            └── index.tsx

    Lub tutaj przy użyciu przestrzeni nazw (namespaces):

    bash
    .├── locales│   ├── en│   │  ├── footer.json│   │  └── navbar.json│   ├── fr│   │  ├── footer.json│   │  └── navbar.json│   └── es│      ├── footer.json│      └── navbar.json├── i18n.ts└── src    └── components        └── MyComponent            └── index.tsx

    Tego typu architektura spowalnia proces programowania i komplikuje utrzymanie kodu z kilku powodów:

    1. Dla każdego nowo tworzonego komponentu musisz:

      • Utworzyć nowy zasób/przestrzeń nazw w folderze locales
      • Pamiętać o zaimportowaniu nowej przestrzeni nazw na swojej stronie
      • Przetłumaczyć treść (często robione ręcznie przez kopiowanie/wklejanie z narzędzi AI)
    2. Dla każdej zmiany wprowadzanej w komponentach musisz:

      • Wyszukać powiązany zasób/przestrzeń nazw (daleko od komponentu)
      • Przetłumaczyć treść
      • Upewnić się, że Twoja treść jest aktualna dla wszystkich języków (locales)
      • Zweryfikować, czy przestrzeń nazw nie zawiera nieużywanych kluczy/wartości
      • Upewnić się, że struktura plików JSON jest taka sama dla wszystkich języków

    W profesjonalnych projektach korzystających z tych rozwiązań często stosuje się platformy lokalizacyjne, aby ułatwić zarządzanie tłumaczeniem treści. Może to jednak szybko stać się kosztowne w przypadku dużych projektów.

    Aby rozwiązać ten problem, Intlayer przyjmuje podejście, które ogranicza zakres treści do poziomu pojedynczego komponentu i trzyma treść blisko niego, podobnie jak często robimy to z CSS (styled-components), typami, dokumentacją (storybook) czy testami jednostkowymi (jest).

    bash
    .└── components    └── MyComponent        ├── index.content.ts        ├── index.test.tsx        ├── index.stories.tsx        └── index.tsx
    ./components/MyComponent/index.content.ts
    import { t, type Dictionary } from "intlayer";
    
    const componentExampleContent = {
      key: "component-example",
      content: {
        myTranslatedContent: t({
          en: "Hello World",
          es: "Hola Mundo",
          fr: "Bonjour le monde",
        }),
      },
    } satisfies Dictionary;
    
    export default componentExampleContent;
    ./components/MyComponent/index.tsx
    import { useIntlayer } from "react-intlayer";
    
    export const ComponentExample = () => {
      const { myTranslatedContent } = useIntlayer("component-example");
    
      return <span>{myTranslatedContent}</span>;
    };

    Takie podejście pozwala na:

    1. Zwiększenie szybkości programowania

      • Pliki .content.{{ts|mjs|cjs|json}} mogą być tworzone przy użyciu rozszerzenia VSCode
      • Narzędzia do automatycznego uzupełniania AI w Twoim IDE (takie jak GitHub Copilot) mogą pomóc w deklarowaniu treści, ograniczając kopiowanie/wklejanie
    2. Uporządkowanie bazy kodu

      • Zmniejszenie złożoności
      • Zwiększenie łatwości konserwacji
    3. Łatwiejsze duplikowanie komponentów i powiązanych z nimi treści (np. komponenty logowania/rejestracji itp.)

      • Ograniczając ryzyko wpłynięcia na treść innych komponentów
      • Kopiując i wklejając treść z jednej aplikacji do drugiej bez zewnętrznych zależności
    4. Unikanie zaśmiecania bazy kodu nieużywanymi kluczami/wartościami dla nieużywanych komponentów

      • Jeśli nie używasz komponentu, Intlayer nie zaimportuje powiązanej z nim treści
      • Jeśli usuniesz komponent, łatwiej zapamiętasz o usunięciu powiązanej treści, ponieważ będzie się ona znajdować w tym samym folderze
    5. Zmniejszenie kosztów wnioskowania dla agentów AI przy deklarowaniu treści wielojęzycznych

      • Agent AI nie będzie musiał skanować całej bazy kodu, aby dowiedzieć się, gdzie zaimplementować Twoją treść
      • Tłumaczenia mogą być łatwo wykonywane przez narzędzia AI do automatycznego uzupełniania w Twoim IDE (takie jak GitHub Copilot)
    6. Optymalizację wydajności ładowania

      • Jeśli komponent jest ładowany leniwie (lazy-loaded), powiązana z nim treść zostanie załadowana w tym samym momencie

    Dodatkowe funkcje Intlayer

    Funkcja Opis
    Feature Obsługa wielu frameworków

    Intlayer jest kompatybilny ze wszystkimi głównymi frameworkami i bibliotekami, w tym Next.js, React, Vite, Vue.js, Nuxt, Preact, Express i innymi.
    Feature Zarządzanie treścią oparte na JavaScript

    Wykorzystaj elastyczność JavaScript do wydajnego definiowania i zarządzania treściami.

    - Deklaracja treści
    Feature Kompilator

    Kompilator Intlayer automatycznie wyodrębnia treść z komponentów i generuje pliki słowników.

    - Kompilator
    Feature Plik deklaracji treści dla konkretnego języka

    Przyspiesz proces tworzenia, deklarując treść raz, przed automatycznym generowaniem.

    - Plik deklaracji treści dla konkretnego języka
    Feature Środowisko bezpieczne pod kątem typów

    Skorzystaj z TypeScript, aby upewnić się, że definicje treści i kod są wolne od błędów, jednocześnie czerpiąc korzyści z autouzupełniania w IDE.

    - Konfiguracja TypeScript
    Feature Uproszczona konfiguracja

    Szybko rozpocznij pracę przy minimalnej konfiguracji. Z łatwością dostosuj ustawienia lokalizacji, routingu, sztucznej inteligencji, budowania i obsługi treści.

    - Poznaj integrację z Next.js
    Feature Uproszczone pobieranie treści

    Nie musisz wywoływać funkcji t dla każdego elementu treści. Pobierz całą zawartość bezpośrednio za pomocą jednego hooka.

    - Integracja z React
    Feature Spójna implementacja komponentów serwerowych

    Idealnie nadaje się do komponentów serwerowych Next.js, użyj tej samej implementacji dla komponentów klienckich i serwerowych, bez konieczności przekazywania funkcji t przez drzewo komponentów.

    - Komponenty serwerowe
    Feature Uporządkowana baza kodu

    Utrzymuj bazę kodu w większym porządku: 1 komponent = 1 słownik w tym samym folderze. Tłumaczenia blisko powiązanych komponentów zwiększają łatwość konserwacji i przejrzystość.

    - Jak działa Intlayer
    Feature Ulepszony routing

    Pełna obsługa routingu aplikacji, płynnie dostosowująca się do złożonych struktur aplikacji dla Next.js, React, Vite, Vue.js itp.

    - Poznaj integrację z Next.js
    Feature Obsługa Markdown

    Importuj i interpretuj pliki lokalne oraz zdalny Markdown dla treści wielojęzycznych, takich jak polityki prywatności, dokumentacja itp. Interpretuj i udostępniaj metadane Markdown w swoim kodzie.

    - Pliki treści
    Feature Darmowy edytor wizualny i CMS

    Darmowy edytor wizualny i CMS są dostępne dla twórców treści, co eliminuje potrzebę korzystania z zewnętrznej platformy lokalizacyjnej. Utrzymuj synchronizację treści za pomocą Git lub całkowicie bądź częściowo przenieś zarządzanie do CMS.

    - Edytor Intlayer
    - CMS Intlayer
    Feature Zawartość podlegająca eliminacji nieużywanego kodu (Tree-shakable)

    Zawartość podlegająca tree-shakingowi, zmniejszająca rozmiar ostatecznej paczki. Ładuje treść dla poszczególnych komponentów, wykluczając nieużywane elementy z paczki. Obsługuje leniwe ładowanie w celu zwiększenia wydajności aplikacji.

    - Optymalizacja budowania aplikacji
    Feature Renderowanie statyczne

    Nie blokuje renderowania statycznego.

    - Integracja z Next.js
    Feature Tłumaczenie wspomagane przez AI

    Przetłumacz swoją witrynę na 231 języków jednym kliknięciem, korzystając z zaawansowanych narzędzi tłumaczeniowych Intlayer opartych na sztucznej inteligencji, korzystając z własnego dostawcy AI/klucza API.

    - Integracja CI/CD
    - Intlayer CLI
    - Autouzupełnianie
    Feature Integracja z serwerem MCP

    Udostępnia serwer MCP (Model Context Protocol) do automatyzacji IDE, umożliwiając bezproblemowe zarządzanie treścią i przepływy pracy i18n bezpośrednio w środowisku programistycznym.

    - Serwer MCP
    Feature Rozszerzenie VSCode

    Intlayer udostępnia rozszerzenie do VSCode, które pomaga zarządzać treścią i tłumaczeniami, budować słowniki, tłumaczyć zawartość i nie tylko.

    - Rozszerzenie VSCode
    Feature Interoperacyjność

    Umożliwia interoperacyjność z react-i18next, next-i18next, next-intl i react-intl.

    - Intlayer i react-intl
    - Intlayer i next-intl
    - Intlayer i next-i18next
    Testowanie brakujących tłumaczeń (CLI/CI) ✅ CLI: npx intlayer content test (audyt przyjazny dla CI)

    Porównanie Intlayer z innymi rozwiązaniami

    Cecha intlayer react-i18next react-intl (FormatJS) lingui next-intl next-i18next vue-i18n
    Tłumaczenia blisko komponentów ✅ Tak, treść powiązana z każdym komponentem ❌ Nie ❌ Nie ❌ Nie ❌ Nie ❌ Nie ✅ Tak — przy użyciu Single File Components (SFC)
    Integracja z TypeScript ✅ Zaawansowane, automatycznie generowane ścisłe typy ⚠️ Podstawowa; dodatkowa konfiguracja dla bezpieczeństwa ✅ Dobra, ale mniej rygorystyczna ⚠️ Typowanie wymaga konfiguracji ✅ Dobra ⚠️ Podstawowa ✅ Dobra (typy są dostępne; bezpieczeństwo kluczy wymaga konfiguracji)
    Wykrywanie brakujących tłumaczeń ✅ Wyróżnianie błędów w TypeScript oraz błąd/ostrzeżenie podczas budowania ⚠️ Głównie ciągi rezerwowe (fallback) w czasie rzeczywistym ⚠️ Ciągi rezerwowe ⚠️ Wymaga dodatkowej konfiguracji ⚠️ Rezerwa w czasie rzeczywistym ⚠️ Rezerwa w czasie rzeczywistym ⚠️ Rezerwa/ostrzeżenia w czasie rzeczywistym (konfigurowalne)
    Bogata zawartość (JSX/Markdown/komponenty) ✅ Bezpośrednie wsparcie ⚠️ Ograniczone / tylko interpolacja ⚠️ Składnia ICU, nie rzeczywisty JSX ⚠️ Ograniczone ❌ Nie zaprojektowane dla złożonych węzłów ⚠️ Ograniczone ⚠️ Ograniczone (komponenty przez <i18n-t>, Markdown przez wtyczki)
    Tłumaczenie wspomagane przez AI ✅ Tak, obsługuje wielu dostawców AI. Możliwość korzystania z własnych kluczy API. Uwzględnia kontekst aplikacji i zakres treści ❌ Nie ❌ Nie ❌ Nie ❌ Nie ❌ Nie ❌ Nie
    Edytor wizualny ✅ Tak, lokalny edytor wizualny + opcjonalny CMS; możliwość wyeksportowania treści bazy kodu; osadzalny ❌ Nie / dostępne za pośrednictwem zewnętrznych platform lokalizacyjnych ❌ Nie / dostępne za pośrednictwem zewnętrznych platform lokalizacyjnych ❌ Nie / dostępne za pośrednictwem zewnętrznych platform lokalizacyjnych ❌ Nie / dostępne za pośrednictwem zewnętrznych platform lokalizacyjnych ❌ Nie / dostępne za pośrednictwem zewnętrznych platform lokalizacyjnych ❌ Nie / dostępne za pośrednictwem zewnętrznych platform lokalizacyjnych
    Zlokalizowany routing ✅ Tak, obsługuje zlokalizowane ścieżki od samego początku (działa z Next.js i Vite) ⚠️ Brak wbudowanego wsparcia, wymaga wtyczek (np. next-i18next) lub niestandardowej konfiguracji routera ❌ Nie, tylko formatowanie komunikatów, routing musi być ręczny ⚠️ Brak wbudowanego wsparcia, wymaga wtyczek lub konfiguracji ręcznej ✅ Wbudowany, App Router obsługuje segment [locale] ✅ Wbudowany ✅ Wbudowany
    Dynamiczne generowanie tras ✅ Tak ⚠️ Wtyczka/ekosystem lub konfiguracja ręczna ❌ Nie dostarczono ⚠️ Wtyczka/ręcznie ✅ Tak ✅ Tak ❌ Nie dostarczono (Nuxt i18n udostępnia)
    Pluralizacja ✅ Wzorce oparte na wyliczeniach ✅ Konfigurowalne (wtyczki takie jak i18next-icu) ✅ (ICU) ✅ (ICU/messageformat) ✅ Dobra ✅ Dobra ✅ Wbudowane reguły liczby mnogiej
    Formatowanie (daty, liczby, waluty) ✅ Zoptymalizowane formatowania (Intl pod maską) ⚠️ Za pomocą wtyczek lub niestandardowego użycia Intl ✅ Formatowania ICU ✅ Pomocnicy ICU/CLI ✅ Dobra (pomocnicy Intl) ✅ Dobra (pomocnicy Intl) ✅ Wbudowane formatowania daty/liczby (Intl)
    Format zawartości ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml w trakcie opracowywania) ⚠️ .json ✅ .json, .js ⚠️ .po, .json ✅ .json, .js, .ts ⚠️ .json ✅ .json, .js
    Obsługa ICU ⚠️ WIP ⚠️ Za pomocą wtyczki (i18next-icu) ✅ Tak ✅ Tak ✅ Tak ⚠️ Za pomocą wtyczki (i18next-icu) ⚠️ Za pomocą niestandardowego formatowania/kompilatora
    Pomocnicy SEO (hreflang, sitemap) ✅ Wbudowane narzędzia: pomocnicy dla sitemap, robots.txt, metadanych ⚠️ Wtyczki społeczności/ręcznie ❌ Nie jest rdzeniem ❌ Nie jest rdzeniem ✅ Dobra ✅ Dobra ❌ Nie jest rdzeniem (Nuxt i18n udostępnia pomocników)
    Ekosystem / Społeczność ⚠️ Mniejsza, ale szybko rosnąca i bardzo responsywna ✅ Największa i dojrzała ✅ Duża ⚠️ Mniejsza ✅ Średniej wielkości, skupiona na Next.js ✅ Średniej wielkości, skupiona na Next.js ✅ Duża w ekosystemie Vue
    Renderowanie po stronie serwera i komponenty serwerowe ✅ Tak, zoptymalizowane pod kątem SSR / React Server Components ⚠️ Obsługiwane na poziomie strony, ale wymaga przekazania funkcji t w drzewie komponentów do podrzędnych komponentów serwerowych ⚠️ Obsługiwane na poziomie strony z dodatkową konfiguracją, ale wymaga przekazania funkcji t w drzewie komponentów do podrzędnych komponentów serwerowych ✅ Obsługiwane, wymagana konfiguracja ⚠️ Obsługiwane na poziomie strony, ale wymaga przekazania funkcji t w drzewie komponentów do podrzędnych komponentów serwerowych ⚠️ Obsługiwane na poziomie strony, ale wymaga przekazania funkcji t w drzewie komponentów do podrzędnych komponentów serwerowych ✅ SSR przez Nuxt/Vue SSR (brak RSC)
    Tree-shaking (ładowanie tylko używanych treści) ✅ Tak, na poziomie komponentu podczas budowania za pomocą wtyczek Babel/SWC ⚠️ Zazwyczaj ładuje wszystko (można poprawić za pomocą przestrzeni nazw/dzielenia kodu) ⚠️ Zazwyczaj ładuje wszystko ❌ Nie jest domyślne ⚠️ Częściowy ⚠️ Częściowy ⚠️ Częściowy (z dzieleniem kodu/konfiguracją ręczną)
    Leniwe ładowanie (Lazy loading) ✅ Tak, na język / na słownik ✅ Tak (np. backendy/namespaces na żądanie) ✅ Tak (dzielone paczki językowe) ✅ Tak (dynamiczne importowanie katalogów) ✅ Tak (na trasę/na język), wymaga zarządzania przestrzeniami nazw ✅ Tak (na trasę/na język), wymaga zarządzania przestrzeniami nazw ✅ Tak (asynchroniczne wiadomości językowe)
    Usuwanie nieużywanych treści ✅ Tak, na słownik podczas budowania ❌ Nie, tylko poprzez ręczną segmentację przestrzeni nazw ❌ Nie, wszystkie zadeklarowane wiadomości są pakowane ✅ Tak, nieużywane klucze są wykrywane i usuwane podczas budowania ❌ Nie, można zarządzać ręcznie za pomocą przestrzeni nazw ❌ Nie, można zarządzać ręcznie za pomocą przestrzeni nazw ❌ Nie, możliwe tylko poprzez ręczne leniwe ładowanie
    Zarządzanie dużymi projektami ✅ Wspiera modułowość, doskonałe dla systemów projektowych ⚠️ Wymaga dobrej dyscypliny w plikach ⚠️ Centralne katalogi mogą stać się duże ⚠️ Może stać się złożone ✅ Modułowe z konfiguracją ✅ Modułowe z konfiguracją ✅ Modułowe z konfiguracją Vue Router/Nuxt i18n

    Gwiazdki na GitHubie

    Gwiazdki na GitHubie są silnym wskaźnikiem popularności projektu, zaufania społeczności i długoterminowej trajektorii. Choć nie są bezpośrednią miarą jakości technicznej, odzwierciedlają liczbę programistów, którzy uważają projekt za przydatny, śledzą jego postępy i prawdopodobnie go wdrożą. Do szacowania wartości projektu gwiazdki pomagają porównać atrakcyjność alternatyw i dostarczają wglądu w rozwój ekosystemu.

    Star History Chart


    Interoperacyjność

    intlayer może również pomóc w zarządzaniu przestrzeniami nazw react-intl, react-i18next, next-intl, next-i18next i vue-i18n.

    Używając intlayer, możesz zadeklarować treść w formacie swojej ulubionej biblioteki i18n, a intlayer wygeneruje przestrzenie nazw w wybranej przez Ciebie lokalizacji (przykład: /messages/{{locale}}/{{namespace}}.json).