Files
multica/packages/views/locales/ja/settings.json
Bohan Jiang f5db77340f feat(web): native notification banners for the web app (MUL-3116) (#3883)
The in-app inbox (sidebar badge, real-time WS updates, settings, inbox
page) was already shared and worked on web. The only Desktop-only piece
was the native OS banner: handleInboxNew called desktopAPI.showNotification,
which is undefined on web, so no banner fired for new inbox items while the
app was unfocused.

Add the browser equivalent, keeping handleInboxNew as the single decision
point (focus + source-workspace mute gating stays shared with desktop):

- packages/core/platform/system-notification.ts: browser Notification engine
  (showWebNotification) + permission helpers + a click-handler registry. Lives
  in core (the caller does) but injects the click-routing decision so core
  stays headless.
- handleInboxNew: branch desktopAPI (unchanged) → else showWebNotification.
- apps/web WebNotificationBridge: registers click routing to the source
  workspace's inbox (?issue=…), mirroring desktop's DesktopInboxBridge.
- Settings → Notifications: web-only opt-in to grant browser permission
  (hidden on desktop / where the API is unavailable); en/zh-Hans/ja/ko.

Permission is an explicit settings opt-in (no auto-prompt on load, per
browser best practice). Tests cover the engine and the web path in
handleInboxNew.

Co-authored-by: J <j@multica.ai>
Co-authored-by: multica-agent <github@multica.ai>
2026-06-08 14:12:20 +08:00

381 lines
25 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"preferences": {
"theme": {
"title": "テーマ",
"light": "ライト",
"dark": "ダーク",
"system": "システム"
},
"language": {
"title": "言語",
"english": "English",
"chinese": "中文",
"korean": "한국어",
"japanese": "日本語",
"sync_failed": "このデバイスに言語を保存しましたが、アカウントへの同期に失敗しました。他のデバイスでは以前の言語が表示される場合があります。"
},
"timezone": {
"title": "表示タイムゾーン",
"browser_suffix": " (ブラウザ)",
"hint": "ダッシュボード、チャート、表示される「今日」ラベルに使用されます。すべてのワークスペースに適用される個人設定です。",
"sync_failed": "タイムゾーン設定を保存できませんでした。"
}
},
"page": {
"title": "設定",
"my_account": "マイアカウント",
"workspace_fallback": "ワークスペース",
"tabs": {
"profile": "プロフィール",
"preferences": "環境設定",
"notifications": "通知",
"tokens": "API トークン",
"general": "一般",
"repositories": "リポジトリ",
"github": "GitHub",
"integrations": "連携",
"labs": "ラボ",
"members": "メンバー"
}
},
"account": {
"section_profile": "プロフィール",
"click_avatar_hint": "クリックしてアバターをアップロード",
"name_label": "名前",
"profile_description_label": "自己紹介",
"profile_description_hint": "あなたの代わりに作業するエージェントに共有されます。役割、技術スタック、好みなど、新しいコラボレーターに初日に伝えたいことを書いてください。",
"profile_description_placeholder": "例: Go と Postgres を使うバックエンドエンジニア。簡潔な PR と変更に合わせたテストを好みます。",
"profile_description_too_long": "プロフィールが長すぎます(最大 {{max}} 文字、現在 {{count}} 文字)。",
"save": "プロフィールを更新",
"saving": "更新中...",
"toast_avatar_updated": "アバターを更新しました",
"toast_avatar_failed": "アバターをアップロードできませんでした",
"toast_profile_updated": "プロフィールを更新しました",
"toast_profile_failed": "プロフィールを更新できませんでした"
},
"notifications": {
"title": "インボックス通知",
"description": "どのイベントがインボックス通知を生成するかを制御します。ミュートしたイベントタイプは静かにフィルタされますが、イシューを直接開けば引き続き確認できます。",
"toast_failed": "通知設定を更新できませんでした",
"groups": {
"assignments": {
"label": "担当の割り当て",
"description": "イシューの担当者に割り当てられたとき、または解除されたとき"
},
"status_changes": {
"label": "ステータス変更",
"description": "フォロー中のイシューのステータスが変わったとき(例: todo、in progress、done"
},
"comments": {
"label": "コメントとメンション",
"description": "フォロー中のイシューに新しいコメントが付いたとき、または誰かがあなたを @メンションしたとき"
},
"updates": {
"label": "優先度と期限",
"description": "フォロー中のイシューの優先度や期限が変わったとき"
},
"agent_activity": {
"label": "エージェントのアクティビティ",
"description": "エージェントのタスクが完了または失敗したとき"
}
},
"system": {
"title": "システム通知",
"description": "Multica がバックグラウンドにあるときに表示される OS のネイティブ通知バナーを制御します。",
"label": "システム通知を表示",
"hint": "アプリにフォーカスがないときに、新しいインボックス項目について OS のバナーを表示します。"
},
"browser": {
"label": "ブラウザ通知",
"hint": "このブラウザで新しいインボックス項目の通知バナーを表示できるようにします。",
"enable": "有効にする",
"granted": "このブラウザは通知バナーを表示できます。",
"denied": "ブラウザによってブロックされています。ブラウザの設定でこのサイトの通知を許可してください。",
"enabled_badge": "有効"
}
},
"tokens": {
"title": "API トークン",
"description": "個人アクセストークンを使うと、CLI や外部連携があなたのアカウントで認証できます。",
"name_placeholder": "トークン名(例: My CLI",
"expiry": {
"30": "30 日",
"90": "90 日",
"365": "1 年",
"never": "有効期限なし"
},
"create": "作成",
"creating": "作成中...",
"toast_load_failed": "トークンを読み込めませんでした",
"toast_create_failed": "トークンを作成できませんでした",
"toast_revoked": "トークンを失効しました",
"toast_revoke_failed": "トークンを失効できませんでした",
"metadata_prefix": "{{prefix}}... · 作成 {{created}} · {{lastUsed}}",
"last_used_with_date": "最終使用 {{date}}",
"last_used_never": "未使用",
"expires_with_date": " · 有効期限 {{date}}",
"revoke_aria": "{{name}} を失効",
"revoke_tooltip": "失効",
"revoke_dialog": {
"title": "トークンを失効",
"description": "このトークンは永久に失効し、以降は使用できなくなります。この操作は元に戻せません。",
"cancel": "キャンセル",
"confirm": "失効"
},
"created_dialog": {
"title": "トークンを作成しました",
"description": "今すぐ個人アクセストークンをコピーしてください。再表示はできません。",
"copy_tooltip": "トークンをコピー",
"done": "完了"
}
},
"workspace": {
"section_general": "一般",
"name_label": "名前",
"description_label": "説明",
"description_placeholder": "このワークスペースは何に注力していますか?",
"context_label": "コンテキスト",
"context_placeholder": "このワークスペースで作業する AI エージェント向けの背景情報とコンテキスト",
"slug_label": "スラッグ",
"issue_prefix_label": "イシュー接頭辞",
"issue_prefix_hint": "{{example}} のようなイシュー番号に使用されます。",
"prefix_confirm_title": "イシュー接頭辞を変更しますか?",
"prefix_confirm_description": "すべてのイシュー番号が {{oldPrefix}}-N から {{newPrefix}}-N に振り直されます。Pull request のタイトル、ブランチ名、ドキュメントやチャットのリンクなど、{{oldPrefix}}-N を使用している外部参照は解決されなくなります。",
"save": "保存",
"saving": "保存中...",
"manage_hint": "ワークスペース設定を更新できるのは admin と owner のみです。",
"toast_saved": "ワークスペース設定を保存しました",
"toast_save_failed": "ワークスペース設定を保存できませんでした",
"danger_zone": "危険な操作",
"leave_title": "ワークスペースを退出",
"leave_sole_owner": "あなたは唯一の owner です。先に別のメンバーを owner に昇格させるか、ワークスペースを削除してください。",
"leave_sole_member": "あなたは唯一のメンバーです。退出するにはワークスペースを削除してください。",
"leave_default": "このワークスペースからあなた自身を削除します。",
"leave_button": "ワークスペースを退出",
"leaving": "退出中...",
"leave_confirm_title": "ワークスペースを退出",
"leave_confirm_description": "{{name}} から退出しますか?再招待されるまでアクセスできなくなります。",
"toast_leave_failed": "ワークスペースから退出できませんでした",
"delete_title": "ワークスペースを削除",
"delete_description": "このワークスペースとそのデータを完全に削除します。",
"delete_button": "ワークスペースを削除",
"deleting": "削除中...",
"toast_delete_failed": "ワークスペースを削除できませんでした",
"confirm_cancel": "キャンセル",
"confirm_action": "確認",
"change_logo_aria": "ワークスペースのロゴを変更",
"click_logo_hint": "ロゴをクリックして新しい画像をアップロード",
"toast_logo_updated": "ワークスペースのロゴを更新しました",
"toast_logo_failed": "ワークスペースのロゴをアップロードできませんでした"
},
"delete_workspace_dialog": {
"title": "ワークスペースを削除",
"description": "この操作は元に戻せません。すべてのイシュー、エージェント、データが完全に削除されます。",
"type_to_confirm_prefix": "確認するには、下に",
"type_to_confirm_suffix": " と入力してください。",
"cancel": "キャンセル",
"confirm": "ワークスペースを削除",
"deleting": "削除中..."
},
"labs": {
"section_placeholder_title": "まだ実験機能はありません",
"section_placeholder_description": "実験的な設定はリリースされ次第ここに表示されます。現在このタブは意図的に空にしてあります。",
"toast_failed": "設定を更新できませんでした"
},
"github": {
"page_description": "GitHub App を接続し、Pull request が Multica 内でどう表示されるかを制御し、エージェントがコミット履歴に残す情報を設定します。",
"section_master": "GitHub 機能を有効にする",
"master_description_on": "オフにすると、すべての GitHub UI が非表示になり、新しい副作用が記録されなくなります。既存のデータはバックエンドに保持されます。開発チームではありませんか?ここでオフにできます。",
"master_description_off": "GitHub 機能はオフです。PR サイドバー、Co-authored-by トレーラー、自動リンクが一時停止されています。バックエンドのデータは削除されません。",
"section_connection": "接続",
"connection_title": "GitHub App",
"connection_description_prefix": "イシューを Pull request に自動でリンクします。ブランチ、タイトル、または本文に",
"connection_description_suffix": "を含む PR がマージされると、対応するイシューが次のステータスに移動します:",
"connection_description_done": "完了",
"connection_identifier_example": "MUL-123",
"connected_to": "{{login}} に接続済み",
"connect_github": "GitHub を接続",
"connect_opening": "開いています…",
"connect_disabled_tooltip": "このサーバーには GitHub App が設定されていません",
"disconnect": "接続解除",
"disconnecting": "接続解除中…",
"disconnect_confirm_title": "GitHub App の接続を解除",
"disconnect_confirm_description": "Multica はこのインストールの Webhook 受信を停止します。既存の PR ミラーとリンクは保持され、いつでも再接続して更新を再開できます。",
"disconnect_confirm_cancel": "キャンセル",
"disconnect_confirm_action": "接続解除",
"not_configured": "このデプロイには GitHub 連携が設定されていません。運営者が次の値を設定する必要があります:",
"not_configured_and": "および",
"read_only_hint": "読み取り専用ビューです。GitHub を接続または解除できるのはワークスペースの admin と owner のみです。",
"contact_admin_to_connect": "このワークスペースには GitHub が接続されていません。admin または owner に GitHub App のセットアップを依頼してください。",
"connected_by": "{{name}} が接続",
"toast_not_configured": "このデプロイには GitHub 連携が設定されていません",
"toast_open_failed": "GitHub のインストール画面を開けませんでした",
"toast_disconnect_failed": "GitHub App の接続を解除できませんでした",
"toast_disconnected": "GitHub App の接続を解除しました",
"section_features": "機能",
"feature_pr_sidebar_label": "Pull request サイドバー",
"feature_pr_sidebar_description": "リンクされた Pull request をイシュー詳細サイドバーに表示します。",
"feature_co_author_label": "Co-authored-by トレーラー",
"feature_co_author_description_prefix": "エージェントが作成したコミットに",
"feature_co_author_description_suffix": "を追加します。",
"feature_auto_link_label": "イシューと PR を自動リンク",
"feature_auto_link_description": "PR のタイトル、本文、ブランチ名をイシュー識別子と照合し、自動でリンクを作成します。",
"section_repositories": "リポジトリ",
"repositories_shortcut_label": "リポジトリ URL はリポジトリタブにあります",
"repositories_shortcut_link": "リポジトリを管理 →",
"toast_failed": "GitHub 設定を更新できませんでした"
},
"lark": {
"section_title": "Lark",
"page_description": "各 Multica エージェントを Lark (飞书) PersonalAgent ボットに接続します。メンバーはボットに DM したり、グループで @ メンションしたり、/issue と入力して新しい Multica イシューを起こすことができます。",
"not_enabled_title": "Lark 連携が有効化されていません",
"not_enabled_description_prefix": "Lark ボットの設置を有効化するにはサーバーに",
"not_enabled_description_suffix": "を設定してください。",
"not_enabled_self_host_hint": "セルフホスト運用者の方は、詳細はプロジェクトの README を参照してください。",
"preview_title": "Lark ボットの設置はまもなく利用可能になります",
"preview_description": "保管時暗号化キーは設定されていますが、このビルドには Lark HTTP クライアントが接続されていません。後続リリースでトランスポートが有効化されると、設置エントリーポイントがここに表示されます。",
"connected_bots": "接続済みのボット",
"loading": "読み込み中…",
"empty_title": "まだボットが接続されていません",
"empty_description_prefix": "このワークスペースのエージェントを開いて",
"empty_description_cta": "Lark に接続",
"empty_description_suffix": "をクリックすると、対応するボットを設置できます。",
"revoked_badge": "取り消し済み",
"region_feishu": "Feishu",
"region_lark": "Lark",
"installed_at_label": "{{when}} に設置",
"disconnect": "切断",
"disconnecting": "切断しています…",
"disconnect_confirm_title": "この Lark ボットを切断しますか?",
"disconnect_confirm_description": "ボットは Lark のメッセージを受け取らなくなり、WebSocket 接続も切断されます。監査用にインストール行は保持され、同じエージェントから再設置できます。",
"disconnect_confirm_cancel": "キャンセル",
"toast_disconnected": "Lark ボットを切断しました",
"toast_disconnect_failed": "切断に失敗しました",
"bind_button": "Lark に接続",
"bind_button_title": "{{agent}} を Lark ボットに接続",
"bind_button_feishu": "Feishu に接続",
"bind_button_lark": "Lark に接続",
"bind_button_feishu_title": "{{agent}} を Feishu中国本土版ボットに接続",
"bind_button_lark_title": "{{agent}} を Lark国際版ボットに接続",
"agent_bot_connected_label": "Lark に接続済み",
"agent_bot_manage_link": "Lark で管理",
"agent_bot_manage_tooltip": "Lark のデベロッパーコンソールでこのボットのアプリページを開き、スコープ管理 / 名称変更 / 追加権限の申請ができます。",
"agent_bot_connected_label_feishu": "Feishu に接続済み",
"agent_bot_connected_label_lark": "Lark に接続済み",
"agent_bot_manage_link_feishu": "Feishu で管理",
"agent_bot_manage_link_lark": "Lark で管理",
"agent_bot_manage_tooltip_feishu": "Feishu のデベロッパーコンソールでこのボットのアプリページを開き、スコープ管理 / 名称変更 / 追加権限の申請ができます。",
"agent_bot_manage_tooltip_lark": "Lark のデベロッパーコンソールでこのボットのアプリページを開き、スコープ管理 / 名称変更 / 追加権限の申請ができます。",
"agent_bot_disconnect_tooltip": "この Lark ボットとエージェントの連携を解除します。ボットは Lark メッセージの受信を停止します。",
"install_dialog_title": "Lark に接続",
"install_dialog_description": "Lark を開き、以下のコードをスキャンして PersonalAgent ボットを作成してください。",
"install_dialog_description_for_agent": "Lark を開き、以下のコードをスキャンして {{agent}} 用のボットを作成してください。",
"install_dialog_title_feishu": "Feishu に接続",
"install_dialog_title_lark": "Lark に接続",
"install_dialog_description_feishu": "Feishu を開き、以下のコードをスキャンして PersonalAgent ボットを作成してください。",
"install_dialog_description_lark": "Lark を開き、以下のコードをスキャンして PersonalAgent ボットを作成してください。",
"install_dialog_description_for_agent_feishu": "Feishu を開き、以下のコードをスキャンして {{agent}} 用のボットを作成してください。",
"install_dialog_description_for_agent_lark": "Lark を開き、以下のコードをスキャンして {{agent}} 用のボットを作成してください。",
"install_starting": "QR コードを準備しています…",
"install_scan_hint": "Lark → スキャン → 新しい PersonalAgent を承認してください。",
"install_open_link_fallback": "ここをタップして Lark で開く",
"install_success": "設置が完了しました — ボットはオンラインです。",
"install_success_toast": "Lark ボットを設置しました",
"install_scan_hint_feishu": "Feishu → スキャン → 新しい PersonalAgent を承認してください。",
"install_scan_hint_lark": "Lark → スキャン → 新しい PersonalAgent を承認してください。",
"install_open_link_fallback_feishu": "ここをタップして Feishu で開く",
"install_open_link_fallback_lark": "ここをタップして Lark で開く",
"install_success_toast_feishu": "Feishu ボットを設置しました",
"install_success_toast_lark": "Lark ボットを設置しました",
"install_close": "閉じる",
"install_retry": "もう一度スキャン",
"install_poll_retry": "設置状況の確認中に一時的にネットワークが途切れました — 再試行します。",
"install_error_expired": "承認前に QR が期限切れになりました。もう一度スキャンしてください。",
"install_error_access_denied": "Lark で設置がキャンセルされました。",
"install_error_protocol": "Lark が設置を拒否しました — もう一度お試しください。",
"install_error_bot_info": "承認はされましたが、Multica がボットの識別子を取得できませんでした。もう一度お試しください。",
"install_error_conflict": "設置を保存できませんでした。別のボットがすでにこのエージェントに接続されている可能性があります。",
"install_error_installer_bind": "ボットは設置されましたが、Lark の身元情報を連携できませんでした。もう一度お試しいただくか、サポートにお問い合わせください。",
"install_error_session_lost": "設置セッションが期限切れまたは失われました。もう一度スキャンしてやり直してください。",
"install_error_forbidden": "このワークスペースに Lark ボットを設置する権限がなくなりました。ワークスペース管理者にお問い合わせください。",
"install_error_generic": "設置に失敗しました。もう一度お試しください。"
},
"repositories": {
"section_title": "リポジトリ",
"description": "このワークスペースに関連付けられた Git リポジトリです。エージェントはこれらをクローンしてコードを作業します。",
"url_placeholder": "https://git.example.com/org/repo.git または git@git.example.com:org/repo.git",
"url_empty": "(空の URL",
"description_placeholder": "説明(例: Go バックエンド + Next.js フロントエンド)",
"add": "リポジトリを追加",
"save": "保存",
"saving": "保存中...",
"saved_hint": "すべての変更を保存しました",
"empty": "まだリポジトリがありません。",
"edit_aria": "リポジトリを編集",
"cancel_aria": "編集をキャンセル",
"delete_aria": "リポジトリを削除",
"manage_hint": "リポジトリを管理できるのは admin と owner のみです。",
"toast_saved": "リポジトリを保存しました",
"toast_save_failed": "リポジトリを保存できませんでした"
},
"desktop": {
"tabs": {
"updates": "アップデート"
},
"updates": {
"title": "アップデート",
"description": "デスクトップアプリは 1 時間に 1 回、および起動直後に新しいバージョンを自動で確認し、バックグラウンドでダウンロードします。アップデートの準備が整うと、再起動を促すメッセージが表示されます。",
"current_version": "現在のバージョン",
"check_section_title": "アップデートを確認",
"check_section_description": "次回の自動確認を待たずに、今すぐ確認します。利用可能なアップデートはバックグラウンドでダウンロードされ、準備が整うと再起動を促すメッセージが表示されます。",
"up_to_date": "最新バージョンを使用しています。",
"downloading": "v{{version}} をバックグラウンドでダウンロード中です。インストールの準備が整うとお知らせします。",
"check_now": "今すぐ確認",
"checking": "確認中…"
}
},
"members": {
"section_title": "メンバー({{count}}",
"invite_title": "メンバーを招待",
"invite_email_placeholder": "user@company.com",
"invite_button": "招待",
"inviting": "招待中...",
"toast_invitation_sent": "招待を送信しました",
"toast_invitation_failed": "招待を送信できませんでした",
"no_members": "メンバーが見つかりません。",
"pending_title": "保留中の招待({{count}}",
"pending_status": "保留中",
"revoke_invitation_tooltip": "招待を取り消し",
"revoke_invitation_title": "招待を取り消し",
"revoke_invitation_description": "{{email}} への招待を取り消しますか?このワークスペースに参加できなくなります。",
"toast_invitation_revoked": "招待を取り消しました",
"toast_invitation_revoke_failed": "招待を取り消せませんでした",
"toast_role_updated": "ロールを更新しました",
"toast_role_failed": "メンバーを更新できませんでした",
"toast_member_removed": "メンバーを削除しました",
"toast_member_remove_failed": "メンバーを削除できませんでした",
"remove_member_title": "{{name}} を削除",
"remove_member_description": "{{workspace}} から {{name}} を削除しますか?このワークスペースへのアクセスを失います。",
"confirm_cancel": "キャンセル",
"confirm_action": "確認",
"change_role": "ロールを変更",
"remove_action": "ワークスペースから削除",
"cannot_demote_last_owner_title": "先に別のメンバーを owner に昇格させてください。ワークスペースには少なくとも 1 人の owner が必要です。",
"cannot_demote_last_owner": "最後の owner は降格できません",
"roles": {
"owner": {
"label": "オーナー",
"description": "フルアクセス、すべての設定を管理"
},
"admin": {
"label": "管理者",
"description": "メンバーと設定を管理"
},
"member": {
"label": "メンバー",
"description": "イシューの作成と作業"
}
}
}
}