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: '保存に失敗しました', ok: 'OK', copied: 'コピーしました', copy: 'コピー', noData: 'データがありません', fetch: '取得', add: '追加', enable: '有効化', disable: '無効化', configured: '設定済み', notConfigured: '未設定', confirm: '確認', expand: '展開', collapse: '折りたたむ', }, // サイドバー sidebar: { chat: 'チャット', jobs: 'ジョブ', models: 'モデル', profiles: 'プロファイル', skills: 'スキル', memory: 'メモリ', logs: 'ログ', usage: '使用量', channels: 'チャンネル', terminal: 'ターミナル', files: 'ファイル', settings: '設定', connected: '接続済み', disconnected: '未接続', updateTip: 'ターミナルで "hermes-web-ui update" を実行して更新してください', updateVersion: 'v{version} にアップグレード', updating: '更新中...', updateSuccess: '更新が完了しました。サーバーを再起動してください', updateFailed: '更新に失敗しました', logout: 'ログアウト', nodeVersionWarning: 'Node.js v{version} が検出されました。バージョン23以降にアップグレードしてください。', changelog: '更新履歴', noChangelog: '更新履歴はありません', }, // チャット chat: { contextRemaining: '残り', emptyState: 'Hermes Agent と会話を開始しましょう', inputPlaceholder: 'メッセージを入力... (Enter で送信、Shift+Enter で改行)', attachFiles: 'ファイルを添付', stop: '停止', send: '送信', contextUsed: 'コンテキスト使用量:', sessions: 'セッション', noSessions: 'セッションがありません', newChat: '新しいチャット', deleteSession: 'このセッションを削除しますか?', sessionDeleted: 'セッションを削除しました', rename: '名前変更', pin: 'ピン留め', unpin: 'ピン留め解除', pinned: 'ピン留め', chatMode: 'チャット', liveMode: 'ライブ', liveSessions: 'ライブセッション', recentBadge: '最近', linkedSessions: '{count} 件の関連', noVisibleMessages: '人間向けに表示できるメッセージはありません。', monitorRoleUser: 'ユーザー', monitorRoleAssistant: 'アシスタント', copySessionId: 'セッション ID をコピー', renamed: '名前を変更しました', renameFailed: '名前の変更に失敗しました', renameSession: 'セッション名の変更', enterNewTitle: '新しいタイトルを入力', other: 'その他', runFailed: '実行に失敗しました', error: 'エラー', tool: 'ツール', arguments: '引数', result: '結果', truncated: '... (省略)', }, // スケジュールジョブ 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: '繰り返し回数(任意)', repeatPlaceholder: '空白の場合は無制限', jobCreated: 'ジョブを作成しました', jobUpdated: 'ジョブを更新しました', nameRequired: '名前は必須です', scheduleRequired: 'スケジュールは必須です', loadFailed: 'ジョブの読み込みに失敗しました', jobPaused: 'ジョブを一時停止しました', jobResumed: 'ジョブを再開しました', jobTriggered: 'ジョブをトリガーしました', jobDeleted: 'ジョブを削除しました', status: { running: '実行中', paused: '一時停止', disabled: '無効', scheduled: 'スケジュール済み', }, info: { schedule: 'スケジュール', lastRun: '前回実行', nextRun: '次回実行', deliver: '配信', repeat: '繰り返し', }, action: { pause: '一時停止', pauseJob: 'ジョブを一時停止', resume: '再開', resumeJob: 'ジョブを再開', runNow: '今すぐ実行', triggerImmediately: 'すぐにトリガー', }, }, // スキル skills: { title: 'スキル', searchPlaceholder: 'スキルを検索...', noMatch: '検索に一致するスキルがありません', noSkills: 'スキルがありません', backTo: '戻る', attachedFiles: '添付ファイル', loadFailed: 'スキルの読み込みに失敗しました', fileLoadFailed: 'ファイルの読み込みに失敗しました', toggleFailed: 'スキルの切り替えに失敗しました', }, // メモリ 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', 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: '認証の有効期限が切れました', customBadge: 'カスタム', customModelPlaceholder: 'カスタムモデル名', customModelHint: 'Enterで読み込み', noProviders: 'プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。', builtIn: '組み込み', customType: 'カスタム', provider: 'プロバイダー', 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: '英数字、ハイフンのみ', newName: '新しい名前', newNamePlaceholder: '新しい名前を入力', cloneFromCurrent: '現在のプロファイルから複製', 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: '毎日指定時刻にセッションをリセット', }, 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(カンマ区切り)', 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: 'キャッシュ', sessions: 'セッション', cost: 'コスト', noData: '使用データがありません', }, // 更新履歴 changelog: { new_0_4_3_1: 'トークン認証に加えてユーザー名/パスワードログインを追加', new_0_4_3_2: '資格情報管理のためのアカウント設定を追加', new_0_4_3_3: 'サイドバーにログアウトボタンを追加', new_0_4_3_4: 'バージョン番号クリックで更新履歴ポップアップを追加', 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: '組み込みプロバイダー検出とモデルマッチングを修正', new_0_4_1_1: '認証バイパスとSPAファイル配信を修正', }, // ファイル 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: '保存', }, // ダウンロード download: { downloading: 'ダウンロード中...', downloadFailed: 'ダウンロードに失敗しました', fileNotFound: 'ファイルが見つからないか削除されています', fileTooLarge: 'ファイルが大きすぎます(制限超過)', backendError: 'ファイルの読み取りに失敗しました。リモート環境が利用できない可能性があります', backendTimeout: 'ファイルの読み取りがタイムアウトしました', unsupportedBackend: '現在のターミナルバックエンドはファイルのダウンロードに対応していません', invalidPath: '無効なファイルパス', download: 'ダウンロード', downloadFile: 'ファイルをダウンロード', }, }