初步集成next-intl支持多语言
This commit is contained in:
@@ -3,10 +3,11 @@ use tauri::State;
|
||||
|
||||
use crate::db::service::app_metadata_service;
|
||||
use crate::db::AppDatabase;
|
||||
use crate::models::SystemProxySettings;
|
||||
use crate::models::{SystemLanguageSettings, SystemProxySettings};
|
||||
use crate::network::proxy;
|
||||
|
||||
const SYSTEM_PROXY_SETTINGS_KEY: &str = "system_proxy_settings";
|
||||
const SYSTEM_LANGUAGE_SETTINGS_KEY: &str = "system_language_settings";
|
||||
|
||||
fn normalize_proxy_settings(settings: SystemProxySettings) -> Result<SystemProxySettings, String> {
|
||||
if !settings.enabled {
|
||||
@@ -54,6 +55,21 @@ pub(crate) async fn load_system_proxy_settings(
|
||||
normalize_proxy_settings(parsed)
|
||||
}
|
||||
|
||||
pub(crate) async fn load_system_language_settings(
|
||||
conn: &DatabaseConnection,
|
||||
) -> Result<SystemLanguageSettings, String> {
|
||||
let raw = app_metadata_service::get_value(conn, SYSTEM_LANGUAGE_SETTINGS_KEY)
|
||||
.await
|
||||
.map_err(|e| e.to_string())?;
|
||||
|
||||
let Some(raw) = raw else {
|
||||
return Ok(SystemLanguageSettings::default());
|
||||
};
|
||||
|
||||
serde_json::from_str::<SystemLanguageSettings>(&raw)
|
||||
.map_err(|e| format!("failed to parse stored language settings: {e}"))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn get_system_proxy_settings(
|
||||
db: State<'_, AppDatabase>,
|
||||
@@ -76,3 +92,24 @@ pub async fn update_system_proxy_settings(
|
||||
proxy::apply_system_proxy_settings(&normalized)?;
|
||||
Ok(normalized)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn get_system_language_settings(
|
||||
db: State<'_, AppDatabase>,
|
||||
) -> Result<SystemLanguageSettings, String> {
|
||||
load_system_language_settings(&db.conn).await
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn update_system_language_settings(
|
||||
settings: SystemLanguageSettings,
|
||||
db: State<'_, AppDatabase>,
|
||||
) -> Result<SystemLanguageSettings, String> {
|
||||
let serialized = serde_json::to_string(&settings).map_err(|e| e.to_string())?;
|
||||
|
||||
app_metadata_service::upsert_value(&db.conn, SYSTEM_LANGUAGE_SETTINGS_KEY, &serialized)
|
||||
.await
|
||||
.map_err(|e| e.to_string())?;
|
||||
|
||||
Ok(settings)
|
||||
}
|
||||
|
||||
@@ -220,6 +220,8 @@ pub fn run() {
|
||||
windows::focus_folder_window,
|
||||
system_settings::get_system_proxy_settings,
|
||||
system_settings::update_system_proxy_settings,
|
||||
system_settings::get_system_language_settings,
|
||||
system_settings::update_system_language_settings,
|
||||
acp_commands::acp_preflight,
|
||||
acp_commands::acp_connect,
|
||||
acp_commands::acp_prompt,
|
||||
|
||||
@@ -12,4 +12,4 @@ pub use conversation::{
|
||||
};
|
||||
pub use folder::{FolderCommandInfo, FolderDetail, FolderHistoryEntry, OpenedConversation};
|
||||
pub use message::{ContentBlock, MessageRole, MessageTurn, TurnRole, TurnUsage, UnifiedMessage};
|
||||
pub use system::SystemProxySettings;
|
||||
pub use system::{SystemLanguageSettings, SystemProxySettings};
|
||||
|
||||
@@ -5,3 +5,27 @@ pub struct SystemProxySettings {
|
||||
pub enabled: bool,
|
||||
pub proxy_url: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum AppLocale {
|
||||
#[default]
|
||||
En,
|
||||
ZhCn,
|
||||
ZhTw,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum LanguageMode {
|
||||
#[default]
|
||||
System,
|
||||
Manual,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
||||
#[serde(default)]
|
||||
pub struct SystemLanguageSettings {
|
||||
pub mode: LanguageMode,
|
||||
pub language: AppLocale,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user