diff --git a/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs index 3c327df..8ad2d5c 100644 --- a/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Modals/Settings/GeneralSettingsTabViewModel.cs @@ -1,10 +1,14 @@ using ClaudeDo.Data.Models; +using ClaudeDo.Localization; using CommunityToolkit.Mvvm.ComponentModel; namespace ClaudeDo.Ui.ViewModels.Modals.Settings; public sealed partial class GeneralSettingsTabViewModel : ViewModelBase { + private readonly ILocalizer? _localizer; + private readonly Action? _persist; + [ObservableProperty] private string _defaultClaudeInstructions = ""; [ObservableProperty] private string _defaultModel = ModelRegistry.DefaultAlias; [ObservableProperty] private int _defaultMaxTurns = 100; @@ -18,6 +22,27 @@ public sealed partial class GeneralSettingsTabViewModel : ViewModelBase public IReadOnlyList Models { get; } = ModelRegistry.Aliases; public IReadOnlyList PermissionModes { get; } = PermissionModeRegistry.Modes; + public GeneralSettingsTabViewModel() { } + + public GeneralSettingsTabViewModel(ILocalizer localizer, Action persist) + { + _localizer = localizer; + _persist = persist; + Languages = localizer.AvailableLanguages; + _selectedLanguage = Languages.FirstOrDefault(l => l.Code == localizer.CurrentCode); + } + + public IReadOnlyList Languages { get; } = Array.Empty(); + + [ObservableProperty] private LanguageOption? _selectedLanguage; + + partial void OnSelectedLanguageChanged(LanguageOption? value) + { + if (value is null || _localizer is null) return; + _localizer.SetLanguage(value.Value.Code); + _persist?.Invoke(value.Value.Code); + } + public string? Validate() { if (DefaultMaxTurns < 1 || DefaultMaxTurns > 200) diff --git a/src/ClaudeDo.Ui/ViewModels/Modals/SettingsModalViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Modals/SettingsModalViewModel.cs index d6974af..13f28eb 100644 --- a/src/ClaudeDo.Ui/ViewModels/Modals/SettingsModalViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/Modals/SettingsModalViewModel.cs @@ -1,5 +1,6 @@ using System.Linq; using ClaudeDo.Data; +using ClaudeDo.Localization; using ClaudeDo.Ui.Services; using ClaudeDo.Ui.ViewModels.Modals.Settings; using CommunityToolkit.Mvvm.ComponentModel; @@ -22,10 +23,15 @@ public sealed partial class SettingsModalViewModel : ViewModelBase public Action? CloseAction { get; set; } - public SettingsModalViewModel(WorkerClient worker, PrimeClaudeTabViewModel prime) + public SettingsModalViewModel(WorkerClient worker, PrimeClaudeTabViewModel prime, + ILocalizer localizer, AppSettings appSettings) { _worker = worker; - General = new GeneralSettingsTabViewModel(); + General = new GeneralSettingsTabViewModel(localizer, code => + { + appSettings.Language = code; + appSettings.Save(); + }); Worktrees = new WorktreesSettingsTabViewModel(worker); Files = new FilesSettingsTabViewModel(worker); Prime = prime; diff --git a/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml b/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml index ebea530..07382fc 100644 --- a/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml +++ b/src/ClaudeDo.Ui/Views/Modals/SettingsModalView.axaml @@ -3,6 +3,8 @@ xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals" xmlns:settings="using:ClaudeDo.Ui.ViewModels.Modals.Settings" xmlns:ctl="using:ClaudeDo.Ui.Views.Controls" + xmlns:loc="using:ClaudeDo.Ui.Localization" + xmlns:locm="using:ClaudeDo.Localization" x:Class="ClaudeDo.Ui.Views.Modals.SettingsModalView" x:DataType="vm:SettingsModalViewModel" Title="Settings" @@ -45,6 +47,18 @@ + + + + + + + + + + { settings.Language = code; saved = true; }); + + var de = vm.Languages.First(l => l.Code == "de"); + vm.SelectedLanguage = de; + + Assert.Equal("de", loc.CurrentCode); + Assert.True(saved); + Assert.Equal("de", settings.Language); + } +}