From 00b8696a629b3dbd0e68fdb38b645eb094770ab2 Mon Sep 17 00:00:00 2001 From: bowen628 Date: Thu, 9 Apr 2026 11:41:38 +0800 Subject: [PATCH] fix(desktop): init global I18nService and sync locale on language change - Initialize global I18nService at startup from config service so bot/remote-connect uses correct locale. - After i18n_set_language, update in-memory I18nService so responses match UI without restart. --- src/apps/desktop/src/api/i18n_api.rs | 17 ++++++++++++++++- src/apps/desktop/src/lib.rs | 16 ++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/apps/desktop/src/api/i18n_api.rs b/src/apps/desktop/src/api/i18n_api.rs index 55564dec..4d09c81e 100644 --- a/src/apps/desktop/src/api/i18n_api.rs +++ b/src/apps/desktop/src/api/i18n_api.rs @@ -1,7 +1,8 @@ //! I18n API use crate::api::app_state::AppState; -use log::{error, info}; +use bitfun_core::service::i18n::{get_global_i18n_service, LocaleId}; +use log::{error, info, warn}; use serde::{Deserialize, Serialize}; use serde_json::Value; use tauri::State; @@ -60,6 +61,20 @@ pub async fn i18n_set_language( { Ok(_) => { info!("Language set to: {}", request.language); + + // Sync the in-memory I18nService so bot/remote-connect responses + // use the newly selected language without requiring an app restart. + if let Some(locale_id) = LocaleId::from_str(&request.language) { + if let Some(i18n_service) = get_global_i18n_service().await { + if let Err(e) = i18n_service.set_locale(locale_id).await { + warn!( + "Failed to sync I18nService locale after language change: language={}, error={}", + request.language, e + ); + } + } + } + #[cfg(target_os = "macos")] { let has_workspace = state.workspace_path.read().await.is_some(); diff --git a/src/apps/desktop/src/lib.rs b/src/apps/desktop/src/lib.rs index 2ee700ba..77661670 100644 --- a/src/apps/desktop/src/lib.rs +++ b/src/apps/desktop/src/lib.rs @@ -88,6 +88,22 @@ pub async fn run() { return; } + // Initialize global I18nService so bot/remote-connect language is always in sync. + { + use bitfun_core::service::config::get_global_config_service; + use bitfun_core::service::i18n::initialize_global_i18n_service; + match get_global_config_service().await { + Ok(config_service) => { + if let Err(e) = initialize_global_i18n_service(Some(config_service)).await { + log::error!("Failed to initialize global I18nService: {}", e); + } + } + Err(e) => { + log::error!("Failed to get config service for I18nService init: {}", e); + } + } + } + let startup_log_level = resolve_runtime_log_level(log_config.level).await; if let Err(e) = AIClientFactory::initialize_global().await {