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
- Aktualizacja komponentu LocaleRouter do użycia nowej konfiguracji trasv7.0.028.10.2025
- Inicjalizacja historiiv5.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 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ę Vite i Preact za pomocą Intlayer | Internacjonalizacja (i18n)
Ten pakiet jest w trakcie rozwoju. Zobacz zgłoszenie po więcej informacji. Pokaż swoje zainteresowanie Intlayer dla Preact, lajkując to zgłoszenie
Spis treści
Czym jest Intlayer?
Intlayer to innowacyjna, open-source'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 komponentu.
- Dynamicznie lokalizować metadane, trasy i treści.
- Zapewnić wsparcie dla TypeScript dzięki automatycznie generowanym typom, co poprawia autouzupełnianie i wykrywanie błędów.
- Korzystać z zaawansowanych funkcji, takich jak dynamiczne wykrywanie i przełączanie lokalizacji.
Przewodnik krok po kroku, jak skonfigurować Intlayer w aplikacji Vite i Preact
Zobacz Szablon aplikacji na GitHub.
Krok 1: Instalacja zależności
Zainstaluj niezbędne pakiety za pomocą npm:
npm install intlayer preact-intlayernpm install vite-intlayer --save-devintlayer
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.
Krok 2: Konfiguracja Twojego projektu
Utwórz plik konfiguracyjny, aby skonfigurować języki swojej aplikacji:
Skopiuj 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 lokalizacji 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.
Krok 3: Zintegruj Intlayer w swojej konfiguracji Vite
Dodaj wtyczkę intlayer do swojej konfiguracji.
Skopiuj 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ść.
Krok 4: Zadeklaruj swoją treść
Utwórz i zarządzaj deklaracjami treści, aby przechowywać tłumaczenia:
Skopiuj 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: ( <> Edytuj <code>src/app.tsx</code> i zapisz, aby przetestować 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,mjx,cjs,cjx}).
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.
Krok 5: Wykorzystaj Intlayer w swoim kodzie
Uzyskaj dostęp do swoich słowników treści w całej aplikacji:
Skopiuj 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.svgimport viteLogo from "/vite.svg";import "./app.css"; // Zakładamy, że Twój plik CSS nazywa się app.cssimport { 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> <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 jak alt, title, href, aria-label itp., musisz wywołać wartość funkcji, na przykład:
<img src={content.image.src.value} alt={content.image.value} />
Uwaga: W Preact className jest zazwyczaj zapisywane jako class.
Aby dowiedzieć się więcej o hooku useIntlayer, zapoznaj się z dokumentacją (API jest podobne dla preact-intlayer).
(Opcjonalny) Krok 6: Zmień język swojej zawartości
Aby zmienić język swojej zawartości, możesz użyć funkcji setLocale dostarczonej przez hook useLocale. Funkcja ta pozwala ustawić lokalizację aplikacji i odpowiednio zaktualizować zawartość.
Skopiuj 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)}> Zmień język na angielski </button> );};export default LocaleSwitcher;Aby dowiedzieć się więcej o hooku useLocale, zapoznaj się z dokumentacją (API jest podobne dla preact-intlayer).
(Opcjonalny) Krok 7: Dodaj lokalizowane routingi do swojej aplikacji
Celem tego kroku jest utworzenie unikalnych ścieżek dla każdego języka. Jest to przydatne dla SEO oraz przyjaznych dla SEO adresów URL. Przykład:
- https://example.com/about- https://example.com/es/about- https://example.com/fr/aboutDomyślnie trasy nie mają prefiksu dla domyślnej lokalizacji (routing.mode: "prefix-no-default"). Jeśli chcesz dodać prefiks dla domyślnej lokalizacji, możesz ustawić opcję routing.modena"prefix-all" w swojej konfiguracji. Więcej informacji znajdziesz w dokumentacji konfiguracji.
Aby dodać lokalizowane routowanie do swojej aplikacji, możesz utworzyć komponent LocaleRouter, który otacza trasy aplikacji i obsługuje routowanie oparte na lokalizacji. Oto przykład z użyciem preact-iso:
Najpierw zainstaluj preact-iso:
npm install preact-isoSkopiuj kod do schowka
import { configuration, getPathWithoutLocale, type Locale } from "intlayer";// Importy typów komponentów z preactimport type { ComponentChildren, FunctionalComponent } from "preact";import { useEffect } from "preact/hooks";import { IntlayerProvider } from "preact-intlayer";import { LocationProvider, useLocation } from "preact-iso";const { internationalization, routing } = configuration;const { locales, defaultLocale } = internationalization;// Komponent do nawigacji, który wykonuje przekierowanie na wskazaną ścieżkęconst Navigate: FunctionalComponent<{ to: string; replace?: boolean }> = ({ to, replace,}) => { const { route } = useLocation(); useEffect(() => { route(to, replace); }, [to, replace, route]); return null;};/** * Komponent obsługujący lokalizację i opakowujący dzieci w odpowiedni kontekst lokalizacji. * Zarządza wykrywaniem i walidacją lokalizacji na podstawie URL. */const AppLocalized: FunctionalComponent<{ children: ComponentChildren; locale?: Locale;}> = ({ children, locale }) => { const { path: pathname, url } = useLocation(); if (!url) { return null; } const search = url.substring(pathname.length); // Określa bieżącą lokalizację, domyślnie ustawiając lokalizację domyślną, jeśli nie jest podana const currentLocale = locale ?? defaultLocale; // Usuwa prefiks lokalizacji z ścieżki, aby skonstruować ścieżkę bazową const pathWithoutLocale = getPathWithoutLocale( pathname // Bieżąca ścieżka URL ); /** * Jeśli routing.mode to 'prefix-all', domyślna lokalizacja powinna zawsze mieć prefiks. */ if (routing.mode === "prefix-all") { // Waliduj locale if (!locale || !locales.includes(locale)) { // Przekieruj do domyślnego locale z zaktualizowaną ścieżką return ( <Navigate to={`/${defaultLocale}/${pathWithoutLocale}${search}`} replace // Zamień bieżący wpis w historii na nowy /> ); } // Owiń dzieci w IntlayerProvider i ustaw bieżące locale return ( <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider> ); } else { /** * Gdy routing.mode nie jest 'prefix-all', domyślne locale nie jest poprzedzone prefiksem. * Upewnij się, że bieżące locale jest ważne i nie jest domyślnym locale. */ if ( currentLocale.toString() !== defaultLocale.toString() && !locales .filter( (loc) => loc.toString() !== defaultLocale.toString() // Wyklucz domyślny język ) .includes(currentLocale) // Sprawdź, czy bieżący język znajduje się na liście ważnych języków ) { // Przekieruj na ścieżkę bez prefiksu języka return <Navigate to={`${pathWithoutLocale}${search}`} replace />; } // Otocz dzieci komponentem IntlayerProvider i ustaw bieżący język return ( <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider> ); }};const RouterContent: FunctionalComponent<{ children: ComponentChildren;}> = ({ children }) => { const { path } = useLocation(); if (!path) { return null; } const pathLocale = path.split("/")[1] as Locale; const isLocaleRoute = locales .filter( (locale) => routing.mode === "prefix-all" || locale !== defaultLocale ) .some((locale) => locale.toString() === pathLocale); if (isLocaleRoute) { return <AppLocalized locale={pathLocale}>{children}</AppLocalized>; } return ( <AppLocalized locale={routing.mode !== "prefix-all" ? defaultLocale : undefined} > {children} </AppLocalized> );};/** * Komponent routera, który ustawia trasy specyficzne dla lokalizacji. * Używa preact-iso do zarządzania nawigacją i renderowania komponentów zlokalizowanych. */export const LocaleRouter: FunctionalComponent<{ children: ComponentChildren;}> = ({ children }) => ( <LocationProvider> <RouterContent>{children}</RouterContent> </LocationProvider>);Następnie możesz użyć komponentu LocaleRouter w swojej aplikacji:
Skopiuj kod do schowka
import { LocaleRouter } from "./components/LocaleRouter";import type { FunctionalComponent } from "preact";// ... Twój komponent AppContent (zdefiniowany w Kroku 5)const App: FunctionalComponent = () => ( <LocaleRouter> <AppContent /> </LocaleRouter>);export default App;Równolegle możesz również użyć intlayerProxy, aby dodać routing po stronie serwera do swojej aplikacji. Ten plugin automatycznie wykryje bieżący język na podstawie URL i ustawi odpowiedni cookie językowy. Jeśli nie zostanie określony żaden język, plugin wybierze najbardziej odpowiedni język na podstawie preferencji językowych przeglądarki użytkownika. Jeśli nie zostanie wykryty żaden język, nastąpi przekierowanie do domyślnego języka.
Uwaga: aby używać intlayerProxy w środowisku produkcyjnym, musisz przenieść pakiet vite-intlayer z devDependencies do dependencies.
Skopiuj kod do schowka
import { defineConfig } from "vite";import preact from "@preact/preset-vite";import { intlayer, intlayerProxy } from "vite-intlayer";typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"import { defineConfig } from "vite";import preact from "@preact/preset-vite";import { intlayer, intlayerProxy } from "vite-intlayer";// https://vitejs.dev/config/export default defineConfig({ plugins: [preact(), intlayer(), intlayerProxy()],});(Opcjonalnie) Krok 8: Zmień URL, gdy zmienia się lokalizacja
Aby zmienić URL, gdy zmienia się lokalizacja, możesz użyć właściwości onLocaleChange dostarczonej przez hook useLocale. Równolegle możesz użyć useLocation i route z preact-iso, aby zaktualizować ścieżkę URL.
Skopiuj kod do schowka
import { useLocation, route } from "preact-iso";import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl,} from "intlayer";import { useLocale } from "preact-intlayer";import type { FunctionalComponent } from "preact";const LocaleSwitcher: FunctionalComponent = () => { const location = useLocation(); plugins: [preact(), intlayer(), intlayerProxy()],});(Opcjonalny) Krok 8: Zmiana URL po zmianie lokalizacji
Aby zmienić URL po zmianie lokalizacji, możesz użyć właściwości onLocaleChange dostarczonej przez hook useLocale. Równolegle możesz użyć useLocation oraz route z preact-iso, aby zaktualizować ścieżkę URL.
Skopiuj kod do schowka
import { useLocation, route } from "preact-iso";import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl,} from "intlayer";import { useLocale } from "preact-intlayer";import type { FunctionalComponent } from "preact";const LocaleSwitcher: FunctionalComponent = () => { const location = useLocation(); const { locale, availableLocales, setLocale } = useLocale({ onLocaleChange: (newLocale) => { const currentFullPath = location.url; // preact-iso dostarcza pełny URL // Budowanie URL z zaktualizowanym locale // Przykład: /es/about?foo=bar const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale); // Aktualizacja ścieżki URL route(pathWithLocale, true); // true oznacza replace }, }); return ( <div> <button popovertarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <a href={getLocalizedUrl(location.url, localeItem)} hreflang={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={(e) => { e.preventDefault(); setLocale(localeItem); // Nawigacja programowa po ustawieniu lokalizacji będzie obsługiwana przez onLocaleChange }} key={localeItem} > <span> {/* Lokalizacja - np. FR */} {localeItem} </span> <span> {/* Język w swojej własnej lokalizacji - np. Français */} {getLocaleName(localeItem, localeItem)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* Język w bieżącej lokalizacji - np. Francés przy ustawionej lokalizacji Locales.SPANISH */} {getLocaleName(localeItem, locale)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* Język po angielsku - np. French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </a> ))} </div> </div> );};export default LocaleSwitcher;Odniesienia do dokumentacji:
- useLocale hook (API jest podobne dla preact-intlayer) > - getLocaleName hook > - getLocalizedUrl hook > - getHTMLTextDir hook > - atrybut hreflang > - atrybut lang > - atrybut dir > - atrybut aria-current > - API Popoverla.org/en-US/docs/Web/HTML/Globalattributes/dir)> - aria-current atrybut> - [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/PopoverAPI)
Poniżej znajduje się zaktualizowany Krok 9 z dodatkowymi wyjaśnieniami i dopracowanymi przykładami kodu:
(Opcjonalny) Krok 9: Zmiana atrybutów języka i kierunku w elemencie HTML
Gdy Twoja aplikacja obsługuje wiele języków, kluczowe jest zaktualizowanie atrybutów lang i dir w tagu <html>, aby odpowiadały bieżącej lokalizacji. Zapewnia to:
- Dostępność: Czytniki ekranu i technologie wspomagające polegają na poprawnym atrybucie lang, aby prawidłowo 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 do określenia języka Twojej strony, co pomaga w wyświetlaniu odpowiednio zlokalizowanych treści w wynikach wyszukiwania.
Poprzez dynamiczną aktualizację tych atrybutów podczas zmiany lokalizacji, zapewniasz 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 lokalizacji i odpowiednio aktualizuje atrybuty:
Skopiuj kod do schowka
import { useEffect } from "preact/hooks";import { useLocale } from "preact-intlayer";import { getHTMLTextDir } from "intlayer";/** * Aktualizuje atrybuty `lang` i `dir` elementu <html> na podstawie bieżącej lokalizacji. * - `lang`: Informuje przeglądarki i wyszukiwarki o języku strony. * - `dir`: Zapewnia prawidłowy kierunek czytania (np. 'ltr' dla angielskiego, 'rtl' dla arabskiego). * * Ta dynamiczna aktualizacja jest niezbędna dla prawidłowego renderowania tekstu, dostępności i SEO. */export const useI18nHTMLAttributes = () => { const { locale } = useLocale(); useEffect(() => { // Aktualizuje atrybut języka na bieżący locale. document.documentElement.lang = locale; // Ustawia kierunek tekstu na podstawie bieżącego locale. document.documentElement.dir = getHTMLTextDir(locale); }, [locale]);};Użycie Hooka w Twojej Aplikacji
Zintegruj hook w swoim głównym komponencie, aby atrybuty HTML były aktualizowane za każdym razem, gdy zmienia się lokalizacja:
Skopiuj kod do schowka
import type { FunctionalComponent } from "preact";import { IntlayerProvider } from "preact-intlayer"; // useIntlayer już zaimportowany, jeśli AppContent tego potrzebujeimport { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";import "./app.css";// Definicja AppContent z Kroku 5const AppWithHooks: FunctionalComponent = () => { // Zastosuj hook do aktualizacji atrybutów lang i dir znacznika <html> na podstawie lokalizacji. useI18nHTMLAttributes(); // Zakładając, że AppContent jest Twoim głównym komponentem wyświetlającym zawartość z Kroku 5 return <AppContent />;};const App: FunctionalComponent = () => ( <IntlayerProvider> <AppWithHooks /> </IntlayerProvider>);export default App;Wprowadzając te zmiany, Twoja aplikacja:
- Zapewni, że atrybut language (lang) poprawnie odzwierciedla aktualną lokalizację, co jest ważne dla SEO i zachowania przeglądarki.
- Dostosuje kierunek tekstu (dir) zgodnie z lokalizacją, poprawiając czytelność i użyteczność dla języków o różnych kierunkach czytania.
- Zapewnij bardziej dostępne doświadczenie, ponieważ technologie wspomagające polegają na tych atrybutach, aby działać optymalnie.
(Opcjonalny) Krok 10: Tworzenie Lokalizowanego Komponentu Linku
Aby zapewnić, że nawigacja w Twojej aplikacji respektuje bieżącą lokalizację, możesz stworzyć niestandardowy komponent Link. Ten komponent automatycznie dodaje prefiks z aktualnym językiem do wewnętrznych adresów URL.
To zachowanie jest przydatne z kilku powodów:
- SEO i doświadczenie użytkownika: Lokalizowane adresy URL pomagają wyszukiwarkom poprawnie indeksować strony specyficzne dla języka oraz dostarczają użytkownikom treści w preferowanym przez nich języku.
- Spójność: Używając lokalizowanego linku w całej aplikacji, zapewniasz, że nawigacja pozostaje w obrębie bieżącej lokalizacji, zapobiegając nieoczekiwanym zmianom języka.
- Utrzymanie: Centralizacja logiki lokalizacji w jednym komponencie upraszcza zarządzanie URL-ami.
Dla Preact z preact-iso standardowo używa się tagów <a> do nawigacji, a routing obsługuje preact-iso. Jeśli potrzebujesz programatycznej nawigacji po kliknięciu (np. aby wykonać akcje przed nawigacją), możesz użyć funkcji route z useLocation. Oto jak możesz stworzyć niestandardowy komponent anchor, który lokalizuje URL-e:
Skopiuj kod do schowka
import { getLocalizedUrl } from "intlayer";import { useLocale, useLocation, route } from "preact-intlayer"; // Zakładając, że useLocation i route mogą pochodzić z preact-iso przez preact-intlayer, jeśli są reeksportowane, lub importować bezpośrednio// Jeśli nie jest ponownie eksportowane, importuj bezpośrednio: import { useLocation, route } from "preact-iso";import type { JSX } from "preact"; // Dla HTMLAttributesimport { forwardRef } from "preact/compat"; // Dla przekazywania referencjiexport interface LocalizedLinkProps extends JSX.HTMLAttributes<HTMLAnchorElement> { href: string; replace?: boolean; // Opcjonalne: do zastąpienia stanu historii}/** * Funkcja pomocnicza do sprawdzania, czy podany URL jest zewnętrzny. * Jeśli 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żącej lokalizacji. * Dla linków wewnętrznych używa `getLocalizedUrl`, aby poprzedzić URL lokalizacją (np. /fr/about). * Zapewnia to, że nawigacja pozostaje w tym samym kontekście lokalizacji. * Używa standardowego tagu <a>, ale może wywołać nawigację po stronie klienta za pomocą `route` z preact-iso. */export const LocalizedLink = forwardRef<HTMLAnchorElement, LocalizedLinkProps>( ({ href, children, onClick, replace = false, ...props }, ref) => { const { locale } = useLocale(); const location = useLocation(); // z preact-iso const isExternalLink = checkIsExternalLink(href); const hrefI18n = href && !isExternalLink ? getLocalizedUrl(href, locale) : href; const handleClick = (event: JSX.TargetedMouseEvent<HTMLAnchorElement>) => { if (onClick) { onClick(event); } if ( !isExternalLink && href && // Upewnij się, że href jest zdefiniowany event.button === 0 && // Kliknięcie lewym przyciskiem myszy !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey && // Standardowe sprawdzenie modyfikatorów !props.target // Nie otwieraj w nowej karcie/oknie ) { event.preventDefault(); if (location.url !== hrefI18n) { // Nawiguj tylko, jeśli URL jest inny route(hrefI18n, replace); // Użyj route z preact-iso } } }; return ( <a href={hrefI18n} ref={ref} onClick={handleClick} {...props}> {children} </a> ); });Jak to działa
- Wykrywanie linków zewnętrznych:
Funkcja pomocnicza checkIsExternalLink określa, czy URL jest zewnętrzny. Linki zewnętrzne pozostają niezmienione. - Pobieranie bieżącej lokalizacji:
Hook useLocale dostarcza bieżącą lokalizację. - Lokalizacja URL:
Dla linków wewnętrznych getLocalizedUrl dodaje prefiks z bieżącą lokalizacją. - Nawigacja po stronie klienta: Funkcja handleClick sprawdza, czy jest to link wewnętrzny oraz czy standardowa nawigacja powinna zostać zablokowana. Jeśli tak, używa funkcji route z preact-iso (uzyskanej przez useLocation lub bezpośrednio zaimportowanej) do wykonania nawigacji po stronie klienta. Zapewnia to zachowanie podobne do SPA bez pełnego przeładowania strony.
- Zwracanie linku:
Komponent zwraca element <a> z zlokalizowanym URL-em oraz niestandardowym obsługiwaczem kliknięć.
Konfiguracja TypeScript
Intlayer wykorzystuje rozszerzenia modułów, 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 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 Twój plik tsconfig.json jest skonfigurowany pod Preact, szczególnie opcje jsx i jsxImportSource lub jsxFactory/jsxFragmentFactory dla 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ąć ich zatwierdzania do repozytorium Git.
Aby to zrobić, możesz dodać następujące instrukcje do pliku .gitignore:
# Ignoruj pliki generowane przez Intlayer.intlayerRozszerzenie VS Code
Aby poprawić swoje doświadczenie deweloperskie z Intlayer, możesz zainstalować oficjalne rozszerzenie Intlayer dla VS Code.
Zainstaluj z Marketplace VS Code
To rozszerzenie oferuje:
- Autouzupełnianie kluczy tłumaczeń.
- Wykrywanie błędów w czasie rzeczywistym dla brakujących tłumaczeń.
- Podgląd w linii przetłumaczonej zawartości.
- Szybkie akcje umożliwiające łatwe tworzenie i aktualizowanie tłumaczeń.
Aby uzyskać więcej informacji o korzystaniu z rozszerzenia, zapoznaj się z dokumentacją rozszerzenia Intlayer dla VS Code.
Idź dalej
Aby pójść dalej, możesz zaimplementować edytor wizualny lub wyeksportować swoją zawartość, korzystając z CMS.