0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

個人開発のWebゲームを9言語対応にした話——静的プリレンダリングと「インデックス揃え」の翻訳テーブル

0
Posted at

少し前に、ブラウザで遊べる人生シミュレーションゲーム 「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だけに絞る」「配列はインデックスで揃える」という地味なルールでした。

ゲーム自体は登録不要で、データはブラウザ内にのみ保存されます。日本語版はこちらです:

他の言語への展開や、翻訳まわりで工夫していることがあれば、コメントでぜひ教えてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?