import { defineFieldCopy } from '@/app/settings/field-copy' 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: 'エラー', expand: '展開', failed: '失敗', formatJson: 'JSON を整形', free: '無料', loading: '読み込み中…', notSet: '未設定', refresh: '更新', remove: '削除', replace: '置き換え', retry: '再試行', run: '実行', send: '送信', set: '設定', skip: 'スキップ', update: '更新', tryHint: term => `「${term}」を試す`, on: 'オン', off: 'オフ' }, fileMenu: { revealFinder: 'Finder で表示', revealExplorer: 'エクスプローラーで表示', revealFileManager: '格納フォルダーを開く', revealInSidebar: 'ファイルツリーで表示', copyPath: 'パスをコピー', copyRelativePath: '相対パスをコピー', download: 'ダウンロード', downloadSaved: '保存しました', downloadFailed: 'ダウンロードに失敗しました', rename: '名前を変更…', delete: '削除', renameTitle: '名前を変更', renameLabel: '新しい名前', deleteTitle: name => `${name} を削除しますか?`, deleteBody: 'ゴミ箱に移動します。そこから復元できます。', pathCopied: 'パスをコピーしました' }, boot: { ready: 'Hermes Desktop の準備ができました', desktopBootFailedWithMessage: message => `デスクトップの起動に失敗しました: ${message}`, steps: { connectingGateway: 'ライブデスクトップゲートウェイに接続中', loadingSettings: 'Hermes の設定を読み込み中', loadingSessions: '最近のセッションを読み込み中', retryingRemoteBackend: 'リモート Hermes バックエンドに再接続中…', startingDesktopConnection: 'デスクトップ接続を開始中', startingHermesDesktop: 'Hermes Desktop を起動中…' }, errors: { backgroundExited: 'Hermes バックグラウンドプロセスが終了しました。', backgroundExitedDuringStartup: '起動中に Hermes バックグラウンドプロセスが終了しました。', backendStopped: 'バックエンドが停止しました', desktopBootFailed: 'デスクトップの起動に失敗しました', gatewayConnectionLost: 'ゲートウェイへの接続が切断されました', gatewayConnectionLostDetail: 'Still retrying in the background. You can keep reading and drafting — open Gateway settings if this persists.', gatewaySignInRequired: 'ゲートウェイへのサインインが必要です', ipcBridgeUnavailable: 'デスクトップ IPC ブリッジが利用できません。' }, failure: { title: 'Hermes を起動できませんでした', description: 'バックグラウンドゲートウェイが起動しませんでした。以下の回復手順をお試しください。チャットや設定は削除されません。', remoteTitle: 'リモートゲートウェイへのサインインが必要です', remoteDescription: 'リモートゲートウェイのセッションが期限切れです。再接続するにはもう一度サインインしてください。チャットや設定は削除されません。', retry: '再試行', repairInstall: 'インストールを修復', useLocalGateway: 'ローカルゲートウェイを使用', gatewaySettings: 'ゲートウェイ設定', back: '戻る', openLogs: 'ログを開く', repairHint: '修復はインストーラーを再実行します。新しいマシンでは数分かかる場合があります。', remoteSignInHint: signInLabel => `保存済みのリモートブラウザセッションからサインアウトし、${signInLabel}を開きます。代わりにバンドルされたバックエンドに切り替えるには「ローカルゲートウェイを使用」を選択してください。`, signOutAndSignIn: 'サインアウトして再サインイン', remoteFailureHint: '「ゲートウェイ設定」でゲートウェイの URL とサインインを確認するか、ローカルゲートウェイに切り替えてください。', cloudDownTitle: 'Nous Cloud エージェントが停止しています', cloudDownDescription: 'このゲートウェイが接続している Nous 管理のクラウドエージェントがサーバーエラーを返しています。ここから再起動することはできません。ステータスを確認するか、ローカルゲートウェイに切り替えるか、サポートに連絡してください。', cloudDownHint: '下のボタンから Nous Portal(インスタンスの状態と操作)を開くか、Discord でサポートを受けられます。', cloudDownCheckPortal: 'Portal のステータスを確認', cloudDownDiscord: 'Discord でサポートを受ける', 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 バックエンドがこのデスクトップビルドより古く、正常に動作しない場合があります。更新して揃えてください。', installMethodUnsupportedTitle: 'サポート対象外のインストール方法', updateHermes: 'Hermes を更新', updateReadyTitle: '更新の準備ができました', updateReadyMessage: count => `${count} 件の新しい変更が利用可能です。`, updateReadyMessageUnknown: '新しい更新が利用可能です。', seeWhatsNew: '新機能を見る', mcp: { needsAuthTitle: 'MCP サーバーの再認証が必要です', needsAuthMessage: name => `${name} MCP の再認証が必要です。`, errorTitle: 'MCP サーバーに接続できません', errorMessage: name => `${name} MCP のヘルスチェックに失敗しました。`, signIn: 'サインイン', view: '表示' }, errors: { elevenLabsNeedsKey: 'ElevenLabs STT には ELEVENLABS_API_KEY が必要です。', elevenLabsRejectedKey: 'ElevenLabs が API キーを拒否しました (401)。', diskFull: 'ディスク容量不足です — 空きを作ってからもう一度お試しください。', gatewayAuthFailed: 'ゲートウェイ認証に失敗しました — API_SERVER_KEY を確認してください。', 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 が必要です。', codeSkewRestartRequired: 'アップデート後、このバックエンドは古いコードのままです。再起動して新しいコードを読み込んでください。' }, voice: { configureSpeechToText: '音声モードを使用するには音声認識を設定してください。', couldNotStartSession: '音声セッションを開始できませんでした', microphoneAccessDenied: 'マイクへのアクセスが拒否されました。', microphoneConstraintsUnsupported: 'このデバイスはマイクの制約をサポートしていません。', microphoneFailed: 'マイクが失敗しました', microphoneInUse: 'マイクは他のアプリで使用中です。', microphonePermissionDenied: 'マイクのアクセス許可が拒否されました。', microphoneStartFailed: 'マイクの録音を開始できませんでした。', microphoneUnsupported: 'このランタイムはマイク録音をサポートしていません。', noMicrophone: 'マイクが見つかりませんでした。', noSpeechDetected: '音声が検出されませんでした', playbackFailed: '音声再生に失敗しました', recordingFailed: '音声録音に失敗しました', sayStopToEnd: phrase => `「${phrase}」と言うと音声チャットを終了できます。`, transcriptionFailed: '音声文字起こしに失敗しました', transcriptionUnavailable: '音声文字起こしはまだ利用できません。', tryRecordingAgain: 'もう一度録音してください。', unavailable: '音声は利用できません' }, native: { approvalTitle: '承認が必要です', approveAction: '承認', rejectAction: '拒否', inputTitle: '入力が必要です', inputBody: 'Hermes が応答を待っています。', turnDoneTitle: 'Hermes が完了しました', turnDoneBody: '', turnErrorTitle: 'ターンが失敗しました', backgroundDoneTitle: 'バックグラウンドタスクが完了しました', backgroundFailedTitle: 'バックグラウンドタスクが失敗しました', creditsTitle: 'クレジット' } }, remoteDisplayBanner: { message: reason => `ソフトウェアレンダリングが有効です — リモートディスプレイを検出しました(${reason})。ちらつきを防ぐため GPU アクセラレーションは無効化されています。` }, billingBlock: { titleNous: 'Nous クレジットが不足しています', titleProvider: provider => `クレジット不足 — ${provider}`, fallbackMessage: 'アカウントのクレジットが不足しています。続行するにはクレジットを追加してください。', openBilling: '請求を開く', addCredits: 'クレジットを追加', dismiss: '閉じる' }, sendDiagnostics: { title: 'Nous に診断情報を送信', privacyNotice: 'デバッグバンドルを Nous 内部ストレージにアップロードします(公開ペーストではありません)。システム情報(OS、バージョン、プロバイダー、設定済み API キーの種類 — キー自体は含まれません)と、エージェント/ゲートウェイ/デスクトップの完全なログ(各最大 512 KB。会話内容、ツール出力、ファイルパスを含む可能性が高い)が含まれます。シークレットはアップロード前にマスクされます。閲覧できるのは Nous スタッフと許可された Discord モデレーターのみで、14 日後に自動削除されます。', upload: 'アップロード', uploading: 'アップロード中…', cancel: 'キャンセル', close: '閉じる', copyLink: 'リンクをコピー', uploadIdFallback: id => `表示リンクが返されませんでした — サポートにアップロード ID ${id} をお伝えください`, doneTitle: '診断情報を送信しました', doneDescription: 'バンドルは非公開でアップロードされました。サポートスレッドで以下のリンクを共有すると、チームがログを確認できます。', failedTitle: 'アップロードに失敗しました', failedHint: 'ターミナルから `hermes debug share --nous` を実行するか、`hermes debug share --local` でアップロードせずにレポートを表示することもできます。', handoffLead: '続きは次の場所で:', links: { github: 'GitHub Issues', portal: 'Nous Portal サポート', discord: 'Discord' } }, titlebar: { hideSidebar: 'サイドバーを非表示', showSidebar: 'サイドバーを表示', search: '検索', searchTitle: 'セッション、ビュー、アクションを検索', swapSidebarSides: 'サイドバーの向きを切り替え', hideRightSidebar: '右サイドバーを非表示', showRightSidebar: '右サイドバーを表示', unreadSessions: count => (count === 1 ? '未読セッション 1 件' : `未読セッション ${count} 件`), muteHaptics: '触覚フィードバックをオフ', unmuteHaptics: '触覚フィードバックをオン', openSettings: '設定を開く', openStarmap: 'メモリグラフを開く', resetHudLayout: 'HUD のサイズと位置をリセット' }, language: { label: '言語', description: 'デスクトップインターフェイスの言語を選択します。', saving: '言語を保存中…', saveError: '言語の更新に失敗しました', switchTo: '言語を切り替え', searchPlaceholder: '言語を検索…', noResults: '言語が見つかりません' }, settings: { closeSettings: '設定を閉じる', exportConfig: '設定を書き出す', importConfig: '設定を読み込む', resetToDefaults: 'デフォルトに戻す', resetConfirm: 'すべての設定を Hermes のデフォルトに戻しますか?', exportFailed: '書き出しに失敗しました', resetFailed: 'リセットに失敗しました', nav: { providers: 'プロバイダー', providerAccounts: 'アカウント', providerApiKeys: 'API キー', providerCustomEndpoints: 'カスタムエンドポイント', providerLocalModels: 'ローカルモデル', gateway: 'ゲートウェイ', apiKeys: 'ツールとキー', keybinds: 'キーボードショートカット', keysTools: 'ツール', keysSettings: '設定', mcp: 'MCP', archivedChats: 'アーカイブ済みチャット', about: '情報', billing: '請求', notifications: '通知' }, notifications: { title: '通知', intro: 'アプリ内トーストとは別の、ネイティブのデスクトップ通知です。設定は端末ごとに保存されます。', enableAll: '通知を有効にする', enableAllDesc: 'オフで以下の通知をすべて無効にします。', focusedHint: '完了通知は Hermes がバックグラウンドにあるときのみ表示されます。', kinds: { approval: { label: '承認が必要', description: 'コマンドが承認または拒否を待っています。' }, input: { label: '入力が必要', description: 'Hermes が質問したか、パスワードやシークレットを必要としています。' }, turnDone: { label: '応答完了', description: 'Hermes がバックグラウンドのときにターンが完了しました。' }, turnError: { label: 'ターン失敗', description: 'バックグラウンドのターンエラー。' }, backgroundDone: { label: 'バックグラウンドタスク完了', description: 'バックグラウンドのターミナルコマンドが完了しました。' }, credits: { label: 'クレジット通知', description: 'クレジットの利用が停止または復旧しました。' }, plugin: { label: 'プラグイン通知', description: 'Hermes がバックグラウンドの間に、デスクトッププラグインが通知を送信しました。' } }, test: 'テスト通知を送信', testTitle: 'Hermes', testBody: '通知は正常に動作しています。', testSent: 'テストを送信しました。表示されない場合は、OS の通知許可と集中モード/おやすみモードを確認してください。', testUnsupported: 'このシステムはネイティブ通知に対応していません。', completionSoundTitle: '完了サウンド', completionSoundDesc: 'エージェントのターン終了時に再生されます。プリセットを選んでここで試聴できます。', completionSoundPreview: '試聴' }, sections: { model: 'モデル', chat: 'チャット', appearance: '外観', workspace: 'ワークスペース', safety: '安全性', memory: 'メモリとコンテキスト', voice: '音声', advanced: '詳細' }, searchPlaceholder: { about: 'Hermes Desktop について', config: '設定を検索…', gateway: 'ゲートウェイ接続…', keys: 'API キーを検索…', mcp: 'MCP サーバーを検索…', sessions: 'アーカイブ済みセッションを検索…' }, modeOptions: { light: { label: 'ライト', description: '明るいデスクトップ表示' }, dark: { label: 'ダーク', description: 'まぶしさを抑えたワークスペース' }, system: { label: 'システム', description: 'OS の外観に合わせる' } }, appearance: { title: '外観', intro: 'デスクトップ専用の表示設定です。モードは明るさ、テーマはアクセントカラーとチャット面のスタイルを制御します。', colorMode: 'カラーモード', colorModeDesc: '固定モードを選ぶか、Hermes をシステム設定に合わせます。', toolViewTitle: 'ツール呼び出しの表示', toolViewDesc: 'プロダクト表示は生のツールペイロードを隠し、テクニカル表示は入出力をすべて表示します。', reasoningCollapsedTitle: '思考ブロックをデフォルトで折りたたむ', reasoningCollapsedDesc: 'ストリーミング中の推論を、開くまで折りたたんだまま利用できるようにします。', uiScaleTitle: 'UI スケール', uiScaleDesc: (percent: number) => `アプリ全体の文字と UI を拡大縮小します。Cmd/Ctrl と +、-、0 でも変更できます。現在: ${percent}%`, sessionDensityTitle: 'セッションリストの密度', sessionDensityDesc: 'サイドバーのセッションタイトルの下に表示する情報量を選びます。', sessionDensityCompact: 'コンパクト', sessionDensityComfortable: '標準', sessionDensityDetailed: '詳細', tabStripTitle: 'タブバー', tabStripDesc: 'ゾーンの上にタブを表示します。自動ではペインが1つのときに隠します。', tabStripAuto: '自動', tabStripAlways: '常に表示', tabStripNever: '表示しない', terminalFontTitle: 'ターミナルフォント', terminalFontDesc: 'Desktop のターミナルで使用するインストール済みフォントを選びます。Nerd Font は Powerlevel10k とシェルアイコンを表示できます。空欄では内蔵の JetBrains Mono を使用します。', terminalFontPlaceholder: 'MesloLGS NF または CSS フォントスタック', terminalFontPreview: 'グリフのプレビュー', terminalFontReset: '既定値を使用', translucencyTitle: 'ウィンドウの透過', translucencyDesc: 'テキストも含めウィンドウ全体を透過させてデスクトップを表示します。', translucencyGlassDesc: 'マットガラス: デスクトップが滑らかなぼかしとして透け、テキストは鮮明なまま。', translucencyModeClear: 'クリア', translucencyModeGlass: 'ガラス', translucencyTintTitle: '色味', translucencyFadeTitle: 'フェード', translucencyFrostTitle: 'くもりの質感', translucencyFrost: { 'under-window': '深い', popover: 'やわらか', titlebar: '明るい', header: 'まぶしい' }, translucencyScopeTitle: '適用範囲', translucencyScope: { window: 'ウィンドウ全体', sidebar: 'サイドバーのみ' }, backdropTitle: 'チャット背景', backdropDesc: '会話の背後に表示される淡い彫像の画像。', introSplashTitle: 'イントロ表示', introSplashDesc: '空のチャットに表示されるワードマークとプロンプト。', reactionsTitle: 'メッセージリアクション', reactionsDesc: 'iMessage風の絵文字タップバック — メッセージにリアクションでき、Hermesもあなたのメッセージにリアクションします。', tipsTitle: 'アプリ内ヒント', tipsDesc: 'アプリの一部を指す小さな吹き出し。待機中にときどき、また役に立つときは Hermes からも表示します。閉じたヒントは二度と表示されません。', tipsReset: (count: number) => `閉じた${count}件のヒントを元に戻す`, toursTitle: 'ガイドツアー', toursDesc: '画面を暗くして各ステップを強調しながら、Hermes がアプリを案内します。', composerPopoutTitle: 'フローティング入力欄', composerPopoutDesc: '入力欄をドックからドラッグして外せるようにします。オフにすると画面下部に固定されます。', vibeHeartsTitle: 'バイブハート', vibeHeartsDesc: 'ありがとう・愛してる・good bot・ハート絵文字のときに浮かぶハート。上のメッセージリアクションとは別です。', embedsTitle: 'インライン埋め込み', embedsDesc: 'リッチプレビューは第三者サイト(YouTube、X など)から読み込まれます。確認は許可するまでプレースホルダーを表示し、常には自動で読み込み、オフはリンクのままにします。', embedsAsk: '確認', embedsAlways: '常に', embedsOff: 'オフ', embedsReset: (count: number) => `許可した${count}件のサービスをリセット`, resumeLastSessionTitle: '起動時に前回のチャットを再開', resumeLastSessionDesc: 'オンの場合、コールドスタート時に直近のチャットを再び開きます。オフにすると常に新しいチャットから始まります。', product: 'プロダクト', productDesc: '読みやすいツール活動と簡潔な要約を表示します。', technical: 'テクニカル', technicalDesc: '生のツール引数、結果、低レベルの詳細を含めます。', themeTitle: 'テーマ', themeDesc: 'デスクトップ専用のパレットです。選択したモードの上に適用されます。', themeProfileNote: profile => `「${profile}」プロファイルに保存されます。プロファイルごとに個別のテーマを保持します。`, installTitle: 'VS Code から導入', installDesc: 'Marketplace の拡張機能 ID(例: dracula-theme.theme-dracula)を貼り付けると、その配色テーマをデスクトップ用パレットに変換します。', installPlaceholder: 'publisher.extension', installButton: 'インストール', installing: 'インストール中…', installError: 'そのテーマをインストールできませんでした。', installed: name => `「${name}」をインストールしました。`, removeTheme: 'テーマを削除', importedBadge: 'インポート済み', pet: { title: 'ペット', intro: 'アプリ上に浮かぶ petdex のアニメーションマスコットを採用しましょう。ツール実行中は走り、成功すると喜び、エラーでしょんぼりと、Hermes の状態に反応します。', restartHint: 'ペット機能には再起動が必要です。この機能が追加される前に起動したアプリが動作中です。Hermes を終了して再度開き、このページに戻ってください。', scaleTitle: 'サイズ', scaleDesc: '浮遊マスコットの大きさを変更します。すべての画面に即時反映されます。', roamTitle: '散歩', roamDesc: 'アイドル中にペットがウィンドウ内を自由に歩き回ります。', on: 'オン', off: 'オフ', chooseTitle: 'ペットを選ぶ', chooseDesc: '選ぶと(必要に応じて)インストールされ、アクティブになります。', searchPlaceholder: 'ペットを検索…', unreachable: 'petdex ギャラリーに接続できませんでした。接続を確認してこのページを開き直してください。', noMatch: query => `「${query}」に一致するペットがありません。`, installedTag: 'インストール済み', generatedTag: '生成', countCapped: (cap, total) => `${total} 件中 ${cap} 件を表示中——入力して絞り込めます。`, count: n => `${n} 件のペット。`, uninstall: name => `${name} をアンインストール`, delete: name => `${name} を削除`, deleteTitle: name => `${name} を削除しますか?`, deleteBody: 'ペットを完全に削除します。再インストールはできません。', deleteConfirm: '削除', rename: name => `${name} の名前を変更`, renameTitle: 'ペットの名前を変更', renamePlaceholder: 'ペットに名前を付ける', renameSave: '保存', exportPet: name => `${name} をエクスポート`, adoptFailed: slug => `${slug} を採用できませんでした`, uninstallFailed: slug => `${slug} をアンインストールできませんでした`, renameFailed: slug => `${slug} の名前を変更できませんでした`, exportFailed: slug => `${slug} をエクスポートできませんでした`, noneAvailable: 'オンにできるペットがありません。', turnOnFailed: 'ペットをオンにできませんでした。', turnOffFailed: 'ペットをオフにできませんでした。' } }, fieldLabels: defineFieldCopy({ model: 'デフォルトモデル', modelContextLength: 'コンテキストウィンドウ', fallbackProviders: 'フォールバックモデル', toolsets: '有効なツールセット', timezone: 'タイムゾーン', display: { personality: '人格', showReasoning: '推論ブロック' }, desktop: { repoScanEnabled: 'リポジトリの自動検出', repoScanRoots: 'リポジトリの検索ルート', repoScanExcludePaths: '除外するリポジトリパス' }, agent: { maxTurns: '最大エージェントステップ', imageInputMode: '画像添付', apiMaxRetries: 'API 再試行回数', serviceTier: 'サービス階層', toolUseEnforcement: 'ツール使用の強制' }, terminal: { cwd: '作業ディレクトリ', backend: '実行バックエンド', timeout: 'コマンドタイムアウト', persistentShell: '永続シェル', envPassthrough: '環境変数の引き継ぎ', dockerImage: 'Docker イメージ', singularityImage: 'Singularity イメージ', modalImage: 'Modal イメージ', daytonaImage: 'Daytona イメージ' }, fileReadMaxChars: 'ファイル読み取り上限', toolOutput: { maxBytes: 'ターミナル出力上限', maxLines: 'ファイルページ上限', maxLineLength: '行長上限' }, codeExecution: { mode: 'コード実行モード' }, approvals: { mode: '承認モード', timeout: '承認タイムアウト', mcpReloadConfirm: 'MCP 再読み込みの確認' }, commandAllowlist: 'コマンド許可リスト', security: { redactSecrets: 'シークレットを伏せる', allowPrivateUrls: 'プライベート URL を許可' }, browser: { allowPrivateUrls: 'ブラウザーのプライベート URL', autoLocalForPrivateUrls: 'プライベート URL にはローカルブラウザーを使用' }, checkpoints: { enabled: 'ファイルチェックポイント', maxSnapshots: 'チェックポイント上限' }, voice: { recordKey: '音声ショートカット', maxRecordingSeconds: '最大録音時間', autoTts: '応答を読み上げる' }, stt: { enabled: '音声認識', provider: '音声認識プロバイダー', local: { model: 'ローカル文字起こしモデル', language: '文字起こし言語' }, openai: { model: 'OpenAI STT モデル' }, groq: { model: 'Groq STT モデル' }, mistral: { model: 'Mistral STT モデル' }, elevenlabs: { modelId: 'ElevenLabs STT モデル', languageCode: 'ElevenLabs 言語', tagAudioEvents: '音声イベントをタグ付け', diarize: '話者分離' } }, tts: { provider: '音声合成プロバイダー', edge: { voice: 'Edge 音声' }, openai: { model: 'OpenAI TTS モデル', voice: 'OpenAI 音声' }, elevenlabs: { voiceId: 'ElevenLabs 音声', modelId: 'ElevenLabs モデル' }, xai: { voiceId: 'xAI (Grok) 音声', language: 'xAI 言語', speed: '再生速度', autoSpeechTags: '自動音声タグ', optimizeStreamingLatency: 'ストリーミング遅延最適化', sampleRate: 'サンプルレート', bitRate: 'ビットレート' }, minimax: { model: 'MiniMax TTS モデル', voiceId: 'MiniMax 音声' }, mistral: { model: 'Mistral TTS モデル', voiceId: 'Mistral 音声' }, gemini: { model: 'Gemini TTS モデル', voice: 'Gemini 音声' }, neutts: { model: 'NeuTTS モデル', device: 'NeuTTS デバイス' }, kittentts: { model: 'KittenTTS モデル', voice: 'KittenTTS 音声' }, piper: { voice: 'Piper 音声' } }, memory: { memoryEnabled: '永続メモリ', userProfileEnabled: 'ユーザープロファイル', memoryCharLimit: 'メモリ予算', userCharLimit: 'プロファイル予算', provider: 'メモリプロバイダー' }, context: { engine: 'コンテキストエンジン' }, compression: { enabled: '自動圧縮', threshold: '圧縮しきい値', targetRatio: '圧縮目標', protectLastN: '保護する直近メッセージ' }, delegation: { model: 'サブエージェントモデル', provider: 'サブエージェントプロバイダー', maxIterations: 'サブエージェントターン上限', maxConcurrentChildren: '並列サブエージェント', childTimeoutSeconds: 'サブエージェントタイムアウト', reasoningEffort: 'サブエージェント推論強度' }, updates: { nonInteractiveLocalChanges: 'アプリ内更新時のローカル変更' } }), fieldDescriptions: defineFieldCopy({ model: 'コンポーザーで別のモデルを選ばない限り、新しいチャットで使用されます。', modelContextLength: '0 のままにすると、選択したモデルから検出されたコンテキストウィンドウを使用します。', fallbackProviders: 'デフォルトモデルが失敗したときに試す provider:model 形式のバックアップです。', display: { personality: '新しいセッションのデフォルトのアシスタントスタイルです。', showReasoning: 'バックエンドが推論内容を提供したときに表示します。' }, desktop: { repoScanEnabled: 'ローカルフォルダを検索して Git リポジトリをプロジェクトに表示します。', repoScanRoots: '検索するフォルダです。空の場合はホームディレクトリを検索します。', repoScanExcludePaths: 'リポジトリ検出時に除外するフォルダとその配下です。' }, timezone: 'Hermes がローカル時刻のコンテキストを必要とするときに使用します。空欄ならシステムのタイムゾーンを使います。', agent: { imageInputMode: '画像添付をモデルへ送る方法を制御します。', maxTurns: 'Hermes が 1 回の実行を停止するまでのツール呼び出しターン上限です。' }, terminal: { cwd: 'ツールとターミナル作業のデフォルトプロジェクトフォルダーです。', persistentShell: 'バックエンドが対応している場合、コマンド間でシェル状態を保持します。', envPassthrough: 'ツール実行へ渡す環境変数です。' }, codeExecution: { mode: 'コード実行を現在のプロジェクトにどれだけ厳密に制限するかを設定します。' }, fileReadMaxChars: 'Hermes が 1 回のファイル読み取りで取得できる最大文字数です。', approvals: { mode: '明示的な承認が必要なコマンドを Hermes がどう扱うかを設定します。', timeout: '承認プロンプトがタイムアウトするまで待つ時間です。' }, security: { redactSecrets: '検出したシークレットを、可能な限りモデルから見える内容から隠します。' }, checkpoints: { enabled: 'ファイル編集前にロールバック用スナップショットを作成します。' }, memory: { memoryEnabled: '将来のセッションに役立つ永続メモリを保存します。', userProfileEnabled: 'ユーザーの好みをまとめた簡潔なプロファイルを維持します。' }, context: { engine: '長い会話がコンテキスト上限に近づいたときの管理戦略です。' }, compression: { enabled: '会話が大きくなったとき、古いコンテキストを要約します。' }, voice: { autoTts: 'アシスタントの応答を自動で読み上げます。' }, stt: { enabled: 'ローカルまたはプロバイダーによる音声文字起こしを有効にします。', elevenlabs: { languageCode: '任意の ISO-639-3 言語コードです。空欄なら ElevenLabs が自動検出します。' } }, updates: { nonInteractiveLocalChanges: 'アプリから Hermes 自身を更新するとき、ローカルのソース変更を保持するか破棄するかを選びます。ターミナル更新では常に確認されます。' } }), about: { heading: 'Hermes Desktop', version: value => `バージョン ${value}`, versionUnavailable: 'バージョンを取得できません', bundleOutOfSync: 'アプリのビルドが古くなっています', bundleOutOfSyncDesc: 'Hermes ランタイムは更新されましたが、デスクトップアプリ自体は古いビルドのままです。アプリを更新するまで、新しいインターフェース機能(Bot Mode など)は表示されません。下の更新を実行してアプリを再ビルドしてください。それでもこの警告が消えない場合は、最新のデスクトップインストーラーから再インストールしてください。', bundleOutOfSyncAction: 'インストーラーを入手', bundleSwapPending: '再起動して更新を完了', bundleSwapPendingDesc: '更新されたアプリはすでにインストール済みです。Hermes を再起動するだけで新しいビルドが読み込まれます。チャットや設定はそのまま保持されます。', bundleSwapPendingAction: 'Hermes を再起動', updates: '更新', checkNow: '今すぐ確認', checking: '確認中…', seeWhatsNew: '新機能を見る', updateNow: '今すぐ更新', releaseNotes: 'リリースノート', onLatest: '最新バージョンです。', installing: '更新をインストール中です。', cantUpdate: 'このビルドはアプリ内から更新できません。', cantReach: '更新サーバーに接続できませんでした。', tapCheck: '更新を探すには「今すぐ確認」を押してください。', updateReady: count => `新しい更新の準備ができました (${count} 件の変更を含みます)。`, updateReadyUnknown: '新しい更新の準備ができました。', lastChecked: age => `前回確認: ${age}`, justNowSuffix: ' · たった今', automaticUpdates: '自動更新', automaticUpdatesDesc: 'Hermes はバックグラウンドで自動的に更新を確認し、利用可能になったら通知します。', branchCommit: (branch, commit) => `ブランチ ${branch} · コミット ${commit}`, never: '未確認', justNow: 'たった今', minAgo: count => `${count} 分前`, hoursAgo: count => `${count} 時間前`, daysAgo: count => `${count} 日前` }, config: { none: 'なし', noneParen: '(なし)', builtinOnly: '内蔵のみ', notSet: '未設定', commaSeparated: 'カンマ区切りの値', searchPlaceholder: '検索…', noResults: '結果が見つかりません', systemDefault: 'システムのデフォルト', loading: 'Hermes の設定を読み込み中...', emptyTitle: '設定項目がありません', emptyDesc: 'このセクションには調整できる設定がありません。', failedLoad: '設定の読み込みに失敗しました', autosaveFailed: '自動保存に失敗しました', imported: '設定をインポートしました', invalidJson: '設定 JSON が無効です', keepAwakeTitle: 'コンピューターをスリープさせない', keepAwakeDesc: '本体のスリープを防ぎ、長時間や夜通しの実行を継続します。画面は暗転できます。' }, quickEntry: { enabledTitle: 'クイック入力', enabledDesc: 'グローバルショートカットで小さな入力欄をどこからでも呼び出し、Hermes を開かずにプロンプトを送信します。', shortcutTitle: 'クイック入力のショートカット', shortcutDesc: '修飾キーが 1 つ以上必要です(例: CommandOrControl+Shift+Space)。', active: 'ショートカットは有効です。', takenBy: 'このショートカットは他のアプリが使用しています。別のものを選んでください。', invalidShortcut: '有効なショートカットではありません。修飾キーを 1 つ以上含めてください。' }, credentials: { pasteKey: 'キーを貼り付け', pasteLabelKey: label => `${label} キーを貼り付け`, optional: '省略可能', enterValueFirst: '最初に値を入力してください。', couldNotSave: '認証情報を保存できませんでした。', remove: '削除', getKey: 'キーを取得', saving: '保存中' }, envActions: { actions: 'アクション', manageInKeys: 'API キーで管理', docs: 'ドキュメント', hideValue: '値を非表示', revealValue: '値を表示', replace: '置き換え', set: '設定', clear: 'クリア' }, gateway: { loading: 'ゲートウェイ設定を読み込み中...', unavailableTitle: 'ゲートウェイ設定は利用できません', unavailableDesc: 'デスクトップ IPC ブリッジはゲートウェイ設定を公開していません。', title: 'ゲートウェイ接続', envOverride: 'env オーバーライド', intro: 'Hermes Desktop はデフォルトで独自のローカルゲートウェイを起動します。別のマシンや信頼できるプロキシの背後で既に動作している Hermes バックエンドをこのアプリで制御する場合は、リモートゲートウェイを使用してください。ゲートウェイ接続はマシン単位の設定で、プロファイルは接続したゲートウェイから検出されます。', 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: 'セッショントークンを貼り付け', plainTextConfirmTitle: 'ゲートウェイトークンを平文で保存しますか?', plainTextConfirmDesc: 'このマシンで OS のキーリングサービスが見つからなかったため、トークンはアプリの接続設定ファイルに暗号化されずに保存され、このユーザーとして実行される任意のプロセスから読み取れる状態になります。暗号化して保存するには、GNOME Keyring または KWallet をインストールまたは有効化してください。', plainTextConfirmAction: '平文で保存', plainTextStoredTitle: 'トークンは平文で保存されています', plainTextStoredDesc: 'セキュアストレージが利用できないため、保存済みのトークンはこのマシンのアプリの接続設定ファイルに暗号化されずに保存されています。暗号化するには GNOME Keyring または KWallet をインストールまたは有効化してください。', keychainEncryptionTitle: 'OS キーチェーンで保存済みのシークレットを暗号化', keychainEncryptionDesc: 'デフォルトはオフです。オンにすると、ゲートウェイのトークンとサインイン資格情報がシステムのキーチェーン(Keychain Access、GNOME Keyring、Windows DPAPI)で暗号化されます。システムから許可やパスワードを求められる場合があります。オフの場合は、現在のユーザーのみが読める通常ファイルとして保存されます。', keychainEncryptionFailed: 'シークレット暗号化の設定を変更できませんでした', 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: 'ゲートウェイ設定を保存できませんでした', sshTitle: 'SSH で接続', sshDesc: 'Hermes は SSH 経由でリモート上に起動され、このアプリにトンネルされます。リモート側で何かを起動・公開する必要はありません。ホストへの鍵ベースの SSH アクセスが前提です。', sshTrustHint: '初回に提示されたホスト鍵を信頼して固定し、以後の変更は拒否します。', sshHostTitle: 'ホスト', sshHostDesc: 'user@host、または ~/.ssh/config の Host エイリアス。', sshHostPick: 'ホストを選択…', sshHostPickTitle: 'ホスト', sshHostPickDesc: '~/.ssh/config の Host エイリアス、または「カスタム」で手入力。', sshHostCustom: 'カスタム(手入力)…', sshUserTitle: 'ユーザー', sshUserDesc: '空欄 = ~/.ssh/config または現在のユーザー。', sshUserPlaceholder: '~/.ssh/config から', sshPortTitle: 'ポート', sshPortDesc: '空欄 = 22 または ~/.ssh/config のポート。', sshKeyTitle: '鍵ファイル', sshKeyDesc: '秘密鍵のパス。空欄 = ssh-agent または ~/.ssh/config。', sshHermesPathTitle: 'Hermes パス(任意)', sshHermesPathDesc: 'リモートの hermes バイナリへのフルパス。空欄 = 自動検出。', sshHermesPathPlaceholder: '自動検出', sshTestConnection: 'SSH をテスト', sshConnect: '接続', sshButtonsHint: '「保存」は次回起動時に適用され、「接続」は今すぐ再接続します。', sshReachable: (host, platform) => `接続可能: ${host}(${platform})— Hermes を検出`, sshIncompleteHost: '接続する前に SSH ホストを入力してください。', sshErrUnreachable: 'SSH でそのホストに到達できませんでした。ホスト、ポート、ネットワークを確認してください。', sshErrAuth: 'SSH 認証に失敗しました。鍵を ssh-agent に読み込む(ssh-add)か、~/.ssh/config に IdentityFile を設定してください。Hermes は非対話的に ssh を実行します。', sshErrHostKey: '前回の接続以降、ホスト鍵が変更されています。想定どおりか確認し、ssh-keygen -R を実行してから再接続してください。', sshErrNotInstalled: 'リモートホストに Hermes がインストールされていません。リモートでインストールする(curl -fsSL https://hermes-agent.nousresearch.com/install.sh | sh)か、Hermes パスを設定してください。', sshErrPlatform: 'サポートされていないリモートプラットフォームです。Hermes Desktop の SSH モードは Linux、macOS、Windows のリモートホストに対応しています。', sshErrTimeout: 'SSH 接続がタイムアウトしました。ホストが到達不能、またはスリープ中の可能性があります。', sshErrUpdateRequired: 'Desktop SSH で接続する前に、リモートホストの Hermes を更新してください。', sshErrUnknown: 'SSH 接続に失敗しました。' }, keys: { loading: 'API キーと認証情報を読み込み中...', failedLoad: 'API キーの読み込みに失敗しました', empty: 'このカテゴリーにはまだ設定がありません。' }, search: { placeholder: 'すべての設定を検索...', pill: '検索' }, profileScope: { appliesTo: '適用対象', editsProfile: profile => `このページの変更は「${profile}」プロファイルに適用されます。` }, 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: 'サーバーを保存', capabilitySummary: (tools, prompts, resources) => `${[`ツール ${tools} 個`, ...(prompts ? [`プロンプト ${prompts} 個`] : []), ...(resources ? [`リソース ${resources} 個`] : [])].join('、')} を有効化`, costTokens: tokens => `1 呼び出しあたり約 ${tokens} トークン`, usage30d: uses => `過去 30 日で ${uses} 回使用`, unusedPill: '未使用', statusConnecting: '接続中…', statusNeedsAuth: '認証が必要です', statusError: 'エラー', statusOff: 'オフ', allServers: 'すべてのサーバー', authenticatedTitle: '認証済み', authenticatedMessage: (server, count) => `${server}: ツール ${count} 個`, waitingForBrowser: 'ブラウザを待機中…', authenticate: '認証', unsavedConnect: '未保存 — 接続するには mcp.json を保存してください。', enableTool: tool => `${tool} を有効化`, disableTool: tool => `${tool} を無効化`, noOutput: 'まだ出力がありません。', deepLinkTitle: 'MCP サーバーを追加しますか?', deepLinkDescription: 'リンクがこの MCP サーバーを Hermes に追加するよう要求しました。下の設定はリンク側から来たものです。内容を必ず確認してください。', deepLinkStdioWarning: 'このサーバーは下記のコマンドでローカルプロセスを実行します。提供元を信頼できる場合のみ続行してください。', deepLinkConfirm: 'サーバーを追加', deepLinkNameInvalid: '名前は 1〜64 文字の英数字、ドット、ハイフン、アンダースコアです。', deepLinkNameConflict: name => `${name} という名前のサーバーは既に存在します。別の名前にするかキャンセルしてください。`, deepLinkErrorTitle: 'MCP インストールリンクを拒否しました', deepLinkErrorName: 'リンクのサーバー名が欠落しているか無効です。', deepLinkErrorConfig: 'リンクの設定が有効な base64 エンコード JSON ではありません。', deepLinkErrorShape: '設定は文字列の `url` または `command` フィールドを持つ JSON オブジェクトである必要があります。', deepLinkErrorUrl: 'サーバー URL は http:// と https:// のみ許可されます。', deepLinkErrorTooLarge: '設定ペイロードが 32KB の上限を超えています。', importButton: 'インポート', importPlaceholder: 'mcp.json スニペット、npx/docker コマンド、claude mcp add 行、URL、Cursor リンクを貼り付け…', importNoMatch: '貼り付けたテキストからサーバー設定を認識できませんでした。', importConfirm: 'mcp.json に追加', importConfirmMany: count => `${count} 件のサーバーを mcp.json に追加` }, model: { loading: 'モデル設定を読み込み中...', appliesDesc: '新しいセッションに適用されます。コンポーザーのモデルピッカーを使ってアクティブなチャットをホットスワップできます。', provider: 'プロバイダー', model: 'モデル', applying: '適用中...', loadFailed: 'モデルを読み込めませんでした', restartRequired: 'アップデート後、このバックエンドは古いコードのままです。再起動して新しいコードを読み込んでください。', restartBackend: 'バックエンドを再起動', restartingBackend: 'バックエンドを再起動中...', restartFailed: 'バックエンドを再起動できませんでした', auxiliaryTitle: '補助モデル', resetAllToMain: 'すべてメインにリセット', auxiliaryDesc: 'ヘルパータスクはデフォルトでメインモデルで実行されます。タスクに専用モデルを割り当てることでオーバーライドできます。', setToMain: 'メインに設定', change: '変更', autoUseMain: '自動 · メインモデルを使用', providerDefault: '(プロバイダーのデフォルト)', tasks: { vision: { label: 'ビジョン', hint: '画像分析' }, compression: { label: '圧縮', hint: 'コンテキストの圧縮' }, skills_hub: { label: 'スキルハブ', hint: 'スキル検索' }, approval: { label: '承認', hint: 'スマート自動承認' }, mcp: { label: 'MCP', hint: 'MCP ツールルーティング' }, title_generation: { label: 'タイトル生成', hint: 'セッションタイトル' }, review: { label: 'レビュー', hint: '/review レビューサブエージェント' }, curator: { label: 'キュレーター', hint: 'スキル使用レビュー' } } }, localModels: { title: 'ローカルモデル', runtimeTitle: 'ローカルランタイム', runtimeReady: backend => `準備完了 · ${backend}`, serverRunning: '実行中', runtimeInstalled: 'llama.cpp ランタイムをインストール済み', runtimeInstalledDetail: (tag, backend) => `ビルド ${tag}、${backend} バックエンド。サーバーは Hermes が起動・管理します。`, installTitle: 'ローカルランタイムをインストール', installDetail: 'llama.cpp 推論エンジン(数百 MB)をダウンロードします。ダウンロードしたモデルはすべてこのマシン上で動作します——アカウント不要、データが外部に送られることはありません。', installAction: 'ランタイムをインストール', installing: 'ランタイムをインストール中…', installFailed: 'ランタイムのインストールに失敗しました', hardwareTitle: 'このマシン', hardwareLoading: 'ハードウェアを確認中…', vram: label => `GPU メモリ ${label}`, ram: label => `RAM ${label}`, unifiedMemory: 'ユニファイドメモリ', modelsTitle: 'モデル', recommended: 'おすすめ', recommendedReason: { 'best-quality-resident': 'GPU に完全に載り、フルスピードで動くモデルの中で最高品質です。おすすめは品質とこのハードウェアでの予測速度を両立させて選ばれます。', 'speed-gated-quality': 'より高品質なモデルもこのマシンに載りますが、メモリ帯域の制約で応答が遅くなります — これは速度を保てる最良のモデルです。', 'fastest-resident': 'このハードウェアでフルスピードに達するモデルはありません。GPU メモリ内で動くものの中で最速です。', 'least-painful-spilled': 'GPU メモリに完全に収まるモデルはありません — システム RAM からの実行で最も快適なモデルです。' } as Record, downloaded: 'ダウンロード済み', downloadAction: size => `ダウンロード · ${size}`, downloadProgress: (done, total) => `ダウンロード中 ${done} / ${total}`, downloadDoneToast: model => `${model} の準備ができました。`, installDoneToast: 'ローカルランタイムのインストールが完了しました。', useAction: '使用する', activePill: 'デフォルト', updateTitle: 'エンジンの更新があります', updateDetail: (next, current) => `新しい llama.cpp ビルド(${next})をインストールできます——現在は ${current} です。ダウンロード中もモデルは引き続き使えます。`, updateAction: 'エンジンを更新', updating: 'エンジンを更新中…', upToDateTitle: 'エンジンは最新です', upToDateDetail: (tag, backend) => `llama.cpp ${tag}(${backend})で動作中——Hermes が提供する最新ビルドです。`, updateToast: next => `ローカルエンジンの新しいビルド(${next})があります。設定 → ローカルモデル から更新できます。`, activeDetail: '新しいチャットはこのモデルを使用——最初のメッセージ送信時に読み込みます', activeNotLoaded: '最初のメッセージで読み込みます', loadedPill: '読み込み済み', placementResident: 'すべて GPU 上', placementSpilled: '一部 RAM 上', placementResidentTip: 'このコンテキストウィンドウで GPU メモリ内で完全に動作しています — フルスピード。', placementSpilledTip: 'モデルの一部がシステム RAM から動作しています — 動作しますが遅くなります。よりコンパクトなビルドか小さいコンテキストなら完全に収まります。', loadingPill: '読み込み中…', ejectTip: 'GPU メモリを解放(必要時に再読み込み)', ejected: 'モデルをアンロードしました——GPU メモリを解放しました。', ejectFailed: 'モデルをアンロードできませんでした', stopServer: 'オフにする', startServer: 'オンにする', runtimeRunningDetail: 'ローカルサーバーが実行中です。オフにすると GPU メモリを全て解放し、再度オンにするまで新しいチャットはローカルモデルを使用しません。', serverStopped: 'ローカルサーバーを停止しました——GPU メモリを解放しました。', serverStarted: 'ローカルサーバー実行中。', serverStopFailed: 'ローカルサーバーを停止できませんでした', serverStartFailed: 'ローカルサーバーを起動できませんでした', activating: '起動中…', activateFailed: model => `${model} への切り替えに失敗しました`, activateDoneToast: model => `新しいチャットは ${model} を使用します。`, downloadFailed: model => `${model} のダウンロードに失敗しました`, pillFitsGpu: 'GPU に完全に収まります', pillUsesRam: 'システム RAM を使用', pillTooBig: 'このマシンには大きすぎます', browseTitle: 'さらにモデルを探す', browseHint: 'Hugging Face 全体を検索できます。ここでダウンロードしたモデルは自動でマシンに合わせて動作しますが、当方でのテストは行われていません。', browsePlaceholder: 'モデル名または作者で検索…', browseSearching: 'Hugging Face を検索中', browseListing: 'モデルファイルを読み込み中', browseShowFiles: 'ファイルを表示', browseRefresh: '更新', browseDownloads: 'ダウンロード', browseLikes: 'いいね', browseGated: 'Hugging Face へのサインインが必要', browseNoGguf: '互換性のあるモデルファイルが見つかりません。', browseFitUnknown: '適合状況は不明', browseAlreadyDownloaded: 'ダウンロード済みです。', addedByYou: 'あなたが追加', browseDownloadStarted: '{name} をダウンロード中', browseDownloadAria: '{name} をダウンロード', sideloadButton: 'モデルファイルを追加', sideloadTitle: 'GGUF モデルファイルを選択', sideloadDone: '{name} を追加しました。', sideloadAlreadyPresent: '既にライブラリにあります。', pillFullContext: max => `フル ${max} コンテキスト`, pillFullContextTip: '最初からモデルの完全なコンテキストウィンドウで動作します', pillUpTo: max => `最大 ${max} コンテキスト`, pillGrowsTip: '会話が必要とするにつれて自動的に拡張します', pillVision: '画像対応', deleteAction: 'モデルを削除', deleteConfirm: model => `${model} をディスクから削除しますか?`, deleted: model => `${model} を削除しました。`, deleteFailed: '削除に失敗しました' }, providers: { connectAccount: 'アカウントを接続', haveApiKey: 'API キーをお持ちですか?', intro: 'サブスクリプションでサインインします。API キーのコピーは不要です。Hermes がアプリ内でブラウザーサインインを代行します。', connected: '接続済み', collapse: '折りたたむ', connectAnother: '別のプロバイダーを接続', otherProviders: 'その他のプロバイダー', removeConfirm: provider => `${provider} を削除しますか?`, removeKeyManaged: provider => `${provider} は API キーで設定されています。API Keys から削除してください。`, removedTitle: 'アカウントを削除しました', removedMessage: provider => `${provider} を削除しました。`, failedRemove: provider => `${provider} を削除できませんでした`, noProviderKeys: '利用可能なプロバイダー API キーがありません。', searchKeys: 'プロバイダーを検索…', noKeysMatch: '一致するプロバイダーがありません。', localEndpoint: { title: 'ローカル / カスタムエンドポイント', description: 'OpenAI 互換のエンドポイント(Zyphra、vLLM、llama.cpp、Ollama など)を指定します。' }, loading: 'プロバイダーを読み込み中...' }, sessions: { loading: 'アーカイブ済みセッションを読み込み中…', archivedTitle: 'アーカイブ済みセッション', archivedIntro: 'アーカイブ済みチャットはサイドバーでは非表示になりますが、すべてのメッセージは保持されます。サイドバーのチャットを Ctrl/⌘ クリックするとアーカイブできます。', emptyArchivedTitle: 'アーカイブがありません', emptyArchivedDesc: 'チャットをアーカイブするとここに表示されます。', unarchive: 'アーカイブを解除', deletePermanently: '完全に削除', messages: count => `${count} 件のメッセージ`, restored: '復元しました', deleteConfirm: title => `"${title}" を完全に削除しますか?この操作は元に戻せません。`, autoArchiveTitle: '古いチャットを自動アーカイブ', autoArchiveDesc: 'しばらく操作していないチャットを自動的にアーカイブします。ピン留めしたチャットはアーカイブされず、削除もされません。アーカイブされたチャットはここに移動します。', autoArchiveDaysLabel: 'アーカイブまでの日数', autoArchiveDaysUnit: '日間操作なし', autoArchiveFailed: '自動アーカイブを更新できませんでした', 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: '準備完了', needsSignIn: 'サインインが必要', needsSetup: 'セットアップが必要', activeBackend: '使用中', activeBackendHint: 'これが現在アクティブなバックエンドです', useBackend: 'このバックエンドを使う', nousIncluded: 'Nous サブスクリプションに含まれています。有効にするには Nous Portal にサインインしてください。', nousAuthNeededTitle: 'Nous Portal にサインイン', nousAuthNeededMessage: provider => `${provider} は保存されましたが、Nous Portal にサインインするまで有効になりません。`, nousAuthSignIn: 'サインイン', nousAuthDoneTitle: 'Nous Portal に接続しました', nousAuthDoneMessage: 'サブスクリプションのバックエンドが有効になりました。', nousAuthFailed: 'Nous Portal のサインインが完了しませんでした', noApiKeyRequired: 'API キーは不要です。', postSetupHint: step => `このバックエンドは一度だけインストールが必要です (${step})。このマシン上で実行され、数分かかる場合があります。`, postSetupInstalledHint: 'インストール済みです。問題がある場合のみセットアップを再実行してください。', postSetupRun: 'セットアップを実行', postSetupRerun: 'セットアップを再実行', postSetupInstalled: 'インストール済み', postSetupRunning: 'インストール中…', postSetupStarting: '開始中…', postSetupCompleteTitle: 'セットアップ完了', postSetupCompleteMessage: step => `${step} をインストールしました。`, postSetupErrorTitle: 'セットアップはエラーで終了しました', postSetupErrorMessage: step => `${step} のログを確認してください。`, postSetupFailed: step => `${step} のセットアップの実行に失敗しました`, webSearchActive: backend => `検索: ${backend}`, webExtractActive: backend => `抽出: ${backend}`, webCapabilityUnset: '未設定', webUseForSearch: '検索に使用', webUseForExtract: '抽出に使用', webUsedForSearch: '検索バックエンド', webUsedForExtract: '抽出バックエンド', webCapabilitySelectedMessage: (provider, capability) => `${provider} がウェブ${capability === 'search' ? '検索' : '抽出'}を担当します。`, failedSelectCapability: provider => `${provider} の設定に失敗しました`, terminalBackend: { sectionTitle: '実行バックエンド', loading: '実行バックエンドを確認中…', failedLoad: 'ターミナルバックエンドの読み込みに失敗しました', ready: '準備完了', needsSetup: 'セットアップが必要', unavailable: '利用不可', inUse: '使用中', selectedTitle: 'バックエンドを選択しました', selectedMessage: backend => `ターミナルコマンドは ${backend} で実行されます。新しいセッションに適用されます。`, failedSelect: backend => `${backend} の選択に失敗しました`, needsSetupHint: 'このバックエンドは今すぐ選択できますが、セットアップが完了するまでコマンドは失敗します。' }, browserRealProfile: { label: '実際のブラウザプロファイルを使用', description: '既定ブラウザのログイン情報と Cookie を管理されたスナップショットにコピーし、エージェントはそれを使ってブラウジングします。実際のプロファイルが直接開かれることはありません。新しいセッションに適用されます。', enabledTitle: '実プロファイルブラウジング:オン', enabledMessage: '新しいセッションは既定ブラウザプロファイルのスナップショットでブラウジングします。', disabledTitle: '実プロファイルブラウジング:オフ', disabledMessage: 'プロファイルのスナップショットは削除され、新しいセッションはクリーンなブラウザを使用します。', failedSave: '実プロファイル設定を保存できませんでした', prompt: { title: 'サイトにログインしたまま利用', body: 'Hermes が既定ブラウザプロファイルのスナップショットでブラウジングできるようにすると、サイトはログイン済みの状態で開きます。', bulletSnapshot: 'Cookie とログイン情報は管理されたスナップショットにコピーされます。', bulletLiveProfile: '実際のブラウザプロファイルが直接開かれることはありません。', bulletLocal: 'データがこのコンピュータの外に出ることはありません。', dontShowAgain: '今後表示しない', notNow: '今はしない', enable: 'プロファイルを使用' } } } }, skills: { tabSkills: 'スキル', tabToolsets: 'ツールセット', tabMcp: 'MCP', all: 'すべて', searchSkills: 'スキルを検索...', searchToolsets: 'ツールセットを検索...', refresh: 'スキルを更新', refreshing: 'スキルを更新中', loading: '機能を読み込み中...', noSkillsTitle: 'スキルが見つかりません', noSkillsDesc: '検索を広げるか、別のカテゴリーを試してください。', noToolsetsTitle: 'ツールセットが見つかりません', noToolsetsDesc: '検索キーワードを広げてください。', noDescription: '説明はありません。', configured: '設定済み', needsKeys: 'キーが必要', visionModelHint: 'ビジョンは補助モデル設定を使用します。画像対応モデルはそこで選択され、ここでプロバイダーごとに選ぶものではありません。', visionModelLink: '設定 → モデル でビジョンモデルを選択', toolsetsEnabled: (enabled, total) => `${enabled}/${total} ツールセットが有効`, configureToolset: label => `${label} を設定`, toggleToolset: (label, enabled) => `${label} ツールセットを${enabled ? 'オン' : 'オフ'}にする`, skillsLoadFailed: 'スキルの読み込みに失敗しました', toolsetsRefreshFailed: 'ツールセットの更新に失敗しました', skillEnabled: 'スキルを有効にしました', skillDisabled: 'スキルを無効にしました', toolsetEnabled: 'ツールセットを有効にしました', toolsetDisabled: 'ツールセットを無効にしました', appliesToNewSessions: name => `${name} は新しいセッションに適用されます。`, failedToUpdate: name => `${name} の更新に失敗しました`, sortMostUsed: '使用頻度順', sortAlpha: 'A–Z', sortMostUsedDesc: '↓ 使用頻度順', sortLeastUsedAsc: '↑ 使用頻度が低い順', enableAll: 'すべて有効化', disableAll: 'すべて無効化', disableUnused: '未使用を無効化', bulkUpdated: count => `${count} 件を新しいセッション向けに更新しました。`, bulkNoChange: '変更するものはありません。', usageCount: count => `${count} 回使用`, provenance: { agent: '学習済み', bundled: '組み込み', hub: 'ハブ' }, emptyNoneFound: noun => `${noun} が見つかりません`, emptyNothingMatches: query => `「${query}」に一致するものはありません。`, emptyNoneAvailable: noun => `利用可能な ${noun} はまだありません。`, changesApplyNewSessions: '変更は新しいセッションに適用されます。', skillUpdated: 'スキルを更新しました', edit: '編集', archive: 'アーカイブ', skillArchivedTitle: 'スキルをアーカイブしました', skillArchivedMessage: 'hermes curator restore で復元できます。', officialCatalog: 'インストール可能', officialPill: '公式' }, starmap: { title: 'メモリグラフ', subtitle: (nodes, clusters) => `${clusters} カテゴリの ${nodes} スキル`, close: 'メモリグラフを閉じる', refresh: '更新', memory: 'メモリ', filterAll: 'すべて', filterUsed: '使用済み', filterLearned: '学習済み', viewGraph: 'グラフ', loadFailed: 'メモリグラフを読み込めませんでした', loading: '読み込み中…', emptyTitle: 'まだ学習はありません', emptyDesc: 'Hermes がスキルやメモリを蓄積すると、ここに表示されます。' }, 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}時間前`, ageDays: days => `${days}日前`, durationSeconds: seconds => `${seconds}秒`, durationMinutes: (minutes, seconds) => `${minutes}分 ${seconds}秒`, tokens: value => `${value} トーク` }, commandCenter: { close: 'コマンドセンターを閉じる', paletteTitle: 'コマンドパレット', back: '戻る', searchPlaceholder: 'セッション、ビュー、アクションを検索', goTo: '移動', goToSession: 'セッションへ移動', branches: 'ブランチ', startInBranch: branch => `${branch} で新しい会話`, commandCenter: 'コマンドセンター', appearance: '外観', settings: '設定', changeTheme: 'テーマを変更', changeColorMode: 'カラーモードを変更…', pets: { title: 'ペット', placeholder: 'ペットを検索…', loading: 'petdex ギャラリーを読み込み中…', error: 'petdex ギャラリーに接続できません。', staleBackend: 'ペット機能を使うには Hermes を再起動してください。', empty: '一致するペットがありません。', turnOff: 'オフ', turnOn: 'オン', installed: 'インストール済み', generatedTag: '生成', adoptFailed: 'ペットを採用できませんでした。', toggleFailed: enabled => `ペットを${enabled ? 'オン' : 'オフ'}にできませんでした。`, noneAvailable: '利用可能なペットがありません。' }, generatePet: { title: 'ペットを生成', placeholder: '生成するペットを説明…', promptHint: '説明を入力して Enter を押すと、4 つの見た目を生成します。', readyHint: 'Enter を押すと、説明から 4 つの見た目を生成します。', generate: '生成', generating: '生成中…', retry: '再試行', hatch: '孵化', spawning: 'スポーン中…', hatching: 'ペットを孵化しています…', hatchingSub: '命を吹き込んでいます…', hatched: '孵化しました!', hatchRow: (_state, done, total) => `フレームを描画中… ${done}/${total}`, hatchComposing: 'まとめています…', hatchSaving: 'もうすぐです…', namePlaceholder: 'ペットに名前を付ける', staleBackend: 'ペットを生成するには Hermes を更新してください。', backgroundHint: 'このウィンドウは閉じても大丈夫です。完了したら Hermes が通知します。', slowProviderHint: '数分かかることがあります', remix: 'リミックス', remixConfirmTitle: 'この見た目でリミックスしますか?', remixConfirmBody: 'これを起点に新しい候補を生成します。数分かかることがあります。', genericError: '生成に失敗しました。もう一度試すか、候補を選んでください。', referenceImageTooLarge: '参照画像が大きすぎます。16 MB 未満の画像を使ってください。', referenceImageInvalid: '参照画像を読み込めませんでした。PNG/JPG/WebP/GIF を試してください。', adopt: '迎え入れる', startOver: 'やり直す' }, installTheme: { title: 'テーマをインストール…', pageTitle: 'テーマをインストール', placeholder: 'VS Code Marketplace を検索...', loading: 'Marketplace を検索中...', error: 'Marketplace に接続できませんでした。', empty: '一致するテーマがありません。', install: 'インストール', installing: 'インストール中...', installed: 'インストール済み', installs: count => `${count} 回インストール` }, 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}`, restartGateway: 'ゲートウェイを再起動', openBrowser: 'ブラウザを開く', gatewayRestartFailed: 'ゲートウェイの再起動に失敗しました。', updateHermes: 'Hermes を更新', reloadWindow: 'ウィンドウを再読み込み', 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} プロファイル`, search: 'プロファイルを検索...', loading: 'プロファイルを読み込み中...', newProfile: '新しいプロファイル', importProfile: 'プロファイルをインポート…', exportProfile: 'プロファイルをエクスポート…', imported: 'プロファイルをインポートしました', exported: 'プロファイルをエクスポートしました', failedImport: 'プロファイルのインポートに失敗しました', failedExport: 'プロファイルのエクスポートに失敗しました', allProfiles: 'すべてのプロファイル', showAllProfiles: 'すべてのプロファイルを表示', switchToProfile: name => `${name} に切り替え`, switchToConnection: name => `${name} に切り替え`, switchConnectionFailed: name => `${name} に接続できませんでした`, manageProfiles: 'プロファイルを管理…', remoteOverride: { menuItem: 'リモートホストに接続…', badge: (host: string) => `${host} で実行中`, title: (profile: string) => `${profile} をリモートホストに接続`, description: 'このプロファイルのセッションは、このパソコンではなく指定したリモートの Hermes で実行されます。', urlLabel: 'リモートアドレス', urlPlaceholder: 'https://hermes.example.com', urlInvalid: 'http:// または https:// で始まる完全なアドレスを入力してください', tokenLabel: 'アクセストークン', tokenPlaceholder: 'リモートのセッショントークンを貼り付け', tokenSavedHint: 'トークンは保存済みです。空欄のままにすると保持されます。', plainTextOptIn: 'このパソコンには安全な鍵ストレージがないため、トークンは暗号化されずにディスクへ保存されます。それでも保存する。', collisionWarning: (label: string) => `「${label}」という名前のゲートウェイが設定に既に存在します。このプロファイル接続は別物であり、それを変更しません。`, confirmTitle: 'このプロファイルをリモートホストに接続しますか?', confirmNote: (profile: string, host: string) => `${profile} の新しいチャットは ${host} で実行されます。コマンドの実行やファイルの読み取りはこのパソコンではなくそのコンピュータで行われます。信頼できるホストにのみ接続してください。`, confirmBack: '戻る', connect: '接続', connecting: '接続中…', disconnect: 'リモート接続を解除', savedTitle: 'プロファイルを接続しました', savedMessage: (profile: string, host: string) => `${profile} は ${host} で実行されます`, removedTitle: 'リモート接続を解除しました', removedMessage: (profile: string) => `${profile} はこのパソコンで実行されます`, removeFailed: 'リモート接続を解除できませんでした', authFailedTitle: 'リモートホストが保存済みトークンを拒否しました', authFailedMessage: (profile: string, host: string) => `${host} が ${profile} 用に保存されたトークンを拒否しました。リモート側で変更された可能性があります。`, updateToken: '新しいトークンを入力…' }, actions: 'アクション', color: 'カラー…', colorFor: 'カラー', setColor: color => `カラー ${color} に設定`, autoColor: '自動', noProfiles: 'プロファイルが見つかりません。', selectPrompt: '詳細を表示するにはプロファイルを選択してください。', refresh: 'プロファイルを更新', refreshing: 'プロファイルを更新中', default: 'デフォルト', skills: count => `${count} スキル`, env: 'env', defaultBadge: 'デフォルト', rename: '名前を変更', renameMenu: '名前を変更…', exportMenu: 'エクスポート…', editSoul: 'SOUL.md を編集…', 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: '名前', cloneFrom: '複製元', cloneFromNone: 'なし(空)', cloneFromDesc: '選択したプロファイルから設定、スキル、SOUL.md をコピーします。', cloneFromDefault: 'デフォルトプロファイルから設定を複製', cloneFromDefaultDesc: 'デフォルトプロファイルから設定、スキル、SOUL.md をコピーします。', invalidName: hint => `無効なプロファイル名。${hint}`, nameRequired: '名前は必須です', creating: '作成中...', createAction: 'プロファイルを作成', renameTitle: 'プロファイルの名前を変更', renameDescPrefix: '名前を変更するとプロファイルディレクトリと ', renameDescSuffix: ' 内のラッパースクリプトが更新されます。', newNameLabel: '新しい名前', renaming: '名前を変更中...', created: '作成しました', renamed: '名前を変更しました', deleted: '削除しました', setupCopied: 'セットアップコマンドをコピーしました', soulSaved: 'SOUL.md を保存しました', failedLoad: 'プロファイルの読み込みに失敗しました', failedDelete: 'プロファイルの削除に失敗しました', failedCopy: 'セットアップコマンドのコピーに失敗しました', failedLoadSoul: 'SOUL.md の読み込みに失敗しました', failedSaveSoul: 'SOUL.md の保存に失敗しました', failedCreate: 'プロファイルの作成に失敗しました', failedRename: 'プロファイルの名前変更に失敗しました' }, cron: { close: 'Cron を閉じる', title: 'スケジュール済みジョブ', count: count => `${count} 件のジョブ`, modelImpact: { title: 'スケジュール済みジョブの確認が必要です', message: count => `モデル設定を確認するまで、${count} 件のスケジュール済みジョブがスキップされます。`, detailMore: (names, remaining) => `${names}、ほか ${remaining} 件`, review: 'スケジュール済みジョブを確認', saveFailed: 'Hermes はモデルの変更を保存しませんでした。', confirmTitle: 'モデル選択の警告', confirmDetail: 'このトレードオフを受け入れる場合のみ確認してください。', confirmAction: '確認', declined: 'モデル変更をキャンセルしました — データ学習ティアの警告を拒否しました。' }, search: '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} に`, newCron: '新しい Cron', emptyDescNew: 'Cron 式でプロンプトを実行するスケジュールを設定します。Hermes が実行して、選択した宛先に結果を送信します。', emptyDescSearch: '検索キーワードを広げてください。', emptyTitleNew: 'スケジュールされたジョブがまだありません', emptyTitleSearch: '一致なし', last: '前回', next: '次回', noRuns: 'まだ実行されていません', manage: '管理', showRuns: '実行履歴を表示', hideRuns: '実行履歴を隠す', runHistory: '実行履歴', 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: '例: 日次サマリー', promptLabel: 'プロンプト', promptPlaceholder: '実行ごとにエージェントが行う内容は?', frequencyLabel: '頻度', deliverLabel: '配信先', deliverNeedsHomeChannel: '先にホームチャンネルを設定してください', modelLabel: 'モデル', modelDefault: 'デフォルト(グローバルモデル)', customScheduleLabel: 'カスタムスケジュール', customPlaceholder: '0 9 * * * または weekdays at 9am', customHint: 'Cron 式、または「every hour」「weekdays at 9am」のようなフレーズ。', optional: '省略可能', promptRequired: 'プロンプトは必須です。', promptScheduleRequired: 'プロンプトとスケジュールは必須です。', scheduleRequired: 'スケジュールは必須です。', scriptOnlyEditHint: 'スクリプトのみのジョブ(AI プロンプトなし)。ジョブ ID:', saveChanges: '変更を保存', createAction: 'Cron を作成', tabs: { jobs: 'ジョブ', blueprints: 'ブレーンプリント' }, blueprints: { tab: 'ブレーンプリント', startFrom: '開始点', custom: 'カスタム', subtitle: 'すぐに使える自動化', dialogDesc: '詳細を入力してスケジュールします。', scheduleIt: 'スケジュールする', scheduling: 'スケジュール中...', scheduled: 'ブレーンプリントをスケジュールしました', loading: 'ブレーンプリントを読み込み中...', failedLoad: 'ブレーンプリントの読み込みに失敗しました', emptyTitle: '利用できるブレーンプリントはありません', emptyDesc: 'このバックエンドで利用できる自動化ブレーンプリントはありません。' } }, 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: 'パスをコピー' }, artifactCard: { kind: { code: 'コード', html: 'インタラクティブページ', svg: 'グラフィック' }, generating: lines => `生成中… ${lines} 行`, versionBadge: count => `${count} 個のバージョン`, open: '開く' }, artifactPreview: { versionOf: (current, total) => `${total} 中 v${current}`, olderVersion: '前のバージョン', newerVersion: '次のバージョン', latest: '最新', copyContent: 'コンテンツをコピー', download: 'ダウンロード', openInBrowser: 'ブラウザで開く', openInBrowserFailed: 'ブラウザで開けませんでした', missingTitle: 'アーティファクトを利用できません', missingBody: 'このアーティファクトはローカルレジストリに存在しません。' }, sidebar: { nav: { 'new-session': '新しいセッション', skills: 'スキルとツール', messaging: 'メッセージング', artifacts: 'アーティファクト', cron: 'スケジュール済みジョブ' }, searchAria: 'セッションを検索', searchPlaceholder: 'セッションを検索…', clearSearch: '検索をクリア', noMatch: query => `"${query}" に一致するセッションがありません。`, results: '結果', pinned: 'ピン留め', sessions: 'セッション', cronJobs: 'Cronジョブ', groupAriaGrouped: 'セッションを単一リストとして表示', groupAriaUngrouped: 'ワークスペースごとにセッションをグループ化', showProjects: 'プロジェクトを表示', showSessions: 'セッションを表示', groupTitleGrouped: 'セッションのグループ化を解除', groupTitleUngrouped: 'ワークスペースでグループ化', allPinned: 'ここにあるものはすべてピン留めされています。チャットのピン留めを解除すると最近のものに表示されます。', shiftClickHint: 'Shift クリックでピン留め · ドラッグで並べ替え', noWorkspace: 'ワークスペースなし', projectEmpty: 'セッションはまだありません', noSessions: 'セッションはまだありません', noFilterMatches: 'このフィルターに一致するセッションはありません', projects: { sectionLabel: 'プロジェクト', home: 'ホーム', newButton: '新規プロジェクト', createTitle: '新規プロジェクト', createDesc: 'ワークスペースに名前を付け、1つ以上のフォルダを追加します。', renameTitle: 'プロジェクト名を変更', addFolderTitle: 'フォルダを追加', namePlaceholder: '例: Skunkworks', foldersLabel: 'フォルダ', ideaLabel: 'アイデア', ideaPlaceholder: 'このプロジェクトは何ですか?(IDEA.md に保存)', ideaGenerate: 'アイデアを生成', ideaGenerating: '生成中…', ideaShuffle: 'テンプレートをシャッフル', noFolders: 'まだフォルダがありません。', addFolder: 'フォルダを追加', primaryBadge: 'メイン', removeFolder: '削除', create: '作成', menu: 'アクション', menuRename: '名前を変更…', menuAppearance: '外観', noColor: '色なし', menuAddFolder: 'フォルダを追加', menuSetActive: 'アクティブに設定', menuDelete: '削除', reveal: 'フォルダで表示', copyPath: 'パスをコピー', removeFromSidebar: 'サイドバーから削除', createFailed: 'プロジェクトを作成できませんでした', staleBackend: 'プロジェクトを作成するには Hermes バックエンドを更新してください。バックエンドがこのデスクトップアプリより古いです(設定 → 更新 → バックエンド)。', deleteConfirm: 'Hermes から保存済みプロジェクトを削除します。ファイル・git リポジトリ・ワークツリーはそのまま残ります。', startWork: '新しいワークツリー', newWorktreeTitle: '新しいワークツリー', newWorktreeDesc: 'このワークツリーのブランチ名を入力してください。', branchPlaceholder: '例: my-feature', branchOff: () => ({ after: ' から分岐', before: '' }), baseBranchPlaceholder: 'ブランチを検索…', baseBranchNone: 'ブランチが見つかりません', startWorkFailed: 'ワークツリーを作成できませんでした', worktreeStaleBackend: 'このリモート接続でワークツリーを作成するには Hermes バックエンドを更新してください — git ワークツリー API 以前のバージョンです。', worktreeProjectLabel: 'プロジェクト', worktreeProjectPlaceholder: 'プロジェクトを検索…', worktreeProjectNone: 'フォルダのあるプロジェクトがありません', convertBranch: 'ブランチを変換…', convertBranchTitle: 'ブランチを変換', convertBranchDesc: 'チェックアウト済みのブランチを開くか、空いているブランチのワークツリーを作成します。', convertBranchPlaceholder: 'ブランチを検索…', convertBranchInstead: '既存のブランチを変換', branchOpenExisting: '開く', branchSwitchHome: 'ホームを切替', branchCreateWorktree: '新しいワークツリー', branchTrackRemote: 'リモートを追跡', branchesLoading: 'ブランチを読み込み中…', noBranches: 'ブランチが見つかりません', removeWorktree: 'ワークツリーを削除', removeWorktreeFailed: 'ワークツリーを削除できませんでした(コミットされていない変更?)', removeWorktreeConfirm: 'git から削除(ワークツリーのディレクトリを削除しますが、ブランチは残ります)するか、サイドバーからレーンを隠してワークツリーをディスク上に残します。', removeWorktreeDirty: 'このワークツリーにはコミットされていない変更があります。強制削除(変更を破棄)するか、レーンを隠してディスク上に残します。', forceRemove: '強制削除', enter: label => `${label} を開く` }, newSessionIn: label => `${label} で新しいセッション`, showMoreIn: (count, label) => `${label} でさらに ${count} 件を表示`, loading: '読み込み中…', loadMore: 'さらに読み込む', loadCount: step => `さらに ${step} 件を読み込む`, messageCount: count => `${count} 件のメッセージ`, toolCallCount: count => `${count} 件のツール呼び出し`, row: { pin: 'ピン留め', unpin: 'ピン留めを解除', markUnread: '未読にする', markRead: '既読にする', unreadFailed: '未読状態を更新できませんでした', copyId: 'ID をコピー', export: 'エクスポート', branchFrom: '分岐', rename: '名前を変更…', archive: 'アーカイブ', newWindow: '新しいウィンドウ', openInTerminal: 'ターミナルで開く', copyIdFailed: 'セッション ID をコピーできませんでした', sessionActions: 'セッションアクション', sessionRunning: 'セッション実行中', needsInput: '入力が必要です', waitingForAnswer: '回答を待っています', finishedUnread: '完了 — 未読', backgroundRunning: 'バックグラウンドタスク実行中', draftSession: '下書き — 未送信', handoffOrigin: platform => `${platform} から引き継ぎ`, ownedByProfile: profile => `プロファイル: ${profile}`, renamed: '名前を変更しました', renameFailed: '名前の変更に失敗しました', renameTitle: 'セッションの名前を変更', renameDesc: '空欄にするとクリアされます。', untitledPlaceholder: '無題のセッション', deleteTitle: 'セッションを削除しますか?', deleteDesc: title => `「${title}」を完全に削除します。この操作は元に戻せません。`, deleting: '削除中…', deleted: 'セッションを削除しました', untitledChat: id => `セッション ${id}`, ageNow: 'たった今', ageDay: '日', ageHour: '時間', ageMin: '分' }, dateDivider: { today: '今日の早い時間', yesterday: '昨日', thisWeek: '今週', lastWeek: '先週', thisMonth: '今月' }, statusDivider: { working: '実行中', done: '完了' } }, composer: { message: 'メッセージ', wakingProfile: profile => `${profile} を起動中…`, placeholderStarting: 'Hermes を起動中...', placeholderReconnecting: 'Hermes に再接続中…', placeholderFollowUp: 'フォローアップを送信', newSessionPlaceholders: [ '何を作りますか?', 'Hermes にタスクを与える', '何か考えていることはありますか?', '必要なことを説明してください', '何に取り組みますか?', '何でも聞いてください', '目標から始める' ], followUpPlaceholders: [ 'フォローアップを送信', 'さらにコンテキストを追加', 'リクエストを改善', '次は何ですか?', '続けましょう', 'さらに進める', '調整または続行' ], startVoice: '音声会話を開始', openDirective: '開く', queueMessage: 'メッセージをキューに入れる', stop: '停止', send: '送信', speaking: '話しています', transcribing: '文字起こし中', thinking: '考え中', muted: 'ミュート', listening: '聴いています', muteMic: 'マイクをミュート', unmuteMic: 'マイクのミュートを解除', stopListening: '聴き取りを停止して送信', stopShort: '停止', endConversation: '音声会話を終了', endShort: '終了', stopDictation: '口述を停止', transcribingDictation: '口述を文字起こし中', voiceControls: '音声', voiceDictation: '音声口述', speakReplies: '返信を読み上げる', stopSpeakingReplies: '返信の読み上げを停止', wakeWordListening: phrase => `ウェイクワード:「${phrase}」— 待機中`, wakeWordOff: phrase => `ウェイクワード:「${phrase}」— オフ`, wakeWordPausedVoice: phrase => `ウェイクワード:「${phrase}」— 音声チャット中は一時停止`, lookupLoading: '検索中…', lookupNoMatches: '一致なし。', lookupTry: '試す', lookupOr: 'または', commonCommands: '一般的なコマンド', hotkeys: 'ホットキー', helpFooter: 'フルパネルを開く · Backspace で閉じる', commandDescs: { '/help': 'コマンドとホットキーの全リスト', '/clear': '新しいセッションを開始', '/resume': '以前のセッションを再開', '/details': 'トランスクリプトの詳細レベルを制御', '/copy': '選択または最後のアシスタントメッセージをコピー', '/quit': 'hermes を終了' }, hotkeyDescs: { 'composer.mention': 'ファイル、フォルダー、URL、Git を参照', 'composer.slash': 'スラッシュコマンドパレット', 'composer.help': 'クイックヘルプ(削除で閉じる)', 'composer.sendNewline': '送信 · 改行は Shift+Enter', 'composer.sendQueued': '次のキュー済みターンを送信', 'keybinds.openPanel': 'すべてのキーボードショートカット', 'composer.cancel': 'ポップオーバーを閉じる · 実行をキャンセル', 'composer.history': 'ポップオーバー / 履歴を切り替え' }, attachUrlTitle: 'URL を添付', attachUrlDesc: 'Hermes がページを取得し、このターンのコンテキストとして含めます。', urlPlaceholder: 'https://example.com/post', urlHintPre: '完全な URL を入力してください。例: ', attach: '添付', queued: count => `${count} 件キュー済み`, queuedPaused: count => `${count} 件キュー済み — 一時停止中`, attachmentOnly: '添付のみのターン', emptyTurn: '空のターン', attachments: count => `${count} 件の添付`, editingInComposer: 'コンポーザーで編集中', editingQueuedInComposer: 'コンポーザーでキュー済みターンを編集中', queueEdit: '編集', queueSendNext: '次に送信', queueSteer: 'ステア — 現在のターンを今すぐ修正', queueSend: '送信', queueDelete: '削除', queueResume: '再開', queueResumeTip: '停止により一時停止中 — キュー済みターンの送信を再開します', queueStuckTitle: 'キュー内のメッセージを送信できません', queueStuckBody: 'キューに入れたターンの送信が繰り返し失敗しました。まだキューに残っています。もう一度送信してください。', 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: 'これがどのように機能するか説明し、主要なファイルを教えてください。' } } }, statusStack: { agents: 'エージェント', background: count => `バックグラウンド ${count} 件`, goalActive: '目標進行中', goalDone: '目標達成', goalPaused: '目標一時停止中', goalWaiting: '目標待機中', subagents: count => `サブエージェント ${count} 件`, todos: (done, total) => `タスク ${done}/${total}`, running: '実行中', stop: '停止', dismiss: '閉じる', exit: code => `終了コード ${code}`, coding: { title: 'ワークツリー', noBranch: 'ブランチなし', detached: 'デタッチ', clean: 'クリーン', changed: count => `${count} 件変更`, ahead: count => `${count} 先行`, behind: count => `${count} 遅延`, review: 'レビュー', close: '閉じる', openChanges: '変更を開く', openFile: 'ファイルを開く', stage: 'ステージ', unstage: 'ステージ解除', stageAll: 'すべてステージ', viewAsTree: 'ツリー表示', viewAsList: 'リスト表示', revert: '取り消し', revertAll: 'すべて取り消し', revertConfirm: 'このファイルの変更を破棄してコミット済みの状態に戻しますか?この操作は元に戻せません。', revertAllConfirm: 'すべての変更を破棄してコミット済みの状態に戻しますか?この操作は元に戻せません。', staged: 'ステージ済み', noChanges: '変更なし', notRepo: 'Git リポジトリではありません', noDiff: '表示する差分がありません', scopeUncommitted: '未コミット', scopeBranch: 'ブランチ', scopeLastTurn: '前のターン', commit: 'コミット', commitAndPush: 'コミットしてプッシュ', commitPlaceholder: shortcut => `メッセージ(${shortcut} でコミット)`, generateCommitMessage: 'コミットメッセージを生成', stopGenerating: '生成を停止', createPr: 'PR を作成', openPr: 'PR を開く', ghMissing: 'PR を開くには GitHub CLI (gh) をインストールしてサインインしてください', agentShip: 'Hermes にコミットと PR を任せる', agentShipUnavailable: 'この変更を持つチャットが画面にありません。', agentShipPrompt: '現在の変更を確認し、分かりやすい Conventional Commits 形式でコミットし、ブランチをプッシュして、プルリクエストを作成してください。', newBranch: '新しいブランチ', branchOffFrom: base => `${base} から新しいブランチ`, switchTo: branch => `${branch} に切り替え`, switchFailed: branch => `${branch} に切り替えできませんでした`, worktrees: 'ワークツリー' } }, updates: { stages: { idle: '準備中…', prepare: '準備中…', fetch: 'ダウンロード中…', pull: 'もうすぐ完了…', pydeps: '仕上げ中…', update: 'Hermes を更新中…', rebuild: 'デスクトップアプリを再ビルド中…', restart: 'Hermes を再起動中…', done: '更新が完了しました', manual: 'ターミナルから更新', guiSkew: 'デスクトップアプリを更新してください', error: '更新が一時停止中' }, checking: '更新を確認中…', checkFailedTitle: '更新を確認できませんでした', tryAgain: '再試行', notAvailableTitle: '更新は利用できません', unsupportedMessage: 'このバージョンの Hermes はアプリ内から自分を更新できません。', connectionRetry: '接続を確認してもう一度試してください。', latestBody: '最新バージョンを実行しています。', latestBodyBackend: 'バックエンドは最新バージョンを実行しています。', allSetTitle: '準備完了', availableTitle: '新しい更新が利用可能', availableBody: '新しいバージョンの Hermes をインストールする準備ができています。', availableTitleBackend: 'バックエンドの更新があります', availableBodyBackend: '接続中の Hermes バックエンドの新しいバージョンをインストールできます。', availableBodyNoChangelog: '新しいバージョンを利用できます。このインストール形式ではリリースノートは表示できません。', updateNow: '今すぐ更新', maybeLater: '後で', moreChanges: count => `さらに ${count} 件の変更が含まれています。`, manualTitle: 'ターミナルから更新', manualBody: 'Hermes をコマンドラインからインストールしたため、更新もそこで実行されます。これをターミナルに貼り付けてください:', manualPickedUp: 'Hermes は次回起動時に新しいバージョンを読み込みます。', guiSkewTitle: 'デスクトップアプリを更新してください', guiSkewBody: 'バックエンドは更新されましたが、このデスクトップアプリのパッケージは変更されていません。一致させるために Hermes デスクトップアプリ(AppImage / .deb / .rpm)を更新または再インストールしてください。', copy: 'コピー', copied: 'コピーしました', done: '完了', applyingBody: 'Hermes アップデーターが独自のウィンドウで引き継ぎ、完了後に自動的に Hermes を再度開きます。更新中はご自分で Hermes を開き直さないでください。', applyingBodyBackend: 'リモートバックエンドが更新を適用して再起動します。復帰すると Hermes が自動的に再接続します。', applyingClose: 'このウィンドウは更新中に閉じ、その後 Hermes が自動的に再度開きます。', errorTitle: '更新が完了しませんでした', errorBody: 'ご安心ください。何も失われていません。今すぐ再試行できます。', blockerTitle: 'Hermes を更新するためにローカルプレビューを閉じますか?', blockerBody: '更新する前に、これらのローカルプレビューを停止する必要があります。ファイルが変更または削除されることはありません。', foreignBlockerTitle: '他のプロセスを閉じて Hermes を更新', foreignBlockerBody: 'Hermes はこれらのプロセスを安全に自動終了できません。各プロセスを所有するアプリ、ターミナル、またはサービスを閉じてから、もう一度更新してください。', mixedBlockerBody: 'Hermes は以下のローカルプレビューを閉じることができます。更新を続けるには、他のプロセスを手動で閉じる必要があります。', closePreviewsAndUpdate: 'プレビューを閉じて更新', closePreviewsAndCheckAgain: 'プレビューを閉じて再確認', localPreview: 'ローカルプレビュー', portLabel: port => `ポート ${port}`, pidLabel: pid => `PID ${pid}`, technicalDetails: '技術的な詳細', notNow: '今は後で', clientAlsoBehindTitle: 'デスクトップアプリが古くなっています', clientAlsoBehindMessage: 'バックエンドは最新ですが、このデスクトップアプリはまだ古いバージョンです。最新の修正を反映するには更新してください。', clientAlsoBehindAction: 'デスクトップアプリを更新', everythingDispatched: '更新を開始しました', everythingSkipped: 'スキップ', everythingRowFailed: '更新に失敗しました', everythingFanoutFailedTitle: '他のインスタンスを更新できませんでした', applyStatus: { preparing: 'バックエンドを更新しています…', pulling: 'バックエンドを更新中…', restarting: 'バックエンドが更新を読み込むため再起動しています…', notAvailable: 'このバックエンドでは更新を利用できません。', failed: 'バックエンドの更新に失敗しました。', noReturn: 'バックエンドがオンラインに戻りませんでした。更新が完了していない可能性があります。バックエンドホストを確認してください。' } }, install: { stageStates: { pending: '待機中', running: 'インストール中', succeeded: '完了', skipped: 'スキップ', failed: '失敗' }, oneTimeTitle: 'Hermes には一度限りのインストールが必要です', unsupportedDesc: platform => `${platform} では自動の初回インストールはまだ利用できません。ターミナルを開いて以下のコマンドを実行し、このアプリを再起動してください。以降の起動ではこの手順はスキップされます。`, installCommand: 'インストールコマンド', copyCommand: 'コマンドをコピー', viewDocs: 'インストールドキュメントを見る', installTo: 'インストール先', retryAfterRun: '実行しました — 再試行', setupChoiceTitle: 'Hermes Desktop をセットアップ', setupChoiceDesc: 'すでに実行している Hermes ゲートウェイに接続するか、このコンピューターに Hermes をローカルインストールします。', connectExistingTitle: '既存の Hermes に接続', connectExistingShort: '既存環境に接続', connectExistingDesc: 'セッショントークンまたはブラウザーサインインでリモートバックエンドを使用します。ローカルインストールは開始されません。', installLocalTitle: 'Hermes をローカルにインストール', installLocalDesc: 'Hermes をダウンロードし、Python 環境を作成して、このコンピューターでバックエンドを実行します。', localStartUnavailable: 'ローカルインストールを開始できません。Hermes Desktop を再起動して、もう一度お試しください。', remoteSetupTitle: '既存の Hermes に接続', remoteSetupDesc: 'ゲートウェイ URL を入力してください。Hermes Desktop がトークンとブラウザーサインインのどちらが必要かを検出します。', remoteUrlTitle: 'ゲートウェイ URL', remoteUrlDesc: 'Hermes ゲートウェイのベース URL を使用します。リモートの場合は https:// を含めてください。', remoteUrlPlaceholder: 'https://gateway.example.com/hermes', probing: 'ゲートウェイ認証方式を検出中...', probeError: 'その Hermes ゲートウェイに到達できませんでした。', identityProvider: 'ID プロバイダー', authTitle: '認証', authNeedsOauth: provider => `このゲートウェイをテストする前に ${provider} でサインインしてください。`, authSignedIn: 'ブラウザーサインインが完了しました。', connected: '接続済み', signIn: 'サインイン', signInWith: provider => `${provider} でサインイン`, enterUrlFirst: '先にゲートウェイ URL を入力してください。', signInIncomplete: '認証が完了する前にサインインウィンドウが閉じられました。', tokenTitle: 'セッショントークン', tokenDesc: 'リモートゲートウェイの .env ファイルからセッショントークンを貼り付けます。', pasteSessionToken: 'セッショントークンを貼り付け', incompleteSignInTest: 'OAuth で保護されたこのゲートウェイをテストする前にサインインしてください。', incompleteTokenTest: 'このゲートウェイをテストする前にセッショントークンを入力してください。', testConnection: '接続をテスト', testSucceeded: (baseUrl, version) => `${baseUrl}${version ? ` (${version})` : ''} に接続しました。`, applyRemote: '適用して再接続', backToSetup: '戻る', 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 を実行するための推奨方法', fireworksPitch: '直接モデル API — Fireworks がホストする最先端モデル', localModelsTitle: 'モデルをローカルで実行', localModelsPitch: 'アカウント不要——モデルをダウンロードしてこのマシンで実行', openRouterPitch: '1 つのキーで数百のモデル — 堅実なデフォルト', apiKeyOptions: { fireworks: { short: 'モデル API に直接接続', description: 'Fireworks AI がホストするモデルに直接アクセスします。' }, 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 が自動接続します', external: 'ターミナルで一度サインインして、チャットに戻ります' }, startingSignIn: provider => `${provider} のサインインを開始中...`, verifyingCode: provider => `${provider} でコードを確認中...`, connectedProvider: provider => `${provider} が接続されました`, connectedPicking: provider => `${provider} が接続されました。デフォルトモデルを選択中...`, signInFailed: 'サインインに失敗しました。再試行してください。', signInExpired: '承認待ちでタイムアウトしました。多くの場合、開いたタブのサインインページが止まっている(サーバー側の問題)ためです。そのページでサインインを完了してから再試行してください。解決しない場合は API キーまたは CLI を利用してください。', 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: 'モデルが見つかりません。', addProvider: 'プロバイダーを追加', loadFailed: 'モデルを読み込めませんでした', downloading: 'ダウンロード中', localDownloadsHeading: 'ローカル', noAuthenticatedProviders: '認証済みプロバイダーがありません。', pro: 'Pro', proNeedsSubscription: 'Pro モデルには有料の Nous サブスクリプションが必要です。', free: '無料', freeTier: '無料プラン', priceTitle: '100 万トークンあたりの入力/出力価格', wasPrice: '旧価格' }, modelVisibility: { title: 'モデル', search: 'モデルを検索', noAuthenticatedProviders: '認証済みプロバイダーがありません。', addProvider: 'プロバイダーを追加…' }, shell: { windowControls: 'ウィンドウコントロール', paneControls: 'ペインコントロール', appControls: 'アプリコントロール', modelMenu: { search: 'モデルを検索', noModels: 'モデルが見つかりません', editModels: 'モデルを編集…', refreshModels: 'モデルを更新', fast: '高速' }, modelOptions: { comboDetails: 'モデル / コンボの詳細', noOptions: 'このモデルにはオプションがありません', options: 'オプション', thinking: '思考', fast: '高速', effort: '努力度', minimal: '最小', low: '低', medium: '中', high: '高', xhigh: '特高', max: '最大', ultra: 'ウルトラ', updateFailed: 'モデルオプションの更新に失敗しました', fastFailed: '高速モードの更新に失敗しました' }, gatewayMenu: { gateway: 'ゲートウェイ', connected: '接続済み', connecting: '接続中', offline: 'オフライン', inferenceReady: '推論準備完了', inferenceNotReady: '推論準備未完了', checkingInference: '推論を確認中', disconnected: '切断済み', reconnectGateway: 'ゲートウェイに再接続', openSystem: 'システムパネルを開く', connection: label => `接続: ${label}`, recentActivity: '最近のアクティビティ', viewAllLogs: 'すべてのログを見る →', messagingPlatforms: 'メッセージングプラットフォーム' }, approvalMode: { title: '承認モード', ariaLabel: mode => `承認モード: ${mode}`, manual: '手動', manualDescription: '承認が必要な操作の前に確認します', smart: 'スマート', smartDescription: '必要な場合にのみ確認します', off: 'オフ', offDescription: '承認プロンプトなしで実行します' }, statusbar: { unknown: '不明', restart: '再起動', update: '更新', updateInProgress: '更新中', commitsBehind: (count, branch) => `${branch} より ${count} コミット遅れています`, desktopVersion: version => `Hermes Desktop v${version}`, backendVersion: version => `バックエンド v${version}`, clientLabel: version => `クライアント v${version}`, connectionSsh: host => `SSH: ${host}`, connectionRemote: host => `リモート: ${host}`, connectionCloud: host => `クラウド: ${host}`, connectionCloudTooltip: host => `Hermes Cloud · ${host}`, connectionSshTooltip: host => `SSH · ${host}`, connectionRemoteTooltip: host => `Remote · ${host}`, backendLabel: version => `バックエンド v${version}`, commit: sha => `コミット ${sha}`, branch: branch => `ブランチ ${branch}`, closeCommandCenter: 'コマンドセンターを閉じる', openCommandCenter: 'コマンドセンターを開く', showTerminal: 'ターミナルを表示', hideTerminal: 'ターミナルを非表示', gateway: 'ゲートウェイ', gatewayReady: '準備完了', gatewayNeedsSetup: '設定が必要', gatewayUnavailable: '推論を利用できません', gatewayChecking: '確認中', gatewayConnecting: '接続中', gatewayOffline: 'オフライン', gatewayRestarting: '再起動中…', gatewayTitle: 'ゲートウェイ', agents: 'エージェント', closeAgents: 'エージェントを閉じる', openAgents: 'エージェントを開く', subagents: count => `${count} サブエージェント`, failed: count => `${count} 失敗`, running: count => `${count} 実行中`, cron: 'Cron', openCron: 'Cron ジョブを開く', starmap: 'メモリグラフ', openStarmap: 'メモリグラフを開く', turnRunning: '実行中', contextUsage: 'コンテキスト使用状況', systemResources: { title: 'システムリソース', loading: 'リソース…', gpuUtilization: 'GPU 使用率', gpuMemory: 'GPU メモリ', ram: 'RAM', unifiedNote: 'ユニファイドメモリ——GPU とシステムがこのプールを共有します。', toggle: 'システムリソース' }, contextUsagePanel: { categories: { conversation: '会話', mcp: 'MCP', memory: 'メモリ', rules: 'ルール', skills: 'スキル', subagent_definitions: 'サブエージェント定義', system_prompt: 'システムプロンプト', tool_definitions: 'ツール定義' }, empty: 'コンテキストデータはまだありません', loading: '内訳を読み込み中…', percentFull: percent => `${percent}% 使用中`, title: 'コンテキスト使用状況', tokenSummary: (used, max) => `${used} / ${max} Tokens` }, session: 'セッション', yoloOn: 'YOLO オン — 危険なコマンドを自動承認中。Shift+クリックで全体に切り替え。', yoloOff: 'YOLO オフ。Shift+クリックで全体に切り替え。', modelNone: 'なし', noModel: 'モデルなし', switchModel: 'モデルを切り替え', openModelPicker: 'モデルピッカーを開く', modelPinned: '手動で固定中 — 新しいチャットは設定のデフォルトではなくこのモデルを使用します', modelTitle: (provider, model) => `モデル · ${provider}: ${model}`, providerModelTitle: (provider, model) => `${provider} · ${model}` } }, rightSidebar: { aria: '右サイドバー', panelsAria: '右サイドバーパネル', files: 'ファイルシステム', terminal: 'ターミナル', noFolderSelected: 'フォルダーが選択されていません', changeCwdTitle: '作業ディレクトリを変更', remotePickerTitle: 'リモートフォルダーを選択', remotePickerDescription: '接続中のバックエンド上のフォルダーを参照します。', remotePickerSelect: 'フォルダーを選択', folderTip: cwd => cwd, openFolder: 'フォルダーを開く', refreshTree: 'ツリーを更新', collapseAll: 'すべてのフォルダーを折りたたむ', previewUnavailable: 'プレビューは利用できません', couldNotPreview: path => `${path} をプレビューできませんでした`, noProjectTitle: 'プロジェクトなし', noProjectBody: 'プロジェクトを開くと、ファイルの閲覧と変更の確認ができます。', noProjectOpen: 'プロジェクト未選択', noDiffs: '差分なし', unreadableTitle: '読み取り不可', unreadableBody: error => `このフォルダーを読み取れませんでした (${error})。`, emptyTitle: '空', emptyBody: 'このフォルダーは空です。', treeErrorTitle: 'ツリーエラー', treeErrorBody: 'ファイルツリーがこのフォルダーのレンダリング中にエラーが発生しました。', tryAgain: '再試行', loadingTree: 'ファイルツリーを読み込み中', loadingFiles: 'ファイルを読み込み中', terminalHide: 'ターミナルを非表示', terminalsAria: 'ターミナル', terminalNew: '新しいターミナル', terminalCloseOthers: '他を閉じる', terminalCloseAll: 'すべて閉じる', addToChat: 'チャットに追加' }, preview: { tab: 'プレビュー', closePane: 'プレビューペインを閉じる', loading: 'プレビューを読み込み中', unavailable: 'プレビューは利用できません', opening: '開いています...', hide: '非表示', openPreview: 'プレビューを開く', openInBrowser: 'ブラウザで開く', openInExternal: '外部で開く', popIn: 'ポップイン', popOut: 'ポップアウト', linkHint: '⌘/Ctrl+クリックでプレビューペイン', sourceLineTitle: 'クリックして選択 · Shift クリックで拡張 · コンポーザーにドラッグ', source: 'ソース', renderedPreview: 'プレビュー', diff: '差分', unknownSize: 'サイズ不明', binaryTitle: 'これはバイナリファイルのようです', binaryBody: label => `${label} をプレビューすると読み取り不能なテキストが表示される場合があります。`, largeTitle: 'このファイルは大きいです', largeBody: (label, size) => `${label} は ${size} です。Hermes は最初の 512 KB のみを表示します。`, previewAnyway: 'とにかくプレビュー', truncated: '最初の 512 KB を表示しています。', noInlineTitle: 'インラインプレビューなし', noInlineBody: mimeType => `${mimeType || 'このファイルタイプ'} はコンテキストとして添付できます。`, edit: '編集', editing: '編集中', unsavedChanges: '未保存の変更', saveFailed: message => `保存できませんでした:${message}`, diskChangedTitle: 'ファイルがディスク上で変更されました', diskChangedBody: 'このファイルは開いてから変更されています。あなたの版で上書きするか、編集を破棄して再読み込みしますか?', overwrite: '上書き', discardReload: '破棄して再読み込み', 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: 'サーバーが見つかりません', remoteLoopback: 'このアドレスはエージェントを実行しているマシンを指しており、このマシンではありません。ブラウザペインはページをローカルで読み込むため、リモートの開発サーバーにはポート転送か到達可能なホスト名が必要です。', failedToLoad: 'プレビューの読み込みに失敗しました', tryAgain: '再試行', restarting: 'Hermes を再起動中...', askRestart: 'Hermes にサーバーの再起動を依頼', lookingRestart: taskId => `Hermes は再起動するプレビューサーバーを検索中です (${taskId})`, restartingTitle: 'プレビューサーバーを再起動中', restartingMessage: 'Hermes はバックグラウンドで作業中です。進捗はプレビューコンソールで確認してください。', startRestartFailed: message => `サーバー再起動を開始できませんでした: ${message}`, restartFailed: 'サーバーの再起動に失敗しました', hideConsole: 'プレビューコンソールを非表示', showConsole: 'プレビューコンソールを表示', hideDevTools: 'プレビュー DevTools を非表示', openDevTools: 'プレビュー DevTools を開く', goBack: '戻る', goForward: '進む', reload: 'ページを再読み込み', address: 'アドレス', addressPlaceholder: 'アドレスを入力', blankPageBody: '上のアドレス欄に入力するか、Hermes にページを開くよう頼んでください。', 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: 'プレビュー' } }, zones: { showTabStrip: 'タブを表示', hideTabStrip: 'タブを隠す', showStripTab: title => `${title} を表示`, hideStripTab: title => `${title} を隠す`, lastTabKeptTitle: '最後のタブは残ります', lastTabKeptBody: 'このゾーンには少なくとも 1 つの表示タブが必要です。先に別のタブを表示するか、サイドバー全体を折りたたんでください。', toggleStripTab: title => `${title} タブを切り替え`, minimize: '最小化', restore: '復元', reload: '再読み込み', closeOthers: '他を閉じる', closeToRight: '右側を閉じる', closeAll: 'すべて閉じる', newSessionTab: '新しいセッションタブ', newTab: '新しいタブ', pluginDisabled: pluginId => `プラグイン「${pluginId}」を無効化しました`, pluginDisabledBody: '設定 → プラグイン で再有効化するとペインが戻ります。', missingPane: paneId => `ペインが見つかりません: ${paneId}`, editTitle: 'レイアウト', editHint: 'レイアウトを選ぶか、ペインをゾーン間へドラッグ。', reset: 'リセット', templates: 'テンプレート', custom: 'カスタム', newGridLayout: '新しいグリッドレイアウト', saveCurrentAs: '現在の配置をテンプレートとして保存', nameLayoutPlaceholder: 'レイアウト名を入力…', deletePreset: name => `${name} を削除`, zoneEditorTitle: 'ゾーンエディター', editorHintPre: 'クリックで分割 · ', editorHintPost: ' で線の向きを反転 · ゾーンをまたいでドラッグで結合 · 共有辺をドラッグでリサイズ', templateColumns: '列', templateRows: '行', templateGrid: 'グリッド', templatePriority: '優先', zoneTag: index => `ゾーン ${index}`, mergeZones: count => `${count} 個のゾーンを結合`, customZoneName: count => `カスタム ${count} ゾーン`, layoutNamePlaceholder: fallback => `レイアウト名(${fallback})`, saveApply: '保存して適用', notExpressible: 'この配置は互いに噛み合っています(風車型)— 入れ子の分割では表現できません', zoneCount: count => `${count} ゾーン`, tabCount: count => `${count} 個のタブ` }, contextMenu: { link: { openInApp: 'アプリ内ブラウザーで開く', openExternal: '外部ブラウザーで開く', copyUrl: 'URL をコピー', copyResolvedUrl: '解決後の URL をコピー' }, image: { copyImage: '画像をコピー', copyImageAddress: '画像アドレスをコピー', saveImageAs: '画像を名前を付けて保存…' }, edit: { cut: '切り取り', paste: '貼り付け', selectAll: 'すべて選択', addToDictionary: '辞書に追加' }, page: { copyPageUrl: 'ページの URL をコピー', inspectElement: '要素を調査' } }, assistant: { thread: { loadingSession: 'セッションを読み込み中', showEarlier: '以前のメッセージを表示', loadingResponse: 'Hermes が応答を読み込み中', resumeWhenBackgroundDone: count => count === 1 ? 'バックグラウンドタスクの完了後に再開します' : `${count} 件のバックグラウンドタスクの完了後に再開します`, thinking: '考え中', thought: '思考済み', thoughtBriefly: '少し思考', thoughtFor: duration => `${duration} 思考`, turnDuration: duration => `このターンの所要時間: ${duration}`, today: time => `今日 ${time}`, yesterday: time => `昨日 ${time}`, copy: 'コピー', refresh: '更新', moreActions: 'その他のアクション', branchNewChat: '新しいチャットでブランチ', react: 'リアクション', dismissError: 'エラーを閉じる', errorLayers: { auth: '認証エラー', billing: 'クレジット不足', disk: 'ディスク容量不足', endpoint: 'カスタムエンドポイントのエラー', gateway: 'ゲートウェイのエラー', generic: 'ターンが失敗しました', provider: 'プロバイダーのエラー', runtime: 'ローカルランタイムのエラー', streaming: 'ストリーミング接続のエラー' }, errorRetry: '再試行', errorSwitchProvider: 'プロバイダーを切り替え', errorOpenLogs: 'ログを開く', errorOpenLogsFailed: 'ログフォルダを開けませんでした', errorOpenDesktopLogs: 'デスクトップのログを開く', errorCopyDiagnostics: 'エラー詳細をコピー', errorSendDiagnostics: '診断情報を送信', filesChanged: count => `${count} 件のファイルを変更`, reviewChanges: 'レビュー', readAloudFailed: '読み上げに失敗しました', preparingAudio: '音声を準備中...', stopReading: '読み上げを停止', readAloud: '読み上げ', editMessage: 'メッセージを編集', stop: '停止', restorePrevious: '前のチェックポイントに戻す', restoreCheckpoint: 'チェックポイントを復元', restoreFromHere: 'チェックポイントを復元 — このプロンプトから再実行', restoreTitle: 'このチェックポイントに復元しますか?', restoreBody: 'このプロンプト以降のメッセージは会話から削除され、ここからプロンプトが再実行されます。', restoreConfirm: '復元して再実行', restoreNext: '次のチェックポイントに戻す', goForward: '進む', sendEdited: '編集済みメッセージを送信', attachingFile: '添付中…' }, approval: { gatewayDisconnected: 'Hermes ゲートウェイが接続されていません', sendFailed: '承認応答を送信できませんでした', run: '実行', command: 'コマンド', moreOptions: 'その他の承認オプション', allowSession: 'このセッションで許可', alwaysAllowMenu: '常に許可…', jumpToApproval: '承認が必要', reject: '拒否', alwaysTitle: 'このコマンドを常に許可しますか?', alwaysDescription: pattern => `これにより "${pattern}" パターンが永続的な許可リスト (~/.hermes/config.yaml) に追加されます。Hermes はこのセッションや将来のセッションで、このようなコマンドについて再度尋ねません。`, alwaysAllow: '常に許可' }, clarify: { notReady: '明確化リクエストはまだ準備できていません', gatewayDisconnected: 'Hermes ゲートウェイが接続されていません', sendFailed: '明確化応答を送信できませんでした', loadingQuestion: '質問を読み込み中…', other: 'その他(回答を入力)', placeholder: '回答を入力…', skip: 'スキップ', skipped: 'スキップ済み', continueLabel: '続行', confirmAndContinueLabel: '確定して続行', answeredBadge: '回答済み', questionProgress: (answered, total) => `${total}問中${answered}問回答済み`, lateAnswer: (question, choice) => `「${question}」について — 私の回答: ${choice}`, lateAnswerTip: 'この回答をフォローアップメッセージとして下書きします', lateAnswerHint: 'この質問はもう回答を待っていません。選択肢を選ぶとフォローアップメッセージとして下書きされます。' }, tool: { 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: '完了', memoryWriteNoted: 'メモリへの書き込みを記録', actions: { read: '読み取り完了', reading: '読み取り中', opened: 'オープン済み', opening: 'オープン中', failedToOpen: 'オープン失敗', searched: '検索完了', searching: '検索中', ran: '実行完了', running: '実行中', ranCode: 'コード実行完了', runningCode: 'スクリプト作成中' }, prefixes: { browser: 'ブラウザー', web: 'Web' }, titleTemplates: { actionCommand: (action, command) => `${action} ${command}`, actionQuoted: (action, value) => `「${value}」を${action}`, actionTarget: (action, target) => `${target} を${action}`, prefixedDone: (prefix, action) => `${prefix} ${action}`, runningPrefixedTool: (prefix, action) => `${prefix} ${action}を実行中`, runningTool: action => `${action}を実行中` }, titles: { browser_click: { done: 'ページ要素をクリックしました', pending: 'ページ要素をクリック中', pendingAction: 'クリック中' }, browser_fill: { done: 'フォーム欄に入力しました', pending: 'フォーム欄に入力中', pendingAction: '入力中' }, browser_navigate: { done: 'ページを開きました', pending: 'ページをオープン中', pendingAction: 'オープン中' }, browser_snapshot: { done: 'ページスナップショットを取得しました', pending: 'ページスナップショットを取得中', pendingAction: '取得中' }, browser_take_screenshot: { done: 'スクリーンショットを取得しました', pending: 'スクリーンショットを取得中', pendingAction: '取得中' }, browser_type: { done: 'ページに入力しました', pending: 'ページに入力中', pendingAction: '入力中' }, clarify: { done: '質問しました', pending: '質問中', pendingAction: '質問中' }, cronjob: { done: 'Cron ジョブ', pending: 'Cron ジョブをスケジュール中', pendingAction: 'スケジュール中' }, edit_file: { done: 'ファイルを編集しました', pending: 'ファイルを編集中', pendingAction: '編集中' }, execute_code: { done: 'コードを実行しました', pending: 'スクリプト作成中', pendingAction: 'スクリプト作成中' }, image_generate: { done: '画像を生成しました', pending: '画像を生成中', pendingAction: '生成中' }, list_files: { done: 'ファイルを一覧表示しました', pending: 'ファイルを一覧表示中', pendingAction: '一覧表示中' }, memory: { done: 'メモリに保存しました', pending: 'メモリに保存中', pendingAction: '保存中' }, patch: { done: 'ファイルにパッチを適用しました', pending: 'ファイルにパッチ適用中', pendingAction: 'パッチ適用中' }, read_file: { done: 'ファイルを読み取りました', pending: 'ファイルを読み取り中', pendingAction: '読み取り中' }, search_files: { done: 'ファイルを検索しました', pending: 'ファイルを検索中', pendingAction: '検索中' }, session_search_recall: { done: 'セッション履歴を検索しました', pending: 'セッション履歴を検索中', pendingAction: '検索中' }, terminal: { done: 'コマンドを実行しました', pending: 'コマンドを実行中', pendingAction: '実行中' }, todo: { done: 'Todo を更新しました', pending: 'Todo を更新中', pendingAction: '更新中' }, vision_analyze: { done: '画像を分析しました', pending: '画像を分析中', pendingAction: '分析中' }, web_extract: { done: 'Web ページを読み取りました', pending: 'Web ページを読み取り中', pendingAction: '読み取り中' }, web_search: { done: 'Web を検索しました', pending: 'Web を検索中', pendingAction: '検索中' }, write_file: { done: 'ファイルを編集しました', pending: 'ファイルを編集中', pendingAction: '編集中' } } } }, 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: '編集に失敗しました', editTurnUnavailable: 'このターンはサーバー履歴にありません(圧縮で削除された可能性があります)。', resumeFailed: '再開に失敗しました', readOnlyTranscriptTitle: '読み取り専用で開きました', readOnlyTranscriptBody: 'この古いチャットを所有するバックエンドがまだ接続されていないため、読み取り専用のトランスクリプトとして開きました。履歴は無事です。バックエンドが所有を認識するまで送信は無効です。', readOnlyTranscriptSendBlocked: 'このチャットは読み取り専用トランスクリプトとして開いています。送信は無効です。', resumeStrandedTitle: 'このセッションを読み込めませんでした', resumeStrandedBody: 'このセッションへの接続に失敗し、自動再試行も停止しました。ゲートウェイが実行中か確認してから、もう一度お試しください。', resumeRetry: '再試行', nothingToBranch: 'ブランチするものがありません', branchNeedsChat: 'ブランチする前にチャットを開始または再開してください。', sessionBusy: 'セッションが使用中', branchStopCurrent: 'このチャットをブランチする前に現在のターンを停止してください。', branchNoText: 'このメッセージにはブランチするテキストがありません。', branchTitle: n => `下書き: ブランチ #${n}`, branchFailed: 'ブランチに失敗しました', deleteFailed: '削除に失敗しました', archived: 'アーカイブしました', archiveFailed: 'アーカイブに失敗しました', cwdChangeFailed: '作業ディレクトリの変更に失敗しました', cwdStagedTitle: '作業ディレクトリがステージングされました', cwdStagedMessage: 'このアクティブなセッションへの cwd の変更を適用するにはデスクトップバックエンドを再起動してください。', modelSwitchFailed: 'モデルの切り替えに失敗しました', hydrationSyncing: (profile: string) => `${profile} を同期中\u2026`, sessionExported: 'セッションをエクスポートしました', sessionExportFailed: 'セッションをエクスポートできませんでした', imageSaved: '画像を保存しました', downloadStarted: 'ダウンロードを開始しました', restartToUseSaveImage: '画像を保存するには Hermes Desktop を再起動してください。', restartToSaveImages: '画像を保存するには Hermes Desktop を再起動してください', imageDownloadFailed: '画像のダウンロードに失敗しました', openImage: '画像を開く', downloadImage: '画像をダウンロード', savingImage: '画像を保存中', imagePreviewFailed: '画像のプレビューに失敗しました', imageAttach: '画像を添付', imageWriteFailed: '画像のディスクへの書き込みに失敗しました。', imageAttachFailed: '画像の添付に失敗しました', attachImages: '画像を添付', clipboard: 'クリップボード', noClipboardImage: 'クリップボードに画像が見つかりません', clipboardPasteFailed: 'クリップボードからの貼り付けに失敗しました', dropFiles: 'ファイルをドロップ', handoff: { pickPlatform: '送信先を選択', success: platform => `${platform} に引き継ぎました。いつでもここで再開できます。`, systemNote: platform => `↻ ${platform} に引き継ぎました — いつでもここで再開できます。`, failed: error => `引き継ぎに失敗しました: ${error}`, timedOut: 'ゲートウェイの待機がタイムアウトしました。`hermes gateway` は起動していますか?' } }, tips: { close: 'このヒントを今後表示しない', items: { 'new-session': { title: '新しく始める', text: '新しいチャットは、専用のコンテキスト・ターミナル・作業ディレクトリを持ちます。' }, skills: { title: '一度教えれば覚えます', text: 'スキルは手順書のフォルダで、必要な場面で Hermes が自分で読み込みます。' }, messaging: { title: 'デスクを離れても Hermes', text: 'Telegram、Discord、Slack などに接続。同じエージェント、同じ記憶のままです。' }, artifacts: { title: 'Hermes が作ったものすべて', text: '全セッションの画像・ファイル・リンクを一箇所にまとめています。' }, cron: { title: '自動で動く仕事', text: 'プロンプトを毎時・毎晩、または cron 式で実行できます。' }, 'command-palette': { title: 'すべてはこの一箇所から', text: 'セッション、設定、スキル、コマンドはすべてパレットから呼び出せます。' }, profiles: { title: 'プロファイルは独立しています', text: 'それぞれが独自のキー・メモリ・セッションを持つ、別の Hermes です。' }, 'composer-mentions': { title: 'ファイルとコマンド', text: '@ でファイルを会話に取り込み、/ でコマンドを実行できます。' }, 'local-setup': { title: 'このマシンはローカルでモデルを実行できます', text: 'お使いのハードウェアでローカルモデルを動かせます。会話はこのコンピュータから出ず、料金もかかりません。', action: 'セットアップ' }, 'right-pane': { title: '作業用ペイン', text: 'ファイル、ターミナル、レビュー、アプリ内ブラウザはサイドペインにまとまっています。' } } }, errors: { genericFailure: '問題が発生しました', boundaryTitle: 'インターフェイスで問題が発生しました', boundaryDesc: 'ビューで予期しないエラーが発生しました。チャットと設定は安全です。', reloadWindow: 'ウィンドウを再読み込み', openLogs: 'ログを開く' }, ui: { search: { clear: '検索をクリア' }, pagination: { label: 'ページング', previous: '前へ', previousAria: '前のページへ', next: '次へ', nextAria: '次のページへ' }, sidebar: { title: 'サイドバー', description: 'モバイルサイドバーを表示します。', toggle: open => `サイドバーを${open ? '表示' : '非表示'}` } } })