Formatierung relativer Zeitangaben
Anzeige von '2 Tage zuvor' anstelle eines Zeitstempels
Problem
Eine Anwendung zeigt einen Zeitstempel wie 'Vor 2 Tagen gepostet' an. Während dies im Englischen klar ist, unterscheiden sich die Logik und Grammatik für 'vor 2 Tagen' gegenüber 'in 2 Tagen' (Vergangenheit vs. Zukunft) in verschiedenen Sprachen erheblich. Eine einfache Zeichenkettenverkettung (z.B. '2' + ' ' + 'Tage zuvor') erzeugt keine grammatikalisch korrekte Ausgabe.
Lösung
Verwenden Sie eine dedizierte Komponente wie FormattedRelativeTime aus react-intl. Diese Komponente nimmt einen numerischen Wert (z.B. -2) und eine Einheit (z.B. 'day') und formatiert diese automatisch in eine sprachspezifische, grammatikalisch korrekte Zeichenkette wie 'vor 2 Tagen', 'hace 2 días' oder 'gestern'.
Schritte
1. Erstellen einer Client-Komponente für relative Zeit
Die FormattedRelativeTime-Komponente muss innerhalb einer Client-Komponente verwendet werden.
Erstellen Sie eine neue Datei app/components/RelativeTime.tsx.
// app/components/RelativeTime.tsx
'use client';
import { FormattedRelativeTime } from 'react-intl';
type Props = {
value: number;
unit: Intl.RelativeTimeFormatUnit;
};
export default function RelativeTime({ value, unit }: Props) {
return (
<FormattedRelativeTime
value={value}
unit={unit}
numeric="auto" // "auto" erlaubt "gestern" oder "morgen"
style="long"
/>
);
}
2. Formatierungsoptionen übergeben
Die FormattedRelativeTime-Komponente akzeptiert mehrere wichtige Props:
value: Die Anzahl der Einheiten. Ein negativer Wert (z.B.-2) zeigt die Vergangenheit an ("vor 2 Tagen"), und ein positiver Wert (2) zeigt die Zukunft an ("in 2 Tagen").unit: Die Zeiteinheit, wie 'day', 'hour', 'minute' oder 'second'.numeric="auto": Dies ermöglicht der Bibliothek, Wörter wie "gestern" oder "morgen" anstelle von "vor 1 Tag" oder "in 1 Tag" zu verwenden.
3. Verwenden der Komponente auf einer Seite
Sie können diese Komponente jetzt auf jeder Seite verwenden. Sie sind dafür verantwortlich, die Zeitdifferenz zu berechnen, bevor Sie die Props übergeben.
// app/[lang]/page.tsx
import RelativeTime from '@/app/components/RelativeTime';
export default function Home() {
// You would calculate these values dynamically
const daysSinceUpdate = -2;
const hoursUntilEvent = 3;
return (
<div>
<h1>Updates</h1>
<p>
File updated: <RelativeTime value={daysSinceUpdate} unit="day" />
</p>
<p>
Event starts: <RelativeTime value={hoursUntilEvent} unit="hour" />
</p>
</div>
);
}
Ein Benutzer, der /en besucht, sieht "File updated: 2 days ago" und "Event starts: in 3 hours". Ein Benutzer, der /es besucht, sieht "File updated: hace 2 días" und "Event starts: dentro de 3 horas".