feat: persist desktop language preference
This commit is contained in:
+18
-2
@@ -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 ""
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user