Skip to content

国際化

サポートされるロケール

メインフロントエンドには static/locales/ 配下に次の 8 ファイルだけがあります。

コードファイル
zh-CNzh-CN.json
zh-TWzh-TW.json
enen.json
jaja.json
koko.json
ruru.json
eses.json
ptpt.json

変更では 8 ファイルすべてを同時に更新してください。これらは i18next のドットパスで参照するネスト JSON であり、フラットなキー/値ファイルではありません。

ランタイムと言語選択

static/i18n-i18next.js はローカルの i18next ライブラリを読み込み、アセットバージョン付きで /static/locales/.json を取得します。フォールバックロケールは zh-CN です。

初期言語は次の順で決まります。

  1. GET /api/config/steam_language が返すバックエンドの uiLanguage 強制指定
  2. URL の ?ui_lang= または ?lang=
  3. 同じエンドポイントが返す正規化済み Steam 言語
  4. localStorage.i18nextLng
  5. navigator.language
  6. zh-CN

言語変更時は i18nextLng を保存し、文書言語と翻訳済み DOM を更新して localechange を送出します。

マークアップとスクリプト API

対象に対応する属性を使います。

html
<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.i18nwindow.changeLanguagewindow.updatePageTextswindow.updateLive2DDynamicTextswindow.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 変更だけではサーバーテキストは翻訳されません。

レビューチェックリスト

ユーザー向けテキストを変更するときは、次を確認します。

  1. 8 個すべての static/locales/*.json に同じネストキーを追加または更新する
  2. 適切な data-i18n-* 属性または window.t() を使う
  3. すべての言語で補間名を維持する
  4. リロード後だけでなく、実行中の言語切り替え後も確認する
  5. React または Vue の locale ソース変更後は対応する成果物を再ビルドする
  6. 全 locale が解析でき、リーフキー集合が同じことを検証する