From 14da297cd61b2e5a5e13870bcd9f4e4c2d6e56af Mon Sep 17 00:00:00 2001
From: snuffxxx <155132231+snuffxxx@users.noreply.github.com>
Date: Sat, 2 May 2026 11:21:20 +0900
Subject: [PATCH] feat: add Japanese (ja) locale to i18n.js
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Adds a ja locale entry (828 keys) under static/i18n.js LOCALES,
inserted between en and ru. All existing keys translated to natural
concise Japanese suitable for UI labels, with placeholders ({0}, etc.)
and template literals preserved verbatim.
- _lang: 'ja', _label: '日本語', _speech: 'ja-JP'
- 828 keys (matches en, including the documented duplicate keys
whose JS last-wins semantics are preserved)
- syntax verified with `node -c static/i18n.js`
Tested live on a self-hosted instance; Settings → Language → 日本語
selects the new locale and switches the UI text.
---
static/i18n.js | 870 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 870 insertions(+)
diff --git a/static/i18n.js b/static/i18n.js
index 2c9a76e2..8e607a84 100644
--- a/static/i18n.js
+++ b/static/i18n.js
@@ -874,6 +874,876 @@ const LOCALES = {
checkpoint_diff_files_changed: (n) => `${n} file${n === 1 ? '' : 's'} changed`,
},
+ ja: {
+ _lang: 'ja',
+ _label: '日本語',
+ _speech: 'ja-JP',
+ // boot.js
+ cancelling: 'キャンセル中…',
+ cancel_failed: 'キャンセル失敗: ',
+ mic_denied: 'マイクへのアクセスが拒否されました。ブラウザの権限を確認してください。',
+ mic_no_speech: '音声が検出されませんでした。もう一度お試しください。',
+ mic_network: '音声認識を利用できません。',
+ mic_error: '音声入力エラー: ',
+ // Turn-based voice mode (#1333)
+ voice_toggle: '音声入力',
+ voice_listening: '聞き取り中…',
+ voice_speaking: '発話中…',
+ voice_thinking: '考え中…',
+ voice_error: 'このブラウザでは音声入力に対応していません',
+ voice_mode_active: '音声モード ON',
+ voice_mode_off: '音声モード OFF',
+ session_imported: 'セッションをインポートしました',
+ import_failed: 'インポート失敗: ',
+ import_invalid_json: '無効な JSON',
+ image_pasted: '画像を貼り付けました: ',
+ // messages.js
+ edit_message: 'メッセージを編集',
+ regenerate: '応答を再生成',
+ copy: 'コピー',
+ copied: 'コピーしました!',
+ copy_failed: 'コピー失敗',
+
+ diff_loading: '差分を読み込み中',
+ diff_error: 'パッチファイルを読み込めませんでした',
+ diff_too_large: 'パッチファイルが大きすぎてインライン表示できません',
+ tree_view: 'ツリー',
+ raw_view: '生データ',
+ parse_failed_note: '解析失敗',
+ you: 'あなた',
+ mcp_servers_title: 'MCPサーバー',
+ mcp_servers_desc: 'config.yaml で設定された MCP サーバーを管理します。',
+ mcp_no_servers: 'MCPサーバーは設定されていません。',
+ mcp_add_server: '+ サーバーを追加',
+ mcp_field_name: 'サーバー名',
+ mcp_transport_label: 'トランスポート種別',
+ mcp_field_command: 'コマンド',
+ mcp_field_args: '引数 (カンマ区切り)',
+ mcp_field_url: 'URL',
+ mcp_field_timeout: 'タイムアウト (秒)',
+ mcp_save: '保存',
+ mcp_cancel: 'キャンセル',
+ mcp_name_required: 'サーバー名は必須です。',
+ mcp_url_required: 'HTTP トランスポートには URL が必要です。',
+ mcp_command_required: 'stdio トランスポートにはコマンドが必要です。',
+ mcp_saved: 'MCPサーバーを保存しました。',
+ mcp_save_failed: 'MCPサーバーの保存に失敗しました。',
+ mcp_delete_confirm_title: 'MCPサーバーを削除',
+ mcp_delete_confirm_message: 'MCPサーバー "{0}" を削除しますか? この操作は取り消せません。',
+ mcp_deleted: 'MCPサーバーを削除しました。',
+ mcp_delete_failed: 'MCPサーバーの削除に失敗しました。',
+ mcp_load_failed: 'MCPサーバーの読み込みに失敗しました。',
+ // PDF preview (#480)
+ pdf_loading: 'PDF {0} を読み込み中…',
+ pdf_too_large: 'PDF が大きすぎてインラインプレビューできません',
+ pdf_no_pages: 'PDF にページがありません',
+ pdf_error: 'PDF プレビューの描画に失敗しました',
+ pdf_download: 'PDF をダウンロード',
+ // HTML sandbox preview (#482)
+ html_loading: 'HTML プレビューを読み込み中…',
+ html_too_large: 'HTML が大きすぎてインラインプレビューできません',
+ html_error: 'HTML プレビューの描画に失敗しました',
+ html_open_full: 'フルページを開く',
+ html_sandbox_label: 'HTML プレビュー (サンドボックス)',
+ thinking: '考え中',
+ expand_all: 'すべて展開',
+ collapse_all: 'すべて折りたたむ',
+ edit_failed: '編集失敗: ',
+ regen_failed: '再生成失敗: ',
+ reconnect_active: '応答を生成中です。準備ができたら再読み込みしますか?',
+ reconnect_finished: '前回離脱時に応答が進行中でした。メッセージが更新されている可能性があります。',
+ // approval card
+ approval_heading: '承認が必要',
+ approval_desc_prefix: '危険なコマンドを検出しました',
+ approval_btn_once: '今回だけ許可',
+ approval_btn_once_title: 'このコマンド1回だけ許可 (Enter)',
+ approval_btn_session: 'セッション中許可',
+ approval_btn_session_title: 'この会話セッション中は許可',
+ approval_btn_always: '常に許可',
+ approval_btn_always_title: 'このコマンドパターンを常に許可',
+ approval_btn_deny: '拒否',
+ approval_btn_deny_title: '拒否 — このコマンドを実行しない',
+ approval_responding: '応答中…',
+ clarify_heading: '確認が必要',
+ clarify_hint: '選択肢を選ぶか、下に独自の回答を入力してください。',
+ clarify_other: 'その他',
+ clarify_send: '送信',
+ clarify_input_placeholder: '回答を入力…',
+ clarify_responding: '応答中…',
+ untitled: '無題',
+ n_messages: (n) => `${n} 件のメッセージ`,
+ load_older_messages: '↑ 上にスクロール、またはクリックして過去のメッセージを読み込む',
+ queued_label: '応答後に送信',
+ queued_count: (n) => `${n} 件キュー中`,
+ queued_cancel: 'キューに入れたメッセージをキャンセル',
+ model_unavailable: ' (利用不可)',
+ model_unavailable_title: 'このモデルは現在のプロバイダ一覧に含まれていません',
+ provider_mismatch_warning: (m,p)=>`"${m}" は設定されたプロバイダ (${p}) で動作しない可能性があります。このまま送信するか、ターミナルで \`hermes model\` を実行して切り替えてください。`,
+ provider_mismatch_label: 'プロバイダ不一致',
+ model_not_found_label: 'モデルが見つかりません',
+ model_custom_label: 'カスタムモデルID',
+ model_custom_placeholder: '例: openai/gpt-5.4',
+ model_search_placeholder: 'モデルを検索…',
+ model_search_no_results: 'モデルが見つかりません',
+ model_group_configured: '設定済み',
+ model_scope_advisory: '次回のメッセージからこの会話に適用されます。',
+ model_scope_toast: '次回のメッセージからこの会話に適用されます。',
+ // commands.js
+ cmd_clear: '会話メッセージをクリア',
+ cmd_compress: '会話コンテキストを手動で圧縮 (使い方: /compress [トピック])',
+ ctx_compress_hint: 'コンテキストを圧縮して空きを確保 →',
+ ctx_compress_action: '⚠ 今すぐ圧縮してコンテキストを確保',
+ cmd_compact_alias: '/compress の旧エイリアス',
+ cmd_model: 'モデルを切り替え (例: /model gpt-4o)',
+ cmd_workspace: '名前でワークスペースを切り替え',
+ cmd_terminal: 'ワークスペースのターミナルを開く',
+ cmd_new: '新しいチャットセッションを開始',
+ cmd_usage: 'トークン使用量表示の ON/OFF を切り替え',
+ cmd_theme: '外観を切り替え (theme: system/dark/light, skin: default/ares/mono/slate/poseidon/sisyphus/charizard)',
+ cmd_personality: 'エージェントのパーソナリティを切り替え',
+ cmd_skills: '利用可能な Hermes スキルを一覧表示',
+ available_commands: '利用可能なコマンド:',
+ type_slash: '/ を入力するとコマンド一覧',
+ conversation_cleared: '会話をクリアしました',
+ command_label: 'コマンド',
+ context_compaction_label: 'コンテキスト圧縮',
+ preserved_task_list_label: '保持されたタスクリスト',
+ reference_only_label: '参照専用',
+ model_usage: '使い方: /model <名前>',
+ no_model_match: '一致するモデルなし: "',
+ switched_to: '切り替えました: ',
+ workspace_usage: '使い方: /workspace <名前>',
+ no_workspace_match: '一致するワークスペースなし: "',
+ switched_workspace: 'ワークスペースを切り替えました: ',
+ workspace_switch_failed: 'ワークスペース切替失敗: ',
+ new_session: '新しいセッションを作成しました',
+ compressing: 'コンテキスト圧縮を要求中...',
+ compress_running_label: '圧縮中',
+ compress_complete_label: '圧縮完了',
+ auto_compress_label: '自動圧縮',
+ compress_failed_label: '圧縮失敗',
+ focus_label: 'フォーカス',
+ token_usage_on: 'トークン使用量: ON',
+ token_usage_off: 'トークン使用量: OFF',
+ theme_usage: '使い方: /theme ',
+ theme_set: 'テーマ: ',
+ no_active_session: 'アクティブなセッションがありません',
+ cmd_queue: '次のターン用にメッセージをキュー',
+ cmd_interrupt: '現在のターンをキャンセルして新規メッセージを送信',
+ cmd_steer: 'エージェントを中断せずにターン中に修正を注入',
+ cmd_queue_no_msg: '使い方: /queue <メッセージ>',
+ cmd_queue_not_busy: 'アクティブなタスクなし — 通常通り送信してください',
+ cmd_queue_confirm: 'メッセージをキューに入れました',
+ cmd_interrupt_no_msg: '使い方: /interrupt <メッセージ>',
+ cmd_interrupt_confirm: '中断 — 新しいメッセージを送信中',
+ cmd_steer_no_msg: '使い方: /steer <メッセージ>',
+ cmd_steer_fallback: 'ステア利用不可 — 代わりに次のターンへキュー',
+ cmd_steer_delivered: 'ステア送信完了 — 次のツール結果でエージェントが認識します',
+ steer_leftover_queued: 'ステアを次のターンへキュー',
+ busy_steer_fallback: 'ステア利用不可 — 次のターンへキュー',
+ busy_interrupt_confirm: '中断 — 新しいメッセージを送信中',
+ settings_label_busy_input_mode: 'ビジー時の入力モード',
+ settings_desc_busy_input_mode: 'エージェント実行中にメッセージを送信した時の動作を制御します。Queue は待機、Interrupt はキャンセルして再開、Steer は中断せずにターン中に修正を注入します (エージェントやストリームが利用不可ならキューにフォールバック)。',
+ settings_busy_input_mode_queue: 'フォローアップをキュー',
+ settings_busy_input_mode_interrupt: '現在のターンを中断',
+ settings_busy_input_mode_steer: 'ステア (ターン中の修正)',
+
+ slash_skill_badge:'スキル',
+ slash_skill_desc:'このスキルを呼び出す',
+ cmd_stop:'現在の応答を停止',
+ cmd_title:'セッションタイトルを取得・設定',
+ cmd_retry:'最後のメッセージを再送信',
+ cmd_undo:'最後のやり取りを削除',
+ cmd_btw:'サイド質問 (一時的)',
+ cmd_btw_usage:'/btw <質問> — セッション文脈でサイド質問',
+ cmd_background:'プロンプトをバックグラウンド実行',
+ cmd_background_usage:'/background <プロンプト> — ブロックせずに並列実行',
+ cmd_branch:'この会話を新しいセッションへ分岐',
+ cmd_branch_usage:'/branch [名前] — 会話を分岐 (任意で名前指定)',
+ branch_forked:'新しいセッションへ分岐しました',
+ branch_failed:'分岐失敗: ',
+ fork_from_here:'ここから分岐',
+ forked_from:'分岐元',
+ subagent_children:'サブエージェントセッション',
+ btw_asking:'サイド質問を問い合わせ中...',
+ btw_label:'サイド質問 — 履歴に残らない',
+ btw_done:'サイド質問に回答しました',
+ btw_no_answer:'回答が得られませんでした。',
+ btw_failed:'サイド質問失敗: ',
+ bg_running:'バックグラウンド実行中...',
+ bg_complete:'バックグラウンドタスク完了',
+ bg_label:'バックグラウンド結果:',
+ bg_no_answer:'(回答なし)',
+ bg_failed:'バックグラウンドタスク失敗: ',
+ undo_exchange:'最後のやり取りを取り消す',
+ cmd_status:'セッション情報を表示',
+ cmd_voice:'マイク入力を切り替え',
+ stream_stopped:'応答を停止しました。',
+ no_active_task:'停止できるアクティブタスクがありません。',
+ cancel_unavailable:'キャンセルできません。',
+ retry_failed:'再試行失敗: ',
+ undo_failed:'取り消し失敗: ',
+ undid_n_messages:'削除',
+ undid_messages_suffix:'件のメッセージ。',
+ status_heading:'セッションステータス',
+ status_session_id:'セッションID',
+ status_title:'タイトル',
+ status_model:'モデル',
+ status_workspace:'ワークスペース',
+ status_personality:'パーソナリティ',
+ status_messages:'メッセージ',
+ status_agent_running:'エージェント実行中',
+ status_profile: 'プロファイル',
+ status_hermes_home: 'Hermes ホーム',
+ status_started: '開始',
+ status_tokens: 'トークン',
+ status_no_tokens: 'トークン未使用',
+ status_unknown: '不明',
+ status_yes:'はい',
+ status_no:'いいえ',
+ status_load_failed:'ステータス読み込み失敗: ',
+ title_current:'現在のタイトル',
+ title_change_hint:'`/title <新しい名前>` で改名できます。',
+ title_set:'タイトルを設定: ',
+ cmd_webui_only_session:'CLI からインポートしたセッションでは使えません。',
+ cmd_voice_use_mic:'コンポーザーのマイクボタンをクリックしてください。',
+ usage_heading:'トークン使用量',
+ usage_default_model:'デフォルト',
+ usage_unknown:'不明',
+ usage_input_tokens:'入力トークン',
+ usage_output_tokens:'出力トークン',
+ usage_total:'合計トークン',
+ usage_estimated_cost:'推定コスト',
+ usage_settings_tip:'注: コスト推定はおおよその値です。',
+ usage_load_failed:'使用量読み込み失敗: ',
+ usage_personality_none:'なし',
+ // Session toolsets (#493)
+ session_toolsets:'セッションツールセット',
+ session_toolsets_desc:'このセッションで利用可能なツールを制限 (空欄=グローバル設定を使用)',
+ session_toolsets_global:'グローバル (デフォルト)',
+ session_toolsets_custom:'カスタム',
+ session_toolsets_placeholder:'tool1, tool2, …',
+ session_toolsets_apply:'適用',
+ session_toolsets_clear:'クリア (グローバルを使用)',
+ session_toolsets_applied:'ツールセットを更新しました',
+ session_toolsets_cleared:'ツールセットをクリアしました — グローバル設定を使用',
+ session_toolsets_failed:'ツールセット更新失敗: ',
+ untitled:'無題',
+ no_personalities: 'パーソナリティが見つかりません (~/.hermes/personalities/ に追加してください)',
+ available_personalities: '利用可能なパーソナリティ:',
+ personality_switch_hint: '\n\n`/personality <名前>` で切り替え、`/personality none` でクリアします。',
+ personalities_load_failed: 'パーソナリティの読み込みに失敗しました',
+ personality_cleared: 'パーソナリティをクリアしました',
+ personality_set: 'パーソナリティ: ',
+ failed_colon: '失敗: ',
+ // ui.js
+ no_workspace: 'ワークスペースなし',
+ terminal_open_title: 'ワークスペースのターミナルを開く',
+ terminal_no_workspace_title: 'ターミナルを開くにはワークスペースを選択してください',
+ terminal_title: 'ターミナル',
+ terminal_clear: 'クリア',
+ terminal_copy_output: '出力をコピー',
+ terminal_restart: '再起動',
+ terminal_collapse: '折りたたむ',
+ terminal_expand: '展開',
+ terminal_close: '閉じる',
+ terminal_input_placeholder: 'コマンドを実行...',
+ terminal_start_failed: 'ターミナル起動失敗: ',
+ terminal_input_failed: 'ターミナル入力失敗: ',
+ terminal_copy_failed: 'コピー失敗: ',
+ terminal_error: 'ターミナルエラー',
+ workspace_empty_no_path: 'ワークスペースが選択されていません。設定 → ワークスペースで選択してください。',
+ workspace_empty_dir: 'このワークスペースは空です。',
+ dialog_confirm_title: '操作の確認',
+ dialog_prompt_title: '値を入力',
+ dialog_confirm_btn: '確認',
+ // workspace.js
+ unsaved_confirm: 'プレビューに未保存の変更があります。破棄して移動しますか?',
+ discard: '破棄',
+ save: '保存',
+ edit: '編集',
+ clear: 'クリア',
+ create: '作成',
+ remove: '削除',
+ save_title: '変更を保存',
+ edit_title: 'このファイルを編集',
+ saved: '保存しました',
+ save_failed: '保存失敗: ',
+ image_load_failed: '画像を読み込めませんでした',
+ file_open_failed: 'ファイルを開けませんでした',
+ downloading: (name) => `${name} をダウンロード中…`,
+ double_click_rename: 'ダブルクリックで名前変更',
+ renamed_to: '名前を変更: ',
+ rename_failed: '名前変更失敗: ',
+ delete_title: '削除',
+ delete_confirm: (name) => `${name} を削除しますか?`,
+ delete_dir_confirm: (name) => `フォルダ "${name}" とその内容をすべて削除しますか?`,
+ rename_title: '名前変更',
+ rename_prompt: '新しい名前:',
+ deleted: '削除しました: ',
+ delete_failed: '削除失敗: ',
+ new_file_prompt: '新しいファイル名 (例: notes.md):',
+ project_name_prompt: 'プロジェクト名:',
+ created: '作成しました: ',
+ create_failed: '作成失敗: ',
+ new_folder_prompt: '新しいフォルダ名:',
+ folder_created: 'フォルダを作成しました: ',
+ folder_create_failed: 'フォルダ作成失敗: ',
+ workspace_auto_create_folder: 'フォルダが存在しなければ作成',
+ folder_add_as_space_btn: 'スペースとして追加',
+ folder_add_as_space_msg: 'このフォルダをワークスペース一覧に新しいスペースとして追加しますか?',
+ folder_add_as_space_title: 'スペースとして追加?',
+ remove_title: '削除',
+ empty_dir: '(空)',
+ upload_failed: 'アップロード失敗: ',
+ all_uploads_failed: (n) => `${n} 件のアップロードがすべて失敗しました`,
+ archive_extracted: (n, c) => `${c} 個のアーカイブから ${n} 件のファイルを展開しました`,
+ session_pin: '会話をピン留め',
+ session_unpin: 'ピン留めを解除',
+ session_pin_desc: 'この会話を上部に固定',
+ session_unpin_desc: 'ピン留めから外す',
+ session_pin_failed: 'ピン留め失敗: ',
+ session_move_project: 'プロジェクトへ移動',
+ session_move_project_desc_has: 'この会話のプロジェクトを変更',
+ session_move_project_desc_none: 'この会話にプロジェクトを割り当て',
+ session_archive: '会話をアーカイブ',
+ session_restore: '会話を復元',
+ session_archive_desc: 'アーカイブを表示するまでこの会話を非表示にする',
+ session_restore_desc: 'この会話をメイン一覧に戻す',
+ session_archived: 'セッションをアーカイブしました',
+ session_restored: 'セッションを復元しました',
+ session_archive_failed: 'アーカイブ失敗: ',
+ session_duplicate: '会話を複製',
+ session_duplicate_desc: '同じワークスペースとモデルでコピーを作成',
+ session_duplicated: 'セッションを複製しました',
+ session_duplicate_failed: '複製失敗: ',
+ session_delete: '会話を削除',
+ session_delete_desc: 'この会話を完全に削除',
+ session_select_mode: '選択',
+ session_select_mode_desc: '会話を選択して一括管理',
+ session_select_all: 'すべて選択',
+ session_deselect_all: '選択解除',
+ session_selected_count: '{0} 件選択',
+ session_batch_archive: 'アーカイブ',
+ session_batch_delete: '削除',
+ session_batch_move: 'プロジェクトへ移動',
+ session_batch_delete_confirm: '{0} 件の会話を削除しますか?',
+ session_batch_archive_confirm: '{0} 件の会話をアーカイブしますか?',
+ session_no_selection: '会話が選択されていません',
+ // settings panel
+ settings_heading_title: 'コントロールセンター',
+ settings_heading_subtitle: '環境設定、会話ツール、システム制御。',
+ settings_section_conversation_title: '会話',
+ settings_section_appearance_title: '外観',
+ settings_section_appearance_meta: 'テーマ、アクセントカラー、ビジュアルスタイル。',
+ settings_section_preferences_title: '環境設定',
+ settings_section_preferences_meta: 'Hermes Web UI のデフォルトと UI 動作。',
+ settings_section_system_title: 'システム',
+ settings_section_system_meta: 'インスタンスのバージョンとアクセス制御。',
+ settings_check_now: '今すぐ確認',
+ settings_checking: '確認中…',
+ settings_up_to_date: '最新です ✓',
+ settings_updates_available: '{count} 件のアップデートあり',
+ settings_update_check_failed: 'アップデート確認失敗',
+ settings_updates_disabled: 'アップデート確認は無効です',
+ settings_label_workspace_panel_open: 'ワークスペースパネルをデフォルトで開いておく',
+ settings_desc_workspace_panel_open: '有効にすると、新しいセッションごとにワークスペース/ファイルブラウザパネルが自動で開きます。手動でいつでも閉じられます。',
+ open_in_browser: 'ブラウザで開く',
+ settings_dropdown_conversation: '会話',
+ settings_dropdown_appearance: '外観',
+ settings_dropdown_preferences: '環境設定',
+ settings_dropdown_providers: 'プロバイダ',
+ settings_dropdown_system: 'システム',
+ settings_tab_conversation: '会話',
+ settings_tab_appearance: '外観',
+ settings_tab_preferences: '環境設定',
+ settings_tab_system: 'システム',
+ settings_title: '設定',
+ settings_save_btn: '設定を保存',
+ settings_label_model: 'デフォルトモデル',
+ settings_desc_model: '新しい会話で使用されます。既存の会話は選択済みモデルを保持します。',
+ settings_label_send_key: '送信キー',
+ settings_label_theme: 'テーマ',
+ settings_label_skin: 'スキン',
+ settings_label_font_size: 'フォントサイズ',
+ font_size_small: '小',
+ font_size_default: 'デフォルト',
+ font_size_large: '大',
+ settings_autosave_saving: '保存中…',
+ settings_autosave_saved: '保存しました',
+ settings_autosave_failed: '保存失敗',
+ settings_autosave_retry: '再試行',
+ settings_label_language: '言語',
+ settings_label_token_usage: 'トークン使用量を表示',
+ settings_label_sidebar_density: 'サイドバー密度',
+ cmd_reasoning: '思考表示の切り替え (表示/非表示)、努力レベル設定、現在状態の確認',
+ settings_label_external_sessions: '非WebUIセッションを表示',
+ settings_label_sync_insights: 'インサイトに同期',
+ settings_label_check_updates: 'アップデートを確認',
+ settings_label_bot_name: 'アシスタント名',
+ settings_label_password: 'アクセスパスワード',
+ settings_saved: '設定を保存しました',
+ settings_save_failed: '保存失敗: ',
+ settings_load_failed: '設定の読み込みに失敗: ',
+ settings_saved_pw: '設定を保存 — パスワード保護を有効化、このブラウザはサインイン状態を維持します',
+ settings_saved_pw_updated: '設定を保存 — パスワードを更新しました',
+ // login page (used server-side via /api/i18n/login endpoint)
+ login_title: 'サインイン',
+ login_subtitle: 'パスワードを入力して続行',
+ login_placeholder: 'パスワード',
+ login_btn: 'サインイン',
+ login_invalid_pw: 'パスワードが無効です',
+ login_conn_failed: '接続失敗',
+ dialog_confirm_title: '操作の確認',
+ dialog_prompt_title: '値を入力',
+ dialog_confirm_btn: '確認',
+ discard: '破棄',
+ clear: 'クリア',
+ create: '作成',
+ remove: '削除',
+ project_name_prompt: 'プロジェクト名:',
+ // Sidebar & Tabs
+ tab_chat: 'チャット',
+ tab_tasks: 'タスク',
+ tab_skills: 'スキル',
+ tab_memory: 'メモリ',
+ tab_workspaces: 'スペース',
+ tab_profiles: 'プロファイル',
+ tab_todos: 'ToDo',
+ tab_insights: 'インサイト',
+ tab_settings: '設定',
+ new_conversation: '新しい会話',
+ filter_conversations: '会話を絞り込み...',
+ session_time_unknown: '不明',
+ session_time_minutes_ago: (n) => `${n}分前`,
+ session_time_hours_ago: (n) => `${n}時間前`,
+ session_time_days_ago: (n) => `${n}日前`,
+ session_time_last_week: '1週間前',
+ session_time_bucket_today: '今日',
+ session_time_bucket_yesterday: '昨日',
+ session_time_bucket_this_week: '今週',
+ session_time_bucket_last_week: '先週',
+ session_time_bucket_older: 'それ以前',
+ scheduled_jobs: 'スケジュールジョブ',
+ new_job: '新規ジョブ',
+ loading: '読み込み中...',
+ search_skills: 'スキルを検索...',
+ new_skill: '新規スキル',
+ personal_memory: '個人メモリ',
+ current_task_list: '現在のタスクリスト',
+ // Insights
+ insights_title: '使用状況分析',
+ insights_sessions: 'セッション',
+ insights_messages: 'メッセージ',
+ insights_tokens: 'トークン',
+ insights_cost: '推定コスト',
+ insights_no_cost: 'N/A',
+ insights_models: 'モデル',
+ insights_activity_by_day: '日別アクティビティ',
+ insights_activity_by_hour: '時間別アクティビティ',
+ insights_peak_hour: 'ピーク: {hour}',
+ insights_token_breakdown: 'トークン内訳',
+ insights_input_tokens: '入力',
+ insights_output_tokens: '出力',
+ insights_total: '合計',
+ insights_footer: '直近 {days} 日間のデータを表示',
+ workspace_desc: 'セッション用のワークスペースを追加・切り替えします。',
+ session_meta_messages: (n) => `${n} 件`,
+ new_profile: '新規プロファイル',
+ transcript: 'トランスクリプト',
+ download_transcript: 'Markdown としてダウンロード',
+ import: 'インポート',
+ // Settings detail
+ settings_label_sound: '通知音',
+ settings_desc_sound: 'アシスタントが応答を完了したときに音を鳴らします。',
+ // TTS (#499)
+ tts_listen: '読み上げ',
+ tts_not_supported: 'このブラウザは音声合成に対応していません。',
+ settings_label_tts: '応答の読み上げ (TTS)',
+ settings_desc_tts: 'アシスタントの各メッセージにスピーカーボタンを表示し、ブラウザの音声合成で読み上げます。',
+ settings_label_tts_auto_read: '応答を自動で読み上げ',
+ settings_desc_tts_auto_read: '新しいアシスタント応答が完了するたびに自動で読み上げます。入力中は一時停止します。',
+ settings_label_tts_voice: '声',
+ settings_desc_tts_voice: '優先する声。ブラウザで利用可能な声から選択されます。',
+ settings_label_tts_rate: '読み上げ速度',
+ settings_label_tts_pitch: '読み上げピッチ',
+ settings_label_notifications: 'ブラウザ通知',
+ settings_desc_notifications: 'アプリがバックグラウンドの間に応答が完了したらシステム通知を表示します。',
+ settings_desc_token_usage: 'アシスタント応答の下に入力/出力トークン数を表示します。/usage でも切替可能。',
+ settings_label_api_redact: 'API 応答内の機密データをマスク',
+ settings_desc_api_redact: 'セルフホスト利用者は透明性のため無効化できます (共有インスタンスでは非推奨)。',
+ settings_sidebar_density_compact: 'コンパクト',
+ settings_sidebar_density_detailed: '詳細',
+ settings_desc_sidebar_density: '左サイドバーのセッション一覧に表示するメタデータ量を制御します。',
+ settings_label_auto_title_refresh: 'タイトル自動更新',
+ settings_auto_title_refresh_off: 'オフ',
+ settings_auto_title_refresh_5: '5 回ごと',
+ settings_auto_title_refresh_10: '10 回ごと',
+ settings_auto_title_refresh_20: '20 回ごと',
+ settings_desc_auto_title_refresh: '最新のやり取りに基づいてセッションタイトルを自動再生成し、会話の進行に合わせて適切に保ちます。LLM タイトル生成モデルの設定が必要です。',
+ settings_desc_external_sessions: 'CLI、Telegram、Discord、Slack その他のチャネルからの会話をセッション一覧に表示します。クリックでインポートして続行できます。',
+ settings_desc_sync_insights: 'WebUI のトークン使用量を state.db にミラーし、hermes /insights にブラウザセッションのデータを含めます。デフォルトはオフ。',
+ settings_desc_check_updates: 'WebUI または Agent の新しいバージョンが利用可能な時にバナーを表示します。バックグラウンドで定期的に git fetch を実行します。',
+ settings_desc_bot_name: 'UI 全体で表示されるアシスタントの名前。デフォルトは Hermes。',
+ settings_desc_password: '新しいパスワードを入力すると設定または変更します。空欄なら現在の設定を維持。',
+ password_placeholder: '新しいパスワードを入力…',
+ disable_auth: '認証を無効化',
+ sign_out: 'サインアウト',
+ // Providers panel
+ providers_tab_title: 'プロバイダ',
+ providers_section_title: 'プロバイダ',
+ providers_section_meta: 'AI プロバイダの APIキー を管理します。変更は即時反映されます。',
+ providers_status_configured: 'APIキー設定済み',
+ providers_status_not_configured: 'APIキーなし',
+ providers_status_oauth: 'OAuth',
+ providers_status_api_key: 'APIキー',
+ providers_status_not_configured_label: '未設定',
+ providers_oauth_hint: 'OAuth 認証済み。APIキーは不要です。',
+ providers_oauth_config_yaml_hint: 'config.yaml でトークンが設定されています。更新するには config.yaml の providers セクションを編集するか hermes auth を実行してください。',
+ providers_oauth_not_configured_hint: '未認証です。ターミナルで hermes auth を実行してこのプロバイダを設定してください。',
+ providers_save: '保存',
+ providers_remove: '削除',
+ providers_saving: '保存中…',
+ providers_removing: '削除中…',
+ providers_enter_key: 'APIキーを入力してください',
+ providers_empty: '設定可能なプロバイダが見つかりません。',
+ providers_key_updated: 'APIキーを保存しました',
+ providers_key_removed: 'APIキーを削除しました',
+ providers_key_placeholder_new: 'sk-...',
+ providers_key_placeholder_replace: '置き換える新しいキーを入力…',
+ cancel: 'キャンセル',
+ create_job: 'ジョブを作成',
+ save_skill: 'スキルを保存',
+ editing: '編集中',
+ // Empty state
+ empty_title: '何をお手伝いしましょう?',
+ empty_subtitle: '何でも質問する、コマンド実行、ファイル探索、スケジュールタスク管理ができます。',
+ suggest_files: 'このワークスペースにあるファイルは?',
+ suggest_schedule: '今日のスケジュールは?',
+ suggest_plan: '小さなプロジェクトの計画を手伝って。',
+ // onboarding
+ onboarding_badge: '初回起動',
+ onboarding_title: 'Hermes Web UI へようこそ',
+ onboarding_lead: 'クイックガイドで Hermes を確認し、プロバイダ設定を保存し、ワークスペースとモデルを選択し、必要ならパスワードでアプリを保護します。',
+ onboarding_back: '戻る',
+ onboarding_continue: '続ける',
+ onboarding_skip: 'セットアップをスキップ',
+ onboarding_skipped: 'セットアップをスキップ — 既存設定を使用します。',
+ onboarding_open: 'Hermes を開く',
+ onboarding_step_system_title: 'システム確認',
+ onboarding_step_system_desc: 'Hermes Agent と設定の可視性を確認します。',
+ onboarding_step_setup_title: 'プロバイダ設定',
+ onboarding_step_setup_desc: '最低限の Hermes プロバイダ設定を保存します。',
+ onboarding_step_workspace_title: 'ワークスペース + モデル',
+ onboarding_step_workspace_desc: '新規セッションとチャットのデフォルトを選択します。',
+ onboarding_step_password_title: 'パスワード (任意)',
+ onboarding_step_password_desc: '共有前に Web UI を保護します。',
+ onboarding_step_finish_title: '完了',
+ onboarding_step_finish_desc: '確認してアプリに入ります。',
+ onboarding_notice_system_ready: 'Web UI から Hermes Agent へ到達できそうです。',
+ onboarding_notice_system_unavailable: 'Hermes Agent はまだ完全には利用できません。Bootstrap でインストールできますが、プロバイダ設定にはターミナルが必要な場合があります。',
+ onboarding_check_agent: 'Hermes Agent',
+ onboarding_check_agent_ready: '検出済み・インポート可能',
+ onboarding_check_agent_missing: '不在または部分的にしかインポートできません',
+ onboarding_check_password: 'パスワード',
+ onboarding_check_password_enabled: '既に有効',
+ onboarding_check_password_disabled: '未有効',
+ onboarding_check_provider: 'プロバイダ設定',
+ onboarding_check_provider_ready: 'チャット可能',
+ onboarding_check_provider_partial: '保存済みだが不完全',
+ onboarding_check_provider_pending: '検証が必要',
+ onboarding_config_file: '設定ファイル:',
+ onboarding_env_file: '.env ファイル:',
+ onboarding_unknown: '不明',
+ onboarding_current_provider: '現在の設定:',
+ onboarding_missing_imports: '不足しているインポート:',
+ onboarding_notice_setup_required: 'シンプルなプロバイダ経路をここで選んでください。高度な OAuth フローは現状 Hermes CLI 側で扱います。',
+ onboarding_notice_setup_already_ready: '動作する Hermes プロバイダ設定が既に検出されています。維持するか、ここで置き換えできます。',
+ onboarding_oauth_provider_ready_title: 'プロバイダは認証済み',
+ onboarding_oauth_provider_ready_body: 'このインスタンスは Hermes CLI で設定された OAuth プロバイダ ({provider}) を使用します。APIキーは不要 — 続けるをクリックしてセットアップを完了してください。',
+ onboarding_oauth_provider_not_ready_title: 'OAuth プロバイダは未認証',
+ onboarding_oauth_provider_not_ready_body: 'このインスタンスは {provider} を使用しますが、これは APIキー ではなく OAuth を使用します。ターミナルで hermes auth または hermes model を実行して認証し、Web UI を再読み込みしてください。',
+ onboarding_oauth_switch_hint: 'または下から別のプロバイダを選び、APIキー設定に切り替え:',
+ oauth_login_codex: 'Codex (ChatGPT) でログイン',
+ oauth_codex_step1: 'ステップ 1: この URL にアクセスしてコードを入力',
+ oauth_codex_step2: 'ステップ 2: ページにこのコードを入力',
+ oauth_codex_polling: '認可待ち...',
+ oauth_codex_success: 'Codex OAuth ログインに成功しました!',
+ oauth_codex_error: 'OAuth ログインに失敗しました',
+ oauth_codex_expired: 'コードの有効期限が切れました。もう一度お試しください',
+ onboarding_notice_workspace: 'これらの値は通常アプリと同じ設定 API を使用します。',
+ onboarding_workspace_label: 'ワークスペース',
+ onboarding_workspace_or_path: 'またはワークスペースのパスを入力',
+ onboarding_workspace_placeholder: '/home/you/workspace',
+ onboarding_provider_label: 'セットアップモード',
+ onboarding_quick_setup_badge: 'クイックセットアップ',
+ provider_category_easy_start: '簡単スタート',
+ provider_category_self_hosted: 'オープン / セルフホスト',
+ provider_category_specialized: '専門用途',
+ onboarding_api_key_label: 'APIキー',
+ onboarding_api_key_placeholder: '空欄で既存の保存済みキーを維持',
+ onboarding_api_key_help_prefix: 'Hermes の .env ファイルにシークレットとして保存されます — 使用変数:',
+ onboarding_base_url_label: 'ベース URL',
+ onboarding_base_url_placeholder: 'https://your-endpoint.example/v1',
+ onboarding_base_url_help: 'OpenAI 互換ルーター、セルフホストサーバー、LiteLLM、Ollama、LM Studio、vLLM、または同様のエンドポイントで使用してください。',
+ onboarding_model_label: 'デフォルトモデル',
+ onboarding_workspace_help: 'セットアップ完了後の新規チャットで Hermes が使用するモデルを選択してください。',
+ onboarding_custom_model_placeholder: 'your-model-name',
+ onboarding_custom_model_help: 'カスタムエンドポイントの場合、サーバーが期待する正確なモデル ID を入力してください。',
+ onboarding_notice_password_enabled: 'パスワードは既に設定済みです。置き換える場合のみ新しいものを入力してください。',
+ onboarding_notice_password_recommended: '任意ですが、localhost 以外で UI を公開する場合は推奨します。',
+ onboarding_password_label: 'パスワード (任意)',
+ onboarding_password_placeholder: '空欄でスキップ',
+ onboarding_password_help: 'パスワードは既存の設定 API 経由で保存され、サーバー側でハッシュ化されます。',
+ onboarding_notice_finish: '後で設定からいつでも変更できます。',
+ onboarding_not_set: '未設定',
+ onboarding_password_will_enable: '有効化されます',
+ onboarding_password_will_replace: '置き換えられます',
+ onboarding_password_keep_existing: '現在のパスワードを維持',
+ onboarding_password_remains_disabled: '無効のまま',
+ onboarding_password_skipped: '今回はスキップ',
+ onboarding_finish_help: '完了すると onboarding_completed が設定に保存され、通常アプリへ入ります。',
+ onboarding_error_choose_workspace: '続行する前にワークスペースを選択してください。',
+ onboarding_error_choose_model: '続行する前にモデルを選択してください。',
+ onboarding_error_provider_required: '続行する前にセットアップモードを選択してください。',
+ onboarding_error_base_url_required: 'カスタムエンドポイントにはベース URL が必要です。',
+ onboarding_error_workspace_required: 'ワークスペースは必須です。',
+ onboarding_error_model_required: 'モデルは必須です。',
+ onboarding_complete: 'オンボーディング完了',
+
+ // panel/runtime i18n
+ error_prefix: 'エラー: ',
+ not_available: 'N/A',
+ never: 'なし',
+ add: '追加',
+ add_failed: '追加失敗: ',
+ remove_failed: '削除失敗: ',
+ switch_failed: '切替失敗: ',
+ name_required: '名前は必須です',
+ content_required: '内容は必須です',
+ view: '表示',
+ dismiss: '閉じる',
+ disable: '無効化',
+ cron_no_jobs: 'スケジュールジョブが見つかりません。',
+ cron_status_off: 'オフ',
+ cron_status_paused: '一時停止',
+ cron_status_error: 'エラー',
+ cron_status_active: '有効',
+ cron_status_running: '実行中…',
+ cron_status_needs_attention: '要対応',
+ cron_attention_desc: 'この繰り返しジョブには次回実行時刻がありません。スケジューラが次回実行時刻を計算できなかった可能性があります。',
+ cron_attention_croniter_hint: 'Gateway ランタイムに croniter パッケージが不足している可能性があります。cron サポート付きで Gateway を再起動し、ジョブを再開してください。',
+ cron_attention_resume: '再開して再計算',
+ cron_jobs_project: 'Cronジョブ',
+ cron_attention_run_once: '今すぐ1回実行',
+ cron_attention_copy_diagnostics: '診断情報をコピー',
+ cron_diagnostics_copied: 'Cron 診断情報をコピーしました',
+ cron_next: '次回',
+ cron_last: '前回',
+ cron_run_now: '今すぐ実行',
+ cron_pause: '一時停止',
+ cron_resume: '再開',
+ cron_job_name_placeholder: 'ジョブ名',
+ cron_schedule_placeholder: 'スケジュール',
+ cron_prompt_placeholder: 'プロンプト',
+ cron_last_output: '前回の出力',
+ cron_all_runs: 'すべての実行',
+ cron_hide_runs: '実行履歴を隠す',
+ cron_no_runs_yet: '(まだ実行されていません)',
+ cron_schedule_required_example: 'スケジュールは必須です (例: "0 9 * * *" または "every 1h")',
+ cron_schedule_required: 'スケジュールは必須です',
+ cron_prompt_required: 'プロンプトは必須です',
+ cron_job_created: 'ジョブを作成しました',
+ cron_duplicate: '複製',
+ cron_duplicated: 'ジョブを複製しました (一時停止)',
+ cron_job_triggered: 'ジョブを起動しました',
+ cron_job_paused: 'ジョブを一時停止しました',
+ cron_job_resumed: 'ジョブを再開しました',
+ cron_job_updated: 'ジョブを更新しました',
+ cron_delete_confirm_title: 'Cronジョブを削除',
+ cron_delete_confirm_message: 'この操作は取り消せません。',
+ cron_job_deleted: 'ジョブを削除しました',
+ cron_completion_status: (name, status) => `Cron "${name}" ${status}`,
+ status_failed: '失敗',
+ status_completed: '完了',
+ todos_no_active: 'このセッションにアクティブなタスクリストがありません。',
+ clear_conversation_title: '会話をクリア',
+ clear_conversation_message: 'すべてのメッセージをクリアしますか? この操作は取り消せません。',
+ clear_failed: 'クリア失敗: ',
+ skills_no_match: '一致するスキルがありません。',
+ linked_files: 'リンクされたファイル',
+ skill_load_failed: 'スキルを読み込めませんでした: ',
+ skill_file_load_failed: 'ファイルを読み込めませんでした: ',
+ skill_name_required: 'スキル名は必須です',
+ skill_updated: 'スキルを更新しました',
+ skill_created: 'スキルを作成しました',
+ skill_deleted: 'スキルを削除しました',
+ skill_delete_confirm: 'スキル "{0}" を削除しますか?',
+ skills_empty_title: 'スキルを選択',
+ skills_empty_sub: 'サイドバーからスキルを選んで内容を表示するか、新しいスキルを作成してください。',
+ skills_edit: '編集',
+ skills_delete: '削除',
+ skills_back_to: '{0} に戻る',
+ tasks_empty_title: 'スケジュールジョブを選択',
+ tasks_empty_sub: 'サイドバーからジョブを選んで詳細と実行履歴を表示するか、新規作成してください。',
+ workspaces_empty_title: 'スペースを選択',
+ workspaces_empty_sub: 'サイドバーからスペースを選んでファイルと設定を表示するか、新しく追加してください。',
+ profiles_empty_title: 'プロファイルを選択',
+ profiles_empty_sub: 'サイドバーからエージェントプロファイルを選んで設定を表示・編集するか、新規作成してください。',
+ memory_notes_label: 'メモリ (ノート)',
+ memory_saved: 'メモリを保存しました',
+ my_notes: 'マイノート',
+ user_profile: 'ユーザープロファイル',
+ no_notes_yet: 'まだノートはありません。',
+ no_profile_yet: 'まだプロファイルはありません。',
+ workspace_choose_path: 'ワークスペースのパスを選択',
+ workspace_choose_path_meta: '検証済みパスを追加してこの会話を切り替え',
+ workspace_manage: 'ワークスペースを管理',
+ workspace_manage_meta: 'スペースパネルを開く',
+ workspace_use_title: '現在のセッションで使用',
+ workspace_use: '使用',
+ workspace_add_path_placeholder: 'ワークスペースパスを追加 (例: /home/user/my-project)',
+ workspace_paths_validated_hint: '保存前に既存ディレクトリとして検証されます。',
+
+ workspace_drag_hint: 'ドラッグして並び替え',
+ workspace_reorder_failed: '並び替え失敗',
+ workspace_added: 'ワークスペースを追加しました',
+ workspace_renamed: 'ワークスペース名を変更しました',
+ workspace_remove_confirm_title: 'ワークスペースを削除',
+ workspace_remove_confirm_message: (path) => `"${path}" を削除しますか?`,
+ workspace_removed: 'ワークスペースを削除しました',
+ workspace_switch_prompt_title: 'ワークスペースを切り替え',
+ workspace_switch_prompt_message: '追加してこの会話を切り替える絶対パスを入力してください。',
+ workspace_switch_prompt_confirm: '切り替え',
+ workspace_switch_prompt_placeholder: '/Users/you/project',
+ workspace_not_added: 'ワークスペースは追加されませんでした',
+ workspace_already_saved: 'ワークスペースは既に保存済み — 一覧から選択してください',
+ workspace_busy_switch: 'エージェント実行中はワークスペースを切り替えできません',
+ discard_file_edits_title: 'ファイル編集を破棄しますか?',
+ discard_file_edits_message: 'ワークスペース切替でプレビュー内の未保存編集が破棄されます。',
+ workspace_switched_to: (name) => `${name} に切り替えました`,
+ profiles_no_profiles: 'プロファイルが見つかりません。',
+ profile_api_keys_configured: 'APIキー設定済み',
+ profile_gateway_running: 'Gateway 実行中',
+ profile_gateway_stopped: 'Gateway 停止中',
+ profile_active: 'アクティブ',
+ profile_no_configuration: '設定なし',
+ profile_skill_count: (count) => `${count} 件のスキル`,
+ profile_use: '使用',
+ profile_switch_title: 'このプロファイルに切り替え',
+ profile_delete_title: 'このプロファイルを削除',
+ profile_default_label: '(デフォルト)',
+ profile_name_placeholder: 'プロファイル名 (小文字 a-z 0-9 ハイフン)',
+ profile_clone_label: 'アクティブプロファイルから設定をコピー',
+ profile_base_url_placeholder: 'ベース URL (任意、例: http://localhost:11434)',
+ profile_api_key_placeholder: 'APIキー (任意)',
+ manage_profiles: 'プロファイルを管理',
+ profiles_load_failed: 'プロファイルの読み込みに失敗しました',
+ profiles_busy_switch: 'エージェント実行中はプロファイルを切り替えできません',
+ profile_switched_new_conversation: (name) => `プロファイルを切替: ${name} — 新しい会話を開始しました`,
+ profile_switched: (name) => `プロファイルを切替: ${name}`,
+ profile_name_rule: '小文字、数字、ハイフン、アンダースコアのみ',
+ profile_base_url_rule: 'ベース URL は http:// または https:// で始める必要があります',
+ profile_created: (name) => `プロファイルを作成: ${name}`,
+ profile_delete_confirm_title: (name) => `プロファイル "${name}" を削除しますか?`,
+ profile_delete_confirm_message: 'このプロファイルのすべてのセッション、設定、スキル、メモリが完全に削除されます。この操作は取り消せません。',
+ profile_deleted: (name) => `プロファイルを削除: ${name}`,
+ active_conversation_none: 'アクティブな会話が選択されていません。',
+ active_conversation_meta: (title, count) => `${title} · ${count} 件のメッセージ`,
+ settings_unsaved_changes: '未保存の変更があります。',
+ sign_out_failed: 'サインアウト失敗: ',
+ disable_auth_confirm_title: 'パスワード保護を無効化',
+ disable_auth_confirm_message: '誰でもこのインスタンスにアクセスできるようになります。',
+ auth_disabled: '認証無効化 — パスワード保護を解除しました',
+ disable_auth_failed: '認証の無効化に失敗: ',
+ bg_error_single: (title) => `"${title}" でエラーが発生しました`,
+ bg_error_multi: (count) => `${count} 件のセッションでエラーが発生しました`,
+ // skill form
+ skill_name: '名前',
+ skill_category: 'カテゴリ',
+ skill_category_placeholder: '任意、例: devops',
+ skill_content: 'SKILL.md の内容',
+ skill_content_placeholder: 'YAML フロントマター + Markdown 本文',
+ skill_rename_not_supported: 'スキルの名前変更には対応していません。新しいスキルを作成し、古いものを削除してください。',
+ skill_metadata: 'メタデータ',
+ // cron form
+ cron_name_label: '名前',
+ cron_name_placeholder: '任意',
+ cron_schedule_label: 'スケジュール',
+ cron_schedule_hint: "Cron 式または 'every 1h' のような短縮形。",
+ cron_prompt_label: 'プロンプト',
+ cron_deliver_label: '出力先',
+ cron_deliver_local: 'ローカル (出力を保存のみ)',
+ cron_skills_label: 'スキル',
+ cron_skills_placeholder: 'スキルを追加 (任意)…',
+ cron_skills_edit_hint: 'スキル一覧は作成後に編集できません。',
+ // workspace form
+ workspace_name_label: '名前',
+ workspace_name_placeholder: '任意の表示名',
+ workspace_path_label: 'パス',
+ workspace_path_required: 'パスは必須です',
+ workspace_path_readonly: 'パスは変更できません。名前変更のみ可能です。',
+ workspace_new_title: '新規スペース',
+ // profile form
+ profile_name_label: '名前',
+ profile_base_url_label: 'ベース URL',
+ profile_api_key_label: 'APIキー',
+ cmd_yolo: 'YOLO モード切替 (承認スキップ)',
+ yolo_no_session: 'アクティブなセッションがありません',
+ yolo_enabled: '⚡ YOLO モード ON — このセッションは承認をスキップ',
+ yolo_disabled: 'YOLO モード OFF',
+ yolo_pill_label: 'YOLO',
+ yolo_pill_title_active: 'YOLO モード有効 — クリックで無効化',
+ approval_skip_all: '⚡ このセッションはすべてスキップ',
+ approval_skip_all_title: 'このセッションのすべての承認プロンプトをスキップ',
+ // composer action tooltips
+ composer_send: 'メッセージを送信',
+ composer_queue: 'メッセージをキュー',
+ composer_interrupt: '中断して送信',
+ composer_steer: '現在の応答をステア',
+ composer_stop: '生成を停止',
+ composer_disabled_clarify: '確認要求に応答してください',
+ composer_disabled_compression: '圧縮の完了待ち',
+ composer_disabled_empty: '送信するメッセージを入力してください',
+ composer_mobile_workspace: 'ワークスペース',
+ composer_mobile_model: 'モデル',
+ composer_mobile_reasoning: '思考',
+ composer_mobile_context: 'コンテキスト',
+ media_audio_label: '音声',
+ media_svg_label: '図',
+ media_video_label: '動画',
+ csv_loading: 'CSV を読み込み中',
+ csv_too_large: 'CSV ファイルが大きすぎてインライン表示できません',
+ csv_no_data: 'CSV ファイルのデータが不足しているためテーブル表示できません',
+ csv_error: 'CSV ファイルの読み込みに失敗しました',
+ csv_header_note: '先頭行をテーブルヘッダーとして表示',
+ excalidraw_loading: '図を読み込み中',
+ excalidraw_too_large: 'Excalidraw ファイルが大きすぎてインライン表示できません',
+ excalidraw_invalid: '無効な Excalidraw ファイル形式',
+ excalidraw_error: 'Excalidraw ファイルの読み込みに失敗しました',
+ excalidraw_label: '図',
+ excalidraw_download: 'ダウンロード',
+ excalidraw_empty: '空の図',
+ excalidraw_render_error: '図の描画に失敗しました',
+ excalidraw_simplified: '簡略化された SVG プレビュー — Excalidraw キャンバスとピクセル単位では一致しません',
+ // ── Checkpoints / Rollback ──
+ checkpoint_title: 'チェックポイント',
+ checkpoint_empty: 'このワークスペースのチェックポイントが見つかりません。',
+ checkpoint_loading: 'チェックポイントを読み込み中…',
+ checkpoint_error: 'チェックポイントの読み込みに失敗しました',
+ checkpoint_date: '日時',
+ checkpoint_message: 'メッセージ',
+ checkpoint_files: 'ファイル',
+ checkpoint_view_diff: '差分を表示',
+ checkpoint_restore: '復元',
+ checkpoint_restore_confirm_title: 'チェックポイントを復元しますか?',
+ checkpoint_restore_confirm_message: (ckpt) => `ワークスペースをチェックポイント "${ckpt}" に復元しますか? ファイルが保存版で上書きされます。このチェックポイント後に追加されたファイルは削除されません。`,
+ checkpoint_restored: 'チェックポイントを復元しました',
+ checkpoint_diff_title: 'チェックポイントの変更内容',
+ checkpoint_diff_no_changes: 'このチェックポイントと現在のワークスペースの間に差分はありません。',
+ checkpoint_diff_files_changed: (n) => `${n} 件のファイルが変更されました`,
+ },
+
ru: {
_lang: 'ru',
_label: 'Русский',