Feature/delta team/epic r04 (#7)
CI / test (push) Canceled after 0s

## Summary

epic r04 - begin refactor

## Change Type

- [x] Cowork feature
- [ ] Bug fix
- [ ] Core AI contribution
- [ ] Test / hardening
- [ ] Performance
- [ ] Documentation

## Related Work

Cowork Task:

Core Repo: http://34.143.229.138/gitea-admin/fsg-ai-core-assets

Core AI Issue:

Core Task:

Related PR:

## Scope

What is intentionally included?

What is intentionally NOT included?

## Validation

- [ ] Unit tests
- [ ] Integration tests
- [ ] Manual verification
- [ ] Regression check

Commands / evidence:

## Security Impact

Permission / credential / network / customer data impact:

## Compatibility

- [ ] No breaking change
- [ ] Breaking change documented

## Reviewer Notes

Anything Cowork reviewers should pay attention to.

---------

Co-authored-by: Anh Tran Nguyen Minh <anhtnm1@fpt.com>
Co-authored-by: Huong Le Thi Thien <huongltt35@fpt.com>
Co-authored-by: Nam Pham Dinh Thanh <nampdt@fpt.com>
Co-authored-by: Vu Dam Tuan <vudt15@fpt.com>
Co-authored-by: Hiep Ha Van <hiephv3@fpt.com>
Co-authored-by: Lam Hoang Van <lamhv7@fpt.com>
Reviewed-on: #7
Co-authored-by: Duy Le Huu <duylh19@fpt.com>
This commit was merged in pull request #7.
This commit is contained in:
2026-08-31 05:15:13 +00:00
committed by gitea-admin
co-authored by anhtnm1 huongltt35 Nam Pham Dinh Thanh vudt15 Hiep Ha Van lamhv7
parent 86c27e2e79
commit f9f6bc01fd
496 changed files with 68421 additions and 19688 deletions
+342
View File
@@ -0,0 +1,342 @@
"""Chuỗi hiển thị — phần cowork_tab.
Cắt ra từ ``i18n.py``: một dict 3.000 dòng không mở nổi để sửa một chữ.
Cắt theo mốc phân đoạn có sẵn, nên mỗi cụm vẫn là các màn đi liền nhau.
``i18n.py`` gộp tất cả lại thành ``STRINGS``.
"""
from __future__ import annotations
from typing import Dict
STRINGS: Dict[str, Dict[str, str]] = {
"dashboard.estimated_note": {
"en": "~{pct}% of turns are estimated (~4 chars/token) — the gateway didn't report exact usage.",
"ja": "約{pct}%のターンは推定値(約4文字/トークン)です。",
"vi": "~{pct}% lượt là ước tính (~4 ký tự/token) — gateway không trả về usage chính xác."},
"dashboard.ai_analyze_btn": {"en": "AI analyze", "ja": "AI分析", "vi": "AI phân tích"},
"dashboard.ai_analyzing": {"en": "Analyzing…", "ja": "分析中…", "vi": "Đang phân tích…"},
"dashboard.ai_analyze_tooltip": {
"en": "AI reviews the aggregated numbers (never your prompt contents) and suggests how to prompt better and spend fewer tokens.",
"ja": "集計値のみをAIがレビューし(プロンプト内容は送信しません)、トークン削減のコツを提案します。",
"vi": "AI xem các con số tổng hợp (không gửi nội dung prompt) và gợi ý cách viết prompt tốt hơn, tốn ít token hơn."},
"dashboard.ai_advice_title": {
"en": "AI recommendations", "ja": "AIの提案", "vi": "Khuyến nghị từ AI"},
"dashboard.period_tooltip": {
"en": "Time range for all numbers on this page.", "ja": "このページ全体の集計期間。",
"vi": "Khoảng thời gian tính mọi con số trên trang này."},
"dashboard.source_tooltip": {
"en": "Filter by one task/session, or all.", "ja": "タスク/セッション単位で絞り込み。",
"vi": "Lọc theo 1 task/phiên, hoặc tất cả."},
"dashboard.currency_tooltip": {
"en": "Display currency (rates: fixed USD→VND/JPY, editable in config).",
"ja": "表示通貨(USD→VND/JPYの固定レート、configで変更可)。",
"vi": "Tiền tệ hiển thị (tỉ giá USD→VND/JPY cố định, sửa được trong config)."},
"dashboard.price_in_tooltip": {
"en": "USD per 1M input tokens (your gateway's price).",
"ja": "入力100万トークンあたりのUSD単価。", "vi": "USD cho 1 triệu token input (giá của gateway bạn dùng)."},
"dashboard.price_out_tooltip": {
"en": "USD per 1M output tokens.", "ja": "出力100万トークンあたりのUSD単価。",
"vi": "USD cho 1 triệu token output."},
"dashboard.price_cache_tooltip": {
"en": "USD per 1M cached tokens.", "ja": "キャッシュ100万トークンあたりのUSD単価。",
"vi": "USD cho 1 triệu token cache."},
# ---- cowork_tab.py -------------------------------------------------
"cowork.title": {"en": "Cowork", "ja": "Cowork", "vi": "Cowork"},
"cowork.skills_btn": {"en": "Skills", "ja": "スキル", "vi": "Skills"},
"cowork.skills_tooltip": {
"en": "Add / manage skills the agent follows (or type /skill).",
"ja": "エージェントが従うスキルを追加/管理(/skill と入力も可)。",
"vi": "Thêm/quản lý skill mà agent tuân theo (hoặc gõ /skill)."},
"cowork.new_chat": {"en": "New chat", "ja": "新しいチャット", "vi": "Cuộc trò chuyện mới"},
"cowork.assistant_title": {"en": "Internal Agent", "ja": "内部エージェント", "vi": "Internal Agent"},
"cowork.project_label": {"en": "{name}", "ja": "{name}", "vi": "{name}"},
"cowork.project_tooltip": {
"en": "This thread belongs to project “{name}” — its shared instructions and workspace apply. Manage projects in the Workspace screen.",
"ja": "このスレッドはプロジェクト「{name}」に属します — 共有指示とワークスペースが適用されます。プロジェクトはワークスペース画面で管理できます。",
"vi": "Thread này thuộc project “{name}” — instructions chung và workspace của project được áp dụng. Quản lý project trong màn hình Workspace.",
},
"cowork.pick_folder_btn": {"en": "Local folder…",
"ja": "ローカルフォルダ…",
"vi": "Thư mục Local…"},
"cowork.pick_folder_tooltip": {
"en": "Save Cowork's output directly into a folder you choose, instead of "
"auto-creating a new session folder under Output.",
"ja": "Output 配下に新しいセッションフォルダを自動作成する代わりに、選んだフォルダに直接保存します。",
"vi": "Lưu output của Cowork trực tiếp vào thư mục bạn chọn, thay vì tự tạo "
"folder phiên mới trong Output."},
"cowork.pick_folder_title": {"en": "Choose the Cowork output folder",
"ja": "Cowork の出力フォルダを選択",
"vi": "Chọn thư mục output cho Cowork"},
# ---- code_tab.py -----------------------------------------------
"code.title": {"en": "Code", "ja": "Code", "vi": "Code"},
"code.files_header": {"en": "Files", "ja": "ファイル", "vi": "Files"},
"code.collapse_file_panel": {
"en": "Collapse the file panel", "ja": "ファイルパネルを折りたたむ", "vi": "Thu gọn bảng cây thư mục"},
"code.expand_file_panel": {
"en": "Click to expand the file panel", "ja": "クリックしてファイルパネルを展開",
"vi": "Bấm để mở lại bảng cây thư mục"},
"code.local_btn": {"en": "Local…", "ja": "ローカル…", "vi": "Local…"},
"code.onedrive_btn": {"en": "OneDrive", "ja": "OneDrive", "vi": "OneDrive"},
"code.onedrive_badge": {"en": "OneDrive", "ja": "OneDrive", "vi": "OneDrive"},
"code.auto_run": {"en": "Auto-run", "ja": "自動実行", "vi": "Tự động"},
"code.auto_run_tooltip": {
"en": "On: agent writes files / runs commands automatically. Off: ask before each action.",
"ja": "オン:エージェントが自動でファイル書き込み/コマンド実行。オフ:毎回確認します。",
"vi": "Bật: agent tự ghi file/chạy lệnh. Tắt: hỏi xác nhận trước mỗi thao tác."},
"code.skills_tooltip": {
"en": "Add / set skills for the agent to follow (or type /skill).",
"ja": "エージェントが従うスキルを追加/設定(/skill と入力も可)。",
"vi": "Thêm/đặt skill mà agent tuân theo (hoặc gõ /skill)."},
"code.flow_chk": {"en": "Flow", "ja": "フロー", "vi": "Flow"},
"code.flow_chk_tooltip": {
"en": "Enable the predefined Req→Demo flow feature (off by default).",
"ja": "定義済みの Req→Demo フロー機能を有効化(初期値はオフ)。",
"vi": "Bật tính năng Flow Req→Demo dựng sẵn (mặc định tắt)."},
"code.flow_btn": {"en": "Flow Management", "ja": "Flow Management", "vi": "Flow Management"},
"code.flow_btn_tooltip": {
"en": "Build and run a multi-stage flow from requirement to demo.",
"ja": "要件からデモまでの多段フローを作成・実行します。",
"vi": "Xây dựng và chạy quy trình nhiều bước từ yêu cầu đến bản demo."},
"code.new_session": {"en": "New session", "ja": "新しいセッション", "vi": "Phiên mới"},
"code.cli_tooltip": {
"en": "Open a terminal (CLI) at the current working folder",
"ja": "現在の作業フォルダでターミナル(CLI)を開く",
"vi": "Mở CLI (terminal) tại thư mục làm việc hiện tại"},
"code.cli_not_found": {
"en": "No terminal application was found on this system.",
"ja": "このシステムにはターミナルアプリが見つかりませんでした。",
"vi": "Không tìm thấy ứng dụng terminal nào trên máy này."},
"code.skills_btn_count": {"en": "Skills ({n})", "ja": "スキル ({n})", "vi": "Skills ({n})"},
"code.assistant_title": {"en": "Code agent", "ja": "Code エージェント", "vi": "Code agent"},
"code.plan": {"en": "Plan", "ja": "プラン", "vi": "Plan"},
"code.act": {"en": "Act", "ja": "実行", "vi": "Act"},
"code.mode_toggle_tooltip": {
"en": "Plan = analyze only (no file writes). Act = execute. Auto-switches to Act on gencode.",
"ja": "Plan=分析のみ(書き込みなし)。Act=実行。コード生成指示で自動的に Act に切替。",
"vi": "Plan = chỉ phân tích (không ghi file). Act = thực thi. Tự chuyển sang Act khi phát hiện yêu cầu sinh code."},
"code.act_status": {"en": "Code: Act mode (executes).", "ja": "Code: Act モード(実行)。", "vi": "Code: chế độ Act (thực thi)."},
"code.plan_status": {"en": "Code: Plan mode (analyze only).", "ja": "Code: Plan モード(分析のみ)。", "vi": "Code: chế độ Plan (chỉ phân tích)."},
"code.cloud_sync_suffix": {"en": " — files sync to cloud", "ja": " — クラウドに同期", "vi": " — file sẽ đồng bộ lên cloud"},
"code.mode_auto_status": {"en": "Code: Auto-run mode.", "ja": "Code: 自動実行モード。", "vi": "Code: chế độ Tự động."},
"code.mode_confirm_status": {"en": "Code: Confirm mode.", "ja": "Code: 確認モード。", "vi": "Code: chế độ Xác nhận."},
"code.pick_local_title": {"en": "Choose working folder (Local)", "ja": "作業フォルダを選択(ローカル)", "vi": "Chọn thư mục làm việc (Local)"},
"code.pick_onedrive_title": {"en": "Choose a folder in OneDrive", "ja": "OneDrive 内のフォルダを選択", "vi": "Chọn thư mục trong OneDrive"},
"code.onedrive_choose_folder": {
"en": "Choose a folder in OneDrive…", "ja": "OneDrive 内のフォルダを選択…", "vi": "Chọn thư mục trong OneDrive…"},
"code.no_onedrive": {"en": "No OneDrive detected", "ja": "OneDrive が見つかりません", "vi": "Không phát hiện OneDrive"},
"code.flow_running": {
"en": "Running flow '{name}' (Act) — {n} stages.",
"ja": "フロー「{name}」を実行中(Act)— {n} ステージ。",
"vi": "Đang chạy flow '{name}' (Act) — {n} bước."},
# ---- settings_dialog.py --------------------------------------------
"settings.title": {"en": "Settings", "ja": "設定", "vi": "Cài đặt"},
"settings.active_provider": {"en": "Active provider", "ja": "使用中のプロバイダー", "vi": "Nhà cung cấp đang dùng"},
"settings.theme": {"en": "Theme", "ja": "テーマ", "vi": "Giao diện"},
"settings.theme_dark": {"en": "Dark", "ja": "ダーク", "vi": "Tối"},
"settings.theme_light": {"en": "Light", "ja": "ライト", "vi": "Sáng"},
"settings.theme_system": {"en": "Auto (System)", "ja": "自動(システム)", "vi": "Tự động (theo hệ thống)"},
"settings.language": {"en": "Language", "ja": "言語", "vi": "Ngôn ngữ"},
"settings.tray_keep": {
"en": "Keep running in the system tray when the window is closed",
"ja": "ウィンドウを閉じてもシステムトレイで実行を継続",
"vi": "Giữ chạy nền trong khay hệ thống khi đóng cửa sổ"},
"settings.tray_notify": {
"en": "Show a tray notification when a task finishes or fails",
"ja": "タスク完了/失敗時にトレイ通知を表示",
"vi": "Hiện thông báo khay hệ thống khi tác vụ xong hoặc lỗi"},
"settings.group.openai": {"en": "OpenAI-compatible (Internal Gateway)", "ja": "OpenAI 互換(社内ゲートウェイ)", "vi": "OpenAI-compatible (Gateway nội bộ)"},
"settings.group.anthropic": {"en": "Anthropic Claude", "ja": "Anthropic Claude", "vi": "Anthropic Claude"},
# Name for the language/tray block at the top of Settings — it had none,
# because until the index existed nothing had to refer to it.
"settings.group.general": {"en": "General", "ja": "一般", "vi": "Chung"},
"settings.group.provider": {"en": "AI Provider", "ja": "AI プロバイダー", "vi": "Nhà cung cấp AI"},
"settings.group.parameter": {"en": "Parameter", "ja": "Parameter", "vi": "Parameter"},
"settings.param_section_pricing": {
"en": "Model pricing", "ja": "モデル価格", "vi": "Bảng giá model"},
"settings.pricing_url_label": {
"en": "Pricing reference link", "ja": "価格表の参考リンク", "vi": "Link bảng giá tham khảo"},
"settings.pricing_url_placeholder": {
"en": "https://… (the provider's public price list)",
"ja": "https://…(プロバイダーの公開価格表)",
"vi": "https://… (trang bảng giá công khai của provider)"},
"settings.pricing_url_tooltip": {
"en": "Shown as a reference link beside the Monitoring pricing table. Prices themselves are entered by hand in that table.",
"ja": "監視画面の価格表の横に参考リンクとして表示されます。価格自体は表に手入力します。",
"vi": "Hiển thị làm link tham khảo cạnh bảng giá trong Monitoring. Giá vẫn do Admin nhập tay vào bảng."},
"settings.group.accounts": {
"en": "Shared accounts folder", "ja": "共有アカウントフォルダー", "vi": "Thư mục tài khoản dùng chung"},
"settings.accounts_dir_label": {"en": "Folder", "ja": "フォルダー", "vi": "Thư mục"},
"settings.accounts_dir_placeholder": {
"en": "OneDrive/network folder holding the shared accounts & groups",
"ja": "アカウント/グループを保存する OneDrive・共有フォルダー",
"vi": "Thư mục OneDrive/mạng chứa danh sách tài khoản & nhóm dùng chung"},
"settings.accounts_dir_hint": {
"en": "Where accounts, groups and shared telemetry live. Every machine must point at the SAME folder.",
"ja": "アカウント・グループ・共有テレメトリの保存先。全マシンで同じフォルダーを指定してください。",
"vi": "Nơi lưu tài khoản, nhóm và telemetry dùng chung. Mọi máy phải trỏ về CÙNG một thư mục."},
"settings.accounts_dir_admin_only": {
"en": "Only an Admin can change this folder.",
"ja": "このフォルダーを変更できるのは管理者のみです。",
"vi": "Chỉ Admin mới thay đổi được thư mục này."},
"settings.group.monitoring_visibility": {
"en": "Monitoring tab visibility (Sub-admin)", "ja": "モニタリングタブの表示(サブ管理者)",
"vi": "Hiển thị tab Monitoring (Sub-admin)"},
"settings.mv_security_events": {"en": "Security Events", "ja": "セキュリティイベント",
"vi": "Security Events"},
"settings.mv_mcp_history": {"en": "MCP Call History", "ja": "MCP 呼び出し履歴", "vi": "MCP Call History"},
"settings.mv_action_logs": {"en": "Action Logs", "ja": "アクションログ", "vi": "Action Logs"},
"settings.mv_agent_status": {"en": "Agent Status", "ja": "エージェント状態", "vi": "Trạng thái Agent"},
"settings.mv_hint": {
"en": "Admin always sees every Monitoring tab. Turn one off here to hide it from Sub-admin too (it stays available to Admin).",
"ja": "管理者は常にすべてのタブを見られます。ここでオフにすると、そのタブはサブ管理者からも隠されます(管理者には影響しません)。",
"vi": "Admin luôn thấy mọi tab Monitoring. Tắt một mục ở đây sẽ ẩn tab đó với Sub-admin (Admin vẫn thấy như thường)."},
"settings.sec_unlock_user_placeholder": {
"en": "Admin account", "ja": "管理者アカウント", "vi": "Tài khoản admin"},
"settings.sec_unlock_code_placeholder": {
"en": "Access code", "ja": "アクセスコード", "vi": "Mã truy cập"},
"settings.sec_unlock_btn": {"en": "Unlock", "ja": "ロック解除", "vi": "Mở khóa"},
"settings.sec_locked_hint": {
"en": "Locked — enter an Admin account + access code to change these settings.",
"ja": "ロック中 — 変更するには管理者アカウントとアクセスコードを入力してください。",
"vi": "Đang khóa — nhập tài khoản Admin + mã truy cập để thay đổi các thiết lập này."},
"settings.sec_unlocked_hint": {
"en": "Unlocked — changes will be saved; the group locks again after Save.",
"ja": "ロック解除中 — 保存後に再びロックされます。",
"vi": "Đã mở khóa — thay đổi sẽ được lưu; nhóm sẽ tự khóa lại sau khi Save."},
"settings.sec_unlock_failed": {
"en": "Not an Admin account (or wrong code / accounts folder unreachable).",
"ja": "管理者アカウントではありません(またはコード誤り・フォルダー未接続)。",
"vi": "Không phải tài khoản Admin (hoặc sai mã / không truy cập được thư mục tài khoản)."},
"settings.sec_no_lock_hint": {
"en": "No shared accounts folder configured yet — the group is editable without an admin unlock.",
"ja": "共有アカウントフォルダー未設定のため、ロックなしで編集できます。",
"vi": "Chưa cấu hình thư mục tài khoản dùng chung — nhóm này đang chỉnh sửa được mà không cần mở khóa."},
"settings.base_url": {"en": "Base URL", "ja": "ベース URL", "vi": "Base URL"},
"settings.api_key": {"en": "API Key", "ja": "API キー", "vi": "API Key"},
"settings.model": {"en": "Model", "ja": "モデル", "vi": "Model"},
"settings.load": {"en": "Load", "ja": "読み込み", "vi": "Tải"},
"settings.load_tooltip": {
"en": "Fetch the available models/agents from this provider",
"ja": "このプロバイダーから利用可能なモデル/エージェントを取得",
"vi": "Lấy danh sách model/agent khả dụng từ nhà cung cấp này"},
"settings.group.teams": {"en": "Microsoft Teams", "ja": "Microsoft Teams", "vi": "Microsoft Teams"},
"settings.teams_webhook": {"en": "Webhook URL", "ja": "Webhook URL", "vi": "Webhook URL"},
"settings.teams_webhook_placeholder": {
"en": "https://… (Workflows or Incoming Webhook URL)",
"ja": "https://…(Workflows または Incoming Webhook の URL)",
"vi": "https://… (URL của Workflows hoặc Incoming Webhook)"},
"settings.teams_test": {"en": "Test", "ja": "テスト", "vi": "Kiểm tra"},
"settings.teams_notify": {
"en": "Auto-send to Teams when a task completes", "ja": "タスク完了時に Teams へ自動送信",
"vi": "Tự động gửi sang Teams khi tác vụ hoàn thành"},
"settings.teams_hint": {
"en": ("Get a webhook: Teams channel → ⋯ → Connectors → Incoming Webhook, "
"OR Power Automate → 'When a HTTP request is received' → 'Post message in a chat or channel'. "
"URL must contain logic.azure.com or webhook.office.com."),
"ja": ("Webhook の取得: Teams チャンネル → ⋯ → コネクタ → Incoming Webhook、"
"または Power Automate → 'HTTP要求の受信時' → 'チャットまたはチャネルにメッセージを投稿'。"
"URL には logic.azure.com か webhook.office.com を含める必要があります。"),
"vi": ("Lấy webhook: kênh Teams → ⋯ → Connectors → Incoming Webhook, "
"HOẶC Power Automate → 'When a HTTP request is received' → 'Post message in a chat or channel'. "
"URL phải chứa logic.azure.com hoặc webhook.office.com.")},
"settings.group.ms365": {
"en": "Microsoft 365 connections", "ja": "Microsoft 365 連携",
"vi": "Kết nối Microsoft 365"},
"settings.ms365_unlock_code": {"en": "Unlock code", "ja": "解除コード", "vi": "Mã mở khóa"},
"settings.ms365_unlock_placeholder": {
"en": "Enter the unlock code", "ja": "解除コードを入力",
"vi": "Nhập mã để mở khóa"},
"settings.ms365_unlock_btn": {"en": "Unlock", "ja": "解除", "vi": "Mở khóa"},
"settings.ms365_locked_hint": {
"en": "Locked — enter the unlock code above to edit this section.",
"ja": "ロック中 — このセクションを編集するには上の解除コードを入力してください。",
"vi": "Đang khóa — nhập mã ở trên để chỉnh sửa mục này."},
"settings.ms365_unlocked_hint": {
"en": "Unlocked — remember to click Save; this section re-locks automatically afterward.",
"ja": "解除しました — 保存を忘れずに。保存後は自動的に再ロックされます。",
"vi": "Đã mở khóa — nhớ bấm Save; mục này sẽ tự khóa lại ngay sau đó."},
"settings.ms365_wrong_code": {
"en": "Wrong code.", "ja": "コードが違います。", "vi": "Mã không đúng."},
"settings.ms365_connector.outlook": {"en": "Outlook", "ja": "Outlook", "vi": "Outlook"},
"settings.ms365_connector.teams": {"en": "Teams", "ja": "Teams", "vi": "Teams"},
"settings.ms365_connector.onedrive": {"en": "OneDrive", "ja": "OneDrive", "vi": "OneDrive"},
"settings.ms365_connector.sharepoint": {"en": "SharePoint", "ja": "SharePoint", "vi": "SharePoint"},
"settings.ms365_connector.meeting_transcript": {
"en": "Meeting transcript", "ja": "会議の文字起こし", "vi": "Meeting transcript"},
"settings.ms365_allow_internet": {
"en": "Allow external internet access", "ja": "外部インターネットアクセスを許可",
"vi": "Cho phép truy cập Internet bên ngoài"},
"settings.ms365_internet_off_hint": {
"en": ("External internet access is OFF — every connector was turned off to avoid "
"leaking data outside. Turn it back on, then re-tick the connectors you want."),
"ja": ("外部インターネットアクセスがオフです — データが外部に漏れないよう、すべてのコネクタ"
"がオフになりました。再度オンにしてから、必要なコネクタを選び直してください。"),
"vi": ("Đã tắt truy cập Internet bên ngoài — mọi connector đã tự tắt để tránh rò rỉ "
"thông tin ra ngoài. Bật lại rồi tick lại từng connector muốn dùng.")},
"settings.ms365_signin_btn": {"en": "Sign in with Microsoft", "ja": "Microsoft でサインイン",
"vi": "Đăng nhập Microsoft"},
"settings.ms365_signout_btn": {"en": "Sign out", "ja": "サインアウト", "vi": "Đăng xuất"},
"settings.ms365_not_signed_in": {
"en": "Not signed in to Microsoft 365.", "ja": "Microsoft 365 にサインインしていません。",
"vi": "Chưa đăng nhập Microsoft 365."},
"settings.ms365_signed_in_as": {
"en": "Signed in as {user}", "ja": "{user} としてサインイン中",
"vi": "Đã đăng nhập với {user}"},
"settings.ms365_missing_ids": {
"en": "Enter the Tenant ID and Client ID first.", "ja": "先に Tenant ID と Client ID を入力してください。",
"vi": "Hãy nhập Tenant ID và Client ID trước."},
"settings.ms365_signing_in": {
"en": "Starting sign-in…", "ja": "サインインを開始しています…", "vi": "Đang bắt đầu đăng nhập…"},
"settings.ms365_signin_failed": {
"en": "Sign-in failed: {err}", "ja": "サインインに失敗しました: {err}",
"vi": "Đăng nhập thất bại: {err}"},
"settings.ms365_teams_link_label": {
"en": "Or just paste a Teams channel/chat link — no ID needed:",
"ja": "または Teams のチャネル/チャットのリンクを貼り付けるだけ — ID は不要です:",
"vi": "Hoặc chỉ cần paste link kênh/chat Teams — không cần ID:"},
"settings.ms365_teams_link_placeholder": {
"en": "Paste a link from Teams ('Get link to channel' or a message's 'Copy link')",
"ja": "Teams のリンクを貼り付け(「チャネルへのリンクを取得」またはメッセージの「リンクをコピー」)",
"vi": "Dán link từ Teams ('Get link to channel' hoặc 'Copy link' của 1 tin nhắn)"},
"settings.ms365_teams_connect_btn": {"en": "Connect", "ja": "接続", "vi": "Kết nối"},
"settings.ms365_teams_not_connected": {
"en": "No Teams chat/channel connected yet.", "ja": "Teams のチャット/チャネルはまだ接続されていません。",
"vi": "Chưa kết nối chat/kênh Teams nào."},
"settings.ms365_teams_connected_channel": {
"en": "Connected to a Teams channel.", "ja": "Teams のチャネルに接続済みです。",
"vi": "Đã kết nối vào một kênh Teams."},
"settings.ms365_teams_connected_chat": {
"en": "Connected to a Teams chat.", "ja": "Teams のチャットに接続済みです。",
"vi": "Đã kết nối vào một đoạn chat Teams."},
"settings.ms365_teams_link_missing": {
"en": "Paste a Teams link first.", "ja": "先に Teams のリンクを貼り付けてください。",
"vi": "Hãy dán link Teams trước."},
"settings.ms365_teams_connecting": {
"en": "Connecting…", "ja": "接続しています…", "vi": "Đang kết nối…"},
"settings.ms365_teams_connect_failed": {
"en": "Connect failed: {err}", "ja": "接続に失敗しました: {err}",
"vi": "Kết nối thất bại: {err}"},
"settings.ms365_teams_intro_message": {
"en": "Hi, I'm the Cowork agent — just connected to this chat/channel.",
"ja": "こんにちは、Cowork エージェントです — このチャット/チャネルに接続しました。",
"vi": "Xin chào, mình là Cowork agent — vừa kết nối vào chat/kênh này."},
"settings.group.agent_security": {
"en": "Agent Security (AI)", "ja": "エージェント セキュリティ(AI)",
"vi": "Agent Security (AI)"},
"settings.group.sandbox": {
"en": "Sandbox Security Layer", "ja": "サンドボックス セキュリティ層",
"vi": "Sandbox Security Layer"},
"settings.sandbox_confirm_commands": {
"en": "Confirm before Cowork runs a command",
"ja": "Cowork がコマンドを実行する前に確認する",
"vi": "Xác nhận trước khi Cowork chạy lệnh"},
"settings.sandbox_confirm_commands_tooltip": {
"en": ("Shows an Approve/Reject dialog before run_command/install_package "
"executes in Cowork — off by default (auto-run), same as before."),
"ja": "Cowork で run_command/install_package を実行する前に承認/拒否ダイアログを表示します — "
"デフォルトはオフ(自動実行)で、これまでと同じです。",
"vi": "Hiện hộp thoại Duyệt/Từ chối trước khi Cowork chạy run_command/install_package — "
"mặc định tắt (tự chạy), giống hành vi cũ."},
}