ICU メッセージとその翻訳を比較

ソースメッセージとその翻訳を貼り付けて構造を比較し、引数・型・select 分岐・複数形の other 分岐・閉じられていない波括弧の違いを一覧で表示します。

ブラウザ内でローカルに実行
メッセージはすべてこのブラウザ内で解析されます。KivTools によってアップロード、翻訳、保存されることはありません。
ソース ICU メッセージ
翻訳 ICU メッセージ
メッセージ互換性レポート
ソース引数
翻訳引数
問題
  • 情報両方のメッセージを貼り付けて、ローカル互換性チェックを実行します。

レンダリング前に翻訳コントラクトの誤りを検出

このチェッカーは、ネストされた引数、select 分岐、plural/selectordinal フォールバック、プレースホルダーの一致など、実用的な ICU MessageFormat 構造を検証します。本番環境の i18n ライブラリでメッセージをレンダリングする代わりになるものではなく、レビューを支援するものです。

2 つの ICU メッセージを比較する手順

「ソース ICU メッセージ」に翻訳元のメッセージを、「翻訳 ICU メッセージ」にその翻訳を貼り付けます。両方の文字列を ICU MessageFormat として読み取り、構造を比較し、検出した内容を 1 行ずつ OK・CHECK・ERROR の接頭辞付きで表示します。

一覧の上の 3 つの数値は、各メッセージが宣言している引数の数と、検出された問題の数です。解析はすべてこのブラウザ内で行われ、送信はされません。読み込み後はオフラインでも動作します。

  1. 左の欄にソースメッセージ、右の欄に翻訳を貼り付けます。動作する組み合わせから始めたい場合は「サンプルを読み込む」を押します。
  2. 「メッセージをチェック」を押します。互換性があれば OK の 1 行だけが表示され、それ以外の違いは CHECK または ERROR として表示されます。
  3. レポートを読みます。ERROR は壊れた契約(翻訳で失われた引数や other 分岐、解析できないメッセージ)、CHECK は確認すべき差(余分な引数、型の違い、片側だけにある select 分岐)を示します。
  4. 「レポートをコピー」で検出結果をプレーンテキストとして取り出し、「クリア」で両方の欄を空にしてやり直せます。
  5. 最終的なメッセージは、本番環境で使用している ICU または i18n ライブラリでレンダリングして確認してください。このページが比較するのは構造で、翻訳文そのものではありません。

チェッカーが比較するもの、しないもの

比較する内容

引数は 2 つのメッセージ間で名前によって突き合わせます。ソースにだけ存在する引数は ERROR、翻訳にだけ存在する引数は CHECK になります。同じ名前の型が異なる場合(片方が plural、もう片方が number など)は、両方の型を示す CHECK が表示されます。

select 引数では分岐キーを 1 つずつ比較するため、翻訳で欠けた分岐や追加された分岐は名前付きで報告されます。plural と selectordinal の引数には other 分岐が必要で、欠落は ERROR として失った側に帰属されます。分岐の中に入れ子になったメッセージも再帰的に解析され、その中の引数も数えられます。

比較しない内容

plural と selectordinal の分岐は 1 つずつ比較しません。one/other を持つソースと other だけを持つ翻訳は互換と判定されます。また、翻訳文そのものの確認、対象言語が必要とする複数形のカテゴリ(few、many など)の検証、値を使ったメッセージのレンダリングは行いません。

したがって、緑のレポートが意味するのは「両方のメッセージが同じ引数と同じ select 分岐を宣言している」ことだけです。公開前に本番のライブラリで両方をレンダリングし、対象言語の複数形の規則も確認してください。

受け付ける構文

パーサーは {name} 引数、分岐を持つ plural・selectordinal・select 引数、plural ヘッダーの offset:N、入れ子のメッセージ、plural 分岐内の # プレースホルダー、アポストロフィによる引用(2 つで 1 つの文字としてのアポストロフィ、1 つで引用の開始と終了)を読み取ります。number、date、time などの型は名前として記録されるため、{value, number, ::percent} のような書式スケルトンも受け付けます。

読み取れないメッセージは、レポートではなく ERROR で実行を停止します。閉じられていない {、対応する { のない }、閉じられていないアポストロフィ、英字またはアンダースコアで始まらない引数名、{ … } ブロックが続かない分岐が対象です。

最近使ったツール: