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
- "Dodaj polecenie init"v7.5.930.12.2025
- "Aktualizacja komponentu LocaleRouter do użycia nowej konfiguracji tras"v7.0.028.10.2025
- "Inicjalizacja historii"v5.5.1029.06.2025
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ę Vite i Preact za pomocą Intlayer | Internacjonalizacja (i18n)
Spis treści
Dlaczego Interlayer zamiast alternatyw?
W porównaniu do głównych rozwiązań, takich jak „preact-i18n” czy „i18next”, Intlayer jest rozwiązaniem wyposażonym w zintegrowane optymalizacje, takie jak:
Pełne pokrycie Preact
Intlayer jest zoptymalizowany do doskonałej współpracy z Preact, oferując zakres treści na poziomie komponentu, tłumaczenia z opóźnieniem i wszystkie funkcje potrzebne do skalowania internacjonalizacji (i18n).
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.
Przewodnik krok po kroku, jak skonfigurować Intlayer w aplikacji Vite i Preact
Zobacz Szablon aplikacji na GitHub.
Instalacja zależności
Zainstaluj niezbędne pakiety za pomocą npm:
bashKopiuj kodSkopiuj kod do schowka
npm install intlayer preact-intlayernpm install vite-intlayer --save-devnpx intlayer initintlayer
Główne pakiet, który dostarcza narzędzia do internacjonalizacji do zarządzania konfiguracją, tłumaczeń, deklaracji treści, transpilecji oraz poleceń CLI.
preact-intlayer Pakiet integrujący Intlayer z aplikacją Preact. Zapewnia providery kontekstu oraz hooki do internacjonalizacji w Preact.
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.
Konfiguracja Twojego projektu
Utwórz plik konfiguracyjny, aby skonfigurować języki swojej aplikacji:
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 lokalizacje ], defaultLocale: Locales.ENGLISH, }, routing: { mode: "prefix-no-default", // Domyślnie: prefiksuj wszystkie lokalizacje oprócz domyślnej storage: ["cookie", "header"], // Domyślnie: przechowuj lokalizację w ciasteczku i wykrywaj z nagłówka }, }; export default config;Dzięki temu plikowi konfiguracyjnemu możesz ustawić lokalizowane adresy URL, tryby routingu, opcje przechowywania, 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 konfiguracji.
Zintegruj Intlayer w swojej konfiguracji Vite
Dodaj wtyczkę intlayer do swojej konfiguracji.
vite.config.tsKopiuj kodSkopiuj kod do schowka
import { defineConfig } from "vite"; import preact from "@preact/preset-vite"; import { intlayer } from "vite-intlayer"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [preact(), intlayer()], });Wtyczka Vite
intlayer()służy do integracji Intlayer z Vite. Zapewnia budowanie plików deklaracji treści oraz monitoruje je w trybie deweloperskim. Definiuje zmienne środowiskowe Intlayer w aplikacji Vite. Dodatkowo dostarcza aliasy optymalizujące wydajność.Zadeklaruj swoją treść
Utwórz i zarządzaj deklaracjami treści, aby przechowywać tłumaczenia:
src/app.content.tsxKopiuj kodSkopiuj kod do schowka
import { t, type Dictionary } from "intlayer"; import type { ComponentChildren } from "preact"; const appContent = { key: "app", content: { viteLogo: t({ en: "Vite logo", fr: "Logo Vite", es: "Logo Vite", }), preactLogo: t({ en: "Preact logo", fr: "Logo Preact", es: "Logo Preact", }), title: "Vite + Preact", count: t({ en: "count is ", fr: "le compte est ", es: "el recuento es ", }), edit: t<ComponentChildren>({ en: ( <> Edit <code>src/app.tsx</code> and save to test HMR </> ), fr: ( <> Éditez <code>src/app.tsx</code> et enregistrez pour tester HMR </> ), es: ( <> Edita <code>src/app.tsx</code> y guarda para probar HMR </> ), }), readTheDocs: t({ en: "Click on the Vite and Preact logos to learn more", fr: "Cliquez sur les logos Vite et Preact pour en savoir plus", es: "Haga clic en los logotipos de Vite y Preact para obtener más información", }), }, } satisfies Dictionary; export default appContent;Twoje deklaracje treści mogą być zdefiniowane w dowolnym miejscu w aplikacji, pod warunkiem, że zostaną umieszczone w katalogu
contentDir(domyślnie./src). I muszą odpowiadać rozszerzeniu pliku deklaracji treści (domyślnie.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).Aby uzyskać więcej szczegółów, odnieś się do dokumentacji deklaracji treści.
Jeśli Twój plik treści zawiera kod TSX, może być konieczne zaimportowanie
import { h } from "preact";lub upewnienie się, że pragma JSX jest poprawnie ustawiona dla Preact.Wykorzystaj Intlayer w swoim kodzie
Uzyskaj dostęp do swoich słowników treści w całej aplikacji:
src/app.tsxKopiuj kodSkopiuj kod do schowka
import { useState } from "preact/hooks"; import type { FunctionalComponent } from "preact"; import preactLogo from "./assets/preact.svg"; // Zakładamy, że masz plik preact.svg import viteLogo from "/vite.svg"; import "./app.css"; // Zakładamy, że Twój plik CSS nazywa się app.css import { IntlayerProvider, useIntlayer } from "preact-intlayer"; const AppContent: FunctionalComponent = () => { const [count, setCount] = useState(0); const content = useIntlayer("app"); return ( <> <div> <a href="https://vitejs.dev" target="_blank"> <img src={viteLogo} class="logo" alt={content.viteLogo.value} /> </a> <a href="https://preactjs.com" target="_blank"> <img src={preactLogo} class="logo preact" alt={content.preactLogo.value} /> </a> </div> <h1>{content.title}</h1> <div class="card"> <button onClick={() => setCount((count) => count + 1)}> {content.count} {count} </button> <p>{content.edit}</p> </div> {/* Treść Markdown */} <div>{content.myMarkdownContent}</div> {/* Treść HTML */} <div>{content.myHtmlContent}</div> <p class="read-the-docs">{content.readTheDocs}</p> </> ); }; const App: FunctionalComponent = () => ( <IntlayerProvider> <AppContent /> </IntlayerProvider> ); export default App;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)}" />Uwaga: W Preact
classNamejest zazwyczaj zapisywane jakoclass.Aby dowiedzieć się więcej o hooku
useIntlayer, zapoznaj się z dokumentacją (API jest podobne dlapreact-intlayer).Jeśli Twoja aplikacja już istnieje, możesz użyć Intlayer Compiler w połączeniu z poleceniem extract, aby przekonwertować tysiące komponentów w jedną sekundę.
Zmień język swojej zawartości
OpcjonalneAby zmienić język swojej zawartości, możesz użyć funkcji
setLocaledostarczonej przez hookuseLocale. Funkcja ta pozwala ustawić lokalizację aplikacji i odpowiednio zaktualizować zawartość.src/components/LocaleSwitcher.tsxKopiuj kodSkopiuj kod do schowka
import type { FunctionalComponent } from "preact"; import { Locales } from "intlayer"; import { useLocale } from "preact-intlayer"; const LocaleSwitcher: FunctionalComponent = () => { const { setLocale } = useLocale(); return ( <button onClick={() => setLocale(Locales.ENGLISH)}> Change Language to English </button> ); }; export default LocaleSwitcher;Aby dowiedzieć się więcej o hooku
useLocale, zapoznaj się z dokumentacją (API jest podobne dlapreact-intlayer).Dodaj zlokalizowane routowanie do swojej aplikacji
OpcjonalneCelem tego kroku jest stworzenie unikalnych tras dla każdego języka. Jest to przydatne dla SEO oraz przyjaznych dla SEO adresów URL. Przykład:
plaintextKopiuj kodSkopiuj kod do schowka
- https://example.com/about- https://example.com/es/about- https://example.com/fr/aboutDomyślnie trasy nie są poprzedzone prefiksem dla domyślnego języka. Jeśli chcesz dodać prefiks dla domyślnego języka, możesz ustawić opcję
routing.modena"prefix-all"w swojej konfiguracji. Więcej informacji znajdziesz w dokumentacji konfiguracji.Aby dodać zlokalizowane routowanie do swojej aplikacji, możesz stworzyć komponent
LocaleRouter, który otacza trasy Twojej aplikacji i obsługuje routowanie oparte na lokalizacji. Oto przykład przy użyciu preact-iso:src/components/LocaleRouter.tsxKopiuj kodSkopiuj kod do schowka
import { localeMap } from "intlayer"; import { IntlayerProvider } from "preact-intlayer"; import { LocationProvider, Router, Route } from "preact-iso"; import type { ComponentChildren, FunctionalComponent } from "preact"; /** * Komponent routera, który ustawia trasy specyficzne dla lokalizacji. * Używa preact-iso do zarządzania nawigacją i renderowania zlokalizowanych komponentów. */ export const LocaleRouter: FunctionalComponent<{ children: ComponentChildren; }> = ({ children }) => ( <LocationProvider> <Router> {localeMap(({ locale, urlPrefix }) => ({ locale, urlPrefix })) .sort((a, b) => b.urlPrefix.length - a.urlPrefix.length) .map(({ locale, urlPrefix }) => ( <Route key={locale} path={`${urlPrefix}/:rest*`} component={() => ( <IntlayerProvider locale={locale}>{children}</IntlayerProvider> )} /> ))} </Router> </LocationProvider> );Następnie możesz użyć komponentu
LocaleRouterw swojej aplikacji:src/app.tsxKopiuj kodSkopiuj kod do schowka
import { LocaleRouter } from "./components/LocaleRouter"; import type { FunctionalComponent } from "preact"; // ... Twój komponent AppContent const App: FunctionalComponent = () => ( <LocaleRouter> <AppContent /> </LocaleRouter> ); export default App;Zmień adres URL, gdy zmieni się język
OpcjonalneAby zmienić adres URL, gdy zmieni się język, możesz użyć właściwości
onLocaleChangedostarczonej przez hookuseLocale. Równocześnie możesz użyć metodyroutezuseLocationzpreact-iso, aby zaktualizować ścieżkę adresu URL.src/components/LocaleSwitcher.tsxKopiuj kodSkopiuj kod do schowka
import { useLocation } from "preact-iso"; import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocale } from "preact-intlayer"; import type { FunctionalComponent } from "preact"; const LocaleSwitcher: FunctionalComponent = () => { const { url, route } = useLocation(); const { locale, availableLocales, setLocale } = useLocale({ onLocaleChange: (newLocale) => { // Skonstruuj adres URL z zaktualizowanym językiem // Przykład: /es/about?foo=bar const pathWithLocale = getLocalizedUrl(url, newLocale); // Zaktualizuj ścieżkę adresu URL route(pathWithLocale, true); // true dla replace }, }); return ( <div> <button popovertarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <a href={getLocalizedUrl(url, localeItem)} hreflang={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={(e) => { e.preventDefault(); setLocale(localeItem); // Programowa nawigacja po ustawieniu języka zostanie obsłużona przez onLocaleChange }} key={localeItem} > <span> {/* Lokalizacja - np. FR */} {localeItem} </span> <span> {/* Język w swoim własnym języku - np. Français */} {getLocaleName(localeItem, localeItem)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* Język w bieżącym języku - np. Francés przy bieżącym języku ustawionym na Locales.SPANISH */} {getLocaleName(localeItem, locale)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* Język w języku angielskim - np. French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </a> ))} </div> </div> ); }; export default LocaleSwitcher;Odnośniki do dokumentacji:
- Hook
useLocale(API jest podobne dlapreact-intlayer)> - HookgetLocaleName> - HookgetLocalizedUrl> - HookgetHTMLTextDir> - atrybuthreflang> - atrybutlang> - atrybutdir> - atrybutaria-current> - Popover APIPrzełącz atrybuty języka i kierunku HTML
OpcjonalneGdy Twoja aplikacja obsługuje wiele języków, kluczowe jest zaktualizowanie atrybutów
langidirtagu<html>, aby pasowały do bieżącej lokalizacji. Zapewnia to:- Dostępność: Czytniki ekranu i technologie wspomagające polegają na poprawnym atrybucie
lang, aby dokładnie wymawiać i interpretować zawartość. - Renderowanie tekstu: Atrybut
dir(kierunek) zapewnia, że tekst jest wyświetlany w odpowiedniej kolejności (np. od lewej do prawej dla angielskiego, od prawej do lewej dla arabskiego lub hebrajskiego), co jest niezbędne dla czytelności. - SEO: Wyszukiwarki używają atrybutu
lang, aby określić język Twojej strony, co pomaga w serwowaniu odpowiedniej zlokalizowanej zawartości w wynikach wyszukiwania.
Dzięki dynamicznej aktualizacji tych atrybutów po zmianie języka, gwarantujesz spójne i dostępne doświadczenie dla użytkowników we wszystkich obsługiwanych językach.
Implementacja Hooka
Utwórz niestandardowy hook do zarządzania atrybutami HTML. Hook nasłuchuje zmian języka i odpowiednio aktualizuje atrybuty:
src/hooks/useI18nHTMLAttributes.tsxKopiuj kodSkopiuj kod do schowka
import { useEffect } from "preact/hooks"; import { useLocale } from "preact-intlayer"; import { getHTMLTextDir } from "intlayer"; /** * Aktualizuje atrybuty `lang` i `dir` elementu HTML <html> na podstawie bieżącego języka. * - `lang`: Informuje przeglądarki i wyszukiwarki o języku strony. * - `dir`: Zapewnia poprawną kolejność czytania (np. 'ltr' dla angielskiego, 'rtl' dla arabskiego). * * Ta dynamiczna aktualizacja jest niezbędna do prawidłowego renderowania tekstu, dostępności i SEO. */ export const useI18nHTMLAttributes = () => { const { locale } = useLocale(); useEffect(() => { // Zaktualizuj atrybut języka na bieżący język. document.documentElement.lang = locale; // Ustaw kierunek tekstu na podstawie bieżącego języka. document.documentElement.dir = getHTMLTextDir(locale); }, [locale]); };Użycie Hooka w Twojej Aplikacji
Zintegruj hook ze swoim głównym komponentem, aby atrybuty HTML aktualizowały się za każdym razem, gdy zmieni się język:
src/app.tsxKopiuj kodSkopiuj kod do schowka
import type { FunctionalComponent } from "preact"; import { IntlayerProvider } from "preact-intlayer"; // useIntlayer już zaimportowany, jeśli AppContent go potrzebuje import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes"; import "./app.css"; // Definicja AppContent z Kroku 5 const AppWithHooks: FunctionalComponent = () => { // Zastosuj hook, aby aktualizować atrybuty lang i dir tagu <html> na podstawie języka. useI18nHTMLAttributes(); // Zakładając, że AppContent to Twój główny komponent wyświetlający treść z Kroku 5 return <AppContent />; }; const App: FunctionalComponent = () => ( <IntlayerProvider> <AppWithHooks /> </IntlayerProvider> ); export default App;- Dostępność: Czytniki ekranu i technologie wspomagające polegają na poprawnym atrybucie
Tworzenie zlokalizowanego komponentu linku
OpcjonalneAby zapewnić, że nawigacja w Twojej aplikacji szanuje bieżący język, możesz utworzyć niestandardowy komponent
Link. Ten komponent automatycznie poprzedza wewnętrzne adresy URL bieżącym językiem.To zachowanie jest przydatne z kilku powodów:
- SEO i doświadczenie użytkownika: Zlokalizowane adresy URL pomagają wyszukiwarkom poprawnie indeksować strony specyficzne dla danego języka i zapewniają użytkownikom treść w ich preferowanym języku.
- Spójność: Używając zlokalizowanego linku w całej aplikacji, gwarantujesz, że nawigacja pozostaje w obrębie bieżącego języka, zapobiegając nieoczekiwanym zmianom języka.
- Utrzymywalność: Centralizacja logiki lokalizacji w jednym komponencie upraszcza zarządzanie adresami URL.
Poniżej znajduje się implementacja zlokalizowanego komponentu
Linkw Preact:src/components/Link.tsxKopiuj kodSkopiuj kod do schowka
import { getLocalizedUrl } from "intlayer"; import { useLocale } from "preact-intlayer"; import { forwardRef } from "preact/compat"; import type { JSX } from "preact"; export interface LinkProps extends JSX.HTMLAttributes<HTMLAnchorElement> { href: string; } /** * Funkcja narzędziowa sprawdzająca, czy dany adres URL jest zewnętrzny. * Jeśli adres URL zaczyna się od http:// lub https://, jest uznawany za zewnętrzny. */ export const checkIsExternalLink = (href?: string): boolean => /^https?:\/\//.test(href ?? ""); /** * Niestandardowy komponent Link, który dostosowuje atrybut href na podstawie bieżącego języka. * Dla linków wewnętrznych używa `getLocalizedUrl`, aby poprzedzić adres URL językiem (np. /fr/about). * Zapewnia to, że nawigacja pozostaje w tym samym kontekście językowym. */ export const Link = forwardRef<HTMLAnchorElement, LinkProps>( ({ href, children, ...props }, ref) => { const { locale } = useLocale(); const isExternalLink = checkIsExternalLink(href); // Jeśli link jest wewnętrzny i podano prawidłowy href, pobierz zlokalizowany adres URL. const hrefI18n = href && !isExternalLink ? getLocalizedUrl(href, locale) : href; return ( <a href={hrefI18n} ref={ref} {...props}> {children} </a> ); } ); Link.displayName = "Link";Jak to działa
- Wykrywanie linków zewnętrznych:
Funkcja pomocniczacheckIsExternalLinkokreśla, czy adres URL jest zewnętrzny. Linki zewnętrzne pozostają bez zmian, ponieważ nie wymagają lokalizacji. - Pobieranie bieżącej lokalizacji:
HookuseLocalezapewnia bieżący język (np.frdla francuskiego). - Lokalizowanie adresu URL:
Dla linków wewnętrznych (tj. niezewnętrznych),getLocalizedUrljest używane do automatycznego poprzedzenia adresu URL bieżącym językiem. Oznacza to, że jeśli Twój użytkownik jest w języku francuskim, przekazanie/aboutjakohrefzmieni je na/fr/about. - Zwracanie linku:
Komponent zwraca element<a>ze zlokalizowanym adresem URL, zapewniając, że nawigacja jest spójna z językiem.
Renderowanie Markdown i HTML
OpcjonalneIntlayer obsługuje renderowanie zawartości Markdown i HTML w Preact.
Możesz dostosować renderowanie zawartości Markdown i HTML, używając metody
.use(). Ta metoda pozwala na nadpisanie domyślnego renderowania określonych znaczników.tsxKopiuj kodSkopiuj kod do schowka
import { useIntlayer } from "preact-intlayer";const { myMarkdownContent, myHtmlContent } = useIntlayer("my-component");// ...return ( <div> {/* Podstawowe renderowanie */} {myMarkdownContent} {/* Niestandardowe renderowanie dla Markdown */} {myMarkdownContent.use({ h1: (props) => <h1 style={{ color: "red" }} {...props} />, })} {/* Podstawowe renderowanie dla HTML */} {myHtmlContent} {/* Niestandardowe renderowanie dla HTML */} {myHtmlContent.use({ b: (props) => <strong style={{ color: "blue" }} {...props} />, })} </div>);Wyodrębnij zawartość swoich komponentów
OpcjonalneJeśli masz istniejącą bazę kodu, transformacja tysięcy plików może być czasochłonna.
Aby ułatwić ten proces, Intlayer proponuje kompilator / ekstraktor, aby przetransformować komponenty i wyodrębnić zawartość.
Aby go skonfigurować, możesz dodać sekcję
compilerw plikuintlayer.config.ts:intlayer.config.tsKopiuj kodSkopiuj kod do schowka
import { type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { // ... Reszta Twojej konfiguracji compiler: { /** * Wskazuje, czy kompilator powinien być włączony. */ enabled: true, /** * Definiuje ścieżkę plików wyjściowych */ output: ({ fileName, extension }) => `./${fileName}${extension}`, /** * Wskazuje, czy komponenty powinny zostać zapisane po transformacji. W ten sposób kompilator można uruchomić tylko raz, aby przetransformować aplikację, a następnie go usunąć. */ saveComponents: false, /** * Prefiks klucza słownika */ dictionaryKeyPrefix: "", }, }; export default config;Uruchom ekstraktor, aby przetransformować komponenty i wyodrębnić zawartość
bashKopiuj kodSkopiuj kod do schowka
npx intlayer extract
Konfiguracja TypeScript
Intlayer używa rozszerzania modułów, aby czerpać korzyści z TypeScript i uczynić Twoją bazę kodu silniejszą.


Upewnij się, że Twoja konfiguracja TypeScript zawiera automatycznie generowane typy.
Skopiuj kod do schowka
{ // ... Twoje istniejące konfiguracje TypeScript "compilerOptions": { // ... "jsx": "react-jsx", "jsxImportSource": "preact", // Zalecane dla Preact 10+ // ... }, "include": [ // ... Twoje istniejące konfiguracje TypeScript ".intlayer/**/*.ts", // Uwzględnij automatycznie generowane typy ],}Upewnij się, że pliktsconfig.jsonjest skonfigurowany pod kątem Preact, zwłaszczajsxijsxImportSourcelubjsxFactory/jsxFragmentFactorydla starszych wersji Preact, jeśli nie korzystasz z domyślnych ustawieńpreset-vite.
Konfiguracja Git
Zaleca się ignorowanie plików generowanych przez Intlayer. Pozwala to uniknąć zatwierdzania ich do repozytorium Git.
Aby to zrobić, możesz dodać następujące instrukcje do swojego pliku .gitignore:
Skopiuj kod do schowka
# Ignore the files generated by Intlayer.intlayerRozszerzenie VS Code
Aby poprawić wrażenia z pracy z Intlayer, możesz zainstalować oficjalne rozszerzenie Intlayer dla VS Code.
Zainstaluj z VS Code Marketplace
To rozszerzenie zapewnia:
- Autouzupełnianie kluczy tłumaczeń.
- Wykrywanie błędów w czasie rzeczywistym dla brakujących tłumaczeń.
- Podgląd w linii przetłumaczonej treści.
- Szybkie akcje, aby łatwo tworzyć i aktualizować tłumaczenia.
Więcej szczegółów na temat korzystania z rozszerzenia znajdziesz w dokumentacji rozszerzenia Intlayer dla VS Code.
(Opcjonalnie) Sitemap i robots.txt (generacja przy buildzie)
Intlayer udostępnia generateSitemap i getMultilingualUrls - narzędzia do formatowania wielojęzycznych plików sitemap.xml i robots.txt dla crawlerów i automatycznego zapisu do public/. Zwykle uruchamia się mały skrypt Node przed Vite (np. hooki npm predev / prebuild).
Sitemap
Generator sitemap uwzględnia locale i dodaje metadane dla crawlerów.
Sitemap obsługuje przestrzeń nazwxhtml:link(hreflang). Zamiast płaskiej listy URL Intlayer tworzy dwukierunkowe powiązania wszystkich wersji językowych strony (np./about,/fr/aboutlub/about?lang=frw zależności od routingu).
Robots.txt
Użyj getMultilingualUrls, by reguły Disallow obejmowały wszystkie zlokalizowane warianty ścieżek.
1. Plik generate-seo.mjs w katalogu głównym
Skopiuj kod do schowka
import fs from "fs";import path from "path";import { fileURLToPath } from "url";import { generateSitemap, getMultilingualUrls } from "intlayer";const __dirname = path.dirname(fileURLToPath(import.meta.url));const SITE_URL = (process.env.SITE_URL || "http://localhost:5173").replace( /\/$/, "");const pathList = [ { path: "/", changefreq: "daily", priority: 1.0 }, { path: "/about", changefreq: "monthly", priority: 0.7 },];const sitemapXml = generateSitemap(pathList, { siteUrl: SITE_URL });fs.writeFileSync(path.join(__dirname, "public", "sitemap.xml"), sitemapXml);const getAllMultilingualUrls = (urls) => urls.flatMap((url) => Object.values(getMultilingualUrls(url)));const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);const robotsTxt = [ "User-agent: *", "Allow: /", ...disallowedPaths.map((path) => `Disallow: ${path}`), "", `Sitemap: ${SITE_URL}/sitemap.xml`,].join("\n");fs.writeFileSync(path.join(__dirname, "public", "robots.txt"), robotsTxt);console.log("SEO files generated successfully.");Pakiet intlayer musi być zainstalowany. W produkcji ustaw SITE_URL w środowisku (np. w CI).
Preferujgenerate-seo.mjsdla ESM w Node. Przygenerate-seo.jsustaw"type": "module"wpackage.jsonlub włącz ESM inaczej.
2. Uruchom skrypt przed Vite
Skopiuj kod do schowka
{ "scripts": { "dev": "vite", "prebuild": "node generate-seo.mjs", "build": "vite build", "preview": "vite preview" }}Dostosuj polecenia dla pnpm lub yarn. Możesz też wywołać skrypt z CI.
Idź dalej
Aby pójść dalej, możesz zaimplementować edytor wizualny lub wyeksportować swoją treść za pomocą CMS.