Übersicht
Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →
Willkommen in der Dokumentation von React Intl! Hier finden Sie alle Dokumentationen zu React Intl. Sie können gerne einen Pull Request öffnen und zur Verbesserung der Dokumentation beitragen.
Laufzeitanforderungen
Wir unterstützen IE11 und die beiden neuesten Versionen von Edge, Chrome, Firefox & Safari.
React Intl benötigt folgende Intl-APIs:
-
Intl.NumberFormat: Verfügbar ab IE11+
-
Intl.DateTimeFormat: Verfügbar ab IE11+
-
Intl.PluralRules: Kann mittels dieses Pakets polygefillt werden.
-
Intl.RelativeTimeFormat: Kann mit diesem Paket polygefillt werden.
-
(Optional) Intl.DisplayNames: Erforderlich bei Verwendung von
formatDisplayNameoderFormattedDisplayName. Kann mittels dieses Pakets polygefillt werden.
Falls Sie ältere Browser unterstützen müssen, empfehlen wir folgende Schritte:
-
Für Browser ohne
Intl-Unterstützung: Integrieren Sie dieses Polyfill in Ihren Build. -
Polyfillen Sie
Intl.NumberFormatmit@formatjs/intl-numberformat. -
Polyfillen Sie
Intl.DateTimeFormatmit@formatjs/intl-datetimeformat -
Für Browser ohne
Intl.PluralRules(z.B. IE11 & Safari 12-): Integrieren Sie dieses Polyfill in Ihren Build. -
Für Browser ohne Intl.RelativeTimeFormat (z.B. IE11, Edge, Safari 12-): Integrieren Sie dieses Polyfill in Ihren Build zusammen mit individuellen CLDR-Daten für jede unterstützte Locale.
-
Falls Sie
Intl.DisplayNamesbenötigen: Integrieren Sie dieses Polyfill in Ihren Build zusammen mit individuellen CLDR-Daten für jede unterstützte Locale.
Node.js
full-icu
Ab Node.js 13.0.0 ist full-icu standardmäßig unterstützt.
Bei Verwendung von React Intl in älteren Node.js-Versionen muss Ihre node-Binärdatei:
- Mit
full-icukompiliert werden, gemäß diesen Anleitungen
ODER
- Das
full-icu-npm-Paket verwenden
Falls Ihre node-Version eine der oben genannten Intl-APIs nicht unterstützt, müssen Sie diese entsprechend polyfillen.
React Native
Bei Verwendung von react-intl in React Native muss Ihre Laufzeitumgebung über integrierte Intl-Unterstützung verfügen (ähnlich der JSC International-Variante). Weitere Details finden Sie in diesen Issues:
React Native unter iOS
Falls Sie die Intl-Variante von JSC nicht verwenden können (z.B. unter iOS), befolgen Sie die Anweisungen unter Laufzeitanforderungen, um diese APIs entsprechend zu polyfillen.
Das react-intl-Paket
Installieren Sie das react-intl-npm-Paket via npm:
- npm
- yarn
npm i -S react-intl
yarn add react-intl
Das react-intl-npm-Paket stellt folgende Module bereit (Links von unpkg):
-
CommonJS: Ungebündelte Abhängigkeiten,
"main"inpackage.json, Warnungen in Dev. -
ES6: Ungebündelte Abhängigkeiten,
"module"inpackage.json, Warnungen in Dev.
Modul-Bundler
Wir haben React Intl für Modul-Bundler wie Browserify, Webpack oder Rollup optimiert, die React Intl für den Browser bündeln können:
-
Das
"browser"-Feld inpackage.jsonist so konfiguriert, dass beim Bündeln nur grundlegende englische Locale-Daten eingeschlossen werden. So werden beim Einsatz des"main"-Moduls in Node alle Locale-Daten geladen, im Browser-Build jedoch ignoriert. -
Eine ES6-Version von React Intl wird als
"jsnext:main"und"module"inpackage.jsonbereitgestellt und kann mit Rollup verwendet werden.
Entwicklungswarnungen sind in process.env.NODE_ENV !== 'production' eingebettet. Dies ermöglicht es, NODE_ENV beim Bundling und Minifizieren anzugeben, um diese Codeblöcke zu entfernen.
Das React Intl-Modul
Egal, ob Sie die ES6-, CommonJS- oder UMD-Version von React Intl verwenden, alle bieten dieselben benannten Exporte:
Bei Verwendung der UMD-Version von React Intl ohne ein Modulsystem wird erwartet, dass react als globale Variable React existiert. Die oben genannten benannten Exporte werden dann in der globalen Variable ReactIntl platziert.
Erstellen eines I18n-Kontextes
Nachdem React Intl und seine Lokalisierungsdaten geladen sind, kann ein I18n-Kontext für Ihre React-Anwendung erstellt werden.
React Intl verwendet das Provider-Pattern, um einen i18n-Kontext auf eine Komponenten-Hierarchie zu begrenzen. Dadurch können Konfigurationen wie das aktuelle Locale und übersetzte Zeichenfolgen/Nachrichten an der Wurzel der Komponenten-Hierarchie bereitgestellt und für die <Formatted*>-Komponenten verfügbar gemacht werden. Dies entspricht dem Konzept, das Flux-Frameworks wie Redux verwenden, um Zugriff auf einen Store innerhalb einer Komponenten-Hierarchie zu ermöglichen.
Alle Apps, die React Intl verwenden, müssen die <IntlProvider>-Komponente verwenden.
Die gängigste Verwendung besteht darin, Ihre Stamm-React-Komponente mit <IntlProvider> zu umschließen und sie mit dem aktuellen Gebietsschema des Benutzers und den entsprechenden übersetzten Zeichenketten/Nachrichten zu konfigurieren:
ReactDOM.render(
<IntlProvider locale={usersLocale} messages={translationsForUsersLocale}>
<App />
</IntlProvider>,
document.getElementById('container')
)
Siehe: Die <IntlProvider>-Dokumentation für weitere Details.
Daten formatieren
React Intl bietet zwei Möglichkeiten, Daten zu formatieren: über React-Komponenten und seine API. Die Komponenten bieten eine idiomatische React-Art, Internationalisierung in eine React-App zu integrieren, und die <Formatted*>-Komponenten haben Vorteile gegenüber der direkten Verwendung der imperativen API. Die API sollte verwendet werden, wenn Ihre React-Komponente Daten in einen String-Wert formatieren muss, für den ein React-Element nicht geeignet ist; z.B. für ein title- oder aria-Attribut oder für Nebeneffekte in componentDidMount.
Auf die imperative API von React Intl wird über injectIntl zugegriffen, eine Higher-Order Component (HOC)-Factory. Sie umschließt die übergebene React-Komponente mit einer weiteren React-Komponente, die die imperative Formatierungs-API über die props an die umschlossene Komponente weitergibt. (Dies ähnelt dem Connect-to-Stores-Muster, das in vielen Flux-Implementierungen zu finden ist.)
Hier ein Beispiel, das <IntlProvider>, <Formatted*>-Komponenten und die imperative API verwendet, um einen I18n-Kontext einzurichten und Daten zu formatieren:
import React from 'react';
import ReactDOM from 'react-dom';
import {IntlProvider, FormattedRelative, useIntl} from 'react-intl';
const MS_IN_DAY = 1e3 * 3600 * 24
const PostDate = ({date}) => {
const intl = useIntl()
return (
<span title={intl.formatDate(date)}>
<FormattedRelativeTime value={(Date.now() - date)/MS_IN_DAY} unit="day"/>
</span>
)
});
const App = ({post}) => (
<div>
<h1>{post.title}</h1>
<p>
<PostDate date={post.date} />
</p>
<div>{post.body}</div>
</div>
);
ReactDOM.render(
<IntlProvider locale={navigator.language}>
<App
post={{
title: 'Hello, World!',
date: new Date(1459913574887),
body: 'Amazing content.',
}}
/>
</IntlProvider>,
document.getElementById('container')
);
Angenommen, navigator.language ist "en-us":
<div>
<h1>Hello, World!</h1>
<p><span title="4/5/2016">yesterday</span></p>
<div>Amazing content.</div>
</div>
Siehe: Die API-Dokumentation und die Komponenten-Dokumentation für weitere Details.
ESM-Build
react-intl und seine zugrundeliegenden Bibliotheken (@formatjs/icu-messageformat-parser, intl-messageformat, @formatjs/intl-relativetimeformat) exportieren ESM-Artefakte. Das bedeutet, dass Sie Ihre Build-Toolchain konfigurieren sollten, um diese Bibliotheken zu transpilieren.
Jest
Fügen Sie transformIgnorePatterns hinzu, um diese Bibliotheken immer einzubeziehen, z.B:
{
transformIgnorePatterns: [
'/node_modules/(?!intl-messageformat|@formatjs/icu-messageformat-parser).+\\.js$',
],
}
webpack
Wenn Sie babel-loader oder ts-loader verwenden, haben Sie folgende Optionen:
- Fügen Sie diese Bibliotheken in
includeein:
{
include: [
path.join(__dirname, 'node_modules/react-intl'),
path.join(__dirname, 'node_modules/intl-messageformat'),
path.join(__dirname, 'node_modules/@formatjs/icu-messageformat-parser'),
]
}
ODER
- Fügen Sie diese Bibliotheken in
excludeein:
exclude: /node_modules\/(?!react-intl|intl-messageformat|@formatjs\/icu-messageformat-parser)/,
Kernkonzepte
-
Formatierer (Datum, Zahl, Nachricht, Relativzeit)
-
Provider und Injector
-
API und Komponenten
-
Nachrichtendeskriptor
-
Nachrichtensyntax
-
Standardnachrichten für die Extraktion definieren
-
Benutzerdefinierte benannte Formate
Beispielanwendungen
Dieses Git-Repo enthält mehrere ausführbare Beispiel-Apps. Diese eignen sich hervorragend, um React Intls Kernkonzepte in vereinfachten Anwendungen zu sehen.
API-Referenz
React Intl bietet mehrere API-Ebenen. Bei der Nutzung interagieren Sie mit Intl-Standards, der React Intl-API und React-Komponenten:
TypeScript-Nutzung
react-intl ist in TypeScript geschrieben und bietet daher erstklassige TS-Unterstützung.
Für die Nutzung von react-intl in TypeScript stellen Sie sicher, dass Ihre compilerOptions-lib-Konfiguration ["esnext.intl", "es2017.intl", "es2018.intl"] enthält.
Typisierung von Nachrichten-IDs und Locales
Standardmäßig ist der Typ der id-Prop von <FormattedMessage> und formatMessage string. Sie können jedoch einen restriktiveren Typ festlegen, um Autovervollständigung und Fehlerprüfung zu erhalten. Überschreiben Sie dazu den folgenden globalen Namespace mit dem Union-Typ aller Ihrer Nachrichten-IDs:
declare global {
namespace FormatjsIntl {
interface Message {
ids: keyof typeof messages
}
}
}
Wobei messages das Objekt ist, das Sie normalerweise an <IntlProvider> übergeben würden, z.B.:
const messages = {
greeting: 'Hello',
planet: 'World',
// ...
}
Sie können auch den folgenden Global überschreiben, um einen benutzerdefinierten Typ für Locale zu verwenden:
declare global {
namespace FormatjsIntl {
interface IntlConfig {
locale: 'en' | 'fr'
}
}
}
Typisierung benutzerdefinierter Formate
Standardmäßig ist der Typ für die format-Prop von <FormattedDate>, <FormattedDateParts>, <FormattedTime> und <FormattedTimeParts> ein string. Das Gleiche gilt für die format-Konfiguration von formatDate, formatDateParts, formatTime und formatTimeParts. Sie können jedoch einen restriktiveren Typ festlegen, um Autovervollständigung und Fehlerprüfung zu erhalten. Überschreiben Sie dazu den folgenden globalen Namespace mit dem Union-Typ aller Ihrer benutzerdefinierten Formatnamen. Fügen Sie dazu folgenden Code an einer Stelle in Ihrem Code ein:
declare global {
namespace FormatjsIntl {
interface Formats {
date: keyof (typeof customFormats)['date']
time: keyof (typeof customFormats)['time']
}
}
}
Dabei ist customFormats das Objekt, das Sie normalerweise an <IntlProvider> übergeben würden, und es könnte etwa so aussehen:
const customFormats = {
date: {
short: {
month: 'numeric',
day: 'numeric',
year: '2-digit',
},
},
time: {
short: {
hour: 'numeric',
minute: 'numeric',
},
},
}
Fortgeschrittene Nutzung
Unsere Fortgeschrittene Nutzung bietet weitere Leitfäden für Produktionssetups in Umgebungen, wo Leistung entscheidend ist.
Unterstützte Tools
Nachrichtenextraktion
Wir haben @formatjs/cli entwickelt, das beim Extrahieren von Nachrichten aus Dateien hilft. Es nutzt intern babel-plugin-formatjs und kann Nachrichten extrahieren, wenn Sie eine der folgenden Methoden verwenden:
import {defineMessages} from 'react-intl'
defineMessages({
foo: {
id: 'foo',
defaultMessage: 'foo',
description: 'bar',
},
})
import {FormattedMessage} from 'react-intl'
;<FormattedMessage id="foo" defaultMessage="foo" description="bar" />
function Comp(props) {
const {intl} = props
return intl.formatMessage({
// The whole `intl.formatMessage` is required so we can extract
id: 'foo',
defaultMessage: 'foo',
description: 'bar',
})
}
ESLint-Plugin
Wir haben auch eslint-plugin-formatjs entwickelt, das die Einhaltung spezifischer Regeln für Ihre Nachrichten erzwingt, falls Ihr Übersetzungsanbieter Einschränkungen hat.