Zeichenfolgen
So internationalisieren Sie einfache Textstrings mit useGT
Die Stringübersetzung bietet direkten Zugriff auf Übersetzungen ohne JSX – ideal für Attribute, Objekteigenschaften und reine Textwerte. Verwenden Sie useGT in React‑Komponenten, um Strings zu übersetzen.
Schnellstart
import { useGT } from 'gt-react';
function MyComponent() {
const t = useGT();
return (
<input
placeholder={t('E-Mail-Adresse eingeben')}
title={t('Feld für E-Mail-Adresse')}
/>
);
}Wann Sie die String-Übersetzung verwenden sollten
Die String-Übersetzung ist ideal, wenn Sie reinen Text statt JSX benötigen:
HTML-Attribute
const t = useGT();
<input
placeholder={t('Produkte suchen …')}
aria-label={t('Produktsuchfeld')}
title={t('Tippen, um den Katalog zu durchsuchen')}
/>Objekteigenschaften
const t = useGT();
const user = {
name: 'John',
role: 'admin',
bio: t('Erfahrener Softwareentwickler mit 5 Jahren React-Erfahrung'),
status: t('Derzeit für Projekte verfügbar')
};Konfiguration & Konstanten
const t = useGT();
const navigationItems = [
{ label: t('Startseite'), href: '/' },
{ label: t('Produkte'), href: '/products' },
{ label: t('Kontakt'), href: '/contact' }
];Wann Sie stattdessen <T> verwenden sollten
Verwenden Sie die <T>-Komponente für JSX-Inhalte:
// ✅ Verwende <T> für JSX-Inhalte
<T><p>Willkommen in <strong>unserem Shop</strong>!</p></T>
// ✅ Verwende String-Übersetzung für reinen Text
<input placeholder={t('Produkte suchen')} />Verwendung von Variablen
Grundvariablen
Ersetzen Sie Platzhalter durch dynamische Werte:
const t = useGT();
const itemCount = 5;
// String mit Platzhalter
const message = t('Sie haben {count} Artikel in Ihrem Warenkorb', { count: itemCount });
// Ergebnis: „Sie haben 5 Artikel in Ihrem Warenkorb"Mehrere Variablen
const t = useGT();
const order = { id: 'ORD-123', total: 99.99, date: '2024-01-15' };
const confirmation = t(
'Bestellung {orderId} über ${total} wurde am {date} aufgegeben',
{
orderId: order.id,
total: order.total,
date: order.date
}
);ICU Message Format
Für erweitertes Formatieren verwende die ICU-Syntax:
const t = useGT();
translate('Es gibt {count, plural, =0 {keine Artikel} =1 {einen Artikel} other {{count} Artikel}} im Warenkorb', { count: 10 });Erfahren Sie mehr über das ICU Message Format in der Unicode-Dokumentation.
Beispiele
Formularelemente
import { useGT } from 'gt-react';
function ContactForm() {
const t = useGT();
return (
<form>
<input
type="email"
placeholder={t('E-Mail-Adresse eingeben')}
aria-label={t('E-Mail-Eingabefeld')}
/>
<textarea
placeholder={t('Erzählen Sie uns von Ihrem Projekt …')}
aria-label={t('Projektbeschreibung')}
/>
<button type="submit">
{t('Nachricht senden')}
</button>
</form>
);
}Navigationsmenü
import { useGT } from 'gt-react';
function Navigation() {
const t = useGT();
const menuItems = [
{ label: t('Startseite'), href: '/', icon: 'home' },
{ label: t('Über uns'), href: '/about', icon: 'info' },
{ label: t('Leistungen'), href: '/services', icon: 'briefcase' },
{ label: t('Kontakt'), href: '/contact', icon: 'mail' }
];
return (
<nav>
{menuItems.map((item) => (
<a key={item.href} href={item.href} title={item.label}>
<Icon name={item.icon} />
{item.label}
</a>
))}
</nav>
);
}Dynamische Content Factory
// utils/productData.js
export function getProductMessages(t) {
return {
categories: [
{ id: 'electronics', name: t('Elektronik') },
{ id: 'clothing', name: t('Kleidung') },
{ id: 'books', name: t('Bücher') }
],
statusMessages: {
available: t('Auf Lager und versandbereit'),
backordered: t('Derzeit nicht vorrätig – Versand in 2–3 Wochen'),
discontinued: t('Dieser Artikel wurde aus dem Sortiment genommen')
},
errors: {
notFound: t('Produkt nicht gefunden'),
outOfStock: t('Dieser Artikel ist derzeit leider nicht auf Lager')
}
};
}
// components/ProductCard.jsx
import { useGT } from 'gt-react';
import { getProductMessages } from '../utils/productData';
function ProductCard({ product }) {
const t = useGT();
const messages = getProductMessages(t);
return (
<div>
<h3>{product.name}</h3>
<p>{messages.statusMessages[product.status]}</p>
<span>{messages.categories.find(c => c.id === product.categoryId)?.name}</span>
</div>
);
}Komponente mit Dokumenttitel
import { useGT } from 'gt-react';
import { useEffect } from 'react';
function ProductPage() {
const t = useGT();
useEffect(() => {
document.title = t('Produktkatalog – Finden Sie, was Sie brauchen');
// Update meta description
const metaDescription = document.querySelector('meta[name="description"]');
if (metaDescription) {
metaDescription.setAttribute('content', t('Stöbern Sie in unserer umfangreichen Auswahl an hochwertigen Produkten'));
}
}, [t]);
return (
<div>
<h1>{t('Empfohlene Produkte')}</h1>
<p>{t('Entdecken Sie unsere neuesten und beliebtesten Artikel')}</p>
</div>
);
}Häufige Probleme
Dynamische Inhalte zur Laufzeit
Strings müssen zur Build-Zeit bekannt sein – dynamische Inhalte können nicht übersetzt werden:
// ❌ Dynamischer Inhalt funktioniert nicht
function MyComponent() {
const [userMessage, setUserMessage] = useState('');
const t = useGT();
return <p>{t(userMessage)}</p>; // Dies schlägt fehl
}
// ✅ Vordefinierte Strings verwenden
function MyComponent() {
const [messageType, setMessageType] = useState('welcome');
const t = useGT();
const messages = {
welcome: t('Willkommen in unserer App!'),
goodbye: t('Danke für deinen Besuch!')
};
return <p>{messages[messageType]}</p>;
}Verstöße gegen Hook-Regeln
Befolgen Sie die React-Hook-Regeln bei der Verwendung von useGT:
// ❌ Hooks nicht bedingt aufrufen
function MyComponent({ showMessage }) {
if (showMessage) {
const t = useGT(); // Verstoß gegen Hook-Regeln
return <p>{t('Hello!')}</p>;
}
return null;
}
// ✅ Hooks immer auf der obersten Ebene aufrufen
function MyComponent({ showMessage }) {
const t = useGT();
if (showMessage) {
return <p>{t('Hello!')}</p>;
}
return null;
}Für wirklich dynamische Inhalte, die zur Laufzeit übersetzt werden müssen, siehe den Leitfaden für dynamische Inhalte.
Nächste Schritte
- Leitfaden für dynamische Inhalte - Übersetzungen zur Laufzeit verarbeiten
- Leitfaden für Shared Strings - Wiederverwendbare Übersetzungen organisieren
- API Reference:
Wie ist diese Anleitung?