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>
  );
}
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

Wie ist diese Anleitung?