日付・数値・通貨のフォーマット問題 — 見えにくいバグが潜む場所
最も根強く残るローカライズバグの一部は、翻訳されたテキストとは何の関係もありません。日付や数値や価格は、単語がすべて正しく翻訳されていても、値の周りのフォーマットが地域固有であるせいで、別の地域のプレイヤーには誤って、あるいは曖昧に見えることがあります。
こうしたバグはテストで見落とされがちです。自分の地域で作業している開発者は、フォーマット文字列が自分の地域の慣習にハードコードされていることに気づきにくいからです。バグが表面化するのは、別の誰かのために動き始めてからです。
小数点記号と桁区切り
すべての地域が小数点にピリオド、千の位区切りにカンマを使うわけではありません。逆に、小数点にカンマ、桁区切りにピリオド(またはスペース)を使う地域も多くあります。ピリオドとカンマの組み合わせをハードコードして数値を表示すると、逆の慣習を使うプレイヤーには値そのものが誤って伝わり、最悪の場合、大きな数字が小さな小数のように見えてしまいます。
// 同じ値でも、地域によって表記が異なる 1234.5 // ある慣習での表記 1234,5 // 別の慣習での表記
日付の要素の並び順
日・月・年を書く順番は世界共通ではありません。日を月より先に書く地域、月を日より先に書く地域、年を最初に書く地域があります。「03/04/2026」のような日付は、どの慣習で作られたか分からなければ本質的に曖昧で、読み手の前提次第で違う日付を意味してしまいます。
これはプレイヤーが日付として読むあらゆるもの — パッチノート、イベント終了時刻、セーブデータのタイムスタンプ、サブスクリプションの更新日 — に影響します。ハードコードされた要素順は、ある一つの慣習には正しく、それ以外の慣習には静かに間違っている、あるいは危険なほど曖昧になります。
12時間表記と24時間表記
時刻の表示も同様に分かれます。AM/PMを付けた12時間制を使う慣習もあれば、マーカーなしの24時間制を使う慣習もあります。イベントのタイマーやデイリーリセット時刻が間違った慣習で表示されると、単に見た目がおかしいだけでなく、プレイヤーが残り時間を誤って判断してしまいます。
通貨記号の位置とスペース
通貨記号が数値のどちら側に来るか、間にスペースが入るかも地域によって異なります。記号を数値の前にスペースなしで置く慣習もあれば、後ろにスペースを入れて置く慣習もあり、記号自体が通貨コードと異なる場合もあります。ハードコードした記号を数値の前に単純に連結して作ったストア価格表示は、想定した地域では正しく見えても、それ以外の地域ではわずかにおかしく、あるいは分かりにくく見えます。
対策 — 保存時ではなく表示時にフォーマットする
日付・数値・通貨のいずれにも共通する対策は同じです。生の値 — タイムスタンプ、素の数値、最小単位で表した価格 — を保存し、あらかじめフォーマット済みの文字列は保存しないこと。フォーマットは表示時にのみ行い、開発者ではなくプレイヤーの現在の地域設定に基づく、地域対応のフォーマット処理を使います。
- 日付・数値・価格を翻訳文字列にリテラルとして焼き込まない — 生の値を渡し、フォーマット処理に地域化された文字列を生成させる
- フォーマット処理の出力を、その地域における唯一の正しい表現として扱う — 自前の文字列置換で後から手を加えない
- 自分の地域とは小数点記号や日付の並び順が逆の地域を最低一つテストに含め、ハードコードされた前提を意図的に洗い出す