{
  "preferences": {
    "language": {
      "title": "言語",
      "help": "画面の表示言語を選びます。選択はこのブラウザに保存されます。"
    },
    "visibility": {
      "title": "新規タスクのデフォルト公開範囲",
      "private": "非公開",
      "org": "組織",
      "public": "公開",
      "help": "🔒 非公開: 自分のみ閲覧可能 ／ 🏢 組織: 同じ Gitea org のメンバーが閲覧可能 ／ 🌐 公開: ログイン中の全ユーザーが閲覧可能"
    },
    "orgs": {
      "title": "所属している Gitea 組織",
      "none": "（なし — Gitea でログインすると表示されます）",
      "refreshHint": "最新状態に更新するには、一度ログアウトして再ログインしてください。"
    },
    "save": "設定を保存",
    "saving": "保存中…"
  },
  "tools": {
    "categoriesAria": "ツールカテゴリ",
    "web": {
      "webfetchTimeout": "WebFetch Timeout (秒)",
      "websearchTimeout": "WebSearch Timeout (秒)",
      "searxngHelp": "WebSearch のフォールバック用 SearXNG エンドポイント。",
      "ssrfHelp": "SSRF 保護の例外ホスト名／IP アドレス。WebFetch・BrowseWeb のすべてに適用。",
      "blockedLabel": "Blocked Patterns (ブロックパターン)",
      "blockedHelp": "WebSearch クエリからフィルタするパターン（正規表現）。",
      "autoBlockLabel": "Auto Block (自動ブロック)",
      "autoBlockHelp": "検索クエリに含まれる機密情報を自動でブロック。",
      "autoBlock": {
        "privateIp": "プライベートIP",
        "internalDomain": "内部ドメイン",
        "email": "メールアドレス",
        "phone": "電話番号"
      }
    },
    "vision": {
      "timeout": "Vision Timeout (秒)",
      "modelHelp": "画像分析に使用するモデル名（例: qwen2-vl:8b-instruct）",
      "baseUrlPlaceholder": "Provider の Base URL と同じ場合は空欄",
      "baseUrlHelp": "Vision モデル用の API エンドポイント。",
      "ocrModelHelp": "GLM-OCR で使用するモデル名。"
    },
    "speech": {
      "timeout": "Speech Timeout (秒)",
      "serverHelp": "音声認識サーバーの API エンドポイント（TranscribeAudio 用）",
      "timeoutHelp": "長い音声ファイルに対応するためのタイムアウト",
      "languageHelp": "文字起こしのデフォルト言語コード"
    },
    "office": {
      "sectionHelp": "Office ファイルサイズ上限 (MB)",
      "excelLabel": "ReadExcel 最大サイズ",
      "excelHelp": "ReadExcel が受け付ける .xlsx / .xls ファイルの最大サイズ（デフォルト: 10 MB）",
      "docxLabel": "ReadDocx 最大サイズ",
      "docxHelp": "ReadDocx が受け付ける .docx ファイルの最大サイズ（デフォルト: 10 MB）",
      "pdfLabel": "ReadPdf 最大サイズ",
      "pdfHelp": "ReadPdf が受け付ける .pdf ファイルの最大サイズ（デフォルト: 10 MB）",
      "pptxLabel": "ReadPPTX 最大サイズ",
      "pptxHelp": "ReadPPTX が受け付ける .pptx ファイルの最大サイズ（デフォルト: 50 MB）",
      "pptxUncompressedLabel": "ReadPPTX 展開後サイズ上限",
      "pptxUncompressedHelp": "PPTX の ZIP 展開後の合計サイズ上限（ZIP bomb 検知用、デフォルト: 200 MB）"
    },
    "uploads": {
      "sectionHelp": "UI からのアップロード API のリクエスト body 上限 (MB)",
      "maxLabel": "タスク作成・コメント時の最大アップロードサイズ",
      "maxHelp": "POST /api/local/tasks および POST /api/local/tasks/:id/comments のリクエスト body 上限 (添付ファイルを base64 でエンコードした JSON 全体)。添付ファイルの実サイズは概ね 値 × 0.75 が目安 (例: 50 MB body ≒ 37 MB raw)。範囲は 1〜1000 MB にクランプ。デフォルト 50 MB。サーバ再起動なしで反映。",
      "maxHelpStorage": "POST /api/local/tasks および POST /api/local/tasks/:id/comments のリクエスト body 上限 (添付ファイルを base64 でエンコードした JSON 全体)。添付ファイルの実サイズは概ね 値 × 0.75 が目安 (例: 50 MB body ≒ 37 MB raw)。範囲は 1〜1000 MB にクランプ。デフォルト 50 MB。サーバ再起動なしで反映。この設定は Paths & Storage でも編集可能 (同じ storage.task_upload_max_size_mb キー)。"
    },
    "x": {
      "timeout": "X Timeout (秒)",
      "mediaFetchTimeout": "X Media Fetch Timeout (秒)",
      "authTokenHelp": "X / Twitter の auth_token cookie",
      "ct0Help": "X / Twitter の ct0 cookie",
      "cliHelp": "twitter-cli の実行コマンド。",
      "chromeProfileHelp": "Cookie 抽出用の Chrome プロファイルディレクトリ。",
      "mediaHelp": "X 投稿の画像等メディアの自動ダウンロード。デフォルト: auto",
      "mediaAuto": "auto（画像/メディアを自動取得・既定）",
      "mediaNever": "never（取得しない）",
      "videoHelp": "X 投稿の動画の取得モード。デフォルト: thumbnail（帯域節約）",
      "videoThumbnail": "thumbnail（サムネイルのみ・既定）",
      "videoFull": "full（動画本体を取得）",
      "videoNever": "never（取得しない）",
      "mediaMaxHelp": "1 メディアあたりの最大ダウンロードサイズ（MB）",
      "mediaFetchTimeoutHelp": "メディア取得のタイムアウト（秒）"
    },
    "maps": {
      "timeout": "Maps Timeout (秒)",
      "keyHelp": "Google Maps Places / Directions API キー。未設定時は Nominatim / OSRM（無料）を使用。",
      "timeoutHelp": "Maps / Nominatim / OSRM 呼び出しのタイムアウト（秒）。デフォルト: 30"
    },
    "amazon": {
      "affiliateHelp": "SearchAmazon で使用するアソシエイトタグ。",
      "keepaHelp": "Keepa API キー（価格履歴データ取得用）。未設定でもグラフ画像リンクは提供されます。"
    },
    "userScripts": {
      "enableLabel": "RunUserScript を有効化",
      "enabledToggle": "有効 (browser-macros: LLM の RunUserScript + scheduled script task が動作)",
      "enableHelp": "plain runtime は Node --permission で sandbox 化され child_process / worker / tmpdir 外の FS アクセスを deny。browser-macros は Playwright の要件 (child_process / native bindings / network) で sandbox 不可、フル Node.js capability。信頼できるユーザーのみに有効化。",
      "allowlistLabel": "実行許可ユーザー allowlist (空欄 = 全員)",
      "allowlistPlaceholder": "user id (例: 12345)",
      "allowlistHelp": "未指定なら user_scripts_enabled のみで制御。設定すると指定 ID のみ browser-macro の実行 (RunUserScript / scheduled script task) が許可される。",
      "trashRetentionLabel": "Trash Retention (日)",
      "trashRetentionHelp": "data/users/{userId}/trash/ のファイルを自動削除するまでの日数。起動時 + 24h 毎に sweep。0 を指定すると sweep のたびに即削除。デフォルト 30 日。"
    },
    "tagInput": {
      "placeholder": "ツール名を入力...",
      "help": "ここに列挙したツールのみ LLM に提示されます。オフラインの MCP ツールや未知のツールも自動削除されず、明示的に削除するまで残ります。",
      "unknownTip": "このツールは現在のカタログに存在しません。明示削除するまで保持されます。"
    }
  },
  "ssh": {
    "header": {
      "title": "SSH 管理",
      "desc": "グローバル SSH 設定 / 接続の登録 / アクセス権 (grants) / マスターキーローテーション / 監査ログ。ユーザー個人の SSH 接続は User Folder → ssh-connections/ から管理します。"
    },
    "common": {
      "reasonLabel": "理由: {{reason}}",
      "reasonModalPlaceholder": "監査ログに残す理由を記述",
      "cancel": "キャンセル",
      "run": "実行",
      "submitting": "送信中…"
    },
    "config": {
      "enableLabel": "SSH 機能を有効化する",
      "enableHelp": "OFF の間は SshExec / SshUpload / SshDownload / SshConsole* 全ツールが利用不可になり、関連 API も router に登録されない。MCP_ENCRYPTION_KEY 環境変数も別途必須 (鍵が無い場合は ON にしても subsystem は disabled で起動)。",
      "allowPrivateLabel": "プライベート / loopback アドレスへの接続を許可する",
      "allowPrivateHelp": "self-hosted / LAN 上のサーバーに繋ぐ場合に必要。OFF だと 10.x, 192.168.x, 127.0.0.1 等の private アドレスへの接続が reject される。",
      "adminBypassLabel": "Admin は grant 無しでも接続を利用できる",
      "adminBypassHelp": "ON: admin role の user は per-connection grant 無しでも全接続にアクセス可 (監査ログには記録される)。OFF: admin もユーザーと同じく明示的 grant 必須。",
      "callTimeout": "Call timeout (秒)",
      "callTimeoutHelp": "SshExec / SshUpload / SshDownload の wall-clock 上限 (TCP connect + auth + 実行を含む)。デフォルト 30。SshConsole* には適用されない (こちらは idle/duration cap 側で管理)。",
      "maxOutputHelp": "SshExec の stdout/stderr の合計バイト上限。超過分は truncate され truncated_stdout: true で返る。デフォルト 32768 (32 KiB)。",
      "transferSizeHelp": "SshUpload / SshDownload のファイルサイズ上限。超過は転送前に reject。",
      "auditRetention": "Audit retention (日)",
      "auditRetentionHelp": "ssh_audit_log テーブルの保持日数。Audit tab の \"Prune\" ボタンでこの値より古い行を削除できる。",
      "abuseHelp": "ホスト鍵不一致 / 認証失敗 / コマンド失敗が短時間に集中したら接続を一時ロックする。ロック中は同接続が abuse_locked エラーで reject される。",
      "abuseWindow": "Window (分)",
      "abuseLock": "Lock duration (分)",
      "consoleSectionTitle": "Interactive Console (SSH タブ / SshConsole* tools)",
      "consoleEnableLabel": "Console 機能を有効化する",
      "consoleEnableHelp": "OFF だと SshConsole* tools と SSH タブが無効。上の \"SSH 機能を有効化する\" と MCP_ENCRYPTION_KEY も別途必須。",
      "idleTimeout": "Idle timeout (秒)",
      "idleTimeoutHelp": "I/O が一定秒無いセッションを auto-close する閾値。人間の入力も AI の入力も activity としてカウントする。デフォルト 1800 (30 分)。",
      "maxSessionDuration": "Max session duration (秒)",
      "maxDurationHelp": "1 セッションの絶対上限。Idle じゃなくてもこの時間を超えると強制 close。デフォルト 14400 (4 時間)。",
      "scrollbackHelp": "サーバー側で保持する PTY 出力履歴のリングバッファ容量。ブラウザ再接続時に replay される量。デフォルト 524288 (512 KiB)。",
      "maxSessionsHelp": "同じ接続を使う並列セッション数の上限。超えた場合は最も古いセッションが session_cap_evict 理由で close される。",
      "maxInputHelp": "1 回の SshConsoleSend で送れる最大バイト数。デフォルト 16384 (16 KiB)。",
      "autoInjectHelp": "各 LLM iteration の system prompt 末尾に挿入する screen の末尾行数。多いほど AI の状況認識が良くなるが context を消費する。デフォルト 24 行。",
      "ptySizeHelp": "PTY サイズの初期値。クライアントが resize イベントを送れば上書きされる。"
    },
    "connections": {
      "listTitle": "グローバル接続 ({{count}})",
      "addButton": "+ グローバル接続を追加",
      "newConnTitle": "新規グローバル接続",
      "empty": "グローバル接続はまだありません。",
      "disabledSubsystem": "SSH サブシステムは無効です。config.yaml の ssh.enabled: true と MCP_ENCRYPTION_KEY を設定後にサーバーを再起動してください。",
      "testing": "テスト中…",
      "test": "Test",
      "pubKeyTitle": "authorized_keys に貼る公開鍵を表示",
      "fetching": "取得中…",
      "pubKey": "公開鍵",
      "edit": "編集",
      "enable": "有効化",
      "disable": "無効化",
      "delete": "削除",
      "copyTooltip": "クリックで UUID をコピー: {{value}}",
      "copied": "✓ コピーしました",
      "opTitle": {
        "delete": "削除: {{label}}",
        "disable": "無効化: {{label}}",
        "enable": "有効化: {{label}}",
        "forceUnlock": "force-unlock: {{label}}"
      },
      "toast": {
        "created": "グローバル接続を作成しました",
        "updated": "グローバル接続を更新しました",
        "disabled": "接続を無効化しました",
        "enabled": "接続を有効化しました",
        "deleted": "接続を削除しました",
        "unlocked": "アビューズロックを解除しました",
        "unlockFailed": "unlock 失敗",
        "pubKeyFailed": "公開鍵の取得に失敗しました",
        "pubKeyFailedShort": "公開鍵取得失敗",
        "hostKeyMatch": "ホストキーは一致しています ({{fp}}…)",
        "algNotAllowed": "ホストキーのアルゴリズムが許可リストにありません",
        "testFailed": "テスト失敗",
        "hostKeyVerified": "ホストキーを検証しました"
      }
    },
    "grants": {
      "title": "アクセス権 (grants)",
      "disabledTitle": "SSH サブシステムが無効です",
      "disabledBody": "config.yaml で ssh.enabled: true を設定し、環境変数 MCP_ENCRYPTION_KEY (64 hex chars) を export してからサーバーを再起動してください。詳細は docs/ssh.md を参照。",
      "issueButton": "+ Grant を発行",
      "needConnFirst": "まずグローバル接続を登録してから grant を発行できます。",
      "noGrants": "grant がありません — ユーザーは利用できません。",
      "grantsCount": "{{count}} grants",
      "revoke": "取消",
      "revokeTitle": "Grant を取り消す",
      "createTitle": "Grant を発行",
      "globalConnection": "Global connection",
      "subject": "Subject",
      "subjectUserPlaceholder": "gitea ユーザー ID",
      "subjectOrgPlaceholder": "org ID",
      "appliesAll": "すべてのピースで利用可能 (applies_to_all_pieces)",
      "appliesAllWarn": "⚠️ この grant は任意の piece からこの接続を使えるようにします。本当に必要なときのみ。",
      "pieceName": "Piece name",
      "pieceNamePlaceholder": "piece 名 (例: db-maintenance)",
      "expiresLabel": "Expires at (任意, ISO8601)",
      "reasonOpPlaceholder": "運用上の理由",
      "expiresInline": "失効: {{at}}",
      "issuing": "発行中…",
      "issue": "発行",
      "toast": {
        "created": "Grant を作成しました",
        "deleted": "Grant を削除しました"
      }
    },
    "rotation": {
      "title": "Master Key Rotation",
      "desc": "MCP_ENCRYPTION_KEY をローテーションします。実行中は SSH 書き込み系 API が 503 を返し、UI からは保存・更新が一時停止します (読み取りは可能)。v1 ではメンテナンスフラグの設定のみ。実際の DEK 再ラップは未実装。",
      "currentState": "現在の状態",
      "idle": "idle (rotation 未実行)",
      "checking": "確認中…",
      "jobDoneOrCleared": "job {{jobId}} は完了またはクリア済み",
      "startedAt": "開始: {{ts}}",
      "startButton": "Rotation を開始",
      "confirmTitle": "⚠️ Master Key Rotation を開始",
      "confirmBody1": "この操作はメンテナンスモードを有効化します。SSH 接続の作成・更新・削除・テストが一時的にすべて 503 を返します。",
      "confirmBody2": "⚠️ v1 では DEK 再ラップは未実装です。 メンテナンスを解除するには手動でフラグをクリアする必要があります。",
      "reasonPlaceholder": "MCP_ENCRYPTION_KEY を新しい値に置き換えるため",
      "typeToConfirm": "確認のため ROTATE と入力してください",
      "starting": "開始中…",
      "toast": {
        "started": "Rotation job 開始: {{jobId}}",
        "startFailed": "Rotation 開始失敗"
      }
    },
    "audit": {
      "title": "監査ログ",
      "refreshing": "更新中…",
      "reload": "再読み込み",
      "countDisplay": "{{count}} 件表示 (limit {{limit}})",
      "empty": "該当する監査ログがありません"
    }
  },
  "gateway": {
    "server": {
      "intro": "AAO 自身を LLM Gateway として動かす。有効にすると /v1/chat/completions などのエンドポイントが、worker UI と同じポートで待ち受けます (別 process 起動は不要)。他 AAO の provider.workers[].endpoint にこの URL を指定して GPU プールを共有できます。",
      "enable": "Enable Gateway",
      "listenPortHelp": "同 process 時はこの値は使われません: worker UI と同じポート ({{port}}) を共有します。AAO_MODE=gateway で別 process 起動した場合のみ有効。",
      "separateDeploy": "別 process deploy:",
      "backendsHelp1": "ルーティング先の llama-server / Ollama / vLLM など。Gateway は worker が送る role を担う backend のうち最も空いているものに割り振ります (roles 未設定の backend は全 role 対応)。role を担う backend が無い場合のみ request.model = id/model の厳密一致にフォールバックします。",
      "backendsHelp2": "api_key の保存形式: フォームで入力した値は config.yaml に平文で保存されます。${VAR} 形式の env var 参照はフォーム保存時に literal 文字列として保存されるため、env 経由で渡したい場合は config.yaml を直接編集してください。",
      "backendsEmpty": "backend が未登録です。最低 1 つ追加してください。",
      "removeBackendTitle": "この backend を削除",
      "rolesLabel": "roles (任意)",
      "rolesPlaceholder": "quality, auto (空欄=全ロール)",
      "rolesHelp": "この backend が担う性能ティア (auto / fast / quality / reflection) をカンマ区切りで。worker はジョブの role を routing key として送り、Gateway がその role を担う最も空いている backend に振ります。空欄なら全ロールを担当 (従来どおり)。異なる model 名の GPU でも同じ role でまとめられます。",
      "apiKeyLabel": "api_key (任意)",
      "apiKeyEnvWarn": "env var reference detected: 保存すると {{key}} がそのまま config.yaml に書き込まれ、起動時の env 置換は効かなくなります。env 経由で渡すなら config.yaml を直接編集してください。",
      "virtualKeysHelp1": "この Gateway を経由してアクセスするための sk-aao-* bearer key を発行・rotate・revoke します。",
      "virtualKeysHelp2": "注意: ここでの操作は Gateway Server の Save & Apply とは独立した admin API で即時反映されます (Save ボタンを押す必要はありません)。",
      "advRequestHelp": "chat 全体の budget (streaming 含む)",
      "advUpstreamHelp": "1 chunk あたりの idle 上限",
      "advShutdownHelp": "SIGTERM 後の drain 上限",
      "hotReload": "Hot reload: ここでの変更は Save 直後に同 process gateway に反映されます (backend / virtual_key 変更は bounce が発生し、in-flight ストリームは graceful drain されます)。"
    },
    "keys": {
      "newIssue": "+ 新規発行",
      "fetchError": "取得エラー: {{msg}}",
      "empty": "キーが登録されていません。「+ 新規発行」から作成できます。",
      "detail": "詳細",
      "footer": "Tokens budget は月次 UTC でリセット。Rate limit (rpm) は 60 秒スライディングウィンドウ。config-import のキー（config.yaml から取り込まれたもの）は値の編集ができません。",
      "titleConfigManaged": "config-import keys は config.yaml で管理",
      "toast": {
        "created": "Gateway key を発行しました",
        "rotated": "Rotate しました",
        "revoked": "Revoke しました",
        "updated": "更新しました"
      },
      "confirmRotate": "team={{team}} のキーをローテーションしますか？\n旧キーは無効になります。",
      "confirmRevoke": "team={{team}} のキー ({{prefix}}…) を Revoke しますか？\nこの操作は取り消せません。"
    },
    "createDialog": {
      "title": "新規 Gateway Key 発行",
      "allowedModelsLabel": "Allowed models (1 行 / カンマ区切り、空欄=制限なし)",
      "unlimited": "無制限",
      "issuing": "発行中...",
      "issue": "発行する"
    },
    "rawKeyDialog": {
      "titleCreated": "新しい Gateway Key を発行しました",
      "titleRotated": "Gateway Key をローテーションしました",
      "warnTitle": "⚠️ このキーは今後二度と表示されません",
      "warnBody": "必ずパスワードマネージャや LLM クライアントの設定にコピー・保存してから閉じてください。紛失した場合は Rotate で再発行する必要があります。",
      "ackLabel": "キーを安全に保存しました。今後このキーは表示できなくなることを理解しています。",
      "alertNotSaved": "API key has not been saved. Copy it and tick \"保存しました\" before navigating away."
    },
    "usagePanel": {
      "title": "Key 使用状況",
      "thisMonth": "今月 ({{period}})",
      "past12": "過去 12 か月",
      "noHistory": "履歴なし"
    }
  },
  "memoryLearning": {
    "title": "Memory & Learning",
    "navLabel": "🧠 Reflection 履歴",
    "rootTitle": "Reflection 履歴",
    "rootIntro": "自動学習（reflection）の実行履歴・差分・revert を確認できます。メモリエントリの閲覧・編集は ユーザーフォルダ → memory/ へ移動しました。",
    "intro": "エージェントが毎セッション参照する永続的なメモリエントリを管理し、自動学習（reflection）の実行履歴を確認できます。",
    "loading": "読み込み中…",
    "cancel": "キャンセル",
    "close": "閉じる",
    "before": "変更前",
    "after": "変更後",
    "empty": "（空）",
    "err": {
      "loadEntries": "メモリエントリの読み込みに失敗しました ({{status}})",
      "loadHistory": "履歴の読み込みに失敗しました ({{status}})",
      "loadSnapshot": "スナップショットの読み込みに失敗しました ({{status}})",
      "loadMetrics": "メトリクスの読み込みに失敗しました ({{status}})"
    },
    "outcome": {
      "applied": "適用済み",
      "partial": "一部適用",
      "abstained": "学習なし",
      "rejected": "却下",
      "failed": "失敗"
    },
    "rejection": {
      "rejected_bad_name": "名前が無効です（英数字・ハイフン・アンダースコア、1〜64文字）",
      "rejected_bad_description": "概要は必須で、1行以内で入力してください",
      "rejected_unknown_type": "タイプは user / feedback / project / reference のいずれかを指定してください",
      "rejected_bad_body": "本文は文字列で指定してください",
      "rejected_body_too_large": "本文が許容サイズを超えています",
      "rejected_bad_request": "リクエストの形式が正しくありません",
      "rejected_missing_target": "update / merge / remove の対象エントリが指定されていません",
      "rejected_stale_target": "対象エントリが他の変更で更新されています（リビジョン不一致）",
      "rejected_name_collision": "同じ名前のメモリエントリが既に存在します",
      "rejected_target_piece_mismatch": "変更対象の piece がタスクで使われた piece と一致しません",
      "rejected_invalid_yaml": "piece の YAML が解析できません",
      "rejected_invalid_piece": "piece の構成が検証（lint）を通りません",
      "rejected_dangerous_piece": "piece の遷移ルールに COMPLETE / ABORT / ASK が含まれるため却下されました",
      "rejected_injected_directive": "本文にエージェント誘導や情報持ち出しを疑わせる指示が含まれています"
    },
    "modal": {
      "titleNew": "新しいメモリエントリ",
      "titleEdit": "編集 — {{name}}",
      "nameLabel": "名前",
      "nameHint": "（英数字・ハイフン・アンダースコア）",
      "descLabel": "概要",
      "descPlaceholder": "メモリ一覧に表示される1行の説明",
      "typeLabel": "タイプ",
      "typeHelp": "user: あなた固有の好み・役割 ／ feedback: 過去のフィードバック・教訓 ／ project: プロジェクト別の文脈 ／ reference: 参照資料・外部情報",
      "bodyLabel": "本文",
      "bodyPlaceholder": "Markdown またはプレーンテキスト…",
      "saving": "保存中…",
      "save": "保存"
    },
    "entries": {
      "title": "メモリエントリ",
      "subtitle": "エージェントの毎セッションに注入される永続的な情報。",
      "newEntry": "+ 新しいエントリ",
      "loadError": "メモリエントリの読み込みに失敗しました: {{err}}",
      "deleteConfirm": "メモリエントリ「{{name}}」を削除しますか？",
      "deleteError": "「{{name}}」の削除に失敗しました: {{err}}",
      "emptyTitle": "メモリエントリはまだありません。",
      "emptyHint": "タスク完了後に reflection エンジンが自動で追加します。手動で追加することもできます。",
      "edit": "編集",
      "delete": "削除"
    },
    "snapshot": {
      "reverted": "revert済み",
      "loadingDetail": "詳細を読み込み中…",
      "detailLoadError": "読み込みに失敗しました: {{err}}",
      "reasoning": "推論",
      "rejectionsTitle": "却下理由",
      "changes": "変更内容",
      "pieceDiff": "Piece の差分",
      "revertedOk": "正常に revert しました。",
      "alreadyReverted": "すでに revert 済みです。",
      "revertBtn": "このスナップショットを revert…",
      "revertConfirmQ": "このスナップショットの変更前の状態に戻しますか？",
      "reverting": "revert 中…",
      "revertConfirm": "revert を確定"
    },
    "diff": {
      "title": "メモリファイルの差分",
      "added": "追加",
      "removed": "削除"
    },
    "metrics": {
      "loading": "メトリクスを読み込み中…",
      "loadError": "メトリクスの読み込みに失敗しました: {{err}}",
      "summary30": "30日間のサマリ",
      "totalRuns": "合計実行回数",
      "appliedRate": "適用率",
      "abstainRate": "学習なし率",
      "tokens": "Tokens",
      "pieceEdits": "Piece 編集",
      "noRuns": "まだ reflection の実行履歴がありません。最初の reflection が完了するとメトリクスが表示されます。"
    },
    "timeline": {
      "title": "Reflection タイムライン",
      "subtitle": "reflection 実行の履歴。各行を展開すると推論・変更前後の差分・revert コントロールを確認できます。",
      "showReverted": "revert 済みを表示",
      "resultLabel": "結果:",
      "reset": "リセット",
      "loadError": "読み込みに失敗しました: {{err}}",
      "emptyTitle": "まだ reflection の実行履歴がありません。",
      "emptyHint": "タスク完了後に自動で reflection が実行されます。",
      "loadMore": "さらに表示"
    }
  },
  "delegations": {
    "navLabel": "🔑 A2A 委任"
  },
  "reflection": {
    "intro": "通常ジョブが完了するたびに LLM がそのジョブから学んだ教訓を抽出し、ユーザーの memory (data/users/{userId}/memory/) と必要に応じて custom piece を自動更新します。全変更は snapshot として保存され、Memory & Learning タブから revert 可能です。",
    "enableLabel": "Reflection を有効化（自動適用）",
    "enableHelp": "ON にすると、エージェントジョブが終わるたびに reflection ジョブが裏で走り、memory を自動で書き換えます。デフォルト: 無効。",
    "workerWarn": {
      "title": "⚠ Reflection worker が未設定です",
      "body": "Reflection を有効化しても、roles に reflection を含む worker が無いとジョブは enqueue されません。LLM → Workers タブで以下のような worker を追加してください:",
      "snippet": "id: reflection-1\nconnection_type: direct\nendpoint: http://localhost:11434/v1\nmodel: qwen2.5:3b      # cheap モデル推奨\nroles: [reflection]\nmax_concurrency: 1"
    },
    "workerRequiredLabel": "専用 reflection worker を必須にする",
    "workerRequiredHelp": "ON: roles: [reflection] を持つ worker が無い場合、reflection ジョブを enqueue せずスキップします (デフォルト)。OFF にすると enabled のみで他 worker に拾われる可能性あり。",
    "maxMemHelp": "1 ジョブの reflection で書き込める memory entry の上限。デフォルト: 3",
    "maxBodyHelp": "memory entry body の最大バイト数。これを超えると semantic validator が reject。デフォルト: 8192",
    "cooldownHelp": "同じ piece への連続編集を抑制する cooldown。デフォルト: 24 (24h 以内に 2 回編集されたら 3 回目以降はスキップ)",
    "activityLogHelp": "reflection LLM に渡す activity log の圧縮上限。デフォルト: 4096",
    "dailyBudgetHelp": "1 ユーザーが 1 日に reflection で消費できる token 合計。超えた以降の reflection は enqueue されません。デフォルト: 200000",
    "snapRetentionHelp": "reflection-history snapshot の保持日数。デフォルト: 90",
    "snapMaxUserHelp": "1 ユーザーあたりの snapshot ディレクトリ合計サイズ上限 (bytes)。超えると古い順に削除。デフォルト: 100 MiB",
    "snapMaxEntryHelp": "1 snapshot エントリの最大サイズ (bytes)。デフォルト: 1 MiB",
    "storeLlmRawLabel": "スナップショットに LLM の生レスポンスを保存する",
    "storeLlmRawHelp": "ON にすると llm-raw.json を snapshot に含めます。デバッグ用途、デフォルトは OFF (ディスク節約)。",
    "abstainFloorHelp": "abstain (学ぶことなし) 率がこれを下回ると過剰学習サインとして警告 (運用シグナル)。デフォルト: 0.3。この値を下回った場合はシステムログに warn が出ます。反映率が高すぎる場合は max_memory_changes_per_job を下げることを検討してください。"
  },
  "notifications": {
    "v1Title": "ブラウザ通知 (V1: 前面表示)",
    "v1UnsupportedTitle": "ブラウザ通知",
    "v1Unsupported": "お使いのブラウザは Notification API に未対応です。",
    "statusLabel": "状態: {{status}}",
    "status": {
      "enabled": "✅ 有効化済み",
      "paused": "⏸ 一時停止中",
      "denied": "🚫 ブラウザで拒否",
      "notAllowed": "❌ 未許可"
    },
    "enableButton": "ブラウザ通知を有効化",
    "deniedHelp": "ブラウザのアドレスバー左の設定アイコンから「通知」を許可に変更してください。",
    "masterToggle": "通知を受け取る (マスター ON/OFF)",
    "testV1": "テスト通知 (ページ内)",
    "testTitle": "テスト通知",
    "testBody": "ブラウザ通知は正常に動作しています",
    "v2Title": "📱 モバイル / バックグラウンド通知 (V2)",
    "pushUnsupported": "お使いのブラウザは Web Push API に対応していません",
    "iosPwaHelp": "iOS Safari では「共有 → ホーム画面に追加」でアプリとしてインストールしてから、ホーム画面のアイコンから開いた状態で通知を有効化できます。",
    "deviceSubscribed": "✅ このデバイスで購読中",
    "deviceNotSubscribed": "❌ このデバイスは未購読",
    "deviceCount": " (合計 {{count}} デバイス)",
    "subscribe": "このデバイスで購読",
    "unsubscribe": "購読を解除",
    "testV2": "テスト通知 (サーバー経由)",
    "deviceListTitle": "購読デバイス一覧",
    "unknownDevice": "(unknown)",
    "failures": "⚠ {{count}} failures",
    "removeDevice": "解除",
    "includeDetails": "通知にタスクの詳細（タイトル・piece 名）を含める",
    "includeDetailsHint": "(OFF: 「タスク #N 完了」のみ)",
    "error": "エラー: {{msg}}",
    "eventsTitle": "通知するイベント",
    "events": {
      "running": "タスク開始 (running)",
      "succeeded": "タスク完了 (succeeded)",
      "failed": "タスク失敗 (failed / aborted)",
      "waiting_human": "ユーザー回答待ち (waiting_human)"
    },
    "footer1": "ⓘ V1 (前面表示) はタブが開いていてフォーカスがある時のみ動作します",
    "footer2": "ⓘ V2 (モバイル / バックグラウンド) は HTTPS + PWA インストール時のみ確実に動作します",
    "footer3": "ⓘ 自分が owner のタスクのみ通知されます"
  },
  "pushNotifications": {
    "title": "Web Push (Server)",
    "intro": "ブラウザ通知 V2（Web Push）のサーバ設定。HTTPS ホスティング必須（iOS は PWA インストールも）。各ユーザーの購読操作は 🔔 Notifications タブで行う。",
    "enableLabel": "Web Push を有効化",
    "enableHelp": "マスタースイッチ。デフォルト: 無効（オペレーターが明示的に opt-in）",
    "subjectLabel": "VAPID Subject",
    "subjectHelp": "RFC 8292 の VAPID subject。汎用 mailto: より運用 URL を推奨",
    "currentPathLabel": "VAPID Current Key Path",
    "currentPathHelp": "現行 VAPID 鍵ペアファイルのパス（未生成なら mode 0600 で自動生成）",
    "historyDirLabel": "VAPID History Dir",
    "historyDirHelp": "失効した VAPID 鍵を退避するディレクトリ",
    "payloadMaxLabel": "Payload Max Bytes",
    "payloadMaxHelp": "暗号化前のプッシュペイロード最大バイト数（上限 4096）。デフォルト: 3072",
    "queueConcurrencyLabel": "Queue Concurrency",
    "queueConcurrencyHelp": "キューからの同時送信数。デフォルト: 8",
    "perSendTimeoutLabel": "Per-Send Timeout (ms)",
    "perSendTimeoutHelp": "1 送信あたりのタイムアウト（ミリ秒）。デフォルト: 10000"
  },
  "llmWorkers": {
    "title": "LLM Workers",
    "intro": "このセクションは AAO がジョブ実行で呼び出す LLM 接続先 (workers) を定義します。AAO 自身を gateway として公開する設定は LLM → Gateway Server にあります。",
    "rolesHelp": "ロール: auto (全 job 候補) / fast · quality (パフォーマンス profile) / reflection (reflection 専用) / title (タイトル生成専用)。複数指定可。",
    "empty": "worker が未登録です。最低 1 つ追加してください。",
    "moveUp": "上に移動",
    "moveDown": "下に移動",
    "removeWorker": "この worker を削除",
    "connectionType": "Connection type",
    "endpointOverride": "OLLAMA_BASE_URL 環境変数で上書き中",
    "selfLoopWarn": "endpoint は自インスタンスを指しているように見えます (self-loop)。リバースプロキシ越しの場合はこの警告は無視できます。",
    "apiKeyRequired": "API key (必須)",
    "apiKeyOptional": "API key (任意)",
    "apiKeyOptionalPlaceholder": "sk-... (任意)",
    "apiKeyGatewayHelp": "他 AAO の LLM → Gateway Server で発行した sk-aao-* を貼り付けてください。",
    "apiKeyDirectHelp": "Bearer 認証が必要な場合のみ設定。Ollama 単体なら空のままで OK。",
    "modelHelp": "endpoint が /models を返せば dropdown に候補が出ます。出ない場合 (auth が必要、proxy 越し等) は直接入力してください。",
    "maxConcurrency": "最大同時実行数",
    "enabled": "有効",
    "vlmTitle": "VLM 対応モデルの場合、ReadImage が worker 自身のモデルを使用",
    "addWorker": "+ Worker を追加",
    "globalTitle": "Global LLM Settings",
    "timeoutHelp": "LLM リクエストのタイムアウト (分)。デフォルト: 10",
    "retryTitle": "Retry (per-call HTTP)",
    "maxAttemptsHelp": "1 回の LLM API 呼び出しでの最大試行回数",
    "backoffHelp": "各リトライ間の待機時間 (ms)。配列順に消費されます。",
    "retryableStatusHelp": "リトライ対象の HTTP ステータスコード。"
  },
  "branding": {
    "notSet": "未設定",
    "replace": "差し替え",
    "upload": "アップロード",
    "delete": "削除",
    "accept": "{{accept}} / 最大 {{kb}}KB",
    "sizeExceeded": "ファイルサイズが上限 {{kb}}KB を超えています",
    "uploadFailed": "アップロードに失敗しました ({{status}})",
    "deleteFailed": "削除に失敗しました ({{status}})",
    "title": "Branding",
    "intro": "UI のタイトル・配色・ロゴ・フッターをカスタマイズします。設定は config.yaml の branding セクション、画像は data/branding/ に保存されます。どちらも .gitignore 済みで git pull の影響を受けません。",
    "appName": "アプリ名",
    "appNameHelp": "TopBar 左上と ブラウザタイトルに表示されます。",
    "primaryColor": "プライマリカラー",
    "primaryColorHelp": "ヘッダーのアプリ名など、ブランドカラーに反映されます（hex / rgb）。",
    "loginTitle": "ログイン画面の見出し",
    "loginTitleHelp": "未設定の場合はアプリ名を使用します。",
    "logo": "ロゴ",
    "logoHelp": "TopBar 左上に表示されます。未設定時はデフォルトのアイコンを使用します。",
    "favicon": "Favicon",
    "faviconHelp": "ブラウザタブに表示されます。",
    "footer": "フッター文言",
    "footerHelp": "画面最下部に小さく表示されます。未設定時は非表示。"
  },
  "safety": {
    "title": "Safety",
    "maxIterHelp": "1 movement あたりの最大イテレーション回数。デフォルト: 200",
    "maxRevisitsHelp": "同一 movement への再訪問上限（ループ検出）。デフォルト: 3",
    "maxToolLoopHelp": "同一 movement 内で全く同じツール呼び出し（ツール名＋引数）を連続で繰り返した回数がこの値に達したら、ループとみなして強制中断する（2以上、デフォルト: 5）。手前で1回エージェントに警告を注入する",
    "promptGuardHelp": "送信前に prompt がコンテキスト上限の何割を占めたら自動圧縮するか（0.5〜0.95、デフォルト: 0.8）",
    "deadlineTitle": "実行デッドライン",
    "maxJobMinutesHelp": "1 ジョブの実行時間の上限（分）。超過するとジョブを自動終了（キャンセル扱い・理由「時間切れ」）してワーカースロットを解放する。暴走や中断不能なツールで固まった場合の最終防壁。デフォルト: 180、0 で無効",
    "deadlineGraceHelp": "デッドライン到達後、協調的な中断が効かないときに強制的にスロットを解放してキャンセル扱い（理由「時間切れ」）にするまでの猶予（秒）。中断シグナルを無視するツールで固まったジョブへの保険。デフォルト: 15、0 で無効（保険を切る・非推奨）",
    "bashSandboxTitle": "Bash サンドボックス",
    "bashSandboxAuto": "auto（bwrap があれば sandboxed、無ければ hardened-whitelist）",
    "bashSandboxAlways": "always（sandboxed を強制・bwrap 不在なら起動時 fail）",
    "bashSandboxOff": "off（素 exec・後方互換／非推奨）",
    "bashSandboxHelp": "Bash ツールのサンドボックス機構。デフォルト: auto",
    "bashUnrestricted": "コマンドのホワイトリストを解除（無制限 Bash）",
    "bashUnrestrictedHelp": "bwrap サンドボックス下で任意コマンドを許可する。ワークスペース(rw)とシステムディレクトリ(ro)のみ bind-mount。bwrap の user-namespace 対応が必要。デフォルト: 無効（セキュリティ上、変更は慎重に）",
    "bashAllowNetwork": "サンドボックスでネットワークを許可（bash / python / npm がネット接続可）",
    "bashAllowNetworkWarnLabel": "⚠ セキュリティ警告:",
    "bashAllowNetworkHelp": " 通常はサンドボックス内の bash・python・npm はネット遮断（--unshare-net）されます。有効にすると pip / npm install / curl 等が使えるようになりますが、サンドボックスの隔離が弱まり、任意のデータ送信（情報漏えい）や内部ネットワーク・メタデータエンドポイントへの到達（SSRF）が可能になります。信頼できる環境でのみ有効化してください。デフォルト: 無効。（Bash Sandbox Mode が off や bwrap 不在時は元々ネット遮断が無いため、この設定は sandboxed 時のみ効きます）",
    "historyTitle": "History Summarization",
    "historyEnable": "履歴の自動要約を有効化",
    "historyEnableHelp": "古い会話履歴を自動で要約して context を節約。デフォルト: 有効",
    "tailTurnsHelp": "常に保持する直近の assistant+tool ターン数。デフォルト: 2",
    "preserveRecentHelp": "要約せず温存する直近メッセージのトークン予算。デフォルト: 8000"
  },
  "mcp": {
    "intro": "外部 MCP (Model Context Protocol) サーバーの接続・実行に関する設定です。接続先サーバーを追加する場合は、各タスクまたは設定から MCP サーバー URL を指定してください。",
    "securityTitle": "セキュリティ",
    "allowPrivate": "プライベート IP への接続を許可する (self-hosted / localhost MCP サーバー用)",
    "allowPrivateHelp": "有効にすると、localhost・LAN アドレス (192.168.x.x, 10.x.x.x 等) への MCP 接続を許可します。SSRF リスクがあるため、信頼できるネットワーク環境でのみ使用してください。デフォルト: 無効",
    "timeoutTitle": "タイムアウト / キャッシュ",
    "callTimeout": "ツール呼び出しタイムアウト (秒)",
    "callTimeoutHelp": "MCP ツールの 1 回の呼び出しに許容する最大時間（秒）。デフォルト: 60",
    "cacheTtl": "ツール一覧キャッシュ TTL (秒)",
    "cacheTtlHelp": "MCP サーバーから取得したツール一覧をキャッシュする時間（秒）。デフォルト: 600",
    "oauthTtl": "OAuth pending state TTL (分)",
    "oauthTtlHelp": "MCP OAuth 認可フローの pending 状態を保持する時間（分）。デフォルト: 10",
    "capacityTitle": "容量制限",
    "maxBinary": "ツール出力バイナリ 1 個あたり最大サイズ (MB)",
    "maxBinaryHelp": "MCP ツールが返すバイナリ出力 1 ファイルの最大サイズ（MB）。デフォルト: 20",
    "maxFiles": "ジョブあたり最大バイナリファイル数",
    "maxFilesHelp": "1 ジョブで MCP ツールが保存できるバイナリファイルの最大数。デフォルト: 10",
    "maxTotal": "ジョブあたり最大バイナリ合計サイズ (MB)",
    "maxTotalHelp": "1 ジョブで MCP ツールが保存できるバイナリ出力の合計最大サイズ（MB）。デフォルト: 200"
  },
  "auth": {
    "title": "Authentication",
    "intro": "ログイン認証。providers を未設定にすると 認証なし（全員ローカル admin）で動作する。変更後はサーバ再起動が必要。",
    "primaryProvider": "Primary Provider",
    "primaryNone": "（指定なし・全て有効）",
    "primaryGoogle": "google のみ",
    "primaryGitea": "gitea のみ",
    "primaryLocal": "local のみ",
    "primaryHelp": "単一プロバイダーに限定する場合に指定。未指定なら設定済みの全プロバイダー（OAuth + ローカル）でログイン可",
    "adminEmails": "Admin Emails",
    "adminEmailsHelp": "admin ロールを付与するメールアドレス",
    "secureCookie": "Secure Cookie（HTTPS のみで Cookie 送信）",
    "secureCookieHelp": "本番（HTTPS）では有効推奨。HTTP のローカル開発では無効",
    "sessionMaxAgeHelp": "セッションの有効期間（ミリ秒）",
    "sessionSecretHelp": "セッション署名鍵。十分長いランダム文字列を設定（保存後はマスク表示）",
    "localTitle": "ローカルアカウント（email + password）",
    "localEnable": "ローカルログインを有効化",
    "localEnableHelp": "外部 IdP を立てずに email/password でログインできるようにする。OAuth と併用可（primary_provider: local で local のみに限定）",
    "allowSignup": "セルフ登録を許可",
    "allowSignupHelp": "ログイン画面に新規登録フォームを出す。登録は承認待ちで作成され、admin がユーザー管理で承認するまでログインできない",
    "bootstrapHelp": "初回 admin（bootstrap_admin）は、UI に入るには既に admin ログインが必要なため、config.yaml の auth.local.bootstrap_admin で設定します（id='local' で seed され、no-auth 時代のデータを引き継ぎます）。以降のユーザーは ユーザー管理 画面で作成・パスワードリセットできます。",
    "googleTitle": "Google OAuth",
    "giteaTitle": "Gitea OAuth"
  },
  "browser": {
    "title": "Browser",
    "pageTimeoutHelp": "ページ読み込みのタイムアウト（ミリ秒）。デフォルト: 60000",
    "actionTimeoutHelp": "ブラウザ操作のタイムアウト（ミリ秒）。デフォルト: 30000",
    "channelHelp": "Google ログイン等で「セキュアでないブラウザ」と弾かれる場合は chrome に切替。ホストに google-chrome がインストールされている必要あり。",
    "execPathHelp": "非標準パスにあるブラウザを使う場合のみ指定。未設定なら channel に従う。",
    "sessionsTitle": "Sessions (CDP)",
    "sessionMode": "Browser Session Mode",
    "headless": "Headless（ライブ表示なし・既定）",
    "novnc": "noVNC（Browser/CAPTCHA をライブ表示）",
    "sessionModeHelp": "ライブ表示機能のマスタースイッチ。novnc にすると Browser タブのライブ表示・InteractiveBrowse・CAPTCHA 解決が有効になる。ホストに Xvfb / x11vnc / websockify が必要（未導入なら自動的に headless にフォールバック）。headless（既定）ではそれらのライブ表示機能は使えない。",
    "maxCaptchaHelp": "CAPTCHA Pool が同時に開けるページ数の上限（novnc モード時のみ有効）。デフォルト: 5",
    "vncPortHelp": "VNC サーバーのベースポート。デフォルト: 5900",
    "sessionDirHelp": "Cookie を永続化するディレクトリ。",
    "maxSessionsHelp": "同時に起動できるセッションの最大数。デフォルト: 3",
    "idleTtl": "Task Session Idle TTL (秒)",
    "idleTtlHelp": "タスク用 CDP セッションをアイドル後に破棄するまでの秒数（GC）。デフォルト: 300"
  },
  "orgs": {
    "intro": "ローカルアカウント向けの組織。タスク/スケジュールの可視性を org にして、同じ組織のメンバーと共有できます（Gitea 組織とは別系統）。",
    "newNamePlaceholder": "新しい組織名",
    "create": "+ 組織を作成",
    "loading": "読み込み中...",
    "empty": "組織がありません。上で作成してください。",
    "confirmDelete": "組織「{{name}}」を削除しますか？\nこの組織に共有されているタスク等は private に戻ります。",
    "memberHint": "メンバーを追加/削除すると、そのユーザーのセッションは無効化され、次回アクセス時に共有が反映されます。",
    "delete": "削除",
    "membersCount": "メンバー（{{count}}）",
    "noMembers": "メンバーがいません",
    "removeMemberTitle": "削除",
    "addMemberPlaceholder": "メンバーを追加...",
    "add": "追加"
  },
  "pathsStorage": {
    "intro": "ファイルシステム上の保存先と上限の設定。config v2 では storage.* に集約されています。",
    "worktreeOverride": "WORKTREE_DIR 環境変数で上書き中",
    "worktreeHelp": "ジョブ実行時の作業ディレクトリのベースパス",
    "customPiecesHelp": "リポジトリ内の pieces/ とは別に、追加の Piece を配置するディレクトリ。省略時は pieces/ のみ使用",
    "userFolderHelp": "ユーザーごとの設定・スクリプト・メモリ等を保存するルートディレクトリ",
    "taskUploadLabel": "Task Upload 最大サイズ (MB)",
    "taskUploadHelp": "POST /api/local/tasks および POST /api/local/tasks/:id/comments のリクエスト body 上限。範囲 1〜1000 MB、デフォルト 50。",
    "trashLabel": "Trash Retention (日)",
    "trashHelp": "data/users/{userId}/trash/ のファイルを自動削除するまでの日数。0 を指定すると即削除。デフォルト 30 日。"
  },
  "execution": {
    "intro": "同時実行数、1 ジョブあたりの movement 上限、ジョブ失敗時のリトライ設定。",
    "concurrencyOverride": "CONCURRENCY 環境変数で上書き中",
    "concurrencyHelp": "同時実行可能なジョブ数",
    "maxMovementsHelp": "1ジョブあたりの最大 movement 数",
    "maxAttemptsHelp": "ジョブ失敗時の最大リトライ回数。デフォルト: 3",
    "backoffHelp": "リトライ間隔（秒）。カンマ区切り。デフォルト: 60, 300, 900"
  },
  "context": {
    "limitPlaceholder": "auto (Ollama API から取得)",
    "limitHelp": "トークン上限の手動指定。空欄で自動取得。",
    "thresholdsLabel": "Thresholds (閾値)",
    "thresholdsHelp": "コンテキスト使用率に応じたアクション。ratio は 0〜1。warn: ログに警告を出力するのみ ／ prompt: LLM へ遷移を促すメッセージを注入 ／ force_transition: default_next に強制遷移"
  },
  "metrics": {
    "intro": "LLM Worker と AAO Gateway Server の Prometheus 互換 metrics 設定。config v2 では llm.metrics と gateway.metrics に分離されています。",
    "enable": "有効化",
    "prefixHelp": "Prometheus metric 名の prefix（例: {{prefix}}）",
    "bearerHelp": "/metrics エンドポイントへのアクセス時に要求される Bearer token。env:NAME で環境変数参照可。",
    "allowedHostsHelp": "許可するクライアント host (IP / hostname)。空の場合は token のみで認証。"
  },
  "configForm": {
    "adminOnly": "この設定は管理者のみ閲覧できます。",
    "conflict": "設定が他で変更されました。再読み込みしますか？",
    "saved": "保存しました",
    "error": "エラー: {{msg}}",
    "saving": "Saving...",
    "loadError": "設定の読み込みに失敗しました",
    "unsaved": "未保存: {{count}} 項目 — 「Save & Apply」を押すまで反映されません",
    "unsavedShort": "未保存 {{count}}"
  },
  "searchFilter": {
    "blockedLabel": "Blocked Patterns (ブロックパターン)",
    "blockedHelp": "WebSearch クエリからフィルタするパターン（正規表現）。",
    "autoBlockLabel": "Auto Block (自動ブロック)",
    "autoBlockPrivateIp": "プライベートIP",
    "autoBlockInternalDomain": "内部ドメイン",
    "autoBlockEmail": "メールアドレス",
    "autoBlockPhone": "電話番号",
    "autoBlockHelp": "検索クエリに含まれる機密情報を自動でブロック。"
  },
  "pieceEditor": {
    "toastSaveYamlParse": "エラー: YAML のパースに失敗しました",
    "toastSaveYamlError": "エラー: YAML パースエラー — {{msg}}",
    "toastSaved": "保存しました",
    "toastError": "エラー: {{msg}}",
    "confirmDelete": "Piece \"{{name}}\" を削除しますか？この操作は取り消せません。",
    "loadError": "Piece の読み込みに失敗しました",
    "readonly": "読み取り専用",
    "yamlHelp": "YAML を直接編集できます。Visual モードに切り替えると自動でパースされます。",
    "yamlParseFailed": "YAML のパースに失敗しました"
  },
  "pieceMeta": {
    "nameHelp": "英小文字・数字・ハイフンのみ使用可能",
    "maxMovementsHelp": "1 ジョブで実行できる movement の最大回数。ループ防止のため",
    "initialMovementHelp": "ジョブ開始時に最初に実行される movement です",
    "keywordsHelp": "タスク本文にこれらのキーワードが含まれると、この piece が自動選択されます"
  },
  "movement": {
    "instructionHelp": "LLM に渡される指示文。Markdown 記法が使えます"
  },
  "rules": {
    "conditionPlaceholder": "条件...",
    "help": "LLM が transition ツールで遷移先を選ぶ際の条件です"
  },
  "askSubtasks": {
    "askMaxHelp": "1 Job あたりの ASK（ユーザーへの質問）上限",
    "maxDepthHelp": "サブタスクのネスト最大深度",
    "maxPerParentHelp": "1 つの親ジョブが spawn できるサブタスクの最大数。デフォルト: 10"
  },
  "namespaceEditor": {
    "addAriaDisabled": "新規追加は無効化されています",
    "addAria": "新規追加",
    "add": "+ 追加",
    "mcpGuide": "MCP ガイド"
  },
  "stringArray": {
    "add": "追加"
  },
  "movementAccordion": {
    "confirmDelete": "Movement \"{{name}}\" を削除しますか？"
  },
  "formUtils": {
    "envOverride": "環境変数で上書きされています（保存しても反映されません）"
  },
  "settingsPage": {
    "sectionList": "セクション一覧"
  },
  "serverTls": {
    "title": "HTTPS / TLS",
    "port": "HTTP(S) ポート",
    "portHelp": "サーバーが待ち受けるポート番号（デフォルト 9876）。環境変数 PORT（.env 含む）がこの値より優先されます。反映にはサーバーの再起動が必要です。",
    "enabled": "HTTPS で配信",
    "enabledHelp": "アプリ内で TLS を終端します。デフォルトは自己署名証明書のため、正式な証明書を導入するまでブラウザ（および wss 経由の noVNC・SSH コンソール）に警告が表示されます。反映にはサーバーの再起動が必要です。",
    "certFile": "証明書ファイル（PEM）",
    "keyFile": "秘密鍵ファイル（PEM）",
    "certHelp": "両方を空欄にすると、自動生成の自己署名証明書を使用します。",
    "httpRedirect": "HTTP を HTTPS へリダイレクト",
    "httpRedirectHelp": "一時リダイレクト（302）で送るため、このスイッチをオフにすればリダイレクトは止まります（ブラウザに恒久キャッシュされません）。反映には再起動が必要です。",
    "httpRedirectPort": "HTTP リダイレクトポート",
    "httpRedirectPortHelp": "平文 HTTP を HTTPS へリダイレクトするポート。単一ポートか、カンマ区切りの複数指定が可能（例: 80, 9876）。各ポートは HTTPS ポートと異なる必要があり、1024 未満（80 など）の bind には権限が必要。",
    "redirectHost": "リダイレクト先ホスト（省略可）",
    "hsts": "HSTS を送出（上級者向け・既定オフ）",
    "hstsHelp": "正式な証明書を導入している場合のみオンにしてください。HSTS はブラウザを HTTPS に固定し、一度送ると後からオフにしても解除できません（自己署名では害だけが残ります）。オフのままなら、サーバーは過去に固定されたブラウザを解除するための信号（max-age=0）を送ります。以前 HTTPS にずっとリダイレクトされていた場合は、このスイッチをオフのまま一度 HTTPS でアプリを開けば固定が解除されます。反映には再起動が必要です。",
    "selfSignedHosts": "証明書の追加ホスト名",
    "restartBanner": "HTTPS 設定の変更を反映するには、サーバーの再起動が必要です。"
  }
}
