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: '相対パスをコピー',
    rename: '名前を変更…',
    delete: '削除',
    renameTitle: '名前を変更',
    renameLabel: '新しい名前',
    deleteTitle: name => `${name} を削除しますか？`,
    deleteBody: 'ゴミ箱に移動します。そこから復元できます。',
    pathCopied: 'パスをコピーしました'
  },

  boot: {
    ready: 'Hermes Desktop の準備ができました',
    desktopBootFailedWithMessage: message => `デスクトップの起動に失敗しました: ${message}`,
    steps: {
      connectingGateway: 'ライブデスクトップゲートウェイに接続中',
      loadingSettings: 'Hermes の設定を読み込み中',
      loadingSessions: '最近のセッションを読み込み中',
      startingDesktopConnection: 'デスクトップ接続を開始中',
      startingHermesDesktop: 'Hermes Desktop を起動中…'
    },
    errors: {
      backgroundExited: 'Hermes バックグラウンドプロセスが終了しました。',
      backgroundExitedDuringStartup: '起動中に Hermes バックグラウンドプロセスが終了しました。',
      backendStopped: 'バックエンドが停止しました',
      desktopBootFailed: 'デスクトップの起動に失敗しました',
      gatewayConnectionLost: 'ゲートウェイへの接続が切断されました',
      gatewaySignInRequired: 'ゲートウェイへのサインインが必要です',
      ipcBridgeUnavailable: 'デスクトップ IPC ブリッジが利用できません。'
    },
    failure: {
      title: 'Hermes を起動できませんでした',
      description:
        'バックグラウンドゲートウェイが起動しませんでした。以下の回復手順をお試しください。チャットや設定は削除されません。',
      remoteTitle: 'リモートゲートウェイへのサインインが必要です',
      remoteDescription:
        'リモートゲートウェイのセッションが期限切れです。再接続するにはもう一度サインインしてください。チャットや設定は削除されません。',
      retry: '再試行',
      repairInstall: 'インストールを修復',
      useLocalGateway: 'ローカルゲートウェイを使用',
      openLogs: 'ログを開く',
      repairHint: '修復はインストーラーを再実行します。新しいマシンでは数分かかる場合があります。',
      remoteSignInHint:
        'ゲートウェイのログインウィンドウを開きます。代わりにバンドルされたバックエンドに切り替えるには「ローカルゲートウェイを使用」を選択してください。',
      hideRecentLogs: '最近のログを非表示',
      showRecentLogs: '最近のログを表示',
      signedInTitle: 'サインインしました',
      signedInMessage: 'リモートゲートウェイに再接続中…',
      signInIncompleteTitle: 'サインインが完了していません',
      signInIncompleteMessage: '認証が完了する前にログインウィンドウが閉じられました。',
      signInFailed: 'サインインに失敗しました',
      signInToRemoteGateway: 'リモートゲートウェイにサインイン',
      signInWithProvider: provider => `${provider} でサインイン`,
      identityProvider: 'ID プロバイダー'
    }
  },

  notifications: {
    region: '通知',
    hide: '非表示',
    show: '表示',
    more: count => `他 ${count} 件の通知`,
    clearAll: 'すべてクリア',
    dismiss: '通知を閉じる',
    details: '詳細',
    copyDetail: '詳細をコピー',
    copyDetailFailed: '通知の詳細をコピーできませんでした',
    backendOutOfDateTitle: 'バックエンドが古いです',
    backendOutOfDateMessage:
      'Hermes バックエンドがこのデスクトップビルドより古く、正常に動作しない場合があります。更新して揃えてください。',
    updateHermes: 'Hermes を更新',
    updateReadyTitle: '更新の準備ができました',
    updateReadyMessage: count => `${count} 件の新しい変更が利用可能です。`,
    seeWhatsNew: '新機能を見る',
    errors: {
      elevenLabsNeedsKey: 'ElevenLabs STT には ELEVENLABS_API_KEY が必要です。',
      elevenLabsRejectedKey: 'ElevenLabs が API キーを拒否しました (401)。',
      methodNotAllowed:
        'デスクトップバックエンドがそのリクエストを拒否しました (405 Method Not Allowed)。Hermes Desktop を再起動してください。',
      microphonePermission: 'マイクのアクセス許可が拒否されました。',
      openaiRejectedApiKey: 'OpenAI が API キーを拒否しました。',
      openaiRejectedApiKeyWithStatus: status => `OpenAI が API キーを拒否しました (${status} invalid_api_key)。`,
      openaiTtsNeedsKey: 'OpenAI TTS には VOICE_TOOLS_OPENAI_KEY または OPENAI_API_KEY が必要です。'
    },
    voice: {
      configureSpeechToText: '音声モードを使用するには音声認識を設定してください。',
      couldNotStartSession: '音声セッションを開始できませんでした',
      microphoneAccessDenied: 'マイクへのアクセスが拒否されました。',
      microphoneConstraintsUnsupported: 'このデバイスはマイクの制約をサポートしていません。',
      microphoneFailed: 'マイクが失敗しました',
      microphoneInUse: 'マイクは他のアプリで使用中です。',
      microphonePermissionDenied: 'マイクのアクセス許可が拒否されました。',
      microphoneStartFailed: 'マイクの録音を開始できませんでした。',
      microphoneUnsupported: 'このランタイムはマイク録音をサポートしていません。',
      noMicrophone: 'マイクが見つかりませんでした。',
      noSpeechDetected: '音声が検出されませんでした',
      playbackFailed: '音声再生に失敗しました',
      recordingFailed: '音声録音に失敗しました',
      transcriptionFailed: '音声文字起こしに失敗しました',
      transcriptionUnavailable: '音声文字起こしはまだ利用できません。',
      tryRecordingAgain: 'もう一度録音してください。',
      unavailable: '音声は利用できません'
    },
    native: {
      approvalTitle: '承認が必要です',
      approveAction: '承認',
      rejectAction: '拒否',
      inputTitle: '入力が必要です',
      inputBody: 'Hermes が応答を待っています。',
      turnDoneTitle: 'Hermes が完了しました',
      turnDoneBody: '応答の準備ができました。',
      turnErrorTitle: 'ターンが失敗しました',
      backgroundDoneTitle: 'バックグラウンドタスクが完了しました',
      backgroundFailedTitle: 'バックグラウンドタスクが失敗しました'
    }
  },

  remoteDisplayBanner: {
    message: reason =>
      `ソフトウェアレンダリングが有効です — リモートディスプレイを検出しました（${reason}）。ちらつきを防ぐため GPU アクセラレーションは無効化されています。`
  },

  titlebar: {
    hideSidebar: 'サイドバーを非表示',
    showSidebar: 'サイドバーを表示',
    search: '検索',
    searchTitle: 'セッション、ビュー、アクションを検索',
    swapSidebarSides: 'サイドバーの向きを切り替え',
    swapSidebarSidesTitle: 'セッションとファイルブラウザーの位置を入れ替える',
    hideRightSidebar: '右サイドバーを非表示',
    showRightSidebar: '右サイドバーを表示',
    muteHaptics: '触覚フィードバックをオフ',
    unmuteHaptics: '触覚フィードバックをオン',
    openSettings: '設定を開く',
    openStarmap: 'メモリグラフを開く'
  },

  language: {
    label: '言語',
    description: 'デスクトップインターフェイスの言語を選択します。',
    saving: '言語を保存中…',
    saveError: '言語の更新に失敗しました',
    switchTo: '言語を切り替え',
    searchPlaceholder: '言語を検索…',
    noResults: '言語が見つかりません'
  },

  settings: {
    closeSettings: '設定を閉じる',
    exportConfig: '設定を書き出す',
    importConfig: '設定を読み込む',
    resetToDefaults: 'デフォルトに戻す',
    resetConfirm: 'すべての設定を Hermes のデフォルトに戻しますか？',
    exportFailed: '書き出しに失敗しました',
    resetFailed: 'リセットに失敗しました',
    nav: {
      providers: 'プロバイダー',
      providerAccounts: 'アカウント',
      providerApiKeys: 'API キー',
      gateway: 'ゲートウェイ',
      apiKeys: 'ツールとキー',
      keysTools: 'ツール',
      keysSettings: '設定',
      mcp: 'MCP',
      archivedChats: 'アーカイブ済みチャット',
      about: '情報',
      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: 'バックグラウンドのターミナルコマンドが完了しました。'
        }
      },
      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: 'プロダクト表示は生のツールペイロードを隠し、テクニカル表示は入出力をすべて表示します。',
      uiScaleTitle: 'UI スケール',
      uiScaleDesc: (percent: number) =>
        `アプリ全体の文字と UI を拡大縮小します。Cmd/Ctrl と +、-、0 でも変更できます。現在: ${percent}%`,
      translucencyTitle: 'ウィンドウの透過',
      translucencyDesc: 'ウィンドウ全体を透過させてデスクトップを表示します。macOS と Windows のみ。',
      embedsTitle: 'インライン埋め込み',
      embedsDesc:
        'リッチプレビューは第三者サイト（YouTube、X など）から読み込まれます。確認は許可するまでプレースホルダーを表示し、常には自動で読み込み、オフはリンクのままにします。',
      embedsAsk: '確認',
      embedsAlways: '常に',
      embedsOff: 'オフ',
      embedsReset: (count: number) => `許可した${count}件のサービスをリセット`,
      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: '推論ブロック'
      },
      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 言語'
        },
        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: 'バックエンドが推論内容を提供したときに表示します。'
      },
      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: 'バージョンを取得できません',
      updates: '更新',
      checkNow: '今すぐ確認',
      checking: '確認中…',
      seeWhatsNew: '新機能を見る',
      updateNow: '今すぐ更新',
      releaseNotes: 'リリースノート',
      onLatest: '最新バージョンです。',
      installing: '更新をインストール中です。',
      cantUpdate: 'このビルドはアプリ内から更新できません。',
      cantReach: '更新サーバーに接続できませんでした。',
      tapCheck: '更新を探すには「今すぐ確認」を押してください。',
      updateReady: count => `新しい更新の準備ができました (${count} 件の変更を含みます)。`,
      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: '(なし)',
      notSet: '未設定',
      commaSeparated: 'カンマ区切りの値',
      loading: 'Hermes の設定を読み込み中...',
      emptyTitle: '設定項目がありません',
      emptyDesc: 'このセクションには調整できる設定がありません。',
      failedLoad: '設定の読み込みに失敗しました',
      autosaveFailed: '自動保存に失敗しました',
      imported: '設定をインポートしました',
      invalidJson: '設定 JSON が無効です'
    },
    credentials: {
      pasteKey: 'キーを貼り付け',
      pasteLabelKey: label => `${label} キーを貼り付け`,
      optional: '省略可能',
      enterValueFirst: '最初に値を入力してください。',
      couldNotSave: '認証情報を保存できませんでした。',
      remove: '削除',
      getKey: 'キーを取得',
      saving: '保存中'
    },
    envActions: {
      actionsFor: label => `${label} のアクション`,
      credentialActions: '認証情報のアクション',
      docs: 'ドキュメント',
      hideValue: '値を非表示',
      revealValue: '値を表示',
      replace: '置き換え',
      set: '設定',
      clear: 'クリア'
    },
    gateway: {
      loading: 'ゲートウェイ設定を読み込み中...',
      unavailableTitle: 'ゲートウェイ設定は利用できません',
      unavailableDesc: 'デスクトップ IPC ブリッジはゲートウェイ設定を公開していません。',
      title: 'ゲートウェイ接続',
      envOverride: 'env オーバーライド',
      intro:
        'Hermes Desktop はデフォルトで独自のローカルゲートウェイを起動します。別のマシンや信頼できるプロキシの背後で既に動作している Hermes バックエンドをこのアプリで制御する場合は、リモートゲートウェイを使用してください。以下でプロファイルを選択して、それぞれのリモートホストを設定します。',
      appliesTo: '適用対象',
      allProfiles: 'すべてのプロファイル',
      defaultConnection: '独自のオーバーライドがないすべてのプロファイルのデフォルト接続。',
      profileConnection: profile =>
        `"${profile}" がアクティブプロファイルのときのみ使用される接続。ローカルに設定するとデフォルトを継承します。`,
      envOverrideTitle: '環境変数がこのデスクトップセッションを制御しています。',
      envOverrideDesc:
        '保存された設定を使用するには HERMES_DESKTOP_REMOTE_URL と HERMES_DESKTOP_REMOTE_TOKEN の設定を解除してください。',
      localTitle: 'ローカルゲートウェイ',
      localDesc:
        'ローカルホストでプライベートな Hermes バックエンドを起動します。これがデフォルトで、オフラインでも動作します。',
      remoteTitle: 'リモートゲートウェイ',
      remoteDesc:
        'このデスクトップシェルをリモートの Hermes バックエンドに接続します。ホスト型ゲートウェイは OAuth またはユーザー名とパスワードを使用します。自己ホスト型はセッショントークンを使用する場合があります。',
      remoteUrlTitle: 'リモート URL',
      remoteUrlDesc:
        'リモートダッシュボードバックエンドのベース URL。/hermes などのパスプレフィックスもサポートしています。',
      probing: 'このゲートウェイの認証方法を確認中…',
      probeError: 'このゲートウェイにまだ到達できません。URL を確認してください。応答後に認証方法が表示されます。',
      signedIn: 'サインイン済み',
      signIn: 'サインイン',
      signOut: 'サインアウト',
      signInWith: provider => `${provider} でサインイン`,
      authTitle: '認証',
      authSignedInPassword:
        'このゲートウェイはユーザー名とパスワードを使用します。サインイン済みです。セッションは自動的に更新されます。',
      authSignedInOauth:
        'このゲートウェイは OAuth を使用します。サインイン済みです。セッションは自動的に更新されます。',
      authNeedsPassword:
        'このゲートウェイはユーザー名とパスワードを使用します。このデスクトップアプリを承認するにはサインインしてください。',
      authNeedsOauth: provider =>
        `このゲートウェイは OAuth を使用します。このデスクトップアプリを承認するには ${provider} でサインインしてください。`,
      tokenTitle: 'セッショントークン',
      tokenDesc:
        'REST および WebSocket アクセスに使用するダッシュボードセッショントークン。保存済みトークンを維持するには空欄にしてください。',
      existingToken: value => `既存のトークン ${value}`,
      savedToken: '保存済み',
      pasteSessionToken: 'セッショントークンを貼り付け',
      testRemote: 'リモートをテスト',
      saveForRestart: '次回起動時のために保存',
      saveAndReconnect: '保存して再接続',
      diagnostics: '診断',
      diagnosticsDesc: 'ファイルマネージャーで desktop.log を表示します。ゲートウェイの起動に失敗した際に役立ちます。',
      openLogs: 'ログを開く',
      incompleteTitle: 'リモートゲートウェイの設定が不完全です',
      incompleteSignIn: 'リモートに切り替える前にリモート URL を入力してサインインしてください。',
      incompleteToken: 'リモートに切り替える前にリモート URL とセッショントークンを入力してください。',
      incompleteSignInTest: 'テストする前にリモート URL を入力してサインインしてください。',
      incompleteTokenTest: 'テストする前にリモート URL とセッショントークンを入力してください。',
      enterUrlFirst: '最初にリモート URL を入力してください。',
      restartingTitle: 'ゲートウェイ接続を再起動中',
      savedTitle: 'ゲートウェイ設定を保存しました',
      restartingMessage: 'Hermes Desktop は保存された設定を使用して再接続します。',
      savedMessage: '次回起動時に保存されます。',
      connectedTo: (baseUrl, version) => `${baseUrl}${version ? ` · Hermes ${version}` : ''} に接続しました`,
      reachableTitle: 'リモートゲートウェイに到達可能',
      signedOutTitle: 'サインアウトしました',
      signedOutMessage: 'リモートゲートウェイセッションをクリアしました。',
      failedLoad: 'ゲートウェイ設定の読み込みに失敗しました',
      signInFailed: 'サインインに失敗しました',
      signOutFailed: 'サインアウトに失敗しました',
      testFailed: 'リモートゲートウェイのテストに失敗しました',
      applyFailed: 'ゲートウェイ設定を適用できませんでした',
      saveFailed: 'ゲートウェイ設定を保存できませんでした'
    },
    keys: {
      loading: 'API キーと認証情報を読み込み中...',
      failedLoad: 'API キーの読み込みに失敗しました',
      empty: 'このカテゴリーにはまだ設定がありません。'
    },
    mcp: {
      loading: 'MCP サーバーを読み込み中...',
      failedLoad: 'MCP 設定の読み込みに失敗しました',
      nameRequiredTitle: '名前が必要です',
      nameRequiredMessage: 'この MCP サーバーに設定キーを付けてください。',
      objectRequired: 'サーバー設定は JSON オブジェクトである必要があります',
      invalidJson: '無効な MCP JSON',
      saveFailed: '保存に失敗しました',
      removeFailed: '削除に失敗しました',
      gatewayUnavailableTitle: 'ゲートウェイが利用できません',
      gatewayUnavailableMessage: 'MCP を再読み込みする前にゲートウェイを再接続してください。',
      reloadedTitle: 'MCP ツールを再読み込みしました',
      reloadedMessage: '新しいツールスキーマは新しいターンに適用されます。',
      reloadFailed: 'MCP の再読み込みに失敗しました',
      savedTitle: 'MCP サーバーを保存しました',
      savedMessage: name => `${name} は MCP の再読み込み後に適用されます。`,
      newServer: '新しいサーバー',
      reload: 'MCP を再読み込み',
      reloading: '再読み込み中...',
      emptyTitle: 'MCP サーバーがありません',
      emptyDesc: 'MCP ツールを公開するには stdio または HTTP サーバーを追加してください。',
      disabled: '無効',
      editServer: 'サーバーを編集',
      name: '名前',
      serverJson: 'サーバー JSON',
      remove: '削除',
      saveServer: 'サーバーを保存',
      capabilitySummary: (tools, prompts, resources) =>
        `${[`ツール ${tools} 個`, ...(prompts ? [`プロンプト ${prompts} 個`] : []), ...(resources ? [`リソース ${resources} 個`] : [])].join('、')} を有効化`,
      statusConnecting: '接続中…',
      statusNeedsAuth: '認証が必要です',
      statusError: 'エラー',
      statusOff: 'オフ',
      allServers: 'すべてのサーバー',
      authenticatedTitle: '認証済み',
      authenticatedMessage: (server, count) => `${server}: ツール ${count} 個`,
      waitingForBrowser: 'ブラウザを待機中…',
      authenticate: '認証',
      unsavedConnect: '未保存 — 接続するには mcp.json を保存してください。',
      enableTool: tool => `${tool} を有効化`,
      disableTool: tool => `${tool} を無効化`,
      noOutput: 'まだ出力がありません。'
    },
    model: {
      loading: 'モデル設定を読み込み中...',
      appliesDesc:
        '新しいセッションに適用されます。コンポーザーのモデルピッカーを使ってアクティブなチャットをホットスワップできます。',
      provider: 'プロバイダー',
      model: 'モデル',
      applying: '適用中...',
      auxiliaryTitle: '補助モデル',
      resetAllToMain: 'すべてメインにリセット',
      auxiliaryDesc:
        'ヘルパータスクはデフォルトでメインモデルで実行されます。タスクに専用モデルを割り当てることでオーバーライドできます。',
      setToMain: 'メインに設定',
      change: '変更',
      autoUseMain: '自動 · メインモデルを使用',
      providerDefault: '(プロバイダーのデフォルト)',
      tasks: {
        vision: { label: 'ビジョン', hint: '画像分析' },
        web_extract: { label: 'ウェブ抽出', hint: 'ページの要約' },
        compression: { label: '圧縮', hint: 'コンテキストの圧縮' },
        skills_hub: { label: 'スキルハブ', hint: 'スキル検索' },
        approval: { label: '承認', hint: 'スマート自動承認' },
        mcp: { label: 'MCP', hint: 'MCP ツールルーティング' },
        title_generation: { label: 'タイトル生成', hint: 'セッションタイトル' },
        curator: { label: 'キュレーター', hint: 'スキル使用レビュー' }
      }
    },
    providers: {
      connectAccount: 'アカウントを接続',
      haveApiKey: 'API キーをお持ちですか？',
      intro:
        'サブスクリプションでサインインします。API キーのコピーは不要です。Hermes がアプリ内でブラウザーサインインを代行します。',
      connected: '接続済み',
      collapse: '折りたたむ',
      connectAnother: '別のプロバイダーを接続',
      otherProviders: 'その他のプロバイダー',
      removeConfirm: provider => `${provider} を削除しますか？`,
      removeKeyManaged: provider => `${provider} は API キーで設定されています。API Keys から削除してください。`,
      removedTitle: 'アカウントを削除しました',
      removedMessage: provider => `${provider} を削除しました。`,
      failedRemove: provider => `${provider} を削除できませんでした`,
      noProviderKeys: '利用可能なプロバイダー API キーがありません。',
      searchKeys: 'プロバイダーを検索…',
      noKeysMatch: '一致するプロバイダーがありません。',
      loading: 'プロバイダーを読み込み中...'
    },
    sessions: {
      loading: 'アーカイブ済みセッションを読み込み中…',
      archivedTitle: 'アーカイブ済みセッション',
      archivedIntro:
        'アーカイブ済みチャットはサイドバーでは非表示になりますが、すべてのメッセージは保持されます。サイドバーのチャットを Ctrl/⌘ クリックするとアーカイブできます。',
      emptyArchivedTitle: 'アーカイブがありません',
      emptyArchivedDesc: 'チャットをアーカイブするとここに表示されます。',
      unarchive: 'アーカイブを解除',
      deletePermanently: '完全に削除',
      messages: count => `${count} 件のメッセージ`,
      restored: '復元しました',
      deleteConfirm: title => `"${title}" を完全に削除しますか？この操作は元に戻せません。`,
      defaultDirTitle: 'デフォルトのプロジェクトディレクトリ',
      defaultDirDesc:
        '別のフォルダーを選択しない限り、新しいセッションはこのフォルダーで開始します。未設定の場合はホームディレクトリが使用されます。',
      defaultDirUpdated: 'デフォルトのプロジェクトディレクトリを更新しました',
      defaultsTo: label => `デフォルト: ${label}。`,
      change: '変更',
      choose: '選択',
      clear: 'クリア',
      notSet: '未設定',
      failedLoad: 'アーカイブ済みセッションを読み込めませんでした',
      unarchiveFailed: 'アーカイブ解除に失敗しました',
      deleteFailed: '削除に失敗しました',
      updateDirFailed: 'デフォルトディレクトリを更新できませんでした',
      clearDirFailed: 'デフォルトディレクトリをクリアできませんでした'
    },
    toolsets: {
      loadingConfig: '設定を読み込み中',
      savedTitle: '認証情報を保存しました',
      savedMessage: key => `${key} を更新しました。`,
      removedTitle: '認証情報を削除しました',
      removedMessage: key => `${key} を削除しました。`,
      failedSave: key => `${key} の保存に失敗しました`,
      failedRemove: key => `${key} の削除に失敗しました`,
      failedReveal: key => `${key} の表示に失敗しました`,
      removeConfirm: key => `.env から ${key} を削除しますか？`,
      set: '設定済み',
      notSet: '未設定',
      selectedTitle: 'プロバイダーを選択しました',
      selectedMessage: provider => `${provider} が有効になりました。`,
      failedSelect: provider => `${provider} の選択に失敗しました`,
      failedLoad: 'ツール設定の読み込みに失敗しました',
      noProviderOptions:
        'このツールセットにはプロバイダーのオプションがありません。有効にすれば現在の設定で動作します。',
      noProviders: '現在このツールセットに利用可能なプロバイダーがありません。',
      ready: '準備完了',
      nousIncluded: 'Nous サブスクリプションに含まれています。有効にするには Nous Portal にサインインしてください。',
      noApiKeyRequired: 'API キーは不要です。',
      postSetupHint: step =>
        `このバックエンドは一度だけインストールが必要です (${step})。このマシン上で実行され、数分かかる場合があります。`,
      postSetupRun: 'セットアップを実行',
      postSetupRunning: 'インストール中…',
      postSetupStarting: '開始中…',
      postSetupCompleteTitle: 'セットアップ完了',
      postSetupCompleteMessage: step => `${step} をインストールしました。`,
      postSetupErrorTitle: 'セットアップはエラーで終了しました',
      postSetupErrorMessage: step => `${step} のログを確認してください。`,
      postSetupFailed: step => `${step} のセットアップの実行に失敗しました`
    }
  },

  skills: {
    tabSkills: 'スキル',
    tabToolsets: 'ツールセット',
    tabMcp: 'MCP',
    all: 'すべて',
    searchSkills: 'スキルを検索...',
    searchToolsets: 'ツールセットを検索...',
    refresh: 'スキルを更新',
    refreshing: 'スキルを更新中',
    loading: '機能を読み込み中...',
    noSkillsTitle: 'スキルが見つかりません',
    noSkillsDesc: '検索を広げるか、別のカテゴリーを試してください。',
    noToolsetsTitle: 'ツールセットが見つかりません',
    noToolsetsDesc: '検索キーワードを広げてください。',
    noDescription: '説明はありません。',
    configured: '設定済み',
    needsKeys: 'キーが必要',
    toolsetsEnabled: (enabled, total) => `${enabled}/${total} ツールセットが有効`,
    configureToolset: label => `${label} を設定`,
    toggleToolset: label => `${label} ツールセットを切り替え`,
    skillsLoadFailed: 'スキルの読み込みに失敗しました',
    toolsetsRefreshFailed: 'ツールセットの更新に失敗しました',
    skillEnabled: 'スキルを有効にしました',
    skillDisabled: 'スキルを無効にしました',
    toolsetEnabled: 'ツールセットを有効にしました',
    toolsetDisabled: 'ツールセットを無効にしました',
    appliesToNewSessions: name => `${name} は新しいセッションに適用されます。`,
    failedToUpdate: name => `${name} の更新に失敗しました`,
    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 で復元できます。'
  },

  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}時間前`,
    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: 'ペットを切り替えできませんでした。',
      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: 'ゲートウェイを再起動',
    gatewayRestartFailed: 'ゲートウェイの再起動に失敗しました。',
    updateHermes: 'Hermes を更新',
    actionRunning: '実行中',
    actionDone: '完了',
    actionFailed: '失敗',
    actionStartedWaiting: 'アクションが開始されました。ステータスを待機中...',
    loadingStatus: 'ステータスを読み込み中...',
    recentLogs: '最近のログ',
    noLogs: 'ログはまだ読み込まれていません。',
    days: count => `${count}日`,
    statSessions: 'セッション',
    statApiCalls: 'API コール',
    statTokens: 'トークン入力/出力',
    statCost: '推定コスト',
    actualCost: cost => `実際 ${cost}`,
    loadingUsage: '使用状況を読み込み中...',
    noUsage: period => `過去 ${period} 日間に使用履歴がありません。`,
    retry: '再試行',
    dailyTokens: '日別トークン',
    input: '入力',
    output: '出力',
    noDailyActivity: '日別アクティビティがありません。',
    topModels: 'よく使うモデル',
    noModelUsage: 'モデルの使用履歴はまだありません。',
    topSkills: 'よく使うスキル',
    noSkillActivity: 'スキルのアクティビティはまだありません。',
    actions: count => `${count} アクション`
  },

  messaging: {
    search: 'メッセージングを検索...',
    loading: 'メッセージングプラットフォームを読み込み中...',
    loadFailed: 'メッセージングプラットフォームの読み込みに失敗しました',
    states: {
      connected: '接続済み',
      connecting: '接続中',
      disabled: '無効',
      fatal: 'エラー',
      gateway_stopped: 'メッセージングゲートウェイが停止中',
      not_configured: '設定が必要',
      pending_restart: '再起動が必要',
      retrying: '再試行中',
      startup_failed: '起動失敗'
    },
    unknown: '不明',
    hintPendingRestart: 'この変更を適用するにはステータスバーからゲートウェイを再起動してください。',
    hintGatewayStopped: 'ステータスバーからゲートウェイを起動して接続してください。',
    credentialsSet: '認証情報を設定しました',
    needsSetup: '設定が必要',
    gatewayStopped: 'メッセージングゲートウェイが停止中',
    getCredentials: '認証情報を取得',
    openSetupGuide: 'セットアップガイドを開く',
    required: '必須',
    recommended: '推奨',
    advanced: count => `詳細設定 (${count})`,
    noTokenNeeded:
      'このプラットフォームはここでトークンが必要ありません。上のセットアップガイドを使用してから、以下で有効にしてください。',
    enabled: '有効',
    disabled: '無効',
    unsavedChanges: '未保存の変更',
    saving: '保存中...',
    saveChanges: '変更を保存',
    saved: '保存しました',
    replaceValue: '現在の値を置き換え',
    openDocs: 'ドキュメントを開く',
    clearField: key => `${key} をクリア`,
    enableAria: name => `${name} を有効にする`,
    disableAria: name => `${name} を無効にする`,
    platformEnabled: name => `${name} を有効にしました`,
    platformDisabled: name => `${name} を無効にしました`,
    restartToApply: 'この変更はゲートウェイの再起動後に有効になります。',
    setupSaved: name => `${name} の設定を保存しました`,
    restartToReconnect: '新しい認証情報はゲートウェイの再起動後に有効になります。',
    keyCleared: key => `${key} をクリアしました`,
    setupUpdated: name => `${name} の設定が更新されました。`,
    failedUpdate: name => `${name} の更新に失敗しました`,
    failedSave: name => `${name} の保存に失敗しました`,
    failedClear: key => `${key} のクリアに失敗しました`,
    fieldCopy: {
      TELEGRAM_BOT_TOKEN: {
        label: 'ボットトークン',
        help: '@BotFather でボットを作成し、表示されたトークンを貼り付けてください。',
        placeholder: 'Telegram ボットトークンを貼り付け'
      },
      TELEGRAM_ALLOWED_USERS: {
        label: '許可する Telegram ユーザー ID',
        help: '推奨。@userinfobot の数値 ID をカンマ区切りで。設定しないと誰でもボットに DM できます。'
      },
      TELEGRAM_PROXY: { label: 'プロキシ URL', help: 'Telegram がブロックされているネットワークでのみ必要です。' },
      DISCORD_BOT_TOKEN: {
        label: 'ボットトークン',
        help: 'Discord Developer Portal でアプリケーションを作成し、ボットを追加してからトークンを貼り付けてください。'
      },
      DISCORD_ALLOWED_USERS: {
        label: '許可する Discord ユーザー ID',
        help: '推奨。カンマ区切りの Discord ユーザー ID。'
      },
      DISCORD_REPLY_TO_MODE: { label: '返信スタイル', help: 'first、all、または off。' },
      DISCORD_ALLOW_ALL_USERS: {
        label: 'すべての Discord ユーザーを許可',
        help: '開発用のみ。true にすると、許可リストなしで誰でもボットに DM できます。'
      },
      DISCORD_HOME_CHANNEL: {
        label: 'ホームチャンネル ID',
        help: 'ボットがプロアクティブなメッセージを送信するチャンネル（Cron 出力、リマインダー）。'
      },
      DISCORD_HOME_CHANNEL_NAME: {
        label: 'ホームチャンネル名',
        help: 'ログやステータス出力でのホームチャンネルの表示名。'
      },
      BLUEBUBBLES_ALLOW_ALL_USERS: {
        label: 'すべての iMessage ユーザーを許可',
        help: 'true にすると BlueBubbles の許可リストをスキップします。'
      },
      MATTERMOST_ALLOW_ALL_USERS: { label: 'すべての Mattermost ユーザーを許可' },
      MATTERMOST_HOME_CHANNEL: { label: 'ホームチャンネル' },
      QQ_ALLOW_ALL_USERS: { label: 'すべての QQ ユーザーを許可' },
      QQBOT_HOME_CHANNEL: { label: 'QQ ホームチャンネル', help: 'Cron 配信のデフォルトチャンネルまたはグループ。' },
      QQBOT_HOME_CHANNEL_NAME: { label: 'QQ ホームチャンネル名' },
      SLACK_BOT_TOKEN: {
        label: 'Slack ボットトークン',
        help: 'Slack アプリをインストール後、OAuth & Permissions のボットトークンを使用してください。',
        placeholder: 'Slack ボットトークンを貼り付け'
      },
      SLACK_APP_TOKEN: {
        label: 'Slack アプリトークン',
        help: 'Socket Mode に必要なアプリレベルのトークンを使用してください。',
        placeholder: 'Slack アプリトークンを貼り付け'
      },
      SLACK_ALLOWED_USERS: {
        label: '許可する Slack ユーザー ID',
        help: '推奨。カンマ区切りの Slack ユーザー ID。'
      },
      MATTERMOST_URL: { label: 'サーバー URL', placeholder: 'https://mattermost.example.com' },
      MATTERMOST_TOKEN: { label: 'ボットトークン' },
      MATTERMOST_ALLOWED_USERS: {
        label: '許可するユーザー ID',
        help: '推奨。カンマ区切りの Mattermost ユーザー ID。'
      },
      MATRIX_HOMESERVER: { label: 'ホームサーバー URL', placeholder: 'https://matrix.org' },
      MATRIX_ACCESS_TOKEN: { label: 'アクセストークン' },
      MATRIX_USER_ID: { label: 'ボットユーザー ID', placeholder: '@hermes:example.org' },
      MATRIX_ALLOWED_USERS: {
        label: '許可する Matrix ユーザー ID',
        help: '推奨。@user:server 形式のカンマ区切りユーザー ID。'
      },
      SIGNAL_HTTP_URL: {
        label: 'Signal ブリッジ URL',
        placeholder: 'http://127.0.0.1:8080',
        help: '実行中の signal-cli REST ブリッジの URL。'
      },
      SIGNAL_ACCOUNT: { label: '電話番号', help: 'signal-cli ブリッジに登録した番号。' },
      SIGNAL_ALLOWED_USERS: {
        label: '許可する Signal ユーザー',
        help: '推奨。カンマ区切りの Signal 識別子。'
      },
      WHATSAPP_ENABLED: {
        label: 'WhatsApp ブリッジを有効にする',
        help: '以下のトグルで自動的に設定されます。必要な場合を除いてそのままにしてください。'
      },
      WHATSAPP_MODE: { label: 'ブリッジモード' },
      WHATSAPP_ALLOWED_USERS: {
        label: '許可する WhatsApp ユーザー',
        help: '推奨。カンマ区切りの電話番号または WhatsApp ID。'
      }
    },
    platformIntro: {}
  },

  profiles: {
    close: 'プロファイルを閉じる',
    nameHint: '小文字、数字、ハイフン、アンダースコア。文字または数字で始める必要があります。',
    title: 'プロファイル',
    count: count => `${count} プロファイル`,
    search: 'プロファイルを検索...',
    loading: 'プロファイルを読み込み中...',
    newProfile: '新しいプロファイル',
    allProfiles: 'すべてのプロファイル',
    showAllProfiles: 'すべてのプロファイルを表示',
    switchToProfile: name => `${name} に切り替え`,
    manageProfiles: 'プロファイルを管理…',
    actionsFor: name => `${name} のアクション`,
    color: 'カラー…',
    colorFor: name => `${name} のカラー`,
    setColor: color => `カラー ${color} に設定`,
    autoColor: '自動',
    noProfiles: 'プロファイルが見つかりません。',
    selectPrompt: '詳細を表示するにはプロファイルを選択してください。',
    refresh: 'プロファイルを更新',
    refreshing: 'プロファイルを更新中',
    default: 'デフォルト',
    skills: count => `${count} スキル`,
    env: 'env',
    defaultBadge: 'デフォルト',
    rename: '名前を変更',
    renameMenu: '名前を変更…',
    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} 件のジョブ`,
    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: '実行履歴',
    actionsFor: title => `${title} のアクション`,
    actionsTitle: 'Cron ジョブのアクション',
    resume: '再開',
    pause: '一時停止',
    resumeTitle: '再開',
    pauseTitle: '一時停止',
    triggerNow: '今すぐ実行',
    edit: 'Cron を編集',
    deleteTitle: 'Cron ジョブを削除しますか？',
    deleteDescPrefix: 'これにより ',
    deleteDescSuffix: ' が完全に削除され、即座に実行が停止されます。',
    deleting: '削除中...',
    resumed: 'Cron を再開しました',
    paused: 'Cron を一時停止しました',
    triggered: 'Cron をトリガーしました',
    deleted: 'Cron を削除しました',
    created: 'Cron を作成しました',
    updated: 'Cron を更新しました',
    failedLoad: 'Cron ジョブの読み込みに失敗しました',
    failedUpdate: 'Cron ジョブの更新に失敗しました',
    failedTrigger: 'Cron ジョブのトリガーに失敗しました',
    failedDelete: 'Cron ジョブの削除に失敗しました',
    failedSave: 'Cron ジョブの保存に失敗しました',
    editTitle: 'Cron ジョブを編集',
    createTitle: '新しい Cron ジョブ',
    editDesc: 'スケジュール、プロンプト、または配信先を更新します。変更は次回の実行時に適用されます。',
    createDesc:
      'プロンプトを自動実行するスケジュールを設定します。Cron 構文または「15 分ごと」などのフレーズを使用します。',
    nameLabel: '名前',
    namePlaceholder: '例: 日次サマリー',
    promptLabel: 'プロンプト',
    promptPlaceholder: '実行ごとにエージェントが行う内容は？',
    frequencyLabel: '頻度',
    deliverLabel: '配信先',
    customScheduleLabel: 'カスタムスケジュール',
    customPlaceholder: '0 9 * * * または weekdays at 9am',
    customHint: 'Cron 式、または「every hour」「weekdays at 9am」のようなフレーズ。',
    optional: '省略可能',
    promptScheduleRequired: 'プロンプトとスケジュールは必須です。',
    saveChanges: '変更を保存',
    createAction: 'Cron を作成'
  },

  artifacts: {
    search: 'アーティファクトを検索...',
    refresh: 'アーティファクトを更新',
    refreshing: 'アーティファクトを更新中',
    indexing: '最近のセッションのアーティファクトをインデックス中',
    tabAll: 'すべて',
    tabImages: '画像',
    tabFiles: 'ファイル',
    tabLinks: 'リンク',
    noArtifactsTitle: 'アーティファクトが見つかりません',
    noArtifactsDesc: 'セッションで生成された画像やファイルの出力がここに表示されます。',
    failedLoad: 'アーティファクトの読み込みに失敗しました',
    openFailed: '開くことができませんでした',
    itemsImage: '画像',
    itemsLink: 'リンク',
    itemsFile: 'ファイル',
    itemsGeneric: '項目',
    zero: '0',
    rangeOf: (start, end, total) => `${total} 件中 ${start}-${end}`,
    goToPage: (itemLabel, page) => `${itemLabel} ページ ${page} に移動`,
    colTitleLink: 'リンクタイトル',
    colTitleFile: '名前',
    colTitleDefault: 'タイトル / 名前',
    colLocationLink: 'URL',
    colLocationFile: 'パス',
    colLocationDefault: '場所',
    colSession: 'セッション',
    kindImage: '画像',
    kindFile: 'ファイル',
    kindLink: 'リンク',
    chat: 'チャット',
    copyUrl: 'URL をコピー',
    copyPath: 'パスをコピー'
  },

  sidebar: {
    nav: {
      'new-session': '新しいセッション',
      skills: 'スキルとツール',
      messaging: 'メッセージング',
      artifacts: 'アーティファクト'
    },
    searchAria: 'セッションを検索',
    searchPlaceholder: 'セッションを検索…',
    clearSearch: '検索をクリア',
    noMatch: query => `"${query}" に一致するセッションがありません。`,
    results: '結果',
    pinned: 'ピン留め',
    sessions: 'セッション',
    cronJobs: 'Cronジョブ',
    groupAriaGrouped: 'セッションを単一リストとして表示',
    groupAriaUngrouped: 'ワークスペースごとにセッションをグループ化',
    showProjects: 'プロジェクトを表示',
    showSessions: 'セッションを表示',
    groupTitleGrouped: 'セッションのグループ化を解除',
    groupTitleUngrouped: 'ワークスペースでグループ化',
    allPinned: 'ここにあるものはすべてピン留めされています。チャットのピン留めを解除すると最近のものに表示されます。',
    shiftClickHint: 'Shift クリックでピン留め · ドラッグで並べ替え',
    noWorkspace: 'ワークスペースなし',
    noProject: 'プロジェクトなし',
    projectEmpty: 'セッションはまだありません',
    noSessions: 'セッションはまだありません',
    projects: {
      sectionLabel: 'プロジェクト',
      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',
      startWorkFailed: 'ワークツリーを作成できませんでした',
      convertBranch: 'ブランチを変換…',
      convertBranchTitle: 'ブランチを変換',
      convertBranchDesc: 'チェックアウト済みのブランチを開くか、空いているブランチのワークツリーを作成します。',
      convertBranchPlaceholder: 'ブランチを検索…',
      convertBranchInstead: '既存のブランチを変換',
      branchOpenExisting: '開く',
      branchSwitchHome: 'ホームを切替',
      branchCreateWorktree: '新しいワークツリー',
      branchesLoading: 'ブランチを読み込み中…',
      noBranches: 'ブランチが見つかりません',
      removeWorktree: 'ワークツリーを削除',
      removeWorktreeFailed: 'ワークツリーを削除できませんでした（コミットされていない変更？）',
      removeWorktreeConfirm:
        'git から削除（ワークツリーのディレクトリを削除しますが、ブランチは残ります）するか、サイドバーからレーンを隠してワークツリーをディスク上に残します。',
      removeWorktreeDirty:
        'このワークツリーにはコミットされていない変更があります。強制削除（変更を破棄）するか、レーンを隠してディスク上に残します。',
      forceRemove: '強制削除',
      enter: label => `${label} を開く`
    },
    newSessionIn: label => `${label} で新しいセッション`,
    showMoreIn: (count, label) => `${label} でさらに ${count} 件を表示`,
    loading: '読み込み中…',
    loadMore: 'さらに読み込む',
    loadCount: step => `さらに ${step} 件を読み込む`,
    row: {
      pin: 'ピン留め',
      unpin: 'ピン留めを解除',
      copyId: 'ID をコピー',
      export: 'エクスポート',
      branchFrom: '分岐',
      rename: '名前を変更',
      archive: 'アーカイブ',
      newWindow: '新しいウィンドウ',
      copyIdFailed: 'セッション ID をコピーできませんでした',
      actionsFor: title => `${title} のアクション`,
      sessionActions: 'セッションアクション',
      sessionRunning: 'セッション実行中',
      needsInput: '入力が必要です',
      waitingForAnswer: '回答を待っています',
      handoffOrigin: platform => `${platform} から引き継ぎ`,
      renamed: '名前を変更しました',
      renameFailed: '名前の変更に失敗しました',
      renameTitle: 'セッションの名前を変更',
      renameDesc: 'このチャットにわかりやすいタイトルをつけてください。空欄にするとクリアされます。',
      untitledPlaceholder: '無題のセッション',
      ageNow: 'たった今',
      ageDay: '日',
      ageHour: '時間',
      ageMin: '分'
    }
  },

  composer: {
    message: 'メッセージ',
    wakingProfile: profile => `${profile} を起動中…`,
    placeholderStarting: 'Hermes を起動中...',
    placeholderReconnecting: 'Hermes に再接続中…',
    placeholderFollowUp: 'フォローアップを送信',
    newSessionPlaceholders: [
      '何を作りますか？',
      'Hermes にタスクを与える',
      '何か考えていることはありますか？',
      '必要なことを説明してください',
      '何に取り組みますか？',
      '何でも聞いてください',
      '目標から始める'
    ],
    followUpPlaceholders: [
      'フォローアップを送信',
      'さらにコンテキストを追加',
      'リクエストを改善',
      '次は何ですか？',
      '続けましょう',
      'さらに進める',
      '調整または続行'
    ],
    startVoice: '音声会話を開始',
    queueMessage: 'メッセージをキューに入れる',
    stop: '停止',
    send: '送信',
    speaking: '話しています',
    transcribing: '文字起こし中',
    thinking: '考え中',
    muted: 'ミュート',
    listening: '聴いています',
    muteMic: 'マイクをミュート',
    unmuteMic: 'マイクのミュートを解除',
    stopListening: '聴き取りを停止して送信',
    stopShort: '停止',
    endConversation: '音声会話を終了',
    endShort: '終了',
    stopDictation: '口述を停止',
    transcribingDictation: '口述を文字起こし中',
    voiceDictation: '音声口述',
    speakReplies: '返信を読み上げる',
    stopSpeakingReplies: '返信の読み上げを停止',
    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} 件キュー済み`,
    attachmentOnly: '添付のみのターン',
    emptyTurn: '空のターン',
    attachments: count => `${count} 件の添付`,
    editingInComposer: 'コンポーザーで編集中',
    editingQueuedInComposer: 'コンポーザーでキュー済みターンを編集中',
    queueEdit: '編集',
    queueSendNext: '次に送信',
    queueSend: '送信',
    queueDelete: '削除',
    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} 件`,
    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: 'メッセージ（⌘↵ でコミット）',
      generateCommitMessage: 'コミットメッセージを生成',
      stopGenerating: '生成を停止',
      createPr: 'PR を作成',
      openPr: 'PR を開く',
      ghMissing: 'PR を開くには GitHub CLI (gh) をインストールしてサインインしてください',
      agentShip: 'Hermes にコミットと PR を任せる',
      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: 'ご安心ください。何も失われていません。今すぐ再試行できます。',
    notNow: '今は後で',
    applyStatus: {
      preparing: 'バックエンドを更新しています…',
      pulling: 'バックエンドを更新中…',
      restarting: 'バックエンドが更新を読み込むため再起動しています…',
      notAvailable: 'このバックエンドでは更新を利用できません。',
      failed: 'バックエンドの更新に失敗しました。',
      noReturn:
        'バックエンドがオンラインに戻りませんでした。更新が完了していない可能性があります。バックエンドホストを確認してください。'
    }
  },

  install: {
    stageStates: {
      pending: '待機中',
      running: 'インストール中',
      succeeded: '完了',
      skipped: 'スキップ',
      failed: '失敗'
    },
    oneTimeTitle: 'Hermes には一度限りのインストールが必要です',
    unsupportedDesc: platform =>
      `${platform} では自動の初回インストールはまだ利用できません。ターミナルを開いて以下のコマンドを実行し、このアプリを再起動してください。以降の起動ではこの手順はスキップされます。`,
    installCommand: 'インストールコマンド',
    copyCommand: 'コマンドをコピー',
    viewDocs: 'インストールドキュメントを見る',
    installTo: 'インストール先',
    retryAfterRun: '実行しました — 再試行',
    failedTitle: 'インストールに失敗しました',
    settingUpTitle: 'Hermes Agent を設定中',
    finishingTitle: '仕上げ中',
    failedDesc:
      'インストール手順のいずれかが失敗しました。Windows では、別の Hermes CLI またはデスクトップインスタンスが実行中の場合に発生することがあります。実行中の Hermes インスタンスをすべて停止してから再試行してください。詳細は以下またはデスクトップログで確認できます。',
    activeDesc:
      'これは一回限りのセットアップです。Hermes インストーラーが依存関係をダウンロードしてマシンを設定しています。以降の起動ではこの手順はスキップされます。',
    progress: (completed, total) => `${total} ステップ中 ${completed} 完了`,
    currentStage: stage => ` — 現在: ${stage}`,
    fetchingManifest: 'インストーラーマニフェストを取得中...',
    error: 'エラー',
    hideOutput: 'インストーラーの出力を非表示',
    showOutput: 'インストーラーの出力を表示',
    lines: count => `${count} 行`,
    noOutput: 'まだ出力がありません。',
    cancelling: 'キャンセル中...',
    cancelInstall: 'インストールをキャンセル',
    transcriptSaved: 'フルトランスクリプトを保存しました:',
    copiedOutput: 'コピーしました！',
    copyOutput: '出力をコピー',
    reloadRetry: '再読み込みして再試行'
  },

  onboarding: {
    headerTitle: 'Hermes Agent のセットアップをしましょう',
    headerDesc: 'チャットを始めるにはモデルプロバイダーを接続してください。ほとんどのオプションはワンクリックです。',
    preparingInstall: 'Hermes はインストールを完了中です。初回実行では通常 1 分以内に完了します。',
    starting: 'Hermes を起動中…',
    lookingUpProviders: 'プロバイダーを検索中...',
    collapse: '折りたたむ',
    otherProviders: 'その他のプロバイダー',
    haveApiKey: 'API キーをお持ちです',
    chooseLater: '後でプロバイダーを選択します',
    recommended: '推奨',
    connected: '接続済み',
    featuredPitch: '1 つのサブスクリプションで 300 以上の最先端モデル — Hermes を実行するための推奨方法',
    openRouterPitch: '1 つのキーで数百のモデル — 堅実なデフォルト',
    apiKeyOptions: {
      openrouter: {
        short: '1 つのキーで多くのモデル',
        description: '1 つのキーで数百のモデルをホスト。新規インストールのデフォルトとして最適。'
      },
      openai: { short: 'GPT クラスのモデル', description: 'OpenAI モデルへの直接アクセス。' },
      gemini: { short: 'Gemini モデル', description: 'Google Gemini モデルへの直接アクセス。' },
      xai: { short: 'Grok モデル', description: 'xAI Grok モデルへの直接アクセス。' },
      local: {
        short: 'セルフホスト',
        description:
          'ローカルまたはセルフホストの OpenAI 互換エンドポイント（vLLM、llama.cpp、Ollama など）に Hermes を接続。'
      }
    },
    backToSignIn: 'サインインに戻る',
    getKey: 'キーを取得',
    replaceCurrent: '現在の値を置き換え',
    pasteApiKey: 'API キーを貼り付け',
    couldNotSave: '認証情報を保存できませんでした。',
    connecting: '接続中',
    update: '更新',
    flowSubtitles: {
      pkce: 'ブラウザーを開いてサインインし、ここに戻ります',
      device_code: 'ブラウザーで確認ページを開きます — Hermes が自動接続します',
      external: 'ターミナルで一度サインインして、チャットに戻ります'
    },
    startingSignIn: provider => `${provider} のサインインを開始中...`,
    verifyingCode: provider => `${provider} でコードを確認中...`,
    connectedProvider: provider => `${provider} が接続されました`,
    connectedPicking: provider => `${provider} が接続されました。デフォルトモデルを選択中...`,
    signInFailed: 'サインインに失敗しました。再試行してください。',
    pickDifferentProvider: '別のプロバイダーを選択',
    signInWith: provider => `${provider} でサインイン`,
    openedBrowser: provider => `${provider} をブラウザーで開きました。`,
    authorizeThere: 'そこで Hermes を承認してください。',
    copyAuthCode: '認証コードをコピーして以下に貼り付けてください。',
    pasteAuthCode: '認証コードを貼り付け',
    reopenAuthPage: '認証ページを再度開く',
    autoBrowser: provider =>
      `${provider} をブラウザーで開きました。Hermes をそこで承認すれば自動接続されます。コピーや貼り付けは不要です。`,
    reopenSignInPage: 'サインインページを再度開く',
    waitingAuthorize: '承認を待っています...',
    externalPending: provider =>
      `${provider} は独自の CLI からサインインします。ターミナルでこのコマンドを実行してから、戻って「サインインしました」を選択してください:`,
    signedIn: 'サインインしました',
    deviceCodeOpened: provider => `${provider} をブラウザーで開きました。そこにこのコードを入力してください:`,
    reopenVerification: '確認ページを再度開く',
    copy: 'コピー',
    defaultModel: 'デフォルトモデル',
    freeTier: '無料プラン',
    pro: 'Pro',
    free: '無料',
    price: (input, output) => `${input} 入力 / ${output} 出力 per Mtok`,
    change: '変更',
    startChatting: '始める',
    docs: provider => `${provider} ドキュメント`
  },

  modelPicker: {
    title: 'モデルを切り替え',
    current: '現在:',
    unknown: '(不明)',
    search: 'プロバイダーとモデルをフィルター...',
    noModels: 'モデルが見つかりません。',
    addProvider: 'プロバイダーを追加',
    loadFailed: 'モデルを読み込めませんでした',
    noAuthenticatedProviders: '認証済みプロバイダーがありません。',
    pro: 'Pro',
    proNeedsSubscription: 'Pro モデルには有料の Nous サブスクリプションが必要です。',
    free: '無料',
    freeTier: '無料プラン',
    priceTitle: '100 万トークンあたりの入力/出力価格'
  },

  modelVisibility: {
    title: 'モデル',
    search: 'モデルを検索',
    noAuthenticatedProviders: '認証済みプロバイダーがありません。',
    addProvider: 'プロバイダーを追加…'
  },

  shell: {
    windowControls: 'ウィンドウコントロール',
    paneControls: 'ペインコントロール',
    appControls: 'アプリコントロール',
    modelMenu: {
      search: 'モデルを検索',
      noModels: 'モデルが見つかりません',
      editModels: 'モデルを編集…',
      refreshModels: 'モデルを更新',
      fast: '高速',
      medium: '中'
    },
    modelOptions: {
      noOptions: 'このモデルにはオプションがありません',
      options: 'オプション',
      thinking: '思考',
      fast: '高速',
      effort: '努力度',
      minimal: '最小',
      low: '低',
      medium: '中',
      high: '高',
      max: '最大',
      updateFailed: 'モデルオプションの更新に失敗しました',
      fastFailed: '高速モードの更新に失敗しました'
    },
    gatewayMenu: {
      gateway: 'ゲートウェイ',
      connected: '接続済み',
      connecting: '接続中',
      offline: 'オフライン',
      inferenceReady: '推論準備完了',
      inferenceNotReady: '推論準備未完了',
      checkingInference: '推論を確認中',
      disconnected: '切断済み',
      openSystem: 'システムパネルを開く',
      connection: label => `接続: ${label}`,
      recentActivity: '最近のアクティビティ',
      viewAllLogs: 'すべてのログを見る →',
      messagingPlatforms: 'メッセージングプラットフォーム'
    },
    statusbar: {
      unknown: '不明',
      restart: '再起動',
      update: '更新',
      updateInProgress: '更新中',
      commitsBehind: (count, branch) => `${branch} より ${count} コミット遅れています`,
      desktopVersion: version => `Hermes Desktop v${version}`,
      backendVersion: version => `バックエンド v${version}`,
      clientLabel: version => `クライアント v${version}`,
      backendLabel: version => `バックエンド v${version}`,
      commit: sha => `コミット ${sha}`,
      branch: branch => `ブランチ ${branch}`,
      closeCommandCenter: 'コマンドセンターを閉じる',
      openCommandCenter: 'コマンドセンターを開く',
      showTerminal: 'ターミナルを表示',
      hideTerminal: 'ターミナルを非表示',
      gateway: 'ゲートウェイ',
      gatewayReady: '準備完了',
      gatewayNeedsSetup: '設定が必要',
      gatewayChecking: '確認中',
      gatewayConnecting: '接続中',
      gatewayOffline: 'オフライン',
      gatewayRestarting: '再起動中…',
      gatewayTitle: 'Hermes 推論ゲートウェイのステータス',
      agents: 'エージェント',
      closeAgents: 'エージェントを閉じる',
      openAgents: 'エージェントを開く',
      subagents: count => `${count} サブエージェント`,
      failed: count => `${count} 失敗`,
      running: count => `${count} 実行中`,
      cron: 'Cron',
      openCron: 'Cron ジョブを開く',
      starmap: 'メモリグラフ',
      openStarmap: 'メモリグラフを開く',
      turnRunning: '実行中',
      currentTurnElapsed: '現在のターン経過時間',
      contextUsage: 'コンテキスト使用状況',
      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`
      },
      openContextUsage: 'コンテキスト使用状況の内訳を開く',
      session: 'セッション',
      runtimeSessionElapsed: 'ランタイムセッション経過時間',
      yoloOn: 'YOLO オン — 危険なコマンドを自動承認中。クリックでオフに。Shift+クリックで全体に切り替え。',
      yoloOff: 'YOLO オフ — クリックで危険なコマンドを自動承認。Shift+クリックで全体に切り替え。',
      modelNone: 'なし',
      noModel: 'モデルなし',
      switchModel: 'モデルを切り替え',
      openModelPicker: 'モデルピッカーを開く',
      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: 'プレビュー',
    closeTab: label => `${label} を閉じる`,
    closeOthers: '他を閉じる',
    closeToRight: '右側を閉じる',
    closeAll: 'すべて閉じる',
    closePane: 'プレビューペインを閉じる',
    loading: 'プレビューを読み込み中',
    unavailable: 'プレビューは利用できません',
    opening: '開いています...',
    hide: '非表示',
    openPreview: 'プレビューを開く',
    openInBrowser: 'ブラウザで開く',
    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: 'サーバーが見つかりません',
      failedToLoad: 'プレビューの読み込みに失敗しました',
      tryAgain: '再試行',
      restarting: 'Hermes を再起動中...',
      askRestart: 'Hermes にサーバーの再起動を依頼',
      lookingRestart: taskId => `Hermes は再起動するプレビューサーバーを検索中です (${taskId})`,
      restartingTitle: 'プレビューサーバーを再起動中',
      restartingMessage: 'Hermes はバックグラウンドで作業中です。進捗はプレビューコンソールで確認してください。',
      startRestartFailed: message => `サーバー再起動を開始できませんでした: ${message}`,
      restartFailed: 'サーバーの再起動に失敗しました',
      hideConsole: 'プレビューコンソールを非表示',
      showConsole: 'プレビューコンソールを表示',
      hideDevTools: 'プレビュー DevTools を非表示',
      openDevTools: 'プレビュー DevTools を開く',
      finishedRestarting: message =>
        `Hermes がプレビューサーバーの再起動を完了しました${message ? `: ${message}` : ''}`,
      failedRestarting: message => `サーバーの再起動に失敗しました: ${message}`,
      unknownError: '不明なエラー',
      restartedTitle: 'プレビューサーバーが再起動しました',
      reloadingNow: 'プレビューを再読み込み中です。',
      restartFailedTitle: 'プレビューの再起動に失敗しました',
      restartFailedMessage: 'Hermes がサーバーを再起動できませんでした。',
      stillWorking:
        'Hermes はまだ作業中ですが、再起動の結果がまだ届いていません。サーバーコマンドがフォアグラウンドで実行されている可能性があります。',
      workspaceReloading: 'ワークスペースが変更され、プレビューを再読み込み中',
      fileChanged: url => `ファイルが変更され、プレビューを再読み込み中: ${url}`,
      filesChanged: (count, url) => `${count} 件のファイルが変更され、プレビューを再読み込み中: ${url}`,
      watchFailed: message => `プレビューファイルを監視できませんでした: ${message}`,
      moduleMimeDescription:
        'モジュールスクリプトが間違った MIME タイプで提供されています。通常、静的ファイルサーバーがプロジェクトの開発サーバーの代わりに Vite/React アプリを提供していることを意味します。',
      loadFailedConsole: (code, message) => `読み込みに失敗しました${code ? ` (${code})` : ''}: ${message}`,
      unreachableDescription: 'プレビューページに到達できませんでした。',
      openTarget: url => `${url} を開く`,
      fallbackTitle: 'プレビュー'
    }
  },

  assistant: {
    thread: {
      loadingSession: 'セッションを読み込み中',
      showEarlier: '以前のメッセージを表示',
      loadingResponse: 'Hermes が応答を読み込み中',
      resumeWhenBackgroundDone: count =>
        count === 1
          ? 'バックグラウンドタスクの完了後に再開します'
          : `${count} 件のバックグラウンドタスクの完了後に再開します`,
      thinking: '考え中',
      today: time => `今日 ${time}`,
      yesterday: time => `昨日 ${time}`,
      copy: 'コピー',
      refresh: '更新',
      moreActions: 'その他のアクション',
      branchNewChat: '新しいチャットでブランチ',
      dismissError: 'エラーを閉じる',
      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: 'スキップ',
      continueLabel: '続行'
    },
    tool: {
      code: 'コード',
      copyCode: 'コードをコピー',
      renderingImage: '画像をレンダリング中',
      copyOutput: '出力をコピー',
      copyCommand: 'コマンドをコピー',
      copyContent: 'コンテンツをコピー',
      copyUrl: 'URL をコピー',
      copyResults: '結果をコピー',
      copyQuery: 'クエリをコピー',
      copyFile: 'ファイルをコピー',
      copyPath: 'パスをコピー',
      outputAlt: 'ツール出力',
      rawResponse: '生の応答',
      copyActivity: 'アクティビティをコピー',
      recoveredOne: '1 つの失敗したステップの後に回復しました',
      recoveredMany: count => `${count} つの失敗したステップの後に回復しました`,
      failedOne: '1 つのステップが失敗しました',
      failedMany: count => `${count} つのステップが失敗しました`,
      statusRunning: '実行中',
      statusError: 'エラー',
      statusRecovered: '回復しました',
      statusDone: '完了',
      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: '一覧表示中'
        },
        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 <name> または「新しいセッション」ピッカーを使って別のプロファイルでチャットを始めてください。`,
    unknownProfile: '不明なプロファイル',
    noProfileNamed: (target, available) => `"${target}" という名前のプロファイルはありません。利用可能: ${available}`,
    newChatsProfile: name => `新しいチャットはプロファイル ${name} を使用します。`,
    setProfileFailed: 'プロファイルの設定に失敗しました',
    sttDisabled: '音声認識は設定で無効になっています。',
    stopFailed: '停止に失敗しました',
    regenerateFailed: '再生成に失敗しました',
    editFailed: '編集に失敗しました',
    resumeFailed: '再開に失敗しました',
    resumeStrandedTitle: 'このセッションを読み込めませんでした',
    resumeStrandedBody:
      'このセッションへの接続に失敗し、自動再試行も停止しました。ゲートウェイが実行中か確認してから、もう一度お試しください。',
    resumeRetry: '再試行',
    nothingToBranch: 'ブランチするものがありません',
    branchNeedsChat: 'ブランチする前にチャットを開始または再開してください。',
    sessionBusy: 'セッションが使用中',
    branchStopCurrent: 'このチャットをブランチする前に現在のターンを停止してください。',
    branchNoText: 'このメッセージにはブランチするテキストがありません。',
    branchTitle: n => `下書き: ブランチ #${n}`,
    branchFailed: 'ブランチに失敗しました',
    deleteFailed: '削除に失敗しました',
    archived: 'アーカイブしました',
    archiveFailed: 'アーカイブに失敗しました',
    cwdChangeFailed: '作業ディレクトリの変更に失敗しました',
    cwdStagedTitle: '作業ディレクトリがステージングされました',
    cwdStagedMessage:
      'このアクティブなセッションへの cwd の変更を適用するにはデスクトップバックエンドを再起動してください。',
    modelSwitchFailed: 'モデルの切り替えに失敗しました',
    sessionExported: 'セッションをエクスポートしました',
    sessionExportFailed: 'セッションをエクスポートできませんでした',
    imageSaved: '画像を保存しました',
    downloadStarted: 'ダウンロードを開始しました',
    restartToUseSaveImage: '画像を保存するには Hermes Desktop を再起動してください。',
    restartToSaveImages: '画像を保存するには Hermes Desktop を再起動してください',
    imageDownloadFailed: '画像のダウンロードに失敗しました',
    openImage: '画像を開く',
    downloadImage: '画像をダウンロード',
    savingImage: '画像を保存中',
    imagePreviewFailed: '画像のプレビューに失敗しました',
    imageAttach: '画像を添付',
    imageWriteFailed: '画像のディスクへの書き込みに失敗しました。',
    imageAttachFailed: '画像の添付に失敗しました',
    attachImages: '画像を添付',
    clipboard: 'クリップボード',
    noClipboardImage: 'クリップボードに画像が見つかりません',
    clipboardPasteFailed: 'クリップボードからの貼り付けに失敗しました',
    dropFiles: 'ファイルをドロップ',
    handoff: {
      pickPlatform: '送信先を選択',
      success: platform => `${platform} に引き継ぎました。いつでもここで再開できます。`,
      systemNote: platform => `↻ ${platform} に引き継ぎました — いつでもここで再開できます。`,
      failed: error => `引き継ぎに失敗しました: ${error}`,
      timedOut: 'ゲートウェイの待機がタイムアウトしました。`hermes gateway` は起動していますか？'
    }
  },

  errors: {
    genericFailure: '問題が発生しました',
    boundaryTitle: 'インターフェイスで問題が発生しました',
    boundaryDesc: 'ビューで予期しないエラーが発生しました。チャットと設定は安全です。',
    reloadWindow: 'ウィンドウを再読み込み',
    openLogs: 'ログを開く'
  },

  ui: {
    search: {
      clear: '検索をクリア'
    },
    pagination: {
      label: 'ページング',
      previous: '前へ',
      previousAria: '前のページへ',
      next: '次へ',
      nextAria: '次のページへ'
    },
    sidebar: {
      title: 'サイドバー',
      description: 'モバイルサイドバーを表示します。',
      toggle: 'サイドバーを切り替え'
    }
  }
})
