feat: persist desktop language preference

This commit is contained in:
2026-07-11 02:00:10 +08:00
parent e412cfc45a
commit 15f1f413d0
4 changed files with 134 additions and 2 deletions
+18 -2
View File
@@ -1621,6 +1621,7 @@ func (a *App) GetAppSettings() map[string]interface{} {
"currentVaultPath": cfg.CurrentVaultPath,
"recentVaults": cfg.RecentVaults,
"theme": cfg.Theme,
"language": cfg.Language,
"devMode": cfg.DevMode,
"userPluginsDir": cfg.UserPluginsDir,
"lastOpenedAt": cfg.LastOpenedAt,
@@ -1634,18 +1635,33 @@ func (a *App) UpdateAppSettings(patch map[string]interface{}) string {
}
cfg := &appsettings.Config{}
hasConfigPatch := false
if v, ok := patch["theme"].(string); ok && v != "" {
cfg.Theme = v
hasConfigPatch = true
}
if v, ok := patch["devMode"].(bool); ok {
cfg.DevMode = v
hasConfigPatch = true
}
if v, ok := patch["userPluginsDir"].(string); ok && v != "" {
cfg.UserPluginsDir = v
hasConfigPatch = true
}
if err := a.appSettings.Update(cfg); err != nil {
return err.Error()
if hasConfigPatch {
if err := a.appSettings.Update(cfg); err != nil {
return err.Error()
}
}
if value, exists := patch["language"]; exists {
language, ok := value.(string)
if !ok {
return "language must be a string"
}
if err := a.appSettings.UpdateLanguage(language); err != nil {
return err.Error()
}
}
return ""
}
+28
View File
@@ -1294,6 +1294,34 @@ func assertSyncState(t *testing.T, service *syncsvc.Service, wantDeviceID, wantS
}
}
func TestAppSettingsLanguageAPI(t *testing.T) {
settings := appsettings.NewManager(filepath.Join(t.TempDir(), "config.json"))
if err := settings.Load(); err != nil {
t.Fatal(err)
}
if err := settings.Update(&appsettings.Config{Theme: "light", DevMode: true}); err != nil {
t.Fatal(err)
}
app := &App{appSettings: settings}
if got := app.GetAppSettings()["language"]; got != "system" {
t.Fatalf("initial language = %#v, want system", got)
}
if errStr := app.UpdateAppSettings(map[string]interface{}{"language": "ru"}); errStr != "" {
t.Fatalf("UpdateAppSettings language: %s", errStr)
}
got := app.GetAppSettings()
if got["language"] != "ru" || got["theme"] != "light" || got["devMode"] != true {
t.Fatalf("settings after language update = %#v", got)
}
if errStr := app.UpdateAppSettings(map[string]interface{}{"language": "de"}); errStr == "" {
t.Fatal("UpdateAppSettings accepted unsupported language")
}
if got := app.GetAppSettings()["language"]; got != "ru" {
t.Fatalf("language after rejected update = %#v, want ru", got)
}
}
func TestSetCurrentVaultInitializesWorkspaceWhenMissingAtStartup(t *testing.T) {
tmpDir := t.TempDir()
vaultParent := filepath.Join(tmpDir, "vault-parent")