export default { // ログイン login: { title: 'Hermes Web UI', description: 'アクセストークンを入力して続行してください。サーバーの起動ログで確認できます。', placeholder: 'アクセストークン', submit: 'ログイン', tokenRequired: 'アクセストークンを入力してください', invalidToken: '無効なトークンです', connectionFailed: 'サーバーに接続できません', passwordLogin: 'パスワード', tokenLogin: 'トークン', usernamePlaceholder: 'ユーザー名', passwordPlaceholder: 'パスワード', credentialsRequired: 'ユーザー名とパスワードを入力してください', invalidCredentials: 'ユーザー名またはパスワードが正しくありません', 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: 'プロファイル', skills: 'スキル', memory: 'メモリ', logs: 'ログ', usage: '使用量', channels: 'チャンネル', terminal: 'ターミナル', files: 'ファイル', groupChat: 'グループチャット', groupConversation: '会話', settings: '設定', connected: '接続済み', disconnected: '未接続', updateTip: 'ターミナルで "hermes-web-ui update" を実行して更新してください', updateVersion: '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 で改行)', 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: 'ローカル', }, }, // メモリ 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: 'カスタムモデル名', customModelHint: 'Enterで読み込み', noProviders: 'プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。', 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 サーバー', }, 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: '許可するクロスオリジン', }, }, // プラットフォームチャンネル設定 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: '日別使用量(過去30日間)', date: '日付', tokens: 'トークン', cache: 'キャッシュ', cacheRead: 'キャッシュ読み取り', cacheWrite: 'キャッシュ書き込み', sessions: 'セッション', cost: 'コスト', noData: '使用データがありません', }, // 更新履歴 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_9_1: 'アプリケーション全体でプロファイル管理を統一し、一貫したAPIと状態管理を提供', new_0_5_13_1: 'メッセージキューによる順次実行処理で同時リクエストの競合を防止', new_0_5_13_2: '2階層スキルディレクトリ構造をサポート、フラットスキルは「その他」カテゴリに分類', new_0_5_13_3: '起動同期時に一時セッション(eph_*)をフィルタリング', new_0_5_13_4: 'Termux/proot環境互換性を追加、モバイル・組み込みデプロイに対応', new_0_5_13_5: 'チャット実行中止ライフサイクルの改善:キャンセル時の適切なクリーンアップ', new_0_5_13_6: '履歴メッセージリストのストリーミングインジケーターを削除', new_0_5_13_7: 'カスタムプロバイダーのコンテキスト解決を修正', new_0_5_13_8: 'IPv6デフォルトリスニングアドレスのバインディングを修正', new_0_5_13_9: 'チャットメッセージ表示とコンテキスト圧縮ロジックの改善', new_0_5_13_10: 'チャット完了音トグルが反映されない問題とサイレントcron履歴が空になる問題を修正', new_0_5_12_1: 'セッション一括削除:チェックボックスによる複数選択、全選択、一括削除', new_0_5_12_2: 'コンテキスト長の視覚的エディタ:トークン数をクリックして編集モーダルを開く', new_0_5_12_3: 'グループチャット@mentionのキーボード選択を修正:NDropdownをカスタムドロップダウンに置換え', new_0_5_12_4: 'チャット完了音:自動再生オンオフ', new_0_5_12_5: 'チャットメッセージ表示の改善:空のアシスタントメッセージをフィルタリング', new_0_5_12_6: '更新メカニズムの改善:npm prefix -gによる動的パス解決(Homebrew対応)', new_0_5_10_1: 'GitHubリリースでDockerイメージのビルドを自動化し、バージョンタグを追加(例::v0.5.10)', new_0_5_10_2: 'セッション承認モード設定を追加:approvals.mode(オフ/手動)', new_0_5_10_3: 'OpenAPI ドキュメントの自動生成を追加(94 エンドポイント、24 タグ)', new_0_5_10_4: 'メディア レンダリングを強化:Markdown での画像、動画、ファイルのサポート', new_0_5_10_5: 'グループチャットのプロンプトを最適化し、メディア処理を修正', new_0_5_9_2: 'より良いコントリビューションワークフローのためにGitHubイシューとプルリクエストテンプレートを追加', new_0_5_8_1: 'モバイルサイドバーサポートとカスタマイズ可能なレインボーボタン付きドロワーパネルを追加', new_0_5_8_2: 'プロファイル切り替え状態同期問題を修正し、UIを即座に更新してバックエンドを検証', new_0_5_8_3: '音声合成を改善するため、音声再生の特殊文字と絵文字をフィルタリング', new_0_5_8_4: '不足しているi18nキーを追加し、セッションデータソースを統一してデータベースを優先', new_0_5_8_5: 'esbuildとチャンク分割を使用してDockerビルドを高速化するためにViteビルド設定を最適化', new_0_5_7_1: 'リッチコンテンツ(画像、ファイル)をサポートするためのコンテキスト圧縮を最適化し、ツールメッセージ処理を改善', new_0_5_7_2: 'バッチ挿入とトランザクション保護でデータ整合性を確保しながらセッション同期を改善', new_0_5_7_3: '実行間で正確なトークン追跡を確保するため、usage.updatedイベントの受信を修正', 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_5_3_1: 'Improve reasoning process display with persistence across page refreshes', new_0_5_3_2: 'Optimize stringified array format parsing to extract thinking/text/tool_calls', new_0_5_3_3: 'Improve log display by removing ellipsis and showing full content', new_0_5_3_4: 'Add detailed logging for format conversion and parsing', new_0_5_3_5: 'Optimize token calculation to accurately include tool results', new_0_5_2_1: 'Convert conversation history to Anthropic format before sending to Gateway', new_0_5_2_2: 'Add bidirectional reasoning sync between memory and database', new_0_5_2_3: 'Add message pagination with DESC query + array reverse for performance', new_0_5_2_4: 'Clean up debug code and unused imports', new_0_5_2_5: 'Remove auto-resumed event trigger to avoid timing issues', new_0_5_2_6: 'Use reasoning field consistently across codebase', new_0_5_1_1: 'Auto-sync Hermes history sessions on first startup', new_0_5_1_2: 'Fix session sync failure with old Hermes versions (backward compatible)', new_0_5_1_3: 'Smart cleanup of exclusive platform credentials on profile clone (Telegram, Discord, Slack, etc.)', new_0_5_1_4: 'Auto-normalize profile names to lowercase to avoid backend validation errors', new_0_5_1_5: 'Fix tool_call_id missing in tool messages for OpenAI API compatibility', new_0_5_1_6: 'Unify SQLite table schema management and initialization', new_0_5_1_7: 'Optimize model list layout in Provider cards (fixed height, tag alignment)', new_0_5_1_8: 'Fix display issue with single-line long code blocks in user messages', new_0_5_1_9: 'Fix web terminal rendering errors in Docker deployment', 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: 'ファイルをダウンロード', }, }