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

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

@@ -5,6 +5,7 @@ use std::time::{Duration, Instant};
use sea_orm::DatabaseConnection;
use tokio::task::JoinHandle;
use super::i18n::Lang;
use super::manager::ChatChannelManager;
use super::message_formatter;
use super::types::RichMessage;
@@ -13,6 +14,7 @@ use crate::web::event_bridge::WebEventBroadcaster;
/// Minimum interval between pushes for the same event type per channel (debounce).
const DEBOUNCE_SECS: u64 = 5;
const MESSAGE_LANGUAGE_KEY: &str = "chat_message_language";
pub fn spawn_event_subscriber(
broadcaster: Arc<WebEventBroadcaster>,
@@ -36,7 +38,9 @@ pub fn spawn_event_subscriber(
}
};
let message = match parse_event(&event.channel, &event.payload) {
let lang = load_lang(&db_conn).await;
let message = match parse_event(&event.channel, &event.payload, lang) {
Some((event_type, msg)) => {
// Global event filter check
let global_filter = app_metadata_service::get_value(&db_conn, "chat_event_filter")
@@ -100,14 +104,23 @@ pub fn spawn_event_subscriber(
})
}
fn parse_event(channel: &str, payload: &serde_json::Value) -> Option<(String, RichMessage)> {
async fn load_lang(db: &DatabaseConnection) -> Lang {
app_metadata_service::get_value(db, MESSAGE_LANGUAGE_KEY)
.await
.ok()
.flatten()
.map(|v| Lang::from_str_lossy(&v))
.unwrap_or_default()
}
fn parse_event(channel: &str, payload: &serde_json::Value, lang: Lang) -> Option<(String, RichMessage)> {
match channel {
"acp://event" => parse_acp_event(payload),
"acp://event" => parse_acp_event(payload, lang),
_ => None,
}
}
fn parse_acp_event(payload: &serde_json::Value) -> Option<(String, RichMessage)> {
fn parse_acp_event(payload: &serde_json::Value, lang: Lang) -> Option<(String, RichMessage)> {
let event_type = payload.get("type")?.as_str()?;
match event_type {
@@ -126,7 +139,7 @@ fn parse_acp_event(payload: &serde_json::Value) -> Option<(String, RichMessage)>
.unwrap_or("Unknown Agent");
Some((
"turn_complete".to_string(),
message_formatter::format_turn_complete(agent_type, stop_reason),
message_formatter::format_turn_complete(agent_type, stop_reason, lang),
))
}
"error" => {
@@ -140,10 +153,9 @@ fn parse_acp_event(payload: &serde_json::Value) -> Option<(String, RichMessage)>
.unwrap_or("Unknown error");
Some((
"error".to_string(),
message_formatter::format_agent_error(agent_type, message),
message_formatter::format_agent_error(agent_type, message, lang),
))
}
_ => None,
}
}