Stellen Sie Ihre Frage und erhalten Sie einen Resümee des Dokuments, indem Sie diese Seite und den AI-Anbieter Ihrer Wahl referenzieren
Durch die Integration des Intlayer MCP-Servers in Ihren bevorzugten AI-Assistenten können Sie alle Dokumente direkt von ChatGPT, DeepSeek, Cursor, VSCode usw. abrufen.
Dokumentation des MCP-Servers ansehenDer Inhalt dieser Seite wurde mit einer KI übersetzt.
Den englischen Originaltext ansehenWenn Sie eine Idee haben, um diese Dokumentation zu verbessern, zögern Sie bitte nicht, durch das Einreichen eines Pull-Requests auf GitHub beizutragen.
GitHub-Link zur DokumentationMarkdown des Dokuments in die Zwischenablage kopieren
Erste Schritte zur Internationalisierung (i18n) mit Intlayer, Vite und Preact
Dieses Paket befindet sich in der Entwicklung. Weitere Informationen finden Sie im Issue. Zeigen Sie Ihr Interesse an Intlayer für Preact, indem Sie das Issue liken.
Siehe Anwendungsvorlage auf GitHub.
Was ist Intlayer?
Intlayer ist eine innovative, Open-Source-Internationalisierungsbibliothek (i18n), die entwickelt wurde, um die mehrsprachige Unterstützung in modernen Webanwendungen zu vereinfachen.
Mit Intlayer können Sie:
- Übersetzungen einfach verwalten mit deklarativen Wörterbüchern auf Komponentenebene.
- Metadaten, Routen und Inhalte dynamisch lokalisieren.
- TypeScript-Unterstützung sicherstellen mit automatisch generierten Typen, die die Autovervollständigung und Fehlererkennung verbessern.
- Profitieren Sie von erweiterten Funktionen, wie dynamischer Spracherkennung und Umschaltung.
Schritt-für-Schritt-Anleitung zur Einrichtung von Intlayer in einer Vite- und Preact-Anwendung
Schritt 1: Abhängigkeiten installieren
Installieren Sie die notwendigen Pakete mit npm:
Kopieren Sie den Code in die Zwischenablage
npm install intlayer preact-intlayernpm install vite-intlayer --save-dev
intlayer
intlayer
Das Kernpaket, das Internationalisierungswerkzeuge für Konfigurationsmanagement, Übersetzung, Inhaltsdeklaration, Transpilierung und CLI-Befehle bereitstellt.
preact-intlayer Das Paket, das Intlayer in Preact-Anwendungen integriert. Es stellt Kontextanbieter und Hooks für die Internationalisierung in Preact bereit.
vite-intlayer Enthält das Vite-Plugin zur Integration von Intlayer mit dem Vite-Bundler sowie Middleware zur Erkennung der bevorzugten Sprache des Benutzers, Verwaltung von Cookies und Handhabung von URL-Weiterleitungen.
Schritt 2: Konfiguration Ihres Projekts
Erstellen Sie eine Konfigurationsdatei, um die Sprachen Ihrer Anwendung zu konfigurieren:
Kopieren Sie den Code in die Zwischenablage
import { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Ihre weiteren Sprachversionen ], defaultLocale: Locales.ENGLISH, },};export default config;
Durch diese Konfigurationsdatei können Sie lokalisierte URLs, Middleware-Weiterleitungen, Cookie-Namen, den Speicherort und die Erweiterung Ihrer Inhaltsdeklarationen einrichten, Intlayer-Logs in der Konsole deaktivieren und vieles mehr. Für eine vollständige Liste der verfügbaren Parameter verweisen wir auf die Konfigurationsdokumentation.
Schritt 3: Integrieren Sie Intlayer in Ihre Vite-Konfiguration
Fügen Sie das Intlayer-Plugin in Ihre Konfiguration ein.
Kopieren Sie den Code in die Zwischenablage
import { defineConfig } from "vite";import preact from "@preact/preset-vite";import { intlayerPlugin } from "vite-intlayer";// https://vitejs.dev/config/export default defineConfig({ plugins: [preact(), intlayerPlugin()],});
Das intlayerPlugin() Vite-Plugin wird verwendet, um Intlayer mit Vite zu integrieren. Es sorgt für den Aufbau von Inhaltsdeklarationsdateien und überwacht diese im Entwicklungsmodus. Es definiert Intlayer-Umgebungsvariablen innerhalb der Vite-Anwendung. Zusätzlich stellt es Aliase bereit, um die Leistung zu optimieren.
Schritt 4: Deklarieren Sie Ihren Inhalt
Erstellen und verwalten Sie Ihre Inhaltsdeklarationen, um Übersetzungen zu speichern:
Kopieren Sie den Code in die Zwischenablage
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: ( <> Bearbeiten Sie <code>src/app.tsx</code> und speichern Sie, um HMR zu testen </> ), 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;
Ihre Inhaltsdeklarationen können überall in Ihrer Anwendung definiert werden, sobald sie in das Verzeichnis contentDir aufgenommen sind (standardmäßig ./src). Und sie müssen der Dateierweiterung für Inhaltsdeklarationen entsprechen (standardmäßig .content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}).
Für weitere Details siehe die Dokumentation zur Inhaltsdeklaration.
Wenn Ihre Inhaltsdatei TSX-Code enthält, müssen Sie möglicherweise import { h } from "preact"; importieren oder sicherstellen, dass Ihr JSX-Pragma korrekt für Preact gesetzt ist.
Schritt 5: Nutzen Sie Intlayer in Ihrem Code
Greifen Sie in Ihrer gesamten Anwendung auf Ihre Inhaltswörterbücher zu:
Kopieren Sie den Code in die Zwischenablage
import { useState } from "preact/hooks";import type { FunctionalComponent } from "preact";import preactLogo from "./assets/preact.svg"; // Angenommen, Sie haben eine preact.svgimport viteLogo from "/vite.svg";import "./app.css"; // Angenommen, Ihre CSS-Datei heißt 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;
Wenn Sie Ihren Inhalt in einem string-Attribut verwenden möchten, wie z.B. alt, title, href, aria-label usw., müssen Sie den Wert der Funktion aufrufen, zum Beispiel:
jsxCode kopierenKopieren Sie den Code in die Zwischenablage
<img src={content.image.src.value} alt={content.image.value} />
Hinweis: In Preact wird className typischerweise als class geschrieben.
Um mehr über den useIntlayer Hook zu erfahren, lesen Sie die Dokumentation (Die API ist ähnlich für preact-intlayer).
(Optional) Schritt 6: Ändern Sie die Sprache Ihres Inhalts
Um die Sprache Ihres Inhalts zu ändern, können Sie die Funktion setLocale verwenden, die vom useLocale Hook bereitgestellt wird. Diese Funktion ermöglicht es Ihnen, die Locale der Anwendung festzulegen und den Inhalt entsprechend zu aktualisieren.
Kopieren Sie den Code in die Zwischenablage
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)}> Sprache auf Englisch ändern </button> );};export default LocaleSwitcher;
Um mehr über den useLocale Hook zu erfahren, siehe die Dokumentation (Die API ist ähnlich für preact-intlayer).
(Optional) Schritt 7: Lokalisierte Routen zu Ihrer Anwendung hinzufügen
Zweck dieses Schrittes ist es, für jede Sprache eindeutige Routen zu erstellen. Dies ist nützlich für SEO und SEO-freundliche URLs. Beispiel:
Kopieren Sie den Code in die Zwischenablage
- https://example.com/about- https://example.com/es/about- https://example.com/fr/about
Standardmäßig sind die Routen für die Standardsprache nicht mit einem Präfix versehen. Wenn Sie die Standardsprache mit einem Präfix versehen möchten, können Sie in Ihrer Konfiguration die Option middleware.prefixDefault auf true setzen. Weitere Informationen finden Sie in der Konfigurationsdokumentation.
Um lokalisierte Routen in Ihre Anwendung hinzuzufügen, können Sie eine LocaleRouter-Komponente erstellen, die die Routen Ihrer Anwendung umschließt und die sprachabhängige Navigation verwaltet. Hier ist ein Beispiel unter Verwendung von preact-iso:
Zuerst installieren Sie preact-iso:
Kopieren Sie den Code in die Zwischenablage
npm install preact-iso
Kopieren Sie den Code in die Zwischenablage
import { type Locales, configuration, getPathWithoutLocale } from "intlayer";import { ComponentChildren, FunctionalComponent } from "preact";import { IntlayerProvider } from "preact-intlayer";import { LocationProvider, useLocation } from "preact-iso";import { useEffect } from "preact/hooks";const { internationalization, middleware } = configuration;const { locales, defaultLocale } = internationalization;const Navigate: FunctionalComponent<{ to: string; replace?: boolean }> = ({ to, replace,}) => { const { route } = useLocation(); useEffect(() => { route(to, replace); }, [to, replace, route]); return null;};/**/** * Eine Komponente, die die Lokalisierung verwaltet und die Kinder mit dem entsprechenden Locale-Kontext umschließt. * Sie verwaltet die auf der URL basierende Lokalerkennung und -validierung. */const AppLocalized: FunctionalComponent<{ children: ComponentChildren; locale?: Locales;}> = ({ children, locale }) => { const { path: pathname, url } = useLocation(); if (!url) { return null; } const search = url.substring(pathname.length); // Bestimmt das aktuelle Locale, standardmäßig wird das Standard-Locale verwendet, wenn keines angegeben ist const currentLocale = locale ?? defaultLocale; // Entfernt das Locale-Präfix aus dem Pfad, um einen Basis-Pfad zu erstellen const pathWithoutLocale = getPathWithoutLocale( pathname // Aktueller URL-Pfad ); /** * Wenn middleware.prefixDefault wahr ist, sollte die Standardsprache immer vorangestellt werden. */ if (middleware.prefixDefault) { // Überprüfe die Sprache if (!locale || !locales.includes(locale)) { // Weiterleitung zur Standardsprache mit dem aktualisierten Pfad return ( <Navigate to={`/${defaultLocale}/${pathWithoutLocale}${search}`} replace // Ersetzt den aktuellen Eintrag im Verlauf durch den neuen /> ); } // Umschließe die Kinder mit dem IntlayerProvider und setze die aktuelle Sprache return ( <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider> ); } else { /** * Wenn middleware.prefixDefault falsch ist, wird die Standardsprache nicht vorangestellt. * Stellen Sie sicher, dass die aktuelle Locale gültig ist und nicht die Standard-Locale. */ if ( currentLocale.toString() !== defaultLocale.toString() && !locales .filter( (loc) => loc.toString() !== defaultLocale.toString() // Standard-Locale ausschließen ) .includes(currentLocale) // Prüfen, ob die aktuelle Locale in der Liste der gültigen Locales ist ) { // Weiterleitung zum Pfad ohne Locale-Präfix return <Navigate to={`${pathWithoutLocale}${search}`} replace />; } // Kinder mit dem IntlayerProvider umschließen und die aktuelle Locale setzen 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 Locales; const isLocaleRoute = locales .filter((locale) => middleware.prefixDefault || locale !== defaultLocale) .some((locale) => locale.toString() === pathLocale); if (isLocaleRoute) { return <AppLocalized locale={pathLocale}>{children}</AppLocalized>; } return ( <AppLocalized locale={!middleware.prefixDefault ? defaultLocale : undefined} > {children} </AppLocalized> );};/** * Eine Router-Komponente, die lokalisierungsspezifische Routen einrichtet. * Sie verwendet preact-iso, um die Navigation zu verwalten und lokalisierte Komponenten zu rendern. */export const LocaleRouter: FunctionalComponent<{ children: ComponentChildren;}> = ({ children }) => ( <LocationProvider> <RouterContent>{children}</RouterContent> </LocationProvider>);
Dann können Sie die LocaleRouter-Komponente in Ihrer Anwendung verwenden:
Kopieren Sie den Code in die Zwischenablage
import { LocaleRouter } from "./components/LocaleRouter";import type { FunctionalComponent } from "preact";tsx fileName="src/app.tsx" codeFormat="typescript"// ... Ihre AppContent-Komponente (definiert in Schritt 5)const App: FunctionalComponent = () => ( <LocaleRouter> <AppContent /> </LocaleRouter>);export default App;
Parallel dazu können Sie auch das intLayerMiddlewarePlugin verwenden, um serverseitiges Routing zu Ihrer Anwendung hinzuzufügen. Dieses Plugin erkennt automatisch die aktuelle Locale basierend auf der URL und setzt das entsprechende Locale-Cookie. Wenn keine Locale angegeben ist, bestimmt das Plugin die am besten geeignete Locale basierend auf den Spracheinstellungen des Browsers des Benutzers. Wenn keine Locale erkannt wird, erfolgt eine Weiterleitung zur Standard-Locale.
Kopieren Sie den Code in die Zwischenablage
import { defineConfig } from "vite";import preact from "@preact/preset-vite";import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";// https://vitejs.dev/config/export default defineConfig({ plugins: [preact(), intlayerPlugin(), intLayerMiddlewarePlugin()],});
(Optional) Schritt 8: Ändern der URL, wenn sich die Sprache ändert
Um die URL zu ändern, wenn sich die Sprache ändert, können Sie die onLocaleChange-Eigenschaft verwenden, die vom useLocale-Hook bereitgestellt wird. Parallel dazu können Sie useLocation und route von preact-iso verwenden, um den URL-Pfad zu aktualisieren.
Kopieren Sie den Code in die Zwischenablage
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 liefert die vollständige URL // Erstellen Sie die URL mit der aktualisierten Locale // Beispiel: /es/about?foo=bar const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale); // Aktualisieren Sie den URL-Pfad route(pathWithLocale, true); // true für Ersetzen }, }); 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); // Programmatische Navigation nach dem Setzen der Sprache wird von onLocaleChange übernommen }} key={localeItem} > <span> {/* Gebietsschema - z.B. FR */} {localeItem} </span> <span> {/* Sprache in ihrem eigenen Gebietsschema - z.B. Français */} {getLocaleName(localeItem, localeItem)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* Sprache im aktuellen Gebietsschema - z.B. Francés, wenn das aktuelle Gebietsschema auf Locales.SPANISH gesetzt ist */} {getLocaleName(localeItem, locale)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* Sprache auf Englisch - z.B. French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </a> ))} </div> </div> );};export default LocaleSwitcher;
Dokumentationsverweise:
-useLocale Hook (API ist ähnlich für preact-intlayer)
- getLocaleName Hook
- getLocalizedUrl Hook
- getHTMLTextDir Hook
- hreflang Attribut
- lang Attribut
- dir Attribut
- aria-current Attribut
- Popover API la.org/en-US/docs/Web/HTML/Globalattributes/dir)> - aria-current Attribut> - [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/PopoverAPI)
Unten finden Sie den aktualisierten Schritt 9 mit zusätzlichen Erklärungen und verfeinerten Codebeispielen:
(Optional) Schritt 9: Wechseln der HTML-Sprach- und Richtungsattribute
Wenn Ihre Anwendung mehrere Sprachen unterstützt, ist es entscheidend, die lang- und dir-Attribute des <html>-Tags an die aktuelle Locale anzupassen. Dies stellt sicher:
- Barrierefreiheit: Screenreader und unterstützende Technologien verlassen sich auf das korrekte lang-Attribut, um Inhalte richtig auszusprechen und zu interpretieren.
- Textdarstellung: Das dir-Attribut (Richtung) sorgt dafür, dass der Text in der richtigen Reihenfolge dargestellt wird (z. B. von links nach rechts für Englisch, von rechts nach links für Arabisch oder Hebräisch), was für die Lesbarkeit unerlässlich ist.
- SEO: Suchmaschinen verwenden das lang-Attribut, um die Sprache Ihrer Seite zu bestimmen und so die richtige lokalisierte Version in den Suchergebnissen anzuzeigen.
Indem Sie diese Attribute dynamisch aktualisieren, wenn sich die Locale ändert, gewährleisten Sie eine konsistente und barrierefreie Benutzererfahrung für alle unterstützten Sprachen.
Implementierung des Hooks
Erstellen Sie einen benutzerdefinierten Hook, um die HTML-Attribute zu verwalten. Der Hook hört auf Locale-Änderungen und aktualisiert die Attribute entsprechend:
Kopieren Sie den Code in die Zwischenablage
import { useEffect } from "preact/hooks";import { useLocale } from "preact-intlayer";import { getHTMLTextDir } from "intlayer";/** * Aktualisiert die `lang`- und `dir`-Attribute des HTML-Elements `<html>` basierend auf der aktuellen Locale. * - `lang`: Informiert Browser und Suchmaschinen über die Sprache der Seite. * - `dir`: Stellt die korrekte Leserichtung sicher (z.B. 'ltr' für Englisch, 'rtl' für Arabisch). * * Dieses dynamische Update ist essenziell für die korrekte Textdarstellung, Barrierefreiheit und SEO. */export const useI18nHTMLAttributes = () => { const { locale } = useLocale(); useEffect(() => { // Aktualisiert das Sprachattribut auf die aktuelle Locale. document.documentElement.lang = locale; // Setzt die Textrichtung basierend auf der aktuellen Locale. document.documentElement.dir = getHTMLTextDir(locale); }, [locale]);};
Verwendung des Hooks in Ihrer Anwendung
Integrieren Sie den Hook in Ihre Hauptkomponente, damit die HTML-Attribute aktualisiert werden, sobald sich die Locale ändert:
Kopieren Sie den Code in die Zwischenablage
import type { FunctionalComponent } from "preact";import { IntlayerProvider } from "preact-intlayer"; // useIntlayer bereits importiert, falls AppContent es benötigtimport { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";import "./app.css";// AppContent-Definition aus Schritt 5const AppWithHooks: FunctionalComponent = () => { // Wenden Sie den Hook an, um die Attribute lang und dir des <html>-Tags basierend auf der Locale zu aktualisieren. useI18nHTMLAttributes(); // Angenommen, AppContent ist Ihre Hauptkomponentenanzeige aus Schritt 5 return <AppContent />;};const App: FunctionalComponent = () => ( <IntlayerProvider> <AppWithHooks /> </IntlayerProvider>);export default App;
Durch die Anwendung dieser Änderungen wird Ihre Anwendung:
- Sicherstellen, dass das Sprach- (lang) Attribut die aktuelle Locale korrekt widerspiegelt, was wichtig für SEO und das Verhalten des Browsers ist.
- Die Schreibrichtung (dir) entsprechend der Locale anpassen, um die Lesbarkeit und Benutzerfreundlichkeit für Sprachen mit unterschiedlichen Leserichtungen zu verbessern.
- Bieten Sie eine zugänglichere Erfahrung, da unterstützende Technologien auf diese Attribute angewiesen sind, um optimal zu funktionieren.
(Optional) Schritt 10: Erstellen einer lokalisierten Link-Komponente
Um sicherzustellen, dass die Navigation Ihrer Anwendung die aktuelle Sprache berücksichtigt, können Sie eine benutzerdefinierte Link-Komponente erstellen. Diese Komponente fügt automatisch das aktuelle Sprachpräfix zu internen URLs hinzu.
Dieses Verhalten ist aus mehreren Gründen nützlich:
- SEO und Benutzererfahrung: Lokalisierte URLs helfen Suchmaschinen, sprachspezifische Seiten korrekt zu indexieren, und bieten den Nutzern Inhalte in ihrer bevorzugten Sprache.
- Konsistenz: Durch die Verwendung eines lokalisierten Links in der gesamten Anwendung stellen Sie sicher, dass die Navigation innerhalb der aktuellen Sprache bleibt und unerwartete Sprachwechsel vermieden werden.
- Wartbarkeit: Die Zentralisierung der Lokalisierungslogik in einer einzigen Komponente vereinfacht die Verwaltung der URLs.
Für Preact mit preact-iso werden typischerweise Standard-<a>-Tags für die Navigation verwendet, und preact-iso übernimmt das Routing. Wenn Sie eine programmatische Navigation bei einem Klick benötigen (z. B. um Aktionen vor der Navigation auszuführen), können Sie die route-Funktion aus useLocation verwenden. So können Sie eine benutzerdefinierte Anker-Komponente erstellen, die URLs lokalisiert:
Kopieren Sie den Code in die Zwischenablage
import { getLocalizedUrl } from "intlayer";import { useLocale, useLocation, route } from "preact-intlayer"; // Angenommen, useLocation und route können von preact-iso über preact-intlayer bereitgestellt werden, falls re-exportiert, oder direkt importiert werden// Wenn nicht erneut exportiert, direkt importieren: import { useLocation, route } von "preact-iso";import type { JSX } from "preact"; // Für HTMLAttributesimport { forwardRef } from "preact/compat"; // Für das Weiterreichen von Refsexport interface LocalizedLinkProps extends JSX.HTMLAttributes<HTMLAnchorElement> { href: string; replace?: boolean; // Optional: um den Verlauf zu ersetzen}/** * Hilfsfunktion, um zu prüfen, ob eine gegebene URL extern ist. * Wenn die URL mit http:// oder https:// beginnt, wird sie als extern betrachtet. */export const checkIsExternalLink = (href?: string): boolean => /^https?:\/\//.test(href ?? "");/** * Eine benutzerdefinierte Link-Komponente, die das href-Attribut basierend auf der aktuellen Locale anpasst. * Für interne Links wird `getLocalizedUrl` verwendet, um die URL mit dem Locale-Präfix zu versehen (z. B. /fr/about). * Dies stellt sicher, dass die Navigation im gleichen Locale-Kontext bleibt. * Es wird ein standardmäßiges <a>-Tag verwendet, das jedoch eine clientseitige Navigation über `route` von preact-iso auslösen kann. */export const LocalizedLink = forwardRef<HTMLAnchorElement, LocalizedLinkProps>( ({ href, children, onClick, replace = false, ...props }, ref) => { const { locale } = useLocale(); const location = useLocation(); // von 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 && // Sicherstellen, dass href definiert ist event.button === 0 && // Linksklick !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey && // Standard-Modifier-Überprüfung !props.target // Kein Ziel in einem neuen Tab/Fenster ) { event.preventDefault(); if (location.url !== hrefI18n) { // Nur navigieren, wenn die URL unterschiedlich ist route(hrefI18n, replace); // Verwende preact-iso's route } } }; return ( <a href={hrefI18n} ref={ref} onClick={handleClick} {...props}> {children} </a> ); });
Funktionsweise
- Erkennung externer Links:
Die Hilfsfunktion checkIsExternalLink bestimmt, ob eine URL extern ist. Externe Links bleiben unverändert. - Abrufen der aktuellen Locale:
Der Hook useLocale liefert die aktuelle Locale. - Lokalisierung der URL:
Für interne Links fügt getLocalizedUrl der URL das aktuelle Locale-Präfix hinzu. - Client-seitige Navigation: Die Funktion handleClick prüft, ob es sich um einen internen Link handelt und ob die Standardnavigation verhindert werden soll. Falls ja, verwendet sie die route-Funktion von preact-iso (erhalten über useLocation oder direkt importiert), um eine clientseitige Navigation durchzuführen. Dies ermöglicht ein SPA-ähnliches Verhalten ohne vollständiges Neuladen der Seite.
- Rückgabe des Links:
Die Komponente gibt ein <a>-Element mit der lokalisierten URL und dem benutzerdefinierten Klick-Handler zurück.
TypeScript konfigurieren
Intlayer verwendet Module Augmentation, um die Vorteile von TypeScript zu nutzen und Ihren Code robuster zu machen.
Stellen Sie sicher, dass Ihre TypeScript-Konfiguration die automatisch generierten Typen enthält.
Kopieren Sie den Code in die Zwischenablage
{ // ... Ihre bestehenden TypeScript-Konfigurationen "compilerOptions": { // ... "jsx": "react-jsx", "jsxImportSource": "preact", // Empfohlen für Preact 10+ // ... }, "include": [ // ... Ihre bestehenden TypeScript-Konfigurationen ".intlayer/**/*.ts", // Einschluss der automatisch generierten Typen ],}
Stellen Sie sicher, dass Ihre tsconfig.json für Preact eingerichtet ist, insbesondere jsx und jsxImportSource oder jsxFactory/jsxFragmentFactory für ältere Preact-Versionen, falls Sie nicht die Standardwerte von preset-vite verwenden.
Git-Konfiguration
Es wird empfohlen, die von Intlayer generierten Dateien zu ignorieren. So vermeiden Sie, diese versehentlich in Ihr Git-Repository zu committen.
Um dies zu tun, können Sie die folgenden Anweisungen zu Ihrer .gitignore-Datei hinzufügen:
Kopieren Sie den Code in die Zwischenablage
# Ignoriere die von Intlayer generierten Dateien.intlayer
VS Code Erweiterung
Um Ihre Entwicklungserfahrung mit Intlayer zu verbessern, können Sie die offizielle Intlayer VS Code Erweiterung installieren.
Im VS Code Marketplace installieren
Diese Erweiterung bietet:
- Autovervollständigung für Übersetzungsschlüssel.
- Echtzeit-Fehlererkennung für fehlende Übersetzungen.
- Inline-Vorschauen des übersetzten Inhalts.
- Schnellaktionen, um Übersetzungen einfach zu erstellen und zu aktualisieren.
Für weitere Details zur Nutzung der Erweiterung lesen Sie bitte die Intlayer VS Code Erweiterungsdokumentation.
Weiterführende Schritte
Um weiterzugehen, können Sie den visuellen Editor implementieren oder Ihre Inhalte mit dem CMS auslagern.
Dokumentationsverlauf
- 5.5.10 - 2025-06-29: Historie initialisiert