未翻訳の文字列をどう検出するか — シグナルと誤検知
未翻訳の文字列は、定義そのものは単純なのに、なぜかいまだに一番出荷されやすい不具合の一つです。クラッシュもせず、ファイルをざっと見ただけでは明らかに間違って見えないため見逃されます。プレイヤーがその言語のまさにその画面にたどり着いて初めて発覚します。確実に検出するために必要なのは奇抜なテクニックではなく、「何を未翻訳とみなすか」を厳密に定義し、それを毎回・全エントリに対して実行するチェックとして組み込むことです。
基本シグナル: 訳文が原文と一致している
基本のチェックは単純です。同じキーの訳文と原文を比較し、完全一致していたらフラグを立てます。あるキーの日本語訳が原文の英語とほぼ一字一句同じなら、まず翻訳されていないと見て間違いありません。この一つの比較だけで実際の不具合の大部分を捕捉でき、コストも低いので、ビルドをチェックするたびに全ファイルの全エントリに実行できます。
知っておくべき誤検知パターン
単純な「原文と一致」チェックは、意図的に一致させている正しいケースまで拾ってしまいます。これらをすべてエラー扱いにすると、チェック自体が無視されるようになるので、明示的に挙げておく価値があります。
- 固有名詞 — キャラクター名やブランド名、世界観上の名前など、言語を跨いで同じであるべきもの
- 短い肯定語や略語で、多くの言語でほぼ同じ表記になるもの(「OK」「HP」「Wi-Fi」など)
- 翻訳対象を含まない、純粋な数字・通貨記号・コード
- スタイルやブランド上の理由で意図的に原文言語のまま残されている用語
空欄のターゲットは別物として扱う
空のターゲット文字列は「原文と一致」チェックには引っかかりません。空文字列は非空の原文と一致することがないからです。しかしこれはむしろより深刻な不具合と言えます。テキストがあるべき場所に本当に何も表示されない結果になることが多く、間違った言語であっても読める文字が出るケース(=原文フォールバック)とは違うからです。空欄・空白のみのターゲットは、原文一致チェックの副産物としてではなく、独立したルールとしてチェックすべきです。
フォールバックの漏れ: ファイル内 vs 実行時
未翻訳の文字列が現れる場所には2種類あることを区別する価値があります。1つ目はローカライズファイルそのものの中です。エントリ自体は存在するが、その中身が原文のままになっている場合で、翻訳し忘れたか、あるいはビルド工程が安全策として欠落分に原文をコピーしたことが原因です。2つ目は実行時です。ターゲットファイルにそもそもそのエントリが存在せず、ゲーム側のフォールバックロジックがプレイヤーの目の前でリアルタイムに原文言語の文字列を代わりに表示します。
プレイヤーから見ればどちらも同じに見えますが、原因も直し方も異なる別のバグです。ローカライズファイルだけを読むチェックは、欠落キーがそもそもファイルに一度も入らなかった場合の実行時フォールバックを見つけられません。このケースは実質「未翻訳文字列」の姿をした「キー欠落」バグなので、1ファイル内の文字列内容を比較するだけでなく、言語間でキーの集合そのものを比較する必要があります。
目視より「エントリ単位のステータス管理」が優れる理由
翻訳済みファイルをざっと見て英語っぽいものを探すやり方は、小さいファイルではそこそこ通用しても、大きくなると破綻します。集中力は続きませんし、微妙にずれている文字列(3バージョン前に訳されたもので、現在の原文とは厳密には一致していないが、見た目上明らかに未翻訳とも違う)は目視では目立ちません。翻訳済み・未翻訳・要レビュー・古いといったエントリ単位のステータスを現在の原文と機械的に照合する仕組みは、目視では決して到達できない規模までスケールし、「何かおかしい気がする」という感覚ではなく、人が実際に対応できるリストを生み出します。
新規に追加された原文は「証明されるまで未翻訳」
新しく追加された原文文字列に対する最も安全なデフォルトは、誰かが「全言語ファイルから抜けている」と気づくのを待つのではなく、追加された瞬間から未翻訳として扱うことです。実務的には、原文ファイルにキーが追加された瞬間、そのキーはすべてのターゲット言語で未対応項目として表示され、実際に翻訳が入力されるまでその状態が続くべきです。まだ何もフラグが立っていないという理由だけでチェックを黙って通過させてはいけません。「新規」と「未翻訳」をデフォルトで同じ状態として扱うことが、原文ファイルの成長に翻訳がひそかに追いつけなくなる事態を防ぎます。