diff --git a/ui/desktop/frontend/src/i18n/index.ts b/ui/desktop/frontend/src/i18n/index.ts index f4a6683f..e41a6bb2 100644 --- a/ui/desktop/frontend/src/i18n/index.ts +++ b/ui/desktop/frontend/src/i18n/index.ts @@ -17,6 +17,7 @@ import enSessions from './locales/en/sessions.json' import enDesktop from './locales/en/desktop.json' import enTeams from './locales/en/teams.json' import enChannels from './locales/en/channels.json' +import enTts from './locales/en/tts.json' // --- VI namespaces --- import viCommon from './locales/vi/common.json' @@ -34,6 +35,7 @@ import viSessions from './locales/vi/sessions.json' import viDesktop from './locales/vi/desktop.json' import viTeams from './locales/vi/teams.json' import viChannels from './locales/vi/channels.json' +import viTts from './locales/vi/tts.json' // --- ZH namespaces --- import zhCommon from './locales/zh/common.json' @@ -51,6 +53,7 @@ import zhSessions from './locales/zh/sessions.json' import zhDesktop from './locales/zh/desktop.json' import zhTeams from './locales/zh/teams.json' import zhChannels from './locales/zh/channels.json' +import zhTts from './locales/zh/tts.json' const STORAGE_KEY = 'goclaw:language' @@ -69,22 +72,22 @@ i18n.use(initReactI18next).init({ common: enCommon, chat: enChat, agents: enAgents, providers: enProviders, skills: enSkills, cron: enCron, mcp: enMcp, tools: enTools, traces: enTraces, memory: enMemory, storage: enStorage, sessions: enSessions, - desktop: enDesktop, teams: enTeams, channels: enChannels, + desktop: enDesktop, teams: enTeams, channels: enChannels, tts: enTts, }, vi: { common: viCommon, chat: viChat, agents: viAgents, providers: viProviders, skills: viSkills, cron: viCron, mcp: viMcp, tools: viTools, traces: viTraces, memory: viMemory, storage: viStorage, sessions: viSessions, - desktop: viDesktop, teams: viTeams, channels: viChannels, + desktop: viDesktop, teams: viTeams, channels: viChannels, tts: viTts, }, zh: { common: zhCommon, chat: zhChat, agents: zhAgents, providers: zhProviders, skills: zhSkills, cron: zhCron, mcp: zhMcp, tools: zhTools, traces: zhTraces, memory: zhMemory, storage: zhStorage, sessions: zhSessions, - desktop: zhDesktop, teams: zhTeams, channels: zhChannels, + desktop: zhDesktop, teams: zhTeams, channels: zhChannels, tts: zhTts, }, }, - ns: ['common', 'chat', 'agents', 'providers', 'skills', 'cron', 'mcp', 'tools', 'traces', 'memory', 'storage', 'sessions', 'desktop', 'teams', 'channels'], + ns: ['common', 'chat', 'agents', 'providers', 'skills', 'cron', 'mcp', 'tools', 'traces', 'memory', 'storage', 'sessions', 'desktop', 'teams', 'channels', 'tts'], defaultNS: 'common', lng: getInitialLanguage(), fallbackLng: 'en', diff --git a/ui/desktop/frontend/src/i18n/locales/en/tools.json b/ui/desktop/frontend/src/i18n/locales/en/tools.json index 9b9525be..bbd68ebf 100644 --- a/ui/desktop/frontend/src/i18n/locales/en/tools.json +++ b/ui/desktop/frontend/src/i18n/locales/en/tools.json @@ -206,6 +206,24 @@ "skill_search": "Search for available skills by keyword or description to find relevant capabilities", "use_skill": "Activate a skill to use its specialized capabilities (tracing marker)", "team_tasks": "View, create, update, and complete tasks on the team task board" + }, + "sttForm": { + "title": "STT Settings", + "description": "Configure speech-to-text providers for transcribing voice messages.", + "providersLabel": "Providers", + "elevenlabsSectionTitle": "ElevenLabs", + "elevenlabsApiKeyLabel": "API Key", + "elevenlabsDefaultLanguageLabel": "Default Language", + "proxySectionTitle": "Proxy", + "proxyUrlLabel": "Proxy URL", + "proxyApiKeyLabel": "Proxy API Key", + "proxyTenantIdLabel": "Proxy Tenant ID", + "whatsappEnabledLabel": "Enable STT for WhatsApp", + "whatsappPrivacyWarning": "Enabling STT for WhatsApp breaks end-to-end encryption for voice messages sent to this agent.", + "providersRequiredError": "At least one provider must be selected.", + "cancel": "Cancel", + "save": "Save", + "saving": "Saving..." } } } diff --git a/ui/desktop/frontend/src/i18n/locales/en/tts.json b/ui/desktop/frontend/src/i18n/locales/en/tts.json new file mode 100644 index 00000000..7304837a --- /dev/null +++ b/ui/desktop/frontend/src/i18n/locales/en/tts.json @@ -0,0 +1,81 @@ +{ + "title": "Text-to-Speech", + "description": "Configure TTS providers and auto-apply settings", + "save": "Save", + "saving": "Saving...", + "saveChanges": "Save Changes", + "status": { + "title": "Status", + "configured": "Configured", + "disabled": "Disabled", + "noProvider": "No TTS provider configured", + "activeProvider": "Primary provider: {{provider}}, Auto: {{auto}}" + }, + "general": { + "title": "General Settings", + "primaryProvider": "Primary Provider", + "autoApplyMode": "Auto-Apply Mode", + "replyMode": "Reply Mode", + "maxTextLength": "Max Text Length", + "timeout": "Timeout (ms)" + }, + "providers": { + "none": "None (Disabled)", + "openai": "OpenAI", + "elevenlabs": "ElevenLabs", + "edge": "Edge (Free)", + "minimax": "MiniMax" + }, + "autoModes": { + "off": "Off", + "offDesc": "Agent can use TTS tool manually", + "always": "Always", + "alwaysDesc": "All replies get audio", + "inbound": "Inbound", + "inboundDesc": "Only when user sends voice/audio", + "tagged": "Tagged", + "taggedDesc": "Only when reply contains [[tts]] tag" + }, + "replyModes": { + "final": "Final only", + "finalDesc": "Only final replies", + "all": "All", + "allDesc": "All replies including tool/block" + }, + "providerSettings": "{{provider}} Settings", + "openai": { + "apiKey": "API Key", + "apiBase": "API Base URL", + "model": "Model", + "voice": "Voice" + }, + "elevenlabs": { + "apiKey": "API Key", + "baseUrl": "Base URL", + "voiceId": "Voice ID", + "modelId": "Model ID" + }, + "edge": { + "voice": "Voice", + "speechRate": "Speech Rate", + "hint": "Edge TTS is free and requires no API key. Install with: pip install edge-tts" + }, + "minimax": { + "apiKey": "API Key", + "groupId": "Group ID *", + "groupIdPlaceholder": "Required for MiniMax", + "apiBase": "API Base", + "model": "Model", + "voiceId": "Voice ID" + }, + "voice_label": "Voice", + "voice_placeholder": "Select a voice…", + "voice_refresh": "Refresh", + "voice_preview": "Preview", + "voice_stop_preview": "Stop", + "voice_no_voices": "No voices available", + "voice_loading": "Loading voices…", + "voice_preview_error": "Preview failed — refreshing list", + "model_label": "Model", + "model_placeholder": "Default (tenant/system)" +} diff --git a/ui/desktop/frontend/src/i18n/locales/vi/tools.json b/ui/desktop/frontend/src/i18n/locales/vi/tools.json index 59b491dc..26e17351 100644 --- a/ui/desktop/frontend/src/i18n/locales/vi/tools.json +++ b/ui/desktop/frontend/src/i18n/locales/vi/tools.json @@ -206,6 +206,24 @@ "skill_search": "Tìm kiếm skill khả dụng theo từ khóa hoặc mô tả để tìm khả năng phù hợp", "use_skill": "Kích hoạt skill để sử dụng khả năng chuyên biệt (đánh dấu tracing)", "team_tasks": "Xem, tạo, cập nhật và hoàn thành tác vụ trên bảng tác vụ nhóm" + }, + "sttForm": { + "title": "Cài đặt STT", + "description": "Cấu hình provider chuyển giọng nói thành văn bản.", + "providersLabel": "Provider", + "elevenlabsSectionTitle": "ElevenLabs", + "elevenlabsApiKeyLabel": "API Key", + "elevenlabsDefaultLanguageLabel": "Ngôn ngữ mặc định", + "proxySectionTitle": "Proxy", + "proxyUrlLabel": "URL Proxy", + "proxyApiKeyLabel": "API Key Proxy", + "proxyTenantIdLabel": "Tenant ID Proxy", + "whatsappEnabledLabel": "Bật STT cho WhatsApp", + "whatsappPrivacyWarning": "Bật STT cho WhatsApp sẽ phá vỡ mã hóa đầu cuối cho tin nhắn thoại gửi đến agent này.", + "providersRequiredError": "Phải chọn ít nhất một provider.", + "cancel": "Hủy", + "save": "Lưu", + "saving": "Đang lưu..." } } } diff --git a/ui/desktop/frontend/src/i18n/locales/vi/tts.json b/ui/desktop/frontend/src/i18n/locales/vi/tts.json new file mode 100644 index 00000000..b9760095 --- /dev/null +++ b/ui/desktop/frontend/src/i18n/locales/vi/tts.json @@ -0,0 +1,81 @@ +{ + "title": "Chuyển văn bản thành giọng nói", + "description": "Cấu hình provider TTS và cài đặt tự động", + "save": "Lưu", + "saving": "Đang lưu...", + "saveChanges": "Lưu thay đổi", + "status": { + "title": "Trạng thái", + "configured": "Đã cấu hình", + "disabled": "Đã tắt", + "noProvider": "Chưa cấu hình provider TTS", + "activeProvider": "Provider đang hoạt động: {{provider}}, Tự động: {{auto}}" + }, + "general": { + "title": "Cài đặt chung", + "primaryProvider": "Provider chính", + "autoApplyMode": "Chế độ tự động phát", + "replyMode": "Chế độ trả lời", + "maxTextLength": "Độ dài text tối đa", + "timeout": "Thời gian chờ (ms)" + }, + "providers": { + "none": "Không có (Tắt)", + "openai": "OpenAI", + "elevenlabs": "ElevenLabs", + "edge": "Edge (Miễn phí)", + "minimax": "MiniMax" + }, + "autoModes": { + "off": "Tắt", + "offDesc": "Agent có thể dùng công cụ TTS thủ công", + "always": "Luôn luôn", + "alwaysDesc": "Tất cả phản hồi đều có âm thanh", + "inbound": "Đầu vào", + "inboundDesc": "Chỉ khi người dùng gửi giọng nói/âm thanh", + "tagged": "Đánh dấu", + "taggedDesc": "Chỉ khi phản hồi chứa thẻ [[tts]]" + }, + "replyModes": { + "final": "Chỉ phản hồi cuối", + "finalDesc": "Chỉ phản hồi cuối cùng", + "all": "Tất cả", + "allDesc": "Tất cả phản hồi bao gồm công cụ/khối" + }, + "providerSettings": "Cài đặt {{provider}}", + "openai": { + "apiKey": "API Key", + "apiBase": "API Base URL", + "model": "Model", + "voice": "Giọng nói" + }, + "elevenlabs": { + "apiKey": "API Key", + "baseUrl": "Base URL", + "voiceId": "Voice ID", + "modelId": "Model ID" + }, + "edge": { + "voice": "Giọng nói", + "speechRate": "Tốc độ nói", + "hint": "Edge TTS miễn phí, không cần API key. Cài đặt: pip install edge-tts" + }, + "minimax": { + "apiKey": "API Key", + "groupId": "Group ID *", + "groupIdPlaceholder": "Bắt buộc cho MiniMax", + "apiBase": "API Base", + "model": "Model", + "voiceId": "Voice ID" + }, + "voice_label": "Giọng đọc", + "voice_placeholder": "Chọn giọng đọc…", + "voice_refresh": "Làm mới", + "voice_preview": "Nghe thử", + "voice_stop_preview": "Dừng", + "voice_no_voices": "Chưa có giọng đọc", + "voice_loading": "Đang tải giọng đọc…", + "voice_preview_error": "Không nghe thử được — đang làm mới", + "model_label": "Mô hình", + "model_placeholder": "Mặc định (tenant/hệ thống)" +} diff --git a/ui/desktop/frontend/src/i18n/locales/zh/tools.json b/ui/desktop/frontend/src/i18n/locales/zh/tools.json index 384d0684..8229f535 100644 --- a/ui/desktop/frontend/src/i18n/locales/zh/tools.json +++ b/ui/desktop/frontend/src/i18n/locales/zh/tools.json @@ -142,6 +142,24 @@ "skill_search": "按关键字或描述搜索可用Skill以找到相关能力", "use_skill": "激活Skill以使用其专业能力(追踪标记)", "team_tasks": "查看、创建、更新和完成团队任务板上的任务" + }, + "sttForm": { + "title": "STT 设置", + "description": "配置语音转文字 Provider 以转录语音消息。", + "providersLabel": "Provider", + "elevenlabsSectionTitle": "ElevenLabs", + "elevenlabsApiKeyLabel": "API Key", + "elevenlabsDefaultLanguageLabel": "默认语言", + "proxySectionTitle": "代理", + "proxyUrlLabel": "代理 URL", + "proxyApiKeyLabel": "代理 API Key", + "proxyTenantIdLabel": "代理 Tenant ID", + "whatsappEnabledLabel": "为 WhatsApp 启用 STT", + "whatsappPrivacyWarning": "为 WhatsApp 启用 STT 将破坏发送给此 Agent 的语音消息的端对端加密。", + "providersRequiredError": "必须至少选择一个 Provider。", + "cancel": "取消", + "save": "保存", + "saving": "保存中..." } }, "custom": { diff --git a/ui/desktop/frontend/src/i18n/locales/zh/tts.json b/ui/desktop/frontend/src/i18n/locales/zh/tts.json new file mode 100644 index 00000000..b6f2811d --- /dev/null +++ b/ui/desktop/frontend/src/i18n/locales/zh/tts.json @@ -0,0 +1,81 @@ +{ + "title": "语音合成", + "description": "配置 TTS Provider和自动应用设置", + "save": "保存", + "saving": "保存中...", + "saveChanges": "保存更改", + "status": { + "title": "状态", + "configured": "已配置", + "disabled": "已禁用", + "noProvider": "未配置 TTS Provider", + "activeProvider": "主要Provider:{{provider}},自动:{{auto}}" + }, + "general": { + "title": "常规设置", + "primaryProvider": "主要Provider", + "autoApplyMode": "自动应用模式", + "replyMode": "回复模式", + "maxTextLength": "最大文本长度", + "timeout": "超时(毫秒)" + }, + "providers": { + "none": "无(已禁用)", + "openai": "OpenAI", + "elevenlabs": "ElevenLabs", + "edge": "Edge(免费)", + "minimax": "MiniMax" + }, + "autoModes": { + "off": "关闭", + "offDesc": "Agent可手动使用 TTS 工具", + "always": "始终", + "alwaysDesc": "所有回复均生成音频", + "inbound": "入站", + "inboundDesc": "仅当用户发送语音/音频时", + "tagged": "标记", + "taggedDesc": "仅当回复包含 [[tts]] 标签时" + }, + "replyModes": { + "final": "仅最终回复", + "finalDesc": "仅最终回复", + "all": "全部", + "allDesc": "包括工具/块在内的所有回复" + }, + "providerSettings": "{{provider}} 设置", + "openai": { + "apiKey": "API Key", + "apiBase": "API Base URL", + "model": "模型", + "voice": "语音" + }, + "elevenlabs": { + "apiKey": "API Key", + "baseUrl": "Base URL", + "voiceId": "Voice ID", + "modelId": "Model ID" + }, + "edge": { + "voice": "语音", + "speechRate": "语速", + "hint": "Edge TTS 免费且无需 API Key。安装方式:pip install edge-tts" + }, + "minimax": { + "apiKey": "API Key", + "groupId": "Group ID *", + "groupIdPlaceholder": "MiniMax 必填", + "apiBase": "API Base", + "model": "模型", + "voiceId": "Voice ID" + }, + "voice_label": "声音", + "voice_placeholder": "选择声音…", + "voice_refresh": "刷新", + "voice_preview": "试听", + "voice_stop_preview": "停止", + "voice_no_voices": "暂无声音", + "voice_loading": "加载声音中…", + "voice_preview_error": "试听失败 — 正在刷新", + "model_label": "模型", + "model_placeholder": "默认(租户/系统)" +}