ローカライズ
Wienerはマスターデータのローカライズを、アプリケーションコードを変更せずに透過的に扱えます。
全体フロー
Excel / YAML(localizeフラグ付きフィールドを収集)
↓
翻訳用CSV生成(自動更新)
A列(Key): {ClassName}.{FieldKey}.{UniqueID}
B列(Source): 原文文字列
C列以降: 言語別翻訳(翻訳者が入力)
↓
コンバート(整合性チェック → バイナリ生成)
↓
ランタイムAPI(透過アクセス)
wm.Item[0].Name // 現在の言語を自動返却
設定手順
1. settingsファイルにlocalizationを追加
CSVファイルを使う場合:
localization:
enable: true
input:
path: "localize/translations.csv" # カレントディレクトリからの相対パス
入力と出力を分ける場合(例:スプレッドシートから読み込んでCSVに書き出す):
localization:
enable: true
input:
path: "https://docs.google.com/spreadsheets/d/xxxxxxxx/edit#gid=0"
sheet: "translations"
output:
path: "localize/translations.csv"
2. YAMLフィールドに一意のキーを作成する
ローカライズCSVのキー生成に使用するため、各行を一意に識別できるフィールドを用意します。
fields:
- key: Id
name: id
type: Int
3. YAMLヘッダーにlocalizationを追加
ローカライズ対象のYAMLに localization.id_key を設定します。id_key には各行を一意に識別するフィールドのkeyを指定してください。
header:
name: Item
localization:
id_key: Id
4. YAMLフィールドにlocalize: Trueを追加
ローカライズしたい String 型フィールドに localize: True を付けます。
fields:
- key: Id
name: id
type: Int
- key: Name
name: name
type: String
localize: True
翻訳用CSVフォーマット
翻訳用CSVはコンバート時に自動生成・自動更新されます。
翻訳者はC列以降に翻訳を入力するだけです。
| Key | Source | ja | en | zh |
|---|---|---|---|---|
| Item.Name.1001 | Sword | 剣 | Sword | 剑 |
| Item.Name.1002 | Shield | 盾 | Shield | 盾 |
| Quest.Title.1001 | The Lost Sword | 失われた剣 | The Lost Sword | 失落之剑 |
- Key:
{クラス名}.{フィールドkey}.{UniqueID}形式(UniqueIDはid_keyで指定したフィールドの値) - Source: Excelから読み取った原文(変更された場合は自動更新)
- 言語列: ヘッダー行の列名が言語コードになります。未翻訳のセルは
----で管理されます
CSVの自動管理
| 状況 | 動作 |
|---|---|
| CSVが存在しない | 新規作成。言語列はなし(翻訳者が列を追加) |
| 新しいキーが追加された | CSVに行を追加。翻訳列は ---- |
| 原文が変更された | 翻訳列を ---- にリセット |
| キーが削除された | CSVから行を削除 |
| 原文・キーに変化なし | CSVを変更しない |
原文変更・削除が発生した場合は差分データが出力されます。
| 出力先 | 差分の書き込み先 |
|---|---|
| CSV ファイル | {csv名}_diff_{timestamp}.csv(同ディレクトリ) |
| スプレッドシート | 同一スプレッドシートの diff_{timestamp} シート(新規作成) |
言語切り替えAPI
// 利用可能な言語コードを取得(CSV列ヘッダー名)
string[] codes = wm.GetLanguageCodes();
// 言語の切り替え
wm.SetLanguage("ja"); // 以降のアクセスで日本語を返す
wm.SetLanguage("en");
// デフォルト(原文)に戻す
wm.ResetLanguage();
// 言語切り替えイベント(UIの更新などに使用)
// langCode は null の場合 ResetLanguage が呼ばれた
wm.OnChangeLanguage += (langCode) => RefreshUI();
言語コードはCSVヘッダー行のC列以降の文字列です(BCP 47推奨:"ja", "en", "zh-Hans" など)。
設計上の特徴
- ランタイムのコスト: 文字列キーのDictionary探索なし。行番号→配列参照のみで取得
- 整合性チェック: 原文が変更されるとB列が更新され、翻訳列は自動クリア(再翻訳が必要とわかる)
- 未翻訳セルの扱い:
----セルは開発モードでは原文にフォールバック、本番モード(設定ファイルのdevelopment: false)ではtarget_languagesに含まれる言語についてエラー(未定義時は全言語対象) - 差分追跡: 更新・削除されたキーは差分CSVに記録される
開発中の運用
enable: true の状態でコンバートを実行するたびに翻訳CSVが更新されるため、マスターデータ変更のたびにCSVのコミットが発生してしまいます。
開発中は enable: false(または設定を省略)にしておくことを推奨します。
| タイミング | 推奨設定 |
|---|---|
| 通常の開発・データ更新 | enable: false |
| 翻訳作業の開始前(CSVを最新化して翻訳者に渡す) | enable: true |
| ローカライズ対応バイナリの確認・検証 | enable: true |
| 本番コンバート | enable: true |
注意事項
fields.localize: Trueを指定できる型はStringのみheader.localization.id_keyで指定したフィールドは自動的に重複チェック(unique)が有効になるid_keyのフィールドはmanual_only: Trueでないことが必要
関連
- バージョン管理 — 言語別バイナリのバージョン管理
- 設定ファイル —
localization設定の詳細 - YAML Header定義 —
localization.id_keyの設定 - Fields定義 —
localizeフラグ