From 5eb36176601519133e786d02a78b1e2707e7b45a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Pol=C3=A1=C5=A1ek?= Date: Wed, 11 Feb 2026 18:25:23 +0100 Subject: [PATCH] CmdPal: Localize additional UI strings in Registry and Services commands (#45508) ## Summary of the Pull Request This PR - Makes the "Browse the Windows registry" text for the Registry extension command localizable - Makes the "Manage Windows Services" text for the Windows services command localizable - Makes the Windows services filters ("all", "running", "paused", "stopped") localizable - Makes the Windows service primary command strings ("Start", "Stop", "Resume") localizable - Adds comment to "Open Windows Terminal profiles" resource ## PR Checklist - [ ] Closes: #xxx - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx ## Detailed Description of the Pull Request / Additional comments ## Validation Steps Performed --- .../Properties/Resources.Designer.cs | 36 +++++++++++ .../Properties/Resources.resx | 15 +++++ .../ProviderSettingsViewModel.cs | 13 ++-- .../Properties/Resources.Designer.cs | 11 +++- .../Properties/Resources.resx | 3 + .../RegistryCommandsProvider.cs | 2 +- .../Commands/ServiceCommand.cs | 24 +++----- .../Pages/ServiceFilters.cs | 9 +-- .../Pages/ServicesListPage.cs | 4 +- .../Properties/Resources.Designer.cs | 60 ++++++++++++++++++- .../Properties/Resources.resx | 27 ++++++++- .../WindowsServicesCommandsProvider.cs | 2 +- .../Properties/Resources.Designer.cs | 2 +- .../Properties/Resources.resx | 1 + 14 files changed, 175 insertions(+), 34 deletions(-) diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Properties/Resources.Designer.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Properties/Resources.Designer.cs index 8d9ff6d6bb..31dc0f9b9c 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Properties/Resources.Designer.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Properties/Resources.Designer.cs @@ -285,6 +285,42 @@ namespace Microsoft.CmdPal.UI.ViewModels.Properties { } } + /// + /// Looks up a localized string similar to Built-in. + /// + public static string builtin_extension_name { + get { + return ResourceManager.GetString("builtin_extension_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}, {1} commands. + /// + public static string builtin_extension_subtext { + get { + return ResourceManager.GetString("builtin_extension_subtext", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}, {1}. + /// + public static string builtin_extension_subtext_disabled { + get { + return ResourceManager.GetString("builtin_extension_subtext_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}, {1} commands, {2} fallback commands. + /// + public static string builtin_extension_subtext_with_fallback { + get { + return ResourceManager.GetString("builtin_extension_subtext_with_fallback", resourceCulture); + } + } + /// /// Looks up a localized string similar to Home. /// diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Properties/Resources.resx b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Properties/Resources.resx index 9f6b68c1bd..92a5350d53 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Properties/Resources.resx +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Properties/Resources.resx @@ -126,6 +126,21 @@ Built-in commands + + Built-in + + + {0}, {1} commands + {0}=extension name, {1}=number of commands + + + {0}, {1} commands, {2} fallback commands + {0}=extension name, {1}=number of commands, {2} number of fallback commands + + + {0}, {1} + {0}=extension name, {1}=message + View log messages diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/ProviderSettingsViewModel.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/ProviderSettingsViewModel.cs index d6208b712a..1a2a82fa7f 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/ProviderSettingsViewModel.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/ProviderSettingsViewModel.cs @@ -3,6 +3,8 @@ // See the LICENSE file in the project root for more information. using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Text; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Messaging; using Microsoft.CmdPal.Core.Common.Services; @@ -15,6 +17,9 @@ namespace Microsoft.CmdPal.UI.ViewModels; public partial class ProviderSettingsViewModel : ObservableObject { private static readonly IconInfoViewModel EmptyIcon = new(null); + private static readonly CompositeFormat ExtensionSubtextFormat = CompositeFormat.Parse(Resources.builtin_extension_subtext); + private static readonly CompositeFormat ExtensionSubtextWithFallbackFormat = CompositeFormat.Parse(Resources.builtin_extension_subtext_with_fallback); + private static readonly CompositeFormat ExtensionSubtextDisabledFormat = CompositeFormat.Parse(Resources.builtin_extension_subtext_disabled); private readonly CommandProviderWrapper _provider; private readonly ProviderSettings _providerSettings; @@ -39,13 +44,13 @@ public partial class ProviderSettingsViewModel : ObservableObject public string DisplayName => _provider.DisplayName; - public string ExtensionName => _provider.Extension?.ExtensionDisplayName ?? "Built-in"; + public string ExtensionName => _provider.Extension?.ExtensionDisplayName ?? Resources.builtin_extension_name; public string ExtensionSubtext => IsEnabled ? HasFallbackCommands ? - $"{ExtensionName}, {TopLevelCommands.Count} commands, {_provider.FallbackItems?.Length} fallback commands" : - $"{ExtensionName}, {TopLevelCommands.Count} commands" : - $"{ExtensionName}, {Resources.builtin_disabled_extension}"; + string.Format(CultureInfo.CurrentCulture, ExtensionSubtextWithFallbackFormat, ExtensionName, TopLevelCommands.Count, _provider.FallbackItems?.Length ?? 0) : + string.Format(CultureInfo.CurrentCulture, ExtensionSubtextFormat, ExtensionName, TopLevelCommands.Count) : + string.Format(CultureInfo.CurrentCulture, ExtensionSubtextDisabledFormat, ExtensionName, Resources.builtin_disabled_extension); [MemberNotNullWhen(true, nameof(Extension))] public bool IsFromExtension => _provider.Extension is not null; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Properties/Resources.Designer.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Properties/Resources.Designer.cs index 181bdc875d..f6edc5121e 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Properties/Resources.Designer.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace Microsoft.CmdPal.Ext.Registry.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -177,6 +177,15 @@ namespace Microsoft.CmdPal.Ext.Registry.Properties { } } + /// + /// Looks up a localized string similar to Browse the Windows registry. + /// + internal static string RegistryProvider_BrowseTitle { + get { + return ResourceManager.GetString("RegistryProvider_BrowseTitle", resourceCulture); + } + } + /// /// Looks up a localized string similar to Windows Registry. /// diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Properties/Resources.resx b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Properties/Resources.resx index bfa8d29787..1d13752f05 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Properties/Resources.resx +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Properties/Resources.resx @@ -188,4 +188,7 @@ Windows Registry + + Browse the Windows registry + \ No newline at end of file diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/RegistryCommandsProvider.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/RegistryCommandsProvider.cs index 5d68f013a4..72b88fadb7 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/RegistryCommandsProvider.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/RegistryCommandsProvider.cs @@ -25,7 +25,7 @@ public partial class RegistryCommandsProvider : CommandProvider return [ new CommandItem(new RegistryListPage(_settingsManager)) { - Title = "Browse the Windows registry", + Title = Resources.RegistryProvider_BrowseTitle, } ]; } diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Commands/ServiceCommand.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Commands/ServiceCommand.cs index ffde320363..d8b8eec842 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Commands/ServiceCommand.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Commands/ServiceCommand.cs @@ -3,16 +3,10 @@ // See the LICENSE file in the project root for more information. using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Resources; -using System.Text; using System.Threading.Tasks; using Microsoft.CmdPal.Ext.WindowsServices.Helpers; -using Microsoft.CommandPalette.Extensions; +using Microsoft.CmdPal.Ext.WindowsServices.Properties; using Microsoft.CommandPalette.Extensions.Toolkit; -using Windows.UI; namespace Microsoft.CmdPal.Ext.WindowsServices.Commands; @@ -25,15 +19,15 @@ internal sealed partial class ServiceCommand : InvokableCommand { _serviceResult = serviceResult; _action = action; - Name = action.ToString(); - if (serviceResult.IsRunning) + Name = action switch { - Icon = Icons.StopIcon; - } - else - { - Icon = Icons.PlayIcon; - } + Action.Start => Resources.wox_plugin_service_start, + Action.Stop => Resources.wox_plugin_service_stop, + Action.Restart => Resources.wox_plugin_service_restart, + _ => throw new ArgumentOutOfRangeException(nameof(action), action, null), + }; + + Icon = serviceResult.IsRunning ? Icons.StopIcon : Icons.PlayIcon; } public override CommandResult Invoke() diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Pages/ServiceFilters.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Pages/ServiceFilters.cs index 079138fb63..9bc2e391ae 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Pages/ServiceFilters.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Pages/ServiceFilters.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using Microsoft.CmdPal.Ext.WindowsServices; +using Microsoft.CmdPal.Ext.WindowsServices.Properties; namespace Microsoft.CommandPalette.Extensions.Toolkit; @@ -16,11 +17,11 @@ public partial class ServiceFilters : Filters public override IFilterItem[] GetFilters() { return [ - new Filter() { Id = "all", Name = "All Services" }, + new Filter() { Id = "all", Name = Resources.Filters_All_Name }, new Separator(), - new Filter() { Id = "running", Name = "Running", Icon = Icons.PlayIcon }, - new Filter() { Id = "stopped", Name = "Stopped", Icon = Icons.StopIcon }, - new Filter() { Id = "paused", Name = "Paused", Icon = Icons.PauseIcon }, + new Filter() { Id = "running", Name = Resources.Filters_Running_Name, Icon = Icons.PlayIcon }, + new Filter() { Id = "stopped", Name = Resources.Filters_Stopped_Name, Icon = Icons.StopIcon }, + new Filter() { Id = "paused", Name = Resources.Filters_Paused_Name, Icon = Icons.PauseIcon }, ]; } } diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Pages/ServicesListPage.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Pages/ServicesListPage.cs index 4892a1594b..e9ca178f73 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Pages/ServicesListPage.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Pages/ServicesListPage.cs @@ -3,8 +3,8 @@ // See the LICENSE file in the project root for more information. using System.Linq; -using System.Runtime.InteropServices.WindowsRuntime; using Microsoft.CmdPal.Ext.WindowsServices.Helpers; +using Microsoft.CmdPal.Ext.WindowsServices.Properties; using Microsoft.CommandPalette.Extensions; using Microsoft.CommandPalette.Extensions.Toolkit; @@ -15,7 +15,7 @@ internal sealed partial class ServicesListPage : DynamicListPage public ServicesListPage() { Icon = Icons.ServicesIcon; - Name = "Windows Services"; + Name = Resources.ServicesListPage_Name; var filters = new ServiceFilters(); filters.PropChanged += Filters_PropChanged; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Properties/Resources.Designer.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Properties/Resources.Designer.cs index ce71199763..2a40d1789a 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Properties/Resources.Designer.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace Microsoft.CmdPal.Ext.WindowsServices.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -60,6 +60,60 @@ namespace Microsoft.CmdPal.Ext.WindowsServices.Properties { } } + /// + /// Looks up a localized string similar to All Services. + /// + internal static string Filters_All_Name { + get { + return ResourceManager.GetString("Filters_All_Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Paused. + /// + internal static string Filters_Paused_Name { + get { + return ResourceManager.GetString("Filters_Paused_Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Running. + /// + internal static string Filters_Running_Name { + get { + return ResourceManager.GetString("Filters_Running_Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stopped. + /// + internal static string Filters_Stopped_Name { + get { + return ResourceManager.GetString("Filters_Stopped_Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Manage Windows services. + /// + internal static string ManageWindowsServicesCommand_Title { + get { + return ResourceManager.GetString("ManageWindowsServicesCommand_Title", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Windows Services. + /// + internal static string ServicesListPage_Name { + get { + return ResourceManager.GetString("ServicesListPage_Name", resourceCulture); + } + } + /// /// Looks up a localized string similar to Windows Services. /// @@ -169,7 +223,7 @@ namespace Microsoft.CmdPal.Ext.WindowsServices.Properties { } /// - /// Looks up a localized string similar to Start (Enter). + /// Looks up a localized string similar to Start. /// internal static string wox_plugin_service_start { get { @@ -286,7 +340,7 @@ namespace Microsoft.CmdPal.Ext.WindowsServices.Properties { } /// - /// Looks up a localized string similar to Stop (Enter). + /// Looks up a localized string similar to Stop. /// internal static string wox_plugin_service_stop { get { diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Properties/Resources.resx b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Properties/Resources.resx index dd757f4330..ad50181513 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Properties/Resources.resx +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/Properties/Resources.resx @@ -117,17 +117,37 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + All Services + + + Paused + + + Running + + + Stopped + + + Manage Windows services + + + Windows Services + Windows Services Continue + Verb, stop selected service Name Open services + Verb (to open Windows Services MSC) Paused @@ -143,6 +163,7 @@ Restart + Verb, restart selected service The service has been restarted @@ -154,7 +175,8 @@ Running - Start (Enter) + Start + Verb, start selected service Started @@ -193,7 +215,8 @@ Status - Stop (Enter) + Stop + Verb, stop selected service Stopped diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/WindowsServicesCommandsProvider.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/WindowsServicesCommandsProvider.cs index c48dcd99b2..48bbe9deee 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/WindowsServicesCommandsProvider.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsServices/WindowsServicesCommandsProvider.cs @@ -23,7 +23,7 @@ public partial class WindowsServicesCommandsProvider : CommandProvider return [ new CommandItem(new ServicesListPage()) { - Title = "Manage Windows services", + Title = Resources.ManageWindowsServicesCommand_Title, } ]; } diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Properties/Resources.Designer.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Properties/Resources.Designer.cs index 46b0d185b6..2845e40b5f 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Properties/Resources.Designer.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace Microsoft.CmdPal.Ext.WindowsTerminal.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Properties/Resources.resx b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Properties/Resources.resx index bff603bedc..38fa22f751 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Properties/Resources.resx +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Properties/Resources.resx @@ -157,6 +157,7 @@ Open Windows Terminal profiles + Verb: leads to a list of Terminal profiles to open Preferred channel