// Japanese dictionary. Mirror the shape of src/lang/en.ts — // missing keys fall back to English per createI18n's fallbackLocale. // // ⚠️ `` のような山括弧を含む文字列は vue-i18n の XSS // ヒューリスティックに引っかかり「Detected HTML in '…' message」 // 警告が出るため、**関数形式** で書くこと。詳細は en.ts の // ヘッダーコメントを参照。 const jaMessages = { common: { downloadZip: "ZIP", downloadFailed: "ダウンロードに失敗しました", save: "保存", cancel: "キャンセル", loading: "読み込み中...", close: "閉じる", dismiss: "閉じる", add: "追加", remove: "削除", yes: "はい", no: "いいえ", saving: "保存中...", saved: "保存しました", noResultsYet: "まだ結果はありません", noImageYet: "画像はまだありません", sendChat: "新しいチャットを開始", }, sessionTabBar: { newSession: "新しいセッション", // 日本語は単複同形のため左右同じ文字列だが、vue-i18n の // pluralization API に合わせて `|` 区切りで揃える。 activeSessions: "{count} 件のアクティブセッション(エージェント実行中)", unreadReplies: "{count} 件の未読返信", unreadDot: "新しい返信", origin: { scheduler: "スケジューラから開始", skill: "スキルから開始", bridge: "ブリッジから開始", }, }, chatInput: { placeholder: "Claude にメッセージ…", send: "送信", stop: "停止", runningPlaceholder: "実行中… Enter で後で送るキューに追加", removeBuffered: "キューのメッセージを削除", attachFile: "ファイルを添付", fileTooLarge: "ファイルが大きすぎます({sizeMB} MB)。上限は 30 MB です。", unsupportedFileType: "対応していないファイル形式です。画像・PDF・DOCX・XLSX・PPTX・テキストファイルを使用してください。", attachImageFailed: "画像の添付に失敗しました: {error}", stopFailed: "処理の停止に失敗しました: {error}", dropHint: "ファイルをドロップして添付", tooManyFiles: "一度に添付できるのは {max} 件までです。", removeAttachment: "{name} を削除", attachmentFallbackName: "添付ファイル", voice: { start: "音声入力を開始", stop: "音声入力を停止", }, }, cspViolation: { notice: "⚠ ビューが {host} を読み込もうとしましたが、コンテンツセキュリティポリシー({directive})でブロックされました。許可するには config/csp.json にこのホストを追加してください(信頼できる場合のみ)。", dismiss: "閉じる", }, sessionHistoryPanel: { filters: { all: "すべて", unread: "未読", bookmarked: "ブックマーク", longRunning: "長期 (24h+)", human: "手動", scheduler: "スケジューラ", skill: "スキル", bridge: "ブリッジ", }, failedToRefresh: "⚠ 更新に失敗: {error}", showingLastKnown: " — 前回取得の一覧を表示しています。", noSessions: "セッションはまだありません。", noMatching: "該当するセッションはありません。", running: "実行中", noMessages: "(メッセージなし)", openRowAria: "セッションを開く: {preview}", rowMenuAria: "セッションの操作", bookmark: "ブックマーク", unbookmark: "ブックマーク解除", delete: "削除", deleteConfirm: "このセッションを削除しますか?\n\n{preview}\n\nこの操作は取り消せません。", }, notificationBell: { notifications: "通知", activeSection: "アクティブ", historySection: "履歴", noActive: "アクティブな通知はありません", noHistory: "最近のアクティビティはありません", clearAll: "すべてクリア", dismiss: "閉じる", cancel: "キャンセル", showMore: "もっと見る ({count})", showLess: "閉じる", openTarget: "開く", expandDetails: "詳細を展開", }, pluginDiagnostics: { title: "プラグイン設定の問題", hostBody: "プラグイン「{plugin}」が {label} キー「{key}」を登録しようとしましたが、ホスト予約のため拒否されました。プラグインのエントリは破棄されました。", intraBody: "プラグイン「{first}」と「{second}」が同じ {dimension}「{key}」を登録しています。「{first}」が先に確保したため、「{second}」の登録は無視されます。", }, shadowedEnv: { title: "シェルの環境変数が .env を上書きしています", body: "シェルと .env の両方に設定されています: {keys}。シェル側の値が使われるため .env は無視されます。.env を編集した場合は、シェル側の値を更新するか解除して再起動してください。", }, optionalDeps: { // 旧来の `title` キーは、永続化済み履歴エントリの後方互換のため残す。 // 新規発火は `titleNotFound` / `titleNotResponding` を使用。 title: "任意の依存コマンドを利用できません", titleNotFound: "{command} がインストールされていません", titleNotResponding: "{command} が起動していません", notFound: "{command} がインストールされていないため、関連機能を停止しています。{command} をインストールしてから MulmoClaude を再起動してください。", notResponding: "{command} が起動していないため、関連機能を停止しています。{command} を起動してから MulmoClaude を再起動してください。", }, billingMigration: { title: "請求書機能はオンデマンド設定に移行しました", body: "同梱されていた clients・worklog・invoice・profile のコレクションはダッシュボードから削除されましたが、データは安全でそのまま保持されています。クライアントと作業時間の記録、続いて請求書の設定を依頼すると再作成され、既存のレコードが再び表示されます。", }, backendOffline: { title: "バックエンドに接続できません", body: "MulmoClaude サーバが起動していない可能性があります。dev サーバを確認してから再試行してください。", retry: "再試行", }, pluginErrorBoundary: { title: "プラグイン {pkg} がクラッシュしました", subtitle: "プラグインのレンダリングに失敗しました。エラーはコンソールに記録されています。", showDetails: "詳細を表示", hideDetails: "詳細を隠す", retry: "再試行", }, remoteHostOffline: { title: "リモートホストが切断されました", body: "再接続するまで、スマホからの送信はこの端末に届きません。", reconnect: "再接続", }, remoteHost: { title: "リモートホスト", online: "リモートホスト: オンライン", offline: "リモートホスト: オフライン", uid: "uid {uid}", signIn: "Google でサインイン", connecting: "接続中…", disconnect: "切断", disconnecting: "切断中…", noToken: "Google サインインで idToken が取得できませんでした", connectFailed: "接続に失敗しました", disconnectFailed: "切断に失敗しました", signInFailed: "Google サインインに失敗しました", statusFailed: "状態の取得に失敗しました", description: "リモートアクセスを有効にすると、モバイルデバイスからこの MulmoClaude のコレクションとフィードに接続できます。", howTo: "モバイルから {url} を開き、同じ Google アカウントでサインインしてください。", customViewHint: "モバイル向けのビューが必要な場合は、通常の custom view ではなく {keyword} を作るように Claude に依頼してください。", qrHint: "スマートフォンのカメラでこの QR コードを読み取っても開けます。", }, sidebarHeader: { newMessages: "新着", home: "最新のチャットに移動", toolCallHistory: "ツール呼び出し履歴", settings: "設定", settingsGeminiMissing: "設定 — Gemini API キー未設定", todayJournal: "今日のまとめ", todayJournalNotFound: "まだまとめがありません — しばらく会話するとjournalが生成します。", todayJournalLoadFailed: "journal の読み込みに失敗しました (status {status}): {error}", copyMarkdown: "チャットを Markdown としてコピー", copiedMarkdown: "コピーしました", }, rightSidebar: { permalink: "選択中メッセージへのリンク", copyPermalink: "選択中メッセージへのリンクをコピー", copiedPermalink: "コピーしました!", toggleSystemPrompt: "システムプロンプトの表示切替", systemPrompt: "システムプロンプト", availableTools: "利用可能ツール", toggleToolDescription: "ツール説明の表示切替", toolCallHistory: "ツール呼び出し履歴", copyHistory: "ツール呼び出し履歴をコピー", copiedHistory: "コピーしました!", noToolCalls: "ツール呼び出しはまだありません", arguments: "引数", error: "エラー", result: "結果", running: "実行中...", mcpHint: { title: (ctx: { named: (key: "server") => string }) => `${ctx.named("server")} のセットアップヒント`, requiredKeys: "必要なキー", setupGuide: "セットアップガイドを開く", }, }, fileTreePane: { sort: "並び順:", sortByName: "名前順", name: "名前", sortByRecent: "更新日順(新しい順)", recent: "最近", reference: "参照", readOnlyBadge: "RO", showSystemFiles: "システムファイルを表示", showSystemFilesTitle: "エージェント内部の top-level ディレクトリ (conversations/ や feeds/ など) をユーザーデータ (data/ artifacts/ config/) と合わせて表示します。", }, fileTree: { dropHint: "ここにファイルをドロップするとこのフォルダに保存されます", upload: { progress: "アップロード中 {done}/{total}…", done: "{count} 件のファイルを保存しました", failed: "{count} 件のファイルを保存できませんでした", }, workspace: "(ワークスペース)", recentlyChanged: "最近変更されました", newFileMenuItem: "新規ファイル", newFileInputAria: "新規ファイル名", newFilePlaceholder: { wikiPage: "ページのスラッグ", summary: "サマリー名", document: "ドキュメント名", html: "ページ名", story: "ストーリー名", }, newFileError: { empty: "ファイル名を入力してください。", unsafe: "ファイル名に使用できない文字が含まれています。", exists: "{filename} は既に存在します。", saveFailed: "ファイルを作成できませんでした。もう一度お試しください。", }, }, lockStatusPopup: { sandboxEnabledTooltip: "サンドボックス有効 (Docker)", noSandboxTooltip: "サンドボックスなし (Docker 未検出)", sandboxEnabledLabel: "サンドボックス有効:", sandboxEnabledBody: "Docker が動作中です。ファイルシステムアクセスは隔離されています。", noSandboxLabel: "サンドボックスなし:", noSandboxBodyPrefix: "Claude はこのマシンの全ファイルにアクセスできます。", noSandboxBodySuffix: "をインストールしてファイルシステムを隔離してください。", dockerDesktop: "Docker Desktop", hostCredentials: "ホスト認証情報の接続状況:", credsLoading: "読み込み中…", sshAgent: "SSH エージェント:", forwarded: "転送中", notForwarded: "転送なし", mountedConfigs: "マウント設定:", none: "なし", testIsolation: "サンドボックス隔離をテスト:", }, settingsModal: { title: "設定", version: "MulmoClaude v{version}", tabs: { gemini: "Gemini API キー", tools: "許可ツール", mcp: "MCP サーバ", dirs: "ディレクトリ", refs: "参照ディレクトリ", map: "地図", photos: "写真", google: "Google", model: "モデル", voice: "音声", chatIndex: "チャットインデックス", journal: "ジャーナル", notifications: "Web Push", skills: "スキル", roles: "ロール", quit: "終了", }, groups: { llm: "LLM", servers: "サーバ", workspace: "ワークスペース", notifications: "通知", plugins: "プラグイン", management: "管理", server: "サーバー", }, navAriaLabel: "設定セクション", googleTab: { description: "Google アカウントを連携すると、このマシンから Google API(まずはカレンダー)を直接呼び出せます。リフレッシュトークンはこのマシンにのみ保存され、Google 以外には送信されません。", statusLinked: "連携済み", statusNotLinked: "未連携", statusPending: "ブラウザでの同意完了を待っています…", connect: "Google アカウントを連携", unlink: "連携を解除", unlinkConfirm: "Google アカウントの連携を解除しますか?保存済みトークンは無効化され、このマシンから削除されます。", clientSecretAmbiguous: "~/.secrets/ に client_secret_*.json が複数見つかりました。保存済みトークンと OAuth クライアントの組み合わせがずれないよう、1つだけ残してください。", loadError: "Google 連携状態の取得に失敗しました。", connectError: "Google 認可フローの開始に失敗しました。", unlinkError: "Google 連携の解除に失敗しました。", }, mapTab: { description: "地図プラグインで使う Google Maps API キーを設定します。キーはローカルに保存され、Google Maps への通信以外で送信されることはありません。", apiKeyLabel: "Google Maps API キー", apiKeyPlaceholder: "AIza…", helperText: "{consoleLink} でキーを作成またはコピーしてください。", requiredApis: "有効化が必要な API: Maps JavaScript API / Geocoding API / Places API (New) / Directions API", configured: "設定済み", notConfigured: "未設定", clear: "クリア", loadError: "設定の読み込みに失敗しました", saveError: "保存に失敗しました", }, photosTab: { description: "チャットや bridge 経由で受け取った写真のプライバシー設定。EXIF の位置情報は機微なため、自動取得を停止したい場合はチェックを外してください。", autoCaptureLabel: "写真の位置情報を自動取得", autoCaptureHint: "ON のとき、EXIF に GPS を持つ画像をアップロードすると data/locations/ に sidecar が自動生成されます。OFF にすると自動取得は停止しますが、必要なときに LLM が手動で EXIF を読むことは可能です。", statusOn: "自動取得は ON", statusOff: "自動取得は OFF", loadError: "設定の読み込みに失敗しました", saveError: "保存に失敗しました", }, quitTab: { description: "このマシンで動いている MulmoClaude サーバーを終了します。アイコンから起動した場合、このタブを閉じてもサーバーは動き続けます。ターミナルを使わずに止める手段がここです。", // Message function form — skips vue-i18n's message compiler so the // literal `@` in `mulmoclaude@latest` is not parsed as a linked-message // reference (the compiler throws, and the whole tab renders as nothing). restartHint: () => "もう一度起動するには、MulmoClaude のアイコンをダブルクリックしてください(または `npx mulmoclaude@latest`)。", quitLabel: "MulmoClaude を終了", confirmBody: "サーバーが停止し、このページは動かなくなります。実行中の処理は中断されます。", confirmLabel: "終了する", stopping: "終了しています…", stoppedTitle: "MulmoClaude を終了しました", stoppedBody: "このタブは閉じて構いません。もう一度使うにはアイコンをダブルクリックしてください。", error: "サーバーの終了に失敗しました", }, notificationsTab: { description: "ここで開始したタスクが完了したときに、登録済みのデバイスへプッシュ通知を送ります。質問して席を外し、答えができた瞬間を知りたいときに便利です。", enableLabel: "タスク完了時に Web Push を送る", enableHint: "ここで開始したチャットが完了したときに発火します。スケジュール実行やバックグラウンドのタスクでは発火しません。", remoteHostNote: "RemoteHost 接続(サインインを供給)と、登録済みデバイスが1台以上必要です。どちらかが欠けている場合は何も起きません。", macosRemindersLabel: "タスク完了時に macOS のリマインダーを作成する", macosRemindersHint: "完了したタスクを既定のリマインダーリストに追加します。iCloud 同期が iPhone に反映し、そこで通知が届きます。", macosRemindersForcedOff: "起動時に --disable-macos-reminders または DISABLE_MACOS_REMINDER_NOTIFICATIONS で無効化されています。フラグを外すか環境変数を解除して再起動すると、ここから操作できます。", statusOn: "Web Push は ON", statusOff: "Web Push は OFF", loadError: "設定の読み込みに失敗しました", saveError: "保存に失敗しました", }, modelTab: { description: "Claude Code が各ターンで使う推論 effort を設定します。未設定の場合は Claude のデフォルトに従います。", effortLabel: "推論 effort", effortUnset: "(未設定 — Claude のデフォルトを使用)", helperText: "高いレベルほど思考時間が長くなりますが、レイテンシとトークン消費も増えます。", configured: "Effort: {level}", notConfigured: "未設定", loadError: "設定の読み込みに失敗しました", saveError: "保存に失敗しました", }, voiceTab: { description: "チャットメッセージを音声で入力できます。音声は MulmoClaude を実行しているマシン上でローカルに文字起こしされ、外部サービスには一切送信されません。", requirements: "macOS でのみ利用できます。whisper.cpp サーバーが必要です。yarn build:whisper でビルドしてください(README の Local Voice Input セクションを参照)。", unsupported: "音声入力には whisper.cpp サーバーがインストールされた macOS が必要です。このマシンでは利用できません。", enableLabel: "音声入力を有効にする", enableHint: "オンにすると音声モデル(1〜3 GB)を一度だけダウンロードします。その後、チャット入力欄にマイクボタンが表示されます。", modelLabel: "音声モデル", downloading: "モデルをダウンロード中… {percent}%", ready: "モデルの準備が完了しました", downloadError: "モデルのダウンロードに失敗しました。", retry: "再試行", loadError: "設定の読み込みに失敗しました", saveError: "保存に失敗しました", }, chatIndexTab: { description: "チャット履歴の AI タイトル/サマリー自動生成の設定です。デフォルトは off で、自動化系のセッション(scheduler / system worker)は on にしても常に除外されます。人間のセッションのみターン終了時に 1 回要約が走ります。", modeLabel: "チャットインデックスのモデル", helperText: "Haiku は安価。Sonnet は長く話題が移るセッションでタイトル品質が高くなります。", mode: { off: "オフ", haiku: "Haiku", sonnet: "Sonnet", }, status: { off: "インデックス作成: オフ", haiku: "Haiku でインデックス作成中", sonnet: "Sonnet でインデックス作成中", }, loadError: "設定の読み込みに失敗しました", saveError: "保存に失敗しました", }, journalTab: { description: "ジャーナル日次パスの設定です。最近のチャットセッションを journal/*.md に要約し、恒久メモリ(memory.md)を抽出します。デフォルトは off。自動化系セッション(scheduler / system worker)はこの設定に関わらず常に除外されます。", modeLabel: "ジャーナルのモデル", helperText: "Haiku は安価。Sonnet は日次/トピックまとめの質が高くなります。毎時のパスはここが on の時のみ実行されます。", mode: { off: "オフ", haiku: "Haiku", sonnet: "Sonnet", }, status: { off: "ジャーナル: オフ", haiku: "Haiku でジャーナル実行中", sonnet: "Sonnet でジャーナル実行中", }, loadError: "設定の読み込みに失敗しました", saveError: "保存に失敗しました", }, // `` スロット — `envKey` / `envFile` は SettingsModal.vue で // インラインの `` として描画されるため、変数名とファイル名は // 翻訳せずそのまま残します。 geminiRequired: "画像生成には {envKey} が必要です。{envFile} に追加してアプリを再起動してください。", geminiAskButton: "Claude に質問", geminiAskMessage: "このアプリにおける Gemini API キーの役割は何ですか?", toolNamesLabel: "ツール名", invalidToolNamesPrefix: "次の項目は標準的ではないようです(期待される接頭辞", invalidToolNamesSuffix: "):", mcpToolsError: "⚠ MCP ツール状態の取得に失敗しました: {error}。有効/無効にかかわらず全ツールを表示しています。", changesHint: "次回のメッセージから反映されます。再起動は不要です。", cannotSaveTooltip: "設定の読み込みに成功するまで保存できません", saving: "保存中…", loadingLabel: "読み込み中…", unsavedMarker: "●", unsavedToolsConfirm: "許可ツールに未保存の変更があります。閉じてもよろしいですか?", unsavedMcpDraftConfirm: "MCP サーバーの下書きが残っています。閉じてもよろしいですか?", mcpSaveFailed: "MCP サーバーの変更を保存できませんでした。", }, canvasViewToggle: { stackViewTooltip: "スタック表示・クリックで Single に切替", singleViewTooltip: "Single 表示・クリックで Stack に切替", switchToSingle: "Single 表示に切替", switchToStack: "Stack 表示に切替", }, sessionHistoryToggle: { showTooltip: "左側にセッション履歴パネルを表示", hideTooltip: "セッション履歴パネルを閉じる", show: "セッション履歴を表示", hide: "セッション履歴を閉じる", }, sessionHistoryExpand: { expandTooltip: "セッション履歴パネルを全画面表示", collapseTooltip: "セッション履歴パネルを元のサイズに戻す", expand: "セッション履歴を拡大", collapse: "セッション履歴を縮小", }, settingsWorkspaceDirs: { explanation: "{dataDir} および {artifactsDir} 配下でファイルを整理するためのカスタムディレクトリ。Claude がファイル保存先を振り分けるために使用します。", noEntries: "カスタムディレクトリは未設定です。", addDirTitle: "ディレクトリを追加", pathPlaceholder: "data/clients または artifacts/reports", descPlaceholder: "説明(このフォルダに入れるもの)", errPathRequired: "パスを入力してください", errMustStartWith: "data/ または artifacts/ で始める必要があります", errAlreadyExists: "既に登録されています", }, settingsReferenceDirs: { explanation: "Claude が読み取れるが変更できない外部ディレクトリ。Docker モードでは読み取り専用でマウントされます。Obsidian vault、プロジェクトコード、ドキュメントフォルダなどの参照に便利です。", noEntries: "参照ディレクトリは未設定です。", addDirTitle: "参照ディレクトリを追加", pathPlaceholder: "/Users/me/ObsidianVault または ~/Documents/notes", labelPlaceholder: "ラベル(省略時はフォルダ名)", readOnlyBadge: "読み取り専用", errPathRequired: "パスを入力してください", errMustBeAbsolute: "絶対パスまたは ~/ で始まる必要があります", errAlreadyExists: "既に登録されています", errLabelConflict: "ラベル「{label}」は既に使用されています", }, dashboard: { empty: "お気に入りのコレクションはまだありません。", emptyHint: "コレクションをピン留め(★)するとここに表示されます。", viewTable: "テーブル", viewCalendar: "カレンダー", viewKanban: "カンバン", viewPickerLabel: "表示を選択", openFull: "ダブルクリックで全体表示を開く", dragHint: "ドラッグして並べ替え", resizeHint: "ドラッグして高さを変更", }, pluginLauncher: { chat: { label: "チャット" }, dashboard: { label: "ダッシュボード" }, automations: { label: "自動化" }, wiki: { label: "Wiki" }, collections: { label: "コレクション" }, feeds: { label: "フィード" }, accounting: { label: "会計" }, files: { label: "ファイル" }, }, shortcuts: { pin: "ランチャーに固定", unpin: "ランチャーから外す", zoneAriaLabel: "固定したショートカット", reorder: { open: "ショートカットを並び替え", title: "並び替え", moveUp: "上へ", moveDown: "下へ", }, }, fileContentHeader: { showRendered: "レンダリング表示", showRaw: "ソース表示", rendered: "レンダリング", raw: "ソース", closeFile: "ファイルを閉じる", revealInOs: "ファイルの場所を開く", revealInOsFailed: "フォルダを開けませんでした", }, fileContentRenderer: { download: "ZIP", downloadZip: "自己完結zipでダウンロード(アセット同梱)", downloadError: "ダウンロードに失敗しました", selectFile: "ファイルを選択してください", htmlPreview: "HTML プレビュー", pdfPreview: "PDF プレビュー", parseError: "パースエラー", editJson: "JSON を編集", jsonEditorLabel: "JSON エディタ", invalidJson: "不正な JSON", undo: "元に戻す", redo: "やり直し", editMarp: "スライドソースを編集", marpEditorLabel: "Marp スライドソース", openInOs: "OS で開く", openingInOs: "開いています…", openInOsFailed: "OS で開けませんでした", }, filesView: { chatPlaceholder: "このファイルについて質問…", }, systemFiles: { schemaLabel: "スキーマ", showDetails: "詳細を表示", hideDetails: "詳細を隠す", editPolicy: { "agent-managed-but-hand-editable": "エージェント管理(手動編集可)", "user-editable": "ユーザー編集可", "agent-managed": "エージェント管理", "fragile-format": "壊れやすい書式", ephemeral: "一時ファイル", }, mcp: { title: "MCP サーバ", summary: "エージェントに接続される外部の Model Context Protocol サーバ。HTTP / stdio サーバを追加してツールを拡張できます。", }, settings: { title: "アプリ設定", summary: "ユーザー編集可能な動作設定 — Gemini API キー、許可ツール、サンドボックス設定など。", }, schedulerTasks: { title: "スケジューラタスク", summary: "定期実行されるエージェント自動化。Automations UI から管理し、このファイルがディスク上の正本です。", }, schedulerOverrides: { title: "スケジューラオーバーライド", summary: "システム既定スケジュールに上書きするタスクごとの時刻 / 間隔の上書き。会話で「このタスクの時刻を変えて」と頼むとエージェントが書き換えます。", }, schedulerItems: { title: "スケジューラアイテムキュー", summary: "発火待ちの予約済み実行キュー。エージェント管理 — 各フィールドの意味を理解していなければ手動編集しないでください。", }, wikiIndex: { title: "Wiki インデックス", summary: "全 Wiki ページの自動生成インデックス。Wiki 編集ごとに更新されます — 手動編集すると上書きされます。", }, wikiLog: { title: "Wiki 編集ログ", summary: "Wiki ページ作成・編集の活動ログ。エージェント管理の追記専用 — 直近変更フィードとして便利です。", }, wikiSummary: { title: "Wiki サマリ", summary: "Wiki の自動生成概要 — トピッククラスタ、ページ数、最近の活動。エージェントが定期的に更新します。", }, wikiSchema: { title: "Wiki スキーマ", summary: "Wiki ページの一貫性を保つためにエージェントが参照する書式仕様。壊れやすい — 特定の構造を期待するため、エージェント主導の編集を推奨します。", }, memory: { title: "メモリ", summary: "新しい会話のコンテキストとして常に読み込まれる、あなたに関する蒸留された事実。journal の抽出器が自動追記し、手動編集も可能です。", }, summariesIndex: { title: "サマリインデックス", summary: "journal が生成する日次・トピックサマリへのリンク集。エージェント管理 — journal 実行ごとに更新されます。", }, rolesJson: { title: "ロール定義 (JSON)", summary: "ロール設定 — モデル選択、MCP サーバ、利用可能プラグイン、クエリ候補。ユーザー編集可、再起動不要。", }, rolesMd: { title: "ロール説明 (Markdown)", summary: "ロールのペルソナとシステムプロンプト本文。このロール選択時にコンテキストとして読み込まれます。次のメッセージから反映されます。", }, journalDaily: { title: "日次 journal まとめ", summary: "1日分のあなたの活動を、journal パスがチャットセッションから蒸留して自動生成した要約です。", }, journalTopic: { title: "トピック journal", summary: "1つの特定トピックに関する長期的なメモ。話題が継続するたびに蓄積・更新されます。エージェント管理。", }, }, settingsMcpTab: { explanation: "外部 MCP サーバを追加します。HTTP サーバはすべてのモードで動作します。Stdio サーバはサンドボックスイメージの {npx} / {node} / {tsx} を使用します。Docker 有効時はパスはワークスペース内である必要があります。", localhostRewrite: "Docker モードでは {localhost} は {hostDockerInternal} に書き換えられます。", noServers: "MCP サーバは未設定です。", enabled: "有効", urlLabel: "URL:", commandLabel: "コマンド:", dockerStdioUnsupported: "⚠ Docker サンドボックス有効時は起動しません。", dockerStdioHostExecActive: "⚠ ホストで実行されます — このサーバーは Docker サンドボックスの外で動作します。", dockerStdioHostExecOptIn: "それでもホストで実行する(上級者向け)。このサーバーはローカル HTTP ゲートウェイ経由で Docker サンドボックスの外で動作し、マシンにアクセスできます。", learnMore: "詳細", addServerButton: "+ MCP サーバを追加", nameLabel: "名前", namePlaceholder: "my-server", typeHttp: "HTTP", typeStdio: "Stdio (コマンド)", urlFieldLabel: "URL", urlPlaceholder: "https://example.com/mcp", commandFieldLabel: "コマンド", argsLabel: "引数(1行につき1つ)", // Message function form — skips vue-i18n's message compiler so // the literal `@` isn't parsed as a linked-message reference. argsPlaceholder: () => "-y\n@modelcontextprotocol/server-filesystem\n/workspace/path", errNoName: "名前を入力するか、URL / 引数から推論できる値を入力してください。", errBadName: "名前は小文字で始まり、[a-z0-9_-] のみ使用できます。", errIdExists: "サーバ ID「{id}」は既に存在します。", errBadHttpUrl: "HTTP URL は http:// または https:// で始める必要があります", pendingEntryWarning: "保留中の MCP サーバ設定を確定またはキャンセルしてください。", customHeading: "カスタムサーバ", catalog: { heading: "登録済み MCP サーバ", audience: { general: "🟢 一般用途", developer: "🔵 開発者向け" }, risk: { low: "低", medium: "中", high: "高" }, upstream: "📦 ソース", setupGuide: "📚 セットアップ", entry: { memory: { displayName: "メモリ", description: "セッションを跨いで会話の内容を覚えます。", }, sequentialThinking: { displayName: "順序立てた思考", description: "複雑な問題を段階的に考える支援。", }, context7: { displayName: "Context7(ライブラリドキュメント)", description: "主要ライブラリの最新ドキュメントを取得 — モデルの学習データ時点を超える情報源。", }, deepwiki: { displayName: "DeepWiki(GitHub リポジトリ Wiki)", description: "GitHub リポジトリについて質問すると、Wiki スタイルの構造化された回答が返ります。", }, notion: { displayName: "Notion", description: "Notion ワークスペースを読み書き — ページ・データベース・検索に対応。", field: { apiKey: { label: "Notion インテグレーショントークン", help: "Notion インテグレーションを作成し Internal Integration Secret をコピーしてください。🔑 でインテグレーション設定ページを開けます。", }, }, }, slack: { displayName: "Slack", description: "Slack ワークスペースのチャンネル一覧、メッセージ送信、履歴検索。", field: { botToken: { label: "Bot トークン", help: "Slack App → OAuth & Permissions → Bot User OAuth Token。xoxb- で始まります。", }, teamId: { label: "チーム / ワークスペース ID", help: "team.info を呼び出すかワークスペース URL から確認 — T01ABC23DEF のような形式です。", }, }, }, googleMaps: { displayName: "Google Maps", description: "場所の検索、ルート案内、位置情報の詳細取得。", field: { apiKey: { label: "Google Maps API キー", help: "Google Cloud Console → APIs & Services → Credentials → API キー作成。Places + Directions を有効化してください。", }, }, }, appleNative: { displayName: "Apple ネイティブアプリ(macOS)", description: "AppleScript 経由で リマインダー / カレンダー / メモ / メール / マップ を読み書き。macOS 限定 — 認証情報不要。", }, gmail: { displayName: "Gmail", description: "Gmail の読み取り・送信・ラベル付け。自身の Google Cloud プロジェクトで OAuth クライアントを発行して利用(アプリ審査不要)。", field: { credentials: { label: "credentials.json のパス", help: "Google Cloud Console → APIs & Services → Credentials → OAuth クライアント ID(Desktop app)。credentials.json をダウンロードして絶対パスを貼ってください。", }, }, }, googleCalendar: { displayName: "Google カレンダー", description: "Google カレンダーの読み取り・予定作成。Gmail と同じ BYO 方式の credentials.json を使います。", field: { credentials: { label: "credentials.json のパス", help: "Gmail と同じ Google Cloud OAuth クライアントを使い回すか、Calendar 専用に別途作成してください。", }, }, }, googleDrive: { displayName: "Google ドライブ", description: "Google ドライブのファイル検索・読み取り。BYO Google OAuth credentials を使い、リフレッシュトークンはローカルに保存されます。", field: { credentials: { label: "credentials.json のパス", help: "Google Cloud Console → APIs & Services → Credentials → OAuth クライアント ID(Desktop app)。同じプロジェクトで Google Drive API を有効化してください。", }, }, }, github: { displayName: "GitHub", description: "Personal Access Token でリポジトリ / Issue / PR / 検索にアクセス。スコープは絞ってください — 書き込み権限(`repo` 等)を渡すとアクセス可能な全リポジトリに push できてしまいます。", field: { token: { label: "Personal Access Token", help: "GitHub → Settings → Developer settings → Personal access tokens。エージェントに触らせたいリポジトリだけ指定する fine-grained token を推奨。", }, }, }, linear: { displayName: "Linear", description: "Personal API key で Linear の Issue / プロジェクト / サイクルを読み書き。", field: { apiKey: { label: "Linear API キー", help: "Linear → Settings → API → Personal API keys。🔑 から発行ページを開き Create key を押してください。", }, }, }, weatherOpenMeteo: { displayName: "天気予報(Open-Meteo)", description: "世界各地の天気予報と現在の気象情報 — API キー不要で無料利用可能。", }, spotify: { displayName: "Spotify", description: "曲の検索、プレイリスト管理、再生操作。BYO Spotify Developer アプリ — Client ID のみ(PKCE フローのため Client Secret 不要)。", field: { clientId: { label: "Client ID", help: "Spotify Developer Dashboard → Create app、Redirect URI に http://127.0.0.1:8888/callback を設定、Client ID をコピー。その後ターミナルで一度 `SPOTIFY_CLIENT_ID= npx spotify-mcp@latest auth` を実行してログイン(リフレッシュトークンは ~/.spotify-mcp/tokens.json にキャッシュ)。", }, }, }, youtubeTranscript: { displayName: "YouTube 字幕", description: "公開 YouTube 動画の URL から字幕を取得。認証情報不要。", }, }, config: { howToGet: "取得方法", install: "インストール", errMissingRequired: "必須項目が未入力です: {fields}", requiredMarker: "*", requiredAria: "必須", }, }, }, pluginScheduler: { previewIcon: "📅", previewAutomations: "オートメーション {count} 件", previewMore: "+ {count} 件…", }, pluginSchedulerTasks: { recommendedFrequencies: "推奨頻度", tableTaskType: "タスク種別", tableSuggestedSchedule: "推奨スケジュール", noTasks: "スケジュール済みタスクはありません", runNow: "今すぐ実行", enable: "有効化", disable: "無効化", delete: "削除", nextRun: "次回: {time}", originSystem: "システム", originUser: "ユーザー", originSkill: "スキル", runFailed: "実行失敗: {error}", toggleFailed: "切替失敗: {error}", deleteFailed: "削除失敗: {error}", detailsToggle: "詳細を表示", promptLabel: "プロンプト", roleLabel: "ロール", confirmDelete: "タスク「{name}」を削除しますか?この操作は取り消せません。", hintNewsRss: "ニュース / RSS 取得", hintJournal: "日次ジャーナル処理", hintWiki: "Wiki メンテナンス", hintMemory: "メモリー抽出", hintCalendar: "カレンダー / 連絡先の同期", }, pluginCanvas: { undo: "元に戻す", redo: "やり直し", clear: "クリア", styleLabel: "スタイル:", stylePromptWithPath: "`{path}` の画像を {style} スタイルの画像に変換してください。", stylePromptNoPath: "キャンバスに描いた絵を {style} スタイルの画像に変換してください。", saveFailed: "未保存", }, pluginWiki: { backToIndex: "インデックスに戻る", pdf: "PDF", pdfFailed: "⚠ PDF 失敗", tabIndex: "インデックス", tabLog: "ログ", tabLint: "Lint", tabGraph: "グラフ", graphEmpty: "まだグラフ化できるリンクがありません。", linkedReferences: "リンク元", empty: "Wiki は空です。Wiki Manager にソースの取り込みを依頼してください。", previewMore: "+ {count} 件…", chatPlaceholder: "このページについて質問…", emptyPage: "「{title}」のページはまだありません。", emptyContent: "「{title}」のページは存在しますが、内容がありません。", createPage: "この Wiki ページの作成をお願いする", updatePage: "この Wiki ページの更新をお願いする", tagFilterAll: "すべて", noMatches: "#{tag} タグのページがありません", lintChat: "Wiki を Lint", taskCountMismatch: "Wiki ソースと描画結果でタスク数が一致しないため、ファイル破損を避けるためトグル操作を中止しました。", metadataCreated: "作成", metadataUpdated: "更新", metadataEditor: "編集者", pageEditHeader: "Wiki編集", snapshotExpired: "スナップショットが期限切れ — 現在のページを表示中", snapshotLoadError: "スナップショットを読み込めませんでした — ページは存在する可能性があります。再読み込みしてください。", pageDeleted: "ページが削除されました", history: { tabContent: "本文", tabHistory: "履歴", empty: "履歴はまだありません — このページを編集すると最初のバージョンが記録されます。", loading: "履歴を読み込み中…", backToList: "履歴一覧に戻る", restoreButton: "このバージョンに戻す", restoreConfirmTitle: "このバージョンに戻しますか?", restoreConfirmBody: "{editor} が {ts} に保存したバージョンに戻します。現在のページは置き換えられますが、既存の履歴は残ります。", restoreConfirmAction: "戻す", restoreConfirmCancel: "キャンセル", restoreSuccessToast: "ページを復元しました。", restoreFailureBanner: "復元に失敗しました: {error}", compareCurrent: "現在のページと比較", comparePrevious: "1つ前のバージョンと比較", diffNoPrevious: "比較できる過去バージョンがありません。", diffNoChanges: "このバージョンと比較対象の間に内容差分はありません。", editorBadgeUser: "ユーザー", editorBadgeLLM: "LLM", editorBadgeSystem: "システム", hiddenLines: "変更なし {count} 行を非表示", expandHidden: "表示", }, }, pluginPresentForm: { fallbackTitle: "フォーム", fieldCount: "{count} 項目", submitted: "送信済み", errorSummary: "次のエラーを修正してください", requiredMarker: "*", selectOption: "選択してください", charactersCount: "{current} / {max} 文字", charactersCountNoMax: "{current} 文字", submit: "送信", progress: "必須項目 {total} 件中 {filled} 件入力済み", }, pluginPresentSvg: { saveAsPng: "PNG としてダウンロード", png: "PNG", saveAsPdf: "PDF として保存(印刷ダイアログを開きます)", pdf: "PDF", untitled: "SVG 図形", editSource: "SVG ソースを編集", cancel: "キャンセル", applyChanges: "変更を適用", saving: "保存中...", saveError: "⚠ 保存に失敗しました: {error}", exportError: "⚠ エクスポートに失敗しました: {error}", loadingSource: "ソースを読み込み中…", sourceError: "ソースの読み込みに失敗しました: {error}", }, photoLocations: { title: "写真の位置情報", summary: "{total} 件取得済 · {withGps} 件 GPS あり", mapHint: "Claude に「地図に表示して」と依頼すると、Google Map プラグインで一括表示できます。", loading: "読み込み中…", empty: "まだ写真の位置情報がありません。GPS タグ付きの写真をチャットまたは接続済 bridge 経由で送ると蓄積が始まります。", noGps: "GPS データなし", }, pluginManageSkills: { deleteProjectSkill: "このプロジェクト限定スキルを削除", unstarPresetSkill: "このプリセットのスターを外す — カタログに戻る", heading: "スキル", previewCount: "{count} スキル", previewMore: "他 {count} 件", // 関数形式で vue-i18n のメッセージコンパイラをバイパスする。 // 通常形式だと `` が HTML フラグメント扱いされ、毎回 // 「Detected HTML in '…' message」警告が出る。 subheading: ({ named }: { named: (key: string) => unknown }) => `${named("count")} 件利用可能 · クリックで表示 · 「Run」で / として呼び出し`, emptyWithPath: "スキルが見つかりません。{path} にスキルフォルダを追加してください。", emptySkillPath: "~/.claude/skills/", selectHint: "左側のスキルを選択して SKILL.md を表示します。", loading: "読み込み中…", fieldDescription: "説明", fieldBody: "本文 (Markdown)", emptyBody: "(本文なし)", btnEdit: "編集", btnDelete: "削除", btnUnstar: "スターを外す", errListFailed: "スキル一覧の読み込みに失敗: {error}", errDetailFailed: "スキルの読み込みに失敗: {error}", errSaveFailed: "保存失敗: {error}", errDeleteFailed: "削除に失敗しました", confirmDelete: "スキル「{name}」を削除しますか? ~/mulmoclaude/.claude/skills/{name}/SKILL.md が削除されます。", confirmUnstar: "「{name}」をカタログに戻しますか? アクティブから外れてプロンプトに読み込まれなくなりますが、カタログには残るのでいつでも再有効化できます。", sectionActive: "アクティブ", sectionCatalog: "カタログ", sectionLegendActive: "Claude がいま使えるスキル。会話の流れで Claude が自動的に使うほか、スキル名を指定して呼び出すこともできます。{system} システム(同梱 mc-) / {project} プロジェクト(編集可。このワークスペース専用) / {user} ユーザー(~/.claude/skills/ のスキル)。", sectionLegendCatalog: "カタログ: {star} を付けるとアクティブになるスキル。アクティブから {star} を外せばカタログに戻り、Claude は使わなくなります (削除はされません)。", catalogEmpty: "利用できるプリセットスキルがありません。", catalogPresetHeading: "プリセット", catalogStar: "スター", catalogStarred: "スター済み", sourceUserTitle: "ユーザースキル (~/.claude/skills/、全ワークスペース共通)", sourceSystemTitle: "システムスキル (同梱、mc- 接頭辞 — 読み取り専用、launcher 起動時に上書き)", sourceProjectTitle: "プロジェクトスキル (ワークスペース直下の .claude/skills/、このワークスペースのみ)", sourcePresetTitle: "プリセットカタログ — スターでこのワークスペースに有効化", errCatalogListFailed: "カタログの読み込みに失敗しました: {error}", errCatalogStarFailed: "スキルのスター追加に失敗しました: {error}", errCatalogPreviewFailed: "スキルプレビューの読み込みに失敗しました: {error}", catalogAddRepo: "スキルリポジトリを追加", catalogAddRepoTitle: "スキルリポジトリを追加", catalogRepoUrlLabel: "GitHub URL", catalogRepoUrlPlaceholder: "https://github.com/owner/repo", catalogRepoSubpathLabel: "サブパス(任意)", catalogRepoSubpathPlaceholder: "skills", catalogAddRepoSubmit: "インストール", catalogAddRepoSuggestions: "おすすめリポジトリ", catalogUninstallRepo: "リポジトリをアンインストール", catalogUpdateRepo: "リポジトリを更新(最新を再取得)", catalogRepoOpenLink: "GitHub でリポジトリを開く(新しいタブ)", catalogUninstallConfirm: "このリポジトリをアンインストールしますか? すでに★したスキルはアクティブ一覧に残ります。", catalogRepoInstalling: "インストール中…", catalogRepoEmpty: "このリポジトリにスキルが見つかりません。", sourceExternalTitle: "外部スキル(GitHub リポジトリからインストール — ★ で有効化)", errCatalogRepoListFailed: "インストール済みリポジトリの読み込みに失敗しました: {error}", errCatalogRepoInstallFailed: "リポジトリのインストールに失敗しました: {error}", errCatalogRepoUninstallFailed: "リポジトリのアンインストールに失敗しました: {error}", errCatalogRepoInvalidUrl: "GitHub リポジトリの URL を入力してください。", }, pluginManageRoles: { heading: "カスタムロール", roleCount: "{count} 件", addButton: "+ 追加", createPanel: "新しいロールを作成", fieldId: "ID", fieldName: "名前", fieldIcon: "アイコン", fieldPrompt: "プロンプト", fieldPlugins: "プラグイン", fieldStarterQueries: "スターター質問", onePerLine: "(1行につき1つ)", helpLink: "?", idFormatted: "({id})", missingEnv: "({env} 未設定)", requiresEnv: ".env に {env} が必要", collapse: "折りたたむ", expand: "展開", idPlaceholder: "unique-id", creating: "作成中…", create: "作成", updating: "更新中…", update: "更新", cancel: "キャンセル", delete: "削除", emptyHint: "カスタムロールはまだありません。「+ 追加」をクリックするか、Claude に作成を依頼してください。", errIdRequired: "ID を入力してください。", errIdInvalid: "ID は英数字と '-' '_' のみ使用できます。", errNameRequired: "名前を入力してください。", errIdDuplicate: "ID '{id}' のロールは既に存在します。", errCreateFailed: "作成失敗", errSaveFailed: "保存失敗", errDeleteFailed: "削除失敗", errNetworkError: "ネットワークエラー", errServerError: "サーバエラー: {status}", errRefreshFailed: "保存しましたが、一覧の更新に失敗しました。", confirmDelete: "ロール「{name}」を削除しますか?この操作は取り消せません。", }, pluginUiImage: { promptLabel: "{label}:", }, markdownMermaid: { loadFailed: "⚠ Mermaid の読み込みに失敗しました: {error}", renderFailed: "⚠ Mermaid の描画に失敗しました: {error}", }, pluginTextResponse: { pdf: "PDF", pdfFailed: "⚠ PDF 失敗", editContent: "テキストを編集", applyChanges: "変更を適用", copyLabel: "コピー", speakerSystem: "システム", speakerUser: "あなた", speakerAssistant: "アシスタント", copiedLabel: "コピーしました!", cancel: "キャンセル", seededByPlugin: "{pkg} から", seededByPluginTooltip: "このメッセージは {pkg} プラグインによって作成されたもので、あなたが送信したものではありません。", truncatedForRender: "このメッセージは非常に長いため(全 {total} 文字)、描画のフリーズを防ぐため先頭のみ表示しています({omitted} 文字を省略)。全文はコピーボタンから取得できます。", }, pluginSkill: { noDescription: "(説明なし)", }, pluginSpreadsheet: { previewUntitled: "スプレッドシート", previewSheets: "{count} シート", untitled: "スプレッドシート", excel: "Excel", valuePlaceholder: "値", valueOrFormulaPlaceholder: "値または数式(例: 100, SUM(B2:B11))", formatPlaceholder: "書式(例: $#,##0.00)", loading: "スプレッドシート読み込み中...", noData: "スプレッドシートのデータがありません", editData: "スプレッドシートデータを編集", applyChanges: "変更を適用", dataMustBeArray: "データはシートの配列である必要があります", loadFailed: "スプレッドシートの読み込みに失敗: {error}", invalidJsonAlert: "不正な JSON 形式です: {error}", unknownError: "不明なエラー", update: "更新", stringType: "文字列", formulaType: "数式", }, app: { startConversation: "会話を開始してください", thinking: "考え中…", }, suggestionsPanel: { suggestions: "候補", skills: "スキル", tooltip: "候補とスキル", emptySuggestions: "候補はありません。", emptySkills: "スキルがインストールされていません。", skillsError: "スキルの読み込みに失敗しました: {error}", sendEditHint: "クリックで送信 · Shift+クリックで編集", }, settingsToolsTab: { explanation: "{allowedTools} を介して Claude に渡す追加ツール名。1行につき1つ。Gmail / Google Calendar などの Claude Code 組み込み MCP サーバを、{claudeMcp} で認証した後に利用する場合に便利です。", connectorsSectionTitle: "接続済みコネクタ", connectorsEmpty: "コネクタが見つかりません。", connectorConnected: "接続済み", connectorDisconnected: "未接続", connectorsGuide: "Slack や Gmail 等のコネクタで Claude がアカウントにアクセスできるようになります。追加・削除は Claude Desktop から、または、{configLink}からも設定できます。(Web 版 claude.ai に移動します)", connectorsConfigLinkText: "こちら", }, confirmModal: { defaultTitle: "確認", defaultConfirm: "実行", defaultCancel: "キャンセル", }, }; export default jaMessages;