From c56175bbc8c14c4cd52e3cf13030afaaf53379d6911a065255b6cbc241edec6e Mon Sep 17 00:00:00 2001 From: copecone Date: Wed, 14 Oct 2026 22:55:00 +0900 Subject: [PATCH] Fix Custom Preset Label Handling On Language Change --- UI/Window/RenderConfigWindow.cs | 38 ++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/UI/Window/RenderConfigWindow.cs b/UI/Window/RenderConfigWindow.cs index 087815c..22a252d 100644 --- a/UI/Window/RenderConfigWindow.cs +++ b/UI/Window/RenderConfigWindow.cs @@ -39,7 +39,7 @@ internal static class RenderConfigWindow /// private static RenderConfig? _uiConfig; - private static RenderConfig UiConfig => _uiConfig ??= new RenderConfig(); + private static RenderConfig UIConfig => _uiConfig ??= new RenderConfig(); // Controls cache for validation & sync private static O5Slider? _renderFpsSlider; @@ -120,7 +120,7 @@ internal static class RenderConfigWindow ReloadPresetDropdown(GlobalSettings.Current.LastPresetName); } - var config = UiConfig; + var config = UIConfig; ApplyConfigToUI(config); SetWindowActive(true); @@ -133,7 +133,7 @@ internal static class RenderConfigWindow var (_, scrollContent, _) = O5Factory.ScrollView(ctx, content, spacing: 10f, padding: 8f); - var config = UiConfig; + var config = UIConfig; EnsureDefaultConfig(config); double[] renderFpsSnap = { 23.976, 24, 29.97, 30, 59.94, 60, 144, @@ -843,7 +843,7 @@ internal static class RenderConfigWindow private static void TryGoRender() { - var config = UiConfig; + var config = UIConfig; SyncUItoConfig(config); // The encoders use 4:2:0 chroma subsampling, which needs an even width and height. @@ -967,6 +967,13 @@ internal static class RenderConfigWindow } } + /// + /// Whether the text is the Custom label of any language. A preset with such a name could not be told apart + /// from the Custom entry of the dropdown after a language change. + /// + private static bool IsCustomPresetLabel(string text) => + text == CustomPresetLabel || text == "(Modified)" || text == "(수정됨)"; + private static string CustomPresetLabel => LocalizationManager.Get("ui.render_config.preset_custom"); private static void MarkConfigModified() @@ -1018,7 +1025,7 @@ internal static class RenderConfigWindow SyncUItoConfig(config); var name = _presetNameInput?.Value.Trim(); - if (string.IsNullOrWhiteSpace(name) || name == CustomPresetLabel) + if (string.IsNullOrWhiteSpace(name) || IsCustomPresetLabel(name)) { CommonWarningDialogUI.ShowDialog( LocalizationManager.Get("ui.render_config.validation_title"), @@ -1200,13 +1207,10 @@ internal static class RenderConfigWindow private static void OnLanguageChanged(SystemLanguage language) { - if (_configWindow == null) return; + if (_configWindow == null || _presetDropdown == null) return; - if (_presetDropdown == null) return; - - // The preset names are not localized, the Custom label is. The list is rebuilt from the preset names - // (which drops the Custom label of the previous language), then the label is decided from the values: - // the Custom label of the new language only when the values differ from the last loaded preset. + // The preset names are not localized, only the Custom label is. A dropdown value that is not a preset name + // is the Custom label (of the previous language), which is shown only while the values are modified. var names = PresetManager.GetPresets().Select(p => p.Name).ToList(); if (names.Count == 0) { @@ -1216,14 +1220,18 @@ internal static class RenderConfigWindow return; } + var current = _presetDropdown.Value; + var isModified = string.IsNullOrEmpty(current) || !names.Contains(current); + _presetDropdown.SetValues(names); - var loadedName = _lastLoadedPresetName; - if (!string.IsNullOrEmpty(loadedName) && names.Contains(loadedName)) + if (isModified) { - _presetDropdown.Set(loadedName, false); + MarkConfigModified(); + return; } - UpdatePresetLabel(UiConfig); + _presetDropdown.Set(current, false); + UpdateDeleteButtonState(); } private static string GetVersionText()