消息渠道的消息支持多语言

This commit is contained in:
xintaofei
2026-03-31 13:49:16 +08:00
parent f2a53acc9d
commit f06360a59d
24 changed files with 1319 additions and 102 deletions

View File

@@ -0,0 +1,91 @@
"use client"
import { useCallback, useEffect, useState } from "react"
import { Loader2 } from "lucide-react"
import { useTranslations } from "next-intl"
import { toast } from "sonner"
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"
import { getChatMessageLanguage, setChatMessageLanguage } from "@/lib/api"
const SUPPORTED_LANGUAGES = [
"en",
"zh-cn",
"zh-tw",
"ja",
"ko",
"es",
"de",
"fr",
"pt",
"ar",
] as const
export function ChannelOtherTab() {
const t = useTranslations("ChatChannelSettings.language")
const [language, setLanguage] = useState("en")
const [loading, setLoading] = useState(true)
const [saving, setSaving] = useState(false)
useEffect(() => {
getChatMessageLanguage()
.then((lang) => setLanguage(lang))
.catch(() => {})
.finally(() => setLoading(false))
}, [])
const handleLanguageChange = useCallback(
async (value: string) => {
setSaving(true)
try {
await setChatMessageLanguage(value)
setLanguage(value)
toast.success(t("saved"))
} catch {
toast.error(t("saveFailed"))
} finally {
setSaving(false)
}
},
[t]
)
if (loading) {
return (
<div className="h-full flex items-center justify-center text-sm text-muted-foreground gap-2">
<Loader2 className="h-4 w-4 animate-spin" />
</div>
)
}
return (
<div className="space-y-6">
<section className="space-y-2">
<h3 className="text-sm font-medium">{t("title")}</h3>
<p className="text-xs text-muted-foreground">{t("description")}</p>
<Select
value={language}
onValueChange={handleLanguageChange}
disabled={saving}
>
<SelectTrigger className="w-56">
<SelectValue />
</SelectTrigger>
<SelectContent>
{SUPPORTED_LANGUAGES.map((lang) => (
<SelectItem key={lang} value={lang}>
{t(lang)}
</SelectItem>
))}
</SelectContent>
</Select>
</section>
</div>
)
}

View File

@@ -6,6 +6,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { ChannelListTab } from "./channel-list-tab"
import { ChannelCommandsTab } from "./channel-commands-tab"
import { ChannelEventsTab } from "./channel-events-tab"
import { ChannelOtherTab } from "./channel-other-tab"
export function ChatChannelSettings() {
const t = useTranslations("ChatChannelSettings")
@@ -24,6 +25,7 @@ export function ChatChannelSettings() {
<TabsTrigger value="channels">{t("tabs.channels")}</TabsTrigger>
<TabsTrigger value="commands">{t("tabs.commands")}</TabsTrigger>
<TabsTrigger value="events">{t("tabs.events")}</TabsTrigger>
<TabsTrigger value="other">{t("tabs.other")}</TabsTrigger>
</TabsList>
</section>
@@ -36,6 +38,9 @@ export function ChatChannelSettings() {
<TabsContent value="events" className="mt-0">
<ChannelEventsTab />
</TabsContent>
<TabsContent value="other" className="mt-0">
<ChannelOtherTab />
</TabsContent>
</Tabs>
</div>
)

View File

@@ -1713,7 +1713,8 @@
"tabs": {
"channels": "القنوات",
"commands": "الأوامر",
"events": "الأحداث"
"events": "الأحداث",
"other": "أخرى"
},
"commands": {
"title": "الأوامر المدمجة",
@@ -1740,6 +1741,22 @@
"errorDesc": "عندما يواجه الوكيل خطأ",
"saved": "تم تحديث فلتر الأحداث.",
"saveFailed": "فشل حفظ فلتر الأحداث."
},
"language": {
"title": "لغة الرسائل",
"description": "اللغة المستخدمة لإشعارات الأحداث واستجابات الأوامر والتقارير اليومية المرسلة إلى قنوات الدردشة.",
"saved": "تم حفظ لغة الرسائل.",
"saveFailed": "فشل حفظ لغة الرسائل.",
"en": "الإنجليزية",
"zh-cn": "الصينية المبسطة",
"zh-tw": "الصينية التقليدية",
"ja": "اليابانية",
"ko": "الكورية",
"es": "الإسبانية",
"de": "الألمانية",
"fr": "الفرنسية",
"pt": "البرتغالية",
"ar": "العربية"
}
}
}

View File

@@ -1713,7 +1713,8 @@
"tabs": {
"channels": "Kanäle",
"commands": "Befehle",
"events": "Ereignisse"
"events": "Ereignisse",
"other": "Sonstiges"
},
"commands": {
"title": "Integrierte Befehle",
@@ -1740,6 +1741,22 @@
"errorDesc": "Wenn ein Agent einen Fehler feststellt",
"saved": "Ereignisfilter aktualisiert.",
"saveFailed": "Fehler beim Speichern des Ereignisfilters."
},
"language": {
"title": "Nachrichtensprache",
"description": "Sprache für Ereignisbenachrichtigungen, Befehlsantworten und tägliche Berichte, die an Chat-Kanäle gesendet werden.",
"saved": "Nachrichtensprache gespeichert.",
"saveFailed": "Fehler beim Speichern der Nachrichtensprache.",
"en": "Englisch",
"zh-cn": "Vereinfachtes Chinesisch",
"zh-tw": "Traditionelles Chinesisch",
"ja": "Japanisch",
"ko": "Koreanisch",
"es": "Spanisch",
"de": "Deutsch",
"fr": "Französisch",
"pt": "Portugiesisch",
"ar": "Arabisch"
}
}
}

View File

@@ -1714,7 +1714,8 @@
"tabs": {
"channels": "Channels",
"commands": "Commands",
"events": "Events"
"events": "Events",
"other": "Other"
},
"commands": {
"title": "Built-in Commands",
@@ -1741,6 +1742,22 @@
"errorDesc": "When an agent encounters an error",
"saved": "Event filter updated.",
"saveFailed": "Failed to save event filter."
},
"language": {
"title": "Message Language",
"description": "Language used for event notifications, command responses, and daily reports sent to chat channels.",
"saved": "Message language saved.",
"saveFailed": "Failed to save message language.",
"en": "English",
"zh-cn": "Simplified Chinese",
"zh-tw": "Traditional Chinese",
"ja": "Japanese",
"ko": "Korean",
"es": "Spanish",
"de": "German",
"fr": "French",
"pt": "Portuguese",
"ar": "Arabic"
}
}
}

View File

@@ -1713,7 +1713,8 @@
"tabs": {
"channels": "Canales",
"commands": "Comandos",
"events": "Eventos"
"events": "Eventos",
"other": "Otros"
},
"commands": {
"title": "Comandos integrados",
@@ -1740,6 +1741,22 @@
"errorDesc": "Cuando un agente encuentra un error",
"saved": "Filtro de eventos actualizado.",
"saveFailed": "Error al guardar el filtro de eventos."
},
"language": {
"title": "Idioma de mensajes",
"description": "Idioma utilizado para las notificaciones de eventos, respuestas de comandos e informes diarios enviados a los canales de chat.",
"saved": "Idioma de mensajes guardado.",
"saveFailed": "Error al guardar el idioma de mensajes.",
"en": "Inglés",
"zh-cn": "Chino simplificado",
"zh-tw": "Chino tradicional",
"ja": "Japonés",
"ko": "Coreano",
"es": "Español",
"de": "Alemán",
"fr": "Francés",
"pt": "Portugués",
"ar": "Árabe"
}
}
}

View File

@@ -1713,7 +1713,8 @@
"tabs": {
"channels": "Canaux",
"commands": "Commandes",
"events": "Événements"
"events": "Événements",
"other": "Autres"
},
"commands": {
"title": "Commandes intégrées",
@@ -1740,6 +1741,22 @@
"errorDesc": "Lorsqu'un agent rencontre une erreur",
"saved": "Filtre d'événements mis à jour.",
"saveFailed": "Échec de l'enregistrement du filtre d'événements."
},
"language": {
"title": "Langue des messages",
"description": "Langue utilisée pour les notifications d'événements, les réponses aux commandes et les rapports quotidiens envoyés aux canaux de chat.",
"saved": "Langue des messages enregistrée.",
"saveFailed": "Échec de l'enregistrement de la langue des messages.",
"en": "Anglais",
"zh-cn": "Chinois simplifié",
"zh-tw": "Chinois traditionnel",
"ja": "Japonais",
"ko": "Coréen",
"es": "Espagnol",
"de": "Allemand",
"fr": "Français",
"pt": "Portugais",
"ar": "Arabe"
}
}
}

View File

@@ -1713,7 +1713,8 @@
"tabs": {
"channels": "チャンネル",
"commands": "コマンド",
"events": "イベント"
"events": "イベント",
"other": "その他"
},
"commands": {
"title": "組み込みコマンド",
@@ -1740,6 +1741,22 @@
"errorDesc": "エージェントがエラーに遭遇した時",
"saved": "イベントフィルターを更新しました。",
"saveFailed": "イベントフィルターの保存に失敗しました。"
},
"language": {
"title": "メッセージ言語",
"description": "イベント通知、コマンド応答、日次レポートをチャットチャンネルに送信する際に使用する言語。",
"saved": "メッセージ言語を保存しました。",
"saveFailed": "メッセージ言語の保存に失敗しました。",
"en": "英語",
"zh-cn": "簡体字中国語",
"zh-tw": "繁体字中国語",
"ja": "日本語",
"ko": "韓国語",
"es": "スペイン語",
"de": "ドイツ語",
"fr": "フランス語",
"pt": "ポルトガル語",
"ar": "アラビア語"
}
}
}

View File

@@ -1713,7 +1713,8 @@
"tabs": {
"channels": "채널",
"commands": "명령어",
"events": "이벤트"
"events": "이벤트",
"other": "기타"
},
"commands": {
"title": "내장 명령어",
@@ -1740,6 +1741,22 @@
"errorDesc": "에이전트에 오류가 발생했을 때",
"saved": "이벤트 필터가 업데이트되었습니다.",
"saveFailed": "이벤트 필터 저장에 실패했습니다."
},
"language": {
"title": "메시지 언어",
"description": "이벤트 알림, 명령 응답, 일일 보고서를 채팅 채널로 전송할 때 사용하는 언어입니다.",
"saved": "메시지 언어가 저장되었습니다.",
"saveFailed": "메시지 언어 저장에 실패했습니다.",
"en": "영어",
"zh-cn": "중국어 간체",
"zh-tw": "중국어 번체",
"ja": "일본어",
"ko": "한국어",
"es": "스페인어",
"de": "독일어",
"fr": "프랑스어",
"pt": "포르투갈어",
"ar": "아랍어"
}
}
}

View File

@@ -1713,7 +1713,8 @@
"tabs": {
"channels": "Canais",
"commands": "Comandos",
"events": "Eventos"
"events": "Eventos",
"other": "Outros"
},
"commands": {
"title": "Comandos integrados",
@@ -1740,6 +1741,22 @@
"errorDesc": "Quando um agente encontra um erro",
"saved": "Filtro de eventos atualizado.",
"saveFailed": "Falha ao salvar o filtro de eventos."
},
"language": {
"title": "Idioma das mensagens",
"description": "Idioma utilizado para notificações de eventos, respostas de comandos e relatórios diários enviados aos canais de chat.",
"saved": "Idioma das mensagens salvo.",
"saveFailed": "Falha ao salvar o idioma das mensagens.",
"en": "Inglês",
"zh-cn": "Chinês simplificado",
"zh-tw": "Chinês tradicional",
"ja": "Japonês",
"ko": "Coreano",
"es": "Espanhol",
"de": "Alemão",
"fr": "Francês",
"pt": "Português",
"ar": "Árabe"
}
}
}

View File

@@ -1714,7 +1714,8 @@
"tabs": {
"channels": "渠道",
"commands": "指令",
"events": "事件"
"events": "事件",
"other": "其他"
},
"commands": {
"title": "内置指令",
@@ -1741,6 +1742,22 @@
"errorDesc": "代理遇到错误时",
"saved": "事件过滤已更新。",
"saveFailed": "保存事件过滤失败。"
},
"language": {
"title": "消息语言",
"description": "事件通知、指令响应和每日报告推送到消息渠道时使用的语言。",
"saved": "消息语言已保存。",
"saveFailed": "保存消息语言失败。",
"en": "英语",
"zh-cn": "简体中文",
"zh-tw": "繁体中文",
"ja": "日语",
"ko": "韩语",
"es": "西班牙语",
"de": "德语",
"fr": "法语",
"pt": "葡萄牙语",
"ar": "阿拉伯语"
}
}
}

View File

@@ -1713,7 +1713,8 @@
"tabs": {
"channels": "頻道",
"commands": "指令",
"events": "事件"
"events": "事件",
"other": "其他"
},
"commands": {
"title": "內建指令",
@@ -1740,6 +1741,22 @@
"errorDesc": "代理遇到錯誤時",
"saved": "事件篩選已更新。",
"saveFailed": "儲存事件篩選失敗。"
},
"language": {
"title": "訊息語言",
"description": "事件通知、指令回應和每日報告推送到訊息頻道時使用的語言。",
"saved": "訊息語言已儲存。",
"saveFailed": "儲存訊息語言失敗。",
"en": "英語",
"zh-cn": "簡體中文",
"zh-tw": "繁體中文",
"ja": "日語",
"ko": "韓語",
"es": "西班牙語",
"de": "德語",
"fr": "法語",
"pt": "葡萄牙語",
"ar": "阿拉伯語"
}
}
}

View File

@@ -1418,3 +1418,11 @@ export async function setChatEventFilter(
): Promise<void> {
return getTransport().call("set_chat_event_filter", { filter })
}
export async function getChatMessageLanguage(): Promise<string> {
return getTransport().call("get_chat_message_language")
}
export async function setChatMessageLanguage(language: string): Promise<void> {
return getTransport().call("set_chat_message_language", { language })
}