国際化
サポートされるロケール
メインフロントエンドには static/locales/ 配下に次の 8 ファイルだけがあります。
| コード | ファイル |
|---|---|
zh-CN | zh-CN.json |
zh-TW | zh-TW.json |
en | en.json |
ja | ja.json |
ko | ko.json |
ru | ru.json |
es | es.json |
pt | pt.json |
変更では 8 ファイルすべてを同時に更新してください。これらは i18next のドットパスで参照するネスト JSON であり、フラットなキー/値ファイルではありません。
ランタイムと言語選択
static/i18n-i18next.js はローカルの i18next ライブラリを読み込み、アセットバージョン付きで /static/locales/.json を取得します。フォールバックロケールは zh-CN です。
初期言語は次の順で決まります。
GET /api/config/steam_languageが返すバックエンドのuiLanguage強制指定- URL の
?ui_lang=または?lang= - 同じエンドポイントが返す正規化済み Steam 言語
localStorage.i18nextLngnavigator.languagezh-CN
言語変更時は i18nextLng を保存し、文書言語と翻訳済み DOM を更新して localechange を送出します。
マークアップとスクリプト API
対象に対応する属性を使います。
<span data-i18n="settings.title"></span>
<input data-i18n-placeholder="chat.textInputPlaceholder">
<button data-i18n-title="common.close" data-i18n-aria="common.close"></button>
<img data-i18n-alt="avatar.previewAlt" alt="">data-i18n-params には JSON の補間パラメーターを入れます。旧マークアップ向けの data-i18n-options も引き続き対応します。ボタンにアイコンなどの構造がある場合、翻訳テキストは子 span に置いてください。
クラシックスクリプトは window.t(key, params) を呼び出せます。ローダーは window.i18n、window.changeLanguage、window.updatePageTexts、window.updateLive2DDynamicTexts、window.translateStatusMessage も公開します。
通常の翻訳は textContent で設定されます。対応する <br> または <img> を含む翻訳だけがサニタイズ済み HTML 経路を使い、任意の翻訳 HTML は許可されません。
フロントエンド境界
- React チャットは
frontend/react-neko-chat/src/i18n.tsからホストのwindow.tを使い、英語コピーを最終フォールバックにします。新しい UI テキストにはメイン locale キーも追加してください。 - Vue プラグインマネージャーは
frontend/plugin-manager/src/i18n/locales/に別の TypeScript locale バンドルを持ちます。こちらも 8 言語を揃えますが、メインページの JSON キーは自動共有されません。 - バックエンドの prompt と実行時メッセージには別の翻訳構造があります。メイン UI の locale 変更だけではサーバーテキストは翻訳されません。
レビューチェックリスト
ユーザー向けテキストを変更するときは、次を確認します。
- 8 個すべての
static/locales/*.jsonに同じネストキーを追加または更新する - 適切な
data-i18n-*属性またはwindow.t()を使う - すべての言語で補間名を維持する
- リロード後だけでなく、実行中の言語切り替え後も確認する
- React または Vue の locale ソース変更後は対応する成果物を再ビルドする
- 全 locale が解析でき、リーフキー集合が同じことを検証する
