React (react-intl / FormatJS) でのICUメッセージ
react-intl(FormatJS)を使用してReactアプリケーションにICU MessageFormatを実装。FormattedMessageコンポーネント、useIntlフック、plural/selectの使い方、ベストプラクティスをカバー。
Framework Integration
詳細な説明
ReactでのICU MessageFormat使用
react-intl(FormatJSスイートの一部)は、Reactアプリケーション向けの最も人気のある国際化ライブラリです。メッセージ構文としてICU MessageFormatを使用します。
セットアップ
import { IntlProvider, FormattedMessage } from 'react-intl';
const messages = {
en: {
greeting: 'Hello, {name}!',
itemCount: '{count, plural, one {# item} other {# items}} in cart',
},
ja: {
greeting: 'こんにちは、{name}!',
itemCount: 'カートに{count, plural, other {#個の商品}}',
},
};
FormattedMessageコンポーネント
<FormattedMessage
id="greeting"
defaultMessage="Hello, {name}!"
values={{ name: userName }}
/>
useIntlフック
プログラマティックなフォーマット(ツールチップ、aria-labelsなど):
import { useIntl } from 'react-intl';
function MyComponent() {
const intl = useIntl();
const label = intl.formatMessage(
{ id: 'itemCount' },
{ count: items.length }
);
return <span aria-label={label}>...</span>;
}
React要素によるリッチテキスト
react-intlは変数値としてReact要素をサポート:
<FormattedMessage
id="tos"
defaultMessage="I agree to the <link>Terms of Service</link>"
values={{
link: (chunks) => <a href="/tos">{chunks}</a>,
}}
/>
ベストプラクティス
- 常に
defaultMessageを提供 -- 英語ソースおよびフォールバック page.section.messageKeyのようなメッセージIDを使用- メッセージをインラインではなく別のJSONファイルに抽出
- 疑似ローカリゼーションでテストして切り詰めとレイアウトの問題を検出
- 非JSXコンテキスト(タイトル、ARIAラベル)には
intl.formatMessageフックを使用
ユースケース
初めて国際化をセットアップするReact開発者、または文字列結合からFormatJS / react-intlエコシステムを使用したICU MessageFormatに移行する開発者。