export default { // ログイン login: { title: 'Hermes Web UI', description: 'アクセストークンを入力して続行してください。サーバーの起動ログで確認できます。', placeholder: 'アクセストークン', submit: 'ログイン', tokenRequired: 'アクセストークンを入力してください', invalidToken: '無効なトークンです', connectionFailed: 'サーバーに接続できません', passwordLogin: 'パスワード', tokenLogin: 'トークン', usernamePlaceholder: 'ユーザー名', passwordPlaceholder: 'パスワード', credentialsRequired: 'ユーザー名とパスワードを入力してください', invalidCredentials: 'ユーザー名またはパスワードが正しくありません', tooManyAttempts: 'ログイン試行回数が多すぎます。しばらくしてからお試しください', passwordMismatch: 'パスワードが一致しません', passwordTooShort: 'パスワードは6文字以上必要です', setupSuccess: 'パスワードログインが設定されました', passwordChanged: 'パスワードが変更されました', passwordRemoved: 'パスワードログインが削除されました', setupPassword: 'パスワードログインを設定', changePassword: 'パスワードを変更', changeUsername: 'ユーザー名を変更', removePasswordLogin: '削除', username: 'ユーザー名', currentPassword: '現在のパスワード', newPassword: '新しいパスワード', confirmPassword: 'パスワード確認', newUsername: '新しいユーザー名', usernameChanged: 'ユーザー名が変更されました', usernameTooShort: 'ユーザー名は2文字以上必要です', setupDescription: 'ユーザー名とパスワードを設定して、簡単にログインできるようにします。アクセストークンは引き続きバックアップとして使用できます。', removeConfirm: 'パスワードログインを削除しますか?アクセストークンを使用してログインする必要があります。', passwordLoginNotConfigured: 'パスワードログイン未設定', passwordLoginConfigured: 'パスワードログイン有効({username})', }, // 共通 common: { loading: '読み込み中...', cancel: 'キャンセル', retry: '再試行', delete: '削除', edit: '編集', save: '保存', saved: '保存しました', update: '更新', create: '作成', saveFailed: '保存に失敗しました', deleteFailed: '削除に失敗しました', ok: 'OK', copied: 'コピーしました', copy: 'コピー', noData: 'データがありません', fetch: '取得', add: '追加', enable: '有効化', disable: '無効化', configured: '設定済み', notConfigured: '未設定', confirm: '確認', expand: '展開', collapse: '折りたたむ', }, // サイドバー sidebar: { chat: 'チャット', search: '検索', apiRelay: 'APIリレー', history: '履歴', jobs: 'ジョブ', models: 'モデル', profiles: 'プロファイル', plugins: 'プラグイン', skills: 'スキル', memory: 'メモリ', logs: 'ログ', usage: '使用量', skillsUsage: 'スキル使用状況', channels: 'チャンネル', terminal: 'ターミナル', files: 'ファイル', groupChat: 'グループチャット', groupConversation: '会話', settings: '設定', connected: '接続済み', disconnected: '未接続', updateTip: 'ターミナルで "hermes-web-ui update" を実行して更新してください', updateVersion: 'v{version} にアップグレード', reloadClientVersion: 'v{version} に再読み込み', updating: '更新中...', updateSuccess: '更新が完了しました。しばらくしてからページを再読み込みしてください。長時間起動しない場合は手動で起動してください。', updateFailed: '更新に失敗しました', logout: 'ログアウト', nodeVersionWarning: 'Node.js v{version} が検出されました。バージョン23以降にアップグレードしてください。', changelog: '更新履歴', noChangelog: '更新履歴はありません', }, // ドロワー drawer: { terminal: 'ターミナル', files: 'ワークスペース', }, // チャット chat: { contextRemaining: '残り', contextClickToEdit: 'クリックしてコンテキスト長を編集', contextEditTitle: 'コンテキスト長を編集', contextEditDesc: '現在のモデルのコンテキスト長制限を設定(トークン数)', contextEditPlaceholder: 'コンテキスト長を入力', contextEditHint: '一般的な値:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: '保存', contextEditCancel: 'キャンセル', contextEditInvalid: '有効なコンテキスト長を入力してください', contextEditSuccess: 'コンテキスト長を更新しました', contextEditFailed: '更新に失敗しました', emptyState: 'Hermes Agent と会話を開始しましょう', inputPlaceholder: 'メッセージを入力... (Enter で送信、Shift+Enter で改行)', slashCommandArgs: { message: '<メッセージ>', title: '<タイトル>', text: '<テキスト>', }, slashCommands: { usage: '現在のセッション使用量を計算', status: 'セッション状態とキューを表示', abort: '実行中の Bridge を停止', queue: '実行中の処理の後ろにメッセージをキュー追加', clear: '現在の表示をクリア', clearHistory: 'このセッションの保存済みメッセージ履歴を削除', title: 'このセッション名を変更', compress: 'アイドル時にコンテキスト圧縮を実行', steer: '実行中の Bridge に誘導テキストを送信', destroy: 'このセッションの Bridge Agent を解放', }, attachFiles: 'ファイルを添付', messageQueue: 'メッセージキュー', removeQueuedMessage: 'キューのメッセージを削除', stop: '停止', send: '送信', contextUsed: 'コンテキスト使用量:', sessions: 'セッション', webUiSessions: 'セッション', sessionScopeHint: 'チャットには Web UI/API Server セッションのみ表示されます。CLI、Telegram、Discord、Cron などのチャンネルセッションは履歴で読み取り専用として表示されます。', openHistory: '履歴を開く', hermesHistory: 'Hermes 履歴', historyScopeHint: 'ソース別にグループ化された Hermes 履歴セッションを読み取り専用で表示します。', noSessions: 'セッションがありません', newChat: '新しいチャット', deleteSession: 'このセッションを削除しますか?', toggleBatchMode: '一括選択', selectAll: 'すべて選択', confirmBatchDelete: '{count}件のセッションを削除しますか?', batchDeleteSuccess: '{count}件のセッションを削除しました', batchDeletePartial: '{failed}件の削除に失敗しました', batchDeleteFailed: '一括削除に失敗しました', sessionDeleted: 'セッションを削除しました', rename: '名前変更', pin: 'ピン留め', unpin: 'ピン留め解除', pinned: 'ピン留め', chatMode: 'チャット', liveMode: 'ライブ', liveSessions: 'ライブセッション', recentBadge: '最近', linkedSessions: '{count} 件の関連', noVisibleMessages: '人間向けに表示できるメッセージはありません。', monitorRoleUser: 'ユーザー', monitorRoleAssistant: 'アシスタント', copySessionId: 'セッション ID をコピー', export: 'エクスポート', exportFull: 'フルエクスポート (JSON)', exportCompressed: '圧縮エクスポート (TXT)', exportCompressing: 'コンテキストを圧縮中、お待ちください...', exportSuccess: 'セッションをエクスポートしました', exportFailed: 'エクスポートに失敗しました', renamed: '名前を変更しました', renameFailed: '名前の変更に失敗しました', renameSession: 'セッション名の変更', sessionNotFound: 'セッションが見つかりません', enterNewTitle: '新しいタイトルを入力', other: 'その他', runFailed: '実行に失敗しました', error: 'エラー', tool: 'ツール', arguments: '引数', result: '結果', truncated: '... (省略)', executionDuration: 'Execution time', thinkingLabel: '思考過程', thinkingInProgress: '思考中…', thinkingShow: '思考過程を表示', thinkingHide: '思考過程を隠す', thinkingDuration: '観測 {duration}', thinkingChars: '{count} 文字', copyBubble: 'メッセージをコピー', copiedBubble: 'コピーしました', copyFailed: 'コピーに失敗しました', playSpeech: '音声を読み上げ', pauseSpeech: '一時停止', resumeSpeech: '再開', stopSpeech: '停止', speechNotSupported: 'このブラウザは音声読み上げをサポートしていません', }, // スケジュールジョブ jobs: { title: 'スケジュールジョブ', createJob: 'ジョブを作成', editJob: 'ジョブを編集', noJobs: 'スケジュールジョブがありません。作成して始めましょう。', name: '名前', namePlaceholder: 'ジョブ名', schedule: 'スケジュール (Cron 式)', schedulePlaceholder: '例: 0 9 * * *', quickPresets: 'クイックプリセット', selectPreset: 'プリセットを選択...', presetEveryMinute: '毎分', presetEvery5Min: '5分ごと', presetEveryHour: '毎時', presetEveryDay: '毎日 00:00', presetEveryDay9: '毎日 09:00', presetEveryMonday: '毎週月曜 09:00', presetEveryMonth: '毎月1日 09:00', prompt: 'プロンプト', promptPlaceholder: '実行するプロンプト', deliverTarget: '配信先', origin: '配信元', local: 'ローカル', repeatCount: '繰り返し回数(任意)', modelPlaceholder: 'Default model', repeatPlaceholder: '空白の場合は無制限', jobCreated: 'ジョブを作成しました', jobUpdated: 'ジョブを更新しました', nameRequired: '名前は必須です', scheduleRequired: 'スケジュールは必須です', loadFailed: 'ジョブの読み込みに失敗しました', jobPaused: 'ジョブを一時停止しました', jobResumed: 'ジョブを再開しました', jobTriggered: 'ジョブをトリガーしました', modelUpdated: 'Model updated', jobDeleted: 'ジョブを削除しました', status: { running: '実行中', paused: '一時停止', disabled: '無効', scheduled: 'スケジュール済み', }, info: { model: 'Model', schedule: 'Schedule', lastRun: '前回実行', nextRun: '次回実行', deliver: '配信', repeat: '繰り返し', }, action: { pause: '一時停止', pauseJob: 'ジョブを一時停止', resume: '再開', resumeJob: 'ジョブを再開', runNow: '今すぐ実行', triggerImmediately: 'すぐにトリガー', }, runHistory: { title: '実行履歴', runs: '件', noRuns: '実行履歴がありません。', }, }, // スキル skills: { title: 'スキル', searchPlaceholder: 'スキルを検索...', noMatch: '検索に一致するスキルがありません', noSkills: 'スキルがありません', backTo: '戻る', attachedFiles: '添付ファイル', loadFailed: 'スキルの読み込みに失敗しました', fileLoadFailed: 'ファイルの読み込みに失敗しました', modified: 'ユーザー変更あり', archived: 'アーカイブ済み', pinned: 'ピン留め', pin: 'スキルをピン留め', unpin: 'ピン留めを解除', pinFailed: 'ピン留め状態の変更に失敗しました', toggleFailed: 'スキルの切り替えに失敗しました', source: { builtin: '組み込み', hub: 'Hub', local: 'ローカル', }, }, // プラグイン plugins: { title: 'プラグイン', refresh: '更新', notice: '検出可能な Hermes プラグイン manifest の読み取り専用インベントリです。検出メタデータはプラグインコードを読み込まずに取得します。v1 の管理操作は CLI のままで、変更は新しい Hermes セッションで有効になります。', loadFailed: 'プラグインの読み込みに失敗しました', commandCopied: 'コマンドをコピーしました', searchPlaceholder: 'key、名前、説明、パスを検索...', source: 'ソース', kind: '種類', statusTitle: 'ステータス', configStatus: 'config: {status}', notAvailable: 'n/a', copyCommand: 'コマンドをコピー', managedElsewhere: '他で管理されています', noMatch: '現在のフィルターに一致するプラグインはありません', enabled: '有効', disabled: '無効', summary: { total: '合計', active: '有効 / 自動', inactive: '非アクティブ', disabled: '無効', providerManaged: 'Provider 管理', }, status: { enabled: '有効', 'auto-active': '自動有効', inactive: '非アクティブ', disabled: '無効', 'provider-managed': 'Provider 管理', }, statusLabel: { enabled: '設定で有効', 'auto-active': '自動有効', inactive: '非アクティブ', disabled: '無効', 'provider-managed': 'Provider 管理', }, configStatuses: { enabled: '有効', disabled: '無効', 'not-enabled': '未有効', auto: '自動', 'provider-managed': 'Provider 管理', }, table: { plugin: 'プラグイン', status: 'ステータス', source: 'ソース', kind: '種類', capabilities: '機能', path: 'パス / entrypoint', cli: 'CLI', }, capabilities: { tools: '{count} tools', hooks: '{count} hooks', env: '{count} env', }, metadata: { agentRoot: 'Agent root', python: 'Python', scanCwd: 'Scan cwd', projectPlugins: 'プロジェクトプラグイン', }, }, // メモリ memory: { title: 'メモリ', refresh: '更新', loadFailed: 'メモリの読み込みに失敗しました', myNotes: 'メモ', noNotes: 'メモはまだありません。', notesPlaceholder: 'メモを入力...', userProfile: 'ユーザープロファイル', noProfile: 'プロファイルはまだありません。', profilePlaceholder: 'プロファイルを入力...', soul: 'ソウル', noSoul: 'ソウル設定はまだありません。', soulPlaceholder: 'ソウル設定を入力...', }, // モデル models: { title: 'モデル', addProvider: 'プロバイダーを追加', providerType: 'プロバイダー種別', preset: 'プリセット', custom: 'カスタム', selectProvider: 'プロバイダーを選択', chooseProvider: 'プロバイダーを選択...', name: '名前', autoGeneratedName: 'ベース URL から自動生成', baseUrl: 'ベース URL', region: 'リージョン', regionIntl: 'インターナショナル', regionCn: '中国本土', baseUrlPlaceholder: '例: https://api.example.com/v1', apiKey: 'API キー', apiKeyPlaceholder: 'sk-...', defaultModel: 'デフォルトモデル', selectOrInput: 'モデルを選択または入力...', selectModel: 'モデルを選択...', providerAdded: 'プロバイダーを追加しました', providerDeleted: 'プロバイダーを削除しました', deleteProvider: 'プロバイダーを削除', deleteConfirm: '「{name}」を削除しますか?', codexLoginTitle: 'OpenAI Codex ログイン', codexWaiting: '認証ページで以下のコードを入力してログインしてください:', codexCopyCode: 'コードをコピーしました', codexOpenLink: '認証ページを開く', codexApproved: 'ログイン成功', codexExpired: '認証の有効期限が切れました。もう一度お試しください。', nousLoginTitle: 'Nous Portal ログイン', nousWaiting: '認証ページでこのコードを入力してください:', nousCopyCode: 'コードをコピーしました', nousOpenLink: '認証ページを開く', nousApproved: 'ログイン成功', nousDenied: '認証が拒否されました', nousExpired: '認証の有効期限が切れました', copilotLoginTitle: 'GitHub Copilot ログイン', copilotWaiting: 'GitHub を開き、以下のデバイスコードを入力して認証してください。承認後、ウィンドウは自動的に閉じます。', copilotCopyCode: 'コードをコピーしました', copilotOpenLink: 'GitHub 認証ページを開く', copilotApproved: 'ログインに成功しました!', copilotDenied: '認証が拒否されました。', copilotExpired: '認証リンクの有効期限が切れました。もう一度お試しください。', copilotAddDetectedTitle: 'GitHub Copilot を検出しました', copilotAddDetected: 'このマシンで GitHub Copilot OAuth トークンを検出しました。「追加」をクリックして Hermes で Copilot を有効化します。', copilotAddSourceEnv: 'ソース: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)', copilotAddSourceGhCli: 'ソース: gh CLI (gh auth token)', copilotAddSourceAppsJson: 'ソース: VS Code Copilot 拡張機能 (apps.json)', copilotDeleteHintEnv: 'この操作で ~/.hermes/.env の COPILOT_GITHUB_TOKEN を消去します。他のツールには影響しません。', copilotDeleteHintGhCli: 'Copilot は Hermes 上で非表示になります。gh CLI のログインには影響しません — `gh auth status` は引き続きログイン状態を表示します。', copilotDeleteHintAppsJson: 'Copilot は Hermes 上で非表示になります。VS Code Copilot 拡張機能のログインには影響しません。', customBadge: 'カスタム', previewBadge: 'プレビュー', disabledBadge: '利用不可', disabledTooltip: "このモデルは現在のアカウントでは利用できません。", customModelPlaceholder: '未掲載のモデル ID', customModelHint: 'プロバイダーは対応しているが API が返さないモデル用です。表示名の変更ではありません。Enter で読み込み。', noProviders: 'プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。', clearVisibleModels: '選択をクリア', builtIn: '組み込み', customType: 'カスタム', provider: 'プロバイダー', contextLength: 'コンテキスト長', contextLengthPlaceholder: '例: 200000(任意)', local: 'ローカル ({host})', selectProviderRequired: 'プロバイダーを選択してください', baseUrlRequired: 'ベース URL は必須です', apiKeyRequired: 'API キーは必須です', modelRequired: 'デフォルトモデルは必須です', enterBaseUrl: 'ベース URL を先に入力してください', unexpectedFormat: '予期しないレスポンス形式です', foundModels: '{count} 個のモデルが見つかりました', fetchFailed: 'モデルの取得に失敗しました', }, // プロファイル profiles: { title: 'プロファイル', create: 'プロファイルを作成', import: 'インポート', export: 'エクスポート', rename: '名前変更', delete: '削除', switchTo: '切り替え', switchConfirm: 'プロファイル「{name}」に切り替えるとゲートウェイが再起動されます。続行しますか?', switchSuccess: 'プロファイル「{name}」に切り替えました', switchFailed: 'プロファイルの切り替えに失敗しました。ゲートウェイの手動再起動が必要な場合があります。', createSuccess: 'プロファイル「{name}」を作成しました', createFailed: 'プロファイルの作成に失敗しました', renameSuccess: 'プロファイル名を変更しました', renameFailed: 'プロファイル名の変更に失敗しました', deleteConfirm: 'プロファイル「{name}」を削除しますか?', deleteSuccess: 'プロファイルを削除しました', deleteFailed: 'プロファイルの削除に失敗しました', exportSuccess: 'プロファイルをエクスポートしました', exportFailed: 'プロファイルのエクスポートに失敗しました', importSuccess: 'プロファイルをインポートしました', importFailed: 'プロファイルのインポートに失敗しました', importSelectFile: 'アーカイブファイルを選択', importInvalidFile: '有効なアーカイブファイルを選択してください (.tar.gz, .tgz, .gz, .zip)', name: 'プロファイル名', namePlaceholder: '英数字、ハイフンのみ', nameValidation: 'プロファイル名には小文字、数字、アンダースコア、ハイフンのみ使用できます', newName: '新しい名前', newNamePlaceholder: '新しい名前を入力', cloneFromCurrent: '現在のプロファイルから複製', cloneCleanupNotice: '複製時、独占型プラットフォーム認証情報(Weixin / Telegram / Slack など)は自動的にスキップされ、ソースプロファイルとの競合を回避します', cloneStrippedCredentials: '{count} 件の独占認証情報を削除しました:{list}', cloneDisabledPlatforms: '{count} 個のプラットフォームを無効化しました:{list}', cloneStrippedConfigCredentials: 'config.yaml から {count} 件の埋め込み認証情報を削除しました:{list}', archivePath: 'アーカイブパス', archivePathPlaceholder: 'アーカイブファイルのサーバーパス', importName: 'プロファイル名(任意)', importNamePlaceholder: '空白の場合はアーカイブ名を使用', active: 'アクティブ', model: 'モデル', gateway: 'ゲートウェイ', alias: 'エイリアス', provider: 'プロバイダー', path: 'パス', skills: 'スキル', hasEnv: '.env あり', hasSoulMd: 'soul.md あり', noProfiles: 'プロファイルがありません。作成して始めましょう。', }, // ログ logs: { title: 'ログ', all: 'すべて', searchPlaceholder: '検索...', refresh: '更新', noEntries: 'ログエントリがありません', }, // 設定 settings: { title: '設定', saved: '保存しました', saveFailed: '保存に失敗しました', tabs: { display: '表示', account: 'アカウント', agent: 'エージェント', memory: 'メモリ', session: 'セッション', privacy: 'プライバシー', apiServer: 'API サーバー', models: 'モデル', voice: '音声', }, display: { streaming: 'ストリームレスポンス', streamingHint: 'AI の返信をリアルタイムで表示', compact: 'コンパクトモード', compactHint: 'メッセージの間隔を狭める', showReasoning: '推論過程を表示', showReasoningHint: 'モデルの思考プロセスを表示', showCost: 'コストを表示', showCostHint: '返信にトークン使用量を表示', inlineDiffs: 'インライン差分', inlineDiffsHint: 'コード変更をインラインで表示', bellOnComplete: '完了通知音', bellOnCompleteHint: 'AI の応答完了時に通知音を再生', busyInputMode: '処理中入力モード', busyInputModeHint: 'AI 処理中でも入力を許可', theme: 'テーマ', themeHint: 'ライト、ダーク、またはシステム設定に従う', themeLight: 'ライト', themeDark: 'ダーク', themeSystem: 'システム', }, agent: { maxTurns: '最大ターン数', maxTurnsHint: '1回の会話の最大インタラクション回数', gatewayTimeout: 'ゲートウェイタイムアウト', gatewayTimeoutHint: 'リクエストタイムアウト(秒)', restartDrainTimeout: '再起動ドレインタイムアウト', restartDrainTimeoutHint: '再起動前のドレインタイムアウト(秒)', toolEnforcement: 'ツール実行ポリシー', toolEnforcementHint: 'ツール呼び出しの実行モードを制御', auto: '自動', always: '常に', never: 'しない', }, memory: { enabled: 'メモリを有効化', enabledHint: 'AI に会話コンテキストを記憶させる', userProfile: 'ユーザープロファイル', userProfileHint: 'AI にユーザーの設定を記憶させる', charLimit: 'メモリ文字数上限', charLimitHint: 'MEMORY.md の最大文字数', userCharLimit: 'ユーザープロファイル文字数上限', userCharLimitHint: 'USER.md の最大文字数', }, session: { mode: 'リセットモード', modeHint: 'セッションリセットのトリガー条件', modeBoth: 'アイドル + スケジュール', modeIdle: 'アイドルのみ', modeHourly: 'スケジュールのみ', idleMinutes: 'アイドルタイムアウト', idleMinutesHint: '自動リセットまでの待機時間(分)', atHour: 'スケジュールリセット時刻', humanOnly: '人間のセッションのみ表示', humanOnlyHint: 'サブエージェントやセッション監視ノイズを既定で隠します', liveMonitorHumanOnly: 'ライブモニター: 人間のセッションのみ表示', liveMonitorHumanOnlyHint: 'ライブモニターでサブエージェントやセッション監視ノイズを既定で隠します', atHourHint: '毎日指定時刻にセッションをリセット', requireAuth: 'セッション認証', requireAuthHint: 'セッション操作に認証を必要とする', }, privacy: { redactPii: '個人情報のマスキング', redactPiiHint: '機密情報を自動検出して隠す(パスワード、キーなど)', }, apiServer: { enable: '有効化', enableHint: 'API サーバーを有効にする', host: 'ホスト', hostHint: 'リッスンアドレス', port: 'ポート', portHint: 'リッスンポート', key: 'キー', keyHint: 'API アクセスキー', cors: 'CORS 許可元', corsHint: '許可するクロスオリジン', }, voice: { ttsProvider: 'TTS プロバイダー', ttsProviderHint: 'メッセージ読み上げに使用する音声合成エンジンを選択', providerWebSpeech: 'WebSpeech API(ブラウザ)', providerOpenai: 'OpenAI TTS', providerCustom: 'カスタムエンドポイント(OpenAI 互換)', providerEdge: 'Edge TTS(無料、API Key 不要)', // WebSpeech webspeechVoice: '音声', webspeechVoiceHint: 'ブラウザまたは OS から音声を選択', webspeechVoicePlaceholder: '自動(デフォルト音声)', // OpenAI openaiKey: 'API キー', openaiKeyHint: 'TTS アクセス権のある OpenAI API キー', openaiUrl: 'API ベース URL', openaiUrlHint: '例: https://api.openai.com/v1/audio/speech', openaiModel: 'モデル', openaiModelHint: 'tts-1(高速)/ tts-1-hd(高音質)', openaiVoice: '音色', openaiVoiceHint: '合成に使用する音色', // Custom endpoint customHint: 'OpenAI 互換の TTS API を使用可能 — GPT-SoVITS、CosyVoice などに対応', customUrl: 'API URL', customUrlHint: 'TTS サービスのベース URL', customUrlPlaceholder: 'ローカルアダプターで設定したアドレス(例:http://127.0.0.1:9880)', customApiKey: 'API キー(オプション)', customApiKeyHint: '一部のカスタムエンドポイントは認証が必要', customApiKeyPlaceholder: '不要な場合は空欄', // Edge TTS edgeHint: 'Microsoft Edge TTS を搭載(node-edge-tts)。', edgeUrl: 'アダプター URL', edgeUrlHint: 'Edge TTS アダプターのアドレス(例:http://127.0.0.1:9882)', edgeUrlPlaceholder: 'http://127.0.0.1:9882', edgeVoice: '音色', edgeVoiceHint: '音声合成に使用する音色を選択', edgeRate: '速度', edgeRateHint: '音声の速度を調整(0.5~2.0倍)', edgePitch: 'ピッチ', edgePitchHint: '音声のピッチを調整(-20~+20 Hz)', // Test testTitle: '音声テスト', testText: 'テストテキスト', testTextPlaceholder: 'テストするテキストを入力...', testTextDefault: 'こんにちは、これは音声テストです。', testButton: 'テスト', testButtonPlaying: '再生中...', testFailed: 'テスト失敗:{error}', }, lockedIps: { title: 'ロック済みIP管理', count: '{count}件ロック中', empty: 'ロック済みIPなし', unlock: 'ロック解除', unlockAll: '全て解除', unlockAllConfirm: '全てのロック済みIPを解除しますか?', unlocked: 'IPをロック解除しました', allUnlocked: '{count}件のIPをロック解除しました', }, }, // プラットフォームチャンネル設定 platform: { requireMention: "メンションが必要", requireMentionGroup: "グループで応答するには {'@'}メンションが必要", requireMentionChannel: "チャンネルで応答するには {'@'}メンションが必要", requireMentionRoom: "ルームで応答するには {'@'}メンションが必要", reactions: 'リアクション', reactionsHint: 'メッセージに絵文字でリアクションする', freeResponseChats: '自由応答チャット', freeResponseChatsHint: "{'@'}メンションなしで応答するチャット ID(カンマ区切り)", freeResponseChannels: '自由応答チャンネル', freeResponseChannelsHint: "{'@'}メンションなしで応答するチャンネル ID(カンマ区切り)", freeResponseRooms: '自由応答ルーム', freeResponseRoomsHint: "{'@'}メンションなしで応答するルーム ID(カンマ区切り)", mentionPatterns: 'カスタムメンションパターン', mentionPatternsHint: '追加のトリガーパターン', autoThread: '自動スレッド', autoThreadHint: "{'@'}メンション後に自動で返信スレッドを作成", autoThreadHintRoom: 'ルームで自動的に返信スレッドを作成', dmMentionThreads: 'DM メンションスレッド', dmMentionThreadsHint: 'DM 内のメンションにスレッド返信を使用', allowBots: 'ボットメッセージを許可', allowBotsHint: '他のボットからのメッセージに応答する', allowedChannels: '許可チャンネル', allowedChannelsHint: 'ホワイトリストのチャンネル ID(カンマ区切り)', ignoredChannels: '除外チャンネル', ignoredChannelsHint: 'ボットが応答しないチャンネル ID(カンマ区切り)', noThreadChannels: 'スレッドなしチャンネル', noThreadChannelsHint: 'スレッドなしで応答するチャンネル ID(カンマ区切り)', exclusiveTokenWarning: 'このプラットフォームは排他的トークンロックを使用します。各プロファイルは他のプロファイルと競合しないように、異なる ID トークンを使用する必要があります。', botToken: 'ボットトークン', botTokenHint: '開発者ポータルから取得したボットトークン', accessToken: 'アクセストークン', accessTokenHint: 'Matrix アクセストークン', homeserver: 'Homeserver URL', homeserverHint: 'Matrix ホームサーバー URL', appId: 'App ID', appIdHint: 'Feishu App ID', appSecret: 'App Secret', appSecretHint: 'Feishu App Secret', clientId: 'Client ID', clientIdHint: 'DingTalk Client ID', clientSecret: 'Client Secret', clientSecretHint: 'DingTalk Client Secret', botId: 'Bot ID', botIdHint: 'WeCom Bot ID', wecomSecretHint: 'WeCom Bot Secret', waEnabled: 'WhatsApp を有効化', waEnabledHint: 'QR コードペアリングで WhatsApp を有効にする', weixinToken: 'Weixin トークン', weixinTokenHint: 'weixin CLI の QR ログインから取得 (hermes weixin)', accountId: 'Account ID', accountIdHint: 'Weixin アカウント ID', qrLogin: 'QR ログイン', qrRelogin: '再ログイン', qrFetching: 'QR コードを取得中...', qrScanHint: 'WeChat でスキャンしてログイン', qrScanedHint: 'スキャン済み、スマートフォンで確認してください...', }, // 言語 language: { label: '言語', zh: '中文', en: 'English', ja: '日本語', }, // ターミナル terminal: { sessions: 'セッション', newTab: '新しいターミナル', closeSession: 'このセッションを閉じますか?', sessionExited: '終了しました', processExited: 'プロセスが終了しました(コード {code})', }, // 使用統計 usage: { title: '使用統計', refresh: '更新', totalTokens: '総トークン数', inputTokens: '入力', outputTokens: '出力', totalSessions: '総セッション数', avgPerDay: '1日平均 ~{n}', estimatedCost: '推定コスト', cacheHitRate: 'キャッシュヒット率', modelBreakdown: 'モデル別内訳', dailyTrend: '日別使用量', date: '日付', tokens: 'トークン', cache: 'キャッシュ', cacheRead: 'キャッシュ読み取り', cacheWrite: 'キャッシュ書き込み', sessions: 'セッション', cost: 'コスト', noData: '使用データがありません', }, skillsUsage: { title: 'スキル使用状況', subtitle: 'Hermes セッションでのスキル読み込みと編集を追跡します', refresh: '更新', periodSelector: 'スキル使用期間', periodLabel: '{days}日', summary: '概要', totalActions: '操作数', loads: '読み込み', edits: '編集', distinctSkills: 'スキル数', topSkills: '上位', dailyTrend: '日別', periodSummary: '過去 {days} 日', skill: 'スキル', share: '割合', lastUsed: '最終', noData: 'スキル使用データはありません', loadFailed: 'スキル使用状況の読み込みに失敗しました', otherSkills: 'その他', }, // 更新履歴 changelog: { new_0_5_6_1: '音声再生機能:Web Speech API使用、手動再生ボタン、自動再生スイッチ、虹色ボーダーアニメーション、モバイル最適化', new_0_5_6_2: '堅牢なLLM JSONパーサー:Python形式対応、ストリーミングイベントからのテキスト抽出', new_0_5_6_3: 'Skills機能強化:使用統計、ソースフィルター、アーカイブ済みスキル、来歴、ピン留め切替', new_0_5_6_4: '日次使用統計の拡張:キャッシュ読み取り/書き込み分離を含む詳細なトークン内訳', new_0_5_6_5: 'セッション履歴範囲の明確化:チャットと履歴ビューの説明を改善', new_0_5_6_6: 'AnthropicスタイルのContentBlock配列形式(テキスト、画像、ファイル)を使用して添付ファイル処理を再設計', new_0_5_6_7: 'ContentBlockおよびMarkdown形式をサポートし、認証付きのフロントエンドファイルダウンロード機能を追加', new_0_5_6_8: '重複するnodemonインスタンスを削除し、SQLiteデータベースのリセットを引き起こすマルチプロセス競合を修正', new_0_5_14_1: 'Add session export with full and compressed modes (JSON or plain text)', new_0_5_14_2: 'Fix terminal PTY resource exhaustion, switch to lazy connect', new_0_5_14_3: 'Fix WSL2 health check failure caused by IPv6 dual-stack binding', new_0_5_14_4: 'Fix SQLite connection not released on shutdown causing database lock', new_0_5_14_5: 'Update FUN provider models, add builtin badge and API relay link', new_0_5_15_1: 'カンバンボードでタスクとセッションを視覚的に管理', new_0_5_15_2: '公式ランディングページとドキュメントサイトを追加', new_0_5_15_3: 'グループチャットエージェントクライアントがハードコード8648の代わりに動的ポートを使用', new_0_5_15_4: 'node-edge-tts 音声モジュールを追加', new_0_5_15_5: 'WSLデフォルトリッスンホストバインディングを修正', new_0_5_15_6: 'ウェブサイトホームページのSEOメタデータを追加', new_0_5_15_7: 'IPベースのログインブルートフォース保護を追加', new_0_5_15_8: 'MarkdownRendererのダウンロードURL二重ラップを修正', new_0_5_15_9: 'Hermes Markdownメディアレンダリングと同期リトライを修正', new_0_5_15_10: 'アップストリーム環境変数依存をリファクタリングで削除', new_0_5_15_11: 'カンバン機能が使用できない場合は、hermes-agent をアップグレードしてください', new_0_5_16_1: 'チャットストリーミングを /v1/runs から /v1/responses API に移行し、レイテンシを削減', new_0_5_16_2: '実際の API 使用量(トークン、キャッシュ、推論)を統計テーブルに保存', new_0_5_16_3: 'ウェブサイトのナビゲーションバーにQQグループのQRコードを追加', new_0_5_16_4: 'メッセージスキーマから未使用の codex_reasoning_items フィールドを削除', new_0_5_17_1: 'Windows完全対応:パス処理、プロセス管理、ターミナル、ログ解析', new_0_5_17_2: 'Gatewayプロセス管理をリファクタリング、クロスプラットフォームの起動/停止/ヘルスチェックに対応', new_0_5_17_3: 'Termuxでhermesのshebangを解析してPythonを見つけ、プラグイン検出を修正', new_0_5_17_4: '設定解析時のYAML重複キーを許容するように変更', new_0_5_17_5: '認証ロックウィンドウと開発環境のシャットダウンフローを改善', new_0_5_17_6: 'Comicテーマに中国語(ZCOOL KuaiLe)、日本語(Zen Maru Gothic)、韓国語(Gaegu)の手書きフォントを追加', new_0_5_17_7: 'Comic/ドゥードゥルテーマスタイルを追加', new_0_5_17_8: 'ライセンスをBSL-1.1に変更', new_0_5_17_9: '読み取り専用のHermesプラグインページを追加', new_0_5_17_10: '画像アップロードをBase64マルチモーダル形式に変換', new_0_5_17_11: 'カンバンボードの選択と分離を修正', new_0_5_17_12: '4プロバイダーTTS対応の音声再生設定を追加', new_0_5_17_13: 'コンテキスト圧縮のメッセージしきい値を200から150に引き下げ', new_0_5_17_14: 'Web UI自動更新の再起動ロジックを修正', new_0_5_17_15: 'opencode-zenとopencode-goの共有環境変数による設定連動を修正', new_0_5_17_16: '繁体字中国語(zh-TW)言語サポートを追加', new_0_5_17_17: 'Web UIで表示モデルを管理する機能を追加', new_0_5_17_18: 'カンバン:タスクの完全なアクションチェーン(コメント、ログ、割り当て、ディスパッチ)と能力境界を追加', new_0_5_17_19: 'プロバイダー削除時に認証エントリがクリアされない問題を修正', new_0_5_17_20: 'Codex credential-pool認証の認識を修正', new_0_5_17_21: '音声設定にEdge TTSの速度/ピッチスライダーを追加', new_0_5_17_22: '設定YAMLの重複キーが解析クラッシュを起こさないように修正', new_0_5_17_23: 'ゲートウェイポートの所有権をPIDファイルベースに変更し、プロファイル間のポート乗っ取りを防止', new_0_5_17_24: '履歴ページにCronセッションレコードを表示するように変更', new_0_5_17_25: '折りたたまれたサイドバーでの言語切替・テーマアイコンの圧縮表示を修正', new_0_5_18_1: 'Add Skills Usage monitoring page with daily trend chart and top skills statistics', new_0_5_18_2: 'Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions', new_0_5_18_3: 'Add Ollama Cloud provider preset with dynamic model catalog', new_0_5_18_4: 'Support model display name renaming (aliases)', new_0_5_18_5: 'Support model visibility management in Web UI', new_0_5_18_6: 'Enhance usage analytics dashboard', new_0_5_18_7: 'Docker single-container deployment with docker-compose and gateway startup fixes', new_0_5_18_8: 'Fix plugins page HERMES_HOME fallback warning for non-default profiles', new_0_5_18_9: 'Fix gateway stability across dev restarts and improve Windows compatibility', new_0_5_22_1: 'Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database', new_0_5_23_1: 'Add bridge-only chat slash commands with localized command suggestions', new_0_5_23_2: 'Persist command history for session replay without polluting model context, usage, or compression', new_0_5_23_3: 'Isolate gateway profile environment variables to prevent credentials leaking across profiles', new_0_5_23_4: 'Reserve the Web UI port during gateway allocation to avoid startup conflicts', new_0_5_23_5: 'Fix self-update restart handling so successful helper exits are not reported as failures', new_0_5_5_1: '🎉 労働者の日!今日はお休みです、何卒ご理解ください', new_0_5_5_2: 'Hermesセッション履歴ページを追加', new_0_5_5_3: '履歴ページはアクティブチャットに干渉せずにセッション管理', new_0_5_5_4: '履歴ページは最初のCLIセッションを自動選択', new_0_5_5_5: 'HistoryMessageListコンポーネントを追加', new_0_5_5_6: '空のメッセージとtoolNameなしのtoolメッセージをフィルタリング', new_0_5_5_7: 'localStorageセッションキャッシュを削除、バックエンドから直接取得', new_0_5_5_8: 'プロフィール切り替えを最適化', new_0_5_4_2: 'Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring', new_0_5_4_3: 'Fix cron job edit payloads with partial PATCH to support long prompt name-only edits', new_0_5_4_4: 'Fix web terminal Hermes CLI availability after Docker deployment', new_0_5_4_5: 'Add workspace dialog i18n translations for title and improve session persistence', new_0_5_4_6: 'Support code block copy feedback with user notifications', new_0_5_4_7: 'Align usage analytics with Hermes state DB schema', new_0_4_8_2: 'Fix nested markdown fence rendering truncation', new_0_4_8_3: 'Fix compressed session lineage projection and search', new_0_4_8_4: 'Optimize session list N+1 queries and fix search 500 on non-CJK input', new_0_4_8_5: 'Fix forced scroll to bottom when switching back from other tabs', new_0_4_8_6: 'Smooth session switch with loading transition overlay', new_0_4_8_7: 'Fix login token validation using Hermes session endpoint', new_0_4_8_8: 'Fix image attachments broken after page refresh (blob URL persistence)', new_0_4_8_9: 'Click image attachments to preview in fullscreen overlay', new_0_4_8_10: 'Move upload directory from temp to ~/.hermes-web-ui/upload', new_0_4_7_1: '思考/推論ブロックのリアルタイムストリーミング表示', new_0_4_7_2: 'Dockerビルド時にprepareスクリプトをスキップ', new_0_4_7_3: 'グループチャットのモバイルUX改善とUIのブラッシュアップ', new_0_4_7_4: 'コンテキスト残りトークン数をマイナスではなく0に制限', new_0_4_7_5: 'Alibaba Coding Planビルトインプロバイダーを追加(.env base_urlオーバーライド対応)', new_0_4_7_6: '起動時にリモートプロファイルをスキップしてハングを防止', new_0_4_7_7: '黙って飲み込まれた実行エラーを検出して表示', new_0_4_7_8: 'プロバイダー対応のコンテキスト長さルックアップ', new_0_4_7_9: '切り替え時にconfig.modelをリセットしCLIカスタムプロバイダーを解決', new_0_4_7_10: 'ビルトインプロバイダー削除時に.envからbase_url_envをクリア', new_0_4_7_11: 'グループチャットルームのサイドバー背景をセッションリストに合わせる', new_0_4_5_1: 'Add group chat with multi-agent rooms, mention routing, and typing status recovery', new_0_4_5_2: 'Rewrite model-context config to use YAML with context_length setting', new_0_4_5_3: 'Add gpt-5.5 to OpenAI Codex model list', new_0_4_5_4: 'Replace jobs proxy with local controller and optimize model loading', new_0_4_5_5: 'Add i18n support for custom model feature in ModelSelector', new_0_4_5_6: 'Fix sidebar i18n missing key warnings', new_0_4_5_7: 'Clear all localStorage on logout', new_0_4_5_8: 'Add periodic log rotation to prevent unbounded log growth', new_0_4_2_1: 'トークン使用量追跡と動的コンテキスト長を追加', new_0_4_2_2: 'セッション検索モーダルを追加', new_0_4_2_3: 'Socket.IOとSQLiteによるグループチャットシステムを復元', new_0_4_2_4: 'チャットページにピン留めセッションとライブモニターを追加', new_0_4_2_5: '組み込みプロバイダー検出とモデルマッチングを修正', }, // ファイル files: { title: 'ファイル', tree: 'ディレクトリツリー', list: 'ファイル一覧', breadcrumbRoot: 'ホーム', newFile: '新規ファイル', newFolder: '新規フォルダ', upload: 'アップロード', refresh: '更新', open: '開く', edit: '編集', preview: 'プレビュー', download: 'ダウンロード', copyPath: 'パスをコピー', rename: '名前の変更', delete: '削除', name: '名前', size: 'サイズ', modified: '更新日時', actions: '操作', emptyDir: '空のディレクトリ', loading: '読み込み中...', confirmDelete: '「{name}」を削除してもよろしいですか?', confirmDeleteDir: 'ディレクトリ「{name}」とそのすべての内容を削除してもよろしいですか?', deleteFailed: '削除に失敗しました', deleted: '削除しました', renameTo: '名前を変更', newFileName: 'ファイル名', newFolderName: 'フォルダ名', created: '作成しました', createFailed: '作成に失敗しました', renamed: '名前を変更しました', renameFailed: '名前の変更に失敗しました', uploadSuccess: '{count} 個のファイルをアップロードしました', uploadFailed: 'アップロードに失敗しました', saveFailed: '保存に失敗しました', saved: '保存しました', unsavedChanges: '未保存の変更があります。破棄しますか?', pathCopied: 'パスをコピーしました', fileTooLarge: 'ファイルが大きすぎます(最大10MB)', permissionDenied: '保護されたファイルは変更できません', notFound: 'ファイルまたはディレクトリが見つかりません', backendError: 'ファイル操作に失敗しました', dragDropHint: 'ここにファイルをドラッグしてアップロード', closeEditor: 'エディタを閉じる', closePreview: '閉じる', saveFile: '保存', }, // グループチャット groupChat: { title: 'グループチャット', createRoom: 'ルームを作成', joinByCode: 'コードで参加', roomName: 'ルーム名', roomNamePlaceholder: 'ルーム名を入力', inviteCode: '招待コード', autoGenerate: '自動生成', noRooms: 'ルームがありません', selectOrCreate: 'ルームを選択または作成してチャットを開始', agents: 'エージェント', addAgent: 'エージェントを追加', selectProfile: 'プロファイルを選択', agentAdded: 'エージェントが追加されました', agentAlreadyInRoom: 'このエージェントは既にルームにいます', noAgents: 'このルームにエージェントはいません', members: 'メンバー', roomCreated: 'ルームが作成されました', roomDeleted: 'ルームを削除しました', deleteRoomConfirm: 'このルームを削除しますか?', you: 'あなた', joined: 'ルームに参加しました', joinFailed: 'ルームへの参加に失敗しました', inputPlaceholder: 'メッセージを入力... (Enterで送信)', enterCode: '招待コードを入力', yourName: 'あなたの名前', yourNamePlaceholder: '表示名を入力', yourDescription: '自己紹介(任意)', yourDescriptionPlaceholder: '自分について教えてください...', agentName: 'エージェント名', agentNamePlaceholder: 'カスタム名(空欄ならプロファイル名)', agentDesc: 'エージェントの説明', agentDescPlaceholder: 'このエージェントの役割を説明...', agentReplying: 'が返信中...', agentCompressing: 'がコンテキストを圧縮中...', compressionSettings: '圧縮設定', triggerTokens: '圧縮トリガートークン数', triggerTokensDesc: 'このトークン数を超えるとコンテキスト圧縮がトリガーされます', maxHistoryTokens: '最大履歴トークン数', maxHistoryTokensDesc: '圧縮後のLLM送信最大トークン数', tailMessageCount: '末尾メッセージ数', tailMessageCountDesc: '圧縮後にそのまま保持する最近のメッセージ数', compressionConfig: '圧縮設定', compressNow: '今すぐ圧縮', compressingInProgress: '圧縮中です、お待ちください', compressionSaved: '圧縮設定を保存しました', }, // ダウンロード download: { downloading: 'ダウンロード中...', downloadFailed: 'ダウンロードに失敗しました', fileNotFound: 'ファイルが見つからないか削除されています', fileTooLarge: 'ファイルが大きすぎます(制限超過)', backendError: 'ファイルの読み取りに失敗しました。リモート環境が利用できない可能性があります', backendTimeout: 'ファイルの読み取りがタイムアウトしました', unsupportedBackend: '現在のターミナルバックエンドはファイルのダウンロードに対応していません', invalidPath: '無効なファイルパス', download: 'ダウンロード', downloadFile: 'ファイルをダウンロード', }, }