ICUメッセージでのシンプルな変数置換

ICU MessageFormatで名前付きプレースホルダーを使用したシンプルな引数置換の仕組みを理解します。変数の命名規則と欠損値の処理のベストプラクティス。

Fundamentals

詳細な説明

シンプルな変数置換

ICU MessageFormatの最も基本的な機能はシンプルな変数置換です。波括弧内に変数名を配置すると、ランタイムが提供された値に置き換えます。

構文

Hello, {firstName} {lastName}!
Welcome to {appName}.
Your order #{orderId} has been confirmed.

変数命名のベストプラクティス

ICU変数名は波括弧内に表示される識別子です。一貫した命名規則に従うことで、翻訳ファイルの保守が容易になります:

  • camelCaseを使用: {firstName}{itemCount}{userName}
  • 説明的であること: コンテキストが重要な場合、{name}より{recipientName}を推奨
  • 言語中立な名前を維持: 翻訳者が英語の変数名を理解する必要がないよう、{numberOfThings}ではなく{count}を使用
  • 変数を文書化: 翻訳管理システムで、各変数にコンテキストを提供(例:「userName: ログインユーザーの表示名」)

内部の動作

ICUフォーマッターがHello, {name}!を値{ name: "Alice" }で処理する場合:

  1. パーサーがメッセージをセグメントに分割:text("Hello, ")、argument("name")、text("!")
  2. フォーマッターがセグメントを反復処理
  3. 各argument型セグメントで、提供された値オブジェクトから値を参照
  4. textセグメントはそのまま通過
  5. 最終文字列が組み立てられる:"Hello, Alice!"

欠損変数の処理

パターンで参照されているがvaluesオブジェクトで提供されていない変数がある場合、ほとんどのICU実装は以下のいずれかを行います:

  • プレースホルダーをそのまま残す:Hello, {name}!
  • ランタイムエラーをスロー
  • 空文字列で置換

最も安全なアプローチは、常にすべての必要な変数を提供し、ビルドプロセス中にソースメッセージに対して翻訳ファイルを検証することです。

複数の変数

1つのICUメッセージに任意の数の変数を含めることができます:

{senderName} sent you a message about "{subject}" at {timestamp}.

メッセージ内の変数の順序は、valuesオブジェクト内の順序と一致する必要はありません。これは翻訳にとって重要です -- 異なる言語では自然な文構造に合わせてこれらの変数を並べ替えます。

ユースケース

ユーザー名、商品名、IDなどの動的な値をローカライズされたメッセージに渡す方法を理解する必要がある、最初の翻訳UI文字列を実装するフロントエンド開発者。

試してみる — ICU Message Format Tester

フルツールを開く