# OpenMW Japanese Fork

公式 OpenMW 0.51.0 を土台にした日本語フォークの改変構成です。コード上の印は `// [openmw-ja-port-*]` です。追加モジュールとデータファイルの一覧は `scripts/japort_manifest.toml` にあります。

## 構成

```mermaid
flowchart LR
    subgraph upstreamFiles [Upstream files]
        bookpage[bookpage.cpp]
        list[components/widgets/list.cpp]
        savegame[savegamedialog.cpp]
        wait[waitdialog.cpp]
        journalView[journalviewmodel.cpp]
        journalBooks[journalbooks.cpp]
        journalWindow[journalwindow.cpp]
        widgets[widgets.cpp]
        spellicons[spellicons.cpp]
        messagebox[messagebox.cpp]
        windowMgr[windowmanagerimp.cpp]
        launcher[launcher/settingspage.cpp]
    end

    subgraph jpModules [JP modules]
        localehelperja
        dateformatja
        fontscalepolicyja
        bookpagekinsokuja
        effectstringja
        listfontpolicyja
        systemlocaleja
    end

    subgraph dataLayer [Data layer]
        l10n[l10n/*/ja.yaml]
        launcherTs[files/lang/launcher_ja.ts]
        wizardTs[files/lang/wizard_ja.ts]
        layout[files/data/mygui/*.layout]
        settingsCfg[files/settings-default.cfg]
    end

    upstreamFiles -->|hook| jpModules
    jpModules -->|reads| dataLayer
```

1. **Data layer** — UI 文言、Qt 翻訳、layout、既定設定、補助 TSV。
2. **JP modules** — `*ja.{hpp,cpp}` に置いた日本語固有処理。
3. **Upstream hooks** — 上流ファイル側は `// [openmw-ja-port-hook] BEGIN ... END` で囲んだ数行の委譲のみ。

## マーカー

```cpp
// [openmw-ja-port-hook] BEGIN: <短い目的>
... 1〜数行のフック ...
// [openmw-ja-port-hook] END
```

```cpp
// [openmw-ja-port-data] <理由>
mDefault = ja_friendly_value;
```

```cpp
// [openmw-ja-port-module] このファイル全体が JP 専用
```

## JP モジュール

| モジュール | 役割 | フック先 |
| --- | --- | --- |
| `apps/openmw/mwgui/localehelperja` | `MWGui::JaLocale::isPreferred()` | `effectstringja.cpp`, `journalbooks.cpp`, `journalwindow.cpp` |
| `apps/openmw/mwgui/dateformatja` | 日付・セーブ日時の日本語表記 | `savegamedialog.cpp`, `waitdialog.cpp`, `journalviewmodel.cpp` |
| `apps/openmw/mwgui/fontscalepolicyja` | Book / Journal / Dialogue のフォントスケール。JournalBooks の `ScalingLayer`（基準 600x520）実倍率で補正する | `bookpage.cpp`, `formatting.cpp` |
| `apps/openmw/mwgui/bookpagekinsokuja` | 行頭禁則（BookTypesetter） | `bookpage.cpp` |
| `apps/openmw/mwgui/effectstringja` | 魔法効果説明の日本語語順 | `widgets.cpp`, `spellicons.cpp` |
| `components/widgets/listfontpolicyja` | `MW_QuestLink` のフォント高さ | `components/widgets/list.cpp` |
| `apps/openmw/mwgui/journalindex` | ジャーナル五十音インデックス | `journalbooks.cpp`, `journalwindow.cpp` |
| `components/debug/systemlocaleja` | OS UI 言語が日本語かの判定（`L10nManager` 初期化前） | `debugging.cpp`, `settings/{settings,parser}.cpp`, `crashcatcher/*.cpp` |
| `components/settings/settingsmigrationja` | 廃止した JP 固有設定キーを user `settings.cfg` から除去 | 起動時の設定読み込み |

## データファイル

| パス | 内容 |
| --- | --- |
| `files/data/l10n/*/ja.yaml` | UI 文字列 |
| `files/lang/launcher_ja.ts` / `components_ja.ts` | ランチャーと共有 Qt 部品 |
| `files/lang/wizard_ja.ts` | 設定ウィザード（ビルド時に `wizard_ja.qm`） |
| `files/data/mygui/openmw_messagebox.layout` | 字幕枠の拡幅 |
| `files/settings-default.cfg` | `book font scale` / `dialogue font scale` / `subtitle font scale` / `auto scaling factor` |
| `files/journal_japanese_yomi.tsv` / `japanese_fallback_overrides.tsv` | 日本語補助辞書 |
| `scripts/apply_mygui_patch.cmake` | MyGUI の CJK wrap と行頭禁則。`OPENMW_USE_SYSTEM_MYGUI=OFF`、`MYGUI_STATIC=ON` で静的リンク |

ゲーム本文（GMST や会話など）の翻訳は、別配布の日本語化MODに含まれます。

## 制約

- `MysticCards.ttf` に CJK 字形が無いため、日本語ロケールでは魔法書／巻物の専用フォントが使えない。
- `JournalBooks` は MyGUI `ScalingLayer` の固定 600x520 基準で拡大されるため、ジャーナル系の文字サイズは `JaFontScale` で逆補正している。
- `bookpagekinsokuja` の禁則表に無い文字は行頭に出ることがある。

## エラーダイアログ

致命的エラーは `components/debug/debugging.cpp` の `wrapApplication` から `SDL_ShowSimpleMessageBox` へ渡ります。OS の UI 言語が日本語のときだけ、タイトルと本文を日本語にします。

- 判定: `components/debug/systemlocaleja`
- 設定エラー: `components/settings/{settings,parser}.cpp`
- クラッシュ系: `components/crashcatcher/`
- ランチャー: Qt `tr()` と `files/lang/launcher_ja.ts`
- ウィザード: `files/lang/wizard_ja.ts`

起動前に OS が出す DLL 不足ダイアログと、OpenCS 固有画面は対象外です。
