国際化
N.E.K.O. はクライアントサイドのロケール切り替えにより 5 言語をサポートしています。
サポートされているロケール
| コード | 言語 | ファイル |
|---|---|---|
en | 英語 | static/locales/en.json |
zh-CN | 簡体字中国語 | static/locales/zh-CN.json |
zh-TW | 繁体字中国語 | static/locales/zh-TW.json |
ja | 日本語 | static/locales/ja.json |
ko | 韓国語 | static/locales/ko.json |
仕組み
- ページ読み込み時に、システムがユーザーの言語を検出します:
- まず Steam クライアントの言語を確認します(
/api/config/steam_language経由で利用可能な場合) - ブラウザの言語設定にフォールバックします
- ユーザーの上書き設定を尊重します(
/api/config/user_language)
- まず Steam クライアントの言語を確認します(
- 対応するロケール JSON ファイルを読み込みます
- data 属性または直接的な JS 置換を使用して DOM 内のテキストコンテンツを置き換えます
ロケールファイルの形式
ロケールファイルはドット記法のキーを持つフラットな JSON オブジェクトです:
json
{
"nav.home": "Home",
"nav.settings": "Settings",
"chat.placeholder": "Type a message...",
"chat.send": "Send"
}i18n マークアップパターン
HTML: data-i18n 属性
html
<!-- 要素テキスト -->
<span data-i18n="chat.send">発送</span>
<button data-i18n="common.ok">確定</button>
<!-- プレースホルダー -->
<input placeholder="請輸入" data-i18n-placeholder="chat.inputPlaceholder">
<!-- title 属性 -->
<button title="関閉" data-i18n-title="common.close">X</button>
<!-- alt 属性 -->
<img alt="対話" src="chat.png" data-i18n-alt="chat.title">JavaScript: window.t() とフォールバック
適切なフォールバックのために常に中国語のフォールバックを提供してください:
javascript
// 表示テキスト
showStatusToast(window.t ? window.t('common.connectionSuccess') : '連接成功', 2000);
// エラーメッセージ
showMessage(window.t ? window.t('common.saveFailed') : '保存失敗', 'error');
// パラメータ付き
showMessage(window.t ? window.t('files.deleted', { count }) : `削除了 ${count} 個文件`);i18n 化すべきでないもの
javascript
// ✅ スキップ: コンソールデバッグメッセージ
console.log('連接成功');
// ✅ スキップ: 内部ロジックの検出
if (status.includes('已離開')) { ... }
// ✅ スキップ: データキー(キャラクターフィールド名)
const name = characterData['档案名'];
// ✅ スキップ: すでにラップ済み
showMessage(window.t ? window.t('key') : 'fallback');モジュールとファイルのマッピング
未翻訳の文字列をチェックする際は、以下のモジュールグループを使用してください:
| モジュール | HTML ファイル | JS ファイル |
|---|---|---|
main | index.html | app.js |
live2d | live2d*.html | live2d*.js |
voice | voice*.html | voice*.js, tts*.js |
steam | steam*.html | steam*.js |
settings | settings*.html, config*.html | settings*.js, config*.js |
chat | memory_browser.html, chara_manager.html | memory_browser.js, chara_manager.js |
HTML + アイコンの競合
i18next が textContent 経由でテキストを更新すると、要素内の <img> タグが破壊されます。翻訳に HTML アイコンが含まれる場合、完全な HTML をロケール JSON に含めることで、システムが代わりに innerHTML を使用するようになります。開発者ノート を参照してください。
新しい言語の追加
static/locales/に新しいファイルを作成します(例:fr.json)en.jsonの構造をコピーし、すべての値を翻訳します- フロントエンドの言語セレクターにロケールオプションを追加します
utils/language_utils.pyを更新して新しいロケールコードを認識させます
バックエンド翻訳
バックエンドも TranslationService(utils/translation_service.py)経由で翻訳をサポートしています:
- プライマリ:
googletransライブラリ - フォールバック:
translatepyライブラリ - 最終フォールバック: LLM ベースの翻訳
これは、ユーザーの言語がキャラクターの言語と異なる場合にセッションマネージャー内の translate_if_needed() で使用されます。
