From e417a1d3a6eed686eef4934b7c0bbde05cc26303 Mon Sep 17 00:00:00 2001 From: DB P Date: Thu, 15 May 2025 16:42:11 +0900 Subject: [PATCH 001/101] Add dynamic font family to SettingWindow --- Flow.Launcher/SettingWindow.xaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index a75a51c8f..da128266c 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -13,6 +13,7 @@ MinHeight="600" d:DataContext="{d:DesignInstance vm:SettingWindowViewModel}" Closed="OnClosed" + FontFamily="{DynamicResource SettingWindowFont}" Icon="Images\app.ico" Left="{Binding SettingWindowLeft, Mode=TwoWay}" Loaded="OnLoaded" From 57dccce1bf04664b7e49721ab5e720a8d21dca18 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 15 May 2025 18:35:57 +0800 Subject: [PATCH 002/101] Fix setting window navigation update issue & Check view model null instead of IsInitialized flag --- .../Resources/Pages/WelcomePage1.xaml.cs | 2 +- .../Resources/Pages/WelcomePage2.xaml.cs | 2 +- .../Resources/Pages/WelcomePage3.xaml.cs | 2 +- .../Resources/Pages/WelcomePage4.xaml.cs | 2 +- .../Resources/Pages/WelcomePage5.xaml.cs | 2 +- .../Views/SettingsPaneAbout.xaml.cs | 8 ++++- .../Views/SettingsPaneGeneral.xaml.cs | 8 ++++- .../Views/SettingsPaneHotkey.xaml.cs | 8 ++++- .../Views/SettingsPanePluginStore.xaml.cs | 7 +++- .../Views/SettingsPanePlugins.xaml.cs | 7 +++- .../Views/SettingsPaneProxy.xaml.cs | 8 ++++- .../Views/SettingsPaneTheme.xaml.cs | 8 ++++- Flow.Launcher/SettingWindow.xaml.cs | 33 +++++++++++++++++-- .../ViewModel/SettingWindowViewModel.cs | 18 +++++++++- 14 files changed, 100 insertions(+), 15 deletions(-) diff --git a/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs index a3b008206..1b1dd21e9 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs @@ -14,7 +14,7 @@ namespace Flow.Launcher.Resources.Pages protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { Settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); diff --git a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs index a63edbcda..7408d8a14 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs @@ -16,7 +16,7 @@ namespace Flow.Launcher.Resources.Pages protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { Settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); diff --git a/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs index 4a6610e61..bd14bf0f7 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs @@ -12,7 +12,7 @@ namespace Flow.Launcher.Resources.Pages protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { Settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); diff --git a/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs index 1ee3284d2..b20e4ce0a 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs @@ -12,7 +12,7 @@ namespace Flow.Launcher.Resources.Pages protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { Settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); diff --git a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs index 6328c9914..84d298966 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs @@ -15,7 +15,7 @@ namespace Flow.Launcher.Resources.Pages protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { Settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs index e57cba6d4..93515caec 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs @@ -1,21 +1,27 @@ using System.Windows.Navigation; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.SettingPages.ViewModels; +using Flow.Launcher.ViewModel; namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPaneAbout { private SettingsPaneAboutViewModel _viewModel = null!; + private SettingWindowViewModel _settingViewModel = null; protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); + _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; InitializeComponent(); } + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPaneAbout); base.OnNavigatedTo(e); } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs index 31653962d..fa3406bd9 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs @@ -1,21 +1,27 @@ using System.Windows.Navigation; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.SettingPages.ViewModels; +using Flow.Launcher.ViewModel; namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPaneGeneral { private SettingsPaneGeneralViewModel _viewModel = null!; + private SettingWindowViewModel _settingViewModel = null; protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); + _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; InitializeComponent(); } + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPaneGeneral); base.OnNavigatedTo(e); } } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs index 8b757bd60..e590dc9a8 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs @@ -1,21 +1,27 @@ using System.Windows.Navigation; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.SettingPages.ViewModels; +using Flow.Launcher.ViewModel; namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPaneHotkey { private SettingsPaneHotkeyViewModel _viewModel = null!; + private SettingWindowViewModel _settingViewModel = null; protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); + _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; InitializeComponent(); } + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPaneHotkey); base.OnNavigatedTo(e); } } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs index 5ddfe4650..aa6900dae 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs @@ -11,16 +11,21 @@ namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPanePluginStore { private SettingsPanePluginStoreViewModel _viewModel = null!; + private SettingWindowViewModel _settingViewModel = null; protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); + _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; InitializeComponent(); } _viewModel.PropertyChanged += ViewModel_PropertyChanged; + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPanePluginStore); base.OnNavigatedTo(e); } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs index e9490804a..6424aabdf 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs @@ -11,16 +11,21 @@ namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPanePlugins { private SettingsPanePluginsViewModel _viewModel = null!; + private SettingWindowViewModel _settingViewModel = null; protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); + _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; InitializeComponent(); } _viewModel.PropertyChanged += ViewModel_PropertyChanged; + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPanePlugins); base.OnNavigatedTo(e); } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs index 258f2a4ad..c89a050f5 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs @@ -1,21 +1,27 @@ using System.Windows.Navigation; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.SettingPages.ViewModels; +using Flow.Launcher.ViewModel; namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPaneProxy { private SettingsPaneProxyViewModel _viewModel = null!; + private SettingWindowViewModel _settingViewModel = null; protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); + _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; InitializeComponent(); } + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPaneProxy); base.OnNavigatedTo(e); } } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs index cee8e4ae4..8759c8efc 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs @@ -1,21 +1,27 @@ using System.Windows.Navigation; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.SettingPages.ViewModels; +using Flow.Launcher.ViewModel; namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPaneTheme { private SettingsPaneThemeViewModel _viewModel = null!; + private SettingWindowViewModel _settingViewModel = null; protected override void OnNavigatedTo(NavigationEventArgs e) { - if (!IsInitialized) + if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); + _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; InitializeComponent(); } + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPaneTheme); base.OnNavigatedTo(e); } } diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index cf84317ac..14e4343e3 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -18,6 +19,7 @@ public partial class SettingWindow #region Private Fields private readonly Settings _settings; + private readonly SettingWindowViewModel _viewModel; #endregion @@ -26,8 +28,8 @@ public partial class SettingWindow public SettingWindow() { _settings = Ioc.Default.GetRequiredService(); - var viewModel = Ioc.Default.GetRequiredService(); - DataContext = viewModel; + _viewModel = Ioc.Default.GetRequiredService(); + DataContext = _viewModel; InitializeComponent(); UpdatePositionAndState(); @@ -48,10 +50,37 @@ public partial class SettingWindow hwndTarget.RenderMode = RenderMode.SoftwareOnly; // Must use software only render mode here UpdatePositionAndState(); + + _viewModel.PropertyChanged += ViewModel_PropertyChanged; + } + + // Sometimes the navigation is not triggered by button click, + // so we need to update the selected item here + private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + switch (e.PropertyName) + { + case nameof(SettingWindowViewModel.PageType): + var selectedIndex = _viewModel.PageType.Name switch + { + nameof(SettingsPaneGeneral) => 0, + nameof(SettingsPanePlugins) => 1, + nameof(SettingsPanePluginStore) => 2, + nameof(SettingsPaneTheme) => 3, + nameof(SettingsPaneHotkey) => 4, + nameof(SettingsPaneProxy) => 5, + nameof(SettingsPaneAbout) => 6, + _ => 0 + }; + NavView.SelectedItem = NavView.MenuItems[selectedIndex]; + break; + } } private void OnClosed(object sender, EventArgs e) { + _viewModel.PropertyChanged -= ViewModel_PropertyChanged; + // If app is exiting, settings save is not needed because main window closing event will handle this if (App.Exiting) return; // Save settings when window is closed diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index 17a1a2b50..9e7eaf6e8 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -1,5 +1,7 @@ -using Flow.Launcher.Infrastructure.UserSettings; +using System; +using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin; +using Flow.Launcher.SettingPages.Views; namespace Flow.Launcher.ViewModel; @@ -12,6 +14,20 @@ public partial class SettingWindowViewModel : BaseModel _settings = settings; } + private Type _pageType = typeof(SettingsPaneGeneral); + public Type PageType + { + get => _pageType; + set + { + if (_pageType != value) + { + _pageType = value; + OnPropertyChanged(); + } + } + } + public double SettingWindowWidth { get => _settings.SettingWindowWidth; From 1a67c8906b42a9e0bffba8a497a57703de7ae7e8 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 15 May 2025 19:36:45 +0800 Subject: [PATCH 003/101] Fix component initialization issue --- Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs | 4 ++++ Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs | 4 ++++ Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs | 4 ++++ Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs | 4 ++++ Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs | 4 ++++ Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs | 4 ++++ Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs | 4 ++++ Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs | 4 ++++ .../SettingPages/Views/SettingsPanePluginStore.xaml.cs | 4 ++++ Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs | 4 ++++ Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs | 4 ++++ Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs | 4 ++++ 12 files changed, 48 insertions(+) diff --git a/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs index 1b1dd21e9..3199e81b7 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs @@ -14,10 +14,14 @@ namespace Flow.Launcher.Resources.Pages protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { Settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); + } + if (!IsInitialized) + { InitializeComponent(); } // Sometimes the navigation is not triggered by button click, diff --git a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs index 7408d8a14..1eef9fc8c 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs @@ -16,10 +16,14 @@ namespace Flow.Launcher.Resources.Pages protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { Settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); + } + if (!IsInitialized) + { InitializeComponent(); } // Sometimes the navigation is not triggered by button click, diff --git a/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs index bd14bf0f7..d27368aa1 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs @@ -12,10 +12,14 @@ namespace Flow.Launcher.Resources.Pages protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { Settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); + } + if (!IsInitialized) + { InitializeComponent(); } // Sometimes the navigation is not triggered by button click, diff --git a/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs index b20e4ce0a..b0999504b 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs @@ -12,10 +12,14 @@ namespace Flow.Launcher.Resources.Pages protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { Settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); + } + if (!IsInitialized) + { InitializeComponent(); } // Sometimes the navigation is not triggered by button click, diff --git a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs index 84d298966..2ece4ce88 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs @@ -15,10 +15,14 @@ namespace Flow.Launcher.Resources.Pages protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { Settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); + } + if (!IsInitialized) + { InitializeComponent(); } // Sometimes the navigation is not triggered by button click, diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs index 93515caec..00426546a 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs @@ -12,11 +12,15 @@ public partial class SettingsPaneAbout protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; + } + if (!IsInitialized) + { InitializeComponent(); } // Sometimes the navigation is not triggered by button click, diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs index fa3406bd9..524e4f5f5 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs @@ -12,11 +12,15 @@ public partial class SettingsPaneGeneral protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; + } + if (!IsInitialized) + { InitializeComponent(); } // Sometimes the navigation is not triggered by button click, diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs index e590dc9a8..53a639aa5 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs @@ -12,11 +12,15 @@ public partial class SettingsPaneHotkey protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; + } + if (!IsInitialized) + { InitializeComponent(); } // Sometimes the navigation is not triggered by button click, diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs index aa6900dae..34cd33ec1 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs @@ -15,11 +15,15 @@ public partial class SettingsPanePluginStore protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; + } + if (!IsInitialized) + { InitializeComponent(); } _viewModel.PropertyChanged += ViewModel_PropertyChanged; diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs index 6424aabdf..94e0d24a2 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs @@ -15,11 +15,15 @@ public partial class SettingsPanePlugins protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; + } + if (!IsInitialized) + { InitializeComponent(); } _viewModel.PropertyChanged += ViewModel_PropertyChanged; diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs index c89a050f5..aa47383e8 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs @@ -12,11 +12,15 @@ public partial class SettingsPaneProxy protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; + } + if (!IsInitialized) + { InitializeComponent(); } // Sometimes the navigation is not triggered by button click, diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs index 8759c8efc..215a8c70c 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs @@ -12,11 +12,15 @@ public partial class SettingsPaneTheme protected override void OnNavigatedTo(NavigationEventArgs e) { + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; + } + if (!IsInitialized) + { InitializeComponent(); } // Sometimes the navigation is not triggered by button click, From 5b17fad67cab25ba9da890d188c988f03835f74a Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 15 May 2025 19:51:30 +0800 Subject: [PATCH 004/101] Fix duplicated value change --- Flow.Launcher/SettingWindow.xaml.cs | 1 + Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index 14e4343e3..d8444d45d 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -263,6 +263,7 @@ public partial class SettingWindow nameof(About) => typeof(SettingsPaneAbout), _ => typeof(SettingsPaneGeneral) }; + _viewModel.SetPageType(pageType); ContentFrame.Navigate(pageType); } } diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index 9e7eaf6e8..5b130eb6d 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -14,6 +14,11 @@ public partial class SettingWindowViewModel : BaseModel _settings = settings; } + public void SetPageType(Type pageType) + { + _pageType = pageType; + } + private Type _pageType = typeof(SettingsPaneGeneral); public Type PageType { From d0e799b8edaf7378d38a7ef8bf71311dda29e262 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 15 May 2025 20:16:50 +0800 Subject: [PATCH 005/101] Fix double navigation issue --- .../SettingPages/Views/SettingsPaneAbout.xaml.cs | 10 +++++----- .../SettingPages/Views/SettingsPaneGeneral.xaml.cs | 10 +++++----- .../SettingPages/Views/SettingsPaneHotkey.xaml.cs | 10 +++++----- .../Views/SettingsPanePluginStore.xaml.cs | 10 +++++----- .../SettingPages/Views/SettingsPanePlugins.xaml.cs | 10 +++++----- .../SettingPages/Views/SettingsPaneProxy.xaml.cs | 10 +++++----- .../SettingPages/Views/SettingsPaneTheme.xaml.cs | 10 +++++----- Flow.Launcher/SettingWindow.xaml.cs | 11 ++++++++--- Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 8 +++++--- 9 files changed, 48 insertions(+), 41 deletions(-) diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs index 00426546a..47532b243 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs @@ -8,24 +8,24 @@ namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPaneAbout { private SettingsPaneAboutViewModel _viewModel = null!; - private SettingWindowViewModel _settingViewModel = null; + private readonly SettingWindowViewModel _settingViewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPaneAbout); + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); - _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; } if (!IsInitialized) { InitializeComponent(); } - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page type - _settingViewModel.PageType = typeof(SettingsPaneAbout); base.OnNavigatedTo(e); } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs index 524e4f5f5..753cb7b0e 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs @@ -8,24 +8,24 @@ namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPaneGeneral { private SettingsPaneGeneralViewModel _viewModel = null!; - private SettingWindowViewModel _settingViewModel = null; + private readonly SettingWindowViewModel _settingViewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPaneGeneral); + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); - _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; } if (!IsInitialized) { InitializeComponent(); } - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page type - _settingViewModel.PageType = typeof(SettingsPaneGeneral); base.OnNavigatedTo(e); } } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs index 53a639aa5..202869bc5 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs @@ -8,24 +8,24 @@ namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPaneHotkey { private SettingsPaneHotkeyViewModel _viewModel = null!; - private SettingWindowViewModel _settingViewModel = null; + private readonly SettingWindowViewModel _settingViewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPaneHotkey); + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); - _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; } if (!IsInitialized) { InitializeComponent(); } - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page type - _settingViewModel.PageType = typeof(SettingsPaneHotkey); base.OnNavigatedTo(e); } } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs index 34cd33ec1..c0a77957a 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs @@ -11,15 +11,18 @@ namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPanePluginStore { private SettingsPanePluginStoreViewModel _viewModel = null!; - private SettingWindowViewModel _settingViewModel = null; + private readonly SettingWindowViewModel _settingViewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPanePluginStore); + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); - _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; } if (!IsInitialized) @@ -27,9 +30,6 @@ public partial class SettingsPanePluginStore InitializeComponent(); } _viewModel.PropertyChanged += ViewModel_PropertyChanged; - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page type - _settingViewModel.PageType = typeof(SettingsPanePluginStore); base.OnNavigatedTo(e); } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs index 94e0d24a2..f486a3443 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs @@ -11,15 +11,18 @@ namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPanePlugins { private SettingsPanePluginsViewModel _viewModel = null!; - private SettingWindowViewModel _settingViewModel = null; + private readonly SettingWindowViewModel _settingViewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPanePlugins); + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); - _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; } if (!IsInitialized) @@ -27,9 +30,6 @@ public partial class SettingsPanePlugins InitializeComponent(); } _viewModel.PropertyChanged += ViewModel_PropertyChanged; - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page type - _settingViewModel.PageType = typeof(SettingsPanePlugins); base.OnNavigatedTo(e); } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs index aa47383e8..3e617229d 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs @@ -8,24 +8,24 @@ namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPaneProxy { private SettingsPaneProxyViewModel _viewModel = null!; - private SettingWindowViewModel _settingViewModel = null; + private readonly SettingWindowViewModel _settingViewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPaneProxy); + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); - _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; } if (!IsInitialized) { InitializeComponent(); } - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page type - _settingViewModel.PageType = typeof(SettingsPaneProxy); base.OnNavigatedTo(e); } } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs index 215a8c70c..170003994 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs @@ -8,24 +8,24 @@ namespace Flow.Launcher.SettingPages.Views; public partial class SettingsPaneTheme { private SettingsPaneThemeViewModel _viewModel = null!; - private SettingWindowViewModel _settingViewModel = null; + private readonly SettingWindowViewModel _settingViewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page type + _settingViewModel.PageType = typeof(SettingsPaneTheme); + // If the navigation is not triggered by button click, view model will be null again if (_viewModel == null) { _viewModel = Ioc.Default.GetRequiredService(); - _settingViewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; } if (!IsInitialized) { InitializeComponent(); } - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page type - _settingViewModel.PageType = typeof(SettingsPaneTheme); base.OnNavigatedTo(e); } } diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index d8444d45d..ebbb38414 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -241,6 +241,7 @@ public partial class SettingWindow { if (args.IsSettingsSelected) { + _viewModel.SetPageType(typeof(SettingsPaneGeneral)); ContentFrame.Navigate(typeof(SettingsPaneGeneral)); } else @@ -263,8 +264,11 @@ public partial class SettingWindow nameof(About) => typeof(SettingsPaneAbout), _ => typeof(SettingsPaneGeneral) }; - _viewModel.SetPageType(pageType); - ContentFrame.Navigate(pageType); + // Only navigate if the page type changes to fix navigation forward/back issue + if (_viewModel.SetPageType(pageType)) + { + ContentFrame.Navigate(pageType); + } } } @@ -282,7 +286,8 @@ public partial class SettingWindow private void ContentFrame_Loaded(object sender, RoutedEventArgs e) { - NavView.SelectedItem ??= NavView.MenuItems[0]; /* Set First Page */ + _viewModel.SetPageType(null); // Set page type to null so that NavigationView_SelectionChanged can navigate the frame + NavView.SelectedItem = NavView.MenuItems[0]; /* Set First Page */ } #endregion diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index 5b130eb6d..1134a81b8 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -1,7 +1,6 @@ using System; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin; -using Flow.Launcher.SettingPages.Views; namespace Flow.Launcher.ViewModel; @@ -14,12 +13,15 @@ public partial class SettingWindowViewModel : BaseModel _settings = settings; } - public void SetPageType(Type pageType) + public bool SetPageType(Type pageType) { + if (_pageType == pageType) return false; + _pageType = pageType; + return true; } - private Type _pageType = typeof(SettingsPaneGeneral); + private Type _pageType = null; public Type PageType { get => _pageType; From ad94ebadcfc8c175c4406be9b2b055fe448cacd2 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 15 May 2025 20:23:38 +0800 Subject: [PATCH 006/101] Fix possible issue in welcome pages --- .../Resources/Pages/WelcomePage1.xaml.cs | 17 ++++++----------- .../Resources/Pages/WelcomePage2.xaml.cs | 17 ++++++----------- .../Resources/Pages/WelcomePage3.xaml.cs | 17 ++++++----------- .../Resources/Pages/WelcomePage4.xaml.cs | 17 ++++++----------- .../Resources/Pages/WelcomePage5.xaml.cs | 17 ++++++----------- 5 files changed, 30 insertions(+), 55 deletions(-) diff --git a/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs index 3199e81b7..16252086e 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs @@ -9,24 +9,19 @@ namespace Flow.Launcher.Resources.Pages { public partial class WelcomePage1 { - public Settings Settings { get; private set; } - private WelcomeViewModel _viewModel; + public Settings Settings { get; } = Ioc.Default.GetRequiredService(); + private readonly WelcomeViewModel _viewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { - // If the navigation is not triggered by button click, view model will be null again - if (_viewModel == null) - { - Settings = Ioc.Default.GetRequiredService(); - _viewModel = Ioc.Default.GetRequiredService(); - } + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page number + _viewModel.PageNum = 1; + if (!IsInitialized) { InitializeComponent(); } - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page number - _viewModel.PageNum = 1; base.OnNavigatedTo(e); } diff --git a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs index 1eef9fc8c..37767f128 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs @@ -11,24 +11,19 @@ namespace Flow.Launcher.Resources.Pages { public partial class WelcomePage2 { - public Settings Settings { get; private set; } - private WelcomeViewModel _viewModel; + public Settings Settings { get; } = Ioc.Default.GetRequiredService(); + private readonly WelcomeViewModel _viewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { - // If the navigation is not triggered by button click, view model will be null again - if (_viewModel == null) - { - Settings = Ioc.Default.GetRequiredService(); - _viewModel = Ioc.Default.GetRequiredService(); - } + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page number + _viewModel.PageNum = 2; + if (!IsInitialized) { InitializeComponent(); } - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page number - _viewModel.PageNum = 2; base.OnNavigatedTo(e); } diff --git a/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs index d27368aa1..4c3184f8c 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs @@ -7,24 +7,19 @@ namespace Flow.Launcher.Resources.Pages { public partial class WelcomePage3 { - public Settings Settings { get; private set; } - private WelcomeViewModel _viewModel; + public Settings Settings { get; } = Ioc.Default.GetRequiredService(); + private readonly WelcomeViewModel _viewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { - // If the navigation is not triggered by button click, view model will be null again - if (_viewModel == null) - { - Settings = Ioc.Default.GetRequiredService(); - _viewModel = Ioc.Default.GetRequiredService(); - } + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page number + _viewModel.PageNum = 3; + if (!IsInitialized) { InitializeComponent(); } - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page number - _viewModel.PageNum = 3; base.OnNavigatedTo(e); } } diff --git a/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs index b0999504b..63c9b9a7a 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs @@ -7,24 +7,19 @@ namespace Flow.Launcher.Resources.Pages { public partial class WelcomePage4 { - public Settings Settings { get; private set; } - private WelcomeViewModel _viewModel; + public Settings Settings { get; } = Ioc.Default.GetRequiredService(); + private readonly WelcomeViewModel _viewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { - // If the navigation is not triggered by button click, view model will be null again - if (_viewModel == null) - { - Settings = Ioc.Default.GetRequiredService(); - _viewModel = Ioc.Default.GetRequiredService(); - } + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page number + _viewModel.PageNum = 4; + if (!IsInitialized) { InitializeComponent(); } - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page number - _viewModel.PageNum = 4; base.OnNavigatedTo(e); } } diff --git a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs index 2ece4ce88..8db0a9f7e 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs +++ b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs @@ -10,24 +10,19 @@ namespace Flow.Launcher.Resources.Pages { public partial class WelcomePage5 { - public Settings Settings { get; private set; } - private WelcomeViewModel _viewModel; + public Settings Settings { get; } = Ioc.Default.GetRequiredService(); + private readonly WelcomeViewModel _viewModel = Ioc.Default.GetRequiredService(); protected override void OnNavigatedTo(NavigationEventArgs e) { - // If the navigation is not triggered by button click, view model will be null again - if (_viewModel == null) - { - Settings = Ioc.Default.GetRequiredService(); - _viewModel = Ioc.Default.GetRequiredService(); - } + // Sometimes the navigation is not triggered by button click, + // so we need to reset the page number + _viewModel.PageNum = 5; + if (!IsInitialized) { InitializeComponent(); } - // Sometimes the navigation is not triggered by button click, - // so we need to reset the page number - _viewModel.PageNum = 5; base.OnNavigatedTo(e); } From 7e3de02ecb020468532b577e16eba0db466b1df0 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 16 May 2025 19:23:49 +0800 Subject: [PATCH 007/101] initialize position before InitializeComponent --- Flow.Launcher/SettingWindow.xaml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index ebbb38414..ed4f4eb08 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -30,9 +30,9 @@ public partial class SettingWindow _settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; - InitializeComponent(); - + // Because WindowStartupLocation is Manual, so we need to initialize position before InitializeComponent UpdatePositionAndState(); + InitializeComponent(); } #endregion From 07ac325593718ec9fee3a57aadcc6fabd07a8c2e Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Fri, 16 May 2025 19:27:10 +0800 Subject: [PATCH 008/101] Improve code comments Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Flow.Launcher/SettingWindow.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index ed4f4eb08..c53a4ea80 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -30,7 +30,7 @@ public partial class SettingWindow _settings = Ioc.Default.GetRequiredService(); _viewModel = Ioc.Default.GetRequiredService(); DataContext = _viewModel; - // Because WindowStartupLocation is Manual, so we need to initialize position before InitializeComponent + // Since WindowStartupLocation is set to Manual, initialize the window position before calling InitializeComponent UpdatePositionAndState(); InitializeComponent(); } From 050c2cb64781a4eba0cb84474dfde815d65c5d30 Mon Sep 17 00:00:00 2001 From: DB p Date: Sat, 17 May 2025 15:08:20 +0900 Subject: [PATCH 009/101] Refactor OpenDirectory method to improve path handling and streamline process start logic --- Flow.Launcher/PublicAPIInstance.cs | 48 ++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 5b8e8c9af..28b4b0429 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -314,24 +314,48 @@ namespace Flow.Launcher ((PluginJsonStorage)_pluginJsonStorages[type]).Save(); } - public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null) + public void OpenDirectory(string directoryPath, string fileNameOrFilePath = null) { - using var explorer = new Process(); - var explorerInfo = _settings.CustomExplorer; + string targetPath; - explorer.StartInfo = new ProcessStartInfo + if (fileNameOrFilePath is null) { - FileName = explorerInfo.Path.Replace("%d", DirectoryPath), + targetPath = directoryPath; + } + else + { + targetPath = Path.IsPathRooted(fileNameOrFilePath) + ? fileNameOrFilePath + : Path.Combine(directoryPath, fileNameOrFilePath); + } + + var explorerInfo = _settings.CustomExplorer; + var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant(); + + // If explorer.exe, ignore and pass only the path to Shell + if (Path.GetFileNameWithoutExtension(explorerPath) == "explorer") + { + Process.Start(new ProcessStartInfo + { + FileName = targetPath, // Not explorer, Only path. + UseShellExecute = true // Must be true to open folder + }); + return; + } + + // Custom File Manager + var psi = new ProcessStartInfo + { + FileName = explorerInfo.Path.Replace("%d", directoryPath), UseShellExecute = true, - Arguments = FileNameOrFilePath is null - ? explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) + Arguments = fileNameOrFilePath is null + ? explorerInfo.DirectoryArgument.Replace("%d", directoryPath) : explorerInfo.FileArgument - .Replace("%d", DirectoryPath) - .Replace("%f", - Path.IsPathRooted(FileNameOrFilePath) ? FileNameOrFilePath : Path.Combine(DirectoryPath, FileNameOrFilePath) - ) + .Replace("%d", directoryPath) + .Replace("%f", targetPath) }; - explorer.Start(); + + Process.Start(psi); } private void OpenUri(Uri uri, bool? inPrivate = null) From b5bbd9f123ede83f9fe53732a28bb17952c60b21 Mon Sep 17 00:00:00 2001 From: DB p Date: Sat, 17 May 2025 15:16:34 +0900 Subject: [PATCH 010/101] Refactor OpenDirectory method to standardize parameter naming and improve path handling --- Flow.Launcher/PublicAPIInstance.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 28b4b0429..ad48081b4 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -314,19 +314,19 @@ namespace Flow.Launcher ((PluginJsonStorage)_pluginJsonStorages[type]).Save(); } - public void OpenDirectory(string directoryPath, string fileNameOrFilePath = null) + public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null) { string targetPath; - if (fileNameOrFilePath is null) + if (FileNameOrFilePath is null) { - targetPath = directoryPath; + targetPath = DirectoryPath; } else { - targetPath = Path.IsPathRooted(fileNameOrFilePath) - ? fileNameOrFilePath - : Path.Combine(directoryPath, fileNameOrFilePath); + targetPath = Path.IsPathRooted(FileNameOrFilePath) + ? FileNameOrFilePath + : Path.Combine(DirectoryPath, FileNameOrFilePath); } var explorerInfo = _settings.CustomExplorer; @@ -346,12 +346,12 @@ namespace Flow.Launcher // Custom File Manager var psi = new ProcessStartInfo { - FileName = explorerInfo.Path.Replace("%d", directoryPath), + FileName = explorerInfo.Path.Replace("%d", DirectoryPath), UseShellExecute = true, - Arguments = fileNameOrFilePath is null - ? explorerInfo.DirectoryArgument.Replace("%d", directoryPath) + Arguments = FileNameOrFilePath is null + ? explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) : explorerInfo.FileArgument - .Replace("%d", directoryPath) + .Replace("%d", DirectoryPath) .Replace("%f", targetPath) }; From 003df049e1c7f32313df55fccadab171b6833277 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sat, 17 May 2025 20:40:40 +1000 Subject: [PATCH 011/101] add dedicated clear result indicator for query and non-query usage --- Flow.Launcher/ViewModel/MainViewModel.cs | 36 ++++++++++++++++++------ 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 401f71ae3..64fb85296 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -267,7 +267,7 @@ namespace Flow.Launcher.ViewModel if (token.IsCancellationRequested) return; - if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, pair.Metadata, e.Query, + if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, pair.Metadata, e.Query, token))) { App.API.LogError(ClassName, "Unable to add item to Result Update Queue"); @@ -793,7 +793,7 @@ namespace Flow.Launcher.ViewModel public Visibility ProgressBarVisibility { get; set; } public Visibility MainWindowVisibility { get; set; } - + // This is to be used for determining the visibility status of the main window instead of MainWindowVisibility // because it is more accurate and reliable representation than using Visibility as a condition check public bool MainWindowVisibilityStatus { get; set; } = true; @@ -1070,7 +1070,7 @@ namespace Flow.Launcher.ViewModel path = QueryResultsPreviewed() ? Results.SelectedItem?.Result?.Preview.FilePath : string.Empty; return !string.IsNullOrEmpty(path); } - + private bool QueryResultsPreviewed() { var previewed = PreviewSelectedItem == Results.SelectedItem; @@ -1280,7 +1280,7 @@ namespace Flow.Launcher.ViewModel // Update the query's IsReQuery property to true if this is a re-query query.IsReQuery = isReQuery; - + ICollection plugins = Array.Empty(); if (currentIsHomeQuery) @@ -1312,8 +1312,7 @@ namespace Flow.Launcher.ViewModel } } - var validPluginNames = plugins.Select(x => $"<{x.Metadata.Name}>"); - App.API.LogDebug(ClassName, $"Valid <{plugins.Count}> plugins: {string.Join(" ", validPluginNames)}"); + App.API.LogDebug(ClassName, $"Valid <{plugins.Count}> plugins: {string.Join(" ", plugins.Select(x => $"<{x.Metadata.Name}>"))}"); // Do not wait for performance improvement /*if (string.IsNullOrEmpty(query.ActionKeyword)) @@ -1341,6 +1340,9 @@ namespace Flow.Launcher.ViewModel Task[] tasks; if (currentIsHomeQuery) { + if (ShouldClearExistingResultsForNonQuery(plugins)) + Results.Clear(); + tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch { false => QueryTaskAsync(plugin, currentCancellationToken), @@ -1432,7 +1434,7 @@ namespace Flow.Launcher.ViewModel App.API.LogDebug(ClassName, $"Update results for plugin <{plugin.Metadata.Name}>"); // Indicate if to clear existing results so to show only ones from plugins with action keywords - var shouldClearExistingResults = ShouldClearExistingResults(query, currentIsHomeQuery); + var shouldClearExistingResults = ShouldClearExistingResultsForQuery(query, currentIsHomeQuery); _lastQuery = query; _previousIsHomeQuery = currentIsHomeQuery; @@ -1454,8 +1456,13 @@ namespace Flow.Launcher.ViewModel App.API.LogDebug(ClassName, $"Update results for history"); + // Indicate if to clear existing results so to show only ones from plugins with action keywords + var shouldClearExistingResults = ShouldClearExistingResultsForQuery(query, currentIsHomeQuery); + _lastQuery = query; + _previousIsHomeQuery = currentIsHomeQuery; + if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, _historyMetadata, query, - token))) + token, reSelect, shouldClearExistingResults))) { App.API.LogError(ClassName, "Unable to add item to Result Update Queue"); } @@ -1552,7 +1559,7 @@ namespace Flow.Launcher.ViewModel /// The current query. /// A flag indicating if the current query is a home query. /// True if the existing results should be cleared, false otherwise. - private bool ShouldClearExistingResults(Query query, bool currentIsHomeQuery) + private bool ShouldClearExistingResultsForQuery(Query query, bool currentIsHomeQuery) { // If previous or current results are from home query, we need to clear them if (_previousIsHomeQuery || currentIsHomeQuery) @@ -1571,6 +1578,17 @@ namespace Flow.Launcher.ViewModel return false; } + private bool ShouldClearExistingResultsForNonQuery(ICollection plugins) + { + if (!Settings.ShowHistoryResultsForHomePage && (plugins.Count == 0 || plugins.All(x => x.Metadata.HomeDisabled == true))) + { + App.API.LogDebug(ClassName, $"Cleared old results"); + return true; + } + + return false; + } + private Result ContextMenuTopMost(Result result) { Result menu; From b4955f7474ac7b07658fb40220551865cb9d96aa Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sat, 17 May 2025 20:41:25 +1000 Subject: [PATCH 012/101] add subscriber for show history result toggle in settings --- .../UserSettings/Settings.cs | 15 ++++++++++++++- Flow.Launcher/MainWindow.xaml.cs | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 34bf4f90e..387469d24 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -173,7 +173,20 @@ namespace Flow.Launcher.Infrastructure.UserSettings } } - public bool ShowHistoryResultsForHomePage { get; set; } = false; + public bool _showHistoryResultsForHomePage { get; set; } = false; + public bool ShowHistoryResultsForHomePage + { + get => _showHistoryResultsForHomePage; + set + { + if(_showHistoryResultsForHomePage != value) + { + _showHistoryResultsForHomePage = value; + OnPropertyChanged(); + } + } + } + public int MaxHistoryResultsToShowForHomePage { get; set; } = 5; public int CustomExplorerIndex { get; set; } = 0; diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index e243549e3..18bceedd8 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -275,6 +275,7 @@ namespace Flow.Launcher InitializeContextMenu(); break; case nameof(Settings.ShowHomePage): + case nameof(Settings.ShowHistoryResultsForHomePage): if (_viewModel.QueryResultsSelected() && string.IsNullOrEmpty(_viewModel.QueryText)) { _viewModel.QueryResults(); From 2941e036bc864507211ed37ed9ba2ec140862daf Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sat, 17 May 2025 21:08:18 +1000 Subject: [PATCH 013/101] add logging and method summaries --- Flow.Launcher/ViewModel/MainViewModel.cs | 23 +++++++++++++++++---- Flow.Launcher/ViewModel/ResultsViewModel.cs | 3 +++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 64fb85296..bfda18b9a 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1341,7 +1341,11 @@ namespace Flow.Launcher.ViewModel if (currentIsHomeQuery) { if (ShouldClearExistingResultsForNonQuery(plugins)) + { Results.Clear(); + App.API.LogDebug(ClassName, $"Existing results are cleared for non-query"); + } + tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch { @@ -1548,7 +1552,9 @@ namespace Flow.Launcher.ViewModel /// /// Determines whether the existing search results should be cleared based on the current query and the previous query type. - /// This is needed because of the design that treats plugins with action keywords and global action keywords separately. Results are gathered + /// This is used to indicate to QueryTaskAsync or QueryHistoryTask whether to clear results. If both QueryTaskAsync and QueryHistoryTask + /// are not called then use ShouldClearExistingResultsForNonQuery instead. + /// This method needed because of the design that treats plugins with action keywords and global action keywords separately. Results are gathered /// either from plugins with matching action keywords or global action keyword, but not both. So when the current results are from plugins /// with a matching action keyword and a new result set comes from a new query with the global action keyword, the existing results need to be cleared, /// and vice versa. The same applies to home page query results. @@ -1564,25 +1570,34 @@ namespace Flow.Launcher.ViewModel // If previous or current results are from home query, we need to clear them if (_previousIsHomeQuery || currentIsHomeQuery) { - App.API.LogDebug(ClassName, $"Cleared old results"); + App.API.LogDebug(ClassName, $"Existing results should be cleared for query"); return true; } // If the last and current query are not home query type, we need to check the action keyword if (_lastQuery?.ActionKeyword != query?.ActionKeyword) { - App.API.LogDebug(ClassName, $"Cleared old results"); + App.API.LogDebug(ClassName, $"Existing results should be cleared for query"); return true; } return false; } + /// + /// Determines whether existing results should be cleared for non-query calls. + /// A non-query call is where QueryTaskAsync and QueryHistoryTask methods are both not called. + /// QueryTaskAsync and QueryHistoryTask both handle result updating (clearing if required) so directly calling + /// Results.Clear() is not required. However when both are not called, we need to directly clear results and this + /// method determines on the condition when clear results should happen. + /// + /// The collection of plugins to check. + /// True if existing results should be cleared, false otherwise. private bool ShouldClearExistingResultsForNonQuery(ICollection plugins) { if (!Settings.ShowHistoryResultsForHomePage && (plugins.Count == 0 || plugins.All(x => x.Metadata.HomeDisabled == true))) { - App.API.LogDebug(ClassName, $"Cleared old results"); + App.API.LogDebug(ClassName, $"Existing results should be cleared for non-query"); return true; } diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs index cd2736afa..46a92f750 100644 --- a/Flow.Launcher/ViewModel/ResultsViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs @@ -235,7 +235,10 @@ namespace Flow.Launcher.ViewModel var newResults = resultsForUpdates.SelectMany(u => u.Results, (u, r) => new ResultViewModel(r, _settings)); if (resultsForUpdates.Any(x => x.shouldClearExistingResults)) + { + App.API.LogDebug("NewResults", $"Existing results are cleared for query"); return newResults.OrderByDescending(rv => rv.Result.Score).ToList(); + } return Results.Where(r => r?.Result != null && resultsForUpdates.All(u => u.ID != r.Result.PluginID)) .Concat(newResults) From 50fced959e768c333895af98e8323d6f1e67595a Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sat, 17 May 2025 21:10:47 +1000 Subject: [PATCH 014/101] remove async warning --- Flow.Launcher/MainWindow.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 18bceedd8..f91d9d559 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -105,7 +105,7 @@ namespace Flow.Launcher Win32Helper.DisableControlBox(this); } - private async void OnLoaded(object sender, RoutedEventArgs _) + private void OnLoaded(object sender, RoutedEventArgs _) { // Check first launch if (_settings.FirstLaunch) From 073594fdeb365a504ac29927898136f3bcf0c076 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sat, 17 May 2025 22:02:45 +1000 Subject: [PATCH 015/101] formatting --- Flow.Launcher/ViewModel/MainViewModel.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index bfda18b9a..658eabde7 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1280,8 +1280,6 @@ namespace Flow.Launcher.ViewModel // Update the query's IsReQuery property to true if this is a re-query query.IsReQuery = isReQuery; - - ICollection plugins = Array.Empty(); if (currentIsHomeQuery) { @@ -1345,7 +1343,6 @@ namespace Flow.Launcher.ViewModel Results.Clear(); App.API.LogDebug(ClassName, $"Existing results are cleared for non-query"); } - tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch { From 0b4409711115abb8baa34d7e82b7acd4aa467f99 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sat, 17 May 2025 22:12:35 +1000 Subject: [PATCH 016/101] fix encapsulation for show results --- Flow.Launcher.Infrastructure/UserSettings/Settings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 387469d24..8890c4581 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -173,7 +173,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings } } - public bool _showHistoryResultsForHomePage { get; set; } = false; + private bool _showHistoryResultsForHomePage = false; public bool ShowHistoryResultsForHomePage { get => _showHistoryResultsForHomePage; From 7399d112611cf785cba2dd9afb2f15e79451ad95 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 17 May 2025 20:27:31 +0800 Subject: [PATCH 017/101] Add whitespace for if --- .../UserSettings/Settings.cs | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 8890c4581..9d2d854f4 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -179,7 +179,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings get => _showHistoryResultsForHomePage; set { - if(_showHistoryResultsForHomePage != value) + if (_showHistoryResultsForHomePage != value) { _showHistoryResultsForHomePage = value; OnPropertyChanged(); @@ -404,29 +404,29 @@ namespace Flow.Launcher.Infrastructure.UserSettings var list = FixedHotkeys(); // Customizeable hotkeys - if(!string.IsNullOrEmpty(Hotkey)) + if (!string.IsNullOrEmpty(Hotkey)) list.Add(new(Hotkey, "flowlauncherHotkey", () => Hotkey = "")); - if(!string.IsNullOrEmpty(PreviewHotkey)) + if (!string.IsNullOrEmpty(PreviewHotkey)) list.Add(new(PreviewHotkey, "previewHotkey", () => PreviewHotkey = "")); - if(!string.IsNullOrEmpty(AutoCompleteHotkey)) + if (!string.IsNullOrEmpty(AutoCompleteHotkey)) list.Add(new(AutoCompleteHotkey, "autoCompleteHotkey", () => AutoCompleteHotkey = "")); - if(!string.IsNullOrEmpty(AutoCompleteHotkey2)) + if (!string.IsNullOrEmpty(AutoCompleteHotkey2)) list.Add(new(AutoCompleteHotkey2, "autoCompleteHotkey", () => AutoCompleteHotkey2 = "")); - if(!string.IsNullOrEmpty(SelectNextItemHotkey)) + if (!string.IsNullOrEmpty(SelectNextItemHotkey)) list.Add(new(SelectNextItemHotkey, "SelectNextItemHotkey", () => SelectNextItemHotkey = "")); - if(!string.IsNullOrEmpty(SelectNextItemHotkey2)) + if (!string.IsNullOrEmpty(SelectNextItemHotkey2)) list.Add(new(SelectNextItemHotkey2, "SelectNextItemHotkey", () => SelectNextItemHotkey2 = "")); - if(!string.IsNullOrEmpty(SelectPrevItemHotkey)) + if (!string.IsNullOrEmpty(SelectPrevItemHotkey)) list.Add(new(SelectPrevItemHotkey, "SelectPrevItemHotkey", () => SelectPrevItemHotkey = "")); - if(!string.IsNullOrEmpty(SelectPrevItemHotkey2)) + if (!string.IsNullOrEmpty(SelectPrevItemHotkey2)) list.Add(new(SelectPrevItemHotkey2, "SelectPrevItemHotkey", () => SelectPrevItemHotkey2 = "")); - if(!string.IsNullOrEmpty(SettingWindowHotkey)) + if (!string.IsNullOrEmpty(SettingWindowHotkey)) list.Add(new(SettingWindowHotkey, "SettingWindowHotkey", () => SettingWindowHotkey = "")); - if(!string.IsNullOrEmpty(OpenContextMenuHotkey)) + if (!string.IsNullOrEmpty(OpenContextMenuHotkey)) list.Add(new(OpenContextMenuHotkey, "OpenContextMenuHotkey", () => OpenContextMenuHotkey = "")); - if(!string.IsNullOrEmpty(SelectNextPageHotkey)) + if (!string.IsNullOrEmpty(SelectNextPageHotkey)) list.Add(new(SelectNextPageHotkey, "SelectNextPageHotkey", () => SelectNextPageHotkey = "")); - if(!string.IsNullOrEmpty(SelectPrevPageHotkey)) + if (!string.IsNullOrEmpty(SelectPrevPageHotkey)) list.Add(new(SelectPrevPageHotkey, "SelectPrevPageHotkey", () => SelectPrevPageHotkey = "")); if (!string.IsNullOrEmpty(CycleHistoryUpHotkey)) list.Add(new(CycleHistoryUpHotkey, "CycleHistoryUpHotkey", () => CycleHistoryUpHotkey = "")); From b5a17b4a24829c657cd2178e9178320f9bfbc3b7 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 17 May 2025 21:35:52 +0800 Subject: [PATCH 018/101] Improve logic --- Flow.Launcher/PublicAPIInstance.cs | 58 ++++++++++++++---------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index ad48081b4..0e32ffae5 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -316,46 +316,42 @@ namespace Flow.Launcher public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null) { - string targetPath; - - if (FileNameOrFilePath is null) - { - targetPath = DirectoryPath; - } - else - { - targetPath = Path.IsPathRooted(FileNameOrFilePath) - ? FileNameOrFilePath - : Path.Combine(DirectoryPath, FileNameOrFilePath); - } - var explorerInfo = _settings.CustomExplorer; var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant(); - - // If explorer.exe, ignore and pass only the path to Shell + var targetPath = FileNameOrFilePath is null + ? DirectoryPath + : Path.IsPathRooted(FileNameOrFilePath) + ? FileNameOrFilePath + : Path.Combine(DirectoryPath, FileNameOrFilePath); + + using var explorer = new Process(); if (Path.GetFileNameWithoutExtension(explorerPath) == "explorer") { - Process.Start(new ProcessStartInfo + // Windows File Manager + // We should ignore and pass only the path to Shell to prevent zombie explorer.exe processes + explorer.StartInfo = new ProcessStartInfo { FileName = targetPath, // Not explorer, Only path. UseShellExecute = true // Must be true to open folder - }); - return; + }; + } + else + { + // Custom File Manager + explorer.StartInfo = new ProcessStartInfo + { + FileName = explorerInfo.Path.Replace("%d", DirectoryPath), + UseShellExecute = true, + Arguments = FileNameOrFilePath is null + ? explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) + : explorerInfo.FileArgument + .Replace("%d", DirectoryPath) + .Replace("%f", targetPath) + }; } - // Custom File Manager - var psi = new ProcessStartInfo - { - FileName = explorerInfo.Path.Replace("%d", DirectoryPath), - UseShellExecute = true, - Arguments = FileNameOrFilePath is null - ? explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) - : explorerInfo.FileArgument - .Replace("%d", DirectoryPath) - .Replace("%f", targetPath) - }; - - Process.Start(psi); + // Start the process + explorer.Start(); } private void OpenUri(Uri uri, bool? inPrivate = null) From 95eaa79c703200cdae6cca6111f66a94ef01db77 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 17 May 2025 21:36:33 +0800 Subject: [PATCH 019/101] Improve code logic --- Flow.Launcher/PublicAPIInstance.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 0e32ffae5..828779f0a 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -316,6 +316,7 @@ namespace Flow.Launcher public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null) { + using var explorer = new Process(); var explorerInfo = _settings.CustomExplorer; var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant(); var targetPath = FileNameOrFilePath is null @@ -324,7 +325,6 @@ namespace Flow.Launcher ? FileNameOrFilePath : Path.Combine(DirectoryPath, FileNameOrFilePath); - using var explorer = new Process(); if (Path.GetFileNameWithoutExtension(explorerPath) == "explorer") { // Windows File Manager From 87d11c0a74e4d641157f6baa2d7b197517974225 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 17 May 2025 21:37:27 +0800 Subject: [PATCH 020/101] Remove code comments --- Flow.Launcher/PublicAPIInstance.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 828779f0a..796f65ae6 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -349,8 +349,6 @@ namespace Flow.Launcher .Replace("%f", targetPath) }; } - - // Start the process explorer.Start(); } From 8aed36e2efa7999bdef82fce688f4e1af7e9dc20 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 18 May 2025 18:26:45 +1000 Subject: [PATCH 021/101] New Crowdin updates (#3531) --- Flow.Launcher/Languages/pl.xaml | 2 +- Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml | 5 +++-- Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml | 2 ++ 49 files changed, 98 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml index 7cc6dfcb1..081c8e90e 100644 --- a/Flow.Launcher/Languages/pl.xaml +++ b/Flow.Launcher/Languages/pl.xaml @@ -488,7 +488,7 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d Anuluj Aktualizacja nie powiodła się Sprawdź połączenie i spróbuj zaktualizować ustawienia proxy do github-cloud.s3.amazonaws.com. - Aby dokończyć proces aktualizacji Flow Launcher musi zostać zresetowany + Aby dokończyć proces aktualizacji Flow Launcher musi zostać zrestartowany Następujące pliki zostaną zaktualizowane Aktualizuj pliki Opis aktualizacji diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml index db85ef7b1..0a3bfc36a 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml @@ -80,6 +80,8 @@ نسخ المسار نسخ مسار العنصر الحالي إلى الحافظة + Copy name + Copy name of current item to clipboard نسخ نسخ الملف الحالي إلى الحافظة نسخ المجلد الحالي إلى الحافظة diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml index 9d23e3afe..4fc248a2a 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml @@ -80,6 +80,8 @@ Kopírovat cestu Zkopírovat cestu k aktuální položce do schránky + Copy name + Copy name of current item to clipboard Kopírovat Kopírovat aktuální soubor do schránky Kopírovat aktuální složku do schránky diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml index 0f7619954..e0ae6d9c8 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml @@ -80,6 +80,8 @@ Copy path Copy path of current item to clipboard + Copy name + Copy name of current item to clipboard Copy Copy current file to clipboard Copy current folder to clipboard diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml index f2df655c7..1ee327adb 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml @@ -80,6 +80,8 @@ Pfad kopieren Pfad des aktuellen Elements in Zwischenablage kopieren + Copy name + Copy name of current item to clipboard Kopieren Aktuelle Datei in Zwischenablage kopieren Aktuellen Ordner in Zwischenablage kopieren diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml index 304a41c23..490096013 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml @@ -80,6 +80,8 @@ Copy path Copy path of current item to clipboard + Copy name + Copy name of current item to clipboard Copy Copy current file to clipboard Copy current folder to clipboard diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml index e144b724c..8977eb6a7 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml @@ -80,6 +80,8 @@ Copiar ruta Copia la ruta del elemento actual al portapapeles + Copiar nombre + Copiar nombre del elemento actual al portapapeles Copiar Copia el archivo actual al portapapeles Copia la carpeta actual al portapapeles diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml index 37d557c37..79eab8918 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml @@ -80,6 +80,8 @@ Copier le chemin Copier le chemin de l'élément actuel dans le presse-papiers + Copier le nom + Copier le nom de l'élément actuel dans le presse-papiers Copier Copier le fichier actuel dans le presse-papiers Copier le dossier actuel dans le presse-papiers diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml index cabdd51f3..cc8415692 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml @@ -80,6 +80,8 @@ העתק נתיב העתק את הנתיב של הפריט הנוכחי ללוח + העתק שם + העתק את שם הפריט הנוכחי ללוח העתק העתק את הקובץ הנוכחי ללוח העתק את התיקייה הנוכחית ללוח diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml index eb0ef2771..492e3e03d 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml @@ -80,6 +80,8 @@ Copia percorso Copia negli appunti il percorso dell'elemento corrente + Copy name + Copy name of current item to clipboard Copia Copia file corrente negli appunti Copia cartella corrente negli appunti diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml index 29c97a651..d815e2ddc 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml @@ -80,6 +80,8 @@ パスをコピー 現在の項目のパスをコピー + Copy name + Copy name of current item to clipboard コピー 現在のファイルをコピー 現在のフォルダーをコピー diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml index 0d96210e1..1d11556ad 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml @@ -80,6 +80,8 @@ 경로 복사 이 항목의 경로를 클립보드에 복사 + Copy name + Copy name of current item to clipboard 복사하기 이 파일을 클립보드에 복사 이 파일을 클립보드에 복사 diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml index 9c908c569..3488ad2f0 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml @@ -80,6 +80,8 @@ Kopier sti Kopier sti til gjeldende element til utklippstavlen + Copy name + Copy name of current item to clipboard Kopier Kopier gjeldende fil til utklippstavlen Kopier gjeldende mappe til utklippstavlen diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml index 38e45aaa8..b6816b63f 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml @@ -80,6 +80,8 @@ Copy path Copy path of current item to clipboard + Copy name + Copy name of current item to clipboard Copy Copy current file to clipboard Copy current folder to clipboard diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml index 324b8ad36..f4cecc440 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml @@ -80,6 +80,8 @@ Skopiuj Ścieżkę Kopiuj ścieżkę bieżącego elementu do schowka + Copy name + Copy name of current item to clipboard Kopiuj Kopiuj bieżący plik do schowka Kopiuj bieżący folder do schowka diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml index 058bd353f..2754a5a99 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml @@ -80,6 +80,8 @@ Copy path Copy path of current item to clipboard + Copy name + Copy name of current item to clipboard Copiar Copy current file to clipboard Copy current folder to clipboard diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml index 39d056e28..af7c58a95 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml @@ -80,6 +80,8 @@ Copiar caminho Copiar caminho do item atual para área de transferência + Copiar nome + Copiar nome do item para a área de transferência Copiar Copiar ficheiro atual para a área de transferência Copiar pasta atual para a área de transferência diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml index 911364fdf..aa67373e2 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml @@ -80,6 +80,8 @@ Скопировать путь Copy path of current item to clipboard + Copy name + Copy name of current item to clipboard Скопировать Copy current file to clipboard Copy current folder to clipboard diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml index 35883a09c..b538ea9e1 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml @@ -80,6 +80,8 @@ Kopírovať cestu Skopírovať cestu k aktuálnej položke do schránky + Kopírovať názov + Skopírovať názov aktuálnej položky do schránky Kopírovať Skopírovať aktuálny súbor do schránky Skopírovať aktuálny priečinok do schránky diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml index f1227df40..54e419519 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml @@ -80,6 +80,8 @@ Copy path Copy path of current item to clipboard + Copy name + Copy name of current item to clipboard Copy Copy current file to clipboard Copy current folder to clipboard diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml index 1e09ba103..465a4fdd7 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml @@ -80,6 +80,8 @@ Yolu kopyala Mevcut dosya konumunu panoya kopyala + Copy name + Copy name of current item to clipboard Kopyala Mevcut dosyayı panoya kopyala Mevcut klasörü panoya kopyala diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml index d96b5b503..4df9ddaa1 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml @@ -80,6 +80,8 @@ Копіювати шлях Копіювати шлях до поточного елемента в буфер обміну + Copy name + Copy name of current item to clipboard Копіювати Копіювання поточного файлу в буфер обміну Копіювати поточну папку в буфер обміну @@ -161,6 +163,5 @@ Рідне контекстне меню Відображати рідне контекстне меню (експериментально) Нижче ви можете вказати елементи, які хочете включити до контекстного меню, вони можуть бути частковими (наприклад, «шир пера») або повними («Відкрити за допомогою»). - Нижче ви можете вказати елементи, які хочете виключити з контекстного меню, вони можуть бути частковими (наприклад, «шир пера») або повними («Відкрити за допомогою»). - + Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml index 81b5a2f92..1fed3d067 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml @@ -80,6 +80,8 @@ Copy đường dẫn Sao chép đường dẫn của mục hiện tại vào clipboard + Copy name + Copy name of current item to clipboard Sao chép Sao chép tập tin hiện tại vào clipboard Copy current folder to clipboard diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml index 64831ea13..67253d1e1 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml @@ -80,6 +80,8 @@ 复制路径 复制当前结果的路径到剪贴板 + Copy name + Copy name of current item to clipboard 复制 复制当前文件到剪贴板 复制当前文件夹到剪贴板 diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml index 9e9697255..873a3866d 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml @@ -80,6 +80,8 @@ 複製路徑 Copy path of current item to clipboard + Copy name + Copy name of current item to clipboard 複製 Copy current file to clipboard Copy current folder to clipboard diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml index d352368cb..c65fa196b 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml @@ -46,6 +46,8 @@ الرجاء تحديد مصدر برنامج هل أنت متأكد أنك تريد حذف مصادر البرامج المحددة؟ + Please select program sources that are not added by you + Please select program sources that are added by you مصدر برنامج آخر بنفس الموقع موجود بالفعل. مصدر البرنامج diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml index ca57bf027..b694c5bdd 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml @@ -46,6 +46,8 @@ Prosím vyberte zdroj programu Jste si jisti, že chcete odstranit vybrané zdroje programů? + Please select program sources that are not added by you + Please select program sources that are added by you Již existuje jiný zdroj programu se stejným umístěním. Zdroj programu diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml index a0f09a3b5..5958eba32 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml @@ -46,6 +46,8 @@ Please select a program source Are you sure you want to delete the selected program sources? + Please select program sources that are not added by you + Please select program sources that are added by you Another program source with the same location already exists. Program Source diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml index ec5d273d6..7919ae7cb 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml @@ -46,6 +46,8 @@ Bitte wählen Sie eine Programmquelle aus Sind Sie sicher, dass Sie die ausgewählten Programmquellen löschen wollen? + Please select program sources that are not added by you + Please select program sources that are added by you Eine andere Programmquelle mit dem gleichen Ort ist bereits vorhanden. Programmquelle diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml index d9ffa668c..9818e4226 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml @@ -46,6 +46,8 @@ Please select a program source Are you sure you want to delete the selected program sources? + Please select program sources that are not added by you + Please select program sources that are added by you Another program source with the same location already exists. Program Source diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml index d0b6851d9..2e1eadb2b 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml @@ -46,6 +46,8 @@ Por favor, seleccione la ruta del programa ¿Está seguro de que desea eliminar las fuentes del programa seleccionadas? + Please select program sources that are not added by you + Please select program sources that are added by you Ya existe otra fuente de programa con la misma ubicación. Fuente de Programa diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml index e6fd67936..e509a875f 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml @@ -46,6 +46,8 @@ Veuillez sélectionner une source de programme Êtes-vous sûr de vouloir supprimer les sources de programmes sélectionnées ? + Veuillez sélectionner les sources de programmes qui n'ont pas été ajoutées par vous-même + Veuillez sélectionner les sources de programmes qui ont été ajoutées par vous-même Il existe déjà une autre source de programme ayant le même emplacement. Source du programme diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml index 88053ac57..83f034646 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml @@ -46,6 +46,8 @@ אנא בחר מקור תוכנה האם אתה בטוח שברצונך למחוק את מקורות התוכניות שנבחרו? + Please select program sources that are not added by you + Please select program sources that are added by you מקור תוכנה נוסף עם אותו מיקום כבר קיים. מקור תוכנה diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml index 5004d41cf..bb97a0085 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml @@ -46,6 +46,8 @@ Seleziona la sorgente del programma Sei sicuro di voler cancellare le sorgenti dei programmi selezionate? + Please select program sources that are not added by you + Please select program sources that are added by you Another program source with the same location already exists. Program Source diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml index 96ca3af60..4a1d815ec 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml @@ -46,6 +46,8 @@ Please select a program source Are your sure to delete {0}? + Please select program sources that are not added by you + Please select program sources that are added by you Another program source with the same location already exists. Program Source diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml index 266aa4b45..f2ac75762 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml @@ -46,6 +46,8 @@ 프로그램 검색 출처를 선택하세요 선택하신 프로그램 출처를 삭제하시겠습니까? + Please select program sources that are not added by you + Please select program sources that are added by you Another program source with the same location already exists. Program Source diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml index c4b218204..25018d752 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml @@ -46,6 +46,8 @@ Vennligst velg en programkilde Er du sikker på at du vil slette de valgte programkildene? + Please select program sources that are not added by you + Please select program sources that are added by you Det finnes allerede en annen programkilde med samme plassering. Programkilde diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml index 495296694..eb8a6f1a6 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml @@ -46,6 +46,8 @@ Please select a program source Are you sure you want to delete the selected program sources? + Please select program sources that are not added by you + Please select program sources that are added by you Another program source with the same location already exists. Program Source diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml index f38fd9623..4d1483eee 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml @@ -46,6 +46,8 @@ Musisz wybrać katalog programu Czy na pewno chcesz usunąć wybrane źródła programów? + Please select program sources that are not added by you + Please select program sources that are added by you Inne źródło programu z tą samą lokalizacją już istnieje. Źródło programu diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml index 3ff8be551..978c2833d 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml @@ -46,6 +46,8 @@ Please select a program source Are you sure you want to delete the selected program sources? + Please select program sources that are not added by you + Please select program sources that are added by you Another program source with the same location already exists. Program Source diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml index aa3c500a3..cc3e280b2 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml @@ -46,6 +46,8 @@ Por favor selecione uma origem de programas Tem a certeza de que deseja remover as origens selecionadas? + Selecione as origens de programas NÃO adicionadas por si + Selecione as origens de programas adicionadas por si Já existe uma origem de programas com esta localização. Origem de programas diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml index a75a6d836..7624d6517 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml @@ -46,6 +46,8 @@ Пожалуйста, выберите источник программы Вы уверены, что хотите удалить выбранные источники программ? + Please select program sources that are not added by you + Please select program sources that are added by you Другой источник программы с таким же расположением уже существует. Источник программы diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml index 7fda65160..b30b56a5b 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml @@ -46,6 +46,8 @@ Prosím, zadajte zdroj programu Naozaj chcete odstrániť vybrané zdroje programov? + Vyberte zdroje programov, ktoré ste nepridali vy + Vyberte zdroje programov, ktoré ste pridali vy Iný zdroj programu s rovnakým umiestnením už existuje. Zdroj programu diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml index f2da895b0..a79655a7b 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml @@ -46,6 +46,8 @@ Please select a program source Are you sure you want to delete the selected program sources? + Please select program sources that are not added by you + Please select program sources that are added by you Another program source with the same location already exists. Program Source diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml index 6bda659dd..126613065 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml @@ -46,6 +46,8 @@ İşlem yapmak istediğiniz klasörü seçin. Are you sure you want to delete the selected program sources? + Please select program sources that are not added by you + Please select program sources that are added by you Another program source with the same location already exists. Program Source diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml index 3686925a9..290954d5f 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml @@ -46,6 +46,8 @@ Будь ласка, виберіть джерело програми Ви впевнені, що хочете видалити вибрані джерела програм? + Please select program sources that are not added by you + Please select program sources that are added by you Інше програмне джерело з тим самим розташуванням вже існує. Вихідний код програми diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml index 6b238c638..0dede0f8b 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml @@ -46,6 +46,8 @@ Hãy chọn một nguồn dữ liệu Bạn có chắc chắn là muốn xóa các đặt hàng đã chọn? + Please select program sources that are not added by you + Please select program sources that are added by you Đã tồn tại một nguồn chương trình khác có cùng vị trí. Nguồn chương trình diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml index b36b72b9b..6bafe86e0 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml @@ -46,6 +46,8 @@ 请先选择一项 您确定要删除选定的程序源吗? + Please select program sources that are not added by you + Please select program sources that are added by you 相同位置存在另一个程序源。 程序源 diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml index 084adfbac..a8ff4ecbc 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml @@ -46,6 +46,8 @@ 請先選擇一項 Are you sure you want to delete the selected program sources? + Please select program sources that are not added by you + Please select program sources that are added by you Another program source with the same location already exists. Program Source From f38bf674e060c3abbf8eb5519667a2f72875fdcd Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 18 May 2025 22:15:44 +1000 Subject: [PATCH 022/101] add publish to Chocolatey dispatch event --- .github/workflows/release_deploy.yml | 34 ++++++++++++++++++++++++++++ .github/workflows/website_deploy.yml | 21 ----------------- 2 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/release_deploy.yml delete mode 100644 .github/workflows/website_deploy.yml diff --git a/.github/workflows/release_deploy.yml b/.github/workflows/release_deploy.yml new file mode 100644 index 000000000..028f0045a --- /dev/null +++ b/.github/workflows/release_deploy.yml @@ -0,0 +1,34 @@ +--- + +name: New Release Deployments +on: + release: + types: [published] + workflow_dispatch: + +jobs: + deploy-website: + runs-on: ubuntu-latest + steps: + - name: Trigger dispatch event for deploying website + run: | + http_status=$(curl -L -f -s -o /dev/null -w "%{http_code}" \ + -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer ${{ secrets.DEPLOY_FLOW_WEBSITE }}" \ + https://api.github.com/repos/Flow-Launcher/flow-launcher.github.io/dispatches \ + -d '{"event_type":"deploy"}') + if [ "$http_status" -ne 204 ]; then echo "Error: Deploy website failed, HTTP status code is $http_status"; exit 1; fi + + publish-chocolatey: + runs-on: ubuntu-latest + steps: + - name: Trigger dispatch event for publishing to Chocolatey + run: | + http_status=$(curl -L -f -s -o /dev/null -w "%{http_code}" \ + -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer ${{ secrets.Publish_Chocolatey }}" \ + https://api.github.com/repos/Flow-Launcher/chocolatey-package/dispatches \ + -d '{"event_type":"publish"}') + if [ "$http_status" -ne 204 ]; then echo "Error: Publish Chocolatey Packaged failed, HTTP status code is $http_status"; exit 1; fi diff --git a/.github/workflows/website_deploy.yml b/.github/workflows/website_deploy.yml deleted file mode 100644 index 2d44e4a2c..000000000 --- a/.github/workflows/website_deploy.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- - -name: Deploy Website On Release -on: - release: - types: [published] - workflow_dispatch: - -jobs: - dispatch: - runs-on: ubuntu-latest - steps: - - name: Dispatch event - run: | - http_status=$(curl -L -f -s -o /dev/null -w "%{http_code}" \ - -X POST \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: Bearer ${{ secrets.DEPLOY_FLOW_WEBSITE }}" \ - https://api.github.com/repos/Flow-Launcher/flow-launcher.github.io/dispatches \ - -d '{"event_type":"deploy"}') - if [ "$http_status" -ne 204 ]; then echo "Error: Deploy trigger failed, HTTP status code is $http_status"; exit 1; fi From ec7ab007d044fd0f6bfad469c5628b284d3c7370 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 18 May 2025 22:23:10 +1000 Subject: [PATCH 023/101] fix typo --- .github/workflows/release_deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release_deploy.yml b/.github/workflows/release_deploy.yml index 028f0045a..9e082b95f 100644 --- a/.github/workflows/release_deploy.yml +++ b/.github/workflows/release_deploy.yml @@ -31,4 +31,4 @@ jobs: -H "Authorization: Bearer ${{ secrets.Publish_Chocolatey }}" \ https://api.github.com/repos/Flow-Launcher/chocolatey-package/dispatches \ -d '{"event_type":"publish"}') - if [ "$http_status" -ne 204 ]; then echo "Error: Publish Chocolatey Packaged failed, HTTP status code is $http_status"; exit 1; fi + if [ "$http_status" -ne 204 ]; then echo "Error: Publish Chocolatey package failed, HTTP status code is $http_status"; exit 1; fi From b878532cdddfef9833ac384d0ff7672782c0803d Mon Sep 17 00:00:00 2001 From: Jeremy Date: Mon, 19 May 2025 22:19:35 +1000 Subject: [PATCH 024/101] unify plugin versions to flow main version --- appveyor.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index af5aaefdc..74b86fc50 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,6 +8,14 @@ init: { $env:prereleaseTag = "{0}.{1}.{2}.{3}" -f $version.Major, $version.Minor, $version.Build, $version.Revision } + + $jsonFiles = Get-ChildItem -Path ".\Plugins\*\plugin.json" + foreach ($file in $jsonFiles) { + $plugin_old_ver = Get-Content $file.FullName -Raw | ConvertFrom-Json + (Get-Content $file) -replace '"Version"\s*:\s*".*?"', "`"Version`": `"$env:flowVersion`"" | Set-Content $file + $plugin_new_ver = Get-Content $file.FullName -Raw | ConvertFrom-Json + Write-Host "Updated" $plugin_old_ver.Name "version from" $plugin_old_ver.Version "to" $plugin_new_ver.Version + } - sc config WSearch start= auto # Starts Windows Search service- Needed for running ExplorerTest - net start WSearch From 94cec8aa1bdbec9f435de64e0a8c27237362e1b3 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 20 May 2025 12:43:26 +1000 Subject: [PATCH 025/101] move plugin version bump to build step --- appveyor.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 74b86fc50..5902f09f1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -8,14 +8,6 @@ init: { $env:prereleaseTag = "{0}.{1}.{2}.{3}" -f $version.Major, $version.Minor, $version.Build, $version.Revision } - - $jsonFiles = Get-ChildItem -Path ".\Plugins\*\plugin.json" - foreach ($file in $jsonFiles) { - $plugin_old_ver = Get-Content $file.FullName -Raw | ConvertFrom-Json - (Get-Content $file) -replace '"Version"\s*:\s*".*?"', "`"Version`": `"$env:flowVersion`"" | Set-Content $file - $plugin_new_ver = Get-Content $file.FullName -Raw | ConvertFrom-Json - Write-Host "Updated" $plugin_old_ver.Name "version from" $plugin_old_ver.Version "to" $plugin_new_ver.Version - } - sc config WSearch start= auto # Starts Windows Search service- Needed for running ExplorerTest - net start WSearch @@ -34,7 +26,16 @@ image: Visual Studio 2022 platform: Any CPU configuration: Release before_build: -- ps: nuget restore +- ps: | + nuget restore + + $jsonFiles = Get-ChildItem -Path ".\Plugins\*\plugin.json" + foreach ($file in $jsonFiles) { + $plugin_old_ver = Get-Content $file.FullName -Raw | ConvertFrom-Json + (Get-Content $file) -replace '"Version"\s*:\s*".*?"', "`"Version`": `"$env:flowVersion`"" | Set-Content $file + $plugin_new_ver = Get-Content $file.FullName -Raw | ConvertFrom-Json + Write-Host "Updated" $plugin_old_ver.Name "version from" $plugin_old_ver.Version "to" $plugin_new_ver.Version + } build: project: Flow.Launcher.sln verbosity: minimal From 2b9529d2f97eb767117350d07f5ceef2e8d225ba Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 20 May 2025 09:06:11 +0000 Subject: [PATCH 026/101] set all of plugins' version to default 1.0.0 --- Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json | 2 +- Plugins/Flow.Launcher.Plugin.Calculator/plugin.json | 2 +- Plugins/Flow.Launcher.Plugin.Explorer/plugin.json | 2 +- Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json | 2 +- Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json | 2 +- Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json | 2 +- Plugins/Flow.Launcher.Plugin.Program/plugin.json | 2 +- Plugins/Flow.Launcher.Plugin.Shell/plugin.json | 2 +- Plugins/Flow.Launcher.Plugin.Sys/plugin.json | 2 +- Plugins/Flow.Launcher.Plugin.Url/plugin.json | 2 +- Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json | 2 +- Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json index 519141f6c..30e34f62d 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json @@ -4,7 +4,7 @@ "Name": "Browser Bookmarks", "Description": "Search your browser bookmarks", "Author": "qianlifeng, Ioannis G.", - "Version": "3.3.4", + "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.BrowserBookmark.dll", diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json index 99e185928..485babd26 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json @@ -4,7 +4,7 @@ "Name": "Calculator", "Description": "Provide mathematical calculations.(Try 5*3-2 in Flow Launcher)", "Author": "cxfksword", - "Version": "3.1.5", + "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.Calculator.dll", diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json b/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json index d2440ab61..5eea2646e 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json @@ -11,7 +11,7 @@ "Name": "Explorer", "Description": "Find and manage files and folders via Windows Search or Everything", "Author": "Jeremy Wu", - "Version": "3.2.4", + "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.Explorer.dll", diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json index 2b4870792..7e6a2e613 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json @@ -4,7 +4,7 @@ "Name": "Plugin Indicator", "Description": "Provides plugin action keyword suggestions", "Author": "qianlifeng", - "Version": "3.0.7", + "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.PluginIndicator.dll", diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json index df5a2c784..327011ac3 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json @@ -6,7 +6,7 @@ "Name": "Plugins Manager", "Description": "Management of installing, uninstalling or updating Flow Launcher plugins", "Author": "Jeremy Wu", - "Version": "3.2.4", + "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.PluginsManager.dll", diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json b/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json index 956c4b4e1..0379194c4 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json @@ -4,7 +4,7 @@ "Name":"Process Killer", "Description":"Kill running processes from Flow", "Author":"Flow-Launcher", - "Version":"3.0.8", + "Version": "1.0.0", "Language":"csharp", "Website":"https://github.com/Flow-Launcher/Flow.Launcher.Plugin.ProcessKiller", "IcoPath":"Images\\app.png", diff --git a/Plugins/Flow.Launcher.Plugin.Program/plugin.json b/Plugins/Flow.Launcher.Plugin.Program/plugin.json index 5a95e75f4..0316a2397 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.Program/plugin.json @@ -4,7 +4,7 @@ "Name": "Program", "Description": "Search programs in Flow.Launcher", "Author": "qianlifeng", - "Version": "3.3.4", + "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.Program.dll", diff --git a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json index 681e8f751..36f9b8e00 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json @@ -4,7 +4,7 @@ "Name": "Shell", "Description": "Provide executing commands from Flow Launcher", "Author": "qianlifeng", - "Version": "3.2.5", + "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.Shell.dll", diff --git a/Plugins/Flow.Launcher.Plugin.Sys/plugin.json b/Plugins/Flow.Launcher.Plugin.Sys/plugin.json index 90ca264cc..68ce6feb1 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.Sys/plugin.json @@ -4,7 +4,7 @@ "Name": "System Commands", "Description": "Provide System related commands. e.g. shutdown,lock, setting etc.", "Author": "qianlifeng", - "Version": "3.1.7", + "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.Sys.dll", diff --git a/Plugins/Flow.Launcher.Plugin.Url/plugin.json b/Plugins/Flow.Launcher.Plugin.Url/plugin.json index 73d9bff30..9f5576ba9 100644 --- a/Plugins/Flow.Launcher.Plugin.Url/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.Url/plugin.json @@ -4,7 +4,7 @@ "Name": "URL", "Description": "Open the typed URL from Flow Launcher", "Author": "qianlifeng", - "Version": "3.0.8", + "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.Url.dll", diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json b/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json index c8b6310a7..b4153feb1 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json @@ -27,7 +27,7 @@ "Name": "Web Searches", "Description": "Provide the web search ability", "Author": "qianlifeng", - "Version": "3.1.4", + "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.WebSearch.dll", diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json b/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json index 413a555d3..64743b3d8 100644 --- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json @@ -4,7 +4,7 @@ "Description": "Search settings inside Control Panel and Settings App", "Name": "Windows Settings", "Author": "TobiasSekan", - "Version": "4.0.12", + "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.WindowsSettings.dll", From 037b800f4a6d673f163e83e4c121c86f3fe777ac Mon Sep 17 00:00:00 2001 From: DB p Date: Tue, 20 May 2025 17:56:24 +0900 Subject: [PATCH 027/101] Add file manager path validation and error handling in SelectFileManagerWindow --- Flow.Launcher.Infrastructure/UserSettings/Settings.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 027eb3f92..f00f42ac0 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -226,8 +226,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings new() { Name = "Files", - Path = "Files", - DirectoryArgument = "-select \"%d\"", + Path = "Files-Stable", + DirectoryArgument = "\"%d\"", FileArgument = "-select \"%f\"" } }; From 2c7fb93d3710bd4cee3437b7bd4e090d23d37e2a Mon Sep 17 00:00:00 2001 From: DB p Date: Tue, 20 May 2025 18:49:38 +0900 Subject: [PATCH 028/101] Add error handling and validation for custom file manager paths --- Flow.Launcher/Languages/en.xaml | 6 ++ Flow.Launcher/PublicAPIInstance.cs | 83 ++++++++++++------- Flow.Launcher/SelectFileManagerWindow.xaml.cs | 56 ++++++++++++- 3 files changed, 114 insertions(+), 31 deletions(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index 22ab2016c..299fe3029 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -373,6 +373,8 @@ File Manager Path Arg For Folder Arg For File + The path for the file manager '{0}' could not be found: {1}\n\nDo you want to continue? + File Manager Path Error Default Web Browser @@ -462,6 +464,10 @@ 1. Upload log file: {0} 2. Copy below exception message + + An error occurred while opening the folder.:\n{0} + Error + Please wait... diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 796f65ae6..84448a685 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -316,40 +316,63 @@ namespace Flow.Launcher public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null) { - using var explorer = new Process(); - var explorerInfo = _settings.CustomExplorer; - var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant(); - var targetPath = FileNameOrFilePath is null - ? DirectoryPath - : Path.IsPathRooted(FileNameOrFilePath) - ? FileNameOrFilePath - : Path.Combine(DirectoryPath, FileNameOrFilePath); + try + { + using var explorer = new Process(); + var explorerInfo = _settings.CustomExplorer; + var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant(); + var targetPath = FileNameOrFilePath is null + ? DirectoryPath + : Path.IsPathRooted(FileNameOrFilePath) + ? FileNameOrFilePath + : Path.Combine(DirectoryPath, FileNameOrFilePath); - if (Path.GetFileNameWithoutExtension(explorerPath) == "explorer") - { - // Windows File Manager - // We should ignore and pass only the path to Shell to prevent zombie explorer.exe processes - explorer.StartInfo = new ProcessStartInfo + if (Path.GetFileNameWithoutExtension(explorerPath) == "explorer") { - FileName = targetPath, // Not explorer, Only path. - UseShellExecute = true // Must be true to open folder - }; - } - else - { - // Custom File Manager - explorer.StartInfo = new ProcessStartInfo + // Windows File Manager + explorer.StartInfo = new ProcessStartInfo + { + FileName = targetPath, + UseShellExecute = true + }; + } + else { - FileName = explorerInfo.Path.Replace("%d", DirectoryPath), - UseShellExecute = true, - Arguments = FileNameOrFilePath is null - ? explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) - : explorerInfo.FileArgument - .Replace("%d", DirectoryPath) - .Replace("%f", targetPath) - }; + // Custom File Manager + explorer.StartInfo = new ProcessStartInfo + { + FileName = explorerInfo.Path.Replace("%d", DirectoryPath), + UseShellExecute = true, + Arguments = FileNameOrFilePath is null + ? explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) + : explorerInfo.FileArgument + .Replace("%d", DirectoryPath) + .Replace("%f", targetPath) + }; + } + + explorer.Start(); + } + catch (System.ComponentModel.Win32Exception ex) when (ex.NativeErrorCode == 2) + { + // File Manager not found + MessageBoxEx.Show( + string.Format(GetTranslation("fileManagerNotFound"), ex.Message), + GetTranslation("fileManagerNotFoundTitle"), + MessageBoxButton.OK, + MessageBoxImage.Error + ); + } + catch (Exception ex) + { + // Other exceptions + MessageBoxEx.Show( + string.Format(GetTranslation("folderOpenError"), ex.Message), + GetTranslation("errorTitle"), + MessageBoxButton.OK, + MessageBoxImage.Error + ); } - explorer.Start(); } private void OpenUri(Uri uri, bool? inPrivate = null) diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml.cs b/Flow.Launcher/SelectFileManagerWindow.xaml.cs index bf94ddacb..d2f7ae764 100644 --- a/Flow.Launcher/SelectFileManagerWindow.xaml.cs +++ b/Flow.Launcher/SelectFileManagerWindow.xaml.cs @@ -1,5 +1,8 @@ -using System.Collections.ObjectModel; +using System; +using System.Collections.ObjectModel; using System.ComponentModel; +using System.Diagnostics; +using System.IO; using System.Linq; using System.Windows; using System.Windows.Controls; @@ -43,11 +46,62 @@ namespace Flow.Launcher private void btnDone_Click(object sender, RoutedEventArgs e) { + // Check if the selected file manager path is valid + if (!IsFileManagerValid(CustomExplorer.Path)) + { + MessageBoxResult result = MessageBoxEx.Show( + string.Format((string)Application.Current.FindResource("fileManagerPathNotFound"), + CustomExplorer.Name, CustomExplorer.Path), + (string)Application.Current.FindResource("fileManagerPathError"), + MessageBoxButton.YesNo, + MessageBoxImage.Warning); + + if (result == MessageBoxResult.No) + { + return; + } + } + _settings.CustomExplorerList = CustomExplorers.ToList(); _settings.CustomExplorerIndex = SelectedCustomExplorerIndex; Close(); } + private bool IsFileManagerValid(string path) + { + if (string.Equals(path, "explorer", StringComparison.OrdinalIgnoreCase)) + return true; + + if (Path.IsPathRooted(path)) + { + return File.Exists(path); + } + + try + { + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "where", + Arguments = path, + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true + } + }; + process.Start(); + string output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + + return !string.IsNullOrEmpty(output); + } + catch + { + return false; + } + } + private void btnAdd_Click(object sender, RoutedEventArgs e) { CustomExplorers.Add(new() From cc80221903577e21cc8123159d0f15ddde60a250 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 20 May 2025 20:00:13 +1000 Subject: [PATCH 029/101] Version bump for release --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 5902f09f1..fa0b5956b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: '1.19.5.{build}' +version: '1.20.0.{build}' init: - ps: | From aadfde09d5745c14af96af70227360967b39edd4 Mon Sep 17 00:00:00 2001 From: DB p Date: Tue, 20 May 2025 20:32:46 +0900 Subject: [PATCH 030/101] Add tips for file manager usage and improve error messages --- Flow.Launcher/Languages/en.xaml | 10 +++- Flow.Launcher/SelectFileManagerWindow.xaml | 15 ++++-- Flow.Launcher/SelectFileManagerWindow.xaml.cs | 46 +++++++++++++++++++ 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index 299fe3029..186f6bd3e 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -366,6 +366,8 @@ Select File Manager + Do you use Files? + Depending on the version, Files may use either "Files" or "Files-stable" as its path. (This can vary depending on which version you're using.) For more details, see: Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. File Manager @@ -373,7 +375,7 @@ File Manager Path Arg For Folder Arg For File - The path for the file manager '{0}' could not be found: {1}\n\nDo you want to continue? + The path for the file manager '{0}' could not be found: '{1}' Do you want to continue? File Manager Path Error @@ -465,8 +467,12 @@ 2. Copy below exception message - An error occurred while opening the folder.:\n{0} + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings >General. + Error + An error occurred while opening the folder. {0} Please wait... diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml b/Flow.Launcher/SelectFileManagerWindow.xaml index 0287af9b0..fbdc2c3b2 100644 --- a/Flow.Launcher/SelectFileManagerWindow.xaml +++ b/Flow.Launcher/SelectFileManagerWindow.xaml @@ -73,9 +73,18 @@ + void ShowMainWindow(); + + /// + /// Focus the query text box in the main window + /// + void FocusQueryTextBox(); /// /// Hide MainWindow diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index a0614d90f..7b80ec480 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -33,6 +33,7 @@ using JetBrains.Annotations; using Squirrel; using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch; using System.ComponentModel; +using System.Windows.Input; namespace Flow.Launcher { @@ -92,6 +93,18 @@ namespace Flow.Launcher } public void ShowMainWindow() => _mainVM.Show(); + + public void FocusQueryTextBox() + { + Application.Current.Dispatcher.Invoke(new Action(() => + { + if (Application.Current.MainWindow is MainWindow mw) + { + mw.QueryTextBox.Focus(); + Keyboard.Focus(mw.QueryTextBox); + } + })); + } public void HideMainWindow() => _mainVM.Hide(); diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs index 0d395c053..758ad09d5 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs @@ -378,10 +378,13 @@ namespace Flow.Launcher.Plugin.Shell private void OnWinRPressed() { + Context.API.ShowMainWindow(); // show the main window and set focus to the query box - _ = Task.Run(() => + _ = Task.Run(async () => { - Context.API.ShowMainWindow(); + await Task.Delay(50); // 💡 키보드 이벤트 처리가 끝난 뒤 + Context.API.FocusQueryTextBox(); + Context.API.ChangeQuery($"{Context.CurrentPluginMetadata.ActionKeywords[0]}{Plugin.Query.TermSeparator}"); }); } From 3718ae5640bbe5e9af2a389964386d9d81444114 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 22 May 2025 10:39:09 +0800 Subject: [PATCH 048/101] Improve code quality & Improve code comments --- Flow.Launcher/PublicAPIInstance.cs | 18 ++++-------------- Flow.Launcher/ViewModel/MainViewModel.cs | 15 +++++++++++++++ Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 9 ++++++--- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 7b80ec480..66e11f881 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -2,6 +2,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Specialized; +using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; @@ -10,6 +11,7 @@ using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using System.Windows; +using System.Windows.Input; using System.Windows.Media; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.Core; @@ -32,8 +34,6 @@ using Flow.Launcher.ViewModel; using JetBrains.Annotations; using Squirrel; using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch; -using System.ComponentModel; -using System.Windows.Input; namespace Flow.Launcher { @@ -93,18 +93,8 @@ namespace Flow.Launcher } public void ShowMainWindow() => _mainVM.Show(); - - public void FocusQueryTextBox() - { - Application.Current.Dispatcher.Invoke(new Action(() => - { - if (Application.Current.MainWindow is MainWindow mw) - { - mw.QueryTextBox.Focus(); - Keyboard.Focus(mw.QueryTextBox); - } - })); - } + + public void FocusQueryTextBox() => _mainVM.FocusQueryTextBox(); public void HideMainWindow() => _mainVM.Hide(); diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 807275fcb..6e1b0dd93 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1926,6 +1926,21 @@ namespace Flow.Launcher.ViewModel Results.AddResults(resultsForUpdates, token, reSelect); } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "")] + public void FocusQueryTextBox() + { + // When application is exiting, the Application.Current will be null + Application.Current?.Dispatcher.Invoke(() => + { + // When application is exiting, the Application.Current will be null + if (Application.Current?.MainWindow is MainWindow window) + { + window.QueryTextBox.Focus(); + Keyboard.Focus(window.QueryTextBox); + } + }); + } + #endregion #region IDisposable diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs index 758ad09d5..2613c770b 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs @@ -382,10 +382,13 @@ namespace Flow.Launcher.Plugin.Shell // show the main window and set focus to the query box _ = Task.Run(async () => { - await Task.Delay(50); // 💡 키보드 이벤트 처리가 끝난 뒤 - Context.API.FocusQueryTextBox(); - Context.API.ChangeQuery($"{Context.CurrentPluginMetadata.ActionKeywords[0]}{Plugin.Query.TermSeparator}"); + + // Win+R is a system-reserved shortcut, and though the plugin intercepts the keyboard event and + // shows the main window, Windows continues to process the Win key and briefly reclaims focus. + // So we need to wait until the keyboard event processing is completed and then set focus + await Task.Delay(50); + Context.API.FocusQueryTextBox(); }); } From 8aae92e61da289815da6d8f5291b5718c6741340 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 22 May 2025 10:47:07 +0800 Subject: [PATCH 049/101] Fix main window null when checking exitting --- Flow.Launcher/App.xaml.cs | 2 +- Flow.Launcher/SettingWindow.xaml.cs | 2 +- Flow.Launcher/ViewModel/MainViewModel.cs | 2 +- Flow.Launcher/WelcomeWindow.xaml.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs index 969bb75bb..cedced181 100644 --- a/Flow.Launcher/App.xaml.cs +++ b/Flow.Launcher/App.xaml.cs @@ -32,7 +32,7 @@ namespace Flow.Launcher #region Public Properties public static IPublicAPI API { get; private set; } - public static bool Exiting => _mainWindow.CanClose; + public static bool LoadingOrExiting => _mainWindow == null || _mainWindow.CanClose; #endregion diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index c53a4ea80..c1c0f96a7 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -82,7 +82,7 @@ public partial class SettingWindow _viewModel.PropertyChanged -= ViewModel_PropertyChanged; // If app is exiting, settings save is not needed because main window closing event will handle this - if (App.Exiting) return; + if (App.LoadingOrExiting) return; // Save settings when window is closed _settings.Save(); App.API.SavePluginSettings(); diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 807275fcb..c4da384f8 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1729,7 +1729,7 @@ namespace Flow.Launcher.ViewModel public void Show() { // When application is exiting, we should not show the main window - if (App.Exiting) return; + if (App.LoadingOrExiting) return; // When application is exiting, the Application.Current will be null Application.Current?.Dispatcher.Invoke(() => diff --git a/Flow.Launcher/WelcomeWindow.xaml.cs b/Flow.Launcher/WelcomeWindow.xaml.cs index ef0706765..fe8a63e52 100644 --- a/Flow.Launcher/WelcomeWindow.xaml.cs +++ b/Flow.Launcher/WelcomeWindow.xaml.cs @@ -96,7 +96,7 @@ namespace Flow.Launcher private void Window_Closed(object sender, EventArgs e) { // If app is exiting, settings save is not needed because main window closing event will handle this - if (App.Exiting) return; + if (App.LoadingOrExiting) return; // Save settings when window is closed _settings.Save(); } From 087a45c66458c700b5f9f0e28278fe2abd34938a Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Thu, 22 May 2025 20:41:04 +1000 Subject: [PATCH 050/101] New Crowdin updates (#3559) --- Flow.Launcher/Languages/ar.xaml | 11 +++++++++++ Flow.Launcher/Languages/cs.xaml | 11 +++++++++++ Flow.Launcher/Languages/da.xaml | 11 +++++++++++ Flow.Launcher/Languages/de.xaml | 11 +++++++++++ Flow.Launcher/Languages/es-419.xaml | 11 +++++++++++ Flow.Launcher/Languages/es.xaml | 11 +++++++++++ Flow.Launcher/Languages/fr.xaml | 11 +++++++++++ Flow.Launcher/Languages/he.xaml | 11 +++++++++++ Flow.Launcher/Languages/it.xaml | 11 +++++++++++ Flow.Launcher/Languages/ja.xaml | 11 +++++++++++ Flow.Launcher/Languages/ko.xaml | 11 +++++++++++ Flow.Launcher/Languages/nb.xaml | 11 +++++++++++ Flow.Launcher/Languages/nl.xaml | 11 +++++++++++ Flow.Launcher/Languages/pl.xaml | 11 +++++++++++ Flow.Launcher/Languages/pt-br.xaml | 11 +++++++++++ Flow.Launcher/Languages/pt-pt.xaml | 11 +++++++++++ Flow.Launcher/Languages/ru.xaml | 11 +++++++++++ Flow.Launcher/Languages/sk.xaml | 13 ++++++++++++- Flow.Launcher/Languages/sr.xaml | 11 +++++++++++ Flow.Launcher/Languages/tr.xaml | 11 +++++++++++ Flow.Launcher/Languages/uk-UA.xaml | 11 +++++++++++ Flow.Launcher/Languages/vi.xaml | 11 +++++++++++ Flow.Launcher/Languages/zh-cn.xaml | 11 +++++++++++ Flow.Launcher/Languages/zh-tw.xaml | 11 +++++++++++ .../Properties/Resources.ja-JP.resx | 6 +++--- 25 files changed, 268 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/Languages/ar.xaml b/Flow.Launcher/Languages/ar.xaml index b81c5c9b5..42cfdf3eb 100644 --- a/Flow.Launcher/Languages/ar.xaml +++ b/Flow.Launcher/Languages/ar.xaml @@ -371,6 +371,7 @@ اختر مدير الملفات + Learn more يرجى تحديد موقع ملف مدير الملفات الذي تستخدمه وإضافة الحجج حسب الحاجة. يمثل "%d" مسار الدليل المفتوح، ويستخدمه الحقل "الحجة للمجلد" للأوامر التي تفتح أدلة محددة. يمثل "%f" مسار الملف المفتوح، ويستخدمه الحقل "الحجة للملف" للأوامر التي تفتح ملفات محددة. على سبيل المثال، إذا كان مدير الملفات يستخدم أمرًا مثل "totalcmd.exe /A c:\windows" لفتح دليل c:\windows، فإن مسار مدير الملفات سيكون totalcmd.exe، وحجة المجلد ستكون /A "%d". قد تحتاج بعض مديري الملفات مثل QTTabBar فقط إلى توفير مسار، في هذه الحالة استخدم "%d" كمسار مدير الملفات واترك باقي الحقول فارغة. مدير الملفات @@ -378,6 +379,8 @@ مسار مدير الملفات حجة للمجلد حجة للملف + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error متصفح الويب الافتراضي @@ -469,6 +472,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + خطأ + An error occurred while opening the folder. {0} + يرجى الانتظار... diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml index 71c9c8c6b..bfcd92360 100644 --- a/Flow.Launcher/Languages/cs.xaml +++ b/Flow.Launcher/Languages/cs.xaml @@ -371,6 +371,7 @@ Vybrat správce souborů + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Správce souborů @@ -378,6 +379,8 @@ Cesta k správci souborů Argumenty pro složku Argumenty pro Soubor + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Výchozí prohlížeč @@ -469,6 +472,14 @@ Pokud před zkratku při zadávání přidáte znak "@", bude odpovíd 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Chyba + An error occurred while opening the folder. {0} + Počkejte prosím... diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml index 37723dc9b..9a4cbc003 100644 --- a/Flow.Launcher/Languages/da.xaml +++ b/Flow.Launcher/Languages/da.xaml @@ -371,6 +371,7 @@ Select File Manager + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Filhåndtering @@ -378,6 +379,8 @@ Sti til filhåndtering Arg for mappe Arg for fil + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Default Web Browser @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Please wait... diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml index 895a2dab6..88c5b84d4 100644 --- a/Flow.Launcher/Languages/de.xaml +++ b/Flow.Launcher/Languages/de.xaml @@ -371,6 +371,7 @@ Dateimanager auswählen + Learn more Bitte geben Sie den Dateiort des von Ihnen verwendeten Dateimanagers an und fügen Sie bei Bedarf Argumente hinzu. Das „%d“ repräsentiert den dafür zu öffnenden Verzeichnispfad, der vom Feld Arg for Folder und für Befehle zum Öffnen bestimmter Verzeichnisse verwendet wird. Das „%f“ repräsentiert den dafür zu öffnenden Dateipfad, der vom Feld Arg for File und für Befehle zum Öffnen bestimmter Dateien verwendet wird. Zum Beispiel, wenn der Dateimanager einen Befehl wie „totalcmd.exe /A c:\windows“ verwendet, um das Verzeichnis c:\windows zu öffnen, lautet der Dateimanager-Pfad „totalcmd.exe“ und der Arg for Folder „/A %d“. Bestimmte Dateimanager wie QTTabBar kann nur die Angabe eines Pfades erfordern, in diesem Fall verwenden Sie „%d“ als den Dateimanager-Pfad und lassen den Rest der Felder blank. Dateimanager @@ -378,6 +379,8 @@ Dateimanager-Pfad Arg For Folder Arg For File + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Webbrowser per Default @@ -469,6 +472,14 @@ Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt die 1. Logdatei hochladen: {0} 2. Kopieren Sie die Ausnahmemeldung unterhalb + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Fehler + An error occurred while opening the folder. {0} + Bitte warten Sie ... diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml index 902811a56..b73a1ef12 100644 --- a/Flow.Launcher/Languages/es-419.xaml +++ b/Flow.Launcher/Languages/es-419.xaml @@ -371,6 +371,7 @@ Seleccionar Gestor de Archivos + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Gestor de Archivos @@ -378,6 +379,8 @@ Ruta del Gestor de Archivos Arg para Carpeta Arg para Archivo + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Navegador Web Predeterminado @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Por favor espere... diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml index 0dc6833af..2b6074f06 100644 --- a/Flow.Launcher/Languages/es.xaml +++ b/Flow.Launcher/Languages/es.xaml @@ -371,6 +371,7 @@ Seleccionar administrador de archivos + Learn more Especifique la ubicación del archivo del administrador de archivos que está utilizando y añada los argumentos necesarios. El argumento "%d" representa la ruta del directorio a abrir, utilizada por el campo Argumentos de la carpeta y por comandos que abren directorios específicos. El "%f" representa la ruta del archivo a abrir, utilizada por el campo Argumentos del archivo y por comandos que abren archivos específicos. Por ejemplo, si el administrador de archivos utiliza un comando como "totalcmd.exe /A c:\windows" para abrir el directorio c:\windows, la ruta del administrador de archivos será totalcmd.exe, y los Argumentos de la carpeta serán /A "%d". Ciertos administradores de archivos como QTTabBar pueden requerir solo la ruta, en este caso utilice "%d" como la ruta del administrador de archivos y deje el resto de los campos en blanco. Administrador de archivos @@ -378,6 +379,8 @@ Ruta del administrador de archivos Argumentos de la carpeta Argumentos del archivo + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Navegador web predeterminado @@ -469,6 +472,14 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci 1. Subir archivo de registro: {0} 2. Copiar el siguiente mensaje de excepción + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Por favor espere... diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml index 41fdbaa51..cd6d8c01f 100644 --- a/Flow.Launcher/Languages/fr.xaml +++ b/Flow.Launcher/Languages/fr.xaml @@ -370,6 +370,7 @@ Sélectionner le gestionnaire de fichiers + Learn more Veuillez spécifier l'emplacement du fichier de l'explorateur de fichiers que vous utilisez et ajouter des arguments si nécessaire. Le "%d" représente le chemin du répertoire à ouvrir, utilisé par le champ Arg for Folder et pour les commandes ouvrant des répertoires spécifiques. Le "%f" représente le chemin du fichier à ouvrir, utilisé par le champ Arg for File et pour les commandes ouvrant des fichiers spécifiques. Par exemple, si l'explorateur de fichiers utilise une commande telle que "totalcmd.exe /A c:\windows" pour ouvrir le répertoire c:\windows, le chemin de l'explorateur de fichiers sera totalcmd.exe et l'argument Arg For Folder sera /A "%d"". Certains explorateurs de fichiers comme QTTabBar peuvent simplement nécessiter qu'un chemin soit fourni, dans ce cas, utilisez "%d" comme chemin de l'explorateur de fichiers et laissez le reste des fichiers vides. Gestionnaire de fichiers @@ -377,6 +378,8 @@ Chemin du gestionnaire de fichiers Arguments pour le répertoire Arguments pour le fichier + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Navigateur web par défaut @@ -468,6 +471,14 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu 1. Télécharger le fichier journal : {0} 2. Copiez le message d’exception ci-dessous + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Erreur + An error occurred while opening the folder. {0} + Veuillez patienter... diff --git a/Flow.Launcher/Languages/he.xaml b/Flow.Launcher/Languages/he.xaml index 52eaf5e9f..b98c2ec73 100644 --- a/Flow.Launcher/Languages/he.xaml +++ b/Flow.Launcher/Languages/he.xaml @@ -370,6 +370,7 @@ בחר מנהל קבצים + Learn more אנא ציין את מיקום הקובץ של מנהל הקבצים שבו אתה משתמש והוסף ארגומנטים כנדרש. "%d" מייצג את נתיב התיקייה שיש לפתוח, ומשמש בשדה ארגומנט לתיקייה ובפקודות לפתיחת תיקיות מסוימות. "%f" מייצג את נתיב הקובץ שיש לפתוח, ומשמש בשדה ארגומנט לקובץ ובפקודות לפתיחת קבצים מסוימים. לדוגמה, אם מנהל הקבצים משתמש בפקודה כגון "totalcmd.exe /A c:\windows" כדי לפתוח את התיקייה c:\windows, נתיב מנהל הקבצים יהיה totalcmd.exe, והארגומנט לתיקייה יהיה /A "%d". מנהלי קבצים מסוימים, כגון QTTabBar, עשויים לדרוש רק ציון נתיב, במקרה כזה השתמש ב-"%d" כנתיב מנהל הקבצים והשאר את שאר השדות ריקים. מנהל קבצים @@ -377,6 +378,8 @@ נתיב מנהל קבצים ארגומנט לתיקייה ארגומנט לקובץ + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error דפדפן ברירת מחדל @@ -468,6 +471,14 @@ 1. העלה קובץ יומן: {0} 2. העתק את הודעת החריגה למטה + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + שגיאה + An error occurred while opening the folder. {0} + אנא המתן... diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml index 1a356ad65..7ea797fa9 100644 --- a/Flow.Launcher/Languages/it.xaml +++ b/Flow.Launcher/Languages/it.xaml @@ -371,6 +371,7 @@ Seleziona Gestore File + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Gestore File @@ -378,6 +379,8 @@ Percorso Gestore File Arg Per Cartella Arg Per Cartella + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Browser predefinito @@ -469,6 +472,14 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Attendere prego... diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml index 949fe5c99..33673d60f 100644 --- a/Flow.Launcher/Languages/ja.xaml +++ b/Flow.Launcher/Languages/ja.xaml @@ -371,6 +371,7 @@ デフォルトのファイルマネージャー + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. File Manager @@ -378,6 +379,8 @@ File Manager Path Arg For Folder Arg For File + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error デフォルトのウェブブラウザー @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Please wait... diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml index 9ae2e0195..9e8f9a73b 100644 --- a/Flow.Launcher/Languages/ko.xaml +++ b/Flow.Launcher/Languages/ko.xaml @@ -362,6 +362,7 @@ 파일관리자 선택 + Learn more 사용 중인 파일 관리자의 파일 위치를 지정하고, 필요한 경우 인수를 추가하세요. "%d"는 열고자 하는 디렉터리 경로를 나타내며, 폴더용 인수 필드 및 특정 디렉터리를 여는 명령어에서 사용됩니다. "%f"는 열고자 하는 파일 경로를 나타내며, 파일용 인수 필드 및 특정 파일을 여는 명령어에서 사용됩니다. 예를 들어, 파일 관리자가 totalcmd.exe /A c:\windows와 같은 명령어로 c:\windows 디렉터리를 연다면, 파일 관리자 경로는 totalcmd.exe가 되고, 폴더용 인수는 /A "%d"가 됩니다. QTTabBar와 같은 일부 파일 관리자는 경로만 전달하면 되는 경우가 있으므로, 이 경우에는 파일 관리자 경로에 "%d"를 입력하고 나머지 필드는 비워두세요. 파일관리자 @@ -369,6 +370,8 @@ 파일관리자 경로 폴더경로 인수 파일경로 인수 + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error 기본 웹 브라우저 @@ -460,6 +463,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + 잠시 기다려주세요... diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml index 58571a1c4..8d5ac7a94 100644 --- a/Flow.Launcher/Languages/nb.xaml +++ b/Flow.Launcher/Languages/nb.xaml @@ -371,6 +371,7 @@ Velg filbehandler + Learn more Vennligst spesifiser filplasseringen til filbehandleren du bruker, og legg til argumenter etter behov. "%d" representerer katalogbanen som skal åpnes for, brukt av Arg for mappe-feltet og for kommandoer som åpner spesifikke kataloger. "%f" representerer filbanen som skal åpnes for, brukt av Arg for fil-feltet og for kommandoer som åpner spesifikke filer. For eksempel, hvis filbehandleren bruker en kommando som "totalcmd.exe /A c:windows" for å åpne c:windows-katalogen, vil filbehandlingsbanen bli totalcmd.exe, og Arg For Folder vil være /A "%d". Enkelte filbehandlere som QTTabBar kan bare kreve at en bane oppgis, i dette tilfellet bruker du "%d" som filbehandlingsbane og lar resten av feltene stå tomme. Filbehandler @@ -378,6 +379,8 @@ Filbehandler sti Arg for mappe Arg for fil + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Standard nettleser @@ -469,6 +472,14 @@ Hvis du legger til et @-prefiks mens du legger inn en snarvei, samsvarer det med 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Feil + An error occurred while opening the folder. {0} + Vennligst vent... diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml index 70a58e322..0f6ad436d 100644 --- a/Flow.Launcher/Languages/nl.xaml +++ b/Flow.Launcher/Languages/nl.xaml @@ -371,6 +371,7 @@ Bestandsbeheerder selecteren + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Bestandsbeheerder @@ -378,6 +379,8 @@ Bestandsbeheerder pad Arg voor map Arg voor bestand + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Standaard webbrowser @@ -469,6 +472,14 @@ Als u een '@' voorvoegsel toevoegt tijdens het invoeren van een snelkoppeling, m 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Please wait... diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml index 081c8e90e..1397afa25 100644 --- a/Flow.Launcher/Languages/pl.xaml +++ b/Flow.Launcher/Languages/pl.xaml @@ -371,6 +371,7 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Wybierz menedżer plików + Learn more Proszę określić lokalizację pliku menedżera plików, którego używasz i dodać argumenty według potrzeb. Symbol "%d" reprezentuje ścieżkę katalogu do otwarcia, używaną w polu Arg dla Folderu oraz dla poleceń otwierających konkretne katalogi. Symbol "%f" reprezentuje ścieżkę pliku do otwarcia, używaną w polu Arg dla Pliku oraz dla poleceń otwierających konkretne pliki. Na przykład, jeśli menedżer plików używa polecenia takiego jak „totalcmd.exe /A c:\windows" do otwarcia katalogu c:\windows, Ścieżka Menedżera Plików będzie totalcmd.exe, a Argument dla Folderu będzie /A "%d". Niektóre menedżery plików, takie jak QTTabBar, mogą wymagać jedynie podania ścieżki; w takim przypadku użyj "%d" jako Ścieżki Menedżera Plików, a pozostałe pola pozostaw puste. Menadżer plików @@ -378,6 +379,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Ścieżka menedżera plików Arg dla folderu Arg dla pliku + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Domyślna przeglądarka @@ -469,6 +472,14 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d 1. Prześlij plik dziennika: {0} 2. Skopiuj poniższą wiadomość wyjątku + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Błąd + An error occurred while opening the folder. {0} + Proszę czekać... diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml index bd74d1d5f..232134290 100644 --- a/Flow.Launcher/Languages/pt-br.xaml +++ b/Flow.Launcher/Languages/pt-br.xaml @@ -371,6 +371,7 @@ Selecione o Gerenciador de Arquivos + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Gerenciador de Arquivos @@ -378,6 +379,8 @@ Caminho do Gerenciador de Arquivos Arg para Pasta Arg para Arquivo + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Navegador da Web Padrão @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Por favor, aguarde... diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml index cf7312956..f98fdf64b 100644 --- a/Flow.Launcher/Languages/pt-pt.xaml +++ b/Flow.Launcher/Languages/pt-pt.xaml @@ -369,6 +369,7 @@ Selecione o gestor de ficheiros + Saber mais Por favor, especifique a localização do executável do seu gestor de ficheiros e adicione os argumentos necessários. "%d" representa o caminho do diretório a abrir, usado pelo argumento do campo Pasta e para comandos que abrem diretórios específicos. "%f" representa o caminho do ficheiro a abrir, usado pelo argumento do campo Ficheiro e para comandos que abrem ficheiros específicos. Por exemplo, se o gestor de ficheiros utilizar o comando "totalcmd.exe /A c:\windows" para abrir o diretório c:\windows , o caminho para o gestor de ficheiros será totalcmd. exe e os argumentos para a Pasta serão /A "%d". Alguns gestores de ficheiros, como QTTabBar podem apenas exigir que especifique o caminho. Para estes, deve utilizar "%d" como caminho para o gestor de ficheiros e deixar o resto dos campos em branco. Gestor de ficheiros @@ -376,6 +377,8 @@ Caminho do gestor de ficheiros Argumento para pasta Argumento para ficheiro + Não foi possível encontrar o gestor de ficheiros '{0}' em '{1}'. Deseja continuar? + Erro no caminho do gestor de ficheiros Navegador web padrão @@ -467,6 +470,14 @@ Se adicionar o prefixo '@' durante a introdução do atalho, será utilizada qua 1. Carregue o ficheiro de registos: {0} 2. Copie a mensagem abaixo + + Erro do gestor de ficheiros + + Não foi possível encontrar o gestor de ficheiros. Verifique a definição 'Gestor de ficheiros personalizado' em Definições -> Geral. + + Erro + Ocorreu um erro ao abrir a pasta: {0} + Por favor aguarde... diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml index 69069c5ec..2a9b5c26b 100644 --- a/Flow.Launcher/Languages/ru.xaml +++ b/Flow.Launcher/Languages/ru.xaml @@ -371,6 +371,7 @@ Выбор менеджера файлов + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Файловый менеджер @@ -378,6 +379,8 @@ Путь к файловому менеджеру Аргумент для папки Аргумент для файла + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Браузер по умолчанию @@ -469,6 +472,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Ошибка + An error occurred while opening the folder. {0} + Пожалуйста, подождите... diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml index 88ed1c9df..934b0747a 100644 --- a/Flow.Launcher/Languages/sk.xaml +++ b/Flow.Launcher/Languages/sk.xaml @@ -371,6 +371,7 @@ Vyberte správcu súborov + Viac informácií Zadajte umiestnenie súboru správcu súborov, ktorý používate, a podľa potreby pridajte argumenty. "%d" predstavuje cestu k priečinku, ktorý sa má otvoriť, používa sa v poli Arg pre priečinok a pri príkazoch na otvorenie konkrétnych priečinkov. "%f" predstavuje cestu k súboru, ktorá sa má otvoriť a používa sa v poli Arg pre súbor a pri príkazoch na otvorenie konkrétnych súborov. Napríklad, ak správca súborov používa príkaz ako "totalcmd.exe /A c:\windows" na otvorenie priečinka c:\windows, cesta správcu súborov bude totalcmd.exe a Arg pre priečinok bude /A "%d". Niektorí správcovia súborov, ako napríklad QTTabBar, môžu vyžadovať len zadanie cesty, v tomto prípade použite "%d" ako cestu správcu súborov a zvyšok súborov nechajte prázdny. Správca súborov @@ -378,6 +379,8 @@ Cesta k správcovi súborov Arg. pre priečinok Arg. pre súbor + Správca súborov '{0}' sa nenachádza na '{1}'. Chcete pokračovať? + Chyba v ceste k správcovi súborov Predvolený webový prehliadač @@ -445,7 +448,7 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s Zrušiť Resetovať Odstrániť - Aktualizovať + OK Áno Nie Pozadie @@ -469,6 +472,14 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s 1. Nahrajte súbor logu: {0} 2. Skopírujte nižšie uvedenú správu o výnimke + + Chyba správcu súborov + + Zadaný správca súborov sa nenašiel. Skontrolujte nastavenie vlastného správcu súborov v Nastavenia > Všeobecné. + + Chyba + Počas otvárania priečinka sa vyskytla chyba. {0} + Čakajte, prosím... diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml index 4b3e3bc0c..0d2c04513 100644 --- a/Flow.Launcher/Languages/sr.xaml +++ b/Flow.Launcher/Languages/sr.xaml @@ -371,6 +371,7 @@ Select File Manager + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. File Manager @@ -378,6 +379,8 @@ File Manager Path Arg For Folder Arg For File + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Default Web Browser @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Please wait... diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml index 665694ace..ab9aa31e6 100644 --- a/Flow.Launcher/Languages/tr.xaml +++ b/Flow.Launcher/Languages/tr.xaml @@ -371,6 +371,7 @@ Dosya Yöneticisi Seçenekleri + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Dosya Yöneticisi @@ -378,6 +379,8 @@ Dosya Yöneticisi Yolu Klasör Açarken Dosya Açarken + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error İnternet Tarayıcı Seçenekleri @@ -467,6 +470,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Lütfen bekleyin... diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml index b3dc2cd16..f7cc7b0ed 100644 --- a/Flow.Launcher/Languages/uk-UA.xaml +++ b/Flow.Launcher/Languages/uk-UA.xaml @@ -371,6 +371,7 @@ Виберіть файловий менеджер + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Файловий менеджер @@ -378,6 +379,8 @@ Шлях до файлового менеджера Аргумент для папки Аргумент для файлу + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Веб-браузер за замовчуванням @@ -469,6 +472,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Помилка + An error occurred while opening the folder. {0} + Будь ласка, зачекайте... diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml index b7b56213b..95e43e297 100644 --- a/Flow.Launcher/Languages/vi.xaml +++ b/Flow.Launcher/Languages/vi.xaml @@ -373,6 +373,7 @@ Chọn trình quản lý tệp + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Trình quản lý ngày tháng @@ -380,6 +381,8 @@ Đường dẫn quản lý tệp Đối số cho thư mục Đối số cho tệp + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Trình duyệt web tiêu chuẩn @@ -473,6 +476,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Lỗi + An error occurred while opening the folder. {0} + Cảnh báo nhỏ... diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml index bd3142992..f6576070f 100644 --- a/Flow.Launcher/Languages/zh-cn.xaml +++ b/Flow.Launcher/Languages/zh-cn.xaml @@ -371,6 +371,7 @@ 默认文件管理器 + Learn more 请指定您使用的文件管理器的文件位置并根据需要添加参数。“%d”表示要打开的目录路径,由文件夹字段的参数和打开特定目录的命令使用。“%f”表示要打开的文件路径,由文件字段的参数和打开特定文件的命令使用。 例如,如果文件管理器使用诸如“totalcmd.exe /A c:\windows”之类的命令来打开 c:\windows 目录,则文件管理器路径将为 totalcmd.exe,文件夹参数将为 /A "%d"。某些文件管理器(如 QTTabBar)可能只需要提供路径,在本例中,使用“%d”作为文件管理器路径,其余字段留空。 文件管理器 @@ -378,6 +379,8 @@ 文件管理器路径 文件夹路径参数 选中文件路径参数 + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error 默认浏览器 @@ -469,6 +472,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + 错误 + An error occurred while opening the folder. {0} + 请稍等... diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml index 1a71ae135..42810f590 100644 --- a/Flow.Launcher/Languages/zh-tw.xaml +++ b/Flow.Launcher/Languages/zh-tw.xaml @@ -371,6 +371,7 @@ 選擇檔案管理器 + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. 檔案管理器 @@ -378,6 +379,8 @@ 檔案管理器路徑 資料夾參數 檔案參數 + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error 預設瀏覽器 @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + 請稍後... diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx index 2e2de0681..91be8a392 100644 --- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx @@ -456,7 +456,7 @@ Area Personalization - + The command to direct start a setting @@ -1117,7 +1117,7 @@ Area Control Panel (legacy settings) - + password.cpl @@ -1572,7 +1572,7 @@ Area Control Panel (legacy settings) - + Means The "Windows Version" From 90ad72ca30ca7e99e3e84c4cac4e507f91b47a4c Mon Sep 17 00:00:00 2001 From: 01Dri Date: Fri, 23 May 2025 16:33:47 -0300 Subject: [PATCH 051/101] Diff Time in Created At and LastModifiedAt --- .../Views/PreviewPanel.xaml.cs | 47 ++++++++++++++----- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index aaf1efdc1..1981a8b0e 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -1,4 +1,5 @@ -using System.ComponentModel; +using System; +using System.ComponentModel; using System.Globalization; using System.IO; using System.Runtime.CompilerServices; @@ -65,22 +66,22 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged if (Settings.ShowCreatedDateInPreviewPanel) { - CreatedAt = File - .GetCreationTime(filePath) - .ToString( - $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", - CultureInfo.CurrentCulture - ); + DateTime createdDate = File.GetCreationTime(filePath); + string formattedDate = createdDate.ToString( + $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", + CultureInfo.CurrentCulture + ); + CreatedAt = $"{GetDiffTimeString(createdDate)} - {formattedDate}"; } if (Settings.ShowModifiedDateInPreviewPanel) { - LastModifiedAt = File - .GetLastWriteTime(filePath) - .ToString( - $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", - CultureInfo.CurrentCulture - ); + DateTime lastModifiedDate = File.GetLastWriteTime(filePath); + string formattedDate = lastModifiedDate.ToString( + $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", + CultureInfo.CurrentCulture + ); + LastModifiedAt = $"{GetDiffTimeString(lastModifiedDate)} - {formattedDate}"; } _ = LoadImageAsync(); @@ -90,7 +91,27 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged { PreviewImage = await Main.Context.API.LoadImageAsync(FilePath, true).ConfigureAwait(false); } + + private string GetDiffTimeString(DateTime fileDateTime) + { + DateTime now = DateTime.Now; + TimeSpan difference = now - fileDateTime; + if (difference.TotalDays < 1) + return "Today"; + if (difference.TotalDays < 30) + return $"{(int)difference.TotalDays} days ago"; + + int monthsDiff = (now.Year - fileDateTime.Year) * 12 + now.Month - fileDateTime.Month; + if (monthsDiff < 12) + return monthsDiff == 1 ? "1 month ago" : $"{monthsDiff} months ago"; + + int yearsDiff = now.Year - fileDateTime.Year; + if (now.Month < fileDateTime.Month || (now.Month == fileDateTime.Month && now.Day < fileDateTime.Day)) + yearsDiff--; + + return yearsDiff == 1 ? "1 year ago" : $"{yearsDiff} years ago"; + } public event PropertyChangedEventHandler? PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) From 35e71c6f510256bdad0692919cdbfa1578d5ee87 Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sat, 24 May 2025 00:12:56 -0300 Subject: [PATCH 052/101] Relative Date checkbox --- .../Flow.Launcher.Plugin.Explorer/Languages/en.xaml | 3 +++ .../Languages/pt-br.xaml | 5 +++-- Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs | 3 +++ .../ViewModels/SettingsViewModel.cs | 12 ++++++++++++ .../Views/ExplorerSettings.xaml | 5 +++++ .../Views/PreviewPanel.xaml.cs | 11 ++++++++--- 6 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index 79f8a5848..6680aacff 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -33,6 +33,7 @@ Size Date Created Date Modified + Relative Date Display File Info Date and time format Sort Option: @@ -125,6 +126,8 @@ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches. + + Failed to load Everything SDK diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml index 2754a5a99..59770a29d 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml @@ -29,8 +29,9 @@ Everything Setting Preview Panel Tamanho - Date Created - Date Modified + Data Criação + Data Modificação + Data Relativa Display File Info Date and time format Sort Option: diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs index 3d30bcf29..0a91c024c 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs @@ -66,6 +66,9 @@ namespace Flow.Launcher.Plugin.Explorer public bool ShowCreatedDateInPreviewPanel { get; set; } = true; public bool ShowModifiedDateInPreviewPanel { get; set; } = true; + + public bool ShowRelativeDateInPreviewPanel { get; set; } = true; + public string PreviewPanelDateFormat { get; set; } = "yyyy-MM-dd"; diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs index cf9ebd33f..baa2c6c28 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs @@ -169,6 +169,18 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels } } + public bool ShowRelativeDateInPreviewPanel + { + get => Settings.ShowRelativeDateInPreviewPanel; + set + { + Settings.ShowRelativeDateInPreviewPanel = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(ShowPreviewPanelDateTimeChoices)); + OnPropertyChanged(nameof(PreviewPanelDateTimeChoicesVisibility)); + } + } + public string PreviewPanelDateFormat { get => Settings.PreviewPanelDateFormat; diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml index e5999da41..c16dc4f51 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml @@ -505,6 +505,11 @@ Margin="{StaticResource SettingPanelItemLeftTopBottomMargin}" Content="{DynamicResource plugin_explorer_previewpanel_display_file_modification_checkbox}" IsChecked="{Binding ShowModifiedDateInPreviewPanel}" /> + + diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index 1981a8b0e..aa5ba6cc7 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -71,7 +71,10 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", CultureInfo.CurrentCulture ); - CreatedAt = $"{GetDiffTimeString(createdDate)} - {formattedDate}"; + + string result = formattedDate; + if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}"; + CreatedAt = result; } if (Settings.ShowModifiedDateInPreviewPanel) @@ -81,7 +84,9 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", CultureInfo.CurrentCulture ); - LastModifiedAt = $"{GetDiffTimeString(lastModifiedDate)} - {formattedDate}"; + string result = formattedDate; + if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}"; + LastModifiedAt = result; } _ = LoadImageAsync(); @@ -92,7 +97,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged PreviewImage = await Main.Context.API.LoadImageAsync(FilePath, true).ConfigureAwait(false); } - private string GetDiffTimeString(DateTime fileDateTime) + private string GetFileAge(DateTime fileDateTime) { DateTime now = DateTime.Now; TimeSpan difference = now - fileDateTime; From 02ddcaa0642a123ee1ac7caf747783651d4fc2f5 Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sat, 24 May 2025 00:15:08 -0300 Subject: [PATCH 053/101] Function name changed to GetRelativeDate --- .../Views/PreviewPanel.xaml.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index aa5ba6cc7..05dfd66f3 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -73,7 +73,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged ); string result = formattedDate; - if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}"; + if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetRelativeDate(createdDate)} - {formattedDate}"; CreatedAt = result; } @@ -85,7 +85,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged CultureInfo.CurrentCulture ); string result = formattedDate; - if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}"; + if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetRelativeDate(lastModifiedDate)} - {formattedDate}"; LastModifiedAt = result; } @@ -97,7 +97,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged PreviewImage = await Main.Context.API.LoadImageAsync(FilePath, true).ConfigureAwait(false); } - private string GetFileAge(DateTime fileDateTime) + private string GetRelativeDate(DateTime fileDateTime) { DateTime now = DateTime.Now; TimeSpan difference = now - fileDateTime; From a711ce4ec793158c6586ec70e5e0cd913c77319b Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sat, 24 May 2025 01:10:12 -0300 Subject: [PATCH 054/101] Translate pt br --- Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml index 59770a29d..3ab958506 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml @@ -29,8 +29,8 @@ Everything Setting Preview Panel Tamanho - Data Criação - Data Modificação + Data de Criação + Data de Modificação Data Relativa Display File Info Date and time format From b2f5713386d4a8a702c91b461f25de1598865776 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 24 May 2025 13:10:25 +0800 Subject: [PATCH 055/101] =?UTF-8?q?Fix=20crash=20on=20=C3=9732=20devices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NativeMethods.txt | 2 +- .../PInvokeExtensions.cs | 26 ++++++++++++++++--- Flow.Launcher.Infrastructure/Win32Helper.cs | 6 ++--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt index 0e50420b0..c01532414 100644 --- a/Flow.Launcher.Infrastructure/NativeMethods.txt +++ b/Flow.Launcher.Infrastructure/NativeMethods.txt @@ -22,7 +22,7 @@ SystemParametersInfo SetForegroundWindow -GetWindowLong +WINDOW_LONG_PTR_INDEX GetForegroundWindow GetDesktopWindow GetShellWindow diff --git a/Flow.Launcher.Infrastructure/PInvokeExtensions.cs b/Flow.Launcher.Infrastructure/PInvokeExtensions.cs index 1a72ab7a6..18b992043 100644 --- a/Flow.Launcher.Infrastructure/PInvokeExtensions.cs +++ b/Flow.Launcher.Infrastructure/PInvokeExtensions.cs @@ -4,14 +4,16 @@ using Windows.Win32.UI.WindowsAndMessaging; namespace Windows.Win32; -// Edited from: https://github.com/files-community/Files internal static partial class PInvoke { + // SetWindowLong + // Edited from: https://github.com/files-community/Files + [DllImport("User32", EntryPoint = "SetWindowLongW", ExactSpelling = true)] - static extern int _SetWindowLong(HWND hWnd, int nIndex, int dwNewLong); + private static extern int _SetWindowLong(HWND hWnd, int nIndex, int dwNewLong); [DllImport("User32", EntryPoint = "SetWindowLongPtrW", ExactSpelling = true)] - static extern nint _SetWindowLongPtr(HWND hWnd, int nIndex, nint dwNewLong); + private static extern nint _SetWindowLongPtr(HWND hWnd, int nIndex, nint dwNewLong); // NOTE: // CsWin32 doesn't generate SetWindowLong on other than x86 and vice versa. @@ -22,4 +24,22 @@ internal static partial class PInvoke ? _SetWindowLong(hWnd, (int)nIndex, (int)dwNewLong) : _SetWindowLongPtr(hWnd, (int)nIndex, dwNewLong); } + + // GetWindowLong + + [DllImport("User32", EntryPoint = "GetWindowLongW", ExactSpelling = true)] + private static extern int _GetWindowLong(HWND hWnd, int nIndex); + + [DllImport("User32", EntryPoint = "GetWindowLongPtrW", ExactSpelling = true)] + private static extern nint _GetWindowLongPtr(HWND hWnd, int nIndex); + + // NOTE: + // CsWin32 doesn't generate GetWindowLong on other than x86 and vice versa. + // For more info, visit https://github.com/microsoft/CsWin32/issues/882 + public static unsafe nint GetWindowLongPtr(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex) + { + return sizeof(nint) is 4 + ? _GetWindowLong(hWnd, (int)nIndex) + : _GetWindowLongPtr(hWnd, (int)nIndex); + } } diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs index 783ade14e..dad5f2f93 100644 --- a/Flow.Launcher.Infrastructure/Win32Helper.cs +++ b/Flow.Launcher.Infrastructure/Win32Helper.cs @@ -192,9 +192,9 @@ namespace Flow.Launcher.Infrastructure SetWindowStyle(hwnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE, style); } - private static int GetWindowStyle(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex) + private static nint GetWindowStyle(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex) { - var style = PInvoke.GetWindowLong(hWnd, nIndex); + var style = PInvoke.GetWindowLongPtr(hWnd, nIndex); if (style == 0 && Marshal.GetLastPInvokeError() != 0) { throw new Win32Exception(Marshal.GetLastPInvokeError()); @@ -202,7 +202,7 @@ namespace Flow.Launcher.Infrastructure return style; } - private static nint SetWindowStyle(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, int dwNewLong) + private static nint SetWindowStyle(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, nint dwNewLong) { PInvoke.SetLastError(WIN32_ERROR.NO_ERROR); // Clear any existing error From f6103b1105d9c741c87ed0f954622c271a87620a Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sat, 24 May 2025 03:16:03 -0300 Subject: [PATCH 056/101] Relative Date -> File Age --- Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml | 2 +- Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml | 2 +- Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs | 2 +- .../ViewModels/SettingsViewModel.cs | 6 +++--- .../Views/ExplorerSettings.xaml | 4 ++-- .../Views/PreviewPanel.xaml.cs | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index 6680aacff..aa86d96cf 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -33,7 +33,7 @@ Size Date Created Date Modified - Relative Date + File Age Display File Info Date and time format Sort Option: diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml index 3ab958506..ca7d9b48e 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml @@ -31,7 +31,7 @@ Tamanho Data de Criação Data de Modificação - Data Relativa + Idade do Arquivo Display File Info Date and time format Sort Option: diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs index 0a91c024c..158cf0347 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs @@ -67,7 +67,7 @@ namespace Flow.Launcher.Plugin.Explorer public bool ShowModifiedDateInPreviewPanel { get; set; } = true; - public bool ShowRelativeDateInPreviewPanel { get; set; } = true; + public bool ShowFileAgeInPreviewPanel { get; set; } = true; public string PreviewPanelDateFormat { get; set; } = "yyyy-MM-dd"; diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs index baa2c6c28..fb33dacab 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs @@ -169,12 +169,12 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels } } - public bool ShowRelativeDateInPreviewPanel + public bool ShowFileAgeInPreviewPanel { - get => Settings.ShowRelativeDateInPreviewPanel; + get => Settings.ShowFileAgeInPreviewPanel; set { - Settings.ShowRelativeDateInPreviewPanel = value; + Settings.ShowFileAgeInPreviewPanel = value; OnPropertyChanged(); OnPropertyChanged(nameof(ShowPreviewPanelDateTimeChoices)); OnPropertyChanged(nameof(PreviewPanelDateTimeChoicesVisibility)); diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml index c16dc4f51..4302e721a 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml @@ -508,8 +508,8 @@ + Content="{DynamicResource plugin_explorer_previewpanel_display_file_age_checkbox}" + IsChecked="{Binding ShowFileAgeInPreviewPanel}" /> diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index 05dfd66f3..801510eb7 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -73,7 +73,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged ); string result = formattedDate; - if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetRelativeDate(createdDate)} - {formattedDate}"; + if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetRelativeDate(createdDate)} - {formattedDate}"; CreatedAt = result; } @@ -85,7 +85,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged CultureInfo.CurrentCulture ); string result = formattedDate; - if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetRelativeDate(lastModifiedDate)} - {formattedDate}"; + if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetRelativeDate(lastModifiedDate)} - {formattedDate}"; LastModifiedAt = result; } From d726455b047c380179243ff85ee132e7d601ba0c Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sat, 24 May 2025 03:16:51 -0300 Subject: [PATCH 057/101] Relative Date - FileAge --- .../Views/PreviewPanel.xaml.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index 801510eb7..28ceb5e96 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -73,7 +73,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged ); string result = formattedDate; - if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetRelativeDate(createdDate)} - {formattedDate}"; + if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}"; CreatedAt = result; } @@ -85,7 +85,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged CultureInfo.CurrentCulture ); string result = formattedDate; - if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetRelativeDate(lastModifiedDate)} - {formattedDate}"; + if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}"; LastModifiedAt = result; } @@ -97,7 +97,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged PreviewImage = await Main.Context.API.LoadImageAsync(FilePath, true).ConfigureAwait(false); } - private string GetRelativeDate(DateTime fileDateTime) + private string GetFileAge(DateTime fileDateTime) { DateTime now = DateTime.Now; TimeSpan difference = now - fileDateTime; From 2ff0fc8a7d8de2306229f8439b530932974f4519 Mon Sep 17 00:00:00 2001 From: DB p Date: Sat, 24 May 2025 15:28:51 +0900 Subject: [PATCH 058/101] Disable ShowFileAgeInPreviewPanel by default --- Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs index 158cf0347..49ad2d358 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs @@ -67,7 +67,7 @@ namespace Flow.Launcher.Plugin.Explorer public bool ShowModifiedDateInPreviewPanel { get; set; } = true; - public bool ShowFileAgeInPreviewPanel { get; set; } = true; + public bool ShowFileAgeInPreviewPanel { get; set; } = false; public string PreviewPanelDateFormat { get; set; } = "yyyy-MM-dd"; From 03d3c9292dcfc3814a890b9e0806e975f3abff59 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 24 May 2025 15:55:37 +0800 Subject: [PATCH 059/101] Fix blnak lie --- Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml | 2 -- Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs | 1 - 2 files changed, 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index aa86d96cf..ca994455a 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -126,8 +126,6 @@ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches. - - Failed to load Everything SDK diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs index 49ad2d358..4f83fc72e 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs @@ -27,7 +27,6 @@ namespace Flow.Launcher.Plugin.Explorer public string ExcludedFileTypes { get; set; } = ""; - public bool UseLocationAsWorkingDir { get; set; } = false; public bool ShowInlinedWindowsContextMenu { get; set; } = false; From 65e0a0220b07bf58ff6ffed2a796ea1094a66b5c Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 24 May 2025 15:56:02 +0800 Subject: [PATCH 060/101] Revert changes in pt-br.xaml --- Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml index ca7d9b48e..2754a5a99 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml @@ -29,9 +29,8 @@ Everything Setting Preview Panel Tamanho - Data de Criação - Data de Modificação - Idade do Arquivo + Date Created + Date Modified Display File Info Date and time format Sort Option: From 0f718e5d920bab13a285f42b4fb9ac83c759a9af Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 24 May 2025 15:59:24 +0800 Subject: [PATCH 061/101] Code quality --- .../Views/PreviewPanel.xaml.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index 28ceb5e96..eabe1ad41 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -97,26 +97,27 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged PreviewImage = await Main.Context.API.LoadImageAsync(FilePath, true).ConfigureAwait(false); } - private string GetFileAge(DateTime fileDateTime) + private static string GetFileAge(DateTime fileDateTime) { - DateTime now = DateTime.Now; - TimeSpan difference = now - fileDateTime; + var now = DateTime.Now; + var difference = now - fileDateTime; if (difference.TotalDays < 1) return "Today"; if (difference.TotalDays < 30) return $"{(int)difference.TotalDays} days ago"; - int monthsDiff = (now.Year - fileDateTime.Year) * 12 + now.Month - fileDateTime.Month; + var monthsDiff = (now.Year - fileDateTime.Year) * 12 + now.Month - fileDateTime.Month; if (monthsDiff < 12) return monthsDiff == 1 ? "1 month ago" : $"{monthsDiff} months ago"; - int yearsDiff = now.Year - fileDateTime.Year; + var yearsDiff = now.Year - fileDateTime.Year; if (now.Month < fileDateTime.Month || (now.Month == fileDateTime.Month && now.Day < fileDateTime.Day)) yearsDiff--; return yearsDiff == 1 ? "1 year ago" : $"{yearsDiff} years ago"; } + public event PropertyChangedEventHandler? PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) From 62d7256db43d03eb56084fe82e21641ef8fa1ceb Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 24 May 2025 16:07:15 +0800 Subject: [PATCH 062/101] Support transaltion for preview information --- .../Flow.Launcher.Plugin.Explorer/Languages/en.xaml | 8 ++++++++ .../Views/PreviewPanel.xaml.cs | 11 +++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index ca994455a..eefd6f4eb 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -167,4 +167,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index eabe1ad41..e1a957199 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -103,19 +103,22 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged var difference = now - fileDateTime; if (difference.TotalDays < 1) - return "Today"; + return Main.Context.API.GetTranslation("Today"); if (difference.TotalDays < 30) - return $"{(int)difference.TotalDays} days ago"; + return string.Format(Main.Context.API.GetTranslation("DaysAgo"), (int)difference.TotalDays); var monthsDiff = (now.Year - fileDateTime.Year) * 12 + now.Month - fileDateTime.Month; + if (monthsDiff == 1) + return Main.Context.API.GetTranslation("OneMonthAgo"); if (monthsDiff < 12) - return monthsDiff == 1 ? "1 month ago" : $"{monthsDiff} months ago"; + return string.Format(Main.Context.API.GetTranslation("MonthsAgo"), monthsDiff); var yearsDiff = now.Year - fileDateTime.Year; if (now.Month < fileDateTime.Month || (now.Month == fileDateTime.Month && now.Day < fileDateTime.Day)) yearsDiff--; - return yearsDiff == 1 ? "1 year ago" : $"{yearsDiff} years ago"; + return yearsDiff == 1 ? Main.Context.API.GetTranslation("OneYearAgo") : + string.Format(Main.Context.API.GetTranslation("YearsAgo"), yearsDiff); } public event PropertyChangedEventHandler? PropertyChanged; From de7438791ce0374975444eb0adb7b646b908463f Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 25 May 2025 09:14:19 +0800 Subject: [PATCH 063/101] Fix argument null exception when updating plugin directories for errornous plugins --- Flow.Launcher.Core/Plugin/PluginManager.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index aae8dd764..300603c69 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -187,11 +187,19 @@ namespace Flow.Launcher.Core.Plugin { if (AllowedLanguage.IsDotNet(metadata.Language)) { + if (string.IsNullOrEmpty(metadata.AssemblyName)) + { + continue; // Skip if AssemblyName is not set, which can happen for errornous plugins + } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.AssemblyName); metadata.PluginCacheDirectoryPath = Path.Combine(DataLocation.PluginCacheDirectory, metadata.AssemblyName); } else { + if (string.IsNullOrEmpty(metadata.Name)) + { + continue; // Skip if Name is not set, which can happen for errornous plugins + } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.Name); metadata.PluginCacheDirectoryPath = Path.Combine(DataLocation.PluginCacheDirectory, metadata.Name); } From 0d785d1c9ce819a0b0c7afe8f0110c947f727031 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 25 May 2025 09:17:31 +0800 Subject: [PATCH 064/101] Fix typos --- Flow.Launcher.Core/Plugin/PluginManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 300603c69..2689369f8 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -189,7 +189,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.AssemblyName)) { - continue; // Skip if AssemblyName is not set, which can happen for errornous plugins + continue; // Skip if AssemblyName is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.AssemblyName); metadata.PluginCacheDirectoryPath = Path.Combine(DataLocation.PluginCacheDirectory, metadata.AssemblyName); @@ -198,7 +198,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.Name)) { - continue; // Skip if Name is not set, which can happen for errornous plugins + continue; // Skip if Name is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.Name); metadata.PluginCacheDirectoryPath = Path.Combine(DataLocation.PluginCacheDirectory, metadata.Name); From 025895508326602066d1badf741182a91988ab26 Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Sun, 25 May 2025 09:19:41 +0800 Subject: [PATCH 065/101] Log a warning when encountering an empty Name Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Flow.Launcher.Core/Plugin/PluginManager.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 2689369f8..54b74da39 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -198,6 +198,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.Name)) { + Log.Warn($"Plugin with empty Name encountered. Skipping plugin initialization. Metadata: {metadata}"); continue; // Skip if Name is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.Name); From 9e666f95ea6044b855f423c980f0db2090f6ff5f Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Sun, 25 May 2025 09:19:54 +0800 Subject: [PATCH 066/101] Log a warning when encountering an empty AssemblyName Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Flow.Launcher.Core/Plugin/PluginManager.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 54b74da39..c4e505ad0 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -189,6 +189,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.AssemblyName)) { + Log.Warn($"Plugin skipped: AssemblyName is empty for plugin with metadata: {metadata.Name}", typeof(PluginManager)); continue; // Skip if AssemblyName is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.AssemblyName); From 50780db9f54c1b2eef27859a9583fd75d85ff626 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 25 May 2025 09:20:57 +0800 Subject: [PATCH 067/101] Fix build issue --- Flow.Launcher.Core/Plugin/PluginManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index c4e505ad0..9b525f331 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -189,7 +189,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.AssemblyName)) { - Log.Warn($"Plugin skipped: AssemblyName is empty for plugin with metadata: {metadata.Name}", typeof(PluginManager)); + API.LogWarn(ClassName, $"AssemblyName is empty for plugin with metadata: {metadata.Name}"); continue; // Skip if AssemblyName is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.AssemblyName); @@ -199,7 +199,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.Name)) { - Log.Warn($"Plugin with empty Name encountered. Skipping plugin initialization. Metadata: {metadata}"); + API.LogWarn(ClassName, $"Name is empty for plugin with metadata: {metadata.Name}"); continue; // Skip if Name is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.Name); From 47878f3829a9cb10f87d5429d07fad097efec3dd Mon Sep 17 00:00:00 2001 From: DB p Date: Tue, 27 May 2025 14:08:32 +0900 Subject: [PATCH 068/101] Fix file explorer invocation to ensure correct file selection behavior --- Flow.Launcher/PublicAPIInstance.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 66e11f881..93567288c 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -338,7 +338,10 @@ namespace Flow.Launcher // Windows File Manager explorer.StartInfo = new ProcessStartInfo { - FileName = targetPath, + FileName = "explorer.exe", + Arguments = FileNameOrFilePath is null + ? DirectoryPath // only open the directory + : $"/select,\"{targetPath}\"", // open the directory and select the file UseShellExecute = true }; } From 41c5b36fba5aa1a627c153db7fa9f7ffc525dd4b Mon Sep 17 00:00:00 2001 From: DB p Date: Tue, 27 May 2025 15:20:41 +0900 Subject: [PATCH 069/101] Enhance OpenDirectory method to support folder opening and file selection using SHOpenFolderAndSelectItems --- Flow.Launcher/PublicAPIInstance.cs | 99 +++++++++++++++++++++++------- 1 file changed, 76 insertions(+), 23 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 93567288c..58dbd3ff0 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using System.Net; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using System.Windows; @@ -320,47 +321,98 @@ namespace Flow.Launcher ((PluginJsonStorage)_pluginJsonStorages[type]).Save(); } - public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null) + [DllImport("shell32.dll", CharSet = CharSet.Unicode)] + private static extern int SHParseDisplayName( + [MarshalAs(UnmanagedType.LPWStr)] string name, + IntPtr bindingContext, + out IntPtr pidl, + uint sfgaoIn, + out uint psfgaoOut + ); + + [DllImport("shell32.dll")] + private static extern int SHOpenFolderAndSelectItems( + IntPtr pidlFolder, + uint cidl, + [MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, + uint dwFlags + ); + + [DllImport("ole32.dll")] + private static extern void CoTaskMemFree(IntPtr pv); + + private void OpenFolderAndSelectItem(string filePath) + { + IntPtr pidlFolder = IntPtr.Zero; + IntPtr pidlFile = IntPtr.Zero; + uint attr; + + string folderPath = Path.GetDirectoryName(filePath); + + try + { + SHParseDisplayName(folderPath, IntPtr.Zero, out pidlFolder, 0, out attr); + SHParseDisplayName(filePath, IntPtr.Zero, out pidlFile, 0, out attr); + + if (pidlFolder != IntPtr.Zero && pidlFile != IntPtr.Zero) + { + SHOpenFolderAndSelectItems(pidlFolder, 1, new[] { pidlFile }, 0); + } + } + finally + { + if (pidlFile != IntPtr.Zero) + CoTaskMemFree(pidlFile); + if (pidlFolder != IntPtr.Zero) + CoTaskMemFree(pidlFolder); + } + } + + public void OpenDirectory(string directoryPath, string fileNameOrFilePath = null) { try { - using var explorer = new Process(); + string targetPath = fileNameOrFilePath is null + ? directoryPath + : Path.IsPathRooted(fileNameOrFilePath) + ? fileNameOrFilePath + : Path.Combine(directoryPath, fileNameOrFilePath); + var explorerInfo = _settings.CustomExplorer; var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant(); - var targetPath = FileNameOrFilePath is null - ? DirectoryPath - : Path.IsPathRooted(FileNameOrFilePath) - ? FileNameOrFilePath - : Path.Combine(DirectoryPath, FileNameOrFilePath); if (Path.GetFileNameWithoutExtension(explorerPath) == "explorer") { - // Windows File Manager - explorer.StartInfo = new ProcessStartInfo + if (fileNameOrFilePath is null) { - FileName = "explorer.exe", - Arguments = FileNameOrFilePath is null - ? DirectoryPath // only open the directory - : $"/select,\"{targetPath}\"", // open the directory and select the file - UseShellExecute = true - }; + // 폴더만 열기 + Process.Start(new ProcessStartInfo + { + FileName = directoryPath, + UseShellExecute = true + })?.Dispose(); + } + else + { + // SHOpenFolderAndSelectItems 방식 + OpenFolderAndSelectItem(targetPath); + } } else { - // Custom File Manager - explorer.StartInfo = new ProcessStartInfo + // 커스텀 파일 관리자 + var shellProcess = new ProcessStartInfo { - FileName = explorerInfo.Path.Replace("%d", DirectoryPath), + FileName = explorerInfo.Path.Replace("%d", directoryPath), UseShellExecute = true, - Arguments = FileNameOrFilePath is null - ? explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) + Arguments = fileNameOrFilePath is null + ? explorerInfo.DirectoryArgument.Replace("%d", directoryPath) : explorerInfo.FileArgument - .Replace("%d", DirectoryPath) + .Replace("%d", directoryPath) .Replace("%f", targetPath) }; + Process.Start(shellProcess)?.Dispose(); } - - explorer.Start(); } catch (Win32Exception ex) when (ex.NativeErrorCode == 2) { @@ -384,6 +436,7 @@ namespace Flow.Launcher } } + private void OpenUri(Uri uri, bool? inPrivate = null) { if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps) From 086aeab6c05f4b2ab13e6d0a8239db7d83c588b1 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 27 May 2025 14:36:09 +0800 Subject: [PATCH 070/101] Use PInvoke to improve code quality --- .../NativeMethods.txt | 4 + Flow.Launcher.Infrastructure/Win32Helper.cs | 31 ++++++++ Flow.Launcher/PublicAPIInstance.cs | 76 ++++--------------- 3 files changed, 50 insertions(+), 61 deletions(-) diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt index 0e50420b0..2591506c8 100644 --- a/Flow.Launcher.Infrastructure/NativeMethods.txt +++ b/Flow.Launcher.Infrastructure/NativeMethods.txt @@ -57,3 +57,7 @@ LOCALE_TRANSIENT_KEYBOARD1 LOCALE_TRANSIENT_KEYBOARD2 LOCALE_TRANSIENT_KEYBOARD3 LOCALE_TRANSIENT_KEYBOARD4 + +SHParseDisplayName +SHOpenFolderAndSelectItems +CoTaskMemFree diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs index 783ade14e..4952eec98 100644 --- a/Flow.Launcher.Infrastructure/Win32Helper.cs +++ b/Flow.Launcher.Infrastructure/Win32Helper.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; +using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Threading; @@ -17,6 +18,7 @@ using Windows.Win32; using Windows.Win32.Foundation; using Windows.Win32.Graphics.Dwm; using Windows.Win32.UI.Input.KeyboardAndMouse; +using Windows.Win32.UI.Shell.Common; using Windows.Win32.UI.WindowsAndMessaging; using Point = System.Windows.Point; using SystemFonts = System.Windows.SystemFonts; @@ -753,5 +755,34 @@ namespace Flow.Launcher.Infrastructure } #endregion + + #region Explorer + + public static unsafe void OpenFolderAndSelectFile(string filePath) + { + ITEMIDLIST* pidlFolder = null; + ITEMIDLIST* pidlFile = null; + + var folderPath = Path.GetDirectoryName(filePath); + + try + { + var hrFolder = PInvoke.SHParseDisplayName(folderPath, null, out pidlFolder, 0, null); + if (hrFolder.Failed) throw new COMException("Failed to parse folder path", hrFolder); + + var hrFile = PInvoke.SHParseDisplayName(filePath, null, out pidlFile, 0, null); + if (hrFile.Failed) throw new COMException("Failed to parse file path", hrFile); + + var hrSelect = PInvoke.SHOpenFolderAndSelectItems(pidlFolder, 1, &pidlFile, 0); + if (hrSelect.Failed) throw new COMException("Failed to open folder and select item", hrSelect); + } + finally + { + if (pidlFile != null) PInvoke.CoTaskMemFree(pidlFile); + if (pidlFolder != null) PInvoke.CoTaskMemFree(pidlFolder); + } + } + + #endregion } } diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 58dbd3ff0..c06c56039 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -8,11 +8,9 @@ using System.IO; using System.Linq; using System.Net; using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using System.Windows; -using System.Windows.Input; using System.Windows.Media; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.Core; @@ -320,88 +318,44 @@ namespace Flow.Launcher ((PluginJsonStorage)_pluginJsonStorages[type]).Save(); } - - [DllImport("shell32.dll", CharSet = CharSet.Unicode)] - private static extern int SHParseDisplayName( - [MarshalAs(UnmanagedType.LPWStr)] string name, - IntPtr bindingContext, - out IntPtr pidl, - uint sfgaoIn, - out uint psfgaoOut - ); - - [DllImport("shell32.dll")] - private static extern int SHOpenFolderAndSelectItems( - IntPtr pidlFolder, - uint cidl, - [MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, - uint dwFlags - ); - - [DllImport("ole32.dll")] - private static extern void CoTaskMemFree(IntPtr pv); - - private void OpenFolderAndSelectItem(string filePath) - { - IntPtr pidlFolder = IntPtr.Zero; - IntPtr pidlFile = IntPtr.Zero; - uint attr; - - string folderPath = Path.GetDirectoryName(filePath); - - try - { - SHParseDisplayName(folderPath, IntPtr.Zero, out pidlFolder, 0, out attr); - SHParseDisplayName(filePath, IntPtr.Zero, out pidlFile, 0, out attr); - - if (pidlFolder != IntPtr.Zero && pidlFile != IntPtr.Zero) - { - SHOpenFolderAndSelectItems(pidlFolder, 1, new[] { pidlFile }, 0); - } - } - finally - { - if (pidlFile != IntPtr.Zero) - CoTaskMemFree(pidlFile); - if (pidlFolder != IntPtr.Zero) - CoTaskMemFree(pidlFolder); - } - } public void OpenDirectory(string directoryPath, string fileNameOrFilePath = null) { try { - string targetPath = fileNameOrFilePath is null + var explorerInfo = _settings.CustomExplorer; + var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant(); + var targetPath = fileNameOrFilePath is null ? directoryPath : Path.IsPathRooted(fileNameOrFilePath) ? fileNameOrFilePath : Path.Combine(directoryPath, fileNameOrFilePath); - var explorerInfo = _settings.CustomExplorer; - var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant(); - if (Path.GetFileNameWithoutExtension(explorerPath) == "explorer") { + // Windows File Manager if (fileNameOrFilePath is null) { - // 폴더만 열기 - Process.Start(new ProcessStartInfo + // Only Open the directory + using var explorer = new Process(); + explorer.StartInfo = new ProcessStartInfo { FileName = directoryPath, UseShellExecute = true - })?.Dispose(); + }; + explorer.Start(); } else { - // SHOpenFolderAndSelectItems 방식 - OpenFolderAndSelectItem(targetPath); + // Open the directory and select the file + Win32Helper.OpenFolderAndSelectFile(targetPath); } } else { - // 커스텀 파일 관리자 - var shellProcess = new ProcessStartInfo + // Custom File Manager + using var explorer = new Process(); + explorer.StartInfo = new ProcessStartInfo { FileName = explorerInfo.Path.Replace("%d", directoryPath), UseShellExecute = true, @@ -411,7 +365,7 @@ namespace Flow.Launcher .Replace("%d", directoryPath) .Replace("%f", targetPath) }; - Process.Start(shellProcess)?.Dispose(); + explorer.Start(); } } catch (Win32Exception ex) when (ex.NativeErrorCode == 2) From eb69ce919e65b7b35fe48722f7a7ba8e9aa49096 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 27 May 2025 14:36:24 +0800 Subject: [PATCH 071/101] Add url comments --- Flow.Launcher.Infrastructure/Win32Helper.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs index 4952eec98..96d8e925b 100644 --- a/Flow.Launcher.Infrastructure/Win32Helper.cs +++ b/Flow.Launcher.Infrastructure/Win32Helper.cs @@ -758,6 +758,8 @@ namespace Flow.Launcher.Infrastructure #region Explorer + // https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shopenfolderandselectitems + public static unsafe void OpenFolderAndSelectFile(string filePath) { ITEMIDLIST* pidlFolder = null; From 489699ca89a86047509a1dc8a8dd180d986d22b1 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 27 May 2025 10:46:07 +0000 Subject: [PATCH 072/101] add update PR script --- .github/update_release_pr.py | 103 +++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 .github/update_release_pr.py diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py new file mode 100644 index 000000000..a9d11651b --- /dev/null +++ b/.github/update_release_pr.py @@ -0,0 +1,103 @@ +import os +import requests + +def get_github_prs(token, owner, repo, milestone, label, state): + """ + Fetches pull requests from a GitHub repository that match a given milestone and label. + + Args: + token (str): GitHub token. + owner (str): The owner of the repository. + repo (str): The name of the repository. + milestone (str): The milestone title. + label (str): The label name. + state (str): State of PR, e.g. open + + Returns: + list: A list of dictionaries, where each dictionary represents a pull request. + Returns an empty list if no PRs are found or an error occurs. + """ + headers = { + "Authorization": f"token {token}", + "Accept": "application/vnd.github.v3+json", + } + + milestone_id = None + milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" + params = {"state": state} + + try: + response = requests.get(milestone_url, headers=headers, params=params) + response.raise_for_status() + milestones = response.json() + for ms in milestones: + if ms["title"] == milestone: + milestone_id = ms["number"] + break + + if not milestone_id: + print(f"Milestone '{milestone}' not found in repository '{owner}/{repo}'.") + return [] + + except requests.exceptions.RequestException as e: + print(f"Error fetching milestones: {e}") + return [] + + prs_url = f"https://api.github.com/repos/{owner}/{repo}/pulls" + params = { + "state": state, + "milestone": milestone_id, + "labels": label, + } + + all_prs = [] + page = 1 + while True: + try: + params["page"] = page + response = requests.get(prs_url, headers=headers, params=params) + response.raise_for_status() # Raise an exception for HTTP errors + prs = response.json() + + if not prs: + break # No more PRs to fetch + + all_prs.extend(prs) + page += 1 + + except requests.exceptions.RequestException as e: + print(f"Error fetching pull requests: {e}") + break + + return all_prs + +if __name__ == "__main__": + github_token = os.environ.get("GITHUB_TOKEN") + + if not github_token: + print("Error: GITHUB_TOKEN environment variable not set.") + exit(1) + + repository_owner = "flow-launcher" + repository_name = "flow.launcher" + target_milestone = "1.20.0" + target_label = "enhancement" + state = "closed" + + print(f"Fetching PRs for {repository_owner}/{repository_name} with milestone '{target_milestone}' and label '{target_label}'...") + + pull_requests = get_github_prs( + github_token, + repository_owner, + repository_name, + target_milestone, + target_label, + state + ) + + if pull_requests: + print(f"\nFound {len(pull_requests)} pull requests:") + for pr in pull_requests: + print(f"- {pr['state']} #{pr['number']}: {pr['title']} (URL: {pr['html_url']})") + else: + print("No matching pull requests found.") From f79a2d24674d7f6f208a6c09c8a60ba98618ea84 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 27 May 2025 11:36:38 +0000 Subject: [PATCH 073/101] change to issues endpoint --- .github/update_release_pr.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index a9d11651b..b51620d73 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -24,7 +24,7 @@ def get_github_prs(token, owner, repo, milestone, label, state): milestone_id = None milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" - params = {"state": state} + params = {"state": open} try: response = requests.get(milestone_url, headers=headers, params=params) @@ -37,17 +37,19 @@ def get_github_prs(token, owner, repo, milestone, label, state): if not milestone_id: print(f"Milestone '{milestone}' not found in repository '{owner}/{repo}'.") - return [] + exit(1) except requests.exceptions.RequestException as e: print(f"Error fetching milestones: {e}") - return [] + exit(1) - prs_url = f"https://api.github.com/repos/{owner}/{repo}/pulls" + # This endpoint allows filtering by milestone and label. A PR in GH's perspective is a type of issue. + prs_url = f"https://api.github.com/repos/{owner}/{repo}/issues" params = { "state": state, "milestone": milestone_id, "labels": label, + "per_page": 100, } all_prs = [] @@ -61,18 +63,19 @@ def get_github_prs(token, owner, repo, milestone, label, state): if not prs: break # No more PRs to fetch - - all_prs.extend(prs) + + # Check for pr key since we are using issues endpoint instead. + all_prs.extend([item for item in prs if "pull_request" in item]) page += 1 except requests.exceptions.RequestException as e: print(f"Error fetching pull requests: {e}") - break + exit(1) return all_prs if __name__ == "__main__": - github_token = os.environ.get("GITHUB_TOKEN") + github_token = os.environ.get("GITHUB_TOKEN") if not github_token: print("Error: GITHUB_TOKEN environment variable not set.") From 55b69c601a12899f054cedab4956a2cb0dcf95e5 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Wed, 28 May 2025 11:20:39 +0000 Subject: [PATCH 074/101] get milestone dynamically --- .github/update_release_pr.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index b51620d73..c00683439 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,7 +1,7 @@ import os import requests -def get_github_prs(token, owner, repo, milestone, label, state): +def get_github_prs(token, owner, repo, label, state): """ Fetches pull requests from a GitHub repository that match a given milestone and label. @@ -9,7 +9,6 @@ def get_github_prs(token, owner, repo, milestone, label, state): token (str): GitHub token. owner (str): The owner of the repository. repo (str): The name of the repository. - milestone (str): The milestone title. label (str): The label name. state (str): State of PR, e.g. open @@ -30,13 +29,19 @@ def get_github_prs(token, owner, repo, milestone, label, state): response = requests.get(milestone_url, headers=headers, params=params) response.raise_for_status() milestones = response.json() + + if len(milestones) > 2: + print("More than two milestones found, unable to determine the milestone required.") + + # milestones.pop() for ms in milestones: - if ms["title"] == milestone: + if ms["title"] != "Future": milestone_id = ms["number"] + print(f"Gathering PRs with milestone {ms['title']}..." ) break if not milestone_id: - print(f"Milestone '{milestone}' not found in repository '{owner}/{repo}'.") + print(f"No suitable milestone found in repository '{owner}/{repo}'.") exit(1) except requests.exceptions.RequestException as e: @@ -83,17 +88,15 @@ if __name__ == "__main__": repository_owner = "flow-launcher" repository_name = "flow.launcher" - target_milestone = "1.20.0" target_label = "enhancement" state = "closed" - print(f"Fetching PRs for {repository_owner}/{repository_name} with milestone '{target_milestone}' and label '{target_label}'...") + print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") pull_requests = get_github_prs( github_token, repository_owner, repository_name, - target_milestone, target_label, state ) From 0b616d8721d432fe940c2683c2edfb9695641bf3 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Wed, 28 May 2025 12:03:13 +0000 Subject: [PATCH 075/101] add pr update --- .github/update_release_pr.py | 84 +++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index c00683439..b03b0c425 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -79,6 +79,53 @@ def get_github_prs(token, owner, repo, label, state): return all_prs +def update_pull_request_description(token, owner, repo, pr_number, new_description): + """ + Updates the description (body) of a GitHub Pull Request. + + Args: + token (str): Token. + owner (str): The owner of the repository. + repo (str): The name of the repository. + pr_number (int): The number of the pull request to update. + new_description (str): The new content for the PR's description. + + Returns: + dict or None: The updated PR object (as a dictionary) if successful, + None otherwise. + """ + headers = { + "Authorization": f"token {token}", + "Accept": "application/vnd.github.v3+json", + "Content-Type": "application/json" + } + + url = f"https://api.github.com/repos/{owner}/{repo}/pulls/{pr_number}" + + payload = { + "body": new_description + } + + print(f"Attempting to update PR #{pr_number} in {owner}/{repo}...") + print(f"URL: {url}") + # print(f"Payload: {payload}") # Uncomment for detailed payload debug + + try: + response = requests.patch(url, headers=headers, json=payload) + response.raise_for_status() + + updated_pr_data = response.json() + print(f"Successfully updated PR #{pr_number}.") + return updated_pr_data + + except requests.exceptions.RequestException as e: + print(f"Error updating pull request #{pr_number}: {e}") + if response is not None: + print(f"Response status code: {response.status_code}") + print(f"Response text: {response.text}") + return None + + if __name__ == "__main__": github_token = os.environ.get("GITHUB_TOKEN") @@ -92,7 +139,7 @@ if __name__ == "__main__": state = "closed" print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") - + pull_requests = get_github_prs( github_token, repository_owner, @@ -101,9 +148,32 @@ if __name__ == "__main__": state ) - if pull_requests: - print(f"\nFound {len(pull_requests)} pull requests:") - for pr in pull_requests: - print(f"- {pr['state']} #{pr['number']}: {pr['title']} (URL: {pr['html_url']})") - else: - print("No matching pull requests found.") + if not pull_requests: + print("No matching pull requests found") + exit(1) + + print(f"\nFound {len(pull_requests)} pull requests:") + + description_content = "" + for pr in pull_requests: + description_content+= f"- {pr['title']} #{pr['number']}\n" + + returned_pr = pull_requests = get_github_prs( + github_token, + repository_owner, + repository_name, + "release", + "open" + ) + + if len(returned_pr) != 1: + print(f"Unable to find the exact release PR. Returned result: {returned_pr}") + exit(1) + + release_pr = returned_pr[0] + + print(f"Found release PR: {release_pr['title']}") + + update_pull_request_description(github_token, repository_owner, repository_name, release_pr["number"], description_content) + + print(description_content) \ No newline at end of file From c33e9dedb85b8e11fdda534edef07875cd765879 Mon Sep 17 00:00:00 2001 From: DB P Date: Fri, 30 May 2025 13:20:16 +0900 Subject: [PATCH 076/101] Update delete confirmation message for folder link in context menu --- Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs index eabd118fb..db0128b3b 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs @@ -199,7 +199,7 @@ namespace Flow.Launcher.Plugin.Explorer { if (Context.API.ShowMsgBox( string.Format(Context.API.GetTranslation("plugin_explorer_delete_folder_link"), record.FullPath), - string.Empty, + Context.API.GetTranslation("plugin_explorer_deletefilefolder"), MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No) From ebb74da8b39b92c7621d201a687bc3e5efd40928 Mon Sep 17 00:00:00 2001 From: DB P Date: Fri, 30 May 2025 13:37:50 +0900 Subject: [PATCH 077/101] Refactor key press handling in MessageBoxEx to improve result assignment logic --- Flow.Launcher/MessageBoxEx.xaml.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/Flow.Launcher/MessageBoxEx.xaml.cs b/Flow.Launcher/MessageBoxEx.xaml.cs index c084b5149..510d14b89 100644 --- a/Flow.Launcher/MessageBoxEx.xaml.cs +++ b/Flow.Launcher/MessageBoxEx.xaml.cs @@ -159,12 +159,19 @@ namespace Flow.Launcher private void KeyEsc_OnPress(object sender, ExecutedRoutedEventArgs e) { - if (_button == MessageBoxButton.YesNo) - return; - else if (_button == MessageBoxButton.OK) - _result = MessageBoxResult.OK; - else - _result = MessageBoxResult.Cancel; + switch (_button) + { + case MessageBoxButton.OK: + _result = MessageBoxResult.None; + break; + case MessageBoxButton.OKCancel: + case MessageBoxButton.YesNoCancel: + _result = MessageBoxResult.Cancel; + break; + case MessageBoxButton.YesNo: + _result = MessageBoxResult.No; + break; + } DialogResult = false; Close(); } From 05486eae260622b35cb76b8dc421130144c057b6 Mon Sep 17 00:00:00 2001 From: DB P Date: Fri, 30 May 2025 14:45:19 +0900 Subject: [PATCH 078/101] Add OpenHistory hotkey functionality and binding --- Flow.Launcher.Infrastructure/UserSettings/Settings.cs | 4 +++- Flow.Launcher/HotkeyControl.xaml.cs | 5 +++++ Flow.Launcher/MainWindow.xaml | 8 ++++---- Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml | 5 ++++- Flow.Launcher/ViewModel/MainViewModel.cs | 4 ++++ 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index f00f42ac0..892045994 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -50,6 +50,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings public string SelectPrevPageHotkey { get; set; } = $"PageDown"; public string OpenContextMenuHotkey { get; set; } = $"Ctrl+O"; public string SettingWindowHotkey { get; set; } = $"Ctrl+I"; + public string OpenHistoryHotkey { get; set; } = $"Ctrl+H"; public string CycleHistoryUpHotkey { get; set; } = $"{KeyConstant.Alt} + Up"; public string CycleHistoryDownHotkey { get; set; } = $"{KeyConstant.Alt} + Down"; @@ -426,6 +427,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings list.Add(new(SelectPrevItemHotkey2, "SelectPrevItemHotkey", () => SelectPrevItemHotkey2 = "")); if (!string.IsNullOrEmpty(SettingWindowHotkey)) list.Add(new(SettingWindowHotkey, "SettingWindowHotkey", () => SettingWindowHotkey = "")); + if (!string.IsNullOrEmpty(OpenHistoryHotkey)) + list.Add(new(OpenHistoryHotkey, "OpenHistoryHotkey", () => OpenHistoryHotkey = "")); if (!string.IsNullOrEmpty(OpenContextMenuHotkey)) list.Add(new(OpenContextMenuHotkey, "OpenContextMenuHotkey", () => OpenContextMenuHotkey = "")); if (!string.IsNullOrEmpty(SelectNextPageHotkey)) @@ -461,7 +464,6 @@ namespace Flow.Launcher.Infrastructure.UserSettings new("Alt+Home", "HotkeySelectFirstResult"), new("Alt+End", "HotkeySelectLastResult"), new("Ctrl+R", "HotkeyRequery"), - new("Ctrl+H", "ToggleHistoryHotkey"), new("Ctrl+OemCloseBrackets", "QuickWidthHotkey"), new("Ctrl+OemOpenBrackets", "QuickWidthHotkey"), new("Ctrl+OemPlus", "QuickHeightHotkey"), diff --git a/Flow.Launcher/HotkeyControl.xaml.cs b/Flow.Launcher/HotkeyControl.xaml.cs index 262727127..e8961058c 100644 --- a/Flow.Launcher/HotkeyControl.xaml.cs +++ b/Flow.Launcher/HotkeyControl.xaml.cs @@ -100,6 +100,7 @@ namespace Flow.Launcher PreviewHotkey, OpenContextMenuHotkey, SettingWindowHotkey, + OpenHistoryHotkey, CycleHistoryUpHotkey, CycleHistoryDownHotkey, SelectPrevPageHotkey, @@ -130,6 +131,7 @@ namespace Flow.Launcher HotkeyType.PreviewHotkey => _settings.PreviewHotkey, HotkeyType.OpenContextMenuHotkey => _settings.OpenContextMenuHotkey, HotkeyType.SettingWindowHotkey => _settings.SettingWindowHotkey, + HotkeyType.OpenHistoryHotkey => _settings.OpenHistoryHotkey, HotkeyType.CycleHistoryUpHotkey => _settings.CycleHistoryUpHotkey, HotkeyType.CycleHistoryDownHotkey => _settings.CycleHistoryDownHotkey, HotkeyType.SelectPrevPageHotkey => _settings.SelectPrevPageHotkey, @@ -166,6 +168,9 @@ namespace Flow.Launcher case HotkeyType.SettingWindowHotkey: _settings.SettingWindowHotkey = value; break; + case HotkeyType.OpenHistoryHotkey: + _settings.OpenHistoryHotkey = value; + break; case HotkeyType.CycleHistoryUpHotkey: _settings.CycleHistoryUpHotkey = value; break; diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml index 31bc2ba50..413315faf 100644 --- a/Flow.Launcher/MainWindow.xaml +++ b/Flow.Launcher/MainWindow.xaml @@ -64,10 +64,6 @@ Key="R" Command="{Binding ReQueryCommand}" Modifiers="Ctrl" /> - + - + VerifyOrSetDefaultHotkey(Settings.SelectPrevPageHotkey, ""); public string OpenContextMenuHotkey => VerifyOrSetDefaultHotkey(Settings.OpenContextMenuHotkey, "Ctrl+O"); public string SettingWindowHotkey => VerifyOrSetDefaultHotkey(Settings.SettingWindowHotkey, "Ctrl+I"); + public string OpenHistoryHotkey => VerifyOrSetDefaultHotkey(Settings.OpenHistoryHotkey, "Ctrl+H"); public string CycleHistoryUpHotkey => VerifyOrSetDefaultHotkey(Settings.CycleHistoryUpHotkey, "Alt+Up"); public string CycleHistoryDownHotkey => VerifyOrSetDefaultHotkey(Settings.CycleHistoryDownHotkey, "Alt+Down"); From e6eb8c01c05672e4908e04be52649b6c027314f1 Mon Sep 17 00:00:00 2001 From: DB P Date: Fri, 30 May 2025 14:48:25 +0900 Subject: [PATCH 079/101] Revert key press handling --- Flow.Launcher/MessageBoxEx.xaml.cs | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/Flow.Launcher/MessageBoxEx.xaml.cs b/Flow.Launcher/MessageBoxEx.xaml.cs index 510d14b89..c084b5149 100644 --- a/Flow.Launcher/MessageBoxEx.xaml.cs +++ b/Flow.Launcher/MessageBoxEx.xaml.cs @@ -159,19 +159,12 @@ namespace Flow.Launcher private void KeyEsc_OnPress(object sender, ExecutedRoutedEventArgs e) { - switch (_button) - { - case MessageBoxButton.OK: - _result = MessageBoxResult.None; - break; - case MessageBoxButton.OKCancel: - case MessageBoxButton.YesNoCancel: - _result = MessageBoxResult.Cancel; - break; - case MessageBoxButton.YesNo: - _result = MessageBoxResult.No; - break; - } + if (_button == MessageBoxButton.YesNo) + return; + else if (_button == MessageBoxButton.OK) + _result = MessageBoxResult.OK; + else + _result = MessageBoxResult.Cancel; DialogResult = false; Close(); } From 7c718ce0614949ef2f56638efeca97e1af881909 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 30 May 2025 15:28:39 +0800 Subject: [PATCH 080/101] Add code comments --- Flow.Launcher/MessageBoxEx.xaml.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Flow.Launcher/MessageBoxEx.xaml.cs b/Flow.Launcher/MessageBoxEx.xaml.cs index c084b5149..7296ff4ca 100644 --- a/Flow.Launcher/MessageBoxEx.xaml.cs +++ b/Flow.Launcher/MessageBoxEx.xaml.cs @@ -160,6 +160,7 @@ namespace Flow.Launcher private void KeyEsc_OnPress(object sender, ExecutedRoutedEventArgs e) { if (_button == MessageBoxButton.YesNo) + // Follow System.Windows.MessageBox behavior return; else if (_button == MessageBoxButton.OK) _result = MessageBoxResult.OK; @@ -188,6 +189,7 @@ namespace Flow.Launcher private void Button_Cancel(object sender, RoutedEventArgs e) { if (_button == MessageBoxButton.YesNo) + // Follow System.Windows.MessageBox behavior return; else if (_button == MessageBoxButton.OK) _result = MessageBoxResult.OK; From abef6177998bc6ab6d03ab19fcaf93548bbe59d1 Mon Sep 17 00:00:00 2001 From: DB P Date: Fri, 30 May 2025 17:35:24 +0900 Subject: [PATCH 081/101] Change delete confirmation dialog from Yes/No to OK/Cancel --- Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs index db0128b3b..896fc9922 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs @@ -200,9 +200,9 @@ namespace Flow.Launcher.Plugin.Explorer if (Context.API.ShowMsgBox( string.Format(Context.API.GetTranslation("plugin_explorer_delete_folder_link"), record.FullPath), Context.API.GetTranslation("plugin_explorer_deletefilefolder"), - MessageBoxButton.YesNo, + MessageBoxButton.OKCancel, MessageBoxImage.Warning) - == MessageBoxResult.No) + == MessageBoxResult.Cancel) return false; if (isFile) From 70fcc848932e8f8f812896bc9b0a1acefc092c87 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 31 May 2025 17:15:39 +0800 Subject: [PATCH 082/101] Use ResultContextMenu instead of ContextMenu --- Flow.Launcher/MainWindow.xaml | 6 +++--- Flow.Launcher/MainWindow.xaml.cs | 20 +++++++++---------- .../SettingPages/Views/SettingsPaneTheme.xaml | 2 +- Flow.Launcher/Themes/Base.xaml | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml index 413315faf..9ff38a564 100644 --- a/Flow.Launcher/MainWindow.xaml +++ b/Flow.Launcher/MainWindow.xaml @@ -359,7 +359,7 @@ - + @@ -373,7 +373,7 @@ - + @@ -419,7 +419,7 @@ diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index bb29d78e5..0048c8aa9 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -295,14 +295,14 @@ namespace Flow.Launcher // QueryTextBox.Text change detection (modified to only work when character count is 1 or higher) QueryTextBox.TextChanged += (s, e) => UpdateClockPanelVisibility(); - // Detecting ContextMenu.Visibility changes + // Detecting ResultContextMenu.Visibility changes DependencyPropertyDescriptor - .FromProperty(VisibilityProperty, typeof(ContextMenu)) - .AddValueChanged(ContextMenu, (s, e) => UpdateClockPanelVisibility()); + .FromProperty(VisibilityProperty, typeof(ResultListBox)) + .AddValueChanged(ResultContextMenu, (s, e) => UpdateClockPanelVisibility()); // Detect History.Visibility changes DependencyPropertyDescriptor - .FromProperty(VisibilityProperty, typeof(StackPanel)) + .FromProperty(VisibilityProperty, typeof(ResultListBox)) .AddValueChanged(History, (s, e) => UpdateClockPanelVisibility()); // Initialize query state @@ -1016,7 +1016,7 @@ namespace Flow.Launcher private void UpdateClockPanelVisibility() { - if (QueryTextBox == null || ContextMenu == null || History == null || ClockPanel == null) + if (QueryTextBox == null || ResultContextMenu == null || History == null || ClockPanel == null) { return; } @@ -1031,20 +1031,20 @@ namespace Flow.Launcher }; var animationDuration = TimeSpan.FromMilliseconds(animationLength * 2 / 3); - // ✅ Conditions for showing ClockPanel (No query input & ContextMenu, History are closed) + // ✅ Conditions for showing ClockPanel (No query input / ResultContextMenu & History are closed) var shouldShowClock = QueryTextBox.Text.Length == 0 && - ContextMenu.Visibility != Visibility.Visible && + ResultContextMenu.Visibility != Visibility.Visible && History.Visibility != Visibility.Visible; - // ✅ 1. When ContextMenu opens, immediately set Visibility.Hidden (force hide without animation) - if (ContextMenu.Visibility == Visibility.Visible) + // ✅ 1. When ResultContextMenu opens, immediately set Visibility.Hidden (force hide without animation) + if (ResultContextMenu.Visibility == Visibility.Visible) { _viewModel.ClockPanelVisibility = Visibility.Hidden; _viewModel.ClockPanelOpacity = 0.0; // Set to 0 in case Opacity animation affects it return; } - // ✅ 2. When ContextMenu is closed, keep it Hidden if there's text in the query (remember previous state) + // ✅ 2. When ResultContextMenu is closed, keep it Hidden if there's text in the query (remember previous state) else if (QueryTextBox.Text.Length > 0) { _viewModel.ClockPanelVisibility = Visibility.Hidden; diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml index 700dc3a91..6e16012ac 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml @@ -374,7 +374,7 @@ IsHitTestVisible="False" Visibility="Visible" /> - + diff --git a/Flow.Launcher/Themes/Base.xaml b/Flow.Launcher/Themes/Base.xaml index 1844e25be..e531c17ad 100644 --- a/Flow.Launcher/Themes/Base.xaml +++ b/Flow.Launcher/Themes/Base.xaml @@ -479,7 +479,7 @@ + --> From 62359140a42b74048bf9a2d5e505ea0a7b16e541 Mon Sep 17 00:00:00 2001 From: DB P Date: Sun, 1 Jun 2025 19:34:49 +0900 Subject: [PATCH 083/101] Update Advanced title and reset button content to use dynamic resources --- Flow.Launcher/Languages/en.xaml | 1 + Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index f233a30d5..28673c753 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -359,6 +359,7 @@ User Data Location User settings and installed plugins are saved in the user data folder. This location may vary depending on whether it's in portable mode or not. Open Folder + Advanced Log Level Debug Info diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml index aa750cf86..65a470f4d 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml @@ -137,7 +137,7 @@ @@ -156,7 +156,7 @@ Icon="" Type="Inside"> - public static async Task SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption = HttpCompletionOption.ResponseContentRead, CancellationToken token = default) { - return await client.SendAsync(request, completionOption, token); + try + { + return await client.SendAsync(request, completionOption, token); + } + catch (System.Exception) + { + return new HttpResponseMessage(HttpStatusCode.InternalServerError); + } } } } From 93731d8bc1f0ce8db5ab5a5757c861569b7feeca Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 1 Jun 2025 12:14:21 +0000 Subject: [PATCH 085/101] combine into single api call --- .github/update_release_pr.py | 57 +++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index b03b0c425..b1136c523 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,7 +1,7 @@ import os import requests -def get_github_prs(token, owner, repo, label, state): +def get_github_prs(token, owner, repo, label = "", state ="all"): """ Fetches pull requests from a GitHub repository that match a given milestone and label. @@ -79,6 +79,25 @@ def get_github_prs(token, owner, repo, label, state): return all_prs +def get_prs(pull_request_items, label= "", state= "all"): + pr_list = [] + count = 0 + for pr in pull_request_items: + if pr["state"] == state and [item for item in pr["labels"] if item["name"] == label]: + pr_list.append(pr) + count += 1 + + print(f"Found {count} PRs with {label if label else "no"} label and state as {state}") + + return pr_list + +def get_pr_descriptions(pull_request_items): + description_content = "" + for pr in pull_request_items: + description_content+= f"- {pr['title']} #{pr['number']}\n" + + return description_content + def update_pull_request_description(token, owner, repo, pr_number, new_description): """ Updates the description (body) of a GitHub Pull Request. @@ -108,7 +127,6 @@ def update_pull_request_description(token, owner, repo, pr_number, new_descripti print(f"Attempting to update PR #{pr_number} in {owner}/{repo}...") print(f"URL: {url}") - # print(f"Payload: {payload}") # Uncomment for detailed payload debug try: response = requests.patch(url, headers=headers, json=payload) @@ -136,44 +154,41 @@ if __name__ == "__main__": repository_owner = "flow-launcher" repository_name = "flow.launcher" target_label = "enhancement" - state = "closed" + state = "all" print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") pull_requests = get_github_prs( github_token, repository_owner, - repository_name, - target_label, - state + repository_name ) if not pull_requests: print("No matching pull requests found") exit(1) - print(f"\nFound {len(pull_requests)} pull requests:") + print(f"\nFound total of {len(pull_requests)} pull requests") - description_content = "" - for pr in pull_requests: - description_content+= f"- {pr['title']} #{pr['number']}\n" - - returned_pr = pull_requests = get_github_prs( - github_token, - repository_owner, - repository_name, + release_pr = get_prs( + pull_requests, "release", "open" ) - if len(returned_pr) != 1: - print(f"Unable to find the exact release PR. Returned result: {returned_pr}") + if len(release_pr) != 1: + print(f"Unable to find the exact release PR. Returned result: {release_pr}") exit(1) - release_pr = returned_pr[0] + print(f"Found release PR: {release_pr[0]['title']}") - print(f"Found release PR: {release_pr['title']}") + enhancement_prs = get_prs(pull_requests, "enhancement", "closed") + bug_fix_prs = get_prs(pull_requests, "bug", "closed") - update_pull_request_description(github_token, repository_owner, repository_name, release_pr["number"], description_content) + description_content = "# Release notes\n" + description_content += f"## Features\n{get_pr_descriptions(enhancement_prs)}" if enhancement_prs else "" + description_content += f"## Bug fixes\n{get_pr_descriptions(bug_fix_prs)}" if bug_fix_prs else "" - print(description_content) \ No newline at end of file + update_pull_request_description(github_token, repository_owner, repository_name, release_pr[0]["number"], description_content) + + print(f"PR content updated to:\n{description_content}") \ No newline at end of file From a06cb43540d29c2bb716c32f7f431f855cf85149 Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Mon, 2 Jun 2025 11:16:22 +0800 Subject: [PATCH 086/101] Use new model to clear results & Fix clear existing results when using IResultUpdate (#3588) --- Flow.Launcher.Core/Plugin/QueryBuilder.cs | 6 ++- Flow.Launcher.Plugin/Query.cs | 5 +++ Flow.Launcher/MainWindow.xaml.cs | 2 +- Flow.Launcher/ViewModel/MainViewModel.cs | 38 +++++++++++------- Flow.Launcher/ViewModel/ResultsForUpdate.cs | 2 +- Flow.Launcher/ViewModel/ResultsViewModel.cs | 43 +++++++++++++-------- 6 files changed, 63 insertions(+), 33 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/QueryBuilder.cs b/Flow.Launcher.Core/Plugin/QueryBuilder.cs index fae821736..25a32a728 100644 --- a/Flow.Launcher.Core/Plugin/QueryBuilder.cs +++ b/Flow.Launcher.Core/Plugin/QueryBuilder.cs @@ -16,7 +16,8 @@ namespace Flow.Launcher.Core.Plugin Search = string.Empty, RawQuery = string.Empty, SearchTerms = Array.Empty(), - ActionKeyword = string.Empty + ActionKeyword = string.Empty, + IsHomeQuery = true }; } @@ -53,7 +54,8 @@ namespace Flow.Launcher.Core.Plugin Search = search, RawQuery = rawQuery, SearchTerms = searchTerms, - ActionKeyword = actionKeyword + ActionKeyword = actionKeyword, + IsHomeQuery = false }; } } diff --git a/Flow.Launcher.Plugin/Query.cs b/Flow.Launcher.Plugin/Query.cs index c3eede4c6..f50614699 100644 --- a/Flow.Launcher.Plugin/Query.cs +++ b/Flow.Launcher.Plugin/Query.cs @@ -21,6 +21,11 @@ namespace Flow.Launcher.Plugin /// public bool IsReQuery { get; internal set; } = false; + /// + /// Determines whether the query is a home query. + /// + public bool IsHomeQuery { get; internal init; } = false; + /// /// Search part of a query. /// This will not include action keyword if exclusive plugin gets it, otherwise it should be same as RawQuery. diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 0048c8aa9..f15091e4a 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -101,7 +101,7 @@ namespace Flow.Launcher private void ThemeManager_ActualApplicationThemeChanged(ModernWpf.ThemeManager sender, object args) { - _theme.RefreshFrameAsync(); + _ = _theme.RefreshFrameAsync(); } private void OnSourceInitialized(object sender, EventArgs e) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 8c2aeacae..64a39fa62 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -216,7 +216,26 @@ namespace Flow.Launcher.ViewModel while (channelReader.TryRead(out var item)) { if (!item.Token.IsCancellationRequested) + { + // Indicate if to clear existing results so to show only ones from plugins with action keywords + var query = item.Query; + var currentIsHomeQuery = query.IsHomeQuery; + var shouldClearExistingResults = ShouldClearExistingResultsForQuery(query, currentIsHomeQuery); + _lastQuery = item.Query; + _previousIsHomeQuery = currentIsHomeQuery; + + // If the queue already has the item, we need to pass the shouldClearExistingResults flag + if (queue.TryGetValue(item.ID, out var existingItem)) + { + item.ShouldClearExistingResults = shouldClearExistingResults || existingItem.ShouldClearExistingResults; + } + else + { + item.ShouldClearExistingResults = shouldClearExistingResults; + } + queue[item.ID] = item; + } } UpdateResultView(queue.Values); @@ -268,6 +287,8 @@ namespace Flow.Launcher.ViewModel if (token.IsCancellationRequested) return; + App.API.LogDebug(ClassName, $"Update results for plugin <{pair.Metadata.Name}>"); + if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, pair.Metadata, e.Query, token))) { @@ -1262,7 +1283,7 @@ namespace Flow.Launcher.ViewModel App.API.LogDebug(ClassName, $"Start query with ActionKeyword <{query.ActionKeyword}> and RawQuery <{query.RawQuery}>"); - var currentIsHomeQuery = query.RawQuery == string.Empty; + var currentIsHomeQuery = query.IsHomeQuery; _updateSource?.Dispose(); @@ -1436,13 +1457,8 @@ namespace Flow.Launcher.ViewModel App.API.LogDebug(ClassName, $"Update results for plugin <{plugin.Metadata.Name}>"); - // Indicate if to clear existing results so to show only ones from plugins with action keywords - var shouldClearExistingResults = ShouldClearExistingResultsForQuery(query, currentIsHomeQuery); - _lastQuery = query; - _previousIsHomeQuery = currentIsHomeQuery; - if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, plugin.Metadata, query, - token, reSelect, shouldClearExistingResults))) + token, reSelect))) { App.API.LogError(ClassName, "Unable to add item to Result Update Queue"); } @@ -1459,13 +1475,8 @@ namespace Flow.Launcher.ViewModel App.API.LogDebug(ClassName, $"Update results for history"); - // Indicate if to clear existing results so to show only ones from plugins with action keywords - var shouldClearExistingResults = ShouldClearExistingResultsForQuery(query, currentIsHomeQuery); - _lastQuery = query; - _previousIsHomeQuery = currentIsHomeQuery; - if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, _historyMetadata, query, - token, reSelect, shouldClearExistingResults))) + token, reSelect))) { App.API.LogError(ClassName, "Unable to add item to Result Update Queue"); } @@ -1865,6 +1876,7 @@ namespace Flow.Launcher.ViewModel { if (!resultsForUpdates.Any()) return; + CancellationToken token; try diff --git a/Flow.Launcher/ViewModel/ResultsForUpdate.cs b/Flow.Launcher/ViewModel/ResultsForUpdate.cs index 1563f85ba..304dd8757 100644 --- a/Flow.Launcher/ViewModel/ResultsForUpdate.cs +++ b/Flow.Launcher/ViewModel/ResultsForUpdate.cs @@ -10,7 +10,7 @@ namespace Flow.Launcher.ViewModel Query Query, CancellationToken Token, bool ReSelectFirstResult = true, - bool shouldClearExistingResults = false) + bool ShouldClearExistingResults = false) { public string ID { get; } = Metadata.ID; } diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs index 9cd36e5c4..2f4ca6ccf 100644 --- a/Flow.Launcher/ViewModel/ResultsViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs @@ -17,6 +17,8 @@ namespace Flow.Launcher.ViewModel { #region Private Fields + private readonly string ClassName = nameof(ResultsViewModel); + public ResultCollection Results { get; } private readonly object _collectionLock = new(); @@ -187,11 +189,9 @@ namespace Flow.Launcher.ViewModel /// public void AddResults(ICollection resultsForUpdates, CancellationToken token, bool reselect = true) { + // Since NewResults may need to clear existing results, do not check token cancellation after this point var newResults = NewResults(resultsForUpdates); - if (token.IsCancellationRequested) - return; - UpdateResults(newResults, reselect, token); } @@ -240,16 +240,20 @@ namespace Flow.Launcher.ViewModel private List NewResults(ICollection resultsForUpdates) { if (!resultsForUpdates.Any()) + { + App.API.LogDebug(ClassName, "No results for updates, returning existing results"); return Results; + } var newResults = resultsForUpdates.SelectMany(u => u.Results, (u, r) => new ResultViewModel(r, _settings)); - if (resultsForUpdates.Any(x => x.shouldClearExistingResults)) + if (resultsForUpdates.Any(x => x.ShouldClearExistingResults)) { - App.API.LogDebug("NewResults", $"Existing results are cleared for query"); + App.API.LogDebug(ClassName, $"Existing results are cleared for query"); return newResults.OrderByDescending(rv => rv.Result.Score).ToList(); } + App.API.LogDebug(ClassName, $"Keeping existing results for {resultsForUpdates.Count} queries"); return Results.Where(r => r?.Result != null && resultsForUpdates.All(u => u.ID != r.Result.PluginID)) .Concat(newResults) .OrderByDescending(rv => rv.Result.Score) @@ -293,8 +297,6 @@ namespace Flow.Launcher.ViewModel { private long editTime = 0; - private CancellationToken _token; - public event NotifyCollectionChangedEventHandler CollectionChanged; protected void OnCollectionChanged(NotifyCollectionChangedEventArgs e) @@ -302,12 +304,12 @@ namespace Flow.Launcher.ViewModel CollectionChanged?.Invoke(this, e); } - public void BulkAddAll(List resultViews) + private void BulkAddAll(List resultViews, CancellationToken token = default) { AddRange(resultViews); // can return because the list will be cleared next time updated, which include a reset event - if (_token.IsCancellationRequested) + if (token.IsCancellationRequested) return; // manually update event @@ -315,12 +317,12 @@ namespace Flow.Launcher.ViewModel OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } - private void AddAll(List Items) + private void AddAll(List Items, CancellationToken token = default) { for (int i = 0; i < Items.Count; i++) { var item = Items[i]; - if (_token.IsCancellationRequested) + if (token.IsCancellationRequested) return; Add(item); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, i)); @@ -342,21 +344,30 @@ namespace Flow.Launcher.ViewModel /// public void Update(List newItems, CancellationToken token = default) { - _token = token; - if (Count == 0 && newItems.Count == 0 || _token.IsCancellationRequested) + // Since NewResults may need to clear existing results, so we cannot check token cancellation here + if (Count == 0 && newItems.Count == 0) return; if (editTime < 10 || newItems.Count < 30) { if (Count != 0) RemoveAll(newItems.Count); - AddAll(newItems); + + // After results are removed, we need to check the token cancellation + // so that we will not add new items from the cancelled queries + if (token.IsCancellationRequested) return; + + AddAll(newItems, token); editTime++; - return; } else { Clear(); - BulkAddAll(newItems); + + // After results are removed, we need to check the token cancellation + // so that we will not add new items from the cancelled queries + if (token.IsCancellationRequested) return; + + BulkAddAll(newItems, token); if (Capacity > 8000 && newItems.Count < 3000) { Capacity = newItems.Count; From 72639fa5782d104847bbe69278913a152533113c Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:17:19 +0000 Subject: [PATCH 087/101] formatting --- .github/update_release_pr.py | 96 ++++++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 38 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index b1136c523..1eb07fa02 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,7 +1,9 @@ import os + import requests -def get_github_prs(token, owner, repo, label = "", state ="all"): + +def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: str = "all") -> list[dict]: """ Fetches pull requests from a GitHub repository that match a given milestone and label. @@ -10,7 +12,7 @@ def get_github_prs(token, owner, repo, label = "", state ="all"): owner (str): The owner of the repository. repo (str): The name of the repository. label (str): The label name. - state (str): State of PR, e.g. open + state (str): State of PR, e.g. open, close, all Returns: list: A list of dictionaries, where each dictionary represents a pull request. @@ -20,11 +22,11 @@ def get_github_prs(token, owner, repo, label = "", state ="all"): "Authorization": f"token {token}", "Accept": "application/vnd.github.v3+json", } - + milestone_id = None milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" params = {"state": open} - + try: response = requests.get(milestone_url, headers=headers, params=params) response.raise_for_status() @@ -37,9 +39,9 @@ def get_github_prs(token, owner, repo, label = "", state ="all"): for ms in milestones: if ms["title"] != "Future": milestone_id = ms["number"] - print(f"Gathering PRs with milestone {ms['title']}..." ) + print(f"Gathering PRs with milestone {ms['title']}...") break - + if not milestone_id: print(f"No suitable milestone found in repository '{owner}/{repo}'.") exit(1) @@ -63,12 +65,12 @@ def get_github_prs(token, owner, repo, label = "", state ="all"): try: params["page"] = page response = requests.get(prs_url, headers=headers, params=params) - response.raise_for_status() # Raise an exception for HTTP errors + response.raise_for_status() # Raise an exception for HTTP errors prs = response.json() - + if not prs: - break # No more PRs to fetch - + break # No more PRs to fetch + # Check for pr key since we are using issues endpoint instead. all_prs.extend([item for item in prs if "pull_request" in item]) page += 1 @@ -76,29 +78,57 @@ def get_github_prs(token, owner, repo, label = "", state ="all"): except requests.exceptions.RequestException as e: print(f"Error fetching pull requests: {e}") exit(1) - + return all_prs -def get_prs(pull_request_items, label= "", state= "all"): + +def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[dict]: + """ + Returns a list of pull requests after applying the label and state filters. + + Args: + pull_request_items (str): List of PR items. + label (str): The label name. + state (str): State of PR, e.g. open, close, all + + Returns: + list: A list of dictionaries, where each dictionary represents a pull request. + Returns an empty list if no PRs are found. + """ pr_list = [] count = 0 for pr in pull_request_items: if pr["state"] == state and [item for item in pr["labels"] if item["name"] == label]: pr_list.append(pr) count += 1 - + print(f"Found {count} PRs with {label if label else "no"} label and state as {state}") return pr_list -def get_pr_descriptions(pull_request_items): + +def get_pr_descriptions(pull_request_items: list[dict]) -> str: + """ + Returns the concatenated string of pr title and number in the format of + '- PR title 1 #3651 + - PR title 2 #3652 + - PR title 3 #3653 + ' + + Args: + pull_request_items (list[dict]): List of PR items. + + Returns: + str: a string of PR titles and numbers + """ description_content = "" for pr in pull_request_items: - description_content+= f"- {pr['title']} #{pr['number']}\n" + description_content += f"- {pr['title']} #{pr['number']}\n" return description_content -def update_pull_request_description(token, owner, repo, pr_number, new_description): + +def update_pull_request_description(token: str, owner: str, repo: str, pr_number: int, new_description: str) -> None: """ Updates the description (body) of a GitHub Pull Request. @@ -116,14 +146,12 @@ def update_pull_request_description(token, owner, repo, pr_number, new_descripti headers = { "Authorization": f"token {token}", "Accept": "application/vnd.github.v3+json", - "Content-Type": "application/json" + "Content-Type": "application/json", } url = f"https://api.github.com/repos/{owner}/{repo}/pulls/{pr_number}" - payload = { - "body": new_description - } + payload = {"body": new_description} print(f"Attempting to update PR #{pr_number} in {owner}/{repo}...") print(f"URL: {url}") @@ -132,21 +160,19 @@ def update_pull_request_description(token, owner, repo, pr_number, new_descripti response = requests.patch(url, headers=headers, json=payload) response.raise_for_status() - updated_pr_data = response.json() print(f"Successfully updated PR #{pr_number}.") - return updated_pr_data except requests.exceptions.RequestException as e: print(f"Error updating pull request #{pr_number}: {e}") if response is not None: print(f"Response status code: {response.status_code}") print(f"Response text: {response.text}") - return None + exit(1) if __name__ == "__main__": - github_token = os.environ.get("GITHUB_TOKEN") - + github_token = os.environ.get("PR_GET_TOKEN") + if not github_token: print("Error: GITHUB_TOKEN environment variable not set.") exit(1) @@ -158,11 +184,7 @@ if __name__ == "__main__": print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") - pull_requests = get_github_prs( - github_token, - repository_owner, - repository_name - ) + pull_requests = get_github_prs(github_token, repository_owner, repository_name) if not pull_requests: print("No matching pull requests found") @@ -170,16 +192,12 @@ if __name__ == "__main__": print(f"\nFound total of {len(pull_requests)} pull requests") - release_pr = get_prs( - pull_requests, - "release", - "open" - ) + release_pr = get_prs(pull_requests, "release", "open") if len(release_pr) != 1: print(f"Unable to find the exact release PR. Returned result: {release_pr}") exit(1) - + print(f"Found release PR: {release_pr[0]['title']}") enhancement_prs = get_prs(pull_requests, "enhancement", "closed") @@ -189,6 +207,8 @@ if __name__ == "__main__": description_content += f"## Features\n{get_pr_descriptions(enhancement_prs)}" if enhancement_prs else "" description_content += f"## Bug fixes\n{get_pr_descriptions(bug_fix_prs)}" if bug_fix_prs else "" - update_pull_request_description(github_token, repository_owner, repository_name, release_pr[0]["number"], description_content) + update_pull_request_description( + github_token, repository_owner, repository_name, release_pr[0]["number"], description_content + ) - print(f"PR content updated to:\n{description_content}") \ No newline at end of file + print(f"PR content updated to:\n{description_content}") From f83f70205e2b8d22c4e13ef70934136e4eb65477 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:21:16 +0000 Subject: [PATCH 088/101] formatting --- .github/update_release_pr.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index 1eb07fa02..40bc80b2f 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,5 +1,3 @@ -import os - import requests From 124130a7ae747ef509fe212ce3cac52f6d7b25ab Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:35:43 +0000 Subject: [PATCH 089/101] formatting --- .github/update_release_pr.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index 40bc80b2f..9c1557ad0 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,3 +1,5 @@ +from os import getenv + import requests @@ -169,7 +171,7 @@ def update_pull_request_description(token: str, owner: str, repo: str, pr_number if __name__ == "__main__": - github_token = os.environ.get("PR_GET_TOKEN") + github_token = getenv("GITHUB_TOKEN") if not github_token: print("Error: GITHUB_TOKEN environment variable not set.") From ef8f43f4da3f2b811b64a7a2f0100aae9247ca55 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:39:55 +0000 Subject: [PATCH 090/101] add workflow for update release pr --- .github/workflows/release_pr.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/release_pr.yml diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml new file mode 100644 index 000000000..12a6b911d --- /dev/null +++ b/.github/workflows/release_pr.yml @@ -0,0 +1,22 @@ +name: Update release PR + +on: + push: + workflow_dispatch: + +jobs: + update-pr: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.x" + + - name: Run release PR update + env: + GITHUB_TOKEN: ${{ secrets.PR_TOKEN }} + run: | + pwd + python ./.github/update)release_pr.py From 88a2ba4176cdbf5bf0cfb3730d48c409eee38ab1 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:41:34 +0000 Subject: [PATCH 091/101] fix typo --- .github/workflows/release_pr.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index 12a6b911d..d96a72712 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -18,5 +18,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.PR_TOKEN }} run: | - pwd - python ./.github/update)release_pr.py + python ./.github/update_release_pr.py From 4e22e20c66b8eb79a828d3e6da65b4065e2556b3 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:43:10 +0000 Subject: [PATCH 092/101] install requests library --- .github/workflows/release_pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index d96a72712..3a3a4d826 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -18,4 +18,5 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.PR_TOKEN }} run: | + pip install requests python ./.github/update_release_pr.py From f72eae2220262b3373b80b5abd237c990a966337 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:45:21 +0000 Subject: [PATCH 093/101] pip install silent --- .github/workflows/release_pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index 3a3a4d826..c801f68d0 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -18,5 +18,5 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.PR_TOKEN }} run: | - pip install requests + pip install requests -q python ./.github/update_release_pr.py From a9a212e4dec018bdf09ba24fcbe335ca9567563e Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:52:12 +0000 Subject: [PATCH 094/101] add trigger only run when pr exists --- .github/workflows/release_pr.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index c801f68d0..dafc77b81 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -1,11 +1,15 @@ name: Update release PR on: - push: + pull_request: + types: [opened, reopened, synchronize] + branches: + - master workflow_dispatch: jobs: update-pr: + if: github.head_ref == 'dev' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From a52ceb1caf316eda02f39175392f30c998d721a0 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:56:36 +0000 Subject: [PATCH 095/101] add exit when more than two milestones found --- .github/update_release_pr.py | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index 9c1557ad0..e528e4503 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -34,6 +34,7 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st if len(milestones) > 2: print("More than two milestones found, unable to determine the milestone required.") + exit(1) # milestones.pop() for ms in milestones: From f7e473cee3fe8d4e439be60514f996fe525c2b2e Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:59:55 +0000 Subject: [PATCH 096/101] typo --- .github/update_release_pr.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index e528e4503..a79005141 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -25,7 +25,7 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st milestone_id = None milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" - params = {"state": open} + params = {"state": "open"} try: response = requests.get(milestone_url, headers=headers, params=params) @@ -103,7 +103,7 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") pr_list.append(pr) count += 1 - print(f"Found {count} PRs with {label if label else "no"} label and state as {state}") + print(f"Found {count} PRs with {label if label else 'no'} label and state as {state}") return pr_list From a1a4ef6b2255c9824a777127709871704a816a26 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 2 Jun 2025 20:05:59 +0800 Subject: [PATCH 097/101] Fix comment typos --- .github/update_release_pr.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index a79005141..bc16f20bc 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -12,7 +12,7 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st owner (str): The owner of the repository. repo (str): The name of the repository. label (str): The label name. - state (str): State of PR, e.g. open, close, all + state (str): State of PR, e.g. open, closed, all Returns: list: A list of dictionaries, where each dictionary represents a pull request. @@ -90,7 +90,7 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") Args: pull_request_items (str): List of PR items. label (str): The label name. - state (str): State of PR, e.g. open, close, all + state (str): State of PR, e.g. open, closed, all Returns: list: A list of dictionaries, where each dictionary represents a pull request. From dfbc84780a148aa53dca0627d4cbfc1ece59ff50 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 12:19:06 +0000 Subject: [PATCH 098/101] remove dev source branch condition --- .github/workflows/release_pr.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index dafc77b81..b0a178304 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -9,7 +9,6 @@ on: jobs: update-pr: - if: github.head_ref == 'dev' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From ef84add35ce82c3ffb2267208a1a7743a5c00a31 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 12:27:38 +0000 Subject: [PATCH 099/101] minor adjustments --- .github/update_release_pr.py | 6 +++--- .github/workflows/release_pr.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index bc16f20bc..f90f6181d 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -88,7 +88,7 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") Returns a list of pull requests after applying the label and state filters. Args: - pull_request_items (str): List of PR items. + pull_request_items (list[dict]): List of PR items. label (str): The label name. state (str): State of PR, e.g. open, closed, all @@ -158,6 +158,7 @@ def update_pull_request_description(token: str, owner: str, repo: str, pr_number print(f"URL: {url}") try: + response = None response = requests.patch(url, headers=headers, json=payload) response.raise_for_status() @@ -180,10 +181,9 @@ if __name__ == "__main__": repository_owner = "flow-launcher" repository_name = "flow.launcher" - target_label = "enhancement" state = "all" - print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") + print(f"Fetching {state} PRs for {repository_owner}/{repository_name} ...") pull_requests = get_github_prs(github_token, repository_owner, repository_name) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index b0a178304..451bf386c 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -22,4 +22,4 @@ jobs: GITHUB_TOKEN: ${{ secrets.PR_TOKEN }} run: | pip install requests -q - python ./.github/update_release_pr.py + python3 ./.github/update_release_pr.py From db9728828201dc21e36503e51b8df900b2924ee3 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 3 Jun 2025 13:52:56 +1000 Subject: [PATCH 100/101] New Crowdin updates (#3574) --- Flow.Launcher/Languages/ar.xaml | 1 + Flow.Launcher/Languages/cs.xaml | 1 + Flow.Launcher/Languages/da.xaml | 1 + Flow.Launcher/Languages/de.xaml | 33 ++-- Flow.Launcher/Languages/es-419.xaml | 1 + Flow.Launcher/Languages/es.xaml | 13 +- Flow.Launcher/Languages/fr.xaml | 13 +- Flow.Launcher/Languages/he.xaml | 25 +-- Flow.Launcher/Languages/it.xaml | 1 + Flow.Launcher/Languages/ja.xaml | 1 + Flow.Launcher/Languages/ko.xaml | 19 +- Flow.Launcher/Languages/nb.xaml | 1 + Flow.Launcher/Languages/nl.xaml | 1 + Flow.Launcher/Languages/pl.xaml | 1 + Flow.Launcher/Languages/pt-br.xaml | 1 + Flow.Launcher/Languages/pt-pt.xaml | 1 + Flow.Launcher/Languages/ru.xaml | 1 + Flow.Launcher/Languages/sk.xaml | 1 + Flow.Launcher/Languages/sr.xaml | 1 + Flow.Launcher/Languages/tr.xaml | 1 + Flow.Launcher/Languages/uk-UA.xaml | 1 + Flow.Launcher/Languages/vi.xaml | 1 + Flow.Launcher/Languages/zh-cn.xaml | 167 +++++++++--------- Flow.Launcher/Languages/zh-tw.xaml | 1 + .../Languages/ar.xaml | 9 + .../Languages/cs.xaml | 9 + .../Languages/da.xaml | 9 + .../Languages/de.xaml | 9 + .../Languages/es-419.xaml | 9 + .../Languages/es.xaml | 9 + .../Languages/fr.xaml | 9 + .../Languages/he.xaml | 9 + .../Languages/it.xaml | 9 + .../Languages/ja.xaml | 9 + .../Languages/ko.xaml | 13 +- .../Languages/nb.xaml | 9 + .../Languages/nl.xaml | 9 + .../Languages/pl.xaml | 9 + .../Languages/pt-br.xaml | 9 + .../Languages/pt-pt.xaml | 9 + .../Languages/ru.xaml | 9 + .../Languages/sk.xaml | 9 + .../Languages/sr.xaml | 9 + .../Languages/tr.xaml | 9 + .../Languages/uk-UA.xaml | 9 + .../Languages/vi.xaml | 9 + .../Languages/zh-cn.xaml | 13 +- .../Languages/zh-tw.xaml | 9 + .../Languages/zh-cn.xaml | 4 +- .../Languages/de.xaml | 4 +- .../Languages/zh-cn.xaml | 4 +- .../Languages/es.xaml | 4 +- .../Languages/zh-cn.xaml | 10 +- .../Languages/ko.xaml | 2 +- .../Languages/zh-cn.xaml | 2 +- .../Languages/ko.xaml | 22 +-- .../Languages/zh-cn.xaml | 14 +- .../Languages/zh-cn.xaml | 2 +- .../Languages/zh-cn.xaml | 6 +- .../Properties/Resources.de-DE.resx | 16 +- .../Properties/Resources.ko-KR.resx | 118 ++++++------- 61 files changed, 480 insertions(+), 240 deletions(-) diff --git a/Flow.Launcher/Languages/ar.xaml b/Flow.Launcher/Languages/ar.xaml index 42cfdf3eb..88e8fbc61 100644 --- a/Flow.Launcher/Languages/ar.xaml +++ b/Flow.Launcher/Languages/ar.xaml @@ -364,6 +364,7 @@ موقع بيانات المستخدم يتم حفظ إعدادات المستخدم والإضافات المثبتة في مجلد بيانات المستخدم. قد يختلف هذا الموقع اعتمادًا على ما إذا كان في وضع النقل أم لا. فتح المجلد + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml index bfcd92360..552f1a36d 100644 --- a/Flow.Launcher/Languages/cs.xaml +++ b/Flow.Launcher/Languages/cs.xaml @@ -364,6 +364,7 @@ User Data Location User settings and installed plugins are saved in the user data folder. This location may vary depending on whether it's in portable mode or not. Open Folder + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml index 9a4cbc003..7fd6d478a 100644 --- a/Flow.Launcher/Languages/da.xaml +++ b/Flow.Launcher/Languages/da.xaml @@ -364,6 +364,7 @@ User Data Location User settings and installed plugins are saved in the user data folder. This location may vary depending on whether it's in portable mode or not. Open Folder + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml index 88c5b84d4..3c650920f 100644 --- a/Flow.Launcher/Languages/de.xaml +++ b/Flow.Launcher/Languages/de.xaml @@ -42,8 +42,8 @@ Spielmodus Aussetzen der Verwendung von Hotkeys. Position zurücksetzen - Reset search window position - Type here to search + Position des Suchfensters zurücksetzen + Zum Suchen hier tippen Einstellungen @@ -126,12 +126,12 @@ - Open Language and Region System Settings + Sprach- und Regionen-Systemeinstellungen öffnen Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility Öffnen - Use Previous Korean IME + Vorherige koreanische IME verwenden You can change the Previous Korean IME settings directly from here - Home Page + Homepage Show home page results when query text is empty. Show History Results in Home Page Maximum History Results Shown in Home Page @@ -154,11 +154,11 @@ Aktions-Schlüsselwörter ändern Plugin search delay time Change Plugin Search Delay Time - Advanced Settings: + Erweiterte Einstellungen Aktiviert Priorität Search Delay - Home Page + Homepage Aktuelle Priorität Neue Priorität Priorität @@ -246,13 +246,13 @@ Acrylic Mica Mica Alt - This theme supports two (light/dark) modes. + Dieses Theme unterstützt zwei Modi (hell/dunkel). Dieses Theme unterstützt Unschärfe und transparenten Hintergrund. - Show placeholder + Platzhalter zeigen Display placeholder when query is empty - Placeholder text + Platzhaltertext Change placeholder text. Input empty will use: {0} - Fixed Window Size + Festgelegte Fenstergröße The window size is not adjustable by dragging. @@ -313,7 +313,7 @@ Segoe Fluent-Icons verwenden Segoe Fluent-Icons für Abfrageergebnisse verwenden, wo unterstützt Taste drücken - Show Result Badges + Ergebnis-Badges zeigen For supported plugins, badges are displayed to help distinguish them more easily. Show Result Badges for Global Query Only @@ -356,14 +356,15 @@ Ordner »Logs« Logs löschen Sind Sie sicher, dass Sie alle Logs löschen wollen? - Cache Folder - Clear Caches + Cache-Ordner + Cache leeren Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information Assistent Speicherort für Benutzerdaten Benutzereinstellungen und installierte Plug-ins werden im Ordner für Benutzerdaten gespeichert. Dieser Speicherort kann variieren, je nachdem, ob sich das Programm im portablen Modus befindet oder nicht. Ordner öffnen + Advanced Log-Ebene Debug Info @@ -371,7 +372,7 @@ Dateimanager auswählen - Learn more + Mehr erfahren Bitte geben Sie den Dateiort des von Ihnen verwendeten Dateimanagers an und fügen Sie bei Bedarf Argumente hinzu. Das „%d“ repräsentiert den dafür zu öffnenden Verzeichnispfad, der vom Feld Arg for Folder und für Befehle zum Öffnen bestimmter Verzeichnisse verwendet wird. Das „%f“ repräsentiert den dafür zu öffnenden Dateipfad, der vom Feld Arg for File und für Befehle zum Öffnen bestimmter Dateien verwendet wird. Zum Beispiel, wenn der Dateimanager einen Befehl wie „totalcmd.exe /A c:\windows“ verwendet, um das Verzeichnis c:\windows zu öffnen, lautet der Dateimanager-Pfad „totalcmd.exe“ und der Arg for Folder „/A %d“. Bestimmte Dateimanager wie QTTabBar kann nur die Angabe eines Pfades erfordern, in diesem Fall verwenden Sie „%d“ als den Dateimanager-Pfad und lassen den Rest der Felder blank. Dateimanager @@ -416,7 +417,7 @@ Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. - Home Page + Homepage Enable the plugin home page state if you like to show the plugin results when query is empty. diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml index b73a1ef12..5bd77a8dd 100644 --- a/Flow.Launcher/Languages/es-419.xaml +++ b/Flow.Launcher/Languages/es-419.xaml @@ -364,6 +364,7 @@ User Data Location User settings and installed plugins are saved in the user data folder. This location may vary depending on whether it's in portable mode or not. Open Folder + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml index 2b6074f06..7324fc01b 100644 --- a/Flow.Launcher/Languages/es.xaml +++ b/Flow.Launcher/Languages/es.xaml @@ -364,6 +364,7 @@ Ubicación de datos del usuario La configuración del usuario y los complementos instalados se guardan en la carpeta de datos del usuario. Esta ubicación puede variar dependiendo de si está en modo portable o no. Abrir carpeta + Advanced Nivel de registro Depurar Información @@ -371,7 +372,7 @@ Seleccionar administrador de archivos - Learn more + Más información Especifique la ubicación del archivo del administrador de archivos que está utilizando y añada los argumentos necesarios. El argumento "%d" representa la ruta del directorio a abrir, utilizada por el campo Argumentos de la carpeta y por comandos que abren directorios específicos. El "%f" representa la ruta del archivo a abrir, utilizada por el campo Argumentos del archivo y por comandos que abren archivos específicos. Por ejemplo, si el administrador de archivos utiliza un comando como "totalcmd.exe /A c:\windows" para abrir el directorio c:\windows, la ruta del administrador de archivos será totalcmd.exe, y los Argumentos de la carpeta serán /A "%d". Ciertos administradores de archivos como QTTabBar pueden requerir solo la ruta, en este caso utilice "%d" como la ruta del administrador de archivos y deje el resto de los campos en blanco. Administrador de archivos @@ -379,8 +380,8 @@ Ruta del administrador de archivos Argumentos de la carpeta Argumentos del archivo - The file manager '{0}' could not be located at '{1}'. Would you like to continue? - File Manager Path Error + El administrador de archivos '{0}' no pudo ser localizado en '{1}'. ¿Desea continuar? + Error de ruta del administrador de archivos Navegador web predeterminado @@ -473,12 +474,12 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci 2. Copiar el siguiente mensaje de excepción - File Manager Error + Error del administrador de archivos - The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + No se ha encontrado el administrador de archivos especificado. Compruebe la configuración del Administrador de archivos personalizado en Configuración > General. Error - An error occurred while opening the folder. {0} + Se ha producido un error al abrir la carpeta. {0} Por favor espere... diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml index cd6d8c01f..95ad58d6e 100644 --- a/Flow.Launcher/Languages/fr.xaml +++ b/Flow.Launcher/Languages/fr.xaml @@ -363,6 +363,7 @@ Emplacement des données utilisateur Les paramètres utilisateur et les plugins installés sont enregistrés dans le dossier des données utilisateur. Cet emplacement peut varier selon que vous soyez en mode portable ou non. Ouvrir le dossier + Avancé Niveau de journalisation Débogage Info @@ -370,7 +371,7 @@ Sélectionner le gestionnaire de fichiers - Learn more + En savoir plus Veuillez spécifier l'emplacement du fichier de l'explorateur de fichiers que vous utilisez et ajouter des arguments si nécessaire. Le "%d" représente le chemin du répertoire à ouvrir, utilisé par le champ Arg for Folder et pour les commandes ouvrant des répertoires spécifiques. Le "%f" représente le chemin du fichier à ouvrir, utilisé par le champ Arg for File et pour les commandes ouvrant des fichiers spécifiques. Par exemple, si l'explorateur de fichiers utilise une commande telle que "totalcmd.exe /A c:\windows" pour ouvrir le répertoire c:\windows, le chemin de l'explorateur de fichiers sera totalcmd.exe et l'argument Arg For Folder sera /A "%d"". Certains explorateurs de fichiers comme QTTabBar peuvent simplement nécessiter qu'un chemin soit fourni, dans ce cas, utilisez "%d" comme chemin de l'explorateur de fichiers et laissez le reste des fichiers vides. Gestionnaire de fichiers @@ -378,8 +379,8 @@ Chemin du gestionnaire de fichiers Arguments pour le répertoire Arguments pour le fichier - The file manager '{0}' could not be located at '{1}'. Would you like to continue? - File Manager Path Error + Le gestionnaire de fichiers '{0}' n'a pas pu être situé à '{1}'. Souhaitez-vous continuer ? + Erreur de chemin du gestionnaire de fichiers Navigateur web par défaut @@ -472,12 +473,12 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu 2. Copiez le message d’exception ci-dessous - File Manager Error + Erreur du gestionnaire de fichiers - The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + Le gestionnaire de fichiers spécifié n'a pas été trouvé. Veuillez vérifier le paramètre Gestionnaire de fichiers personnalisé dans Paramètres > Général. Erreur - An error occurred while opening the folder. {0} + Une erreur s'est produite lors de l'ouverture du dossier. {0} Veuillez patienter... diff --git a/Flow.Launcher/Languages/he.xaml b/Flow.Launcher/Languages/he.xaml index b98c2ec73..d1688b647 100644 --- a/Flow.Launcher/Languages/he.xaml +++ b/Flow.Launcher/Languages/he.xaml @@ -67,7 +67,7 @@ מרכז עליון שמאל עליון ימין עליון - Custom Position + מיקום מותאם אישית שפה סגנון שאילתה אחרונה הצג/הסתר תוצאות קודמות כאשר Flow Launcher מופעל מחדש. @@ -102,7 +102,7 @@ נמוך Regular חפש באמצעות Pinyin - Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese. + מאפשר חיפוש באמצעות Pinyin, מערכת הכתיבה הסטנדרטית לתרגום סינית. הצג תמיד תצוגה מקדימה פתח תמיד את לוח התצוגה המקדימה כאשר Flow מופעל. הקש על {0} כדי להחליף את התצוגה המקדימה. לא ניתן להחיל אפקט צל כאשר העיצוב הנוכחי מוגדר לאפקט טשטוש @@ -134,7 +134,7 @@ Show home page results when query text is empty. Show History Results in Home Page Maximum History Results Shown in Home Page - This can only be edited if plugin supports Home feature and Home Page is enabled. + ניתן לערוך זאת רק אם התוסף תומך בתכונת הבית ודף הבית מופעל. חפש תוסף @@ -151,7 +151,7 @@ מילת מפתח נוכחית לפעולה מילת מפתח חדשה לפעולה שנה מילות מפתח לפעולה - Plugin search delay time + זמן השהייה של חיפוש תוסף שנה את זמן השהיית חיפוש של תוסף הגדרות מתקדמות: מופעל @@ -313,7 +313,7 @@ השתמש ב-Segoe Fluent Icons לתוצאות חיפוש כאשר נתמך הקש על מקש הצג תגי תוצאות - For supported plugins, badges are displayed to help distinguish them more easily. + עבור תוספים נתמכים, מוצגים תגים כדי לעזור להבחין ביניהם ביתר קלות. Show Result Badges for Global Query Only @@ -363,6 +363,7 @@ מיקום נתוני משתמש הגדרות המשתמש והתוספים המותקנים נשמרים בתיקיית נתוני המשתמש. מיקום זה עשוי להשתנות אם התוכנה במצב נייד. פתח תיקיה + Advanced רמת יומן ניפוי שגיאות מידע @@ -370,7 +371,7 @@ בחר מנהל קבצים - Learn more + למד עוד אנא ציין את מיקום הקובץ של מנהל הקבצים שבו אתה משתמש והוסף ארגומנטים כנדרש. "%d" מייצג את נתיב התיקייה שיש לפתוח, ומשמש בשדה ארגומנט לתיקייה ובפקודות לפתיחת תיקיות מסוימות. "%f" מייצג את נתיב הקובץ שיש לפתוח, ומשמש בשדה ארגומנט לקובץ ובפקודות לפתיחת קבצים מסוימים. לדוגמה, אם מנהל הקבצים משתמש בפקודה כגון "totalcmd.exe /A c:\windows" כדי לפתוח את התיקייה c:\windows, נתיב מנהל הקבצים יהיה totalcmd.exe, והארגומנט לתיקייה יהיה /A "%d". מנהלי קבצים מסוימים, כגון QTTabBar, עשויים לדרוש רק ציון נתיב, במקרה כזה השתמש ב-"%d" כנתיב מנהל הקבצים והשאר את שאר השדות ריקים. מנהל קבצים @@ -378,8 +379,8 @@ נתיב מנהל קבצים ארגומנט לתיקייה ארגומנט לקובץ - The file manager '{0}' could not be located at '{1}'. Would you like to continue? - File Manager Path Error + לא ניתן היה לאתר את מנהל הקבצים '{0}' ב-'{1}'. האם ברצונך להמשיך? + שגיאת נתיב למנהל הקבצים דפדפן ברירת מחדל @@ -416,7 +417,7 @@ דף הבית - Enable the plugin home page state if you like to show the plugin results when query is empty. + הפעל את מצב דף הבית של התוסף אם ברצונך להציג את תוצאות התוסף כאשר השאילתה ריקה. מקש קיצור לשאילתה מותאמת אישית @@ -472,12 +473,12 @@ 2. העתק את הודעת החריגה למטה - File Manager Error + שגיאת מנהל הקבצים - The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + לא ניתן היה למצוא את מנהל הקבצים שצוין. אנא בדוק את ההגדרה של מנהל קבצים מותאם אישית תחת הגדרות > כללי. שגיאה - An error occurred while opening the folder. {0} + אירעה שגיאה בעת פתיחת התיקייה. {0} אנא המתן... diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml index 7ea797fa9..64d9f5abe 100644 --- a/Flow.Launcher/Languages/it.xaml +++ b/Flow.Launcher/Languages/it.xaml @@ -364,6 +364,7 @@ Posizione Dati Utente Le impostazioni dell'utente e i plugin installati sono salvati nella cartella dati utente. Questa posizione può variare se è in modalità portable o no. Apri Cartella + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml index 33673d60f..c2e64ae26 100644 --- a/Flow.Launcher/Languages/ja.xaml +++ b/Flow.Launcher/Languages/ja.xaml @@ -364,6 +364,7 @@ User Data Location User settings and installed plugins are saved in the user data folder. This location may vary depending on whether it's in portable mode or not. Open Folder + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml index 9e8f9a73b..b78c86a82 100644 --- a/Flow.Launcher/Languages/ko.xaml +++ b/Flow.Launcher/Languages/ko.xaml @@ -122,10 +122,10 @@ 열기 이전 버전의 Microsoft IME 사용 이전 버전의 IME를 사용하도록 시스템 설정을 변경합니다 - Home Page - Show home page results when query text is empty. - Show History Results in Home Page - Maximum History Results Shown in Home Page + 홈페이지 + 쿼리 입력창이 비어있을때, 홈페이지의 결과를 표시합니다. + 히스토리를 홈페이지에 표시 + 홈페이지에 표시할 최대 히스토리 수 This can only be edited if plugin supports Home feature and Home Page is enabled. @@ -149,7 +149,7 @@ 중요 검색 지연 - Home Page + 홈페이지 현재 중요도: 새 중요도: 중요도 @@ -347,7 +347,7 @@ 로그 폴더 로그 삭제 정말 모든 로그를 삭제하시겠습니까? - Cache Folder + 캐시 폴더 캐시 지우기 모든 캐시를 삭제하시겠습니까? Failed to clear part of folders and files. Please see log file for more information @@ -355,14 +355,15 @@ 사용자 데이터 위치 사용자 설정과 설치된 플러그인은 사용자 데이터 폴더에 저장됩니다. 이 위치는 휴대용 모드 활성화 여부에 따라 달라질 수 있습니다. 폴더 열기 + Advanced 로그 레벨 Debug Info - Setting Window Font + 설정창 글꼴 파일관리자 선택 - Learn more + 더 알아보기 사용 중인 파일 관리자의 파일 위치를 지정하고, 필요한 경우 인수를 추가하세요. "%d"는 열고자 하는 디렉터리 경로를 나타내며, 폴더용 인수 필드 및 특정 디렉터리를 여는 명령어에서 사용됩니다. "%f"는 열고자 하는 파일 경로를 나타내며, 파일용 인수 필드 및 특정 파일을 여는 명령어에서 사용됩니다. 예를 들어, 파일 관리자가 totalcmd.exe /A c:\windows와 같은 명령어로 c:\windows 디렉터리를 연다면, 파일 관리자 경로는 totalcmd.exe가 되고, 폴더용 인수는 /A "%d"가 됩니다. QTTabBar와 같은 일부 파일 관리자는 경로만 전달하면 되는 경우가 있으므로, 이 경우에는 파일 관리자 경로에 "%d"를 입력하고 나머지 필드는 비워두세요. 파일관리자 @@ -407,7 +408,7 @@ 플러그인에서 사용할 검색 지연 시간(ms)을 입력하세요. 지정하지 않으려면 비워두세요. 기본 검색 지연 시간이 사용됩니다. - Home Page + 홈페이지 Enable the plugin home page state if you like to show the plugin results when query is empty. diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml index 8d5ac7a94..9e62ec2cc 100644 --- a/Flow.Launcher/Languages/nb.xaml +++ b/Flow.Launcher/Languages/nb.xaml @@ -364,6 +364,7 @@ Plassering av brukerdata Brukerinnstillinger og installerte programtillegg lagres i brukerens datamappe. Denne plasseringen kan variere avhengig av om den er i portabel modus eller ikke. Åpne mappe + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml index 0f6ad436d..31e6ea768 100644 --- a/Flow.Launcher/Languages/nl.xaml +++ b/Flow.Launcher/Languages/nl.xaml @@ -364,6 +364,7 @@ Gegevenslocatie van gebruiker Gebruikersinstellingen en geïnstalleerde plug-ins worden opgeslagen in de gebruikersgegevensmap. Deze locatie kan variëren afhankelijk van of het in draagbare modus is of niet. Map openen + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml index 1397afa25..f32a38585 100644 --- a/Flow.Launcher/Languages/pl.xaml +++ b/Flow.Launcher/Languages/pl.xaml @@ -364,6 +364,7 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Lokalizacja danych użytkownika Ustawienia użytkownika i zainstalowane wtyczki są zapisywane w folderze danych użytkownika. Ta lokalizacja może się różnić w zależności od tego, czy aplikacja jest w trybie przenośnym, czy nie. Otwórz folder + Advanced Poziom logowania Debug Info diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml index 232134290..bcbfa74af 100644 --- a/Flow.Launcher/Languages/pt-br.xaml +++ b/Flow.Launcher/Languages/pt-br.xaml @@ -364,6 +364,7 @@ User Data Location User settings and installed plugins are saved in the user data folder. This location may vary depending on whether it's in portable mode or not. Open Folder + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml index f98fdf64b..4eca2c5c6 100644 --- a/Flow.Launcher/Languages/pt-pt.xaml +++ b/Flow.Launcher/Languages/pt-pt.xaml @@ -362,6 +362,7 @@ Localização dos dados do utilizador As definições e os plugins instalados são guardados na pasta de dados do utilizador. A localização pode variar, tendo em conta se a aplicação está instalada ou no modo portátil Abrir pasta + Avançado Nível de registo Depuração Informação diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml index 2a9b5c26b..3a63a4ea4 100644 --- a/Flow.Launcher/Languages/ru.xaml +++ b/Flow.Launcher/Languages/ru.xaml @@ -364,6 +364,7 @@ User Data Location User settings and installed plugins are saved in the user data folder. This location may vary depending on whether it's in portable mode or not. Open Folder + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml index 934b0747a..3c47d61fd 100644 --- a/Flow.Launcher/Languages/sk.xaml +++ b/Flow.Launcher/Languages/sk.xaml @@ -364,6 +364,7 @@ Cesta k používateľskému priečinku Nastavenia používateľa a nainštalované pluginy sa ukladajú do používateľského priečinka. Toto umiestnenie sa môže líšiť v závislosti od toho, či je v prenosnom režime alebo nie. Otvoriť priečinok + Rozšírené Úroveň logovania Debug Info diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml index 0d2c04513..43f316a38 100644 --- a/Flow.Launcher/Languages/sr.xaml +++ b/Flow.Launcher/Languages/sr.xaml @@ -364,6 +364,7 @@ User Data Location User settings and installed plugins are saved in the user data folder. This location may vary depending on whether it's in portable mode or not. Open Folder + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml index ab9aa31e6..2f4e4d302 100644 --- a/Flow.Launcher/Languages/tr.xaml +++ b/Flow.Launcher/Languages/tr.xaml @@ -364,6 +364,7 @@ Kullanıcı Verisi Dizini Kullanıcı ayarları ve yüklü eklentiler bu klasörde saklanır. Klasörün konumu taşınabilir moda bağlı olarak değişebilir. Klasörü Aç + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml index f7cc7b0ed..a7dfcda55 100644 --- a/Flow.Launcher/Languages/uk-UA.xaml +++ b/Flow.Launcher/Languages/uk-UA.xaml @@ -364,6 +364,7 @@ Розташування даних користувача Налаштування користувача та встановлені плагіни зберігаються у теці даних користувача. Це місце може змінюватися залежно від того, чи перебуває програма в портативному режимі, чи ні. Відкрити теку + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml index 95e43e297..c51edaf23 100644 --- a/Flow.Launcher/Languages/vi.xaml +++ b/Flow.Launcher/Languages/vi.xaml @@ -366,6 +366,7 @@ Vị trí dữ liệu người dùng Thiết đặt người dùng và plugin đã cài đặt sẽ được lưu trong thư mục dữ liệu người dùng. Vị trí này có thể thay đổi tùy thuộc vào việc nó có ở chế độ di động hay không. Mở thư mục + Advanced Log Level Debug Info diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml index f6576070f..95a97d5ed 100644 --- a/Flow.Launcher/Languages/zh-cn.xaml +++ b/Flow.Launcher/Languages/zh-cn.xaml @@ -8,9 +8,9 @@ 请选择 {0} 可执行文件 - Your selected {0} executable is invalid. + 您选择的 {0} 可执行文件无效。 {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + 如果您希望重新选择 {0} 可执行文件,请点击“是”。如果需要下载 {1},请点击“否” 无法设置 {0} 可执行路径,请尝试从 Flow 的设置中设置(向下滚动到底部)。 无法初始化插件 @@ -18,7 +18,7 @@ 无法注册热键“{0}”。该热键可能正在被其他程序使用。更改为不同的热键,或退出其他程序。 - Failed to unregister hotkey "{0}". Please try again or see log for details + 未能取消注册快捷键"{0}"。请重试或查看日志以获取详细信息 Flow Launcher 启动命令 {0} 失败 无效的 Flow Launcher 插件文件格式 @@ -42,8 +42,8 @@ 游戏模式 暂停使用热键。 重置位置 - Reset search window position - Type here to search + 重置搜索窗口位置 + 在此处输入以搜索 设置 @@ -51,12 +51,12 @@ 便携模式 将所有设置和用户数据存储在一个文件夹中 (可用于可移除驱动器或云服务)。 开机自启 - Use logon task instead of startup entry for faster startup experience - After uninstallation, you need to manually remove this task (Flow.Launcher Startup) via Task Scheduler + 使用登录任务代替启动条目来更快地启动体验 + 卸载后,您需要通过任务计划程序手动移除此任务 (Flow.Launcher Startup) 设置开机自启时出错 失去焦点时自动隐藏 Flow Launcher 不显示新版本提示 - Search Window Location + 搜索窗口位置 记住上次的位置 鼠标光标所在显示器 聚焦窗口所在显示器 @@ -74,8 +74,8 @@ 保留上次搜索关键字 选择上次搜索关键字 清空上次搜索关键字 - Preserve Last Action Keyword - Select Last Action Keyword + 保留最后操作关键词 + 选择最后一个操作关键词 最大结果显示个数 您也可以通过使用 CTRL+ "+" 和 CTRL+ "-" 来快速调整它。 全屏模式下忽略热键 @@ -106,36 +106,36 @@ 始终打开预览 Flow 启动时总是打开预览面板。按 {0} 以切换预览。 当前主题已启用模糊效果,不允许启用阴影效果 - Search Delay - Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. - Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. - Default Search Delay Time - Wait time before showing results after typing stops. Higher values wait longer. (ms) - Information for Korean IME user + 延迟搜索 + 在输入时添加一个短时间延迟以减少UI闪烁和加载结果的负载。建议您的输入速度是平均的。 + 输入等待时间(毫秒),直到输入被认为完成。这只能在启用搜索延迟时进行编辑。 + 默认搜索延迟时间 + 在输入停止后显示结果之前等待时间。更高的数值等待更长时间(毫秒) + 韩文输入法用户信息 - The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + Windows 11中使用的韩国输入法可能会在Flow Launcher中引起一些问题。 - If you experience any problems, you may need to enable "Use previous version of Korean IME". + 如果您遇到任何问题,您可能需要启用"使用上一个版本的韩语IME"。 - Open Setting in Windows 11 and go to: + Windows 11中的打开设置,转到: - Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + 时间和语言> 语言和区域 > 韩国语言选项 > 键盘-微软IME > 兼容性 - and enable "Use previous version of Microsoft IME". + 并启用"使用之前版本的 Microsoft IME"。 - Open Language and Region System Settings - Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + 打开语言和区域系统设置 + 打开韩语输入法设置位置。转到韩语> 语言选项 > 键盘-微软输入法 > 兼容性 打开 - Use Previous Korean IME - You can change the Previous Korean IME settings directly from here - Home Page - Show home page results when query text is empty. - Show History Results in Home Page - Maximum History Results Shown in Home Page - This can only be edited if plugin supports Home feature and Home Page is enabled. + 使用以前的韩语输入法 + 您可以直接从这里更改前韩语输入法设置 + 首页 + 当查询文本为空时显示主页结果。 + 在主页中显示历史记录 + 在主页显示的最大历史结果数 + 这只能在插件支持主页功能和主页启用时进行编辑。 搜索插件 @@ -152,13 +152,13 @@ 当前触发关键字 新触发关键字 更改触发关键字 - Plugin search delay time - Change Plugin Search Delay Time - Advanced Settings: + 插件搜索延迟时间 + 更改插件搜索延迟时间 + 高级设置: 启用 优先级 - Search Delay - Home Page + 延迟搜索 + 首页 当前优先级 新优先级 优先级 @@ -170,10 +170,10 @@ 版本 官方网站 卸载 - Fail to remove plugin settings - Plugins: {0} - Fail to remove plugin settings files, please remove them manually - Fail to remove plugin cache - Plugins: {0} - Fail to remove plugin cache files, please remove them manually + 移除插件设置失败 + 插件:{0} - 移除插件设置文件失败,请手动删除 + 移除插件缓存失败 + 插件:{0} - 移除插件设置文件失败,请手动删除 插件商店 @@ -210,9 +210,9 @@ 结果标题字体 结果字幕字体 重置 - Reset to the recommended font and size settings. - Import Theme Size - If a size value intended by the theme designer is available, it will be retrieved and applied. + 重置为推荐字体和大小设置。 + 导入主题尺寸 + 如果主题设计器想要的大小值可用,它将被检索和应用。 自定义 窗口模式 透明度 @@ -239,21 +239,21 @@ 自定义 时钟 日期 - Backdrop Type - The backdrop effect is not applied in the preview. - Backdrop supported starting from Windows 11 build 22000 and above + 返回类型 + 预览中没有应用背景效果。 + 自 Windows 11 Build 22000 起支持背景效果 - Acrylic - Mica - Mica Alt - This theme supports two (light/dark) modes. + 亚克力 + 云母 + 云母平替 + 该主题支持两种(浅色/深色)模式。 该主题支持模糊透明背景。 - Show placeholder - Display placeholder when query is empty - Placeholder text - Change placeholder text. Input empty will use: {0} - Fixed Window Size - The window size is not adjustable by dragging. + 显示占位符 + 当查询为空时显示占位符 + 占位符文本 + 更改占位符文本。输入空将使用:{0} + 固定窗口大小 + 窗口高度不能通过拖动来调整。 热键 @@ -313,9 +313,9 @@ 使用 Segoe Fluent 图标 在支持时在选项中显示 Segoe Fluent 图标 按下按键 - Show Result Badges - For supported plugins, badges are displayed to help distinguish them more easily. - Show Result Badges for Global Query Only + 显示结果徽章 + 对于支持的插件,将显示徽章以帮助更容易区分它们。 + 仅在全局查询下显示结果徽章 HTTP 代理 @@ -356,22 +356,23 @@ 日志目录 清除日志 你确定要删除所有的日志吗? - Cache Folder - Clear Caches - Are you sure you want to delete all caches? - Failed to clear part of folders and files. Please see log file for more information + 缓存文件夹 + 清除缓存 + 您确定要删除所有缓存吗? + 无法清除部分文件夹和文件。请查看日志文件以获取更多信息 向导 用户数据位置 用户设置和已安装的插件保存在用户数据文件夹中。此位置可能因是否处于便携模式而异。 打开文件夹 - Log Level - Debug - Info - Setting Window Font + 高级 + 日志等级 + 调试 + 信息 + 设置窗口字体 默认文件管理器 - Learn more + 了解更多 请指定您使用的文件管理器的文件位置并根据需要添加参数。“%d”表示要打开的目录路径,由文件夹字段的参数和打开特定目录的命令使用。“%f”表示要打开的文件路径,由文件字段的参数和打开特定文件的命令使用。 例如,如果文件管理器使用诸如“totalcmd.exe /A c:\windows”之类的命令来打开 c:\windows 目录,则文件管理器路径将为 totalcmd.exe,文件夹参数将为 /A "%d"。某些文件管理器(如 QTTabBar)可能只需要提供路径,在本例中,使用“%d”作为文件管理器路径,其余字段留空。 文件管理器 @@ -379,8 +380,8 @@ 文件管理器路径 文件夹路径参数 选中文件路径参数 - The file manager '{0}' could not be located at '{1}'. Would you like to continue? - File Manager Path Error + 文件管理器 '{0}' 不能在 '{1}'中定位。您想要继续吗? + 文件管理器路径错误 默认浏览器 @@ -388,7 +389,7 @@ 浏览器 浏览器名称 浏览器路径 - 新窗户 + 新窗口 新标签 隐身模式 @@ -405,19 +406,19 @@ 找不到指定的插件 新触发关键字不能为空 此触发关键字已经被指派给其他插件了,请换一个关键字 - This new Action Keyword is the same as old, please choose a different one + 此触发关键字已经被指派给其他插件了,请换一个关键字 成功 成功完成 - Failed to copy - Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. + 复制失败 + 请输入您希望用来启动插件的动作关键字,并使用空格进行分隔。若不想指定任何关键字,可直接输入*,此时插件将在未输入动作关键字的情况下被触发 - Search Delay Time Setting - Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + 搜索延迟时间设置 + 请输入您希望插件使用的搜索延迟时间(单位:毫秒)。若不想指定,可留空,此时插件将采用默认的搜索延迟时间。 - Home Page - Enable the plugin home page state if you like to show the plugin results when query is empty. + 首页 + 如果您想在查询为空时显示插件的结果,请启用插件主页状态。 自定义查询热键 @@ -468,17 +469,17 @@ 发送成功 发送失败 Flow Launcher 出错啦 - Please open new issue in - 1. Upload log file: {0} - 2. Copy below exception message + 请打开新的问题在 + 1. 上传日志文件:{0} + 2. 复制下面的异常消息 - File Manager Error + 文件管理器错误 - The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + 找不到指定的文件管理器。请在“设置 > 通用”下检查自定义文件管理器设置。 错误 - An error occurred while opening the folder. {0} + 打开文件夹时发生错误。{0} 请稍等... diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml index 42810f590..60531c6aa 100644 --- a/Flow.Launcher/Languages/zh-tw.xaml +++ b/Flow.Launcher/Languages/zh-tw.xaml @@ -364,6 +364,7 @@ User Data Location User settings and installed plugins are saved in the user data folder. This location may vary depending on whether it's in portable mode or not. Open Folder + Advanced Log Level Debug Info diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml index 0a3bfc36a..28f8557c2 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml @@ -31,6 +31,7 @@ الحجم تاريخ الإنشاء تاريخ التعديل + File Age عرض معلومات الملف تنسيق التاريخ والوقت خيارات الترتيب: @@ -164,4 +165,12 @@ عرض قائمة السياق الأصلية (تجريبي) أدناه يمكنك تحديد العناصر التي تريد تضمينها في قائمة السياق، يمكن أن تكون جزئية (على سبيل المثال 'pen wit') أو كاملة ('فتح بواسطة'). يمكنك أدناه تحديد العناصر التي تريد استبعادها من قائمة الضغط الأيمن، يمكن أن تكون جزئية (على سبيل المثال، 'pen wit') أو كاملة ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml index 4fc248a2a..86f0d1170 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml @@ -31,6 +31,7 @@ Velikost Datum vytvoření Datum změny + File Age Display File Info Date and time format Možnosti řazení: @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml index e0ae6d9c8..003db91d1 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml @@ -31,6 +31,7 @@ Size Date Created Date Modified + File Age Display File Info Date and time format Sort Option: @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml index 1ee327adb..d183d44dd 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml @@ -31,6 +31,7 @@ Größe Erstellungsdatum Änderungsdatum + File Age Datei-Info anzeigen Datums- und Zeitformat Sortieroption: @@ -164,4 +165,12 @@ Natives Kontextmenü anzeigen (experimentell) Unten können Sie die Elemente angeben, die Sie in das Kontextmenü aufnehmen möchten. Diese können partiell (z. B. „Stift mit“) oder vollständig („Öffnen mit“) sein. Unten können Sie die Elemente angeben, die Sie aus dem Kontextmenü ausschließen möchten. Diese können partiell (z. B. „Stift mit“) oder vollständig („Öffnen mit“) sein. + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml index 490096013..7f5fb043b 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml @@ -31,6 +31,7 @@ Size Fecha de creación Fecha de modificación + File Age Display File Info Date and time format Sort Option: @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml index 8977eb6a7..33fe8eba8 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml @@ -31,6 +31,7 @@ Tamaño Fecha de creación Fecha de modificación + Edad del archivo Mostrar información del archivo Formato de fecha y hora Ordenar por: @@ -164,4 +165,12 @@ Mostrar menú contextual nativo (experimental) En el siguiente cuadro puede especificar los elementos que desea incluir en el menú contextual, puede describirlos de forma parcial (p. ej., 'brir co') o completa ('Abrir con'). En el siguiente cuadro puede especificar los elementos que desea excluir en el menú contextual, puede describirlos de forma parcial (p. ej., 'brir co') o completa ('Abrir con'). + + + Hoy + Hace {0} días + Hace 1 mes + Hace {0} meses + Hace 1 año + Hace {0} años diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml index 79eab8918..ab5e0d381 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml @@ -31,6 +31,7 @@ Taille Date de création Date de modification + Âge du fichier Afficher les informations du fichier Format de la date et de l'heure Option de tri : @@ -164,4 +165,12 @@ Afficher le menu contextuel natif (expérimental) Ci-dessous, vous pouvez spécifier les éléments que vous souhaitez inclure dans le menu contextuel. Ils peuvent être partiels ('pen wit') ou complets ('Ouvrir avec'). Vous pouvez spécifier ci-dessous les éléments que vous souhaitez exclure du menu contextuel. Ces éléments peuvent être partiels (par exemple, "pen wit") ou complets ("Ouvrir avec"). + + + Aujourd’hui + Il y a {0} jours + il y a 1 mois + Il y a {0} mois + il y a 1 an + Il y a {0} ans diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml index cc8415692..7c1003c2b 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml @@ -31,6 +31,7 @@ גודל תאריך יצירה תאריך שינוי + גיל הקובץ הצגת מידע על קובץ תבנית תאריך ושעה אפשרות מיון: @@ -164,4 +165,12 @@ הצג תפריט הקשר מקורי (ניסיוני) כאן תוכל להגדיר פריטים שברצונך לכלול בתפריט ההקשר, הם יכולים להיות חלקיים (למשל 'pen wit') או שלמים ('Open with'). כאן תוכל להגדיר פריטים שברצונך להחריג מתפריט ההקשר, הם יכולים להיות חלקיים (למשל 'pen wit') או שלמים ('Open with'). + + + היום + לפני {0} ימים + לפני חודש אחד + לפני {0} חודשים + לפני שנה אחת + לפני {0} שנים diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml index 492e3e03d..d05ab66db 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml @@ -31,6 +31,7 @@ Dimensioni Data di creazione Data della modifica + File Age Visualizza Informazioni File Formato data e ora Opzioni di ordinamento: @@ -164,4 +165,12 @@ Visualizza il menu contestuale nativo (sperimentale) Sotto si può specificare elementi che si vuole includere nel menu contestuale, che possono essere parziali (es 'pri co') o completi ('Apri con'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml index d815e2ddc..a0d45be00 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml @@ -31,6 +31,7 @@ サイズ 作成日時 更新日時 + File Age ファイル情報の表示 日付と時刻の形式 Sort Option: @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml index 1d11556ad..82c3ef4e8 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml @@ -31,6 +31,7 @@ 크기 만든 날짜 수정한 날짜 + File Age 파일 정보 표시 시간과 날짜 형식 정렬 옵션: @@ -80,8 +81,8 @@ 경로 복사 이 항목의 경로를 클립보드에 복사 - Copy name - Copy name of current item to clipboard + 이름 복사 + 이 항목의 이름을 클립보드에 복사 복사하기 이 파일을 클립보드에 복사 이 파일을 클립보드에 복사 @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml index 3488ad2f0..f8c0374f3 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml @@ -31,6 +31,7 @@ Størrelse Dato opprettet Dato endret + File Age Vis filinfo Dato- og klokkeslettformat Alternativ for sortering: @@ -164,4 +165,12 @@ Vis opprinnelig hurtigmeny (eksperimentell) Nedenfor kan du spesifisere elementer du vil inkludere i hurtigtmenyen, de kan være delvise (f.eks. 'pne me') eller komplette ('Åpne med'). Nedenfor kan du spesifisere elementer du vil ekskludere fra hurtigtmenyen, de kan være delvise (f.eks. 'pne me') eller komplette ('Åpne med'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml index b6816b63f..23fdcc214 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml @@ -31,6 +31,7 @@ Grootte Datum aangemaakt Datum gewijzigd + File Age Bestandsinformatie weergeven Formaat voor datum en tijd Sort Option: @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml index f4cecc440..5b7afac8e 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml @@ -31,6 +31,7 @@ Rozmiar Data utworzenia Data modyfikacji + File Age Wyświetl informacje o pliku Format daty i czasu Opcje sortowania: @@ -164,4 +165,12 @@ Wyświetl natywne menu kontekstowe (eksperymentalne) Poniżej możesz określić elementy, które chcesz uwzględnić w menu kontekstowym. Mogą być one częściowe (np. "otw w") lub pełne ("Otwórz za pomocą"). Poniżej możesz określić elementy, które chcesz wykluczyć z menu kontekstowego. Mogą być one częściowe (np. "otw w") lub pełne ("Otwórz za pomocą"). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml index 2754a5a99..50aba68b8 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml @@ -31,6 +31,7 @@ Tamanho Date Created Date Modified + File Age Display File Info Date and time format Sort Option: @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml index af7c58a95..7112f118d 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml @@ -31,6 +31,7 @@ Tamanho Data de criação Data de modificação + Antiguidade Mostrar informações do ficheiro Formato de data e de hora Ordenação: @@ -164,4 +165,12 @@ Mostrar menu de contexto nativo (experimental) Aqui pode especificar os itens a incluir no menu de contexto. Podem ser parciais (ex.: 'brir co') ou completos ('Abrir com'). Aqui pode especificar os itens a excluir do menu de contexto. Podem ser parciais (ex.: 'brir co') ou completos ('Abrir com'). + + + Hoje + Há {0} dias + Há 1 mês + Há {0} meses + Há 1 ano + Há {0} anos diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml index aa67373e2..ae5211b73 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml @@ -31,6 +31,7 @@ Размер Date Created Date Modified + File Age Display File Info Date and time format Sort Option: @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml index b538ea9e1..0bfb3d024 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml @@ -31,6 +31,7 @@ Veľkosť Dátum vytvorenia Dátum úpravy + Čas od vytvorenia Zobraziť informácie o súbore Formát dátumu a času Zoradenie: @@ -164,4 +165,12 @@ Zobraziť natívnu kontextovú ponuku (experimentálne) Nižšie môžete určiť položky, ktoré chcete zahrnúť do kontextovej ponuky, môžu byť čiastočné (napr. "tvoriť v program") alebo úplné ("Otvoriť v programe"). Nižšie môžete určiť položky, ktoré chcete vylúčiť z kontextovej ponuky, môžu byť čiastočné (napr. "tvoriť v program") alebo úplné ("Otvoriť v programe"). + + + Dnes + pred {0} dňami + pred mesiacom + pred {0} mesiacmi + pred rokom + pred {0} rokmi diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml index 54e419519..9e1a91d0c 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml @@ -31,6 +31,7 @@ Size Date Created Date Modified + File Age Display File Info Date and time format Sort Option: @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml index 465a4fdd7..a61ff488a 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml @@ -31,6 +31,7 @@ Boyut Oluşturma Tarihi Değiştirme Tarihi + File Age Dosya Özelliklerini Göster Tarih ve saat biçimi Sıralama Seçeneği: @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml index 4df9ddaa1..885d5dd9f 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml @@ -31,6 +31,7 @@ Розмір Дата створення Дата останньої зміни + File Age Показати інформацію про файл Формат дати й часу Варіант сортування: @@ -164,4 +165,12 @@ Відображати рідне контекстне меню (експериментально) Нижче ви можете вказати елементи, які хочете включити до контекстного меню, вони можуть бути частковими (наприклад, «шир пера») або повними («Відкрити за допомогою»). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml index 1fed3d067..bcc094007 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml @@ -31,6 +31,7 @@ Kích thước Date Created Date Modified + File Age Hiển thị thông tin tệp Định dạng ngày và giờ Tùy Chọn Sắp Xếp @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml index 67253d1e1..fc76857bd 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml @@ -31,6 +31,7 @@ 大小 创建日期 修改日期 + 文件时间 显示文件信息 日期和时间格式 排序选项 @@ -80,8 +81,8 @@ 复制路径 复制当前结果的路径到剪贴板 - Copy name - Copy name of current item to clipboard + 复制名称 + 复制当前文件的名称到剪贴板 复制 复制当前文件到剪贴板 复制当前文件夹到剪贴板 @@ -164,4 +165,12 @@ 显示本机上下文菜单(实验性) 您可以在下面指定想要包含在上下文菜单中的项目,它们可以是部分的(例如“pen wit”)或完整的(“打开方式”)。 您可以在下面指定要从上下文菜单中排除的项目,它们可以是部分的(例如“pen wit”)或完整的(“打开方式”)。 + + + 今天 + {0}天前 + 1个月前 + {0}个月前 + 1年前 + {0}年前 diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml index 873a3866d..dc75bc3bd 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml @@ -31,6 +31,7 @@ 大小 創建日期 修改日期 + File Age Display File Info Date and time format Sort Option: @@ -164,4 +165,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml index 9542bd474..1a4199965 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml @@ -13,8 +13,8 @@ 正在安装插件 下载与安装 {0} 插件卸载 - Keep plugin settings - Do you want to keep the settings of the plugin for the next usage? + 保留插件设置 + 你想要保留插件设置以便下一次的使用吗? 插件安装成功。正在重新启动 Flow Launcher,请稍候... 安装失败:无法从新插件中找到plugin.json元数据文件 错误:具有相同或更高版本的 {0} 的插件已经存在。 diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml index 7968ef2d8..d2492fab9 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml @@ -8,7 +8,7 @@ {0} Prozesse beenden Alle Instanzen beenden - Show title for processes with visible windows - Put processes with visible windows on the top + Titel für Prozesse mit sichtbaren Fenstern zeigen + Prozesse mit sichtbaren Fenstern ganz oben setzen diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml index ceb909db1..b99cbea28 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml @@ -8,7 +8,7 @@ 杀死 {0} 进程 杀死所有实例 - Show title for processes with visible windows - Put processes with visible windows on the top + 显示带有可见窗口的进程标题 + 在顶部放置带有可见窗口的进程 diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml index 2e1eadb2b..25b1a23bf 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml @@ -46,8 +46,8 @@ Por favor, seleccione la ruta del programa ¿Está seguro de que desea eliminar las fuentes del programa seleccionadas? - Please select program sources that are not added by you - Please select program sources that are added by you + Por favor, seleccione las fuentes del programa que no han sido añadidas por usted + Por favor, seleccione las fuentes del programa que han sido añadidas por usted Ya existe otra fuente de programa con la misma ubicación. Fuente de Programa diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml index 6bafe86e0..9e34b316b 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml @@ -34,8 +34,8 @@ 隐藏具有常见卸载程序名称的程序,例如 unins000.exe 启用程序描述 Flow 将搜索程序描述 - Hide duplicated apps - Hide duplicated Win32 programs that are already in the UWP list + 隐藏重复的应用 + 隐藏已经在UWP列表中重复的Win32程序 后缀 最大深度 @@ -46,8 +46,8 @@ 请先选择一项 您确定要删除选定的程序源吗? - Please select program sources that are not added by you - Please select program sources that are added by you + 请选择没有被您添加的程序源 + 请选择由您添加的程序源 相同位置存在另一个程序源。 程序源 @@ -76,7 +76,7 @@ 以其他用户身份运行 以管理员身份运行 打开文件所在文件夹 - Hide + 隐藏 打开目标文件夹 程序 diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml index 67594ae8d..b661e836b 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml @@ -9,7 +9,7 @@ Use Windows Terminal 다른 유저 권한으로 실행 - Allows to execute system commands from Flow Launcher + Flow Launcher를 통해 시스템 명령어를 실행할 수 있습니다 이 명령은 {0}회 실행되었습니다. 쉘을 통해 명령 실행 관리자 권한으로 실행 diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml index 7e7c2837f..0362bf6fc 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml @@ -6,7 +6,7 @@ 按下任意键以关闭此窗口... 执行后不关闭命令窗口 始终以管理员身份运行 - Use Windows Terminal + 使用 Windows 终端 以其他用户身份运行 命令行 允许从 Flow Launcher 中执行系统命令 diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml index e38e6e68b..873e71d44 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml @@ -6,21 +6,21 @@ 설명 명령어 - Shutdown - Restart + 시스템 종료 + 다시 시작 Restart With Advanced Boot Options - Log Off/Sign Out - Lock - Sleep + 로그아웃 + 컴퓨터 잠금 + 절전 Hibernate - Index Option - Empty Recycle Bin - Open Recycle Bin + 색인 옵션 + 휴지통 비우기 + 휴지통 열기 종료 - Save Settings + 설정 저장 Flow Launcher 재시작 설정 - 플러그인 데이터 새로고 + 플러그인 데이터 새로고침 Check For Update Open Log Location Flow Launcher Tips @@ -60,7 +60,7 @@ 시스템을 종료하시겠습니까? 시스템을 재시작 하시겠습니까? 고급 부팅 옵션으로 시스템을 다시 시작하시겠습니까? - Are you sure you want to log off? + 정말 로그아웃 하시겠습니까? Command Keyword Setting Custom Command Keyword diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml index 745129130..d59b77145 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml @@ -26,7 +26,7 @@ Flow Launcher 提示 Flow Launcher 用户数据文件夹 切换游戏模式 - Set the Flow Launcher Theme + 设置Flow Launcher的主题 编辑 @@ -51,7 +51,7 @@ 访问 Flow Launcher 的文档以获取更多帮助以及使用技巧 打开Flow Launcher 设置文件夹 切换游戏模式 - Quickly change the Flow Launcher theme + 快速更改Flow Launcher的主题 成功 @@ -62,14 +62,14 @@ 您确定要以高级启动选项重启吗? 您确定要注销吗? - Command Keyword Setting - Custom Command Keyword - Enter a keyword to search for command: {0}. This keyword is used to match your query. - Command Keyword + 命令关键词设置 + 自定义命令关键词 + 输入一个关键词来搜索命令:{0}。此关键词将被用于匹配您的查询输入。 + 命令关键词 重置 确认 取消 - Please enter a non-empty command keyword + 请输入一个非空的命令关键字 系统命令 提供操作系统相关的命令,如关机、锁定、设置等。 diff --git a/Plugins/Flow.Launcher.Plugin.Url/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Url/Languages/zh-cn.xaml index 7d548e51a..183d81bf1 100644 --- a/Plugins/Flow.Launcher.Plugin.Url/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.Url/Languages/zh-cn.xaml @@ -2,7 +2,7 @@ 在以下位置打开 - 新窗户 + 新窗口 新标签 打开链接:{0} diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml index 375a741d0..7b8a72d6b 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml @@ -17,7 +17,7 @@ 触发关键字 打开链接 搜索 - Use Search Query Autocomplete + 使用搜索查询自动补全 自动补全数据: 请选择一项 您确定要删除 {0} 吗? @@ -29,8 +29,8 @@ 那么 Netflix 搜索的表达式就是 https://www.netflix.com/search?q={q} - Copy URL - Copy search URL to clipboard + 复制链接 + 复制搜索网址到剪贴板 标题 diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.de-DE.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.de-DE.resx index 5f8d9a6df..d9de28e4b 100644 --- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.de-DE.resx +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.de-DE.resx @@ -1752,7 +1752,7 @@ Einen Dateityp immer in einem spezifischen Programm öffnen lassen - Change the Narrator’s voice + Stimme ändern Tastaturprobleme finden und beheben @@ -1761,7 +1761,7 @@ Screenreader verwenden - Show which workgroup this computer is on + Arbeitsgruppe auf diesem Computer Anzeigen Mausrad-Einstellungen ändern @@ -1773,7 +1773,7 @@ Probleme finden und beheben - Change settings for content received using Tap and send + Einstellung für empfangene Inhalte von Tippen und Senden Change default settings for media or devices @@ -2176,7 +2176,7 @@ Change advanced colour management settings for displays, scanners and printers - Let Windows suggest Ease of Access settings + Lasse Windows Vereinfachte Zugriffseinstellungen vorschlagen Clear disk space by deleting unnecessary files @@ -2191,16 +2191,16 @@ Record steps to reproduce a problem - Adjust the appearance and performance of Windows + Aussehen und Leistung von Windows anpassen - Settings for Microsoft IME (Japanese) + Einstellungen für Microsoft IME (Japanisch) - Invite someone to connect to your PC and help you, or offer to help someone else + Lade jemanden ein, sich mit deinem PC zu verbinden und dir zu helfen oder anderen zu helfen - Run programs made for previous versions of Windows + Programme für frühere Versionen von Windows ausführen Choose the order of how your screen rotates diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ko-KR.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ko-KR.resx index ab69a2a31..71f1a327a 100644 --- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ko-KR.resx +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ko-KR.resx @@ -468,7 +468,7 @@ Area Privacy - Control Panel + 제어판 Type of the setting is a "(legacy) Control Panel setting" @@ -1524,7 +1524,7 @@ File name, Should not translated - timedate.cpl + File name, Should not translated @@ -1740,34 +1740,34 @@ Change device installation settings - Turn off background images + 배경 이미지 제거 Navigation properties - Media streaming options + 미디어 스트리밍 옵션 - Make a file type always open in a specific program + 파일 형식을 항상 특정 프로그램에서 열도록 설정 - Change the Narrator’s voice + 내레이터 목소리 변경 Find and fix keyboard problems - Use screen reader + 내레이터 켜기 Show which workgroup this computer is on - Change mouse wheel settings + 마우스 휠 설정 변경 - Manage computer certificates + 컴퓨터 인증서 관리 Find and fix problems @@ -1776,94 +1776,94 @@ Change settings for content received using Tap and send - Change default settings for media or devices + 미디어 또는 장치에 대한 기본 설정 변경 Print the speech reference card - Calibrate display colour + 디스플레이 색 보정 - Manage file encryption certificates + 파일 암호화 인증서 관리 - View recent messages about your computer + 최근 메세지 검토 및 문제 해결 - Give other users access to this computer + 다른 사용자에게 컴퓨터 액세스 권한 부여 - Show hidden files and folders + 숨김 파일 및 폴더 표시 - Change Windows To Go start-up options + Windows To Go 시작 옵션 변경 - See which processes start up automatically when you start Windows + Windows 시작 시 자동으로 실행되는 프로세스 확인 Tell if an RSS feed is available on a website - Add clocks for different time zones + 다양한 시간대의 시계 추가 - Add a Bluetooth device + Bluetooth 장치 추가 - Customise the mouse buttons + 마우스 버튼 사용자 설정 - Set tablet buttons to perform certain tasks + 태블릿 버튼을 특정 작업에 맞게 설정 - View installed fonts + 설치된 글꼴 보기 - Change the way currency is displayed + 날짜 및 시간 표시 방식 변경 - Edit group policy + 로컬 그룹 정책 편집기 Manage browser add-ons - Check processor speed + 프로세서 속도 확인 - Check firewall status + 방화벽 상태 확인 Send or receive a file - Add or remove user accounts + 사용자 계정 추가 또는 삭제 - Edit the system environment variables + 시스템 환경 변수 편집 - Manage BitLocker + BitLocker 관리 - Auto-hide the taskbar + 작업 표시줄 자동 숨기기 - Change sound card settings + 사운드 카드 설정 변경 Make changes to accounts - Edit local users and groups + 로컬 사용자 및 그룹 편집 - View network computers and devices + 네트워크 컴퓨터 및 장치 보기 - Install a program from the network + 네트워크에서 프로그램 설치 View scanners and cameras @@ -1872,7 +1872,7 @@ Microsoft IME Register Word (Japanese) - Restore your files with File History + 파일 기록으로 파일 복원 Turn On-Screen keyboard on or off @@ -1884,22 +1884,22 @@ Find and fix audio recording problems - Create a recovery drive + 복구 드라이브 만들기 Microsoft New Phonetic Settings - Generate a system health report + 시스템 건강 보고서 생성 Fix problems with your computer - Back up and Restore (Windows 7) + 파일 백업 또는 복원 (Windows 7) - Preview, delete, show or hide fonts + 글꼴 미리 보기, 삭제, 표시 또는 숨기기 Microsoft Quick Settings @@ -1908,7 +1908,7 @@ View reliability history - Access RemoteApp and desktops + RemoteApp 및 데스크톱 액세스 Set up ODBC data sources @@ -1929,19 +1929,19 @@ Change what closing the lid does - Turn off unnecessary animations + 불필요한 애니메이션 끄기 - Create a restore point + 복원 지점 만들기 - Turn off automatic window arrangement + 자동 창 배열 끄기 - Troubleshooting History + 문제 해결 기록 - Diagnose your computer's memory problems + 컴퓨터의 메모리 문제 진단 View recommended actions to keep Windows running smoothly @@ -1992,13 +1992,13 @@ Change the order of Windows SideShow gadgets - Check keyboard status + 키보드 상태 확인 - Control the computer without the mouse or keyboard + 마우스 또는 키보드가 없는 컴퓨터 사용 - Change or remove a program + 프로그램 변경 또는 제거 Change multi-touch gesture settings @@ -2046,7 +2046,7 @@ How to change your Windows password - Make it easier to see the mouse pointer + 마우스 포인터를 더 쉽게 보이게 설정 Set up iSCSI initiator @@ -2076,7 +2076,7 @@ Find and fix audio playback problems - Change the mouse pointer display or speed + 마우스 포인터 표시 또는 속도 변경 Back up your recovery key @@ -2143,10 +2143,10 @@ Turn Windows features on or off - Show which operating system your computer is running + 내 컴퓨터가 실행 중인 운영 체제를 표시 - View local services + 로컬 서비스 보기 Manage Work Folders @@ -2164,28 +2164,28 @@ Change default printer - Edit environment variables for your account + 내 계정의 환경 변수 수정 Optimise visual display - Change mouse click settings + 마우스 클릭 설정 변경 - Change advanced colour management settings for displays, scanners and printers + 디스플레이, 스캐너 및 프린터의 고급 색 관리 설정 변경 Let Windows suggest Ease of Access settings - Clear disk space by deleting unnecessary files + 불필요한 파일을 삭제하여 디스크 공간 확보 - View devices and printers + 장치 및 프린터 보기 - Private Character Editor + 개인 문자 편집기 Record steps to reproduce a problem @@ -2248,7 +2248,7 @@ Turn flicks on or off - Add a language + 언어 추가 View network status and tasks From a3b0b2db12a26f6ec8a17605b31a23ac51e761ff Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 3 Jun 2025 13:57:52 +0800 Subject: [PATCH 101/101] Use dynamic resource instead of binding --- Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml index c0c5613de..7ca9941e6 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml @@ -154,7 +154,7 @@ Title="{DynamicResource AlwaysPreview}" Margin="0 14 0 0" Icon="" - Sub="{Binding AlwaysPreviewToolTip}"> + Sub="{DynamicResource AlwaysPreviewToolTip}">