diff --git a/apps/desktop/src/i18n/ja.ts b/apps/desktop/src/i18n/ja.ts index 93177c380cf..afd0008a904 100644 --- a/apps/desktop/src/i18n/ja.ts +++ b/apps/desktop/src/i18n/ja.ts @@ -4,18 +4,151 @@ import { defineLocale } from './define-locale' export const ja = defineLocale({ common: { + apply: '適用', + back: '戻る', save: '保存', saving: '保存中…', cancel: 'キャンセル', + change: '変更', + choose: '選択', + clear: 'クリア', close: '閉じる', + collapse: '折りたたむ', confirm: '確認', + connect: '接続', + connecting: '接続中', + continue: '続ける', + copied: 'コピーしました', + copy: 'コピー', + copyFailed: 'コピーに失敗しました', delete: '削除', + docs: 'ドキュメント', + done: '完了', + error: 'エラー', + failed: '失敗', + free: '無料', + loading: '読み込み中…', + notSet: '未設定', refresh: '更新', + remove: '削除', + replace: '置き換え', retry: '再試行', + run: '実行', + send: '送信', + set: '設定', + skip: 'スキップ', + update: '更新', on: 'オン', off: 'オフ' }, + boot: { + ready: 'Hermes Desktop の準備ができました', + desktopBootFailedWithMessage: message => `デスクトップの起動に失敗しました: ${message}`, + steps: { + connectingGateway: 'ライブデスクトップゲートウェイに接続中', + loadingSettings: 'Hermes の設定を読み込み中', + loadingSessions: '最近のセッションを読み込み中', + startingDesktopConnection: 'デスクトップ接続を開始中', + startingHermesDesktop: 'Hermes Desktop を起動中…' + }, + errors: { + backgroundExited: 'Hermes バックグラウンドプロセスが終了しました。', + backgroundExitedDuringStartup: '起動中に Hermes バックグラウンドプロセスが終了しました。', + backendStopped: 'バックエンドが停止しました', + desktopBootFailed: 'デスクトップの起動に失敗しました', + gatewaySignInRequired: 'ゲートウェイへのサインインが必要です', + ipcBridgeUnavailable: 'デスクトップ IPC ブリッジが利用できません。' + }, + failure: { + title: 'Hermes を起動できませんでした', + description: + 'バックグラウンドゲートウェイが起動しませんでした。以下の回復手順をお試しください。チャットや設定は削除されません。', + remoteTitle: 'リモートゲートウェイへのサインインが必要です', + remoteDescription: + 'リモートゲートウェイのセッションが期限切れです。再接続するにはもう一度サインインしてください。チャットや設定は削除されません。', + retry: '再試行', + repairInstall: 'インストールを修復', + useLocalGateway: 'ローカルゲートウェイを使用', + openLogs: 'ログを開く', + repairHint: '修復はインストーラーを再実行します。新しいマシンでは数分かかる場合があります。', + remoteSignInHint: + 'ゲートウェイのログインウィンドウを開きます。代わりにバンドルされたバックエンドに切り替えるには「ローカルゲートウェイを使用」を選択してください。', + hideRecentLogs: '最近のログを非表示', + showRecentLogs: '最近のログを表示', + signedInTitle: 'サインインしました', + signedInMessage: 'リモートゲートウェイに再接続中…', + signInIncompleteTitle: 'サインインが完了していません', + signInIncompleteMessage: '認証が完了する前にログインウィンドウが閉じられました。', + signInFailed: 'サインインに失敗しました', + signInToRemoteGateway: 'リモートゲートウェイにサインイン', + signInWithProvider: provider => `${provider} でサインイン`, + identityProvider: 'ID プロバイダー' + } + }, + + notifications: { + region: '通知', + hide: '非表示', + show: '表示', + more: count => `他 ${count} 件の通知`, + clearAll: 'すべてクリア', + dismiss: '通知を閉じる', + details: '詳細', + copyDetail: '詳細をコピー', + copyDetailFailed: '通知の詳細をコピーできませんでした', + backendOutOfDateTitle: 'バックエンドが古いです', + backendOutOfDateMessage: + 'Hermes バックエンドがこのデスクトップビルドより古く、正常に動作しない場合があります。更新して揃えてください。', + updateHermes: 'Hermes を更新', + updateReadyTitle: '更新の準備ができました', + updateReadyMessage: count => `${count} 件の新しい変更が利用可能です。`, + seeWhatsNew: '新機能を見る', + errors: { + elevenLabsNeedsKey: 'ElevenLabs STT には ELEVENLABS_API_KEY が必要です。', + elevenLabsRejectedKey: 'ElevenLabs が API キーを拒否しました (401)。', + methodNotAllowed: + 'デスクトップバックエンドがそのリクエストを拒否しました (405 Method Not Allowed)。Hermes Desktop を再起動してください。', + microphonePermission: 'マイクのアクセス許可が拒否されました。', + openaiRejectedApiKey: 'OpenAI が API キーを拒否しました。', + openaiRejectedApiKeyWithStatus: status => `OpenAI が API キーを拒否しました (${status} invalid_api_key)。`, + openaiTtsNeedsKey: 'OpenAI TTS には VOICE_TOOLS_OPENAI_KEY または OPENAI_API_KEY が必要です。' + }, + voice: { + configureSpeechToText: '音声モードを使用するには音声認識を設定してください。', + couldNotStartSession: '音声セッションを開始できませんでした', + microphoneAccessDenied: 'マイクへのアクセスが拒否されました。', + microphoneConstraintsUnsupported: 'このデバイスはマイクの制約をサポートしていません。', + microphoneFailed: 'マイクが失敗しました', + microphoneInUse: 'マイクは他のアプリで使用中です。', + microphonePermissionDenied: 'マイクのアクセス許可が拒否されました。', + microphoneStartFailed: 'マイクの録音を開始できませんでした。', + microphoneUnsupported: 'このランタイムはマイク録音をサポートしていません。', + noMicrophone: 'マイクが見つかりませんでした。', + noSpeechDetected: '音声が検出されませんでした', + playbackFailed: '音声再生に失敗しました', + recordingFailed: '音声録音に失敗しました', + transcriptionFailed: '音声文字起こしに失敗しました', + transcriptionUnavailable: '音声文字起こしはまだ利用できません。', + tryRecordingAgain: 'もう一度録音してください。', + unavailable: '音声は利用できません' + } + }, + + titlebar: { + hideSidebar: 'サイドバーを非表示', + showSidebar: 'サイドバーを表示', + search: '検索', + searchTitle: 'セッション、ビュー、アクションを検索', + swapSidebarSides: 'サイドバーの向きを切り替え', + swapSidebarSidesTitle: 'セッションとファイルブラウザーの位置を入れ替える', + hideRightSidebar: '右サイドバーを非表示', + showRightSidebar: '右サイドバーを表示', + muteHaptics: '触覚フィードバックをオフ', + unmuteHaptics: '触覚フィードバックをオン', + openSettings: '設定を開く' + }, + language: { label: '言語', description: 'デスクトップインターフェイスの言語を選択します。', @@ -277,37 +410,1445 @@ export const ja = defineLocale({ minAgo: count => `${count} 分前`, hoursAgo: count => `${count} 時間前`, daysAgo: count => `${count} 日前` + }, + config: { + none: 'なし', + noneParen: '(なし)', + notSet: '未設定', + commaSeparated: 'カンマ区切りの値', + loading: 'Hermes の設定を読み込み中...', + emptyTitle: '設定項目がありません', + emptyDesc: 'このセクションには調整できる設定がありません。', + failedLoad: '設定の読み込みに失敗しました', + autosaveFailed: '自動保存に失敗しました', + imported: '設定をインポートしました', + invalidJson: '設定 JSON が無効です' + }, + credentials: { + pasteKey: 'キーを貼り付け', + pasteLabelKey: label => `${label} キーを貼り付け`, + optional: '省略可能', + enterValueFirst: '最初に値を入力してください。', + couldNotSave: '認証情報を保存できませんでした。', + remove: '削除', + or: 'または', + escToCancel: 'Esc でキャンセル', + getKey: 'キーを取得', + saving: '保存中' + }, + envActions: { + actionsFor: label => `${label} のアクション`, + credentialActions: '認証情報のアクション', + docs: 'ドキュメント', + hideValue: '値を非表示', + revealValue: '値を表示', + replace: '置き換え', + set: '設定', + clear: 'クリア' + }, + gateway: { + loading: 'ゲートウェイ設定を読み込み中...', + unavailableTitle: 'ゲートウェイ設定は利用できません', + unavailableDesc: 'デスクトップ IPC ブリッジはゲートウェイ設定を公開していません。', + title: 'ゲートウェイ接続', + envOverride: 'env オーバーライド', + intro: + 'Hermes Desktop はデフォルトで独自のローカルゲートウェイを起動します。別のマシンや信頼できるプロキシの背後で既に動作している Hermes バックエンドをこのアプリで制御する場合は、リモートゲートウェイを使用してください。以下でプロファイルを選択して、それぞれのリモートホストを設定します。', + appliesTo: '適用対象', + allProfiles: 'すべてのプロファイル', + defaultConnection: '独自のオーバーライドがないすべてのプロファイルのデフォルト接続。', + profileConnection: profile => + `"${profile}" がアクティブプロファイルのときのみ使用される接続。ローカルに設定するとデフォルトを継承します。`, + envOverrideTitle: '環境変数がこのデスクトップセッションを制御しています。', + envOverrideDesc: + '保存された設定を使用するには HERMES_DESKTOP_REMOTE_URL と HERMES_DESKTOP_REMOTE_TOKEN の設定を解除してください。', + localTitle: 'ローカルゲートウェイ', + localDesc: 'ローカルホストでプライベートな Hermes バックエンドを起動します。これがデフォルトで、オフラインでも動作します。', + remoteTitle: 'リモートゲートウェイ', + remoteDesc: + 'このデスクトップシェルをリモートの Hermes バックエンドに接続します。ホスト型ゲートウェイは OAuth またはユーザー名とパスワードを使用します。自己ホスト型はセッショントークンを使用する場合があります。', + remoteUrlTitle: 'リモート URL', + remoteUrlDesc: 'リモートダッシュボードバックエンドのベース URL。/hermes などのパスプレフィックスもサポートしています。', + probing: 'このゲートウェイの認証方法を確認中…', + probeError: + 'このゲートウェイにまだ到達できません。URL を確認してください。応答後に認証方法が表示されます。', + signedIn: 'サインイン済み', + signIn: 'サインイン', + signOut: 'サインアウト', + signInWith: provider => `${provider} でサインイン`, + authTitle: '認証', + authSignedInPassword: + 'このゲートウェイはユーザー名とパスワードを使用します。サインイン済みです。セッションは自動的に更新されます。', + authSignedInOauth: 'このゲートウェイは OAuth を使用します。サインイン済みです。セッションは自動的に更新されます。', + authNeedsPassword: + 'このゲートウェイはユーザー名とパスワードを使用します。このデスクトップアプリを承認するにはサインインしてください。', + authNeedsOauth: provider => + `このゲートウェイは OAuth を使用します。このデスクトップアプリを承認するには ${provider} でサインインしてください。`, + tokenTitle: 'セッショントークン', + tokenDesc: + 'REST および WebSocket アクセスに使用するダッシュボードセッショントークン。保存済みトークンを維持するには空欄にしてください。', + existingToken: value => `既存のトークン ${value}`, + savedToken: '保存済み', + pasteSessionToken: 'セッショントークンを貼り付け', + testRemote: 'リモートをテスト', + saveForRestart: '次回起動時のために保存', + saveAndReconnect: '保存して再接続', + diagnostics: '診断', + diagnosticsDesc: + 'ファイルマネージャーで desktop.log を表示します。ゲートウェイの起動に失敗した際に役立ちます。', + openLogs: 'ログを開く', + incompleteTitle: 'リモートゲートウェイの設定が不完全です', + incompleteSignIn: 'リモートに切り替える前にリモート URL を入力してサインインしてください。', + incompleteToken: 'リモートに切り替える前にリモート URL とセッショントークンを入力してください。', + incompleteSignInTest: 'テストする前にリモート URL を入力してサインインしてください。', + incompleteTokenTest: 'テストする前にリモート URL とセッショントークンを入力してください。', + enterUrlFirst: '最初にリモート URL を入力してください。', + restartingTitle: 'ゲートウェイ接続を再起動中', + savedTitle: 'ゲートウェイ設定を保存しました', + restartingMessage: 'Hermes Desktop は保存された設定を使用して再接続します。', + savedMessage: '次回起動時に保存されます。', + connectedTo: (baseUrl, version) => `${baseUrl}${version ? ` · Hermes ${version}` : ''} に接続しました`, + reachableTitle: 'リモートゲートウェイに到達可能', + signedOutTitle: 'サインアウトしました', + signedOutMessage: 'リモートゲートウェイセッションをクリアしました。', + failedLoad: 'ゲートウェイ設定の読み込みに失敗しました', + signInFailed: 'サインインに失敗しました', + signOutFailed: 'サインアウトに失敗しました', + testFailed: 'リモートゲートウェイのテストに失敗しました', + applyFailed: 'ゲートウェイ設定を適用できませんでした', + saveFailed: 'ゲートウェイ設定を保存できませんでした' + }, + keys: { + loading: 'API キーと認証情報を読み込み中...', + failedLoad: 'API キーの読み込みに失敗しました', + empty: 'このカテゴリーにはまだ設定がありません。' + }, + mcp: { + loading: 'MCP サーバーを読み込み中...', + failedLoad: 'MCP 設定の読み込みに失敗しました', + nameRequiredTitle: '名前が必要です', + nameRequiredMessage: 'この MCP サーバーに設定キーを付けてください。', + objectRequired: 'サーバー設定は JSON オブジェクトである必要があります', + invalidJson: '無効な MCP JSON', + saveFailed: '保存に失敗しました', + removeFailed: '削除に失敗しました', + gatewayUnavailableTitle: 'ゲートウェイが利用できません', + gatewayUnavailableMessage: 'MCP を再読み込みする前にゲートウェイを再接続してください。', + reloadedTitle: 'MCP ツールを再読み込みしました', + reloadedMessage: '新しいツールスキーマは新しいターンに適用されます。', + reloadFailed: 'MCP の再読み込みに失敗しました', + savedTitle: 'MCP サーバーを保存しました', + savedMessage: name => `${name} は MCP の再読み込み後に適用されます。`, + newServer: '新しいサーバー', + reload: 'MCP を再読み込み', + reloading: '再読み込み中...', + emptyTitle: 'MCP サーバーがありません', + emptyDesc: 'MCP ツールを公開するには stdio または HTTP サーバーを追加してください。', + disabled: '無効', + editServer: 'サーバーを編集', + name: '名前', + serverJson: 'サーバー JSON', + remove: '削除', + saveServer: 'サーバーを保存' + }, + model: { + loading: 'モデル設定を読み込み中...', + appliesDesc: '新しいセッションに適用されます。コンポーザーのモデルピッカーを使ってアクティブなチャットをホットスワップできます。', + provider: 'プロバイダー', + model: 'モデル', + applying: '適用中...', + auxiliaryTitle: '補助モデル', + resetAllToMain: 'すべてメインにリセット', + auxiliaryDesc: + 'ヘルパータスクはデフォルトでメインモデルで実行されます。タスクに専用モデルを割り当てることでオーバーライドできます。', + setToMain: 'メインに設定', + change: '変更', + autoUseMain: '自動 · メインモデルを使用', + providerDefault: '(プロバイダーのデフォルト)', + tasks: { + vision: { label: 'ビジョン', hint: '画像分析' }, + web_extract: { label: 'ウェブ抽出', hint: 'ページの要約' }, + compression: { label: '圧縮', hint: 'コンテキストの圧縮' }, + skills_hub: { label: 'スキルハブ', hint: 'スキル検索' }, + approval: { label: '承認', hint: 'スマート自動承認' }, + mcp: { label: 'MCP', hint: 'MCP ツールルーティング' }, + title_generation: { label: 'タイトル生成', hint: 'セッションタイトル' }, + curator: { label: 'キュレーター', hint: 'スキル使用レビュー' } + } + }, + providers: { + connectAccount: 'アカウントを接続', + haveApiKey: 'API キーをお持ちですか?', + intro: + 'サブスクリプションでサインインします。API キーのコピーは不要です。Hermes がアプリ内でブラウザーサインインを代行します。', + connected: '接続済み', + collapse: '折りたたむ', + connectAnother: '別のプロバイダーを接続', + otherProviders: 'その他のプロバイダー', + noProviderKeys: '利用可能なプロバイダー API キーがありません。', + loading: 'プロバイダーを読み込み中...' + }, + sessions: { + loading: 'アーカイブ済みセッションを読み込み中…', + archivedTitle: 'アーカイブ済みセッション', + archivedIntro: + 'アーカイブ済みチャットはサイドバーでは非表示になりますが、すべてのメッセージは保持されます。サイドバーのチャットを Ctrl/⌘ クリックするとアーカイブできます。', + emptyArchivedTitle: 'アーカイブがありません', + emptyArchivedDesc: 'チャットをアーカイブするとここに表示されます。', + unarchive: 'アーカイブを解除', + deletePermanently: '完全に削除', + messages: count => `${count} 件のメッセージ`, + restored: '復元しました', + deleteConfirm: title => `"${title}" を完全に削除しますか?この操作は元に戻せません。`, + defaultDirTitle: 'デフォルトのプロジェクトディレクトリ', + defaultDirDesc: + '別のフォルダーを選択しない限り、新しいセッションはこのフォルダーで開始します。未設定の場合はホームディレクトリが使用されます。', + defaultDirUpdated: 'デフォルトのプロジェクトディレクトリを更新しました', + defaultsTo: label => `デフォルト: ${label}。`, + change: '変更', + choose: '選択', + clear: 'クリア', + notSet: '未設定', + failedLoad: 'アーカイブ済みセッションを読み込めませんでした', + unarchiveFailed: 'アーカイブ解除に失敗しました', + deleteFailed: '削除に失敗しました', + updateDirFailed: 'デフォルトディレクトリを更新できませんでした', + clearDirFailed: 'デフォルトディレクトリをクリアできませんでした' + }, + toolsets: { + loadingConfig: '設定を読み込み中', + savedTitle: '認証情報を保存しました', + savedMessage: key => `${key} を更新しました。`, + removedTitle: '認証情報を削除しました', + removedMessage: key => `${key} を削除しました。`, + failedSave: key => `${key} の保存に失敗しました`, + failedRemove: key => `${key} の削除に失敗しました`, + failedReveal: key => `${key} の表示に失敗しました`, + removeConfirm: key => `.env から ${key} を削除しますか?`, + set: '設定済み', + notSet: '未設定', + selectedTitle: 'プロバイダーを選択しました', + selectedMessage: provider => `${provider} が有効になりました。`, + failedSelect: provider => `${provider} の選択に失敗しました`, + failedLoad: 'ツール設定の読み込みに失敗しました', + noProviderOptions: + 'このツールセットにはプロバイダーのオプションがありません。有効にすれば現在の設定で動作します。', + noProviders: '現在このツールセットに利用可能なプロバイダーがありません。', + ready: '準備完了', + nousIncluded: 'Nous サブスクリプションに含まれています。有効にするには Nous Portal にサインインしてください。', + noApiKeyRequired: 'API キーは不要です。', + postSetup: step => + `このプロバイダーは追加のセットアップ手順 (${step}) が必要です。今は CLI で hermes tools を実行してください。` } }, skills: { + tabSkills: 'スキル', + tabToolsets: 'ツールセット', all: 'すべて', - noDescription: '説明はありません。' + searchSkills: 'スキルを検索...', + searchToolsets: 'ツールセットを検索...', + refresh: 'スキルを更新', + refreshing: 'スキルを更新中', + loading: '機能を読み込み中...', + noSkillsTitle: 'スキルが見つかりません', + noSkillsDesc: '検索を広げるか、別のカテゴリーを試してください。', + noToolsetsTitle: 'ツールセットが見つかりません', + noToolsetsDesc: '検索キーワードを広げてください。', + noDescription: '説明はありません。', + configured: '設定済み', + needsKeys: 'キーが必要', + toolsetsEnabled: (enabled, total) => `${enabled}/${total} ツールセットが有効`, + configureToolset: label => `${label} を設定`, + toggleToolset: label => `${label} ツールセットを切り替え`, + skillsLoadFailed: 'スキルの読み込みに失敗しました', + toolsetsRefreshFailed: 'ツールセットの更新に失敗しました', + skillEnabled: 'スキルを有効にしました', + skillDisabled: 'スキルを無効にしました', + toolsetEnabled: 'ツールセットを有効にしました', + toolsetDisabled: 'ツールセットを無効にしました', + appliesToNewSessions: name => `${name} は新しいセッションに適用されます。`, + failedToUpdate: name => `${name} の更新に失敗しました` + }, + + agents: { + close: 'エージェントを閉じる', + title: 'スポーンツリー', + subtitle: '現在のターンのライブサブエージェントのアクティビティ。', + emptyTitle: 'ライブサブエージェントはありません', + emptyDesc: 'ターンで作業を委任すると、子エージェントの進捗状況がここにストリームされます。', + running: '実行中', + failed: '失敗', + done: '完了', + streaming: 'ストリーミング中', + files: 'ファイル', + moreFiles: count => `+${count} 件のファイル`, + delegation: index => `委任 ${index}`, + workers: count => `${count} ワーカー`, + workersActive: count => `${count} アクティブ`, + agentsCount: count => `${count} エージェント`, + activeCount: count => `${count} アクティブ`, + failedCount: count => `${count} 失敗`, + toolsCount: count => `${count} ツール`, + filesCount: count => `${count} ファイル`, + updatedAgo: age => `${age} に更新`, + ageNow: 'たった今', + ageSeconds: seconds => `${seconds}秒前`, + ageMinutes: minutes => `${minutes}分前`, + ageHours: hours => `${hours}時間前`, + durationSeconds: seconds => `${seconds}秒`, + durationMinutes: (minutes, seconds) => `${minutes}分 ${seconds}秒`, + tokensK: k => `${k}k トーク`, + tokens: value => `${value} トーク` + }, + + commandCenter: { + close: 'コマンドセンターを閉じる', + paletteTitle: 'コマンドパレット', + back: '戻る', + searchPlaceholder: 'セッション、ビュー、アクションを検索', + goTo: '移動', + commandCenter: 'コマンドセンター', + appearance: '外観', + settings: '設定', + changeTheme: 'テーマを変更...', + changeColorMode: 'カラーモードを変更...', + settingsFields: '設定フィールド', + mcpServers: 'MCP サーバー', + archivedChats: 'アーカイブ済みチャット', + sections: { sessions: 'セッション', system: 'システム', usage: '使用状況' }, + sectionDescriptions: { + sessions: 'セッションの検索と管理', + system: 'ステータス、ログ、システムアクション', + usage: 'トークン、コスト、スキルの活動履歴' + }, + nav: { + newChat: { title: '新しいセッション', detail: '新しいセッションを開始' }, + settings: { title: '設定', detail: 'Hermes デスクトップを設定' }, + skills: { title: 'スキルとツール', detail: 'スキル、ツールセット、プロバイダーを有効化' }, + messaging: { title: 'メッセージング', detail: 'Telegram、Slack、Discord などを設定' }, + artifacts: { title: 'アーティファクト', detail: '生成された出力を閲覧' } + }, + sectionEntries: { + sessions: { title: 'セッションパネル', detail: 'セッションの検索、ピン留め、管理' }, + system: { title: 'システムパネル', detail: 'ゲートウェイのステータス、ログ、再起動/更新' }, + usage: { title: '使用状況パネル', detail: 'トークン、コスト、スキルの活動' } + }, + providerNavigate: 'ナビゲート', + providerSessions: 'セッション', + refresh: '更新', + refreshing: '更新中...', + noResults: '一致する結果が見つかりません。', + pinSession: 'セッションをピン留め', + unpinSession: 'セッションのピン留めを解除', + exportSession: 'セッションをエクスポート', + deleteSession: 'セッションを削除', + noSessions: 'セッションはまだありません。', + gatewayRunning: 'メッセージングゲートウェイが実行中', + gatewayStopped: 'メッセージングゲートウェイが停止中', + hermesActiveSessions: (version, count) => `Hermes ${version} · アクティブセッション ${count}`, + restartMessaging: 'メッセージングを再起動', + updateHermes: 'Hermes を更新', + actionRunning: '実行中', + actionDone: '完了', + actionFailed: '失敗', + actionStartedWaiting: 'アクションが開始されました。ステータスを待機中...', + loadingStatus: 'ステータスを読み込み中...', + recentLogs: '最近のログ', + noLogs: 'ログはまだ読み込まれていません。', + days: count => `${count}日`, + statSessions: 'セッション', + statApiCalls: 'API コール', + statTokens: 'トークン入力/出力', + statCost: '推定コスト', + actualCost: cost => `実際 ${cost}`, + loadingUsage: '使用状況を読み込み中...', + noUsage: period => `過去 ${period} 日間に使用履歴がありません。`, + retry: '再試行', + dailyTokens: '日別トークン', + input: '入力', + output: '出力', + noDailyActivity: '日別アクティビティがありません。', + topModels: 'よく使うモデル', + noModelUsage: 'モデルの使用履歴はまだありません。', + topSkills: 'よく使うスキル', + noSkillActivity: 'スキルのアクティビティはまだありません。', + actions: count => `${count} アクション` + }, + + messaging: { + search: 'メッセージングを検索...', + loading: 'メッセージングプラットフォームを読み込み中...', + loadFailed: 'メッセージングプラットフォームの読み込みに失敗しました', + states: { + connected: '接続済み', + connecting: '接続中', + disabled: '無効', + fatal: 'エラー', + gateway_stopped: 'メッセージングゲートウェイが停止中', + not_configured: '設定が必要', + pending_restart: '再起動が必要', + retrying: '再試行中', + startup_failed: '起動失敗' + }, + unknown: '不明', + hintPendingRestart: 'この変更を適用するにはステータスバーからゲートウェイを再起動してください。', + hintGatewayStopped: 'ステータスバーからゲートウェイを起動して接続してください。', + credentialsSet: '認証情報を設定しました', + needsSetup: '設定が必要', + gatewayStopped: 'メッセージングゲートウェイが停止中', + getCredentials: '認証情報を取得', + openSetupGuide: 'セットアップガイドを開く', + required: '必須', + recommended: '推奨', + advanced: count => `詳細設定 (${count})`, + noTokenNeeded: + 'このプラットフォームはここでトークンが必要ありません。上のセットアップガイドを使用してから、以下で有効にしてください。', + enabled: '有効', + disabled: '無効', + unsavedChanges: '未保存の変更', + saving: '保存中...', + saveChanges: '変更を保存', + saved: '保存しました', + replaceValue: '現在の値を置き換え', + openDocs: 'ドキュメントを開く', + clearField: key => `${key} をクリア`, + enableAria: name => `${name} を有効にする`, + disableAria: name => `${name} を無効にする`, + platformEnabled: name => `${name} を有効にしました`, + platformDisabled: name => `${name} を無効にしました`, + restartToApply: 'この変更を有効にするにはゲートウェイを再起動してください。', + setupSaved: name => `${name} の設定を保存しました`, + restartToReconnect: '新しい認証情報で再接続するにはゲートウェイを再起動してください。', + keyCleared: key => `${key} をクリアしました`, + setupUpdated: name => `${name} の設定が更新されました。`, + failedUpdate: name => `${name} の更新に失敗しました`, + failedSave: name => `${name} の保存に失敗しました`, + failedClear: key => `${key} のクリアに失敗しました`, + fieldCopy: { + TELEGRAM_BOT_TOKEN: { + label: 'ボットトークン', + help: '@BotFather でボットを作成し、表示されたトークンを貼り付けてください。', + placeholder: 'Telegram ボットトークンを貼り付け' + }, + TELEGRAM_ALLOWED_USERS: { + label: '許可する Telegram ユーザー ID', + help: '推奨。@userinfobot の数値 ID をカンマ区切りで。設定しないと誰でもボットに DM できます。' + }, + TELEGRAM_PROXY: { label: 'プロキシ URL', help: 'Telegram がブロックされているネットワークでのみ必要です。' }, + DISCORD_BOT_TOKEN: { + label: 'ボットトークン', + help: 'Discord Developer Portal でアプリケーションを作成し、ボットを追加してからトークンを貼り付けてください。' + }, + DISCORD_ALLOWED_USERS: { + label: '許可する Discord ユーザー ID', + help: '推奨。カンマ区切りの Discord ユーザー ID。' + }, + DISCORD_REPLY_TO_MODE: { label: '返信スタイル', help: 'first、all、または off。' }, + DISCORD_ALLOW_ALL_USERS: { + label: 'すべての Discord ユーザーを許可', + help: '開発用のみ。true にすると、許可リストなしで誰でもボットに DM できます。' + }, + DISCORD_HOME_CHANNEL: { + label: 'ホームチャンネル ID', + help: 'ボットがプロアクティブなメッセージを送信するチャンネル(Cron 出力、リマインダー)。' + }, + DISCORD_HOME_CHANNEL_NAME: { + label: 'ホームチャンネル名', + help: 'ログやステータス出力でのホームチャンネルの表示名。' + }, + BLUEBUBBLES_ALLOW_ALL_USERS: { + label: 'すべての iMessage ユーザーを許可', + help: 'true にすると BlueBubbles の許可リストをスキップします。' + }, + MATTERMOST_ALLOW_ALL_USERS: { label: 'すべての Mattermost ユーザーを許可' }, + MATTERMOST_HOME_CHANNEL: { label: 'ホームチャンネル' }, + QQ_ALLOW_ALL_USERS: { label: 'すべての QQ ユーザーを許可' }, + QQBOT_HOME_CHANNEL: { label: 'QQ ホームチャンネル', help: 'Cron 配信のデフォルトチャンネルまたはグループ。' }, + QQBOT_HOME_CHANNEL_NAME: { label: 'QQ ホームチャンネル名' }, + SLACK_BOT_TOKEN: { + label: 'Slack ボットトークン', + help: 'Slack アプリをインストール後、OAuth & Permissions のボットトークンを使用してください。', + placeholder: 'Slack ボットトークンを貼り付け' + }, + SLACK_APP_TOKEN: { + label: 'Slack アプリトークン', + help: 'Socket Mode に必要なアプリレベルのトークンを使用してください。', + placeholder: 'Slack アプリトークンを貼り付け' + }, + SLACK_ALLOWED_USERS: { + label: '許可する Slack ユーザー ID', + help: '推奨。カンマ区切りの Slack ユーザー ID。' + }, + MATTERMOST_URL: { label: 'サーバー URL', placeholder: 'https://mattermost.example.com' }, + MATTERMOST_TOKEN: { label: 'ボットトークン' }, + MATTERMOST_ALLOWED_USERS: { + label: '許可するユーザー ID', + help: '推奨。カンマ区切りの Mattermost ユーザー ID。' + }, + MATRIX_HOMESERVER: { label: 'ホームサーバー URL', placeholder: 'https://matrix.org' }, + MATRIX_ACCESS_TOKEN: { label: 'アクセストークン' }, + MATRIX_USER_ID: { label: 'ボットユーザー ID', placeholder: '@hermes:example.org' }, + MATRIX_ALLOWED_USERS: { + label: '許可する Matrix ユーザー ID', + help: '推奨。@user:server 形式のカンマ区切りユーザー ID。' + }, + SIGNAL_HTTP_URL: { + label: 'Signal ブリッジ URL', + placeholder: 'http://127.0.0.1:8080', + help: '実行中の signal-cli REST ブリッジの URL。' + }, + SIGNAL_ACCOUNT: { label: '電話番号', help: 'signal-cli ブリッジに登録した番号。' }, + SIGNAL_ALLOWED_USERS: { + label: '許可する Signal ユーザー', + help: '推奨。カンマ区切りの Signal 識別子。' + }, + WHATSAPP_ENABLED: { + label: 'WhatsApp ブリッジを有効にする', + help: '以下のトグルで自動的に設定されます。必要な場合を除いてそのままにしてください。' + }, + WHATSAPP_MODE: { label: 'ブリッジモード' }, + WHATSAPP_ALLOWED_USERS: { + label: '許可する WhatsApp ユーザー', + help: '推奨。カンマ区切りの電話番号または WhatsApp ID。' + } + }, + platformIntro: {} }, profiles: { + close: 'プロファイルを閉じる', + nameHint: '小文字、数字、ハイフン、アンダースコア。文字または数字で始める必要があります。', + title: 'プロファイル', + count: count => `${count} プロファイル`, + loading: 'プロファイルを読み込み中...', newProfile: '新しいプロファイル', + allProfiles: 'すべてのプロファイル', + showAllProfiles: 'すべてのプロファイルを表示', + switchToProfile: name => `${name} に切り替え`, + manageProfiles: 'プロファイルを管理...', + actionsFor: name => `${name} のアクション`, + color: 'カラー...', + colorFor: name => `${name} のカラー`, + setColor: color => `カラー ${color} に設定`, + autoColor: '自動', noProfiles: 'プロファイルが見つかりません。', + selectPrompt: '詳細を表示するにはプロファイルを選択してください。', + refresh: 'プロファイルを更新', + refreshing: 'プロファイルを更新中', + default: 'デフォルト', skills: count => `${count} スキル`, + env: 'env', defaultBadge: 'デフォルト', rename: '名前を変更', + copySetup: 'セットアップをコピー', + copying: 'コピー中...', + modelLabel: 'モデル', + skillsLabel: 'スキル', + notSet: '未設定', + soulDesc: 'このプロファイルに組み込まれたシステムプロンプトとペルソナの指示。', + soulOptional: '省略可能', + soulPlaceholder: mode => `このプロファイルのシステムプロンプト / ペルソナ。\n空欄のままにすると ${mode} のデフォルトを使用します。`, + soulPlaceholderCloned: 'クローン済み', + soulPlaceholderEmpty: '空', + unsavedChanges: '未保存の変更', + loadingSoul: 'SOUL.md を読み込み中...', + emptySoul: '空の SOUL.md — ペルソナの記述を始めてください...', + saving: '保存中...', saveSoul: 'SOUL を保存', + deleteTitle: 'プロファイルを削除しますか?', + deleteDescPrefix: 'これにより ', + deleteDescMid: ' が削除され、その ', + deleteDescSuffix: ' ディレクトリが削除されます。この操作は元に戻せません。', + deleting: '削除中...', + createDesc: 'プロファイルは独立した Hermes 環境です:設定、スキル、SOUL.md が別々になります。', + nameLabel: '名前', cloneFromDefault: 'デフォルトプロファイルから設定を複製', + cloneFromDefaultDesc: 'デフォルトプロファイルから設定、スキル、SOUL.md をコピーします。', invalidName: hint => `無効なプロファイル名。${hint}`, nameRequired: '名前は必須です', + creating: '作成中...', + createAction: 'プロファイルを作成', + renameTitle: 'プロファイルの名前を変更', + renameDescPrefix: '名前を変更するとプロファイルディレクトリと ', + renameDescSuffix: ' 内のラッパースクリプトが更新されます。', + newNameLabel: '新しい名前', + renaming: '名前を変更中...', created: '作成しました', renamed: '名前を変更しました', deleted: '削除しました', - soulSaved: 'SOUL.md を保存しました' + setupCopied: 'セットアップコマンドをコピーしました', + soulSaved: 'SOUL.md を保存しました', + failedLoad: 'プロファイルの読み込みに失敗しました', + failedDelete: 'プロファイルの削除に失敗しました', + failedCopy: 'セットアップコマンドのコピーに失敗しました', + failedLoadSoul: 'SOUL.md の読み込みに失敗しました', + failedSaveSoul: 'SOUL.md の保存に失敗しました', + failedCreate: 'プロファイルの作成に失敗しました', + failedRename: 'プロファイルの名前変更に失敗しました' }, cron: { + close: 'Cron を閉じる', + search: 'Cron ジョブを検索...', + refresh: 'Cron ジョブを更新', + refreshing: 'Cron ジョブを更新中', + loading: 'Cron ジョブを読み込み中...', + states: { + enabled: '有効', + scheduled: 'スケジュール済み', + running: '実行中', + paused: '一時停止中', + disabled: '無効', + error: 'エラー', + completed: '完了' + }, + deliveryLabels: { + local: 'このデスクトップ', + telegram: 'Telegram', + discord: 'Discord', + slack: 'Slack', + email: 'メール' + }, + scheduleLabels: { + daily: '毎日', + weekdays: '平日', + weekly: '毎週', + monthly: '毎月', + hourly: '毎時', + 'every-15-minutes': '15 分ごと', + custom: 'カスタム' + }, + scheduleHints: { + daily: '毎日午前 9:00', + weekdays: '月曜日から金曜日の午前 9:00', + weekly: '毎週月曜日午前 9:00', + monthly: '毎月 1 日午前 9:00', + hourly: '毎時 0 分', + 'every-15-minutes': '15 分ごと', + custom: 'Cron 構文または自然言語' + }, + days: { + '0': '日曜日', + '1': '月曜日', + '2': '火曜日', + '3': '水曜日', + '4': '木曜日', + '5': '金曜日', + '6': '土曜日', + '7': '日曜日' + }, + dayFallback: value => `${value}日`, + everyDayAt: time => `毎日 ${time} に`, + weekdaysAt: time => `平日 ${time} に`, + everyDayOfWeekAt: (day, time) => `毎週 ${day} ${time} に`, + monthlyOnDayAt: (dayOfMonth, time) => `毎月 ${dayOfMonth} 日 ${time} に`, + topOfHour: '毎時 0 分', + everyHourAt: minute => `毎時 :${minute} に`, + active: (enabled, total) => `${enabled}/${total} 有効`, + newCron: '新しい Cron', + createFirst: '最初の Cron を作成', + emptyDescNew: + 'Cron 式でプロンプトを実行するスケジュールを設定します。Hermes が実行して、選択した宛先に結果を送信します。', + emptyDescSearch: '検索キーワードを広げてください。', + emptyTitleNew: 'スケジュールされたジョブがまだありません', + emptyTitleSearch: '一致なし', last: '前回', next: '次回', + actionsFor: title => `${title} のアクション`, + actionsTitle: 'Cron ジョブのアクション', resume: '再開', pause: '一時停止', + resumeTitle: '再開', + pauseTitle: '一時停止', triggerNow: '今すぐ実行', + edit: 'Cron を編集', + deleteTitle: 'Cron ジョブを削除しますか?', + deleteDescPrefix: 'これにより ', + deleteDescSuffix: ' が完全に削除され、即座に実行が停止されます。', + deleting: '削除中...', + resumed: 'Cron を再開しました', + paused: 'Cron を一時停止しました', + triggered: 'Cron をトリガーしました', + deleted: 'Cron を削除しました', + created: 'Cron を作成しました', + updated: 'Cron を更新しました', + failedLoad: 'Cron ジョブの読み込みに失敗しました', + failedUpdate: 'Cron ジョブの更新に失敗しました', + failedTrigger: 'Cron ジョブのトリガーに失敗しました', + failedDelete: 'Cron ジョブの削除に失敗しました', + failedSave: 'Cron ジョブの保存に失敗しました', + editTitle: 'Cron ジョブを編集', + createTitle: '新しい Cron ジョブ', + editDesc: 'スケジュール、プロンプト、または配信先を更新します。変更は次回の実行時に適用されます。', + createDesc: + 'プロンプトを自動実行するスケジュールを設定します。Cron 構文または「15 分ごと」などのフレーズを使用します。', + nameLabel: '名前', namePlaceholder: '例: 日次サマリー', - promptPlaceholder: '実行ごとにエージェントが行う内容は?' + promptLabel: 'プロンプト', + promptPlaceholder: '実行ごとにエージェントが行う内容は?', + frequencyLabel: '頻度', + deliverLabel: '配信先', + customScheduleLabel: 'カスタムスケジュール', + customPlaceholder: '0 9 * * * または weekdays at 9am', + customHint: 'Cron 式、または「every hour」「weekdays at 9am」のようなフレーズ。', + optional: '省略可能', + promptScheduleRequired: 'プロンプトとスケジュールは必須です。', + saveChanges: '変更を保存', + createAction: 'Cron を作成' + }, + + artifacts: { + search: 'アーティファクトを検索...', + refresh: 'アーティファクトを更新', + refreshing: 'アーティファクトを更新中', + indexing: '最近のセッションのアーティファクトをインデックス中', + tabAll: 'すべて', + tabImages: '画像', + tabFiles: 'ファイル', + tabLinks: 'リンク', + noArtifactsTitle: 'アーティファクトが見つかりません', + noArtifactsDesc: 'セッションで生成された画像やファイルの出力がここに表示されます。', + failedLoad: 'アーティファクトの読み込みに失敗しました', + openFailed: '開くことができませんでした', + itemsImage: '画像', + itemsLink: 'リンク', + itemsFile: 'ファイル', + itemsGeneric: '項目', + zero: '0', + rangeOf: (start, end, total) => `${total} 件中 ${start}-${end}`, + goToPage: (itemLabel, page) => `${itemLabel} ページ ${page} に移動`, + colTitleLink: 'リンクタイトル', + colTitleFile: '名前', + colTitleDefault: 'タイトル / 名前', + colLocationLink: 'URL', + colLocationFile: 'パス', + colLocationDefault: '場所', + colSession: 'セッション', + kindImage: '画像', + kindFile: 'ファイル', + kindLink: 'リンク', + chat: 'チャット', + copyUrl: 'URL をコピー', + copyPath: 'パスをコピー' + }, + + sidebar: { + nav: { + 'new-session': '新しいセッション', + skills: 'スキルとツール', + messaging: 'メッセージング', + artifacts: 'アーティファクト' + }, + searchAria: 'セッションを検索', + searchPlaceholder: 'セッションを検索…', + clearSearch: '検索をクリア', + noMatch: query => `"${query}" に一致するセッションがありません。`, + results: '結果', + pinned: 'ピン留め', + sessions: 'セッション', + groupAriaGrouped: 'セッションを単一リストとして表示', + groupAriaUngrouped: 'ワークスペースごとにセッションをグループ化', + groupTitleGrouped: 'セッションのグループ化を解除', + groupTitleUngrouped: 'ワークスペースでグループ化', + allPinned: 'ここにあるものはすべてピン留めされています。チャットのピン留めを解除すると最近のものに表示されます。', + shiftClickHint: 'Shift クリックでピン留め · ドラッグで並べ替え', + noWorkspace: 'ワークスペースなし', + newSessionIn: label => `${label} で新しいセッション`, + reorderWorkspace: label => `ワークスペース ${label} を並べ替え`, + showMoreIn: (count, label) => `${label} でさらに ${count} 件を表示`, + loading: '読み込み中…', + loadMore: 'さらに読み込む', + loadCount: step => `さらに ${step} 件を読み込む`, + row: { + pin: 'ピン留め', + unpin: 'ピン留めを解除', + copyId: 'ID をコピー', + export: 'エクスポート', + rename: '名前を変更', + archive: 'アーカイブ', + copyIdFailed: 'セッション ID をコピーできませんでした', + actionsFor: title => `${title} のアクション`, + sessionActions: 'セッションアクション', + sessionRunning: 'セッション実行中', + needsInput: '入力が必要です', + waitingForAnswer: '回答を待っています', + renamed: '名前を変更しました', + renameFailed: '名前の変更に失敗しました', + renameTitle: 'セッションの名前を変更', + renameDesc: 'このチャットにわかりやすいタイトルをつけてください。空欄にするとクリアされます。', + untitledPlaceholder: '無題のセッション', + ageNow: 'たった今', + ageDay: '日', + ageHour: '時間', + ageMin: '分' + } + }, + + composer: { + message: 'メッセージ', + wakingProfile: profile => `${profile} を起動中…`, + placeholderStarting: 'Hermes を起動中...', + placeholderReconnecting: 'Hermes に再接続中…', + placeholderFollowUp: 'フォローアップを送信', + newSessionPlaceholders: [ + '何を作りますか?', + 'Hermes にタスクを与える', + '何か考えていることはありますか?', + '必要なことを説明してください', + '何に取り組みますか?', + '何でも聞いてください', + '目標から始める' + ], + followUpPlaceholders: [ + 'フォローアップを送信', + 'さらにコンテキストを追加', + 'リクエストを改善', + '次は何ですか?', + '続けましょう', + 'さらに進める', + '調整または続行' + ], + startVoice: '音声会話を開始', + queueMessage: 'メッセージをキューに入れる', + stop: '停止', + send: '送信', + speaking: '話しています', + transcribing: '文字起こし中', + thinking: '考え中', + muted: 'ミュート', + listening: '聴いています', + muteMic: 'マイクをミュート', + unmuteMic: 'マイクのミュートを解除', + stopListening: '聴き取りを停止して送信', + stopShort: '停止', + endConversation: '音声会話を終了', + endShort: '終了', + stopDictation: '口述を停止', + transcribingDictation: '口述を文字起こし中', + voiceDictation: '音声口述', + lookupLoading: '検索中…', + lookupNoMatches: '一致なし。', + lookupTry: '試す', + lookupOr: 'または', + commonCommands: '一般的なコマンド', + hotkeys: 'ホットキー', + helpFooter: 'フルパネルを開く · Backspace で閉じる', + commandDescs: { + '/help': 'コマンドとホットキーの全リスト', + '/clear': '新しいセッションを開始', + '/resume': '以前のセッションを再開', + '/details': 'トランスクリプトの詳細レベルを制御', + '/copy': '選択または最後のアシスタントメッセージをコピー', + '/quit': 'hermes を終了' + }, + hotkeyDescs: { + '@': 'ファイル、フォルダー、URL、Git を参照', + '/': 'スラッシュコマンドパレット', + '?': 'クイックヘルプ(削除で閉じる)', + Enter: '送信 · 改行は Shift+Enter', + 'Cmd/Ctrl+K': '次のキュー済みターンを送信', + 'Cmd/Ctrl+L': '再描画', + Esc: 'ポップオーバーを閉じる · 実行をキャンセル', + '↑ / ↓': 'ポップオーバー / 履歴を切り替え' + }, + attachUrlTitle: 'URL を添付', + attachUrlDesc: 'Hermes がページを取得し、このターンのコンテキストとして含めます。', + urlPlaceholder: 'https://example.com/post', + urlHintPre: '完全な URL を入力してください。例: ', + attach: '添付', + queued: count => `${count} 件キュー済み`, + attachmentOnly: '添付のみのターン', + emptyTurn: '空のターン', + attachments: count => `${count} 件の添付`, + editingInComposer: 'コンポーザーで編集中', + editingQueuedInComposer: 'コンポーザーでキュー済みターンを編集中', + editQueued: 'キュー済みターンを編集', + sendQueuedNow: 'キュー済みターンを今すぐ送信', + deleteQueued: 'キュー済みターンを削除', + previewUnavailable: 'プレビューは利用できません', + previewLabel: label => `${label} のプレビュー`, + couldNotPreview: label => `${label} をプレビューできませんでした`, + removeAttachment: label => `${label} を削除`, + dictating: '口述中', + preparingAudio: '音声を準備中', + speakingResponse: '応答を読み上げ中', + readingAloud: '読み上げ中', + themeSuggestions: 'デスクトップテーマの候補', + noMatchingThemes: '一致するテーマがありません。', + themeTryPre: '試してみる: ', + themeTryPost: '。', + attachLabel: '添付', + files: 'ファイル…', + folder: 'フォルダー…', + images: '画像…', + pasteImage: '画像を貼り付け', + url: 'URL…', + promptSnippets: 'プロンプトスニペット…', + tipPre: 'ヒント: ', + tipPost: ' と入力してファイルをインラインで参照。', + snippetsTitle: 'プロンプトスニペット', + snippetsDesc: 'スターターのプロンプトをコンポーザーに挿入します。', + dropFiles: 'ファイルをドロップして添付', + dropSession: 'ドロップしてこのチャットをリンク', + snippets: { + codeReview: { + label: 'コードレビュー', + description: '回帰、エッジケースの欠落、テストの欠如を確認します。', + text: 'バグ、回帰、テストの欠如を確認してください。' + }, + implementationPlan: { + label: '実装計画', + description: 'コードに手をつける前にアプローチを概説して、差分を集中させます。', + text: 'コードを変更する前に簡潔な実装計画を立ててください。' + }, + explainThis: { + label: 'これを説明する', + description: '選択したコードがどのように機能するかを説明し、主要なファイルにリンクします。', + text: 'これがどのように機能するか説明し、主要なファイルを教えてください。' + } + } + }, + + updates: { + stages: { + idle: '準備中…', + prepare: '準備中…', + fetch: 'ダウンロード中…', + pull: 'もうすぐ完了…', + pydeps: '仕上げ中…', + restart: 'Hermes を再起動中…', + manual: 'ターミナルから更新', + error: '更新が一時停止中' + }, + checking: '更新を確認中…', + checkFailedTitle: '更新を確認できませんでした', + tryAgain: '再試行', + notAvailableTitle: '更新は利用できません', + unsupportedMessage: 'このバージョンの Hermes はアプリ内から自分を更新できません。', + connectionRetry: '接続を確認してもう一度試してください。', + latestBody: '最新バージョンを実行しています。', + allSetTitle: '準備完了', + availableTitle: '新しい更新が利用可能', + availableBody: '新しいバージョンの Hermes をインストールする準備ができています。', + updateNow: '今すぐ更新', + maybeLater: '後で', + moreChanges: count => `さらに ${count} 件の変更が含まれています。`, + manualTitle: 'ターミナルから更新', + manualBody: + 'Hermes をコマンドラインからインストールしたため、更新もそこで実行されます。これをターミナルに貼り付けてください:', + manualPickedUp: 'Hermes は次回起動時に新しいバージョンを読み込みます。', + copy: 'コピー', + copied: 'コピーしました', + done: '完了', + applyingBody: 'Hermes アップデーターが独自のウィンドウで引き継ぎ、完了後に Hermes を再度開きます。', + applyingClose: 'Hermes は更新を適用するために閉じます。', + errorTitle: '更新が完了しませんでした', + errorBody: 'ご安心ください。何も失われていません。今すぐ再試行できます。', + notNow: '今は後で' + }, + + install: { + stageStates: { + pending: '待機中', + running: 'インストール中', + succeeded: '完了', + skipped: 'スキップ', + failed: '失敗' + }, + oneTimeTitle: 'Hermes には一度限りのインストールが必要です', + unsupportedDesc: platform => + `${platform} では自動の初回インストールはまだ利用できません。ターミナルを開いて以下のコマンドを実行し、このアプリを再起動してください。以降の起動ではこの手順はスキップされます。`, + installCommand: 'インストールコマンド', + copyCommand: 'コマンドをコピー', + viewDocs: 'インストールドキュメントを見る', + installTo: 'インストール先', + retryAfterRun: '実行しました — 再試行', + failedTitle: 'インストールに失敗しました', + settingUpTitle: 'Hermes Agent を設定中', + finishingTitle: '仕上げ中', + failedDesc: + 'インストール手順のいずれかが失敗しました。Windows では、別の Hermes CLI またはデスクトップインスタンスが実行中の場合に発生することがあります。実行中の Hermes インスタンスをすべて停止してから再試行してください。詳細は以下またはデスクトップログで確認できます。', + activeDesc: + 'これは一回限りのセットアップです。Hermes インストーラーが依存関係をダウンロードしてマシンを設定しています。以降の起動ではこの手順はスキップされます。', + progress: (completed, total) => `${total} ステップ中 ${completed} 完了`, + currentStage: stage => ` — 現在: ${stage}`, + fetchingManifest: 'インストーラーマニフェストを取得中...', + error: 'エラー', + hideOutput: 'インストーラーの出力を非表示', + showOutput: 'インストーラーの出力を表示', + lines: count => `${count} 行`, + noOutput: 'まだ出力がありません。', + cancelling: 'キャンセル中...', + cancelInstall: 'インストールをキャンセル', + transcriptSaved: 'フルトランスクリプトを保存しました:', + copiedOutput: 'コピーしました!', + copyOutput: '出力をコピー', + reloadRetry: '再読み込みして再試行' + }, + + onboarding: { + headerTitle: 'Hermes Agent のセットアップをしましょう', + headerDesc: 'チャットを始めるにはモデルプロバイダーを接続してください。ほとんどのオプションはワンクリックです。', + preparingInstall: 'Hermes はインストールを完了中です。初回実行では通常 1 分以内に完了します。', + starting: 'Hermes を起動中…', + lookingUpProviders: 'プロバイダーを検索中...', + collapse: '折りたたむ', + otherProviders: 'その他のプロバイダー', + haveApiKey: 'API キーをお持ちです', + chooseLater: '後でプロバイダーを選択します', + recommended: '推奨', + connected: '接続済み', + featuredPitch: '1 つのサブスクリプションで 300 以上の最先端モデル — Hermes を実行するための推奨方法', + openRouterPitch: '1 つのキーで数百のモデル — 堅実なデフォルト', + apiKeyOptions: { + openrouter: { + short: '1 つのキーで多くのモデル', + description: '1 つのキーで数百のモデルをホスト。新規インストールのデフォルトとして最適。' + }, + openai: { short: 'GPT クラスのモデル', description: 'OpenAI モデルへの直接アクセス。' }, + gemini: { short: 'Gemini モデル', description: 'Google Gemini モデルへの直接アクセス。' }, + xai: { short: 'Grok モデル', description: 'xAI Grok モデルへの直接アクセス。' }, + local: { + short: 'セルフホスト', + description: + 'ローカルまたはセルフホストの OpenAI 互換エンドポイント(vLLM、llama.cpp、Ollama など)に Hermes を接続。' + } + }, + backToSignIn: 'サインインに戻る', + getKey: 'キーを取得', + replaceCurrent: '現在の値を置き換え', + pasteApiKey: 'API キーを貼り付け', + couldNotSave: '認証情報を保存できませんでした。', + connecting: '接続中', + update: '更新', + flowSubtitles: { + pkce: 'ブラウザーを開いてサインインし、ここに戻ります', + device_code: 'ブラウザーで確認ページを開きます — Hermes が自動接続します', + loopback: 'サインインのためブラウザーを開きます — Hermes が自動接続します', + external: 'ターミナルで一度サインインして、チャットに戻ります' + }, + startingSignIn: provider => `${provider} のサインインを開始中...`, + verifyingCode: provider => `${provider} でコードを確認中...`, + connectedProvider: provider => `${provider} が接続されました。`, + connectedPicking: provider => `${provider} が接続されました。デフォルトモデルを選択中...`, + signInFailed: 'サインインに失敗しました。再試行してください。', + pickDifferentProvider: '別のプロバイダーを選択', + signInWith: provider => `${provider} でサインイン`, + openedBrowser: provider => `${provider} をブラウザーで開きました。`, + authorizeThere: 'そこで Hermes を承認してください。', + copyAuthCode: '認証コードをコピーして以下に貼り付けてください。', + pasteAuthCode: '認証コードを貼り付け', + reopenAuthPage: '認証ページを再度開く', + autoBrowser: provider => + `${provider} をブラウザーで開きました。Hermes をそこで承認すれば自動接続されます。コピーや貼り付けは不要です。`, + reopenSignInPage: 'サインインページを再度開く', + waitingAuthorize: '承認を待っています...', + externalPending: provider => + `${provider} は独自の CLI からサインインします。ターミナルでこのコマンドを実行してから、戻って「サインインしました」を選択してください:`, + signedIn: 'サインインしました', + deviceCodeOpened: provider => `${provider} をブラウザーで開きました。そこにこのコードを入力してください:`, + reopenVerification: '確認ページを再度開く', + copy: 'コピー', + defaultModel: 'デフォルトモデル', + freeTier: '無料プラン', + pro: 'Pro', + free: '無料', + price: (input, output) => `${input} 入力 / ${output} 出力 per Mtok`, + change: '変更', + startChatting: 'チャットを始める', + docs: provider => `${provider} ドキュメント` + }, + + modelPicker: { + title: 'モデルを切り替え', + current: '現在:', + unknown: '(不明)', + search: 'プロバイダーとモデルをフィルター...', + noModels: 'モデルが見つかりません。', + persistGlobalSession: 'グローバルに保持(それ以外はこのセッションのみ)', + persistGlobal: 'グローバルに保持', + addProvider: 'プロバイダーを追加', + loadFailed: 'モデルを読み込めませんでした', + noAuthenticatedProviders: '認証済みプロバイダーがありません。', + pro: 'Pro', + proNeedsSubscription: 'Pro モデルには有料の Nous サブスクリプションが必要です。', + free: '無料', + freeTier: '無料プラン', + priceTitle: '100 万トークンあたりの入力/出力価格' + }, + + modelVisibility: { + title: 'モデル', + search: 'モデルを検索', + noAuthenticatedProviders: '認証済みプロバイダーがありません。', + addProvider: 'プロバイダーを追加…' + }, + + shell: { + windowControls: 'ウィンドウコントロール', + paneControls: 'ペインコントロール', + appControls: 'アプリコントロール', + modelMenu: { + search: 'モデルを検索', + noModels: 'モデルが見つかりません', + editModels: 'モデルを編集…', + fast: '高速', + medium: '中' + }, + modelOptions: { + noOptions: 'このモデルにはオプションがありません', + options: 'オプション', + thinking: '思考', + fast: '高速', + effort: '努力度', + minimal: '最小', + low: '低', + medium: '中', + high: '高', + max: '最大', + updateFailed: 'モデルオプションの更新に失敗しました', + fastFailed: '高速モードの更新に失敗しました' + }, + gatewayMenu: { + gateway: 'ゲートウェイ', + connected: '接続済み', + connecting: '接続中', + offline: 'オフライン', + inferenceReady: '推論準備完了', + inferenceNotReady: '推論準備未完了', + checkingInference: '推論を確認中', + disconnected: '切断済み', + openSystem: 'システムパネルを開く', + connection: label => `接続: ${label}`, + recentActivity: '最近のアクティビティ', + viewAllLogs: 'すべてのログを見る →', + messagingPlatforms: 'メッセージングプラットフォーム' + }, + statusbar: { + unknown: '不明', + restart: '再起動', + update: '更新', + updateInProgress: '更新中', + commitsBehind: (count, branch) => `${branch} より ${count} コミット遅れています`, + desktopVersion: version => `Hermes Desktop v${version}`, + commit: sha => `コミット ${sha}`, + branch: branch => `ブランチ ${branch}`, + closeCommandCenter: 'コマンドセンターを閉じる', + openCommandCenter: 'コマンドセンターを開く', + gateway: 'ゲートウェイ', + gatewayReady: '準備完了', + gatewayNeedsSetup: '設定が必要', + gatewayChecking: '確認中', + gatewayConnecting: '接続中', + gatewayOffline: 'オフライン', + gatewayTitle: 'Hermes 推論ゲートウェイのステータス', + agents: 'エージェント', + closeAgents: 'エージェントを閉じる', + openAgents: 'エージェントを開く', + subagents: count => `${count} サブエージェント`, + failed: count => `${count} 失敗`, + running: count => `${count} 実行中`, + cron: 'Cron', + openCron: 'Cron ジョブを開く', + turnRunning: '実行中', + currentTurnElapsed: '現在のターン経過時間', + contextUsage: 'コンテキスト使用状況', + session: 'セッション', + runtimeSessionElapsed: 'ランタイムセッション経過時間', + yoloOn: 'YOLO オン — 危険なコマンドを自動承認中。クリックでオフに。', + yoloOff: 'YOLO オフ — クリックで危険なコマンドを自動承認。', + modelNone: 'なし', + noModel: 'モデルなし', + switchModel: 'モデルを切り替え', + openModelPicker: 'モデルピッカーを開く', + modelTitle: (provider, model) => `モデル · ${provider}: ${model}`, + providerModelTitle: (provider, model) => `${provider} · ${model}` + } + }, + + rightSidebar: { + aria: '右サイドバー', + panelsAria: '右サイドバーパネル', + files: 'ファイルシステム', + terminal: 'ターミナル', + noFolderSelected: 'フォルダーが選択されていません', + changeCwdTitle: '作業ディレクトリを変更', + folderTip: cwd => `${cwd} — クリックしてフォルダーを変更`, + openFolder: 'フォルダーを開く', + refreshTree: 'ツリーを更新', + collapseAll: 'すべてのフォルダーを折りたたむ', + previewUnavailable: 'プレビューは利用できません', + couldNotPreview: path => `${path} をプレビューできませんでした`, + noProjectTitle: 'プロジェクトなし', + noProjectBody: 'ステータスバーから作業ディレクトリを設定してファイルを閲覧してください。', + unreadableTitle: '読み取り不可', + unreadableBody: error => `このフォルダーを読み取れませんでした (${error})。`, + emptyTitle: '空', + emptyBody: 'このフォルダーは空です。', + treeErrorTitle: 'ツリーエラー', + treeErrorBody: 'ファイルツリーがこのフォルダーのレンダリング中にエラーが発生しました。', + tryAgain: '再試行', + loadingTree: 'ファイルツリーを読み込み中', + loadingFiles: 'ファイルを読み込み中', + terminalFocus: 'ターミナルビューにフォーカス', + terminalSplit: '分割ビューに戻る', + addToChat: 'チャットに追加' + }, + + preview: { + tab: 'プレビュー', + closeTab: label => `${label} を閉じる`, + closePane: 'プレビューペインを閉じる', + loading: 'プレビューを読み込み中', + unavailable: 'プレビューは利用できません', + opening: '開いています...', + hide: '非表示', + openPreview: 'プレビューを開く', + sourceLineTitle: 'クリックして選択 · Shift クリックで拡張 · コンポーザーにドラッグ', + source: 'ソース', + renderedPreview: 'プレビュー', + unknownSize: 'サイズ不明', + binaryTitle: 'これはバイナリファイルのようです', + binaryBody: label => `${label} をプレビューすると読み取り不能なテキストが表示される場合があります。`, + largeTitle: 'このファイルは大きいです', + largeBody: (label, size) => `${label} は ${size} です。Hermes は最初の 512 KB のみを表示します。`, + previewAnyway: 'とにかくプレビュー', + truncated: '最初の 512 KB を表示しています。', + noInlineTitle: 'インラインプレビューなし', + noInlineBody: mimeType => `${mimeType || 'このファイルタイプ'} はコンテキストとして添付できます。`, + console: { + deselect: 'エントリーの選択を解除', + select: 'エントリーを選択', + copyFailed: 'コンソール出力をコピーできませんでした', + copyEntry: 'このエントリーをコピー', + sendEntry: 'このエントリーをチャットに送信', + messages: count => `${count} 件のコンソールメッセージ`, + resize: 'プレビューコンソールのサイズ変更', + title: 'プレビューコンソール', + selected: count => `${count} 件選択`, + sendToChat: 'チャットに送信', + copySelected: '選択をクリップボードにコピー', + copyAll: 'すべてをクリップボードにコピー', + copy: 'コピー', + clear: 'クリア', + empty: 'コンソールメッセージはまだありません。', + promptHeader: 'プレビューコンソール:', + sentTitle: 'チャットに送信しました', + sentMessage: count => `${count} 件のログエントリーがコンポーザーに追加されました` + }, + web: { + appFailedToBoot: 'プレビューアプリの起動に失敗しました', + serverNotFound: 'サーバーが見つかりません', + failedToLoad: 'プレビューの読み込みに失敗しました', + tryAgain: '再試行', + restarting: 'Hermes を再起動中...', + askRestart: 'Hermes にサーバーの再起動を依頼', + lookingRestart: taskId => `Hermes は再起動するプレビューサーバーを検索中です (${taskId})`, + restartingTitle: 'プレビューサーバーを再起動中', + restartingMessage: 'Hermes はバックグラウンドで作業中です。進捗はプレビューコンソールで確認してください。', + startRestartFailed: message => `サーバー再起動を開始できませんでした: ${message}`, + restartFailed: 'サーバーの再起動に失敗しました', + hideConsole: 'プレビューコンソールを非表示', + showConsole: 'プレビューコンソールを表示', + hideDevTools: 'プレビュー DevTools を非表示', + openDevTools: 'プレビュー DevTools を開く', + finishedRestarting: message => + `Hermes がプレビューサーバーの再起動を完了しました${message ? `: ${message}` : ''}`, + failedRestarting: message => `サーバーの再起動に失敗しました: ${message}`, + unknownError: '不明なエラー', + restartedTitle: 'プレビューサーバーが再起動しました', + reloadingNow: 'プレビューを再読み込み中です。', + restartFailedTitle: 'プレビューの再起動に失敗しました', + restartFailedMessage: 'Hermes がサーバーを再起動できませんでした。', + stillWorking: + 'Hermes はまだ作業中ですが、再起動の結果がまだ届いていません。サーバーコマンドがフォアグラウンドで実行されている可能性があります。', + workspaceReloading: 'ワークスペースが変更され、プレビューを再読み込み中', + fileChanged: url => `ファイルが変更され、プレビューを再読み込み中: ${url}`, + filesChanged: (count, url) => `${count} 件のファイルが変更され、プレビューを再読み込み中: ${url}`, + watchFailed: message => `プレビューファイルを監視できませんでした: ${message}`, + moduleMimeDescription: + 'モジュールスクリプトが間違った MIME タイプで提供されています。通常、静的ファイルサーバーがプロジェクトの開発サーバーの代わりに Vite/React アプリを提供していることを意味します。', + loadFailedConsole: (code, message) => `読み込みに失敗しました${code ? ` (${code})` : ''}: ${message}`, + unreachableDescription: 'プレビューページに到達できませんでした。', + openTarget: url => `${url} を開く`, + fallbackTitle: 'プレビュー' + } + }, + + assistant: { + thread: { + loadingSession: 'セッションを読み込み中', + loadingResponse: 'Hermes が応答を読み込み中', + thinking: '考え中', + today: time => `今日 ${time}`, + yesterday: time => `昨日 ${time}`, + copy: 'コピー', + refresh: '更新', + moreActions: 'その他のアクション', + branchNewChat: '新しいチャットでブランチ', + readAloudFailed: '読み上げに失敗しました', + preparingAudio: '音声を準備中...', + stopReading: '読み上げを停止', + readAloud: '読み上げ', + editMessage: 'メッセージを編集', + stop: '停止', + editableCheckpoint: '編集可能なチェックポイント', + restorePrevious: '前のチェックポイントに戻す', + restoreCheckpoint: 'チェックポイントを復元', + restoreNext: '次のチェックポイントに戻す', + goForward: '進む', + sendEdited: '編集済みメッセージを送信' + }, + approval: { + gatewayDisconnected: 'Hermes ゲートウェイが接続されていません', + sendFailed: '承認応答を送信できませんでした', + run: '実行', + moreOptions: 'その他の承認オプション', + allowSession: 'このセッションで許可', + alwaysAllowMenu: '常に許可…', + reject: '拒否', + alwaysTitle: 'このコマンドを常に許可しますか?', + alwaysDescription: pattern => + `これにより "${pattern}" パターンが永続的な許可リスト (~/.hermes/config.yaml) に追加されます。Hermes はこのセッションや将来のセッションで、このようなコマンドについて再度尋ねません。`, + alwaysAllow: '常に許可' + }, + clarify: { + notReady: '明確化リクエストはまだ準備できていません', + gatewayDisconnected: 'Hermes ゲートウェイが接続されていません', + sendFailed: '明確化応答を送信できませんでした', + loadingQuestion: '質問を読み込み中…', + other: 'その他(回答を入力)', + placeholder: '回答を入力…', + shortcut: '⌘/Ctrl + Enter で送信', + back: '戻る', + skip: 'スキップ', + send: '送信' + }, + tool: { + code: 'コード', + copyCode: 'コードをコピー', + renderingImage: '画像をレンダリング中', + copyOutput: '出力をコピー', + copyCommand: 'コマンドをコピー', + copyContent: 'コンテンツをコピー', + copyUrl: 'URL をコピー', + copyResults: '結果をコピー', + copyQuery: 'クエリをコピー', + copyFile: 'ファイルをコピー', + copyPath: 'パスをコピー', + outputAlt: 'ツール出力', + rawResponse: '生の応答', + copyActivity: 'アクティビティをコピー', + recoveredOne: '1 つの失敗したステップの後に回復しました', + recoveredMany: count => `${count} つの失敗したステップの後に回復しました`, + failedOne: '1 つのステップが失敗しました', + failedMany: count => `${count} つのステップが失敗しました`, + statusRunning: '実行中', + statusError: 'エラー', + statusRecovered: '回復しました', + statusDone: '完了' + } + }, + + prompts: { + gatewayDisconnected: 'Hermes ゲートウェイが接続されていません', + sudoSendFailed: 'sudo パスワードを送信できませんでした', + secretSendFailed: 'シークレットを送信できませんでした', + sudoTitle: '管理者パスワード', + sudoDesc: + 'Hermes は特権コマンドを実行するために sudo パスワードが必要です。ローカルエージェントにのみ送信されます。', + sudoPlaceholder: 'sudo パスワード', + secretTitle: 'シークレットが必要です', + secretDesc: 'Hermes は続行するための認証情報が必要です。', + secretPlaceholder: 'シークレット値' + }, + + desktop: { + audioReadFailed: '録音した音声を読み取れませんでした', + sessionUnavailable: 'セッションが利用できません', + createSessionFailed: '新しいセッションを作成できませんでした', + promptFailed: 'プロンプトに失敗しました', + providerCredentialRequired: '最初のメッセージを送信する前にプロバイダー認証情報を追加してください。', + emptySlashCommand: '空のスラッシュコマンド', + desktopCommands: 'デスクトップコマンド', + skillCommandsAvailable: count => `${count} 件のスキルコマンドが利用可能です。`, + warningLine: message => `警告: ${message}`, + yoloArmed: 'このチャットでは YOLO が有効になっています', + yoloOff: 'YOLO オフ', + yoloSystem: active => `このセッションの YOLO ${active ? 'オン' : 'オフ'}`, + yoloTitle: 'YOLO', + yoloToggleFailed: 'YOLO を切り替えられませんでした', + profileStatus: current => + `プロファイル: ${current}。/profile または「新しいセッション」ピッカーを使って別のプロファイルでチャットを始めてください。`, + unknownProfile: '不明なプロファイル', + noProfileNamed: (target, available) => `"${target}" という名前のプロファイルはありません。利用可能: ${available}`, + newChatsProfile: name => `新しいチャットはプロファイル ${name} を使用します。`, + setProfileFailed: 'プロファイルの設定に失敗しました', + sttDisabled: '音声認識は設定で無効になっています。', + stopFailed: '停止に失敗しました', + regenerateFailed: '再生成に失敗しました', + editFailed: '編集に失敗しました', + resumeFailed: '再開に失敗しました', + nothingToBranch: 'ブランチするものがありません', + branchNeedsChat: 'ブランチする前にチャットを開始または再開してください。', + sessionBusy: 'セッションが使用中', + branchStopCurrent: 'このチャットをブランチする前に現在のターンを停止してください。', + branchNoText: 'このメッセージにはブランチするテキストがありません。', + branchTitle: 'ブランチ', + branchFailed: 'ブランチに失敗しました', + deleteFailed: '削除に失敗しました', + archived: 'アーカイブしました', + archiveFailed: 'アーカイブに失敗しました', + cwdChangeFailed: '作業ディレクトリの変更に失敗しました', + cwdStagedTitle: '作業ディレクトリがステージングされました', + cwdStagedMessage: + 'このアクティブなセッションへの cwd の変更を適用するにはデスクトップバックエンドを再起動してください。', + modelSwitchFailed: 'モデルの切り替えに失敗しました', + sessionExported: 'セッションをエクスポートしました', + sessionExportFailed: 'セッションをエクスポートできませんでした', + imageSaved: '画像を保存しました', + downloadStarted: 'ダウンロードを開始しました', + restartToUseSaveImage: '画像を保存するには Hermes Desktop を再起動してください。', + restartToSaveImages: '画像を保存するには Hermes Desktop を再起動してください', + imageDownloadFailed: '画像のダウンロードに失敗しました', + openImage: '画像を開く', + downloadImage: '画像をダウンロード', + savingImage: '画像を保存中', + imagePreviewFailed: '画像のプレビューに失敗しました', + imageAttach: '画像を添付', + imageWriteFailed: '画像のディスクへの書き込みに失敗しました。', + imageAttachFailed: '画像の添付に失敗しました', + attachImages: '画像を添付', + clipboard: 'クリップボード', + noClipboardImage: 'クリップボードに画像が見つかりません', + clipboardPasteFailed: 'クリップボードからの貼り付けに失敗しました', + dropFiles: 'ファイルをドロップ' + }, + + errors: { + genericFailure: '問題が発生しました', + boundaryTitle: 'インターフェイスで問題が発生しました', + boundaryDesc: 'ビューで予期しないエラーが発生しました。チャットと設定は安全です。', + reloadWindow: 'ウィンドウを再読み込み', + openLogs: 'ログを開く' + }, + + ui: { + search: { + clear: '検索をクリア' + }, + pagination: { + label: 'ページング', + previous: '前へ', + previousAria: '前のページへ', + next: '次へ', + nextAria: '次のページへ' + }, + sidebar: { + title: 'サイドバー', + description: 'モバイルサイドバーを表示します。', + toggle: 'サイドバーを切り替え' + } } }) diff --git a/apps/desktop/src/i18n/zh-hant.ts b/apps/desktop/src/i18n/zh-hant.ts index d6d1b8c8b12..dac65ca5d3a 100644 --- a/apps/desktop/src/i18n/zh-hant.ts +++ b/apps/desktop/src/i18n/zh-hant.ts @@ -4,18 +4,146 @@ import { defineLocale } from './define-locale' export const zhHant = defineLocale({ common: { + apply: '套用', + back: '返回', save: '儲存', saving: '儲存中…', cancel: '取消', + change: '變更', + choose: '選擇', + clear: '清除', close: '關閉', + collapse: '收合', confirm: '確認', + connect: '連線', + connecting: '連線中', + continue: '繼續', + copied: '已複製', + copy: '複製', + copyFailed: '複製失敗', delete: '刪除', + docs: '文件', + done: '完成', + error: '錯誤', + failed: '失敗', + free: '免費', + loading: '載入中…', + notSet: '未設定', refresh: '重新整理', + remove: '移除', + replace: '取代', retry: '重試', + run: '執行', + send: '傳送', + set: '設定', + skip: '略過', + update: '更新', on: '開啟', off: '關閉' }, + boot: { + ready: 'Hermes Desktop 已就緒', + desktopBootFailedWithMessage: message => `桌面啟動失敗:${message}`, + steps: { + connectingGateway: '正在連線桌面閘道', + loadingSettings: '正在載入 Hermes 設定', + loadingSessions: '正在載入最近工作階段', + startingDesktopConnection: '正在啟動桌面連線', + startingHermesDesktop: '正在啟動 Hermes Desktop…' + }, + errors: { + backgroundExited: 'Hermes 背景程序已結束。', + backgroundExitedDuringStartup: 'Hermes 背景程序在啟動期間結束。', + backendStopped: '後端已停止', + desktopBootFailed: '桌面啟動失敗', + gatewaySignInRequired: '需要閘道登入', + ipcBridgeUnavailable: '桌面 IPC 橋接器不可用。' + }, + failure: { + title: 'Hermes 無法啟動', + description: '背景閘道未啟動。請嘗試下面的復原步驟。這裡的操作不會刪除您的聊天或設定。', + remoteTitle: '需要重新登入遠端閘道', + remoteDescription: '您的遠端閘道工作階段已過期。請重新登入以重新連線。這裡的操作不會刪除您的聊天或設定。', + retry: '重試', + repairInstall: '修復安裝', + useLocalGateway: '使用本機閘道', + openLogs: '開啟記錄', + repairHint: '修復會重新執行安裝程式,在新機器上可能需要幾分鐘。', + remoteSignInHint: '開啟閘道登入視窗。使用本機閘道可切換至內建後端。', + hideRecentLogs: '隱藏最近記錄', + showRecentLogs: '顯示最近記錄', + signedInTitle: '已登入', + signedInMessage: '正在重新連線至遠端閘道…', + signInIncompleteTitle: '登入未完成', + signInIncompleteMessage: '登入視窗在驗證完成前關閉。', + signInFailed: '登入失敗', + signInToRemoteGateway: '登入遠端閘道', + signInWithProvider: provider => `使用 ${provider} 登入`, + identityProvider: '您的身分提供方' + } + }, + + notifications: { + region: '通知', + hide: '隱藏', + show: '顯示', + more: count => `另外 ${count} 則通知`, + clearAll: '全部清除', + dismiss: '關閉通知', + details: '詳細資訊', + copyDetail: '複製詳情', + copyDetailFailed: '無法複製通知詳情', + backendOutOfDateTitle: '後端版本過舊', + backendOutOfDateMessage: '您的 Hermes 後端早於目前的桌面版本,可能無法正常運作。請更新以保持一致。', + updateHermes: '更新 Hermes', + updateReadyTitle: '有可用更新', + updateReadyMessage: count => `有 ${count} 項新變更可用。`, + seeWhatsNew: '查看新增內容', + errors: { + elevenLabsNeedsKey: 'ElevenLabs STT 需要 ELEVENLABS_API_KEY。', + elevenLabsRejectedKey: 'ElevenLabs 拒絕了該 API 金鑰 (401)。', + methodNotAllowed: '桌面後端拒絕了該請求 (405 Method Not Allowed)。請嘗試重新啟動 Hermes Desktop。', + microphonePermission: '麥克風權限已被拒絕。', + openaiRejectedApiKey: 'OpenAI 拒絕了該 API 金鑰。', + openaiRejectedApiKeyWithStatus: status => `OpenAI 拒絕了該 API 金鑰 (${status} invalid_api_key)。`, + openaiTtsNeedsKey: 'OpenAI TTS 需要 VOICE_TOOLS_OPENAI_KEY 或 OPENAI_API_KEY。' + }, + voice: { + configureSpeechToText: '設定語音轉文字後即可使用語音模式。', + couldNotStartSession: '無法啟動語音工作階段', + microphoneAccessDenied: '麥克風存取被拒絕。', + microphoneConstraintsUnsupported: '此裝置不支援目前的麥克風限制條件。', + microphoneFailed: '麥克風發生錯誤', + microphoneInUse: '麥克風正被其他應用程式使用中。', + microphonePermissionDenied: '麥克風權限被拒絕。', + microphoneStartFailed: '無法開始麥克風錄音。', + microphoneUnsupported: '目前執行環境不支援麥克風錄音。', + noMicrophone: '找不到麥克風。', + noSpeechDetected: '未偵測到語音', + playbackFailed: '語音播放失敗', + recordingFailed: '語音錄製失敗', + transcriptionFailed: '語音轉寫失敗', + transcriptionUnavailable: '語音轉寫暫不可用。', + tryRecordingAgain: '請再錄製一次。', + unavailable: '語音不可用' + } + }, + + titlebar: { + hideSidebar: '隱藏側邊欄', + showSidebar: '顯示側邊欄', + search: '搜尋', + searchTitle: '搜尋工作階段、檢視和動作', + swapSidebarSides: '交換側邊欄位置', + swapSidebarSidesTitle: '交換工作階段欄和檔案瀏覽器的位置', + hideRightSidebar: '隱藏右側邊欄', + showRightSidebar: '顯示右側邊欄', + muteHaptics: '靜音觸感回饋', + unmuteHaptics: '開啟觸感回饋', + openSettings: '開啟設定' + }, + language: { label: '語言', description: '選擇桌面介面的語言。', @@ -276,37 +404,1410 @@ export const zhHant = defineLocale({ minAgo: count => `${count} 分鐘前`, hoursAgo: count => `${count} 小時前`, daysAgo: count => `${count} 天前` + }, + config: { + none: '無', + noneParen: '(無)', + notSet: '未設定', + commaSeparated: '逗號分隔的值', + loading: '正在載入 Hermes 設定...', + emptyTitle: '無可設定項目', + emptyDesc: '此區段沒有可調整的設定。', + failedLoad: '設定載入失敗', + autosaveFailed: '自動儲存失敗', + imported: '設定已匯入', + invalidJson: '設定 JSON 無效' + }, + credentials: { + pasteKey: '貼上金鑰', + pasteLabelKey: label => `貼上 ${label} 金鑰`, + optional: '選填', + enterValueFirst: '請先輸入一個值。', + couldNotSave: '無法儲存憑證。', + remove: '移除', + or: '或', + escToCancel: '按 esc 取消', + getKey: '取得金鑰', + saving: '儲存中' + }, + envActions: { + actionsFor: label => `${label} 的動作`, + credentialActions: '憑證動作', + docs: '文件', + hideValue: '隱藏值', + revealValue: '顯示值', + replace: '取代', + set: '設定', + clear: '清除' + }, + gateway: { + loading: '正在載入閘道設定...', + unavailableTitle: '閘道設定不可用', + unavailableDesc: '桌面 IPC 橋接器未公開閘道設定。', + title: '閘道連線', + envOverride: '環境變數覆寫', + intro: + 'Hermes Desktop 預設會啟動自己的本機閘道。如果您希望此應用程式控制另一台機器或可信代理後面已執行的 Hermes 後端,請使用遠端閘道。在下方按設定檔指定各自的遠端主機。', + appliesTo: '套用至', + allProfiles: '全部設定檔', + defaultConnection: '預設連線適用於所有沒有自訂覆寫的設定檔。', + profileConnection: profile => `僅當「${profile}」為作用中設定檔時使用此連線。設為本機可繼承預設連線。`, + envOverrideTitle: '環境變數正在控制此桌面工作階段。', + envOverrideDesc: + '取消設定 HERMES_DESKTOP_REMOTE_URL 和 HERMES_DESKTOP_REMOTE_TOKEN 後才會使用下方儲存的設定。', + localTitle: '本機閘道', + localDesc: '在 localhost 啟動私有 Hermes 後端。這是預設方式,可離線使用。', + remoteTitle: '遠端閘道', + remoteDesc: + '將此桌面殼層連線至遠端 Hermes 後端。託管閘道使用 OAuth 或帳號密碼;自託管閘道也可使用工作階段 Token。', + remoteUrlTitle: '遠端 URL', + remoteUrlDesc: '遠端儀表板後端的基礎 URL。支援路徑前綴,例如 /hermes。', + probing: '正在檢查此閘道的驗證方式…', + probeError: '暫時無法連線此閘道。請檢查 URL;閘道回應後將顯示驗證方式。', + signedIn: '已登入', + signIn: '登入', + signOut: '登出', + signInWith: provider => `使用 ${provider} 登入`, + authTitle: '驗證', + authSignedInPassword: '此閘道使用帳號和密碼。您已登入,工作階段會自動重新整理。', + authSignedInOauth: '此閘道使用 OAuth。您已登入,工作階段會自動重新整理。', + authNeedsPassword: '此閘道使用帳號和密碼。請登入以授權此桌面應用程式。', + authNeedsOauth: provider => `此閘道使用 OAuth。請使用 ${provider} 登入以授權此桌面應用程式。`, + tokenTitle: '工作階段 Token', + tokenDesc: '用於 REST 和 WebSocket 存取的儀表板工作階段 Token。留空則保留已儲存的 Token。', + existingToken: value => `現有 Token ${value}`, + savedToken: '已儲存', + pasteSessionToken: '貼上工作階段 Token', + testRemote: '測試遠端', + saveForRestart: '儲存至下次重新啟動', + saveAndReconnect: '儲存並重新連線', + diagnostics: '診斷', + diagnosticsDesc: '在檔案管理員中顯示 desktop.log,閘道啟動失敗時很有用。', + openLogs: '開啟記錄', + incompleteTitle: '遠端閘道設定不完整', + incompleteSignIn: '切換至遠端前,請輸入遠端 URL 並完成登入。', + incompleteToken: '切換至遠端前,請輸入遠端 URL 和工作階段 Token。', + incompleteSignInTest: '測試前,請輸入遠端 URL 並完成登入。', + incompleteTokenTest: '測試前,請輸入遠端 URL 和工作階段 Token。', + enterUrlFirst: '請先輸入遠端 URL。', + restartingTitle: '閘道連線正在重新啟動', + savedTitle: '閘道設定已儲存', + restartingMessage: 'Hermes Desktop 將使用已儲存的設定重新連線。', + savedMessage: '已儲存,下次重新啟動後生效。', + connectedTo: (baseUrl, version) => `已連線至 ${baseUrl}${version ? ` · Hermes ${version}` : ''}`, + reachableTitle: '遠端閘道可連線', + signedOutTitle: '已登出', + signedOutMessage: '已清除遠端閘道工作階段。', + failedLoad: '閘道設定載入失敗', + signInFailed: '登入失敗', + signOutFailed: '登出失敗', + testFailed: '遠端閘道測試失敗', + applyFailed: '無法套用閘道設定', + saveFailed: '無法儲存閘道設定' + }, + keys: { + loading: '正在載入 API 金鑰和憑證...', + failedLoad: 'API 金鑰載入失敗', + empty: '此類別尚未有任何設定。' + }, + mcp: { + loading: '正在載入 MCP 伺服器...', + failedLoad: 'MCP 設定載入失敗', + nameRequiredTitle: '需要名稱', + nameRequiredMessage: '請為此 MCP 伺服器提供設定鍵。', + objectRequired: '伺服器設定必須是 JSON 物件', + invalidJson: 'MCP JSON 無效', + saveFailed: '儲存失敗', + removeFailed: '移除失敗', + gatewayUnavailableTitle: '閘道不可用', + gatewayUnavailableMessage: '重新載入 MCP 前請先重新連線閘道。', + reloadedTitle: 'MCP 工具已重新載入', + reloadedMessage: '新的工具 Schema 將套用至後續回合。', + reloadFailed: 'MCP 重新載入失敗', + savedTitle: 'MCP 伺服器已儲存', + savedMessage: name => `${name} 會在 MCP 重新載入後生效。`, + newServer: '新伺服器', + reload: '重新載入 MCP', + reloading: '重新載入中...', + emptyTitle: '沒有 MCP 伺服器', + emptyDesc: '新增 stdio 或 HTTP 伺服器以公開 MCP 工具。', + disabled: '已停用', + editServer: '編輯伺服器', + name: '名稱', + serverJson: '伺服器 JSON', + remove: '移除', + saveServer: '儲存伺服器' + }, + model: { + loading: '正在載入模型設定...', + appliesDesc: '套用至新工作階段。可在輸入框的模型選擇器中臨時切換目前對話。', + provider: '提供方', + model: '模型', + applying: '套用中...', + auxiliaryTitle: '輔助模型', + resetAllToMain: '全部重設為主要模型', + auxiliaryDesc: '輔助任務預設使用主要模型。您可以為任何任務指定專用模型。', + setToMain: '設為主要模型', + change: '變更', + autoUseMain: '自動 · 使用主要模型', + providerDefault: '(提供方預設)', + tasks: { + vision: { label: '視覺', hint: '圖片分析' }, + web_extract: { label: '網頁擷取', hint: '頁面摘要' }, + compression: { label: '壓縮', hint: '上下文壓縮' }, + skills_hub: { label: '技能中心', hint: '技能搜尋' }, + approval: { label: '核准', hint: '智慧自動核准' }, + mcp: { label: 'MCP', hint: 'MCP 工具路由' }, + title_generation: { label: '標題生成', hint: '工作階段標題' }, + curator: { label: '策展器', hint: '技能使用審查' } + } + }, + providers: { + connectAccount: '連結帳號', + haveApiKey: '改用 API 金鑰?', + intro: '使用訂閱登入,無需複製 API 金鑰。Hermes 會在應用程式中為您完成瀏覽器登入。', + connected: '已連線', + collapse: '收合', + connectAnother: '連結其他提供方', + otherProviders: '其他提供方', + noProviderKeys: '沒有可用的提供方 API 金鑰。', + loading: '正在載入提供方...' + }, + sessions: { + loading: '正在載入已封存工作階段…', + archivedTitle: '已封存工作階段', + archivedIntro: + '已封存的聊天會從側邊欄隱藏,但保留全部訊息。在側邊欄 Ctrl/⌘ 點擊聊天即可封存。', + emptyArchivedTitle: '暫無封存', + emptyArchivedDesc: '封存一個聊天後會顯示在這裡。', + unarchive: '取消封存', + deletePermanently: '永久刪除', + messages: count => `${count} 則訊息`, + restored: '已還原', + deleteConfirm: title => `永久刪除「${title}」?此操作無法復原。`, + defaultDirTitle: '預設專案目錄', + defaultDirDesc: + '新工作階段預設從此資料夾開始,除非您選擇其他目錄。留空則使用您的家目錄。', + defaultDirUpdated: '預設專案目錄已更新', + defaultsTo: label => `預設使用 ${label}。`, + change: '變更', + choose: '選擇', + clear: '清除', + notSet: '未設定', + failedLoad: '無法載入已封存工作階段', + unarchiveFailed: '取消封存失敗', + deleteFailed: '刪除失敗', + updateDirFailed: '無法更新預設目錄', + clearDirFailed: '無法清除預設目錄' + }, + toolsets: { + loadingConfig: '正在載入設定', + savedTitle: '憑證已儲存', + savedMessage: key => `${key} 已更新。`, + removedTitle: '憑證已移除', + removedMessage: key => `${key} 已移除。`, + failedSave: key => `儲存 ${key} 失敗`, + failedRemove: key => `移除 ${key} 失敗`, + failedReveal: key => `顯示 ${key} 失敗`, + removeConfirm: key => `從 .env 中移除 ${key}?`, + set: '已設定', + notSet: '未設定', + selectedTitle: '已選擇提供方', + selectedMessage: provider => `${provider} 現在處於作用中狀態。`, + failedSelect: provider => `選擇 ${provider} 失敗`, + failedLoad: '工具設定載入失敗', + noProviderOptions: '此工具集沒有提供方選項;啟用後即可使用目前設定。', + noProviders: '此工具集目前沒有可用提供方。', + ready: '就緒', + nousIncluded: '包含在 Nous 訂閱中;登入 Nous Portal 即可啟用。', + noApiKeyRequired: '不需要 API 金鑰。', + postSetup: step => `此提供方需要額外設定步驟 (${step})。暫時請在 CLI 中執行 hermes tools。` } }, skills: { + tabSkills: '技能', + tabToolsets: '工具集', all: '全部', - noDescription: '無可用描述。' + searchSkills: '搜尋技能...', + searchToolsets: '搜尋工具集...', + refresh: '重新整理技能', + refreshing: '正在重新整理技能', + loading: '正在載入功能…', + noSkillsTitle: '找不到技能', + noSkillsDesc: '請嘗試更廣泛的搜尋或不同類別。', + noToolsetsTitle: '找不到工具集', + noToolsetsDesc: '請嘗試更廣泛的搜尋詞。', + noDescription: '無可用描述。', + configured: '已設定', + needsKeys: '需要金鑰', + toolsetsEnabled: (enabled, total) => `已啟用 ${enabled}/${total} 個工具集`, + configureToolset: label => `設定 ${label}`, + toggleToolset: label => `切換 ${label} 工具集`, + skillsLoadFailed: '技能載入失敗', + toolsetsRefreshFailed: '工具集重新整理失敗', + skillEnabled: '技能已啟用', + skillDisabled: '技能已停用', + toolsetEnabled: '工具集已啟用', + toolsetDisabled: '工具集已停用', + appliesToNewSessions: name => `${name} 將套用至新工作階段。`, + failedToUpdate: name => `更新 ${name} 失敗` + }, + + agents: { + close: '關閉代理', + title: '派生樹', + subtitle: '目前回合的子代理即時活動。', + emptyTitle: '暫無活躍子代理', + emptyDesc: '當某個回合派發任務時,子代理會在此即時顯示進度。', + running: '執行中', + failed: '失敗', + done: '完成', + streaming: '串流傳輸中', + files: '檔案', + moreFiles: count => `還有 ${count} 個檔案`, + delegation: index => `派發 ${index}`, + workers: count => `${count} 個工作單元`, + workersActive: count => `${count} 個活躍`, + agentsCount: count => `${count} 個代理`, + activeCount: count => `${count} 個活躍`, + failedCount: count => `${count} 個失敗`, + toolsCount: count => `${count} 個工具`, + filesCount: count => `${count} 個檔案`, + updatedAgo: age => `更新於 ${age}`, + ageNow: '剛才', + ageSeconds: seconds => `${seconds} 秒前`, + ageMinutes: minutes => `${minutes} 分鐘前`, + ageHours: hours => `${hours} 小時前`, + durationSeconds: seconds => `${seconds} 秒`, + durationMinutes: (minutes, seconds) => `${minutes} 分 ${seconds} 秒`, + tokensK: k => `${k}k 詞元`, + tokens: value => `${value} 詞元` + }, + + commandCenter: { + close: '關閉命令中心', + paletteTitle: '命令面板', + back: '返回', + searchPlaceholder: '搜尋工作階段、檢視和動作', + goTo: '前往', + commandCenter: '命令中心', + appearance: '外觀', + settings: '設定', + changeTheme: '變更主題...', + changeColorMode: '變更色彩模式...', + settingsFields: '設定欄位', + mcpServers: 'MCP 伺服器', + archivedChats: '已封存聊天', + sections: { sessions: '工作階段', system: '系統', usage: '使用量' }, + sectionDescriptions: { + sessions: '搜尋和管理工作階段', + system: '狀態、記錄和系統動作', + usage: '一段時間內的詞元、費用和技能活動' + }, + nav: { + newChat: { title: '新工作階段', detail: '開始新的工作階段' }, + settings: { title: '設定', detail: '設定 Hermes 桌面端' }, + skills: { title: '技能與工具', detail: '啟用技能、工具集和提供方' }, + messaging: { title: '訊息平台', detail: '設定 Telegram、Slack、Discord 等' }, + artifacts: { title: '成品', detail: '瀏覽產生的輸出' } + }, + sectionEntries: { + sessions: { title: '工作階段面板', detail: '搜尋、釘選和管理工作階段' }, + system: { title: '系統面板', detail: '閘道狀態、記錄、重新啟動/更新' }, + usage: { title: '使用量面板', detail: '詞元、費用和技能活動' } + }, + providerNavigate: '導覽', + providerSessions: '工作階段', + refresh: '重新整理', + refreshing: '重新整理中…', + noResults: '找不到相符的結果。', + pinSession: '釘選工作階段', + unpinSession: '取消釘選', + exportSession: '匯出工作階段', + deleteSession: '刪除工作階段', + noSessions: '暫無工作階段。', + gatewayRunning: '訊息閘道執行中', + gatewayStopped: '訊息閘道已停止', + hermesActiveSessions: (version, count) => `Hermes ${version} · 活躍工作階段 ${count}`, + restartMessaging: '重新啟動訊息服務', + updateHermes: '更新 Hermes', + actionRunning: '執行中', + actionDone: '完成', + actionFailed: '失敗', + actionStartedWaiting: '動作已啟動,等待狀態…', + loadingStatus: '正在載入狀態…', + recentLogs: '最近記錄', + noLogs: '尚未載入記錄。', + days: count => `${count} 天`, + statSessions: '工作階段', + statApiCalls: 'API 呼叫', + statTokens: '輸入/輸出詞元', + statCost: '預估費用', + actualCost: cost => `實際 ${cost}`, + loadingUsage: '正在載入使用量…', + noUsage: period => `最近 ${period} 天暫無使用量。`, + retry: '重試', + dailyTokens: '每日詞元', + input: '輸入', + output: '輸出', + noDailyActivity: '暫無每日活動。', + topModels: '常用模型', + noModelUsage: '暫無模型使用量。', + topSkills: '常用技能', + noSkillActivity: '暫無技能活動。', + actions: count => `${count} 次動作` + }, + + messaging: { + search: '搜尋訊息平台…', + loading: '正在載入訊息平台…', + loadFailed: '訊息平台載入失敗', + states: { + connected: '已連線', + connecting: '連線中', + disabled: '已停用', + fatal: '錯誤', + gateway_stopped: '訊息閘道已停止', + not_configured: '需要設定', + pending_restart: '需要重新啟動', + retrying: '重試中', + startup_failed: '啟動失敗' + }, + unknown: '未知', + hintPendingRestart: '在狀態列重新啟動閘道以套用此變更。', + hintGatewayStopped: '在狀態列啟動閘道以建立連線。', + credentialsSet: '憑證已設定', + needsSetup: '需要設定', + gatewayStopped: '訊息閘道已停止', + getCredentials: '取得您的憑證', + openSetupGuide: '開啟設定指南', + required: '必填', + recommended: '建議', + advanced: count => `進階 (${count})`, + noTokenNeeded: '此平台不需要在此填寫 Token。請按照上方設定指南操作,然後在下方啟用。', + enabled: '已啟用', + disabled: '已停用', + unsavedChanges: '有未儲存的變更', + saving: '儲存中…', + saveChanges: '儲存變更', + saved: '已儲存', + replaceValue: '取代目前值', + openDocs: '開啟文件', + clearField: key => `清除 ${key}`, + enableAria: name => `啟用 ${name}`, + disableAria: name => `停用 ${name}`, + platformEnabled: name => `${name} 已啟用`, + platformDisabled: name => `${name} 已停用`, + restartToApply: '重新啟動閘道後此變更才會生效。', + setupSaved: name => `${name} 設定已儲存`, + restartToReconnect: '重新啟動閘道以使用新憑證重新連線。', + keyCleared: key => `${key} 已清除`, + setupUpdated: name => `${name} 設定已更新。`, + failedUpdate: name => `更新 ${name} 失敗`, + failedSave: name => `儲存 ${name} 失敗`, + failedClear: key => `清除 ${key} 失敗`, + fieldCopy: { + TELEGRAM_BOT_TOKEN: { + label: 'Bot Token', + help: '用 @BotFather 建立機器人,然後貼上它給您的 Token。', + placeholder: '貼上 Telegram bot Token' + }, + TELEGRAM_ALLOWED_USERS: { + label: '允許的 Telegram 使用者 ID', + help: '建議設定。來自 @userinfobot 的逗號分隔數字 ID。不設定則任何人都能私訊您的機器人。' + }, + TELEGRAM_PROXY: { label: '代理 URL', help: '僅在 Telegram 被封鎖的網路中需要。' }, + DISCORD_BOT_TOKEN: { + label: 'Bot Token', + help: '在 Discord 開發者入口網站建立應用程式,新增機器人,然後貼上其 Token。' + }, + DISCORD_ALLOWED_USERS: { label: '允許的 Discord 使用者 ID', help: '建議設定。逗號分隔的 Discord 使用者 ID。' }, + DISCORD_REPLY_TO_MODE: { label: '回覆方式', help: 'first、all 或 off。' }, + DISCORD_ALLOW_ALL_USERS: { + label: '允許所有 Discord 使用者', + help: '僅供開發使用。為 true 時,任何人都可以私訊機器人,不需要允許清單。' + }, + DISCORD_HOME_CHANNEL: { + label: '主頻道 ID', + help: '機器人主動傳送訊息的頻道(cron 輸出、提醒等)。' + }, + DISCORD_HOME_CHANNEL_NAME: { + label: '主頻道名稱', + help: '記錄和狀態輸出中顯示的主頻道名稱。' + }, + BLUEBUBBLES_ALLOW_ALL_USERS: { label: '允許所有 iMessage 使用者', help: '為 true 時略過 BlueBubbles 允許清單。' }, + MATTERMOST_ALLOW_ALL_USERS: { label: '允許所有 Mattermost 使用者' }, + MATTERMOST_HOME_CHANNEL: { label: '主頻道' }, + QQ_ALLOW_ALL_USERS: { label: '允許所有 QQ 使用者' }, + QQBOT_HOME_CHANNEL: { label: 'QQ 主頻道', help: 'cron 傳遞的預設頻道或群組。' }, + QQBOT_HOME_CHANNEL_NAME: { label: 'QQ 主頻道名稱' }, + SLACK_BOT_TOKEN: { + label: 'Slack bot Token', + help: '安裝 Slack 應用程式後,在 OAuth & Permissions 中找到 bot Token。', + placeholder: '貼上 Slack bot Token' + }, + SLACK_APP_TOKEN: { + label: 'Slack app Token', + help: 'Socket Mode 需要 app 層級 Token。', + placeholder: '貼上 Slack app Token' + }, + SLACK_ALLOWED_USERS: { label: '允許的 Slack 使用者 ID', help: '建議設定。逗號分隔的 Slack 使用者 ID。' }, + MATTERMOST_URL: { label: '伺服器 URL', placeholder: 'https://mattermost.example.com' }, + MATTERMOST_TOKEN: { label: 'Bot Token' }, + MATTERMOST_ALLOWED_USERS: { label: '允許的使用者 ID', help: '建議設定。逗號分隔的 Mattermost 使用者 ID。' }, + MATRIX_HOMESERVER: { label: 'Homeserver URL', placeholder: 'https://matrix.org' }, + MATRIX_ACCESS_TOKEN: { label: '存取 Token' }, + MATRIX_USER_ID: { label: 'Bot 使用者 ID', placeholder: '@hermes:example.org' }, + MATRIX_ALLOWED_USERS: { + label: '允許的 Matrix 使用者 ID', + help: '建議設定。@user:server 格式的逗號分隔使用者 ID。' + }, + SIGNAL_HTTP_URL: { + label: 'Signal 橋接 URL', + placeholder: 'http://127.0.0.1:8080', + help: '執行中的 signal-cli REST 橋接的 URL。' + }, + SIGNAL_ACCOUNT: { label: '電話號碼', help: '在 signal-cli 橋接中註冊的號碼。' }, + SIGNAL_ALLOWED_USERS: { label: '允許的 Signal 使用者', help: '建議設定。逗號分隔的 Signal 識別碼。' }, + WHATSAPP_ENABLED: { + label: '啟用 WhatsApp 橋接', + help: '由下方切換開關自動設定。除非確知需要,否則請勿變更。' + }, + WHATSAPP_MODE: { label: '橋接模式' }, + WHATSAPP_ALLOWED_USERS: { + label: '允許的 WhatsApp 使用者', + help: '建議設定。逗號分隔的電話號碼或 WhatsApp ID。' + } + }, + platformIntro: {} }, profiles: { + close: '關閉設定檔', + nameHint: '小寫字母、數字、連字號和底線。必須以字母或數字開頭。', + title: '設定檔', + count: count => `${count} 個設定檔`, + loading: '正在載入設定檔…', newProfile: '新增設定檔', + allProfiles: '全部設定檔', + showAllProfiles: '顯示全部設定檔', + switchToProfile: name => `切換至 ${name}`, + manageProfiles: '管理設定檔...', + actionsFor: name => `${name} 的動作`, + color: '顏色...', + colorFor: name => `${name} 的顏色`, + setColor: color => `設定顏色 ${color}`, + autoColor: '自動', noProfiles: '找不到設定檔。', + selectPrompt: '選擇一個設定檔以檢視其詳細資訊。', + refresh: '重新整理設定檔', + refreshing: '正在重新整理設定檔', + default: '預設', skills: count => `${count} 個技能`, + env: 'env', defaultBadge: '預設', rename: '重新命名', - saveSoul: '儲存 SOUL', + copySetup: '複製安裝指令', + copying: '複製中…', + modelLabel: '模型', + skillsLabel: '技能', + notSet: '未設定', + soulDesc: '內建於此設定檔的系統提示詞與角色指令。', + soulOptional: '選填', + soulPlaceholder: mode => `此設定檔的系統提示詞 / 角色說明。\n留空則保留${mode}預設值。`, + soulPlaceholderCloned: '複製的', + soulPlaceholderEmpty: '空的', + unsavedChanges: '有未儲存的變更', + loadingSoul: '正在載入 SOUL.md…', + emptySoul: '空的 SOUL.md — 開始撰寫角色設定…', + saving: '儲存中…', + saveSoul: '儲存 SOUL.md', + deleteTitle: '刪除設定檔?', + deleteDescPrefix: '這將刪除 ', + deleteDescMid: ' 並移除其 ', + deleteDescSuffix: ' 目錄。此操作無法復原。', + deleting: '刪除中…', + createDesc: '設定檔是獨立的 Hermes 環境:各自擁有獨立的設定、技能和 SOUL.md。', + nameLabel: '名稱', cloneFromDefault: '從預設設定檔複製設定', + cloneFromDefaultDesc: '從您的預設設定檔複製設定、技能和 SOUL.md。', invalidName: hint => `設定檔名稱無效。${hint}`, nameRequired: '名稱為必填', + creating: '建立中…', + createAction: '建立設定檔', + renameTitle: '重新命名設定檔', + renameDescPrefix: '重新命名會更新設定檔目錄以及 ', + renameDescSuffix: ' 中的所有包裝指令碼。', + newNameLabel: '新名稱', + renaming: '重新命名中…', created: '已建立', renamed: '已重新命名', deleted: '已刪除', - soulSaved: 'SOUL.md 已儲存' + setupCopied: '安裝指令已複製', + soulSaved: 'SOUL.md 已儲存', + failedLoad: '載入設定檔失敗', + failedDelete: '刪除設定檔失敗', + failedCopy: '複製安裝指令失敗', + failedLoadSoul: '載入 SOUL.md 失敗', + failedSaveSoul: '儲存 SOUL.md 失敗', + failedCreate: '建立設定檔失敗', + failedRename: '重新命名設定檔失敗' }, cron: { - last: '上次', - next: '下次', + close: '關閉排程', + search: '搜尋排程工作…', + refresh: '重新整理排程工作', + refreshing: '正在重新整理排程工作', + loading: '正在載入排程工作…', + states: { + enabled: '已啟用', + scheduled: '已排程', + running: '執行中', + paused: '已暫停', + disabled: '已停用', + error: '錯誤', + completed: '已完成' + }, + deliveryLabels: { + local: '此桌面', + telegram: 'Telegram', + discord: 'Discord', + slack: 'Slack', + email: '電子郵件' + }, + scheduleLabels: { + daily: '每天', + weekdays: '工作日', + weekly: '每週', + monthly: '每月', + hourly: '每小時', + 'every-15-minutes': '每 15 分鐘', + custom: '自訂' + }, + scheduleHints: { + daily: '每天上午 9:00', + weekdays: '週一至週五上午 9:00', + weekly: '每週一上午 9:00', + monthly: '每月第一天上午 9:00', + hourly: '每個整點', + 'every-15-minutes': '每 15 分鐘', + custom: 'Cron 語法或自然語言' + }, + days: { + '0': '週日', + '1': '週一', + '2': '週二', + '3': '週三', + '4': '週四', + '5': '週五', + '6': '週六', + '7': '週日' + }, + dayFallback: value => `第 ${value} 天`, + everyDayAt: time => `每天 ${time}`, + weekdaysAt: time => `工作日 ${time}`, + everyDayOfWeekAt: (day, time) => `每${day} ${time}`, + monthlyOnDayAt: (dayOfMonth, time) => `每月 ${dayOfMonth} 日 ${time}`, + topOfHour: '每個整點', + everyHourAt: minute => `每小時的 :${minute}`, + active: (enabled, total) => `${enabled}/${total} 個啟用`, + newCron: '新排程工作', + createFirst: '建立第一個排程工作', + emptyDescNew: + '按 cron 表達式排程一個提示詞。Hermes 會執行它,並將結果傳送至您選擇的目的地。', + emptyDescSearch: '請嘗試更廣泛的搜尋詞。', + emptyTitleNew: '暫無排程工作', + emptyTitleSearch: '無相符項目', + last: '上次:', + next: '下次:', + actionsFor: title => `${title} 的動作`, + actionsTitle: '排程工作動作', resume: '繼續', pause: '暫停', + resumeTitle: '繼續', + pauseTitle: '暫停', triggerNow: '立即觸發', + edit: '編輯排程工作', + deleteTitle: '刪除排程工作?', + deleteDescPrefix: '這將永久移除 ', + deleteDescSuffix: '。它會立即停止觸發。', + deleting: '刪除中…', + resumed: '排程工作已繼續', + paused: '排程工作已暫停', + triggered: '排程工作已觸發', + deleted: '排程工作已刪除', + created: '排程工作已建立', + updated: '排程工作已更新', + failedLoad: '載入排程工作失敗', + failedUpdate: '更新排程工作失敗', + failedTrigger: '觸發排程工作失敗', + failedDelete: '刪除排程工作失敗', + failedSave: '儲存排程工作失敗', + editTitle: '編輯排程工作', + createTitle: '新排程工作', + editDesc: '更新排程、提示詞或傳遞目標。變更將在下次執行時生效。', + createDesc: '排程一個提示詞以自動執行。使用 cron 語法或類似「每 15 分鐘」的自然語言。', + nameLabel: '名稱', namePlaceholder: '例如:每日摘要', - promptPlaceholder: '代理每次執行時應做什麼?' + promptLabel: '提示詞', + promptPlaceholder: '代理每次執行時應做什麼?', + frequencyLabel: '頻率', + deliverLabel: '傳遞至', + customScheduleLabel: '自訂排程', + customPlaceholder: '0 9 * * * 或 weekdays at 9am', + customHint: 'Cron 表達式,或類似「每小時」「工作日上午 9 點」的短語。', + optional: '選填', + promptScheduleRequired: '提示詞和排程為必填項目。', + saveChanges: '儲存變更', + createAction: '建立排程工作' + }, + + artifacts: { + search: '搜尋成品…', + refresh: '重新整理成品', + refreshing: '正在重新整理成品', + indexing: '正在索引最近工作階段的成品', + tabAll: '全部', + tabImages: '圖片', + tabFiles: '檔案', + tabLinks: '連結', + noArtifactsTitle: '找不到成品', + noArtifactsDesc: '當工作階段產生圖片和檔案輸出時,它們會顯示在這裡。', + failedLoad: '成品載入失敗', + openFailed: '開啟失敗', + itemsImage: '張圖片', + itemsLink: '個連結', + itemsFile: '個檔案', + itemsGeneric: '項', + zero: '0', + rangeOf: (start, end, total) => `${start}-${end},共 ${total}`, + goToPage: (itemLabel, page) => `前往${itemLabel}第 ${page} 頁`, + colTitleLink: '連結標題', + colTitleFile: '名稱', + colTitleDefault: '標題 / 名稱', + colLocationLink: 'URL', + colLocationFile: '路徑', + colLocationDefault: '位置', + colSession: '工作階段', + kindImage: '圖片', + kindFile: '檔案', + kindLink: '連結', + chat: '聊天', + copyUrl: '複製 URL', + copyPath: '複製路徑' + }, + + sidebar: { + nav: { + 'new-session': '新工作階段', + skills: '技能與工具', + messaging: '訊息平台', + artifacts: '成品' + }, + searchAria: '搜尋工作階段', + searchPlaceholder: '搜尋工作階段…', + clearSearch: '清除搜尋', + noMatch: query => `沒有工作階段符合「${query}」。`, + results: '結果', + pinned: '已釘選', + sessions: '工作階段', + groupAriaGrouped: '以單一清單顯示工作階段', + groupAriaUngrouped: '依工作區分組工作階段', + groupTitleGrouped: '取消分組', + groupTitleUngrouped: '依工作區分組', + allPinned: '這裡的全部已釘選。取消釘選某個聊天即可在最近中顯示。', + shiftClickHint: 'Shift + 點擊聊天以釘選 · 拖曳以重新排序', + noWorkspace: '無工作區', + newSessionIn: label => `在 ${label} 中新建工作階段`, + reorderWorkspace: label => `重新排序工作區 ${label}`, + showMoreIn: (count, label) => `在 ${label} 中再顯示 ${count} 個`, + loading: '載入中…', + loadMore: '載入更多', + loadCount: step => `再載入 ${step} 個`, + row: { + pin: '釘選', + unpin: '取消釘選', + copyId: '複製 ID', + export: '匯出', + rename: '重新命名', + archive: '封存', + copyIdFailed: '無法複製工作階段 ID', + actionsFor: title => `${title} 的動作`, + sessionActions: '工作階段動作', + sessionRunning: '工作階段執行中', + needsInput: '需要您的輸入', + waitingForAnswer: '等待您的回答', + renamed: '已重新命名', + renameFailed: '重新命名失敗', + renameTitle: '重新命名工作階段', + renameDesc: '為此聊天取一個好記的標題。留空則清除。', + untitledPlaceholder: '未命名工作階段', + ageNow: '剛才', + ageDay: '天', + ageHour: '時', + ageMin: '分' + } + }, + + composer: { + message: '訊息', + wakingProfile: profile => `正在喚醒 ${profile}…`, + placeholderStarting: '正在啟動 Hermes...', + placeholderReconnecting: '正在重新連線至 Hermes…', + placeholderFollowUp: '傳送後續訊息', + newSessionPlaceholders: [ + '我們要建立什麼?', + '給 Hermes 一個任務', + '您在想什麼?', + '描述您需要什麼', + '我們該處理什麼?', + '盡管問', + '從一個目標開始' + ], + followUpPlaceholders: [ + '傳送後續訊息', + '補充更多脈絡', + '細化此請求', + '下一步是什麼?', + '繼續推進', + '再深入一點', + '調整或繼續' + ], + startVoice: '開始語音對話', + queueMessage: '排隊訊息', + stop: '停止', + send: '傳送', + speaking: '說話中', + transcribing: '轉寫中', + thinking: '思考中', + muted: '已靜音', + listening: '聆聽中', + muteMic: '麥克風靜音', + unmuteMic: '取消麥克風靜音', + stopListening: '停止聆聽並傳送', + stopShort: '停止', + endConversation: '結束語音對話', + endShort: '結束', + stopDictation: '停止聽寫', + transcribingDictation: '正在轉寫聽寫', + voiceDictation: '語音聽寫', + lookupLoading: '查詢中…', + lookupNoMatches: '沒有相符項目。', + lookupTry: '試試', + lookupOr: '或', + commonCommands: '常用指令', + hotkeys: '快捷鍵', + helpFooter: '開啟完整面板 · 退格鍵關閉', + commandDescs: { + '/help': '指令與快捷鍵的完整清單', + '/clear': '開始新工作階段', + '/resume': '繼續之前的工作階段', + '/details': '控制對話記錄的詳細程度', + '/copy': '複製所選內容或最後一條助手訊息', + '/quit': '結束 hermes' + }, + hotkeyDescs: { + '@': '參照檔案、資料夾、URL、git', + '/': '斜線指令面板', + '?': '此快速說明(刪除以關閉)', + Enter: '傳送 · Shift+Enter 換行', + 'Cmd/Ctrl+K': '傳送下一個排隊的回合', + 'Cmd/Ctrl+L': '重繪', + Esc: '關閉彈出視窗 · 取消執行', + '↑ / ↓': '循環彈出視窗 / 歷史記錄' + }, + attachUrlTitle: '附加 URL', + attachUrlDesc: 'Hermes 將擷取該頁面並作為此回合的脈絡。', + urlPlaceholder: 'https://example.com/post', + urlHintPre: '請輸入完整 URL,例如 ', + attach: '附加', + queued: count => `${count} 個排隊中`, + attachmentOnly: '僅附件回合', + emptyTurn: '空回合', + attachments: count => `${count} 個附件`, + editingInComposer: '在輸入框中編輯', + editingQueuedInComposer: '在輸入框中編輯排隊回合', + editQueued: '編輯排隊回合', + sendQueuedNow: '立即傳送排隊回合', + deleteQueued: '刪除排隊回合', + previewUnavailable: '預覽不可用', + previewLabel: label => `預覽 ${label}`, + couldNotPreview: label => `無法預覽 ${label}`, + removeAttachment: label => `移除 ${label}`, + dictating: '聽寫中', + preparingAudio: '正在準備音訊', + speakingResponse: '正在朗讀回覆', + readingAloud: '朗讀中', + themeSuggestions: '桌面主題建議', + noMatchingThemes: '沒有相符的主題。', + themeTryPre: '試試 ', + themeTryPost: '。', + attachLabel: '附加', + files: '檔案…', + folder: '資料夾…', + images: '圖片…', + pasteImage: '貼上圖片', + url: 'URL…', + promptSnippets: '提示詞片段…', + tipPre: '提示:輸入 ', + tipPost: ' 以行內參照檔案。', + snippetsTitle: '提示詞片段', + snippetsDesc: '選擇一個起始提示詞放入輸入框。', + dropFiles: '拖曳檔案以附加', + dropSession: '拖曳以連結此聊天', + snippets: { + codeReview: { + label: '程式碼審查', + description: '審查目前的變更是否有回歸、遺漏的邊緣情況和缺少的測試。', + text: '請審查這部分是否有錯誤、回歸和缺少的測試。' + }, + implementationPlan: { + label: '實作計劃', + description: '在動程式碼之前先勾勒方案,讓 diff 保持聚焦。', + text: '請在修改程式碼前制定一個簡潔的實作計劃。' + }, + explainThis: { + label: '解釋這段', + description: '說明所選程式碼的運作方式,並連結到關鍵檔案。', + text: '請解釋這是如何運作的,並告訴我關鍵檔案在哪裡。' + } + } + }, + + updates: { + stages: { + idle: '準備中…', + prepare: '準備中…', + fetch: '下載中…', + pull: '快完成了…', + pydeps: '收尾中…', + restart: '正在重新啟動 Hermes…', + manual: '從終端機更新', + error: '更新已暫停' + }, + checking: '正在檢查更新…', + checkFailedTitle: '無法檢查更新', + tryAgain: '重試', + notAvailableTitle: '更新不可用', + unsupportedMessage: '此版本的 Hermes 無法在應用程式內自行更新。', + connectionRetry: '請檢查網路連線後重試。', + latestBody: '您正在執行最新版本。', + allSetTitle: '已是最新版本', + availableTitle: '有可用更新', + availableBody: '新版 Hermes 已可安裝。', + updateNow: '立即更新', + maybeLater: '稍後再說', + moreChanges: count => `另有 ${count} 項變更。`, + manualTitle: '從終端機更新', + manualBody: '您是從命令列安裝的 Hermes,因此更新也需要在那裡執行。請將此指令貼到終端機:', + manualPickedUp: '下次啟動 Hermes 時會使用新版本。', + copy: '複製', + copied: '已複製', + done: '完成', + applyingBody: 'Hermes 更新程式會在自己的視窗中接管,並在完成後重新開啟 Hermes。', + applyingClose: 'Hermes 將關閉以套用更新。', + errorTitle: '更新未完成', + errorBody: '沒有資料遺失。您可以現在重試。', + notNow: '暫不' + }, + + install: { + stageStates: { + pending: '等待中', + running: '安裝中', + succeeded: '完成', + skipped: '已略過', + failed: '失敗' + }, + oneTimeTitle: 'Hermes 需要一次性安裝', + unsupportedDesc: platform => + `${platform} 暫不支援自動首次啟動安裝。請開啟終端機並執行下面的指令,然後重新啟動此應用程式。之後啟動會略過此步驟。`, + installCommand: '安裝指令', + copyCommand: '複製指令', + viewDocs: '檢視安裝文件', + installTo: '將安裝至', + retryAfterRun: '我已執行 -- 重試', + failedTitle: '安裝失敗', + settingUpTitle: '正在設定 Hermes Agent', + finishingTitle: '正在收尾', + failedDesc: + '某個安裝步驟失敗。在 Windows 上,如果另一個 Hermes CLI 或桌面執行個體正在執行,可能會出現這種情況。請停止正在執行的 Hermes 執行個體後重試。可查看下方的詳細資訊或 desktop 記錄中的完整記錄。', + activeDesc: + '這是一次性設定。Hermes 安裝程式正在下載相依套件並設定您的電腦。之後啟動會略過此步驟。', + progress: (completed, total) => `${completed}/${total} 個步驟已完成`, + currentStage: stage => ` -- 目前:${stage}`, + fetchingManifest: '正在取得安裝程式 manifest...', + error: '錯誤', + hideOutput: '隱藏安裝程式輸出', + showOutput: '顯示安裝程式輸出', + lines: count => `${count} 行`, + noOutput: '暫無輸出。', + cancelling: '取消中...', + cancelInstall: '取消安裝', + transcriptSaved: '完整記錄已儲存至', + copiedOutput: '已複製!', + copyOutput: '複製輸出', + reloadRetry: '重新載入並重試' + }, + + onboarding: { + headerTitle: '開始設定 Hermes Agent', + headerDesc: '連線模型提供方即可開始聊天。大多數選項只需一次點擊。', + preparingInstall: 'Hermes 正在完成安裝。首次執行通常不到一分鐘。', + starting: '正在啟動 Hermes…', + lookingUpProviders: '正在查詢提供方...', + collapse: '收合', + otherProviders: '其他提供方', + haveApiKey: '我有 API 金鑰', + chooseLater: '稍後再選擇提供方', + recommended: '建議', + connected: '已連線', + featuredPitch: '一個訂閱,300+ 前沿模型 — 執行 Hermes 的建議方式', + openRouterPitch: '一個金鑰,數百個模型 — 穩定的預設選擇', + apiKeyOptions: { + openrouter: { short: '一個金鑰,多個模型', description: '用一個金鑰存取數百個模型。適合新安裝的預設選擇。' }, + openai: { short: 'GPT 等級模型', description: '直接存取 OpenAI 模型。' }, + gemini: { short: 'Gemini 模型', description: '直接存取 Google Gemini 模型。' }, + xai: { short: 'Grok 模型', description: '直接存取 xAI Grok 模型。' }, + local: { + short: '自託管', + description: '將 Hermes 指向本機或自託管的 OpenAI 相容端點(vLLM、llama.cpp、Ollama 等)。' + } + }, + backToSignIn: '返回登入', + getKey: '取得金鑰', + replaceCurrent: '取代目前值', + pasteApiKey: '貼上 API 金鑰', + couldNotSave: '無法儲存憑證。', + connecting: '連線中', + update: '更新', + flowSubtitles: { + pkce: '開啟瀏覽器登入,然後回到這裡繼續', + device_code: '在瀏覽器中開啟驗證頁面 — Hermes 會自動連線', + loopback: '開啟瀏覽器登入 — Hermes 會自動連線', + external: '先在終端機登入一次,然後回來繼續聊天' + }, + startingSignIn: provider => `正在為 ${provider} 啟動登入...`, + verifyingCode: provider => `正在透過 ${provider} 驗證您的代碼...`, + connectedProvider: provider => `${provider} 已連線。`, + connectedPicking: provider => `${provider} 已連線。正在選擇預設模型...`, + signInFailed: '登入失敗,請重試。', + pickDifferentProvider: '選擇其他提供方', + signInWith: provider => `使用 ${provider} 登入`, + openedBrowser: provider => `已在瀏覽器中開啟 ${provider}。`, + authorizeThere: '請在那裡授權 Hermes。', + copyAuthCode: '複製授權碼並貼到下方。', + pasteAuthCode: '貼上授權碼', + reopenAuthPage: '重新開啟授權頁面', + autoBrowser: provider => + `已在瀏覽器中開啟 ${provider}。請在那裡授權 Hermes,連線會自動完成,無需複製或貼上。`, + reopenSignInPage: '重新開啟登入頁面', + waitingAuthorize: '等待您授權...', + externalPending: provider => + `${provider} 透過自己的 CLI 登入。請在終端機執行此指令,然後回來選擇「我已登入」:`, + signedIn: '我已登入', + deviceCodeOpened: provider => `已在瀏覽器中開啟 ${provider}。請在那裡輸入此代碼:`, + reopenVerification: '重新開啟驗證頁面', + copy: '複製', + defaultModel: '預設模型', + freeTier: '免費層', + pro: 'Pro', + free: '免費', + price: (input, output) => `${input} 輸入 / ${output} 輸出 每 Mtok`, + change: '變更', + startChatting: '開始聊天', + docs: provider => `${provider} 文件` + }, + + modelPicker: { + title: '切換模型', + current: '目前:', + unknown: '(未知)', + search: '篩選提供方和模型...', + noModels: '找不到模型。', + persistGlobalSession: '全域儲存(否則僅限此工作階段)', + persistGlobal: '全域儲存', + addProvider: '新增提供方', + loadFailed: '無法載入模型', + noAuthenticatedProviders: '沒有已驗證的提供方。', + pro: 'Pro', + proNeedsSubscription: 'Pro 模型需要付費 Nous 訂閱。', + free: '免費', + freeTier: '免費層', + priceTitle: '每百萬 Token 的輸入/輸出價格' + }, + + modelVisibility: { + title: '模型', + search: '搜尋模型', + noAuthenticatedProviders: '沒有已驗證的提供方。', + addProvider: '新增提供方…' + }, + + shell: { + windowControls: '視窗控制項', + paneControls: '窗格控制項', + appControls: '應用程式控制項', + modelMenu: { + search: '搜尋模型', + noModels: '找不到模型', + editModels: '編輯模型…', + fast: '快速', + medium: '中' + }, + modelOptions: { + noOptions: '此模型沒有可用選項', + options: '選項', + thinking: '思考', + fast: '快速', + effort: '推理強度', + minimal: '最小', + low: '低', + medium: '中', + high: '高', + max: '最高', + updateFailed: '模型選項更新失敗', + fastFailed: '快速模式更新失敗' + }, + gatewayMenu: { + gateway: '閘道', + connected: '已連線', + connecting: '連線中', + offline: '離線', + inferenceReady: '推論已就緒', + inferenceNotReady: '推論未就緒', + checkingInference: '正在檢查推論', + disconnected: '已中斷連線', + openSystem: '開啟系統面板', + connection: label => `連線:${label}`, + recentActivity: '最近活動', + viewAllLogs: '查看全部記錄 →', + messagingPlatforms: '訊息平台' + }, + statusbar: { + unknown: '未知', + restart: '重新啟動', + update: '更新', + updateInProgress: '更新中', + commitsBehind: (count, branch) => `落後 ${branch} ${count} 個提交`, + desktopVersion: version => `Hermes Desktop v${version}`, + commit: sha => `提交 ${sha}`, + branch: branch => `分支 ${branch}`, + closeCommandCenter: '關閉命令中心', + openCommandCenter: '開啟命令中心', + gateway: '閘道', + gatewayReady: '就緒', + gatewayNeedsSetup: '需要設定', + gatewayChecking: '檢查中', + gatewayConnecting: '連線中', + gatewayOffline: '離線', + gatewayTitle: 'Hermes 推論閘道狀態', + agents: '代理', + closeAgents: '關閉代理', + openAgents: '開啟代理', + subagents: count => `${count} 個子代理`, + failed: count => `${count} 個失敗`, + running: count => `${count} 個執行中`, + cron: '排程', + openCron: '開啟排程工作', + turnRunning: '執行中', + currentTurnElapsed: '目前回合已用時間', + contextUsage: '上下文使用量', + session: '工作階段', + runtimeSessionElapsed: '執行時工作階段已用時間', + yoloOn: 'YOLO 已開啟 — 自動核准危險指令。點擊關閉。', + yoloOff: 'YOLO 已關閉 — 點擊自動核准危險指令。', + modelNone: '無', + noModel: '無模型', + switchModel: '切換模型', + openModelPicker: '開啟模型選擇器', + modelTitle: (provider, model) => `模型 · ${provider}:${model}`, + providerModelTitle: (provider, model) => `${provider} · ${model}` + } + }, + + rightSidebar: { + aria: '右側邊欄', + panelsAria: '右側邊欄面板', + files: '檔案系統', + terminal: '終端機', + noFolderSelected: '未選擇資料夾', + changeCwdTitle: '變更工作目錄', + folderTip: cwd => `${cwd} — 點擊以變更資料夾`, + openFolder: '開啟資料夾', + refreshTree: '重新整理檔案樹', + collapseAll: '收合所有資料夾', + previewUnavailable: '預覽不可用', + couldNotPreview: path => `無法預覽 ${path}`, + noProjectTitle: '沒有專案', + noProjectBody: '從狀態列設定工作目錄後即可瀏覽檔案。', + unreadableTitle: '無法讀取', + unreadableBody: error => `無法讀取此資料夾 (${error})。`, + emptyTitle: '空資料夾', + emptyBody: '此資料夾是空的。', + treeErrorTitle: '檔案樹錯誤', + treeErrorBody: '檔案樹在渲染此資料夾時發生錯誤。', + tryAgain: '重試', + loadingTree: '正在載入檔案樹', + loadingFiles: '正在載入檔案', + terminalFocus: '聚焦終端機檢視', + terminalSplit: '返回分割檢視', + addToChat: '新增至聊天' + }, + + preview: { + tab: '預覽', + closeTab: label => `關閉 ${label}`, + closePane: '關閉預覽窗格', + loading: '正在載入預覽', + unavailable: '預覽不可用', + opening: '開啟中...', + hide: '隱藏', + openPreview: '開啟預覽', + sourceLineTitle: '點擊選取 · shift 點擊擴展 · 拖曳至輸入框', + source: '原始碼', + renderedPreview: '預覽', + unknownSize: '大小未知', + binaryTitle: '這看起來像二進位檔案', + binaryBody: label => `預覽 ${label} 可能會顯示無法讀取的文字。`, + largeTitle: '此檔案較大', + largeBody: (label, size) => `${label} 大小為 ${size}。Hermes 只會顯示前 512 KB。`, + previewAnyway: '仍然預覽', + truncated: '顯示前 512 KB。', + noInlineTitle: '沒有行內預覽', + noInlineBody: mimeType => `${mimeType || '此檔案類型'} 仍可作為脈絡附件。`, + console: { + deselect: '取消選取項目', + select: '選取項目', + copyFailed: '無法複製主控台輸出', + copyEntry: '複製此項目', + sendEntry: '將此項目傳送至聊天', + messages: count => `${count} 則主控台訊息`, + resize: '調整預覽主控台大小', + title: '預覽主控台', + selected: count => `已選取 ${count} 個`, + sendToChat: '傳送至聊天', + copySelected: '複製所選至剪貼簿', + copyAll: '全部複製至剪貼簿', + copy: '複製', + clear: '清除', + empty: '暫無主控台訊息。', + promptHeader: '預覽主控台:', + sentTitle: '已傳送至聊天', + sentMessage: count => `已將 ${count} 條記錄新增至輸入框` + }, + web: { + appFailedToBoot: '預覽應用程式啟動失敗', + serverNotFound: '找不到伺服器', + failedToLoad: '預覽載入失敗', + tryAgain: '重試', + restarting: 'Hermes 正在重新啟動...', + askRestart: '請 Hermes 重新啟動伺服器', + lookingRestart: taskId => `Hermes 正在尋找要重新啟動的預覽伺服器 (${taskId})`, + restartingTitle: '正在重新啟動預覽伺服器', + restartingMessage: 'Hermes 正在背景執行。可在預覽主控台查看進度。', + startRestartFailed: message => `無法啟動伺服器重新啟動:${message}`, + restartFailed: '伺服器重新啟動失敗', + hideConsole: '隱藏預覽主控台', + showConsole: '顯示預覽主控台', + hideDevTools: '隱藏預覽 DevTools', + openDevTools: '開啟預覽 DevTools', + finishedRestarting: message => + `Hermes 已完成預覽伺服器重新啟動${message ? `:${message}` : ''}`, + failedRestarting: message => `伺服器重新啟動失敗:${message}`, + unknownError: '未知錯誤', + restartedTitle: '預覽伺服器已重新啟動', + reloadingNow: '正在重新載入預覽。', + restartFailedTitle: '預覽重新啟動失敗', + restartFailedMessage: 'Hermes 無法重新啟動伺服器。', + stillWorking: + 'Hermes 仍在執行,但尚未收到重新啟動結果。伺服器指令可能正在前台執行。', + workspaceReloading: '工作區已變更,正在重新載入預覽', + fileChanged: url => `檔案已變更,正在重新載入預覽:${url}`, + filesChanged: (count, url) => `${count} 個檔案變更,正在重新載入預覽:${url}`, + watchFailed: message => `無法監看預覽檔案:${message}`, + moduleMimeDescription: + '模組指令碼使用了錯誤的 MIME 類型。這通常表示靜態檔案伺服器正在服務 Vite/React 應用程式,而不是專案開發伺服器。', + loadFailedConsole: (code, message) => `載入失敗${code ? ` (${code})` : ''}:${message}`, + unreachableDescription: '無法連線至預覽頁面。', + openTarget: url => `開啟 ${url}`, + fallbackTitle: '預覽' + } + }, + + assistant: { + thread: { + loadingSession: '正在載入工作階段', + loadingResponse: 'Hermes 正在載入回覆', + thinking: '思考中', + today: time => `今天,${time}`, + yesterday: time => `昨天,${time}`, + copy: '複製', + refresh: '重新整理', + moreActions: '更多動作', + branchNewChat: '在新聊天中分支', + readAloudFailed: '朗讀失敗', + preparingAudio: '正在準備音訊...', + stopReading: '停止朗讀', + readAloud: '朗讀', + editMessage: '編輯訊息', + stop: '停止', + editableCheckpoint: '可編輯的檢查點', + restorePrevious: '還原至上一個檢查點', + restoreCheckpoint: '還原檢查點', + restoreNext: '還原至下一個檢查點', + goForward: '前進', + sendEdited: '傳送編輯後的訊息' + }, + approval: { + gatewayDisconnected: 'Hermes 閘道未連線', + sendFailed: '無法傳送核准回應', + run: '執行', + moreOptions: '更多核准選項', + allowSession: '允許本工作階段', + alwaysAllowMenu: '一律允許…', + reject: '拒絕', + alwaysTitle: '一律允許此指令?', + alwaysDescription: pattern => + `這會將「${pattern}」模式加入永久允許清單(~/.hermes/config.yaml)。Hermes 對類似指令將不再詢問,包括目前工作階段和未來工作階段。`, + alwaysAllow: '一律允許' + }, + clarify: { + notReady: '澄清請求尚未就緒', + gatewayDisconnected: 'Hermes 閘道未連線', + sendFailed: '無法傳送澄清回應', + loadingQuestion: '正在載入問題…', + other: '其他(輸入您的答案)', + placeholder: '輸入您的答案…', + shortcut: '⌘/Ctrl + Enter 傳送', + back: '返回', + skip: '略過', + send: '傳送' + }, + tool: { + code: '程式碼', + copyCode: '複製程式碼', + renderingImage: '正在渲染圖片', + copyOutput: '複製輸出', + copyCommand: '複製指令', + copyContent: '複製內容', + copyUrl: '複製 URL', + copyResults: '複製結果', + copyQuery: '複製查詢', + copyFile: '複製檔案', + copyPath: '複製路徑', + outputAlt: '工具輸出', + rawResponse: '原始回應', + copyActivity: '複製活動', + recoveredOne: '在 1 個失敗步驟後已復原', + recoveredMany: count => `在 ${count} 個失敗步驟後已復原`, + failedOne: '1 個步驟失敗', + failedMany: count => `${count} 個步驟失敗`, + statusRunning: '執行中', + statusError: '錯誤', + statusRecovered: '已復原', + statusDone: '完成' + } + }, + + prompts: { + gatewayDisconnected: 'Hermes 閘道未連線', + sudoSendFailed: '無法傳送 sudo 密碼', + secretSendFailed: '無法傳送密鑰', + sudoTitle: '管理員密碼', + sudoDesc: 'Hermes 需要您的 sudo 密碼來執行特權指令。它只會傳送給您的本機代理。', + sudoPlaceholder: 'sudo 密碼', + secretTitle: '需要密鑰', + secretDesc: 'Hermes 需要一個憑證才能繼續。', + secretPlaceholder: '密鑰值' + }, + + desktop: { + audioReadFailed: '無法讀取錄製的音訊', + sessionUnavailable: '工作階段不可用', + createSessionFailed: '無法建立新工作階段', + promptFailed: '提示詞傳送失敗', + providerCredentialRequired: '傳送第一則訊息前請先新增提供方憑證。', + emptySlashCommand: '空的斜線指令', + desktopCommands: '桌面端指令', + skillCommandsAvailable: count => `${count} 個技能指令可用。`, + warningLine: message => `警告:${message}`, + yoloArmed: '此聊天已啟用 YOLO', + yoloOff: 'YOLO 已關閉', + yoloSystem: active => `此工作階段 YOLO ${active ? '已開啟' : '已關閉'}`, + yoloTitle: 'YOLO', + yoloToggleFailed: '無法切換 YOLO', + profileStatus: current => + `設定檔:${current}。使用 /profile 或「新工作階段」選擇器在其他設定檔中開始聊天。`, + unknownProfile: '未知設定檔', + noProfileNamed: (target, available) => `沒有名為「${target}」的設定檔。可用的:${available}`, + newChatsProfile: name => `新聊天將使用設定檔 ${name}。`, + setProfileFailed: '設定設定檔失敗', + sttDisabled: '設定中已停用語音轉文字。', + stopFailed: '停止失敗', + regenerateFailed: '重新生成失敗', + editFailed: '編輯失敗', + resumeFailed: '繼續失敗', + nothingToBranch: '沒有可分支的內容', + branchNeedsChat: '分支前請先開始或繼續一個聊天。', + sessionBusy: '工作階段忙碌中', + branchStopCurrent: '分支此聊天前請先停止目前回合。', + branchNoText: '此訊息沒有可用於分支的文字。', + branchTitle: '分支', + branchFailed: '分支失敗', + deleteFailed: '刪除失敗', + archived: '已封存', + archiveFailed: '封存失敗', + cwdChangeFailed: '工作目錄變更失敗', + cwdStagedTitle: '工作目錄已暫存', + cwdStagedMessage: '重新啟動桌面後端後,工作目錄變更才會套用至此作用中工作階段。', + modelSwitchFailed: '模型切換失敗', + sessionExported: '工作階段已匯出', + sessionExportFailed: '無法匯出工作階段', + imageSaved: '圖片已儲存', + downloadStarted: '下載已開始', + restartToUseSaveImage: '重新啟動 Hermes Desktop 後可使用儲存圖片。', + restartToSaveImages: '重新啟動 Hermes Desktop 以儲存圖片', + imageDownloadFailed: '圖片下載失敗', + openImage: '開啟圖片', + downloadImage: '下載圖片', + savingImage: '正在儲存圖片', + imagePreviewFailed: '圖片預覽失敗', + imageAttach: '附加圖片', + imageWriteFailed: '無法將圖片寫入磁碟。', + imageAttachFailed: '附加圖片失敗', + attachImages: '附加圖片', + clipboard: '剪貼簿', + noClipboardImage: '剪貼簿中沒有圖片', + clipboardPasteFailed: '剪貼簿貼上失敗', + dropFiles: '拖曳檔案' + }, + + errors: { + genericFailure: '發生錯誤', + boundaryTitle: '介面出現問題', + boundaryDesc: '此檢視遇到意外錯誤。您的聊天和設定是安全的。', + reloadWindow: '重新載入視窗', + openLogs: '開啟記錄' + }, + + ui: { + search: { + clear: '清除搜尋' + }, + pagination: { + label: '分頁', + previous: '上一頁', + previousAria: '前往上一頁', + next: '下一頁', + nextAria: '前往下一頁' + }, + sidebar: { + title: '側邊欄', + description: '顯示行動裝置側邊欄。', + toggle: '切換側邊欄' + } } })