From 9a85354d8b41e05ba8729cd8f44592291de9117a Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Wed, 03 Jun 2026 01:40:19 +0800
Subject: [PATCH] Implement Round 2 language settings

---
 privatevoice.src/services/config_service.go |   36 ++++++++++++++++++++++++++++++++++--
 1 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/privatevoice.src/services/config_service.go b/privatevoice.src/services/config_service.go
index 6bffa6f..49c53c6 100755
--- a/privatevoice.src/services/config_service.go
+++ b/privatevoice.src/services/config_service.go
@@ -3,16 +3,26 @@
 import (
 	"voicesnap/internal/config"
 	"voicesnap/internal/dock"
+	"voicesnap/internal/language"
+	"voicesnap/internal/model"
 	"voicesnap/internal/startup"
 )
 
 // ConfigService provides configuration read/write methods to the frontend.
 type ConfigService struct {
-	cfg *config.Config
+	cfg            *config.Config
+	localeDetector language.SystemLocaleDetector
 }
 
 func NewConfigService(cfg *config.Config) *ConfigService {
-	return &ConfigService{cfg: cfg}
+	return NewConfigServiceWithDetector(cfg, language.NewSystemDetector())
+}
+
+func NewConfigServiceWithDetector(cfg *config.Config, detector language.SystemLocaleDetector) *ConfigService {
+	if detector == nil {
+		detector = language.NewSystemDetector()
+	}
+	return &ConfigService{cfg: cfg, localeDetector: detector}
 }
 
 // GetConfig returns the current configuration.
@@ -20,6 +30,28 @@
 	return s.cfg
 }
 
+// GetLanguageSettings returns the configured and effective UI language.
+func (s *ConfigService) GetLanguageSettings() language.LanguageSettings {
+	return language.Resolve(s.cfg.LanguageMode, s.cfg.LanguageID, s.localeDetector)
+}
+
+// SetLanguageAuto makes the UI language follow the system language.
+func (s *ConfigService) SetLanguageAuto() language.LanguageSettings {
+	s.cfg.LanguageMode = config.LanguageModeAuto
+	resolved := language.Resolve(s.cfg.LanguageMode, s.cfg.LanguageID, s.localeDetector)
+	s.cfg.LanguageID = resolved.EffectiveLanguageID
+	config.Save(s.cfg)
+	return language.Resolve(s.cfg.LanguageMode, s.cfg.LanguageID, s.localeDetector)
+}
+
+// SetLanguageManual persists a user-selected UI language.
+func (s *ConfigService) SetLanguageManual(languageID string) language.LanguageSettings {
+	s.cfg.LanguageMode = config.LanguageModeManual
+	s.cfg.LanguageID = model.NormalizeLanguageID(languageID)
+	config.Save(s.cfg)
+	return language.Resolve(s.cfg.LanguageMode, s.cfg.LanguageID, s.localeDetector)
+}
+
 // SetAutoHide sets the auto-hide indicator preference.
 func (s *ConfigService) SetAutoHide(enabled bool) {
 	s.cfg.AutoHide = enabled

--
Gitblit v1.9.3