少し前に、ブラウザで遊べる人生シミュレーションゲーム 「80億分の1」 を公開しました。生まれる国が実際の出生数にもとづいてランダムに決まり、0歳から一生を生ききるタイプのゲームです。
今回はゲームそのものより、9言語対応のやり方について書きます。同じような多言語化を考えている個人開発の方の参考になれば。
なぜ多言語化したか
このゲームのテーマは「自分が世界のどこに生まれるか」です。プレイヤー自身の母語で遊べないと、テーマの半分が伝わりません。なので最初から、英語・簡体字・繁体字・韓国語・日本語・ベトナム語・フランス語・タイ語・スペイン語の9言語を前提に作りました。
構成:言語ごとに静的プリレンダリング
やっていることはシンプルで、言語ごとに完成したHTMLを事前に生成して配信しています(ホスティングはCloudflare Workers)。
- 言語ごとにURLを分ける(
/ja/、/ko/など) - canonical と hreflang を言語ごとに正しく出し分ける
- JSが動く前のHTMLに、その言語の本文がそのまま入っている
SPA的にクライアント側で言語を切り替える方式だと、検索エンジンにもSNSのプレビューにも中身が届きにくいので、この形にしました。結果として9ページともGoogleにインデックスされています。
工夫1:翻訳テーブルは「インデックス揃え」
ゲーム内には「今日のテーマ」のような単語リスト(47語)や、人生イベントの文面など、配列データがたくさんあります。
ここでキー名ベースの翻訳管理をすると、言語ごとに要素が増減した瞬間に静かにズレます。なので配列系のデータは 全言語で同じインデックスに同じ意味の要素を置く ルールに統一しました。言語ファイル同士を突き合わせるチェックも、インデックスのズレとして機械的に検出できます。
工夫2:数字は翻訳しない
このゲームの核は、172の国と地域の実統計です(国連「世界人口展望2024」、世界銀行、WHOなど)。平均寿命、乳児死亡率、一人当たりGDPといった数値は全言語で共通のデータとして持ち、翻訳対象はUI文言とイベント文だけ に分離しました。
翻訳対象を絞ると、言語追加のたびにデータ側を触らなくて済みますし、「言語によって数字が違う」という事故も起きません。
日本語版で気をつけたこと
- 「平均寿命」のような統計用語は、公的統計で使われる表記に寄せました
- 死亡・暴力・自殺といった重い出来事も実統計どおり発生するゲームなので、場面の描写は避け、日本語版では相談先(いのちの電話)も併記しています
- 固有名詞や地名は、機械翻訳の直訳ではなく日本語で一般的な表記を優先しました
とはいえ、個人開発の翻訳なので不自然な表現はまだ残っていると思います。見つけた方は教えていただけると助かります。
おわりに
多言語化で一番効いたのは、凝った仕組みよりも「言語ごとに完成HTMLを用意する」「翻訳対象をUIだけに絞る」「配列はインデックスで揃える」という地味なルールでした。
ゲーム自体は登録不要で、データはブラウザ内にのみ保存されます。日本語版はこちらです:
他の言語への展開や、翻訳まわりで工夫していることがあれば、コメントでぜひ教えてください。