+
From f8396892940ca99bb1e2c471408b1b4f18277969 Mon Sep 17 00:00:00 2001
From: DB p
Date: Tue, 15 Apr 2025 05:54:46 +0900
Subject: [PATCH 0894/1798] Add Content Dialog owner
---
Flow.Launcher/HotkeyControl.xaml.cs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Flow.Launcher/HotkeyControl.xaml.cs b/Flow.Launcher/HotkeyControl.xaml.cs
index 8762a934b..9af3b71aa 100644
--- a/Flow.Launcher/HotkeyControl.xaml.cs
+++ b/Flow.Launcher/HotkeyControl.xaml.cs
@@ -243,6 +243,9 @@ namespace Flow.Launcher
}
var dialog = new HotkeyControlDialog(Hotkey, DefaultHotkey, WindowTitle);
+
+ dialog.Owner = Window.GetWindow(this);
+
await dialog.ShowAsync();
switch (dialog.ResultType)
{
From 9035aa6fab026722ef5ca71ebc3d55b0cfcfea69 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 08:41:20 +0800
Subject: [PATCH 0895/1798] Fix dialog owner for all content dialog
---
Flow.Launcher/HotkeyControl.xaml.cs | 13 +++++++------
.../ViewModels/SettingsPanePluginsViewModel.cs | 3 +--
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/Flow.Launcher/HotkeyControl.xaml.cs b/Flow.Launcher/HotkeyControl.xaml.cs
index 9af3b71aa..262727127 100644
--- a/Flow.Launcher/HotkeyControl.xaml.cs
+++ b/Flow.Launcher/HotkeyControl.xaml.cs
@@ -1,6 +1,4 @@
-#nullable enable
-
-using System.Collections.ObjectModel;
+using System.Collections.ObjectModel;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
@@ -9,6 +7,8 @@ using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Infrastructure.UserSettings;
+#nullable enable
+
namespace Flow.Launcher
{
public partial class HotkeyControl
@@ -242,9 +242,10 @@ namespace Flow.Launcher
HotKeyMapper.RemoveHotkey(Hotkey);
}
- var dialog = new HotkeyControlDialog(Hotkey, DefaultHotkey, WindowTitle);
-
- dialog.Owner = Window.GetWindow(this);
+ var dialog = new HotkeyControlDialog(Hotkey, DefaultHotkey, WindowTitle)
+ {
+ Owner = Window.GetWindow(this)
+ };
await dialog.ShowAsync();
switch (dialog.ResultType)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs
index b89e970e9..916fd1ece 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs
@@ -5,7 +5,6 @@ using System.Windows.Controls;
using System.Windows;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core.Plugin;
-using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.ViewModel;
@@ -116,6 +115,7 @@ public partial class SettingsPanePluginsViewModel : BaseModel
{
var helpDialog = new ContentDialog()
{
+ Owner = Application.Current.MainWindow,
Content = new StackPanel
{
Children =
@@ -146,7 +146,6 @@ public partial class SettingsPanePluginsViewModel : BaseModel
}
}
},
-
PrimaryButtonText = (string)Application.Current.Resources["commonOK"],
CornerRadius = new CornerRadius(8),
Style = (Style)Application.Current.Resources["ContentDialog"]
From 28c7538fc3b00bc88a62336bba79d04a0b841fc3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 09:06:31 +0800
Subject: [PATCH 0896/1798] Fix possible Win32Exception
---
Flow.Launcher.Infrastructure/Win32Helper.cs | 15 ++-------------
1 file changed, 2 insertions(+), 13 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 6be024389..798501ae3 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -365,21 +365,10 @@ namespace Flow.Launcher.Infrastructure
// No installed English layout found
if (enHKL == HKL.Null) return;
- // When application is exiting, the Application.Current will be null
- if (Application.Current == null) return;
-
- // Get the FL main window
- var hwnd = GetWindowHandle(Application.Current.MainWindow, true);
+ // Get the foreground window
+ var hwnd = PInvoke.GetForegroundWindow();
if (hwnd == HWND.Null) return;
- // Check if the FL main window is the current foreground window
- if (!IsForegroundWindow(hwnd))
- {
- var result = PInvoke.SetForegroundWindow(hwnd);
- // If we cannot set the foreground window, we can use the foreground window and switch the layout
- if (!result) hwnd = PInvoke.GetForegroundWindow();
- }
-
// Get the current foreground window thread ID
var threadId = PInvoke.GetWindowThreadProcessId(hwnd);
if (threadId == 0) throw new Win32Exception(Marshal.GetLastWin32Error());
From d21ffce47af56b25bbf14e36d7b475ce3e7f4689 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 12:21:56 +0800
Subject: [PATCH 0897/1798] Use get window to get owner
---
.../SettingPages/ViewModels/SettingsPanePluginsViewModel.cs | 4 ++--
Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml | 1 +
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs
index 916fd1ece..de7cf15c3 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs
@@ -111,11 +111,11 @@ public partial class SettingsPanePluginsViewModel : BaseModel
.ToList();
[RelayCommand]
- private async Task OpenHelperAsync()
+ private async Task OpenHelperAsync(Button button)
{
var helpDialog = new ContentDialog()
{
- Owner = Application.Current.MainWindow,
+ Owner = Window.GetWindow(button),
Content = new StackPanel
{
Children =
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml
index f9f708314..f3d630306 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml
@@ -57,6 +57,7 @@
Height="34"
Margin="0 0 20 0"
Command="{Binding OpenHelperCommand}"
+ CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
Content=""
FontFamily="{DynamicResource SymbolThemeFontFamily}"
FontSize="14" />
From c382732f974d99211b4d739340f6fcd7fa3cedc9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 12:49:09 +0800
Subject: [PATCH 0898/1798] Improve windows exiting
---
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 043eb7a19..39bf49654 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -362,6 +362,7 @@ namespace Flow.Launcher.Plugin.Sys
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe89f"),
Action = c =>
{
+ _context.API.HideMainWindow();
Application.Current.MainWindow.Close();
return true;
}
From 8e51096ba9ded910e3c2c2906404e5bc5f247701 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 12:51:38 +0800
Subject: [PATCH 0899/1798] Improve log messages
---
Flow.Launcher.Infrastructure/Image/ImageLoader.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
index a49385a02..86df01a30 100644
--- a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
+++ b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
@@ -171,8 +171,8 @@ namespace Flow.Launcher.Infrastructure.Image
}
catch (System.Exception e2)
{
- Log.Exception(ClassName, $"|ImageLoader.Load|Failed to get thumbnail for {path} on first try", e);
- Log.Exception(ClassName, $"|ImageLoader.Load|Failed to get thumbnail for {path} on second try", e2);
+ Log.Exception(ClassName, $"Failed to get thumbnail for {path} on first try", e);
+ Log.Exception(ClassName, $"Failed to get thumbnail for {path} on second try", e2);
ImageSource image = ImageCache[Constant.MissingImgIcon, false];
ImageCache[path, false] = image;
From a1b5941039da7370ee3c69d2c90ec61d7859ce35 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 12:52:09 +0800
Subject: [PATCH 0900/1798] Improve WindowsThumbnailProvider
---
.../Image/ThumbnailReader.cs | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Image/ThumbnailReader.cs b/Flow.Launcher.Infrastructure/Image/ThumbnailReader.cs
index b98ea50fe..fe389a331 100644
--- a/Flow.Launcher.Infrastructure/Image/ThumbnailReader.cs
+++ b/Flow.Launcher.Infrastructure/Image/ThumbnailReader.cs
@@ -12,7 +12,7 @@ using Windows.Win32.Graphics.Gdi;
namespace Flow.Launcher.Infrastructure.Image
{
///
- /// Subclass of
+ /// Subclass of
///
[Flags]
public enum ThumbnailOptions
@@ -33,6 +33,8 @@ namespace Flow.Launcher.Infrastructure.Image
private static readonly HRESULT S_ExtractionFailed = (HRESULT)0x8004B200;
+ private static readonly HRESULT S_PATHNOTFOUND = (HRESULT)0x8004B205;
+
public static BitmapSource GetThumbnail(string fileName, int width, int height, ThumbnailOptions options)
{
HBITMAP hBitmap = GetHBitmap(Path.GetFullPath(fileName), width, height, options);
@@ -79,9 +81,10 @@ namespace Flow.Launcher.Infrastructure.Image
{
imageFactory.GetImage(size, (SIIGBF)options, &hBitmap);
}
- catch (COMException ex) when (ex.HResult == S_ExtractionFailed && options == ThumbnailOptions.ThumbnailOnly)
+ catch (COMException ex) when (options == ThumbnailOptions.ThumbnailOnly &&
+ (ex.HResult == S_PATHNOTFOUND || ex.HResult == S_ExtractionFailed))
{
- // Fallback to IconOnly if ThumbnailOnly fails
+ // Fallback to IconOnly if extraction fails or files cannot be found
imageFactory.GetImage(size, (SIIGBF)ThumbnailOptions.IconOnly, &hBitmap);
}
catch (FileNotFoundException) when (options == ThumbnailOptions.ThumbnailOnly)
@@ -89,6 +92,11 @@ namespace Flow.Launcher.Infrastructure.Image
// Fallback to IconOnly if files cannot be found
imageFactory.GetImage(size, (SIIGBF)ThumbnailOptions.IconOnly, &hBitmap);
}
+ catch (System.Exception ex)
+ {
+ // Handle other exceptions
+ throw new InvalidOperationException("Failed to get thumbnail", ex);
+ }
}
finally
{
From 83fa654e2733ef28af1bef3d4f85ac607b1000b9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 12:59:58 +0800
Subject: [PATCH 0901/1798] Improve constant name
---
Flow.Launcher.Infrastructure/Image/ThumbnailReader.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Image/ThumbnailReader.cs b/Flow.Launcher.Infrastructure/Image/ThumbnailReader.cs
index fe389a331..4ce0df026 100644
--- a/Flow.Launcher.Infrastructure/Image/ThumbnailReader.cs
+++ b/Flow.Launcher.Infrastructure/Image/ThumbnailReader.cs
@@ -31,7 +31,7 @@ namespace Flow.Launcher.Infrastructure.Image
private static readonly Guid GUID_IShellItem = typeof(IShellItem).GUID;
- private static readonly HRESULT S_ExtractionFailed = (HRESULT)0x8004B200;
+ private static readonly HRESULT S_EXTRACTIONFAILED = (HRESULT)0x8004B200;
private static readonly HRESULT S_PATHNOTFOUND = (HRESULT)0x8004B205;
@@ -82,7 +82,7 @@ namespace Flow.Launcher.Infrastructure.Image
imageFactory.GetImage(size, (SIIGBF)options, &hBitmap);
}
catch (COMException ex) when (options == ThumbnailOptions.ThumbnailOnly &&
- (ex.HResult == S_PATHNOTFOUND || ex.HResult == S_ExtractionFailed))
+ (ex.HResult == S_PATHNOTFOUND || ex.HResult == S_EXTRACTIONFAILED))
{
// Fallback to IconOnly if extraction fails or files cannot be found
imageFactory.GetImage(size, (SIIGBF)ThumbnailOptions.IconOnly, &hBitmap);
From 81007f79aee6ca7671880afaa8e329e99bacb9f4 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 13:18:06 +0800
Subject: [PATCH 0902/1798] Remove mvvm command for code quality
---
Flow.Launcher/ViewModel/RelayCommand.cs | 29 ----------
.../Flow.Launcher.Plugin.Explorer.csproj | 1 +
.../ViewModels/RelayCommand.cs | 27 ---------
.../ViewModels/SettingsViewModel.cs | 55 +++++++------------
.../Views/ExplorerSettings.xaml | 6 +-
5 files changed, 24 insertions(+), 94 deletions(-)
delete mode 100644 Flow.Launcher/ViewModel/RelayCommand.cs
delete mode 100644 Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/RelayCommand.cs
diff --git a/Flow.Launcher/ViewModel/RelayCommand.cs b/Flow.Launcher/ViewModel/RelayCommand.cs
deleted file mode 100644
index e8d4af8b5..000000000
--- a/Flow.Launcher/ViewModel/RelayCommand.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-using System.Windows.Input;
-
-namespace Flow.Launcher.ViewModel
-{
- public class RelayCommand : ICommand
- {
- private readonly Action _action;
-
- public RelayCommand(Action action)
- {
- _action = action;
- }
-
- public virtual bool CanExecute(object parameter)
- {
- return true;
- }
-
-#pragma warning disable CS0067 // the event is never used
- public event EventHandler CanExecuteChanged;
-#pragma warning restore CS0067
-
- public virtual void Execute(object parameter)
- {
- _action?.Invoke(parameter);
- }
- }
-}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index 549217027..f13460d3f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -46,6 +46,7 @@
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/RelayCommand.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/RelayCommand.cs
deleted file mode 100644
index ff704b679..000000000
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/RelayCommand.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-using System.Windows.Input;
-
-namespace Flow.Launcher.Plugin.Explorer.ViewModels
-{
- internal class RelayCommand : ICommand
- {
- private Action _action;
-
- public RelayCommand(Action action)
- {
- _action = action;
- }
-
- public virtual bool CanExecute(object parameter)
- {
- return true;
- }
-
- public event EventHandler CanExecuteChanged;
-
- public virtual void Execute(object parameter)
- {
- _action?.Invoke(parameter);
- }
- }
-}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index 407300924..cf9ebd33f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -1,9 +1,4 @@
#nullable enable
-using Flow.Launcher.Plugin.Explorer.Search;
-using Flow.Launcher.Plugin.Explorer.Search.Everything;
-using Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions;
-using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
-using Flow.Launcher.Plugin.Explorer.Views;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -13,11 +8,16 @@ using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Forms;
-using System.Windows.Input;
+using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Plugin.Explorer.Search;
+using Flow.Launcher.Plugin.Explorer.Search.Everything;
+using Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions;
+using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
+using Flow.Launcher.Plugin.Explorer.Views;
namespace Flow.Launcher.Plugin.Explorer.ViewModels
{
- public class SettingsViewModel : BaseModel
+ public partial class SettingsViewModel : BaseModel
{
public Settings Settings { get; set; }
@@ -36,7 +36,6 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
InitializeActionKeywordModels();
}
-
public void Save()
{
Context.API.SaveSettingJsonStorage();
@@ -48,7 +47,6 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
private EnumBindingModel _selectedContentSearchEngine;
private EnumBindingModel _selectedPathEnumerationEngine;
-
public EnumBindingModel SelectedIndexSearchEngine
{
get => _selectedIndexSearchEngine;
@@ -261,8 +259,7 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
public ActionKeywordModel? SelectedActionKeyword { get; set; }
- public ICommand EditActionKeywordCommand => new RelayCommand(EditActionKeyword);
-
+ [RelayCommand]
private void EditActionKeyword(object obj)
{
if (SelectedActionKeyword is not { } actionKeyword)
@@ -307,12 +304,6 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
public AccessLink? SelectedQuickAccessLink { get; set; }
public AccessLink? SelectedIndexSearchExcludedPath { get; set; }
-
-
- public ICommand RemoveLinkCommand => new RelayCommand(RemoveLink);
- public ICommand EditLinkCommand => new RelayCommand(EditLink);
- public ICommand AddLinkCommand => new RelayCommand(AddLink);
-
public void AppendLink(string containerName, AccessLink link)
{
var container = containerName switch
@@ -324,6 +315,7 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
container.Add(link);
}
+ [RelayCommand]
private void EditLink(object commandParameter)
{
var (selectedLink, collection) = commandParameter switch
@@ -360,7 +352,7 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
Context.API.ShowMsgBox(warning);
}
-
+ [RelayCommand]
private void AddLink(object commandParameter)
{
var container = commandParameter switch
@@ -385,6 +377,7 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
container.Add(newAccessLink);
}
+ [RelayCommand]
private void RemoveLink(object obj)
{
if (obj is not string container) return;
@@ -435,7 +428,6 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
return path;
}
-
internal static void OpenWindowsIndexingOptions()
{
var psi = new ProcessStartInfo
@@ -448,39 +440,35 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
Process.Start(psi);
}
- private ICommand? _openFileEditorPathCommand;
-
- public ICommand OpenFileEditorPath => _openFileEditorPathCommand ??= new RelayCommand(_ =>
+ [RelayCommand]
+ private void OpenFileEditorPath()
{
var path = PromptUserSelectPath(ResultType.File, Settings.EditorPath != null ? Path.GetDirectoryName(Settings.EditorPath) : null);
if (path is null)
return;
FileEditorPath = path;
- });
+ }
- private ICommand? _openFolderEditorPathCommand;
-
- public ICommand OpenFolderEditorPath => _openFolderEditorPathCommand ??= new RelayCommand(_ =>
+ [RelayCommand]
+ private void OpenFolderEditorPath()
{
var path = PromptUserSelectPath(ResultType.File, Settings.FolderEditorPath != null ? Path.GetDirectoryName(Settings.FolderEditorPath) : null);
if (path is null)
return;
FolderEditorPath = path;
- });
+ }
- private ICommand? _openShellPathCommand;
-
- public ICommand OpenShellPath => _openShellPathCommand ??= new RelayCommand(_ =>
+ [RelayCommand]
+ private void OpenShellPath()
{
var path = PromptUserSelectPath(ResultType.File, Settings.EditorPath != null ? Path.GetDirectoryName(Settings.EditorPath) : null);
if (path is null)
return;
ShellPath = path;
- });
-
+ }
public string FileEditorPath
{
@@ -537,7 +525,6 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
}
}
-
#region Everything FastSortWarning
public Visibility FastSortWarningVisibility
@@ -593,7 +580,5 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
}
#endregion
-
-
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 6ca7be84d..e5999da41 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -245,7 +245,7 @@
Margin="{StaticResource SettingPanelItemLeftMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
- Command="{Binding OpenFileEditorPath}"
+ Command="{Binding OpenFileEditorPathCommand}"
Content="{DynamicResource select}" />
@@ -272,7 +272,7 @@
Margin="{StaticResource SettingPanelItemLeftMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
- Command="{Binding OpenFolderEditorPath}"
+ Command="{Binding OpenFolderEditorPathCommand}"
Content="{DynamicResource select}" />
@@ -299,7 +299,7 @@
Margin="{StaticResource SettingPanelItemLeftMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
- Command="{Binding OpenShellPath}"
+ Command="{Binding OpenShellPathCommand}"
Content="{DynamicResource select}" />
From 1e603ea20f800704b939ccf1941a8d14d8274f73 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 13:21:00 +0800
Subject: [PATCH 0903/1798] Code quality
---
.../Helper/SortOptionTranslationHelper.cs | 2 +-
.../Views/ActionKeywordSetting.xaml.cs | 3 +++
.../Views/ExplorerSettings.xaml.cs | 12 +++---------
3 files changed, 7 insertions(+), 10 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/SortOptionTranslationHelper.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/SortOptionTranslationHelper.cs
index 0a3a2ae43..72f58f5b6 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/SortOptionTranslationHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/SortOptionTranslationHelper.cs
@@ -16,7 +16,7 @@ public static class SortOptionTranslationHelper
ArgumentNullException.ThrowIfNull(API);
var enumName = Enum.GetName(sortOption);
- var splited = enumName.Split('_');
+ var splited = enumName!.Split('_');
var name = string.Join('_', splited[..^1]);
var direction = splited[^1];
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs
index 73c35b1c8..000b2558d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs
@@ -85,6 +85,7 @@ namespace Flow.Launcher.Plugin.Explorer.Views
DialogResult = false;
Close();
}
+
private void TxtCurrentActionKeyword_OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
@@ -94,11 +95,13 @@ namespace Flow.Launcher.Plugin.Explorer.Views
e.Handled = true;
}
}
+
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
+
private bool SetField(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (EqualityComparer.Default.Equals(field, value))
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
index b7f5efc3c..9203ece9a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
@@ -1,11 +1,10 @@
-using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
-using Flow.Launcher.Plugin.Explorer.ViewModels;
-using System.Collections.Generic;
-using System.ComponentModel;
+using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
+using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
+using Flow.Launcher.Plugin.Explorer.ViewModels;
using DataFormats = System.Windows.DataFormats;
using DragDropEffects = System.Windows.DragDropEffects;
using DragEventArgs = System.Windows.DragEventArgs;
@@ -19,9 +18,6 @@ namespace Flow.Launcher.Plugin.Explorer.Views
{
private readonly SettingsViewModel viewModel;
- private List actionKeywordsListView;
-
-
public ExplorerSettings(SettingsViewModel viewModel)
{
DataContext = viewModel;
@@ -39,8 +35,6 @@ namespace Flow.Launcher.Plugin.Explorer.Views
lbxExcludedPaths.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
}
-
-
private void AccessLinkDragDrop(string containerName, DragEventArgs e)
{
var files = (string[])e.Data.GetData(DataFormats.FileDrop);
From 1d16b30b64924af0b51dedf4d6f7f9186e9d1984 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 13:22:22 +0800
Subject: [PATCH 0904/1798] Suppress async void
---
Flow.Launcher/Msg.xaml.cs | 1 +
.../Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs | 4 ++++
.../SearchSourceSetting.xaml.cs | 2 ++
3 files changed, 7 insertions(+)
diff --git a/Flow.Launcher/Msg.xaml.cs b/Flow.Launcher/Msg.xaml.cs
index 110235cb5..923c3692f 100644
--- a/Flow.Launcher/Msg.xaml.cs
+++ b/Flow.Launcher/Msg.xaml.cs
@@ -59,6 +59,7 @@ namespace Flow.Launcher
Close();
}
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
public async void Show(string title, string subTitle, string iconPath)
{
tbTitle.Text = title;
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
index c42bd4f30..deb110698 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
@@ -146,6 +146,7 @@ namespace Flow.Launcher.Plugin.Program.Views
programSourceView.Items.Refresh();
}
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
private async void ReIndexing()
{
ViewRefresh();
@@ -183,6 +184,7 @@ namespace Flow.Launcher.Plugin.Program.Views
EditProgramSource(selectedProgramSource);
}
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
private async void EditProgramSource(ProgramSource selectedProgramSource)
{
if (selectedProgramSource == null)
@@ -277,6 +279,7 @@ namespace Flow.Launcher.Plugin.Program.Views
}
}
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
private async void btnLoadAllProgramSource_OnClick(object sender, RoutedEventArgs e)
{
await ProgramSettingDisplay.DisplayAllProgramsAsync();
@@ -284,6 +287,7 @@ namespace Flow.Launcher.Plugin.Program.Views
ViewRefresh();
}
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
private async void btnProgramSourceStatus_OnClick(object sender, RoutedEventArgs e)
{
var selectedItems = programSourceView
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSourceSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSourceSetting.xaml.cs
index 58577dbc1..b44f130e4 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSourceSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSourceSetting.xaml.cs
@@ -28,6 +28,7 @@ namespace Flow.Launcher.Plugin.WebSearch
Initialize(sources, context, Action.Add);
}
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
private async void Initialize(IList sources, PluginInitContext context, Action action)
{
InitializeComponent();
@@ -124,6 +125,7 @@ namespace Flow.Launcher.Plugin.WebSearch
}
}
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
private async void OnSelectIconClick(object sender, RoutedEventArgs e)
{
const string filter = "Image files (*.jpg, *.jpeg, *.gif, *.png, *.bmp) |*.jpg; *.jpeg; *.gif; *.png; *.bmp";
From abee9ba01550f3371c2018b5d50e97a9d8f5f3a7 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 13:24:25 +0800
Subject: [PATCH 0905/1798] Fix nullable warning
---
.../ViewModels/ActionKeywordModel.cs | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
index 2f614ead8..d4cd1348e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
@@ -1,13 +1,15 @@
using System.ComponentModel;
using System.Runtime.CompilerServices;
+#nullable enable
+
namespace Flow.Launcher.Plugin.Explorer.Views
{
public class ActionKeywordModel : INotifyPropertyChanged
{
- private static Settings _settings;
+ private static Settings _settings = null!;
- public event PropertyChangedEventHandler PropertyChanged;
+ public event PropertyChangedEventHandler? PropertyChanged;
public static void Init(Settings settings)
{
@@ -54,4 +56,4 @@ namespace Flow.Launcher.Plugin.Explorer.Views
}
}
}
-}
\ No newline at end of file
+}
From 113bc589bda874eeba207d867032d0465cd12e43 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 13:24:41 +0800
Subject: [PATCH 0906/1798] Remove unused variable
---
Flow.Launcher/ReportWindow.xaml.cs | 2 --
1 file changed, 2 deletions(-)
diff --git a/Flow.Launcher/ReportWindow.xaml.cs b/Flow.Launcher/ReportWindow.xaml.cs
index 0ab785a17..24801cf52 100644
--- a/Flow.Launcher/ReportWindow.xaml.cs
+++ b/Flow.Launcher/ReportWindow.xaml.cs
@@ -15,8 +15,6 @@ namespace Flow.Launcher
{
internal partial class ReportWindow
{
- private static readonly string ClassName = nameof(ReportWindow);
-
public ReportWindow(Exception exception)
{
InitializeComponent();
From 5df56334eee4b0647803755d5713042a1e1c1ba7 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 13:28:47 +0800
Subject: [PATCH 0907/1798] Code quality
---
.../Helper/ShellContextMenu.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/ShellContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/ShellContextMenu.cs
index abb76580d..58b4e86f9 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/ShellContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/ShellContextMenu.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
@@ -341,7 +341,7 @@ namespace Peter
return null;
}
- IShellFolder oParentFolder = GetParentFolder(arrFI[0].Parent.FullName);
+ IShellFolder oParentFolder = GetParentFolder(arrFI[0].Parent!.FullName);
if (null == oParentFolder)
{
return null;
@@ -1535,7 +1535,7 @@ namespace Peter
m_hookType,
m_filterFunc,
IntPtr.Zero,
- (int)AppDomain.GetCurrentThreadId());
+ Environment.CurrentManagedThreadId);
}
// ************************************************************************
From 222ef41c8f755fc76109f9c9f040863f583ec1ca Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 13:29:26 +0800
Subject: [PATCH 0908/1798] Fix nullabl warnings
---
.../Search/EnvironmentVariables.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/EnvironmentVariables.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/EnvironmentVariables.cs
index e526fb85a..6c4e6a3ed 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/EnvironmentVariables.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/EnvironmentVariables.cs
@@ -47,7 +47,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search
foreach (DictionaryEntry special in Environment.GetEnvironmentVariables())
{
- var path = special.Value.ToString();
+ var path = special.Value!.ToString();
// we add a trailing slash to the path to make sure drive paths become valid absolute paths.
// for example, if %systemdrive% is C: we turn it to C:\
path = path.EnsureTrailingSlash();
@@ -61,7 +61,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search
{
// Variables are returned with a mixture of all upper/lower case.
// Call ToUpper() to make the results look consistent
- _envStringPaths.Add(special.Key.ToString().ToUpper(), path);
+ _envStringPaths.Add(special.Key.ToString()!.ToUpper(), path);
}
}
}
From a3daac66ecc997020e13e4924c2a9318acdd080e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 13:30:46 +0800
Subject: [PATCH 0909/1798] Code quality
---
Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs
index 22de4fcc0..f4c103ade 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs
@@ -1,8 +1,8 @@
-using System.Windows.Navigation;
+using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.SettingPages.ViewModels;
-using Page = ModernWpf.Controls.Page;
using Flow.Launcher.Infrastructure.UserSettings;
+using Page = ModernWpf.Controls.Page;
namespace Flow.Launcher.SettingPages.Views;
From 476829045d8eb9cbec9faae7fa4f298f65c3cfa8 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 13:36:32 +0800
Subject: [PATCH 0910/1798] Adjust code comments
---
.../Flow.Launcher.Plugin.Explorer.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index f13460d3f..98164f489 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -45,8 +45,8 @@
-
+
From f5830412c4acd994b875c4ed3b6c185bc41621db Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 20:45:00 +0800
Subject: [PATCH 0911/1798] Revert delegate to fields
---
Flow.Launcher.Plugin/Result.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs
index f561fcb1d..f0fcd48ff 100644
--- a/Flow.Launcher.Plugin/Result.cs
+++ b/Flow.Launcher.Plugin/Result.cs
@@ -128,12 +128,12 @@ namespace Flow.Launcher.Plugin
///
/// Delegate to load an icon for this result.
///
- public IconDelegate Icon { get; set; }
+ public IconDelegate Icon = null;
///
/// Delegate to load an icon for the badge of this result.
///
- public IconDelegate BadgeIcon { get; set; }
+ public IconDelegate BadgeIcon = null;
///
/// Information for Glyph Icon (Prioritized than IcoPath/Icon if user enable Glyph Icons)
From 652e3bde86f67ad5cdd58a7000d1e77a5526f8c9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 21:21:27 +0800
Subject: [PATCH 0912/1798] Improve process killer performance
---
.../ProcessHelper.cs | 43 ++++++++++++++-----
1 file changed, 32 insertions(+), 11 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/ProcessHelper.cs b/Plugins/Flow.Launcher.Plugin.ProcessKiller/ProcessHelper.cs
index d7f44ccce..386782905 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/ProcessHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/ProcessHelper.cs
@@ -1,9 +1,11 @@
-using Microsoft.Win32.SafeHandles;
-using System;
+using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Win32.SafeHandles;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.System.Threading;
@@ -72,8 +74,21 @@ namespace Flow.Launcher.Plugin.ProcessKiller
///
public static unsafe Dictionary GetProcessesWithNonEmptyWindowTitle()
{
- var processDict = new Dictionary();
+ // Collect all window handles
+ var windowHandles = new List();
PInvoke.EnumWindows((hWnd, _) =>
+ {
+ if (PInvoke.IsWindowVisible(hWnd))
+ {
+ windowHandles.Add(hWnd);
+ }
+ return true;
+ }, IntPtr.Zero);
+
+ // Concurrently process each window handle
+ var processDict = new ConcurrentDictionary();
+ var processedProcessIds = new ConcurrentDictionary();
+ Parallel.ForEach(windowHandles, hWnd =>
{
var windowTitle = GetWindowTitle(hWnd);
if (!string.IsNullOrWhiteSpace(windowTitle) && PInvoke.IsWindowVisible(hWnd))
@@ -82,20 +97,26 @@ namespace Flow.Launcher.Plugin.ProcessKiller
var result = PInvoke.GetWindowThreadProcessId(hWnd, &processId);
if (result == 0u || processId == 0u)
{
- return false;
+ return;
}
- var process = Process.GetProcessById((int)processId);
- if (!processDict.ContainsKey((int)processId))
+ // Ensure each process ID is processed only once
+ if (processedProcessIds.TryAdd((int)processId, 0))
{
- processDict.Add((int)processId, windowTitle);
+ try
+ {
+ var process = Process.GetProcessById((int)processId);
+ processDict.TryAdd((int)processId, windowTitle);
+ }
+ catch
+ {
+ // Handle exceptions (e.g., process exited)
+ }
}
}
+ });
- return true;
- }, IntPtr.Zero);
-
- return processDict;
+ return new Dictionary(processDict);
}
private static unsafe string GetWindowTitle(HWND hwnd)
From 814afc75dd7ba9254c8cdfeaa6c567204223229e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 21:21:47 +0800
Subject: [PATCH 0913/1798] Add option to let process killer show window title
---
.../Flow.Launcher.Plugin.ProcessKiller/Languages/en.xaml | 1 +
Plugins/Flow.Launcher.Plugin.ProcessKiller/Main.cs | 4 +++-
Plugins/Flow.Launcher.Plugin.ProcessKiller/Settings.cs | 2 ++
.../ViewModels/SettingsViewModel.cs | 6 ++++++
.../Views/SettingsControl.xaml | 6 ++++++
5 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/en.xaml
index ea6e54fef..ddabd31f8 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/en.xaml
@@ -10,6 +10,7 @@
kill {0} processeskill all instances
+ Show title for processes with visible windowsPut processes with visible windows on the top
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Main.cs b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Main.cs
index 4f5d1becd..3f505139a 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Main.cs
@@ -81,7 +81,9 @@ namespace Flow.Launcher.Plugin.ProcessKiller
// Filter processes based on search term
var searchTerm = query.Search;
var processlist = new List();
- var processWindowTitle = ProcessHelper.GetProcessesWithNonEmptyWindowTitle();
+ var processWindowTitle = Settings.ShowWindowTitle ?
+ ProcessHelper.GetProcessesWithNonEmptyWindowTitle() :
+ new Dictionary();
if (string.IsNullOrWhiteSpace(searchTerm))
{
foreach (var p in allPocessList)
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Settings.cs b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Settings.cs
index 916bc6a39..57cd2ab86 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Settings.cs
@@ -2,6 +2,8 @@
{
public class Settings
{
+ public bool ShowWindowTitle { get; set; } = true;
+
public bool PutVisibleWindowProcessesTop { get; set; } = false;
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.ProcessKiller/ViewModels/SettingsViewModel.cs
index bacf1ba08..0728d9c0f 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/ViewModels/SettingsViewModel.cs
@@ -9,6 +9,12 @@
Settings = settings;
}
+ public bool ShowWindowTitle
+ {
+ get => Settings.ShowWindowTitle;
+ set => Settings.ShowWindowTitle = value;
+ }
+
public bool PutVisibleWindowProcessesTop
{
get => Settings.PutVisibleWindowProcessesTop;
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Views/SettingsControl.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Views/SettingsControl.xaml
index d15d6c3e0..b969be4e8 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Views/SettingsControl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Views/SettingsControl.xaml
@@ -12,10 +12,16 @@
+
+
From 0cbd7ba1e2f422ee98960ea4bf2e0ff35633bde0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Apr 2025 23:42:08 +0800
Subject: [PATCH 0914/1798] Improve option logic
---
.../Main.cs | 36 ++++++++++++++-----
1 file changed, 28 insertions(+), 8 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Main.cs b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Main.cs
index 3f505139a..8f5ba4bd2 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Main.cs
@@ -81,7 +81,8 @@ namespace Flow.Launcher.Plugin.ProcessKiller
// Filter processes based on search term
var searchTerm = query.Search;
var processlist = new List();
- var processWindowTitle = Settings.ShowWindowTitle ?
+ var processWindowTitle =
+ Settings.ShowWindowTitle || Settings.PutVisibleWindowProcessesTop ?
ProcessHelper.GetProcessesWithNonEmptyWindowTitle() :
new Dictionary();
if (string.IsNullOrWhiteSpace(searchTerm))
@@ -93,12 +94,22 @@ namespace Flow.Launcher.Plugin.ProcessKiller
if (processWindowTitle.TryGetValue(p.Id, out var windowTitle))
{
// Add score to prioritize processes with visible windows
- // And use window title for those processes
- processlist.Add(new ProcessResult(p, Settings.PutVisibleWindowProcessesTop ? 200 : 0, windowTitle, null, progressNameIdTitle));
+ // Use window title for those processes if enabled
+ processlist.Add(new ProcessResult(
+ p,
+ Settings.PutVisibleWindowProcessesTop ? 200 : 0,
+ Settings.ShowWindowTitle ? windowTitle : progressNameIdTitle,
+ null,
+ progressNameIdTitle));
}
else
{
- processlist.Add(new ProcessResult(p, 0, progressNameIdTitle, null, progressNameIdTitle));
+ processlist.Add(new ProcessResult(
+ p,
+ 0,
+ progressNameIdTitle,
+ null,
+ progressNameIdTitle));
}
}
}
@@ -117,13 +128,17 @@ namespace Flow.Launcher.Plugin.ProcessKiller
if (score > 0)
{
// Add score to prioritize processes with visible windows
- // And use window title for those processes
+ // Use window title for those processes
if (Settings.PutVisibleWindowProcessesTop)
{
score += 200;
}
- processlist.Add(new ProcessResult(p, score, windowTitle,
- score == windowTitleMatch.Score ? windowTitleMatch : null, progressNameIdTitle));
+ processlist.Add(new ProcessResult(
+ p,
+ score,
+ Settings.ShowWindowTitle ? windowTitle : progressNameIdTitle,
+ score == windowTitleMatch.Score ? windowTitleMatch : null,
+ progressNameIdTitle));
}
}
else
@@ -132,7 +147,12 @@ namespace Flow.Launcher.Plugin.ProcessKiller
var score = processNameIdMatch.Score;
if (score > 0)
{
- processlist.Add(new ProcessResult(p, score, progressNameIdTitle, processNameIdMatch, progressNameIdTitle));
+ processlist.Add(new ProcessResult(
+ p,
+ score,
+ progressNameIdTitle,
+ processNameIdMatch,
+ progressNameIdTitle));
}
}
}
From a28ee701b8a562c6974a4b6139055854881bc45c Mon Sep 17 00:00:00 2001
From: DB p
Date: Thu, 17 Apr 2025 18:45:31 +0900
Subject: [PATCH 0915/1798] Add settingwindowfont config and menu
---
.../UserSettings/Settings.cs | 21 ++++----
.../ViewModels/SettingsPaneAboutViewModel.cs | 49 +++++++++++++++++++
.../SettingPages/Views/SettingsPaneAbout.xaml | 46 ++++++++++++++---
.../Views/SettingsPaneAbout.xaml.cs | 22 ++++++++-
Flow.Launcher/SettingWindow.xaml | 1 +
Flow.Launcher/SettingWindow.xaml.cs | 1 +
.../ViewModel/SettingWindowViewModel.cs | 26 +++++++++-
7 files changed, 147 insertions(+), 19 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 0bd1a809b..d91574bdc 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -65,19 +65,21 @@ namespace Flow.Launcher.Infrastructure.UserSettings
{ "pt", "Noto Sans" }
};
- public static string GetSystemDefaultFont()
+ public static string GetSystemDefaultFont(bool? useNoto = null)
{
try
{
- var culture = CultureInfo.CurrentCulture;
- var language = culture.Name; // e.g., "zh-TW"
- var langPrefix = language.Split('-')[0]; // e.g., "zh"
-
- // First, try to find by full name, and if not found, fallback to prefix
- if (TryGetNotoFont(language, out var notoFont) || TryGetNotoFont(langPrefix, out notoFont))
+ if (useNoto != false)
{
- if (Fonts.SystemFontFamilies.Any(f => f.Source.Equals(notoFont)))
- return notoFont;
+ var culture = CultureInfo.CurrentCulture;
+ var language = culture.Name; // e.g., "zh-TW"
+ var langPrefix = language.Split('-')[0]; // e.g., "zh"
+
+ if (TryGetNotoFont(language, out var notoFont) || TryGetNotoFont(langPrefix, out notoFont))
+ {
+ if (Fonts.SystemFontFamilies.Any(f => f.Source.Equals(notoFont)))
+ return notoFont;
+ }
}
var font = SystemFonts.MessageFontFamily;
@@ -162,6 +164,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public string ResultSubFontStyle { get; set; }
public string ResultSubFontWeight { get; set; }
public string ResultSubFontStretch { get; set; }
+ public string SettingWindowFont { get; set; } = GetSystemDefaultFont(false);
public bool UseGlyphIcons { get; set; } = true;
public bool UseAnimation { get; set; } = true;
public bool UseSound { get; set; } = true;
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
index 6cfb98306..abc7a2d16 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
@@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
+using System.Windows.Media;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core;
using Flow.Launcher.Infrastructure;
@@ -268,4 +270,51 @@ public partial class SettingsPaneAboutViewModel : BaseModel
return "0 B";
}
+
+ public event PropertyChangedEventHandler PropertyChanged;
+ protected virtual void OnPropertyChanged(string propertyName)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+
+ private string _settingWindowFont;
+
+ public string SettingWindowFont
+ {
+ get => _settings.SettingWindowFont;
+ set
+ {
+ if (_settings.SettingWindowFont != value)
+ {
+ _settings.SettingWindowFont = value;
+ OnPropertyChanged(nameof(SettingWindowFont));
+ }
+ }
+ }
+
+ [RelayCommand]
+ private void ResetSettingWindowFont()
+ {
+ string defaultFont = GetSystemDefaultFont();
+ _settings.SettingWindowFont = defaultFont;
+ }
+
+ public static string GetSystemDefaultFont()
+ {
+ try
+ {
+ var font = SystemFonts.MessageFontFamily;
+ if (font.FamilyNames.TryGetValue(System.Windows.Markup.XmlLanguage.GetLanguage("en-US"), out var englishName))
+ {
+ return englishName;
+ }
+
+ return font.Source ?? "Segoe UI";
+ }
+ catch
+ {
+ return "Segoe UI";
+ }
+ }
+
}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml
index f7deee7cf..b3991743d 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml
@@ -12,6 +12,11 @@
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ _settings.SettingWindowLeft;
set => _settings.SettingWindowLeft = value;
}
+
+ public string SettingWindowFont
+ {
+ get => _settings.SettingWindowFont;
+ set
+ {
+ if (_settings.SettingWindowFont != value)
+ {
+ _settings.SettingWindowFont = value;
+ OnPropertyChanged(nameof(SettingWindowFont));
+ }
+ }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void OnPropertyChanged(string propertyName)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
}
From e869b0c682e5a3b0c1d8f970f5a047592ff924a6 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 17 Apr 2025 22:47:58 +0800
Subject: [PATCH 0916/1798] Add remarks for AddActionKeyword function
---
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index a73ead814..61711d696 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -228,6 +228,10 @@ namespace Flow.Launcher.Plugin
///
/// ID for plugin that needs to add action keyword
/// The actionkeyword that is supposed to be added
+ ///
+ /// If new action keyword contains any whitespace, FL will still add it but it will not work for users.
+ /// So plugin should check the whitespace before calling this function.
+ ///
void AddActionKeyword(string pluginId, string newActionKeyword);
///
From 7797527dc7bec6521d03b0b7717fa390eccb4feb Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 17 Apr 2025 22:48:38 +0800
Subject: [PATCH 0917/1798] Improve API documents
---
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index 61711d696..31580fbe8 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -223,7 +223,7 @@ namespace Flow.Launcher.Plugin
Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath, Action reportProgress = null, CancellationToken token = default);
///
- /// Add ActionKeyword and update action keyword metadata for specific plugin
+ /// Add ActionKeyword and update action keyword metadata for specific plugin.
/// Before adding, please check if action keyword is already assigned by
///
/// ID for plugin that needs to add action keyword
@@ -284,9 +284,10 @@ namespace Flow.Launcher.Plugin
T LoadSettingJsonStorage() where T : new();
///
- /// Save JsonStorage for current plugin's setting. This is the method used to save settings to json in Flow.Launcher
+ /// Save JsonStorage for current plugin's setting. This is the method used to save settings to json in Flow.
/// This method will save the original instance loaded with LoadJsonStorage.
- /// This API call is for manually Save. Flow will automatically save all setting type that has called LoadSettingJsonStorage or SaveSettingJsonStorage previously.
+ /// This API call is for manually Save.
+ /// Flow will automatically save all setting type that has called or previously.
///
/// Type for Serialization
///
@@ -428,9 +429,10 @@ namespace Flow.Launcher.Plugin
Task LoadCacheBinaryStorageAsync(string cacheName, string cacheDirectory, T defaultData) where T : new();
///
- /// Save BinaryStorage for current plugin's cache. This is the method used to save cache to binary in Flow.Launcher
+ /// Save BinaryStorage for current plugin's cache. This is the method used to save cache to binary in Flow.
/// This method will save the original instance loaded with LoadCacheBinaryStorageAsync.
- /// This API call is for manually Save. Flow will automatically save all cache type that has called LoadCacheBinaryStorageAsync or SaveCacheBinaryStorageAsync previously.
+ /// This API call is for manually Save.
+ /// Flow will automatically save all cache type that has called or previously.
///
/// Type for Serialization
/// Cache file name
From 3eb9493bdd23c6a3bf686d097c19a8ff481e93ab Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 17 Apr 2025 23:01:45 +0800
Subject: [PATCH 0918/1798] Remove unused usings
---
Flow.Launcher/Helper/AutoStartup.cs | 1 -
Flow.Launcher/Helper/HotKeyMapper.cs | 1 -
2 files changed, 2 deletions(-)
diff --git a/Flow.Launcher/Helper/AutoStartup.cs b/Flow.Launcher/Helper/AutoStartup.cs
index 568ea7944..81568875e 100644
--- a/Flow.Launcher/Helper/AutoStartup.cs
+++ b/Flow.Launcher/Helper/AutoStartup.cs
@@ -3,7 +3,6 @@ using System.IO;
using System.Linq;
using System.Security.Principal;
using Flow.Launcher.Infrastructure;
-using Flow.Launcher.Infrastructure.Logger;
using Microsoft.Win32;
using Microsoft.Win32.TaskScheduler;
diff --git a/Flow.Launcher/Helper/HotKeyMapper.cs b/Flow.Launcher/Helper/HotKeyMapper.cs
index 1e83415cc..e5fabb3a8 100644
--- a/Flow.Launcher/Helper/HotKeyMapper.cs
+++ b/Flow.Launcher/Helper/HotKeyMapper.cs
@@ -5,7 +5,6 @@ using NHotkey;
using NHotkey.Wpf;
using Flow.Launcher.ViewModel;
using ChefKeys;
-using Flow.Launcher.Infrastructure.Logger;
using CommunityToolkit.Mvvm.DependencyInjection;
namespace Flow.Launcher.Helper;
From 1b0c11425504bc024919af2f9b9132e8076c4e10 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 17 Apr 2025 23:14:41 +0800
Subject: [PATCH 0919/1798] Fix possible window show issue during startup
---
Flow.Launcher/App.xaml.cs | 11 +---
Flow.Launcher/Helper/AutoStartup.cs | 64 +++++++++++--------
.../SettingsPaneGeneralViewModel.cs | 4 +-
3 files changed, 43 insertions(+), 36 deletions(-)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 87677f58a..87698a545 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -202,18 +202,11 @@ namespace Flow.Launcher
{
// we try to enable auto-startup on first launch, or reenable if it was removed
// but the user still has the setting set
- if (_settings.StartFlowLauncherOnSystemStartup && !Helper.AutoStartup.IsEnabled)
+ if (_settings.StartFlowLauncherOnSystemStartup)
{
try
{
- if (_settings.UseLogonTaskForStartup)
- {
- Helper.AutoStartup.EnableViaLogonTask();
- }
- else
- {
- Helper.AutoStartup.EnableViaRegistry();
- }
+ Helper.AutoStartup.CheckIsEnabled(_settings.UseLogonTaskForStartup);
}
catch (Exception e)
{
diff --git a/Flow.Launcher/Helper/AutoStartup.cs b/Flow.Launcher/Helper/AutoStartup.cs
index 81568875e..b83bb5948 100644
--- a/Flow.Launcher/Helper/AutoStartup.cs
+++ b/Flow.Launcher/Helper/AutoStartup.cs
@@ -16,29 +16,37 @@ public class AutoStartup
private const string LogonTaskName = $"{Constant.FlowLauncher} Startup";
private const string LogonTaskDesc = $"{Constant.FlowLauncher} Auto Startup";
- public static bool IsEnabled
+ public static void CheckIsEnabled(bool useLogonTaskForStartup)
{
- get
+ // We need to check both because if both of them are enabled,
+ // Hide Flow Launcher on startup will not work since the later one will trigger main window show event
+ var logonTaskEnabled = CheckLogonTask();
+ var registryEnabled = CheckRegistry();
+ if (useLogonTaskForStartup)
{
- // Check if logon task is enabled
- if (CheckLogonTask())
+ // Enable logon task
+ if (!logonTaskEnabled)
{
- return true;
+ Enable(true);
}
-
- // Check if registry is enabled
- try
+ // Disable registry
+ if (registryEnabled)
{
- using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
- var path = key?.GetValue(Constant.FlowLauncher) as string;
- return path == Constant.ExecutablePath;
+ Disable(false);
}
- catch (Exception e)
+ }
+ else
+ {
+ // Enable registry
+ if (!registryEnabled)
{
- App.API.LogError(ClassName, $"Ignoring non-critical registry error (querying if enabled): {e}");
+ Enable(false);
+ }
+ // Disable logon task
+ if (logonTaskEnabled)
+ {
+ Disable(true);
}
-
- return false;
}
}
@@ -69,22 +77,28 @@ public class AutoStartup
return false;
}
+ private static bool CheckRegistry()
+ {
+ try
+ {
+ using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
+ var path = key?.GetValue(Constant.FlowLauncher) as string;
+ return path == Constant.ExecutablePath;
+ }
+ catch (Exception e)
+ {
+ App.API.LogError(ClassName, $"Ignoring non-critical registry error (querying if enabled): {e}");
+ }
+
+ return false;
+ }
+
public static void DisableViaLogonTaskAndRegistry()
{
Disable(true);
Disable(false);
}
- public static void EnableViaLogonTask()
- {
- Enable(true);
- }
-
- public static void EnableViaRegistry()
- {
- Enable(false);
- }
-
public static void ChangeToViaLogonTask()
{
Disable(false);
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
index 021c9d7fe..6b56caf5e 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
@@ -48,11 +48,11 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
{
if (UseLogonTaskForStartup)
{
- AutoStartup.EnableViaLogonTask();
+ AutoStartup.ChangeToViaLogonTask();
}
else
{
- AutoStartup.EnableViaRegistry();
+ AutoStartup.ChangeToViaRegistry();
}
}
else
From dd61ab43cb5cc47d54edf21df77452d76b1ad1c3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 18 Apr 2025 07:17:33 +0800
Subject: [PATCH 0920/1798] Use null as flag to report community source error
---
.../ExternalPlugins/CommunityPluginSource.cs | 8 ++++----
.../ExternalPlugins/CommunityPluginStore.cs | 12 ++++++++----
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/Flow.Launcher.Core/ExternalPlugins/CommunityPluginSource.cs b/Flow.Launcher.Core/ExternalPlugins/CommunityPluginSource.cs
index ac27c523c..6f3b23e11 100644
--- a/Flow.Launcher.Core/ExternalPlugins/CommunityPluginSource.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/CommunityPluginSource.cs
@@ -16,12 +16,12 @@ namespace Flow.Launcher.Core.ExternalPlugins
{
public record CommunityPluginSource(string ManifestFileUrl)
{
+ private static readonly string ClassName = nameof(CommunityPluginSource);
+
// We should not initialize API in static constructor because it will create another API instance
private static IPublicAPI api = null;
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService();
- private static readonly string ClassName = nameof(CommunityPluginSource);
-
private string latestEtag = "";
private List plugins = new();
@@ -70,7 +70,7 @@ namespace Flow.Launcher.Core.ExternalPlugins
else
{
API.LogWarn(ClassName, $"Failed to load resource {ManifestFileUrl} with response {response.StatusCode}");
- return plugins;
+ return null;
}
}
catch (Exception e)
@@ -83,7 +83,7 @@ namespace Flow.Launcher.Core.ExternalPlugins
{
API.LogException(ClassName, "Error Occurred", e);
}
- return plugins;
+ return null;
}
}
}
diff --git a/Flow.Launcher.Core/ExternalPlugins/CommunityPluginStore.cs b/Flow.Launcher.Core/ExternalPlugins/CommunityPluginStore.cs
index 1f23c2f66..bdc1ad3dd 100644
--- a/Flow.Launcher.Core/ExternalPlugins/CommunityPluginStore.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/CommunityPluginStore.cs
@@ -40,10 +40,14 @@ namespace Flow.Launcher.Core.ExternalPlugins
var completedTask = await Task.WhenAny(tasks);
if (completedTask.IsCompletedSuccessfully)
{
- // one of the requests completed successfully; keep its results
- // and cancel the remaining http requests.
- pluginResults = await completedTask;
- cts.Cancel();
+ var result = await completedTask;
+ if (result != null)
+ {
+ // one of the requests completed successfully; keep its results
+ // and cancel the remaining http requests.
+ pluginResults = result;
+ cts.Cancel();
+ }
}
tasks.Remove(completedTask);
}
From 1cd699887083e1cd0a3de7b72bb02996e93d090f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 18 Apr 2025 07:39:02 +0800
Subject: [PATCH 0921/1798] Cleanup codes
---
.../UserSettings/Settings.cs | 85 ++-----------------
Flow.Launcher.Infrastructure/Win32Helper.cs | 72 ++++++++++++++++
.../ViewModels/SettingsPaneThemeViewModel.cs | 5 +-
3 files changed, 83 insertions(+), 79 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 0bd1a809b..8500e7aa4 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -1,12 +1,7 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
-using System.Diagnostics;
-using System.Drawing;
-using System.Globalization;
-using System.Linq;
using System.Text.Json.Serialization;
using System.Windows;
-using System.Windows.Media;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Infrastructure.Logger;
@@ -14,7 +9,6 @@ using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedModels;
using Flow.Launcher.ViewModel;
-using SystemFonts = System.Windows.SystemFonts;
namespace Flow.Launcher.Infrastructure.UserSettings
{
@@ -37,67 +31,6 @@ namespace Flow.Launcher.Infrastructure.UserSettings
{
_storage.Save();
}
-
- private string language = Constant.SystemLanguageCode;
- private static readonly Dictionary LanguageToNotoSans = new()
- {
- { "ko", "Noto Sans KR" },
- { "ja", "Noto Sans JP" },
- { "zh-CN", "Noto Sans SC" },
- { "zh-SG", "Noto Sans SC" },
- { "zh-Hans", "Noto Sans SC" },
- { "zh-TW", "Noto Sans TC" },
- { "zh-HK", "Noto Sans TC" },
- { "zh-MO", "Noto Sans TC" },
- { "zh-Hant", "Noto Sans TC" },
- { "th", "Noto Sans Thai" },
- { "ar", "Noto Sans Arabic" },
- { "he", "Noto Sans Hebrew" },
- { "hi", "Noto Sans Devanagari" },
- { "bn", "Noto Sans Bengali" },
- { "ta", "Noto Sans Tamil" },
- { "el", "Noto Sans Greek" },
- { "ru", "Noto Sans" },
- { "en", "Noto Sans" },
- { "fr", "Noto Sans" },
- { "de", "Noto Sans" },
- { "es", "Noto Sans" },
- { "pt", "Noto Sans" }
- };
-
- public static string GetSystemDefaultFont()
- {
- try
- {
- var culture = CultureInfo.CurrentCulture;
- var language = culture.Name; // e.g., "zh-TW"
- var langPrefix = language.Split('-')[0]; // e.g., "zh"
-
- // First, try to find by full name, and if not found, fallback to prefix
- if (TryGetNotoFont(language, out var notoFont) || TryGetNotoFont(langPrefix, out notoFont))
- {
- if (Fonts.SystemFontFamilies.Any(f => f.Source.Equals(notoFont)))
- return notoFont;
- }
-
- var font = SystemFonts.MessageFontFamily;
- if (font.FamilyNames.TryGetValue(System.Windows.Markup.XmlLanguage.GetLanguage("en-US"), out var englishName))
- {
- return englishName;
- }
-
- return font.Source ?? "Segoe UI";
- }
- catch
- {
- return "Segoe UI";
- }
- }
-
- private static bool TryGetNotoFont(string langKey, out string notoFont)
- {
- return LanguageToNotoSans.TryGetValue(langKey, out notoFont);
- }
private string _theme = Constant.DefaultTheme;
public string Hotkey { get; set; } = $"{KeyConstant.Alt} + {KeyConstant.Space}";
@@ -119,12 +52,13 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public string CycleHistoryUpHotkey { get; set; } = $"{KeyConstant.Alt} + Up";
public string CycleHistoryDownHotkey { get; set; } = $"{KeyConstant.Alt} + Down";
+ private string _language = Constant.SystemLanguageCode;
public string Language
{
- get => language;
+ get => _language;
set
{
- language = value;
+ _language = value;
OnPropertyChanged();
}
}
@@ -150,15 +84,15 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public double QueryBoxFontSize { get; set; } = 16;
public double ResultItemFontSize { get; set; } = 16;
public double ResultSubItemFontSize { get; set; } = 13;
- public string QueryBoxFont { get; set; } = GetSystemDefaultFont();
+ public string QueryBoxFont { get; set; } = Win32Helper.GetSystemDefaultFont();
public string QueryBoxFontStyle { get; set; }
public string QueryBoxFontWeight { get; set; }
public string QueryBoxFontStretch { get; set; }
- public string ResultFont { get; set; } = GetSystemDefaultFont();
+ public string ResultFont { get; set; } = Win32Helper.GetSystemDefaultFont();
public string ResultFontStyle { get; set; }
public string ResultFontWeight { get; set; }
public string ResultFontStretch { get; set; }
- public string ResultSubFont { get; set; } = GetSystemDefaultFont();
+ public string ResultSubFont { get; set; } = Win32Helper.GetSystemDefaultFont();
public string ResultSubFontStyle { get; set; }
public string ResultSubFontWeight { get; set; }
public string ResultSubFontStretch { get; set; }
@@ -181,7 +115,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public double? SettingWindowLeft { get; set; } = null;
public WindowState SettingWindowState { get; set; } = WindowState.Normal;
- bool _showPlaceholder { get; set; } = true;
+ private bool _showPlaceholder { get; set; } = true;
public bool ShowPlaceholder
{
get => _showPlaceholder;
@@ -194,7 +128,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
}
}
- string _placeholderText { get; set; } = string.Empty;
+ private string _placeholderText { get; set; } = string.Empty;
public string PlaceholderText
{
get => _placeholderText;
@@ -373,7 +307,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool StartFlowLauncherOnSystemStartup { get; set; } = false;
public bool UseLogonTaskForStartup { get; set; } = false;
public bool HideOnStartup { get; set; } = true;
- bool _hideNotifyIcon { get; set; }
+ private bool _hideNotifyIcon;
public bool HideNotifyIcon
{
get => _hideNotifyIcon;
@@ -551,5 +485,4 @@ namespace Flow.Launcher.Infrastructure.UserSettings
Mica,
MicaAlt
}
-
}
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 798501ae3..6a5af41df 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -1,10 +1,13 @@
using System;
+using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
+using System.Linq;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
+using System.Windows.Markup;
using System.Windows.Media;
using Flow.Launcher.Infrastructure.UserSettings;
using Microsoft.Win32;
@@ -14,6 +17,7 @@ using Windows.Win32.Graphics.Dwm;
using Windows.Win32.UI.Input.KeyboardAndMouse;
using Windows.Win32.UI.WindowsAndMessaging;
using Point = System.Windows.Point;
+using SystemFonts = System.Windows.SystemFonts;
namespace Flow.Launcher.Infrastructure
{
@@ -595,5 +599,73 @@ namespace Flow.Launcher.Infrastructure
}
#endregion
+
+ #region System Font
+
+ private static readonly Dictionary _languageToNotoSans = new()
+ {
+ { "ko", "Noto Sans KR" },
+ { "ja", "Noto Sans JP" },
+ { "zh-CN", "Noto Sans SC" },
+ { "zh-SG", "Noto Sans SC" },
+ { "zh-Hans", "Noto Sans SC" },
+ { "zh-TW", "Noto Sans TC" },
+ { "zh-HK", "Noto Sans TC" },
+ { "zh-MO", "Noto Sans TC" },
+ { "zh-Hant", "Noto Sans TC" },
+ { "th", "Noto Sans Thai" },
+ { "ar", "Noto Sans Arabic" },
+ { "he", "Noto Sans Hebrew" },
+ { "hi", "Noto Sans Devanagari" },
+ { "bn", "Noto Sans Bengali" },
+ { "ta", "Noto Sans Tamil" },
+ { "el", "Noto Sans Greek" },
+ { "ru", "Noto Sans" },
+ { "en", "Noto Sans" },
+ { "fr", "Noto Sans" },
+ { "de", "Noto Sans" },
+ { "es", "Noto Sans" },
+ { "pt", "Noto Sans" }
+ };
+
+ public static string GetSystemDefaultFont()
+ {
+ try
+ {
+ var culture = CultureInfo.CurrentCulture;
+ var language = culture.Name; // e.g., "zh-TW"
+ var langPrefix = language.Split('-')[0]; // e.g., "zh"
+
+ // First, try to find by full name, and if not found, fallback to prefix
+ if (TryGetNotoFont(language, out var notoFont) || TryGetNotoFont(langPrefix, out notoFont))
+ {
+ // If the font is installed, return it
+ if (Fonts.SystemFontFamilies.Any(f => f.Source.Equals(notoFont)))
+ {
+ return notoFont;
+ }
+ }
+
+ // If Noto font is not found, fallback to the system default font
+ var font = SystemFonts.MessageFontFamily;
+ if (font.FamilyNames.TryGetValue(XmlLanguage.GetLanguage("en-US"), out var englishName))
+ {
+ return englishName;
+ }
+
+ return font.Source ?? "Segoe UI";
+ }
+ catch
+ {
+ return "Segoe UI";
+ }
+ }
+
+ private static bool TryGetNotoFont(string langKey, out string notoFont)
+ {
+ return _languageToNotoSans.TryGetValue(langKey, out notoFont);
+ }
+
+ #endregion
}
}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
index d62fd906b..1138b2869 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
-using System.Diagnostics;
using System.Windows;
+using System.Windows.Controls;
using System.Globalization;
using System.IO;
using System.Linq;
@@ -17,13 +17,12 @@ using Flow.Launcher.Plugin.SharedModels;
using Flow.Launcher.ViewModel;
using ModernWpf;
using ThemeManagerForColorSchemeSwitch = ModernWpf.ThemeManager;
-using System.Windows.Controls;
namespace Flow.Launcher.SettingPages.ViewModels;
public partial class SettingsPaneThemeViewModel : BaseModel
{
- private string DefaultFont = Settings.GetSystemDefaultFont();
+ private readonly string DefaultFont = Win32Helper.GetSystemDefaultFont();
public string BackdropSubText => !Win32Helper.IsBackdropSupported() ? App.API.GetTranslation("BackdropTypeDisabledToolTip") : "";
public Settings Settings { get; }
private readonly Theme _theme = Ioc.Default.GetRequiredService();
From e70ce114726b5f22717496efba47aa746d805182 Mon Sep 17 00:00:00 2001
From: DB p
Date: Sat, 19 Apr 2025 09:39:02 +0900
Subject: [PATCH 0922/1798] Change Search Window Position to Location
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 5a6fd3d74..caa9a7129 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -58,7 +58,7 @@
Error setting launch on startupHide Flow Launcher when focus is lostDo not show new version notifications
- Search Window Position
+ Search Window LocationRemember Last PositionMonitor with Mouse CursorMonitor with Focused Window
From e60e117cf924d0cf559c9fe1c94c535f4de6d8d9 Mon Sep 17 00:00:00 2001
From: DB P
Date: Sat, 19 Apr 2025 10:20:59 +0900
Subject: [PATCH 0923/1798] Fix Color
---
Flow.Launcher/Resources/Light.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Resources/Light.xaml b/Flow.Launcher/Resources/Light.xaml
index 4d765d161..112815ed0 100644
--- a/Flow.Launcher/Resources/Light.xaml
+++ b/Flow.Launcher/Resources/Light.xaml
@@ -22,7 +22,7 @@
-
+
From 8674fca082dd74cb503e0a9a4b238a4cb05aa59a Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 19 Apr 2025 11:20:08 +0800
Subject: [PATCH 0924/1798] Resolve conflicts
---
.../UserSettings/Settings.cs | 2 +-
Flow.Launcher.Infrastructure/Win32Helper.cs | 32 +++++++++++++------
2 files changed, 23 insertions(+), 11 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 17792c0c1..52bc63ec6 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -96,7 +96,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public string ResultSubFontStyle { get; set; }
public string ResultSubFontWeight { get; set; }
public string ResultSubFontStretch { get; set; }
- public string SettingWindowFont { get; set; } = GetSystemDefaultFont(false);
+ public string SettingWindowFont { get; set; } = Win32Helper.GetSystemDefaultFont(false);
public bool UseGlyphIcons { get; set; } = true;
public bool UseAnimation { get; set; } = true;
public bool UseSound { get; set; } = true;
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 6a5af41df..2788060eb 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -628,21 +628,33 @@ namespace Flow.Launcher.Infrastructure
{ "pt", "Noto Sans" }
};
- public static string GetSystemDefaultFont()
+ ///
+ /// Gets the system default font.
+ ///
+ ///
+ /// If true, it will try to find the Noto font for the current culture.
+ ///
+ ///
+ /// The name of the system default font.
+ ///
+ public static string GetSystemDefaultFont(bool useNoto = true)
{
try
{
- var culture = CultureInfo.CurrentCulture;
- var language = culture.Name; // e.g., "zh-TW"
- var langPrefix = language.Split('-')[0]; // e.g., "zh"
-
- // First, try to find by full name, and if not found, fallback to prefix
- if (TryGetNotoFont(language, out var notoFont) || TryGetNotoFont(langPrefix, out notoFont))
+ if (useNoto)
{
- // If the font is installed, return it
- if (Fonts.SystemFontFamilies.Any(f => f.Source.Equals(notoFont)))
+ var culture = CultureInfo.CurrentCulture;
+ var language = culture.Name; // e.g., "zh-TW"
+ var langPrefix = language.Split('-')[0]; // e.g., "zh"
+
+ // First, try to find by full name, and if not found, fallback to prefix
+ if (TryGetNotoFont(language, out var notoFont) || TryGetNotoFont(langPrefix, out notoFont))
{
- return notoFont;
+ // If the font is installed, return it
+ if (Fonts.SystemFontFamilies.Any(f => f.Source.Equals(notoFont)))
+ {
+ return notoFont;
+ }
}
}
From a15b789eb03f8cc7e0174c201b91e53b1a66290c Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 19 Apr 2025 11:25:39 +0800
Subject: [PATCH 0925/1798] Cleanup codes
---
.../ViewModels/SettingsPaneAboutViewModel.cs | 33 ++-----------------
1 file changed, 2 insertions(+), 31 deletions(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
index abc7a2d16..ee0865f9d 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
@@ -1,11 +1,9 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
-using System.Windows.Media;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core;
using Flow.Launcher.Infrastructure;
@@ -271,14 +269,6 @@ public partial class SettingsPaneAboutViewModel : BaseModel
return "0 B";
}
- public event PropertyChangedEventHandler PropertyChanged;
- protected virtual void OnPropertyChanged(string propertyName)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
-
- private string _settingWindowFont;
-
public string SettingWindowFont
{
get => _settings.SettingWindowFont;
@@ -287,7 +277,7 @@ public partial class SettingsPaneAboutViewModel : BaseModel
if (_settings.SettingWindowFont != value)
{
_settings.SettingWindowFont = value;
- OnPropertyChanged(nameof(SettingWindowFont));
+ OnPropertyChanged();
}
}
}
@@ -295,26 +285,7 @@ public partial class SettingsPaneAboutViewModel : BaseModel
[RelayCommand]
private void ResetSettingWindowFont()
{
- string defaultFont = GetSystemDefaultFont();
+ string defaultFont = Win32Helper.GetSystemDefaultFont(false);
_settings.SettingWindowFont = defaultFont;
}
-
- public static string GetSystemDefaultFont()
- {
- try
- {
- var font = SystemFonts.MessageFontFamily;
- if (font.FamilyNames.TryGetValue(System.Windows.Markup.XmlLanguage.GetLanguage("en-US"), out var englishName))
- {
- return englishName;
- }
-
- return font.Source ?? "Segoe UI";
- }
- catch
- {
- return "Segoe UI";
- }
- }
-
}
From 3f5e69be7f385cec24097a2479025b5ba569c071 Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Sat, 19 Apr 2025 11:27:43 +0800
Subject: [PATCH 0926/1798] Fix possible property change issue
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
.../SettingPages/ViewModels/SettingsPaneAboutViewModel.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
index ee0865f9d..55d6b0a1c 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
@@ -286,6 +286,6 @@ public partial class SettingsPaneAboutViewModel : BaseModel
private void ResetSettingWindowFont()
{
string defaultFont = Win32Helper.GetSystemDefaultFont(false);
- _settings.SettingWindowFont = defaultFont;
+ SettingWindowFont = defaultFont;
}
}
From 647f2bb0a16fd7c5d142469c3365701376fa32dc Mon Sep 17 00:00:00 2001
From: DB P
Date: Sat, 19 Apr 2025 15:05:15 +0900
Subject: [PATCH 0927/1798] Add String
---
Flow.Launcher/Languages/en.xaml | 1 +
Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index caa9a7129..b66b2ba03 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -356,6 +356,7 @@
Log LevelDebugInfo
+ Setting Window FontSelect File Manager
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml
index b3991743d..44a0490ca 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml
@@ -148,7 +148,7 @@
SelectedValuePath="Value" />
From 942b29061edfbd9102f63c7d3f14316408cd6954 Mon Sep 17 00:00:00 2001
From: DB P
Date: Sat, 19 Apr 2025 15:40:11 +0900
Subject: [PATCH 0928/1798] Add FontFamily Style
---
Flow.Launcher/CustomQueryHotkeySetting.xaml | 1 +
.../CustomQueryHotkeySetting.xaml.cs | 21 +++++++-
Flow.Launcher/CustomShortcutSetting.xaml.cs | 23 ++++++++-
Flow.Launcher/SelectBrowserWindow.xaml | 51 +++++++++----------
Flow.Launcher/SelectBrowserWindow.xaml.cs | 17 ++++++-
Flow.Launcher/SelectFileManagerWindow.xaml | 1 +
Flow.Launcher/SelectFileManagerWindow.xaml.cs | 16 ++++++
7 files changed, 101 insertions(+), 29 deletions(-)
diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml b/Flow.Launcher/CustomQueryHotkeySetting.xaml
index 0171e6d79..a460ffae0 100644
--- a/Flow.Launcher/CustomQueryHotkeySetting.xaml
+++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml
@@ -4,6 +4,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:flowlauncher="clr-namespace:Flow.Launcher"
+ FontFamily="{Binding SettingWindowFont, Mode=TwoWay}"
Title="{DynamicResource customeQueryHotkeyTitle}"
Width="530"
Background="{DynamicResource PopuBGColor}"
diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
index 8b193fa1d..c377fb250 100644
--- a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
+++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
@@ -1,6 +1,7 @@
using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure.UserSettings;
using System.Collections.ObjectModel;
+using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Input;
@@ -13,7 +14,25 @@ namespace Flow.Launcher
private readonly Settings _settings;
private bool update;
private CustomPluginHotkey updateCustomHotkey;
-
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ public string SettingWindowFont
+ {
+ get => _settings.SettingWindowFont;
+ set
+ {
+ if (_settings.SettingWindowFont != value)
+ {
+ _settings.SettingWindowFont = value;
+ OnPropertyChanged(nameof(SettingWindowFont));
+ }
+ }
+ }
+
+ protected virtual void OnPropertyChanged(string propertyName)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
public CustomQueryHotkeySetting(Settings settings)
{
_settings = settings;
diff --git a/Flow.Launcher/CustomShortcutSetting.xaml.cs b/Flow.Launcher/CustomShortcutSetting.xaml.cs
index ecbdea606..dcfa572f4 100644
--- a/Flow.Launcher/CustomShortcutSetting.xaml.cs
+++ b/Flow.Launcher/CustomShortcutSetting.xaml.cs
@@ -1,6 +1,8 @@
using System;
+using System.ComponentModel;
using System.Windows;
using System.Windows.Input;
+using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.SettingPages.ViewModels;
namespace Flow.Launcher
@@ -13,7 +15,26 @@ namespace Flow.Launcher
private string originalKey { get; } = null;
private string originalValue { get; } = null;
private bool update { get; } = false;
-
+ private readonly Settings _settings;
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ public string SettingWindowFont
+ {
+ get => _settings.SettingWindowFont;
+ set
+ {
+ if (_settings.SettingWindowFont != value)
+ {
+ _settings.SettingWindowFont = value;
+ OnPropertyChanged(nameof(SettingWindowFont));
+ }
+ }
+ }
+
+ protected virtual void OnPropertyChanged(string propertyName)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
public CustomShortcutSetting(SettingsPaneHotkeyViewModel vm)
{
_hotkeyVm = vm;
diff --git a/Flow.Launcher/SelectBrowserWindow.xaml b/Flow.Launcher/SelectBrowserWindow.xaml
index c12879a04..b16de2770 100644
--- a/Flow.Launcher/SelectBrowserWindow.xaml
+++ b/Flow.Launcher/SelectBrowserWindow.xaml
@@ -10,6 +10,7 @@
Width="550"
Background="{DynamicResource PopuBGColor}"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
+ FontFamily="{Binding SettingWindowFont, Mode=TwoWay}"
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
SizeToContent="Height"
@@ -54,11 +55,11 @@
-
-
+
+
-
+
@@ -108,10 +109,10 @@
@@ -129,7 +130,7 @@
-
-
+
+
@@ -239,18 +238,18 @@
Grid.Row="1"
Background="{DynamicResource PopupButtonAreaBGColor}"
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
- BorderThickness="0,1,0,0">
+ BorderThickness="0 1 0 0">
Settings.SettingWindowFont;
+ set
+ {
+ if (Settings.SettingWindowFont != value)
+ {
+ Settings.SettingWindowFont = value;
+ OnPropertyChanged(nameof(SettingWindowFont));
+ }
+ }
+ }
+ protected virtual void OnPropertyChanged(string propertyName)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
public int SelectedCustomBrowserIndex
{
get => selectedCustomBrowserIndex; set
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml b/Flow.Launcher/SelectFileManagerWindow.xaml
index 0287af9b0..bfe6914e5 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml
@@ -10,6 +10,7 @@
Width="600"
Background="{DynamicResource PopuBGColor}"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
+ FontFamily="{Binding SettingWindowFont, Mode=TwoWay}"
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
SizeToContent="Height"
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml.cs b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
index b7bda4565..80c0cf1f6 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml.cs
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
@@ -17,6 +17,22 @@ namespace Flow.Launcher
public Settings Settings { get; }
+ public string SettingWindowFont
+ {
+ get => Settings.SettingWindowFont;
+ set
+ {
+ if (Settings.SettingWindowFont != value)
+ {
+ Settings.SettingWindowFont = value;
+ OnPropertyChanged(nameof(SettingWindowFont));
+ }
+ }
+ }
+ protected virtual void OnPropertyChanged(string propertyName)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
public int SelectedCustomExplorerIndex
{
get => selectedCustomExplorerIndex; set
From 4c54294074f9b0f8912c8fbd1cd7011b803b45de Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sat, 19 Apr 2025 21:22:43 +1000
Subject: [PATCH 0929/1798] deploy website on release
---
.github/workflows/website_deploy.yml | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 .github/workflows/website_deploy.yml
diff --git a/.github/workflows/website_deploy.yml b/.github/workflows/website_deploy.yml
new file mode 100644
index 000000000..0cb623174
--- /dev/null
+++ b/.github/workflows/website_deploy.yml
@@ -0,0 +1,21 @@
+---
+
+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_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 827c7520f9d011583ab135ce1e65fb086d94925d Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sat, 19 Apr 2025 21:27:24 +1000
Subject: [PATCH 0930/1798] update token name
---
.github/workflows/website_deploy.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/website_deploy.yml b/.github/workflows/website_deploy.yml
index 0cb623174..2d44e4a2c 100644
--- a/.github/workflows/website_deploy.yml
+++ b/.github/workflows/website_deploy.yml
@@ -15,7 +15,7 @@ jobs:
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_WEBSITE }}" \
+ -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 908d1b74bf0fdcf1ebbb50e499efaae957c295b3 Mon Sep 17 00:00:00 2001
From: DB p
Date: Sun, 20 Apr 2025 08:12:31 +0900
Subject: [PATCH 0931/1798] Fix typo
---
Flow.Launcher/Languages/en.xaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index caa9a7129..8501f083b 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -142,8 +142,8 @@
Current action keywordNew action keywordChange Action Keywords
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay TimeAdvanced Settings:EnabledPriority
From d5f48da3f70f2b73dda8e618e7b38a6c890b2929 Mon Sep 17 00:00:00 2001
From: DB p
Date: Sun, 20 Apr 2025 08:12:31 +0900
Subject: [PATCH 0932/1798] Fix typo
---
Flow.Launcher/Languages/en.xaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index caa9a7129..8501f083b 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -142,8 +142,8 @@
Current action keywordNew action keywordChange Action Keywords
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay TimeAdvanced Settings:EnabledPriority
From 5765baa5026334791f144a54fabf6bbbf12041c1 Mon Sep 17 00:00:00 2001
From: DB p
Date: Sun, 20 Apr 2025 08:15:35 +0900
Subject: [PATCH 0933/1798] Fix Typo
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 8501f083b..554e5ed9d 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -235,7 +235,7 @@
AcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
From f9a201a33c8c2492b2fbac91b4f2f6a5f673a68f Mon Sep 17 00:00:00 2001
From: DB p
Date: Sun, 20 Apr 2025 08:15:35 +0900
Subject: [PATCH 0934/1798] "disable from displaying" to "Hide"
---
Flow.Launcher/Languages/en.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 8501f083b..554e5ed9d 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -235,7 +235,7 @@
AcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
index 790c9d2c6..ee6b4379d 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
@@ -76,7 +76,7 @@
Run As Different UserRun As AdministratorOpen containing folder
- Disable this program from displaying
+ HideOpen target folderProgram
From 31f286607dd9dc50f7f53ddb864b22eed7b2d85b Mon Sep 17 00:00:00 2001
From: DB p
Date: Sun, 20 Apr 2025 10:31:35 +0900
Subject: [PATCH 0935/1798] Adjust Badge Text and remove subtitle
---
Flow.Launcher/Languages/en.xaml | 3 +--
Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml | 5 +----
2 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 554e5ed9d..f1b41eb3c 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -303,9 +303,8 @@
Use Segoe Fluent Icons for query results where supportedPress KeyShow Result Badges
- Show badges for query results where supported
+ For supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
- Show badges for global query results onlyHTTP Proxy
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
index 0b5de1280..f7853515a 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
@@ -740,10 +740,7 @@
OffContent="{DynamicResource disable}"
OnContent="{DynamicResource enable}" />
-
+
Date: Mon, 21 Apr 2025 22:07:23 +0000
Subject: [PATCH 0936/1798] Bump vers-one/dotnet-project-version-updater from
1.5 to 1.7
Bumps [vers-one/dotnet-project-version-updater](https://github.com/vers-one/dotnet-project-version-updater) from 1.5 to 1.7.
- [Release notes](https://github.com/vers-one/dotnet-project-version-updater/releases)
- [Commits](https://github.com/vers-one/dotnet-project-version-updater/compare/v1.5...v1.7)
---
updated-dependencies:
- dependency-name: vers-one/dotnet-project-version-updater
dependency-version: '1.7'
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
.github/workflows/dotnet.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
index 718a28dbd..7498262de 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/dotnet.yml
@@ -23,7 +23,7 @@ jobs:
- uses: actions/checkout@v4
- name: Set Flow.Launcher.csproj version
id: update
- uses: vers-one/dotnet-project-version-updater@v1.5
+ uses: vers-one/dotnet-project-version-updater@v1.7
with:
file: |
"**/SolutionAssemblyInfo.cs"
From 0a41072f33a7196402db93e2266a8f9d52ca2b13 Mon Sep 17 00:00:00 2001
From: DB p
Date: Tue, 22 Apr 2025 11:21:11 +0900
Subject: [PATCH 0937/1798] Add animation option when showing the main window
---
Flow.Launcher/MainWindow.xaml.cs | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index bf7a45b1d..ee84dfeb4 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -138,8 +138,12 @@ namespace Flow.Launcher
else
{
_viewModel.Show();
+ if (_settings.UseAnimation)
+ {
+ WindowAnimation();
+ }
}
-
+
// Show notify icon when flowlauncher is hidden
InitializeNotifyIcon();
From 9b52cb6a1029329d23f0964b13a0494d8849b71f Mon Sep 17 00:00:00 2001
From: DB p
Date: Wed, 23 Apr 2025 11:53:54 +0900
Subject: [PATCH 0938/1798] Remove unused PropertyChanged event and
OnPropertyChanged method from SettingWindowViewModel
---
Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
index b6fd9555b..4468b7865 100644
--- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
+++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
@@ -58,11 +58,5 @@ public partial class SettingWindowViewModel : BaseModel
}
}
}
-
- public event PropertyChangedEventHandler PropertyChanged;
-
- protected virtual void OnPropertyChanged(string propertyName)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
+
}
From 284fe2b922e6145bbb14dc3960890338d6232f9c Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Apr 2025 11:42:16 +0800
Subject: [PATCH 0939/1798] Cleanup codes
---
Flow.Launcher/SettingWindow.xaml.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs
index 70b5a22ed..b4a3ae47a 100644
--- a/Flow.Launcher/SettingWindow.xaml.cs
+++ b/Flow.Launcher/SettingWindow.xaml.cs
@@ -3,7 +3,6 @@ using System.Windows;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Interop;
-using System.Windows.Media;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.UserSettings;
From 83e5654a5ce2a4651cdfb38f234d4b49bea2ccae Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Apr 2025 11:42:55 +0800
Subject: [PATCH 0940/1798] Fix possible null exception
---
Flow.Launcher/CustomShortcutSetting.xaml.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/CustomShortcutSetting.xaml.cs b/Flow.Launcher/CustomShortcutSetting.xaml.cs
index dcfa572f4..ba326fb9e 100644
--- a/Flow.Launcher/CustomShortcutSetting.xaml.cs
+++ b/Flow.Launcher/CustomShortcutSetting.xaml.cs
@@ -9,13 +9,14 @@ namespace Flow.Launcher
{
public partial class CustomShortcutSetting : Window
{
+ private static readonly Settings _settings = Ioc.Default.GetRequiredService();
+
private readonly SettingsPaneHotkeyViewModel _hotkeyVm;
public string Key { get; set; } = String.Empty;
public string Value { get; set; } = String.Empty;
private string originalKey { get; } = null;
private string originalValue { get; } = null;
private bool update { get; } = false;
- private readonly Settings _settings;
public event PropertyChangedEventHandler PropertyChanged;
public string SettingWindowFont
From cdbe45d4dcf5e37e9810c755407560516a18e9f9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Apr 2025 11:48:11 +0800
Subject: [PATCH 0941/1798] Cleanup codes
---
.../SettingPages/ViewModels/SettingsPaneAboutViewModel.cs | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
index 55d6b0a1c..acffe1e85 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
@@ -285,7 +285,6 @@ public partial class SettingsPaneAboutViewModel : BaseModel
[RelayCommand]
private void ResetSettingWindowFont()
{
- string defaultFont = Win32Helper.GetSystemDefaultFont(false);
- SettingWindowFont = defaultFont;
+ SettingWindowFont = Win32Helper.GetSystemDefaultFont(false);
}
}
From c3509c3b20bcc4bc914d5ac39b678f0aef91f052 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Apr 2025 12:43:34 +0800
Subject: [PATCH 0942/1798] Use property change event for settings & Use
INotifyPropertyChanged instead
---
.../UserSettings/Settings.cs | 15 ++++++-
Flow.Launcher/CustomQueryHotkeySetting.xaml | 2 +-
.../CustomQueryHotkeySetting.xaml.cs | 38 +++++-------------
Flow.Launcher/CustomShortcutSetting.xaml | 27 +++++++------
Flow.Launcher/CustomShortcutSetting.xaml.cs | 31 +++-----------
Flow.Launcher/SelectBrowserWindow.xaml | 2 +-
Flow.Launcher/SelectBrowserWindow.xaml.cs | 36 +++++------------
Flow.Launcher/SelectFileManagerWindow.xaml | 2 +-
Flow.Launcher/SelectFileManagerWindow.xaml.cs | 38 +++++-------------
.../SettingPages/Views/SettingsPaneAbout.xaml | 3 +-
.../Views/SettingsPaneAbout.xaml.cs | 22 +---------
Flow.Launcher/SettingWindow.xaml | 2 +-
.../ViewModel/SettingWindowViewModel.cs | 40 ++++++-------------
13 files changed, 81 insertions(+), 177 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 52bc63ec6..0f878151e 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -96,7 +96,6 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public string ResultSubFontStyle { get; set; }
public string ResultSubFontWeight { get; set; }
public string ResultSubFontStretch { get; set; }
- public string SettingWindowFont { get; set; } = Win32Helper.GetSystemDefaultFont(false);
public bool UseGlyphIcons { get; set; } = true;
public bool UseAnimation { get; set; } = true;
public bool UseSound { get; set; } = true;
@@ -104,6 +103,20 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool ShowBadges { get; set; } = false;
public bool ShowBadgesGlobalOnly { get; set; } = false;
+ private string _settingWindowFont { get; set; } = Win32Helper.GetSystemDefaultFont(false);
+ public string SettingWindowFont
+ {
+ get => _settingWindowFont;
+ set
+ {
+ if (_settingWindowFont != value)
+ {
+ _settingWindowFont = value;
+ OnPropertyChanged();
+ }
+ }
+ }
+
public bool UseClock { get; set; } = true;
public bool UseDate { get; set; } = false;
public string TimeFormat { get; set; } = "hh:mm tt";
diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml b/Flow.Launcher/CustomQueryHotkeySetting.xaml
index a460ffae0..d3c31c6da 100644
--- a/Flow.Launcher/CustomQueryHotkeySetting.xaml
+++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml
@@ -4,11 +4,11 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:flowlauncher="clr-namespace:Flow.Launcher"
- FontFamily="{Binding SettingWindowFont, Mode=TwoWay}"
Title="{DynamicResource customeQueryHotkeyTitle}"
Width="530"
Background="{DynamicResource PopuBGColor}"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
+ FontFamily="{Binding Settings.SettingWindowFont, Mode=TwoWay}"
Foreground="{DynamicResource PopupTextColor}"
Icon="Images\app.png"
MouseDown="window_MouseDown"
diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
index c377fb250..3c501d41a 100644
--- a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
+++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
@@ -1,41 +1,23 @@
-using Flow.Launcher.Helper;
-using Flow.Launcher.Infrastructure.UserSettings;
-using System.Collections.ObjectModel;
-using System.ComponentModel;
+using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using System.Windows.Controls;
+using Flow.Launcher.Helper;
+using Flow.Launcher.Infrastructure.UserSettings;
namespace Flow.Launcher
{
public partial class CustomQueryHotkeySetting : Window
{
- private readonly Settings _settings;
+ public Settings Settings { get; set; }
+
private bool update;
private CustomPluginHotkey updateCustomHotkey;
- public event PropertyChangedEventHandler PropertyChanged;
-
- public string SettingWindowFont
- {
- get => _settings.SettingWindowFont;
- set
- {
- if (_settings.SettingWindowFont != value)
- {
- _settings.SettingWindowFont = value;
- OnPropertyChanged(nameof(SettingWindowFont));
- }
- }
- }
-
- protected virtual void OnPropertyChanged(string propertyName)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
+
public CustomQueryHotkeySetting(Settings settings)
{
- _settings = settings;
+ Settings = settings;
InitializeComponent();
}
@@ -48,13 +30,13 @@ namespace Flow.Launcher
{
if (!update)
{
- _settings.CustomPluginHotkeys ??= new ObservableCollection();
+ Settings.CustomPluginHotkeys ??= new ObservableCollection();
var pluginHotkey = new CustomPluginHotkey
{
Hotkey = HotkeyControl.CurrentHotkey.ToString(), ActionKeyword = tbAction.Text
};
- _settings.CustomPluginHotkeys.Add(pluginHotkey);
+ Settings.CustomPluginHotkeys.Add(pluginHotkey);
HotKeyMapper.SetCustomQueryHotkey(pluginHotkey);
}
@@ -73,7 +55,7 @@ namespace Flow.Launcher
public void UpdateItem(CustomPluginHotkey item)
{
- updateCustomHotkey = _settings.CustomPluginHotkeys.FirstOrDefault(o =>
+ updateCustomHotkey = Settings.CustomPluginHotkeys.FirstOrDefault(o =>
o.ActionKeyword == item.ActionKeyword && o.Hotkey == item.Hotkey);
if (updateCustomHotkey == null)
{
diff --git a/Flow.Launcher/CustomShortcutSetting.xaml b/Flow.Launcher/CustomShortcutSetting.xaml
index 9256a2c52..cbdcecea6 100644
--- a/Flow.Launcher/CustomShortcutSetting.xaml
+++ b/Flow.Launcher/CustomShortcutSetting.xaml
@@ -7,6 +7,7 @@
Width="530"
Background="{DynamicResource PopuBGColor}"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
+ FontFamily="{Binding Settings.SettingWindowFont, Mode=TwoWay}"
Foreground="{DynamicResource PopupTextColor}"
Icon="Images\app.png"
ResizeMode="NoResize"
@@ -56,11 +57,11 @@
-
-
+
+
-
+
@@ -124,14 +125,14 @@
LastChildFill="True">
@@ -142,21 +143,21 @@
+ BorderThickness="0 1 0 0">
diff --git a/Flow.Launcher/CustomShortcutSetting.xaml.cs b/Flow.Launcher/CustomShortcutSetting.xaml.cs
index ba326fb9e..183cc3a7f 100644
--- a/Flow.Launcher/CustomShortcutSetting.xaml.cs
+++ b/Flow.Launcher/CustomShortcutSetting.xaml.cs
@@ -1,7 +1,6 @@
-using System;
-using System.ComponentModel;
-using System.Windows;
+using System.Windows;
using System.Windows.Input;
+using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.SettingPages.ViewModels;
@@ -9,33 +8,15 @@ namespace Flow.Launcher
{
public partial class CustomShortcutSetting : Window
{
- private static readonly Settings _settings = Ioc.Default.GetRequiredService();
+ public Settings Settings { get; set; } = Ioc.Default.GetRequiredService();
private readonly SettingsPaneHotkeyViewModel _hotkeyVm;
- public string Key { get; set; } = String.Empty;
- public string Value { get; set; } = String.Empty;
+ public string Key { get; set; } = string.Empty;
+ public string Value { get; set; } = string.Empty;
private string originalKey { get; } = null;
private string originalValue { get; } = null;
private bool update { get; } = false;
- public event PropertyChangedEventHandler PropertyChanged;
-
- public string SettingWindowFont
- {
- get => _settings.SettingWindowFont;
- set
- {
- if (_settings.SettingWindowFont != value)
- {
- _settings.SettingWindowFont = value;
- OnPropertyChanged(nameof(SettingWindowFont));
- }
- }
- }
-
- protected virtual void OnPropertyChanged(string propertyName)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
+
public CustomShortcutSetting(SettingsPaneHotkeyViewModel vm)
{
_hotkeyVm = vm;
diff --git a/Flow.Launcher/SelectBrowserWindow.xaml b/Flow.Launcher/SelectBrowserWindow.xaml
index b16de2770..4fc5a91c5 100644
--- a/Flow.Launcher/SelectBrowserWindow.xaml
+++ b/Flow.Launcher/SelectBrowserWindow.xaml
@@ -10,7 +10,7 @@
Width="550"
Background="{DynamicResource PopuBGColor}"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
- FontFamily="{Binding SettingWindowFont, Mode=TwoWay}"
+ FontFamily="{Binding Settings.SettingWindowFont, Mode=TwoWay}"
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
SizeToContent="Height"
diff --git a/Flow.Launcher/SelectBrowserWindow.xaml.cs b/Flow.Launcher/SelectBrowserWindow.xaml.cs
index e8365819b..849056ab1 100644
--- a/Flow.Launcher/SelectBrowserWindow.xaml.cs
+++ b/Flow.Launcher/SelectBrowserWindow.xaml.cs
@@ -1,42 +1,25 @@
-using Flow.Launcher.Infrastructure.UserSettings;
-using System;
-using System.Collections.ObjectModel;
-using System.ComponentModel;
+using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
+using CommunityToolkit.Mvvm.ComponentModel;
+using Flow.Launcher.Infrastructure.UserSettings;
namespace Flow.Launcher
{
- public partial class SelectBrowserWindow : Window, INotifyPropertyChanged
+ [INotifyPropertyChanged]
+ public partial class SelectBrowserWindow : Window
{
+ public Settings Settings { get; }
+
private int selectedCustomBrowserIndex;
- public event PropertyChangedEventHandler PropertyChanged;
-
- public Settings Settings { get; }
- public string SettingWindowFont
- {
- get => Settings.SettingWindowFont;
- set
- {
- if (Settings.SettingWindowFont != value)
- {
- Settings.SettingWindowFont = value;
- OnPropertyChanged(nameof(SettingWindowFont));
- }
- }
- }
- protected virtual void OnPropertyChanged(string propertyName)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
public int SelectedCustomBrowserIndex
{
get => selectedCustomBrowserIndex; set
{
selectedCustomBrowserIndex = value;
- PropertyChanged?.Invoke(this, new(nameof(CustomBrowser)));
+ OnPropertyChanged(nameof(CustomBrowser));
}
}
public ObservableCollection CustomBrowsers { get; set; }
@@ -79,8 +62,7 @@ namespace Flow.Launcher
private void btnBrowseFile_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
- Nullable result = dlg.ShowDialog();
-
+ var result = dlg.ShowDialog();
if (result == true)
{
TextBox path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml b/Flow.Launcher/SelectFileManagerWindow.xaml
index bfe6914e5..7d1fe0f56 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml
@@ -10,7 +10,7 @@
Width="600"
Background="{DynamicResource PopuBGColor}"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
- FontFamily="{Binding SettingWindowFont, Mode=TwoWay}"
+ FontFamily="{Binding Settings.SettingWindowFont, Mode=TwoWay}"
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
SizeToContent="Height"
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml.cs b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
index 80c0cf1f6..946052e32 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml.cs
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
@@ -1,44 +1,27 @@
-using Flow.Launcher.Infrastructure.UserSettings;
-using Flow.Launcher.ViewModel;
-using System;
-using System.Collections.ObjectModel;
+using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
+using CommunityToolkit.Mvvm.ComponentModel;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.ViewModel;
namespace Flow.Launcher
{
- public partial class SelectFileManagerWindow : Window, INotifyPropertyChanged
+ [INotifyPropertyChanged]
+ public partial class SelectFileManagerWindow : Window
{
- private int selectedCustomExplorerIndex;
-
- public event PropertyChangedEventHandler PropertyChanged;
-
public Settings Settings { get; }
- public string SettingWindowFont
- {
- get => Settings.SettingWindowFont;
- set
- {
- if (Settings.SettingWindowFont != value)
- {
- Settings.SettingWindowFont = value;
- OnPropertyChanged(nameof(SettingWindowFont));
- }
- }
- }
- protected virtual void OnPropertyChanged(string propertyName)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
+ private int selectedCustomExplorerIndex;
+
public int SelectedCustomExplorerIndex
{
get => selectedCustomExplorerIndex; set
{
selectedCustomExplorerIndex = value;
- PropertyChanged?.Invoke(this, new(nameof(CustomExplorer)));
+ OnPropertyChanged(nameof(CustomExplorer));
}
}
public ObservableCollection CustomExplorers { get; set; }
@@ -81,8 +64,7 @@ namespace Flow.Launcher
private void btnBrowseFile_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
- Nullable result = dlg.ShowDialog();
-
+ var result = dlg.ShowDialog();
if (result == true)
{
TextBox path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml
index 44a0490ca..4bf5df227 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml
@@ -160,8 +160,7 @@
DisplayMemberPath="Source"
ItemsSource="{Binding Source={StaticResource SortedFonts}}"
SelectedValue="{Binding SettingWindowFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
- SelectedValuePath="Source"
- SelectionChanged="SettingWindowFontComboBox_SelectionChanged" />
+ SelectedValuePath="Source" />
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs
index cedc19633..1ecc02aa6 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs
@@ -1,7 +1,4 @@
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Media;
-using System.Windows.Navigation;
+using System.Windows.Navigation;
using Flow.Launcher.Core;
using Flow.Launcher.SettingPages.ViewModels;
using Flow.Launcher.Infrastructure.UserSettings;
@@ -31,21 +28,4 @@ public partial class SettingsPaneAbout
App.API.OpenUrl(e.Uri.AbsoluteUri);
e.Handled = true;
}
-
- private void SettingWindowFontComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- if (sender is ComboBox comboBox && comboBox.SelectedItem is FontFamily selectedFont)
- {
- if (DataContext is SettingsPaneAboutViewModel viewModel)
- {
- viewModel.SettingWindowFont = selectedFont.Source;
-
- // 설정 창 글꼴 즉시 업데이트
- if (Window.GetWindow(this) is SettingWindow settingWindow)
- {
- settingWindow.FontFamily = selectedFont;
- }
- }
- }
- }
}
diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml
index f2cf9fab2..a34777d30 100644
--- a/Flow.Launcher/SettingWindow.xaml
+++ b/Flow.Launcher/SettingWindow.xaml
@@ -13,7 +13,7 @@
MinHeight="600"
d:DataContext="{d:DesignInstance vm:SettingWindowViewModel}"
Closed="OnClosed"
- FontFamily="{Binding SettingWindowFont, Mode=TwoWay}"
+ FontFamily="{Binding Settings.SettingWindowFont, Mode=TwoWay}"
Icon="Images\app.ico"
Left="{Binding SettingWindowLeft, Mode=TwoWay}"
Loaded="OnLoaded"
diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
index 4468b7865..19edba4d9 100644
--- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
+++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
@@ -1,17 +1,15 @@
-using System.ComponentModel;
-using System.Windows.Media;
-using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
namespace Flow.Launcher.ViewModel;
public partial class SettingWindowViewModel : BaseModel
{
- private readonly Settings _settings;
+ public Settings Settings { get; set; }
public SettingWindowViewModel(Settings settings)
{
- _settings = settings;
+ Settings = settings;
}
///
@@ -19,44 +17,30 @@ public partial class SettingWindowViewModel : BaseModel
///
public void Save()
{
- _settings.Save();
+ Settings.Save();
}
public double SettingWindowWidth
{
- get => _settings.SettingWindowWidth;
- set => _settings.SettingWindowWidth = value;
+ get => Settings.SettingWindowWidth;
+ set => Settings.SettingWindowWidth = value;
}
public double SettingWindowHeight
{
- get => _settings.SettingWindowHeight;
- set => _settings.SettingWindowHeight = value;
+ get => Settings.SettingWindowHeight;
+ set => Settings.SettingWindowHeight = value;
}
public double? SettingWindowTop
{
- get => _settings.SettingWindowTop;
- set => _settings.SettingWindowTop = value;
+ get => Settings.SettingWindowTop;
+ set => Settings.SettingWindowTop = value;
}
public double? SettingWindowLeft
{
- get => _settings.SettingWindowLeft;
- set => _settings.SettingWindowLeft = value;
+ get => Settings.SettingWindowLeft;
+ set => Settings.SettingWindowLeft = value;
}
-
- public string SettingWindowFont
- {
- get => _settings.SettingWindowFont;
- set
- {
- if (_settings.SettingWindowFont != value)
- {
- _settings.SettingWindowFont = value;
- OnPropertyChanged(nameof(SettingWindowFont));
- }
- }
- }
-
}
From f4f8e9af5247c2004e6771236784ebe2e5e13b61 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Apr 2025 12:49:36 +0800
Subject: [PATCH 0943/1798] Make settings readonly
---
Flow.Launcher/CustomQueryHotkeySetting.xaml.cs | 2 +-
Flow.Launcher/CustomShortcutSetting.xaml.cs | 2 +-
Flow.Launcher/ViewModel/SettingWindowViewModel.cs | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
index 3c501d41a..cc07caaa2 100644
--- a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
+++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
@@ -10,7 +10,7 @@ namespace Flow.Launcher
{
public partial class CustomQueryHotkeySetting : Window
{
- public Settings Settings { get; set; }
+ public Settings Settings { get; }
private bool update;
private CustomPluginHotkey updateCustomHotkey;
diff --git a/Flow.Launcher/CustomShortcutSetting.xaml.cs b/Flow.Launcher/CustomShortcutSetting.xaml.cs
index 183cc3a7f..fcee0c961 100644
--- a/Flow.Launcher/CustomShortcutSetting.xaml.cs
+++ b/Flow.Launcher/CustomShortcutSetting.xaml.cs
@@ -8,7 +8,7 @@ namespace Flow.Launcher
{
public partial class CustomShortcutSetting : Window
{
- public Settings Settings { get; set; } = Ioc.Default.GetRequiredService();
+ public Settings Settings { get; } = Ioc.Default.GetRequiredService();
private readonly SettingsPaneHotkeyViewModel _hotkeyVm;
public string Key { get; set; } = string.Empty;
diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
index 19edba4d9..f05893cf4 100644
--- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
+++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
@@ -5,7 +5,7 @@ namespace Flow.Launcher.ViewModel;
public partial class SettingWindowViewModel : BaseModel
{
- public Settings Settings { get; set; }
+ public Settings Settings { get; }
public SettingWindowViewModel(Settings settings)
{
From f79ef493b8eab23ce66cb7f25e68c76836ddd149 Mon Sep 17 00:00:00 2001
From: DB p
Date: Wed, 23 Apr 2025 13:58:01 +0900
Subject: [PATCH 0944/1798] Remove background setter for disabled state and add
placeholder color for NumberBox
---
Flow.Launcher/Resources/CustomControlTemplate.xaml | 1 -
Flow.Launcher/Resources/Dark.xaml | 1 +
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Resources/CustomControlTemplate.xaml b/Flow.Launcher/Resources/CustomControlTemplate.xaml
index ef85e8724..251d74c14 100644
--- a/Flow.Launcher/Resources/CustomControlTemplate.xaml
+++ b/Flow.Launcher/Resources/CustomControlTemplate.xaml
@@ -2802,7 +2802,6 @@
-
diff --git a/Flow.Launcher/Resources/Dark.xaml b/Flow.Launcher/Resources/Dark.xaml
index 1ec01f8d1..3fd66d623 100644
--- a/Flow.Launcher/Resources/Dark.xaml
+++ b/Flow.Launcher/Resources/Dark.xaml
@@ -107,6 +107,7 @@
#f5f5f5#464646#ffffff
+ #272727
From f50f2ff27c1aedd064e2b213adee24d4b485df30 Mon Sep 17 00:00:00 2001
From: DB p
Date: Thu, 24 Apr 2025 10:18:38 +0900
Subject: [PATCH 0945/1798] Implement dynamic font settings for the setting
window
---
.../UserSettings/Settings.cs | 2 ++
Flow.Launcher/CustomQueryHotkeySetting.xaml | 1 -
Flow.Launcher/CustomShortcutSetting.xaml | 1 -
Flow.Launcher/Languages/en.xaml | 2 +-
Flow.Launcher/Resources/CustomControlTemplate.xaml | 14 ++++++++++++++
Flow.Launcher/Resources/SettingWindowStyle.xaml | 1 +
Flow.Launcher/SelectBrowserWindow.xaml | 1 -
Flow.Launcher/SelectFileManagerWindow.xaml | 1 -
.../SettingPages/Views/SettingsPaneAbout.xaml | 8 +++-----
.../SettingPages/Views/SettingsPanePlugins.xaml | 6 +++---
Flow.Launcher/SettingWindow.xaml | 1 -
Flow.Launcher/WelcomeWindow.xaml | 14 ++++++--------
12 files changed, 30 insertions(+), 22 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 0f878151e..ca015fd70 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -2,6 +2,7 @@
using System.Collections.ObjectModel;
using System.Text.Json.Serialization;
using System.Windows;
+using System.Windows.Media;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Infrastructure.Logger;
@@ -113,6 +114,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
{
_settingWindowFont = value;
OnPropertyChanged();
+ Application.Current.Resources["SettingWindowFont"] = new FontFamily(value);
}
}
}
diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml b/Flow.Launcher/CustomQueryHotkeySetting.xaml
index d3c31c6da..0171e6d79 100644
--- a/Flow.Launcher/CustomQueryHotkeySetting.xaml
+++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml
@@ -8,7 +8,6 @@
Width="530"
Background="{DynamicResource PopuBGColor}"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
- FontFamily="{Binding Settings.SettingWindowFont, Mode=TwoWay}"
Foreground="{DynamicResource PopupTextColor}"
Icon="Images\app.png"
MouseDown="window_MouseDown"
diff --git a/Flow.Launcher/CustomShortcutSetting.xaml b/Flow.Launcher/CustomShortcutSetting.xaml
index cbdcecea6..d8623753f 100644
--- a/Flow.Launcher/CustomShortcutSetting.xaml
+++ b/Flow.Launcher/CustomShortcutSetting.xaml
@@ -7,7 +7,6 @@
Width="530"
Background="{DynamicResource PopuBGColor}"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
- FontFamily="{Binding Settings.SettingWindowFont, Mode=TwoWay}"
Foreground="{DynamicResource PopupTextColor}"
Icon="Images\app.png"
ResizeMode="NoResize"
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 04a26f09c..72897521b 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -355,7 +355,7 @@
Log LevelDebugInfo
- Setting Window Font
+ Setting Window FontSelect File Manager
diff --git a/Flow.Launcher/Resources/CustomControlTemplate.xaml b/Flow.Launcher/Resources/CustomControlTemplate.xaml
index ef85e8724..be68fc1b1 100644
--- a/Flow.Launcher/Resources/CustomControlTemplate.xaml
+++ b/Flow.Launcher/Resources/CustomControlTemplate.xaml
@@ -4,6 +4,20 @@
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:ui="http://schemas.modernwpf.com/2019">
+
+
+
+
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml
index f5017ced5..80b004ff9 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml
@@ -60,17 +60,17 @@
-
-
+
+
-
+
@@ -86,23 +86,23 @@
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="2"
- Margin="5,0,0,20">
+ Margin="5 0 0 20">
@@ -180,18 +180,18 @@
Grid.Row="1"
Background="{DynamicResource PopupButtonAreaBGColor}"
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
- BorderThickness="0,1,0,0">
+ BorderThickness="0 1 0 0">
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml
index 37a7ccb8d..ae0f91d93 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml
@@ -57,20 +57,20 @@
-
-
+
+
-
+
-
+
+ BorderThickness="0 1 0 0">
diff --git a/Plugins/Flow.Launcher.Plugin.Program/AddProgramSource.xaml b/Plugins/Flow.Launcher.Plugin.Program/AddProgramSource.xaml
index 9848f51cf..26efc6813 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/AddProgramSource.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/AddProgramSource.xaml
@@ -5,21 +5,21 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:Flow.Launcher.Plugin.Program.ViewModels"
- mc:Ignorable="d"
Title="{DynamicResource flowlauncher_plugin_program_directory}"
- d:DataContext="{d:DesignInstance vm:AddProgramSourceViewModel}"
Width="Auto"
Height="276"
+ d:DataContext="{d:DesignInstance vm:AddProgramSourceViewModel}"
Background="{DynamicResource PopuBGColor}"
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
SizeToContent="Width"
- WindowStartupLocation="CenterScreen">
+ WindowStartupLocation="CenterScreen"
+ mc:Ignorable="d">
-
+
@@ -59,11 +59,11 @@
-
-
+
+
-
+
@@ -104,16 +104,16 @@
HorizontalAlignment="Stretch"
Click="BrowseButton_Click"
Content="{DynamicResource flowlauncher_plugin_program_browse}"
- Visibility="{Binding IsCustomSource, Converter={StaticResource BooleanToVisibilityConverter}}"
- DockPanel.Dock="Right" />
+ DockPanel.Dock="Right"
+ Visibility="{Binding IsCustomSource, Converter={StaticResource BooleanToVisibilityConverter}}" />
+ VerticalAlignment="Center"
+ IsReadOnly="{Binding IsNotCustomSource}"
+ Text="{Binding Location, Mode=TwoWay}" />
+ Margin="10 0"
+ VerticalAlignment="Center"
+ IsChecked="{Binding Enabled, Mode=TwoWay}" />
+ BorderThickness="0 1 0 0">
diff --git a/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml b/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml
index 71bc12a86..53baa79a3 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/ProgramSuffixes.xaml
@@ -46,8 +46,8 @@
-
-
+
+
@@ -65,8 +65,8 @@
-
-
+
+
@@ -120,20 +120,20 @@
-
+
-
+
@@ -151,82 +151,82 @@
TextWrapping="Wrap" />
-
+
-
+
appref-ms
exe
lnk
+ BorderThickness="1 0 0 0">
@@ -237,27 +237,27 @@
Grid.Row="1"
Background="{DynamicResource PopupButtonAreaBGColor}"
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
- BorderThickness="0,1,0,0">
+ BorderThickness="0 1 0 0">
Date: Thu, 24 Apr 2025 19:48:42 +0800
Subject: [PATCH 0952/1798] Improve code quality
---
.../CustomQueryHotkeySetting.xaml.cs | 10 +--
Flow.Launcher/CustomShortcutSetting.xaml.cs | 4 --
.../Resources/Controls/HotkeyDisplay.xaml.cs | 9 +--
.../Resources/Pages/WelcomePage1.xaml.cs | 20 ++++--
.../Resources/Pages/WelcomePage2.xaml.cs | 24 ++++---
.../Resources/Pages/WelcomePage3.xaml.cs | 16 +++--
.../Resources/Pages/WelcomePage4.xaml.cs | 20 ++++--
.../Resources/Pages/WelcomePage5.xaml.cs | 67 ++++++++++++-------
Flow.Launcher/SelectBrowserWindow.xaml.cs | 15 +++--
Flow.Launcher/SelectFileManagerWindow.xaml.cs | 15 +++--
.../SettingsPaneGeneralViewModel.cs | 3 +-
.../SettingsPanePluginStoreViewModel.cs | 1 -
12 files changed, 121 insertions(+), 83 deletions(-)
diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
index cc07caaa2..77febde9d 100644
--- a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
+++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs
@@ -10,14 +10,14 @@ namespace Flow.Launcher
{
public partial class CustomQueryHotkeySetting : Window
{
- public Settings Settings { get; }
+ private readonly Settings _settings;
private bool update;
private CustomPluginHotkey updateCustomHotkey;
public CustomQueryHotkeySetting(Settings settings)
{
- Settings = settings;
+ _settings = settings;
InitializeComponent();
}
@@ -30,13 +30,13 @@ namespace Flow.Launcher
{
if (!update)
{
- Settings.CustomPluginHotkeys ??= new ObservableCollection();
+ _settings.CustomPluginHotkeys ??= new ObservableCollection();
var pluginHotkey = new CustomPluginHotkey
{
Hotkey = HotkeyControl.CurrentHotkey.ToString(), ActionKeyword = tbAction.Text
};
- Settings.CustomPluginHotkeys.Add(pluginHotkey);
+ _settings.CustomPluginHotkeys.Add(pluginHotkey);
HotKeyMapper.SetCustomQueryHotkey(pluginHotkey);
}
@@ -55,7 +55,7 @@ namespace Flow.Launcher
public void UpdateItem(CustomPluginHotkey item)
{
- updateCustomHotkey = Settings.CustomPluginHotkeys.FirstOrDefault(o =>
+ updateCustomHotkey = _settings.CustomPluginHotkeys.FirstOrDefault(o =>
o.ActionKeyword == item.ActionKeyword && o.Hotkey == item.Hotkey);
if (updateCustomHotkey == null)
{
diff --git a/Flow.Launcher/CustomShortcutSetting.xaml.cs b/Flow.Launcher/CustomShortcutSetting.xaml.cs
index fcee0c961..e180f6570 100644
--- a/Flow.Launcher/CustomShortcutSetting.xaml.cs
+++ b/Flow.Launcher/CustomShortcutSetting.xaml.cs
@@ -1,15 +1,11 @@
using System.Windows;
using System.Windows.Input;
-using CommunityToolkit.Mvvm.DependencyInjection;
-using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.SettingPages.ViewModels;
namespace Flow.Launcher
{
public partial class CustomShortcutSetting : Window
{
- public Settings Settings { get; } = Ioc.Default.GetRequiredService();
-
private readonly SettingsPaneHotkeyViewModel _hotkeyVm;
public string Key { get; set; } = string.Empty;
public string Value { get; set; } = string.Empty;
diff --git a/Flow.Launcher/Resources/Controls/HotkeyDisplay.xaml.cs b/Flow.Launcher/Resources/Controls/HotkeyDisplay.xaml.cs
index 9b19ffd86..bc167184b 100644
--- a/Flow.Launcher/Resources/Controls/HotkeyDisplay.xaml.cs
+++ b/Flow.Launcher/Resources/Controls/HotkeyDisplay.xaml.cs
@@ -42,14 +42,11 @@ namespace Flow.Launcher.Resources.Controls
private static void keyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
- var control = d as UserControl;
- if (null == control) return; // This should not be possible
+ if (d is not UserControl) return; // This should not be possible
- var newValue = e.NewValue as string;
- if (null == newValue) return;
+ if (e.NewValue is not string newValue) return;
- if (d is not HotkeyDisplay hotkeyDisplay)
- return;
+ if (d is not HotkeyDisplay hotkeyDisplay) return;
hotkeyDisplay.Values.Clear();
foreach (var key in newValue.Split('+'))
diff --git a/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs
index 64f52edff..a3b008206 100644
--- a/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs
+++ b/Flow.Launcher/Resources/Pages/WelcomePage1.xaml.cs
@@ -1,29 +1,35 @@
using System.Collections.Generic;
using System.Windows.Navigation;
-using Flow.Launcher.Infrastructure.UserSettings;
-using Flow.Launcher.Core.Resource;
using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.Core.Resource;
+using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.ViewModel;
namespace Flow.Launcher.Resources.Pages
{
public partial class WelcomePage1
{
+ public Settings Settings { get; private set; }
+ private WelcomeViewModel _viewModel;
+
protected override void OnNavigatedTo(NavigationEventArgs e)
{
- Settings = Ioc.Default.GetRequiredService();
+ if (!IsInitialized)
+ {
+ Settings = Ioc.Default.GetRequiredService();
+ _viewModel = Ioc.Default.GetRequiredService();
+ InitializeComponent();
+ }
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page number
- Ioc.Default.GetRequiredService().PageNum = 1;
- InitializeComponent();
+ _viewModel.PageNum = 1;
+ base.OnNavigatedTo(e);
}
private readonly Internationalization _translater = Ioc.Default.GetRequiredService();
public List Languages => _translater.LoadAvailableLanguages();
- public Settings Settings { get; set; }
-
public string CustomLanguage
{
get
diff --git a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs
index 786b4d506..a63edbcda 100644
--- a/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs
+++ b/Flow.Launcher/Resources/Pages/WelcomePage2.xaml.cs
@@ -1,25 +1,31 @@
-using Flow.Launcher.Helper;
-using Flow.Launcher.Infrastructure.Hotkey;
-using Flow.Launcher.Infrastructure.UserSettings;
+using System.Windows.Media;
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.Input;
-using Flow.Launcher.ViewModel;
-using System.Windows.Media;
using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.Helper;
+using Flow.Launcher.Infrastructure.Hotkey;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.ViewModel;
namespace Flow.Launcher.Resources.Pages
{
public partial class WelcomePage2
{
- public Settings Settings { get; set; }
+ public Settings Settings { get; private set; }
+ private WelcomeViewModel _viewModel;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
- Settings = Ioc.Default.GetRequiredService();
+ if (!IsInitialized)
+ {
+ Settings = Ioc.Default.GetRequiredService();
+ _viewModel = Ioc.Default.GetRequiredService();
+ InitializeComponent();
+ }
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page number
- Ioc.Default.GetRequiredService().PageNum = 2;
- InitializeComponent();
+ _viewModel.PageNum = 2;
+ base.OnNavigatedTo(e);
}
[RelayCommand]
diff --git a/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs
index f59b65c1c..4a6610e61 100644
--- a/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs
+++ b/Flow.Launcher/Resources/Pages/WelcomePage3.xaml.cs
@@ -7,15 +7,21 @@ namespace Flow.Launcher.Resources.Pages
{
public partial class WelcomePage3
{
+ public Settings Settings { get; private set; }
+ private WelcomeViewModel _viewModel;
+
protected override void OnNavigatedTo(NavigationEventArgs e)
{
- Settings = Ioc.Default.GetRequiredService();
+ if (!IsInitialized)
+ {
+ Settings = Ioc.Default.GetRequiredService();
+ _viewModel = Ioc.Default.GetRequiredService();
+ InitializeComponent();
+ }
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page number
- Ioc.Default.GetRequiredService().PageNum = 3;
- InitializeComponent();
+ _viewModel.PageNum = 3;
+ base.OnNavigatedTo(e);
}
-
- public Settings Settings { get; set; }
}
}
diff --git a/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs
index 4c83f3a83..1ee3284d2 100644
--- a/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs
+++ b/Flow.Launcher/Resources/Pages/WelcomePage4.xaml.cs
@@ -1,21 +1,27 @@
-using CommunityToolkit.Mvvm.DependencyInjection;
+using System.Windows.Navigation;
+using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.ViewModel;
-using System.Windows.Navigation;
namespace Flow.Launcher.Resources.Pages
{
public partial class WelcomePage4
{
+ public Settings Settings { get; private set; }
+ private WelcomeViewModel _viewModel;
+
protected override void OnNavigatedTo(NavigationEventArgs e)
{
- Settings = Ioc.Default.GetRequiredService();
+ if (!IsInitialized)
+ {
+ Settings = Ioc.Default.GetRequiredService();
+ _viewModel = Ioc.Default.GetRequiredService();
+ InitializeComponent();
+ }
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page number
- Ioc.Default.GetRequiredService().PageNum = 4;
- InitializeComponent();
+ _viewModel.PageNum = 4;
+ base.OnNavigatedTo(e);
}
-
- public Settings Settings { get; set; }
}
}
diff --git a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs
index 95d7ff1a0..6328c9914 100644
--- a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs
+++ b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs
@@ -1,54 +1,74 @@
-using System.Windows;
+using System;
+using System.Windows;
using System.Windows.Navigation;
-using Flow.Launcher.Infrastructure.UserSettings;
-using Microsoft.Win32;
-using Flow.Launcher.Infrastructure;
using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.Helper;
+using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.ViewModel;
namespace Flow.Launcher.Resources.Pages
{
public partial class WelcomePage5
{
- private const string StartupPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
- public Settings Settings { get; set; }
- public bool HideOnStartup { get; set; }
+ public Settings Settings { get; private set; }
+ private WelcomeViewModel _viewModel;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
- Settings = Ioc.Default.GetRequiredService();
+ if (!IsInitialized)
+ {
+ Settings = Ioc.Default.GetRequiredService();
+ _viewModel = Ioc.Default.GetRequiredService();
+ InitializeComponent();
+ }
// Sometimes the navigation is not triggered by button click,
// so we need to reset the page number
- Ioc.Default.GetRequiredService().PageNum = 5;
- InitializeComponent();
+ _viewModel.PageNum = 5;
+ base.OnNavigatedTo(e);
}
private void OnAutoStartupChecked(object sender, RoutedEventArgs e)
{
- SetStartup();
- }
- private void OnAutoStartupUncheck(object sender, RoutedEventArgs e)
- {
- RemoveStartup();
+ ChangeAutoStartup(true);
}
- private void RemoveStartup()
+ private void OnAutoStartupUncheck(object sender, RoutedEventArgs e)
{
- using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
- key?.DeleteValue(Constant.FlowLauncher, false);
- Settings.StartFlowLauncherOnSystemStartup = false;
+ ChangeAutoStartup(false);
}
- private void SetStartup()
+
+ private void ChangeAutoStartup(bool value)
{
- using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
- key?.SetValue(Constant.FlowLauncher, Constant.ExecutablePath);
- Settings.StartFlowLauncherOnSystemStartup = true;
+ Settings.StartFlowLauncherOnSystemStartup = value;
+ try
+ {
+ if (value)
+ {
+ if (Settings.UseLogonTaskForStartup)
+ {
+ AutoStartup.ChangeToViaLogonTask();
+ }
+ else
+ {
+ AutoStartup.ChangeToViaRegistry();
+ }
+ }
+ else
+ {
+ AutoStartup.DisableViaLogonTaskAndRegistry();
+ }
+ }
+ catch (Exception e)
+ {
+ App.API.ShowMsg(App.API.GetTranslation("setAutoStartFailed"), e.Message);
+ }
}
private void OnHideOnStartupChecked(object sender, RoutedEventArgs e)
{
Settings.HideOnStartup = true;
}
+
private void OnHideOnStartupUnchecked(object sender, RoutedEventArgs e)
{
Settings.HideOnStartup = false;
@@ -59,6 +79,5 @@ namespace Flow.Launcher.Resources.Pages
var window = Window.GetWindow(this);
window.Close();
}
-
}
}
diff --git a/Flow.Launcher/SelectBrowserWindow.xaml.cs b/Flow.Launcher/SelectBrowserWindow.xaml.cs
index 849056ab1..bea5b4352 100644
--- a/Flow.Launcher/SelectBrowserWindow.xaml.cs
+++ b/Flow.Launcher/SelectBrowserWindow.xaml.cs
@@ -10,13 +10,14 @@ namespace Flow.Launcher
[INotifyPropertyChanged]
public partial class SelectBrowserWindow : Window
{
- public Settings Settings { get; }
+ private readonly Settings _settings;
private int selectedCustomBrowserIndex;
public int SelectedCustomBrowserIndex
{
- get => selectedCustomBrowserIndex; set
+ get => selectedCustomBrowserIndex;
+ set
{
selectedCustomBrowserIndex = value;
OnPropertyChanged(nameof(CustomBrowser));
@@ -27,9 +28,9 @@ namespace Flow.Launcher
public CustomBrowserViewModel CustomBrowser => CustomBrowsers[SelectedCustomBrowserIndex];
public SelectBrowserWindow(Settings settings)
{
- Settings = settings;
- CustomBrowsers = new ObservableCollection(Settings.CustomBrowserList.Select(x => x.Copy()));
- SelectedCustomBrowserIndex = Settings.CustomBrowserIndex;
+ _settings = settings;
+ CustomBrowsers = new ObservableCollection(_settings.CustomBrowserList.Select(x => x.Copy()));
+ SelectedCustomBrowserIndex = _settings.CustomBrowserIndex;
InitializeComponent();
}
@@ -40,8 +41,8 @@ namespace Flow.Launcher
private void btnDone_Click(object sender, RoutedEventArgs e)
{
- Settings.CustomBrowserList = CustomBrowsers.ToList();
- Settings.CustomBrowserIndex = SelectedCustomBrowserIndex;
+ _settings.CustomBrowserList = CustomBrowsers.ToList();
+ _settings.CustomBrowserIndex = SelectedCustomBrowserIndex;
Close();
}
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml.cs b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
index 946052e32..bf94ddacb 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml.cs
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
@@ -12,13 +12,14 @@ namespace Flow.Launcher
[INotifyPropertyChanged]
public partial class SelectFileManagerWindow : Window
{
- public Settings Settings { get; }
+ private readonly Settings _settings;
private int selectedCustomExplorerIndex;
public int SelectedCustomExplorerIndex
{
- get => selectedCustomExplorerIndex; set
+ get => selectedCustomExplorerIndex;
+ set
{
selectedCustomExplorerIndex = value;
OnPropertyChanged(nameof(CustomExplorer));
@@ -29,9 +30,9 @@ namespace Flow.Launcher
public CustomExplorerViewModel CustomExplorer => CustomExplorers[SelectedCustomExplorerIndex];
public SelectFileManagerWindow(Settings settings)
{
- Settings = settings;
- CustomExplorers = new ObservableCollection(Settings.CustomExplorerList.Select(x => x.Copy()));
- SelectedCustomExplorerIndex = Settings.CustomExplorerIndex;
+ _settings = settings;
+ CustomExplorers = new ObservableCollection(_settings.CustomExplorerList.Select(x => x.Copy()));
+ SelectedCustomExplorerIndex = _settings.CustomExplorerIndex;
InitializeComponent();
}
@@ -42,8 +43,8 @@ namespace Flow.Launcher
private void btnDone_Click(object sender, RoutedEventArgs e)
{
- Settings.CustomExplorerList = CustomExplorers.ToList();
- Settings.CustomExplorerIndex = SelectedCustomExplorerIndex;
+ _settings.CustomExplorerList = CustomExplorers.ToList();
+ _settings.CustomExplorerIndex = SelectedCustomExplorerIndex;
Close();
}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
index 6b56caf5e..c8b83c730 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
@@ -17,6 +17,7 @@ namespace Flow.Launcher.SettingPages.ViewModels;
public partial class SettingsPaneGeneralViewModel : BaseModel
{
public Settings Settings { get; }
+
private readonly Updater _updater;
private readonly IPortable _portable;
private readonly Internationalization _translater;
@@ -78,7 +79,7 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
{
try
{
- if (UseLogonTaskForStartup)
+ if (value)
{
AutoStartup.ChangeToViaLogonTask();
}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
index fd2c8e09f..68c69f841 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
@@ -2,7 +2,6 @@
using System.Linq;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Input;
-using Flow.Launcher.Infrastructure;
using Flow.Launcher.Plugin;
using Flow.Launcher.ViewModel;
From 94ff72c8f27d48201bc195ef32bdf801ddeb4d13 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 19:49:03 +0800
Subject: [PATCH 0953/1798] Check startup only for Release
---
Flow.Launcher/App.xaml.cs | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 6a7b892be..ba0f4e5ed 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -201,6 +201,10 @@ namespace Flow.Launcher
#pragma warning restore VSTHRD100 // Avoid async void methods
+ ///
+ /// Check startup only for Release
+ ///
+ [Conditional("RELEASE")]
private void AutoStartup()
{
// we try to enable auto-startup on first launch, or reenable if it was removed
From 4df9c04702062a177a517bd1328ff547eb03a06b Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 19:49:34 +0800
Subject: [PATCH 0954/1798] Update dynamic resource earilier
---
Flow.Launcher/App.xaml.cs | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index ba0f4e5ed..e91676b7b 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -147,6 +147,10 @@ namespace Flow.Launcher
Log.SetLogLevel(_settings.LogLevel);
+ // Update dynamic resources base on settings
+ Current.Resources["SettingWindowFont"] = new FontFamily(_settings.SettingWindowFont);
+ Current.Resources["ContentControlThemeFontFamily"] = new FontFamily(_settings.SettingWindowFont);
+
Ioc.Default.GetRequiredService().PreStartCleanUpAfterPortabilityUpdate();
API.LogInfo(ClassName, "Begin Flow Launcher startup ----------------------------------------------------");
@@ -176,8 +180,6 @@ namespace Flow.Launcher
await imageLoadertask;
_mainWindow = new MainWindow();
- Current.Resources["SettingWindowFont"] = new FontFamily(_settings.SettingWindowFont);
- Current.Resources["ContentControlThemeFontFamily"] = new FontFamily(_settings.SettingWindowFont);
API.LogInfo(ClassName, "Dependencies Info:{ErrorReporting.DependenciesInfo()}");
From 71ab7a69328a904b7cf4d97f5bd526f098e1ad22 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 19:49:58 +0800
Subject: [PATCH 0955/1798] Fix log message & Improve code comments
---
Flow.Launcher/App.xaml.cs | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index e91676b7b..ac134fb5f 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -154,7 +154,7 @@ namespace Flow.Launcher
Ioc.Default.GetRequiredService().PreStartCleanUpAfterPortabilityUpdate();
API.LogInfo(ClassName, "Begin Flow Launcher startup ----------------------------------------------------");
- API.LogInfo(ClassName, "Runtime info:{ErrorReporting.RuntimeInfo()}");
+ API.LogInfo(ClassName, $"Runtime info:{ErrorReporting.RuntimeInfo()}");
RegisterAppDomainExceptions();
RegisterDispatcherUnhandledException();
@@ -174,19 +174,16 @@ namespace Flow.Launcher
await PluginManager.InitializePluginsAsync();
// Change language after all plugins are initialized because we need to update plugin title based on their api
- // TODO: Clean InternationalizationManager.Instance and InternationalizationManager.Instance.GetTranslation in future
await Ioc.Default.GetRequiredService().InitializeLanguageAsync();
await imageLoadertask;
_mainWindow = new MainWindow();
- API.LogInfo(ClassName, "Dependencies Info:{ErrorReporting.DependenciesInfo()}");
-
Current.MainWindow = _mainWindow;
Current.MainWindow.Title = Constant.FlowLauncher;
- // main windows needs initialized before theme change because of blur settings
+ // Main windows needs initialized before theme change because of blur settings
Ioc.Default.GetRequiredService().ChangeTheme();
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
@@ -270,7 +267,7 @@ namespace Flow.Launcher
}
///
- /// let exception throw as normal is better for Debug
+ /// Let exception throw as normal is better for Debug
///
[Conditional("RELEASE")]
private void RegisterDispatcherUnhandledException()
@@ -279,7 +276,7 @@ namespace Flow.Launcher
}
///
- /// let exception throw as normal is better for Debug
+ /// Let exception throw as normal is better for Debug
///
[Conditional("RELEASE")]
private static void RegisterAppDomainExceptions()
@@ -288,7 +285,7 @@ namespace Flow.Launcher
}
///
- /// let exception throw as normal is better for Debug
+ /// Let exception throw as normal is better for Debug
///
[Conditional("RELEASE")]
private static void RegisterTaskSchedulerUnhandledException()
From 89127895d0541d8bab36dc57a1e6b2183980e7b0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 19:50:20 +0800
Subject: [PATCH 0956/1798] Use http client for code quality
---
.../ViewModels/SettingsPaneProxyViewModel.cs | 38 +++++++++----------
1 file changed, 17 insertions(+), 21 deletions(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneProxyViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneProxyViewModel.cs
index 38a6ef31e..6cddee8d8 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneProxyViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneProxyViewModel.cs
@@ -1,4 +1,6 @@
using System.Net;
+using System.Net.Http;
+using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core;
using Flow.Launcher.Infrastructure.UserSettings;
@@ -8,49 +10,43 @@ namespace Flow.Launcher.SettingPages.ViewModels;
public partial class SettingsPaneProxyViewModel : BaseModel
{
- private readonly Updater _updater;
public Settings Settings { get; }
+ private readonly Updater _updater;
+
public SettingsPaneProxyViewModel(Settings settings, Updater updater)
{
- _updater = updater;
Settings = settings;
+ _updater = updater;
}
[RelayCommand]
- private void OnTestProxyClicked()
+ private async Task OnTestProxyClickedAsync()
{
- var message = TestProxy();
+ var message = await TestProxyAsync();
App.API.ShowMsgBox(App.API.GetTranslation(message));
}
- private string TestProxy()
+ private async Task TestProxyAsync()
{
if (string.IsNullOrEmpty(Settings.Proxy.Server)) return "serverCantBeEmpty";
if (Settings.Proxy.Port <= 0) return "portCantBeEmpty";
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_updater.GitHubRepository);
+ var handler = new HttpClientHandler
+ {
+ Proxy = new WebProxy(Settings.Proxy.Server, Settings.Proxy.Port)
+ };
- if (string.IsNullOrEmpty(Settings.Proxy.UserName) || string.IsNullOrEmpty(Settings.Proxy.Password))
+ if (!string.IsNullOrEmpty(Settings.Proxy.UserName) && !string.IsNullOrEmpty(Settings.Proxy.Password))
{
- request.Proxy = new WebProxy(Settings.Proxy.Server, Settings.Proxy.Port);
- }
- else
- {
- request.Proxy = new WebProxy(Settings.Proxy.Server, Settings.Proxy.Port)
- {
- Credentials = new NetworkCredential(Settings.Proxy.UserName, Settings.Proxy.Password)
- };
+ handler.Proxy.Credentials = new NetworkCredential(Settings.Proxy.UserName, Settings.Proxy.Password);
}
+ using var client = new HttpClient(handler);
try
{
- var response = (HttpWebResponse)request.GetResponse();
- return response.StatusCode switch
- {
- HttpStatusCode.OK => "proxyIsCorrect",
- _ => "proxyConnectFailed"
- };
+ var response = await client.GetAsync(_updater.GitHubRepository);
+ return response.IsSuccessStatusCode ? "proxyIsCorrect" : "proxyConnectFailed";
}
catch
{
From 8463304bd4811ed70a13d75b916153b12dd9fed0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 19:56:31 +0800
Subject: [PATCH 0957/1798] Fix clock panel font issue & Improve preview
performance & Improve code quality
---
.../ViewModels/SettingsPaneThemeViewModel.cs | 104 +++++++++---------
.../SettingPages/Views/SettingsPaneTheme.xaml | 4 +-
.../Views/SettingsPaneTheme.xaml.cs | 6 +-
3 files changed, 59 insertions(+), 55 deletions(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
index 1138b2869..d542eb019 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
@@ -6,7 +6,6 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Windows.Media;
-using CommunityToolkit.Mvvm.DependencyInjection;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core.Resource;
using Flow.Launcher.Helper;
@@ -22,10 +21,12 @@ namespace Flow.Launcher.SettingPages.ViewModels;
public partial class SettingsPaneThemeViewModel : BaseModel
{
+ public Settings Settings { get; }
+
+ private readonly Theme _theme;
+
private readonly string DefaultFont = Win32Helper.GetSystemDefaultFont();
public string BackdropSubText => !Win32Helper.IsBackdropSupported() ? App.API.GetTranslation("BackdropTypeDisabledToolTip") : "";
- public Settings Settings { get; }
- private readonly Theme _theme = Ioc.Default.GetRequiredService();
public static string LinkHowToCreateTheme => @"https://www.flowlauncher.com/theme-builder/";
public static string LinkThemeGallery => "https://github.com/Flow-Launcher/Flow.Launcher/discussions/1438";
@@ -289,59 +290,14 @@ public partial class SettingsPaneThemeViewModel : BaseModel
set => Settings.UseDate = value;
}
+ public FontFamily ClockPanelFont { get; }
+
public Brush PreviewBackground
{
get => WallpaperPathRetrieval.GetWallpaperBrush();
}
- public ResultsViewModel PreviewResults
- {
- get
- {
- var results = new List
- {
- new()
- {
- Title = App.API.GetTranslation("SampleTitleExplorer"),
- SubTitle = App.API.GetTranslation("SampleSubTitleExplorer"),
- IcoPath = Path.Combine(
- Constant.ProgramDirectory,
- @"Plugins\Flow.Launcher.Plugin.Explorer\Images\explorer.png"
- )
- },
- new()
- {
- Title = App.API.GetTranslation("SampleTitleWebSearch"),
- SubTitle = App.API.GetTranslation("SampleSubTitleWebSearch"),
- IcoPath = Path.Combine(
- Constant.ProgramDirectory,
- @"Plugins\Flow.Launcher.Plugin.WebSearch\Images\web_search.png"
- )
- },
- new()
- {
- Title = App.API.GetTranslation("SampleTitleProgram"),
- SubTitle = App.API.GetTranslation("SampleSubTitleProgram"),
- IcoPath = Path.Combine(
- Constant.ProgramDirectory,
- @"Plugins\Flow.Launcher.Plugin.Program\Images\program.png"
- )
- },
- new()
- {
- Title = App.API.GetTranslation("SampleTitleProcessKiller"),
- SubTitle = App.API.GetTranslation("SampleSubTitleProcessKiller"),
- IcoPath = Path.Combine(
- Constant.ProgramDirectory,
- @"Plugins\Flow.Launcher.Plugin.ProcessKiller\Images\app.png"
- )
- }
- };
- var vm = new ResultsViewModel(Settings);
- vm.AddResults(results, "PREVIEW");
- return vm;
- }
- }
+ public ResultsViewModel PreviewResults { get; }
public FontFamily SelectedQueryBoxFont
{
@@ -479,9 +435,53 @@ public partial class SettingsPaneThemeViewModel : BaseModel
public string ThemeImage => Constant.QueryTextBoxIconImagePath;
- public SettingsPaneThemeViewModel(Settings settings)
+ public SettingsPaneThemeViewModel(Settings settings, Theme theme)
{
Settings = settings;
+ _theme = theme;
+ ClockPanelFont = new FontFamily(DefaultFont);
+ var results = new List
+ {
+ new()
+ {
+ Title = App.API.GetTranslation("SampleTitleExplorer"),
+ SubTitle = App.API.GetTranslation("SampleSubTitleExplorer"),
+ IcoPath = Path.Combine(
+ Constant.ProgramDirectory,
+ @"Plugins\Flow.Launcher.Plugin.Explorer\Images\explorer.png"
+ )
+ },
+ new()
+ {
+ Title = App.API.GetTranslation("SampleTitleWebSearch"),
+ SubTitle = App.API.GetTranslation("SampleSubTitleWebSearch"),
+ IcoPath = Path.Combine(
+ Constant.ProgramDirectory,
+ @"Plugins\Flow.Launcher.Plugin.WebSearch\Images\web_search.png"
+ )
+ },
+ new()
+ {
+ Title = App.API.GetTranslation("SampleTitleProgram"),
+ SubTitle = App.API.GetTranslation("SampleSubTitleProgram"),
+ IcoPath = Path.Combine(
+ Constant.ProgramDirectory,
+ @"Plugins\Flow.Launcher.Plugin.Program\Images\program.png"
+ )
+ },
+ new()
+ {
+ Title = App.API.GetTranslation("SampleTitleProcessKiller"),
+ SubTitle = App.API.GetTranslation("SampleSubTitleProcessKiller"),
+ IcoPath = Path.Combine(
+ Constant.ProgramDirectory,
+ @"Plugins\Flow.Launcher.Plugin.ProcessKiller\Images\app.png"
+ )
+ }
+ };
+ var vm = new ResultsViewModel(Settings);
+ vm.AddResults(results, "PREVIEW");
+ PreviewResults = vm;
}
[RelayCommand]
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
index f7853515a..4640165f6 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
@@ -331,20 +331,22 @@
IsReadOnly="True"
Style="{DynamicResource QueryBoxStyle}"
Text="{DynamicResource hiThere}" />
-
+
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs
index f4c103ade..a1a0231a5 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs
@@ -1,7 +1,8 @@
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
-using Flow.Launcher.SettingPages.ViewModels;
+using Flow.Launcher.Core.Resource;
using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.SettingPages.ViewModels;
using Page = ModernWpf.Controls.Page;
namespace Flow.Launcher.SettingPages.Views;
@@ -15,7 +16,8 @@ public partial class SettingsPaneTheme : Page
if (!IsInitialized)
{
var settings = Ioc.Default.GetRequiredService();
- _viewModel = new SettingsPaneThemeViewModel(settings);
+ var theme = Ioc.Default.GetRequiredService();
+ _viewModel = new SettingsPaneThemeViewModel(settings, theme);
DataContext = _viewModel;
InitializeComponent();
}
From 82d97fd05af3014eb9acb18092dd86d359b44fdc Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 20:24:02 +0800
Subject: [PATCH 0958/1798] Improve code quality
---
Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index e0a217251..32ee3c043 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -113,7 +113,7 @@ namespace Flow.Launcher.Core.Plugin
// If can parse the default value to bool, use it, otherwise use false
: value is string stringValue && bool.TryParse(stringValue, out var boolValueFromString)
&& boolValueFromString;
- checkBox.Dispatcher.Invoke(() =>checkBox.IsChecked = isChecked);
+ checkBox.Dispatcher.Invoke(() => checkBox.IsChecked = isChecked);
break;
}
}
@@ -154,8 +154,7 @@ namespace Flow.Launcher.Core.Plugin
public Control CreateSettingPanel()
{
- // No need to check if NeedCreateSettingPanel is true because CreateSettingPanel will only be called if it's true
- // if (!NeedCreateSettingPanel()) return null;
+ if (!NeedCreateSettingPanel()) return null;
// Create main grid with two columns (Column 1: Auto, Column 2: *)
var mainPanel = new Grid { Margin = SettingPanelMargin, VerticalAlignment = VerticalAlignment.Center };
From 686d106a0c099b94c066ea180b33298cb708b6d9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 20:52:24 +0800
Subject: [PATCH 0959/1798] Add todo
---
Flow.Launcher.Infrastructure/UserSettings/Settings.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 1cccc38d9..c7a973b2f 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -116,6 +116,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
OnPropertyChanged();
Application.Current.Resources["SettingWindowFont"] = new FontFamily(value);
Application.Current.Resources["ContentControlThemeFontFamily"] = new FontFamily(value);
+ // TODO: Context Menu Font
}
}
}
From 192e2efca1c65a5d0b6c9fa26ab8e8635e48e4c0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 21:40:31 +0800
Subject: [PATCH 0960/1798] Remove property change
---
Flow.Launcher.Infrastructure/UserSettings/Settings.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index c7a973b2f..e623ba400 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -113,7 +113,6 @@ namespace Flow.Launcher.Infrastructure.UserSettings
if (_settingWindowFont != value)
{
_settingWindowFont = value;
- OnPropertyChanged();
Application.Current.Resources["SettingWindowFont"] = new FontFamily(value);
Application.Current.Resources["ContentControlThemeFontFamily"] = new FontFamily(value);
// TODO: Context Menu Font
From 22fb5b1b65f48184364991cbb75ca6f054150e2e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 21:40:40 +0800
Subject: [PATCH 0961/1798] Remove unused binding
---
Flow.Launcher/SettingWindow.xaml | 1 -
1 file changed, 1 deletion(-)
diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml
index a34777d30..ab27b235a 100644
--- a/Flow.Launcher/SettingWindow.xaml
+++ b/Flow.Launcher/SettingWindow.xaml
@@ -13,7 +13,6 @@
MinHeight="600"
d:DataContext="{d:DesignInstance vm:SettingWindowViewModel}"
Closed="OnClosed"
- FontFamily="{Binding Settings.SettingWindowFont, Mode=TwoWay}"
Icon="Images\app.ico"
Left="{Binding SettingWindowLeft, Mode=TwoWay}"
Loaded="OnLoaded"
From cbcebad4d0aecbd879c01bdf34f25fcb881d76eb Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 21:49:50 +0800
Subject: [PATCH 0962/1798] Improve code quality
---
Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index 32ee3c043..003e72a5d 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -154,7 +154,7 @@ namespace Flow.Launcher.Core.Plugin
public Control CreateSettingPanel()
{
- if (!NeedCreateSettingPanel()) return null;
+ if (!NeedCreateSettingPanel()) return null!;
// Create main grid with two columns (Column 1: Auto, Column 2: *)
var mainPanel = new Grid { Margin = SettingPanelMargin, VerticalAlignment = VerticalAlignment.Center };
From 84b0393fd0fd4ef457bce71b457568ca9473d238 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 21:51:14 +0800
Subject: [PATCH 0963/1798] Use dependency injection for setting page view
models
---
Flow.Launcher/App.xaml.cs | 12 +++++++++-
.../SettingsPaneGeneralViewModel.cs | 4 ++--
.../Views/SettingsPaneAbout.xaml.cs | 8 ++-----
.../Views/SettingsPaneGeneral.xaml.cs | 10 +--------
.../Views/SettingsPaneHotkey.xaml.cs | 4 +---
.../Views/SettingsPanePluginStore.xaml.cs | 4 +---
.../Views/SettingsPanePlugins.xaml.cs | 4 +---
.../Views/SettingsPaneProxy.xaml.cs | 7 +-----
.../Views/SettingsPaneTheme.xaml.cs | 10 ++-------
.../ViewModel/SettingWindowViewModel.cs | 22 +++++++++----------
Flow.Launcher/ViewModel/WelcomeViewModel.cs | 2 +-
11 files changed, 34 insertions(+), 53 deletions(-)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index ac134fb5f..20dd50668 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -19,6 +19,7 @@ using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
+using Flow.Launcher.SettingPages.ViewModels;
using Flow.Launcher.ViewModel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
@@ -74,14 +75,23 @@ namespace Flow.Launcher
.AddSingleton(_ => _settings)
.AddSingleton(sp => new Updater(sp.GetRequiredService(), Launcher.Properties.Settings.Default.GithubRepo))
.AddSingleton()
- .AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
+ // Welcome view model & setting window view model is very simple so we just use one instance
+ .AddSingleton()
.AddSingleton()
+ // Setting page view models are complex so we use transient instance
+ .AddTransient()
+ .AddTransient()
+ .AddTransient()
+ .AddTransient()
+ .AddTransient()
+ .AddTransient()
+ .AddTransient()
).Build();
Ioc.Default.ConfigureServices(host.Services);
}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
index c8b83c730..1a887c4b7 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
@@ -19,10 +19,10 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
public Settings Settings { get; }
private readonly Updater _updater;
- private readonly IPortable _portable;
+ private readonly Portable _portable;
private readonly Internationalization _translater;
- public SettingsPaneGeneralViewModel(Settings settings, Updater updater, IPortable portable, Internationalization translater)
+ public SettingsPaneGeneralViewModel(Settings settings, Updater updater, Portable portable, Internationalization translater)
{
Settings = settings;
_updater = updater;
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs
index 1ecc02aa6..e57cba6d4 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs
@@ -1,8 +1,6 @@
using System.Windows.Navigation;
-using Flow.Launcher.Core;
-using Flow.Launcher.SettingPages.ViewModels;
-using Flow.Launcher.Infrastructure.UserSettings;
using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.SettingPages.ViewModels;
namespace Flow.Launcher.SettingPages.Views;
@@ -14,9 +12,7 @@ public partial class SettingsPaneAbout
{
if (!IsInitialized)
{
- var settings = Ioc.Default.GetRequiredService();
- var updater = Ioc.Default.GetRequiredService();
- _viewModel = new SettingsPaneAboutViewModel(settings, updater);
+ _viewModel = Ioc.Default.GetRequiredService();
DataContext = _viewModel;
InitializeComponent();
}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs
index 569d489d2..31653962d 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs
@@ -1,9 +1,5 @@
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
-using Flow.Launcher.Core;
-using Flow.Launcher.Core.Configuration;
-using Flow.Launcher.Core.Resource;
-using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.SettingPages.ViewModels;
namespace Flow.Launcher.SettingPages.Views;
@@ -16,11 +12,7 @@ public partial class SettingsPaneGeneral
{
if (!IsInitialized)
{
- var settings = Ioc.Default.GetRequiredService();
- var updater = Ioc.Default.GetRequiredService();
- var portable = Ioc.Default.GetRequiredService();
- var translater = Ioc.Default.GetRequiredService();
- _viewModel = new SettingsPaneGeneralViewModel(settings, updater, portable, translater);
+ _viewModel = Ioc.Default.GetRequiredService();
DataContext = _viewModel;
InitializeComponent();
}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs
index eb100da0c..8b757bd60 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs
@@ -1,7 +1,6 @@
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.SettingPages.ViewModels;
-using Flow.Launcher.Infrastructure.UserSettings;
namespace Flow.Launcher.SettingPages.Views;
@@ -13,8 +12,7 @@ public partial class SettingsPaneHotkey
{
if (!IsInitialized)
{
- var settings = Ioc.Default.GetRequiredService();
- _viewModel = new SettingsPaneHotkeyViewModel(settings);
+ _viewModel = Ioc.Default.GetRequiredService();
DataContext = _viewModel;
InitializeComponent();
}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs
index 3bd24bc13..131dfab6d 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs
@@ -5,7 +5,6 @@ using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.SettingPages.ViewModels;
using Flow.Launcher.ViewModel;
-using Flow.Launcher.Infrastructure.UserSettings;
namespace Flow.Launcher.SettingPages.Views;
@@ -17,8 +16,7 @@ public partial class SettingsPanePluginStore
{
if (!IsInitialized)
{
- var settings = Ioc.Default.GetRequiredService();
- _viewModel = new SettingsPanePluginStoreViewModel();
+ _viewModel = Ioc.Default.GetRequiredService();
DataContext = _viewModel;
InitializeComponent();
}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs
index f6b435186..97574b3ce 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs
@@ -2,7 +2,6 @@
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.SettingPages.ViewModels;
-using Flow.Launcher.Infrastructure.UserSettings;
namespace Flow.Launcher.SettingPages.Views;
@@ -14,8 +13,7 @@ public partial class SettingsPanePlugins
{
if (!IsInitialized)
{
- var settings = Ioc.Default.GetRequiredService();
- _viewModel = new SettingsPanePluginsViewModel(settings);
+ _viewModel = Ioc.Default.GetRequiredService();
DataContext = _viewModel;
InitializeComponent();
}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs
index 26350b8bb..258f2a4ad 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs
@@ -1,8 +1,6 @@
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
-using Flow.Launcher.Core;
using Flow.Launcher.SettingPages.ViewModels;
-using Flow.Launcher.Infrastructure.UserSettings;
namespace Flow.Launcher.SettingPages.Views;
@@ -14,13 +12,10 @@ public partial class SettingsPaneProxy
{
if (!IsInitialized)
{
- var settings = Ioc.Default.GetRequiredService();
- var updater = Ioc.Default.GetRequiredService();
- _viewModel = new SettingsPaneProxyViewModel(settings, updater);
+ _viewModel = Ioc.Default.GetRequiredService();
DataContext = _viewModel;
InitializeComponent();
}
-
base.OnNavigatedTo(e);
}
}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs
index a1a0231a5..cee8e4ae4 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs
@@ -1,13 +1,10 @@
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
-using Flow.Launcher.Core.Resource;
-using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.SettingPages.ViewModels;
-using Page = ModernWpf.Controls.Page;
namespace Flow.Launcher.SettingPages.Views;
-public partial class SettingsPaneTheme : Page
+public partial class SettingsPaneTheme
{
private SettingsPaneThemeViewModel _viewModel = null!;
@@ -15,13 +12,10 @@ public partial class SettingsPaneTheme : Page
{
if (!IsInitialized)
{
- var settings = Ioc.Default.GetRequiredService();
- var theme = Ioc.Default.GetRequiredService();
- _viewModel = new SettingsPaneThemeViewModel(settings, theme);
+ _viewModel = Ioc.Default.GetRequiredService();
DataContext = _viewModel;
InitializeComponent();
}
-
base.OnNavigatedTo(e);
}
}
diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
index f05893cf4..0fe4557a7 100644
--- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
+++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
@@ -5,11 +5,11 @@ namespace Flow.Launcher.ViewModel;
public partial class SettingWindowViewModel : BaseModel
{
- public Settings Settings { get; }
+ private readonly Settings _settings;
public SettingWindowViewModel(Settings settings)
{
- Settings = settings;
+ _settings = settings;
}
///
@@ -17,30 +17,30 @@ public partial class SettingWindowViewModel : BaseModel
///
public void Save()
{
- Settings.Save();
+ _settings.Save();
}
public double SettingWindowWidth
{
- get => Settings.SettingWindowWidth;
- set => Settings.SettingWindowWidth = value;
+ get => _settings.SettingWindowWidth;
+ set => _settings.SettingWindowWidth = value;
}
public double SettingWindowHeight
{
- get => Settings.SettingWindowHeight;
- set => Settings.SettingWindowHeight = value;
+ get => _settings.SettingWindowHeight;
+ set => _settings.SettingWindowHeight = value;
}
public double? SettingWindowTop
{
- get => Settings.SettingWindowTop;
- set => Settings.SettingWindowTop = value;
+ get => _settings.SettingWindowTop;
+ set => _settings.SettingWindowTop = value;
}
public double? SettingWindowLeft
{
- get => Settings.SettingWindowLeft;
- set => Settings.SettingWindowLeft = value;
+ get => _settings.SettingWindowLeft;
+ set => _settings.SettingWindowLeft = value;
}
}
diff --git a/Flow.Launcher/ViewModel/WelcomeViewModel.cs b/Flow.Launcher/ViewModel/WelcomeViewModel.cs
index 5eecabfde..82d19273f 100644
--- a/Flow.Launcher/ViewModel/WelcomeViewModel.cs
+++ b/Flow.Launcher/ViewModel/WelcomeViewModel.cs
@@ -18,6 +18,7 @@ namespace Flow.Launcher.ViewModel
{
_pageNum = value;
OnPropertyChanged();
+ OnPropertyChanged(nameof(PageDisplay));
UpdateView();
}
}
@@ -47,7 +48,6 @@ namespace Flow.Launcher.ViewModel
private void UpdateView()
{
- OnPropertyChanged(nameof(PageDisplay));
if (PageNum == 1)
{
BackEnabled = false;
From 79452921282887aac22de6d5891067aaae382e48 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 22:01:38 +0800
Subject: [PATCH 0964/1798] Update context menu font when setting is changed
---
.../UserSettings/Settings.cs | 1 -
Flow.Launcher/MainWindow.xaml.cs | 76 +++++++++++--------
2 files changed, 43 insertions(+), 34 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index e623ba400..cf194b366 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -115,7 +115,6 @@ namespace Flow.Launcher.Infrastructure.UserSettings
_settingWindowFont = value;
Application.Current.Resources["SettingWindowFont"] = new FontFamily(value);
Application.Current.Resources["ContentControlThemeFontFamily"] = new FontFamily(value);
- // TODO: Context Menu Font
}
}
}
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index bf7a45b1d..ae05d1124 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -140,7 +140,8 @@ namespace Flow.Launcher
_viewModel.Show();
}
- // Show notify icon when flowlauncher is hidden
+ // Initialize context menu & notify icon
+ InitializeContextMenu();
InitializeNotifyIcon();
// Initialize color scheme
@@ -270,6 +271,9 @@ namespace Flow.Launcher
case nameof(Settings.KeepMaxResults):
SetupResizeMode();
break;
+ case nameof(Settings.SettingWindowFont):
+ InitializeContextMenu();
+ break;
}
};
@@ -563,6 +567,44 @@ namespace Flow.Launcher
Icon = Constant.Version == "1.0.0" ? Properties.Resources.dev : Properties.Resources.app,
Visible = !_settings.HideNotifyIcon
};
+
+ _notifyIcon.MouseClick += (o, e) =>
+ {
+ switch (e.Button)
+ {
+ case MouseButtons.Left:
+ _viewModel.ToggleFlowLauncher();
+ break;
+ case MouseButtons.Right:
+
+ _contextMenu.IsOpen = true;
+ // Get context menu handle and bring it to the foreground
+ if (PresentationSource.FromVisual(_contextMenu) is HwndSource hwndSource)
+ {
+ Win32Helper.SetForegroundWindow(hwndSource.Handle);
+ }
+
+ _contextMenu.Focus();
+ break;
+ }
+ };
+ }
+
+ private void UpdateNotifyIconText()
+ {
+ var menu = _contextMenu;
+ ((MenuItem)menu.Items[0]).Header = App.API.GetTranslation("iconTrayOpen") +
+ " (" + _settings.Hotkey + ")";
+ ((MenuItem)menu.Items[1]).Header = App.API.GetTranslation("GameMode");
+ ((MenuItem)menu.Items[2]).Header = App.API.GetTranslation("PositionReset");
+ ((MenuItem)menu.Items[3]).Header = App.API.GetTranslation("iconTraySettings");
+ ((MenuItem)menu.Items[4]).Header = App.API.GetTranslation("iconTrayExit");
+ }
+
+ private void InitializeContextMenu()
+ {
+ var menu = _contextMenu;
+ menu.Items.Clear();
var openIcon = new FontIcon { Glyph = "\ue71e" };
var open = new MenuItem
{
@@ -608,38 +650,6 @@ namespace Flow.Launcher
_contextMenu.Items.Add(positionreset);
_contextMenu.Items.Add(settings);
_contextMenu.Items.Add(exit);
-
- _notifyIcon.MouseClick += (o, e) =>
- {
- switch (e.Button)
- {
- case MouseButtons.Left:
- _viewModel.ToggleFlowLauncher();
- break;
- case MouseButtons.Right:
-
- _contextMenu.IsOpen = true;
- // Get context menu handle and bring it to the foreground
- if (PresentationSource.FromVisual(_contextMenu) is HwndSource hwndSource)
- {
- Win32Helper.SetForegroundWindow(hwndSource.Handle);
- }
-
- _contextMenu.Focus();
- break;
- }
- };
- }
-
- private void UpdateNotifyIconText()
- {
- var menu = _contextMenu;
- ((MenuItem)menu.Items[0]).Header = App.API.GetTranslation("iconTrayOpen") +
- " (" + _settings.Hotkey + ")";
- ((MenuItem)menu.Items[1]).Header = App.API.GetTranslation("GameMode");
- ((MenuItem)menu.Items[2]).Header = App.API.GetTranslation("PositionReset");
- ((MenuItem)menu.Items[3]).Header = App.API.GetTranslation("iconTraySettings");
- ((MenuItem)menu.Items[4]).Header = App.API.GetTranslation("iconTrayExit");
}
#endregion
From 5665758ee6dd3c70d0e35f4923e698053643316b Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Apr 2025 22:04:48 +0800
Subject: [PATCH 0965/1798] Add property change back
---
Flow.Launcher.Infrastructure/UserSettings/Settings.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index cf194b366..1cccc38d9 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -113,6 +113,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
if (_settingWindowFont != value)
{
_settingWindowFont = value;
+ OnPropertyChanged();
Application.Current.Resources["SettingWindowFont"] = new FontFamily(value);
Application.Current.Resources["ContentControlThemeFontFamily"] = new FontFamily(value);
}
From 197e9c45ce91738edea1e2170de4fbe4a21856f9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 25 Apr 2025 08:19:03 +0800
Subject: [PATCH 0966/1798] Improve code comments
---
Flow.Launcher/App.xaml.cs | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 20dd50668..b1ff136b3 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -79,12 +79,16 @@ namespace Flow.Launcher
.AddSingleton()
.AddSingleton()
.AddSingleton()
- .AddSingleton()
.AddSingleton()
- // Welcome view model & setting window view model is very simple so we just use one instance
- .AddSingleton()
+ // Use one instance for main window view model because we only have one main window
+ .AddSingleton()
+ // Use one instance for welcome window view model & setting window view model because
+ // pages in welcome window & setting window need to share the same instance and
+ // these two view models do not need to be reset when creating new windows
.AddSingleton()
- // Setting page view models are complex so we use transient instance
+ .AddSingleton()
+ // Use transient instance for setting window page view models because
+ // pages in setting window need to be recreated when setting window is closed
.AddTransient()
.AddTransient()
.AddTransient()
From e3573f32d52b3e1e007516d4c818da5851a1cae0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 25 Apr 2025 08:42:41 +0800
Subject: [PATCH 0967/1798] Improve code quality
---
Flow.Launcher/SettingWindow.xaml.cs | 39 ++++++++++++++-----
.../ViewModel/SettingWindowViewModel.cs | 8 ----
Flow.Launcher/WelcomeWindow.xaml.cs | 10 +++--
3 files changed, 36 insertions(+), 21 deletions(-)
diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs
index b4a3ae47a..cd3e5414f 100644
--- a/Flow.Launcher/SettingWindow.xaml.cs
+++ b/Flow.Launcher/SettingWindow.xaml.cs
@@ -1,6 +1,6 @@
using System;
using System.Windows;
-using System.Windows.Forms;
+using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interop;
using CommunityToolkit.Mvvm.DependencyInjection;
@@ -9,35 +9,45 @@ using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.SettingPages.Views;
using Flow.Launcher.ViewModel;
using ModernWpf.Controls;
-using TextBox = System.Windows.Controls.TextBox;
+using Screen = System.Windows.Forms.Screen;
namespace Flow.Launcher;
public partial class SettingWindow
{
+ #region Private Fields
+
private readonly Settings _settings;
- private readonly SettingWindowViewModel _viewModel;
+
+ #endregion
+
+ #region Constructor
public SettingWindow()
{
- var viewModel = Ioc.Default.GetRequiredService();
_settings = Ioc.Default.GetRequiredService();
+ var viewModel = Ioc.Default.GetRequiredService();
DataContext = viewModel;
- _viewModel = viewModel;
- InitializePosition();
InitializeComponent();
+
+ UpdatePositionAndState();
}
+ #endregion
+
+ #region Window Events
+
private void OnLoaded(object sender, RoutedEventArgs e)
{
RefreshMaximizeRestoreButton();
+
// Fix (workaround) for the window freezes after lock screen (Win+L) or sleep
// https://stackoverflow.com/questions/4951058/software-rendering-mode-wpf
HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
HwndTarget hwndTarget = hwndSource.CompositionTarget;
hwndTarget.RenderMode = RenderMode.SoftwareOnly; // Must use software only render mode here
- InitializePosition();
+ UpdatePositionAndState();
}
private void OnClosed(object sender, EventArgs e)
@@ -45,7 +55,7 @@ public partial class SettingWindow
_settings.SettingWindowState = WindowState;
_settings.SettingWindowTop = Top;
_settings.SettingWindowLeft = Left;
- _viewModel.Save();
+ _settings.Save();
App.API.SavePluginSettings();
}
@@ -104,7 +114,11 @@ public partial class SettingWindow
RefreshMaximizeRestoreButton();
}
- public void InitializePosition()
+ #endregion
+
+ #region Window Position
+
+ public void UpdatePositionAndState()
{
var previousTop = _settings.SettingWindowTop;
var previousLeft = _settings.SettingWindowLeft;
@@ -119,6 +133,7 @@ public partial class SettingWindow
Top = previousTop.Value;
Left = previousLeft.Value;
}
+
WindowState = _settings.SettingWindowState;
}
@@ -155,6 +170,10 @@ public partial class SettingWindow
return top;
}
+ #endregion
+
+ #region Navigation View Events
+
private void NavigationView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
if (args.IsSettingsSelected)
@@ -201,4 +220,6 @@ public partial class SettingWindow
{
NavView.SelectedItem ??= NavView.MenuItems[0]; /* Set First Page */
}
+
+ #endregion
}
diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
index 0fe4557a7..17a1a2b50 100644
--- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
+++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs
@@ -12,14 +12,6 @@ public partial class SettingWindowViewModel : BaseModel
_settings = settings;
}
- ///
- /// Save Flow settings. Plugins settings are not included.
- ///
- public void Save()
- {
- _settings.Save();
- }
-
public double SettingWindowWidth
{
get => _settings.SettingWindowWidth;
diff --git a/Flow.Launcher/WelcomeWindow.xaml.cs b/Flow.Launcher/WelcomeWindow.xaml.cs
index 637f9448d..d23bd4937 100644
--- a/Flow.Launcher/WelcomeWindow.xaml.cs
+++ b/Flow.Launcher/WelcomeWindow.xaml.cs
@@ -2,16 +2,17 @@
using System.Windows;
using System.Windows.Input;
using System.Windows.Controls;
-using Flow.Launcher.Resources.Pages;
-using ModernWpf.Media.Animation;
using CommunityToolkit.Mvvm.DependencyInjection;
-using Flow.Launcher.ViewModel;
using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Resources.Pages;
+using Flow.Launcher.ViewModel;
+using ModernWpf.Media.Animation;
namespace Flow.Launcher
{
public partial class WelcomeWindow : Window
{
+ private readonly Settings _settings;
private readonly WelcomeViewModel _viewModel;
private readonly NavigationTransitionInfo _forwardTransitionInfo = new SlideNavigationTransitionInfo()
@@ -25,6 +26,7 @@ namespace Flow.Launcher
public WelcomeWindow()
{
+ _settings = Ioc.Default.GetRequiredService();
_viewModel = Ioc.Default.GetRequiredService();
DataContext = _viewModel;
InitializeComponent();
@@ -97,7 +99,7 @@ namespace Flow.Launcher
private void Window_Closed(object sender, EventArgs e)
{
// Save settings when window is closed
- Ioc.Default.GetRequiredService().Save();
+ _settings.Save();
}
}
}
From 856346acebe94adadd178616e157607d497c4e8e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 25 Apr 2025 09:03:04 +0800
Subject: [PATCH 0968/1798] Always update main window position when window is
loaded
---
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 ae05d1124..381d03c1f 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -324,7 +324,7 @@ namespace Flow.Launcher
private void OnLocationChanged(object sender, EventArgs e)
{
- if (_settings.SearchWindowScreen == SearchWindowScreens.RememberLastLaunchLocation)
+ if (IsLoaded)
{
_settings.WindowLeft = Left;
_settings.WindowTop = Top;
From defb2830d632fbebc05f570d149fb078f4a9e2a0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 25 Apr 2025 09:04:14 +0800
Subject: [PATCH 0969/1798] Change setting window position & window state
faster & Do not save settings for faster exiting experience
---
Flow.Launcher/App.xaml.cs | 3 ++-
Flow.Launcher/SettingWindow.xaml | 1 +
Flow.Launcher/SettingWindow.xaml.cs | 38 +++++++++++++++++++----------
Flow.Launcher/WelcomeWindow.xaml.cs | 7 +++---
4 files changed, 31 insertions(+), 18 deletions(-)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index b1ff136b3..1b57d5cbe 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -31,6 +31,7 @@ namespace Flow.Launcher
#region Public Properties
public static IPublicAPI API { get; private set; }
+ public static bool Exiting => _mainWindow.CanClose;
#endregion
@@ -39,7 +40,7 @@ namespace Flow.Launcher
private static readonly string ClassName = nameof(App);
private static bool _disposed;
- private MainWindow _mainWindow;
+ private static MainWindow _mainWindow;
private readonly MainViewModel _mainVM;
private readonly Settings _settings;
diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml
index ab27b235a..a75a51c8f 100644
--- a/Flow.Launcher/SettingWindow.xaml
+++ b/Flow.Launcher/SettingWindow.xaml
@@ -16,6 +16,7 @@
Icon="Images\app.ico"
Left="{Binding SettingWindowLeft, Mode=TwoWay}"
Loaded="OnLoaded"
+ LocationChanged="Window_LocationChanged"
MouseDown="window_MouseDown"
ResizeMode="CanResize"
SnapsToDevicePixels="True"
diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs
index cd3e5414f..79bd171ed 100644
--- a/Flow.Launcher/SettingWindow.xaml.cs
+++ b/Flow.Launcher/SettingWindow.xaml.cs
@@ -52,9 +52,9 @@ public partial class SettingWindow
private void OnClosed(object sender, EventArgs e)
{
- _settings.SettingWindowState = WindowState;
- _settings.SettingWindowTop = Top;
- _settings.SettingWindowLeft = Left;
+ // 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
_settings.Save();
App.API.SavePluginSettings();
}
@@ -66,15 +66,32 @@ public partial class SettingWindow
private void window_MouseDown(object sender, MouseButtonEventArgs e) /* for close hotkey popup */
{
- if (Keyboard.FocusedElement is not TextBox textBox)
- {
- return;
- }
+ if (Keyboard.FocusedElement is not TextBox textBox) return;
var tRequest = new TraversalRequest(FocusNavigationDirection.Next);
textBox.MoveFocus(tRequest);
}
- /* Custom TitleBar */
+ private void Window_StateChanged(object sender, EventArgs e)
+ {
+ RefreshMaximizeRestoreButton();
+ if (IsLoaded)
+ {
+ _settings.SettingWindowState = WindowState;
+ }
+ }
+
+ private void Window_LocationChanged(object sender, EventArgs e)
+ {
+ if (IsLoaded)
+ {
+ _settings.SettingWindowTop = Top;
+ _settings.SettingWindowLeft = Left;
+ }
+ }
+
+ #endregion
+
+ #region Window Custom TitleBar
private void OnMinimizeButtonClick(object sender, RoutedEventArgs e)
{
@@ -109,11 +126,6 @@ public partial class SettingWindow
}
}
- private void Window_StateChanged(object sender, EventArgs e)
- {
- RefreshMaximizeRestoreButton();
- }
-
#endregion
#region Window Position
diff --git a/Flow.Launcher/WelcomeWindow.xaml.cs b/Flow.Launcher/WelcomeWindow.xaml.cs
index d23bd4937..ef0706765 100644
--- a/Flow.Launcher/WelcomeWindow.xaml.cs
+++ b/Flow.Launcher/WelcomeWindow.xaml.cs
@@ -78,10 +78,7 @@ namespace Flow.Launcher
private void window_MouseDown(object sender, MouseButtonEventArgs e) /* for close hotkey popup */
{
- if (Keyboard.FocusedElement is not TextBox textBox)
- {
- return;
- }
+ if (Keyboard.FocusedElement is not TextBox textBox) return;
var tRequest = new TraversalRequest(FocusNavigationDirection.Next);
textBox.MoveFocus(tRequest);
}
@@ -98,6 +95,8 @@ 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;
// Save settings when window is closed
_settings.Save();
}
From f0512d7861f0e9698b093bb69296c21f1f652d54 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 25 Apr 2025 09:13:51 +0800
Subject: [PATCH 0970/1798] Add blank line
---
Flow.Launcher/Resources/SettingWindowStyle.xaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Flow.Launcher/Resources/SettingWindowStyle.xaml b/Flow.Launcher/Resources/SettingWindowStyle.xaml
index 60655fa7c..fc9246aa3 100644
--- a/Flow.Launcher/Resources/SettingWindowStyle.xaml
+++ b/Flow.Launcher/Resources/SettingWindowStyle.xaml
@@ -7,6 +7,7 @@
+
F1 M512,512z M0,0z M448,256C448,150,362,64,256,64L256,448C362,448,448,362,448,256z M0,256A256,256,0,1,1,512,256A256,256,0,1,1,0,256z
-
-
-
+ Orientation="Horizontal">
+
+
+
+
+
+
+
+
+
+
+
+
Date: Tue, 29 Apr 2025 10:46:16 +0800
Subject: [PATCH 0978/1798] Remove unused image
---
Flow.Launcher/Images/EXE.png | Bin 2173 -> 0 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 Flow.Launcher/Images/EXE.png
diff --git a/Flow.Launcher/Images/EXE.png b/Flow.Launcher/Images/EXE.png
deleted file mode 100644
index ecc91bdb3ab7b81b7a01f5a46cc127a883e6a6ed..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2173
zcmbVOc~BEq99|F)u$FkWlv-Eqc0&R>mf~Q=
zO6%yL1xE*vPN`aHwH_6Z`bVLTil|f++o@9=!D0)wYQ4a|g^*E;$GEebeQ)3QzTffv
z-fvQpmYOssBs>IypfUPnT{?K9{4;6<_{|Kw`!RS0JComK!FntI1jJ9-?1iA=^|UdI
z%QB?kBx4s7CMJgxd+knuhM-xoUME53QXHH^S!jnw*j;~A2-7BwFjH
zR7OFnku1n1)h1!=Y|Or;|;=DhBR2q
zxF}dD#zZ8FqOejeCR9o(mZP2lOHc`hplWc7P!yLcaj6RST|!{aWisRGx2}%rjhje>vQc)*!La~~`LRwb!!fLt
zc?z|E`7r|^w+4gX#*n_)?S2z1myid-@FiqOG;7RvQb;<*GHw@1CFB7&qxoo@xYk7x
z9OE)FjBQYEJrvH(iWDS)iPUnLLPRL!5|LV|$|2P<(yWx4
z2lwk3(#PT
zdH4gzmjs?nvp}qT--*bemik6E8t$(GoFMt?)(A;nR>~yweWr)Vz>7sNK;EsmmvP;fR?#Bk;hV~U
zD9Dp~^{+kBfCk~9tMNmBKLrziN2VNr+6DS;@hPhWf>U7XSS(Vv?P^Tx-8HGX*7
zR-aW>Sqe{Be87uFMZ{DFSA^AVUAy>LPq_?hV3r)Z6O2Zz9&vNd>Y{`iq-bJWQNTfI
zM4PdqHs!)zZF?WGdCLRo>3=Te=b0n0hUQc0yT*^&5%$C0gAp)67NlL-ip^4>;fl-m
zPW+t7hBi7bdhLp^9TS^ZCC!fs{bs|ClzFp{pGw4Dzp$yfxHfRj*gRL+wXeSXzIFb|
zjw_LZ=$3`kl-mkBRfTY=MJL!Y5C`@Lb$f-bhY
z9qRb&)yUxay$3Y*(NT)VTfKp)6{|X;4cm{_b|EZQnCsRQE{N@!Tz(@orK)YVs%7Nj
z+;#e@#Is9YDOfuG-tw4VS02x7yT0BKZOLeCifRe@yfnLL|8VZenx@v~yWuUvPF@uk
z+?GxX>MZLHVs5OitNi6=UFM<{dsx9c#m?!?6<3Q(W=WzPq>XkBgbGKCL#lL;K^W
zSEbiSR@U@>H?z!^DCjwy_b?7>%er+aY3ewLkz9H|{(iu*_sGIS@?zhj~*!+bdW%sp6eRO$ycYGC8^IKB(
z?3EYWX3EYFTjoAgGQ)+Jc-(@0|Dwg=>-F*nW!gT$aqaSQwhqXd1GTORcyIa$=ht9j
z3pn!N+>8}<@;5iURfuXWQRjoqwzUiQpV_eU;nhghw*c8SxvTSb({^ik4gUv0pOC8C
I6~CnDKgG8Q3jhEB
From 7e50eb542676f711c6e5ed272ff0bb4fac6bf4bc Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 29 Apr 2025 10:47:13 +0800
Subject: [PATCH 0979/1798] Code quality
---
Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml | 2 --
1 file changed, 2 deletions(-)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
index 7867fa980..66c1cb1bf 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
@@ -377,9 +377,7 @@
Text="{Binding Description, Mode=OneWay}"
TextTrimming="WordEllipsis"
TextWrapping="Wrap" />
-
-
From 9b666d31363796bef10e8f031fe99b7d7e13ee73 Mon Sep 17 00:00:00 2001
From: DB p
Date: Tue, 29 Apr 2025 20:06:46 +0900
Subject: [PATCH 0980/1798] Add Flyout UI for Filter
---
.../Views/SettingsPanePluginStore.xaml | 55 +++++++++----------
1 file changed, 27 insertions(+), 28 deletions(-)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
index 66c1cb1bf..fde022da7 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
@@ -65,34 +65,33 @@
Command="{Binding RefreshExternalPluginsCommand}"
Content="{DynamicResource refresh}"
FontSize="13" />
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
Date: Tue, 29 Apr 2025 19:31:37 +0800
Subject: [PATCH 0981/1798] Adjust margin & Improve ui
---
.../SettingPages/Views/SettingsPanePluginStore.xaml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
index fde022da7..df9cc3556 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
@@ -58,14 +58,14 @@
Orientation="Horizontal">
-
+
@@ -80,7 +80,7 @@
IsChecked="{Binding ShowPython, Mode=TwoWay}"
StaysOpenOnClick="True" />
From d0b44854ca282999fdba8f72be7c9306acfa00e2 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 29 Apr 2025 19:33:56 +0800
Subject: [PATCH 0982/1798] Set menu flyout to bottom
---
Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
index df9cc3556..9312b0c2d 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
@@ -68,7 +68,7 @@
-
+
Date: Wed, 30 Apr 2025 10:45:09 +0800
Subject: [PATCH 0983/1798] Change function name to suppress warning
---
Flow.Launcher/ActionKeywords.xaml.cs | 2 +-
Flow.Launcher/ViewModel/PluginViewModel.cs | 7 +------
2 files changed, 2 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher/ActionKeywords.xaml.cs b/Flow.Launcher/ActionKeywords.xaml.cs
index ad24f2a76..9420b4c38 100644
--- a/Flow.Launcher/ActionKeywords.xaml.cs
+++ b/Flow.Launcher/ActionKeywords.xaml.cs
@@ -80,7 +80,7 @@ namespace Flow.Launcher
}
// Update action keywords text and close window
- _pluginViewModel.OnActionKeywordsChanged();
+ _pluginViewModel.OnActionKeywordsTextChanged();
Close();
}
}
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index 8312806fb..64a7f3db8 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -155,16 +155,11 @@ namespace Flow.Launcher.ViewModel
public bool SearchDelayEnabled => Settings.SearchQueryResultsWithDelay;
public string DefaultSearchDelay => Settings.SearchDelayTime.ToString();
- public void OnActionKeywordsChanged()
+ public void OnActionKeywordsTextChanged()
{
OnPropertyChanged(nameof(ActionKeywordsText));
}
- public void OnSearchDelayTimeChanged()
- {
- OnPropertyChanged(nameof(SearchDelayTimeText));
- }
-
[RelayCommand]
private void OpenPluginDirectory()
{
From 6b9a710145c5e4022e3b977ad31b3533dbef4148 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 30 Apr 2025 10:45:18 +0800
Subject: [PATCH 0984/1798] Set private assets all for PropertyChanged.Fody
---
.../Flow.Launcher.Infrastructure.csproj | 4 +++-
Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj | 4 +++-
Flow.Launcher/Flow.Launcher.csproj | 4 +++-
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index f02b2297f..31547200b 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -66,7 +66,9 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
+ all
+
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index 1472813b8..ce3b7ab1a 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -76,7 +76,9 @@
allruntime; build; native; contentfiles; analyzers; buildtransitive
-
+
+ all
+
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 91cab9fa0..8d43eff98 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -98,7 +98,9 @@
-
+
+ all
+
From a9641505b63a19248d68a6c1b118fece029fe582 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 30 Apr 2025 19:21:59 +0800
Subject: [PATCH 0985/1798] Fix clean cache issue
---
.../ViewModels/SettingsPaneAboutViewModel.cs | 26 +++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
index 231d14d55..3889b9b00 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
@@ -186,6 +186,7 @@ public partial class SettingsPaneAboutViewModel : BaseModel
{
try
{
+ // Make sure directory clean
dir.Delete(true);
}
catch (Exception e)
@@ -214,6 +215,7 @@ public partial class SettingsPaneAboutViewModel : BaseModel
{
var success = true;
var cacheDirectory = GetCacheDir();
+ var pluginCacheDirectory = GetPluginCacheDir();
var cacheFiles = GetCacheFiles();
cacheFiles.ForEach(f =>
@@ -229,12 +231,31 @@ public partial class SettingsPaneAboutViewModel : BaseModel
}
});
+ // Firstly, delete plugin cache directories
+ pluginCacheDirectory.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)
+ .ToList()
+ .ForEach(dir =>
+ {
+ try
+ {
+ // Plugin may create directories in its cache directory
+ dir.Delete(true);
+ }
+ catch (Exception e)
+ {
+ App.API.LogException(ClassName, $"Failed to delete cache directory: {dir.Name}", e);
+ success = false;
+ }
+ });
+
+ // Then, delete plugin directory
cacheDirectory.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)
.ToList()
.ForEach(dir =>
{
try
{
+ // Make sure directory clean
dir.Delete(true);
}
catch (Exception e)
@@ -254,6 +275,11 @@ public partial class SettingsPaneAboutViewModel : BaseModel
return new DirectoryInfo(DataLocation.CacheDirectory);
}
+ private static DirectoryInfo GetPluginCacheDir()
+ {
+ return new DirectoryInfo(DataLocation.PluginCacheDirectory);
+ }
+
private static List GetCacheFiles()
{
return GetCacheDir().EnumerateFiles("*", SearchOption.AllDirectories).ToList();
From c9e85a1888f0936342ea74121c7e070ff7322777 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 30 Apr 2025 19:35:35 +0800
Subject: [PATCH 0986/1798] Use recursive false
---
.../ViewModels/SettingsPaneAboutViewModel.cs | 29 ++++++++-----------
1 file changed, 12 insertions(+), 17 deletions(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
index 3889b9b00..652fc1ce5 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
@@ -186,8 +186,8 @@ public partial class SettingsPaneAboutViewModel : BaseModel
{
try
{
- // Make sure directory clean
- dir.Delete(true);
+ // Log folders are the last level of folders
+ dir.Delete(false);
}
catch (Exception e)
{
@@ -249,21 +249,16 @@ public partial class SettingsPaneAboutViewModel : BaseModel
});
// Then, delete plugin directory
- cacheDirectory.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)
- .ToList()
- .ForEach(dir =>
- {
- try
- {
- // Make sure directory clean
- dir.Delete(true);
- }
- catch (Exception e)
- {
- App.API.LogException(ClassName, $"Failed to delete cache directory: {dir.Name}", e);
- success = false;
- }
- });
+ try
+ {
+ // Log folders are the last level of folders
+ GetPluginCacheDir().Delete(false);
+ }
+ catch (Exception e)
+ {
+ App.API.LogException(ClassName, $"Failed to delete cache directory: {dir.Name}", e);
+ success = false;
+ }
OnPropertyChanged(nameof(CacheFolderSize));
From 7762c7929e5837d0c3606c4cb2f0e53e5105991f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 30 Apr 2025 19:38:15 +0800
Subject: [PATCH 0987/1798] Explictly add recursive & Fix build
---
.../SettingPages/ViewModels/SettingsPaneAboutViewModel.cs | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
index 652fc1ce5..374dcb3ad 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
@@ -187,7 +187,7 @@ public partial class SettingsPaneAboutViewModel : BaseModel
try
{
// Log folders are the last level of folders
- dir.Delete(false);
+ dir.Delete(recursive: false);
}
catch (Exception e)
{
@@ -239,7 +239,7 @@ public partial class SettingsPaneAboutViewModel : BaseModel
try
{
// Plugin may create directories in its cache directory
- dir.Delete(true);
+ dir.Delete(recursive: true);
}
catch (Exception e)
{
@@ -249,10 +249,11 @@ public partial class SettingsPaneAboutViewModel : BaseModel
});
// Then, delete plugin directory
+ var dir = GetPluginCacheDir();
try
{
// Log folders are the last level of folders
- GetPluginCacheDir().Delete(false);
+ dir.Delete(recursive: false);
}
catch (Exception e)
{
From 541e1981a93a727ad81b55c2a26954f2f6c0f847 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 30 Apr 2025 19:40:23 +0800
Subject: [PATCH 0988/1798] Fix code comments
---
.../SettingPages/ViewModels/SettingsPaneAboutViewModel.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
index 374dcb3ad..00f40b009 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
@@ -252,7 +252,6 @@ public partial class SettingsPaneAboutViewModel : BaseModel
var dir = GetPluginCacheDir();
try
{
- // Log folders are the last level of folders
dir.Delete(recursive: false);
}
catch (Exception e)
From 980b792cb360515f4d4b17c49a955a156a50bc15 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 1 May 2025 11:06:52 +0800
Subject: [PATCH 0989/1798] Wrap operation in one class
---
Flow.Launcher/Storage/TopMostRecord.cs | 34 ++++++++++++++++++++++++
Flow.Launcher/ViewModel/MainViewModel.cs | 8 +++---
2 files changed, 37 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index 7f35904a5..63f0a2fce 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -1,10 +1,44 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Text.Json.Serialization;
+using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Plugin;
namespace Flow.Launcher.Storage
{
+ public class FlowLauncherJsonStorageTopMostRecord : ISavable
+ {
+ private readonly FlowLauncherJsonStorage _topMostRecordStorage;
+
+ private readonly TopMostRecord _topMostRecord;
+
+ public FlowLauncherJsonStorageTopMostRecord()
+ {
+ _topMostRecordStorage = new FlowLauncherJsonStorage();
+ _topMostRecord = _topMostRecordStorage.Load();
+ }
+
+ public void Save()
+ {
+ _topMostRecordStorage.Save();
+ }
+
+ public bool IsTopMost(Result result)
+ {
+ return _topMostRecord.IsTopMost(result);
+ }
+
+ public void Remove(Result result)
+ {
+ _topMostRecord.Remove(result);
+ }
+
+ public void AddOrUpdate(Result result)
+ {
+ _topMostRecord.AddOrUpdate(result);
+ }
+ }
+
public class TopMostRecord
{
[JsonInclude]
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 00675149b..54ad6c288 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -37,11 +37,10 @@ namespace Flow.Launcher.ViewModel
private readonly FlowLauncherJsonStorage _historyItemsStorage;
private readonly FlowLauncherJsonStorage _userSelectedRecordStorage;
- private readonly FlowLauncherJsonStorage _topMostRecordStorage;
+ private readonly FlowLauncherJsonStorageTopMostRecord _topMostRecord;
private readonly History _history;
private int lastHistoryIndex = 1;
private readonly UserSelectedRecord _userSelectedRecord;
- private readonly TopMostRecord _topMostRecord;
private CancellationTokenSource _updateSource;
private CancellationToken _updateToken;
@@ -134,10 +133,9 @@ namespace Flow.Launcher.ViewModel
_historyItemsStorage = new FlowLauncherJsonStorage();
_userSelectedRecordStorage = new FlowLauncherJsonStorage();
- _topMostRecordStorage = new FlowLauncherJsonStorage();
+ _topMostRecord = new FlowLauncherJsonStorageTopMostRecord();
_history = _historyItemsStorage.Load();
_userSelectedRecord = _userSelectedRecordStorage.Load();
- _topMostRecord = _topMostRecordStorage.Load();
ContextMenu = new ResultsViewModel(Settings)
{
@@ -1612,7 +1610,7 @@ namespace Flow.Launcher.ViewModel
{
_historyItemsStorage.Save();
_userSelectedRecordStorage.Save();
- _topMostRecordStorage.Save();
+ _topMostRecord.Save();
}
///
From 0d619085753cb8e443044c6cd016b86b5fc5b1d3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 1 May 2025 11:41:53 +0800
Subject: [PATCH 0990/1798] Support multiple topmost records
---
.../Storage/JsonStorage.cs | 5 +
Flow.Launcher/Storage/TopMostRecord.cs | 137 ++++++++++++++++--
2 files changed, 132 insertions(+), 10 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
index 0b10382ee..20aacb344 100644
--- a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
@@ -45,6 +45,11 @@ namespace Flow.Launcher.Infrastructure.Storage
FilesFolders.ValidateDirectory(DirectoryPath);
}
+ public bool Exists()
+ {
+ return File.Exists(FilePath);
+ }
+
public async Task LoadAsync()
{
if (Data != null)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index 63f0a2fce..25774a2c0 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -1,5 +1,6 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
+using System.Linq;
using System.Text.Json.Serialization;
using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Plugin;
@@ -8,14 +9,29 @@ namespace Flow.Launcher.Storage
{
public class FlowLauncherJsonStorageTopMostRecord : ISavable
{
- private readonly FlowLauncherJsonStorage _topMostRecordStorage;
-
- private readonly TopMostRecord _topMostRecord;
+ private readonly FlowLauncherJsonStorage _topMostRecordStorage;
+ private readonly MultipleTopMostRecord _topMostRecord;
public FlowLauncherJsonStorageTopMostRecord()
{
- _topMostRecordStorage = new FlowLauncherJsonStorage();
- _topMostRecord = _topMostRecordStorage.Load();
+ var topMostRecordStorage = new FlowLauncherJsonStorage();
+ var exist = topMostRecordStorage.Exists();
+ if (exist)
+ {
+ // Get old data
+ var topMostRecord = topMostRecordStorage.Load();
+
+ // Convert to new data
+ _topMostRecordStorage = new FlowLauncherJsonStorage();
+ _topMostRecord = _topMostRecordStorage.Load();
+ _topMostRecord.Add(topMostRecord);
+ }
+ else
+ {
+ // Get new data
+ _topMostRecordStorage = new FlowLauncherJsonStorage();
+ _topMostRecord = _topMostRecordStorage.Load();
+ }
}
public void Save()
@@ -42,7 +58,7 @@ namespace Flow.Launcher.Storage
public class TopMostRecord
{
[JsonInclude]
- public ConcurrentDictionary records { get; private set; } = new ConcurrentDictionary();
+ public ConcurrentDictionary records { get; private set; } = new();
internal bool IsTopMost(Result result)
{
@@ -90,12 +106,113 @@ namespace Flow.Launcher.Storage
}
}
+ public class MultipleTopMostRecord
+ {
+ [JsonInclude]
+ public ConcurrentDictionary> records { get; private set; } = new();
+
+ internal void Add(TopMostRecord topMostRecord)
+ {
+ if (topMostRecord == null || topMostRecord.records.IsEmpty)
+ {
+ return;
+ }
+
+ foreach (var record in topMostRecord.records)
+ {
+ records.AddOrUpdate(record.Key, new ConcurrentBag { record.Value }, (key, oldValue) =>
+ {
+ oldValue.Add(record.Value);
+ return oldValue;
+ });
+ }
+ }
+
+ internal bool IsTopMost(Result result)
+ {
+ // origin query is null when user select the context menu item directly of one item from query list
+ // in this case, we do not need to check if the result is top most
+ if (records.IsEmpty || result.OriginQuery == null ||
+ !records.TryGetValue(result.OriginQuery.RawQuery, out var value))
+ {
+ return false;
+ }
+
+ // since this dictionary should be very small (or empty) going over it should be pretty fast.
+ return value.Any(record => record.Equals(result));
+ }
+
+ internal void Remove(Result result)
+ {
+ // origin query is null when user select the context menu item directly of one item from query list
+ // in this case, we do not need to remove the record
+ if (result.OriginQuery == null ||
+ !records.TryGetValue(result.OriginQuery.RawQuery, out var value))
+ {
+ return;
+ }
+
+ // remove the record from the bag
+ var recordToRemove = value.FirstOrDefault(r => r.Equals(result));
+ if (recordToRemove != null)
+ {
+ value.TryTake(out recordToRemove);
+ }
+ }
+
+ internal void AddOrUpdate(Result result)
+ {
+ // origin query is null when user select the context menu item directly of one item from query list
+ // in this case, we do not need to add or update the record
+ if (result.OriginQuery == null)
+ {
+ return;
+ }
+
+ var record = new Record
+ {
+ PluginID = result.PluginID,
+ Title = result.Title,
+ SubTitle = result.SubTitle,
+ RecordKey = result.RecordKey
+ };
+ if (!records.TryGetValue(result.OriginQuery.RawQuery, out var value))
+ {
+ // create a new bag if it does not exist
+ value = new ConcurrentBag()
+ {
+ record
+ };
+ records.TryAdd(result.OriginQuery.RawQuery, value);
+ }
+ else
+ {
+ // add or update the record in the bag
+ if (value.Any(r => r.Equals(result)))
+ {
+ // update the record
+ var recordToUpdate = value.FirstOrDefault(r => r.Equals(result));
+ if (recordToUpdate != null)
+ {
+ value.TryTake(out recordToUpdate);
+ value.Add(record);
+ }
+ }
+ else
+ {
+ // add the record
+ value.Add(record);
+ }
+ }
+ }
+ }
+
public class Record
{
- public string Title { get; set; }
- public string SubTitle { get; set; }
- public string PluginID { get; set; }
- public string RecordKey { get; set; }
+ public string Title { get; init; }
+ public string SubTitle { get; init; }
+ public string PluginID { get; init; }
+ public string RecordKey { get; init; }
public bool Equals(Result r)
{
From af087fb85b50096b69fc8965436b109eecdc3950 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 1 May 2025 12:49:20 +0800
Subject: [PATCH 0991/1798] Support multiple topmost records storage
---
.../Storage/JsonStorage.cs | 16 ++++
Flow.Launcher/Storage/TopMostRecord.cs | 78 ++++++++++++++++---
2 files changed, 82 insertions(+), 12 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
index 20aacb344..db9ccc28a 100644
--- a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
@@ -50,6 +50,22 @@ namespace Flow.Launcher.Infrastructure.Storage
return File.Exists(FilePath);
}
+ public void Delete()
+ {
+ if (File.Exists(FilePath))
+ {
+ File.Delete(FilePath);
+ }
+ if (File.Exists(BackupFilePath))
+ {
+ File.Delete(BackupFilePath);
+ }
+ if (File.Exists(TempFilePath))
+ {
+ File.Delete(TempFilePath);
+ }
+ }
+
public async Task LoadAsync()
{
if (Data != null)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index 25774a2c0..f7459dc40 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -1,35 +1,64 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json;
using System.Text.Json.Serialization;
using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Plugin;
namespace Flow.Launcher.Storage
{
- public class FlowLauncherJsonStorageTopMostRecord : ISavable
+ public class FlowLauncherJsonStorageTopMostRecord
{
private readonly FlowLauncherJsonStorage _topMostRecordStorage;
private readonly MultipleTopMostRecord _topMostRecord;
public FlowLauncherJsonStorageTopMostRecord()
{
+ // Get old data & new data
var topMostRecordStorage = new FlowLauncherJsonStorage();
- var exist = topMostRecordStorage.Exists();
- if (exist)
- {
- // Get old data
- var topMostRecord = topMostRecordStorage.Load();
+ _topMostRecordStorage = new FlowLauncherJsonStorage();
- // Convert to new data
- _topMostRecordStorage = new FlowLauncherJsonStorage();
+ // Check if data exist
+ var oldDataExist = topMostRecordStorage.Exists();
+ var newDataExist = _topMostRecordStorage.Exists();
+
+ // If new data exist, it means we have already migrated the old data
+ // So we can safely delete the old data and load the new data
+ if (newDataExist)
+ {
+ try
+ {
+ topMostRecordStorage.Delete();
+ }
+ catch
+ {
+ // Ignored
+ }
_topMostRecord = _topMostRecordStorage.Load();
- _topMostRecord.Add(topMostRecord);
}
+ // If new data does not exist and old data exist, we need to migrate the old data to the new data
+ else if (oldDataExist)
+ {
+ // Migrate old data to new data
+ _topMostRecord = _topMostRecordStorage.Load();
+ _topMostRecord.Add(topMostRecordStorage.Load());
+
+ // Delete old data and save the new data
+ try
+ {
+ topMostRecordStorage.Delete();
+ }
+ catch
+ {
+ // Ignored
+ }
+ Save();
+ }
+ // If both data do not exist, we just need to create a new data
else
{
- // Get new data
- _topMostRecordStorage = new FlowLauncherJsonStorage();
_topMostRecord = _topMostRecordStorage.Load();
}
}
@@ -109,6 +138,7 @@ namespace Flow.Launcher.Storage
public class MultipleTopMostRecord
{
[JsonInclude]
+ [JsonConverter(typeof(ConcurrentDictionaryConcurrentBagConverter))]
public ConcurrentDictionary> records { get; private set; } = new();
internal void Add(TopMostRecord topMostRecord)
@@ -207,6 +237,30 @@ namespace Flow.Launcher.Storage
}
}
+ public class ConcurrentDictionaryConcurrentBagConverter : JsonConverter>>
+ {
+ public override ConcurrentDictionary> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ var dictionary = JsonSerializer.Deserialize>>(ref reader, options);
+ var concurrentDictionary = new ConcurrentDictionary>();
+ foreach (var kvp in dictionary)
+ {
+ concurrentDictionary.TryAdd(kvp.Key, new ConcurrentBag(kvp.Value));
+ }
+ return concurrentDictionary;
+ }
+
+ public override void Write(Utf8JsonWriter writer, ConcurrentDictionary> value, JsonSerializerOptions options)
+ {
+ var dict = new Dictionary>();
+ foreach (var kvp in value)
+ {
+ dict.Add(kvp.Key, kvp.Value.ToList());
+ }
+ JsonSerializer.Serialize(writer, dict, options);
+ }
+ }
+
public class Record
{
public string Title { get; init; }
From 845c331cac40301da43d107ae547c2818faaff29 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 1 May 2025 13:16:16 +0800
Subject: [PATCH 0992/1798] Remove the bag from dictionary if the bag is empty
---
Flow.Launcher/Storage/TopMostRecord.cs | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index f7459dc40..aaf7194e7 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -188,6 +188,12 @@ namespace Flow.Launcher.Storage
{
value.TryTake(out recordToRemove);
}
+
+ // if the bag is empty, remove the bag from the dictionary
+ if (value.IsEmpty)
+ {
+ records.TryRemove(result.OriginQuery.RawQuery, out _);
+ }
}
internal void AddOrUpdate(Result result)
From 07f44f23771e4ac21f5b837fcee66a884513a282 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 1 May 2025 13:19:23 +0800
Subject: [PATCH 0993/1798] Add code comments
---
Flow.Launcher/Storage/TopMostRecord.cs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index aaf7194e7..d604eabc1 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -243,6 +243,9 @@ namespace Flow.Launcher.Storage
}
}
+ ///
+ /// Because ConcurrentBag does not support serialization, we need to convert it to a List
+ ///
public class ConcurrentDictionaryConcurrentBagConverter : JsonConverter>>
{
public override ConcurrentDictionary> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
From 0673d07c2a14a6595d4c495c1ab7b3fde3395782 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 1 May 2025 13:23:22 +0800
Subject: [PATCH 0994/1798] Improve code comments & Make classes internal
---
Flow.Launcher/Storage/TopMostRecord.cs | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index d604eabc1..7c45bcf66 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -34,7 +34,7 @@ namespace Flow.Launcher.Storage
}
catch
{
- // Ignored
+ // Ignored - Flow will delete the old data during next startup
}
_topMostRecord = _topMostRecordStorage.Load();
}
@@ -52,7 +52,7 @@ namespace Flow.Launcher.Storage
}
catch
{
- // Ignored
+ // Ignored - Flow will delete the old data during next startup
}
Save();
}
@@ -84,7 +84,10 @@ namespace Flow.Launcher.Storage
}
}
- public class TopMostRecord
+ ///
+ /// Old data structure to support only one top most record for the same query
+ ///
+ internal class TopMostRecord
{
[JsonInclude]
public ConcurrentDictionary records { get; private set; } = new();
@@ -135,7 +138,10 @@ namespace Flow.Launcher.Storage
}
}
- public class MultipleTopMostRecord
+ ///
+ /// New data structure to support multiple top most records for the same query
+ ///
+ internal class MultipleTopMostRecord
{
[JsonInclude]
[JsonConverter(typeof(ConcurrentDictionaryConcurrentBagConverter))]
@@ -246,7 +252,7 @@ namespace Flow.Launcher.Storage
///
/// Because ConcurrentBag does not support serialization, we need to convert it to a List
///
- public class ConcurrentDictionaryConcurrentBagConverter : JsonConverter>>
+ internal class ConcurrentDictionaryConcurrentBagConverter : JsonConverter>>
{
public override ConcurrentDictionary> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
@@ -270,7 +276,7 @@ namespace Flow.Launcher.Storage
}
}
- public class Record
+ internal class Record
{
public string Title { get; init; }
public string SubTitle { get; init; }
From 4ecef470e82c07c611044db777675e5205bede6d Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 1 May 2025 13:33:24 +0800
Subject: [PATCH 0995/1798] Code quality
---
.../Storage/JsonStorage.cs | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
index db9ccc28a..c7eba05fd 100644
--- a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
@@ -52,17 +52,12 @@ namespace Flow.Launcher.Infrastructure.Storage
public void Delete()
{
- if (File.Exists(FilePath))
+ foreach (var path in new[] { FilePath, BackupFilePath, TempFilePath })
{
- File.Delete(FilePath);
- }
- if (File.Exists(BackupFilePath))
- {
- File.Delete(BackupFilePath);
- }
- if (File.Exists(TempFilePath))
- {
- File.Delete(TempFilePath);
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ }
}
}
From c49b3b7cba86ffadaec56e748751041f5e5c47c1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 1 May 2025 13:42:54 +0800
Subject: [PATCH 0996/1798] Fix TryTake may remove the wrong element
---
Flow.Launcher/Storage/TopMostRecord.cs | 25 +++++--------------------
1 file changed, 5 insertions(+), 20 deletions(-)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index 7c45bcf66..0a9921f73 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -189,11 +189,8 @@ namespace Flow.Launcher.Storage
}
// remove the record from the bag
- var recordToRemove = value.FirstOrDefault(r => r.Equals(result));
- if (recordToRemove != null)
- {
- value.TryTake(out recordToRemove);
- }
+ var bag = new ConcurrentQueue(value.Where(r => !r.Equals(result)));
+ records[result.OriginQuery.RawQuery] = new ConcurrentBag(bag);
// if the bag is empty, remove the bag from the dictionary
if (value.IsEmpty)
@@ -230,21 +227,9 @@ namespace Flow.Launcher.Storage
else
{
// add or update the record in the bag
- if (value.Any(r => r.Equals(result)))
- {
- // update the record
- var recordToUpdate = value.FirstOrDefault(r => r.Equals(result));
- if (recordToUpdate != null)
- {
- value.TryTake(out recordToUpdate);
- value.Add(record);
- }
- }
- else
- {
- // add the record
- value.Add(record);
- }
+ var bag = new ConcurrentQueue(value.Where(r => !r.Equals(result))); // make sure we don't have duplicates
+ bag.Enqueue(record);
+ records[result.OriginQuery.RawQuery] = new ConcurrentBag(bag);
}
}
}
From 58b9f0c19cbff0fa202701dad68c875562829456 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 1 May 2025 13:47:35 +0800
Subject: [PATCH 0997/1798] Improve remove logic
---
Flow.Launcher/Storage/TopMostRecord.cs | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index 0a9921f73..47ebb4a95 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -190,13 +190,16 @@ namespace Flow.Launcher.Storage
// remove the record from the bag
var bag = new ConcurrentQueue(value.Where(r => !r.Equals(result)));
- records[result.OriginQuery.RawQuery] = new ConcurrentBag(bag);
-
- // if the bag is empty, remove the bag from the dictionary
- if (value.IsEmpty)
+ if (bag.IsEmpty)
{
+ // if the bag is empty, remove the bag from the dictionary
records.TryRemove(result.OriginQuery.RawQuery, out _);
}
+ else
+ {
+ // change the bag in the dictionary
+ records[result.OriginQuery.RawQuery] = new ConcurrentBag(bag);
+ }
}
internal void AddOrUpdate(Result result)
From 7103c8d24afa9e65e7a03a9c6721aa2eac787cc2 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 2 May 2025 09:59:06 +0800
Subject: [PATCH 0998/1798] Mark old data as obsolete
---
Flow.Launcher/Storage/TopMostRecord.cs | 31 +++++++++++---------------
1 file changed, 13 insertions(+), 18 deletions(-)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index 47ebb4a95..7ddca721b 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -16,8 +16,10 @@ namespace Flow.Launcher.Storage
public FlowLauncherJsonStorageTopMostRecord()
{
+#pragma warning disable CS0618 // Type or member is obsolete
// Get old data & new data
var topMostRecordStorage = new FlowLauncherJsonStorage();
+#pragma warning restore CS0618 // Type or member is obsolete
_topMostRecordStorage = new FlowLauncherJsonStorage();
// Check if data exist
@@ -43,7 +45,16 @@ namespace Flow.Launcher.Storage
{
// Migrate old data to new data
_topMostRecord = _topMostRecordStorage.Load();
- _topMostRecord.Add(topMostRecordStorage.Load());
+ var oldTopMostRecord = topMostRecordStorage.Load();
+ if (oldTopMostRecord == null || oldTopMostRecord.records.IsEmpty) return;
+ foreach (var record in oldTopMostRecord.records)
+ {
+ _topMostRecord.records.AddOrUpdate(record.Key, new ConcurrentBag { record.Value }, (key, oldValue) =>
+ {
+ oldValue.Add(record.Value);
+ return oldValue;
+ });
+ }
// Delete old data and save the new data
try
@@ -87,6 +98,7 @@ namespace Flow.Launcher.Storage
///
/// Old data structure to support only one top most record for the same query
///
+ [Obsolete("Use MultipleTopMostRecord instead. This class will be removed in future versions.")]
internal class TopMostRecord
{
[JsonInclude]
@@ -147,23 +159,6 @@ namespace Flow.Launcher.Storage
[JsonConverter(typeof(ConcurrentDictionaryConcurrentBagConverter))]
public ConcurrentDictionary> records { get; private set; } = new();
- internal void Add(TopMostRecord topMostRecord)
- {
- if (topMostRecord == null || topMostRecord.records.IsEmpty)
- {
- return;
- }
-
- foreach (var record in topMostRecord.records)
- {
- records.AddOrUpdate(record.Key, new ConcurrentBag { record.Value }, (key, oldValue) =>
- {
- oldValue.Add(record.Value);
- return oldValue;
- });
- }
- }
-
internal bool IsTopMost(Result result)
{
// origin query is null when user select the context menu item directly of one item from query list
From b25777b73457d872637ad594cad571d65fdea43c Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 2 May 2025 10:28:35 +0800
Subject: [PATCH 0999/1798] Use ConcurrentQueue to storage the data sequence &
Put latter record topper
---
Flow.Launcher/Storage/TopMostRecord.cs | 81 ++++++++++++++++--------
Flow.Launcher/ViewModel/MainViewModel.cs | 5 +-
2 files changed, 59 insertions(+), 27 deletions(-)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index 7ddca721b..d75e9cb79 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -49,9 +49,11 @@ namespace Flow.Launcher.Storage
if (oldTopMostRecord == null || oldTopMostRecord.records.IsEmpty) return;
foreach (var record in oldTopMostRecord.records)
{
- _topMostRecord.records.AddOrUpdate(record.Key, new ConcurrentBag { record.Value }, (key, oldValue) =>
+ var newValue = new ConcurrentQueue();
+ newValue.Enqueue(record.Value);
+ _topMostRecord.records.AddOrUpdate(record.Key, newValue, (key, oldValue) =>
{
- oldValue.Add(record.Value);
+ oldValue.Enqueue(record.Value);
return oldValue;
});
}
@@ -84,6 +86,11 @@ namespace Flow.Launcher.Storage
return _topMostRecord.IsTopMost(result);
}
+ public int GetTopMostIndex(Result result)
+ {
+ return _topMostRecord.GetTopMostIndex(result);
+ }
+
public void Remove(Result result)
{
_topMostRecord.Remove(result);
@@ -156,8 +163,8 @@ namespace Flow.Launcher.Storage
internal class MultipleTopMostRecord
{
[JsonInclude]
- [JsonConverter(typeof(ConcurrentDictionaryConcurrentBagConverter))]
- public ConcurrentDictionary> records { get; private set; } = new();
+ [JsonConverter(typeof(ConcurrentDictionaryConcurrentQueueConverter))]
+ public ConcurrentDictionary> records { get; private set; } = new();
internal bool IsTopMost(Result result)
{
@@ -173,6 +180,32 @@ namespace Flow.Launcher.Storage
return value.Any(record => record.Equals(result));
}
+ internal int GetTopMostIndex(Result result)
+ {
+ // origin query is null when user select the context menu item directly of one item from query list
+ // in this case, we do not need to check if the result is top most
+ if (records.IsEmpty || result.OriginQuery == null ||
+ !records.TryGetValue(result.OriginQuery.RawQuery, out var value))
+ {
+ return -1;
+ }
+
+ // since this dictionary should be very small (or empty) going over it should be pretty fast.
+ // since the latter items should be more recent, we should return the smaller index for score to subtract
+ // which can make them more topmost
+ // A, B, C => 2, 1, 0 => (max - 2), (max - 1), (max - 0)
+ var index = 0;
+ foreach (var record in value)
+ {
+ if (record.Equals(result))
+ {
+ return value.Count - 1 - index;
+ }
+ index++;
+ }
+ return -1;
+ }
+
internal void Remove(Result result)
{
// origin query is null when user select the context menu item directly of one item from query list
@@ -183,17 +216,17 @@ namespace Flow.Launcher.Storage
return;
}
- // remove the record from the bag
- var bag = new ConcurrentQueue(value.Where(r => !r.Equals(result)));
- if (bag.IsEmpty)
+ // remove the record from the queue
+ var queue = new ConcurrentQueue(value.Where(r => !r.Equals(result)));
+ if (queue.IsEmpty)
{
- // if the bag is empty, remove the bag from the dictionary
+ // if the queue is empty, remove the queue from the dictionary
records.TryRemove(result.OriginQuery.RawQuery, out _);
}
else
{
- // change the bag in the dictionary
- records[result.OriginQuery.RawQuery] = new ConcurrentBag(bag);
+ // change the queue in the dictionary
+ records[result.OriginQuery.RawQuery] = queue;
}
}
@@ -215,40 +248,38 @@ namespace Flow.Launcher.Storage
};
if (!records.TryGetValue(result.OriginQuery.RawQuery, out var value))
{
- // create a new bag if it does not exist
- value = new ConcurrentBag()
- {
- record
- };
+ // create a new queue if it does not exist
+ value = new ConcurrentQueue();
+ value.Enqueue(record);
records.TryAdd(result.OriginQuery.RawQuery, value);
}
else
{
- // add or update the record in the bag
- var bag = new ConcurrentQueue(value.Where(r => !r.Equals(result))); // make sure we don't have duplicates
- bag.Enqueue(record);
- records[result.OriginQuery.RawQuery] = new ConcurrentBag(bag);
+ // add or update the record in the queue
+ var queue = new ConcurrentQueue(value.Where(r => !r.Equals(result))); // make sure we don't have duplicates
+ queue.Enqueue(record);
+ records[result.OriginQuery.RawQuery] = queue;
}
}
}
///
- /// Because ConcurrentBag does not support serialization, we need to convert it to a List
+ /// Because ConcurrentQueue does not support serialization, we need to convert it to a List
///
- internal class ConcurrentDictionaryConcurrentBagConverter : JsonConverter>>
+ internal class ConcurrentDictionaryConcurrentQueueConverter : JsonConverter>>
{
- public override ConcurrentDictionary> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ public override ConcurrentDictionary> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var dictionary = JsonSerializer.Deserialize>>(ref reader, options);
- var concurrentDictionary = new ConcurrentDictionary>();
+ var concurrentDictionary = new ConcurrentDictionary>();
foreach (var kvp in dictionary)
{
- concurrentDictionary.TryAdd(kvp.Key, new ConcurrentBag(kvp.Value));
+ concurrentDictionary.TryAdd(kvp.Key, new ConcurrentQueue(kvp.Value));
}
return concurrentDictionary;
}
- public override void Write(Utf8JsonWriter writer, ConcurrentDictionary> value, JsonSerializerOptions options)
+ public override void Write(Utf8JsonWriter writer, ConcurrentDictionary> value, JsonSerializerOptions options)
{
var dict = new Dictionary>();
foreach (var kvp in value)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 54ad6c288..adb04279e 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1643,9 +1643,10 @@ namespace Flow.Launcher.ViewModel
{
foreach (var result in metaResults.Results)
{
- if (_topMostRecord.IsTopMost(result))
+ var deviationIndex = _topMostRecord.GetTopMostIndex(result);
+ if (deviationIndex != -1)
{
- result.Score = Result.MaxScore;
+ result.Score = Result.MaxScore - deviationIndex;
}
else
{
From 1cf264a3a9c5d519482f5585e7fb54ad23ce9dfe Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Fri, 2 May 2025 10:32:24 +0800
Subject: [PATCH 1000/1798] Add code comments
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
Flow.Launcher/ViewModel/MainViewModel.cs | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index adb04279e..96e039ebe 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1646,6 +1646,8 @@ namespace Flow.Launcher.ViewModel
var deviationIndex = _topMostRecord.GetTopMostIndex(result);
if (deviationIndex != -1)
{
+ // Adjust the score based on the result's position in the top-most list.
+ // A lower deviationIndex (closer to the top) results in a higher score.
result.Score = Result.MaxScore - deviationIndex;
}
else
From 8bb96d7f5866b5bf90dbf0224137144ccd91bd70 Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Fri, 2 May 2025 12:26:14 +0800
Subject: [PATCH 1001/1798] Fix copy to clipboard STA thread issue & Support
retry for copy & Async build-in shortcut model & Fix build shortcuts text
replace issue & Fix startup window hide issue (#3314)
---
Flow.Launcher.Core/Plugin/QueryBuilder.cs | 6 +-
Flow.Launcher.Core/Resource/Theme.cs | 20 +-
.../NativeMethods.txt | 5 +-
.../UserSettings/CustomShortcutModel.cs | 67 ++++--
.../UserSettings/Settings.cs | 4 +-
Flow.Launcher.Infrastructure/Win32Helper.cs | 74 +++++++
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs | 5 +-
Flow.Launcher.Plugin/Query.cs | 7 +-
Flow.Launcher/App.xaml.cs | 9 +-
Flow.Launcher/Helper/DataWebRequestFactory.cs | 12 +-
Flow.Launcher/Helper/ErrorReporting.cs | 18 +-
Flow.Launcher/Languages/en.xaml | 1 +
Flow.Launcher/MainWindow.xaml.cs | 4 -
Flow.Launcher/PublicAPIInstance.cs | 88 ++++++--
.../SettingsPanePluginStoreViewModel.cs | 4 +-
.../SettingsPanePluginsViewModel.cs | 33 ++-
.../Views/SettingsPanePlugins.xaml | 9 +-
.../Views/SettingsPanePlugins.xaml.cs | 31 ++-
Flow.Launcher/ViewModel/MainViewModel.cs | 207 ++++++++++++------
19 files changed, 444 insertions(+), 160 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/QueryBuilder.cs b/Flow.Launcher.Core/Plugin/QueryBuilder.cs
index 3dc7877ac..0ef3f30f5 100644
--- a/Flow.Launcher.Core/Plugin/QueryBuilder.cs
+++ b/Flow.Launcher.Core/Plugin/QueryBuilder.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using Flow.Launcher.Plugin;
@@ -33,7 +33,7 @@ namespace Flow.Launcher.Core.Plugin
searchTerms = terms;
}
- return new Query ()
+ return new Query()
{
Search = search,
RawQuery = rawQuery,
@@ -42,4 +42,4 @@ namespace Flow.Launcher.Core.Plugin
};
}
}
-}
\ No newline at end of file
+}
diff --git a/Flow.Launcher.Core/Resource/Theme.cs b/Flow.Launcher.Core/Resource/Theme.cs
index a46932c6a..059359694 100644
--- a/Flow.Launcher.Core/Resource/Theme.cs
+++ b/Flow.Launcher.Core/Resource/Theme.cs
@@ -76,7 +76,7 @@ namespace Flow.Launcher.Core.Resource
{
_api.LogError(ClassName, "Current theme resource not found. Initializing with default theme.");
_oldTheme = Constant.DefaultTheme;
- };
+ }
}
#endregion
@@ -126,7 +126,7 @@ namespace Flow.Launcher.Core.Resource
// Load a ResourceDictionary for the specified theme.
var themeName = _settings.Theme;
var dict = GetThemeResourceDictionary(themeName);
-
+
// Apply font settings to the theme resource.
ApplyFontSettings(dict);
UpdateResourceDictionary(dict);
@@ -152,11 +152,11 @@ namespace Flow.Launcher.Core.Resource
var fontStyle = FontHelper.GetFontStyleFromInvariantStringOrNormal(_settings.QueryBoxFontStyle);
var fontWeight = FontHelper.GetFontWeightFromInvariantStringOrNormal(_settings.QueryBoxFontWeight);
var fontStretch = FontHelper.GetFontStretchFromInvariantStringOrNormal(_settings.QueryBoxFontStretch);
-
+
SetFontProperties(queryBoxStyle, fontFamily, fontStyle, fontWeight, fontStretch, true);
SetFontProperties(querySuggestionBoxStyle, fontFamily, fontStyle, fontWeight, fontStretch, false);
}
-
+
if (dict["ItemTitleStyle"] is Style resultItemStyle &&
dict["ItemTitleSelectedStyle"] is Style resultItemSelectedStyle &&
dict["ItemHotkeyStyle"] is Style resultHotkeyItemStyle &&
@@ -172,7 +172,7 @@ namespace Flow.Launcher.Core.Resource
SetFontProperties(resultHotkeyItemStyle, fontFamily, fontStyle, fontWeight, fontStretch, false);
SetFontProperties(resultHotkeyItemSelectedStyle, fontFamily, fontStyle, fontWeight, fontStretch, false);
}
-
+
if (dict["ItemSubTitleStyle"] is Style resultSubItemStyle &&
dict["ItemSubTitleSelectedStyle"] is Style resultSubItemSelectedStyle)
{
@@ -197,7 +197,7 @@ namespace Flow.Launcher.Core.Resource
// First, find the setters to remove and store them in a list
var settersToRemove = style.Setters
.OfType()
- .Where(setter =>
+ .Where(setter =>
setter.Property == Control.FontFamilyProperty ||
setter.Property == Control.FontStyleProperty ||
setter.Property == Control.FontWeightProperty ||
@@ -227,18 +227,18 @@ namespace Flow.Launcher.Core.Resource
{
var settersToRemove = style.Setters
.OfType()
- .Where(setter =>
+ .Where(setter =>
setter.Property == TextBlock.FontFamilyProperty ||
setter.Property == TextBlock.FontStyleProperty ||
setter.Property == TextBlock.FontWeightProperty ||
setter.Property == TextBlock.FontStretchProperty)
.ToList();
-
+
foreach (var setter in settersToRemove)
{
style.Setters.Remove(setter);
}
-
+
style.Setters.Add(new Setter(TextBlock.FontFamilyProperty, fontFamily));
style.Setters.Add(new Setter(TextBlock.FontStyleProperty, fontStyle));
style.Setters.Add(new Setter(TextBlock.FontWeightProperty, fontWeight));
@@ -421,7 +421,7 @@ namespace Flow.Launcher.Core.Resource
// Retrieve theme resource – always use the resource with font settings applied.
var resourceDict = GetResourceDictionary(theme);
-
+
UpdateResourceDictionary(resourceDict);
_settings.Theme = theme;
diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt
index 18b206022..0e50420b0 100644
--- a/Flow.Launcher.Infrastructure/NativeMethods.txt
+++ b/Flow.Launcher.Infrastructure/NativeMethods.txt
@@ -43,6 +43,9 @@ MONITORINFOEXW
WM_ENTERSIZEMOVE
WM_EXITSIZEMOVE
+OleInitialize
+OleUninitialize
+
GetKeyboardLayout
GetWindowThreadProcessId
ActivateKeyboardLayout
@@ -53,4 +56,4 @@ INPUTLANGCHANGE_FORWARD
LOCALE_TRANSIENT_KEYBOARD1
LOCALE_TRANSIENT_KEYBOARD2
LOCALE_TRANSIENT_KEYBOARD3
-LOCALE_TRANSIENT_KEYBOARD4
\ No newline at end of file
+LOCALE_TRANSIENT_KEYBOARD4
diff --git a/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
index 71020369a..2d15b54c5 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
@@ -1,15 +1,15 @@
using System;
using System.Text.Json.Serialization;
+using System.Threading.Tasks;
namespace Flow.Launcher.Infrastructure.UserSettings
{
+ #region Base
+
public abstract class ShortcutBaseModel
{
public string Key { get; set; }
- [JsonIgnore]
- public Func Expand { get; set; } = () => { return ""; };
-
public override bool Equals(object obj)
{
return obj is ShortcutBaseModel other &&
@@ -22,16 +22,14 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
}
- public class CustomShortcutModel : ShortcutBaseModel
+ public class BaseCustomShortcutModel : ShortcutBaseModel
{
public string Value { get; set; }
- [JsonConstructorAttribute]
- public CustomShortcutModel(string key, string value)
+ public BaseCustomShortcutModel(string key, string value)
{
Key = key;
Value = value;
- Expand = () => { return Value; };
}
public void Deconstruct(out string key, out string value)
@@ -40,26 +38,69 @@ namespace Flow.Launcher.Infrastructure.UserSettings
value = Value;
}
- public static implicit operator (string Key, string Value)(CustomShortcutModel shortcut)
+ public static implicit operator (string Key, string Value)(BaseCustomShortcutModel shortcut)
{
return (shortcut.Key, shortcut.Value);
}
- public static implicit operator CustomShortcutModel((string Key, string Value) shortcut)
+ public static implicit operator BaseCustomShortcutModel((string Key, string Value) shortcut)
{
- return new CustomShortcutModel(shortcut.Key, shortcut.Value);
+ return new BaseCustomShortcutModel(shortcut.Key, shortcut.Value);
}
}
- public class BuiltinShortcutModel : ShortcutBaseModel
+ public class BaseBuiltinShortcutModel : ShortcutBaseModel
{
public string Description { get; set; }
- public BuiltinShortcutModel(string key, string description, Func expand)
+ public BaseBuiltinShortcutModel(string key, string description)
{
Key = key;
Description = description;
- Expand = expand ?? (() => { return ""; });
}
}
+
+ #endregion
+
+ #region Custom Shortcut
+
+ public class CustomShortcutModel : BaseCustomShortcutModel
+ {
+ [JsonIgnore]
+ public Func Expand { get; set; } = () => { return string.Empty; };
+
+ [JsonConstructor]
+ public CustomShortcutModel(string key, string value) : base(key, value)
+ {
+ Expand = () => { return Value; };
+ }
+ }
+
+ #endregion
+
+ #region Builtin Shortcut
+
+ public class BuiltinShortcutModel : BaseBuiltinShortcutModel
+ {
+ [JsonIgnore]
+ public Func Expand { get; set; } = () => { return string.Empty; };
+
+ public BuiltinShortcutModel(string key, string description, Func expand) : base(key, description)
+ {
+ Expand = expand ?? (() => { return string.Empty; });
+ }
+ }
+
+ public class AsyncBuiltinShortcutModel : BaseBuiltinShortcutModel
+ {
+ [JsonIgnore]
+ public Func> ExpandAsync { get; set; } = () => { return Task.FromResult(string.Empty); };
+
+ public AsyncBuiltinShortcutModel(string key, string description, Func> expandAsync) : base(key, description)
+ {
+ ExpandAsync = expandAsync ?? (() => { return Task.FromResult(string.Empty); });
+ }
+ }
+
+ #endregion
}
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 1cccc38d9..b7a1d1f63 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -312,9 +312,9 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public ObservableCollection CustomShortcuts { get; set; } = new ObservableCollection();
[JsonIgnore]
- public ObservableCollection BuiltinShortcuts { get; set; } = new()
+ public ObservableCollection BuiltinShortcuts { get; set; } = new()
{
- new BuiltinShortcutModel("{clipboard}", "shortcut_clipboard_description", Clipboard.GetText),
+ new AsyncBuiltinShortcutModel("{clipboard}", "shortcut_clipboard_description", () => Win32Helper.StartSTATaskAsync(Clipboard.GetText)),
new BuiltinShortcutModel("{active_explorer_path}", "shortcut_active_explorer_path", FileExplorerHelper.GetActiveExplorerPath)
};
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 2788060eb..783ade14e 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -5,6 +5,8 @@ using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Runtime.InteropServices;
+using System.Threading;
+using System.Threading.Tasks;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Markup;
@@ -337,6 +339,78 @@ namespace Flow.Launcher.Infrastructure
#endregion
+ #region STA Thread
+
+ /*
+ Inspired by https://github.com/files-community/Files code on STA Thread handling.
+ */
+
+ public static Task StartSTATaskAsync(Action action)
+ {
+ var taskCompletionSource = new TaskCompletionSource();
+ Thread thread = new(() =>
+ {
+ PInvoke.OleInitialize();
+
+ try
+ {
+ action();
+ taskCompletionSource.SetResult();
+ }
+ catch (System.Exception ex)
+ {
+ taskCompletionSource.SetException(ex);
+ }
+ finally
+ {
+ PInvoke.OleUninitialize();
+ }
+ })
+ {
+ IsBackground = true,
+ Priority = ThreadPriority.Normal
+ };
+
+ thread.SetApartmentState(ApartmentState.STA);
+ thread.Start();
+
+ return taskCompletionSource.Task;
+ }
+
+ public static Task StartSTATaskAsync(Func func)
+ {
+ var taskCompletionSource = new TaskCompletionSource();
+
+ Thread thread = new(() =>
+ {
+ PInvoke.OleInitialize();
+
+ try
+ {
+ taskCompletionSource.SetResult(func());
+ }
+ catch (System.Exception ex)
+ {
+ taskCompletionSource.SetException(ex);
+ }
+ finally
+ {
+ PInvoke.OleUninitialize();
+ }
+ })
+ {
+ IsBackground = true,
+ Priority = ThreadPriority.Normal
+ };
+
+ thread.SetApartmentState(ApartmentState.STA);
+ thread.Start();
+
+ return taskCompletionSource.Task;
+ }
+
+ #endregion
+
#region Keyboard Layout
private const string UserProfileRegistryPath = @"Control Panel\International\User Profile";
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index 31580fbe8..d4eb02a90 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -471,8 +471,11 @@ namespace Flow.Launcher.Plugin
public Task UpdatePluginManifestAsync(bool usePrimaryUrlOnly = false, CancellationToken token = default);
///
- /// Get the plugin manifest
+ /// Get the plugin manifest.
///
+ ///
+ /// If Flow cannot get manifest data, this could be null
+ ///
///
public IReadOnlyList GetPluginManifest();
diff --git a/Flow.Launcher.Plugin/Query.cs b/Flow.Launcher.Plugin/Query.cs
index 913dc31ae..c3eede4c6 100644
--- a/Flow.Launcher.Plugin/Query.cs
+++ b/Flow.Launcher.Plugin/Query.cs
@@ -8,7 +8,8 @@ namespace Flow.Launcher.Plugin
public class Query
{
///
- /// Raw query, this includes action keyword if it has
+ /// Raw query, this includes action keyword if it has.
+ /// It has handled buildin custom query shortkeys and build-in shortcuts, and it trims the whitespace.
/// We didn't recommend use this property directly. You should always use Search property.
///
public string RawQuery { get; internal init; }
@@ -63,10 +64,10 @@ namespace Flow.Launcher.Plugin
///
[JsonIgnore]
public string FirstSearch => SplitSearch(0);
-
+
[JsonIgnore]
private string _secondToEndSearch;
-
+
///
/// strings from second search (including) to last search
///
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 1b57d5cbe..402812a92 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -23,6 +23,7 @@ using Flow.Launcher.SettingPages.ViewModels;
using Flow.Launcher.ViewModel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
+using Microsoft.VisualStudio.Threading;
namespace Flow.Launcher
{
@@ -198,6 +199,10 @@ namespace Flow.Launcher
Current.MainWindow = _mainWindow;
Current.MainWindow.Title = Constant.FlowLauncher;
+ // Initialize hotkey mapper instantly after main window is created because
+ // it will steal focus from main window which causes window hide
+ HotKeyMapper.Initialize();
+
// Main windows needs initialized before theme change because of blur settings
Ioc.Default.GetRequiredService().ChangeTheme();
@@ -239,6 +244,7 @@ namespace Flow.Launcher
}
}
+ [Conditional("RELEASE")]
private void AutoUpdates()
{
_ = Task.Run(async () =>
@@ -296,13 +302,12 @@ namespace Flow.Launcher
[Conditional("RELEASE")]
private static void RegisterAppDomainExceptions()
{
- AppDomain.CurrentDomain.UnhandledException += ErrorReporting.UnhandledExceptionHandle;
+ AppDomain.CurrentDomain.UnhandledException += ErrorReporting.UnhandledException;
}
///
/// Let exception throw as normal is better for Debug
///
- [Conditional("RELEASE")]
private static void RegisterTaskSchedulerUnhandledException()
{
TaskScheduler.UnobservedTaskException += ErrorReporting.TaskSchedulerUnobservedTaskException;
diff --git a/Flow.Launcher/Helper/DataWebRequestFactory.cs b/Flow.Launcher/Helper/DataWebRequestFactory.cs
index 2e72ee240..db198ede4 100644
--- a/Flow.Launcher/Helper/DataWebRequestFactory.cs
+++ b/Flow.Launcher/Helper/DataWebRequestFactory.cs
@@ -28,18 +28,18 @@ public class DataWebRequestFactory : IWebRequestCreate
public DataWebResponse(Uri uri)
{
- string uriString = uri.AbsoluteUri;
+ var uriString = uri.AbsoluteUri;
- int commaIndex = uriString.IndexOf(',');
- var headers = uriString.Substring(0, commaIndex).Split(';');
+ var commaIndex = uriString.IndexOf(',');
+ var headers = uriString[..commaIndex].Split(';');
_contentType = headers[0];
- string dataString = uriString.Substring(commaIndex + 1);
+ var dataString = uriString[(commaIndex + 1)..];
_data = Convert.FromBase64String(dataString);
}
public override string ContentType
{
- get { return _contentType; }
+ get => _contentType;
set
{
throw new NotSupportedException();
@@ -48,7 +48,7 @@ public class DataWebRequestFactory : IWebRequestCreate
public override long ContentLength
{
- get { return _data.Length; }
+ get => _data.Length;
set
{
throw new NotSupportedException();
diff --git a/Flow.Launcher/Helper/ErrorReporting.cs b/Flow.Launcher/Helper/ErrorReporting.cs
index b1ddba717..aa810ba65 100644
--- a/Flow.Launcher/Helper/ErrorReporting.cs
+++ b/Flow.Launcher/Helper/ErrorReporting.cs
@@ -1,4 +1,5 @@
using System;
+using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
@@ -10,33 +11,34 @@ namespace Flow.Launcher.Helper;
public static class ErrorReporting
{
- private static void Report(Exception e)
+ private static void Report(Exception e, [CallerMemberName] string methodName = "UnHandledException")
{
- var logger = LogManager.GetLogger("UnHandledException");
+ var logger = LogManager.GetLogger(methodName);
logger.Fatal(ExceptionFormatter.FormatExcpetion(e));
var reportWindow = new ReportWindow(e);
reportWindow.Show();
}
- public static void UnhandledExceptionHandle(object sender, UnhandledExceptionEventArgs e)
+ public static void UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
- //handle non-ui thread exceptions
+ // handle non-ui thread exceptions
Report((Exception)e.ExceptionObject);
}
public static void DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
- //handle ui thread exceptions
+ // handle ui thread exceptions
Report(e.Exception);
- //prevent application exist, so the user can copy prompted error info
+ // prevent application exist, so the user can copy prompted error info
e.Handled = true;
}
public static void TaskSchedulerUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
- //handle unobserved task exceptions
+ // handle unobserved task exceptions on UI thread
Application.Current.Dispatcher.Invoke(() => Report(e.Exception));
- //prevent application exit, so the user can copy the prompted error info
+ // prevent application exit, so the user can copy the prompted error info
+ e.SetObserved();
}
public static string RuntimeInfo()
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index d3252cb31..ca0ed33b5 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -394,6 +394,7 @@
This new Action Keyword is the same as old, please choose a different oneSuccessCompleted successfully
+ Failed to copyEnter 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.
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 10aff050e..ae7b098a2 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -16,7 +16,6 @@ using System.Windows.Threading;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Core.Resource;
-using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Infrastructure.Image;
@@ -182,9 +181,6 @@ namespace Flow.Launcher
// Set the initial state of the QueryTextBoxCursorMovedToEnd property
// Without this part, when shown for the first time, switching the context menu does not move the cursor to the end.
_viewModel.QueryTextCursorMovedToEnd = false;
-
- // Initialize hotkey mapper after window is loaded
- HotKeyMapper.Initialize();
// View model property changed event
_viewModel.PropertyChanged += (o, e) =>
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index 3abc57b8a..5b8e8c9af 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -40,7 +40,7 @@ namespace Flow.Launcher
private readonly Settings _settings;
private readonly MainViewModel _mainVM;
- // Must use getter to access Application.Current.Resources.MergedDictionaries so earlier
+ // Must use getter to avoid accessing Application.Current.Resources.MergedDictionaries so earlier in theme constructor
private Theme _theme;
private Theme Theme => _theme ??= Ioc.Default.GetRequiredService();
@@ -69,8 +69,7 @@ namespace Flow.Launcher
_mainVM.ChangeQueryText(query, requery);
}
-#pragma warning disable VSTHRD100 // Avoid async void methods
-
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
public async void RestartApp()
{
_mainVM.Hide();
@@ -89,8 +88,6 @@ namespace Flow.Launcher
UpdateManager.RestartApp(Constant.ApplicationFileName);
}
-#pragma warning restore VSTHRD100 // Avoid async void methods
-
public void ShowMainWindow() => _mainVM.Show();
public void HideMainWindow() => _mainVM.Hide();
@@ -145,37 +142,92 @@ namespace Flow.Launcher
ShellCommand.Execute(startInfo);
}
- public void CopyToClipboard(string stringToCopy, bool directCopy = false, bool showDefaultNotification = true)
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
+ public async void CopyToClipboard(string stringToCopy, bool directCopy = false, bool showDefaultNotification = true)
{
if (string.IsNullOrEmpty(stringToCopy))
+ {
return;
+ }
var isFile = File.Exists(stringToCopy);
if (directCopy && (isFile || Directory.Exists(stringToCopy)))
{
- var paths = new StringCollection
+ // Sometimes the clipboard is locked and cannot be accessed,
+ // we need to retry a few times before giving up
+ var exception = await RetryActionOnSTAThreadAsync(() =>
+ {
+ var paths = new StringCollection
{
stringToCopy
};
- Clipboard.SetFileDropList(paths);
-
- if (showDefaultNotification)
- ShowMsg(
- $"{GetTranslation("copy")} {(isFile ? GetTranslation("fileTitle") : GetTranslation("folderTitle"))}",
- GetTranslation("completedSuccessfully"));
+ Clipboard.SetFileDropList(paths);
+ });
+
+ if (exception == null)
+ {
+ if (showDefaultNotification)
+ {
+ ShowMsg(
+ $"{GetTranslation("copy")} {(isFile ? GetTranslation("fileTitle") : GetTranslation("folderTitle"))}",
+ GetTranslation("completedSuccessfully"));
+ }
+ }
+ else
+ {
+ LogException(nameof(PublicAPIInstance), "Failed to copy file/folder to clipboard", exception);
+ ShowMsgError(GetTranslation("failedToCopy"));
+ }
}
else
{
- Clipboard.SetDataObject(stringToCopy);
+ // Sometimes the clipboard is locked and cannot be accessed,
+ // we need to retry a few times before giving up
+ var exception = await RetryActionOnSTAThreadAsync(() =>
+ {
+ // We should use SetText instead of SetDataObject to avoid the clipboard being locked by other applications
+ Clipboard.SetText(stringToCopy);
+ });
- if (showDefaultNotification)
- ShowMsg(
- $"{GetTranslation("copy")} {GetTranslation("textTitle")}",
- GetTranslation("completedSuccessfully"));
+ if (exception == null)
+ {
+ if (showDefaultNotification)
+ {
+ ShowMsg(
+ $"{GetTranslation("copy")} {GetTranslation("textTitle")}",
+ GetTranslation("completedSuccessfully"));
+ }
+ }
+ else
+ {
+ LogException(nameof(PublicAPIInstance), "Failed to copy text to clipboard", exception);
+ ShowMsgError(GetTranslation("failedToCopy"));
+ }
}
}
+ private static async Task RetryActionOnSTAThreadAsync(Action action, int retryCount = 6, int retryDelay = 150)
+ {
+ for (var i = 0; i < retryCount; i++)
+ {
+ try
+ {
+ await Win32Helper.StartSTATaskAsync(action).ConfigureAwait(false);
+ break;
+ }
+ catch (Exception e)
+ {
+ if (i == retryCount - 1)
+ {
+ return e;
+ }
+ await Task.Delay(retryDelay);
+ }
+ }
+ return null;
+ }
+
public void StartLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Visible;
public void StopLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Collapsed;
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
index 249e4dd42..07df0682d 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
@@ -79,8 +79,8 @@ public partial class SettingsPanePluginStoreViewModel : BaseModel
}
}
- public IList ExternalPlugins =>
- App.API.GetPluginManifest()?.Select(p => new PluginStoreItemViewModel(p))
+ public IList ExternalPlugins => App.API.GetPluginManifest()?
+ .Select(p => new PluginStoreItemViewModel(p))
.OrderByDescending(p => p.Category == PluginStoreItemViewModel.NewRelease)
.ThenByDescending(p => p.Category == PluginStoreItemViewModel.RecentlyUpdated)
.ThenByDescending(p => p.Category == PluginStoreItemViewModel.None)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs
index de7cf15c3..abb314355 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs
@@ -86,12 +86,22 @@ public partial class SettingsPanePluginsViewModel : BaseModel
UpdateEnumDropdownLocalizations();
}
- public string FilterText { get; set; } = string.Empty;
+ private string filterText = string.Empty;
+ public string FilterText
+ {
+ get => filterText;
+ set
+ {
+ if (filterText != value)
+ {
+ filterText = value;
+ OnPropertyChanged();
+ }
+ }
+ }
- public PluginViewModel? SelectedPlugin { get; set; }
-
- private IEnumerable? _pluginViewModels;
- private IEnumerable PluginViewModels => _pluginViewModels ??= PluginManager.AllPlugins
+ private IList? _pluginViewModels;
+ public IList PluginViewModels => _pluginViewModels ??= PluginManager.AllPlugins
.OrderBy(plugin => plugin.Metadata.Disabled)
.ThenBy(plugin => plugin.Metadata.Name)
.Select(plugin => new PluginViewModel
@@ -102,13 +112,12 @@ public partial class SettingsPanePluginsViewModel : BaseModel
.Where(plugin => plugin.PluginSettingsObject != null)
.ToList();
- public List FilteredPluginViewModels => PluginViewModels
- .Where(v =>
- string.IsNullOrEmpty(FilterText) ||
- App.API.FuzzySearch(FilterText, v.PluginPair.Metadata.Name).IsSearchPrecisionScoreMet() ||
- App.API.FuzzySearch(FilterText, v.PluginPair.Metadata.Description).IsSearchPrecisionScoreMet()
- )
- .ToList();
+ public bool SatisfiesFilter(PluginViewModel plugin)
+ {
+ return string.IsNullOrEmpty(FilterText) ||
+ App.API.FuzzySearch(FilterText, plugin.PluginPair.Metadata.Name).IsSearchPrecisionScoreMet() ||
+ App.API.FuzzySearch(FilterText, plugin.PluginPair.Metadata.Description).IsSearchPrecisionScoreMet();
+ }
[RelayCommand]
private async Task OpenHelperAsync(Button button)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml
index bb742f800..52d77f914 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml
@@ -15,6 +15,12 @@
FocusManager.FocusedElement="{Binding ElementName=PluginFilterTextbox}"
KeyDown="SettingsPanePlugins_OnKeyDown"
mc:Ignorable="d">
+
+
+
@@ -115,10 +121,9 @@
Background="{DynamicResource Color01B}"
FontSize="14"
ItemContainerStyle="{StaticResource PluginList}"
- ItemsSource="{Binding FilteredPluginViewModels}"
+ ItemsSource="{Binding Source={StaticResource PluginCollectionView}}"
ScrollViewer.CanContentScroll="False"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
- SelectedItem="{Binding SelectedPlugin}"
SnapsToDevicePixels="True"
Style="{DynamicResource PluginListStyle}"
VirtualizingPanel.ScrollUnit="Pixel"
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs
index 97574b3ce..e9490804a 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs
@@ -1,7 +1,10 @@
-using System.Windows.Input;
+using System.ComponentModel;
+using System.Windows.Data;
+using System.Windows.Input;
using System.Windows.Navigation;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.SettingPages.ViewModels;
+using Flow.Launcher.ViewModel;
namespace Flow.Launcher.SettingPages.Views;
@@ -17,12 +20,38 @@ public partial class SettingsPanePlugins
DataContext = _viewModel;
InitializeComponent();
}
+ _viewModel.PropertyChanged += ViewModel_PropertyChanged;
base.OnNavigatedTo(e);
}
+ private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ if (e.PropertyName == nameof(SettingsPanePluginsViewModel.FilterText))
+ {
+ ((CollectionViewSource)FindResource("PluginCollectionView")).View.Refresh();
+ }
+ }
+
+ protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
+ {
+ _viewModel.PropertyChanged -= ViewModel_PropertyChanged;
+ base.OnNavigatingFrom(e);
+ }
+
private void SettingsPanePlugins_OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key is not Key.F || Keyboard.Modifiers is not ModifierKeys.Control) return;
PluginFilterTextbox.Focus();
}
+
+ private void PluginCollectionView_OnFilter(object sender, FilterEventArgs e)
+ {
+ if (e.Item is not PluginViewModel plugin)
+ {
+ e.Accepted = false;
+ return;
+ }
+
+ e.Accepted = _viewModel.SatisfiesFilter(plugin);
+ }
}
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 00675149b..2f1ed0f51 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -43,8 +43,7 @@ namespace Flow.Launcher.ViewModel
private readonly UserSelectedRecord _userSelectedRecord;
private readonly TopMostRecord _topMostRecord;
- private CancellationTokenSource _updateSource;
- private CancellationToken _updateToken;
+ private CancellationTokenSource _updateSource; // Used to cancel old query flows
private ChannelWriter _resultsUpdateChannelWriter;
private Task _resultsViewUpdateTask;
@@ -241,7 +240,7 @@ namespace Flow.Launcher.ViewModel
return;
}
- var token = e.Token == default ? _updateToken : e.Token;
+ var token = e.Token == default ? _updateSource.Token : e.Token;
// make a clone to avoid possible issue that plugin will also change the list and items when updating view model
var resultsCopy = DeepCloneResults(e.Results, token);
@@ -255,8 +254,11 @@ namespace Flow.Launcher.ViewModel
}
PluginManager.UpdatePluginMetadata(resultsCopy, pair.Metadata, e.Query);
- if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, pair.Metadata, e.Query,
- token)))
+
+ if (token.IsCancellationRequested) return;
+
+ if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, pair.Metadata, e.Query,
+ token)))
{
App.API.LogError(ClassName, "Unable to add item to Result Update Queue");
}
@@ -640,7 +642,31 @@ namespace Flow.Launcher.ViewModel
/// Force query even when Query Text doesn't change
public void ChangeQueryText(string queryText, bool isReQuery = false)
{
- _ = ChangeQueryTextAsync(queryText, isReQuery);
+ // Must check access so that we will not block the UI thread which causes window visibility issue
+ if (!Application.Current.Dispatcher.CheckAccess())
+ {
+ Application.Current.Dispatcher.Invoke(() => ChangeQueryText(queryText, isReQuery));
+ return;
+ }
+
+ if (QueryText != queryText)
+ {
+ // Change query text first
+ QueryText = queryText;
+ // When we are changing query from codes, we should not delay the query
+ Query(false, isReQuery: false);
+
+ // set to false so the subsequent set true triggers
+ // PropertyChanged and MoveQueryTextToEnd is called
+ QueryTextCursorMovedToEnd = false;
+ }
+ else if (isReQuery)
+ {
+ // When we are re-querying, we should not delay the query
+ Query(false, isReQuery: true);
+ }
+
+ QueryTextCursorMovedToEnd = true;
}
///
@@ -648,10 +674,10 @@ namespace Flow.Launcher.ViewModel
///
private async Task ChangeQueryTextAsync(string queryText, bool isReQuery = false)
{
- // Must check access so that we will not block the UI thread which cause window visibility issue
+ // Must check access so that we will not block the UI thread which causes window visibility issue
if (!Application.Current.Dispatcher.CheckAccess())
{
- await Application.Current.Dispatcher.InvokeAsync(() => ChangeQueryText(queryText, isReQuery));
+ await Application.Current.Dispatcher.InvokeAsync(() => ChangeQueryTextAsync(queryText, isReQuery));
return;
}
@@ -1050,7 +1076,18 @@ namespace Flow.Launcher.ViewModel
public void Query(bool searchDelay, bool isReQuery = false)
{
- _ = QueryAsync(searchDelay, isReQuery);
+ if (QueryResultsSelected())
+ {
+ _ = QueryResultsAsync(searchDelay, isReQuery);
+ }
+ else if (ContextMenuSelected())
+ {
+ QueryContextMenu();
+ }
+ else if (HistorySelected())
+ {
+ QueryHistory();
+ }
}
private async Task QueryAsync(bool searchDelay, bool isReQuery = false)
@@ -1160,20 +1197,45 @@ namespace Flow.Launcher.ViewModel
{
_updateSource?.Cancel();
- var query = ConstructQuery(QueryText, Settings.CustomShortcuts, Settings.BuiltinShortcuts);
+ var query = await ConstructQueryAsync(QueryText, Settings.CustomShortcuts, Settings.BuiltinShortcuts);
- var plugins = PluginManager.ValidPluginsForQuery(query);
-
- if (query == null || plugins.Count == 0) // shortcut expanded
+ if (query == null) // shortcut expanded
{
- Results.Clear();
+ // Hide and clear results again because running query may show and add some results
Results.Visibility = Visibility.Collapsed;
+ Results.Clear();
+
+ // Reset plugin icon
PluginIconPath = null;
PluginIconSource = null;
SearchIconVisibility = Visibility.Visible;
+
+ // Hide progress bar again because running query may set this to visible
+ ProgressBarVisibility = Visibility.Hidden;
return;
}
- else if (plugins.Count == 1)
+
+ _updateSource = new CancellationTokenSource();
+
+ ProgressBarVisibility = Visibility.Hidden;
+ _isQueryRunning = true;
+
+ // Switch to ThreadPool thread
+ await TaskScheduler.Default;
+
+ if (_updateSource.Token.IsCancellationRequested) return;
+
+ // Update the query's IsReQuery property to true if this is a re-query
+ query.IsReQuery = isReQuery;
+
+ // handle the exclusiveness of plugin using action keyword
+ RemoveOldQueryResults(query);
+
+ _lastQuery = query;
+
+ var plugins = PluginManager.ValidPluginsForQuery(query);
+
+ if (plugins.Count == 1)
{
PluginIconPath = plugins.Single().Metadata.IcoPath;
PluginIconSource = await App.API.LoadImageAsync(PluginIconPath);
@@ -1186,42 +1248,20 @@ namespace Flow.Launcher.ViewModel
SearchIconVisibility = Visibility.Visible;
}
- _updateSource?.Dispose();
-
- var currentUpdateSource = new CancellationTokenSource();
- _updateSource = currentUpdateSource;
- _updateToken = _updateSource.Token;
-
- ProgressBarVisibility = Visibility.Hidden;
- _isQueryRunning = true;
-
- // Switch to ThreadPool thread
- await TaskScheduler.Default;
-
- if (_updateSource.Token.IsCancellationRequested)
- return;
-
- // Update the query's IsReQuery property to true if this is a re-query
- query.IsReQuery = isReQuery;
-
- // handle the exclusiveness of plugin using action keyword
- RemoveOldQueryResults(query);
-
- _lastQuery = query;
-
- if (string.IsNullOrEmpty(query.ActionKeyword))
+ // Do not wait for performance improvement
+ /*if (string.IsNullOrEmpty(query.ActionKeyword))
{
// Wait 15 millisecond for query change in global query
// if query changes, return so that it won't be calculated
await Task.Delay(15, _updateSource.Token);
if (_updateSource.Token.IsCancellationRequested)
return;
- }
+ }*/
_ = Task.Delay(200, _updateSource.Token).ContinueWith(_ =>
{
// start the progress bar if query takes more than 200 ms and this is the current running query and it didn't finish yet
- if (!_updateSource.Token.IsCancellationRequested && _isQueryRunning)
+ if (_isQueryRunning)
{
ProgressBarVisibility = Visibility.Visible;
}
@@ -1248,12 +1288,12 @@ namespace Flow.Launcher.ViewModel
// nothing to do here
}
- if (_updateSource.Token.IsCancellationRequested)
- return;
+ if (_updateSource.Token.IsCancellationRequested) return;
// this should happen once after all queries are done so progress bar should continue
// until the end of all querying
_isQueryRunning = false;
+
if (!_updateSource.Token.IsCancellationRequested)
{
// update to hidden if this is still the current query
@@ -1269,8 +1309,7 @@ namespace Flow.Launcher.ViewModel
await Task.Delay(searchDelayTime, token);
- if (token.IsCancellationRequested)
- return;
+ if (token.IsCancellationRequested) return;
}
// Since it is wrapped within a ThreadPool Thread, the synchronous context is null
@@ -1279,8 +1318,7 @@ namespace Flow.Launcher.ViewModel
var results = await PluginManager.QueryForPluginAsync(plugin, query, token);
- if (token.IsCancellationRequested)
- return;
+ if (token.IsCancellationRequested) return;
IReadOnlyList resultsCopy;
if (results == null)
@@ -1301,6 +1339,8 @@ namespace Flow.Launcher.ViewModel
}
}
+ if (token.IsCancellationRequested) return;
+
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, plugin.Metadata, query,
token, reSelect)))
{
@@ -1309,16 +1349,16 @@ namespace Flow.Launcher.ViewModel
}
}
- private Query ConstructQuery(string queryText, IEnumerable customShortcuts,
- IEnumerable builtInShortcuts)
+ private async Task ConstructQueryAsync(string queryText, IEnumerable customShortcuts,
+ IEnumerable builtInShortcuts)
{
if (string.IsNullOrWhiteSpace(queryText))
{
return null;
}
- StringBuilder queryBuilder = new(queryText);
- StringBuilder queryBuilderTmp = new(queryText);
+ var queryBuilder = new StringBuilder(queryText);
+ var queryBuilderTmp = new StringBuilder(queryText);
// Sorting order is important here, the reason is for matching longest shortcut by default
foreach (var shortcut in customShortcuts.OrderByDescending(x => x.Key.Length))
@@ -1331,36 +1371,56 @@ namespace Flow.Launcher.ViewModel
queryBuilder.Replace('@' + shortcut.Key, shortcut.Expand());
}
- string customExpanded = queryBuilder.ToString();
+ // Applying builtin shortcuts
+ await BuildQueryAsync(builtInShortcuts, queryBuilder, queryBuilderTmp);
- Application.Current.Dispatcher.Invoke(() =>
+ return QueryBuilder.Build(queryBuilder.ToString().Trim(), PluginManager.NonGlobalPlugins);
+ }
+
+ private async Task BuildQueryAsync(IEnumerable builtInShortcuts,
+ StringBuilder queryBuilder, StringBuilder queryBuilderTmp)
+ {
+ var customExpanded = queryBuilder.ToString();
+
+ var queryChanged = false;
+
+ foreach (var shortcut in builtInShortcuts)
{
- foreach (var shortcut in builtInShortcuts)
+ try
{
- try
+ if (customExpanded.Contains(shortcut.Key))
{
- if (customExpanded.Contains(shortcut.Key))
+ string expansion;
+ if (shortcut is BuiltinShortcutModel syncShortcut)
{
- var expansion = shortcut.Expand();
- queryBuilder.Replace(shortcut.Key, expansion);
- queryBuilderTmp.Replace(shortcut.Key, expansion);
+ expansion = syncShortcut.Expand();
}
- }
- catch (Exception e)
- {
- App.API.LogException(ClassName,
- $"Error when expanding shortcut {shortcut.Key}",
- e);
+ else if (shortcut is AsyncBuiltinShortcutModel asyncShortcut)
+ {
+ expansion = await asyncShortcut.ExpandAsync();
+ }
+ else
+ {
+ continue;
+ }
+ queryBuilder.Replace(shortcut.Key, expansion);
+ queryBuilderTmp.Replace(shortcut.Key, expansion);
+ queryChanged = true;
}
}
- });
+ catch (Exception e)
+ {
+ App.API.LogException(ClassName, $"Error when expanding shortcut {shortcut.Key}", e);
+ }
+ }
- // show expanded builtin shortcuts
- // use private field to avoid infinite recursion
- _queryText = queryBuilderTmp.ToString();
-
- var query = QueryBuilder.Build(queryBuilder.ToString().Trim(), PluginManager.NonGlobalPlugins);
- return query;
+ if (queryChanged)
+ {
+ // show expanded builtin shortcuts
+ // use private field to avoid infinite recursion
+ _queryText = queryBuilderTmp.ToString();
+ OnPropertyChanged(nameof(QueryText));
+ }
}
private void RemoveOldQueryResults(Query query)
@@ -1489,6 +1549,9 @@ namespace Flow.Launcher.ViewModel
public void Show()
{
+ // When application is exiting, we should not show the main window
+ if (App.Exiting) return;
+
// When application is exiting, the Application.Current will be null
Application.Current?.Dispatcher.Invoke(() =>
{
From 62e1252ac4a01aff2f2244182092887373282f87 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 2 May 2025 14:37:10 +0800
Subject: [PATCH 1002/1798] Use BackToQueryResults for code quality
---
Flow.Launcher/ViewModel/MainViewModel.cs | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 2f1ed0f51..2526adef8 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1170,7 +1170,7 @@ namespace Flow.Launcher.ViewModel
OriginQuery = new Query { RawQuery = h.Query },
Action = _ =>
{
- SelectedResults = Results;
+ App.API.BackToQueryResults();
App.API.ChangeQuery(h.Query);
return false;
}
@@ -1600,10 +1600,7 @@ namespace Flow.Launcher.ViewModel
await CloseExternalPreviewAsync();
}
- if (!QueryResultsSelected())
- {
- SelectedResults = Results;
- }
+ BackToQueryResults();
switch (Settings.LastQueryMode)
{
From b1197858de49abc6c4583085b6124c462f82cfd0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 2 May 2025 14:40:18 +0800
Subject: [PATCH 1003/1798] Do not query when back from the context menu
---
Flow.Launcher/ViewModel/MainViewModel.cs | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 2526adef8..f0513c7d9 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -34,6 +34,7 @@ namespace Flow.Launcher.ViewModel
private bool _isQueryRunning;
private Query _lastQuery;
private string _queryTextBeforeLeaveResults;
+ private string _ignoredQueryText = null;
private readonly FlowLauncherJsonStorage _historyItemsStorage;
private readonly FlowLauncherJsonStorage _userSelectedRecordStorage;
@@ -730,6 +731,9 @@ namespace Flow.Launcher.ViewModel
if (isReturningFromContextMenu)
{
_queryText = _queryTextBeforeLeaveResults;
+ // When executing OnPropertyChanged, QueryTextBox_TextChanged1 and Query will be called
+ // So we need to ignore it so that we will not call Query again
+ _ignoredQueryText = _queryText;
OnPropertyChanged(nameof(QueryText));
QueryTextCursorMovedToEnd = true;
}
@@ -1076,6 +1080,20 @@ namespace Flow.Launcher.ViewModel
public void Query(bool searchDelay, bool isReQuery = false)
{
+ if (_ignoredQueryText != null)
+ {
+ if (_ignoredQueryText == QueryText)
+ {
+ _ignoredQueryText = null;
+ return;
+ }
+ else
+ {
+ // If _ignoredQueryText does not match current QueryText, we should still execute Query
+ _ignoredQueryText = null;
+ }
+ }
+
if (QueryResultsSelected())
{
_ = QueryResultsAsync(searchDelay, isReQuery);
From f935d5f078dc414b72375cfa5d01e28e75033a24 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 2 May 2025 15:06:20 +0800
Subject: [PATCH 1004/1798] Improve code comments
---
Flow.Launcher/ViewModel/MainViewModel.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index f0513c7d9..607b70fd2 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1432,10 +1432,10 @@ namespace Flow.Launcher.ViewModel
}
}
+ // Show expanded builtin shortcuts
if (queryChanged)
{
- // show expanded builtin shortcuts
- // use private field to avoid infinite recursion
+ // Use private field to avoid infinite recursion
_queryText = queryBuilderTmp.ToString();
OnPropertyChanged(nameof(QueryText));
}
From 247272c9aa7a986395a14beab3d6a5b2e22e4b75 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 2 May 2025 15:21:17 +0800
Subject: [PATCH 1005/1798] Do not query when expanding builtin shortcuts
---
Flow.Launcher/ViewModel/MainViewModel.cs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 607b70fd2..c505c32a3 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1437,6 +1437,9 @@ namespace Flow.Launcher.ViewModel
{
// Use private field to avoid infinite recursion
_queryText = queryBuilderTmp.ToString();
+ // When executing OnPropertyChanged, QueryTextBox_TextChanged1 and Query will be called
+ // So we need to ignore it so that we will not call Query again
+ _ignoredQueryText = _queryText;
OnPropertyChanged(nameof(QueryText));
}
}
From aa0f9b2e73c550964475f4b0e2454c3c5728ecb7 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 3 May 2025 08:58:40 +0800
Subject: [PATCH 1006/1798] Update name
---
.../{IAsyncEmptyQuery.cs => IAsyncHomeQuery.cs} | 6 +++---
.../Interfaces/{IEmptyQuery.cs => IHomeQuery.cs} | 8 ++++----
2 files changed, 7 insertions(+), 7 deletions(-)
rename Flow.Launcher.Plugin/Interfaces/{IAsyncEmptyQuery.cs => IAsyncHomeQuery.cs} (79%)
rename Flow.Launcher.Plugin/Interfaces/{IEmptyQuery.cs => IHomeQuery.cs} (72%)
diff --git a/Flow.Launcher.Plugin/Interfaces/IAsyncEmptyQuery.cs b/Flow.Launcher.Plugin/Interfaces/IAsyncHomeQuery.cs
similarity index 79%
rename from Flow.Launcher.Plugin/Interfaces/IAsyncEmptyQuery.cs
rename to Flow.Launcher.Plugin/Interfaces/IAsyncHomeQuery.cs
index a18f0848d..f7a820f18 100644
--- a/Flow.Launcher.Plugin/Interfaces/IAsyncEmptyQuery.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IAsyncHomeQuery.cs
@@ -7,17 +7,17 @@ namespace Flow.Launcher.Plugin
///
/// Asynchronous Query Model for Flow Launcher When Query Text is Empty
///
- public interface IAsyncEmptyQuery
+ public interface IAsyncHomeQuery
{
///
/// Asynchronous Querying When Query Text is Empty
///
///
/// If the Querying method requires high IO transmission
- /// or performing CPU intense jobs (performing better with cancellation), please use this IAsyncEmptyQuery interface
+ /// or performing CPU intense jobs (performing better with cancellation), please use this IAsyncHomeQuery interface
///
/// Cancel when querying job is obsolete
///
- Task> EmptyQueryAsync(CancellationToken token);
+ Task> HomeQueryAsync(CancellationToken token);
}
}
diff --git a/Flow.Launcher.Plugin/Interfaces/IEmptyQuery.cs b/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs
similarity index 72%
rename from Flow.Launcher.Plugin/Interfaces/IEmptyQuery.cs
rename to Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs
index 4ebdcf1fd..f3c9cfcad 100644
--- a/Flow.Launcher.Plugin/Interfaces/IEmptyQuery.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs
@@ -8,10 +8,10 @@ namespace Flow.Launcher.Plugin
/// Synchronous Query Model for Flow Launcher When Query Text is Empty
///
/// If the Querying method requires high IO transmission
- /// or performaing CPU intense jobs (performing better with cancellation), please try the IAsyncEmptyQuery interface
+ /// or performaing CPU intense jobs (performing better with cancellation), please try the IAsyncHomeQuery interface
///
///
- public interface IEmptyQuery : IAsyncEmptyQuery
+ public interface IHomeQuery : IAsyncHomeQuery
{
///
/// Querying When Query Text is Empty
@@ -21,8 +21,8 @@ namespace Flow.Launcher.Plugin
///
///
///
- List EmptyQuery();
+ List HomeQuery();
- Task> IAsyncEmptyQuery.EmptyQueryAsync(CancellationToken token) => Task.Run(EmptyQuery);
+ Task> IAsyncHomeQuery.HomeQueryAsync(CancellationToken token) => Task.Run(HomeQuery);
}
}
From 3089928599fca94487b21dbeff5fa35609e43463 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 3 May 2025 16:31:49 +0800
Subject: [PATCH 1007/1798] Support home query interface
---
.../Main.cs | 20 +++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Main.cs b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Main.cs
index 05e8d960f..48717816b 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Main.cs
@@ -3,21 +3,33 @@ using System.Linq;
namespace Flow.Launcher.Plugin.PluginIndicator
{
- public class Main : IPlugin, IPluginI18n
+ public class Main : IPlugin, IPluginI18n, IHomeQuery
{
internal PluginInitContext Context { get; private set; }
public List Query(Query query)
+ {
+ return QueryResults(query);
+ }
+
+ public List HomeQuery()
+ {
+ return QueryResults();
+ }
+
+ private List QueryResults(Query query = null)
{
var nonGlobalPlugins = GetNonGlobalPlugins();
+ var querySearch = query?.Search ?? string.Empty;
+
var results =
from keyword in nonGlobalPlugins.Keys
let plugin = nonGlobalPlugins[keyword].Metadata
- let keywordSearchResult = Context.API.FuzzySearch(query.Search, keyword)
- let searchResult = keywordSearchResult.IsSearchPrecisionScoreMet() ? keywordSearchResult : Context.API.FuzzySearch(query.Search, plugin.Name)
+ let keywordSearchResult = Context.API.FuzzySearch(querySearch, keyword)
+ let searchResult = keywordSearchResult.IsSearchPrecisionScoreMet() ? keywordSearchResult : Context.API.FuzzySearch(querySearch, plugin.Name)
let score = searchResult.Score
where (searchResult.IsSearchPrecisionScoreMet()
- || string.IsNullOrEmpty(query.Search)) // To list all available action keywords
+ || string.IsNullOrEmpty(querySearch)) // To list all available action keywords
&& !plugin.Disabled
select new Result
{
From 0f09fea30b28526d72088e9c6603dfacf614e725 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 3 May 2025 16:32:07 +0800
Subject: [PATCH 1008/1798] Make async home query to be feature interface
---
Flow.Launcher.Plugin/Interfaces/IAsyncHomeQuery.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Plugin/Interfaces/IAsyncHomeQuery.cs b/Flow.Launcher.Plugin/Interfaces/IAsyncHomeQuery.cs
index f7a820f18..78d6454ae 100644
--- a/Flow.Launcher.Plugin/Interfaces/IAsyncHomeQuery.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IAsyncHomeQuery.cs
@@ -7,7 +7,7 @@ namespace Flow.Launcher.Plugin
///
/// Asynchronous Query Model for Flow Launcher When Query Text is Empty
///
- public interface IAsyncHomeQuery
+ public interface IAsyncHomeQuery : IFeatures
{
///
/// Asynchronous Querying When Query Text is Empty
From 17a0834bcda4ba856179543f152a04c987ff9c1c Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 3 May 2025 16:50:50 +0800
Subject: [PATCH 1009/1798] Support query for plugins with home query interface
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 51 ++++++++++++++
.../UserSettings/Settings.cs | 5 ++
Flow.Launcher.Plugin/Result.cs | 3 +
Flow.Launcher/ViewModel/MainViewModel.cs | 68 ++++++++++++-------
4 files changed, 104 insertions(+), 23 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index 72303c8b7..b0f896214 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -25,6 +25,7 @@ namespace Flow.Launcher.Core.Plugin
private static readonly string ClassName = nameof(PluginManager);
private static IEnumerable _contextMenuPlugins;
+ private static IEnumerable _homePlugins;
public static List AllPlugins { get; private set; }
public static readonly HashSet GlobalPlugins = new();
@@ -227,6 +228,8 @@ namespace Flow.Launcher.Core.Plugin
await Task.WhenAll(InitTasks);
_contextMenuPlugins = GetPluginsForInterface();
+ _homePlugins = GetPluginsForInterface();
+
foreach (var plugin in AllPlugins)
{
// set distinct on each plugin's action keywords helps only firing global(*) and action keywords once where a plugin
@@ -274,6 +277,14 @@ namespace Flow.Launcher.Core.Plugin
};
}
+ public static ICollection ValidPluginsForHomeQuery(Query query)
+ {
+ if (query is not null)
+ return Array.Empty();
+
+ return _homePlugins.ToList();
+ }
+
public static async Task> QueryForPluginAsync(PluginPair pair, Query query, CancellationToken token)
{
var results = new List();
@@ -318,6 +329,36 @@ namespace Flow.Launcher.Core.Plugin
return results;
}
+ public static async Task> QueryHomeForPluginAsync(PluginPair pair, CancellationToken token)
+ {
+ var results = new List();
+ var metadata = pair.Metadata;
+
+ try
+ {
+ var milliseconds = await API.StopwatchLogDebugAsync(ClassName, $"Cost for {metadata.Name}",
+ async () => results = await ((IAsyncHomeQuery)pair.Plugin).HomeQueryAsync(token).ConfigureAwait(false));
+
+ token.ThrowIfCancellationRequested();
+ if (results == null)
+ return null;
+ UpdatePluginMetadata(results, metadata);
+
+ token.ThrowIfCancellationRequested();
+ }
+ catch (OperationCanceledException)
+ {
+ // null will be fine since the results will only be added into queue if the token hasn't been cancelled
+ return null;
+ }
+ catch (Exception e)
+ {
+ API.LogException(ClassName, $"Failed to query home for plugin: {metadata.Name}", e);
+ return null;
+ }
+ return results;
+ }
+
public static void UpdatePluginMetadata(IReadOnlyList results, PluginMetadata metadata, Query query)
{
foreach (var r in results)
@@ -333,6 +374,16 @@ namespace Flow.Launcher.Core.Plugin
}
}
+ private static void UpdatePluginMetadata(IReadOnlyList results, PluginMetadata metadata)
+ {
+ foreach (var r in results)
+ {
+ r.PluginDirectory = metadata.PluginDirectory;
+ r.PluginID = metadata.ID;
+ r.OriginQuery = null;
+ }
+ }
+
///
/// get specified plugin, return null if not found
///
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index b7a1d1f63..2b5fc6bc0 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -158,6 +158,11 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
}
}
+
+ public bool ShowHomeQuery { get; set; } = true;
+ public bool ShowHistoryRecordsForHomeQuery { get; set; } = false;
+ public int HistoryRecordsCountForHomeQuery { get; set; } = 5;
+
public int CustomExplorerIndex { get; set; } = 0;
[JsonIgnore]
diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs
index f0fcd48ff..060c03317 100644
--- a/Flow.Launcher.Plugin/Result.cs
+++ b/Flow.Launcher.Plugin/Result.cs
@@ -174,6 +174,9 @@ namespace Flow.Launcher.Plugin
///
/// Query information associated with the result
///
+ ///
+ /// If the query is for home query, this will be null
+ ///
internal Query OriginQuery { get; set; }
///
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 2f1ed0f51..b5afe4b7e 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1198,21 +1198,31 @@ namespace Flow.Launcher.ViewModel
_updateSource?.Cancel();
var query = await ConstructQueryAsync(QueryText, Settings.CustomShortcuts, Settings.BuiltinShortcuts);
+ var homeQuery = query == null;
+ ICollection plugins = Array.Empty();
if (query == null) // shortcut expanded
{
- // Hide and clear results again because running query may show and add some results
- Results.Visibility = Visibility.Collapsed;
- Results.Clear();
+ if (Settings.ShowHomeQuery)
+ {
+ plugins = PluginManager.ValidPluginsForHomeQuery(query);
+ }
+
+ if (plugins.Count == 0)
+ {
+ // Hide and clear results again because running query may show and add some results
+ Results.Visibility = Visibility.Collapsed;
+ Results.Clear();
- // Reset plugin icon
- PluginIconPath = null;
- PluginIconSource = null;
- SearchIconVisibility = Visibility.Visible;
+ // Reset plugin icon
+ PluginIconPath = null;
+ PluginIconSource = null;
+ SearchIconVisibility = Visibility.Visible;
- // Hide progress bar again because running query may set this to visible
- ProgressBarVisibility = Visibility.Hidden;
- return;
+ // Hide progress bar again because running query may set this to visible
+ ProgressBarVisibility = Visibility.Hidden;
+ return;
+ }
}
_updateSource = new CancellationTokenSource();
@@ -1226,27 +1236,37 @@ namespace Flow.Launcher.ViewModel
if (_updateSource.Token.IsCancellationRequested) return;
// Update the query's IsReQuery property to true if this is a re-query
- query.IsReQuery = isReQuery;
+ if (!homeQuery) query.IsReQuery = isReQuery;
// handle the exclusiveness of plugin using action keyword
RemoveOldQueryResults(query);
_lastQuery = query;
- var plugins = PluginManager.ValidPluginsForQuery(query);
-
- if (plugins.Count == 1)
- {
- PluginIconPath = plugins.Single().Metadata.IcoPath;
- PluginIconSource = await App.API.LoadImageAsync(PluginIconPath);
- SearchIconVisibility = Visibility.Hidden;
- }
- else
+ if (homeQuery)
{
+ // Do not show plugin icon if this is a home query
PluginIconPath = null;
PluginIconSource = null;
SearchIconVisibility = Visibility.Visible;
}
+ else
+ {
+ plugins = PluginManager.ValidPluginsForQuery(query);
+
+ if (plugins.Count == 1)
+ {
+ PluginIconPath = plugins.Single().Metadata.IcoPath;
+ PluginIconSource = await App.API.LoadImageAsync(PluginIconPath);
+ SearchIconVisibility = Visibility.Hidden;
+ }
+ else
+ {
+ PluginIconPath = null;
+ PluginIconSource = null;
+ SearchIconVisibility = Visibility.Visible;
+ }
+ }
// Do not wait for performance improvement
/*if (string.IsNullOrEmpty(query.ActionKeyword))
@@ -1303,7 +1323,7 @@ namespace Flow.Launcher.ViewModel
// Local function
async Task QueryTaskAsync(PluginPair plugin, CancellationToken token)
{
- if (searchDelay)
+ if (searchDelay && !homeQuery) // Do not delay for home query
{
var searchDelayTime = plugin.Metadata.SearchDelayTime ?? Settings.SearchDelayTime;
@@ -1316,7 +1336,9 @@ namespace Flow.Launcher.ViewModel
// Task.Yield will force it to run in ThreadPool
await Task.Yield();
- var results = await PluginManager.QueryForPluginAsync(plugin, query, token);
+ var results = homeQuery ?
+ await PluginManager.QueryHomeForPluginAsync(plugin, token) :
+ await PluginManager.QueryForPluginAsync(plugin, query, token);
if (token.IsCancellationRequested) return;
@@ -1616,7 +1638,7 @@ namespace Flow.Launcher.ViewModel
break;
case LastQueryMode.ActionKeywordPreserved:
case LastQueryMode.ActionKeywordSelected:
- var newQuery = _lastQuery.ActionKeyword;
+ var newQuery = _lastQuery?.ActionKeyword;
if (!string.IsNullOrEmpty(newQuery))
newQuery += " ";
From 54994ddb7b264c51452e13dac7f7306b9fc44f41 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 3 May 2025 17:02:39 +0800
Subject: [PATCH 1010/1798] Initialize home query when window is loaded
---
Flow.Launcher/MainWindow.xaml.cs | 3 +++
Flow.Launcher/ViewModel/MainViewModel.cs | 8 ++++++++
2 files changed, 11 insertions(+)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index ae7b098a2..546f32cc5 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -292,6 +292,9 @@ namespace Flow.Launcher
DependencyPropertyDescriptor
.FromProperty(VisibilityProperty, typeof(StackPanel))
.AddValueChanged(History, (s, e) => UpdateClockPanelVisibility());
+
+ // Initialize query state
+ _viewModel.InitializeQuery();
}
private async void OnClosing(object sender, CancelEventArgs e)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index b5afe4b7e..8244d5765 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1074,6 +1074,14 @@ namespace Flow.Launcher.ViewModel
#region Query
+ public void InitializeQuery()
+ {
+ if (Settings.ShowHomeQuery)
+ {
+ _ = QueryResultsAsync(false);
+ }
+ }
+
public void Query(bool searchDelay, bool isReQuery = false)
{
if (QueryResultsSelected())
From e9ef26a8dde26530f21e0ce244c0e03e9cf8d60b Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 3 May 2025 18:17:00 +0800
Subject: [PATCH 1011/1798] Change related setting names
---
Flow.Launcher.Infrastructure/UserSettings/Settings.cs | 6 +++---
Flow.Launcher/ViewModel/MainViewModel.cs | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 2b5fc6bc0..b630a4ecc 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -159,9 +159,9 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
}
- public bool ShowHomeQuery { get; set; } = true;
- public bool ShowHistoryRecordsForHomeQuery { get; set; } = false;
- public int HistoryRecordsCountForHomeQuery { get; set; } = 5;
+ public bool ShowHomePage { get; set; } = true;
+ public bool ShowHistoryResultsForHomePage { get; set; } = false;
+ public int MaxHistoryResultsToShowForHomePage { get; set; } = 5;
public int CustomExplorerIndex { get; set; } = 0;
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 8244d5765..06cce3026 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1076,7 +1076,7 @@ namespace Flow.Launcher.ViewModel
public void InitializeQuery()
{
- if (Settings.ShowHomeQuery)
+ if (Settings.ShowHomePage)
{
_ = QueryResultsAsync(false);
}
@@ -1211,7 +1211,7 @@ namespace Flow.Launcher.ViewModel
if (query == null) // shortcut expanded
{
- if (Settings.ShowHomeQuery)
+ if (Settings.ShowHomePage)
{
plugins = PluginManager.ValidPluginsForHomeQuery(query);
}
From e8333331b0a348c9ba2eceb995943faea21130d0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 3 May 2025 18:17:07 +0800
Subject: [PATCH 1012/1798] Add ui in general page
---
Flow.Launcher/Languages/en.xaml | 4 ++
.../SettingsPaneGeneralViewModel.cs | 15 +++++-
.../Views/SettingsPaneGeneral.xaml | 51 +++++++++++++++----
3 files changed, 57 insertions(+), 13 deletions(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index ca0ed33b5..af718946d 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -126,6 +126,10 @@
OpenUse Previous Korean IMEYou 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 PageSearch Plugin
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
index 1a887c4b7..840269b03 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
@@ -154,11 +154,22 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
{
Settings.SearchDelayTime = value;
OnPropertyChanged();
- OnPropertyChanged(nameof(SearchDelayTimeDisplay));
}
}
}
- public string SearchDelayTimeDisplay => $"{SearchDelayTimeValue}ms";
+
+ public int MaxHistoryResultsToShowValue
+ {
+ get => Settings.MaxHistoryResultsToShowForHomePage;
+ set
+ {
+ if (Settings.MaxHistoryResultsToShowForHomePage != value)
+ {
+ Settings.MaxHistoryResultsToShowForHomePage = value;
+ OnPropertyChanged();
+ }
+ }
+ }
private void UpdateEnumDropdownLocalizations()
{
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index d45d28d8b..c0c5613de 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -217,17 +217,46 @@
Title="{DynamicResource searchDelayTime}"
Sub="{DynamicResource searchDelayTimeToolTip}"
Type="InsideFit">
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From d6704ed5da47077b0751176d0e3185fb77ef320b Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 3 May 2025 22:09:25 +0800
Subject: [PATCH 1013/1798] Support history items
---
Flow.Launcher/ViewModel/MainViewModel.cs | 81 ++++++++++++++++++++++--
1 file changed, 77 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 06cce3026..d850e0f7c 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -50,6 +50,12 @@ namespace Flow.Launcher.ViewModel
private readonly IReadOnlyList _emptyResult = new List();
+ private readonly PluginMetadata _historyMetadata = new()
+ {
+ ID = "298303A65D128A845D28A7B83B3968C2",
+ Priority = 0
+ };
+
#endregion
#region Constructor
@@ -1300,11 +1306,30 @@ namespace Flow.Launcher.ViewModel
// plugins are ICollection, meaning LINQ will get the Count and preallocate Array
- var tasks = plugins.Select(plugin => plugin.Metadata.Disabled switch
+ Task[] tasks;
+ if (homeQuery)
{
- false => QueryTaskAsync(plugin, _updateSource.Token),
- true => Task.CompletedTask
- }).ToArray();
+ var homeTasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch
+ {
+ false => QueryTaskAsync(plugin, _updateSource.Token),
+ true => Task.CompletedTask
+ }).ToList();
+
+ if (Settings.ShowHistoryResultsForHomePage)
+ {
+ homeTasks.Add(QueryHistoryTaskAsync());
+ }
+
+ tasks = homeTasks.ToArray();
+ }
+ else
+ {
+ tasks = plugins.Select(plugin => plugin.Metadata.Disabled switch
+ {
+ false => QueryTaskAsync(plugin, _updateSource.Token),
+ true => Task.CompletedTask
+ }).ToArray();
+ }
try
{
@@ -1377,6 +1402,54 @@ namespace Flow.Launcher.ViewModel
App.API.LogError(ClassName, "Unable to add item to Result Update Queue");
}
}
+
+ async Task QueryHistoryTaskAsync()
+ {
+ // Since it is wrapped within a ThreadPool Thread, the synchronous context is null
+ // Task.Yield will force it to run in ThreadPool
+ await Task.Yield();
+
+ // Select last history results and revert its order to make sure last history results are on top
+ var lastHistoryResults = _history.Items.TakeLast(Settings.MaxHistoryResultsToShowForHomePage).Reverse();
+
+ var historyResults = new List();
+ foreach (var h in lastHistoryResults)
+ {
+ var title = App.API.GetTranslation("executeQuery");
+ var time = App.API.GetTranslation("lastExecuteTime");
+ var result = new Result
+ {
+ Title = string.Format(title, h.Query),
+ SubTitle = string.Format(time, h.ExecutedDateTime),
+ IcoPath = "Images\\history.png",
+ Preview = new Result.PreviewInfo
+ {
+ PreviewImagePath = Constant.HistoryIcon,
+ Description = string.Format(time, h.ExecutedDateTime)
+ },
+ OriginQuery = new Query { RawQuery = h.Query },
+ Action = _ =>
+ {
+ SelectedResults = Results;
+ App.API.ChangeQuery(h.Query);
+ return false;
+ }
+ };
+ historyResults.Add(result);
+ }
+
+ // No need to make copy of results and update badge ico property
+
+ if (_updateSource.Token.IsCancellationRequested) return;
+
+ if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(historyResults, _historyMetadata, query,
+ _updateSource.Token)))
+ {
+ App.API.LogError(ClassName, "Unable to add item to Result Update Queue");
+ }
+
+ await Task.CompletedTask;
+ }
}
private async Task ConstructQueryAsync(string queryText, IEnumerable customShortcuts,
From f2f4ebf0ac641eb1feafdb7f0f8feccabbd6d283 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 3 May 2025 22:34:58 +0800
Subject: [PATCH 1014/1798] Support home state change & Add ui
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 6 +++
.../UserSettings/PluginSettings.cs | 3 ++
Flow.Launcher.Plugin/PluginMetadata.cs | 5 +++
Flow.Launcher/Languages/en.xaml | 6 +++
.../Controls/InstalledPluginDisplay.xaml | 11 +++++-
.../SettingsPanePluginsViewModel.cs | 38 ++++++++++++++++++-
Flow.Launcher/ViewModel/PluginViewModel.cs | 11 ++++++
7 files changed, 78 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index b0f896214..caa3fd00b 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -221,6 +221,7 @@ namespace Flow.Launcher.Core.Plugin
{
API.LogException(ClassName, $"Fail to Init plugin: {pair.Metadata.Name}", e);
pair.Metadata.Disabled = true;
+ pair.Metadata.HomeDisabled = true;
failedPlugins.Enqueue(pair);
}
}));
@@ -429,6 +430,11 @@ namespace Flow.Launcher.Core.Plugin
return results;
}
+ public static bool IsHomePlugin(string id)
+ {
+ return _homePlugins.Any(p => p.Metadata.ID == id);
+ }
+
public static bool ActionKeywordRegistered(string actionKeyword)
{
// this method is only checking for action keywords (defined as not '*') registration
diff --git a/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs b/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs
index 7fb9b895a..837d0ebb6 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs
@@ -67,6 +67,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
metadata.Disabled = settings.Disabled;
metadata.Priority = settings.Priority;
metadata.SearchDelayTime = settings.SearchDelayTime;
+ metadata.HomeDisabled = settings.HomeDiabled;
}
else
{
@@ -79,6 +80,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
DefaultActionKeywords = metadata.ActionKeywords, // metadata provides default values
ActionKeywords = metadata.ActionKeywords, // use default value
Disabled = metadata.Disabled,
+ HomeDiabled = metadata.HomeDisabled,
Priority = metadata.Priority,
DefaultSearchDelayTime = metadata.SearchDelayTime, // metadata provides default values
SearchDelayTime = metadata.SearchDelayTime, // use default value
@@ -128,5 +130,6 @@ namespace Flow.Launcher.Infrastructure.UserSettings
/// Used only to save the state of the plugin in settings
///
public bool Disabled { get; set; }
+ public bool HomeDiabled { get; set; }
}
}
diff --git a/Flow.Launcher.Plugin/PluginMetadata.cs b/Flow.Launcher.Plugin/PluginMetadata.cs
index da10bc6a5..09803cbd7 100644
--- a/Flow.Launcher.Plugin/PluginMetadata.cs
+++ b/Flow.Launcher.Plugin/PluginMetadata.cs
@@ -50,6 +50,11 @@ namespace Flow.Launcher.Plugin
///
public bool Disabled { get; set; }
+ ///
+ /// Whether plugin is disabled in home query.
+ ///
+ public bool HomeDisabled { get; set; }
+
///
/// Plugin execute file path.
///
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index af718946d..22ab2016c 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -130,6 +130,7 @@
Show home page results when query text is empty.Show History Results in Home PageMaximum History Results Shown in Home Page
+ This can only be edited if plugin supports Home feature and Home Page is enabled.Search Plugin
@@ -152,6 +153,7 @@
EnabledPrioritySearch Delay
+ Home PageCurrent PriorityNew PriorityPriority
@@ -405,6 +407,10 @@
Search Delay Time SettingInput 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.
+
Custom Query HotkeyPress a custom hotkey to open Flow Launcher and input the specified query automatically.
diff --git a/Flow.Launcher/Resources/Controls/InstalledPluginDisplay.xaml b/Flow.Launcher/Resources/Controls/InstalledPluginDisplay.xaml
index 619da22dc..0842a64f3 100644
--- a/Flow.Launcher/Resources/Controls/InstalledPluginDisplay.xaml
+++ b/Flow.Launcher/Resources/Controls/InstalledPluginDisplay.xaml
@@ -100,10 +100,19 @@
ToolTipService.InitialShowDelay="0"
ToolTipService.ShowOnDisabled="True"
Value="{Binding PluginSearchDelayTime, Mode=TwoWay}" />
-
+
+
_isHomeOnOffSelected;
+ set
+ {
+ if (_isHomeOnOffSelected != value)
+ {
+ _isHomeOnOffSelected = value;
+ OnPropertyChanged();
+ }
+ }
+ }
+
public SettingsPanePluginsViewModel(Settings settings)
{
_settings = settings;
@@ -152,6 +166,18 @@ public partial class SettingsPanePluginsViewModel : BaseModel
{
Text = (string)Application.Current.Resources["searchDelayTimeTips"],
TextWrapping = TextWrapping.Wrap
+ },
+ new TextBlock
+ {
+ Text = (string)Application.Current.Resources["homeTitle"],
+ FontSize = 18,
+ Margin = new Thickness(0, 24, 0, 10),
+ TextWrapping = TextWrapping.Wrap
+ },
+ new TextBlock
+ {
+ Text = (string)Application.Current.Resources["homeTips"],
+ TextWrapping = TextWrapping.Wrap
}
}
},
@@ -176,16 +202,25 @@ public partial class SettingsPanePluginsViewModel : BaseModel
IsOnOffSelected = false;
IsPrioritySelected = true;
IsSearchDelaySelected = false;
+ IsHomeOnOffSelected = false;
break;
case DisplayMode.SearchDelay:
IsOnOffSelected = false;
IsPrioritySelected = false;
IsSearchDelaySelected = true;
+ IsHomeOnOffSelected = false;
+ break;
+ case DisplayMode.HomeOnOff:
+ IsOnOffSelected = false;
+ IsPrioritySelected = false;
+ IsSearchDelaySelected = false;
+ IsHomeOnOffSelected = true;
break;
default:
IsOnOffSelected = true;
IsPrioritySelected = false;
IsSearchDelaySelected = false;
+ IsHomeOnOffSelected = false;
break;
}
}
@@ -195,5 +230,6 @@ public enum DisplayMode
{
OnOff,
Priority,
- SearchDelay
+ SearchDelay,
+ HomeOnOff
}
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index 64a7f3db8..092896019 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -75,6 +75,16 @@ namespace Flow.Launcher.ViewModel
}
}
+ public bool PluginHomeState
+ {
+ get => !PluginPair.Metadata.HomeDisabled;
+ set
+ {
+ PluginPair.Metadata.HomeDisabled = !value;
+ PluginSettingsObject.HomeDiabled = !value;
+ }
+ }
+
public bool IsExpanded
{
get => _isExpanded;
@@ -154,6 +164,7 @@ namespace Flow.Launcher.ViewModel
public Infrastructure.UserSettings.Plugin PluginSettingsObject{ get; init; }
public bool SearchDelayEnabled => Settings.SearchQueryResultsWithDelay;
public string DefaultSearchDelay => Settings.SearchDelayTime.ToString();
+ public bool HomeEnabled => Settings.ShowHomePage && PluginManager.IsHomePlugin(PluginPair.Metadata.ID);
public void OnActionKeywordsTextChanged()
{
From 96bb62af27932df8e0afab3940ffc97cda28d349 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 3 May 2025 22:54:46 +0800
Subject: [PATCH 1015/1798] Refresh interface when Home Page is changed
---
.../UserSettings/Settings.cs | 15 ++++++++++++++-
Flow.Launcher/MainWindow.xaml.cs | 16 +++++++++++++++-
Flow.Launcher/ViewModel/MainViewModel.cs | 7 ++-----
Flow.Launcher/ViewModel/PluginViewModel.cs | 3 +++
4 files changed, 34 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index b630a4ecc..34bf4f90e 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -159,7 +159,20 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
}
- public bool ShowHomePage { get; set; } = true;
+ private bool _showHomePage { get; set; } = true;
+ public bool ShowHomePage
+ {
+ get => _showHomePage;
+ set
+ {
+ if (_showHomePage != value)
+ {
+ _showHomePage = value;
+ OnPropertyChanged();
+ }
+ }
+ }
+
public bool ShowHistoryResultsForHomePage { get; set; } = false;
public int MaxHistoryResultsToShowForHomePage { get; set; } = 5;
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 546f32cc5..6dcd8d22d 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -277,6 +277,17 @@ namespace Flow.Launcher
case nameof(Settings.SettingWindowFont):
InitializeContextMenu();
break;
+ case nameof(Settings.ShowHomePage):
+ // We should refresh results when these two settings are changed but we cannot do that
+ // Because the order of the results will change, making the interface look weird
+ // So we would better refresh results when query text is changed next time
+ /*case nameof(Settings.ShowHistoryResultsForHomePage):
+ case nameof(Settings.MaxHistoryResultsToShowForHomePage):*/
+ if (string.IsNullOrEmpty(_viewModel.QueryText))
+ {
+ _viewModel.QueryResults();
+ }
+ break;
}
};
@@ -294,7 +305,10 @@ namespace Flow.Launcher
.AddValueChanged(History, (s, e) => UpdateClockPanelVisibility());
// Initialize query state
- _viewModel.InitializeQuery();
+ if (_settings.ShowHomePage && string.IsNullOrEmpty(_viewModel.QueryText))
+ {
+ _viewModel.QueryResults();
+ }
}
private async void OnClosing(object sender, CancelEventArgs e)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index d850e0f7c..993cc3ba9 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1080,12 +1080,9 @@ namespace Flow.Launcher.ViewModel
#region Query
- public void InitializeQuery()
+ public void QueryResults()
{
- if (Settings.ShowHomePage)
- {
- _ = QueryResultsAsync(false);
- }
+ _ = QueryResultsAsync(false);
}
public void Query(bool searchDelay, bool isReQuery = false)
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index 092896019..61f6dea33 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -82,6 +82,9 @@ namespace Flow.Launcher.ViewModel
{
PluginPair.Metadata.HomeDisabled = !value;
PluginSettingsObject.HomeDiabled = !value;
+ // We should refresh results when these two settings are changed but we cannot do that
+ // Because the order of the results will change, making the interface look weird
+ // So we would better refresh results when query text is changed next time
}
}
From 13cfbe54306d5eabe76d4f0e3f89c979e69a5f11 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 09:07:14 +0800
Subject: [PATCH 1016/1798] Check query results
---
Flow.Launcher/MainWindow.xaml.cs | 7 +------
Flow.Launcher/ViewModel/PluginViewModel.cs | 3 ---
2 files changed, 1 insertion(+), 9 deletions(-)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 6dcd8d22d..e2948c540 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -278,12 +278,7 @@ namespace Flow.Launcher
InitializeContextMenu();
break;
case nameof(Settings.ShowHomePage):
- // We should refresh results when these two settings are changed but we cannot do that
- // Because the order of the results will change, making the interface look weird
- // So we would better refresh results when query text is changed next time
- /*case nameof(Settings.ShowHistoryResultsForHomePage):
- case nameof(Settings.MaxHistoryResultsToShowForHomePage):*/
- if (string.IsNullOrEmpty(_viewModel.QueryText))
+ if (_viewModel.QueryResultsSelected() && string.IsNullOrEmpty(_viewModel.QueryText))
{
_viewModel.QueryResults();
}
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index 61f6dea33..092896019 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -82,9 +82,6 @@ namespace Flow.Launcher.ViewModel
{
PluginPair.Metadata.HomeDisabled = !value;
PluginSettingsObject.HomeDiabled = !value;
- // We should refresh results when these two settings are changed but we cannot do that
- // Because the order of the results will change, making the interface look weird
- // So we would better refresh results when query text is changed next time
}
}
From 4500f1deebccad17076628174050a71e95881efa Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 09:14:57 +0800
Subject: [PATCH 1017/1798] Fix history items context menu issue
---
Flow.Launcher/ViewModel/MainViewModel.cs | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 993cc3ba9..8e708fbc4 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1127,9 +1127,20 @@ namespace Flow.Launcher.ViewModel
if (selected != null) // SelectedItem returns null if selection is empty.
{
- var results = PluginManager.GetContextMenusForPlugin(selected);
- results.Add(ContextMenuTopMost(selected));
- results.Add(ContextMenuPluginInfo(selected.PluginID));
+ List results;
+ if (selected.PluginID == null) // SelectedItem from history in home page.
+ {
+ results = new()
+ {
+ ContextMenuTopMost(selected)
+ };
+ }
+ else
+ {
+ results = PluginManager.GetContextMenusForPlugin(selected);
+ results.Add(ContextMenuTopMost(selected));
+ results.Add(ContextMenuPluginInfo(selected.PluginID));
+ }
if (!string.IsNullOrEmpty(query))
{
From 19d70592a8f66f5a4f16f3f840019c232865c1a3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 09:38:35 +0800
Subject: [PATCH 1018/1798] Add empty & global query for home page
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 5 +--
Flow.Launcher.Core/Plugin/QueryBuilder.cs | 21 +++++++--
Flow.Launcher/ViewModel/MainViewModel.cs | 51 ++++++++++------------
3 files changed, 42 insertions(+), 35 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index caa3fd00b..c22651738 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -278,11 +278,8 @@ namespace Flow.Launcher.Core.Plugin
};
}
- public static ICollection ValidPluginsForHomeQuery(Query query)
+ public static ICollection ValidPluginsForHomeQuery()
{
- if (query is not null)
- return Array.Empty();
-
return _homePlugins.ToList();
}
diff --git a/Flow.Launcher.Core/Plugin/QueryBuilder.cs b/Flow.Launcher.Core/Plugin/QueryBuilder.cs
index 0ef3f30f5..fae821736 100644
--- a/Flow.Launcher.Core/Plugin/QueryBuilder.cs
+++ b/Flow.Launcher.Core/Plugin/QueryBuilder.cs
@@ -8,10 +8,23 @@ namespace Flow.Launcher.Core.Plugin
{
public static Query Build(string text, Dictionary nonGlobalPlugins)
{
+ // home query
+ if (string.IsNullOrEmpty(text))
+ {
+ return new Query()
+ {
+ Search = string.Empty,
+ RawQuery = string.Empty,
+ SearchTerms = Array.Empty(),
+ ActionKeyword = string.Empty
+ };
+ }
+
// replace multiple white spaces with one white space
var terms = text.Split(Query.TermSeparator, StringSplitOptions.RemoveEmptyEntries);
if (terms.Length == 0)
- { // nothing was typed
+ {
+ // nothing was typed
return null;
}
@@ -21,13 +34,15 @@ namespace Flow.Launcher.Core.Plugin
string[] searchTerms;
if (nonGlobalPlugins.TryGetValue(possibleActionKeyword, out var pluginPair) && !pluginPair.Metadata.Disabled)
- { // use non global plugin for query
+ {
+ // use non global plugin for query
actionKeyword = possibleActionKeyword;
search = terms.Length > 1 ? rawQuery[(actionKeyword.Length + 1)..].TrimStart() : string.Empty;
searchTerms = terms[1..];
}
else
- { // non action keyword
+ {
+ // non action keyword
actionKeyword = string.Empty;
search = rawQuery.TrimStart();
searchTerms = terms;
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 8e708fbc4..517cf5323 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1220,31 +1220,21 @@ namespace Flow.Launcher.ViewModel
_updateSource?.Cancel();
var query = await ConstructQueryAsync(QueryText, Settings.CustomShortcuts, Settings.BuiltinShortcuts);
- var homeQuery = query == null;
- ICollection plugins = Array.Empty();
if (query == null) // shortcut expanded
{
- if (Settings.ShowHomePage)
- {
- plugins = PluginManager.ValidPluginsForHomeQuery(query);
- }
-
- if (plugins.Count == 0)
- {
- // Hide and clear results again because running query may show and add some results
- Results.Visibility = Visibility.Collapsed;
- Results.Clear();
+ // Hide and clear results again because running query may show and add some results
+ Results.Visibility = Visibility.Collapsed;
+ Results.Clear();
- // Reset plugin icon
- PluginIconPath = null;
- PluginIconSource = null;
- SearchIconVisibility = Visibility.Visible;
+ // Reset plugin icon
+ PluginIconPath = null;
+ PluginIconSource = null;
+ SearchIconVisibility = Visibility.Visible;
- // Hide progress bar again because running query may set this to visible
- ProgressBarVisibility = Visibility.Hidden;
- return;
- }
+ // Hide progress bar again because running query may set this to visible
+ ProgressBarVisibility = Visibility.Hidden;
+ return;
}
_updateSource = new CancellationTokenSource();
@@ -1258,16 +1248,22 @@ namespace Flow.Launcher.ViewModel
if (_updateSource.Token.IsCancellationRequested) return;
// Update the query's IsReQuery property to true if this is a re-query
- if (!homeQuery) query.IsReQuery = isReQuery;
+ query.IsReQuery = isReQuery;
// handle the exclusiveness of plugin using action keyword
RemoveOldQueryResults(query);
_lastQuery = query;
+ var homeQuery = query.RawQuery == string.Empty;
+ ICollection plugins = Array.Empty();
if (homeQuery)
{
- // Do not show plugin icon if this is a home query
+ if (Settings.ShowHomePage)
+ {
+ plugins = PluginManager.ValidPluginsForHomeQuery();
+ }
+
PluginIconPath = null;
PluginIconSource = null;
SearchIconVisibility = Visibility.Visible;
@@ -1317,18 +1313,17 @@ namespace Flow.Launcher.ViewModel
Task[] tasks;
if (homeQuery)
{
- var homeTasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch
+ tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch
{
false => QueryTaskAsync(plugin, _updateSource.Token),
true => Task.CompletedTask
- }).ToList();
+ }).ToArray();
+ // Query history results for home page firstly so it will be put on top of the results
if (Settings.ShowHistoryResultsForHomePage)
{
- homeTasks.Add(QueryHistoryTaskAsync());
+ await QueryHistoryTaskAsync();
}
-
- tasks = homeTasks.ToArray();
}
else
{
@@ -1465,7 +1460,7 @@ namespace Flow.Launcher.ViewModel
{
if (string.IsNullOrWhiteSpace(queryText))
{
- return null;
+ return QueryBuilder.Build(string.Empty, PluginManager.NonGlobalPlugins);
}
var queryBuilder = new StringBuilder(queryText);
From 4ed1dc3bc12dc8eef98cc111e1013295715859e3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 10:28:20 +0800
Subject: [PATCH 1019/1798] Fix topmost issue in home page
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 14 ++------------
Flow.Launcher/ViewModel/MainViewModel.cs | 2 +-
2 files changed, 3 insertions(+), 13 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index c22651738..a3e80a73f 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -327,7 +327,7 @@ namespace Flow.Launcher.Core.Plugin
return results;
}
- public static async Task> QueryHomeForPluginAsync(PluginPair pair, CancellationToken token)
+ public static async Task> QueryHomeForPluginAsync(PluginPair pair, Query query, CancellationToken token)
{
var results = new List();
var metadata = pair.Metadata;
@@ -340,7 +340,7 @@ namespace Flow.Launcher.Core.Plugin
token.ThrowIfCancellationRequested();
if (results == null)
return null;
- UpdatePluginMetadata(results, metadata);
+ UpdatePluginMetadata(results, metadata, query);
token.ThrowIfCancellationRequested();
}
@@ -372,16 +372,6 @@ namespace Flow.Launcher.Core.Plugin
}
}
- private static void UpdatePluginMetadata(IReadOnlyList results, PluginMetadata metadata)
- {
- foreach (var r in results)
- {
- r.PluginDirectory = metadata.PluginDirectory;
- r.PluginID = metadata.ID;
- r.OriginQuery = null;
- }
- }
-
///
/// get specified plugin, return null if not found
///
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 517cf5323..eb22dc3e2 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1373,7 +1373,7 @@ namespace Flow.Launcher.ViewModel
await Task.Yield();
var results = homeQuery ?
- await PluginManager.QueryHomeForPluginAsync(plugin, token) :
+ await PluginManager.QueryHomeForPluginAsync(plugin, query, token) :
await PluginManager.QueryForPluginAsync(plugin, query, token);
if (token.IsCancellationRequested) return;
From 35e4bfc937158f5a180188626fdd351daf3f188b Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 11:05:23 +0800
Subject: [PATCH 1020/1798] Improve code quality
---
Flow.Launcher/ViewModel/MainViewModel.cs | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index eb22dc3e2..64284d766 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1413,10 +1413,10 @@ namespace Flow.Launcher.ViewModel
await Task.Yield();
// Select last history results and revert its order to make sure last history results are on top
- var lastHistoryResults = _history.Items.TakeLast(Settings.MaxHistoryResultsToShowForHomePage).Reverse();
+ var historyResults = _history.Items.TakeLast(Settings.MaxHistoryResultsToShowForHomePage).Reverse();
- var historyResults = new List();
- foreach (var h in lastHistoryResults)
+ var results = new List();
+ foreach (var h in historyResults)
{
var title = App.API.GetTranslation("executeQuery");
var time = App.API.GetTranslation("lastExecuteTime");
@@ -1438,14 +1438,12 @@ namespace Flow.Launcher.ViewModel
return false;
}
};
- historyResults.Add(result);
+ results.Add(result);
}
- // No need to make copy of results and update badge ico property
-
if (_updateSource.Token.IsCancellationRequested) return;
- if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(historyResults, _historyMetadata, query,
+ if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, _historyMetadata, query,
_updateSource.Token)))
{
App.API.LogError(ClassName, "Unable to add item to Result Update Queue");
From 2ab007b3b6db29ad4347a3f6b84e4f2459cecabc Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 11:26:00 +0800
Subject: [PATCH 1021/1798] Fix typos
---
Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs | 6 +++---
Flow.Launcher/ViewModel/PluginViewModel.cs | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs b/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs
index 837d0ebb6..920abc284 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/PluginSettings.cs
@@ -67,7 +67,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
metadata.Disabled = settings.Disabled;
metadata.Priority = settings.Priority;
metadata.SearchDelayTime = settings.SearchDelayTime;
- metadata.HomeDisabled = settings.HomeDiabled;
+ metadata.HomeDisabled = settings.HomeDisabled;
}
else
{
@@ -80,7 +80,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
DefaultActionKeywords = metadata.ActionKeywords, // metadata provides default values
ActionKeywords = metadata.ActionKeywords, // use default value
Disabled = metadata.Disabled,
- HomeDiabled = metadata.HomeDisabled,
+ HomeDisabled = metadata.HomeDisabled,
Priority = metadata.Priority,
DefaultSearchDelayTime = metadata.SearchDelayTime, // metadata provides default values
SearchDelayTime = metadata.SearchDelayTime, // use default value
@@ -130,6 +130,6 @@ namespace Flow.Launcher.Infrastructure.UserSettings
/// Used only to save the state of the plugin in settings
///
public bool Disabled { get; set; }
- public bool HomeDiabled { get; set; }
+ public bool HomeDisabled { get; set; }
}
}
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index 092896019..01fa3d203 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -81,7 +81,7 @@ namespace Flow.Launcher.ViewModel
set
{
PluginPair.Metadata.HomeDisabled = !value;
- PluginSettingsObject.HomeDiabled = !value;
+ PluginSettingsObject.HomeDisabled = !value;
}
}
From eaea38c13ab7c6536ee3b92bf8ad9b8ff436c599 Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Sun, 4 May 2025 11:40:45 +0800
Subject: [PATCH 1022/1798] Fix typos
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs b/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs
index f3c9cfcad..129f43b85 100644
--- a/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs
@@ -8,7 +8,7 @@ namespace Flow.Launcher.Plugin
/// Synchronous Query Model for Flow Launcher When Query Text is Empty
///
/// If the Querying method requires high IO transmission
- /// or performaing CPU intense jobs (performing better with cancellation), please try the IAsyncHomeQuery interface
+ /// or performing CPU intense jobs (performing better with cancellation), please try the IAsyncHomeQuery interface
///
///
public interface IHomeQuery : IAsyncHomeQuery
From 78f606f2fcb74467962bb582cd70f65c2d35104e Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Sun, 4 May 2025 11:40:57 +0800
Subject: [PATCH 1023/1798] Fix typos
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs b/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs
index 129f43b85..81186fca2 100644
--- a/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs
@@ -17,7 +17,7 @@ namespace Flow.Launcher.Plugin
/// Querying When Query Text is Empty
///
/// This method will be called within a Task.Run,
- /// so please avoid synchrously wait for long.
+ /// so please avoid synchronously wait for long.
///
///
///
From 72bd1e60dbe7bdef77704e88641b818d1bb8f98f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 11:44:41 +0800
Subject: [PATCH 1024/1798] Remove code comments with issues
---
Flow.Launcher.Plugin/Result.cs | 3 ---
1 file changed, 3 deletions(-)
diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs
index 060c03317..f0fcd48ff 100644
--- a/Flow.Launcher.Plugin/Result.cs
+++ b/Flow.Launcher.Plugin/Result.cs
@@ -174,9 +174,6 @@ namespace Flow.Launcher.Plugin
///
/// Query information associated with the result
///
- ///
- /// If the query is for home query, this will be null
- ///
internal Query OriginQuery { get; set; }
///
From 0d9fb29f12948253a956f80fedae0d3a9473091e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 16:37:15 +0800
Subject: [PATCH 1025/1798] Improve code quality
---
Flow.Launcher/ViewModel/MainViewModel.cs | 64 +++++++++---------------
1 file changed, 23 insertions(+), 41 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 6d7b4a8a4..f79596c96 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1192,8 +1192,27 @@ namespace Flow.Launcher.ViewModel
var query = QueryText.ToLower().Trim();
History.Clear();
+ var results = GetHistoryItems(_history.Items);
+
+ if (!string.IsNullOrEmpty(query))
+ {
+ var filtered = results.Where
+ (
+ r => App.API.FuzzySearch(query, r.Title).IsSearchPrecisionScoreMet() ||
+ App.API.FuzzySearch(query, r.SubTitle).IsSearchPrecisionScoreMet()
+ ).ToList();
+ History.AddResults(filtered, id);
+ }
+ else
+ {
+ History.AddResults(results, id);
+ }
+ }
+
+ private static List GetHistoryItems(IEnumerable historyItems)
+ {
var results = new List();
- foreach (var h in _history.Items)
+ foreach (var h in historyItems)
{
var title = App.API.GetTranslation("executeQuery");
var time = App.API.GetTranslation("lastExecuteTime");
@@ -1217,20 +1236,7 @@ namespace Flow.Launcher.ViewModel
};
results.Add(result);
}
-
- if (!string.IsNullOrEmpty(query))
- {
- var filtered = results.Where
- (
- r => App.API.FuzzySearch(query, r.Title).IsSearchPrecisionScoreMet() ||
- App.API.FuzzySearch(query, r.SubTitle).IsSearchPrecisionScoreMet()
- ).ToList();
- History.AddResults(filtered, id);
- }
- else
- {
- History.AddResults(results, id);
- }
+ return results;
}
private async Task QueryResultsAsync(bool searchDelay, bool isReQuery = false, bool reSelect = true)
@@ -1431,33 +1437,9 @@ namespace Flow.Launcher.ViewModel
await Task.Yield();
// Select last history results and revert its order to make sure last history results are on top
- var historyResults = _history.Items.TakeLast(Settings.MaxHistoryResultsToShowForHomePage).Reverse();
+ var historyItems = _history.Items.TakeLast(Settings.MaxHistoryResultsToShowForHomePage).Reverse();
- var results = new List();
- foreach (var h in historyResults)
- {
- var title = App.API.GetTranslation("executeQuery");
- var time = App.API.GetTranslation("lastExecuteTime");
- var result = new Result
- {
- Title = string.Format(title, h.Query),
- SubTitle = string.Format(time, h.ExecutedDateTime),
- IcoPath = "Images\\history.png",
- Preview = new Result.PreviewInfo
- {
- PreviewImagePath = Constant.HistoryIcon,
- Description = string.Format(time, h.ExecutedDateTime)
- },
- OriginQuery = new Query { RawQuery = h.Query },
- Action = _ =>
- {
- SelectedResults = Results;
- App.API.ChangeQuery(h.Query);
- return false;
- }
- };
- results.Add(result);
- }
+ var results = GetHistoryItems(historyItems);
if (_updateSource.Token.IsCancellationRequested) return;
From 67facb8f18f4325def9572e37ccf7f25fbb7a8fa Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 16:44:05 +0800
Subject: [PATCH 1026/1798] Use non-async version
---
Flow.Launcher/ViewModel/MainViewModel.cs | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index f79596c96..5fd8d395f 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1346,7 +1346,7 @@ namespace Flow.Launcher.ViewModel
// Query history results for home page firstly so it will be put on top of the results
if (Settings.ShowHistoryResultsForHomePage)
{
- await QueryHistoryTaskAsync();
+ QueryHistoryTask();
}
}
else
@@ -1430,12 +1430,8 @@ namespace Flow.Launcher.ViewModel
}
}
- async Task QueryHistoryTaskAsync()
+ void QueryHistoryTask()
{
- // Since it is wrapped within a ThreadPool Thread, the synchronous context is null
- // Task.Yield will force it to run in ThreadPool
- await Task.Yield();
-
// Select last history results and revert its order to make sure last history results are on top
var historyItems = _history.Items.TakeLast(Settings.MaxHistoryResultsToShowForHomePage).Reverse();
@@ -1448,8 +1444,6 @@ namespace Flow.Launcher.ViewModel
{
App.API.LogError(ClassName, "Unable to add item to Result Update Queue");
}
-
- await Task.CompletedTask;
}
}
From 21d6ec20d45597ad872341afbcb82ef85a85ee87 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 18:29:39 +0800
Subject: [PATCH 1027/1798] Use null to distinguish between home query and
global query
---
Flow.Launcher.Core/Plugin/QueryBuilder.cs | 3 ++-
Flow.Launcher.Plugin/Query.cs | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/QueryBuilder.cs b/Flow.Launcher.Core/Plugin/QueryBuilder.cs
index fae821736..82745c239 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
+ // must use null because we need to distinguish between home query and global query
+ ActionKeyword = null
};
}
diff --git a/Flow.Launcher.Plugin/Query.cs b/Flow.Launcher.Plugin/Query.cs
index c3eede4c6..7d98a4afe 100644
--- a/Flow.Launcher.Plugin/Query.cs
+++ b/Flow.Launcher.Plugin/Query.cs
@@ -53,6 +53,7 @@ namespace Flow.Launcher.Plugin
///
/// The action keyword part of this query.
/// For global plugins this value will be empty.
+ /// For home query this value will be null.
///
public string ActionKeyword { get; init; }
From 28b8cb6013fb56de9d9946acc6a300af1e0883cf Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 21:43:48 +0800
Subject: [PATCH 1028/1798] Improve distinguish between home query and global
query
---
Flow.Launcher.Core/Plugin/QueryBuilder.cs | 3 +--
Flow.Launcher.Plugin/Query.cs | 1 -
Flow.Launcher/ViewModel/MainViewModel.cs | 17 +++++++++++++----
3 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/QueryBuilder.cs b/Flow.Launcher.Core/Plugin/QueryBuilder.cs
index 82745c239..fae821736 100644
--- a/Flow.Launcher.Core/Plugin/QueryBuilder.cs
+++ b/Flow.Launcher.Core/Plugin/QueryBuilder.cs
@@ -16,8 +16,7 @@ namespace Flow.Launcher.Core.Plugin
Search = string.Empty,
RawQuery = string.Empty,
SearchTerms = Array.Empty(),
- // must use null because we need to distinguish between home query and global query
- ActionKeyword = null
+ ActionKeyword = string.Empty
};
}
diff --git a/Flow.Launcher.Plugin/Query.cs b/Flow.Launcher.Plugin/Query.cs
index 7d98a4afe..c3eede4c6 100644
--- a/Flow.Launcher.Plugin/Query.cs
+++ b/Flow.Launcher.Plugin/Query.cs
@@ -53,7 +53,6 @@ namespace Flow.Launcher.Plugin
///
/// The action keyword part of this query.
/// For global plugins this value will be empty.
- /// For home query this value will be null.
///
public string ActionKeyword { get; init; }
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 5fd8d395f..30df8250c 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -33,6 +33,7 @@ namespace Flow.Launcher.ViewModel
private bool _isQueryRunning;
private Query _lastQuery;
+ private bool _lastHomeQuery;
private string _queryTextBeforeLeaveResults;
private string _ignoredQueryText = null;
@@ -1261,6 +1262,8 @@ namespace Flow.Launcher.ViewModel
return;
}
+ var homeQuery = query.RawQuery == string.Empty;
+
_updateSource = new CancellationTokenSource();
ProgressBarVisibility = Visibility.Hidden;
@@ -1275,11 +1278,11 @@ namespace Flow.Launcher.ViewModel
query.IsReQuery = isReQuery;
// handle the exclusiveness of plugin using action keyword
- RemoveOldQueryResults(query);
+ RemoveOldQueryResults(query, homeQuery);
_lastQuery = query;
+ _lastHomeQuery = homeQuery;
- var homeQuery = query.RawQuery == string.Empty;
ICollection plugins = Array.Empty();
if (homeQuery)
{
@@ -1524,9 +1527,15 @@ namespace Flow.Launcher.ViewModel
}
}
- private void RemoveOldQueryResults(Query query)
+ private void RemoveOldQueryResults(Query query, bool homeQuery)
{
- if (_lastQuery?.ActionKeyword != query?.ActionKeyword)
+ // If last or current query is home query, we need to clear the results
+ if (_lastHomeQuery || homeQuery)
+ {
+ Results.Clear();
+ }
+ // If last and current query are not home query, we need to check action keyword
+ else if (_lastQuery?.ActionKeyword != query?.ActionKeyword)
{
Results.Clear();
}
From 51fb1515a0d88636d26bfbc5913a994de8871209 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 22:04:01 +0800
Subject: [PATCH 1029/1798] Add more debug log info for query
---
Flow.Launcher/ViewModel/MainViewModel.cs | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index c505c32a3..c481be02e 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1215,10 +1215,14 @@ namespace Flow.Launcher.ViewModel
{
_updateSource?.Cancel();
+ App.API.LogDebug(ClassName, $"Start query with text: {QueryText}");
+
var query = await ConstructQueryAsync(QueryText, Settings.CustomShortcuts, Settings.BuiltinShortcuts);
if (query == null) // shortcut expanded
{
+ App.API.LogDebug(ClassName, $"Clear query results");
+
// Hide and clear results again because running query may show and add some results
Results.Visibility = Visibility.Collapsed;
Results.Clear();
@@ -1233,6 +1237,8 @@ namespace Flow.Launcher.ViewModel
return;
}
+ App.API.LogDebug(ClassName, $"Start query with ActionKeyword <{query.ActionKeyword}> and RawQuery <{query.RawQuery}>");
+
_updateSource = new CancellationTokenSource();
ProgressBarVisibility = Visibility.Hidden;
@@ -1253,6 +1259,9 @@ namespace Flow.Launcher.ViewModel
var plugins = PluginManager.ValidPluginsForQuery(query);
+ var validPluginNames = plugins.Select(x => $"<{x.Metadata.Name}>");
+ App.API.LogDebug(ClassName, $"Valid <{plugins.Count}> plugins: {string.Join(" ", validPluginNames)}");
+
if (plugins.Count == 1)
{
PluginIconPath = plugins.Single().Metadata.IcoPath;
@@ -1321,6 +1330,8 @@ namespace Flow.Launcher.ViewModel
// Local function
async Task QueryTaskAsync(PluginPair plugin, CancellationToken token)
{
+ App.API.LogDebug(ClassName, $"Wait for querying plugin <{plugin.Metadata.Name}>");
+
if (searchDelay)
{
var searchDelayTime = plugin.Metadata.SearchDelayTime ?? Settings.SearchDelayTime;
@@ -1359,6 +1370,8 @@ namespace Flow.Launcher.ViewModel
if (token.IsCancellationRequested) return;
+ App.API.LogDebug(ClassName, $"Update results for plugin <{plugin.Metadata.Name}>");
+
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, plugin.Metadata, query,
token, reSelect)))
{
@@ -1448,6 +1461,8 @@ namespace Flow.Launcher.ViewModel
{
if (_lastQuery?.ActionKeyword != query?.ActionKeyword)
{
+ App.API.LogDebug(ClassName, $"Remove old results");
+
Results.Clear();
}
}
From 197316397a1596a694cc445351724542b54b66bd Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 4 May 2025 22:05:57 +0800
Subject: [PATCH 1030/1798] Improve log info
---
Flow.Launcher/ViewModel/MainViewModel.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index c481be02e..228e66edb 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1215,7 +1215,7 @@ namespace Flow.Launcher.ViewModel
{
_updateSource?.Cancel();
- App.API.LogDebug(ClassName, $"Start query with text: {QueryText}");
+ App.API.LogDebug(ClassName, $"Start query with text: <{QueryText}>");
var query = await ConstructQueryAsync(QueryText, Settings.CustomShortcuts, Settings.BuiltinShortcuts);
From b9aa5a88cf5350ca7165fa570de225428472bd3f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 5 May 2025 08:30:53 +0800
Subject: [PATCH 1031/1798] Change variable name for code quality
---
Flow.Launcher/ViewModel/MainViewModel.cs | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 566cb6814..476c10e74 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -33,7 +33,7 @@ namespace Flow.Launcher.ViewModel
private bool _isQueryRunning;
private Query _lastQuery;
- private bool _lastHomeQuery;
+ private bool _lastIsHomeQuery;
private string _queryTextBeforeLeaveResults;
private string _ignoredQueryText = null;
@@ -1268,7 +1268,7 @@ namespace Flow.Launcher.ViewModel
App.API.LogDebug(ClassName, $"Start query with ActionKeyword <{query.ActionKeyword}> and RawQuery <{query.RawQuery}>");
- var homeQuery = query.RawQuery == string.Empty;
+ var isHomeQuery = query.RawQuery == string.Empty;
_updateSource = new CancellationTokenSource();
@@ -1284,13 +1284,13 @@ namespace Flow.Launcher.ViewModel
query.IsReQuery = isReQuery;
// handle the exclusiveness of plugin using action keyword
- RemoveOldQueryResults(query, homeQuery);
+ RemoveOldQueryResults(query, isHomeQuery);
_lastQuery = query;
- _lastHomeQuery = homeQuery;
+ _lastIsHomeQuery = isHomeQuery;
ICollection plugins = Array.Empty();
- if (homeQuery)
+ if (isHomeQuery)
{
if (Settings.ShowHomePage)
{
@@ -1347,7 +1347,7 @@ namespace Flow.Launcher.ViewModel
// plugins are ICollection, meaning LINQ will get the Count and preallocate Array
Task[] tasks;
- if (homeQuery)
+ if (isHomeQuery)
{
tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch
{
@@ -1397,7 +1397,7 @@ namespace Flow.Launcher.ViewModel
{
App.API.LogDebug(ClassName, $"Wait for querying plugin <{plugin.Metadata.Name}>");
- if (searchDelay && !homeQuery) // Do not delay for home query
+ if (searchDelay && !isHomeQuery) // Do not delay for home query
{
var searchDelayTime = plugin.Metadata.SearchDelayTime ?? Settings.SearchDelayTime;
@@ -1410,7 +1410,7 @@ namespace Flow.Launcher.ViewModel
// Task.Yield will force it to run in ThreadPool
await Task.Yield();
- var results = homeQuery ?
+ var results = isHomeQuery ?
await PluginManager.QueryHomeForPluginAsync(plugin, query, token) :
await PluginManager.QueryForPluginAsync(plugin, query, token);
@@ -1542,10 +1542,10 @@ namespace Flow.Launcher.ViewModel
}
}
- private void RemoveOldQueryResults(Query query, bool homeQuery)
+ private void RemoveOldQueryResults(Query query, bool isHomeQuery)
{
// If last or current query is home query, we need to clear the results
- if (_lastHomeQuery || homeQuery)
+ if (_lastIsHomeQuery || isHomeQuery)
{
Results.Clear();
}
From 2713c5babfaaf1a7989043f04b42b34b712116ca Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 5 May 2025 08:35:20 +0800
Subject: [PATCH 1032/1798] Add code comments
---
Flow.Launcher/ViewModel/MainViewModel.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 476c10e74..23958ca70 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -54,8 +54,8 @@ namespace Flow.Launcher.ViewModel
private readonly PluginMetadata _historyMetadata = new()
{
- ID = "298303A65D128A845D28A7B83B3968C2",
- Priority = 0
+ ID = "298303A65D128A845D28A7B83B3968C2", // ID is for ResultsForUpdate constructor
+ Priority = 0 // Priority is for calculating scores in UpdateResultView
};
#endregion
From 41211e8cd380df56a44dc9df996ac2833b431dc1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 5 May 2025 08:44:08 +0800
Subject: [PATCH 1033/1798] Improve code comments
---
Flow.Launcher/ViewModel/MainViewModel.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 23958ca70..dc35a6aa9 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -54,7 +54,7 @@ namespace Flow.Launcher.ViewModel
private readonly PluginMetadata _historyMetadata = new()
{
- ID = "298303A65D128A845D28A7B83B3968C2", // ID is for ResultsForUpdate constructor
+ ID = "298303A65D128A845D28A7B83B3968C2", // ID is for identifying the update plugin in UpdateActionAsync
Priority = 0 // Priority is for calculating scores in UpdateResultView
};
From 16404bc2a780430028e3515f19f02b2568f57b5e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 5 May 2025 12:54:15 +0800
Subject: [PATCH 1034/1798] Improve log information
---
Flow.Launcher/ViewModel/MainViewModel.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index dc35a6aa9..25c39ac7a 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1547,13 +1547,13 @@ namespace Flow.Launcher.ViewModel
// If last or current query is home query, we need to clear the results
if (_lastIsHomeQuery || isHomeQuery)
{
+ App.API.LogDebug(ClassName, $"Remove old results");
Results.Clear();
}
// If last and current query are not home query, we need to check action keyword
else if (_lastQuery?.ActionKeyword != query?.ActionKeyword)
{
App.API.LogDebug(ClassName, $"Remove old results");
-
Results.Clear();
}
}
From 36a4f4176778253f00c09a7675ec43b07953282a Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 5 May 2025 17:32:43 +0800
Subject: [PATCH 1035/1798] Do not need to clear the result when last and
current query are home query
---
Flow.Launcher/ViewModel/MainViewModel.cs | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 25c39ac7a..a8e431d99 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1544,8 +1544,13 @@ namespace Flow.Launcher.ViewModel
private void RemoveOldQueryResults(Query query, bool isHomeQuery)
{
+ // If last and current query are home query, we don't need to clear the results
+ if (_lastIsHomeQuery && isHomeQuery)
+ {
+ return;
+ }
// If last or current query is home query, we need to clear the results
- if (_lastIsHomeQuery || isHomeQuery)
+ else if (_lastIsHomeQuery || isHomeQuery)
{
App.API.LogDebug(ClassName, $"Remove old results");
Results.Clear();
From 0882378988b72615118150db4c011eafd59ceca9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 5 May 2025 18:53:40 +0800
Subject: [PATCH 1036/1798] Add Glyph for history items & topmost items
---
Flow.Launcher/ViewModel/MainViewModel.cs | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index a8e431d99..a98172f0a 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1221,19 +1221,15 @@ namespace Flow.Launcher.ViewModel
{
Title = string.Format(title, h.Query),
SubTitle = string.Format(time, h.ExecutedDateTime),
- IcoPath = "Images\\history.png",
- Preview = new Result.PreviewInfo
- {
- PreviewImagePath = Constant.HistoryIcon,
- Description = string.Format(time, h.ExecutedDateTime)
- },
+ IcoPath = Constant.HistoryIcon,
OriginQuery = new Query { RawQuery = h.Query },
Action = _ =>
{
App.API.BackToQueryResults();
App.API.ChangeQuery(h.Query);
return false;
- }
+ },
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE81C")
};
results.Add(result);
}
@@ -1579,7 +1575,8 @@ namespace Flow.Launcher.ViewModel
App.API.ShowMsg(App.API.GetTranslation("success"));
App.API.ReQuery();
return false;
- }
+ },
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74B")
};
}
else
@@ -1588,7 +1585,6 @@ namespace Flow.Launcher.ViewModel
{
Title = App.API.GetTranslation("setAsTopMostInThisQuery"),
IcoPath = "Images\\up.png",
- Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\xeac2"),
PluginDirectory = Constant.ProgramDirectory,
Action = _ =>
{
@@ -1596,7 +1592,8 @@ namespace Flow.Launcher.ViewModel
App.API.ShowMsg(App.API.GetTranslation("success"));
App.API.ReQuery();
return false;
- }
+ },
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74A")
};
}
From 7083849d149f4262b478f29d5c0c6834c78fd3c6 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 5 May 2025 19:11:46 +0800
Subject: [PATCH 1037/1798] Remove unused codes
---
Flow.Launcher/ViewModel/MainViewModel.cs | 2 --
1 file changed, 2 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index a98172f0a..6c4236db9 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -790,8 +790,6 @@ namespace Flow.Launcher.ViewModel
}
}
}
-
- _selectedResults.Visibility = Visibility.Visible;
}
}
From b1a48e296a9d3ee22b09b98c894e35dc4a2a3bc4 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 6 May 2025 13:58:28 +0800
Subject: [PATCH 1038/1798] Improve code quality
---
Flow.Launcher/ViewModel/MainViewModel.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 6c4236db9..8ec29c216 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -35,7 +35,7 @@ namespace Flow.Launcher.ViewModel
private Query _lastQuery;
private bool _lastIsHomeQuery;
private string _queryTextBeforeLeaveResults;
- private string _ignoredQueryText = null;
+ private string _ignoredQueryText; // Used to ignore query text change when switching between context menu and query results
private readonly FlowLauncherJsonStorage _historyItemsStorage;
private readonly FlowLauncherJsonStorage _userSelectedRecordStorage;
@@ -67,6 +67,7 @@ namespace Flow.Launcher.ViewModel
_queryTextBeforeLeaveResults = "";
_queryText = "";
_lastQuery = new Query();
+ _ignoredQueryText = null; // null as invalid value
Settings = Ioc.Default.GetRequiredService();
Settings.PropertyChanged += (_, args) =>
From 639a5aebe5a5a5feaf6f1fa10c4845d56218367d Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 6 May 2025 14:02:18 +0800
Subject: [PATCH 1039/1798] Dispose _updateSource when creating new one & Use
_updateToken instead of _updateSource.Token
---
Flow.Launcher/ViewModel/MainViewModel.cs | 30 ++++++++++++++----------
1 file changed, 17 insertions(+), 13 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 8ec29c216..175f4ff84 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -46,6 +46,7 @@ namespace Flow.Launcher.ViewModel
private readonly TopMostRecord _topMostRecord;
private CancellationTokenSource _updateSource; // Used to cancel old query flows
+ private CancellationToken _updateToken; // Used to avoid ObjectDisposedException of _updateSource.Token
private ChannelWriter _resultsUpdateChannelWriter;
private Task _resultsViewUpdateTask;
@@ -68,6 +69,8 @@ namespace Flow.Launcher.ViewModel
_queryText = "";
_lastQuery = new Query();
_ignoredQueryText = null; // null as invalid value
+ _updateSource = new CancellationTokenSource();
+ _updateToken = _updateSource.Token;
Settings = Ioc.Default.GetRequiredService();
Settings.PropertyChanged += (_, args) =>
@@ -249,7 +252,7 @@ namespace Flow.Launcher.ViewModel
return;
}
- var token = e.Token == default ? _updateSource.Token : e.Token;
+ var token = e.Token == default ? _updateToken : e.Token;
// make a clone to avoid possible issue that plugin will also change the list and items when updating view model
var resultsCopy = DeepCloneResults(e.Results, token);
@@ -1265,7 +1268,9 @@ namespace Flow.Launcher.ViewModel
var isHomeQuery = query.RawQuery == string.Empty;
+ _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue
_updateSource = new CancellationTokenSource();
+ _updateToken = _updateSource.Token;
ProgressBarVisibility = Visibility.Hidden;
_isQueryRunning = true;
@@ -1273,7 +1278,7 @@ namespace Flow.Launcher.ViewModel
// Switch to ThreadPool thread
await TaskScheduler.Default;
- if (_updateSource.Token.IsCancellationRequested) return;
+ if (_updateToken.IsCancellationRequested) return;
// Update the query's IsReQuery property to true if this is a re-query
query.IsReQuery = isReQuery;
@@ -1322,12 +1327,11 @@ namespace Flow.Launcher.ViewModel
{
// Wait 15 millisecond for query change in global query
// if query changes, return so that it won't be calculated
- await Task.Delay(15, _updateSource.Token);
- if (_updateSource.Token.IsCancellationRequested)
- return;
+ await Task.Delay(15, _updateToken);
+ if (_updateToken.IsCancellationRequested) return;
}*/
- _ = Task.Delay(200, _updateSource.Token).ContinueWith(_ =>
+ _ = Task.Delay(200, _updateToken).ContinueWith(_ =>
{
// start the progress bar if query takes more than 200 ms and this is the current running query and it didn't finish yet
if (_isQueryRunning)
@@ -1335,7 +1339,7 @@ namespace Flow.Launcher.ViewModel
ProgressBarVisibility = Visibility.Visible;
}
},
- _updateSource.Token,
+ _updateToken,
TaskContinuationOptions.NotOnCanceled,
TaskScheduler.Default);
@@ -1346,7 +1350,7 @@ namespace Flow.Launcher.ViewModel
{
tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch
{
- false => QueryTaskAsync(plugin, _updateSource.Token),
+ false => QueryTaskAsync(plugin, _updateToken),
true => Task.CompletedTask
}).ToArray();
@@ -1360,7 +1364,7 @@ namespace Flow.Launcher.ViewModel
{
tasks = plugins.Select(plugin => plugin.Metadata.Disabled switch
{
- false => QueryTaskAsync(plugin, _updateSource.Token),
+ false => QueryTaskAsync(plugin, _updateToken),
true => Task.CompletedTask
}).ToArray();
}
@@ -1375,13 +1379,13 @@ namespace Flow.Launcher.ViewModel
// nothing to do here
}
- if (_updateSource.Token.IsCancellationRequested) return;
+ if (_updateToken.IsCancellationRequested) return;
// this should happen once after all queries are done so progress bar should continue
// until the end of all querying
_isQueryRunning = false;
- if (!_updateSource.Token.IsCancellationRequested)
+ if (!_updateToken.IsCancellationRequested)
{
// update to hidden if this is still the current query
ProgressBarVisibility = Visibility.Hidden;
@@ -1448,12 +1452,12 @@ namespace Flow.Launcher.ViewModel
var results = GetHistoryItems(historyItems);
- if (_updateSource.Token.IsCancellationRequested) return;
+ if (_updateToken.IsCancellationRequested) return;
App.API.LogDebug(ClassName, $"Update results for history");
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, _historyMetadata, query,
- _updateSource.Token)))
+ _updateToken)))
{
App.API.LogError(ClassName, "Unable to add item to Result Update Queue");
}
From 265fd9c868e881da4f61060bb40385268c8d6420 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 6 May 2025 14:13:14 +0800
Subject: [PATCH 1040/1798] Add update source lock
---
Flow.Launcher/ViewModel/MainViewModel.cs | 27 ++++++++++++++++++------
1 file changed, 20 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 175f4ff84..afef8f64e 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -47,6 +47,7 @@ namespace Flow.Launcher.ViewModel
private CancellationTokenSource _updateSource; // Used to cancel old query flows
private CancellationToken _updateToken; // Used to avoid ObjectDisposedException of _updateSource.Token
+ private readonly object _updateSourceLock = new();
private ChannelWriter _resultsUpdateChannelWriter;
private Task _resultsViewUpdateTask;
@@ -69,8 +70,11 @@ namespace Flow.Launcher.ViewModel
_queryText = "";
_lastQuery = new Query();
_ignoredQueryText = null; // null as invalid value
- _updateSource = new CancellationTokenSource();
- _updateToken = _updateSource.Token;
+ lock (_updateSourceLock)
+ {
+ _updateSource = new CancellationTokenSource();
+ _updateToken = _updateSource.Token;
+ }
Settings = Ioc.Default.GetRequiredService();
Settings.PropertyChanged += (_, args) =>
@@ -1240,7 +1244,10 @@ namespace Flow.Launcher.ViewModel
private async Task QueryResultsAsync(bool searchDelay, bool isReQuery = false, bool reSelect = true)
{
- _updateSource?.Cancel();
+ lock (_updateSourceLock)
+ {
+ _updateSource.Cancel();
+ }
App.API.LogDebug(ClassName, $"Start query with text: <{QueryText}>");
@@ -1268,9 +1275,12 @@ namespace Flow.Launcher.ViewModel
var isHomeQuery = query.RawQuery == string.Empty;
- _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue
- _updateSource = new CancellationTokenSource();
- _updateToken = _updateSource.Token;
+ lock (_updateSourceLock)
+ {
+ _updateSource.Dispose(); // Dispose old update source to fix possible cancellation issue
+ _updateSource = new CancellationTokenSource();
+ _updateToken = _updateSource.Token;
+ }
ProgressBarVisibility = Visibility.Hidden;
_isQueryRunning = true;
@@ -1888,7 +1898,10 @@ namespace Flow.Launcher.ViewModel
{
if (disposing)
{
- _updateSource?.Dispose();
+ lock (_updateSourceLock)
+ {
+ _updateSource?.Dispose();
+ }
_resultsUpdateChannelWriter?.Complete();
if (_resultsViewUpdateTask?.IsCompleted == true)
{
From b156afed0bdac5cbe19749fcad2687d4bf2b9e20 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 6 May 2025 14:14:10 +0800
Subject: [PATCH 1041/1798] Revert "Add update source lock"
This reverts commit 265fd9c868e881da4f61060bb40385268c8d6420.
---
Flow.Launcher/ViewModel/MainViewModel.cs | 27 ++++++------------------
1 file changed, 7 insertions(+), 20 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index afef8f64e..175f4ff84 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -47,7 +47,6 @@ namespace Flow.Launcher.ViewModel
private CancellationTokenSource _updateSource; // Used to cancel old query flows
private CancellationToken _updateToken; // Used to avoid ObjectDisposedException of _updateSource.Token
- private readonly object _updateSourceLock = new();
private ChannelWriter _resultsUpdateChannelWriter;
private Task _resultsViewUpdateTask;
@@ -70,11 +69,8 @@ namespace Flow.Launcher.ViewModel
_queryText = "";
_lastQuery = new Query();
_ignoredQueryText = null; // null as invalid value
- lock (_updateSourceLock)
- {
- _updateSource = new CancellationTokenSource();
- _updateToken = _updateSource.Token;
- }
+ _updateSource = new CancellationTokenSource();
+ _updateToken = _updateSource.Token;
Settings = Ioc.Default.GetRequiredService();
Settings.PropertyChanged += (_, args) =>
@@ -1244,10 +1240,7 @@ namespace Flow.Launcher.ViewModel
private async Task QueryResultsAsync(bool searchDelay, bool isReQuery = false, bool reSelect = true)
{
- lock (_updateSourceLock)
- {
- _updateSource.Cancel();
- }
+ _updateSource?.Cancel();
App.API.LogDebug(ClassName, $"Start query with text: <{QueryText}>");
@@ -1275,12 +1268,9 @@ namespace Flow.Launcher.ViewModel
var isHomeQuery = query.RawQuery == string.Empty;
- lock (_updateSourceLock)
- {
- _updateSource.Dispose(); // Dispose old update source to fix possible cancellation issue
- _updateSource = new CancellationTokenSource();
- _updateToken = _updateSource.Token;
- }
+ _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue
+ _updateSource = new CancellationTokenSource();
+ _updateToken = _updateSource.Token;
ProgressBarVisibility = Visibility.Hidden;
_isQueryRunning = true;
@@ -1898,10 +1888,7 @@ namespace Flow.Launcher.ViewModel
{
if (disposing)
{
- lock (_updateSourceLock)
- {
- _updateSource?.Dispose();
- }
+ _updateSource?.Dispose();
_resultsUpdateChannelWriter?.Complete();
if (_resultsViewUpdateTask?.IsCompleted == true)
{
From 2672512a62503a76d72777c3716cfe48dc1465b7 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 6 May 2025 14:14:50 +0800
Subject: [PATCH 1042/1798] Dispose the old CancellationTokenSource atomically
to avoid races
---
Flow.Launcher/ViewModel/MainViewModel.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 175f4ff84..383256dcc 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1268,9 +1268,9 @@ namespace Flow.Launcher.ViewModel
var isHomeQuery = query.RawQuery == string.Empty;
- _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue
- _updateSource = new CancellationTokenSource();
+ var oldSource = Interlocked.Exchange(ref _updateSource, new CancellationTokenSource());
_updateToken = _updateSource.Token;
+ oldSource?.Dispose(); // Dispose old update source to fix possible cancellation issue
ProgressBarVisibility = Visibility.Hidden;
_isQueryRunning = true;
From 788cb3cc16cc639ffbe1d55acb3ab20f4f900396 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 6 May 2025 19:17:33 +0800
Subject: [PATCH 1043/1798] Revert "Dispose the old CancellationTokenSource
atomically to avoid races"
This reverts commit 2672512a62503a76d72777c3716cfe48dc1465b7.
---
Flow.Launcher/ViewModel/MainViewModel.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 383256dcc..175f4ff84 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1268,9 +1268,9 @@ namespace Flow.Launcher.ViewModel
var isHomeQuery = query.RawQuery == string.Empty;
- var oldSource = Interlocked.Exchange(ref _updateSource, new CancellationTokenSource());
+ _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue
+ _updateSource = new CancellationTokenSource();
_updateToken = _updateSource.Token;
- oldSource?.Dispose(); // Dispose old update source to fix possible cancellation issue
ProgressBarVisibility = Visibility.Hidden;
_isQueryRunning = true;
From deb0c2139f6cbf6f6efd99ba640f65d76596edcd Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 6 May 2025 19:22:37 +0800
Subject: [PATCH 1044/1798] Remove unused initialization value
---
Flow.Launcher/ViewModel/MainViewModel.cs | 2 --
1 file changed, 2 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 175f4ff84..aab2e2d03 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -69,8 +69,6 @@ namespace Flow.Launcher.ViewModel
_queryText = "";
_lastQuery = new Query();
_ignoredQueryText = null; // null as invalid value
- _updateSource = new CancellationTokenSource();
- _updateToken = _updateSource.Token;
Settings = Ioc.Default.GetRequiredService();
Settings.PropertyChanged += (_, args) =>
From 297643c3e52d9800154390e40a5518e64cb86d9e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 6 May 2025 19:35:40 +0800
Subject: [PATCH 1045/1798] Revert all changes as master branch
---
Flow.Launcher/ViewModel/MainViewModel.cs | 35 +++++++++++++-----------
1 file changed, 19 insertions(+), 16 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index aab2e2d03..c0b74dc68 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1266,9 +1266,12 @@ namespace Flow.Launcher.ViewModel
var isHomeQuery = query.RawQuery == string.Empty;
- _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue
- _updateSource = new CancellationTokenSource();
- _updateToken = _updateSource.Token;
+ _updateSource?.Dispose();
+
+ var currentUpdateSource = new CancellationTokenSource();
+ _updateSource = currentUpdateSource;
+ var currentCancellationToken = _updateSource.Token;
+ _updateToken = currentCancellationToken;
ProgressBarVisibility = Visibility.Hidden;
_isQueryRunning = true;
@@ -1276,7 +1279,7 @@ namespace Flow.Launcher.ViewModel
// Switch to ThreadPool thread
await TaskScheduler.Default;
- if (_updateToken.IsCancellationRequested) return;
+ if (currentCancellationToken.IsCancellationRequested) return;
// Update the query's IsReQuery property to true if this is a re-query
query.IsReQuery = isReQuery;
@@ -1325,11 +1328,11 @@ namespace Flow.Launcher.ViewModel
{
// Wait 15 millisecond for query change in global query
// if query changes, return so that it won't be calculated
- await Task.Delay(15, _updateToken);
- if (_updateToken.IsCancellationRequested) return;
+ await Task.Delay(15, currentCancellationToken);
+ if (currentCancellationToken.IsCancellationRequested) return;
}*/
- _ = Task.Delay(200, _updateToken).ContinueWith(_ =>
+ _ = Task.Delay(200, currentCancellationToken).ContinueWith(_ =>
{
// start the progress bar if query takes more than 200 ms and this is the current running query and it didn't finish yet
if (_isQueryRunning)
@@ -1337,7 +1340,7 @@ namespace Flow.Launcher.ViewModel
ProgressBarVisibility = Visibility.Visible;
}
},
- _updateToken,
+ currentCancellationToken,
TaskContinuationOptions.NotOnCanceled,
TaskScheduler.Default);
@@ -1348,21 +1351,21 @@ namespace Flow.Launcher.ViewModel
{
tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch
{
- false => QueryTaskAsync(plugin, _updateToken),
+ false => QueryTaskAsync(plugin, currentCancellationToken),
true => Task.CompletedTask
}).ToArray();
// Query history results for home page firstly so it will be put on top of the results
if (Settings.ShowHistoryResultsForHomePage)
{
- QueryHistoryTask();
+ QueryHistoryTask(currentCancellationToken);
}
}
else
{
tasks = plugins.Select(plugin => plugin.Metadata.Disabled switch
{
- false => QueryTaskAsync(plugin, _updateToken),
+ false => QueryTaskAsync(plugin, currentCancellationToken),
true => Task.CompletedTask
}).ToArray();
}
@@ -1377,13 +1380,13 @@ namespace Flow.Launcher.ViewModel
// nothing to do here
}
- if (_updateToken.IsCancellationRequested) return;
+ if (currentCancellationToken.IsCancellationRequested) return;
// this should happen once after all queries are done so progress bar should continue
// until the end of all querying
_isQueryRunning = false;
- if (!_updateToken.IsCancellationRequested)
+ if (!currentCancellationToken.IsCancellationRequested)
{
// update to hidden if this is still the current query
ProgressBarVisibility = Visibility.Hidden;
@@ -1443,19 +1446,19 @@ namespace Flow.Launcher.ViewModel
}
}
- void QueryHistoryTask()
+ void QueryHistoryTask(CancellationToken token)
{
// Select last history results and revert its order to make sure last history results are on top
var historyItems = _history.Items.TakeLast(Settings.MaxHistoryResultsToShowForHomePage).Reverse();
var results = GetHistoryItems(historyItems);
- if (_updateToken.IsCancellationRequested) return;
+ if (token.IsCancellationRequested) return;
App.API.LogDebug(ClassName, $"Update results for history");
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, _historyMetadata, query,
- _updateToken)))
+ token)))
{
App.API.LogError(ClassName, "Unable to add item to Result Update Queue");
}
From 29f94d66c229cd4036fc00f48e64add87d0fab00 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 9 May 2025 15:57:18 +0800
Subject: [PATCH 1046/1798] Fix startup flicker
---
Flow.Launcher/App.xaml.cs | 2 +-
Flow.Launcher/MainWindow.xaml.cs | 3 ---
2 files changed, 1 insertion(+), 4 deletions(-)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 402812a92..942e94470 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -203,7 +203,7 @@ namespace Flow.Launcher
// it will steal focus from main window which causes window hide
HotKeyMapper.Initialize();
- // Main windows needs initialized before theme change because of blur settings
+ // Initialize theme for main window
Ioc.Default.GetRequiredService().ChangeTheme();
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index e2948c540..e243549e3 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -166,9 +166,6 @@ namespace Flow.Launcher
// Force update position
UpdatePosition();
- // Refresh frame
- await _theme.RefreshFrameAsync();
-
// Initialize resize mode after refreshing frame
SetupResizeMode();
From 7c8a4379a33d9e1fbd0c64d713519d5e8d455831 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sat, 10 May 2025 22:56:48 +1000
Subject: [PATCH 1047/1798] fix clearing of results logic & minor adjustment to
results update (#3524)
---
Flow.Launcher/ViewModel/MainViewModel.cs | 64 ++++++++++++---------
Flow.Launcher/ViewModel/ResultsForUpdate.cs | 3 +-
Flow.Launcher/ViewModel/ResultsViewModel.cs | 11 +++-
3 files changed, 48 insertions(+), 30 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index c0b74dc68..0c299875f 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -33,7 +33,7 @@ namespace Flow.Launcher.ViewModel
private bool _isQueryRunning;
private Query _lastQuery;
- private bool _lastIsHomeQuery;
+ private bool _previousIsHomeQuery;
private string _queryTextBeforeLeaveResults;
private string _ignoredQueryText; // Used to ignore query text change when switching between context menu and query results
@@ -1264,7 +1264,7 @@ namespace Flow.Launcher.ViewModel
App.API.LogDebug(ClassName, $"Start query with ActionKeyword <{query.ActionKeyword}> and RawQuery <{query.RawQuery}>");
- var isHomeQuery = query.RawQuery == string.Empty;
+ var currentIsHomeQuery = query.RawQuery == string.Empty;
_updateSource?.Dispose();
@@ -1284,14 +1284,10 @@ namespace Flow.Launcher.ViewModel
// Update the query's IsReQuery property to true if this is a re-query
query.IsReQuery = isReQuery;
- // handle the exclusiveness of plugin using action keyword
- RemoveOldQueryResults(query, isHomeQuery);
-
- _lastQuery = query;
- _lastIsHomeQuery = isHomeQuery;
+
ICollection plugins = Array.Empty();
- if (isHomeQuery)
+ if (currentIsHomeQuery)
{
if (Settings.ShowHomePage)
{
@@ -1347,7 +1343,7 @@ namespace Flow.Launcher.ViewModel
// plugins are ICollection, meaning LINQ will get the Count and preallocate Array
Task[] tasks;
- if (isHomeQuery)
+ if (currentIsHomeQuery)
{
tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch
{
@@ -1397,7 +1393,7 @@ namespace Flow.Launcher.ViewModel
{
App.API.LogDebug(ClassName, $"Wait for querying plugin <{plugin.Metadata.Name}>");
- if (searchDelay && !isHomeQuery) // Do not delay for home query
+ if (searchDelay && !currentIsHomeQuery) // Do not delay for home query
{
var searchDelayTime = plugin.Metadata.SearchDelayTime ?? Settings.SearchDelayTime;
@@ -1410,7 +1406,7 @@ namespace Flow.Launcher.ViewModel
// Task.Yield will force it to run in ThreadPool
await Task.Yield();
- var results = isHomeQuery ?
+ var results = currentIsHomeQuery ?
await PluginManager.QueryHomeForPluginAsync(plugin, query, token) :
await PluginManager.QueryForPluginAsync(plugin, query, token);
@@ -1439,8 +1435,13 @@ 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);
+ _lastQuery = query;
+ _previousIsHomeQuery = currentIsHomeQuery;
+
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, plugin.Metadata, query,
- token, reSelect)))
+ token, reSelect, shouldClearExistingResults)))
{
App.API.LogError(ClassName, "Unable to add item to Result Update Queue");
}
@@ -1542,25 +1543,36 @@ namespace Flow.Launcher.ViewModel
}
}
- private void RemoveOldQueryResults(Query query, bool isHomeQuery)
+ ///
+ /// 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
+ /// 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.
+ ///
+ /// There is no need to clear results from global action keyword if a new set of results comes along that is also from global action keywords.
+ /// This is because the removal of obsolete results is handled in ResultsViewModel.NewResults(ICollection).
+ ///
+ /// 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)
{
- // If last and current query are home query, we don't need to clear the results
- if (_lastIsHomeQuery && isHomeQuery)
+ // If previous or current results are from home query, we need to clear them
+ if (_previousIsHomeQuery || currentIsHomeQuery)
{
- return;
+ App.API.LogDebug(ClassName, $"Cleared old results");
+ return true;
}
- // If last or current query is home query, we need to clear the results
- else if (_lastIsHomeQuery || isHomeQuery)
+
+ // 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, $"Remove old results");
- Results.Clear();
- }
- // If last and current query are not home query, we need to check action keyword
- else if (_lastQuery?.ActionKeyword != query?.ActionKeyword)
- {
- App.API.LogDebug(ClassName, $"Remove old results");
- Results.Clear();
+ App.API.LogDebug(ClassName, $"Cleared old results");
+ return true;
}
+
+ return false;
}
private Result ContextMenuTopMost(Result result)
diff --git a/Flow.Launcher/ViewModel/ResultsForUpdate.cs b/Flow.Launcher/ViewModel/ResultsForUpdate.cs
index bc0be0de8..1563f85ba 100644
--- a/Flow.Launcher/ViewModel/ResultsForUpdate.cs
+++ b/Flow.Launcher/ViewModel/ResultsForUpdate.cs
@@ -9,7 +9,8 @@ namespace Flow.Launcher.ViewModel
PluginMetadata Metadata,
Query Query,
CancellationToken Token,
- bool ReSelectFirstResult = true)
+ bool ReSelectFirstResult = true,
+ bool shouldClearExistingResults = false)
{
public string ID { get; } = Metadata.ID;
}
diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs
index 02fb379fa..cd2736afa 100644
--- a/Flow.Launcher/ViewModel/ResultsViewModel.cs
+++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs
@@ -232,10 +232,15 @@ namespace Flow.Launcher.ViewModel
if (!resultsForUpdates.Any())
return Results;
+ var newResults = resultsForUpdates.SelectMany(u => u.Results, (u, r) => new ResultViewModel(r, _settings));
+
+ if (resultsForUpdates.Any(x => x.shouldClearExistingResults))
+ return newResults.OrderByDescending(rv => rv.Result.Score).ToList();
+
return Results.Where(r => r?.Result != null && resultsForUpdates.All(u => u.ID != r.Result.PluginID))
- .Concat(resultsForUpdates.SelectMany(u => u.Results, (u, r) => new ResultViewModel(r, _settings)))
- .OrderByDescending(rv => rv.Result.Score)
- .ToList();
+ .Concat(newResults)
+ .OrderByDescending(rv => rv.Result.Score)
+ .ToList();
}
#endregion
From 0c7d0e9300acd52dba2d03dc9f8f54501d01ee71 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 11 May 2025 09:28:55 +0800
Subject: [PATCH 1048/1798] Support copy file name
---
.../ContextMenu.cs | 23 +++++++++++++++++++
.../Languages/en.xaml | 2 ++
Plugins/Flow.Launcher.Plugin.Explorer/Main.cs | 1 -
3 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
index 633af7b6b..eabd118fb 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
@@ -140,6 +140,29 @@ namespace Flow.Launcher.Plugin.Explorer
Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue8c8")
});
+ contextMenus.Add(new Result
+ {
+ Title = Context.API.GetTranslation("plugin_explorer_copyname"),
+ SubTitle = Context.API.GetTranslation("plugin_explorer_copyname_subtitle"),
+ Action = _ =>
+ {
+ try
+ {
+ Context.API.CopyToClipboard(Path.GetFileName(record.FullPath));
+ return true;
+ }
+ catch (Exception e)
+ {
+ var message = "Fail to set text in clipboard";
+ LogException(message, e);
+ Context.API.ShowMsg(message);
+ return false;
+ }
+ },
+ IcoPath = Constants.CopyImagePath,
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue8c8")
+ });
+
contextMenus.Add(new Result
{
Title = Context.API.GetTranslation("plugin_explorer_copyfilefolder"),
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index f7d5bdb18..79f8a5848 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -82,6 +82,8 @@
Copy pathCopy path of current item to clipboard
+ Copy name
+ Copy name of current item to clipboardCopyCopy current file to clipboardCopy current folder to clipboard
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
index e4056131d..1c5d074a0 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
@@ -8,7 +8,6 @@ using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using System.Windows;
using System.Windows.Controls;
using Flow.Launcher.Plugin.Explorer.Exceptions;
From 315de2b53146c0120c39e944254b0e7a15dc5295 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 11 May 2025 09:44:43 +0800
Subject: [PATCH 1049/1798] Adjust margin in appearance page
---
Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
index 37de80451..700dc3a91 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
@@ -733,7 +733,7 @@
From 4e6a07c0d7954cc5e2d27aa1421d2d74dcfc19da Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 11 May 2025 11:49:52 +1000
Subject: [PATCH 1050/1798] Check spelling workflow ignore PRs targeting dev
branch
---
.github/workflows/spelling.yml | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml
index 7aaa9296a..003022ac5 100644
--- a/.github/workflows/spelling.yml
+++ b/.github/workflows/spelling.yml
@@ -41,9 +41,8 @@ on:
# tags-ignore:
# - "**"
pull_request_target:
- branches:
- - '**'
- # - '!l10n_dev'
+ branches-ignore:
+ - dev
tags-ignore:
- "**"
types:
From 99a7081d1e60f2edcc5357f115f975fb2fc3b444 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 11 May 2025 11:52:26 +1000
Subject: [PATCH 1051/1798] fix typo
---
.github/workflows/spelling.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml
index 003022ac5..47bd66107 100644
--- a/.github/workflows/spelling.yml
+++ b/.github/workflows/spelling.yml
@@ -42,7 +42,7 @@ on:
# - "**"
pull_request_target:
branches-ignore:
- - dev
+ - master
tags-ignore:
- "**"
types:
From 25d985b98ff4c6b7a90be4715ef6ff835e5de4a5 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 11 May 2025 14:32:59 +0800
Subject: [PATCH 1052/1798] Fix Homepage with triggers history results on arrow
up
---
Flow.Launcher/ViewModel/MainViewModel.cs | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 0c299875f..df4144510 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -518,9 +518,10 @@ namespace Flow.Launcher.ViewModel
[RelayCommand]
private void SelectPrevItem()
{
- if (_history.Items.Count > 0
- && QueryText == string.Empty
- && QueryResultsSelected())
+ if (QueryResultsSelected() // Results selected
+ && string.IsNullOrEmpty(QueryText) // No input
+ && Results.Visibility != Visibility.Visible // Results closed which means no items in Results
+ && _history.Items.Count > 0) // Have history items
{
lastHistoryIndex = 1;
ReverseHistory();
From af5ff430c47614824e84cc0ed5690bd34536aa90 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 11 May 2025 18:16:29 +1000
Subject: [PATCH 1053/1798] update comment
---
Flow.Launcher/ViewModel/MainViewModel.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index df4144510..52581ea1d 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -520,7 +520,7 @@ namespace Flow.Launcher.ViewModel
{
if (QueryResultsSelected() // Results selected
&& string.IsNullOrEmpty(QueryText) // No input
- && Results.Visibility != Visibility.Visible // Results closed which means no items in Results
+ && Results.Visibility != Visibility.Visible // No items in result list, e.g. when home page is off and no query text is entered, therefore the view is collapsed.
&& _history.Items.Count > 0) // Have history items
{
lastHistoryIndex = 1;
From 6ed5308896762787971ff6e085ac2995b50bcfdf Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 11 May 2025 16:53:44 +0800
Subject: [PATCH 1054/1798] Fix null origin query issue
---
Flow.Launcher/Storage/TopMostRecord.cs | 18 +-----------------
Flow.Launcher/ViewModel/MainViewModel.cs | 21 ++++++++++-----------
2 files changed, 11 insertions(+), 28 deletions(-)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index 7f35904a5..327ad8336 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -12,9 +12,7 @@ namespace Flow.Launcher.Storage
internal bool IsTopMost(Result result)
{
- // origin query is null when user select the context menu item directly of one item from query list
- // in this case, we do not need to check if the result is top most
- if (records.IsEmpty || result.OriginQuery == null ||
+ if (records.IsEmpty ||
!records.TryGetValue(result.OriginQuery.RawQuery, out var value))
{
return false;
@@ -26,25 +24,11 @@ namespace Flow.Launcher.Storage
internal void Remove(Result result)
{
- // origin query is null when user select the context menu item directly of one item from query list
- // in this case, we do not need to remove the record
- if (result.OriginQuery == null)
- {
- return;
- }
-
records.Remove(result.OriginQuery.RawQuery, out _);
}
internal void AddOrUpdate(Result result)
{
- // origin query is null when user select the context menu item directly of one item from query list
- // in this case, we do not need to add or update the record
- if (result.OriginQuery == null)
- {
- return;
- }
-
var record = new Record
{
PluginID = result.PluginID,
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 0c299875f..efa6dd39d 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -444,12 +444,7 @@ namespace Flow.Launcher.ViewModel
if (QueryResultsSelected())
{
_userSelectedRecord.Add(result);
- // origin query is null when user select the context menu item directly of one item from query list
- // so we don't want to add it to history
- if (result.OriginQuery != null)
- {
- _history.Add(result.OriginQuery.RawQuery);
- }
+ _history.Add(result.OriginQuery.RawQuery);
lastHistoryIndex = 1;
}
@@ -1158,7 +1153,7 @@ namespace Flow.Launcher.ViewModel
{
results = PluginManager.GetContextMenusForPlugin(selected);
results.Add(ContextMenuTopMost(selected));
- results.Add(ContextMenuPluginInfo(selected.PluginID));
+ results.Add(ContextMenuPluginInfo(selected));
}
if (!string.IsNullOrEmpty(query))
@@ -1592,7 +1587,8 @@ namespace Flow.Launcher.ViewModel
App.API.ReQuery();
return false;
},
- Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74B")
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74B"),
+ OriginQuery = result.OriginQuery
};
}
else
@@ -1609,15 +1605,17 @@ namespace Flow.Launcher.ViewModel
App.API.ReQuery();
return false;
},
- Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74A")
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74A"),
+ OriginQuery = result.OriginQuery
};
}
return menu;
}
- private static Result ContextMenuPluginInfo(string id)
+ private static Result ContextMenuPluginInfo(Result result)
{
+ var id = result.PluginID;
var metadata = PluginManager.GetPluginForId(id).Metadata;
var translator = App.API;
@@ -1639,7 +1637,8 @@ namespace Flow.Launcher.ViewModel
{
App.API.OpenUrl(metadata.Website);
return true;
- }
+ },
+ OriginQuery = result.OriginQuery
};
return menu;
}
From 0e6741cf3f7d6960df13fc7a53a24c8e8963a47d Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 11 May 2025 17:05:55 +0800
Subject: [PATCH 1055/1798] Improve code quality
---
Flow.Launcher/Storage/TopMostRecord.cs | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs
index 327ad8336..7714b5001 100644
--- a/Flow.Launcher/Storage/TopMostRecord.cs
+++ b/Flow.Launcher/Storage/TopMostRecord.cs
@@ -12,8 +12,7 @@ namespace Flow.Launcher.Storage
internal bool IsTopMost(Result result)
{
- if (records.IsEmpty ||
- !records.TryGetValue(result.OriginQuery.RawQuery, out var value))
+ if (records.IsEmpty || !records.TryGetValue(result.OriginQuery.RawQuery, out var value))
{
return false;
}
From 1775c0fd26cc2b1efd2d458131e735fc9f72cfbe Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 11 May 2025 20:27:09 +1000
Subject: [PATCH 1056/1798] New Crowdin updates (#3430)
---
Flow.Launcher/Languages/ar.xaml | 68 +++++++--
Flow.Launcher/Languages/cs.xaml | 68 +++++++--
Flow.Launcher/Languages/da.xaml | 134 +++++++++++-------
Flow.Launcher/Languages/de.xaml | 68 +++++++--
Flow.Launcher/Languages/es-419.xaml | 68 +++++++--
Flow.Launcher/Languages/es.xaml | 68 +++++++--
Flow.Launcher/Languages/fr.xaml | 62 ++++++--
Flow.Launcher/Languages/he.xaml | 77 +++++++---
Flow.Launcher/Languages/it.xaml | 68 +++++++--
Flow.Launcher/Languages/ja.xaml | 134 +++++++++++-------
Flow.Launcher/Languages/ko.xaml | 113 +++++++++------
Flow.Launcher/Languages/nb.xaml | 68 +++++++--
Flow.Launcher/Languages/nl.xaml | 68 +++++++--
Flow.Launcher/Languages/pl.xaml | 112 ++++++++++-----
Flow.Launcher/Languages/pt-br.xaml | 68 +++++++--
Flow.Launcher/Languages/pt-pt.xaml | 59 ++++++--
Flow.Launcher/Languages/ru.xaml | 68 +++++++--
Flow.Launcher/Languages/sk.xaml | 70 ++++++---
Flow.Launcher/Languages/sr.xaml | 68 +++++++--
Flow.Launcher/Languages/tr.xaml | 68 +++++++--
Flow.Launcher/Languages/uk-UA.xaml | 68 +++++++--
Flow.Launcher/Languages/vi.xaml | 68 +++++++--
Flow.Launcher/Languages/zh-cn.xaml | 68 +++++++--
Flow.Launcher/Languages/zh-tw.xaml | 68 +++++++--
.../Languages/ja.xaml | 14 +-
.../Languages/ko.xaml | 4 +-
.../Languages/pt-pt.xaml | 2 +-
.../Languages/ja.xaml | 6 +-
.../Languages/pt-pt.xaml | 2 +-
.../Languages/ja.xaml | 80 +++++------
.../Languages/pt-pt.xaml | 2 +-
.../Languages/ko.xaml | 4 +-
.../Languages/ar.xaml | 1 +
.../Languages/cs.xaml | 1 +
.../Languages/da.xaml | 1 +
.../Languages/de.xaml | 1 +
.../Languages/es-419.xaml | 1 +
.../Languages/es.xaml | 1 +
.../Languages/fr.xaml | 1 +
.../Languages/he.xaml | 1 +
.../Languages/it.xaml | 1 +
.../Languages/ja.xaml | 1 +
.../Languages/ko.xaml | 1 +
.../Languages/nb.xaml | 1 +
.../Languages/nl.xaml | 1 +
.../Languages/pl.xaml | 1 +
.../Languages/pt-br.xaml | 1 +
.../Languages/pt-pt.xaml | 1 +
.../Languages/ru.xaml | 1 +
.../Languages/sk.xaml | 1 +
.../Languages/sr.xaml | 1 +
.../Languages/tr.xaml | 1 +
.../Languages/uk-UA.xaml | 1 +
.../Languages/vi.xaml | 1 +
.../Languages/zh-cn.xaml | 1 +
.../Languages/zh-tw.xaml | 1 +
.../Languages/ar.xaml | 2 +-
.../Languages/cs.xaml | 2 +-
.../Languages/da.xaml | 2 +-
.../Languages/de.xaml | 2 +-
.../Languages/es-419.xaml | 2 +-
.../Languages/es.xaml | 2 +-
.../Languages/fr.xaml | 2 +-
.../Languages/he.xaml | 2 +-
.../Languages/it.xaml | 2 +-
.../Languages/ja.xaml | 22 +--
.../Languages/ko.xaml | 6 +-
.../Languages/nb.xaml | 2 +-
.../Languages/nl.xaml | 2 +-
.../Languages/pl.xaml | 2 +-
.../Languages/pt-br.xaml | 2 +-
.../Languages/pt-pt.xaml | 2 +-
.../Languages/ru.xaml | 2 +-
.../Languages/sk.xaml | 2 +-
.../Languages/sr.xaml | 2 +-
.../Languages/tr.xaml | 2 +-
.../Languages/uk-UA.xaml | 2 +-
.../Languages/vi.xaml | 2 +-
.../Languages/zh-cn.xaml | 2 +-
.../Languages/zh-tw.xaml | 2 +-
.../Languages/ja.xaml | 2 +-
.../Languages/he.xaml | 14 +-
.../Languages/ja.xaml | 28 ++--
.../Languages/ko.xaml | 2 +-
.../Languages/ja.xaml | 2 +-
.../Languages/ko.xaml | 12 +-
.../Properties/Resources.he-IL.resx | 16 +--
87 files changed, 1529 insertions(+), 606 deletions(-)
diff --git a/Flow.Launcher/Languages/ar.xaml b/Flow.Launcher/Languages/ar.xaml
index b5eafaae9..b81c5c9b5 100644
--- a/Flow.Launcher/Languages/ar.xaml
+++ b/Flow.Launcher/Languages/ar.xaml
@@ -42,6 +42,7 @@
وضع اللعبتعليق استخدام مفاتيح التشغيل السريع.إعادة تعيين الموقع
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
خطأ في إعداد التشغيل عند بدء التشغيلإخفاء Flow Launcher عند فقدان التركيزعدم عرض إشعارات الإصدار الجديد
- موضع نافذة البحث
+ Search Window Locationتذكر آخر موقعالشاشة مع مؤشر الماوسالشاشة مع النافذة المركزة
@@ -106,14 +107,35 @@
فتح لوحة المعاينة دائمًا عند تنشيط Flow. اضغط على {0} للتبديل بين المعاينة وعدمها.تأثير الظل غير مسموح به بينما يتم تمكين تأثير التمويه في السمة الحاليةSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of 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.البحث عن إضافة
@@ -130,8 +152,13 @@
كلمة الفعل الحاليةكلمة فعل جديدةتغيير كلمات الفعل
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ مفع
+ الأولوي
+ Search Delay
+ Home Pageالأولوية الحاليةأولوية جديدةالأولوية
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- Defaultمتجر الإضافات
@@ -184,6 +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.تخصيصوضع النافذةالشفافية
@@ -211,12 +240,13 @@
الساعةالتاريخBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveبلاAcrylicMicaMica Alt
- هذه السمة تدعم الوضعين (فاتح/داكن).
+ This theme supports two (light/dark) modes.هذه السمة تدعم الخلفية الضبابية الشفافة.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +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
@@ -323,6 +356,7 @@
مجلد السجلاتمسح السجلاتهل أنت متأكد أنك تريد حذف جميع السجلات؟
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window Fontاختر مدير الملفات
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneنجاحاكتمل بنجاح
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.مفتاح اختصار الاستعلام المخصص
diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml
index 806e9f203..71c9c8c6b 100644
--- a/Flow.Launcher/Languages/cs.xaml
+++ b/Flow.Launcher/Languages/cs.xaml
@@ -42,6 +42,7 @@
Herní režimPotlačit užívání klávesových zkratek.Obnovit pozici
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Při nastavování spouštění došlo k chyběSkrýt Flow Launcher při vykliknutíNezobrazovat oznámení o nové verzi
- Pozice vyhledávacího okna
+ Search Window LocationZapamatovat poslední poziciObrazovka s kurzoremObrazovka s aktivním oknem
@@ -106,14 +107,35 @@
Při aktivaci služby Flow vždy otevřete panel náhledu. Stisknutím klávesy {0} přepnete náhled.Stínový efekt není povolen, pokud je aktivní efekt rozostřeníSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Otevřít
+ 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.Vyhledat plugin
@@ -130,8 +152,13 @@
Aktuální aktivační příkazNový aktivační příkazUpravit aktivační příkaz
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Povoleno
+ Priorita
+ Search Delay
+ Home PageAktuální prioritaNová prioritaPriorita
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultObchod s pluginy
@@ -184,6 +210,9 @@
Result Title FontResult Subtitle FontReset
+ 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.CustomizeRežim oknaNeprůhlednost
@@ -211,12 +240,13 @@
HodinyDatumBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveNoneAcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Použít ikony Segoe FluentPoužití ikon Segoe Fluent, pokud jsou podporoványStiskněte klávesu
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyHTTP Proxy
@@ -323,6 +356,7 @@
Složka s logyVymazat logyOpravdu chcete odstranit všechny logy?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window FontVybrat správce souborů
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneÚspěšnéÚspěšně dokončeno
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Vlastní klávesová zkratka pro vyhledávání
diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml
index 6055a79e1..37723dc9b 100644
--- a/Flow.Launcher/Languages/da.xaml
+++ b/Flow.Launcher/Languages/da.xaml
@@ -30,32 +30,33 @@
IndstillingerOmAfslut
- Close
+ LukCopy
- Cut
- Paste
+ Klip
+ IndsætUndoSelect AllFileFolderTextGame Mode
- Suspend the use of Hotkeys.
+ Suspender brugen af genvejstaster.Position Reset
+ Reset search window positionType here to searchIndstillingerGenereltPortable Mode
- Store all settings and user data in one folder (Useful when used with removable drives or cloud services).
+ Gem alle indstillinger og brugerdata i én mappe (nyttigt ved brug af flytbare drev eller cloud-tjenester).Start Flow Launcher ved system startUse logon task instead of startup entry for faster startup experienceAfter uninstallation, you need to manually remove this task (Flow.Launcher Startup) via Task SchedulerError setting launch on startupSkjul Flow Launcher ved mistet fokusVis ikke notifikationer om nye versioner
- Search Window Position
+ Search Window LocationRemember Last PositionMonitor with Mouse CursorMonitor with Focused Window
@@ -104,16 +105,37 @@
Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.Always PreviewAlways open preview panel when Flow activates. Press {0} to toggle preview.
- Shadow effect is not allowed while current theme has blur effect enabled
+ Skyggeeffekt er ikke tilladt, når det aktuelle tema har sløringseffekt aktiveretSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Åben
+ 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.Search Plugin
@@ -123,40 +145,44 @@
PluginPluginsFind flere plugins
- On
+ TilDeaktiverAction keyword SettingNøgleordCurrent action keywordNew action keywordChange Action Keywords
- Plugin seach delay time
- Change Plugin Seach Delay Time
- Current Priority
- New Priority
- Priority
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Enabled
+ Prioritet
+ Search Delay
+ Home Page
+ Nuværende prioritet
+ Ny prioritet
+ PrioritetChange Plugin Results PriorityPlugin bibliotekafInitaliseringstid:Søgetid:Version
- Website
+ HjemmesideUninstallFail to remove plugin settingsPlugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- Default
- Plugin Store
+ Plugin-butikNew ReleaseRecently UpdatedPluginsInstalledRefresh
- Install
+ InstallerUninstallOpdaterPlugin already installed
@@ -168,8 +194,8 @@
TemaAppearanceSøg efter flere temaer
- How to create a theme
- Hi There
+ Hvordan man opretter et tema
+ HejsaExplorerSearch for files, folders and file contentsWebSearch
@@ -184,18 +210,21 @@
Result Title FontResult Subtitle FontReset
+ 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.CustomizeVindue modeGennemsigtighed
- Theme {0} not exists, fallback to default theme
- Fail to load theme {0}, fallback to default theme
- Theme Folder
- Open Theme Folder
- Color Scheme
- System Default
- Light
- Dark
- Sound Effect
+ Temaet {0} findes ikke. Falder tilbage til standardtema
+ Kunne ikke indlæse temaet {0}. Falder tilbage til standardtema
+ Temamappe
+ Åbn temamappe
+ Farveskema
+ Systemstandard
+ Lys
+ Mørk
+ LydeffektPlay a small sound when the search window opensSound Effect VolumeAdjust the volume of the sound effect
@@ -211,12 +240,13 @@
ClockDateBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveNoneAcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Use Segoe Fluent IconsUse Segoe Fluent Icons for query results where supportedPress Key
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyHTTP Proxy
@@ -302,7 +335,7 @@
Om
- Website
+ HjemmesideGitHubDocsVersion
@@ -323,6 +356,7 @@
Log FolderClear LogsAre you sure you want to delete all logs?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,29 +367,30 @@
Log LevelDebugInfo
+ Setting Window FontSelect File ManagerPlease 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
- Profile Name
- File Manager Path
- Arg For Folder
- Arg For File
+ Filhåndtering
+ Profilnavn
+ Sti til filhåndtering
+ Arg for mappe
+ Arg for filDefault Web BrowserThe default setting follows the OS default browser setting. If specified separately, flow uses that browser.BrowserBrowser Name
- Browser Path
+ Sti til browserNew WindowNew Tab
- Private Mode
+ Privattilstand
- Change Priority
+ Skift prioritetGreater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative numberPlease provide an valid integer for Priority!
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneFortsætCompleted successfully
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Tilpasset søgegenvejstast
diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml
index 4fb441d8c..895a2dab6 100644
--- a/Flow.Launcher/Languages/de.xaml
+++ b/Flow.Launcher/Languages/de.xaml
@@ -42,6 +42,7 @@
SpielmodusAussetzen der Verwendung von Hotkeys.Position zurücksetzen
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Fehler bei Einstellungsstart beim StartFlow Launcher ausblenden, wenn Fokus verloren gehtVersionsbenachrichtigungen nicht zeigen
- Position des Suchfensters
+ Search Window LocationLetzte Position merkenMonitor mit MauscursorMonitor mit fokussiertem Fenster
@@ -106,14 +107,35 @@
Vorschau-Panel immer öffnen, wenn Flow aktiviert ist. Drücken Sie {0}, um Vorschau umzuschalten.Schatteneffekt ist nicht erlaubt, während das aktuelle Theme den Unschärfe-Effekt aktiviert hatSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Öffnen
+ 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.Plug-in suchen
@@ -130,8 +152,13 @@
Aktuelles Action-SchlüsselwortNeues Aktions-SchlüsselwortAktions-Schlüsselwörter ändern
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Aktiviert
+ Priorität
+ Search Delay
+ Home PageAktuelle PrioritätNeue PrioritätPriorität
@@ -147,7 +174,6 @@
Plug-ins: {0} - Plug-in-Einstellungsdateien können nicht entfernt werden, bitte entfernen Sie diese manuellFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultPlug-in-Store
@@ -184,6 +210,9 @@
Schriftart des ErgebnistitelsSchriftart des Ergebnis-UntertitelsZurücksetzen
+ 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.Individuell anpassenFenstermodusOpazität
@@ -211,12 +240,13 @@
UhrDatumBackdrop-Typ
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveKeineAcrylicMicaMica Alt
- Dieses Theme unterstützt zwei Modi (hell/dunkel).
+ This theme supports two (light/dark) modes.Dieses Theme unterstützt Unschärfe und transparenten Hintergrund.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Segoe Fluent-Icons verwendenSegoe Fluent-Icons für Abfrageergebnisse verwenden, wo unterstütztTaste drücken
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyHTTP-Proxy
@@ -323,6 +356,7 @@
Ordner »Logs«Logs löschenSind Sie sicher, dass Sie alle Logs löschen wollen?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log-EbeneDebugInfo
+ Setting Window FontDateimanager auswählen
@@ -370,13 +405,16 @@
Dieses neue Aktions-Schlüsselwort ist dasselbe wie das alte, bitte wählen Sie ein anderesErfolgErfolgreich abgeschlossen
+ Failed to copyGeben Sie die Aktions-Schlüsselwörter ein, die Sie zum Starten des Plug-ins verwenden möchten, und trennen Sie sie durch Leerzeichen voneinander ab. Verwenden Sie *, wenn Sie keine spezifizieren möchten, und das Plug-in wird ohne jegliche Aktions-Schlüsselwörter ausgelöst.Search Delay Time Setting
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Benutzerdefinierter Abfrage-Hotkey
diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml
index 23d58eca3..902811a56 100644
--- a/Flow.Launcher/Languages/es-419.xaml
+++ b/Flow.Launcher/Languages/es-419.xaml
@@ -42,6 +42,7 @@
Modo de juegoSuspender el uso de las teclas de acceso directo.Position Reset
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Error setting launch on startupOcultar Flow Launcher cuando se pierde el enfoqueNo mostrar notificaciones de nuevas versiones
- Search Window Position
+ Search Window LocationRemember Last PositionMonitor with Mouse CursorMonitor with Focused Window
@@ -106,14 +107,35 @@
Always open preview panel when Flow activates. Press {0} to toggle preview.El efecto de sombra no está permitido mientras el tema actual tenga el efecto de desenfoque habilitadoSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Abrir
+ 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.Search Plugin
@@ -130,8 +152,13 @@
Palabra clave actualNueva palabra claveCambiar palabras clave
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Enabled
+ Prioridad
+ Search Delay
+ Home PagePrioridad ActualNueva PrioridadPrioridad
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultTienda de Plugins
@@ -184,6 +210,9 @@
Result Title FontResult Subtitle FontReset
+ 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.CustomizeModo VentanaOpacidad
@@ -211,12 +240,13 @@
ClockDateBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveNoneAcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Usar Iconos de Segoe FluentUsar iconos de Segoe Fluent para resultados de consultas que sean soportadosPress Key
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyProxy HTTP
@@ -323,6 +356,7 @@
Carpeta de registrosClear LogsAre you sure you want to delete all logs?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window FontSeleccionar Gestor de Archivos
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneÉxitoCompletado con éxito
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Tecla de Acceso Personalizada
diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml
index 8b3c42fa6..0dc6833af 100644
--- a/Flow.Launcher/Languages/es.xaml
+++ b/Flow.Launcher/Languages/es.xaml
@@ -42,6 +42,7 @@
Modo JuegoSuspende el uso de atajos de teclado.Restablecer posición
+ Restablece la posición de la ventana de búsquedaEscribir aquí para buscar
@@ -106,14 +107,35 @@
Muestra siempre el panel de vista previa al iniciar Flow. Pulsar {0} para mostrar/ocultar la vista previa.El efecto de sombra no está permitido si el tema actual tiene activado el efecto de desenfoqueRetardo de búsqueda
- Retrasa un poco la búsqueda al escribir. Esto reduce los saltos en la interfaz y la carga de resultados.
+ Añade un breve retardo al escribir para reducir el parpadeo de la interfaz de usuario y la carga de resultados. Recomendado si la velocidad de escritura es media.
+ Introduzca el tiempo de espera (en ms) hasta que la entrada se considere completa. Solo se puede editar cuando el retardo de búsqueda está activado.Tiempo de retardo de búsqueda predeterminado
- Tiempo de retardo predeterminado del complemento tras el que aparecerán los resultados de la búsqueda cuando se deje de escribir.
- Muy largo
- Largo
- Normal
- Corto
- Muy corto
+ Tiempo de espera antes de mostrar los resultados después de dejar de teclear. A mayor valor, más tiempo de espera. (ms)
+ Información para usuario de IME coreano
+
+ El método de entrada coreano utilizado en Windows 11 puede causar algunos problemas en Flow Launcher.
+
+ Si se experimenta algún problema, es posible que se tenga que activar "Usar versión anterior del IME coreano".
+
+
+ Abrir Configuración en Windows 11 e ir a:
+
+ Hora e idioma > Idioma y región > Coreano > Opciones de idioma > Teclado - Microsoft IME > Compatibilidad,
+
+ y activar "Usar versión anterior de Microsoft IME".
+
+
+
+ Abrir idioma y región en configuración
+ Abre la ubicación de configuración del IME coreano. Ir a Coreano > Opciones de idioma > Teclado - Microsoft IME > Compatibilidad
+ Abrir
+ Utilizar IME Coreano anterior
+ Se puede cambiar la configuración anterior del IME coreano directamente desde aquí
+ Página de inicio
+ Muestra los resultados de la página de inicio cuando el texto de la consulta está vacío.
+ Mostrar historial de resultados en la página de inicio
+ Número máximo de resultados del historial en la página de inicio
+ Esto solo se puede editar si el complemento soporta la función de Inicio y la Página de Inicio está activada.Buscar complemento
@@ -131,7 +153,12 @@
Nueva palabra clave de acciónCambia la palabra clave de acciónTiempo de retardo de la búsqueda del complemento
- Cambiar tiempo de retardo de la búsqueda del complemento
+ Cambia el tiempo de retardo de la búsqueda del complemento
+ Configuración avanzada:
+ Activado
+ Prioridad
+ Retardo de búsqueda
+ Página de inicioPrioridad actualNueva prioridadPrioridad
@@ -147,7 +174,6 @@
Complementos: {0} - Fallo al eliminar los archivos de configuración del complemento, por favor elimínelos manualmenteFallo al eliminar la caché del complementoComplementos: {0} - Fallo al eliminar los archivos de caché del complemento, por favor elimínelos manualmente
- PredeterminadoTienda complementos
@@ -184,6 +210,9 @@
Fuente del título del resultadoFuente del subtítulo del resultadoRestablecer
+ Restablece la configuración recomendada para la fuente y el tamaño.
+ Importar tamaño del tema
+ Si existe un valor de tamaño del tema previsto por el diseñador, este se recuperará y aplicará.PersonalizaModo VentanaOpacidad
@@ -211,6 +240,7 @@
RelojFechaTipo de telón de fondo
+ El efecto de telón de fondo no se aplica en la vista previa.Telón de fondo compatible a partir de Windows 11 build 22000 y superioresNingunoAcrílico
@@ -283,6 +313,9 @@
Iconos Segoe FluentUtiliza iconos Segoe Fluent para los resultados de la consulta cuando sean compatiblesPulsar Tecla
+ Mostrar distintivos en resultados
+ Para los complementos compatibles, se muestran distintivos que ayudan a distinguirlos más fácilmente.
+ Mostrar distintivos en resultados solo para consulta globalProxy HTTP
@@ -323,9 +356,10 @@
Carpeta de registrosEliminar registros¿Está seguro de que desea eliminar todos los registros?
- 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
+ Carpeta del caché
+ Limpiar cachés
+ ¿Está seguro de que desea eliminar todos los cachés?
+ No se pudo eliminar parte de las carpetas y archivos. Por favor, consulte el archivo de registro para más informaciónAsistenteUbicación de datos del usuarioLa 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.
@@ -333,6 +367,7 @@
Nivel de registroDepurarInformación
+ Configuración de fuente de la ventanaSeleccionar administrador de archivos
@@ -370,13 +405,16 @@
Esta nueva palabra clave de acción es la misma que la anterior, por favor elija una diferenteCorrectoFinalizado correctamente
+ No se pudo copiarIntroduzca las palabras clave de acción que desea utilizar para iniciar el complemento y utilice espacios en blanco para separarlas. Utilice * si no desea especificar ninguna, para que el complemento se inicie sin ninguna palabra clave de acción.Ajuste del tiempo de retardo de búsqueda
- Seleccionar el tiempo de retardo de búsqueda que se desea utilizar para el complemento. Seleccionar "{0}" si no se desea especificar nada, y el complemento utilizará el tiempo de retardo de búsqueda predeterminado.
- Tiempo de retardo de búsqueda actual
- Nuevo tiempo de retardo de búsqueda
+ Introducir el tiempo de retardo de búsqueda en ms que se desea utilizar para el complemento. Introducir un espacio vacío si no desea especificar ninguno, y el complemento utilizará el tiempo de retardo de búsqueda predeterminado.
+
+
+ Página de inicio
+ Activar el estado de la página de inicio del complemento si se desea mostrar los resultados del complemento cuando la consulta está vacía.Atajo de teclado de consulta personalizada
diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml
index e46e0dc9d..41fdbaa51 100644
--- a/Flow.Launcher/Languages/fr.xaml
+++ b/Flow.Launcher/Languages/fr.xaml
@@ -42,6 +42,7 @@
Mode jeuSuspend l'utilisation des raccourcis claviers.Réinitialiser la position
+ Réinitialiser la position de la fenêtre de rechercheTapez ici pour rechercher
@@ -55,7 +56,7 @@
Erreur lors de la configuration du lancement au démarrageCacher Flow Launcher lors de la perte de focusNe pas afficher le message de mise à jour pour les nouvelles versions
- Position de la fenêtre de recherche
+ Emplacement de la fenêtre de rechercheSe souvenir de la dernière positionSurveiller avec le curseur de la sourisSurveiller avec la fenêtre ciblée
@@ -106,14 +107,35 @@
Toujours ouvrir le panneau d'aperçu lorsque Flow s'active. Appuyez sur {0} pour activer/désactiver l'aperçu.L'effet d'ombre n'est pas autorisé lorsque le thème actuel à un effet de flou activéDélai de recherche
- Attendre un certain temps pour effectuer une recherche lors de la saisie. Cela permet de réduire les sauts d'interface et la charge des résultats.
+ Ajoute un court délai pendant la frappe pour réduire le scintillement de l'interface utilisateur et le chargement des résultats. Recommandé si votre vitesse de frappe est moyenne.
+ Entrez le temps d'attente (en ms) jusqu'à ce que l'entrée soit considérée comme terminée. Cela ne peut être modifié que si le délai de recherche est activé.Délai de recherche par défaut
- Délai par défaut du plugin après lequel les résultats de la recherche s'affichent lorsque la saisie est interrompue.
- Très long
- Long
- Normal
- Court
- Très court
+ Délai d'attente avant l'affichage des résultats après l'arrêt de la saisie. Les valeurs élevées permettent d'attendre plus longtemps. (ms)
+ Information pour les utilisateurs coréens IME
+
+ La méthode de saisie coréenne utilisée dans Windows 11 peut causer des problèmes dans Flow Launcher.
+
+ Si vous rencontrez des problèmes, il se peut que vous deviez activer l'option "Utiliser la version précédente de l'IME coréen".
+
+
+ Ouvrez les Paramètres dans Windows 11 et allez dans :
+
+ Heure et langue > Langue et région > Coréen > Options linguistiques > Claviers - Microsoft IME > Compatibilité,
+
+ et activez l'option "Utiliser la version précédente de Microsoft IME".
+
+
+
+ Ouvrir les paramètres du système de langue et de région
+ Ouvre l'emplacement de réglage IME coréen. Allez dans coréen > Options linguistiques > Claviers - Microsoft IME > Compatibilité
+ Ouvrir
+ Utilisez l'IME coréenne précédente
+ Vous pouvez modifier les paramètres de l'IME coréen précédent directement à partir d'ici
+ Page d'accueil
+ Afficher les résultats de la page d'accueil lorsque le texte de la requête est vide.
+ Afficher les résultats de l'historique sur la page d'accueil
+ Maximum de résultats de l'historique affichés sur la page d'accueil
+ Ceci ne peut être édité que si le plugin prend en charge la fonction Accueil et que la page d'accueil est activée.Rechercher des plugins
@@ -132,6 +154,11 @@
Changer les mots-clés d'actionDélai de recherche du pluginModifier le délai de recherche du plugin
+ Paramètres avancés :
+ Activé
+ Priorité
+ Délai de recherche
+ Page d'accueilPriorité actuelleNouvelle prioritéPriorité
@@ -147,7 +174,6 @@
Plugins : {0} - Échec de la suppression des fichiers de configuration des plugins, veuillez les supprimer manuellementÉchec de la suppression du cache du pluginPlugins : {0} - Échec de la suppression des fichiers cache des plugins, veuillez les supprimer manuellement
- DéfautMagasin des Plugins
@@ -184,6 +210,9 @@
Police du titre du résultatPolice des sous-titres du résultatRéinitialiser
+ Rétablir les paramètres de police et de taille recommandés.
+ Importer la taille du thème
+ Si une valeur de taille prévue par le concepteur du thème est disponible, elle sera récupérée et appliquée.PersonnaliserMode fenêtréOpacité
@@ -211,6 +240,7 @@
HeureDateType d'arrière-plan
+ L'effet de fond n'est pas appliqué dans l'aperçu.Arrière-plan pris en charge à partir de Windows 11 version 22000 et plusAucunAcrylique
@@ -283,6 +313,9 @@
Utiliser les icônes Segoe FluentUtiliser les icônes Segoe Fluent pour les résultats de requête lorsque pris en chargeAppuyez sur une touche
+ Afficher les badges de résultats
+ Pour les plugins pris en charge, des badges sont affichés afin de les distinguer plus facilement.
+ Afficher les badges de résultats pour la requête globale uniquementProxy HTTP
@@ -322,6 +355,7 @@
Répertoire des journauxEffacer le journalÊtes-vous sûr de vouloir supprimer tous les journaux ?
+ Dossier de cacheVider les cachesÊtes-vous sûr de vouloir supprimer tous les caches ?Échec de l'effacement d'une partie des dossiers et des fichiers. Veuillez consulter le fichier journal pour plus d'informations
@@ -332,6 +366,7 @@
Niveau de journalisationDébogageInfo
+ Réglage de la police de la fenêtreSélectionner le gestionnaire de fichiers
@@ -369,13 +404,16 @@
Ce nouveau mot-clé d'action est identique à l'ancien, veuillez en choisir un autreAjoutTerminé avec succès
+ Échec de la copieSaisissez les mots-clés d'action que vous souhaitez utiliser pour lancer le plugin et séparez-les par des espaces. Utilisez * si vous ne voulez en spécifier aucun, et le plugin sera déclenché sans aucun mot-clé d'action.Réglage du délai de recherche
- Sélectionnez le délai de recherche que vous souhaitez utiliser pour le plugin. Sélectionnez "{0}" si vous ne voulez pas en spécifier, et le plugin utilisera le délai de recherche par défaut.
- Délai de recherche actuel
- Nouveau délai de recherche
+ Entrez le délai de recherche en ms que vous souhaitez utiliser pour le plugin. Laissez la case vide et le plugin utilisera le délai de recherche par défaut.
+
+
+ Page d'accueil
+ Activez l'état de la page d'accueil du plugin si vous souhaitez afficher les résultats du plugin lorsque la requête est vide.Requêtes personnalisées
diff --git a/Flow.Launcher/Languages/he.xaml b/Flow.Launcher/Languages/he.xaml
index 38e943cda..52eaf5e9f 100644
--- a/Flow.Launcher/Languages/he.xaml
+++ b/Flow.Launcher/Languages/he.xaml
@@ -42,6 +42,7 @@
מצב משחקהשהה את השימוש במקשי קיצור.איפוס מיקום
+ אפס את מיקום חלון החיפושהקלד כאן כדי לחפש
@@ -55,7 +56,7 @@
שגיאה בהגדרת ההפעלה בעת הפעלת windowsהסתר את Flow Launcher כאשר הוא אינו החלון הפעילאל תציג התראות על גרסה חדשה
- מיקום חלון החיפוש
+ מיקום חלון חיפושזכור את המיקום האחרוןMonitor with Mouse CursorMonitor with Focused Window
@@ -105,21 +106,41 @@
הצג תמיד תצוגה מקדימהפתח תמיד את לוח התצוגה המקדימה כאשר Flow מופעל. הקש על {0} כדי להחליף את התצוגה המקדימה.לא ניתן להחיל אפקט צל כאשר העיצוב הנוכחי מוגדר לאפקט טשטוש
- Search Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
- Default Search Delay Time
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ השהיית חיפוש
+ מוסיף עיכוב קצר בזמן ההקלדה כדי להפחית קפיצות בממשק המשתמש ועומס בתוצאות. מומלץ אם מהירות ההקלדה שלך ממוצעת.
+ הזן את זמן ההמתנה (בשניות) עד שהקלט נחשב כמושלם. ניתן לערוך זאת רק אם השהיית חיפוש מופעלת.
+ זמן עיכוב חיפוש ברירת מחדל
+ זמן המתנה להצגת התוצאות לאחר שתפסיק להקליד. ערכים גבוהים יותר מייצגים המתנה רבה יותר. (שניות)
+ Information for Korean IME user
+
+ שיטת הקלט הקוריאנית שמשמשת ב־Windows 11 עלולה לגרום לבעיות מסוימות ב־Flow Launcher.
+
+ אם אתה נתקל בבעיות, ייתכן שתצטרך להפעיל את האפשרות "השתמש בגרסה הקודמת של IME הקוריאני".
+
+ פתח את ההגדרות ב־Windows 11 וגש אל:
+
+ זמן ושפה > שפה ואזור > קוריאנית > אפשרויות שפה > מקלדת - Microsoft IME > תאימות,
+
+ והפעל את האפשרות "השתמש בגרסה הקודמת של Microsoft IME".
+
+
+
+ פתח את הגדרות מערכת שפה ואזור
+ פותח את מיקום הגדרות ה־IME הקוריאני. עבור אל קוריאנית > אפשרויות שפה > מקלדת - Microsoft IME > תאימות
+ פתח
+ השתמש ב־IME הקוריאני הקודם
+ באפשרותך לשנות את הגדרות ה־IME הקוריאני הקודם ישירות מכאן
+ דף הבית
+ 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.חפש תוסףCtrl+F לחיפוש תוסףלא נמצאו תוצאות
- Please try a different search.
+ אנא נסה חיפוש אחר.תוסףתוספיםמצא תוספים נוספים
@@ -130,8 +151,13 @@
מילת מפתח נוכחית לפעולהמילת מפתח חדשה לפעולהשנה מילות מפתח לפעולה
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ שנה את זמן השהיית חיפוש של תוסף
+ הגדרות מתקדמות:
+ מופעל
+ עדיפות
+ עיכוב חיפוש
+ דף הביתעדיפות נוכחיתעדיפות חדשהעדיפות
@@ -147,7 +173,6 @@
תוספים: {0} - נכשל בהסרת קבצי הגדרות התוסף, יש להסירם ידניתנכשל בהסרת מטמון התוסףתוספים: {0} - נכשל בהסרת קובצי מטמון התוסף, אנא הסר אותם ידנית
- Defaultחנות תוספים
@@ -184,6 +209,9 @@
גופן הכותרת לתוצאהגופן כותרת המשנה לתוצאהאפס
+ אפס להגדרות הגופן והגודל המומלצות.
+ ייבוא גודל ערכת נושא
+ אם ערך הגודל שתוכנן על ידי מעצב ערכת הנושא זמין, הוא יאוחזר ויוחל.התאם אישיתמצב חלוןשקיפות
@@ -211,12 +239,13 @@
שעוןתאריךסוג רקע
+ אפקט הרקע אינו מוחל בתצוגה המקדימה.התמיכה ב-Backdrop קיימת החל מ-Windows 11 build 22000 ומעלהללאאקריליקמיקהMica Alt
- ערכת נושא זאת תומך בשני מצבים (בהיר/כהה).
+ ערכת נושא זאת תומכת בשני מצבים (בהיר/כהה).ערכת נושא זו תומכת בטשטוש רקע שקוף.הצג מציין מיקוםהצג מציין מיקום כאשר השאילתה ריקה
@@ -283,6 +312,9 @@
השתמש ב-Segoe Fluent Iconsהשתמש ב-Segoe Fluent Icons לתוצאות חיפוש כאשר נתמךהקש על מקש
+ הצג תגי תוצאות
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyHTTP Proxy
@@ -323,6 +355,7 @@
תיקיית יומני רישוםנקה יומני רישוםהאם אתה בטוח שברצונך למחוק את כל היומנים?
+ תיקיית מטמוןנקה נתוני מטמוןהאם אתה בטוח שברצונך למחוק את כל הנתונים שבמטמון?נכשל ניקוי חלק מהתיקיות והקבצים. עיין בלוג לקבלת מידע נוסף
@@ -330,9 +363,10 @@
מיקום נתוני משתמשהגדרות המשתמש והתוספים המותקנים נשמרים בתיקיית נתוני המשתמש. מיקום זה עשוי להשתנות אם התוכנה במצב נייד.פתח תיקיה
- Log Level
+ רמת יומןניפוי שגיאותמידע
+ Setting Window Fontבחר מנהל קבצים
@@ -370,13 +404,16 @@
מילת הפעולה החדשה זהה לישנה, נא לבחור מילת פעולה שונההצליחהושלם בהצלחה
+ ההעתקה נכשלההזן את מילות הפעולה שבהן תרצה להשתמש כדי להפעיל את התוסף, והשתמש ברווחים כדי להפריד ביניהן. השתמש ב-* אם אינך רוצה להגדיר כלל, והתוסף יופעל ללא מילות פעולה.
- Search Delay Time Setting
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ הגדרת זמן עיכוב החיפוש
+ הזן את זמן עיכוב החיפוש בשניות שבו אתה רוצה להשתמש עבור התוסף. השאר ריק אם אינך רוצה לציין, והתוסף ישתמש בזמן ברירת המחדל לעיכוב חיפוש.
+
+
+ דף הבית
+ Enable the plugin home page state if you like to show the plugin results when query is empty.מקש קיצור לשאילתה מותאמת אישית
diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml
index fd34bf366..1a356ad65 100644
--- a/Flow.Launcher/Languages/it.xaml
+++ b/Flow.Launcher/Languages/it.xaml
@@ -42,6 +42,7 @@
Modalità giocoSospendere l'uso dei tasti di scelta rapida.Ripristina Posizione
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Errore nell'impostazione del lancio all'avvioNascondi Flow Launcher quando perde il focusNon mostrare le notifiche per una nuova versione
- Posizione Finestra Di Ricerca
+ Search Window LocationRicorda L'Ultima PosizioneMonitora con il cursore del mouseMonitora con la finestra in primo piano
@@ -106,14 +107,35 @@
Apri sempre il pannello di anteprima quando Flow si attiva. Premi {0} per attivare l'anteprima.L'effetto ombra non è consentito mentre il tema corrente ha un effetto di sfocatura abilitatoSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Apri
+ 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.Plugin di ricerca
@@ -130,8 +152,13 @@
Parola chiave di azione correnteNuova parola chiave d'azioneCambia Keywords Azione
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Abilitato
+ Priorità
+ Search Delay
+ Home PagePriorità AttualeNuova PrioritàPriorità
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultNegozio dei Plugin
@@ -184,6 +210,9 @@
Font del Titolo del RisultatoFont del Sottotitolo del RisultatoResetta
+ 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.PersonalizzaModalità finestraOpacità
@@ -211,12 +240,13 @@
OrologioDataBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveVuotoAcrylicMicaMica Alt
- Questo tema supporta due (chiaro/scuro) varianti.
+ This theme supports two (light/dark) modes.Questo tema supporta lo sfondo trasparente blurrato.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Usa Icone Segoe FluentUsa Icone Segoe Fluent per risultati di ricerca dove supportatePremi tasto
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyProxy HTTP
@@ -323,6 +356,7 @@
Cartella dei LogCancella i logSei sicuro di voler cancellare tutti i log?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window FontSeleziona Gestore File
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneSuccessoCompletato con successo
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Tasti scelta rapida per ricerche personalizzate
diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml
index e6f2223cd..949fe5c99 100644
--- a/Flow.Launcher/Languages/ja.xaml
+++ b/Flow.Launcher/Languages/ja.xaml
@@ -28,7 +28,7 @@
最終実行時間:{0}開く設定
- Flow Launcherについて
+ 情報終了閉じるコピー
@@ -42,7 +42,8 @@
ゲームモードホットキーの使用を一時停止します。位置のリセット
- Type here to search
+ 検索ウィンドウの位置をリセット
+ ここに入力して検索設定
@@ -50,8 +51,8 @@
ポータブルモードすべての設定とユーザーデータを1つのフォルダに保存します(リムーバブルドライブやクラウドサービスで使用する場合に便利です)。スタートアップ時にFlow Launcherを起動する
- 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)を手動で削除する必要があります。Error setting launch on startupフォーカスを失った時にFlow Launcherを隠す最新版が入手可能であっても、アップグレードメッセージを表示しない
@@ -105,15 +106,36 @@
常にプレビューするFlow が有効になったとき、常にプレビューパネルを開きます。 {0} を押してプレビューの表示/非表示を切り替えます。現在のテーマでぼかしの効果が有効になっている場合、影の効果を有効にすることはできません
- Search Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 検索遅延
+ 入力中に短い遅延を追加することで、UIのちらつきや結果の読み込みを軽減します。平均的なタイピング速度のユーザーにおすすめです。
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of 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.Search Plugin
@@ -130,8 +152,13 @@
Current action keywordNew action keywordChange Action Keywords
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ 詳細設定:
+ Enabled
+ 重要度
+ 検索遅延
+ Home PageCurrent PriorityNew Priority重要度
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- Defaultプラグインストア
@@ -178,12 +204,15 @@
管理者または別のユーザーとしてプログラムを起動しますプロセスキラー不要なプロセスを終了します
- Search Bar Height
- Item Height
+ 検索バーの高さ
+ アイテムの高さ検索ボックスのフォントResult Title FontResult Subtitle FontReset
+ 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.Customizeウィンドウモード透過度
@@ -210,20 +239,21 @@
カスタム時刻日付
- Backdrop Type
- Backdrop supported starting from Windows 11 build 22000 and above
- None
- Acrylic
- Mica
- Mica Alt
- This theme supports two(light/dark) modes.
+ バックドロップの種類
+ プレビューではバックドロップ効果が適用されません。
+ バックドロップは Windows 11 ビルド 22000 以降でサポートされています。
+ なし
+ アクリル
+ マイカ
+ マイカ(代替)
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.
- 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.
+ ウィンドウサイズの固定
+ ウィンドウのサイズを固定し、ドラッグでの変更を無効にします。ホットキー
@@ -238,8 +268,8 @@
Select a modifier key to open selected result via keyboard.ホットキーを表示Show result selection hotkey with results.
- Auto Complete
- Runs autocomplete for the selected items.
+ 自動補完
+ 選択された項目に対して自動補完を実行します。Select Next ItemSelect Previous ItemNext Page
@@ -253,7 +283,7 @@
Toggle Game ModeToggle HistoryOpen Containing Folder
- Run As Admin
+ 管理者として実行Refresh Search ResultsReload Plugins DataQuick Adjust Window Width
@@ -283,6 +313,9 @@
Use Segoe Fluent IconsUse Segoe Fluent Icons for query results where supportedPress Key
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyHTTP プロキシ
@@ -301,15 +334,15 @@
プロキシ接続に失敗しました
- Flow Launcherについて
+ 情報ウェブサイトGitHub
- Docs
+ ドキュメントバージョンIconsあなたはFlow Launcherを {0} 回利用しましたアップデートを確認する
- Become A Sponsor
+ スポンサーになる新しいバージョン {0} が利用可能です。Flow Launcherを再起動してください。アップデートの確認に失敗しました、api.github.com への接続とプロキシ設定を確認してください。
@@ -323,6 +356,7 @@
Log FolderClear LogsAre you sure you want to delete all logs?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,9 +367,10 @@
Log LevelDebugInfo
+ Setting Window Font
- Select File Manager
+ デフォルトのファイルマネージャー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
@@ -345,7 +380,7 @@
Arg For File
- Default Web Browser
+ デフォルトのウェブブラウザーThe default setting follows the OS default browser setting. If specified separately, flow uses that browser.BrowserBrowser Name
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different one成功しましたCompleted successfully
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.
@@ -404,7 +442,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
保存Overwrite
-
+ キャンセルReset削除Update
@@ -456,14 +494,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
アップデートの詳細
- Skip
- Welcome to Flow Launcher
- Hello, this is the first time you are running Flow Launcher!
- Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
- Search and run all files and applications on your PC
- Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
- Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
- Hotkeys
+ スキップ
+ Flow Launcherへようこそ
+ こんにちは!Flow Launcherを初めて起動されたんですね!
+ 開始する前に、このウィザードが Flow Launcher のセットアップをお手伝いします。ご希望の方はスキップできます。言語を選択してください。
+ PC上のファイルとアプリケーションの検索と実行
+ アプリケーション、ファイル、ブックマーク、YouTube、X などあらゆるものを検索して実行できます。マウスに触れることなく、キーボードだけで快適に操作できます。
+ Flow Launcher は以下のホットキーで起動します。さっそく試してみてください。変更するには、入力欄をクリックし、キーボードで希望のホットキーを押してください。
+ ホットキーAction Keyword and CommandsSearch the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.Let's Start Flow Launcher
diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml
index 3aee3f5e4..9ae2e0195 100644
--- a/Flow.Launcher/Languages/ko.xaml
+++ b/Flow.Launcher/Languages/ko.xaml
@@ -18,7 +18,7 @@
Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.
- Failed to unregister hotkey "{0}". Please try again or see log for details
+ 단축키 "{0}" 등록 해제에 실패했습니다. 다시 시도하시거나 로그를 확인하세요Flow Launcher{0}을 실행할 수 없습니다.Flow Launcher 플러그인 파일 형식이 유효하지 않습니다.
@@ -42,6 +42,7 @@
게임 모드단축키 사용을 일시중단합니다.창 위치 초기화
+ 검색창 위치 초기화검색어 입력
@@ -105,15 +106,27 @@
항상 미리보기Flow 사용시 항상 미리보기 패널을 열어둡니다. {0} 키를 눌러 프리뷰창을 켜고 끌 수 있습니다.반투명 흐림 효과를 사용하는 경우, 그림자 효과를 쓸 수 없습니다.
- Search Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
- Default Search Delay Time
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ 검색 지연
+ 타이핑 중 UI 깜빡임과 결과 로드를 줄이기 위해 짧은 지연을 추가합니다. 타이핑 속도가 평균 수준이라면 권장합니다.
+ 입력이 완료된 것으로 감지될 때까지의 대기 시간(밀리초 단위)을 입력하세요. 이 항목은 검색 지연이 활성화된 경우에만 편집할 수 있습니다.
+ 기본 검색 지연 시간
+ 입력이 멈춘 후 결과를 표시하기까지의 대기 시간입니다. 값이 클수록 더 오래 기다립니다. (ms)
+ 한국어 IME 사용 안내
+
+ Windows 11에서 사용하는 한국어 IME가 Flow Launcher에서 일부 문제를 일으킬 수 있습니다. 문제가 발생하는 경우, “이전 버전의 Microsoft IME 사용” 옵션을 활성화해야 할 수 있습니다. Windows 11 설정을 열고 다음으로 이동하세요: 시간 및 언어 > 언어 및 지역 > 한국어 > 언어 옵션 > 키보드 옵션 – Microsoft IME > 호환성에서 “이전 버전의 Microsoft IME 사용"을 켭니다.
+
+
+
+ 시스템의 시간 및 언어 설정 열기
+ 한국어 IME 설정 위치를 엽니다. 한국어>언어 옵션>키보드 - Microsoft IME> 호환성으로 이동하세요
+ 열기
+ 이전 버전의 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.플러그인 검색
@@ -130,8 +143,13 @@
현재 액션 키워드새 액션 키워드액션 키워드 변경
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ 고급 설정:
+ 켬
+ 중요
+ 검색 지연
+ Home Page현재 중요도:새 중요도:중요도
@@ -147,7 +165,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- Default플러그인 스토어
@@ -172,18 +189,21 @@
안녕하세요!탐색기Search for files, folders and file contents
- WebSearch
- Search the web with different search engine support
+ 웹 검색
+ 다양한 검색 엔진을 통해 웹을 검색합니다프로그램Launch programs as admin or a different user
- ProcessKiller
- Terminate unwanted processes
+ 프로세스 킬러
+ 필요없는 프로세스를 종료합니다검색창 높이결과 항목 높이쿼리 상자 글꼴결과 제목 글꼴결과 부제목 글꼴초기화
+ 권장되는 글꼴 및 크기 설정으로 초기화 합니다.
+ 테마 크기 가져오기
+ 테마 디자이너가 의도한 크기 값이 존재하는 경우, 해당 값을 불러와 적용합니다.사용자 지정윈도우 모드투명도
@@ -211,19 +231,20 @@
시계날짜배경 효과 타입
- Backdrop supported starting from Windows 11 build 22000 and above
+ 프리뷰 영역에선 배경효과가 적용되지 않아요.
+ 배경 효과는 윈도우 11 빌드 22000 이상부터 지원합니다없음아크릴
- Mica
- Mica Alt
- This theme supports two(light/dark) modes.
- This theme supports Blur Transparent Background.
+ 마이카
+ 마이카 변형
+ This theme supports two (light/dark) modes.
+ 이 테마는 흐릿한 배경 효과를 지원합니다.안내 텍스트 표시입력 내용이 없을때 입력창 위치를 알 수 있는 텍스트를 표시합니다안내 텍스트안내 텍스트를 변경하세요. 아무것도 입력하지 않으면 다음을 사용합니다: "{0}"
- Fixed Window Size
- The window size is not adjustable by dragging.
+ 창 크기 고정
+ 창 크기를 드래그하여 조절할 수 없습니다.단축키
@@ -233,13 +254,13 @@
미리보기 전환미리보기 패널을 켜고 끌 때 사용할 단축키를 입력하세요.단축키 프리셋
- List of currently registered hotkeys
+ 현재 등록된 단축키 목록결과 선택 단축키결과 항목을 선택하는 단축키입니다.단축키 표시결과창에서 결과 선택 단축키를 표시합니다.자동 완성
- Runs autocomplete for the selected items.
+ 선택된 항목에 대해 자동 완성을 실행합니다.다음 항목 선택이전 항목 선택다음 페이지
@@ -247,7 +268,7 @@
이전 쿼리로 전환다음 쿼리로 전환콘텍스트 메뉴 열기
- Open Native Context Menu
+ 시스템 우클릭 메뉴 열기설정창 열기파일 경로 복사게임 모드 전환
@@ -283,6 +304,9 @@
플루언트 아이콘 사용결과 및 일부 메뉴에서 플루언트 아이콘을 사용합니다.사용할 키를 누르세요
+ 결과 뱃지 표시
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ 전역 검색 결과에서만 뱃지 표시HTTP 프록시
@@ -323,21 +347,23 @@
로그 폴더로그 삭제정말 모든 로그를 삭제하시겠습니까?
- Clear Caches
- Are you sure you want to delete all caches?
+ Cache Folder
+ 캐시 지우기
+ 모든 캐시를 삭제하시겠습니까?Failed to clear part of folders and files. Please see log file for more information마법사사용자 데이터 위치사용자 설정과 설치된 플러그인은 사용자 데이터 폴더에 저장됩니다. 이 위치는 휴대용 모드 활성화 여부에 따라 달라질 수 있습니다.폴더 열기
- Log Level
+ 로그 레벨DebugInfo
+ Setting Window Font파일관리자 선택
- 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.
+ 사용 중인 파일 관리자의 파일 위치를 지정하고, 필요한 경우 인수를 추가하세요. "%d"는 열고자 하는 디렉터리 경로를 나타내며, 폴더용 인수 필드 및 특정 디렉터리를 여는 명령어에서 사용됩니다. "%f"는 열고자 하는 파일 경로를 나타내며, 파일용 인수 필드 및 특정 파일을 여는 명령어에서 사용됩니다.
+ 예를 들어, 파일 관리자가 totalcmd.exe /A c:\windows와 같은 명령어로 c:\windows 디렉터리를 연다면, 파일 관리자 경로는 totalcmd.exe가 되고, 폴더용 인수는 /A "%d"가 됩니다. QTTabBar와 같은 일부 파일 관리자는 경로만 전달하면 되는 경우가 있으므로, 이 경우에는 파일 관리자 경로에 "%d"를 입력하고 나머지 필드는 비워두세요.파일관리자프로필 이름파일관리자 경로
@@ -367,16 +393,19 @@
플러그인을 찾을 수 없습니다.새 액션 키워드를 입력하세요.새 액션 키워드가 할당된 플러그인이 이미 있습니다. 다른 액션 키워드를 입력하세요.
- This new Action Keyword is the same as old, please choose a different one
+ 이 새로운 액션 키워드는 기존 것과 동일합니다. 다른 키워드를 선택해주세요.성공성공적으로 완료했습니다.
+ Failed to copy플러그인을 실행할 때 사용할 액션 키워드를 입력하세요. 여러 개를 입력할 경우 공백으로 구분하세요. 아무 키워드도 지정하지 않으려면 * 를 입력하세요. 이 경우 액션 키워드 없이도 플러그인이 실행됩니다.
- Search Delay Time Setting
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 검색 지연 시간 설정
+ 플러그인에서 사용할 검색 지연 시간(ms)을 입력하세요. 지정하지 않으려면 비워두세요. 기본 검색 지연 시간이 사용됩니다.
+
+
+ Home Page
+ Enable the plugin home page state if you like to show the plugin results when query is empty.사용자지정 쿼리 단축키
@@ -389,7 +418,7 @@
Current hotkey is unavailable.This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey.This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}".
- Press the keys you want to use for this function.
+ 이 기능에 사용할 키를 눌러주세요.사용자 지정 쿼리 단축어
@@ -403,13 +432,13 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
저장
- Overwrite
+ 덮어쓰기취소
- Reset
+ 초기화삭제확인
- Yes
- No
+ 예
+ 아니오배경
diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml
index b78bcb7d7..58571a1c4 100644
--- a/Flow.Launcher/Languages/nb.xaml
+++ b/Flow.Launcher/Languages/nb.xaml
@@ -42,6 +42,7 @@
SpillmodusStopp bruken av hurtigtaster.Tilbakestilling av posisjon
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Feil ved å sette kjør ved oppstartSkjul Flow Launcher når fokus forsvinnerIkke vis varsler om nye versjoner
- Posisjon til søkevindu
+ Search Window LocationHusk siste posisjonSkjerm med musepekerenSkjerm med fokusert vindu
@@ -106,14 +107,35 @@
Åpne alltid forhåndsvisningspanel når Flow aktiveres. Trykk på {0} for å velge forhåndsvisning.Skyggeeffekt er ikke tillatt mens gjeldende tema har uskarphet-effekt aktivertSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Åpne
+ 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.Søk etter programtillegg
@@ -130,8 +152,13 @@
Nåværende handlingsnøkkelordNytt handlingsnøkkelordEndre handlingsnøkkelord
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Aktivert
+ Prioritet
+ Search Delay
+ Home PageGjeldende prioritetNy prioritetPrioritet
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultProgramtillegg butikk
@@ -184,6 +210,9 @@
Skrift for resultattittelSkrift for resultatundertittelTilbakestill
+ 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.TilpassVindumodusUgjennomsiktighet
@@ -211,12 +240,13 @@
KlokkeDatoBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveIngenAcrylicMicaMica Alt
- Dette temaet støtter to (lys/mørk) moduser.
+ This theme supports two (light/dark) modes.Dette temaet støtter uskarp gjennomsiktig bakgrunn.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Bruk Segoe Fluent ikonerBruk Segoe Fluent Icons for spørreresultater der det støttesTrykk tast
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyHTTP proxy
@@ -323,6 +356,7 @@
LoggmappeTøm loggerEr du sikker på at du vil slette alle loggene?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window FontVelg filbehandler
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneVellykketFullført vellykket
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Hurtigtast for egendefinert spørring
diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml
index ce3406142..70a58e322 100644
--- a/Flow.Launcher/Languages/nl.xaml
+++ b/Flow.Launcher/Languages/nl.xaml
@@ -42,6 +42,7 @@
SpelmodusStop het gebruik van Sneltoetsen.Positie resetten
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Fout bij het instellen van uitvoeren bij opstartenVerberg Flow Launcher als focus verloren isLaat geen nieuwe versie notificaties zien
- Positie Zoekvenster
+ Search Window LocationLaatste Positie OnthoudenMonitor met MuiscursorMonitor met Gefocust Venster
@@ -106,14 +107,35 @@
Open altijd het voorbeeld paneel wanneer Flow activeert. Druk op {0} om voorbeeld te schakelen.Schaduw effect is niet toegestaan omdat het huidige thema een vervagingseffect heeftSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Openen
+ 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.Plug-ins zoeken
@@ -130,8 +152,13 @@
Huidige actie sneltoetsNieuw actie sneltoetsWijzig actie-sneltoets
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Enabled
+ Priority
+ Search Delay
+ Home PageHuidige PrioriteitNieuwe PrioriteitPrioriteit
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultPlugin Winkel
@@ -184,6 +210,9 @@
Resultaat titel lettertypeResult Subtitle FontHerstellen
+ 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.AanpassenVenster ModusOndoorzichtigheid
@@ -211,12 +240,13 @@
KlokDatumBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveNoneAcrylicMicaMica Alt
- Dit thema ondersteunt twee (licht/donker) modi.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Gebruik Segoe Fluent pictogrammenGebruik Segoe Fluent iconen voor zoekresultaten wanneer ondersteundPress Key
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyHTTP Proxy
@@ -323,6 +356,7 @@
Log MapLogbestanden wissenWeet u zeker dat u alle logbestanden wilt verwijderen?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window FontBestandsbeheerder selecteren
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneSuccesvolSuccesvol afgerond
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Custom Query Sneltoets
diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml
index 12af37c3e..7cc6dfcb1 100644
--- a/Flow.Launcher/Languages/pl.xaml
+++ b/Flow.Launcher/Languages/pl.xaml
@@ -8,9 +8,9 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Wybierz plik wykonywalny {0}
- Your selected {0} executable is invalid.
+ Wybrany plik wykonywalny {0} jest nieprawidłowy.
{2}{2}
- Click yes if you would like select the {0} executable agian. Click no if you would like to download {1}
+ Kliknij Tak, jeśli chcesz ponownie wybrać plik wykonywalny {0}. Kliknij Nie, jeśli chcesz pobrać {1}
Nie można ustawić ścieżki do pliku wykonywalnego {0}. Spróbuj ponownie w ustawieniach Flow (przewiń na sam dół).Nie udało się zainicjować wtyczek
@@ -42,7 +42,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Tryb graniaWstrzymaj używanie skrótów.Resetowanie pozycji
- Type here to search
+ Zresetuj pozycję okna wyszukiwania
+ Wpisz tutaj, aby wyszukaćUstawienia
@@ -105,15 +106,36 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Zawsze podglądZawsze otwieraj panel podglądu, gdy aktywowany jest Flow. Naciśnij {0}, aby przełączyć podgląd.Efekt cienia jest niedozwolony, gdy bieżący motyw ma włączony efekt rozmycia
- Search Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
- Default Search Delay Time
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Opóźnienie wyszukiwania
+ Dodaje krótkie opóźnienie podczas pisania, aby zmniejszyć migotanie interfejsu i obciążenie wynikami. Zalecane przy przeciętnej szybkości pisania.
+ Wprowadź czas oczekiwania (w ms), po którym wprowadzanie zostanie uznane za zakończone. Edycja jest możliwa tylko, gdy włączone jest Opóźnienie wyszukiwania.
+ Domyślne opóźnienie wyszukiwania
+ Opóźnienie (ms) przed pokazaniem wyników po zakończeniu pisania. Wyższe wartości oznaczają dłuższe oczekiwanie.
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Otwórz
+ 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.Szukaj wtyczek
@@ -130,8 +152,13 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Bieżące słowo kluczowe akcjiNowe słowo kluczowe akcjiZmień słowa kluczowe akcji
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Opóźnienie wyszukiwania wtyczek
+ Zmień opóźnienie wyszukiwania wtyczek
+ Ustawienia zaawansowane:
+ Aktywny
+ Priorytet
+ Opóźnienie wyszukiwania
+ Home PageObecny PriorytetNowy PriorytetPriorytet
@@ -145,9 +172,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
OdinstalowywanieNie udało się usunąć ustawień wtyczkiWtyczki: {0} – nie udało się usunąć plików ustawień wtyczek, usuń je ręcznie
- Fail to remove plugin cache
- Plugins: {0} - Fail to remove plugin cache files, please remove them manually
- Default
+ Nie udało się usunąć cache wtyczki
+ Wtyczki: {0} - Nie udało się usunąć plików cache wtyczki, usuń je ręcznieSklep z wtyczkami
@@ -184,6 +210,9 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Czcionka tytułu wynikuCzcionka podtytułu wynikuResetuj
+ Przywróć zalecane ustawienia czcionki i rozmiaru.
+ Rozmiar importu motywu
+ Jeśli wartość rozmiaru przewidziana przez projektanta motywu jest dostępna, zostanie pobrana i zastosowana.PersonalizujTryb w okniePrzeźroczystość
@@ -210,20 +239,21 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
NiestandardowaZegarData
- Backdrop Type
- Backdrop supported starting from Windows 11 build 22000 and above
+ Typ tła
+ Efekt tła nie jest stosowany w podglądzie.
+ Efekt tła obsługiwany od Windows 11 kompilacja 22000 i nowszychBrak
- Acrylic
- Mica
+ Akryl
+ MikaMica AltTen motyw obsługuje dwa tryby (jasny/ciemny).Ten motyw obsługuje rozmyte przezroczyste tło.
- 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.
+ Pokaż placeholder
+ Wyświetlaj placeholder, gdy zapytanie jest puste
+ Tekst placeholdera
+ Zmień tekst placeholdera. Jeśli pole będzie puste, zostanie użyty: {0}
+ Stały rozmiar okna
+ Nie można zmienić rozmiaru okna, przeciągając.Skrót klawiszowy
@@ -283,6 +313,9 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Użyj ikon Segoe FluentUżyj ikon Segoe Fluent dla wyników wyszukiwania, gdzie jest to obsługiwaneNaciśnij klawisz
+ Pokaż odznaki wyników
+ W przypadku wspieranych wtyczek wyświetlane są odznaki, aby łatwiej je rozróżnić.
+ Pokaż odznaki wyników tylko dla zapytań globalnychSerwer proxy HTTP
@@ -323,16 +356,18 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Folder dziennikaWyczyść logiCzy na pewno chcesz usunąć wszystkie logi?
- 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
+ Cache Folder
+ Wyczyść pamięć podręczną
+ Czy na pewno chcesz usunąć wszystkie pamięci podręczne?
+ Nie udało się wyczyścić części folderów i plików. Więcej informacji w pliku dziennikaKreatorLokalizacja danych użytkownikaUstawienia 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
- Log Level
+ Poziom logowaniaDebugInfo
+ Ustawienia czcionki oknaWybierz menedżer plików
@@ -367,16 +402,19 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Nie można odnaleźć podanej wtyczkiNowy wyzwalacz nie może być pustyTen wyzwalacz został już przypisany do innej wtyczki, musisz podać inny wyzwalacz.
- This new Action Keyword is the same as old, please choose a different one
+ Nowe słowo kluczowe akcji jest takie samo jak poprzednie. Wybierz inneSukcesZakończono pomyślnie
- 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.
+ Failed to copy
+ Wpisz słowa kluczowe uruchamiające wtyczkę (oddzielone spacją). Wpisz *, aby uruchamiać wtyczkę bez słów kluczowych.
- Search Delay Time Setting
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ Ustawienie opóźnienia wyszukiwania
+ Podaj czas opóźnienia wyszukiwania (w ms) dla wtyczki. Pozostaw puste, aby użyć wartości domyślnej.
+
+
+ Home Page
+ Enable the plugin home page state if you like to show the plugin results when query is empty.Skrót klawiszowy niestandardowych zapyta
diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml
index d0040d799..bd74d1d5f 100644
--- a/Flow.Launcher/Languages/pt-br.xaml
+++ b/Flow.Launcher/Languages/pt-br.xaml
@@ -42,6 +42,7 @@
Modo GamerSuspender o uso de Teclas de Atalho.Redefinição de Posição
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Erro ao ativar início com o sistemaEsconder Flow Launcher quando foco for perdidoNão mostrar notificações de novas versões
- Posição da Janela de Busca
+ Search Window LocationLembrar Última PosiçãoMonitor com o Cursor do MouseMonitor com Janela em Foco
@@ -106,14 +107,35 @@
Sempre abrir o painel de pré-visualização quando o Flow é ativado. Pressione {0} para ativar ou desativar a pré-visualização.O efeito de sombra não é permitido enquanto o tema atual tem o efeito de desfoque ativadoSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Abrir
+ 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.Buscar Plugin
@@ -130,8 +152,13 @@
Palavra-chave de ação atualNova palavra-chave de açãoAlterar Palavras-chave de Ação
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Enabled
+ Prioridade
+ Search Delay
+ Home PagePrioridade atualNova PrioridadePrioridade
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultLoja de Plugins
@@ -184,6 +210,9 @@
Result Title FontResult Subtitle FontReset
+ 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.CustomizeModo JanelaOpacidade
@@ -211,12 +240,13 @@
RelógioDataBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveNoneAcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Usar Segoe Fluent IconsUsar Segoe Fluent Icons para resultados da consulta quando suportadoApertar Tecla
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyProxy HTTP
@@ -323,6 +356,7 @@
Pasta de RegistroLimpar RegistrosTem certeza que quer excluir todos os registros?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window FontSelecione o Gerenciador de Arquivos
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneSucessoConcluído com sucesso
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Atalho de Consulta Personalizada
diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml
index 9dc520cbd..cf7312956 100644
--- a/Flow.Launcher/Languages/pt-pt.xaml
+++ b/Flow.Launcher/Languages/pt-pt.xaml
@@ -42,6 +42,7 @@
Modo de jogoSuspender utilização das teclas de atalhoRepor posição
+ Repor posição da janela de pesquisaEscreva aqui para pesquisar
@@ -106,14 +107,34 @@
Abrir painel de pré-visualização ao ativar Flow Launcher. Prima {0} para comutar a pré-visualização.O efeito sombra não é permitido com este tema porque o efeito desfocar está ativoAtraso da pesquisa
- Tempo a esperar após a digitação. Esta definição melhora o carregamento dos resultados.
+ Adiciona um pequeno atraso durante a escrita para reduzir a oscilação ao carregar os resultados. Recomendado se a sua velocidade de escrita for média.
+ Introduza o tempo de espera (ms) até que a entrada seja considerada completa. Apenas pode editar se ativara opção Atraso de pesquisa.Tempo de espera padrão
- O valor padrão a esperar, antes de iniciar a pesquisa após terminar a digitação.
- Muito longo
- Longo
- Normal
- Curto
- Muito curto
+ Tempo a aguardar antes de mostrar os resultados. Valores mais altos resultam num atraso maior (ms).
+ Informações para utilizadores coreanos
+
+ O método de introdução Coreano em sistemas Windows 11 pode causar erros no Flow Launcher.
+
+ Se estiver a sofrer problemas, pode ser necessário ativar "Utilizar versão anterior do IME Coreano".
+
+ Abra as definições no seu sistema e aceda a:
+
+ Hora e Idioma > Idioma e Região > Coreano > Opções de idioma > Teclado - Microsoft IME > Compatibilidade
+
+ e ative "Utilizar versão anterior de Microsoft IME".
+
+
+
+ Abrir definições de Idioma e Região
+ Abra a definição do método de introdução coreano. Aceda a Corano > Opções de idioma > Teclado - Microsoft IME > Compatibilidade
+ Abrir
+ Utilizar versão anterior de IME Coreano
+ Pode alterar as definições do método de introdução coreano aqui
+ Página inicial
+ Mostrar resultados da página inicial se o termo de pesquisa estiver vazio.
+ Mostrar histórico na página inicial
+ Máximo de resultados a mostrar na Página inicial
+ Esta opção apenas pode ser editada se o plugin tiver suporte a Página inicial e se estiver ativo.Pesquisar plugins
@@ -132,6 +153,11 @@
Alterar palavras-chaveTempo de espera do pluginAlterar tempo de espera do plugin
+ Definições avançadas:
+ Ativo
+ Prioridade
+ Atraso da pesquisa
+ Página inicialPrioridade atualNova prioridadePrioridade
@@ -147,7 +173,6 @@
Plugin: {0} - Falha ao remover o ficheiro de definições do plugin. Experimente remover manualmente.Falha ao limpar a cache do pluginPlugin: {0} - Falha ao remover os ficheiros em cache do plugin. Experimente remover manualmente.
- PadrãoLoja de plugins
@@ -184,6 +209,9 @@
Tipo de letra dos títulosTipo de letra dos subtítulosRepor
+ Repor definições recomendadas para fontes e tamanho.
+ Tamanho do tema importado
+ Se o programador do tema tiver disponibilizado o valor, este será utilizado.PersonalizarModo da janelaOpacidade
@@ -211,6 +239,7 @@
RelógioDataTipo de fundo
+ O efeito de fundo não é aplicado na pré-visualização.Esta opção apenas está disponível em sistemas após Windows 11 Build 22000NenhumaAcrílico
@@ -283,6 +312,9 @@
Utilizar ícones Segoe FluentSe possível, utilizar ícones Segoe Fluent para os resultadosPrima a tecla
+ Mostrar emblemas dos resultados
+ Para plugins suportados, são mostrados emblemas para nos ajudar a distingui-los mais facilmente.
+ Mostrar emblemas apenas para a consulta globalProxy HTTP
@@ -322,6 +354,7 @@
Pasta de registosLimpar registosTem a certeza de que deseja remover todos os registos?
+ Pasta de cacheLimpar cacheTem a certeza de que pretende limpar todas as caches?Não foi possível limpar todas as pastas e ficheiros. Consulte o ficheiro de registo para mais informações.
@@ -332,6 +365,7 @@
Nível de registoDepuraçãoInformação
+ Setting Window FontSelecione o gestor de ficheiros
@@ -369,13 +403,16 @@
A palavra-chave escolhida é igual à anterior. Por favor escolha outra.SucessoTerminado com sucesso
+ Falha ao copiarIntroduza as palavras-chave que pretende utilizar para iniciar o plugin e um espaço vazio caso queira mais do que uma. Utilize * se não quiser especificar uma palavra-chave e o plugin será ativado sem palavras-chave.Definição do tempo de espera
- Selecione o tempo de espera que pretende utilizar com este plugin. Selecione "{0}" se não o quiser especificar e, desta forma, o plugin irá utilizar o tempo de espera padrão.
- Tempo de espera atual
- Novo tempo de espera
+ Indique o tempo de espera que pretende utilizar com este plugin. Nada escreva se não o quiser especificar e o plugin irá utilizar o tempo de espera padrão.
+
+
+ Página inicial
+ Ative o plugin Página inicial se quiser mostrar os seus resultados so termo de pesquisa estiver vazio.Tecla de atalho personalizada
diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml
index c38855474..69069c5ec 100644
--- a/Flow.Launcher/Languages/ru.xaml
+++ b/Flow.Launcher/Languages/ru.xaml
@@ -42,6 +42,7 @@
Игровой режимПриостановить использование горячих клавиш.Сброс положения
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Ошибка настройки запуска при запускеСкрывать Flow Launcher, если потерян фокуcНе отображать сообщение об обновлении, когда доступна новая версия
- Положение окна поиска
+ Search Window LocationЗапомнить последнее положениеМонитор с курсором мышиМонитор с фокусированным окном
@@ -106,14 +107,35 @@
Всегда открывать панель предварительного просмотра при запуске Flow. Нажмите {0}, чтобы переключить предварительный просмотр.Эффект тени не допускается, если в текущей теме включён эффект размытияSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of 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.Поиск плагина
@@ -130,8 +152,13 @@
Ключевое слово текущего действияКлючевое слово нового действияИзменить ключевое слово действия
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Enabled
+ Приоритет
+ Search Delay
+ Home PageТекущий приоритетНовый приоритетПриоритет
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultМагазин плагинов
@@ -184,6 +210,9 @@
Result Title FontResult Subtitle FontReset
+ 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.CustomizeОконный режимПрозрачность
@@ -211,12 +240,13 @@
ЧасыДатаBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveNoneAcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +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НТТР-прокси
@@ -323,6 +356,7 @@
Папка журналаОчистить журналВы уверены, что хотите удалить все журналы?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window FontВыбор менеджера файлов
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneУспешноВыполнено успешно
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Задаваемые горячие клавиши для запросов
diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml
index 0f07387c6..88ed1c9df 100644
--- a/Flow.Launcher/Languages/sk.xaml
+++ b/Flow.Launcher/Languages/sk.xaml
@@ -42,6 +42,7 @@
Herný režimPozastaviť používanie klávesových skratiek.Resetovať pozíciu
+ Resetovať pozíciu vyhľadávacieho oknaZadajte text na vyhľadávanie
@@ -55,7 +56,7 @@
Chybné nastavenie spustenia pri spusteníSchovať Flow Launcher po strate fokusuNezobrazovať upozornenia na novú verziu
- Pozícia vyhľadávacieho okna
+ Poloha vyhľadávacieho oknaZapamätať si poslednú pozíciuMonitor s kurzorom myšiMonitor s aktívnym oknom
@@ -106,14 +107,35 @@
Pri aktivácii Flowu vždy otvoriť panel s náhľadom. Stlačením klávesu {0} prepnete náhľad.Efekt tieňa nie je povolený, kým má aktuálny motív povolený efekt rozostreniaOneskorenie vyhľadávania
- Pri písaní sa na chvíľu oneskorí vyhľadávanie. Tým sa zníži skákanie rozhrania a načítanie výsledkov.
+ Pridá krátke oneskorenie počas písania, aby na zníženie blikanie rozhrania počas načítavania. Odporúča sa pri priemernej rýchlosti písania.
+ Zadajte čas (v ms) čakania, kým vstup bude považovaný za ukončený. Úprava je povolená len vtedy, ak je povolené oneskorenie vyhľadávania.Predvolené oneskorenie vyhľadávania
- Predvolené oneskorenie pluginu, po ktorom sa zobrazia výsledky vyhľadávania po zastavení písania.
- Veľmi dlhé
- Dlhé
- Normálne
- Krátke
- Veľmi krátke
+ Čas čakania pred zobrazením výsledkov po ukončení písania. Pri vyšších hodnotách sa čaká dlhšie. (ms)
+ Informácie pre kórejského používateľa IME
+
+ Kórejská metóda vstupu použitá vo Windows 11 môže spôsobiť určité problémy vo Flow Launcheri.
+
+ Ak sa vyskytnú problémy, možno bude potrebné povoliť "Použiť predchádzajúcu verziu editora Microsoft IME".
+
+
+ Otvorte nastavenia Windows 11 a prejdite do:
+
+ Čas a jazyk > Jazyk a oblasť > Kórejčina> Možnosti jazyka > Klávesnice – Microsoft IME > Možnosti klávesnice – Kompatibilita,
+
+ a povoľte "Predcházdajúca verzia editora Microsoft IME".
+
+
+
+ Otvoriť nastavenia systému Jazyk a oblasť
+ Otvorí okno s nastaveniami kórejského editora Microsoft IME. Prejdite do Kórejčina > Možnosti jazyka > Klávesnice – Microsoft IME > Možnosti klávesnice – Kompatibilita
+ Otvoriť
+ Použiť predchádzajúcu verziu editora Microsoft IME
+ Zmeniť na predchádzajúcu verziu editora Microsoft IME môžete priamo tu
+ Domovská stránka
+ Zobraziť výsledky Domovskej stránky, keď je text dopytu prázdny.
+ Zobraziť výsledky histórie na Domovskej stránke
+ Maximálny počet histórie výsledkov zobrazenej na Domovskej stránke
+ Úprava je možná len vtedy, ak plugin podporuje funkciu Domovská stránka a Domovská stránka je povolená.Vyhľadať plugin
@@ -130,8 +152,13 @@
Aktuálny aktivačný príkazNový aktivačný príkazUpraviť aktivačný príkaz
- Oneskorenie vyhľadávania pomocou pluginu
- Zmení oneskorenie vyhľadávania pomocou pluginu
+ Oneskorenie vyhľadávania pluginu
+ Zmení oneskorenie vyhľadávania pluginu
+ Rozšírené nastavenia:
+ Povolené
+ Priorita
+ Oneskorenie vyhľadávania
+ Domovská stránkaAktuálna prioritaNová prioritaPriorita
@@ -147,7 +174,6 @@
Pluginy: {0} – Nepodarilo sa odstrániť súbory s nastaveniami pluginu, odstráňte ich manuálneNepodarilo sa odstrániť vyrovnávaciu pamäť pluginuPluginy: {0} – Nepodarilo sa odstrániť vyrovnávaciu pamäť pluginu, odstráňte ju manuálne
- PredvolenéRepozitár pluginov
@@ -184,6 +210,9 @@
Písmo nadpisu výsledkuPísmo podnadpisu výsledkuResetovať
+ Resetuje písmo a jeho veľkosť na predvolené hodnoty.
+ Importovať rozmery motívu
+ Ak je k dispozícii hodnota veľkosti definovaná autorom motívu, načíta sa a použije.PrispôsobiťRežim oknoNepriehľadnosť
@@ -210,8 +239,9 @@
VlastnéHodinyDátum
- Typ pozadia
- Backdrop je podporovaný od Windows 11 zostava 22000 a novších
+ Typ pozadia (backdrop)
+ Efekt pozadia sa v náhľade nezobrazuje.
+ Pozadie je podporované od Windows 11 zostava 22000 a novšíchŽiadnaAcrylicMica
@@ -283,6 +313,9 @@
Použiť ikony Segoe FluentPoužiť ikony Segoe Fluent, ak sú podporovanéStlačte kláves
+ Zobraziť výsledok v odznaku
+ Ak to plugin podporuje, zobrazí sa jeho ikona v odznaku na jednoduchšie odlíšenie.
+ Zobraziť výsledok v odznaku len pre globálne vyhľadávanieHTTP proxy
@@ -323,6 +356,7 @@
Priečinok s logmiVymazať logyNaozaj chcete odstrániť všetky logy?
+ Priečinok vyrovnávacej pamäteVymazať vyrovnávaciu pamäťNaozaj chcete vymazať všetky vyrovnávacie pamäte?Nepodarilo sa odstrániť niektoré priečinky a súbory. Pre viac informácií si pozrite súbor logu
@@ -333,6 +367,7 @@
Úroveň logovaniaDebugInfo
+ Nastavenie písma oknaVyberte správcu súborov
@@ -370,13 +405,16 @@
Tento nový aktivačný príkaz je rovnaký ako starý, vyberte inýÚspešnéÚspešne dokončené
+ Nepodarilo sa skopírovaťZadajte aktivačné príkazy, ktoré chcete používať na spustenie pluginu a oddeľte ich medzerou. Ak nechcete zadať aktivačný príkaz, použite * a plugin bude spustený bez aktivačného príkazu.Nastavenie oneskoreného vyhľadávania
- Vyberte oneskorenie vyhľadávania, ktoré chcete použiť pre plugin. Ak vyberiete "{0}", plugin použije predvolené oneskorenie vyhľadávania.
- Aktuálne oneskorenie vyhľadávania
- Nové oneskorenie vyhľadávania
+ Zadajte oneskorenie vyhľadávania v ms, ktoré chcete použiť pre plugin. Nechajte prázdne, ak nechcete zadať žiadne, plugin použije predvolené oneskorenie vyhľadávania.
+
+
+ Domovská stránka
+ Ak chcete zobrazovať výsledky pluginu, keď je dopyt prázdny, povoľte funkciu Domovská stránka.Klávesová skratka vlastného vyhľadávania
diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml
index 1d1eb9120..4b3e3bc0c 100644
--- a/Flow.Launcher/Languages/sr.xaml
+++ b/Flow.Launcher/Languages/sr.xaml
@@ -42,6 +42,7 @@
Game ModeSuspend the use of Hotkeys.Position Reset
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Error setting launch on startupSakri Flow Launcher kada se izgubi fokusNe prikazuj obaveštenje o novoj verziji
- Search Window Position
+ Search Window LocationRemember Last PositionMonitor with Mouse CursorMonitor with Focused Window
@@ -106,14 +107,35 @@
Always open preview panel when Flow activates. Press {0} to toggle preview.Shadow effect is not allowed while current theme has blur effect enabledSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Otvori
+ 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.Search Plugin
@@ -130,8 +152,13 @@
Current action keywordNew action keywordChange Action Keywords
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Enabled
+ Priority
+ Search Delay
+ Home PageCurrent PriorityNew PriorityPriority
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultPlugin Store
@@ -184,6 +210,9 @@
Result Title FontResult Subtitle FontReset
+ 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.CustomizeRežim prozoraNeprozirnost
@@ -211,12 +240,13 @@
ClockDateBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveNoneAcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Use Segoe Fluent IconsUse Segoe Fluent Icons for query results where supportedPress Key
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyHTTP proksi
@@ -323,6 +356,7 @@
Log FolderClear LogsAre you sure you want to delete all logs?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window FontSelect File Manager
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneUspešnoCompleted successfully
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.prečica za ručno dodat upit
diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml
index b9b5d351e..665694ace 100644
--- a/Flow.Launcher/Languages/tr.xaml
+++ b/Flow.Launcher/Languages/tr.xaml
@@ -42,6 +42,7 @@
Oyun ModuKısayol tuşlarının kullanımını durdurun.Pencere Konumunu Sıfırla
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Sistemle başlatma ayarı başarısız olduOdak Pencereden Ayrıldığında GizleGüncelleme bildirimlerini gösterme
- Pencere Konumu
+ Search Window LocationSon Konumu HatırlaFare İmlecinin Bulunduğu MonitörAktif Pencerenin Bulunduğu Monitör
@@ -106,14 +107,35 @@
Önizleme panelini her zaman aç. Önizlemeyi bu ayardan bağımsız {0} kısayolu ile açıp kapatabilirsiniz.Mevcut temada bulanıklık efekti etkinken gölgelendirme efektine izin verilmezSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Aç
+ 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.Eklenti Ara
@@ -130,8 +152,13 @@
Geçerli anahtar kelimeYeni anahtar kelimeAnahtar kelimeyi değiştir
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Enabled
+ Priority
+ Search Delay
+ Home PageMevcut öncelikYeni ÖncelikÖncelik
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultEklenti Mağazası
@@ -184,6 +210,9 @@
Arama Sonuçları Yazı TipiArama Sonuçları Yazı TipiSıfırla
+ 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.KişiselleştirPencere ModuSaydamlık
@@ -211,12 +240,13 @@
SaatTarihBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveHiçbiriAcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Segoe Fluent SimgeleriArama sonuçlarında mümkünse Segoe Fluent simgelerini kullan.Tuşa basın
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyVekil Sunucu
@@ -323,6 +356,7 @@
Günlük KlasörüGünlükleri TemizleTüm günlük kayıtlarını silmek istediğinize emin misiniz?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window FontDosya Yöneticisi Seçenekleri
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneBaşarılıBaşarıyla tamamlandı
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Özel Sorgu Kısayolları
diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml
index 427511c66..b3dc2cd16 100644
--- a/Flow.Launcher/Languages/uk-UA.xaml
+++ b/Flow.Launcher/Languages/uk-UA.xaml
@@ -42,6 +42,7 @@
Режим гриПризупинити використання гарячих клавіш.Скидання позиції
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Помилка запуску налаштування під час запускуСховати Flow Launcher, якщо втрачено фокусНе повідомляти про доступні нові версії
- Положення вікна пошуку
+ Search Window LocationПам'ятати останню позиціюМонітор з курсором мишіМонітор зі сфокусованим вікном
@@ -106,14 +107,35 @@
Завжди відкривати панель попереднього перегляду при активації Flow. Натисніть {0}, щоб переключити попередній перегляд.Ефект тіні не дозволено, коли поточна тема має ефект розмиттяSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of 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.Плагін для пошуку
@@ -130,8 +152,13 @@
Поточна гаряча клавішаНова гаряча клавішаЗмінити гарячі клавіши
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Увімкнено
+ Пріоритет
+ Search Delay
+ Home PageПоточний пріоритетНовий пріоритетПріоритет
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultМагазин плагінів
@@ -184,6 +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.ПідлаштуватиВіконний режимПрозорість
@@ -211,12 +240,13 @@
ГодинникДатаBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveНемаAcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.Ця тема підтримує розмитий прозорий фон.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Використання іконок Segoe FluentВикористання іконок Segoe Fluent Icons для результатів запитів, де це підтримуєтьсяНатисніть клавішу
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyHTTP-проксі
@@ -323,6 +356,7 @@
Тека журналуОчистити журналиВи впевнені, що хочете видалити всі журнали?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window FontВиберіть файловий менеджер
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different oneУспішноУспішно завершено
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Задані гарячі клавіші для запитів
diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml
index 6223efc00..b7b56213b 100644
--- a/Flow.Launcher/Languages/vi.xaml
+++ b/Flow.Launcher/Languages/vi.xaml
@@ -42,6 +42,7 @@
Chế độ trò chơiTạm dừng sử dụng phím nóng.Đặt lại vị trí
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Không lưu được tính năng tự khởi động khi khởi động hệ thốngẨn Flow Launcher khi mất tiêu điểmKhông hiển thị thông báo khi có phiên bản mới
- Vị trí Suchfenster
+ Search Window LocationGhi nhớ vị trí cuối cùngMàn hình bằng con trỏ chuộtMàn hình có cửa sổ được tập trung
@@ -106,14 +107,35 @@
Luôn mở bảng xem trước khi Flow kích hoạt. Nhấn {0} để chuyển đổi chế độ xem trước.Hiệu ứng đổ bóng không được phép nếu chủ đề hiện tại bật hiệu ứng làm mờSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Mở
+ 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.Plugin tìm kiếm
@@ -130,8 +152,13 @@
Từ hành động hiện tạiTừ hành động mớiThay đổi từ hành động
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Đã bật
+ Ưu tiên
+ Search Delay
+ Home PageƯu tiên hiện tạiƯu tiên mớiƯu tiên
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- DefaultTải tiện ích mở rộng
@@ -184,6 +210,9 @@
Result Title FontResult Subtitle FontĐặt lại
+ 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.Customizechế độ cửa sổđộ mờ
@@ -211,12 +240,13 @@
GiờNgàyBackdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveKhôngAcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +313,9 @@
Sử dụng biểu tượng SegoeSử dụng Biểu tượng Segoe Fluent cho kết quả truy vấn nếu được hỗ trợNhấn phím
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query OnlyProxy HTTP
@@ -325,6 +358,7 @@
Thư mục nhật kýXóa tệp nhật kýBạn có chắc chắn muốn xóa tất cả nhật ký không?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -335,6 +369,7 @@
Log LevelDebugInfo
+ Setting Window FontChọn trình quản lý tệp
@@ -372,13 +407,16 @@
This new Action Keyword is the same as old, please choose a different oneThành côngĐã hoàn tất thành công
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.Phím nóng truy vấn tùy chỉnh
diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml
index 3d302da5b..bd3142992 100644
--- a/Flow.Launcher/Languages/zh-cn.xaml
+++ b/Flow.Launcher/Languages/zh-cn.xaml
@@ -42,6 +42,7 @@
游戏模式暂停使用热键。重置位置
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
设置开机自启时出错失去焦点时自动隐藏 Flow Launcher不显示新版本提示
- 搜索窗口位置
+ Search Window Location记住上次的位置鼠标光标所在显示器聚焦窗口所在显示器
@@ -106,14 +107,35 @@
Flow 启动时总是打开预览面板。按 {0} 以切换预览。当前主题已启用模糊效果,不允许启用阴影效果Search Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of 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.搜索插件
@@ -130,8 +152,13 @@
当前触发关键字新触发关键字更改触发关键字
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ 启用
+ 优先级
+ Search Delay
+ Home Page当前优先级新优先级优先级
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- Default插件商店
@@ -184,6 +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.自定义窗口模式透明度
@@ -211,12 +240,13 @@
时钟日期Backdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and above无AcrylicMicaMica Alt
- 该主题支持两种(浅色/深色)模式。
+ This theme supports two (light/dark) modes.该主题支持模糊透明背景。Show placeholderDisplay placeholder when query is empty
@@ -283,6 +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 OnlyHTTP 代理
@@ -323,6 +356,7 @@
日志目录清除日志你确定要删除所有的日志吗?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window Font默认文件管理器
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different one成功成功完成
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.自定义查询热键
diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml
index cecad8e0d..1a71ae135 100644
--- a/Flow.Launcher/Languages/zh-tw.xaml
+++ b/Flow.Launcher/Languages/zh-tw.xaml
@@ -42,6 +42,7 @@
遊戲模式暫停使用快捷鍵。重設位置
+ Reset search window positionType here to search
@@ -55,7 +56,7 @@
Error setting launch on startup失去焦點時自動隱藏 Flow Launcher不顯示新版本提示
- 搜尋視窗位置
+ Search Window Location記住最後位置Monitor with Mouse CursorMonitor with Focused Window
@@ -106,14 +107,35 @@
當 Flow 啟動時,一律開啟預覽面板。按下 {0} 可切換預覽。Shadow effect is not allowed while current theme has blur effect enabledSearch Delay
- Delay for a while to search when typing. This reduces interface jumpiness and result load.
+ 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
- Plugin default delay time after which search results appear when typing is stopped.
- Very long
- Long
- Normal
- Short
- Very short
+ Wait time before showing results after typing stops. Higher values wait longer. (ms)
+ Information for Korean IME user
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of 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.Search Plugin
@@ -130,8 +152,13 @@
目前觸發關鍵字新觸發關鍵字更改觸發關鍵字
- Plugin seach delay time
- Change Plugin Seach Delay Time
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ 已啟用
+ 優先
+ Search Delay
+ Home Page目前優先新增優先優先
@@ -147,7 +174,6 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
- Default插件商店
@@ -184,6 +210,9 @@
Result Title FontResult Subtitle FontReset
+ 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.Customize視窗模式透明度
@@ -211,12 +240,13 @@
時鐘日期Backdrop Type
+ The backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveNoneAcrylicMicaMica Alt
- This theme supports two(light/dark) modes.
+ This theme supports two (light/dark) modes.This theme supports Blur Transparent Background.Show placeholderDisplay placeholder when query is empty
@@ -283,6 +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 OnlyHTTP 代理
@@ -323,6 +356,7 @@
日誌資料夾清除日誌請確認要刪除所有日誌嗎?
+ Cache FolderClear CachesAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more information
@@ -333,6 +367,7 @@
Log LevelDebugInfo
+ Setting Window Font選擇檔案管理器
@@ -370,13 +405,16 @@
This new Action Keyword is the same as old, please choose a different one成功成功完成
+ Failed to copyEnter 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
- Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time.
- Current search delay time
- New search delay time
+ 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.自定義快捷鍵查詢
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
index d278faf98..e553a1b7e 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
@@ -2,8 +2,8 @@
- Browser Bookmarks
- Search your browser bookmarks
+ ブラウザブックマーク
+ ブラウザのブックマークを検索しますBookmark Data
@@ -12,16 +12,16 @@
New tabSet browser from path:Choose
- Copy url
- Copy the bookmark's url to clipboard
+ URLをコピー
+ ブックマークのURLをクリップボードにコピーLoad Browser From:Browser NameData Directory Path
- 追
- 編
+ 追加
+ 編集削除Browse
- Others
+ その他のブラウザBrowser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
index 93916ffaa..a374e7fc1 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
@@ -12,8 +12,8 @@
새 탭Set browser from path:선택
- Copy url
- Copy the bookmark's url to clipboard
+ URL 복사
+ 북마크의 URL을 클립보드에 복사데이터를 가져올 브라우저:브라우저 이름데이터 디렉토리 위치
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
index 4344e8c3d..06af5ea5b 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
@@ -24,5 +24,5 @@
OutrosMotor do navegadorSe não estiver a usar o Chrome, Firefox ou Edge ou se estiver a usar a versão portátil, tem que adicionar o diretório de dados dos marcadores e selecionar o motor do navegador para que este plugin funcione.
- Por exemplo: o motor do Brave é Chromium e a localização padrão dos marcadores é "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para o navegafor Firefox, o diretório de marcadores é a pasta do utilizador que contém o ficheiro places.sqlite.
+ Por exemplo: o motor do Brave é Chromium e a localização padrão dos marcadores é "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para o navegador Firefox, o diretório de marcadores é a pasta de utilizador que contém o ficheiro places.sqlite.
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
index 15598118c..757394b4c 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
@@ -1,11 +1,11 @@
- Calculator
- Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ 電卓
+ 数式の計算ができます(Flow Launcherで「5*3-2」と入力してみてください)Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)
- Copy this number to the clipboard
+ この数字をクリップボードにコピーしますDecimal separatorThe decimal separator to be used in the output.Use system locale
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
index c61f8b3df..b751f3f39 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
@@ -7,7 +7,7 @@
Expressão errada ou incompleta (esqueceu-se de algum parêntese?)Copiar número para a área de transferênciaSeparador decimal
- O separador decimal a ser usado no resultado.
+ O separador decimal para utilizar no resultado.Utilizar definições do sistemaVírgula (,)Ponto (.)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
index df6199976..29c97a651 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
@@ -21,26 +21,26 @@
削除
- 編
- 追
- General Setting
- Customise Action Keywords
+ 編集
+ 追加
+ 一般設定
+ アクションキーワードのカスタマイズQuick Access LinksEverything Setting
- Preview Panel
+ プレビューパネルサイズ
- Date Created
- Date Modified
- Display File Info
- Date and time format
+ 作成日時
+ 更新日時
+ ファイル情報の表示
+ 日付と時刻の形式Sort Option:Everything Path:Launch HiddenEditor PathShell Path
- Index Search Excluded Paths
- Use search result's location as the working directory of the executable
- Hit Enter to open folder in Default File Manager
+ インデックス検索の除外パス
+ 検索結果の場所を実行ファイルの作業ディレクトリとして使用
+ Enterキーで既定のファイルマネージャーでフォルダーを開くUse Index Search For Path SearchIndexing OptionsSearch:
@@ -49,7 +49,7 @@
Index Search:Quick Access:Current Action Keyword
- 完
+ 完了EnabledWhen disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keywordEverything
@@ -63,57 +63,57 @@
Content Search EngineDirectory Recursive Search EngineIndex Search Engine
- Open Windows Index Option
+ Windowsのインデックスオプションを開くExcluded File Types (comma seperated)For example: exe,jpg,pngMaximum resultsThe maximum number of results requested from active search engine
- Explorer
- Find and manage files and folders via Windows Search or Everything
+ エクスプローラー
+ Windows SearchまたはEverythingを使って、ファイルやフォルダーを検索・管理しますCtrl + Enter to open the directoryCtrl + Enter to open the containing folder
- Copy path
- Copy path of current item to clipboard
- Copy
- Copy current file to clipboard
- Copy current folder to clipboard
+ パスをコピー
+ 現在の項目のパスをコピー
+ コピー
+ 現在のファイルをコピー
+ 現在のフォルダーをコピー削除
- Permanently delete current file
- Permanently delete current folder
+ 現在のファイルを完全に削除
+ 現在のフォルダーを完全に削除Path:Delete the selectedRun as different userRun the selected using a different user account
- Open containing folder
- Open the location that contains current item
- Open With Editor:
+ フォルダーを開く
+ 現在の項目が含まれている場所を開きます
+ エディターで開く:Failed to open file at {0} with Editor {1} at {2}
- Open With Shell:
+ シェルで開く:Failed to open folder {0} with Shell {1} at {2}Exclude current and sub-directories from Index SearchExcluded from Index Search
- Open Windows Indexing Options
+ Windowsインデックスオプションを開くManage indexed files and folders
- Failed to open Windows Indexing Options
- Add to Quick Access
- Add current item to Quick Access
+ Windowsインデックスオプションを開けませんでした
+ クイックアクセスに追加
+ 現在の項目をクイックアクセスに追加Successfully Added
- Successfully added to Quick Access
+ クイックアクセスに追加しましたSuccessfully RemovedSuccessfully removed from Quick Access
- Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
- Remove from Quick Access
- Remove from Quick Access
- Remove current item from Quick Access
- Show Windows Context Menu
- Open With
- Select a program to open with
+ エクスプローラーの検索アクティベーション用アクションキーワードで開けるように、クイックアクセスに追加します
+ クイックアクセスから削除
+ クイックアクセスから削除
+ 現在の項目をクイックアクセスから削除
+ Windowsの右クリックメニューを表示
+ アプリで開く
+ 開くためのプログラムを選択します{0} free of {1}
@@ -153,7 +153,7 @@
Successfully installed Everything serviceFailed to automatically install Everything service. Please manually install it from https://www.voidtools.comClick here to start it
- Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Everythingのインストールが見つかりませんでした。手動で場所を指定しますか?{0}{0}「いいえ」をクリックすると、Everythingが自動的にインストールされます。Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
index 27f98449f..39d056e28 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
@@ -6,7 +6,7 @@
Selecione a ligação para a pastaTem a certeza de que deseja eliminar {0}?Tem a certeza de que pretende eliminar permanentemente este ficheiro?
- Tem a certeza de que pretende eliminar permanentemente este ficheiro ou pasta?
+ Tem a certeza de que pretende eliminar permanentemente este ficheiro/pasta?Eliminada com sucesso{0} eliminado(a) com sucesso.A atribuição de uma palavra-chave global pode devolver demasiados resultados. Deve escolher uma palavra-chave específica.
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/ko.xaml
index cc78c9a9a..7af9e9306 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/ko.xaml
@@ -1,9 +1,9 @@
- Activate {0} plugin action keyword
+ {0} 플러그인의 액션 키워드
- 플러그인 인디케이터
+ 플러그인 키워드 힌트사용중인 플러그인들의 전체 액션 키워드 목록을 보여줍니다
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ar.xaml
index 04619239d..006dd93d6 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ar.xaml
@@ -8,6 +8,7 @@
قتل عمليات {0}قتل جميع الأمثلة
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/cs.xaml
index d621b63c4..d53616cc0 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/cs.xaml
@@ -8,6 +8,7 @@
ukončit {0} procesůukončit všechny instance
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/da.xaml
index 8563f49a0..0a7176d2c 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/da.xaml
@@ -8,6 +8,7 @@
kill {0} processeskill all instances
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml
index 766d170a4..7968ef2d8 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml
@@ -8,6 +8,7 @@
{0} Prozesse beendenAlle Instanzen beenden
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es-419.xaml
index 9b4a20a69..50799dca2 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es-419.xaml
@@ -8,6 +8,7 @@
terminar {0} procesostermina todas las instancias
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml
index ab788075e..6ab3f9797 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml
@@ -8,6 +8,7 @@
finalizar {0} procesosfinalizar todas las instancias
+ Mostrar el título de los procesos con ventanas visiblesColocar procesos con ventanas visibles en la parte superior
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/fr.xaml
index 7064de1fe..ae3b6bab2 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/fr.xaml
@@ -8,6 +8,7 @@
Tuer {0} processusTuer toutes les instances
+ Afficher le titre des processus avec des fenêtres visiblesPlacer les processus dont les fenêtres sont visibles en haut de la page
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/he.xaml
index 8567b5412..15d14a42c 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/he.xaml
@@ -8,6 +8,7 @@
סגור {0} תהליכיםסגור את כל המופעים
+ הצג כותרת עבור תהליכים בעלי חלונות גלוייםהצב תהליכים עם חלונות גלויים בחלק העליון
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml
index 1333fe573..5bd4a9eac 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml
@@ -8,6 +8,7 @@
termina {0} processitermina tutte le istanze
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ja.xaml
index 8563f49a0..0a7176d2c 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ja.xaml
@@ -8,6 +8,7 @@
kill {0} processeskill all instances
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ko.xaml
index c3d1f6d08..09679a58b 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ko.xaml
@@ -8,6 +8,7 @@
{0} 프로세스 종료모든 인스턴스 종료
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nb.xaml
index 1210818bf..37413385d 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nb.xaml
@@ -8,6 +8,7 @@
terminer {0} processesterminer alle forekomstene
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nl.xaml
index cfcd71c37..ea9f9a591 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nl.xaml
@@ -8,6 +8,7 @@
kill {0} processeskill all instances
+ Show title for processes with visible windowsZet processen met zichtbare vensters bovenaan
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml
index 650f14657..7e59db5ec 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml
@@ -8,6 +8,7 @@
zamknij {0} procesówzamknij wszystkie instancje
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-br.xaml
index 8563f49a0..0a7176d2c 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-br.xaml
@@ -8,6 +8,7 @@
kill {0} processeskill all instances
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-pt.xaml
index 944a883c9..b50a31744 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-pt.xaml
@@ -8,6 +8,7 @@
terminar {0} processosterminar todas as instâncias
+ Mostrar título dos processos com janelas visíveisColocar processos com janelas visíveis por cima
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ru.xaml
index 0e2bef052..d030a778e 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ru.xaml
@@ -8,6 +8,7 @@
удалить {0} процессовудалить все экземпляры
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sk.xaml
index 2b06d3bbe..6c85b9476 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sk.xaml
@@ -8,6 +8,7 @@
ukončiť {0} procesovukončiť všetky inštancie
+ Zobraziť nadpis pre procesy s viditeľnými oknamiZobraziť procesy s viditeľným oknom navrchu
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr.xaml
index 8563f49a0..0a7176d2c 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr.xaml
@@ -8,6 +8,7 @@
kill {0} processeskill all instances
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml
index 8563f49a0..0a7176d2c 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml
@@ -8,6 +8,7 @@
kill {0} processeskill all instances
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml
index 02dab46ba..56004028b 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml
@@ -8,6 +8,7 @@
вбити {0} процесіввбити всі екземпляри
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/vi.xaml
index 89fd67635..5ce54a0dc 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/vi.xaml
@@ -8,6 +8,7 @@
Buộc tắt các tiến trình {0}Tắt tất cả phên bản
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml
index 15e717c79..ceb909db1 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml
@@ -8,6 +8,7 @@
杀死 {0} 进程杀死所有实例
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-tw.xaml
index 8563f49a0..0a7176d2c 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-tw.xaml
@@ -8,6 +8,7 @@
kill {0} processeskill all instances
+ Show title for processes with visible windowsPut processes with visible windows on the top
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml
index 69ca16b69..d352368cb 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml
@@ -74,7 +74,7 @@
التشغيل كمستخدم مختلفالتشغيل كمسؤولفتح المجلد المحتوي
- تعطيل عرض هذا البرنامج
+ Hideفتح المجلد الهدفالبرنامج
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml
index 1c70c6b6f..ca57bf027 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml
@@ -74,7 +74,7 @@
Spustit jako jiný uživatelSpustit jako správceOtevřít umístění složky
- Zakázat zobrazování tohoto programu
+ HideOpen target folderProgram
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml
index 0f39f5d56..a0f09a3b5 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml
@@ -74,7 +74,7 @@
Run As Different UserRun As AdministratorOpen containing folder
- Disable this program from displaying
+ HideOpen target folderProgram
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml
index 14e228b2a..ec5d273d6 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml
@@ -74,7 +74,7 @@
Als anderer Benutzer ausführenAls Administrator ausführenEnthaltenden Ordner öffnen
- Dieses Programm von der Anzeige deaktivieren
+ HideZielordner öffnenProgramm
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml
index b928bd1ce..d9ffa668c 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml
@@ -74,7 +74,7 @@
Run As Different UserRun As AdministratorOpen containing folder
- Disable this program from displaying
+ HideOpen target folderProgram
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml
index 57b5c94b7..d0b6851d9 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml
@@ -74,7 +74,7 @@
Ejecutar como usuario diferenteEjecutar como administradorAbrir carpeta contenedora
- Desactivar la visualización de este programa
+ OcultarAbrir carpeta de destinoPrograma
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml
index 7cccd5a42..e6fd67936 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml
@@ -74,7 +74,7 @@
Exécuter en tant qu'utilisateur différentExécuter en tant qu'administrateurOuvrir l'emplacement du fichier
- Masquer ce programme des résultats
+ MasquerOuvrir le répertoire cibleProgrammes
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml
index af272fb46..88053ac57 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml
@@ -74,7 +74,7 @@
הפעל כמשתמש אחרהפעל כמנהלפתח תיקייה מכילה
- השבת הצגת תוכנה זו
+ הסתרפתח תיקיית יעדתוכנה
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml
index cf5de9bab..5004d41cf 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml
@@ -74,7 +74,7 @@
Esegui Come Utente DifferenteEsegui Come AmministratoreApri percorso file
- Disabilita questo programma dalla visualizzazione
+ HideOpen target folderProgramma
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml
index 1f1dd4d37..96ca3af60 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml
@@ -4,12 +4,12 @@
Reset Default削除
- 編
- 追
+ 編集
+ 追加Name有効Enabled
- Disable
+ 無効StatusEnabledDisabled
@@ -28,11 +28,11 @@
When enabled, Flow will load programs from the registryPATHWhen enabled, Flow will load programs from the PATH environment variable
- Hide app path
- For executable files such as UWP or lnk, hide the file path from being visible
+ アプリのパスを非表示
+ UWPやlnkなどの実行可能ファイルについて、サブタイトル領域にファイルパスが表示されないようにします。Hide uninstallersHides programs with common uninstaller names, such as unins000.exe
- Search in Program Description
+ プログラムの説明で検索Flow will search program's descriptionHide duplicated appsHide duplicated Win32 programs that are already in the UWP list
@@ -71,14 +71,14 @@
Insert protocols of .url files you want to index. Protocols should be separated by ';', and should end with "://". (ex>ftp://;mailto://)
- Run As Different User
- Run As Administrator
+ 別のユーザーとして実行
+ 管理者として実行Open containing folder
- Disable this program from displaying
+ HideOpen target folder
- Program
- Search programs in Flow Launcher
+ プログラム
+ Flow Launcherでプログラムを検索Invalid Path
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml
index affa7567f..266aa4b45 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml
@@ -34,7 +34,7 @@
Unins000처럼 일반적으로 사용되는 설치 삭제(Uninstaller) 프로그램의 이름을 숨깁니다.프로그램 설명 검색Flow will search program's description
- Hide duplicated apps
+ 중복된 앱 숨기기Hide duplicated Win32 programs that are already in the UWP list확장자최대 깊이
@@ -74,8 +74,8 @@
다른 유저 권한으로 실행관리자 권한으로 실행포함된 폴더 열기
- 이 프로그램 표시 비활성화
- Open target folder
+ Hide
+ 대상 폴더 열기프로그램Flow Launcher에서 프로그램을 검색합니다
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml
index 3fa53aba8..c4b218204 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml
@@ -74,7 +74,7 @@
Kjør som en annen brukerKjør som administratorÅpne inneholdende mappe
- Deaktiver visningen av dette programmet
+ HideÅpne målmappeProgram
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml
index 8a86dc511..495296694 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml
@@ -74,7 +74,7 @@
Run As Different UserRun As AdministratorOpen containing folder
- Disable this program from displaying
+ HideOpen target folderProgram
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml
index 8a163de7a..f38fd9623 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml
@@ -74,7 +74,7 @@
Uruchom jako inny użytkownikUruchom jako administratorOtwórz folder nadrzędny
- Wyłącz wyświetlanie tego programu
+ HideOtwórz folder docelowyProgramy
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml
index bab077683..3ff8be551 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml
@@ -74,7 +74,7 @@
Run As Different UserRun As AdministratorOpen containing folder
- Disable this program from displaying
+ HideOpen target folderProgram
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml
index c7b394593..aa3c500a3 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml
@@ -74,7 +74,7 @@
Executar com outro utilizadorExecutar como administradorAbrir pasta de destino
- Desativar exibição deste programa
+ OcultarAbrir pasta de destinoProgramas
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml
index 8cb62137e..a75a6d836 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml
@@ -74,7 +74,7 @@
Запустить от имени другого пользователяЗапустить от имени администратораОткрыть содержащую папку
- Отключить отображение этой программы
+ HideOpen target folderПрограмма
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml
index ee0705b96..7fda65160 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml
@@ -74,7 +74,7 @@
Spustiť ako iný používateľSpustiť ako správcaOtvoriť umiestnenie priečinka
- Zakázať zobrazovanie tohto programu
+ SkryťOtvoriť cieľový priečinokProgram
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml
index a69d7e96b..f2da895b0 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml
@@ -74,7 +74,7 @@
Run As Different UserRun As AdministratorOpen containing folder
- Disable this program from displaying
+ HideOpen target folderProgram
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
index d46de0592..6bda659dd 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
@@ -74,7 +74,7 @@
Run As Different UserYönetici Olarak ÇalıştırOpen containing folder
- Disable this program from displaying
+ HideOpen target folderProgram
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
index 8e8d55f47..3686925a9 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
@@ -74,7 +74,7 @@
Запустити від імені іншого користувачаЗапустити від імені адміністратораВідкрити папку
- Вимкнути відображення цієї програми
+ HideВідкрити цільову папкуПрограма
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml
index 21a3981c5..6b238c638 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml
@@ -74,7 +74,7 @@
Xóa lựa chọn đã chọnChạy với quyền quản trịMở thư mục chứa
- Vô hiệu hóa chương trình này hiển thị
+ HideMở thư mục đíchChươ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 6d5c0079f..b36b72b9b 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml
@@ -74,7 +74,7 @@
以其他用户身份运行以管理员身份运行打开文件所在文件夹
- 禁止显示该程序
+ Hide打开目标文件夹程序
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml
index fd0bd427a..084adfbac 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml
@@ -74,7 +74,7 @@
Run As Different User以系統管理員身分執行開啟檔案位置
- Disable this program from displaying
+ HideOpen target folder程式
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
index 90eb49317..781227267 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
@@ -12,7 +12,7 @@
Allows to execute system commands from Flow Launcherthis command has been executed {0} timesexecute command through command shell
- Run As Administrator
+ 管理者として実行Copy the commandOnly show number of most used commands:
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.xaml
index 86688a130..b02a89a0a 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.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.Sys/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
index bc7dff59f..27fee87be 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
@@ -6,20 +6,20 @@
説明コマンド
- Shutdown
- Restart
+ シャットダウン
+ 再起動Restart With Advanced Boot OptionsLog Off/Sign OutLockSleepHibernateIndex Option
- Empty Recycle Bin
- Open Recycle Bin
- 終
- Save Settings
+ ごみ箱を空にする
+ ごみ箱を開く
+ 終了
+ 設定を保存Flow Launcherを再起動する
- 設
+ 設定プラグインデータのリロードCheck For UpdateOpen Log Location
@@ -28,7 +28,7 @@
Toggle Game ModeSet the Flow Launcher Theme
- 編
+ 編集コンピュータをシャットダウンする
@@ -41,7 +41,7 @@
このアプリの設定スリープゴミ箱を空にする
- Open recycle bin
+ ごみ箱を開くIndexing OptionsHibernate computerSave all Flow Launcher settings
@@ -58,17 +58,17 @@
All Flow Launcher settings savedReloaded all applicable plugin dataAre you sure you want to shut the computer down?
- Are you sure you want to restart the computer?
- Are you sure you want to restart the computer with Advanced Boot Options?
- Are you sure you want to log off?
+ 本当にコンピューターを再起動しますか?
+ 高度な起動オプションでコンピューターを再起動しますか?
+ 本当にログオフしますか?Command Keyword SettingCustom Command KeywordEnter a keyword to search for command: {0}. This keyword is used to match your query.Command KeywordReset
- Confirm
-
+ 確認
+ キャンセルPlease enter a non-empty command keywordシステムコマンド
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
index f2049038f..e38e6e68b 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
@@ -66,7 +66,7 @@
Custom Command KeywordEnter a keyword to search for command: {0}. This keyword is used to match your query.Command Keyword
- Reset
+ 초기화확인취소Please enter a non-empty command keyword
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
index 9ae628853..4112f41ff 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
@@ -34,7 +34,7 @@
タイトル
- Status
+ 状態アイコンを選択アイコンキャンセル
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
index 3ac9f6a6c..c8f069ca7 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
@@ -21,20 +21,18 @@
자동완성 데이터 출처:웹 검색을 선택하세요Are you sure you want to delete {0}?
- If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ 특정 웹사이트의 검색 기능을 Flow에 추가하고 싶다면, 먼저 해당 웹사이트의 검색창에 임의의 텍스트를 입력하고 검색을 실행하세요. 그런 다음 브라우저의 주소 표시줄에 표시된 내용을 복사하여 아래의 URL 필드에 붙여넣습니다. 이때, 검색에 사용한 테스트 문자열을 {q}로 바꿔주세요. 예를 들어, Netflix에서 casino를 검색하면 주소 표시줄에는 다음과 같이 표시됩니다.https://www.netflix.com/search?q=Casino
- Now copy this entire string and paste it in the URL field below.
- Then replace casino with {q}.
- Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+ 이제 이 전체 문자열을 복사해서 아래의 URL 필드에 붙여넣으세요. 그런 다음 casino를 **{q}**로 바꿔주세요. 따라서 Netflix에서의 일반적인 검색 형식은 다음과 같습니다: https://www.netflix.com/search?q={q}
- Copy URL
- Copy search URL to clipboard
+ URL 복사
+ 검색 주소를 클립보드에 복사이름
- Status
+ 상태아이콘 선택아이콘취소
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.he-IL.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.he-IL.resx
index faa8c2dcc..5bf27c746 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.he-IL.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.he-IL.resx
@@ -416,7 +416,7 @@
Area Privacy
- Cangjie IME
+ קלט CangjieArea TimeAndLanguage
@@ -547,7 +547,7 @@
Area Control Panel (legacy settings)
- deuteranopia
+ עיוורון צבעים – אדום־ירוקMedical: Mean you don't can see red colors
@@ -697,7 +697,7 @@
Area Control Panel (legacy settings)
- Game DVR
+ מקליט משחקיםArea Gaming
@@ -721,7 +721,7 @@
Area Control Panel (legacy settings)
- Glance
+ הצצהArea Personalization, Deprecated in Windows 10, version 1809 and later
@@ -1251,7 +1251,7 @@
Area System
- protanopia
+ עיוורון צבעים – אדוםMedical: Mean you don't can see green colors
@@ -1297,7 +1297,7 @@
Mean the weakness you can't differ between red and green colors
- Red week
+ שבוע אדוםMean you don't can see red colors
@@ -1332,7 +1332,7 @@
Area Control Panel (legacy settings)
- schedtasks
+ משימות מתוזמנותFile name, Should not translated
@@ -1544,7 +1544,7 @@
שקיפות
- tritanopia
+ עיוורון צבעים – כחולMedical: Mean you don't can see yellow and blue colors
From 71b6cb2ca53ce28697fb9ed0ee75004aaf712e49 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 11 May 2025 20:56:21 +0800
Subject: [PATCH 1057/1798] Fix sound effect issue after sleep or hiberation
---
Flow.Launcher/MainWindow.xaml.cs | 33 +++++++++++++++++++++++++-------
1 file changed, 26 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index e243549e3..46eeb2adc 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -22,6 +22,7 @@ using Flow.Launcher.Infrastructure.Image;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin.SharedCommands;
using Flow.Launcher.ViewModel;
+using Microsoft.Win32;
using ModernWpf.Controls;
using DataObject = System.Windows.DataObject;
using Key = System.Windows.Input.Key;
@@ -88,6 +89,8 @@ namespace Flow.Launcher
InitSoundEffects();
DataObject.AddPastingHandler(QueryTextBox, QueryTextBox_OnPaste);
+
+ SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
}
#endregion
@@ -540,16 +543,29 @@ namespace Flow.Launcher
#region Window Sound Effects
+ private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
+ {
+ // Fix for sound not playing after sleep / hibernate
+ // https://stackoverflow.com/questions/64805186/mediaplayer-doesnt-play-after-computer-sleeps
+ if (e.Mode == PowerModes.Resume)
+ {
+ InitSoundEffects();
+ }
+ }
+
private void InitSoundEffects()
{
if (_settings.WMPInstalled)
{
+ animationSoundWMP?.Close();
animationSoundWMP = new MediaPlayer();
animationSoundWMP.Open(new Uri(AppContext.BaseDirectory + "Resources\\open.wav"));
}
else
{
+ animationSoundWPF?.Dispose();
animationSoundWPF = new SoundPlayer(AppContext.BaseDirectory + "Resources\\open.wav");
+ animationSoundWPF.Load();
}
}
@@ -816,7 +832,7 @@ namespace Flow.Launcher
{
Name = progressBarAnimationName, Storyboard = progressBarStoryBoard
};
-
+
var stopStoryboard = new StopStoryboard()
{
BeginStoryboardName = progressBarAnimationName
@@ -837,7 +853,7 @@ namespace Flow.Launcher
progressStyle.Triggers.Add(trigger);
ProgressBar.Style = progressStyle;
-
+
_viewModel.ProgressBarVisibility = Visibility.Hidden;
}
@@ -885,7 +901,7 @@ namespace Flow.Launcher
Duration = TimeSpan.FromMilliseconds(animationLength),
FillBehavior = FillBehavior.HoldEnd
};
-
+
var rightMargin = GetThicknessFromStyle(ClockPanel.Style, new Thickness(0, 0, DefaultRightMargin, 0)).Right;
var thicknessAnimation = new ThicknessAnimation
@@ -913,10 +929,10 @@ namespace Flow.Launcher
clocksb.Children.Add(ClockOpacity);
iconsb.Children.Add(IconMotion);
iconsb.Children.Add(IconOpacity);
-
+
_settings.WindowLeft = Left;
_isArrowKeyPressed = false;
-
+
clocksb.Begin(ClockPanel);
iconsb.Begin(SearchIcon);
}
@@ -1088,7 +1104,7 @@ namespace Flow.Launcher
{
e.Handled = true;
}
-
+
#endregion
#region Placeholder
@@ -1140,7 +1156,7 @@ namespace Flow.Launcher
}
#endregion
-
+
#region Search Delay
private void QueryTextBox_TextChanged1(object sender, TextChangedEventArgs e)
@@ -1162,6 +1178,9 @@ namespace Flow.Launcher
{
_hwndSource?.Dispose();
_notifyIcon?.Dispose();
+ animationSoundWMP?.Close();
+ animationSoundWPF?.Dispose();
+ SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
}
_disposed = true;
From 165e498a9450c6bb5f05a256b2e96e87564ed340 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 12 May 2025 15:12:23 +0800
Subject: [PATCH 1058/1798] Fix exception when deleteing temp files
---
.../ChromiumBookmarkLoader.cs | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index 66be08903..e859976bd 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -131,7 +131,17 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
}
catch (Exception ex)
{
- File.Delete(tempDbPath);
+ try
+ {
+ if (File.Exists(tempDbPath))
+ {
+ File.Delete(tempDbPath);
+ }
+ }
+ catch (Exception ex1)
+ {
+ Main._context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex1);
+ }
Main._context.API.LogException(ClassName, $"Failed to copy favicon DB: {dbPath}", ex);
return;
}
From 4931a1436a5b12c99f49a596b75b13115ddf4797 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 12 May 2025 17:19:16 +0800
Subject: [PATCH 1059/1798] Validate the cache directory before loading all
bookmarks
---
Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
index 9ad31ad14..155069495 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
@@ -37,8 +37,6 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
context.CurrentPluginMetadata.PluginCacheDirectoryPath,
"FaviconCache");
- FilesFolders.ValidateDirectory(_faviconCacheDir);
-
LoadBookmarksIfEnabled();
}
@@ -50,6 +48,9 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
return;
}
+ // Validate the cache directory before loading all bookmarks because Flow needs this directory to storage favicons
+ FilesFolders.ValidateDirectory(_faviconCacheDir);
+
_cachedBookmarks = BookmarkLoader.LoadAllBookmarks(_settings);
_ = MonitorRefreshQueueAsync();
_initialized = true;
From ed148267de6bce771b554b647b64d45ab507f36d Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 12 May 2025 20:37:37 +0800
Subject: [PATCH 1060/1798] Do not show error message for initialization if
plugin is already disabled
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index a3e80a73f..eb775c2f0 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -220,9 +220,17 @@ namespace Flow.Launcher.Core.Plugin
catch (Exception e)
{
API.LogException(ClassName, $"Fail to Init plugin: {pair.Metadata.Name}", e);
- pair.Metadata.Disabled = true;
- pair.Metadata.HomeDisabled = true;
- failedPlugins.Enqueue(pair);
+ if (pair.Metadata.Disabled && pair.Metadata.HomeDisabled)
+ {
+ // If this plugin is already disabled, do not show error message again
+ // Or else it will be shown every time
+ }
+ else
+ {
+ pair.Metadata.Disabled = true;
+ pair.Metadata.HomeDisabled = true;
+ failedPlugins.Enqueue(pair);
+ }
}
}));
From b96a69a5b636c91ff00b681adad785446b98f5c4 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 12 May 2025 22:03:00 +0800
Subject: [PATCH 1061/1798] Fix Window Positioning with Multiple Montiors
Co-authored-by: onesounds
---
.../UserSettings/Settings.cs | 4 +
Flow.Launcher/MainWindow.xaml.cs | 87 +++++++++++++++++--
Flow.Launcher/SettingWindow.xaml.cs | 30 ++++++-
3 files changed, 109 insertions(+), 12 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 34bf4f90e..ce1269a29 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -293,6 +293,10 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public double WindowLeft { get; set; }
public double WindowTop { get; set; }
+ public double PreviousScreenWidth { get; set; }
+ public double PreviousScreenHeight { get; set; }
+ public double PreviousDpiX { get; set; }
+ public double PreviousDpiY { get; set; }
///
/// Custom left position on selected monitor
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 46eeb2adc..230472d88 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -711,8 +711,26 @@ namespace Flow.Launcher
{
if (_settings.SearchWindowScreen == SearchWindowScreens.RememberLastLaunchLocation)
{
- Top = _settings.WindowTop;
+ var previousScreenWidth = _settings.PreviousScreenWidth;
+ var previousScreenHeight = _settings.PreviousScreenHeight;
+ GetDpi(out var previousDpiX, out var previousDpiY);
+
+ _settings.PreviousScreenWidth = SystemParameters.VirtualScreenWidth;
+ _settings.PreviousScreenHeight = SystemParameters.VirtualScreenHeight;
+ GetDpi(out var currentDpiX, out var currentDpiY);
+
+ if (previousScreenWidth != 0 && previousScreenHeight != 0 &&
+ previousDpiX != 0 && previousDpiY != 0 &&
+ (previousScreenWidth != SystemParameters.VirtualScreenWidth ||
+ previousScreenHeight != SystemParameters.VirtualScreenHeight ||
+ previousDpiX != currentDpiX || previousDpiY != currentDpiY))
+ {
+ AdjustPositionForResolutionChange();
+ return;
+ }
+
Left = _settings.WindowLeft;
+ Top = _settings.WindowTop;
}
else
{
@@ -725,27 +743,73 @@ namespace Flow.Launcher
break;
case SearchWindowAligns.CenterTop:
Left = HorizonCenter(screen);
- Top = 10;
+ Top = VerticalTop(screen);
break;
case SearchWindowAligns.LeftTop:
Left = HorizonLeft(screen);
- Top = 10;
+ Top = VerticalTop(screen);
break;
case SearchWindowAligns.RightTop:
Left = HorizonRight(screen);
- Top = 10;
+ Top = VerticalTop(screen);
break;
case SearchWindowAligns.Custom:
- Left = Win32Helper.TransformPixelsToDIP(this,
- screen.WorkingArea.X + _settings.CustomWindowLeft, 0).X;
- Top = Win32Helper.TransformPixelsToDIP(this, 0,
- screen.WorkingArea.Y + _settings.CustomWindowTop).Y;
+ var customLeft = Win32Helper.TransformPixelsToDIP(this,
+ screen.WorkingArea.X + _settings.CustomWindowLeft, 0);
+ var customTop = Win32Helper.TransformPixelsToDIP(this, 0,
+ screen.WorkingArea.Y + _settings.CustomWindowTop);
+ Left = customLeft.X;
+ Top = customTop.Y;
break;
}
}
}
}
+ private void AdjustPositionForResolutionChange()
+ {
+ var screenWidth = SystemParameters.VirtualScreenWidth;
+ var screenHeight = SystemParameters.VirtualScreenHeight;
+ GetDpi(out var currentDpiX, out var currentDpiY);
+
+ var previousLeft = _settings.WindowLeft;
+ var previousTop = _settings.WindowTop;
+ GetDpi(out var previousDpiX, out var previousDpiY);
+
+ var widthRatio = screenWidth / _settings.PreviousScreenWidth;
+ var heightRatio = screenHeight / _settings.PreviousScreenHeight;
+ var dpiXRatio = currentDpiX / previousDpiX;
+ var dpiYRatio = currentDpiY / previousDpiY;
+
+ var newLeft = previousLeft * widthRatio * dpiXRatio;
+ var newTop = previousTop * heightRatio * dpiYRatio;
+
+ var screenLeft = SystemParameters.VirtualScreenLeft;
+ var screenTop = SystemParameters.VirtualScreenTop;
+
+ var maxX = screenLeft + screenWidth - ActualWidth;
+ var maxY = screenTop + screenHeight - ActualHeight;
+
+ Left = Math.Max(screenLeft, Math.Min(newLeft, maxX));
+ Top = Math.Max(screenTop, Math.Min(newTop, maxY));
+ }
+
+ private void GetDpi(out double dpiX, out double dpiY)
+ {
+ var source = PresentationSource.FromVisual(this);
+ if (source != null && source.CompositionTarget != null)
+ {
+ var matrix = source.CompositionTarget.TransformToDevice;
+ dpiX = 96 * matrix.M11;
+ dpiY = 96 * matrix.M22;
+ }
+ else
+ {
+ dpiX = 96;
+ dpiY = 96;
+ }
+ }
+
private Screen SelectedScreen()
{
Screen screen;
@@ -806,6 +870,13 @@ namespace Flow.Launcher
return left;
}
+ public double VerticalTop(Screen screen)
+ {
+ var dip1 = Win32Helper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
+ var top = dip1.Y + 10;
+ return top;
+ }
+
#endregion
#region Window Animation
diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs
index 79bd171ed..cf84317ac 100644
--- a/Flow.Launcher/SettingWindow.xaml.cs
+++ b/Flow.Launcher/SettingWindow.xaml.cs
@@ -137,18 +137,40 @@ public partial class SettingWindow
if (previousTop == null || previousLeft == null || !IsPositionValid(previousTop.Value, previousLeft.Value))
{
- Top = WindowTop();
- Left = WindowLeft();
+ SetWindowPosition(WindowTop(), WindowLeft());
}
else
{
- Top = previousTop.Value;
- Left = previousLeft.Value;
+ var left = _settings.SettingWindowLeft.Value;
+ var top = _settings.SettingWindowTop.Value;
+ AdjustWindowPosition(ref top, ref left);
+ SetWindowPosition(top, left);
}
WindowState = _settings.SettingWindowState;
}
+ private void SetWindowPosition(double top, double left)
+ {
+ // Ensure window does not exceed screen boundaries
+ top = Math.Max(top, SystemParameters.VirtualScreenTop);
+ left = Math.Max(left, SystemParameters.VirtualScreenLeft);
+ top = Math.Min(top, SystemParameters.VirtualScreenHeight - ActualHeight);
+ left = Math.Min(left, SystemParameters.VirtualScreenWidth - ActualWidth);
+
+ Top = top;
+ Left = left;
+ }
+
+ private void AdjustWindowPosition(ref double top, ref double left)
+ {
+ // Adjust window position if it exceeds screen boundaries
+ top = Math.Max(top, SystemParameters.VirtualScreenTop);
+ left = Math.Max(left, SystemParameters.VirtualScreenLeft);
+ top = Math.Min(top, SystemParameters.VirtualScreenHeight - ActualHeight);
+ left = Math.Min(left, SystemParameters.VirtualScreenWidth - ActualWidth);
+ }
+
private static bool IsPositionValid(double top, double left)
{
foreach (var screen in Screen.AllScreens)
From 7509a86cbfde81f7a0696049b2e0438e6bff4f9a Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 09:47:46 +0800
Subject: [PATCH 1062/1798] Use skip message for failed initialization when
plugin is already disabled
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index eb775c2f0..c9d13b61d 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -219,17 +219,18 @@ namespace Flow.Launcher.Core.Plugin
}
catch (Exception e)
{
- API.LogException(ClassName, $"Fail to Init plugin: {pair.Metadata.Name}", e);
if (pair.Metadata.Disabled && pair.Metadata.HomeDisabled)
{
// If this plugin is already disabled, do not show error message again
// Or else it will be shown every time
+ API.LogDebug(ClassName, $"Skip init for <{pair.Metadata.Name}>");
}
else
{
pair.Metadata.Disabled = true;
pair.Metadata.HomeDisabled = true;
failedPlugins.Enqueue(pair);
+ API.LogException(ClassName, $"Fail to Init plugin: {pair.Metadata.Name}", e);
}
}
}));
From 810f7bb4a79e76f6c8a950240113500199948702 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 09:58:24 +0800
Subject: [PATCH 1063/1798] Add disable information
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index c9d13b61d..690fda011 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -219,6 +219,7 @@ namespace Flow.Launcher.Core.Plugin
}
catch (Exception e)
{
+ API.LogException(ClassName, $"Fail to Init plugin: {pair.Metadata.Name}", e);
if (pair.Metadata.Disabled && pair.Metadata.HomeDisabled)
{
// If this plugin is already disabled, do not show error message again
@@ -230,7 +231,7 @@ namespace Flow.Launcher.Core.Plugin
pair.Metadata.Disabled = true;
pair.Metadata.HomeDisabled = true;
failedPlugins.Enqueue(pair);
- API.LogException(ClassName, $"Fail to Init plugin: {pair.Metadata.Name}", e);
+ API.LogDebug(ClassName, $"Disable plugin <{pair.Metadata.Name}> because init failed");
}
}
}));
From 58f80996b7691ad8e59d0b8a3b5e20717653f6e8 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 10:36:46 +0800
Subject: [PATCH 1064/1798] Fix results context menu display issue
---
.../ViewModels/SettingsPaneThemeViewModel.cs | 2 +-
Flow.Launcher/ViewModel/MainViewModel.cs | 12 +++++++++---
Flow.Launcher/ViewModel/ResultsViewModel.cs | 16 +++++++++++++---
3 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
index d542eb019..f1f3e22c6 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
@@ -479,7 +479,7 @@ public partial class SettingsPaneThemeViewModel : BaseModel
)
}
};
- var vm = new ResultsViewModel(Settings);
+ var vm = new ResultsViewModel(Settings, null);
vm.AddResults(results, "PREVIEW");
PreviewResults = vm;
}
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 401f71ae3..ac339b715 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -148,19 +148,19 @@ namespace Flow.Launcher.ViewModel
_userSelectedRecord = _userSelectedRecordStorage.Load();
_topMostRecord = _topMostRecordStorage.Load();
- ContextMenu = new ResultsViewModel(Settings)
+ ContextMenu = new ResultsViewModel(Settings, this)
{
LeftClickResultCommand = OpenResultCommand,
RightClickResultCommand = LoadContextMenuCommand,
IsPreviewOn = Settings.AlwaysPreview
};
- Results = new ResultsViewModel(Settings)
+ Results = new ResultsViewModel(Settings, this)
{
LeftClickResultCommand = OpenResultCommand,
RightClickResultCommand = LoadContextMenuCommand,
IsPreviewOn = Settings.AlwaysPreview
};
- History = new ResultsViewModel(Settings)
+ History = new ResultsViewModel(Settings, this)
{
LeftClickResultCommand = OpenResultCommand,
RightClickResultCommand = LoadContextMenuCommand,
@@ -1662,6 +1662,12 @@ namespace Flow.Launcher.ViewModel
return selected;
}
+ internal bool ResultsSelected(ResultsViewModel results)
+ {
+ var selected = SelectedResults == results;
+ return selected;
+ }
+
#endregion
#region Hotkey
diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs
index cd2736afa..799546808 100644
--- a/Flow.Launcher/ViewModel/ResultsViewModel.cs
+++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs
@@ -21,6 +21,7 @@ namespace Flow.Launcher.ViewModel
private readonly object _collectionLock = new();
private readonly Settings _settings;
+ private readonly MainViewModel _mainVM;
private int MaxResults => _settings?.MaxResultsToShow ?? 6;
public ResultsViewModel()
@@ -29,9 +30,10 @@ namespace Flow.Launcher.ViewModel
BindingOperations.EnableCollectionSynchronization(Results, _collectionLock);
}
- public ResultsViewModel(Settings settings) : this()
+ public ResultsViewModel(Settings settings, MainViewModel mainVM) : this()
{
_settings = settings;
+ _mainVM = mainVM;
_settings.PropertyChanged += (s, e) =>
{
switch (e.PropertyName)
@@ -179,6 +181,7 @@ namespace Flow.Launcher.ViewModel
UpdateResults(newResults);
}
+
///
/// To avoid deadlock, this method should not called from main thread
///
@@ -202,11 +205,18 @@ namespace Flow.Launcher.ViewModel
SelectedItem = Results[0];
}
+ if (token.IsCancellationRequested)
+ return;
+
switch (Visibility)
{
case Visibility.Collapsed when Results.Count > 0:
- SelectedIndex = 0;
- Visibility = Visibility.Visible;
+ // Show it only if the results are selected
+ if (_mainVM == null || _mainVM.ResultsSelected(this))
+ {
+ SelectedIndex = 0;
+ Visibility = Visibility.Visible;
+ }
break;
case Visibility.Visible when Results.Count == 0:
Visibility = Visibility.Collapsed;
From fa350ddb0779f70d2fa0fbd0f7bf37c84c110638 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 10:48:00 +0800
Subject: [PATCH 1065/1798] Add code comments
---
Flow.Launcher/ViewModel/ResultsViewModel.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs
index 799546808..b91bf0f30 100644
--- a/Flow.Launcher/ViewModel/ResultsViewModel.cs
+++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs
@@ -211,8 +211,8 @@ namespace Flow.Launcher.ViewModel
switch (Visibility)
{
case Visibility.Collapsed when Results.Count > 0:
- // Show it only if the results are selected
- if (_mainVM == null || _mainVM.ResultsSelected(this))
+ if (_mainVM == null || // The results is for preview only in apprerance page
+ _mainVM.ResultsSelected(this)) // The results are selected
{
SelectedIndex = 0;
Visibility = Visibility.Visible;
From 8e7e1738507a0f99f75f5b7898743d8b6bf66821 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 10:49:40 +0800
Subject: [PATCH 1066/1798] Add code comments
---
.../SettingPages/ViewModels/SettingsPaneThemeViewModel.cs | 1 +
Flow.Launcher/ViewModel/ResultsViewModel.cs | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
index f1f3e22c6..07d70a67c 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
@@ -479,6 +479,7 @@ public partial class SettingsPaneThemeViewModel : BaseModel
)
}
};
+ // Set main view model to null because this results are for preview only
var vm = new ResultsViewModel(Settings, null);
vm.AddResults(results, "PREVIEW");
PreviewResults = vm;
diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs
index b91bf0f30..0dc1b85c4 100644
--- a/Flow.Launcher/ViewModel/ResultsViewModel.cs
+++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs
@@ -211,7 +211,7 @@ namespace Flow.Launcher.ViewModel
switch (Visibility)
{
case Visibility.Collapsed when Results.Count > 0:
- if (_mainVM == null || // The results is for preview only in apprerance page
+ if (_mainVM == null || // The results are for preview only in apprerance page
_mainVM.ResultsSelected(this)) // The results are selected
{
SelectedIndex = 0;
From 03b558c1fc0947d6994f0c71d5ae002f50e52123 Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Tue, 13 May 2025 10:51:44 +0800
Subject: [PATCH 1067/1798] Fix typos
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
Flow.Launcher/ViewModel/ResultsViewModel.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs
index 0dc1b85c4..b100bba25 100644
--- a/Flow.Launcher/ViewModel/ResultsViewModel.cs
+++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs
@@ -211,7 +211,7 @@ namespace Flow.Launcher.ViewModel
switch (Visibility)
{
case Visibility.Collapsed when Results.Count > 0:
- if (_mainVM == null || // The results are for preview only in apprerance page
+ if (_mainVM == null || // The results are for preview only in appearance page
_mainVM.ResultsSelected(this)) // The results are selected
{
SelectedIndex = 0;
From a73ff5f1227598231420e7778a0f76ded73a9c14 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Tue, 13 May 2025 13:07:49 +1000
Subject: [PATCH 1068/1798] update comment
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index 690fda011..aae8dd764 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -224,7 +224,7 @@ namespace Flow.Launcher.Core.Plugin
{
// If this plugin is already disabled, do not show error message again
// Or else it will be shown every time
- API.LogDebug(ClassName, $"Skip init for <{pair.Metadata.Name}>");
+ API.LogDebug(ClassName, $"Skipped init for <{pair.Metadata.Name}> due to error");
}
else
{
From 93a9a92a4068906a67d46178503e09f312cb43a0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 11:11:50 +0800
Subject: [PATCH 1069/1798] Fix typos
---
.../SettingPages/ViewModels/SettingsPaneThemeViewModel.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
index 07d70a67c..79465cd71 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
@@ -479,7 +479,7 @@ public partial class SettingsPaneThemeViewModel : BaseModel
)
}
};
- // Set main view model to null because this results are for preview only
+ // Set main view model to null because the results are for preview only
var vm = new ResultsViewModel(Settings, null);
vm.AddResults(results, "PREVIEW");
PreviewResults = vm;
From e0ac6d5feed2b4f86e7cfcf19a476506d538b362 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 12:49:35 +0800
Subject: [PATCH 1070/1798] Improve Program plugin delete button logic
---
.../Languages/en.xaml | 1 +
.../Views/ProgramSetting.xaml | 6 ++
.../Views/ProgramSetting.xaml.cs | 72 ++++++++++++-------
3 files changed, 54 insertions(+), 25 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
index ee6b4379d..c19347f2a 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
@@ -48,6 +48,7 @@
Please select a program sourceAre you sure you want to delete the selected program sources?
+ Please select program sources that you addedAnother program source with the same location already exists.Program Source
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml
index 5c0ba8d0b..3bf1c6ad1 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml
@@ -203,6 +203,12 @@
Margin="{StaticResource SettingPanelItemLeftTopBottomMargin}"
Click="btnEditProgramSource_OnClick"
Content="{DynamicResource flowlauncher_plugin_program_edit}" />
+ 0
@@ -141,6 +142,7 @@ namespace Flow.Launcher.Plugin.Program.Views
{
btnProgramSourceStatus.Visibility = Visibility.Visible;
btnEditProgramSource.Visibility = Visibility.Visible;
+ btnDeleteProgramSource.Visibility = Visibility.Visible;
}
programSourceView.Items.Refresh();
@@ -270,8 +272,8 @@ namespace Flow.Launcher.Plugin.Program.Views
if (directoriesToAdd.Count > 0)
{
- directoriesToAdd.ForEach(x => _settings.ProgramSources.Add(x));
- directoriesToAdd.ForEach(x => ProgramSettingDisplayList.Add(x));
+ directoriesToAdd.ForEach(_settings.ProgramSources.Add);
+ directoriesToAdd.ForEach(ProgramSettingDisplayList.Add);
ViewRefresh();
ReIndexing();
@@ -296,24 +298,12 @@ namespace Flow.Launcher.Plugin.Program.Views
if (selectedItems.Count == 0)
{
- string msg = context.API.GetTranslation("flowlauncher_plugin_program_pls_select_program_source");
+ var msg = context.API.GetTranslation("flowlauncher_plugin_program_pls_select_program_source");
context.API.ShowMsgBox(msg);
return;
}
- if (IsAllItemsUserAdded(selectedItems))
- {
- var msg = string.Format(
- context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source"));
-
- if (context.API.ShowMsgBox(msg, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
- {
- return;
- }
-
- DeleteProgramSources(selectedItems);
- }
- else if (HasMoreOrEqualEnabledItems(selectedItems))
+ if (HasMoreOrEqualEnabledItems(selectedItems))
{
await ProgramSettingDisplay.SetProgramSourcesStatusAsync(selectedItems, false);
@@ -341,10 +331,9 @@ namespace Flow.Launcher.Plugin.Program.Views
private void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
{
- var headerClicked = e.OriginalSource as GridViewColumnHeader;
ListSortDirection direction;
- if (headerClicked != null)
+ if (e.OriginalSource is GridViewColumnHeader headerClicked)
{
if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
{
@@ -397,11 +386,7 @@ namespace Flow.Launcher.Plugin.Program.Views
.SelectedItems.Cast()
.ToList();
- if (IsAllItemsUserAdded(selectedItems))
- {
- btnProgramSourceStatus.Content = context.API.GetTranslation("flowlauncher_plugin_program_delete");
- }
- else if (HasMoreOrEqualEnabledItems(selectedItems))
+ if (HasMoreOrEqualEnabledItems(selectedItems))
{
btnProgramSourceStatus.Content = context.API.GetTranslation("flowlauncher_plugin_program_disable");
}
@@ -420,6 +405,43 @@ namespace Flow.Launcher.Plugin.Program.Views
}
}
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
+ private async void btnDeleteProgramSource_OnClick(object sender, RoutedEventArgs e)
+ {
+ var selectedItems = programSourceView
+ .SelectedItems.Cast()
+ .ToList();
+
+ if (selectedItems.Count == 0)
+ {
+ var msg = context.API.GetTranslation("flowlauncher_plugin_program_pls_select_program_source");
+ context.API.ShowMsgBox(msg);
+ return;
+ }
+
+ if (!IsAllItemsUserAdded(selectedItems))
+ {
+ var msg1 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source_not_user_added");
+ context.API.ShowMsgBox(msg1);
+ return;
+ }
+
+ var msg2 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source");
+ if (context.API.ShowMsgBox(msg2, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
+ {
+ return;
+ }
+
+ DeleteProgramSources(selectedItems);
+
+ if (await selectedItems.IsReindexRequiredAsync())
+ ReIndexing();
+
+ programSourceView.SelectedItems.Clear();
+
+ ViewRefresh();
+ }
+
private bool IsAllItemsUserAdded(List items)
{
return items.All(x => _settings.ProgramSources.Any(y => y.UniqueIdentifier == x.UniqueIdentifier));
@@ -427,8 +449,8 @@ namespace Flow.Launcher.Plugin.Program.Views
private void ListView_SizeChanged(object sender, SizeChangedEventArgs e)
{
- ListView listView = sender as ListView;
- GridView gView = listView.View as GridView;
+ var listView = sender as ListView;
+ var gView = listView.View as GridView;
var workingWidth =
listView.ActualWidth - SystemParameters.VerticalScrollBarWidth; // take into account vertical scrollbar
From 284729afb5ef3e5450f15e5f278612d3c4f5a3d7 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 13:01:24 +0800
Subject: [PATCH 1071/1798] Improve message noticification
---
Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml | 3 ++-
.../Views/ProgramSetting.xaml.cs | 7 +++++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
index c19347f2a..bf6de50fe 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
@@ -48,7 +48,8 @@
Please select a program sourceAre you sure you want to delete the selected program sources?
- Please select program sources that you added
+ Please select program sources that are not added by you
+ Please select program sources that are added by youAnother program source with the same location already exists.Program Source
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
index 71879181e..59ee40c12 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
@@ -303,6 +303,13 @@ namespace Flow.Launcher.Plugin.Program.Views
return;
}
+ if (IsAllItemsUserAdded(selectedItems))
+ {
+ var msg1 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source_not_user_added");
+ context.API.ShowMsgBox(msg1);
+ return;
+ }
+
if (HasMoreOrEqualEnabledItems(selectedItems))
{
await ProgramSettingDisplay.SetProgramSourcesStatusAsync(selectedItems, false);
From a0999351697248e1f90a6198eb2bbd5a0eae839c Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 13:03:04 +0800
Subject: [PATCH 1072/1798] Fix message
---
Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml | 4 ++--
.../Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
index bf6de50fe..65fd8951c 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
@@ -48,8 +48,8 @@
Please select a program sourceAre 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
+ Please select program sources that are not added by you
+ Please select program sources that are added by youAnother program source with the same location already exists.Program Source
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
index 59ee40c12..8b19ba81c 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
@@ -428,7 +428,7 @@ namespace Flow.Launcher.Plugin.Program.Views
if (!IsAllItemsUserAdded(selectedItems))
{
- var msg1 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source_not_user_added");
+ var msg1 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source_user_added");
context.API.ShowMsgBox(msg1);
return;
}
From 204d1d285a4cb26b29692588704fba4c9d95270d Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 13:04:26 +0800
Subject: [PATCH 1073/1798] Improve string keys
---
Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml | 4 ++--
.../Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
index 65fd8951c..e551a7dcb 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
@@ -48,8 +48,8 @@
Please select a program sourceAre 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
+ Please select program sources that are not added by you
+ Please select program sources that are added by youAnother program source with the same location already exists.Program Source
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
index 8b19ba81c..6ae1c4422 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
@@ -305,7 +305,7 @@ namespace Flow.Launcher.Plugin.Program.Views
if (IsAllItemsUserAdded(selectedItems))
{
- var msg1 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source_not_user_added");
+ var msg1 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source_select_not_user_added");
context.API.ShowMsgBox(msg1);
return;
}
@@ -428,7 +428,7 @@ namespace Flow.Launcher.Plugin.Program.Views
if (!IsAllItemsUserAdded(selectedItems))
{
- var msg1 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source_user_added");
+ var msg1 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source_select_user_added");
context.API.ShowMsgBox(msg1);
return;
}
From e961ffaa7a8d7dd52ab0dcb66bf081a0eb97c991 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 13:08:20 +0800
Subject: [PATCH 1074/1798] Disable auto restart after plugin install by
default
---
Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
index 811bec50c..f23ff71f0 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
@@ -10,6 +10,6 @@
public bool WarnFromUnknownSource { get; set; } = true;
- public bool AutoRestartAfterChanging { get; set; } = true;
+ public bool AutoRestartAfterChanging { get; set; } = false;
}
}
From 8aa36f38c82a388c386d7e3d86c44798dad632ad Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 21:50:13 +0800
Subject: [PATCH 1075/1798] Add ShowAtTopmost in settings
---
.../UserSettings/Settings.cs | 38 +++++++++++++++----
1 file changed, 30 insertions(+), 8 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 34bf4f90e..3f382c276 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -59,8 +59,11 @@ namespace Flow.Launcher.Infrastructure.UserSettings
get => _language;
set
{
- _language = value;
- OnPropertyChanged();
+ if (_language != value)
+ {
+ _language = value;
+ OnPropertyChanged();
+ }
}
}
public string Theme
@@ -68,7 +71,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
get => _theme;
set
{
- if (value != _theme)
+ if (_theme != value)
{
_theme = value;
OnPropertyChanged();
@@ -283,9 +286,12 @@ namespace Flow.Launcher.Infrastructure.UserSettings
get => _querySearchPrecision;
set
{
- _querySearchPrecision = value;
- if (_stringMatcher != null)
- _stringMatcher.UserSettingSearchPrecision = value;
+ if (_querySearchPrecision != value)
+ {
+ _querySearchPrecision = value;
+ if (_stringMatcher != null)
+ _stringMatcher.UserSettingSearchPrecision = value;
+ }
}
}
@@ -348,12 +354,28 @@ namespace Flow.Launcher.Infrastructure.UserSettings
get => _hideNotifyIcon;
set
{
- _hideNotifyIcon = value;
- OnPropertyChanged();
+ if (_hideNotifyIcon != value)
+ {
+ _hideNotifyIcon = value;
+ OnPropertyChanged();
+ }
}
}
public bool LeaveCmdOpen { get; set; }
public bool HideWhenDeactivated { get; set; } = true;
+ private bool _showAtTopmost;
+ public bool ShowAtTopmost
+ {
+ get => _showAtTopmost;
+ set
+ {
+ if (_showAtTopmost != value)
+ {
+ _showAtTopmost = value;
+ OnPropertyChanged();
+ }
+ }
+ }
public bool SearchQueryResultsWithDelay { get; set; }
public int SearchDelayTime { get; set; } = 150;
From 587ab629aa9b831ba8ed684eb2039dbba6b28ff1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 21:54:03 +0800
Subject: [PATCH 1076/1798] Support changing ShowAtTopmost
---
Flow.Launcher/MainWindow.xaml.cs | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 46eeb2adc..72a990ada 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -84,6 +84,8 @@ namespace Flow.Launcher
_viewModel = Ioc.Default.GetRequiredService();
DataContext = _viewModel;
+ Topmost = _settings.ShowAtTopmost;
+
InitializeComponent();
UpdatePosition();
@@ -283,6 +285,9 @@ namespace Flow.Launcher
_viewModel.QueryResults();
}
break;
+ case nameof(Settings.ShowAtTopmost):
+ Topmost = _settings.ShowAtTopmost;
+ break;
}
};
From 4e88ce3f48b9eae47dc57c595acfe7862b540476 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 22:01:36 +0800
Subject: [PATCH 1077/1798] Set ShowAtTopmost default to true
---
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 3f382c276..7cd3821dc 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -363,7 +363,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
public bool LeaveCmdOpen { get; set; }
public bool HideWhenDeactivated { get; set; } = true;
- private bool _showAtTopmost;
+ private bool _showAtTopmost = true;
public bool ShowAtTopmost
{
get => _showAtTopmost;
From b8f743eb4c2ad44bc89366698a6ee8543d1d5343 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 22:06:04 +0800
Subject: [PATCH 1078/1798] Add ui in general setting page
---
Flow.Launcher/Languages/en.xaml | 2 ++
.../SettingPages/Views/SettingsPaneGeneral.xaml | 11 +++++++++++
2 files changed, 13 insertions(+)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 22ab2016c..f728f1095 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -131,6 +131,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index c0c5613de..fba1b3d86 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -77,6 +77,17 @@
OnContent="{DynamicResource enable}" />
+
+
+
+
From b636f253e65114639dca2aa7d14271d013a993a6 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 13 May 2025 22:52:06 +0800
Subject: [PATCH 1079/1798] Add blank line
---
Flow.Launcher.Infrastructure/UserSettings/Settings.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 7cd3821dc..8dc48f7f2 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -363,6 +363,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
public bool LeaveCmdOpen { get; set; }
public bool HideWhenDeactivated { get; set; } = true;
+
private bool _showAtTopmost = true;
public bool ShowAtTopmost
{
From da770855083b33eb6fab955eda4a06ac052da54f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 14 May 2025 11:37:55 +0800
Subject: [PATCH 1080/1798] Fix logic & Improve code quality
---
.../Views/ProgramSetting.xaml.cs | 22 +++++--------------
1 file changed, 6 insertions(+), 16 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
index 6ae1c4422..9ac447085 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
@@ -298,15 +298,7 @@ namespace Flow.Launcher.Plugin.Program.Views
if (selectedItems.Count == 0)
{
- var msg = context.API.GetTranslation("flowlauncher_plugin_program_pls_select_program_source");
- context.API.ShowMsgBox(msg);
- return;
- }
-
- if (IsAllItemsUserAdded(selectedItems))
- {
- var msg1 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source_select_not_user_added");
- context.API.ShowMsgBox(msg1);
+ context.API.ShowMsgBox(context.API.GetTranslation("flowlauncher_plugin_program_pls_select_program_source"));
return;
}
@@ -376,7 +368,7 @@ namespace Flow.Launcher.Plugin.Program.Views
var dataView = CollectionViewSource.GetDefaultView(programSourceView.ItemsSource);
dataView.SortDescriptions.Clear();
- SortDescription sd = new SortDescription(sortBy, direction);
+ var sd = new SortDescription(sortBy, direction);
dataView.SortDescriptions.Add(sd);
dataView.Refresh();
}
@@ -421,20 +413,18 @@ namespace Flow.Launcher.Plugin.Program.Views
if (selectedItems.Count == 0)
{
- var msg = context.API.GetTranslation("flowlauncher_plugin_program_pls_select_program_source");
- context.API.ShowMsgBox(msg);
+ context.API.ShowMsgBox(context.API.GetTranslation("flowlauncher_plugin_program_pls_select_program_source"));
return;
}
if (!IsAllItemsUserAdded(selectedItems))
{
- var msg1 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source_select_user_added");
- context.API.ShowMsgBox(msg1);
+ context.API.ShowMsgBox(context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source_select_user_added"));
return;
}
- var msg2 = context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source");
- if (context.API.ShowMsgBox(msg2, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
+ if (context.API.ShowMsgBox(context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source"),
+ string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
{
return;
}
From f0aa285199266843b447635a1cafa8aa5f0c97bd Mon Sep 17 00:00:00 2001
From: DB P
Date: Wed, 14 May 2025 12:50:45 +0900
Subject: [PATCH 1081/1798] Add theme change handler to refresh frame on
application theme change
---
Flow.Launcher/MainWindow.xaml.cs | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 46eeb2adc..0b7ebf148 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -89,7 +89,7 @@ namespace Flow.Launcher
InitSoundEffects();
DataObject.AddPastingHandler(QueryTextBox, QueryTextBox_OnPaste);
-
+ ModernWpf.ThemeManager.Current.ActualApplicationThemeChanged += ThemeManager_ActualApplicationThemeChanged;
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
}
@@ -543,6 +543,10 @@ namespace Flow.Launcher
#region Window Sound Effects
+ private void ThemeManager_ActualApplicationThemeChanged(ModernWpf.ThemeManager sender, object args)
+ {
+ _theme.RefreshFrameAsync();
+ }
private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
// Fix for sound not playing after sleep / hibernate
From 1e51bdc37b147cd4c9125951e7953d28da7142e0 Mon Sep 17 00:00:00 2001
From: DB P
Date: Wed, 14 May 2025 13:03:31 +0900
Subject: [PATCH 1082/1798] Unsubscribe from theme change event to prevent
memory leaks
---
Flow.Launcher/MainWindow.xaml.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 0b7ebf148..ab26d417c 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -1184,6 +1184,7 @@ namespace Flow.Launcher
_notifyIcon?.Dispose();
animationSoundWMP?.Close();
animationSoundWPF?.Dispose();
+ ModernWpf.ThemeManager.Current.ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged;
SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
}
From c128a667722ece5c67b3370765a0c2d5e83bc9f3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 14 May 2025 12:09:18 +0800
Subject: [PATCH 1083/1798] Manage handle in dispose
---
Flow.Launcher/MainWindow.xaml.cs | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 0b7ebf148..4465c8e33 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -99,6 +99,11 @@ namespace Flow.Launcher
#pragma warning disable VSTHRD100 // Avoid async void methods
+ private void ThemeManager_ActualApplicationThemeChanged(ModernWpf.ThemeManager sender, object args)
+ {
+ _theme.RefreshFrameAsync();
+ }
+
private void OnSourceInitialized(object sender, EventArgs e)
{
var handle = Win32Helper.GetWindowHandle(this, true);
@@ -543,10 +548,6 @@ namespace Flow.Launcher
#region Window Sound Effects
- private void ThemeManager_ActualApplicationThemeChanged(ModernWpf.ThemeManager sender, object args)
- {
- _theme.RefreshFrameAsync();
- }
private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
// Fix for sound not playing after sleep / hibernate
@@ -1184,6 +1185,7 @@ namespace Flow.Launcher
_notifyIcon?.Dispose();
animationSoundWMP?.Close();
animationSoundWPF?.Dispose();
+ ModernWpf.ThemeManager.Current.ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged;
SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
}
From 8325963047c112e9762cf1ab25089bd11d563a90 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 14 May 2025 14:23:35 +0800
Subject: [PATCH 1084/1798] Fix size changed width issue
---
.../Views/ProgramSetting.xaml.cs | 3 +++
Plugins/Flow.Launcher.Plugin.Sys/SysSettings.xaml.cs | 11 +++++------
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
index deb110698..57c1542e4 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
@@ -432,6 +432,9 @@ namespace Flow.Launcher.Plugin.Program.Views
var workingWidth =
listView.ActualWidth - SystemParameters.VerticalScrollBarWidth; // take into account vertical scrollbar
+
+ if (workingWidth <= 0) return;
+
var col1 = 0.25;
var col2 = 0.15;
var col3 = 0.60;
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/SysSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Sys/SysSettings.xaml.cs
index 0a38fda04..1a8621eeb 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/SysSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/SysSettings.xaml.cs
@@ -21,16 +21,15 @@ namespace Flow.Launcher.Plugin.Sys
ListView listView = sender as ListView;
GridView gView = listView.View as GridView;
- var workingWidth = listView.ActualWidth - SystemParameters.VerticalScrollBarWidth; // take into account vertical scrollbar
+ var workingWidth =
+ listView.ActualWidth - SystemParameters.VerticalScrollBarWidth; // take into account vertical scrollbar
+
+ if (workingWidth <= 0) return;
+
var col1 = 0.2;
var col2 = 0.6;
var col3 = 0.2;
- if (workingWidth <= 0)
- {
- return;
- }
-
gView.Columns[0].Width = workingWidth * col1;
gView.Columns[1].Width = workingWidth * col2;
gView.Columns[2].Width = workingWidth * col3;
From e417a1d3a6eed686eef4934b7c0bbde05cc26303 Mon Sep 17 00:00:00 2001
From: DB P
Date: Thu, 15 May 2025 16:42:11 +0900
Subject: [PATCH 1085/1798] 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 1086/1798] 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 1087/1798] 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 1088/1798] 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 1089/1798] 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 1090/1798] 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 1091/1798] 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 1092/1798] 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 1093/1798] 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 1094/1798] 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 1095/1798] 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 1096/1798] 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 1097/1798] 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 1098/1798] 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 1099/1798] 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 1100/1798] 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 1101/1798] 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 1102/1798] 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 1103/1798] 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 1104/1798] 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 1105/1798] 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
AnulujAktualizacja 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ć zrestartowanyNastępujące pliki zostaną zaktualizowaneAktualizuj plikiOpis 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 cestuZkopírovat cestu k aktuální položce do schránky
+ Copy name
+ Copy name of current item to clipboardKopírovatKopírovat aktuální soubor do schránkyKopí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 pathCopy path of current item to clipboard
+ Copy name
+ Copy name of current item to clipboardCopyCopy current file to clipboardCopy 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 kopierenPfad des aktuellen Elements in Zwischenablage kopieren
+ Copy name
+ Copy name of current item to clipboardKopierenAktuelle Datei in Zwischenablage kopierenAktuellen 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 pathCopy path of current item to clipboard
+ Copy name
+ Copy name of current item to clipboardCopyCopy current file to clipboardCopy 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 rutaCopia la ruta del elemento actual al portapapeles
+ Copiar nombre
+ Copiar nombre del elemento actual al portapapelesCopiarCopia el archivo actual al portapapelesCopia 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 cheminCopier 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-papiersCopierCopier le fichier actuel dans le presse-papiersCopier 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 percorsoCopia negli appunti il percorso dell'elemento corrente
+ Copy name
+ Copy name of current item to clipboardCopiaCopia file corrente negli appuntiCopia 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 stiKopier sti til gjeldende element til utklippstavlen
+ Copy name
+ Copy name of current item to clipboardKopierKopier gjeldende fil til utklippstavlenKopier 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 pathCopy path of current item to clipboard
+ Copy name
+ Copy name of current item to clipboardCopyCopy current file to clipboardCopy 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 clipboardKopiujKopiuj bieżący plik do schowkaKopiuj 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 pathCopy path of current item to clipboard
+ Copy name
+ Copy name of current item to clipboardCopiarCopy current file to clipboardCopy 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 caminhoCopiar caminho do item atual para área de transferência
+ Copiar nome
+ Copiar nome do item para a área de transferênciaCopiarCopiar ficheiro atual para a área de transferênciaCopiar 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 clipboardCopy 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ť cestuSkopírovať cestu k aktuálnej položke do schránky
+ Kopírovať názov
+ Skopírovať názov aktuálnej položky do schránkyKopírovaťSkopírovať aktuálny súbor do schránkySkopí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 pathCopy path of current item to clipboard
+ Copy name
+ Copy name of current item to clipboardCopyCopy current file to clipboardCopy 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 kopyalaMevcut dosya konumunu panoya kopyala
+ Copy name
+ Copy name of current item to clipboardKopyalaMevcut dosyayı panoya kopyalaMevcut 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ẫnSao chép đường dẫn của mục hiện tại vào clipboard
+ Copy name
+ Copy name of current item to clipboardSao chépSao chép tập tin hiện tại vào clipboardCopy 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 clipboardCopy 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 programuJste 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 youJiž 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 sourceAre 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 youAnother 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 ausSind 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 youEine 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 sourceAre 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 youAnother 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 youYa 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êmeIl 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 programmaSei 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 youAnother 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 sourceAre your sure to delete {0}?
+ Please select program sources that are not added by you
+ Please select program sources that are added by youAnother 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 youAnother 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 programkildeEr 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 youDet 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 sourceAre 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 youAnother 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 programuCzy 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 youInne ź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 sourceAre 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 youAnother 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 programasTem 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 siJá 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 programuNaozaj chcete odstrániť vybrané zdroje programov?
+ Vyberte zdroje programov, ktoré ste nepridali vy
+ Vyberte zdroje programov, ktoré ste pridali vyIný 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 sourceAre 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 youAnother 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 youAnother 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ệuBạ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 youAnother 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 1106/1798] 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 1107/1798] 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 1108/1798] 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 1109/1798] 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 1110/1798] 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 1111/1798] 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 1112/1798] 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 PathArg For FolderArg For File
+ The path for the file manager '{0}' could not be found: {1}\n\nDo you want to continue?
+ File Manager Path ErrorDefault 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 1113/1798] 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 1114/1798] 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 PathArg For FolderArg 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 @@
+
-
-
+
+
+ Fill="{StaticResource SeparatorForeground}" />
+ {
+ Process.Start(new ProcessStartInfo
+ {
+ FileName = args.Uri.AbsoluteUri,
+ UseShellExecute = true
+ });
+ args.Handled = true;
+ };
+
+ textBlock.Inlines.Add(hyperlink);
+
+ var tipsDialog = new ContentDialog()
+ {
+ Owner = Window.GetWindow(sender as DependencyObject),
+ Title = (string)Application.Current.Resources["fileManager_files_btn"],
+ Content = textBlock,
+ PrimaryButtonText = (string)Application.Current.Resources["commonOK"],
+ CornerRadius = new CornerRadius(8),
+ Style = (Style)Application.Current.Resources["ContentDialog"]
+ };
+
+ await tipsDialog.ShowAsync();
+ }
+
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
CustomExplorers.Add(new()
From f26226393488f7b03d711d18deca7d3a46ef8e6b Mon Sep 17 00:00:00 2001
From: DB p
Date: Tue, 20 May 2025 22:07:41 +0900
Subject: [PATCH 1115/1798] Add hyperlink to learn more about file manager
usage in settings dialog
---
Flow.Launcher/Languages/en.xaml | 1 +
Flow.Launcher/SelectFileManagerWindow.xaml | 19 +++++++++++++------
Flow.Launcher/SelectFileManagerWindow.xaml.cs | 10 ++++++++++
3 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 186f6bd3e..7d1635bab 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -367,6 +367,7 @@
Select File ManagerDo you use Files?
+ Learn moreDepending 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.
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml b/Flow.Launcher/SelectFileManagerWindow.xaml
index fbdc2c3b2..5e01a4a5f 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml
@@ -73,12 +73,19 @@
-
+
+
+
+
+
+
+
+
Date: Tue, 20 May 2025 21:35:26 +0800
Subject: [PATCH 1116/1798] Remove unused function
---
Flow.Launcher/MessageBoxEx.xaml.cs | 3 ---
1 file changed, 3 deletions(-)
diff --git a/Flow.Launcher/MessageBoxEx.xaml.cs b/Flow.Launcher/MessageBoxEx.xaml.cs
index a55aeb811..c084b5149 100644
--- a/Flow.Launcher/MessageBoxEx.xaml.cs
+++ b/Flow.Launcher/MessageBoxEx.xaml.cs
@@ -22,9 +22,6 @@ namespace Flow.Launcher
InitializeComponent();
}
- public static MessageBoxResult Show(string messageBoxText)
- => Show(messageBoxText, string.Empty, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.OK);
-
public static MessageBoxResult Show(
string messageBoxText,
string caption = "",
From 3beb4e9c56b3a631b62f16c74cb423384bae753f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 20 May 2025 21:37:06 +0800
Subject: [PATCH 1117/1798] Use api functions instead
---
Flow.Launcher/PublicAPIInstance.cs | 4 ++--
Flow.Launcher/SelectFileManagerWindow.xaml.cs | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index 84448a685..6516388ac 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -356,7 +356,7 @@ namespace Flow.Launcher
catch (System.ComponentModel.Win32Exception ex) when (ex.NativeErrorCode == 2)
{
// File Manager not found
- MessageBoxEx.Show(
+ ShowMsgBox(
string.Format(GetTranslation("fileManagerNotFound"), ex.Message),
GetTranslation("fileManagerNotFoundTitle"),
MessageBoxButton.OK,
@@ -366,7 +366,7 @@ namespace Flow.Launcher
catch (Exception ex)
{
// Other exceptions
- MessageBoxEx.Show(
+ ShowMsgBox(
string.Format(GetTranslation("folderOpenError"), ex.Message),
GetTranslation("errorTitle"),
MessageBoxButton.OK,
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml.cs b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
index 2ab134c85..e77d6f899 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml.cs
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
@@ -61,7 +61,7 @@ namespace Flow.Launcher
// Check if the selected file manager path is valid
if (!IsFileManagerValid(CustomExplorer.Path))
{
- MessageBoxResult result = MessageBoxEx.Show(
+ var result = App.API.ShowMsgBox(
string.Format((string)Application.Current.FindResource("fileManagerPathNotFound"),
CustomExplorer.Name, CustomExplorer.Path),
(string)Application.Current.FindResource("fileManagerPathError"),
From af4375b60e194513524340e05a5c03df749a6712 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 20 May 2025 21:42:16 +0800
Subject: [PATCH 1118/1798] Improve code quality
---
Flow.Launcher/SelectFileManagerWindow.xaml.cs | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml.cs b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
index e77d6f899..01517522d 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml.cs
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
@@ -114,10 +114,11 @@ namespace Flow.Launcher
}
}
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
private async void btnTips_Click(object sender, RoutedEventArgs e)
{
- string tipText = (string)Application.Current.Resources["fileManager_files_tips"];
- string url = "https://files.community/docs/contributing/updates";
+ var tipText = (string)Application.Current.Resources["fileManager_files_tips"];
+ var url = "https://files.community/docs/contributing/updates";
var textBlock = new TextBlock
{
@@ -128,7 +129,7 @@ namespace Flow.Launcher
textBlock.Inlines.Add(tipText);
- Hyperlink hyperlink = new Hyperlink
+ var hyperlink = new Hyperlink
{
NavigateUri = new Uri(url)
};
@@ -147,7 +148,7 @@ namespace Flow.Launcher
var tipsDialog = new ContentDialog()
{
- Owner = Window.GetWindow(sender as DependencyObject),
+ Owner = Window.GetWindow((DependencyObject)sender),
Title = (string)Application.Current.Resources["fileManager_files_btn"],
Content = textBlock,
PrimaryButtonText = (string)Application.Current.Resources["commonOK"],
From d23f88d2cb9cd71b0eb24d975ba7251a9dbfeb63 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 20 May 2025 21:44:17 +0800
Subject: [PATCH 1119/1798] Make sure vertically center
---
Flow.Launcher/SelectFileManagerWindow.xaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml b/Flow.Launcher/SelectFileManagerWindow.xaml
index 5e01a4a5f..563fbda53 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml
@@ -76,11 +76,11 @@
-
+
From 5626ab71c730c906c91d69fc04bddb9c38def605 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 20 May 2025 21:57:49 +0800
Subject: [PATCH 1120/1798] Log information when failed to execute
---
Flow.Launcher/PublicAPIInstance.cs | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index 6516388ac..a0614d90f 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -32,11 +32,14 @@ using Flow.Launcher.ViewModel;
using JetBrains.Annotations;
using Squirrel;
using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch;
+using System.ComponentModel;
namespace Flow.Launcher
{
public class PublicAPIInstance : IPublicAPI, IRemovable
{
+ private static readonly string ClassName = nameof(PublicAPIInstance);
+
private readonly Settings _settings;
private readonly MainViewModel _mainVM;
@@ -353,9 +356,9 @@ namespace Flow.Launcher
explorer.Start();
}
- catch (System.ComponentModel.Win32Exception ex) when (ex.NativeErrorCode == 2)
+ catch (Win32Exception ex) when (ex.NativeErrorCode == 2)
{
- // File Manager not found
+ LogError(ClassName, "File Manager not found");
ShowMsgBox(
string.Format(GetTranslation("fileManagerNotFound"), ex.Message),
GetTranslation("fileManagerNotFoundTitle"),
@@ -365,7 +368,7 @@ namespace Flow.Launcher
}
catch (Exception ex)
{
- // Other exceptions
+ LogException(ClassName, "Failed to open folder", ex);
ShowMsgBox(
string.Format(GetTranslation("folderOpenError"), ex.Message),
GetTranslation("errorTitle"),
From 89fdd4815901518b53f4fa15e2feb6ba16102b71 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Wed, 21 May 2025 07:37:14 +1000
Subject: [PATCH 1121/1798] typo
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 7d1635bab..1b72d9045 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -376,7 +376,7 @@
File Manager PathArg For FolderArg For File
- The path for the file manager '{0}' could not be found: '{1}' Do you want to continue?
+ The path for file manager '{0}' could not be found: '{1}' Do you want to continue?File Manager Path Error
From 6e36b08cada0bdbcfc4d897d52aa57f2ec123ebc Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 21 May 2025 11:59:24 +0800
Subject: [PATCH 1122/1798] Use api functions instead
---
Flow.Launcher/SelectFileManagerWindow.xaml.cs | 20 +++++++------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml.cs b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
index 01517522d..62fbef43f 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml.cs
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
@@ -7,6 +7,7 @@ using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
+using System.Windows.Navigation;
using CommunityToolkit.Mvvm.ComponentModel;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.ViewModel;
@@ -33,6 +34,7 @@ namespace Flow.Launcher
public ObservableCollection CustomExplorers { get; set; }
public CustomExplorerViewModel CustomExplorer => CustomExplorers[SelectedCustomExplorerIndex];
+
public SelectFileManagerWindow(Settings settings)
{
_settings = settings;
@@ -46,13 +48,9 @@ namespace Flow.Launcher
Close();
}
- private void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
+ private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
- Process.Start(new ProcessStartInfo
- {
- FileName = e.Uri.AbsoluteUri,
- UseShellExecute = true
- });
+ App.API.OpenUrl(e.Uri.AbsoluteUri);
e.Handled = true;
}
@@ -62,9 +60,9 @@ namespace Flow.Launcher
if (!IsFileManagerValid(CustomExplorer.Path))
{
var result = App.API.ShowMsgBox(
- string.Format((string)Application.Current.FindResource("fileManagerPathNotFound"),
+ string.Format(App.API.GetTranslation("fileManagerPathNotFound"),
CustomExplorer.Name, CustomExplorer.Path),
- (string)Application.Current.FindResource("fileManagerPathError"),
+ App.API.GetTranslation("fileManagerPathError"),
MessageBoxButton.YesNo,
MessageBoxImage.Warning);
@@ -136,11 +134,7 @@ namespace Flow.Launcher
hyperlink.Inlines.Add(url);
hyperlink.RequestNavigate += (s, args) =>
{
- Process.Start(new ProcessStartInfo
- {
- FileName = args.Uri.AbsoluteUri,
- UseShellExecute = true
- });
+ App.API.OpenUrl(args.Uri.AbsoluteUri);
args.Handled = true;
};
From 152ad2f86ae27e28cd84a7c580cec00f37aa8e98 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 21 May 2025 12:04:47 +0800
Subject: [PATCH 1123/1798] Remove setter for observable collection & Add blank
line for code quality
---
Flow.Launcher/SelectBrowserWindow.xaml.cs | 4 +++-
Flow.Launcher/SelectFileManagerWindow.xaml.cs | 3 ++-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/SelectBrowserWindow.xaml.cs b/Flow.Launcher/SelectBrowserWindow.xaml.cs
index bea5b4352..9e692ec72 100644
--- a/Flow.Launcher/SelectBrowserWindow.xaml.cs
+++ b/Flow.Launcher/SelectBrowserWindow.xaml.cs
@@ -23,9 +23,11 @@ namespace Flow.Launcher
OnPropertyChanged(nameof(CustomBrowser));
}
}
- public ObservableCollection CustomBrowsers { get; set; }
+
+ public ObservableCollection CustomBrowsers { get; }
public CustomBrowserViewModel CustomBrowser => CustomBrowsers[SelectedCustomBrowserIndex];
+
public SelectBrowserWindow(Settings settings)
{
_settings = settings;
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml.cs b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
index 62fbef43f..e880f3ada 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml.cs
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
@@ -31,7 +31,8 @@ namespace Flow.Launcher
OnPropertyChanged(nameof(CustomExplorer));
}
}
- public ObservableCollection CustomExplorers { get; set; }
+
+ public ObservableCollection CustomExplorers { get; }
public CustomExplorerViewModel CustomExplorer => CustomExplorers[SelectedCustomExplorerIndex];
From 6ce2cf9cacfe44dd9bec379f7199b3519abf7128 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 21 May 2025 12:58:55 +0800
Subject: [PATCH 1124/1798] Refactor with MVVM
---
Flow.Launcher/App.xaml.cs | 4 +
Flow.Launcher/SelectBrowserWindow.xaml | 7 +-
Flow.Launcher/SelectBrowserWindow.xaml.cs | 57 ++----
Flow.Launcher/SelectFileManagerWindow.xaml | 10 +-
Flow.Launcher/SelectFileManagerWindow.xaml.cs | 166 ++----------------
.../SettingsPaneGeneralViewModel.cs | 4 +-
.../ViewModel/SelectBrowserViewModel.cs | 58 ++++++
.../ViewModel/SelectFileManagerViewModel.cs | 161 +++++++++++++++++
8 files changed, 264 insertions(+), 203 deletions(-)
create mode 100644 Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
create mode 100644 Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 942e94470..969bb75bb 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -98,6 +98,10 @@ namespace Flow.Launcher
.AddTransient()
.AddTransient()
.AddTransient()
+ // Use transient instance for dialog view models because
+ // settings will change and we need to recreate them
+ .AddTransient()
+ .AddTransient()
).Build();
Ioc.Default.ConfigureServices(host.Services);
}
diff --git a/Flow.Launcher/SelectBrowserWindow.xaml b/Flow.Launcher/SelectBrowserWindow.xaml
index 4a0928dc2..d51d597b7 100644
--- a/Flow.Launcher/SelectBrowserWindow.xaml
+++ b/Flow.Launcher/SelectBrowserWindow.xaml
@@ -6,10 +6,11 @@
xmlns:local="clr-namespace:Flow.Launcher"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.modernwpf.com/2019"
+ xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
Title="{DynamicResource defaultBrowserTitle}"
Width="550"
+ d:DataContext="{d:DesignInstance vm:SelectBrowserViewModel}"
Background="{DynamicResource PopuBGColor}"
- DataContext="{Binding RelativeSource={RelativeSource Self}}"
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
SizeToContent="Height"
@@ -97,11 +98,11 @@
diff --git a/Flow.Launcher/SelectBrowserWindow.xaml.cs b/Flow.Launcher/SelectBrowserWindow.xaml.cs
index 9e692ec72..2d200fe98 100644
--- a/Flow.Launcher/SelectBrowserWindow.xaml.cs
+++ b/Flow.Launcher/SelectBrowserWindow.xaml.cs
@@ -1,38 +1,18 @@
-using System.Collections.ObjectModel;
-using System.Linq;
-using System.Windows;
+using System.Windows;
using System.Windows.Controls;
-using CommunityToolkit.Mvvm.ComponentModel;
-using Flow.Launcher.Infrastructure.UserSettings;
+using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.ViewModel;
namespace Flow.Launcher
{
- [INotifyPropertyChanged]
public partial class SelectBrowserWindow : Window
{
- private readonly Settings _settings;
+ private readonly SelectBrowserViewModel _viewModel;
- private int selectedCustomBrowserIndex;
-
- public int SelectedCustomBrowserIndex
+ public SelectBrowserWindow()
{
- get => selectedCustomBrowserIndex;
- set
- {
- selectedCustomBrowserIndex = value;
- OnPropertyChanged(nameof(CustomBrowser));
- }
- }
-
- public ObservableCollection CustomBrowsers { get; }
-
- public CustomBrowserViewModel CustomBrowser => CustomBrowsers[SelectedCustomBrowserIndex];
-
- public SelectBrowserWindow(Settings settings)
- {
- _settings = settings;
- CustomBrowsers = new ObservableCollection(_settings.CustomBrowserList.Select(x => x.Copy()));
- SelectedCustomBrowserIndex = _settings.CustomBrowserIndex;
+ _viewModel = Ioc.Default.GetRequiredService();
+ DataContext = _viewModel;
InitializeComponent();
}
@@ -43,32 +23,19 @@ namespace Flow.Launcher
private void btnDone_Click(object sender, RoutedEventArgs e)
{
- _settings.CustomBrowserList = CustomBrowsers.ToList();
- _settings.CustomBrowserIndex = SelectedCustomBrowserIndex;
- Close();
- }
-
- private void btnAdd_Click(object sender, RoutedEventArgs e)
- {
- CustomBrowsers.Add(new()
+ if (_viewModel.SaveSettings())
{
- Name = "New Profile"
- });
- SelectedCustomBrowserIndex = CustomBrowsers.Count - 1;
- }
-
- private void btnDelete_Click(object sender, RoutedEventArgs e)
- {
- CustomBrowsers.RemoveAt(SelectedCustomBrowserIndex--);
+ Close();
+ }
}
private void btnBrowseFile_Click(object sender, RoutedEventArgs e)
{
- Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
+ var dlg = new Microsoft.Win32.OpenFileDialog();
var result = dlg.ShowDialog();
if (result == true)
{
- TextBox path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
+ var path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
path.Text = dlg.FileName;
path.Focus();
((Button)sender).Focus();
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml b/Flow.Launcher/SelectFileManagerWindow.xaml
index 563fbda53..ecd4a282a 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml
@@ -6,10 +6,11 @@
xmlns:local="clr-namespace:Flow.Launcher"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.modernwpf.com/2019"
+ xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
Title="{DynamicResource fileManagerWindow}"
Width="600"
+ d:DataContext="{d:DesignInstance vm:SelectFileManagerViewModel}"
Background="{DynamicResource PopuBGColor}"
- DataContext="{Binding RelativeSource={RelativeSource Self}}"
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
SizeToContent="Height"
@@ -78,7 +79,8 @@
x:Name="btnTips"
Margin="0 7 0 7"
HorizontalAlignment="Left"
- Click="btnTips_Click"
+ Command="{Binding OpenFilesTipsCommand}"
+ CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
Content="{DynamicResource fileManager_files_btn}" />
@@ -115,11 +117,11 @@
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml.cs b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
index e880f3ada..0809ccb30 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml.cs
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
@@ -1,46 +1,19 @@
-using System;
-using System.Collections.ObjectModel;
-using System.ComponentModel;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Windows;
+using System.Windows;
using System.Windows.Controls;
-using System.Windows.Documents;
using System.Windows.Navigation;
-using CommunityToolkit.Mvvm.ComponentModel;
-using Flow.Launcher.Infrastructure.UserSettings;
+using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.ViewModel;
-using ModernWpf.Controls;
namespace Flow.Launcher
{
- [INotifyPropertyChanged]
public partial class SelectFileManagerWindow : Window
{
- private readonly Settings _settings;
+ private readonly SelectFileManagerViewModel _viewModel;
- private int selectedCustomExplorerIndex;
-
- public int SelectedCustomExplorerIndex
+ public SelectFileManagerWindow()
{
- get => selectedCustomExplorerIndex;
- set
- {
- selectedCustomExplorerIndex = value;
- OnPropertyChanged(nameof(CustomExplorer));
- }
- }
-
- public ObservableCollection CustomExplorers { get; }
-
- public CustomExplorerViewModel CustomExplorer => CustomExplorers[SelectedCustomExplorerIndex];
-
- public SelectFileManagerWindow(Settings settings)
- {
- _settings = settings;
- CustomExplorers = new ObservableCollection(_settings.CustomExplorerList.Select(x => x.Copy()));
- SelectedCustomExplorerIndex = _settings.CustomExplorerIndex;
+ _viewModel = Ioc.Default.GetRequiredService();
+ DataContext = _viewModel;
InitializeComponent();
}
@@ -48,133 +21,28 @@ namespace Flow.Launcher
{
Close();
}
-
+
+ private void btnDone_Click(object sender, RoutedEventArgs e)
+ {
+ if (_viewModel.SaveSettings())
+ {
+ Close();
+ }
+ }
+
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
App.API.OpenUrl(e.Uri.AbsoluteUri);
e.Handled = true;
}
- private void btnDone_Click(object sender, RoutedEventArgs e)
- {
- // Check if the selected file manager path is valid
- if (!IsFileManagerValid(CustomExplorer.Path))
- {
- var result = App.API.ShowMsgBox(
- string.Format(App.API.GetTranslation("fileManagerPathNotFound"),
- CustomExplorer.Name, CustomExplorer.Path),
- App.API.GetTranslation("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;
- }
- }
-
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
- private async void btnTips_Click(object sender, RoutedEventArgs e)
- {
- var tipText = (string)Application.Current.Resources["fileManager_files_tips"];
- var url = "https://files.community/docs/contributing/updates";
-
- var textBlock = new TextBlock
- {
- FontSize = 14,
- TextWrapping = TextWrapping.Wrap,
- Margin = new Thickness(0, 0, 0, 0)
- };
-
- textBlock.Inlines.Add(tipText);
-
- var hyperlink = new Hyperlink
- {
- NavigateUri = new Uri(url)
- };
- hyperlink.Inlines.Add(url);
- hyperlink.RequestNavigate += (s, args) =>
- {
- App.API.OpenUrl(args.Uri.AbsoluteUri);
- args.Handled = true;
- };
-
- textBlock.Inlines.Add(hyperlink);
-
- var tipsDialog = new ContentDialog()
- {
- Owner = Window.GetWindow((DependencyObject)sender),
- Title = (string)Application.Current.Resources["fileManager_files_btn"],
- Content = textBlock,
- PrimaryButtonText = (string)Application.Current.Resources["commonOK"],
- CornerRadius = new CornerRadius(8),
- Style = (Style)Application.Current.Resources["ContentDialog"]
- };
-
- await tipsDialog.ShowAsync();
- }
-
- private void btnAdd_Click(object sender, RoutedEventArgs e)
- {
- CustomExplorers.Add(new()
- {
- Name = "New Profile"
- });
- SelectedCustomExplorerIndex = CustomExplorers.Count - 1;
- }
-
- private void btnDelete_Click(object sender, RoutedEventArgs e)
- {
- CustomExplorers.RemoveAt(SelectedCustomExplorerIndex--);
- }
-
private void btnBrowseFile_Click(object sender, RoutedEventArgs e)
{
- Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
+ var dlg = new Microsoft.Win32.OpenFileDialog();
var result = dlg.ShowDialog();
if (result == true)
{
- TextBox path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
+ var path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
path.Text = dlg.FileName;
path.Focus();
((Button)sender).Focus();
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
index 840269b03..eac40099b 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
@@ -335,14 +335,14 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
[RelayCommand]
private void SelectFileManager()
{
- var fileManagerChangeWindow = new SelectFileManagerWindow(Settings);
+ var fileManagerChangeWindow = new SelectFileManagerWindow();
fileManagerChangeWindow.ShowDialog();
}
[RelayCommand]
private void SelectBrowser()
{
- var browserWindow = new SelectBrowserWindow(Settings);
+ var browserWindow = new SelectBrowserWindow();
browserWindow.ShowDialog();
}
}
diff --git a/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
new file mode 100644
index 000000000..537263fcf
--- /dev/null
+++ b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
@@ -0,0 +1,58 @@
+using System.Collections.ObjectModel;
+using System.Linq;
+using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.ViewModel;
+
+public partial class SelectBrowserViewModel : BaseModel
+{
+ private readonly Settings _settings;
+
+ private int selectedCustomBrowserIndex;
+
+ public int SelectedCustomBrowserIndex
+ {
+ get => selectedCustomBrowserIndex;
+ set
+ {
+ selectedCustomBrowserIndex = value;
+ OnPropertyChanged(nameof(CustomBrowser));
+ }
+ }
+
+ public ObservableCollection CustomBrowsers { get; }
+
+ public CustomBrowserViewModel CustomBrowser => CustomBrowsers[SelectedCustomBrowserIndex];
+
+ public SelectBrowserViewModel(Settings settings)
+ {
+ _settings = settings;
+ CustomBrowsers = new ObservableCollection(_settings.CustomBrowserList.Select(x => x.Copy()));
+ SelectedCustomBrowserIndex = _settings.CustomBrowserIndex;
+ }
+
+ public bool SaveSettings()
+ {
+ _settings.CustomBrowserList = CustomBrowsers.ToList();
+ _settings.CustomBrowserIndex = SelectedCustomBrowserIndex;
+ return true;
+ }
+
+ [RelayCommand]
+ private void Add()
+ {
+ CustomBrowsers.Add(new()
+ {
+ Name = "New Profile"
+ });
+ SelectedCustomBrowserIndex = CustomBrowsers.Count - 1;
+ }
+
+ [RelayCommand]
+ private void Delete()
+ {
+ CustomBrowsers.RemoveAt(SelectedCustomBrowserIndex--);
+ }
+}
diff --git a/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs b/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
new file mode 100644
index 000000000..2b5729f05
--- /dev/null
+++ b/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
@@ -0,0 +1,161 @@
+using System;
+using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+using ModernWpf.Controls;
+
+namespace Flow.Launcher.ViewModel;
+
+public partial class SelectFileManagerViewModel : BaseModel
+{
+ private readonly Settings _settings;
+
+ private int selectedCustomExplorerIndex;
+
+ public int SelectedCustomExplorerIndex
+ {
+ get => selectedCustomExplorerIndex;
+ set
+ {
+ if (selectedCustomExplorerIndex != value)
+ {
+ selectedCustomExplorerIndex = value;
+ OnPropertyChanged(nameof(CustomExplorer));
+ }
+ }
+ }
+
+ public ObservableCollection CustomExplorers { get; }
+
+ public CustomExplorerViewModel CustomExplorer => CustomExplorers[SelectedCustomExplorerIndex];
+
+ public SelectFileManagerViewModel(Settings settings)
+ {
+ _settings = settings;
+ CustomExplorers = new ObservableCollection(_settings.CustomExplorerList.Select(x => x.Copy()));
+ SelectedCustomExplorerIndex = _settings.CustomExplorerIndex;
+ }
+
+ public bool SaveSettings()
+ {
+ // Check if the selected file manager path is valid
+ if (!IsFileManagerValid(CustomExplorer.Path))
+ {
+ var result = App.API.ShowMsgBox(
+ string.Format(App.API.GetTranslation("fileManagerPathNotFound"),
+ CustomExplorer.Name, CustomExplorer.Path),
+ App.API.GetTranslation("fileManagerPathError"),
+ MessageBoxButton.YesNo,
+ MessageBoxImage.Warning);
+
+ if (result == MessageBoxResult.No)
+ {
+ return false;
+ }
+ }
+
+ _settings.CustomExplorerList = CustomExplorers.ToList();
+ _settings.CustomExplorerIndex = SelectedCustomExplorerIndex;
+ return true;
+ }
+
+ private static 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;
+ }
+ }
+
+ [RelayCommand]
+ private async Task OpenFilesTipsAsync(Button button)
+ {
+ var tipText = App.API.GetTranslation("fileManager_files_tips");
+ var url = "https://files.community/docs/contributing/updates";
+
+ var textBlock = new TextBlock
+ {
+ FontSize = 14,
+ TextWrapping = TextWrapping.Wrap,
+ Margin = new Thickness(0, 0, 0, 0)
+ };
+
+ textBlock.Inlines.Add(tipText);
+
+ var hyperlink = new Hyperlink
+ {
+ NavigateUri = new Uri(url)
+ };
+ hyperlink.Inlines.Add(url);
+ hyperlink.RequestNavigate += (s, args) =>
+ {
+ App.API.OpenUrl(args.Uri.AbsoluteUri);
+ args.Handled = true;
+ };
+
+ textBlock.Inlines.Add(hyperlink);
+
+ var tipsDialog = new ContentDialog()
+ {
+ Owner = Window.GetWindow(button),
+ Title = (string)Application.Current.Resources["fileManager_files_btn"],
+ Content = textBlock,
+ PrimaryButtonText = (string)Application.Current.Resources["commonOK"],
+ CornerRadius = new CornerRadius(8),
+ Style = (Style)Application.Current.Resources["ContentDialog"]
+ };
+
+ await tipsDialog.ShowAsync();
+ }
+
+ [RelayCommand]
+ private void Add()
+ {
+ CustomExplorers.Add(new()
+ {
+ Name = "New Profile"
+ });
+ SelectedCustomExplorerIndex = CustomExplorers.Count - 1;
+ }
+
+ [RelayCommand]
+ private void Delete()
+ {
+ CustomExplorers.RemoveAt(SelectedCustomExplorerIndex--);
+ }
+}
From f7f52e269a8f0aa7883169c82425fd9738a8dc7f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 21 May 2025 14:31:09 +0800
Subject: [PATCH 1125/1798] Set culture info before creating application
---
.../Resource/Internationalization.cs | 34 ++++++----
.../UserSettings/Settings.cs | 13 +++-
Flow.Launcher/App.xaml.cs | 62 ++++++++++++-------
3 files changed, 71 insertions(+), 38 deletions(-)
diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs
index b32b09e8f..3329e3a96 100644
--- a/Flow.Launcher.Core/Resource/Internationalization.cs
+++ b/Flow.Launcher.Core/Resource/Internationalization.cs
@@ -1,16 +1,17 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
+using System.Threading;
+using System.Threading.Tasks;
using System.Windows;
+using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
-using System.Globalization;
-using System.Threading.Tasks;
-using CommunityToolkit.Mvvm.DependencyInjection;
namespace Flow.Launcher.Core.Resource
{
@@ -29,13 +30,12 @@ namespace Flow.Launcher.Core.Resource
private readonly Settings _settings;
private readonly List _languageDirectories = new();
private readonly List _oldResources = new();
- private readonly string SystemLanguageCode;
+ private static string SystemLanguageCode;
public Internationalization(Settings settings)
{
_settings = settings;
AddFlowLauncherLanguageDirectory();
- SystemLanguageCode = GetSystemLanguageCodeAtStartup();
}
private void AddFlowLauncherLanguageDirectory()
@@ -44,7 +44,7 @@ namespace Flow.Launcher.Core.Resource
_languageDirectories.Add(directory);
}
- private static string GetSystemLanguageCodeAtStartup()
+ public static void InitSystemLanguageCode()
{
var availableLanguages = AvailableLanguages.GetAvailableLanguages();
@@ -65,11 +65,11 @@ namespace Flow.Launcher.Core.Resource
string.Equals(languageCode, threeLetterCode, StringComparison.OrdinalIgnoreCase) ||
string.Equals(languageCode, fullName, StringComparison.OrdinalIgnoreCase))
{
- return languageCode;
+ SystemLanguageCode = languageCode;
}
}
- return DefaultLanguageCode;
+ SystemLanguageCode = DefaultLanguageCode;
}
private void AddPluginLanguageDirectories()
@@ -173,15 +173,25 @@ namespace Flow.Launcher.Core.Resource
LoadLanguage(language);
}
- // Culture of main thread
- // Use CreateSpecificCulture to preserve possible user-override settings in Windows, if Flow's language culture is the same as Windows's
- CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(language.LanguageCode);
- CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture;
+ // Change culture info
+ ChangeCultureInfo(language.LanguageCode);
// Raise event for plugins after culture is set
await Task.Run(UpdatePluginMetadataTranslations);
}
+ public static void ChangeCultureInfo(string languageCode)
+ {
+ // Culture of main thread
+ // Use CreateSpecificCulture to preserve possible user-override settings in Windows, if Flow's language culture is the same as Windows's
+ var currentCulture = CultureInfo.CreateSpecificCulture(languageCode);
+ CultureInfo.CurrentCulture = currentCulture;
+ CultureInfo.CurrentUICulture = currentCulture;
+ var thread = Thread.CurrentThread;
+ thread.CurrentCulture = currentCulture;
+ thread.CurrentUICulture = currentCulture;
+ }
+
public bool PromptShouldUsePinyin(string languageCodeToSet)
{
var languageToSet = GetLanguageByLanguageCode(languageCodeToSet);
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 027eb3f92..7933d08ea 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -25,7 +25,13 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public void Initialize()
{
+ // Initialize dependency injection instances after Ioc.Default is created
_stringMatcher = Ioc.Default.GetRequiredService();
+
+ // Initialize application resources after application is created
+ var settingWindowFont = new FontFamily(SettingWindowFont);
+ Application.Current.Resources["SettingWindowFont"] = settingWindowFont;
+ Application.Current.Resources["ContentControlThemeFontFamily"] = settingWindowFont;
}
public void Save()
@@ -114,8 +120,11 @@ namespace Flow.Launcher.Infrastructure.UserSettings
{
_settingWindowFont = value;
OnPropertyChanged();
- Application.Current.Resources["SettingWindowFont"] = new FontFamily(value);
- Application.Current.Resources["ContentControlThemeFontFamily"] = new FontFamily(value);
+ if (Application.Current != null)
+ {
+ Application.Current.Resources["SettingWindowFont"] = new FontFamily(value);
+ Application.Current.Resources["ContentControlThemeFontFamily"] = new FontFamily(value);
+ }
}
}
}
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 942e94470..fd64ad3e0 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -41,9 +41,9 @@ namespace Flow.Launcher
private static readonly string ClassName = nameof(App);
private static bool _disposed;
+ private static Settings _settings;
private static MainWindow _mainWindow;
private readonly MainViewModel _mainVM;
- private readonly Settings _settings;
// To prevent two disposals running at the same time.
private static readonly object _disposingLock = new();
@@ -55,19 +55,7 @@ namespace Flow.Launcher
public App()
{
// Initialize settings
- try
- {
- var storage = new FlowLauncherJsonStorage();
- _settings = storage.Load();
- _settings.SetStorage(storage);
- _settings.WMPInstalled = WindowsMediaPlayerHelper.IsWindowsMediaPlayerInstalled();
- }
- catch (Exception e)
- {
- ShowErrorMsgBoxAndFailFast("Cannot load setting storage, please check local data directory", e);
- return;
- }
-
+ _settings.WMPInstalled = WindowsMediaPlayerHelper.IsWindowsMediaPlayerInstalled();
// Configure the dependency injection container
try
{
@@ -119,16 +107,6 @@ namespace Flow.Launcher
ShowErrorMsgBoxAndFailFast("Cannot initialize api and settings, please open new issue in Flow.Launcher", e);
return;
}
-
- // Local function
- static void ShowErrorMsgBoxAndFailFast(string message, Exception e)
- {
- // Firstly show users the message
- MessageBox.Show(e.ToString(), message, MessageBoxButton.OK, MessageBoxImage.Error);
-
- // Flow cannot construct its App instance, so ensure Flow crashes w/ the exception info.
- Environment.FailFast(message, e);
- }
}
#endregion
@@ -138,6 +116,29 @@ namespace Flow.Launcher
[STAThread]
public static void Main()
{
+ // Initialize settings so that we can get language code
+ try
+ {
+ var storage = new FlowLauncherJsonStorage();
+ _settings = storage.Load();
+ _settings.SetStorage(storage);
+ }
+ catch (Exception e)
+ {
+ ShowErrorMsgBoxAndFailFast("Cannot load setting storage, please check local data directory", e);
+ return;
+ }
+
+ // Initialize system language before changing culture info
+ Internationalization.InitSystemLanguageCode();
+
+ // Change culture info before application creation to localize WinForm windows
+ if (_settings.Language != Constant.SystemLanguageCode)
+ {
+ Internationalization.ChangeCultureInfo(_settings.Language);
+ }
+
+ // Start the application as a single instance
if (SingleInstance.InitializeAsFirstInstance())
{
using var application = new App();
@@ -148,6 +149,19 @@ namespace Flow.Launcher
#endregion
+ #region Fail Fast
+
+ private static void ShowErrorMsgBoxAndFailFast(string message, Exception e)
+ {
+ // Firstly show users the message
+ MessageBox.Show(e.ToString(), message, MessageBoxButton.OK, MessageBoxImage.Error);
+
+ // Flow cannot construct its App instance, so ensure Flow crashes w/ the exception info.
+ Environment.FailFast(message, e);
+ }
+
+ #endregion
+
#region App Events
#pragma warning disable VSTHRD100 // Avoid async void methods
From b0997449c17117214a246c537b2472db5fb88596 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 21 May 2025 14:38:15 +0800
Subject: [PATCH 1126/1798] Handle CultureNotFoundException
---
Flow.Launcher.Core/Resource/Internationalization.cs | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs
index 3329e3a96..24edc5ed8 100644
--- a/Flow.Launcher.Core/Resource/Internationalization.cs
+++ b/Flow.Launcher.Core/Resource/Internationalization.cs
@@ -184,7 +184,15 @@ namespace Flow.Launcher.Core.Resource
{
// Culture of main thread
// Use CreateSpecificCulture to preserve possible user-override settings in Windows, if Flow's language culture is the same as Windows's
- var currentCulture = CultureInfo.CreateSpecificCulture(languageCode);
+ CultureInfo currentCulture;
+ try
+ {
+ currentCulture = CultureInfo.CreateSpecificCulture(languageCode);
+ }
+ catch (CultureNotFoundException)
+ {
+ currentCulture = CultureInfo.CreateSpecificCulture(SystemLanguageCode);
+ }
CultureInfo.CurrentCulture = currentCulture;
CultureInfo.CurrentUICulture = currentCulture;
var thread = Thread.CurrentThread;
From 5578daaa3eeb0875c7d301a5e7d27bafbad1b6d2 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 21 May 2025 18:25:33 +0800
Subject: [PATCH 1127/1798] Remove files tip button
---
Flow.Launcher/Languages/en.xaml | 2 -
Flow.Launcher/SelectFileManagerWindow.xaml | 19 +++------
.../ViewModel/SelectFileManagerViewModel.cs | 41 -------------------
3 files changed, 5 insertions(+), 57 deletions(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 1b72d9045..c58c63a5e 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -366,9 +366,7 @@
Select File Manager
- Do you use Files?Learn more
- 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
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml b/Flow.Launcher/SelectFileManagerWindow.xaml
index ecd4a282a..b3b219d1c 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml
@@ -74,20 +74,11 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
- {
- App.API.OpenUrl(args.Uri.AbsoluteUri);
- args.Handled = true;
- };
-
- textBlock.Inlines.Add(hyperlink);
-
- var tipsDialog = new ContentDialog()
- {
- Owner = Window.GetWindow(button),
- Title = (string)Application.Current.Resources["fileManager_files_btn"],
- Content = textBlock,
- PrimaryButtonText = (string)Application.Current.Resources["commonOK"],
- CornerRadius = new CornerRadius(8),
- Style = (Style)Application.Current.Resources["ContentDialog"]
- };
-
- await tipsDialog.ShowAsync();
- }
-
[RelayCommand]
private void Add()
{
From 45b81811f7d4b11540a3ad24250970443da61a7d Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 21 May 2025 18:37:52 +0800
Subject: [PATCH 1128/1798] Fix potential issue with index boundary in Delete
command
---
Flow.Launcher/ViewModel/SelectBrowserViewModel.cs | 7 ++++++-
Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs | 11 ++++++-----
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
index 537263fcf..12f43d752 100644
--- a/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
+++ b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
@@ -53,6 +53,11 @@ public partial class SelectBrowserViewModel : BaseModel
[RelayCommand]
private void Delete()
{
- CustomBrowsers.RemoveAt(SelectedCustomBrowserIndex--);
+ var currentIndex = SelectedCustomBrowserIndex;
+ if (currentIndex >= 0 && currentIndex < CustomBrowsers.Count)
+ {
+ CustomBrowsers.RemoveAt(currentIndex);
+ SelectedCustomBrowserIndex = currentIndex > 0 ? currentIndex - 1 : 0;
+ }
}
}
diff --git a/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs b/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
index ee7da9e0f..253f74b47 100644
--- a/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
+++ b/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
@@ -3,14 +3,10 @@ using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
-using System.Threading.Tasks;
using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Documents;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
-using ModernWpf.Controls;
namespace Flow.Launcher.ViewModel;
@@ -115,6 +111,11 @@ public partial class SelectFileManagerViewModel : BaseModel
[RelayCommand]
private void Delete()
{
- CustomExplorers.RemoveAt(SelectedCustomExplorerIndex--);
+ var currentIndex = SelectedCustomExplorerIndex;
+ if (currentIndex >= 0 && currentIndex < CustomExplorers.Count)
+ {
+ CustomExplorers.RemoveAt(currentIndex);
+ SelectedCustomExplorerIndex = currentIndex > 0 ? currentIndex - 1 : 0;
+ }
}
}
From 9a692a894d6b9f745e5090eb28fd6bc3daf7b2d1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 21 May 2025 18:45:35 +0800
Subject: [PATCH 1129/1798] Add whitespace
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index c58c63a5e..627d111d0 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -468,7 +468,7 @@
File Manager Error
- The specified file manager could not be found. Please check the Custom File Manager setting under Settings >General.
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
ErrorAn error occurred while opening the folder. {0}
From 07f77f00774b4f58244e9077f27327549a8eed94 Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Wed, 21 May 2025 21:30:47 +1000
Subject: [PATCH 1130/1798] move calls to viewmodel
---
Flow.Launcher/SelectFileManagerWindow.xaml.cs | 10 +++++-----
.../ViewModel/SelectFileManagerViewModel.cs | 17 +++++++++++++++++
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml.cs b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
index 0809ccb30..d9c672aff 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml.cs
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml.cs
@@ -32,18 +32,18 @@ namespace Flow.Launcher
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
- App.API.OpenUrl(e.Uri.AbsoluteUri);
+ _viewModel.OpenUrl(e.Uri.AbsoluteUri);
e.Handled = true;
}
private void btnBrowseFile_Click(object sender, RoutedEventArgs e)
{
- var dlg = new Microsoft.Win32.OpenFileDialog();
- var result = dlg.ShowDialog();
- if (result == true)
+ var selectedFilePath = _viewModel.SelectFile();
+
+ if (!string.IsNullOrEmpty(selectedFilePath))
{
var path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
- path.Text = dlg.FileName;
+ path.Text = selectedFilePath;
path.Focus();
((Button)sender).Focus();
}
diff --git a/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs b/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
index 253f74b47..a72eff280 100644
--- a/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
+++ b/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
@@ -98,6 +98,23 @@ public partial class SelectFileManagerViewModel : BaseModel
}
}
+ internal void OpenUrl(string absoluteUri)
+ {
+ App.API.OpenUrl(absoluteUri);
+ }
+
+ internal string SelectFile()
+ {
+ var dlg = new Microsoft.Win32.OpenFileDialog();
+ var result = dlg.ShowDialog();
+ if (result == true)
+ {
+ return dlg.FileName;
+ }
+
+ return string.Empty;
+ }
+
[RelayCommand]
private void Add()
{
From e2d50cd80be4ad225fa29fff3b33b5a56ca7b0e1 Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Wed, 21 May 2025 21:31:03 +1000
Subject: [PATCH 1131/1798] update wording
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 627d111d0..f233a30d5 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -374,7 +374,7 @@
File Manager PathArg For FolderArg For File
- The path for file manager '{0}' could not be found: '{1}' Do you want to continue?
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?File Manager Path Error
From 41b9cd496ba9b5d99637a3f4ead74ebb73ac7f5a Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Wed, 21 May 2025 21:39:46 +1000
Subject: [PATCH 1132/1798] move code to viewmodel
---
Flow.Launcher/SelectBrowserWindow.xaml.cs | 8 ++++----
Flow.Launcher/ViewModel/SelectBrowserViewModel.cs | 11 +++++++++++
Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs | 2 --
3 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher/SelectBrowserWindow.xaml.cs b/Flow.Launcher/SelectBrowserWindow.xaml.cs
index 2d200fe98..565b4cbc3 100644
--- a/Flow.Launcher/SelectBrowserWindow.xaml.cs
+++ b/Flow.Launcher/SelectBrowserWindow.xaml.cs
@@ -31,12 +31,12 @@ namespace Flow.Launcher
private void btnBrowseFile_Click(object sender, RoutedEventArgs e)
{
- var dlg = new Microsoft.Win32.OpenFileDialog();
- var result = dlg.ShowDialog();
- if (result == true)
+ var selectedFilePath = _viewModel.SelectFile();
+
+ if (!string.IsNullOrEmpty(selectedFilePath))
{
var path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
- path.Text = dlg.FileName;
+ path.Text = selectedFilePath;
path.Focus();
((Button)sender).Focus();
}
diff --git a/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
index 12f43d752..1eee6dba5 100644
--- a/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
+++ b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
@@ -1,5 +1,6 @@
using System.Collections.ObjectModel;
using System.Linq;
+using System.Windows;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
@@ -40,6 +41,16 @@ public partial class SelectBrowserViewModel : BaseModel
return true;
}
+ internal string SelectFile()
+ {
+ var dlg = new Microsoft.Win32.OpenFileDialog();
+ var result = dlg.ShowDialog();
+ if (result == true)
+ return dlg.FileName;
+
+ return string.Empty;
+ }
+
[RelayCommand]
private void Add()
{
diff --git a/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs b/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
index a72eff280..77f004980 100644
--- a/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
+++ b/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
@@ -108,9 +108,7 @@ public partial class SelectFileManagerViewModel : BaseModel
var dlg = new Microsoft.Win32.OpenFileDialog();
var result = dlg.ShowDialog();
if (result == true)
- {
return dlg.FileName;
- }
return string.Empty;
}
From edae4328527e68dbca8d71fd343f154bb453b3ea Mon Sep 17 00:00:00 2001
From: DB p
Date: Thu, 22 May 2025 04:14:30 +0900
Subject: [PATCH 1133/1798] Add FocusQueryTextBox method to set focus on the
query text box in MainWindow
---
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs | 5 +++++
Flow.Launcher/PublicAPIInstance.cs | 13 +++++++++++++
Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 7 +++++--
3 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index d4eb02a90..cb60251ed 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -88,6 +88,11 @@ namespace Flow.Launcher.Plugin
/// Show the MainWindow when hiding
///
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 1134/1798] 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 1135/1798] 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 949344a51e9062828e800149adb91165cc8882c3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 22 May 2025 17:32:33 +0800
Subject: [PATCH 1136/1798] Add internal model for plugin management
---
.../UserSettings/Settings.cs | 2 +
Flow.Launcher/Languages/en.xaml | 18 ++
.../Views/SettingsPaneGeneral.xaml | 11 +
.../ViewModel/PluginStoreItemViewModel.cs | 270 ++++++++++++++++--
Flow.Launcher/ViewModel/PluginViewModel.cs | 23 +-
5 files changed, 280 insertions(+), 44 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index ce1269a29..024e727ce 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -176,6 +176,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool ShowHistoryResultsForHomePage { get; set; } = false;
public int MaxHistoryResultsToShowForHomePage { get; set; } = 5;
+ public bool AutoRestartAfterChanging { get; set; } = false;
+
public int CustomExplorerIndex { get; set; } = 0;
[JsonIgnore]
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 22ab2016c..24f74e15d 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -131,6 +131,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Automatically restart after changing plugins
+ Automatically restart Flow Launcher after installing/uninstalling/updating pluginsSearch Plugin
@@ -184,6 +186,22 @@
New VersionThis plugin has been updated within the last 7 daysNew Update is Available
+ Error installing plugin
+ Error uninstalling plugin
+ Error updating plugin
+ Keep plugin settings
+ Do you want to keep the settings of the plugin for the next usage?
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ Plugin install
+ {0} by {1} {2}{2}Would you like to install this plugin?
+ Plugin uninstall
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
+ Plugin udpate
+ {0} by {1} {2}{2}Would you like to update this plugin?
+ Downloading plugin
+ Automatically restart after installing/uninstalling/updating plugins in plugin storeTheme
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index c0c5613de..452e026d7 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -202,6 +202,17 @@
+
+
+
+
PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7");
+ private static readonly string ClassName = nameof(PluginStoreItemViewModel);
+
+ private static readonly Settings Settings = Ioc.Default.GetRequiredService();
+
+ private readonly UserPlugin _newPlugin;
+ private readonly PluginPair _oldPluginPair;
+
public PluginStoreItemViewModel(UserPlugin plugin)
{
- _plugin = plugin;
+ _newPlugin = plugin;
+ _oldPluginPair = PluginManager.GetPluginForId(plugin.ID);
}
- private UserPlugin _plugin;
+ public string ID => _newPlugin.ID;
+ public string Name => _newPlugin.Name;
+ public string Description => _newPlugin.Description;
+ public string Author => _newPlugin.Author;
+ public string Version => _newPlugin.Version;
+ public string Language => _newPlugin.Language;
+ public string Website => _newPlugin.Website;
+ public string UrlDownload => _newPlugin.UrlDownload;
+ public string UrlSourceCode => _newPlugin.UrlSourceCode;
+ public string IcoPath => _newPlugin.IcoPath;
- public string ID => _plugin.ID;
- public string Name => _plugin.Name;
- public string Description => _plugin.Description;
- public string Author => _plugin.Author;
- public string Version => _plugin.Version;
- public string Language => _plugin.Language;
- public string Website => _plugin.Website;
- public string UrlDownload => _plugin.UrlDownload;
- public string UrlSourceCode => _plugin.UrlSourceCode;
- public string IcoPath => _plugin.IcoPath;
-
- public bool LabelInstalled => PluginManager.GetPluginForId(_plugin.ID) != null;
- public bool LabelUpdate => LabelInstalled && new Version(_plugin.Version) > new Version(PluginManager.GetPluginForId(_plugin.ID).Metadata.Version);
+ public bool LabelInstalled => _oldPluginPair != null;
+ public bool LabelUpdate => LabelInstalled && new Version(_newPlugin.Version) > new Version(_oldPluginPair.Metadata.Version);
internal const string None = "None";
internal const string RecentlyUpdated = "RecentlyUpdated";
@@ -41,15 +51,15 @@ namespace Flow.Launcher.ViewModel
get
{
string category = None;
- if (DateTime.Now - _plugin.LatestReleaseDate < TimeSpan.FromDays(7))
+ if (DateTime.Now - _newPlugin.LatestReleaseDate < TimeSpan.FromDays(7))
{
category = RecentlyUpdated;
}
- if (DateTime.Now - _plugin.DateAdded < TimeSpan.FromDays(7))
+ if (DateTime.Now - _newPlugin.DateAdded < TimeSpan.FromDays(7))
{
category = NewRelease;
}
- if (PluginManager.GetPluginForId(_plugin.ID) != null)
+ if (_oldPluginPair != null)
{
category = Installed;
}
@@ -59,11 +69,223 @@ namespace Flow.Launcher.ViewModel
}
[RelayCommand]
- private void ShowCommandQuery(string action)
+ private async Task ShowCommandQueryAsync(string action)
{
- var actionKeyword = PluginManagerData.Metadata.ActionKeywords.Any() ? PluginManagerData.Metadata.ActionKeywords[0] + " " : String.Empty;
- App.API.ChangeQuery($"{actionKeyword}{action} {_plugin.Name}");
- App.API.ShowMainWindow();
+ switch (action)
+ {
+ case "install":
+ await InstallPluginAsync(_newPlugin);
+ break;
+ case "uninstall":
+ await UninstallPluginAsync(_oldPluginPair.Metadata);
+ break;
+ case "update":
+ await UpdatePluginAsync(_newPlugin, _oldPluginPair.Metadata);
+ break;
+ }
+ }
+
+ internal static async Task InstallPluginAsync(UserPlugin newPlugin)
+ {
+ if (App.API.ShowMsgBox(
+ string.Format(
+ App.API.GetTranslation("InstallPromptSubtitle"),
+ newPlugin.Name, newPlugin.Author, Environment.NewLine),
+ App.API.GetTranslation("InstallPromptTitle"),
+ button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
+
+ try
+ {
+ // at minimum should provide a name, but handle plugin that is not downloaded from plugins manifest and is a url download
+ var downloadFilename = string.IsNullOrEmpty(newPlugin.Version)
+ ? $"{newPlugin.Name}-{Guid.NewGuid()}.zip"
+ : $"{newPlugin.Name}-{newPlugin.Version}.zip";
+
+ var filePath = Path.Combine(Path.GetTempPath(), downloadFilename);
+
+ using var cts = new CancellationTokenSource();
+
+ if (!newPlugin.IsFromLocalInstallPath)
+ {
+ await DownloadFileAsync(
+ $"{App.API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
+ newPlugin.UrlDownload, filePath, cts);
+ }
+ else
+ {
+ filePath = newPlugin.LocalInstallPath;
+ }
+
+ // check if user cancelled download before installing plugin
+ if (cts.IsCancellationRequested)
+ {
+ return;
+ }
+ else
+ {
+ if (!File.Exists(filePath))
+ {
+ throw new FileNotFoundException($"Plugin {newPlugin.ID} zip file not found at {filePath}", filePath);
+ }
+
+ App.API.InstallPlugin(newPlugin, filePath);
+
+ if (!newPlugin.IsFromLocalInstallPath)
+ {
+ File.Delete(filePath);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ App.API.LogException(ClassName, "Failed to install plugin", e);
+ App.API.ShowMsgError(App.API.GetTranslation("ErrorInstallingPlugin"));
+ }
+
+ if (Settings.AutoRestartAfterChanging)
+ {
+ App.API.RestartApp();
+ }
+ else
+ {
+ App.API.ShowMsg(
+ App.API.GetTranslation("installbtn"),
+ string.Format(
+ App.API.GetTranslation(
+ "InstallSuccessNoRestart"),
+ newPlugin.Name));
+ }
+ }
+
+ internal static async Task UninstallPluginAsync(PluginMetadata oldPlugin)
+ {
+ if (App.API.ShowMsgBox(
+ string.Format(
+ App.API.GetTranslation("UninstallPromptSubtitle"),
+ oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
+ App.API.GetTranslation("UninstallPromptTitle"),
+ button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
+
+ var removePluginSettings = App.API.ShowMsgBox(
+ App.API.GetTranslation("KeepPluginSettingsSubtitle"),
+ App.API.GetTranslation("KeepPluginSettingsTitle"),
+ button: MessageBoxButton.YesNo) == MessageBoxResult.No;
+
+ try
+ {
+ await App.API.UninstallPluginAsync(oldPlugin, removePluginSettings);
+ }
+ catch (Exception e)
+ {
+ App.API.LogException(ClassName, "Failed to uninstall plugin", e);
+ App.API.ShowMsgError(App.API.GetTranslation("ErrorUninstallingPlugin"));
+ }
+
+ if (Settings.AutoRestartAfterChanging)
+ {
+ App.API.RestartApp();
+ }
+ else
+ {
+ App.API.ShowMsg(
+ App.API.GetTranslation("uninstallbtn"),
+ string.Format(
+ App.API.GetTranslation(
+ "UninstallSuccessNoRestart"),
+ oldPlugin.Name));
+ }
+ }
+
+ internal static async Task UpdatePluginAsync(UserPlugin newPlugin, PluginMetadata oldPlugin)
+ {
+ if (App.API.ShowMsgBox(
+ string.Format(
+ App.API.GetTranslation("UpdatePromptSubtitle"),
+ oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
+ App.API.GetTranslation("UpdatePromptTitle"),
+ button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
+
+ try
+ {
+ var filePath = Path.Combine(Path.GetTempPath(), $"{newPlugin.Name}-{newPlugin.Version}.zip");
+
+ using var cts = new CancellationTokenSource();
+
+ if (!newPlugin.IsFromLocalInstallPath)
+ {
+ await DownloadFileAsync(
+ $"{App.API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
+ newPlugin.UrlDownload, filePath, cts);
+ }
+ else
+ {
+ filePath = newPlugin.LocalInstallPath;
+ }
+
+ // check if user cancelled download before installing plugin
+ if (cts.IsCancellationRequested)
+ {
+ return;
+ }
+ else
+ {
+ await App.API.UpdatePluginAsync(oldPlugin, newPlugin, filePath);
+ }
+ }
+ catch (Exception e)
+ {
+ App.API.LogException(ClassName, "Failed to update plugin", e);
+ App.API.ShowMsgError(App.API.GetTranslation("ErrorUpdatingPlugin"));
+ }
+
+ if (Settings.AutoRestartAfterChanging)
+ {
+ App.API.RestartApp();
+ }
+ else
+ {
+ App.API.ShowMsg(
+ App.API.GetTranslation("updatebtn"),
+ string.Format(
+ App.API.GetTranslation(
+ "UpdateSuccessNoRestart"),
+ newPlugin.Name));
+ }
+ }
+
+ private static async Task DownloadFileAsync(string prgBoxTitle, string downloadUrl, string filePath, CancellationTokenSource cts, bool deleteFile = true, bool showProgress = true)
+ {
+ if (deleteFile && File.Exists(filePath))
+ File.Delete(filePath);
+
+ if (showProgress)
+ {
+ var exceptionHappened = false;
+ await App.API.ShowProgressBoxAsync(prgBoxTitle,
+ async (reportProgress) =>
+ {
+ if (reportProgress == null)
+ {
+ // when reportProgress is null, it means there is expcetion with the progress box
+ // so we record it with exceptionHappened and return so that progress box will close instantly
+ exceptionHappened = true;
+ return;
+ }
+ else
+ {
+ await App.API.HttpDownloadAsync(downloadUrl, filePath, reportProgress, cts.Token).ConfigureAwait(false);
+ }
+ }, cts.Cancel);
+
+ // if exception happened while downloading and user does not cancel downloading,
+ // we need to redownload the plugin
+ if (exceptionHappened && (!cts.IsCancellationRequested))
+ await App.API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
+ }
+ else
+ {
+ await App.API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
+ }
}
}
}
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index 01fa3d203..bda05a02d 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -1,5 +1,4 @@
-using System.Linq;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
@@ -32,21 +31,6 @@ namespace Flow.Launcher.ViewModel
}
}
- private static string PluginManagerActionKeyword
- {
- get
- {
- var keyword = PluginManager
- .GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7")
- .Metadata.ActionKeywords.FirstOrDefault();
- return keyword switch
- {
- null or "*" => string.Empty,
- _ => keyword
- };
- }
- }
-
private async Task LoadIconAsync()
{
Image = await App.API.LoadImageAsync(PluginPair.Metadata.IcoPath);
@@ -186,10 +170,9 @@ namespace Flow.Launcher.ViewModel
}
[RelayCommand]
- private void OpenDeletePluginWindow()
+ private async Task OpenDeletePluginWindowAsync()
{
- App.API.ChangeQuery($"{PluginManagerActionKeyword} uninstall {PluginPair.Metadata.Name}".Trim(), true);
- App.API.ShowMainWindow();
+ await PluginStoreItemViewModel.UninstallPluginAsync(PluginPair.Metadata);
}
[RelayCommand]
From 76736b785091873534770d4806572f2641f20adf Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Thu, 22 May 2025 17:37:27 +0800
Subject: [PATCH 1137/1798] Fix typo
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 24f74e15d..2166bdd8c 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -198,7 +198,7 @@
{0} by {1} {2}{2}Would you like to install this plugin?Plugin uninstall{0} by {1} {2}{2}Would you like to uninstall this plugin?
- Plugin udpate
+ Plugin update{0} by {1} {2}{2}Would you like to update this plugin?Downloading pluginAutomatically restart after installing/uninstalling/updating plugins in plugin store
From c6c7ff882e6745216c828559191966753553e839 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 22 May 2025 17:40:26 +0800
Subject: [PATCH 1138/1798] Handle default
---
Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
index 3e823d635..a69c0dbd7 100644
--- a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
@@ -82,6 +82,8 @@ namespace Flow.Launcher.ViewModel
case "update":
await UpdatePluginAsync(_newPlugin, _oldPluginPair.Metadata);
break;
+ default:
+ break;
}
}
From 6044f87e806c97cd96f9d62beb6fb3a868ba1efe Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 22 May 2025 17:41:13 +0800
Subject: [PATCH 1139/1798] Do not restart on failure
---
Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
index a69c0dbd7..6b2cf6eed 100644
--- a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
@@ -142,6 +142,7 @@ namespace Flow.Launcher.ViewModel
{
App.API.LogException(ClassName, "Failed to install plugin", e);
App.API.ShowMsgError(App.API.GetTranslation("ErrorInstallingPlugin"));
+ return; // don’t restart on failure
}
if (Settings.AutoRestartAfterChanging)
@@ -181,6 +182,7 @@ namespace Flow.Launcher.ViewModel
{
App.API.LogException(ClassName, "Failed to uninstall plugin", e);
App.API.ShowMsgError(App.API.GetTranslation("ErrorUninstallingPlugin"));
+ return; // don’t restart on failure
}
if (Settings.AutoRestartAfterChanging)
@@ -238,6 +240,7 @@ namespace Flow.Launcher.ViewModel
{
App.API.LogException(ClassName, "Failed to update plugin", e);
App.API.ShowMsgError(App.API.GetTranslation("ErrorUpdatingPlugin"));
+ return; // don’t restart on failure
}
if (Settings.AutoRestartAfterChanging)
From 087a45c66458c700b5f9f0e28278fe2abd34938a Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 22 May 2025 20:41:04 +1000
Subject: [PATCH 1140/1798] 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 morePlease 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žkuArgumenty pro Soubor
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorVý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 morePlease 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åndteringArg for mappeArg for fil
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorDefault 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 moreBitte 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-PfadArg For FolderArg For File
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorWebbrowser 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 morePlease 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 ArchivosArg para CarpetaArg para Archivo
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorNavegador 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 moreEspecifique 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 archivosArgumentos de la carpetaArgumentos del archivo
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorNavegador 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 moreVeuillez 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 fichiersArguments pour le répertoireArguments pour le fichier
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorNavigateur 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 morePlease 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 FileArg Per CartellaArg Per Cartella
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorBrowser 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 morePlease 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 PathArg For FolderArg 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 moreVennligst 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 stiArg for mappeArg for fil
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorStandard 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 morePlease 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 padArg voor mapArg voor bestand
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorStandaard 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 moreProszę 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ówArg dla folderuArg dla pliku
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorDomyś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 morePlease 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 ArquivosArg para PastaArg para Arquivo
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorNavegador 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 maisPor 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 ficheirosArgumento para pastaArgumento para ficheiro
+ Não foi possível encontrar o gestor de ficheiros '{0}' em '{1}'. Deseja continuar?
+ Erro no caminho do gestor de ficheirosNavegador 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 morePlease 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úborovArg. pre priečinokArg. pre súbor
+ Správca súborov '{0}' sa nenachádza na '{1}'. Chcete pokračovať?
+ Chyba v ceste k správcovi súborovPredvolený 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ÁnoNiePozadie
@@ -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 morePlease 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 PathArg For FolderArg For File
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorDefault 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 morePlease 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 YoluKlasör AçarkenDosya 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 morePlease 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 morePlease 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 ErrorTrì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 morePlease 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 383c0aeffc9afc1351f3c008d62aa0915ddc0da4 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 23 May 2025 13:41:59 +0800
Subject: [PATCH 1141/1798] Improve code quality
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 209 +++++++++++++++++
.../ViewModel/PluginStoreItemViewModel.cs | 221 +-----------------
Flow.Launcher/ViewModel/PluginViewModel.cs | 2 +-
3 files changed, 213 insertions(+), 219 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index aae8dd764..5b14ad0b7 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -6,6 +6,7 @@ using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
+using System.Windows;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Core.ExternalPlugins;
using Flow.Launcher.Infrastructure;
@@ -24,6 +25,8 @@ namespace Flow.Launcher.Core.Plugin
{
private static readonly string ClassName = nameof(PluginManager);
+ private static readonly Settings FlowSettings = Ioc.Default.GetRequiredService();
+
private static IEnumerable _contextMenuPlugins;
private static IEnumerable _homePlugins;
@@ -547,6 +550,177 @@ namespace Flow.Launcher.Core.Plugin
await UninstallPluginAsync(plugin, removePluginFromSettings, removePluginSettings, true);
}
+ public static async Task InstallPluginAndCheckRestartAsync(UserPlugin newPlugin)
+ {
+ if (API.ShowMsgBox(
+ string.Format(
+ API.GetTranslation("InstallPromptSubtitle"),
+ newPlugin.Name, newPlugin.Author, Environment.NewLine),
+ API.GetTranslation("InstallPromptTitle"),
+ button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
+
+ try
+ {
+ // at minimum should provide a name, but handle plugin that is not downloaded from plugins manifest and is a url download
+ var downloadFilename = string.IsNullOrEmpty(newPlugin.Version)
+ ? $"{newPlugin.Name}-{Guid.NewGuid()}.zip"
+ : $"{newPlugin.Name}-{newPlugin.Version}.zip";
+
+ var filePath = Path.Combine(Path.GetTempPath(), downloadFilename);
+
+ using var cts = new CancellationTokenSource();
+
+ if (!newPlugin.IsFromLocalInstallPath)
+ {
+ await DownloadFileAsync(
+ $"{API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
+ newPlugin.UrlDownload, filePath, cts);
+ }
+ else
+ {
+ filePath = newPlugin.LocalInstallPath;
+ }
+
+ // check if user cancelled download before installing plugin
+ if (cts.IsCancellationRequested)
+ {
+ return;
+ }
+ else
+ {
+ if (!File.Exists(filePath))
+ {
+ throw new FileNotFoundException($"Plugin {newPlugin.ID} zip file not found at {filePath}", filePath);
+ }
+
+ API.InstallPlugin(newPlugin, filePath);
+
+ if (!newPlugin.IsFromLocalInstallPath)
+ {
+ File.Delete(filePath);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ API.LogException(ClassName, "Failed to install plugin", e);
+ API.ShowMsgError(API.GetTranslation("ErrorInstallingPlugin"));
+ return; // don’t restart on failure
+ }
+
+ if (FlowSettings.AutoRestartAfterChanging)
+ {
+ API.RestartApp();
+ }
+ else
+ {
+ API.ShowMsg(
+ API.GetTranslation("installbtn"),
+ string.Format(
+ API.GetTranslation(
+ "InstallSuccessNoRestart"),
+ newPlugin.Name));
+ }
+ }
+
+ public static async Task UninstallPluginAndCheckRestartAsync(PluginMetadata oldPlugin)
+ {
+ if (API.ShowMsgBox(
+ string.Format(
+ API.GetTranslation("UninstallPromptSubtitle"),
+ oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
+ API.GetTranslation("UninstallPromptTitle"),
+ button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
+
+ var removePluginSettings = API.ShowMsgBox(
+ API.GetTranslation("KeepPluginSettingsSubtitle"),
+ API.GetTranslation("KeepPluginSettingsTitle"),
+ button: MessageBoxButton.YesNo) == MessageBoxResult.No;
+
+ try
+ {
+ await API.UninstallPluginAsync(oldPlugin, removePluginSettings);
+ }
+ catch (Exception e)
+ {
+ API.LogException(ClassName, "Failed to uninstall plugin", e);
+ API.ShowMsgError(API.GetTranslation("ErrorUninstallingPlugin"));
+ return; // don’t restart on failure
+ }
+
+ if (FlowSettings.AutoRestartAfterChanging)
+ {
+ API.RestartApp();
+ }
+ else
+ {
+ API.ShowMsg(
+ API.GetTranslation("uninstallbtn"),
+ string.Format(
+ API.GetTranslation(
+ "UninstallSuccessNoRestart"),
+ oldPlugin.Name));
+ }
+ }
+
+ public static async Task UpdatePluginAndCheckRestartAsync(UserPlugin newPlugin, PluginMetadata oldPlugin)
+ {
+ if (API.ShowMsgBox(
+ string.Format(
+ API.GetTranslation("UpdatePromptSubtitle"),
+ oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
+ API.GetTranslation("UpdatePromptTitle"),
+ button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
+
+ try
+ {
+ var filePath = Path.Combine(Path.GetTempPath(), $"{newPlugin.Name}-{newPlugin.Version}.zip");
+
+ using var cts = new CancellationTokenSource();
+
+ if (!newPlugin.IsFromLocalInstallPath)
+ {
+ await DownloadFileAsync(
+ $"{API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
+ newPlugin.UrlDownload, filePath, cts);
+ }
+ else
+ {
+ filePath = newPlugin.LocalInstallPath;
+ }
+
+ // check if user cancelled download before installing plugin
+ if (cts.IsCancellationRequested)
+ {
+ return;
+ }
+ else
+ {
+ await API.UpdatePluginAsync(oldPlugin, newPlugin, filePath);
+ }
+ }
+ catch (Exception e)
+ {
+ API.LogException(ClassName, "Failed to update plugin", e);
+ API.ShowMsgError(API.GetTranslation("ErrorUpdatingPlugin"));
+ return; // don’t restart on failure
+ }
+
+ if (FlowSettings.AutoRestartAfterChanging)
+ {
+ API.RestartApp();
+ }
+ else
+ {
+ API.ShowMsg(
+ API.GetTranslation("updatebtn"),
+ string.Format(
+ API.GetTranslation(
+ "UpdateSuccessNoRestart"),
+ newPlugin.Name));
+ }
+ }
+
#endregion
#region Internal functions
@@ -694,6 +868,41 @@ namespace Flow.Launcher.Core.Plugin
}
}
+ internal static async Task DownloadFileAsync(string prgBoxTitle, string downloadUrl, string filePath, CancellationTokenSource cts, bool deleteFile = true, bool showProgress = true)
+ {
+ if (deleteFile && File.Exists(filePath))
+ File.Delete(filePath);
+
+ if (showProgress)
+ {
+ var exceptionHappened = false;
+ await API.ShowProgressBoxAsync(prgBoxTitle,
+ async (reportProgress) =>
+ {
+ if (reportProgress == null)
+ {
+ // when reportProgress is null, it means there is expcetion with the progress box
+ // so we record it with exceptionHappened and return so that progress box will close instantly
+ exceptionHappened = true;
+ return;
+ }
+ else
+ {
+ await API.HttpDownloadAsync(downloadUrl, filePath, reportProgress, cts.Token).ConfigureAwait(false);
+ }
+ }, cts.Cancel);
+
+ // if exception happened while downloading and user does not cancel downloading,
+ // we need to redownload the plugin
+ if (exceptionHappened && (!cts.IsCancellationRequested))
+ await API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
+ }
+ else
+ {
+ await API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
+ }
+ }
+
#endregion
}
}
diff --git a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
index 6b2cf6eed..a504b7a05 100644
--- a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
@@ -1,12 +1,7 @@
using System;
-using System.IO;
-using System.Threading;
using System.Threading.Tasks;
-using System.Windows;
-using CommunityToolkit.Mvvm.DependencyInjection;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core.Plugin;
-using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Version = SemanticVersioning.Version;
@@ -14,10 +9,6 @@ namespace Flow.Launcher.ViewModel
{
public partial class PluginStoreItemViewModel : BaseModel
{
- private static readonly string ClassName = nameof(PluginStoreItemViewModel);
-
- private static readonly Settings Settings = Ioc.Default.GetRequiredService();
-
private readonly UserPlugin _newPlugin;
private readonly PluginPair _oldPluginPair;
@@ -74,223 +65,17 @@ namespace Flow.Launcher.ViewModel
switch (action)
{
case "install":
- await InstallPluginAsync(_newPlugin);
+ await PluginManager.InstallPluginAndCheckRestartAsync(_newPlugin);
break;
case "uninstall":
- await UninstallPluginAsync(_oldPluginPair.Metadata);
+ await PluginManager.UninstallPluginAndCheckRestartAsync(_oldPluginPair.Metadata);
break;
case "update":
- await UpdatePluginAsync(_newPlugin, _oldPluginPair.Metadata);
+ await PluginManager.UpdatePluginAndCheckRestartAsync(_newPlugin, _oldPluginPair.Metadata);
break;
default:
break;
}
}
-
- internal static async Task InstallPluginAsync(UserPlugin newPlugin)
- {
- if (App.API.ShowMsgBox(
- string.Format(
- App.API.GetTranslation("InstallPromptSubtitle"),
- newPlugin.Name, newPlugin.Author, Environment.NewLine),
- App.API.GetTranslation("InstallPromptTitle"),
- button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
-
- try
- {
- // at minimum should provide a name, but handle plugin that is not downloaded from plugins manifest and is a url download
- var downloadFilename = string.IsNullOrEmpty(newPlugin.Version)
- ? $"{newPlugin.Name}-{Guid.NewGuid()}.zip"
- : $"{newPlugin.Name}-{newPlugin.Version}.zip";
-
- var filePath = Path.Combine(Path.GetTempPath(), downloadFilename);
-
- using var cts = new CancellationTokenSource();
-
- if (!newPlugin.IsFromLocalInstallPath)
- {
- await DownloadFileAsync(
- $"{App.API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
- newPlugin.UrlDownload, filePath, cts);
- }
- else
- {
- filePath = newPlugin.LocalInstallPath;
- }
-
- // check if user cancelled download before installing plugin
- if (cts.IsCancellationRequested)
- {
- return;
- }
- else
- {
- if (!File.Exists(filePath))
- {
- throw new FileNotFoundException($"Plugin {newPlugin.ID} zip file not found at {filePath}", filePath);
- }
-
- App.API.InstallPlugin(newPlugin, filePath);
-
- if (!newPlugin.IsFromLocalInstallPath)
- {
- File.Delete(filePath);
- }
- }
- }
- catch (Exception e)
- {
- App.API.LogException(ClassName, "Failed to install plugin", e);
- App.API.ShowMsgError(App.API.GetTranslation("ErrorInstallingPlugin"));
- return; // don’t restart on failure
- }
-
- if (Settings.AutoRestartAfterChanging)
- {
- App.API.RestartApp();
- }
- else
- {
- App.API.ShowMsg(
- App.API.GetTranslation("installbtn"),
- string.Format(
- App.API.GetTranslation(
- "InstallSuccessNoRestart"),
- newPlugin.Name));
- }
- }
-
- internal static async Task UninstallPluginAsync(PluginMetadata oldPlugin)
- {
- if (App.API.ShowMsgBox(
- string.Format(
- App.API.GetTranslation("UninstallPromptSubtitle"),
- oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
- App.API.GetTranslation("UninstallPromptTitle"),
- button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
-
- var removePluginSettings = App.API.ShowMsgBox(
- App.API.GetTranslation("KeepPluginSettingsSubtitle"),
- App.API.GetTranslation("KeepPluginSettingsTitle"),
- button: MessageBoxButton.YesNo) == MessageBoxResult.No;
-
- try
- {
- await App.API.UninstallPluginAsync(oldPlugin, removePluginSettings);
- }
- catch (Exception e)
- {
- App.API.LogException(ClassName, "Failed to uninstall plugin", e);
- App.API.ShowMsgError(App.API.GetTranslation("ErrorUninstallingPlugin"));
- return; // don’t restart on failure
- }
-
- if (Settings.AutoRestartAfterChanging)
- {
- App.API.RestartApp();
- }
- else
- {
- App.API.ShowMsg(
- App.API.GetTranslation("uninstallbtn"),
- string.Format(
- App.API.GetTranslation(
- "UninstallSuccessNoRestart"),
- oldPlugin.Name));
- }
- }
-
- internal static async Task UpdatePluginAsync(UserPlugin newPlugin, PluginMetadata oldPlugin)
- {
- if (App.API.ShowMsgBox(
- string.Format(
- App.API.GetTranslation("UpdatePromptSubtitle"),
- oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
- App.API.GetTranslation("UpdatePromptTitle"),
- button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
-
- try
- {
- var filePath = Path.Combine(Path.GetTempPath(), $"{newPlugin.Name}-{newPlugin.Version}.zip");
-
- using var cts = new CancellationTokenSource();
-
- if (!newPlugin.IsFromLocalInstallPath)
- {
- await DownloadFileAsync(
- $"{App.API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
- newPlugin.UrlDownload, filePath, cts);
- }
- else
- {
- filePath = newPlugin.LocalInstallPath;
- }
-
- // check if user cancelled download before installing plugin
- if (cts.IsCancellationRequested)
- {
- return;
- }
- else
- {
- await App.API.UpdatePluginAsync(oldPlugin, newPlugin, filePath);
- }
- }
- catch (Exception e)
- {
- App.API.LogException(ClassName, "Failed to update plugin", e);
- App.API.ShowMsgError(App.API.GetTranslation("ErrorUpdatingPlugin"));
- return; // don’t restart on failure
- }
-
- if (Settings.AutoRestartAfterChanging)
- {
- App.API.RestartApp();
- }
- else
- {
- App.API.ShowMsg(
- App.API.GetTranslation("updatebtn"),
- string.Format(
- App.API.GetTranslation(
- "UpdateSuccessNoRestart"),
- newPlugin.Name));
- }
- }
-
- private static async Task DownloadFileAsync(string prgBoxTitle, string downloadUrl, string filePath, CancellationTokenSource cts, bool deleteFile = true, bool showProgress = true)
- {
- if (deleteFile && File.Exists(filePath))
- File.Delete(filePath);
-
- if (showProgress)
- {
- var exceptionHappened = false;
- await App.API.ShowProgressBoxAsync(prgBoxTitle,
- async (reportProgress) =>
- {
- if (reportProgress == null)
- {
- // when reportProgress is null, it means there is expcetion with the progress box
- // so we record it with exceptionHappened and return so that progress box will close instantly
- exceptionHappened = true;
- return;
- }
- else
- {
- await App.API.HttpDownloadAsync(downloadUrl, filePath, reportProgress, cts.Token).ConfigureAwait(false);
- }
- }, cts.Cancel);
-
- // if exception happened while downloading and user does not cancel downloading,
- // we need to redownload the plugin
- if (exceptionHappened && (!cts.IsCancellationRequested))
- await App.API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
- }
- else
- {
- await App.API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
- }
- }
}
}
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index bda05a02d..f902fb037 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -172,7 +172,7 @@ namespace Flow.Launcher.ViewModel
[RelayCommand]
private async Task OpenDeletePluginWindowAsync()
{
- await PluginStoreItemViewModel.UninstallPluginAsync(PluginPair.Metadata);
+ await PluginManager.UninstallPluginAndCheckRestartAsync(PluginPair.Metadata);
}
[RelayCommand]
From 90ad72ca30ca7e99e3e84c4cac4e507f91b47a4c Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Fri, 23 May 2025 16:33:47 -0300
Subject: [PATCH 1142/1798] 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 1143/1798] 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 @@
SizeDate CreatedDate Modified
+ Relative DateDisplay File InfoDate and time formatSort 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 SettingPreview PanelTamanho
- Date Created
- Date Modified
+ Data Criação
+ Data Modificação
+ Data RelativaDisplay File InfoDate and time formatSort 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 1144/1798] 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 1145/1798] 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 SettingPreview PanelTamanho
- Data Criação
- Data Modificação
+ Data de Criação
+ Data de ModificaçãoData RelativaDisplay File InfoDate 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 1146/1798] =?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 1147/1798] 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 @@
SizeDate CreatedDate Modified
- Relative Date
+ File AgeDisplay File InfoDate and time formatSort 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 @@
TamanhoData de CriaçãoData de Modificação
- Data Relativa
+ Idade do ArquivoDisplay File InfoDate and time formatSort 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 1148/1798] 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 1149/1798] 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 1150/1798] 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 1151/1798] 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 SettingPreview PanelTamanho
- Data de Criação
- Data de Modificação
- Idade do Arquivo
+ Date Created
+ Date ModifiedDisplay File InfoDate and time formatSort 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 1152/1798] 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 1153/1798] 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 1154/1798] 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 1155/1798] 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 1156/1798] 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 1157/1798] 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 1158/1798] 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 5bae2020313e836ed8c15699cb007f260dce67be Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 02:34:24 -0300
Subject: [PATCH 1159/1798] Columns - Path and Name
---
.../Views/ExplorerSettings.xaml | 22 +++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 4302e721a..3ef61573d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -718,9 +718,27 @@
BorderThickness="1"
DragEnter="lbxAccessLinks_DragEnter"
Drop="LbxAccessLinks_OnDrop"
- ItemTemplate="{StaticResource ListViewTemplateAccessLinks}"
ItemsSource="{Binding Settings.QuickAccessLinks}"
- SelectedItem="{Binding SelectedQuickAccessLink}" />
+ SelectedItem="{Binding SelectedQuickAccessLink, Mode=TwoWay}">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Date: Sun, 25 May 2025 02:34:48 -0300
Subject: [PATCH 1160/1798] AccessLink Refactor
---
.../Search/QuickAccessLinks/AccessLink.cs | 21 +++++++++----------
1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs
index 1975211f9..8650b4c4c 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs
@@ -9,21 +9,20 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
public string Path { get; set; }
public ResultType Type { get; set; } = ResultType.Folder;
-
- [JsonIgnore]
- public string Name
+
+ public string Name { get; set; }
+
+ private string GetPathName()
{
- get
- {
- var path = Path.EndsWith(Constants.DirectorySeparator) ? Path[0..^1] : Path;
+ var path = Path.EndsWith(Constants.DirectorySeparator) ? Path[0..^1] : Path;
- if (path.EndsWith(':'))
- return path[0..^1] + " Drive";
+ if (path.EndsWith(':'))
+ return path[0..^1] + " Drive";
- return path.Split(new[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.None)
- .Last();
- }
+ return path.Split(new[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.None)
+ .Last();
}
+
}
}
From 179babe31371c27e55108c42e4e216ad595c6643 Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 02:35:09 -0300
Subject: [PATCH 1161/1798] New window to add/edit quick access link
---
.../Languages/en.xaml | 1 +
.../Views/QuickAccessLinkSettings.xaml | 136 ++++++++++++++++++
.../Views/QuickAccessLinkSettings.xaml.cs | 114 +++++++++++++++
3 files changed, 251 insertions(+)
create mode 100644 Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index eefd6f4eb..960373ef1 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -92,6 +92,7 @@
Permanently delete current filePermanently delete current folderPath:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
new file mode 100644
index 000000000..e6ad44e4e
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
new file mode 100644
index 000000000..9d2c54e2d
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -0,0 +1,114 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Windows;
+using System.Windows.Forms;
+using Flow.Launcher.Plugin.Explorer.Search;
+using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
+
+namespace Flow.Launcher.Plugin.Explorer.Views;
+
+public partial class QuickAccessLinkSettings : INotifyPropertyChanged
+{
+
+ private string _selectedPath;
+ public string SelectedPath
+ {
+ get => _selectedPath;
+ set
+ {
+ if (_selectedPath != value)
+ {
+ _selectedPath = value;
+ OnPropertyChanged();
+ SelectedName = GetPathName();
+ }
+ }
+ }
+
+
+ private string _selectedName;
+ public string SelectedName
+ {
+ get => _selectedName;
+ set
+ {
+ if (_selectedName != value)
+ {
+ _selectedName = value;
+ OnPropertyChanged();
+ }
+ }
+ }
+
+
+ public QuickAccessLinkSettings()
+ {
+ InitializeComponent();
+ }
+
+
+
+ private void BtnCancel_OnClick(object sender, RoutedEventArgs e)
+ {
+ DialogResult = false;
+ Close();
+ }
+
+ private void OnDoneButtonClick(object sender, RoutedEventArgs e)
+ {
+ var container = Settings.QuickAccessLinks;
+
+
+ // Lembrar de colocar uma logica pra evitar path e name vazios
+ var newAccessLink = new AccessLink
+ {
+ Name = SelectedName,
+ Path = SelectedPath
+ };
+ container.Add(newAccessLink);
+ DialogResult = false;
+ Close();
+ }
+
+ private void SelectPath_OnClick(object commandParameter, RoutedEventArgs e)
+ {
+ var folderBrowserDialog = new FolderBrowserDialog();
+
+ if (folderBrowserDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK)
+ return;
+
+ SelectedPath = folderBrowserDialog.SelectedPath;
+ }
+
+ private string GetPathName()
+ {
+ if (string.IsNullOrEmpty(SelectedPath)) return "";
+ var path = SelectedPath.EndsWith(Constants.DirectorySeparator) ? SelectedPath[0..^1] : SelectedPath;
+
+ if (path.EndsWith(':'))
+ return path[0..^1] + " Drive";
+
+ return path.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.None)
+ .Last();
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+
+ protected bool SetField(ref T field, T value, [CallerMemberName] string propertyName = null)
+ {
+ if (EqualityComparer.Default.Equals(field, value)) return false;
+ field = value;
+ OnPropertyChanged(propertyName);
+ return true;
+ }
+}
+
From 3777e2b6d86bfa2f689c942ee9bbf186dc50138d Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 02:36:55 -0300
Subject: [PATCH 1162/1798] Changing QuickAccessLinks property to static
This change is necessary for quick access settings window
---
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 4f83fc72e..2380a1ec9 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
@@ -15,7 +15,7 @@ namespace Flow.Launcher.Plugin.Explorer
{
public int MaxResult { get; set; } = 100;
- public ObservableCollection QuickAccessLinks { get; set; } = new();
+ public static ObservableCollection QuickAccessLinks { get; set; } = new();
public ObservableCollection IndexSearchExcludedSubdirectoryPaths { get; set; } = new ObservableCollection();
From 61aca7409668890b1a55a14457ec02f0414d1209 Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 02:41:17 -0300
Subject: [PATCH 1163/1798] Separating add commands between QuickAccessLink and
IndexSearchExcludedPaths
---
.../ViewModels/SettingsViewModel.cs | 27 ++++++++++---------
.../Views/ExplorerSettings.xaml | 4 +--
2 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index fb33dacab..508e20893 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -365,27 +365,28 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
}
[RelayCommand]
- private void AddLink(object commandParameter)
+ private void AddQuickAccessLink(object commandParameter)
{
- var container = commandParameter switch
- {
- "QuickAccessLink" => Settings.QuickAccessLinks,
- "IndexSearchExcludedPaths" => Settings.IndexSearchExcludedSubdirectoryPaths,
- _ => throw new ArgumentOutOfRangeException(nameof(commandParameter))
- };
-
- ArgumentNullException.ThrowIfNull(container);
-
+ var quickAccessLinkSettings = new QuickAccessLinkSettings();
+ quickAccessLinkSettings.ShowDialog();
+ }
+
+
+ [RelayCommand]
+ private void AddIndexSearchExcludePaths(object commandParameter)
+ {
+ var container = Settings.IndexSearchExcludedSubdirectoryPaths;
+
var folderBrowserDialog = new FolderBrowserDialog();
-
+
if (folderBrowserDialog.ShowDialog() != DialogResult.OK)
return;
-
+
var newAccessLink = new AccessLink
{
Path = folderBrowserDialog.SelectedPath
};
-
+
container.Add(newAccessLink);
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 3ef61573d..07f05b1c1 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -762,7 +762,7 @@
@@ -822,7 +822,7 @@
From 74167a91e39da13d45614228767ffa08f7ee9f4f Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 03:04:18 -0300
Subject: [PATCH 1164/1798] Strings translations and warning box
---
.../Languages/en.xaml | 4 ++++
.../Views/QuickAccessLinkSettings.xaml | 23 ++++++++++---------
.../Views/QuickAccessLinkSettings.xaml.cs | 12 +++++++++-
3 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index 960373ef1..573fba4d9 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -5,6 +5,7 @@
Please make a selection first
+ Please select path folderPlease select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -27,6 +28,9 @@
AddGeneral SettingCustomise Action Keywords
+ Customise Quick Access
+ Add
+
Quick Access LinksEverything SettingPreview Panel
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
index e6ad44e4e..ad2335c39 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
@@ -61,7 +61,7 @@
Margin="0 0 0 0"
FontSize="20"
FontWeight="SemiBold"
- Text="{DynamicResource plugin_explorer_manageactionkeywords_header}"
+ Text="{DynamicResource plugin_explorer_manage_quick_access_links_header}"
TextAlignment="Left" />
@@ -71,11 +71,12 @@
HorizontalAlignment="Left"
VerticalAlignment="Center"
FontSize="14"
- Text="{DynamicResource plugin_explorer_actionkeyword_current}" />
+ Text="{DynamicResource plugin_explorer_name}" />
@@ -86,23 +87,23 @@
HorizontalAlignment="Left"
VerticalAlignment="Center"
FontSize="14"
- Text="Path:" />
+ Text="{DynamicResource plugin_explorer_path}" />
-
-
+ Text="{Binding SelectedPath, Mode=TwoWay}"
+ IsReadOnly="True" />
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 9d2c54e2d..6b881b244 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -33,7 +33,11 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
private string _selectedName;
public string SelectedName
{
- get => _selectedName;
+ get
+ {
+ if (string.IsNullOrEmpty(_selectedName)) return GetPathName();
+ return _selectedName;
+ }
set
{
if (_selectedName != value)
@@ -60,6 +64,12 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
private void OnDoneButtonClick(object sender, RoutedEventArgs e)
{
+ if (string.IsNullOrEmpty(SelectedName) && string.IsNullOrEmpty(SelectedPath))
+ {
+ var warning = Main.Context.API.GetTranslation("plugin_explorer_quick_access_link_no_folder_selected");
+ Main.Context.API.ShowMsgBox(warning);
+ return;
+ }
var container = Settings.QuickAccessLinks;
From 3b425413a22b925a1479db6ee2345aa69b5065c4 Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 04:31:08 -0300
Subject: [PATCH 1165/1798] Edit access link
---
.../Search/QuickAccessLinks/AccessLink.cs | 21 +-----
.../ViewModels/SettingsViewModel.cs | 36 +++++++----
.../Views/ExplorerSettings.xaml | 4 +-
.../Views/QuickAccessLinkSettings.xaml.cs | 64 +++++++++++++------
4 files changed, 74 insertions(+), 51 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs
index 8650b4c4c..ce086ac8c 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs
@@ -1,28 +1,13 @@
-using System;
-using System.Linq;
-using System.Text.Json.Serialization;
-
-namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
+namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
{
public class AccessLink
{
public string Path { get; set; }
public ResultType Type { get; set; } = ResultType.Folder;
-
+
public string Name { get; set; }
-
- private string GetPathName()
- {
- var path = Path.EndsWith(Constants.DirectorySeparator) ? Path[0..^1] : Path;
- if (path.EndsWith(':'))
- return path[0..^1] + " Drive";
-
- return path.Split(new[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.None)
- .Last();
- }
-
}
-
+
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index 508e20893..eeb6b450e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -328,33 +328,43 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
}
[RelayCommand]
- private void EditLink(object commandParameter)
+ private void EditQuickAccessLink(object commandParameter)
{
- var (selectedLink, collection) = commandParameter switch
+ if (SelectedQuickAccessLink is null)
{
- "QuickAccessLink" => (SelectedQuickAccessLink, Settings.QuickAccessLinks),
- "IndexSearchExcludedPaths" => (SelectedIndexSearchExcludedPath, Settings.IndexSearchExcludedSubdirectoryPaths),
- _ => throw new ArgumentOutOfRangeException(nameof(commandParameter))
- };
+ ShowUnselectedMessage();
+ return;
+ }
+
+ var quickAccessLinkSettings = new QuickAccessLinkSettings(SelectedQuickAccessLink);
+ quickAccessLinkSettings.ShowDialog();
+ }
- if (selectedLink is null)
+ [RelayCommand]
+ private void EditIndexSearchExcludePaths(object commandParameter)
+ {
+
+ var collection = Settings.IndexSearchExcludedSubdirectoryPaths;
+
+ if (SelectedIndexSearchExcludedPath is null)
{
ShowUnselectedMessage();
return;
}
- var path = PromptUserSelectPath(selectedLink.Type,
- selectedLink.Type == ResultType.Folder
- ? selectedLink.Path
- : Path.GetDirectoryName(selectedLink.Path));
+ var path = PromptUserSelectPath(SelectedIndexSearchExcludedPath.Type,
+ SelectedIndexSearchExcludedPath.Type == ResultType.Folder
+ ? SelectedIndexSearchExcludedPath.Path
+ : Path.GetDirectoryName(SelectedIndexSearchExcludedPath.Path));
if (path is null)
return;
- collection.Remove(selectedLink);
+ var selectedType = SelectedIndexSearchExcludedPath.Type;
+ collection.Remove(SelectedIndexSearchExcludedPath);
collection.Add(new AccessLink
{
- Path = path, Type = selectedLink.Type,
+ Path = path, Type = selectedType,
});
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 07f05b1c1..0a52487c3 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -756,7 +756,7 @@
_selectedPath;
@@ -29,8 +33,9 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
}
}
-
+
private string _selectedName;
+
public string SelectedName
{
get
@@ -48,20 +53,29 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
}
}
-
public QuickAccessLinkSettings()
{
InitializeComponent();
}
-
-
-
+
+ public QuickAccessLinkSettings(AccessLink selectedAccessLink)
+ {
+ IsEdit = true;
+ _selectedName = selectedAccessLink.Name;
+ _selectedPath = selectedAccessLink.Path;
+ SelectedAccessLink = selectedAccessLink;
+ InitializeComponent();
+ }
+
+
+
private void BtnCancel_OnClick(object sender, RoutedEventArgs e)
{
DialogResult = false;
Close();
}
+
private void OnDoneButtonClick(object sender, RoutedEventArgs e)
{
if (string.IsNullOrEmpty(SelectedName) && string.IsNullOrEmpty(SelectedPath))
@@ -70,15 +84,13 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
Main.Context.API.ShowMsgBox(warning);
return;
}
- var container = Settings.QuickAccessLinks;
-
-
- // Lembrar de colocar uma logica pra evitar path e name vazios
- var newAccessLink = new AccessLink
+ if (IsEdit)
{
- Name = SelectedName,
- Path = SelectedPath
- };
+ EditAccessLink();
+ return;
+ }
+ var container = Settings.QuickAccessLinks;
+ var newAccessLink = new AccessLink { Name = SelectedName, Path = SelectedPath };
container.Add(newAccessLink);
DialogResult = false;
Close();
@@ -87,13 +99,13 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
private void SelectPath_OnClick(object commandParameter, RoutedEventArgs e)
{
var folderBrowserDialog = new FolderBrowserDialog();
-
+
if (folderBrowserDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK)
return;
SelectedPath = folderBrowserDialog.SelectedPath;
}
-
+
private string GetPathName()
{
if (string.IsNullOrEmpty(SelectedPath)) return "";
@@ -105,8 +117,24 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
return path.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.None)
.Last();
}
-
- public event PropertyChangedEventHandler PropertyChanged;
+
+ private void EditAccessLink()
+ {
+ if (SelectedAccessLink == null)throw new ArgumentException("Access Link object is null");
+
+ var obj = Settings.QuickAccessLinks.FirstOrDefault(x => x.GetHashCode() == SelectedAccessLink.GetHashCode());
+ int index = Settings.QuickAccessLinks.IndexOf(obj);
+ if (index >= 0)
+ {
+ SelectedAccessLink = new AccessLink { Name = SelectedName, Path = SelectedPath };
+ Settings.QuickAccessLinks[index] = SelectedAccessLink;
+ }
+ DialogResult = false;
+ IsEdit = false;
+ Close();
+ }
+
+public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
From 4b15add5244c9418fe0f444097c6691c62c04d83 Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 04:51:56 -0300
Subject: [PATCH 1166/1798] Code quality
---
.../ViewModels/SettingsViewModel.cs | 54 ++++++++++---------
.../Views/QuickAccessLinkSettings.xaml.cs | 13 +++--
2 files changed, 36 insertions(+), 31 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index eeb6b450e..439f3f87f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -327,18 +327,6 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
container.Add(link);
}
- [RelayCommand]
- private void EditQuickAccessLink(object commandParameter)
- {
- if (SelectedQuickAccessLink is null)
- {
- ShowUnselectedMessage();
- return;
- }
-
- var quickAccessLinkSettings = new QuickAccessLinkSettings(SelectedQuickAccessLink);
- quickAccessLinkSettings.ShowDialog();
- }
[RelayCommand]
private void EditIndexSearchExcludePaths(object commandParameter)
@@ -368,20 +356,6 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
});
}
- private void ShowUnselectedMessage()
- {
- var warning = Context.API.GetTranslation("plugin_explorer_make_selection_warning");
- Context.API.ShowMsgBox(warning);
- }
-
- [RelayCommand]
- private void AddQuickAccessLink(object commandParameter)
- {
- var quickAccessLinkSettings = new QuickAccessLinkSettings();
- quickAccessLinkSettings.ShowDialog();
- }
-
-
[RelayCommand]
private void AddIndexSearchExcludePaths(object commandParameter)
{
@@ -400,6 +374,28 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
container.Add(newAccessLink);
}
+ [RelayCommand]
+ private void EditQuickAccessLink(object commandParameter)
+ {
+ if (SelectedQuickAccessLink is null)
+ {
+ ShowUnselectedMessage();
+ return;
+ }
+
+ var quickAccessLinkSettings = new QuickAccessLinkSettings(SelectedQuickAccessLink);
+ quickAccessLinkSettings.ShowDialog();
+ }
+
+ [RelayCommand]
+ private void AddQuickAccessLink(object commandParameter)
+ {
+ var quickAccessLinkSettings = new QuickAccessLinkSettings();
+ quickAccessLinkSettings.ShowDialog();
+ }
+
+
+
[RelayCommand]
private void RemoveLink(object obj)
{
@@ -418,6 +414,12 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
}
Save();
}
+
+ private void ShowUnselectedMessage()
+ {
+ var warning = Context.API.GetTranslation("plugin_explorer_make_selection_warning");
+ Context.API.ShowMsgBox(warning);
+ }
#endregion
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 7bd67b54e..454935bd4 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -14,9 +14,7 @@ namespace Flow.Launcher.Plugin.Explorer.Views;
public partial class QuickAccessLinkSettings : INotifyPropertyChanged
{
-
- private bool IsEdit { get; set; }
- [CanBeNull] private AccessLink SelectedAccessLink { get; set; }
+
private string _selectedPath;
public string SelectedPath
@@ -28,7 +26,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
{
_selectedPath = value;
OnPropertyChanged();
- SelectedName = GetPathName();
+ if (string.IsNullOrEmpty(_selectedName)) SelectedName = GetPathName();
}
}
}
@@ -53,6 +51,8 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
}
}
+ private bool IsEdit { get; set; }
+ [CanBeNull] private AccessLink SelectedAccessLink { get; set; }
public QuickAccessLinkSettings()
{
InitializeComponent();
@@ -78,7 +78,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
private void OnDoneButtonClick(object sender, RoutedEventArgs e)
{
- if (string.IsNullOrEmpty(SelectedName) && string.IsNullOrEmpty(SelectedPath))
+ if (string.IsNullOrEmpty(SelectedName) || string.IsNullOrEmpty(SelectedPath))
{
var warning = Main.Context.API.GetTranslation("plugin_explorer_quick_access_link_no_folder_selected");
Main.Context.API.ShowMsgBox(warning);
@@ -122,6 +122,9 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
{
if (SelectedAccessLink == null)throw new ArgumentException("Access Link object is null");
+
+ // Talvez nao seja preciso buscar pelo hash code, mas sim pelo nome ou path
+ // Uma possivel validação, se pode nomes e paths iguais
var obj = Settings.QuickAccessLinks.FirstOrDefault(x => x.GetHashCode() == SelectedAccessLink.GetHashCode());
int index = Settings.QuickAccessLinks.IndexOf(obj);
if (index >= 0)
From 287f3f8a5f9b13fb3062944131ddaadc90b84df0 Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 14:12:15 -0300
Subject: [PATCH 1167/1798] Settings
---
Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs | 2 +-
.../ViewModels/SettingsViewModel.cs | 4 ++--
.../Views/QuickAccessLinkSettings.xaml.cs | 8 ++++++--
3 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
index 2380a1ec9..4f83fc72e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
@@ -15,7 +15,7 @@ namespace Flow.Launcher.Plugin.Explorer
{
public int MaxResult { get; set; } = 100;
- public static ObservableCollection QuickAccessLinks { get; set; } = new();
+ public ObservableCollection QuickAccessLinks { get; set; } = new();
public ObservableCollection IndexSearchExcludedSubdirectoryPaths { get; set; } = new ObservableCollection();
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index 439f3f87f..447e72736 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -383,14 +383,14 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
return;
}
- var quickAccessLinkSettings = new QuickAccessLinkSettings(SelectedQuickAccessLink);
+ var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings,SelectedQuickAccessLink);
quickAccessLinkSettings.ShowDialog();
}
[RelayCommand]
private void AddQuickAccessLink(object commandParameter)
{
- var quickAccessLinkSettings = new QuickAccessLinkSettings();
+ var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings);
quickAccessLinkSettings.ShowDialog();
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 454935bd4..3c9ba7ea5 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -53,17 +53,21 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
private bool IsEdit { get; set; }
[CanBeNull] private AccessLink SelectedAccessLink { get; set; }
- public QuickAccessLinkSettings()
+
+ private Settings Settings { get; }
+ public QuickAccessLinkSettings(Settings settings)
{
+ Settings = settings;
InitializeComponent();
}
- public QuickAccessLinkSettings(AccessLink selectedAccessLink)
+ public QuickAccessLinkSettings(Settings settings,AccessLink selectedAccessLink)
{
IsEdit = true;
_selectedName = selectedAccessLink.Name;
_selectedPath = selectedAccessLink.Path;
SelectedAccessLink = selectedAccessLink;
+ Settings = settings;
InitializeComponent();
}
From a6a544a48838ef52dc61410d7b222f01ff425d56 Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 14:26:47 -0300
Subject: [PATCH 1168/1798] Translations
---
Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml | 3 ++-
.../Views/QuickAccessLinkSettings.xaml.cs | 7 +++++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index 573fba4d9..16bc9482f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -5,7 +5,8 @@
Please make a selection first
- Please select path folder
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 3c9ba7ea5..e12898b5e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -88,6 +88,13 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
Main.Context.API.ShowMsgBox(warning);
return;
}
+
+ if (Settings.QuickAccessLinks.Any(x => x.Path == SelectedPath && x.Name == SelectedName))
+ {
+ var warning = Main.Context.API.GetTranslation("plugin_explorer_quick_access_link_select_different_folder");
+ Main.Context.API.ShowMsgBox(warning);
+ return;
+ }
if (IsEdit)
{
EditAccessLink();
From fdeec1189627360c562b1662188f252ff7b4065c Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 14:45:44 -0300
Subject: [PATCH 1169/1798] FixLegacyQuickAccessLinkNames
---
.../Helper/FolderPathHelper.cs | 22 +++++++++++++++++
Plugins/Flow.Launcher.Plugin.Explorer/Main.cs | 15 +++++++++++-
.../Views/QuickAccessLinkSettings.xaml.cs | 24 ++++---------------
3 files changed, 40 insertions(+), 21 deletions(-)
create mode 100644 Plugins/Flow.Launcher.Plugin.Explorer/Helper/FolderPathHelper.cs
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/FolderPathHelper.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/FolderPathHelper.cs
new file mode 100644
index 000000000..74e23be3a
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/FolderPathHelper.cs
@@ -0,0 +1,22 @@
+using System;
+using System.IO;
+using System.Linq;
+using Flow.Launcher.Plugin.Explorer.Search;
+
+namespace Flow.Launcher.Plugin.Explorer.Helper;
+
+public static class FolderPathHelper
+{
+ public static string GetPathName(this string selectedPath)
+ {
+ if (string.IsNullOrEmpty(selectedPath)) return "";
+ var path = selectedPath.EndsWith(Constants.DirectorySeparator) ? selectedPath[0..^1] : selectedPath;
+
+ if (path.EndsWith(':'))
+ return path[0..^1] + " Drive";
+
+ return path.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.None)
+ .Last();
+ }
+
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
index 1c5d074a0..cb2d29ec1 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
@@ -6,6 +6,7 @@ using Flow.Launcher.Plugin.Explorer.Views;
using System;
using System.Collections.Generic;
using System.IO;
+using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Controls;
@@ -35,7 +36,8 @@ namespace Flow.Launcher.Plugin.Explorer
Context = context;
Settings = context.API.LoadSettingJsonStorage();
-
+ FixLegacyQuickAccessLinkNames();
+
viewModel = new SettingsViewModel(context, Settings);
contextMenu = new ContextMenu(Context, Settings, viewModel);
@@ -95,5 +97,16 @@ namespace Flow.Launcher.Plugin.Explorer
{
return Context.API.GetTranslation("plugin_explorer_plugin_description");
}
+
+ private void FixLegacyQuickAccessLinkNames()
+ {
+ foreach (var link in Settings.QuickAccessLinks)
+ {
+ if (string.IsNullOrWhiteSpace(link.Name))
+ {
+ link.Name = link.Path.GetPathName();
+ }
+ }
+ }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index e12898b5e..5eda62558 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -1,12 +1,11 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
-using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Forms;
-using Flow.Launcher.Plugin.Explorer.Search;
+using Flow.Launcher.Plugin.Explorer.Helper;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
using JetBrains.Annotations;
@@ -26,7 +25,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
{
_selectedPath = value;
OnPropertyChanged();
- if (string.IsNullOrEmpty(_selectedName)) SelectedName = GetPathName();
+ if (string.IsNullOrEmpty(_selectedName)) SelectedName = _selectedPath.GetPathName();
}
}
}
@@ -38,7 +37,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
{
get
{
- if (string.IsNullOrEmpty(_selectedName)) return GetPathName();
+ if (string.IsNullOrEmpty(_selectedName)) return _selectedPath.GetPathName();
return _selectedName;
}
set
@@ -116,26 +115,11 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
SelectedPath = folderBrowserDialog.SelectedPath;
}
-
- private string GetPathName()
- {
- if (string.IsNullOrEmpty(SelectedPath)) return "";
- var path = SelectedPath.EndsWith(Constants.DirectorySeparator) ? SelectedPath[0..^1] : SelectedPath;
-
- if (path.EndsWith(':'))
- return path[0..^1] + " Drive";
-
- return path.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.None)
- .Last();
- }
-
+
private void EditAccessLink()
{
if (SelectedAccessLink == null)throw new ArgumentException("Access Link object is null");
-
- // Talvez nao seja preciso buscar pelo hash code, mas sim pelo nome ou path
- // Uma possivel validação, se pode nomes e paths iguais
var obj = Settings.QuickAccessLinks.FirstOrDefault(x => x.GetHashCode() == SelectedAccessLink.GetHashCode());
int index = Settings.QuickAccessLinks.IndexOf(obj);
if (index >= 0)
From 589e37a6465d481dcb2dc51f32419f8b3183c0b8 Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 15:49:25 -0300
Subject: [PATCH 1170/1798] Action QuickAccessLinks
---
Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs | 4 +++-
Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml | 2 --
.../Views/QuickAccessLinkSettings.xaml | 4 ++--
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
index eabd118fb..195f7c91a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
@@ -75,7 +75,9 @@ namespace Flow.Launcher.Plugin.Explorer
{
Settings.QuickAccessLinks.Add(new AccessLink
{
- Path = record.FullPath, Type = record.Type
+ Name = record.FullPath.GetPathName(),
+ Path = record.FullPath,
+ Type = record.Type
});
Context.API.ShowMsg(Context.API.GetTranslation("plugin_explorer_addfilefoldersuccess"),
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index 16bc9482f..ef55a4088 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -30,8 +30,6 @@
General SettingCustomise Action KeywordsCustomise Quick Access
- Add
-
Quick Access LinksEverything SettingPreview Panel
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
index ad2335c39..e9ba53618 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
@@ -4,7 +4,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Flow.Launcher.Plugin.Explorer.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- Title="{DynamicResource plugin_explorer_manageactionkeywords_header}"
+ Title="{DynamicResource plugin_explorer_manage_quick_access_links_header}"
Width="Auto"
Height="255"
Background="{DynamicResource PopuBGColor}"
@@ -129,7 +129,7 @@
Margin="5 0 0 0"
Click="OnDoneButtonClick"
Style="{StaticResource AccentButtonStyle}">
-
+
From bc2648c216b4ee485c584bd81e1abb3ada9ba3cb Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 16:05:26 -0300
Subject: [PATCH 1171/1798] Code quality
---
.../ViewModels/SettingsViewModel.cs | 4 ++--
.../Views/QuickAccessLinkSettings.xaml.cs | 23 ++++++++++---------
2 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index 447e72736..6237deabb 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -383,14 +383,14 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
return;
}
- var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings,SelectedQuickAccessLink);
+ var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings.QuickAccessLinks,SelectedQuickAccessLink);
quickAccessLinkSettings.ShowDialog();
}
[RelayCommand]
private void AddQuickAccessLink(object commandParameter)
{
- var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings);
+ var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings.QuickAccessLinks);
quickAccessLinkSettings.ShowDialog();
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 5eda62558..28cd68bad 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
@@ -53,20 +54,21 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
private bool IsEdit { get; set; }
[CanBeNull] private AccessLink SelectedAccessLink { get; set; }
- private Settings Settings { get; }
- public QuickAccessLinkSettings(Settings settings)
+ public ObservableCollection QuickAccessLinks { get; set; }
+
+ public QuickAccessLinkSettings(ObservableCollection quickAccessLinks)
{
- Settings = settings;
+ QuickAccessLinks = quickAccessLinks;
InitializeComponent();
}
- public QuickAccessLinkSettings(Settings settings,AccessLink selectedAccessLink)
+ public QuickAccessLinkSettings(ObservableCollection quickAccessLinks,AccessLink selectedAccessLink)
{
IsEdit = true;
_selectedName = selectedAccessLink.Name;
_selectedPath = selectedAccessLink.Path;
SelectedAccessLink = selectedAccessLink;
- Settings = settings;
+ QuickAccessLinks = quickAccessLinks;
InitializeComponent();
}
@@ -88,7 +90,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
return;
}
- if (Settings.QuickAccessLinks.Any(x => x.Path == SelectedPath && x.Name == SelectedName))
+ if (QuickAccessLinks.Any(x => x.Path == SelectedPath && x.Name == SelectedName))
{
var warning = Main.Context.API.GetTranslation("plugin_explorer_quick_access_link_select_different_folder");
Main.Context.API.ShowMsgBox(warning);
@@ -99,9 +101,8 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
EditAccessLink();
return;
}
- var container = Settings.QuickAccessLinks;
var newAccessLink = new AccessLink { Name = SelectedName, Path = SelectedPath };
- container.Add(newAccessLink);
+ QuickAccessLinks.Add(newAccessLink);
DialogResult = false;
Close();
}
@@ -120,12 +121,12 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
{
if (SelectedAccessLink == null)throw new ArgumentException("Access Link object is null");
- var obj = Settings.QuickAccessLinks.FirstOrDefault(x => x.GetHashCode() == SelectedAccessLink.GetHashCode());
- int index = Settings.QuickAccessLinks.IndexOf(obj);
+ var obj = QuickAccessLinks.FirstOrDefault(x => x.GetHashCode() == SelectedAccessLink.GetHashCode());
+ int index = QuickAccessLinks.IndexOf(obj);
if (index >= 0)
{
SelectedAccessLink = new AccessLink { Name = SelectedName, Path = SelectedPath };
- Settings.QuickAccessLinks[index] = SelectedAccessLink;
+ QuickAccessLinks[index] = SelectedAccessLink;
}
DialogResult = false;
IsEdit = false;
From cd62e7b5dc4695a83339d2a02c9682603d775479 Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 16:11:03 -0300
Subject: [PATCH 1172/1798] uP
---
.../Helper/{FolderPathHelper.cs => PathHelper.cs} | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
rename Plugins/Flow.Launcher.Plugin.Explorer/Helper/{FolderPathHelper.cs => PathHelper.cs} (94%)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/FolderPathHelper.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/PathHelper.cs
similarity index 94%
rename from Plugins/Flow.Launcher.Plugin.Explorer/Helper/FolderPathHelper.cs
rename to Plugins/Flow.Launcher.Plugin.Explorer/Helper/PathHelper.cs
index 74e23be3a..36b098d1e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/FolderPathHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/PathHelper.cs
@@ -5,7 +5,7 @@ using Flow.Launcher.Plugin.Explorer.Search;
namespace Flow.Launcher.Plugin.Explorer.Helper;
-public static class FolderPathHelper
+public static class PathHelper
{
public static string GetPathName(this string selectedPath)
{
From 29831d61bb2b496b88ecd8588c0518e506d7ea3e Mon Sep 17 00:00:00 2001
From: 01Dri
Date: Sun, 25 May 2025 16:48:20 -0300
Subject: [PATCH 1173/1798] AI Review Refactor suggestion
---
.../Languages/en.xaml | 2 +-
.../ViewModels/SettingsViewModel.cs | 10 ++++----
.../Views/QuickAccessLinkSettings.xaml.cs | 23 ++++++++++---------
3 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index ef55a4088..cc6b58e42 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -6,7 +6,7 @@
Please make a selection firstPlease select a folder path.
- Please choose a different name or folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index 6237deabb..d6effb4e2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -9,6 +9,7 @@ using System.Linq;
using System.Windows;
using System.Windows.Forms;
using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Plugin.Explorer.Helper;
using Flow.Launcher.Plugin.Explorer.Search;
using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions;
@@ -352,7 +353,7 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
collection.Remove(SelectedIndexSearchExcludedPath);
collection.Add(new AccessLink
{
- Path = path, Type = selectedType,
+ Path = path, Type = selectedType, Name = path.GetPathName()
});
}
@@ -368,10 +369,12 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
var newAccessLink = new AccessLink
{
+ Name = folderBrowserDialog.SelectedPath.GetPathName(),
Path = folderBrowserDialog.SelectedPath
};
container.Add(newAccessLink);
+ Save();
}
[RelayCommand]
@@ -382,16 +385,15 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
ShowUnselectedMessage();
return;
}
-
var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings.QuickAccessLinks,SelectedQuickAccessLink);
- quickAccessLinkSettings.ShowDialog();
+ if (quickAccessLinkSettings.ShowDialog() == true) Save();
}
[RelayCommand]
private void AddQuickAccessLink(object commandParameter)
{
var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings.QuickAccessLinks);
- quickAccessLinkSettings.ShowDialog();
+ if (quickAccessLinkSettings.ShowDialog() == true) Save();
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 28cd68bad..388fc2c91 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -52,9 +52,9 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
}
private bool IsEdit { get; set; }
- [CanBeNull] private AccessLink SelectedAccessLink { get; set; }
+ [CanBeNull] private AccessLink SelectedAccessLink { get; }
- public ObservableCollection QuickAccessLinks { get; set; }
+ public ObservableCollection QuickAccessLinks { get; }
public QuickAccessLinkSettings(ObservableCollection quickAccessLinks)
{
@@ -89,10 +89,12 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
Main.Context.API.ShowMsgBox(warning);
return;
}
-
- if (QuickAccessLinks.Any(x => x.Path == SelectedPath && x.Name == SelectedName))
+
+ if (QuickAccessLinks.Any(x =>
+ x.Path.Equals(SelectedPath, StringComparison.OrdinalIgnoreCase) &&
+ x.Name.Equals(SelectedName, StringComparison.OrdinalIgnoreCase)))
{
- var warning = Main.Context.API.GetTranslation("plugin_explorer_quick_access_link_select_different_folder");
+ var warning = Main.Context.API.GetTranslation("plugin_explorer_quick_access_link_path_already_exists");
Main.Context.API.ShowMsgBox(warning);
return;
}
@@ -103,7 +105,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
}
var newAccessLink = new AccessLink { Name = SelectedName, Path = SelectedPath };
QuickAccessLinks.Add(newAccessLink);
- DialogResult = false;
+ DialogResult = true;
Close();
}
@@ -121,14 +123,13 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
{
if (SelectedAccessLink == null)throw new ArgumentException("Access Link object is null");
- var obj = QuickAccessLinks.FirstOrDefault(x => x.GetHashCode() == SelectedAccessLink.GetHashCode());
- int index = QuickAccessLinks.IndexOf(obj);
+ var index = QuickAccessLinks.IndexOf(SelectedAccessLink);
if (index >= 0)
{
- SelectedAccessLink = new AccessLink { Name = SelectedName, Path = SelectedPath };
- QuickAccessLinks[index] = SelectedAccessLink;
+ var updatedLink = new AccessLink { Name = SelectedName, Path = SelectedPath };
+ QuickAccessLinks[index] = updatedLink;
}
- DialogResult = false;
+ DialogResult = true;
IsEdit = false;
Close();
}
From 47878f3829a9cb10f87d5429d07fad097efec3dd Mon Sep 17 00:00:00 2001
From: DB p
Date: Tue, 27 May 2025 14:08:32 +0900
Subject: [PATCH 1174/1798] 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 1175/1798] 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 1176/1798] 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 1177/1798] 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 1178/1798] 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 1179/1798] 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 1180/1798] 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 1181/1798] 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 4a50eec281e6013301efd5b56eb5c601d3921565 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 30 May 2025 10:59:22 +0800
Subject: [PATCH 1182/1798] Remove TranslationConverter & project reference in
Explorer plugin
---
.../Resource/TranslationConverter.cs | 25 -------------------
.../UserSettings/CustomShortcutModel.cs | 8 ++++++
.../Resources/SettingWindowStyle.xaml | 1 -
.../Views/SettingsPaneHotkey.xaml | 2 +-
.../Flow.Launcher.Plugin.Explorer.csproj | 3 +--
.../ViewModels/ActionKeywordModel.cs | 2 ++
.../Views/ExplorerSettings.xaml | 6 ++---
7 files changed, 14 insertions(+), 33 deletions(-)
delete mode 100644 Flow.Launcher.Core/Resource/TranslationConverter.cs
diff --git a/Flow.Launcher.Core/Resource/TranslationConverter.cs b/Flow.Launcher.Core/Resource/TranslationConverter.cs
deleted file mode 100644
index eb0032758..000000000
--- a/Flow.Launcher.Core/Resource/TranslationConverter.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.Globalization;
-using System.Windows.Data;
-using CommunityToolkit.Mvvm.DependencyInjection;
-using Flow.Launcher.Plugin;
-
-namespace Flow.Launcher.Core.Resource
-{
- public class TranslationConverter : IValueConverter
- {
- // We should not initialize API in static constructor because it will create another API instance
- private static IPublicAPI api = null;
- private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService();
-
- public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
- {
- var key = value.ToString();
- if (string.IsNullOrEmpty(key)) return key;
- return API.GetTranslation(key);
- }
-
- public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
- throw new InvalidOperationException();
- }
-}
diff --git a/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
index 2d15b54c5..2603d4675 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
@@ -1,6 +1,8 @@
using System;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
+using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.Plugin;
namespace Flow.Launcher.Infrastructure.UserSettings
{
@@ -53,6 +55,12 @@ namespace Flow.Launcher.Infrastructure.UserSettings
{
public string Description { get; set; }
+ public string LocalizedDescription => API.GetTranslation(Description);
+
+ // We should not initialize API in static constructor because it will create another API instance
+ private static IPublicAPI api = null;
+ private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService();
+
public BaseBuiltinShortcutModel(string key, string description)
{
Key = key;
diff --git a/Flow.Launcher/Resources/SettingWindowStyle.xaml b/Flow.Launcher/Resources/SettingWindowStyle.xaml
index fc9246aa3..3ebd22c74 100644
--- a/Flow.Launcher/Resources/SettingWindowStyle.xaml
+++ b/Flow.Launcher/Resources/SettingWindowStyle.xaml
@@ -6,7 +6,6 @@
- F1 M512,512z M0,0z M448,256C448,150,362,64,256,64L256,448C362,448,448,362,448,256z M0,256A256,256,0,1,1,512,256A256,256,0,1,1,0,256z
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
index b1d72ede5..861e9d294 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
@@ -424,7 +424,7 @@
-
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index 98164f489..93691814a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -46,6 +46,7 @@
+
@@ -53,8 +54,6 @@
-
-
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
index d4cd1348e..745032d2c 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
@@ -24,6 +24,8 @@ namespace Flow.Launcher.Plugin.Explorer.Views
public string Description { get; private init; }
+ public string LocalizedDescription => Main.Context.API.GetTranslation(Description);
+
internal Settings.ActionKeyword KeywordProperty { get; }
private void OnPropertyChanged([CallerMemberName] string propertyName = "")
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 4302e721a..c034ac0e1 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -3,7 +3,6 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:Flow.Launcher.Plugin.Explorer.Views.Converters"
- xmlns:core="clr-namespace:Flow.Launcher.Core.Resource;assembly=Flow.Launcher.Core"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:qa="clr-namespace:Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks"
@@ -109,7 +108,7 @@
+ Text="{Binding LocalizedDescription, Mode=OneTime}">
+
From b1557dd4affb3d37949a515ea6e6c1585a13e501 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 17:32:30 +0800
Subject: [PATCH 1234/1798] Add try-catch for preview panel operation
---
.../Views/PreviewPanel.xaml.cs | 119 ++++++++++++------
1 file changed, 81 insertions(+), 38 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index 13339fa45..f4d7f8436 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -16,6 +16,8 @@ namespace Flow.Launcher.Plugin.Explorer.Views;
public partial class PreviewPanel : UserControl, INotifyPropertyChanged
{
+ private static readonly string ClassName = nameof(PreviewPanel);
+
private string FilePath { get; }
public string FileSize { get; } = "";
public string CreatedAt { get; } = "";
@@ -87,78 +89,119 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
public static string GetFileSize(string filePath)
{
- var fileInfo = new FileInfo(filePath);
- return ResultManager.ToReadableSize(fileInfo.Length, 2);
+ try
+ {
+ var fileInfo = new FileInfo(filePath);
+ return ResultManager.ToReadableSize(fileInfo.Length, 2);
+ }
+ catch (Exception e)
+ {
+ Main.Context.API.LogException(ClassName, $"Failed to get file size for {filePath}", e);
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
}
public static string GetFileCreatedAt(string filePath, string previewPanelDateFormat, string previewPanelTimeFormat, bool showFileAgeInPreviewPanel)
{
- var createdDate = File.GetCreationTime(filePath);
- var formattedDate = createdDate.ToString(
- $"{previewPanelDateFormat} {previewPanelTimeFormat}",
- CultureInfo.CurrentCulture
- );
+ try
+ {
+ var createdDate = File.GetCreationTime(filePath);
+ var formattedDate = createdDate.ToString(
+ $"{previewPanelDateFormat} {previewPanelTimeFormat}",
+ CultureInfo.CurrentCulture
+ );
- var result = formattedDate;
- if (showFileAgeInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}";
- return result;
+ var result = formattedDate;
+ if (showFileAgeInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}";
+ return result;
+ }
+ catch (Exception e)
+ {
+ Main.Context.API.LogException(ClassName, $"Failed to get file created date for {filePath}", e);
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
}
public static string GetFileLastModifiedAt(string filePath, string previewPanelDateFormat, string previewPanelTimeFormat, bool showFileAgeInPreviewPanel)
{
- var lastModifiedDate = File.GetLastWriteTime(filePath);
- var formattedDate = lastModifiedDate.ToString(
- $"{previewPanelDateFormat} {previewPanelTimeFormat}",
- CultureInfo.CurrentCulture
- );
+ try
+ {
+ var lastModifiedDate = File.GetLastWriteTime(filePath);
+ var formattedDate = lastModifiedDate.ToString(
+ $"{previewPanelDateFormat} {previewPanelTimeFormat}",
+ CultureInfo.CurrentCulture
+ );
- var result = formattedDate;
- if (showFileAgeInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}";
- return result;
+ var result = formattedDate;
+ if (showFileAgeInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}";
+ return result;
+ }
+ catch (Exception e)
+ {
+ Main.Context.API.LogException(ClassName, $"Failed to get file modified date for {filePath}", e);
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
}
public static string GetFolderSize(string folderPath)
{
- var directoryInfo = new DirectoryInfo(folderPath);
- long size = 0;
try
{
+ var directoryInfo = new DirectoryInfo(folderPath);
+ long size = 0;
foreach (var file in directoryInfo.GetFiles("*", SearchOption.AllDirectories))
{
size += file.Length;
}
+ return ResultManager.ToReadableSize(size, 2);
}
- catch (Exception)
+ catch (Exception e)
{
+ Main.Context.API.LogException(ClassName, $"Failed to get folder size for {folderPath}", e);
return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
}
- return ResultManager.ToReadableSize(size, 2);
}
public static string GetFolderCreatedAt(string folderPath, string previewPanelDateFormat, string previewPanelTimeFormat, bool showFileAgeInPreviewPanel)
{
- var createdDate = Directory.GetCreationTime(folderPath);
- var formattedDate = createdDate.ToString(
- $"{previewPanelDateFormat} {previewPanelTimeFormat}",
- CultureInfo.CurrentCulture
- );
+ try
+ {
+ var createdDate = Directory.GetCreationTime(folderPath);
+ var formattedDate = createdDate.ToString(
+ $"{previewPanelDateFormat} {previewPanelTimeFormat}",
+ CultureInfo.CurrentCulture
+ );
- var result = formattedDate;
- if (showFileAgeInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}";
- return result;
+ var result = formattedDate;
+ if (showFileAgeInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}";
+ return result;
+ }
+ catch (Exception e)
+ {
+ Main.Context.API.LogException(ClassName, $"Failed to get folder created date for {folderPath}", e);
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
}
public static string GetFolderLastModifiedAt(string folderPath, string previewPanelDateFormat, string previewPanelTimeFormat, bool showFileAgeInPreviewPanel)
{
- var lastModifiedDate = Directory.GetLastWriteTime(folderPath);
- var formattedDate = lastModifiedDate.ToString(
- $"{previewPanelDateFormat} {previewPanelTimeFormat}",
- CultureInfo.CurrentCulture
- );
+ try
+ {
+ var lastModifiedDate = Directory.GetLastWriteTime(folderPath);
+ var formattedDate = lastModifiedDate.ToString(
+ $"{previewPanelDateFormat} {previewPanelTimeFormat}",
+ CultureInfo.CurrentCulture
+ );
- var result = formattedDate;
- if (showFileAgeInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}";
- return result;
+ var result = formattedDate;
+ if (showFileAgeInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}";
+ return result;
+ }
+ catch (Exception e)
+ {
+ Main.Context.API.LogException(ClassName, $"Failed to get folder modified date for {folderPath}", e);
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
}
private static string GetFileAge(DateTime fileDateTime)
From edb4d743e9d193624871d1522a53c775ee2f1fa2 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 17:36:37 +0800
Subject: [PATCH 1235/1798] Add timeout for folder size calculation
---
.../Views/PreviewPanel.xaml.cs | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index f4d7f8436..a427a0a42 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -3,6 +3,7 @@ using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Runtime.CompilerServices;
+using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
@@ -149,8 +150,15 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
{
var directoryInfo = new DirectoryInfo(folderPath);
long size = 0;
+ var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(3));
foreach (var file in directoryInfo.GetFiles("*", SearchOption.AllDirectories))
{
+ if (cancellationTokenSource.Token.IsCancellationRequested)
+ {
+ // Timeout occurred, return unknown size
+ cancellationTokenSource.Dispose();
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
size += file.Length;
}
return ResultManager.ToReadableSize(size, 2);
From f2a7536298965fd77d83ba74e4af83750b7143bf Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Wed, 4 Jun 2025 17:42:56 +0800
Subject: [PATCH 1236/1798] Use EnumerateFiles instead of GetFiles
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
.../Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index a427a0a42..80c99ab9f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -151,7 +151,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
var directoryInfo = new DirectoryInfo(folderPath);
long size = 0;
var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(3));
- foreach (var file in directoryInfo.GetFiles("*", SearchOption.AllDirectories))
+ foreach (var file in directoryInfo.EnumerateFiles("*", SearchOption.AllDirectories))
{
if (cancellationTokenSource.Token.IsCancellationRequested)
{
From 32b75b4a4fcbc1039be92d55535049e0b0eaa05b Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 17:44:24 +0800
Subject: [PATCH 1237/1798] Fix CancellationTokenSource dispose state
---
.../Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index 80c99ab9f..a3a0ad0aa 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -150,13 +150,12 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
{
var directoryInfo = new DirectoryInfo(folderPath);
long size = 0;
- var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(3));
+ using var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(3));
foreach (var file in directoryInfo.EnumerateFiles("*", SearchOption.AllDirectories))
{
if (cancellationTokenSource.Token.IsCancellationRequested)
{
// Timeout occurred, return unknown size
- cancellationTokenSource.Dispose();
return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
}
size += file.Length;
From f4d6ef371a7738924b3c6a3ee857ce76544e1482 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 18:57:20 +0800
Subject: [PATCH 1238/1798] Fix typos
---
Flow.Launcher/PublicAPIInstance.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index bc82c2e8f..b4a6b47b7 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -390,9 +390,9 @@ namespace Flow.Launcher
}
}
- private void OpenUri(Uri uri, bool? inPrivate = null, bool forceBrower = false)
+ private void OpenUri(Uri uri, bool? inPrivate = null, bool forceBrowser = false)
{
- if (forceBrower || uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)
+ if (forceBrowser || uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)
{
var browserInfo = _settings.CustomBrowser;
From 32ae3a1b67989ae00bb47ccb26579ee82a36f001 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 22:21:08 +0800
Subject: [PATCH 1239/1798] Improve code quality
---
Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs b/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs
index 752c85933..7c4c3de79 100644
--- a/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs
+++ b/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs
@@ -1,8 +1,9 @@
-using Microsoft.Win32;
-using System;
+using System;
+using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
+using Microsoft.Win32;
namespace Flow.Launcher.Plugin.SharedCommands
{
@@ -13,7 +14,7 @@ namespace Flow.Launcher.Plugin.SharedCommands
{
private static string GetDefaultBrowserPath()
{
- string name = string.Empty;
+ var name = string.Empty;
try
{
using var regDefault = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice", false);
@@ -23,8 +24,7 @@ namespace Flow.Launcher.Plugin.SharedCommands
name = regKey.GetValue(null).ToString().ToLower().Replace("\"", "");
if (!name.EndsWith("exe"))
- name = name.Substring(0, name.LastIndexOf(".exe") + 4);
-
+ name = name[..(name.LastIndexOf(".exe") + 4)];
}
catch
{
@@ -65,7 +65,8 @@ namespace Flow.Launcher.Plugin.SharedCommands
{
Process.Start(psi)?.Dispose();
}
- catch (System.ComponentModel.Win32Exception)
+ // This error may be thrown if browser path is incorrect
+ catch (Win32Exception)
{
Process.Start(new ProcessStartInfo
{
@@ -100,7 +101,7 @@ namespace Flow.Launcher.Plugin.SharedCommands
Process.Start(psi)?.Dispose();
}
// This error may be thrown if browser path is incorrect
- catch (System.ComponentModel.Win32Exception)
+ catch (Win32Exception)
{
Process.Start(new ProcessStartInfo
{
From 4bc34f64e84f3e8eb306ac1743b6cd4b2725cb32 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 22:22:02 +0800
Subject: [PATCH 1240/1798] Re-throw the exception if we cannot open the URL in
the default browser
---
.../SharedCommands/SearchWeb.cs | 28 +++++++++++++++----
1 file changed, 22 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs b/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs
index 7c4c3de79..ed3e91daf 100644
--- a/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs
+++ b/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs
@@ -68,10 +68,18 @@ namespace Flow.Launcher.Plugin.SharedCommands
// This error may be thrown if browser path is incorrect
catch (Win32Exception)
{
- Process.Start(new ProcessStartInfo
+ try
{
- FileName = url, UseShellExecute = true
- });
+ Process.Start(new ProcessStartInfo
+ {
+ FileName = url,
+ UseShellExecute = true
+ });
+ }
+ catch
+ {
+ throw; // Re-throw the exception if we cannot open the URL in the default browser
+ }
}
}
@@ -103,10 +111,18 @@ namespace Flow.Launcher.Plugin.SharedCommands
// This error may be thrown if browser path is incorrect
catch (Win32Exception)
{
- Process.Start(new ProcessStartInfo
+ try
{
- FileName = url, UseShellExecute = true
- });
+ Process.Start(new ProcessStartInfo
+ {
+ FileName = url,
+ UseShellExecute = true
+ });
+ }
+ catch
+ {
+ throw; // Re-throw the exception if we cannot open the URL in the default browser
+ }
}
}
}
From f6c75c21072b35bbc35e38dbe05adf287a2e164f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 22:29:45 +0800
Subject: [PATCH 1241/1798] Handle exception from OpenInBrowserTab &
OpenInBrowserWindow
---
Flow.Launcher/Languages/en.xaml | 1 +
Flow.Launcher/PublicAPIInstance.cs | 22 ++++++++++++++++++----
2 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 28673c753..ec1d5bc93 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -473,6 +473,7 @@
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the url in browser. Please check your setting in Default Web Browser of general page.Please wait...
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index 7f0b03445..80d5de53d 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -399,13 +399,27 @@ namespace Flow.Launcher
var path = browserInfo.Path == "*" ? "" : browserInfo.Path;
- if (browserInfo.OpenInTab)
+ try
{
- uri.AbsoluteUri.OpenInBrowserTab(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
+ if (browserInfo.OpenInTab)
+ {
+ uri.AbsoluteUri.OpenInBrowserTab(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
+ }
+ else
+ {
+ uri.AbsoluteUri.OpenInBrowserWindow(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
+ }
}
- else
+ catch (Exception e)
{
- uri.AbsoluteUri.OpenInBrowserWindow(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
+ var tabOrWindow = browserInfo.OpenInTab ? "tab" : "window";
+ LogException(ClassName, $"Failed to open URL in browser {tabOrWindow}: {path}, {inPrivate ?? browserInfo.EnablePrivate}, {browserInfo.PrivateArg}", e);
+ ShowMsgBox(
+ GetTranslation("browserOpenError"),
+ GetTranslation("errorTitle"),
+ MessageBoxButton.OK,
+ MessageBoxImage.Error
+ );
}
}
else
From 2f8e5b91b0666a366e012b56ba614caaaa6be892 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 23:17:38 +0800
Subject: [PATCH 1242/1798] Add new setting to enable favorite icons
---
.../Languages/en.xaml | 2 ++
.../Models/Settings.cs | 2 ++
.../Views/SettingsControl.xaml | 8 ++++++++
3 files changed, 12 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
index e5f3d541e..861779a3d 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
@@ -27,4 +27,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favorite icons (It may cost much time)
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
index 86532d275..44993aec9 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
@@ -8,6 +8,8 @@ public class Settings : BaseModel
public string BrowserPath { get; set; }
+ public bool EnableFavoriteIcons { get; set; } = false;
+
public bool LoadChromeBookmark { get; set; } = true;
public bool LoadFirefoxBookmark { get; set; } = true;
public bool LoadEdgeBookmark { get; set; } = true;
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
index 30424f4e8..fef60eea4 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
@@ -12,6 +12,7 @@
+
+
\ No newline at end of file
From fd8222ba8075a2412bebe2d40a443dca9378cfb5 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 23:17:51 +0800
Subject: [PATCH 1243/1798] Organize usings
---
Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
index 155069495..c08a508d3 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
@@ -1,14 +1,14 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
+using System.Threading.Channels;
+using System.Threading.Tasks;
+using System.Threading;
using System.Windows.Controls;
using Flow.Launcher.Plugin.BrowserBookmark.Commands;
using Flow.Launcher.Plugin.BrowserBookmark.Models;
using Flow.Launcher.Plugin.BrowserBookmark.Views;
-using System.IO;
-using System.Threading.Channels;
-using System.Threading.Tasks;
-using System.Threading;
using Flow.Launcher.Plugin.SharedCommands;
namespace Flow.Launcher.Plugin.BrowserBookmark;
From cef3e8e4bb8ecdd0da22f91178382421d298ee2f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 23:18:01 +0800
Subject: [PATCH 1244/1798] Make settings internal
---
Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
index c08a508d3..91ade206b 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
@@ -21,9 +21,9 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
internal static PluginInitContext _context;
- private static List _cachedBookmarks = new();
+ internal static Settings _settings;
- private static Settings _settings;
+ private static List _cachedBookmarks = new();
private static bool _initialized = false;
From f982d80ffe66bb6ab3b0e03fda14896173f204e6 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 23:21:57 +0800
Subject: [PATCH 1245/1798] Support enable favorite icons for chromiun
bookmarks
---
.../ChromiumBookmarkLoader.cs | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index e859976bd..b8874c94a 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -43,16 +43,20 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
catch (Exception ex)
{
Main._context.API.LogException(ClassName, $"Failed to register bookmark file monitoring: {bookmarkPath}", ex);
+ continue;
}
var source = name + (Path.GetFileName(profile) == "Default" ? "" : $" ({Path.GetFileName(profile)})");
var profileBookmarks = LoadBookmarksFromFile(bookmarkPath, source);
// Load favicons after loading bookmarks
- var faviconDbPath = Path.Combine(profile, "Favicons");
- if (File.Exists(faviconDbPath))
+ if (Main._settings.EnableFavoriteIcons)
{
- LoadFaviconsFromDb(faviconDbPath, profileBookmarks);
+ var faviconDbPath = Path.Combine(profile, "Favicons");
+ if (File.Exists(faviconDbPath))
+ {
+ LoadFaviconsFromDb(faviconDbPath, profileBookmarks);
+ }
}
bookmarks.AddRange(profileBookmarks);
From b68b299cd49271013e5f31f3bed4203076da9437 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 23:26:32 +0800
Subject: [PATCH 1246/1798] Support enable favorite icons for firefox bookmarks
---
.../FirefoxBookmarkLoader.cs | 39 +++++++++++--------
1 file changed, 23 insertions(+), 16 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 75f26d322..5cbd92586 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -41,30 +41,33 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
if (string.IsNullOrEmpty(placesPath) || !File.Exists(placesPath))
return bookmarks;
+ // Try to register file monitoring
+ try
+ {
+ Main.RegisterBookmarkFile(placesPath);
+ }
+ catch (Exception ex)
+ {
+ Main._context.API.LogException(ClassName, $"Failed to register Firefox bookmark file monitoring: {placesPath}", ex);
+ return bookmarks;
+ }
+
var tempDbPath = Path.Combine(_faviconCacheDir, $"tempplaces_{Guid.NewGuid()}.sqlite");
try
{
- // Try to register file monitoring
- try
- {
- Main.RegisterBookmarkFile(placesPath);
- }
- catch (Exception ex)
- {
- Main._context.API.LogException(ClassName, $"Failed to register Firefox bookmark file monitoring: {placesPath}", ex);
- }
-
// Use a copy to avoid lock issues with the original file
File.Copy(placesPath, tempDbPath, true);
- // Connect to database and execute query
+ // Create the connection string and init the connection
string dbPath = string.Format(DbPathFormat, tempDbPath);
using var dbConnection = new SqliteConnection(dbPath);
+
+ // Open connection to the database file and execute the query
dbConnection.Open();
var reader = new SqliteCommand(QueryAllBookmarks, dbConnection).ExecuteReader();
- // Create bookmark list
+ // Get results in List format
bookmarks = reader
.Select(
x => new Bookmark(
@@ -75,12 +78,16 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
)
.ToList();
- // Path to favicon database
- var faviconDbPath = Path.Combine(Path.GetDirectoryName(placesPath), "favicons.sqlite");
- if (File.Exists(faviconDbPath))
+ // Load favicons after loading bookmarks
+ if (Main._settings.EnableFavoriteIcons)
{
- LoadFaviconsFromDb(faviconDbPath, bookmarks);
+ var faviconDbPath = Path.Combine(Path.GetDirectoryName(placesPath), "favicons.sqlite");
+ if (File.Exists(faviconDbPath))
+ {
+ LoadFaviconsFromDb(faviconDbPath, bookmarks);
+ }
}
+
// https://github.com/dotnet/efcore/issues/26580
SqliteConnection.ClearPool(dbConnection);
dbConnection.Close();
From 6d5b95c6168ffb07fd2ffa08686eaef368ecd189 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 23:31:10 +0800
Subject: [PATCH 1247/1798] Improve code comments
---
.../FirefoxBookmarkLoader.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 5cbd92586..e090d8c14 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -88,6 +88,7 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
}
}
+ // Close the connection so that we can delete the temporary file
// https://github.com/dotnet/efcore/issues/26580
SqliteConnection.ClearPool(dbConnection);
dbConnection.Close();
From a761ec880bd8de87c36771e7a2fab72f4b591bcf Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 4 Jun 2025 23:31:18 +0800
Subject: [PATCH 1248/1798] Check file exists
---
.../FirefoxBookmarkLoader.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index e090d8c14..06ddba7af 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -101,7 +101,10 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
// Delete temporary file
try
{
- File.Delete(tempDbPath);
+ if (File.Exists(tempDbPath))
+ {
+ File.Delete(tempDbPath);
+ }
}
catch (Exception ex)
{
From 72bd4c202a194667308d3d6adb778bf9b42640b6 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 00:27:03 +0800
Subject: [PATCH 1249/1798] Info favorite icons cost
---
.../ChromiumBookmarkLoader.cs | 5 ++++-
.../FirefoxBookmarkLoader.cs | 5 ++++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index b8874c94a..16f0a0798 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -55,7 +55,10 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
var faviconDbPath = Path.Combine(profile, "Favicons");
if (File.Exists(faviconDbPath))
{
- LoadFaviconsFromDb(faviconDbPath, profileBookmarks);
+ Main._context.API.StopwatchLogInfo(ClassName, $"Load {profileBookmarks.Count} favorite icons cost", () =>
+ {
+ LoadFaviconsFromDb(faviconDbPath, profileBookmarks);
+ });
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 06ddba7af..d387cd7b5 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -84,7 +84,10 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
var faviconDbPath = Path.Combine(Path.GetDirectoryName(placesPath), "favicons.sqlite");
if (File.Exists(faviconDbPath))
{
- LoadFaviconsFromDb(faviconDbPath, bookmarks);
+ Main._context.API.StopwatchLogInfo(ClassName, $"Load {bookmarks.Count} favorite icons cost", () =>
+ {
+ LoadFaviconsFromDb(faviconDbPath, bookmarks);
+ });
}
}
From 0ec38faf1deb008ece5ae41868bf5347488381c5 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 01:12:12 +0800
Subject: [PATCH 1250/1798] Add code comments & Improve code quality
---
.../ChromiumBookmarkLoader.cs | 1 +
.../FirefoxBookmarkLoader.cs | 4 +++-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index 16f0a0798..a20baccb5 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -132,6 +132,7 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
// Use a copy to avoid lock issues with the original file
var tempDbPath = Path.Combine(_faviconCacheDir, $"tempfavicons_{Guid.NewGuid()}.db");
+ // Use a copy to avoid lock issues with the original file
try
{
File.Copy(dbPath, tempDbPath, true);
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index d387cd7b5..11fc688e7 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -60,7 +60,7 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
File.Copy(placesPath, tempDbPath, true);
// Create the connection string and init the connection
- string dbPath = string.Format(DbPathFormat, tempDbPath);
+ var dbPath = string.Format($"Data Source={tempDbPath};Mode=ReadOnly");
using var dbConnection = new SqliteConnection(dbPath);
// Open connection to the database file and execute the query
@@ -119,8 +119,10 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
private void LoadFaviconsFromDb(string faviconDbPath, List bookmarks)
{
+ // Use a copy to avoid lock issues with the original file
var tempDbPath = Path.Combine(_faviconCacheDir, $"tempfavicons_{Guid.NewGuid()}.sqlite");
+ // Use a copy to avoid lock issues with the original file
try
{
// Use a copy to avoid lock issues with the original file
From d6f40ec488c4fd1134e3510cee52623b741fad04 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 01:12:46 +0800
Subject: [PATCH 1251/1798] Use concurrent way to load favorite icons for
chromium
---
.../ChromiumBookmarkLoader.cs | 45 ++++++++++++-------
1 file changed, 30 insertions(+), 15 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index a20baccb5..ddb50235c 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -1,7 +1,9 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
using System.IO;
using System.Text.Json;
-using System;
+using System.Threading.Tasks;
using Flow.Launcher.Plugin.BrowserBookmark.Models;
using Microsoft.Data.Sqlite;
@@ -156,19 +158,24 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
try
{
- using var connection = new SqliteConnection($"Data Source={tempDbPath}");
- connection.Open();
+ // Since some bookmarks may have same favorite icon id, we need to record them to avoid duplicates
+ var savedPaths = new ConcurrentDictionary();
- foreach (var bookmark in bookmarks)
+ // Get favicons based on bookmarks concurrently
+ Parallel.ForEach(bookmarks.ToArray(), bookmark =>
{
+ // Use read-only connection to avoid locking issues
+ var connection = new SqliteConnection($"Data Source={tempDbPath};Mode=ReadOnly");
+ connection.Open();
+
try
{
var url = bookmark.Url;
- if (string.IsNullOrEmpty(url)) continue;
+ if (string.IsNullOrEmpty(url)) return;
// Extract domain from URL
if (!Uri.TryCreate(url, UriKind.Absolute, out Uri uri))
- continue;
+ return;
var domain = uri.Host;
@@ -186,16 +193,21 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
using var reader = cmd.ExecuteReader();
if (!reader.Read() || reader.IsDBNull(1))
- continue;
+ return;
var iconId = reader.GetInt64(0).ToString();
var imageData = (byte[])reader["image_data"];
if (imageData is not { Length: > 0 })
- continue;
+ return;
var faviconPath = Path.Combine(_faviconCacheDir, $"chromium_{domain}_{iconId}.png");
- SaveBitmapData(imageData, faviconPath);
+
+ // Filter out duplicate favorite icons
+ if (savedPaths.TryAdd(faviconPath, true))
+ {
+ SaveBitmapData(imageData, faviconPath);
+ }
bookmark.FaviconPath = faviconPath;
}
@@ -203,11 +215,14 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
{
Main._context.API.LogException(ClassName, $"Failed to extract bookmark favicon: {bookmark.Url}", ex);
}
- }
-
- // https://github.com/dotnet/efcore/issues/26580
- SqliteConnection.ClearPool(connection);
- connection.Close();
+ finally
+ {
+ // https://github.com/dotnet/efcore/issues/26580
+ SqliteConnection.ClearPool(connection);
+ connection.Close();
+ connection.Dispose();
+ }
+ });
}
catch (Exception ex)
{
From 8bb2b50a4c11ebe71211e908c423c47f2185c1bc Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 01:13:48 +0800
Subject: [PATCH 1252/1798] Use concurrent way to load favorite icons for
firefox
---
.../FirefoxBookmarkLoader.cs | 79 ++++++++++++-------
1 file changed, 52 insertions(+), 27 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 11fc688e7..5d6854aa5 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -1,7 +1,9 @@
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using System.Threading.Tasks;
using Flow.Launcher.Plugin.BrowserBookmark.Models;
using Microsoft.Data.Sqlite;
@@ -30,8 +32,6 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
ORDER BY moz_places.visit_count DESC
""";
- private const string DbPathFormat = "Data Source={0}";
-
protected List GetBookmarksFromPath(string placesPath)
{
// Variable to store bookmark list
@@ -117,7 +117,7 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
return bookmarks;
}
- private void LoadFaviconsFromDb(string faviconDbPath, List bookmarks)
+ private void LoadFaviconsFromDb(string dbPath, List bookmarks)
{
// Use a copy to avoid lock issues with the original file
var tempDbPath = Path.Combine(_faviconCacheDir, $"tempfavicons_{Guid.NewGuid()}.sqlite");
@@ -125,28 +125,45 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
// Use a copy to avoid lock issues with the original file
try
{
- // Use a copy to avoid lock issues with the original file
- File.Copy(faviconDbPath, tempDbPath, true);
-
- var defaultIconPath = Path.Combine(
- Path.GetDirectoryName(typeof(FirefoxBookmarkLoaderBase).Assembly.Location),
- "bookmark.png");
-
- string dbPath = string.Format(DbPathFormat, tempDbPath);
- using var connection = new SqliteConnection(dbPath);
- connection.Open();
-
- // Get favicons based on bookmark URLs
- foreach (var bookmark in bookmarks)
+ File.Copy(dbPath, tempDbPath, true);
+ }
+ catch (Exception ex)
+ {
+ try
{
+ if (File.Exists(tempDbPath))
+ {
+ File.Delete(tempDbPath);
+ }
+ }
+ catch (Exception ex1)
+ {
+ Main._context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex1);
+ }
+ Main._context.API.LogException(ClassName, $"Failed to copy favicon DB: {dbPath}", ex);
+ return;
+ }
+
+ try
+ {
+ // Since some bookmarks may have same favorite icon id, we need to record them to avoid duplicates
+ var savedPaths = new ConcurrentDictionary();
+
+ // Get favicons based on bookmarks concurrently
+ Parallel.ForEach(bookmarks, bookmark =>
+ {
+ // Use read-only connection to avoid locking issues
+ var connection = new SqliteConnection($"Data Source={tempDbPath};Mode=ReadOnly");
+ connection.Open();
+
try
{
if (string.IsNullOrEmpty(bookmark.Url))
- continue;
+ return;
// Extract domain from URL
if (!Uri.TryCreate(bookmark.Url, UriKind.Absolute, out Uri uri))
- continue;
+ return;
var domain = uri.Host;
@@ -166,12 +183,12 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
using var reader = cmd.ExecuteReader();
if (!reader.Read() || reader.IsDBNull(0))
- continue;
+ return;
var imageData = (byte[])reader["data"];
if (imageData is not { Length: > 0 })
- continue;
+ return;
string faviconPath;
if (IsSvgData(imageData))
@@ -182,7 +199,12 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
{
faviconPath = Path.Combine(_faviconCacheDir, $"firefox_{domain}.png");
}
- SaveBitmapData(imageData, faviconPath);
+
+ // Filter out duplicate favorite icons
+ if (savedPaths.TryAdd(faviconPath, true))
+ {
+ SaveBitmapData(imageData, faviconPath);
+ }
bookmark.FaviconPath = faviconPath;
}
@@ -190,15 +212,18 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
{
Main._context.API.LogException(ClassName, $"Failed to extract Firefox favicon: {bookmark.Url}", ex);
}
- }
-
- // https://github.com/dotnet/efcore/issues/26580
- SqliteConnection.ClearPool(connection);
- connection.Close();
+ finally
+ {
+ // https://github.com/dotnet/efcore/issues/26580
+ SqliteConnection.ClearPool(connection);
+ connection.Close();
+ connection.Dispose();
+ }
+ });
}
catch (Exception ex)
{
- Main._context.API.LogException(ClassName, $"Failed to load Firefox favicon DB: {faviconDbPath}", ex);
+ Main._context.API.LogException(ClassName, $"Failed to load Firefox favicon DB: {tempDbPath}", ex);
}
// Delete temporary file
From f717376a1745db848a5f3427ca67dc53fb372dab Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 01:30:26 +0800
Subject: [PATCH 1253/1798] Remove dulplicated comments
---
.../ChromiumBookmarkLoader.cs | 1 -
.../FirefoxBookmarkLoader.cs | 1 -
2 files changed, 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index ddb50235c..8a23cc8fd 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -134,7 +134,6 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
// Use a copy to avoid lock issues with the original file
var tempDbPath = Path.Combine(_faviconCacheDir, $"tempfavicons_{Guid.NewGuid()}.db");
- // Use a copy to avoid lock issues with the original file
try
{
File.Copy(dbPath, tempDbPath, true);
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 5d6854aa5..62b71da4c 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -122,7 +122,6 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
// Use a copy to avoid lock issues with the original file
var tempDbPath = Path.Combine(_faviconCacheDir, $"tempfavicons_{Guid.NewGuid()}.sqlite");
- // Use a copy to avoid lock issues with the original file
try
{
File.Copy(dbPath, tempDbPath, true);
From 49a42dd1b45d107b14fbdec7a4f36bf2e9db35d1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 01:31:06 +0800
Subject: [PATCH 1254/1798] Improve code quality
---
.../FirefoxBookmarkLoader.cs | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 62b71da4c..cd2f40d58 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -60,8 +60,7 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
File.Copy(placesPath, tempDbPath, true);
// Create the connection string and init the connection
- var dbPath = string.Format($"Data Source={tempDbPath};Mode=ReadOnly");
- using var dbConnection = new SqliteConnection(dbPath);
+ using var dbConnection = new SqliteConnection($"Data Source={tempDbPath};Mode=ReadOnly");
// Open connection to the database file and execute the query
dbConnection.Open();
From 76dc35433bfed913d460bfdfc92f83bf71d9d393 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 5 Jun 2025 12:12:55 +1000
Subject: [PATCH 1255/1798] update wording
---
Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
index 861779a3d..44118c099 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
@@ -27,6 +27,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
- Load favorite icons (It may cost much time)
+ Load favorite icons (can be time consuming during startup)
\ No newline at end of file
From d87a7ce32beed41f45bb765a87965304f2df65ed Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 5 Jun 2025 12:15:47 +1000
Subject: [PATCH 1256/1798] use favicons instead of favourite icons
---
Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
index 44118c099..a133d2402 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
@@ -27,6 +27,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
- Load favorite icons (can be time consuming during startup)
+ Load favicons (can be time consuming during startup)
\ No newline at end of file
From 69dd0383115e52b2ffacc275756b4a353f47b1d2 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 10:16:02 +0800
Subject: [PATCH 1257/1798] No need to convert to array
---
.../ChromiumBookmarkLoader.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index 8a23cc8fd..cbcbf70ea 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -161,7 +161,7 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
var savedPaths = new ConcurrentDictionary();
// Get favicons based on bookmarks concurrently
- Parallel.ForEach(bookmarks.ToArray(), bookmark =>
+ Parallel.ForEach(bookmarks, bookmark =>
{
// Use read-only connection to avoid locking issues
var connection = new SqliteConnection($"Data Source={tempDbPath};Mode=ReadOnly");
From 94b8a66db73f547f660580d77471f3cb5854d1c9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 10:21:24 +0800
Subject: [PATCH 1258/1798] Rename to favicon
---
.../ChromiumBookmarkLoader.cs | 8 ++++----
.../FirefoxBookmarkLoader.cs | 8 ++++----
.../Languages/en.xaml | 2 +-
.../Models/Settings.cs | 2 +-
.../Views/SettingsControl.xaml | 4 ++--
5 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index cbcbf70ea..e102e43b6 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -52,12 +52,12 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
var profileBookmarks = LoadBookmarksFromFile(bookmarkPath, source);
// Load favicons after loading bookmarks
- if (Main._settings.EnableFavoriteIcons)
+ if (Main._settings.EnableFavicons)
{
var faviconDbPath = Path.Combine(profile, "Favicons");
if (File.Exists(faviconDbPath))
{
- Main._context.API.StopwatchLogInfo(ClassName, $"Load {profileBookmarks.Count} favorite icons cost", () =>
+ Main._context.API.StopwatchLogInfo(ClassName, $"Load {profileBookmarks.Count} favicons cost", () =>
{
LoadFaviconsFromDb(faviconDbPath, profileBookmarks);
});
@@ -157,7 +157,7 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
try
{
- // Since some bookmarks may have same favorite icon id, we need to record them to avoid duplicates
+ // Since some bookmarks may have same favicon id, we need to record them to avoid duplicates
var savedPaths = new ConcurrentDictionary();
// Get favicons based on bookmarks concurrently
@@ -202,7 +202,7 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
var faviconPath = Path.Combine(_faviconCacheDir, $"chromium_{domain}_{iconId}.png");
- // Filter out duplicate favorite icons
+ // Filter out duplicate favicons
if (savedPaths.TryAdd(faviconPath, true))
{
SaveBitmapData(imageData, faviconPath);
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index cd2f40d58..492a76c7b 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -78,12 +78,12 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
.ToList();
// Load favicons after loading bookmarks
- if (Main._settings.EnableFavoriteIcons)
+ if (Main._settings.EnableFavicons)
{
var faviconDbPath = Path.Combine(Path.GetDirectoryName(placesPath), "favicons.sqlite");
if (File.Exists(faviconDbPath))
{
- Main._context.API.StopwatchLogInfo(ClassName, $"Load {bookmarks.Count} favorite icons cost", () =>
+ Main._context.API.StopwatchLogInfo(ClassName, $"Load {bookmarks.Count} favicons cost", () =>
{
LoadFaviconsFromDb(faviconDbPath, bookmarks);
});
@@ -144,7 +144,7 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
try
{
- // Since some bookmarks may have same favorite icon id, we need to record them to avoid duplicates
+ // Since some bookmarks may have same favicon id, we need to record them to avoid duplicates
var savedPaths = new ConcurrentDictionary();
// Get favicons based on bookmarks concurrently
@@ -198,7 +198,7 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
faviconPath = Path.Combine(_faviconCacheDir, $"firefox_{domain}.png");
}
- // Filter out duplicate favorite icons
+ // Filter out duplicate favicons
if (savedPaths.TryAdd(faviconPath, true))
{
SaveBitmapData(imageData, faviconPath);
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
index a133d2402..22830e7c8 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
@@ -27,6 +27,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
- Load favicons (can be time consuming during startup)
+ Load favicons (can be time consuming during startup)
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
index 44993aec9..a0041e0d6 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
@@ -8,7 +8,7 @@ public class Settings : BaseModel
public string BrowserPath { get; set; }
- public bool EnableFavoriteIcons { get; set; } = false;
+ public bool EnableFavicons { get; set; } = false;
public bool LoadChromeBookmark { get; set; } = true;
public bool LoadFirefoxBookmark { get; set; } = true;
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
index fef60eea4..0767ee980 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
@@ -97,7 +97,7 @@
Margin="{StaticResource SettingPanelItemTopBottomMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
- Content="{DynamicResource flowlauncher_plugin_browserbookmark_enable_favorite_icons}"
- IsChecked="{Binding Settings.EnableFavoriteIcons}" />
+ Content="{DynamicResource flowlauncher_plugin_browserbookmark_enable_favicons}"
+ IsChecked="{Binding Settings.EnableFavicons}" />
\ No newline at end of file
From 25a62c8700b8fb4ed14a0f934e742ea979a87757 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 5 Jun 2025 12:46:46 +1000
Subject: [PATCH 1259/1798] fix wording
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index ec1d5bc93..c9fc36892 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -473,7 +473,7 @@
ErrorAn error occurred while opening the folder. {0}
- An error occurred while opening the url in browser. Please check your setting in Default Web Browser of general page.
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPlease wait...
From e61151dc437bf62deb92291302ecc88b1ea1a780 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 11:18:07 +0800
Subject: [PATCH 1260/1798] Improve preview panel performance
---
.../Views/PreviewPanel.xaml | 2 +-
.../Views/PreviewPanel.xaml.cs | 15 +++++++++++++--
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
index 22aa8f597..e200a187f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
@@ -117,7 +117,7 @@
HorizontalAlignment="Right"
VerticalAlignment="Top"
Style="{DynamicResource PreviewItemSubTitleStyle}"
- Text="{Binding FileSize, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"
+ Text="{Binding FileSize, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Mode=OneWay}"
TextWrapping="Wrap"
Visibility="{Binding FileSizeVisibility, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" />
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index a3a0ad0aa..ec60a3c13 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -20,7 +20,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
private static readonly string ClassName = nameof(PreviewPanel);
private string FilePath { get; }
- public string FileSize { get; } = "";
+ public string FileSize { get; private set; } = Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
public string CreatedAt { get; } = "";
public string LastModifiedAt { get; } = "";
private ImageSource _previewImage = new BitmapImage();
@@ -63,7 +63,18 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
if (Settings.ShowFileSizeInPreviewPanel)
{
- FileSize = type == ResultType.File ? GetFileSize(filePath) : GetFolderSize(filePath);
+ if (type == ResultType.File)
+ {
+ FileSize = GetFileSize(filePath);
+ }
+ else
+ {
+ _ = Task.Run(() =>
+ {
+ FileSize = GetFolderSize(filePath);
+ OnPropertyChanged(nameof(FileSize));
+ }).ConfigureAwait(false);
+ }
}
if (Settings.ShowCreatedDateInPreviewPanel)
From 19061df586b2d2d37b3757fb4ef25eb0d931cec3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 11:24:20 +0800
Subject: [PATCH 1261/1798] Use concurrent version
---
.../Views/PreviewPanel.xaml.cs | 24 ++++++++++---------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index ec60a3c13..5c250c8a8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -2,6 +2,7 @@
using System.ComponentModel;
using System.Globalization;
using System.IO;
+using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
@@ -157,22 +158,23 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
public static string GetFolderSize(string folderPath)
{
+ using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(3));
+
try
{
+ // Use parallel enumeration for better performance
var directoryInfo = new DirectoryInfo(folderPath);
- long size = 0;
- using var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(3));
- foreach (var file in directoryInfo.EnumerateFiles("*", SearchOption.AllDirectories))
- {
- if (cancellationTokenSource.Token.IsCancellationRequested)
- {
- // Timeout occurred, return unknown size
- return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
- }
- size += file.Length;
- }
+ long size = directoryInfo.EnumerateFiles("*", SearchOption.AllDirectories)
+ .AsParallel()
+ .WithCancellation(timeoutCts.Token)
+ .Sum(file => file.Length);
+
return ResultManager.ToReadableSize(size, 2);
}
+ catch (OperationCanceledException)
+ {
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
catch (Exception e)
{
Main.Context.API.LogException(ClassName, $"Failed to get folder size for {folderPath}", e);
From 617c62f6c6ee5c87ab4356d5af9d03bec134e25d Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 11:25:48 +0800
Subject: [PATCH 1262/1798] Add error log message
---
Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index 5c250c8a8..e4a9e5bb2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -173,6 +173,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
}
catch (OperationCanceledException)
{
+ Main.Context.API.LogError(ClassName, $"Operation timed out while calculating folder size for {folderPath}");
return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
}
catch (Exception e)
From 14ffe3c6757f086dc4fbd360caa4f70801ad82d2 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 11:38:08 +0800
Subject: [PATCH 1263/1798] Handle more exceptions
---
.../Views/PreviewPanel.xaml.cs | 60 +++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index e4a9e5bb2..5c0832871 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -107,6 +107,16 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
var fileInfo = new FileInfo(filePath);
return ResultManager.ToReadableSize(fileInfo.Length, 2);
}
+ catch (FileNotFoundException)
+ {
+ Main.Context.API.LogError(ClassName, $"File not found: {filePath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
+ catch (UnauthorizedAccessException)
+ {
+ Main.Context.API.LogError(ClassName, $"Access denied to file: {filePath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
catch (Exception e)
{
Main.Context.API.LogException(ClassName, $"Failed to get file size for {filePath}", e);
@@ -128,6 +138,16 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
if (showFileAgeInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}";
return result;
}
+ catch (FileNotFoundException)
+ {
+ Main.Context.API.LogError(ClassName, $"File not found: {filePath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
+ catch (UnauthorizedAccessException)
+ {
+ Main.Context.API.LogError(ClassName, $"Access denied to file: {filePath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
catch (Exception e)
{
Main.Context.API.LogException(ClassName, $"Failed to get file created date for {filePath}", e);
@@ -149,6 +169,16 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
if (showFileAgeInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}";
return result;
}
+ catch (FileNotFoundException)
+ {
+ Main.Context.API.LogError(ClassName, $"File not found: {filePath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
+ catch (UnauthorizedAccessException)
+ {
+ Main.Context.API.LogError(ClassName, $"Access denied to file: {filePath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
catch (Exception e)
{
Main.Context.API.LogException(ClassName, $"Failed to get file modified date for {filePath}", e);
@@ -171,6 +201,16 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
return ResultManager.ToReadableSize(size, 2);
}
+ catch (FileNotFoundException)
+ {
+ Main.Context.API.LogError(ClassName, $"Folder not found: {folderPath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
+ catch (UnauthorizedAccessException)
+ {
+ Main.Context.API.LogError(ClassName, $"Access denied to folder: {folderPath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
catch (OperationCanceledException)
{
Main.Context.API.LogError(ClassName, $"Operation timed out while calculating folder size for {folderPath}");
@@ -197,6 +237,16 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
if (showFileAgeInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}";
return result;
}
+ catch (FileNotFoundException)
+ {
+ Main.Context.API.LogError(ClassName, $"Folder not found: {folderPath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
+ catch (UnauthorizedAccessException)
+ {
+ Main.Context.API.LogError(ClassName, $"Access denied to folder: {folderPath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
catch (Exception e)
{
Main.Context.API.LogException(ClassName, $"Failed to get folder created date for {folderPath}", e);
@@ -218,6 +268,16 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
if (showFileAgeInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}";
return result;
}
+ catch (FileNotFoundException)
+ {
+ Main.Context.API.LogError(ClassName, $"Folder not found: {folderPath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
+ catch (UnauthorizedAccessException)
+ {
+ Main.Context.API.LogError(ClassName, $"Access denied to folder: {folderPath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
catch (Exception e)
{
Main.Context.API.LogException(ClassName, $"Failed to get folder modified date for {folderPath}", e);
From 1a95632ddf2617c059554a95469c90d55acb70a3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 11:45:18 +0800
Subject: [PATCH 1264/1798] Handle AggregateException
---
.../Views/PreviewPanel.xaml.cs | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index 5c0832871..5714b0d0f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -216,6 +216,25 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
Main.Context.API.LogError(ClassName, $"Operation timed out while calculating folder size for {folderPath}");
return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
}
+ // For parallel operations, AggregateException may be thrown if any of the tasks fail
+ catch (AggregateException ae)
+ {
+ switch (ae.InnerException)
+ {
+ case FileNotFoundException:
+ Main.Context.API.LogError(ClassName, $"Folder not found: {folderPath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ case UnauthorizedAccessException:
+ Main.Context.API.LogError(ClassName, $"Access denied to folder: {folderPath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ case OperationCanceledException:
+ Main.Context.API.LogError(ClassName, $"Operation timed out while calculating folder size for {folderPath}");
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ default:
+ Main.Context.API.LogException(ClassName, $"Failed to get folder size for {folderPath}", ae);
+ return Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+ }
+ }
catch (Exception e)
{
Main.Context.API.LogException(ClassName, $"Failed to get folder size for {folderPath}", e);
From 4c7a4fec1f09a44887baadb4c4026019046c28b0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 11:56:21 +0800
Subject: [PATCH 1265/1798] Add more info tooltip support for volumes
---
.../Languages/en.xaml | 1 +
.../Search/ResultManager.cs | 79 ++++++++++---------
2 files changed, 44 insertions(+), 36 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index 1cb050e64..f782a59fa 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -82,6 +82,7 @@
Ctrl + Enter to open the containing folder{0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy path
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
index 4e9a376ab..6bbdcbe0a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
@@ -162,7 +162,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search
},
Score = score,
TitleToolTip = Main.Context.API.GetTranslation("plugin_explorer_plugin_ToolTipOpenDirectory"),
- SubTitleToolTip = Settings.DisplayMoreInformationInToolTip ? GetMoreInfoToolTip(path, ResultType.Folder) : path,
+ SubTitleToolTip = Settings.DisplayMoreInformationInToolTip ? GetFolderMoreInfoTooltip(path) : path,
ContextData = new SearchResult { Type = ResultType.Folder, FullPath = path, WindowsIndexed = windowsIndexed }
};
}
@@ -183,6 +183,10 @@ namespace Flow.Launcher.Plugin.Explorer.Search
if (progressValue >= 90)
progressBarColor = "#da2626";
+ var tooltip = Settings.DisplayMoreInformationInToolTip
+ ? GetVolumeMoreInfoTooltip(path, freespace, totalspace)
+ : path;
+
return new Result
{
Title = title,
@@ -201,8 +205,8 @@ namespace Flow.Launcher.Plugin.Explorer.Search
OpenFolder(path);
return true;
},
- TitleToolTip = path,
- SubTitleToolTip = path,
+ TitleToolTip = tooltip,
+ SubTitleToolTip = tooltip,
ContextData = new SearchResult { Type = ResultType.Volume, FullPath = path, WindowsIndexed = windowsIndexed }
};
}
@@ -316,7 +320,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search
return true;
},
TitleToolTip = Main.Context.API.GetTranslation("plugin_explorer_plugin_ToolTipOpenContainingFolder"),
- SubTitleToolTip = Settings.DisplayMoreInformationInToolTip ? GetMoreInfoToolTip(filePath, ResultType.File) : filePath,
+ SubTitleToolTip = Settings.DisplayMoreInformationInToolTip ? GetFileMoreInfoTooltip(filePath) : filePath,
ContextData = new SearchResult { Type = ResultType.File, FullPath = filePath, WindowsIndexed = windowsIndexed }
};
return result;
@@ -347,41 +351,44 @@ namespace Flow.Launcher.Plugin.Explorer.Search
_ = Task.Run(() => EverythingApi.IncrementRunCounterAsync(fileOrFolder));
}
- private static string GetMoreInfoToolTip(string filePath, ResultType type)
+ private static string GetFileMoreInfoTooltip(string filePath)
{
- switch (type)
+ try
{
- case ResultType.Folder:
- try
- {
- var folderSize = PreviewPanel.GetFolderSize(filePath);
- var folderCreatedAt = PreviewPanel.GetFolderCreatedAt(filePath, Settings.PreviewPanelDateFormat, Settings.PreviewPanelTimeFormat, Settings.ShowFileAgeInPreviewPanel);
- var folderModifiedAt = PreviewPanel.GetFolderLastModifiedAt(filePath, Settings.PreviewPanelDateFormat, Settings.PreviewPanelTimeFormat, Settings.ShowFileAgeInPreviewPanel);
- return string.Format(Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info"),
- filePath, folderSize, folderCreatedAt, folderModifiedAt, Environment.NewLine);
- }
- catch (Exception e)
- {
- Context.API.LogException(ClassName, $"Failed to load tooltip for {filePath}", e);
- return filePath;
- }
- case ResultType.File:
- try
- {
- var fileSize = PreviewPanel.GetFileSize(filePath);
- var fileCreatedAt = PreviewPanel.GetFileCreatedAt(filePath, Settings.PreviewPanelDateFormat, Settings.PreviewPanelTimeFormat, Settings.ShowFileAgeInPreviewPanel);
- var fileModifiedAt = PreviewPanel.GetFileLastModifiedAt(filePath, Settings.PreviewPanelDateFormat, Settings.PreviewPanelTimeFormat, Settings.ShowFileAgeInPreviewPanel);
- return string.Format(Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info"),
- filePath, fileSize, fileCreatedAt, fileModifiedAt, Environment.NewLine);
- }
- catch (Exception e)
- {
- Context.API.LogException(ClassName, $"Failed to load tooltip for {filePath}", e);
- return filePath;
- }
- default:
- return filePath;
+ var fileSize = PreviewPanel.GetFileSize(filePath);
+ var fileCreatedAt = PreviewPanel.GetFileCreatedAt(filePath, Settings.PreviewPanelDateFormat, Settings.PreviewPanelTimeFormat, Settings.ShowFileAgeInPreviewPanel);
+ var fileModifiedAt = PreviewPanel.GetFileLastModifiedAt(filePath, Settings.PreviewPanelDateFormat, Settings.PreviewPanelTimeFormat, Settings.ShowFileAgeInPreviewPanel);
+ return string.Format(Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info"),
+ filePath, fileSize, fileCreatedAt, fileModifiedAt, Environment.NewLine);
}
+ catch (Exception e)
+ {
+ Context.API.LogException(ClassName, $"Failed to load tooltip for {filePath}", e);
+ return filePath;
+ }
+ }
+
+ private static string GetFolderMoreInfoTooltip(string folderPath)
+ {
+ try
+ {
+ var folderSize = PreviewPanel.GetFolderSize(folderPath);
+ var folderCreatedAt = PreviewPanel.GetFolderCreatedAt(folderPath, Settings.PreviewPanelDateFormat, Settings.PreviewPanelTimeFormat, Settings.ShowFileAgeInPreviewPanel);
+ var folderModifiedAt = PreviewPanel.GetFolderLastModifiedAt(folderPath, Settings.PreviewPanelDateFormat, Settings.PreviewPanelTimeFormat, Settings.ShowFileAgeInPreviewPanel);
+ return string.Format(Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info"),
+ folderPath, folderSize, folderCreatedAt, folderModifiedAt, Environment.NewLine);
+ }
+ catch (Exception e)
+ {
+ Context.API.LogException(ClassName, $"Failed to load tooltip for {folderPath}", e);
+ return folderPath;
+ }
+ }
+
+ private static string GetVolumeMoreInfoTooltip(string volumePath, string freespace, string totalspace)
+ {
+ return string.Format(Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_volume"),
+ volumePath, freespace, totalspace, Environment.NewLine);
}
private static readonly string[] MediaExtensions = { ".jpg", ".png", ".avi", ".mkv", ".bmp", ".gif", ".wmv", ".mp3", ".flac", ".mp4" };
From 5fcb166060c72d545708a20b14fc18d9930b4bb4 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 16:12:55 +0800
Subject: [PATCH 1266/1798] Use PInvoke & Improve code comments & Use switch
sentences
---
.../NativeMethods.txt | 5 +
Flow.Launcher.Infrastructure/Win32Helper.cs | 5 +
Flow.Launcher/MainWindow.xaml.cs | 130 +++++++++---------
3 files changed, 74 insertions(+), 66 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt
index 53c877c4f..edc71feef 100644
--- a/Flow.Launcher.Infrastructure/NativeMethods.txt
+++ b/Flow.Launcher.Infrastructure/NativeMethods.txt
@@ -42,6 +42,11 @@ MONITORINFOEXW
WM_ENTERSIZEMOVE
WM_EXITSIZEMOVE
+WM_NCLBUTTONDBLCLK
+WM_SYSCOMMAND
+
+SC_MAXIMIZE
+SC_MINIMIZE
OleInitialize
OleUninitialize
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 1be803fd4..86e7b7c97 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -324,6 +324,11 @@ namespace Flow.Launcher.Infrastructure
public const int WM_ENTERSIZEMOVE = (int)PInvoke.WM_ENTERSIZEMOVE;
public const int WM_EXITSIZEMOVE = (int)PInvoke.WM_EXITSIZEMOVE;
+ public const int WM_NCLBUTTONDBLCLK = (int)PInvoke.WM_NCLBUTTONDBLCLK;
+ public const int WM_SYSCOMMAND = (int)PInvoke.WM_SYSCOMMAND;
+
+ public const int SC_MAXIMIZE = (int)PInvoke.SC_MAXIMIZE;
+ public const int SC_MINIMIZE = (int)PInvoke.SC_MINIMIZE;
#endregion
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 13504fc93..a77d6471c 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -465,6 +465,9 @@ namespace Flow.Launcher
private void OnMouseDown(object sender, MouseButtonEventArgs e)
{
+ // When the window is maximized via Snap,
+ // dragging attempts will first switch the window from Maximized to Normal state,
+ // and adjust the drag position accordingly.
if (e.ChangedButton == MouseButton.Left)
{
try
@@ -472,8 +475,8 @@ namespace Flow.Launcher
if (WindowState == WindowState.Maximized)
{
// Calculate ratio based on maximized window dimensions
- double maxWidth = this.ActualWidth;
- double maxHeight = this.ActualHeight;
+ double maxWidth = ActualWidth;
+ double maxHeight = ActualHeight;
var mousePos = e.GetPosition(this);
double xRatio = mousePos.X / maxWidth;
double yRatio = mousePos.Y / maxHeight;
@@ -486,7 +489,7 @@ namespace Flow.Launcher
// Switch to Normal state
WindowState = WindowState.Normal;
- Dispatcher.BeginInvoke(new Action(() =>
+ Application.Current?.Dispatcher.Invoke(new Action(() =>
{
double normalWidth = Width;
double normalHeight = Height;
@@ -535,83 +538,78 @@ namespace Flow.Launcher
#region Window WndProc
- private const int WM_NCLBUTTONDBLCLK = 0x00A3;
- private const int WM_SYSCOMMAND = 0x0112;
- private const int SC_MAXIMIZE = 0xF030;
- private const int SC_RESTORE = 0xF120;
- private const int SC_MINIMIZE = 0xF020;
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
- {
- if (msg == Win32Helper.WM_ENTERSIZEMOVE)
- {
- _initialWidth = (int)Width;
- _initialHeight = (int)Height;
- handled = true;
- }
- else if (msg == Win32Helper.WM_EXITSIZEMOVE)
+ {
+ switch (msg)
{
- //Prevent updating the number of results when the window height is below the height of a single result item.
- //This situation occurs not only when the user manually resizes the window, but also when the window is released from a side snap, as the OS automatically adjusts the window height.
- //(Without this check, releasing from a snap can cause the window height to hit the minimum, resulting in only 2 results being shown.)
- if (_initialHeight != (int)Height && Height> (_settings.WindowHeightSize + _settings.ItemHeightSize))
- {
- if (!_settings.KeepMaxResults)
+ case Win32Helper.WM_ENTERSIZEMOVE:
+ _initialWidth = (int)Width;
+ _initialHeight = (int)Height;
+ handled = true;
+ break;
+ case Win32Helper.WM_EXITSIZEMOVE:
+ //Prevent updating the number of results when the window height is below the height of a single result item.
+ //This situation occurs not only when the user manually resizes the window, but also when the window is released from a side snap, as the OS automatically adjusts the window height.
+ //(Without this check, releasing from a snap can cause the window height to hit the minimum, resulting in only 2 results being shown.)
+ if (_initialHeight != (int)Height && Height > (_settings.WindowHeightSize + _settings.ItemHeightSize))
{
- // Get shadow margin
- var shadowMargin = 0;
- var (_, useDropShadowEffect) = _theme.GetActualValue();
- if (useDropShadowEffect)
+ if (!_settings.KeepMaxResults)
{
- shadowMargin = 32;
+ // Get shadow margin
+ var shadowMargin = 0;
+ var (_, useDropShadowEffect) = _theme.GetActualValue();
+ if (useDropShadowEffect)
+ {
+ shadowMargin = 32;
+ }
+
+ // Calculate max results to show
+ var itemCount = (Height - (_settings.WindowHeightSize + 14) - shadowMargin) / _settings.ItemHeightSize;
+ if (itemCount < 2)
+ {
+ _settings.MaxResultsToShow = 2;
+ }
+ else
+ {
+ _settings.MaxResultsToShow = Convert.ToInt32(Math.Truncate(itemCount));
+ }
}
- // Calculate max results to show
- var itemCount = (Height - (_settings.WindowHeightSize + 14) - shadowMargin) / _settings.ItemHeightSize;
- if (itemCount < 2)
- {
- _settings.MaxResultsToShow = 2;
- }
- else
- {
- _settings.MaxResultsToShow = Convert.ToInt32(Math.Truncate(itemCount));
- }
+ SizeToContent = SizeToContent.Height;
+ }
+ else
+ {
+ // Update height when exiting maximized snap state.
+ SizeToContent = SizeToContent.Height;
}
- SizeToContent = SizeToContent.Height;
- }
- else
- {
- // Update height when exiting maximized snap state.
- SizeToContent = SizeToContent.Height;
- }
-
- if (_initialWidth != (int)Width)
- {
- if (!_settings.KeepMaxResults)
+ if (_initialWidth != (int)Width)
{
- // Update width
- _viewModel.MainWindowWidth = Width;
+ if (!_settings.KeepMaxResults)
+ {
+ // Update width
+ _viewModel.MainWindowWidth = Width;
+ }
+
+ SizeToContent = SizeToContent.Height;
}
- SizeToContent = SizeToContent.Height;
- }
-
- handled = true;
- }
- if (msg == WM_NCLBUTTONDBLCLK)
- {
- SizeToContent = SizeToContent.Height;
- handled = true;
- }
- else if (msg == WM_SYSCOMMAND)
- {
- int command = wParam.ToInt32() & 0xFFF0;
- if (command == SC_MAXIMIZE || command == SC_MINIMIZE)
- {
+ handled = true;
+ break;
+ case Win32Helper.WM_NCLBUTTONDBLCLK: // Block the double click in frame
SizeToContent = SizeToContent.Height;
handled = true;
- }
+ break;
+ case Win32Helper.WM_SYSCOMMAND: // Block Maximize/Minimize by Win+Up and Win+Down Arrow
+ var command = wParam.ToInt32() & 0xFFF0;
+ if (command == Win32Helper.SC_MAXIMIZE || command == Win32Helper.SC_MINIMIZE)
+ {
+ SizeToContent = SizeToContent.Height;
+ handled = true;
+ }
+ break;
}
+
return IntPtr.Zero;
}
From 7d5001de1882dec8b678e9830fa64e95567b6118 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 18:16:13 +0800
Subject: [PATCH 1267/1798] Catch exception when installing Everything
---
.../Languages/en.xaml | 3 ++
.../Everything/EverythingSearchManager.cs | 33 ++++++++++++++-----
2 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index eefd6f4eb..9f60aaa43 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -162,6 +162,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchManager.cs
index 6c9155539..ce71c94ba 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchManager.cs
@@ -11,6 +11,8 @@ namespace Flow.Launcher.Plugin.Explorer.Search.Everything
{
public class EverythingSearchManager : IIndexProvider, IContentIndexProvider, IPathIndexProvider
{
+ private static readonly string ClassName = nameof(EverythingSearchManager);
+
private Settings Settings { get; }
public EverythingSearchManager(Settings settings)
@@ -42,19 +44,32 @@ namespace Flow.Launcher.Plugin.Explorer.Search.Everything
private async ValueTask ClickToInstallEverythingAsync(ActionContext _)
{
- var installedPath = await EverythingDownloadHelper.PromptDownloadIfNotInstallAsync(Settings.EverythingInstalledPath, Main.Context.API);
-
- if (installedPath == null)
+ try
{
- Main.Context.API.ShowMsgError("Unable to find Everything.exe");
+ var installedPath = await EverythingDownloadHelper.PromptDownloadIfNotInstallAsync(Settings.EverythingInstalledPath, Main.Context.API);
+
+ if (installedPath == null)
+ {
+ Main.Context.API.ShowMsgError(Main.Context.API.GetTranslation("flowlauncher_plugin_everything_not_found"));
+ Main.Context.API.LogError(ClassName, "Unable to find Everything.exe");
+
+ return false;
+ }
+
+ Settings.EverythingInstalledPath = installedPath;
+ Process.Start(installedPath, "-startup");
+
+ return true;
+ }
+ // Sometimes Everything installation will fail because of permission issues or file not found issues
+ // Just let the user know that Everything is not installed properly and ask them to install it manually
+ catch (Exception e)
+ {
+ Main.Context.API.ShowMsgError(Main.Context.API.GetTranslation("flowlauncher_plugin_everything_install_issue"));
+ Main.Context.API.LogException(ClassName, "Failed to install Everything", e);
return false;
}
-
- Settings.EverythingInstalledPath = installedPath;
- Process.Start(installedPath, "-startup");
-
- return true;
}
public async IAsyncEnumerable SearchAsync(string search, [EnumeratorCancellation] CancellationToken token)
From b2e754dfd56c9dc40765e54c075b132f3ea930e9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 18:48:26 +0800
Subject: [PATCH 1268/1798] Fix command issue for pswh.exe
---
Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
index 2613c770b..2771a9118 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -242,6 +242,9 @@ namespace Flow.Launcher.Plugin.Shell
case Shell.Pwsh:
{
+ // Using just a ; doesn't work with wt, as it's used to create a new tab for the terminal window
+ // \\ must be escaped for it to work properly, or breaking it into multiple arguments
+ var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
if (_settings.UseWindowsTerminal)
{
info.FileName = "wt.exe";
@@ -256,7 +259,7 @@ namespace Flow.Launcher.Plugin.Shell
info.ArgumentList.Add("-NoExit");
}
info.ArgumentList.Add("-Command");
- info.ArgumentList.Add($"{command}\\; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'\\; [System.Console]::ReadKey()\\; exit" : "")}");
+ info.ArgumentList.Add($"{command}{addedCharacter}; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'\\; [System.Console]::ReadKey()\\; exit" : "")}");
break;
}
From d7c7ec8f5ef0fd0ad7472b7df9d204da6784895f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 18:55:58 +0800
Subject: [PATCH 1269/1798] Apply for all wt.exe
---
Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 144 +++++++++++----------
1 file changed, 74 insertions(+), 70 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
index 2771a9118..d0add9f31 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -201,97 +201,101 @@ namespace Flow.Launcher.Plugin.Shell
switch (_settings.Shell)
{
case Shell.Cmd:
- {
- if (_settings.UseWindowsTerminal)
{
- info.FileName = "wt.exe";
- info.ArgumentList.Add("cmd");
- }
- else
- {
- info.FileName = "cmd.exe";
- }
+ if (_settings.UseWindowsTerminal)
+ {
+ info.FileName = "wt.exe";
+ info.ArgumentList.Add("cmd");
+ }
+ else
+ {
+ info.FileName = "cmd.exe";
+ }
- info.ArgumentList.Add($"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command} {(_settings.CloseShellAfterPress ? $"&& echo {Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")} && pause > nul /c" : "")}");
- break;
- }
+ info.ArgumentList.Add($"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command} {(_settings.CloseShellAfterPress ? $"&& echo {Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")} && pause > nul /c" : "")}");
+ break;
+ }
case Shell.Powershell:
- {
- if (_settings.UseWindowsTerminal)
{
- info.FileName = "wt.exe";
- info.ArgumentList.Add("powershell");
+ // Using just a ; doesn't work with wt, as it's used to create a new tab for the terminal window
+ // \\ must be escaped for it to work properly, or breaking it into multiple arguments
+ var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
+ if (_settings.UseWindowsTerminal)
+ {
+ info.FileName = "wt.exe";
+ info.ArgumentList.Add("powershell");
+ }
+ else
+ {
+ info.FileName = "powershell.exe";
+ }
+ if (_settings.LeaveShellOpen)
+ {
+ info.ArgumentList.Add("-NoExit");
+ info.ArgumentList.Add(command);
+ }
+ else
+ {
+ info.ArgumentList.Add("-Command");
+ info.ArgumentList.Add($"{command}{addedCharacter}; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" : "")}");
+ }
+ break;
}
- else
- {
- info.FileName = "powershell.exe";
- }
- if (_settings.LeaveShellOpen)
- {
- info.ArgumentList.Add("-NoExit");
- info.ArgumentList.Add(command);
- }
- else
- {
- info.ArgumentList.Add("-Command");
- info.ArgumentList.Add($"{command}\\; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'\\; [System.Console]::ReadKey()\\; exit" : "")}");
- }
- break;
- }
case Shell.Pwsh:
- {
- // Using just a ; doesn't work with wt, as it's used to create a new tab for the terminal window
- // \\ must be escaped for it to work properly, or breaking it into multiple arguments
- var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
- if (_settings.UseWindowsTerminal)
{
- info.FileName = "wt.exe";
- info.ArgumentList.Add("pwsh");
+ // Using just a ; doesn't work with wt, as it's used to create a new tab for the terminal window
+ // \\ must be escaped for it to work properly, or breaking it into multiple arguments
+ var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
+ if (_settings.UseWindowsTerminal)
+ {
+ info.FileName = "wt.exe";
+ info.ArgumentList.Add("pwsh");
+ }
+ else
+ {
+ info.FileName = "pwsh.exe";
+ }
+ if (_settings.LeaveShellOpen)
+ {
+ info.ArgumentList.Add("-NoExit");
+ }
+ info.ArgumentList.Add("-Command");
+ info.ArgumentList.Add($"{command}{addedCharacter}; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" : "")}");
+ break;
}
- else
- {
- info.FileName = "pwsh.exe";
- }
- if (_settings.LeaveShellOpen)
- {
- info.ArgumentList.Add("-NoExit");
- }
- info.ArgumentList.Add("-Command");
- info.ArgumentList.Add($"{command}{addedCharacter}; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'\\; [System.Console]::ReadKey()\\; exit" : "")}");
- break;
- }
case Shell.RunCommand:
- {
- var parts = command.Split(new[]
{
- ' '
- }, 2);
- if (parts.Length == 2)
- {
- var filename = parts[0];
- if (ExistInPath(filename))
+ var parts = command.Split(new[]
{
- var arguments = parts[1];
- info.FileName = filename;
- info.ArgumentList.Add(arguments);
+ ' '
+ }, 2);
+ if (parts.Length == 2)
+ {
+ var filename = parts[0];
+ if (ExistInPath(filename))
+ {
+ var arguments = parts[1];
+ info.FileName = filename;
+ info.ArgumentList.Add(arguments);
+ }
+ else
+ {
+ info.FileName = command;
+ }
}
else
{
info.FileName = command;
}
- }
- else
- {
- info.FileName = command;
+
+ info.UseShellExecute = true;
+
+ break;
}
- info.UseShellExecute = true;
-
- break;
- }
default:
throw new NotImplementedException();
}
From bf98a731b935e2e3aeaf03a25e6112f568a8b379 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 5 Jun 2025 20:58:40 +1000
Subject: [PATCH 1270/1798] Update default plugin publish to follow production
version (#3656)
---
.github/workflows/default_plugins.yml | 85 ++++++---------------------
1 file changed, 17 insertions(+), 68 deletions(-)
diff --git a/.github/workflows/default_plugins.yml b/.github/workflows/default_plugins.yml
index 85acafae1..ec8dfcd4e 100644
--- a/.github/workflows/default_plugins.yml
+++ b/.github/workflows/default_plugins.yml
@@ -3,11 +3,10 @@ name: Publish Default Plugins
on:
push:
branches: ['master']
- paths: ['Plugins/**']
workflow_dispatch:
jobs:
- build:
+ publish:
runs-on: windows-latest
steps:
@@ -17,39 +16,24 @@ jobs:
with:
dotnet-version: 7.0.x
- - name: Determine New Plugin Updates
- uses: dorny/paths-filter@v3
- id: changes
- with:
- filters: |
- browserbookmark:
- - 'Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json'
- calculator:
- - 'Plugins/Flow.Launcher.Plugin.Calculator/plugin.json'
- explorer:
- - 'Plugins/Flow.Launcher.Plugin.Explorer/plugin.json'
- pluginindicator:
- - 'Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json'
- pluginsmanager:
- - 'Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json'
- processkiller:
- - 'Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json'
- program:
- - 'Plugins/Flow.Launcher.Plugin.Program/plugin.json'
- shell:
- - 'Plugins/Flow.Launcher.Plugin.Shell/plugin.json'
- sys:
- - 'Plugins/Flow.Launcher.Plugin.Sys/plugin.json'
- url:
- - 'Plugins/Flow.Launcher.Plugin.Url/plugin.json'
- websearch:
- - 'Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json'
- windowssettings:
- - 'Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json'
- base: 'master'
+ - name: Update Plugins To Production Version
+ run: |
+ $version = "1.0.0"
+ Get-Content appveyor.yml | ForEach-Object {
+ if ($_ -match "version:\s*'(\d+\.\d+\.\d+)\.") {
+ $version = $matches[1]
+ }
+ }
+
+ $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`": `"$version`"" | 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
+ }
- name: Get BrowserBookmark Version
- if: steps.changes.outputs.browserbookmark == 'true'
id: updated-version-browserbookmark
uses: notiz-dev/github-action-json-property@release
with:
@@ -57,14 +41,12 @@ jobs:
prop_path: 'Version'
- name: Build BrowserBookmark
- if: steps.changes.outputs.browserbookmark == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.BrowserBookmark"
7z a -tzip "Flow.Launcher.Plugin.BrowserBookmark.zip" "./Flow.Launcher.Plugin.BrowserBookmark/*"
rm -r "Flow.Launcher.Plugin.BrowserBookmark"
- name: Publish BrowserBookmark
- if: steps.changes.outputs.browserbookmark == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.BrowserBookmark"
@@ -76,7 +58,6 @@ jobs:
- name: Get Calculator Version
- if: steps.changes.outputs.calculator == 'true'
id: updated-version-calculator
uses: notiz-dev/github-action-json-property@release
with:
@@ -84,14 +65,12 @@ jobs:
prop_path: 'Version'
- name: Build Calculator
- if: steps.changes.outputs.calculator == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.Calculator"
7z a -tzip "Flow.Launcher.Plugin.Calculator.zip" "./Flow.Launcher.Plugin.Calculator/*"
rm -r "Flow.Launcher.Plugin.Calculator"
- name: Publish Calculator
- if: steps.changes.outputs.calculator == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Calculator"
@@ -103,7 +82,6 @@ jobs:
- name: Get Explorer Version
- if: steps.changes.outputs.explorer == 'true'
id: updated-version-explorer
uses: notiz-dev/github-action-json-property@release
with:
@@ -111,14 +89,12 @@ jobs:
prop_path: 'Version'
- name: Build Explorer
- if: steps.changes.outputs.explorer == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.Explorer"
7z a -tzip "Flow.Launcher.Plugin.Explorer.zip" "./Flow.Launcher.Plugin.Explorer/*"
rm -r "Flow.Launcher.Plugin.Explorer"
- name: Publish Explorer
- if: steps.changes.outputs.explorer == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Explorer"
@@ -130,7 +106,6 @@ jobs:
- name: Get PluginIndicator Version
- if: steps.changes.outputs.pluginindicator == 'true'
id: updated-version-pluginindicator
uses: notiz-dev/github-action-json-property@release
with:
@@ -138,14 +113,12 @@ jobs:
prop_path: 'Version'
- name: Build PluginIndicator
- if: steps.changes.outputs.pluginindicator == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.PluginIndicator/Flow.Launcher.Plugin.PluginIndicator.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.PluginIndicator"
7z a -tzip "Flow.Launcher.Plugin.PluginIndicator.zip" "./Flow.Launcher.Plugin.PluginIndicator/*"
rm -r "Flow.Launcher.Plugin.PluginIndicator"
- name: Publish PluginIndicator
- if: steps.changes.outputs.pluginindicator == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.PluginIndicator"
@@ -157,7 +130,6 @@ jobs:
- name: Get PluginsManager Version
- if: steps.changes.outputs.pluginsmanager == 'true'
id: updated-version-pluginsmanager
uses: notiz-dev/github-action-json-property@release
with:
@@ -165,14 +137,12 @@ jobs:
prop_path: 'Version'
- name: Build PluginsManager
- if: steps.changes.outputs.pluginsmanager == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.PluginsManager"
7z a -tzip "Flow.Launcher.Plugin.PluginsManager.zip" "./Flow.Launcher.Plugin.PluginsManager/*"
rm -r "Flow.Launcher.Plugin.PluginsManager"
- name: Publish PluginsManager
- if: steps.changes.outputs.pluginsmanager == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.PluginsManager"
@@ -184,7 +154,6 @@ jobs:
- name: Get ProcessKiller Version
- if: steps.changes.outputs.processkiller == 'true'
id: updated-version-processkiller
uses: notiz-dev/github-action-json-property@release
with:
@@ -192,14 +161,12 @@ jobs:
prop_path: 'Version'
- name: Build ProcessKiller
- if: steps.changes.outputs.processkiller == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.ProcessKiller"
7z a -tzip "Flow.Launcher.Plugin.ProcessKiller.zip" "./Flow.Launcher.Plugin.ProcessKiller/*"
rm -r "Flow.Launcher.Plugin.ProcessKiller"
- name: Publish ProcessKiller
- if: steps.changes.outputs.processkiller == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.ProcessKiller"
@@ -211,7 +178,6 @@ jobs:
- name: Get Program Version
- if: steps.changes.outputs.program == 'true'
id: updated-version-program
uses: notiz-dev/github-action-json-property@release
with:
@@ -219,14 +185,12 @@ jobs:
prop_path: 'Version'
- name: Build Program
- if: steps.changes.outputs.program == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj' --framework net7.0-windows10.0.19041.0 -c Release -o "Flow.Launcher.Plugin.Program"
7z a -tzip "Flow.Launcher.Plugin.Program.zip" "./Flow.Launcher.Plugin.Program/*"
rm -r "Flow.Launcher.Plugin.Program"
- name: Publish Program
- if: steps.changes.outputs.program == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Program"
@@ -238,7 +202,6 @@ jobs:
- name: Get Shell Version
- if: steps.changes.outputs.shell == 'true'
id: updated-version-shell
uses: notiz-dev/github-action-json-property@release
with:
@@ -246,14 +209,12 @@ jobs:
prop_path: 'Version'
- name: Build Shell
- if: steps.changes.outputs.shell == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.Shell"
7z a -tzip "Flow.Launcher.Plugin.Shell.zip" "./Flow.Launcher.Plugin.Shell/*"
rm -r "Flow.Launcher.Plugin.Shell"
- name: Publish Shell
- if: steps.changes.outputs.shell == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Shell"
@@ -265,7 +226,6 @@ jobs:
- name: Get Sys Version
- if: steps.changes.outputs.sys == 'true'
id: updated-version-sys
uses: notiz-dev/github-action-json-property@release
with:
@@ -273,14 +233,12 @@ jobs:
prop_path: 'Version'
- name: Build Sys
- if: steps.changes.outputs.sys == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.Sys"
7z a -tzip "Flow.Launcher.Plugin.Sys.zip" "./Flow.Launcher.Plugin.Sys/*"
rm -r "Flow.Launcher.Plugin.Sys"
- name: Publish Sys
- if: steps.changes.outputs.sys == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Sys"
@@ -292,7 +250,6 @@ jobs:
- name: Get Url Version
- if: steps.changes.outputs.url == 'true'
id: updated-version-url
uses: notiz-dev/github-action-json-property@release
with:
@@ -300,14 +257,12 @@ jobs:
prop_path: 'Version'
- name: Build Url
- if: steps.changes.outputs.url == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.Url"
7z a -tzip "Flow.Launcher.Plugin.Url.zip" "./Flow.Launcher.Plugin.Url/*"
rm -r "Flow.Launcher.Plugin.Url"
- name: Publish Url
- if: steps.changes.outputs.url == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Url"
@@ -319,7 +274,6 @@ jobs:
- name: Get WebSearch Version
- if: steps.changes.outputs.websearch == 'true'
id: updated-version-websearch
uses: notiz-dev/github-action-json-property@release
with:
@@ -327,14 +281,12 @@ jobs:
prop_path: 'Version'
- name: Build WebSearch
- if: steps.changes.outputs.websearch == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.WebSearch/Flow.Launcher.Plugin.WebSearch.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.WebSearch"
7z a -tzip "Flow.Launcher.Plugin.WebSearch.zip" "./Flow.Launcher.Plugin.WebSearch/*"
rm -r "Flow.Launcher.Plugin.WebSearch"
- name: Publish WebSearch
- if: steps.changes.outputs.websearch == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.WebSearch"
@@ -346,7 +298,6 @@ jobs:
- name: Get WindowsSettings Version
- if: steps.changes.outputs.windowssettings == 'true'
id: updated-version-windowssettings
uses: notiz-dev/github-action-json-property@release
with:
@@ -354,14 +305,12 @@ jobs:
prop_path: 'Version'
- name: Build WindowsSettings
- if: steps.changes.outputs.windowssettings == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.WindowsSettings/Flow.Launcher.Plugin.WindowsSettings.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.WindowsSettings"
7z a -tzip "Flow.Launcher.Plugin.WindowsSettings.zip" "./Flow.Launcher.Plugin.WindowsSettings/*"
rm -r "Flow.Launcher.Plugin.WindowsSettings"
- name: Publish WindowsSettings
- if: steps.changes.outputs.windowssettings == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.WindowsSettings"
From 08c8b8c09febcf1051dfc9e49f8f051b41bff646 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 19:15:26 +0800
Subject: [PATCH 1271/1798] Do not show UI when shortcuts cannot be resolved
---
.../Programs/ShellLinkHelper.cs | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs
index a77b2ace8..34b3a6df2 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs
@@ -8,9 +8,8 @@ using Windows.Win32.Storage.FileSystem;
namespace Flow.Launcher.Plugin.Program.Programs
{
- class ShellLinkHelper
+ public class ShellLinkHelper
{
-
// Reference : http://www.pinvoke.net/default.aspx/Interfaces.IShellLinkW
[ComImport(), Guid("00021401-0000-0000-C000-000000000046")]
public class ShellLink
@@ -28,7 +27,9 @@ namespace Flow.Launcher.Plugin.Program.Programs
const int STGM_READ = 0;
((IPersistFile)link).Load(path, STGM_READ);
var hwnd = new HWND(IntPtr.Zero);
- ((IShellLinkW)link).Resolve(hwnd, 0);
+ // Use SLR_NO_UI to avoid showing any UI during resolution, like Problem with Shortcut dialogs
+ // https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ishelllinka-resolve
+ ((IShellLinkW)link).Resolve(hwnd, (uint)SLR_FLAGS.SLR_NO_UI);
const int MAX_PATH = 260;
Span buffer = stackalloc char[MAX_PATH];
@@ -79,6 +80,6 @@ namespace Flow.Launcher.Plugin.Program.Programs
Marshal.ReleaseComObject(link);
return target;
- }
+ }
}
}
From a74a59914be014a297bb1077b8262262c1eec15d Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 5 Jun 2025 22:54:28 +1000
Subject: [PATCH 1272/1798] Add get PR authors to workflow (#3611)
---
.github/update_release_pr.py | 35 +++++++++++++++++++++++++++++++----
1 file changed, 31 insertions(+), 4 deletions(-)
diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py
index f90f6181d..ccea511b3 100644
--- a/.github/update_release_pr.py
+++ b/.github/update_release_pr.py
@@ -11,7 +11,7 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st
token (str): GitHub token.
owner (str): The owner of the repository.
repo (str): The name of the repository.
- label (str): The label name.
+ label (str): The label name. Filter is not applied when empty string.
state (str): State of PR, e.g. open, closed, all
Returns:
@@ -89,7 +89,7 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all")
Args:
pull_request_items (list[dict]): List of PR items.
- label (str): The label name.
+ label (str): The label name. Filter is not applied when empty string.
state (str): State of PR, e.g. open, closed, all
Returns:
@@ -99,14 +99,36 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "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]:
+ if state in [pr["state"], "all"] and (not label or [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}")
+ print(f"Found {count} PRs with {label if label else 'no filter on'} label and state as {state}")
return pr_list
+def get_prs_assignees(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[str]:
+ """
+ Returns a list of pull request assignees after applying the label and state filters, excludes jjw24.
+
+ Args:
+ pull_request_items (list[dict]): List of PR items.
+ label (str): The label name. Filter is not applied when empty string.
+ state (str): State of PR, e.g. open, closed, all
+
+ Returns:
+ list: A list of strs, where each string is an assignee name. List is not distinct, so can contain
+ duplicate names.
+ Returns an empty list if none are found.
+ """
+ assignee_list = []
+ for pr in pull_request_items:
+ if state in [pr["state"], "all"] and (not label or [item for item in pr["labels"] if item["name"] == label]):
+ [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24" ]
+
+ print(f"Found {len(assignee_list)} assignees with {label if label else 'no filter on'} label and state as {state}")
+
+ return assignee_list
def get_pr_descriptions(pull_request_items: list[dict]) -> str:
"""
@@ -208,6 +230,11 @@ 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 ""
+ assignees = list(set(get_prs_assignees(pull_requests, "enhancement", "closed") + get_prs_assignees(pull_requests, "bug", "closed")))
+ assignees.sort(key=str.lower)
+
+ description_content += f"### Authors:\n{', '.join(assignees)}"
+
update_pull_request_description(
github_token, repository_owner, repository_name, release_pr[0]["number"], description_content
)
From 1697544cb65b4d766c58f41fb2a27ef4b59c37e8 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 22:41:21 +0800
Subject: [PATCH 1273/1798] Add example code comments
---
.../FirefoxBookmarkLoader.cs | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 492a76c7b..f3b4c109f 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -270,6 +270,7 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
///
/// Path to places.sqlite
///
+ ///
private static string PlacesPath
{
get
@@ -295,6 +296,33 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
var indexOfDefaultProfileAttributePath = lines.IndexOf("Path=" + defaultProfileFolderName);
+ /*
+ Current profiles.ini structure example as of Firefox version 69.0.1
+
+ [Install736426B0AF4A39CB]
+ Default=Profiles/7789f565.default-release <== this is the default profile this plugin will get the bookmarks from. When opened Firefox will load the default profile
+ Locked=1
+
+ [Profile2]
+ Name=newblahprofile
+ IsRelative=0
+ Path=C:\t6h2yuq8.newblahprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code.
+
+ [Profile1]
+ Name=default
+ IsRelative=1
+ Path=Profiles/cydum7q4.default
+ Default=1
+
+ [Profile0]
+ Name=default-release
+ IsRelative=1
+ Path=Profiles/7789f565.default-release
+
+ [General]
+ StartWithLastProfile=1
+ Version=2
+ */
// Seen in the example above, the IsRelative attribute is always above the Path attribute
var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
From 79d35bba5f398562fcde4ffea6ac9f70fa5a9004 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 5 Jun 2025 22:54:34 +0800
Subject: [PATCH 1274/1798] Check index before returning PlacesPath
---
.../FirefoxBookmarkLoader.cs | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index f3b4c109f..acace2506 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -324,11 +324,22 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
Version=2
*/
// Seen in the example above, the IsRelative attribute is always above the Path attribute
+
+ var relativePath = Path.Combine(defaultProfileFolderName, "places.sqlite");
+ var absoluePath = Path.Combine(profileFolderPath, relativePath);
+
+ // If the index is out of range, it means that the default profile is in a custom location or the file is malformed
+ // If the profile is in a custom location, we need to check
+ if (indexOfDefaultProfileAttributePath - 1 < 0 ||
+ indexOfDefaultProfileAttributePath - 1 >= lines.Count)
+ {
+ return Directory.Exists(absoluePath) ? absoluePath : relativePath;
+ }
+
var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
return relativeAttribute == "0" // See above, the profile is located in a custom location, path is not relative, so IsRelative=0
- ? defaultProfileFolderName + @"\places.sqlite"
- : Path.Combine(profileFolderPath, defaultProfileFolderName) + @"\places.sqlite";
+ ? relativePath : absoluePath;
}
}
}
From 71e224a131e3d59511269717c37b4d161579aaf9 Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Thu, 5 Jun 2025 23:05:02 +0800
Subject: [PATCH 1275/1798] Add prerelease version checkbox for reporting
issues
---
.github/ISSUE_TEMPLATE/bug-report.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yaml b/.github/ISSUE_TEMPLATE/bug-report.yaml
index 294c06fc1..11a921955 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yaml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yaml
@@ -16,6 +16,8 @@ body:
I have checked that this issue has not already been reported.
- label: >
I am using the latest version of Flow Launcher.
+ - label: >
+ I am using the prerelease version of Flow Launcher.
- type: textarea
attributes:
From abe287f47c606aa2c4616a35277a5fb8cc0e2a5f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 09:33:34 +0800
Subject: [PATCH 1276/1798] Add MMM date format
---
.../ViewModels/SettingsViewModel.cs | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index fb33dacab..680663e1e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -243,6 +243,21 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
"yyyy-MM-dd",
"yyyy-MM-dd ddd",
"yyyy-MM-dd, dddd",
+ "dd/MMM/yyyy",
+ "dd/MMM/yyyy ddd",
+ "dd/MMM/yyyy, dddd",
+ "dd-MMM-yyyy",
+ "dd-MMM-yyyy ddd",
+ "dd-MMM-yyyy, dddd",
+ "dd.MMM.yyyy",
+ "dd.MMM.yyyy ddd",
+ "dd.MMM.yyyy, dddd",
+ "MMM/dd/yyyy",
+ "MMM/dd/yyyy ddd",
+ "MMM/dd/yyyy, dddd",
+ "yyyy-MMM-dd",
+ "yyyy-MMM-dd ddd",
+ "yyyy-MMM-dd, dddd",
};
#endregion
From 33a5ca845a5700e28c1d886cbf151aebdf6af791 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 13:12:40 +0800
Subject: [PATCH 1277/1798] Support Msix FireFox bookmarks
---
.../FirefoxBookmarkLoader.cs | 165 +++++++++++-------
1 file changed, 98 insertions(+), 67 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index acace2506..42a288e3a 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -264,84 +264,115 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
///
public override List GetBookmarks()
{
- return GetBookmarksFromPath(PlacesPath);
+ var bookmarks1 = GetBookmarksFromPath(PlacesPath);
+ var bookmarks2 = GetBookmarksFromPath(MsixPlacesPath);
+ return bookmarks1.Concat(bookmarks2).ToList();
}
///
- /// Path to places.sqlite
+ /// Path to places.sqlite of Msi installer
+ /// E.g. C:\Users\{UserName}\AppData\Roaming\Mozilla\Firefox
+ ///
///
- ///
private static string PlacesPath
{
get
{
var profileFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Mozilla\Firefox");
- var profileIni = Path.Combine(profileFolderPath, @"profiles.ini");
-
- if (!File.Exists(profileIni))
- return string.Empty;
-
- // get firefox default profile directory from profiles.ini
- using var sReader = new StreamReader(profileIni);
- var ini = sReader.ReadToEnd();
-
- var lines = ini.Split("\r\n").ToList();
-
- var defaultProfileFolderNameRaw = lines.FirstOrDefault(x => x.Contains("Default=") && x != "Default=1") ?? string.Empty;
-
- if (string.IsNullOrEmpty(defaultProfileFolderNameRaw))
- return string.Empty;
-
- var defaultProfileFolderName = defaultProfileFolderNameRaw.Split('=').Last();
-
- var indexOfDefaultProfileAttributePath = lines.IndexOf("Path=" + defaultProfileFolderName);
-
- /*
- Current profiles.ini structure example as of Firefox version 69.0.1
-
- [Install736426B0AF4A39CB]
- Default=Profiles/7789f565.default-release <== this is the default profile this plugin will get the bookmarks from. When opened Firefox will load the default profile
- Locked=1
-
- [Profile2]
- Name=newblahprofile
- IsRelative=0
- Path=C:\t6h2yuq8.newblahprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code.
-
- [Profile1]
- Name=default
- IsRelative=1
- Path=Profiles/cydum7q4.default
- Default=1
-
- [Profile0]
- Name=default-release
- IsRelative=1
- Path=Profiles/7789f565.default-release
-
- [General]
- StartWithLastProfile=1
- Version=2
- */
- // Seen in the example above, the IsRelative attribute is always above the Path attribute
-
- var relativePath = Path.Combine(defaultProfileFolderName, "places.sqlite");
- var absoluePath = Path.Combine(profileFolderPath, relativePath);
-
- // If the index is out of range, it means that the default profile is in a custom location or the file is malformed
- // If the profile is in a custom location, we need to check
- if (indexOfDefaultProfileAttributePath - 1 < 0 ||
- indexOfDefaultProfileAttributePath - 1 >= lines.Count)
- {
- return Directory.Exists(absoluePath) ? absoluePath : relativePath;
- }
-
- var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
-
- return relativeAttribute == "0" // See above, the profile is located in a custom location, path is not relative, so IsRelative=0
- ? relativePath : absoluePath;
+ return GetProfileIniPath(profileFolderPath);
}
}
+
+ ///
+ /// Path to places.sqlite of MSIX installer
+ /// E.g. C:\Users\{UserName}\AppData\Local\Packages\Mozilla.Firefox_n80bbvh6b1yt2\LocalCache\Roaming\Mozilla\Firefox
+ ///
+ ///
+ public static string MsixPlacesPath
+ {
+ get
+ {
+ var platformPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
+ var packagesPath = Path.Combine(platformPath, "Packages");
+
+ // Search for folder with Mozilla.Firefox prefix
+ var firefoxPackageFolder = Directory.EnumerateDirectories(packagesPath, "Mozilla.Firefox*",
+ SearchOption.TopDirectoryOnly).FirstOrDefault();
+
+ // Msix FireFox not installed
+ if (firefoxPackageFolder == null) return string.Empty;
+
+ var profileFolderPath = Path.Combine(firefoxPackageFolder, @"LocalCache\Roaming\Mozilla\Firefox");
+ return GetProfileIniPath(profileFolderPath);
+ }
+ }
+
+ private static string GetProfileIniPath(string profileFolderPath)
+ {
+ var profileIni = Path.Combine(profileFolderPath, @"profiles.ini");
+ if (!File.Exists(profileIni))
+ return string.Empty;
+
+ // get firefox default profile directory from profiles.ini
+ using var sReader = new StreamReader(profileIni);
+ var ini = sReader.ReadToEnd();
+
+ var lines = ini.Split("\r\n").ToList();
+
+ var defaultProfileFolderNameRaw = lines.FirstOrDefault(x => x.Contains("Default=") && x != "Default=1") ?? string.Empty;
+
+ if (string.IsNullOrEmpty(defaultProfileFolderNameRaw))
+ return string.Empty;
+
+ var defaultProfileFolderName = defaultProfileFolderNameRaw.Split('=').Last();
+
+ var indexOfDefaultProfileAttributePath = lines.IndexOf("Path=" + defaultProfileFolderName);
+
+ /*
+ Current profiles.ini structure example as of Firefox version 69.0.1
+
+ [Install736426B0AF4A39CB]
+ Default=Profiles/7789f565.default-release <== this is the default profile this plugin will get the bookmarks from. When opened Firefox will load the default profile
+ Locked=1
+
+ [Profile2]
+ Name=newblahprofile
+ IsRelative=0
+ Path=C:\t6h2yuq8.newblahprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code.
+
+ [Profile1]
+ Name=default
+ IsRelative=1
+ Path=Profiles/cydum7q4.default
+ Default=1
+
+ [Profile0]
+ Name=default-release
+ IsRelative=1
+ Path=Profiles/7789f565.default-release
+
+ [General]
+ StartWithLastProfile=1
+ Version=2
+ */
+ // Seen in the example above, the IsRelative attribute is always above the Path attribute
+
+ var relativePath = Path.Combine(defaultProfileFolderName, "places.sqlite");
+ var absoluePath = Path.Combine(profileFolderPath, relativePath);
+
+ // If the index is out of range, it means that the default profile is in a custom location or the file is malformed
+ // If the profile is in a custom location, we need to check
+ if (indexOfDefaultProfileAttributePath - 1 < 0 ||
+ indexOfDefaultProfileAttributePath - 1 >= lines.Count)
+ {
+ return Directory.Exists(absoluePath) ? absoluePath : relativePath;
+ }
+
+ var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
+
+ return relativeAttribute == "0" // See above, the profile is located in a custom location, path is not relative, so IsRelative=0
+ ? relativePath : absoluePath;
+ }
}
public static class Extensions
From 57470a9799d9e968932f1b4e37c194f19bf428ad Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 13:21:51 +0800
Subject: [PATCH 1278/1798] Fix IsRelative logic.
---
.../FirefoxBookmarkLoader.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 42a288e3a..61fd05073 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -370,7 +370,8 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
- return relativeAttribute == "0" // See above, the profile is located in a custom location, path is not relative, so IsRelative=0
+ // See above, the profile is located in a custom location, path is not relative, so IsRelative=0
+ return (relativeAttribute == "0" || relativeAttribute == "IsRelative=0")
? relativePath : absoluePath;
}
}
From f59e2399b9d0a58ea59eac2cdee87810a9fcb350 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 13:25:43 +0800
Subject: [PATCH 1279/1798] Add error handling for directory operation
---
.../FirefoxBookmarkLoader.cs | 22 ++++++++++++-------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 61fd05073..ac382275f 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -294,16 +294,22 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
{
var platformPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
var packagesPath = Path.Combine(platformPath, "Packages");
-
- // Search for folder with Mozilla.Firefox prefix
- var firefoxPackageFolder = Directory.EnumerateDirectories(packagesPath, "Mozilla.Firefox*",
- SearchOption.TopDirectoryOnly).FirstOrDefault();
+ try
+ {
+ // Search for folder with Mozilla.Firefox prefix
+ var firefoxPackageFolder = Directory.EnumerateDirectories(packagesPath, "Mozilla.Firefox*",
+ SearchOption.TopDirectoryOnly).FirstOrDefault();
- // Msix FireFox not installed
- if (firefoxPackageFolder == null) return string.Empty;
+ // Msix FireFox not installed
+ if (firefoxPackageFolder == null) return string.Empty;
- var profileFolderPath = Path.Combine(firefoxPackageFolder, @"LocalCache\Roaming\Mozilla\Firefox");
- return GetProfileIniPath(profileFolderPath);
+ var profileFolderPath = Path.Combine(firefoxPackageFolder, @"LocalCache\Roaming\Mozilla\Firefox");
+ return GetProfileIniPath(profileFolderPath);
+ }
+ catch
+ {
+ return string.Empty;
+ }
}
}
From 8c5e0c948f6e1cc799b912207e8bbeb92967c776 Mon Sep 17 00:00:00 2001
From: DB P
Date: Fri, 6 Jun 2025 17:05:12 +0900
Subject: [PATCH 1280/1798] Change Tabcontrol to Expander
---
.../Views/ExplorerSettings.xaml | 1370 ++++++++---------
.../Views/ExplorerSettings.xaml.cs | 49 +-
2 files changed, 698 insertions(+), 721 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 4302e721a..eff1b4751 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -10,97 +10,13 @@
xmlns:ui="http://schemas.modernwpf.com/2019"
xmlns:viewModels="clr-namespace:Flow.Launcher.Plugin.Explorer.ViewModels"
xmlns:views="clr-namespace:Flow.Launcher.Plugin.Explorer.Views"
+ Margin="-72 0 -19 -14"
d:DataContext="{d:DesignInstance viewModels:SettingsViewModel}"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
-
-
@@ -163,653 +79,685 @@
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
+ Content="{DynamicResource plugin_explorer_default_open_in_file_manager}"
+ IsChecked="{Binding Settings.DefaultOpenFolderInFileManager}" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+ Text="{DynamicResource plugin_explorer_Index_Search_Engine}" />
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ Orientation="Horizontal">
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
index 9203ece9a..0191e8a53 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
@@ -1,4 +1,5 @@
-using System.ComponentModel;
+using System.Collections.Generic;
+using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Windows;
@@ -11,28 +12,39 @@ using DragEventArgs = System.Windows.DragEventArgs;
namespace Flow.Launcher.Plugin.Explorer.Views
{
- ///
- /// Interaction logic for ExplorerSettings.xaml
- ///
public partial class ExplorerSettings
{
private readonly SettingsViewModel viewModel;
+ private List _expanders;
public ExplorerSettings(SettingsViewModel viewModel)
{
DataContext = viewModel;
-
InitializeComponent();
-
this.viewModel = viewModel;
-
- DataContext = viewModel;
+ // DataContext = viewModel; // Removed duplicate
ActionKeywordModel.Init(viewModel.Settings);
- lbxAccessLinks.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
+ // Ensure lbxAccessLinks and lbxExcludedPaths are initialized before accessing Items
+ // This might require Loaded event if they are not immediately available
+ // For now, assuming they are available after InitializeComponent()
+ if (lbxAccessLinks != null)
+ lbxAccessLinks.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
+
+ if (lbxExcludedPaths != null)
+ lbxExcludedPaths.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
- lbxExcludedPaths.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
+ _expanders = new List
+ {
+ GeneralSettingsExpander,
+ ContextMenuExpander,
+ PreviewPanelExpander,
+ EverythingExpander,
+ ActionKeywordsExpander,
+ QuickAccessExpander,
+ ExcludedPathsExpander
+ };
}
private void AccessLinkDragDrop(string containerName, DragEventArgs e)
@@ -93,5 +105,22 @@ namespace Flow.Launcher.Plugin.Explorer.Views
{
e.Handled = e.Text.ToCharArray().Any(c => !char.IsDigit(c));
}
+
+ private void Expander_Expanded(object sender, RoutedEventArgs e)
+ {
+ if (sender is Expander expandedExpander)
+ {
+ // Ensure _expanders is not null and contains items
+ if (_expanders == null || !_expanders.Any()) return;
+
+ foreach (var expander in _expanders)
+ {
+ if (expander != null && expander != expandedExpander && expander.IsExpanded)
+ {
+ expander.IsExpanded = false;
+ }
+ }
+ }
+ }
}
}
From 6cd830c5b5088f30364607a1b6489ea468e9570e Mon Sep 17 00:00:00 2001
From: DB P
Date: Fri, 6 Jun 2025 17:07:57 +0900
Subject: [PATCH 1281/1798] Fix Font Color
---
.../Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index eff1b4751..ca395fc5e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -88,6 +88,7 @@
From c2eca7dc39407212d1fbd1de03a11f475ffc0a59 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 16:15:26 +0800
Subject: [PATCH 1282/1798] Improve code quality
---
.../Views/ExplorerSettings.xaml.cs | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
index 0191e8a53..bb52612e4 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
@@ -14,15 +14,17 @@ namespace Flow.Launcher.Plugin.Explorer.Views
{
public partial class ExplorerSettings
{
- private readonly SettingsViewModel viewModel;
- private List _expanders;
+ private readonly SettingsViewModel _viewModel;
+ private readonly List _expanders;
public ExplorerSettings(SettingsViewModel viewModel)
{
+ _viewModel = viewModel;
DataContext = viewModel;
+
InitializeComponent();
- this.viewModel = viewModel;
- // DataContext = viewModel; // Removed duplicate
+
+ DataContext = viewModel;
ActionKeywordModel.Init(viewModel.Settings);
@@ -63,7 +65,7 @@ namespace Flow.Launcher.Plugin.Explorer.Views
{
Path = s
};
- viewModel.AppendLink(containerName, newFolderLink);
+ _viewModel.AppendLink(containerName, newFolderLink);
}
}
}
@@ -88,8 +90,8 @@ namespace Flow.Launcher.Plugin.Explorer.Views
{
if (tbFastSortWarning is not null)
{
- tbFastSortWarning.Visibility = viewModel.FastSortWarningVisibility;
- tbFastSortWarning.Text = viewModel.SortOptionWarningMessage;
+ tbFastSortWarning.Visibility = _viewModel.FastSortWarningVisibility;
+ tbFastSortWarning.Text = _viewModel.SortOptionWarningMessage;
}
}
private void LbxAccessLinks_OnDrop(object sender, DragEventArgs e)
From 05cd01d1d61c2cb9b8ddcbb35a3590f584a02d4e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 16:20:43 +0800
Subject: [PATCH 1283/1798] Use loaded event to ensure accessability
---
.../Views/ExplorerSettings.xaml | 7 ++-
.../Views/ExplorerSettings.xaml.cs | 47 ++++++++++---------
2 files changed, 32 insertions(+), 22 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index ca395fc5e..451d7afb2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -110,6 +110,7 @@
Expanded="Expander_Expanded"
Header="{DynamicResource plugin_explorer_generalsetting_header}"
IsExpanded="False"
+ Loaded="GeneralSettingsExpander_Loaded"
Style="{StaticResource CustomExpanderStyle}">
@@ -664,6 +665,7 @@
Drop="LbxAccessLinks_OnDrop"
ItemTemplate="{StaticResource ListViewTemplateAccessLinks}"
ItemsSource="{Binding Settings.QuickAccessLinks}"
+ Loaded="lbxAccessLinks_Loaded"
SelectedItem="{Binding SelectedQuickAccessLink}" />
@@ -698,9 +700,11 @@
@@ -728,6 +732,7 @@
Drop="LbxExcludedPaths_OnDrop"
ItemTemplate="{StaticResource ListViewTemplateAccessLinks}"
ItemsSource="{Binding Settings.IndexSearchExcludedSubdirectoryPaths}"
+ Loaded="lbxExcludedPaths_Loaded"
SelectedItem="{Binding SelectedIndexSearchExcludedPath}" />
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
index bb52612e4..e82c10ae2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
@@ -15,7 +15,7 @@ namespace Flow.Launcher.Plugin.Explorer.Views
public partial class ExplorerSettings
{
private readonly SettingsViewModel _viewModel;
- private readonly List _expanders;
+ private readonly List _expanders = new();
public ExplorerSettings(SettingsViewModel viewModel)
{
@@ -27,26 +27,6 @@ namespace Flow.Launcher.Plugin.Explorer.Views
DataContext = viewModel;
ActionKeywordModel.Init(viewModel.Settings);
-
- // Ensure lbxAccessLinks and lbxExcludedPaths are initialized before accessing Items
- // This might require Loaded event if they are not immediately available
- // For now, assuming they are available after InitializeComponent()
- if (lbxAccessLinks != null)
- lbxAccessLinks.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
-
- if (lbxExcludedPaths != null)
- lbxExcludedPaths.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
-
- _expanders = new List
- {
- GeneralSettingsExpander,
- ContextMenuExpander,
- PreviewPanelExpander,
- EverythingExpander,
- ActionKeywordsExpander,
- QuickAccessExpander,
- ExcludedPathsExpander
- };
}
private void AccessLinkDragDrop(string containerName, DragEventArgs e)
@@ -124,5 +104,30 @@ namespace Flow.Launcher.Plugin.Explorer.Views
}
}
}
+
+ private void lbxAccessLinks_Loaded(object sender, RoutedEventArgs e)
+ {
+ lbxAccessLinks.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
+ }
+
+ private void lbxExcludedPaths_Loaded(object sender, RoutedEventArgs e)
+ {
+ lbxExcludedPaths.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
+ }
+
+ private void GeneralSettingsExpander_Loaded(object sender, RoutedEventArgs e)
+ {
+ var expanders = new List
+ {
+ GeneralSettingsExpander,
+ ContextMenuExpander,
+ PreviewPanelExpander,
+ EverythingExpander,
+ ActionKeywordsExpander,
+ QuickAccessExpander,
+ ExcludedPathsExpander
+ };
+ _expanders.AddRange(expanders);
+ }
}
}
From b29bc75dcb8e4e50de3b48a7aff9716f5ca7f6b6 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 16:53:31 +0800
Subject: [PATCH 1284/1798] Improve setting panel design
---
.../Views/ExplorerSettings.xaml | 23 ++++++++++---------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 451d7afb2..83ef42688 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -10,7 +10,6 @@
xmlns:ui="http://schemas.modernwpf.com/2019"
xmlns:viewModels="clr-namespace:Flow.Launcher.Plugin.Explorer.ViewModels"
xmlns:views="clr-namespace:Flow.Launcher.Plugin.Explorer.Views"
- Margin="-72 0 -19 -14"
d:DataContext="{d:DesignInstance viewModels:SettingsViewModel}"
d:DesignHeight="450"
d:DesignWidth="800"
@@ -86,7 +85,7 @@
@@ -101,8 +100,9 @@
-
-
+
+
+
-
+
+
@@ -333,7 +334,7 @@
Header="{DynamicResource plugin_explorer_native_context_menu_header}"
IsExpanded="False"
Style="{StaticResource CustomExpanderStyle}">
-
+
@@ -403,7 +404,7 @@
Header="{DynamicResource plugin_explorer_previewpanel_setting_header}"
IsExpanded="False"
Style="{StaticResource CustomExpanderStyle}">
-
+
@@ -500,7 +501,7 @@
Header="{DynamicResource plugin_explorer_everything_setting_header}"
IsExpanded="False"
Style="{StaticResource CustomExpanderStyle}">
-
+
@@ -592,7 +593,7 @@
Header="{DynamicResource plugin_explorer_manageactionkeywords_header}"
IsExpanded="False"
Style="{StaticResource CustomExpanderStyle}">
-
+
@@ -638,7 +639,7 @@
Header="{DynamicResource plugin_explorer_quickaccesslinks_header}"
IsExpanded="False"
Style="{StaticResource CustomExpanderStyle}">
-
+
@@ -706,7 +707,7 @@
Header="{DynamicResource plugin_explorer_indexsearchexcludedpaths_header}"
IsExpanded="False"
Style="{StaticResource CustomExpanderStyle}">
-
+
From 569cb8bd44b743c104ec82dc6598ec8bbad42051 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 16:57:48 +0800
Subject: [PATCH 1285/1798] Remove grid & scroll viewer & Remove bottom margin
---
.../Views/ExplorerSettings.xaml | 1290 ++++++++---------
1 file changed, 643 insertions(+), 647 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 83ef42688..070820a0d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -101,670 +101,666 @@
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+ Margin="{StaticResource SettingPanelItemLeftTopBottomMargin}"
+ Content="{DynamicResource plugin_explorer_previewpanel_display_file_size_checkbox}"
+ IsChecked="{Binding ShowFileSizeInPreviewPanel}" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ Content="{DynamicResource plugin_explorer_previewpanel_display_file_creation_checkbox}"
+ IsChecked="{Binding ShowCreatedDateInPreviewPanel}" />
+ Margin="{StaticResource SettingPanelItemLeftTopBottomMargin}"
+ Content="{DynamicResource plugin_explorer_previewpanel_display_file_modification_checkbox}"
+ IsChecked="{Binding ShowModifiedDateInPreviewPanel}" />
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+ Text="{Binding PreviewPanelDateFormatDemo}" />
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ Text="{Binding PreviewPanelTimeFormatDemo}" />
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From 6614771c3dfafd8a32d4573303f8ff479eea9477 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 17:03:20 +0800
Subject: [PATCH 1286/1798] Move initialization to constructor
---
.../Views/ExplorerSettings.xaml | 1 -
.../Views/ExplorerSettings.xaml.cs | 28 ++++++++-----------
2 files changed, 12 insertions(+), 17 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 070820a0d..b81c3cac3 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -108,7 +108,6 @@
Expanded="Expander_Expanded"
Header="{DynamicResource plugin_explorer_generalsetting_header}"
IsExpanded="False"
- Loaded="GeneralSettingsExpander_Loaded"
Style="{StaticResource CustomExpanderStyle}">
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
index e82c10ae2..2c50f1c6f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
@@ -15,7 +15,7 @@ namespace Flow.Launcher.Plugin.Explorer.Views
public partial class ExplorerSettings
{
private readonly SettingsViewModel _viewModel;
- private readonly List _expanders = new();
+ private readonly List _expanders;
public ExplorerSettings(SettingsViewModel viewModel)
{
@@ -27,6 +27,17 @@ namespace Flow.Launcher.Plugin.Explorer.Views
DataContext = viewModel;
ActionKeywordModel.Init(viewModel.Settings);
+
+ _expanders = new List
+ {
+ GeneralSettingsExpander,
+ ContextMenuExpander,
+ PreviewPanelExpander,
+ EverythingExpander,
+ ActionKeywordsExpander,
+ QuickAccessExpander,
+ ExcludedPathsExpander
+ };
}
private void AccessLinkDragDrop(string containerName, DragEventArgs e)
@@ -114,20 +125,5 @@ namespace Flow.Launcher.Plugin.Explorer.Views
{
lbxExcludedPaths.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
}
-
- private void GeneralSettingsExpander_Loaded(object sender, RoutedEventArgs e)
- {
- var expanders = new List
- {
- GeneralSettingsExpander,
- ContextMenuExpander,
- PreviewPanelExpander,
- EverythingExpander,
- ActionKeywordsExpander,
- QuickAccessExpander,
- ExcludedPathsExpander
- };
- _expanders.AddRange(expanders);
- }
}
}
From baef9ddacd119e5fdce544b8f5ee476482732408 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 18:37:17 +0800
Subject: [PATCH 1287/1798] Expose ISaveable interface in derived class to make
sure we are calling the new version of Save method
---
.../Storage/FlowLauncherJsonStorage.cs | 4 +++-
Flow.Launcher.Infrastructure/Storage/PluginBinaryStorage.cs | 4 +++-
Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs | 4 +++-
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs
index 158e0cdf5..857490bad 100644
--- a/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs
@@ -2,11 +2,13 @@
using System.Threading.Tasks;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
namespace Flow.Launcher.Infrastructure.Storage
{
- public class FlowLauncherJsonStorage : JsonStorage where T : new()
+ // Expose ISaveable interface in derived class to make sure we are calling the new version of Save method
+ public class FlowLauncherJsonStorage : JsonStorage, ISavable where T : new()
{
private static readonly string ClassName = "FlowLauncherJsonStorage";
diff --git a/Flow.Launcher.Infrastructure/Storage/PluginBinaryStorage.cs b/Flow.Launcher.Infrastructure/Storage/PluginBinaryStorage.cs
index 01da96d62..0e0906e73 100644
--- a/Flow.Launcher.Infrastructure/Storage/PluginBinaryStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/PluginBinaryStorage.cs
@@ -1,11 +1,13 @@
using System.IO;
using System.Threading.Tasks;
using Flow.Launcher.Infrastructure.Logger;
+using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
namespace Flow.Launcher.Infrastructure.Storage
{
- public class PluginBinaryStorage : BinaryStorage where T : new()
+ // Expose ISaveable interface in derived class to make sure we are calling the new version of Save method
+ public class PluginBinaryStorage : BinaryStorage, ISavable where T : new()
{
private static readonly string ClassName = "PluginBinaryStorage";
diff --git a/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs
index 147152949..d59083071 100644
--- a/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs
@@ -2,11 +2,13 @@
using System.Threading.Tasks;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
namespace Flow.Launcher.Infrastructure.Storage
{
- public class PluginJsonStorage : JsonStorage where T : new()
+ // Expose ISaveable interface in derived class to make sure we are calling the new version of Save method
+ public class PluginJsonStorage : JsonStorage, ISavable where T : new()
{
// Use assembly name to check which plugin is using this storage
public readonly string AssemblyName;
From 062cd2ad1dc8dd8327a6a2cebdbd58e478c362d9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 18:38:05 +0800
Subject: [PATCH 1288/1798] Use ISavable instead of object
---
Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs | 2 +-
Flow.Launcher/PublicAPIInstance.cs | 10 ++++------
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index 003e72a5d..435d97ab7 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -12,7 +12,7 @@ using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Plugin
{
- public class JsonRPCPluginSettings
+ public class JsonRPCPluginSettings : ISavable
{
public required JsonRpcConfigurationModel? Configuration { get; init; }
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index 80d5de53d..06e17baf0 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -276,7 +276,7 @@ namespace Flow.Launcher
public void LogException(string className, string message, Exception e, [CallerMemberName] string methodName = "") =>
Log.Exception(className, message, e, methodName);
- private readonly ConcurrentDictionary _pluginJsonStorages = new();
+ private readonly ConcurrentDictionary _pluginJsonStorages = new();
public void RemovePluginSettings(string assemblyName)
{
@@ -294,9 +294,8 @@ namespace Flow.Launcher
public void SavePluginSettings()
{
- foreach (var value in _pluginJsonStorages.Values)
+ foreach (var savable in _pluginJsonStorages.Values)
{
- var savable = value as ISavable;
savable?.Save();
}
}
@@ -496,7 +495,7 @@ namespace Flow.Launcher
public bool SetCurrentTheme(ThemeData theme) =>
Theme.ChangeTheme(theme.FileNameWithoutExtension);
- private readonly ConcurrentDictionary<(string, string, Type), object> _pluginBinaryStorages = new();
+ private readonly ConcurrentDictionary<(string, string, Type), ISavable> _pluginBinaryStorages = new();
public void RemovePluginCaches(string cacheDirectory)
{
@@ -513,9 +512,8 @@ namespace Flow.Launcher
public void SavePluginCaches()
{
- foreach (var value in _pluginBinaryStorages.Values)
+ foreach (var savable in _pluginBinaryStorages.Values)
{
- var savable = value as ISavable;
savable?.Save();
}
}
From 0c474a979ff48988b7624035c5b97047201e0312 Mon Sep 17 00:00:00 2001
From: DB P
Date: Fri, 6 Jun 2025 20:36:30 +0900
Subject: [PATCH 1289/1798] Add Hover Style / Adjust Arrow / Adjust Padding
---
.../Resources/CustomControlTemplate.xaml | 73 +++++++++++++
.../Views/ExplorerSettings.xaml | 101 +++++++++++++++---
2 files changed, 160 insertions(+), 14 deletions(-)
diff --git a/Flow.Launcher/Resources/CustomControlTemplate.xaml b/Flow.Launcher/Resources/CustomControlTemplate.xaml
index 08b239c41..cdaadd45a 100644
--- a/Flow.Launcher/Resources/CustomControlTemplate.xaml
+++ b/Flow.Launcher/Resources/CustomControlTemplate.xaml
@@ -2407,6 +2407,79 @@
+
+
+
+
From dc3fada88f642800dee716e223a61c1df4cd3eaf Mon Sep 17 00:00:00 2001
From: DB P
Date: Fri, 6 Jun 2025 20:38:07 +0900
Subject: [PATCH 1290/1798] Fix Border
---
.../Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 0d4710e24..05135e0d2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -86,7 +86,7 @@
-
+
From 600137c91196c39b96c4881880aef744c3011e5a Mon Sep 17 00:00:00 2001
From: DB P
Date: Fri, 6 Jun 2025 20:38:37 +0900
Subject: [PATCH 1291/1798] Fix Border
---
.../Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 05135e0d2..47d53d463 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -86,7 +86,7 @@
-
+
From 82f3e99f0eec30c493169c1cf754ab80b88f7f8a Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 20:08:11 +0800
Subject: [PATCH 1292/1798] Revert changes in ExplorerSettings.xaml
---
.../Views/ExplorerSettings.xaml | 44 +++++++------------
1 file changed, 17 insertions(+), 27 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 50151d0b0..b5ac95c44 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -198,7 +198,6 @@
-
@@ -223,17 +222,8 @@
Content="{DynamicResource plugin_explorer_default_open_in_file_manager}"
IsChecked="{Binding Settings.DefaultOpenFolderInFileManager}" />
-
-
@@ -260,7 +250,7 @@
@@ -287,7 +277,7 @@
@@ -314,14 +304,14 @@
Date: Fri, 6 Jun 2025 20:09:47 +0800
Subject: [PATCH 1293/1798] Add blank line back
---
.../Views/ExplorerSettings.xaml | 99 ++++++++++---------
1 file changed, 55 insertions(+), 44 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 331b238ca..ae9e25ad2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -92,41 +92,43 @@
+ Background="{TemplateBinding Background}"
+ BorderBrush="{TemplateBinding BorderBrush}"
+ BorderThickness="{TemplateBinding BorderThickness}"
+ SnapsToDevicePixels="true">
-
+ x:Name="HeaderSite"
+ MinWidth="0"
+ MinHeight="0"
+ Margin="0"
+ Padding="{TemplateBinding Padding}"
+ HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
+ VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
+ Content="{TemplateBinding Header}"
+ ContentTemplate="{TemplateBinding HeaderTemplate}"
+ ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}"
+ DockPanel.Dock="Top"
+ FocusVisualStyle="{StaticResource ExpanderHeaderFocusVisual}"
+ FontFamily="{TemplateBinding FontFamily}"
+ FontSize="{TemplateBinding FontSize}"
+ FontStretch="{TemplateBinding FontStretch}"
+ FontStyle="{TemplateBinding FontStyle}"
+ FontWeight="{TemplateBinding FontWeight}"
+ Foreground="{TemplateBinding Foreground}"
+ IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
+ Style="{StaticResource ExpanderHeaderRightArrowStyle}" />
+
+ x:Name="ExpandSite"
+ Margin="{TemplateBinding Padding}"
+ HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
+ VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
+ DockPanel.Dock="Bottom"
+ Focusable="false" />
@@ -141,13 +143,17 @@
+ Storyboard.TargetName="ContentPresenterBorder"
+ Storyboard.TargetProperty="(Border.LayoutTransform).(ScaleTransform.ScaleY)"
+ From="0.0"
+ To="1.0"
+ Duration="0:0:0" />
+ Storyboard.TargetName="ContentPresenterBorder"
+ Storyboard.TargetProperty="(Border.Opacity)"
+ From="0.0"
+ To="1.0"
+ Duration="0:0:0" />
@@ -155,13 +161,17 @@
+ Storyboard.TargetName="ContentPresenterBorder"
+ Storyboard.TargetProperty="(Border.LayoutTransform).(ScaleTransform.ScaleY)"
+ From="1.0"
+ To="0.0"
+ Duration="0:0:0" />
+ Storyboard.TargetName="ContentPresenterBorder"
+ Storyboard.TargetProperty="(Border.Opacity)"
+ From="1.0"
+ To="0.0"
+ Duration="0:0:0" />
@@ -367,6 +377,7 @@
HorizontalAlignment="Left"
Text="{Binding ExcludedFileTypes}"
ToolTip="{DynamicResource plugin_explorer_Excluded_File_Types_Tooltip}" />
+
Date: Fri, 6 Jun 2025 20:14:33 +0800
Subject: [PATCH 1294/1798] Add setting ui back
---
.../Views/ExplorerSettings.xaml | 44 ++++++++++++-------
1 file changed, 27 insertions(+), 17 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index ae9e25ad2..93012bd36 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -207,6 +207,7 @@
+
@@ -230,16 +231,25 @@
Content="{DynamicResource plugin_explorer_default_open_in_file_manager}"
IsChecked="{Binding Settings.DefaultOpenFolderInFileManager}" />
-
+
+
@@ -258,7 +268,7 @@
@@ -285,7 +295,7 @@
@@ -312,14 +322,14 @@
Date: Fri, 6 Jun 2025 23:07:01 +0800
Subject: [PATCH 1295/1798] Add GetString api function
---
Flow.Launcher.Infrastructure/Http/Http.cs | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/Flow.Launcher.Infrastructure/Http/Http.cs b/Flow.Launcher.Infrastructure/Http/Http.cs
index a29f8accf..22eb065f5 100644
--- a/Flow.Launcher.Infrastructure/Http/Http.cs
+++ b/Flow.Launcher.Infrastructure/Http/Http.cs
@@ -220,5 +220,18 @@ namespace Flow.Launcher.Infrastructure.Http
return new HttpResponseMessage(HttpStatusCode.InternalServerError);
}
}
+
+ public static async Task GetStringAsync(string url, CancellationToken token = default)
+ {
+ try
+ {
+ Log.Debug(ClassName, $"Url <{url}>");
+ return await client.GetStringAsync(url, token);
+ }
+ catch (System.Exception e)
+ {
+ return string.Empty;
+ }
+ }
}
}
From 1f4578c04ce64325a1ad0fd8b20548fc039239cc Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 23:08:32 +0800
Subject: [PATCH 1296/1798] Add release notes window
---
Flow.Launcher/Flow.Launcher.csproj | 1 +
Flow.Launcher/ReleaseNotesWindow.xaml | 168 +++++++++++++++++++++++
Flow.Launcher/ReleaseNotesWindow.xaml.cs | 149 ++++++++++++++++++++
3 files changed, 318 insertions(+)
create mode 100644 Flow.Launcher/ReleaseNotesWindow.xaml
create mode 100644 Flow.Launcher/ReleaseNotesWindow.xaml.cs
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 8d43eff98..4580798b2 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -90,6 +90,7 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
+
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml b/Flow.Launcher/ReleaseNotesWindow.xaml
new file mode 100644
index 000000000..132de63c8
--- /dev/null
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
new file mode 100644
index 000000000..18c67ac5b
--- /dev/null
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
@@ -0,0 +1,149 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Input;
+using Flow.Launcher.Infrastructure.Http;
+
+namespace Flow.Launcher
+{
+ public partial class ReleaseNotesWindow : Window
+ {
+ public ReleaseNotesWindow()
+ {
+ InitializeComponent();
+ }
+
+ #region Window Events
+
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
+ private async void Window_Loaded(object sender, RoutedEventArgs e)
+ {
+ RefreshMaximizeRestoreButton();
+ MarkdownViewer.Markdown = await GetReleaseNotesMarkdownAsync();
+ }
+
+ private void OnCloseExecuted(object sender, ExecutedRoutedEventArgs e)
+ {
+ Close();
+ }
+
+ #endregion
+
+ #region Window Custom TitleBar
+
+ private void OnMinimizeButtonClick(object sender, RoutedEventArgs e)
+ {
+ WindowState = WindowState.Minimized;
+ }
+
+ private void OnMaximizeRestoreButtonClick(object sender, RoutedEventArgs e)
+ {
+ WindowState = WindowState switch
+ {
+ WindowState.Maximized => WindowState.Normal,
+ _ => WindowState.Maximized
+ };
+ }
+
+ private void OnCloseButtonClick(object sender, RoutedEventArgs e)
+ {
+ Close();
+ }
+
+ private void RefreshMaximizeRestoreButton()
+ {
+ if (WindowState == WindowState.Maximized)
+ {
+ MaximizeButton.Visibility = Visibility.Hidden;
+ RestoreButton.Visibility = Visibility.Visible;
+ }
+ else
+ {
+ MaximizeButton.Visibility = Visibility.Visible;
+ RestoreButton.Visibility = Visibility.Hidden;
+ }
+ }
+
+ private void Window_StateChanged(object sender, EventArgs e)
+ {
+ RefreshMaximizeRestoreButton();
+ }
+
+ #endregion
+
+ #region Release Notes
+
+ private static async Task GetReleaseNotesMarkdownAsync()
+ {
+ var releaseNotesJSON = await Http.GetStringAsync("https://api.github.com/repos/Flow-Launcher/Flow.Launcher/releases");
+ var releases = JsonSerializer.Deserialize>(releaseNotesJSON);
+
+ // Get the latest releases
+ var latestReleases = releases.OrderByDescending(release => release.PublishedDate).Take(3);
+
+ // Build the release notes in Markdown format
+ var releaseNotesHtmlBuilder = new StringBuilder(string.Empty);
+ foreach (var release in latestReleases)
+ {
+ releaseNotesHtmlBuilder.AppendLine("# " + release.Name);
+
+ // Add unit for images: Replace with
+ var notes = ImageUnitRegex().Replace(release.ReleaseNotes, m =>
+ {
+ var prefix = m.Groups[1].Value;
+ var widthValue = m.Groups[2].Value;
+ var quote = m.Groups[3].Value;
+ var suffix = m.Groups[4].Value;
+ // Only replace if width is number like 500 without units like 500px
+ if (IsNumber(widthValue))
+ return $"{prefix}{widthValue}px{quote}{suffix}";
+ return m.Value;
+ });
+
+ releaseNotesHtmlBuilder.AppendLine(notes);
+ releaseNotesHtmlBuilder.AppendLine(" ");
+ }
+
+ return releaseNotesHtmlBuilder.ToString();
+ }
+
+ private static bool IsNumber(string input)
+ {
+ if (string.IsNullOrEmpty(input))
+ return false;
+
+ foreach (char c in input)
+ {
+ if (!char.IsDigit(c))
+ return false;
+ }
+ return true;
+ }
+
+ private sealed class GitHubReleaseInfo
+ {
+ [JsonPropertyName("published_at")]
+ public DateTimeOffset PublishedDate { get; set; }
+
+ [JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [JsonPropertyName("tag_name")]
+ public string TagName { get; set; }
+
+ [JsonPropertyName("body")]
+ public string ReleaseNotes { get; set; }
+ }
+
+ [GeneratedRegex("(]*width\\s*=\\s*[\"']?)(\\d+)([\"']?)([^>]*>)", RegexOptions.IgnoreCase, "en-GB")]
+ private static partial Regex ImageUnitRegex();
+
+ #endregion
+ }
+}
From 7117ba05ee4ef544f4bc0c7c648fa3e5f8c25971 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 23:08:41 +0800
Subject: [PATCH 1297/1798] Test release notes window
---
Flow.Launcher/MainWindow.xaml.cs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index a77d6471c..b266d3dc0 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -132,6 +132,9 @@ namespace Flow.Launcher
welcomeWindow.Show();
}
+ var releaseNotesWindow = new ReleaseNotesWindow();
+ releaseNotesWindow.Show();
+
// Initialize place holder
SetupPlaceholderText();
_viewModel.PlaceholderText = _settings.PlaceholderText;
From c241d21a4a9259a3ce1eb50f21b0624c6780cba0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 23:51:26 +0800
Subject: [PATCH 1298/1798] Fix height
---
Flow.Launcher/ReleaseNotesWindow.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml b/Flow.Launcher/ReleaseNotesWindow.xaml
index 132de63c8..e61986aea 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml
@@ -157,7 +157,7 @@
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="5"
- MaxHeight="510"
+ Height="510"
Margin="15 0 20 0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
From af0e1180a5cbc18cba3090f10595e58ab12e7ac6 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 23:52:34 +0800
Subject: [PATCH 1299/1798] Use loaded event & Add style
---
Flow.Launcher/ReleaseNotesWindow.xaml | 3 ++-
Flow.Launcher/ReleaseNotesWindow.xaml.cs | 17 ++++++++++++++---
2 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml b/Flow.Launcher/ReleaseNotesWindow.xaml
index e61986aea..7b2e5f7e7 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml
@@ -161,7 +161,8 @@
Margin="15 0 20 0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
- ClickAction="SafetyDisplayWithRelativePath" />
+ ClickAction="SafetyDisplayWithRelativePath"
+ Loaded="MarkdownViewer_Loaded" />
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
index 18c67ac5b..4f0c1a9ce 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml.cs
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
@@ -9,6 +9,7 @@ using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using Flow.Launcher.Infrastructure.Http;
+using MdXaml;
namespace Flow.Launcher
{
@@ -21,11 +22,9 @@ namespace Flow.Launcher
#region Window Events
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
- private async void Window_Loaded(object sender, RoutedEventArgs e)
+ private void Window_Loaded(object sender, RoutedEventArgs e)
{
RefreshMaximizeRestoreButton();
- MarkdownViewer.Markdown = await GetReleaseNotesMarkdownAsync();
}
private void OnCloseExecuted(object sender, ExecutedRoutedEventArgs e)
@@ -82,6 +81,11 @@ namespace Flow.Launcher
private static async Task GetReleaseNotesMarkdownAsync()
{
var releaseNotesJSON = await Http.GetStringAsync("https://api.github.com/repos/Flow-Launcher/Flow.Launcher/releases");
+
+ if (string.IsNullOrEmpty(releaseNotesJSON))
+ {
+ return string.Empty;
+ }
var releases = JsonSerializer.Deserialize>(releaseNotesJSON);
// Get the latest releases
@@ -145,5 +149,12 @@ namespace Flow.Launcher
private static partial Regex ImageUnitRegex();
#endregion
+
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
+ private async void MarkdownViewer_Loaded(object sender, RoutedEventArgs e)
+ {
+ MarkdownViewer.MarkdownStyle = MarkdownStyle.GithubLike;
+ MarkdownViewer.Markdown = await GetReleaseNotesMarkdownAsync();
+ }
}
}
From 02496214ea2cabbd0037bc83f3e9e03125311222 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 7 Jun 2025 00:07:44 +0800
Subject: [PATCH 1300/1798] Add progress ring
---
Flow.Launcher/ReleaseNotesWindow.xaml | 23 ++++++++++++++++
Flow.Launcher/ReleaseNotesWindow.xaml.cs | 34 +++++++++++++++++++++---
2 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml b/Flow.Launcher/ReleaseNotesWindow.xaml
index 7b2e5f7e7..f70fa6f5c 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml
@@ -163,6 +163,29 @@
VerticalAlignment="Stretch"
ClickAction="SafetyDisplayWithRelativePath"
Loaded="MarkdownViewer_Loaded" />
+
+
+
+
+
+
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
index 4f0c1a9ce..8881f3fb6 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml.cs
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
@@ -81,7 +81,7 @@ namespace Flow.Launcher
private static async Task GetReleaseNotesMarkdownAsync()
{
var releaseNotesJSON = await Http.GetStringAsync("https://api.github.com/repos/Flow-Launcher/Flow.Launcher/releases");
-
+
if (string.IsNullOrEmpty(releaseNotesJSON))
{
return string.Empty;
@@ -150,11 +150,37 @@ namespace Flow.Launcher
#endregion
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
- private async void MarkdownViewer_Loaded(object sender, RoutedEventArgs e)
+ private void MarkdownViewer_Loaded(object sender, RoutedEventArgs e)
{
MarkdownViewer.MarkdownStyle = MarkdownStyle.GithubLike;
- MarkdownViewer.Markdown = await GetReleaseNotesMarkdownAsync();
+ RefreshMarkdownViewer();
+ }
+
+ private void RefreshButton_Click(object sender, RoutedEventArgs e)
+ {
+ RefreshButton.Visibility = Visibility.Collapsed;
+ RefreshProgressRing.Visibility = Visibility.Visible;
+ RefreshMarkdownViewer();
+ }
+
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
+ private async void RefreshMarkdownViewer()
+ {
+ var output = await GetReleaseNotesMarkdownAsync().ConfigureAwait(false);
+
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ RefreshProgressRing.Visibility = Visibility.Collapsed;
+ if (string.IsNullOrEmpty(output))
+ {
+ RefreshButton.Visibility = Visibility.Visible;
+ }
+ else
+ {
+ RefreshButton.Visibility = Visibility.Collapsed;
+ MarkdownViewer.Markdown = output;
+ }
+ });
}
}
}
From 1ef8d65dce3011f6902019d25ed32df6fb9de313 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 7 Jun 2025 00:07:52 +0800
Subject: [PATCH 1301/1798] Adjust size
---
Flow.Launcher/ReleaseNotesWindow.xaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml b/Flow.Launcher/ReleaseNotesWindow.xaml
index f70fa6f5c..3df1a3c00 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml
@@ -173,8 +173,8 @@
Margin="15 0 20 0">
From 1f61d934f81ed5aaf796e08c666c32469da052ac Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 7 Jun 2025 00:12:54 +0800
Subject: [PATCH 1302/1798] Follow theme change
---
Flow.Launcher/ReleaseNotesWindow.xaml | 1 +
Flow.Launcher/ReleaseNotesWindow.xaml.cs | 25 ++++++++++++++++++++++++
2 files changed, 26 insertions(+)
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml b/Flow.Launcher/ReleaseNotesWindow.xaml
index 3df1a3c00..b274981a3 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml
@@ -11,6 +11,7 @@
Title="{DynamicResource releaseNotes}"
Width="700"
Background="{DynamicResource PopuBGColor}"
+ Closed="Window_Closed"
Foreground="{DynamicResource PopupTextColor}"
Loaded="Window_Loaded"
ResizeMode="CanResize"
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
index 8881f3fb6..bf034c74f 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml.cs
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
@@ -8,6 +8,7 @@ using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
+using System.Windows.Media;
using Flow.Launcher.Infrastructure.Http;
using MdXaml;
@@ -18,6 +19,7 @@ namespace Flow.Launcher
public ReleaseNotesWindow()
{
InitializeComponent();
+ ModernWpf.ThemeManager.Current.ActualApplicationThemeChanged += ThemeManager_ActualApplicationThemeChanged;
}
#region Window Events
@@ -25,6 +27,7 @@ namespace Flow.Launcher
private void Window_Loaded(object sender, RoutedEventArgs e)
{
RefreshMaximizeRestoreButton();
+ ThemeManager_ActualApplicationThemeChanged(null, null);
}
private void OnCloseExecuted(object sender, ExecutedRoutedEventArgs e)
@@ -182,5 +185,27 @@ namespace Flow.Launcher
}
});
}
+
+ private void Window_Closed(object sender, EventArgs e)
+ {
+ ModernWpf.ThemeManager.Current.ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged;
+ }
+
+ private void ThemeManager_ActualApplicationThemeChanged(ModernWpf.ThemeManager sender, object args)
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ if (ModernWpf.ThemeManager.Current.ActualApplicationTheme == ModernWpf.ApplicationTheme.Light)
+ {
+ MarkdownViewer.Foreground = Brushes.Black;
+ MarkdownViewer.Background = Brushes.White;
+ }
+ else
+ {
+ MarkdownViewer.Foreground = Brushes.White;
+ MarkdownViewer.Background = Brushes.Black;
+ }
+ });
+ }
}
}
From 394fd1d44c06446d94eca4e6a684a8bf9c6391d1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 7 Jun 2025 10:13:45 +0800
Subject: [PATCH 1303/1798] Support light/dark style
---
Flow.Launcher/ReleaseNotesWindow.xaml.cs | 4 +-
.../Resources/CustomControlTemplate.xaml | 399 ++++++++++++++++--
2 files changed, 369 insertions(+), 34 deletions(-)
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
index bf034c74f..c5130254a 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml.cs
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
@@ -10,7 +10,6 @@ using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using Flow.Launcher.Infrastructure.Http;
-using MdXaml;
namespace Flow.Launcher
{
@@ -155,7 +154,6 @@ namespace Flow.Launcher
private void MarkdownViewer_Loaded(object sender, RoutedEventArgs e)
{
- MarkdownViewer.MarkdownStyle = MarkdownStyle.GithubLike;
RefreshMarkdownViewer();
}
@@ -197,11 +195,13 @@ namespace Flow.Launcher
{
if (ModernWpf.ThemeManager.Current.ActualApplicationTheme == ModernWpf.ApplicationTheme.Light)
{
+ MarkdownViewer.MarkdownStyle = (Style)Application.Current.Resources["DocumentStyleGithubLikeLight"];
MarkdownViewer.Foreground = Brushes.Black;
MarkdownViewer.Background = Brushes.White;
}
else
{
+ MarkdownViewer.MarkdownStyle = (Style)Application.Current.Resources["DocumentStyleGithubLikeDark"];
MarkdownViewer.Foreground = Brushes.White;
MarkdownViewer.Background = Brushes.Black;
}
diff --git a/Flow.Launcher/Resources/CustomControlTemplate.xaml b/Flow.Launcher/Resources/CustomControlTemplate.xaml
index cdaadd45a..6fd964867 100644
--- a/Flow.Launcher/Resources/CustomControlTemplate.xaml
+++ b/Flow.Launcher/Resources/CustomControlTemplate.xaml
@@ -2408,12 +2408,15 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 84e91d2bdc37b7f2e5746e961e0a16816618e1b3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 7 Jun 2025 10:14:37 +0800
Subject: [PATCH 1304/1798] Fix display issue
---
Flow.Launcher/ReleaseNotesWindow.xaml.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
index c5130254a..e7e766f60 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml.cs
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
@@ -113,7 +113,7 @@ namespace Flow.Launcher
});
releaseNotesHtmlBuilder.AppendLine(notes);
- releaseNotesHtmlBuilder.AppendLine(" ");
+ releaseNotesHtmlBuilder.AppendLine();
}
return releaseNotesHtmlBuilder.ToString();
From eee57e29d047074525f118df5b73456c84f5cfb3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 7 Jun 2025 10:34:26 +0800
Subject: [PATCH 1305/1798] Improve code quality
---
Flow.Launcher/ReleaseNotesWindow.xaml.cs | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
index e7e766f60..95cb76675 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml.cs
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
@@ -34,6 +34,11 @@ namespace Flow.Launcher
Close();
}
+ private void Window_Closed(object sender, EventArgs e)
+ {
+ ModernWpf.ThemeManager.Current.ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged;
+ }
+
#endregion
#region Window Custom TitleBar
@@ -99,7 +104,9 @@ namespace Flow.Launcher
{
releaseNotesHtmlBuilder.AppendLine("# " + release.Name);
- // Add unit for images: Replace with
+ // Because MdXaml.Html package cannot correctly render images without units,
+ // We need to manually add unit for images
+ // E.g. Replace with
var notes = ImageUnitRegex().Replace(release.ReleaseNotes, m =>
{
var prefix = m.Groups[1].Value;
@@ -184,11 +191,6 @@ namespace Flow.Launcher
});
}
- private void Window_Closed(object sender, EventArgs e)
- {
- ModernWpf.ThemeManager.Current.ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged;
- }
-
private void ThemeManager_ActualApplicationThemeChanged(ModernWpf.ThemeManager sender, object args)
{
Application.Current.Dispatcher.Invoke(() =>
From 458a8b3efb13c008d0d7ef3c0fced60dd39975b4 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 7 Jun 2025 11:11:40 +0800
Subject: [PATCH 1306/1798] Add mdxaml plugins
---
Flow.Launcher/Flow.Launcher.csproj | 4 ++++
Flow.Launcher/ReleaseNotesWindow.xaml | 3 ++-
Flow.Launcher/Resources/CustomControlTemplate.xaml | 10 ++++++++++
3 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 4580798b2..d75d15a21 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -91,6 +91,10 @@
+
+
+
+
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml b/Flow.Launcher/ReleaseNotesWindow.xaml
index b274981a3..2cd47c619 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml
@@ -163,7 +163,8 @@
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
ClickAction="SafetyDisplayWithRelativePath"
- Loaded="MarkdownViewer_Loaded" />
+ Loaded="MarkdownViewer_Loaded"
+ Plugins="{StaticResource MdXamlPlugins}" />
@@ -5761,6 +5765,12 @@
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -118,14 +117,14 @@
x:Name="btnCancel"
Width="145"
Height="30"
- Margin="10 0 5 0"
+ Margin="10 0 10 0"
Click="BtnCancel_OnClick"
Content="{DynamicResource cancel}" />
diff --git a/Flow.Launcher/ActionKeywords.xaml.cs b/Flow.Launcher/ActionKeywords.xaml.cs
index 9420b4c38..8e05686c9 100644
--- a/Flow.Launcher/ActionKeywords.xaml.cs
+++ b/Flow.Launcher/ActionKeywords.xaml.cs
@@ -20,7 +20,9 @@ namespace Flow.Launcher
private void ActionKeyword_OnLoaded(object sender, RoutedEventArgs e)
{
- tbOldActionKeyword.Text = string.Join(Query.ActionKeywordSeparator, _plugin.Metadata.ActionKeywords.ToArray());
+ tbOldActionKeyword.Text = string.Join(Query.ActionKeywordSeparator, _plugin.Metadata.ActionKeywords);
+ tbAction.Text = tbOldActionKeyword.Text;
+ tbAction.SelectAll();
tbAction.Focus();
}
@@ -33,38 +35,39 @@ namespace Flow.Launcher
{
var oldActionKeywords = _plugin.Metadata.ActionKeywords;
- var newActionKeywords = tbAction.Text.Split(Query.ActionKeywordSeparator).ToList();
- newActionKeywords.RemoveAll(string.IsNullOrEmpty);
- newActionKeywords = newActionKeywords.Distinct().ToList();
+ var newActionKeywords = tbAction.Text.Split(Query.ActionKeywordSeparator)
+ .Where(s => !string.IsNullOrEmpty(s))
+ .Distinct()
+ .ToList();
newActionKeywords = newActionKeywords.Count > 0 ? newActionKeywords : new() { Query.GlobalPluginWildcardSign };
var addedActionKeywords = newActionKeywords.Except(oldActionKeywords).ToList();
var removedActionKeywords = oldActionKeywords.Except(newActionKeywords).ToList();
- if (!addedActionKeywords.Any(App.API.ActionKeywordAssigned))
+
+ if (addedActionKeywords.Any(App.API.ActionKeywordAssigned))
{
- if (oldActionKeywords.Count != newActionKeywords.Count)
- {
- ReplaceActionKeyword(_plugin.Metadata.ID, removedActionKeywords, addedActionKeywords);
- return;
- }
+ App.API.ShowMsgBox(App.API.GetTranslation("newActionKeywordsHasBeenAssigned"));
+ return;
+ }
- var sortedOldActionKeywords = oldActionKeywords.OrderBy(s => s).ToList();
- var sortedNewActionKeywords = newActionKeywords.OrderBy(s => s).ToList();
+ if (oldActionKeywords.Count != newActionKeywords.Count)
+ {
+ ReplaceActionKeyword(_plugin.Metadata.ID, removedActionKeywords, addedActionKeywords);
+ return;
+ }
- if (sortedOldActionKeywords.SequenceEqual(sortedNewActionKeywords))
- {
- // User just changes the sequence of action keywords
- App.API.ShowMsgBox(App.API.GetTranslation("newActionKeywordsSameAsOld"));
- }
- else
- {
- ReplaceActionKeyword(_plugin.Metadata.ID, removedActionKeywords, addedActionKeywords);
- }
+ var sortedOldActionKeywords = oldActionKeywords.OrderBy(s => s).ToList();
+ var sortedNewActionKeywords = newActionKeywords.OrderBy(s => s).ToList();
+
+ if (sortedOldActionKeywords.SequenceEqual(sortedNewActionKeywords))
+ {
+ // User just changes the sequence of action keywords
+ App.API.ShowMsgBox(App.API.GetTranslation("newActionKeywordsSameAsOld"));
}
else
{
- App.API.ShowMsgBox(App.API.GetTranslation("newActionKeywordsHasBeenAssigned"));
+ ReplaceActionKeyword(_plugin.Metadata.ID, removedActionKeywords, addedActionKeywords);
}
}
From 393c861660edf2a40bfba8b12ac0f39013bf5e2b Mon Sep 17 00:00:00 2001
From: DB P
Date: Wed, 11 Jun 2025 15:26:15 +0900
Subject: [PATCH 1357/1798] Adjust Margin
---
Flow.Launcher/ActionKeywords.xaml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher/ActionKeywords.xaml b/Flow.Launcher/ActionKeywords.xaml
index 8636eb4c2..7fed8a629 100644
--- a/Flow.Launcher/ActionKeywords.xaml
+++ b/Flow.Launcher/ActionKeywords.xaml
@@ -66,7 +66,7 @@
Grid.Row="2"
Grid.Column="0"
Grid.ColumnSpan="2"
- Margin="26 0 26 18"
+ Margin="26 0 26 10"
FontSize="14"
Text="{DynamicResource actionkeyword_tips}"
TextAlignment="Left"
@@ -83,7 +83,7 @@
x:Name="tbOldActionKeyword"
Grid.Row="3"
Grid.Column="1"
- Margin="10 10 26 10"
+ Margin="10 10 26 6"
VerticalAlignment="Center"
FontSize="14"
FontWeight="SemiBold"
@@ -94,7 +94,7 @@
@@ -102,12 +102,12 @@
x:Name="tbAction"
Grid.Row="4"
Grid.Column="1"
- Margin="10 10 26 10"
+ Margin="10 6 26 10"
VerticalAlignment="Center" />
Date: Wed, 11 Jun 2025 15:27:55 +0900
Subject: [PATCH 1358/1798] Adjust Button Size
---
Flow.Launcher/ActionKeywords.xaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/ActionKeywords.xaml b/Flow.Launcher/ActionKeywords.xaml
index 7fed8a629..dfea00f8f 100644
--- a/Flow.Launcher/ActionKeywords.xaml
+++ b/Flow.Launcher/ActionKeywords.xaml
@@ -116,14 +116,14 @@
From 8e740c8e3a3cf0db30d8f579b957459dfc1d977b Mon Sep 17 00:00:00 2001
From: Stefan Roelofs
Date: Wed, 11 Jun 2025 08:44:21 +0200
Subject: [PATCH 1359/1798] Automatic refactor by XamlStyler extension
---
Flow.Launcher/ActionKeywords.xaml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/ActionKeywords.xaml b/Flow.Launcher/ActionKeywords.xaml
index dfea00f8f..5af76f37f 100644
--- a/Flow.Launcher/ActionKeywords.xaml
+++ b/Flow.Launcher/ActionKeywords.xaml
@@ -107,8 +107,9 @@
From 0f94ec673a36fa0eb0884b7e68bba3c4593e2192 Mon Sep 17 00:00:00 2001
From: DB P
Date: Wed, 11 Jun 2025 15:54:38 +0900
Subject: [PATCH 1360/1798] Skip release notes notification for developer
builds
---
Flow.Launcher/MainWindow.xaml.cs | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index e527ab57b..f4d7ad8eb 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -137,12 +137,11 @@ namespace Flow.Launcher
welcomeWindow.Show();
}
- if (_settings.ReleaseNotesVersion != Constant.Version)
+ if (Constant.Version != "1.0.0" && _settings.ReleaseNotesVersion != Constant.Version) // Skip release notes notification for developer builds (version 1.0.0)
{
// Update release notes version
_settings.ReleaseNotesVersion = Constant.Version;
-
- // Display message box with button
+ // Show release note popup with button
App.API.ShowMsgWithButton(
string.Format(App.API.GetTranslation("appUpdateTitle"), Constant.Version),
App.API.GetTranslation("appUpdateButtonContent"),
From 3220a0b8f3db3c46771a960960b24eb35aa8f0fa Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Wed, 11 Jun 2025 21:10:56 +1000
Subject: [PATCH 1361/1798] remove on tag deployment & change NuGet publish to
on master push
---
appveyor.yml | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/appveyor.yml b/appveyor.yml
index fa0b5956b..8fba05252 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -62,7 +62,7 @@ deploy:
api_key:
secure: sCSd5JWgdzJWDa9kpqECut5ACPKZqcoxKU8ERKC00k7VIjig3/+nFV5zzTcGb0w3
on:
- APPVEYOR_REPO_TAG: true
+ branch: master
- provider: GitHub
repository: Flow-Launcher/Prereleases
@@ -84,12 +84,3 @@ deploy:
force_update: true
on:
branch: master
-
- - provider: GitHub
- release: v$(flowVersion)
- auth_token:
- secure: ij4UeXUYQBDJxn2YRAAhUOjklOGVKDB87Hn5J8tKIzj13yatoI7sLM666QDQFEgv
- artifact: Squirrel Installer, Portable Version, Squirrel nupkg, Squirrel RELEASES
- force_update: true
- on:
- APPVEYOR_REPO_TAG: true
From 6f516ee1207bc153281503e0e053e7815fee79da Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 11 Jun 2025 21:14:05 +0800
Subject: [PATCH 1362/1798] Change code comments
---
.../FirefoxBookmarkLoader.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index dcf7763c3..f214997c3 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -343,9 +343,9 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
Locked=1
[Profile2]
- Name=newblahprofile
+ Name=dummyprofile
IsRelative=0
- Path=C:\t6h2yuq8.newblahprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code.
+ Path=C:\t6h2yuq8.dummyprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code.
[Profile1]
Name=default
From b166b18ab73c2cc15e574d5a375efcd406a8ef4b Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 12 Jun 2025 14:25:10 +0800
Subject: [PATCH 1363/1798] Add preview information back for external preview
---
Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
index a16d0c5f3..e87d2df97 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
@@ -101,6 +101,10 @@ namespace Flow.Launcher.Plugin.Explorer.Search
AutoCompleteText = GetAutoCompleteText(title, query, path, ResultType.Folder),
TitleHighlightData = Context.API.FuzzySearch(query.Search, title).MatchData,
CopyText = path,
+ Preview = new Result.PreviewInfo
+ {
+ FilePath = path,
+ },
PreviewPanel = new Lazy(() => new PreviewPanel(Settings, path, ResultType.Folder)),
Action = c =>
{
From b6cca4547cf87733a1adb3c60edd8c86856a69cb Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 12 Jun 2025 16:27:48 +0800
Subject: [PATCH 1364/1798] Fix typos
---
.../FirefoxBookmarkLoader.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index f214997c3..8dffeecdc 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -365,21 +365,21 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
// Seen in the example above, the IsRelative attribute is always above the Path attribute
var relativePath = Path.Combine(defaultProfileFolderName, "places.sqlite");
- var absoluePath = Path.Combine(profileFolderPath, relativePath);
+ var absolutePath = Path.Combine(profileFolderPath, relativePath);
// If the index is out of range, it means that the default profile is in a custom location or the file is malformed
// If the profile is in a custom location, we need to check
if (indexOfDefaultProfileAttributePath - 1 < 0 ||
indexOfDefaultProfileAttributePath - 1 >= lines.Count)
{
- return Directory.Exists(absoluePath) ? absoluePath : relativePath;
+ return Directory.Exists(absolutePath) ? absolutePath : relativePath;
}
var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
// See above, the profile is located in a custom location, path is not relative, so IsRelative=0
return (relativeAttribute == "0" || relativeAttribute == "IsRelative=0")
- ? relativePath : absoluePath;
+ ? relativePath : absolutePath;
}
}
From a34a4790b70e269d6ef0bbca7fece75f6f03741b Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Fri, 13 Jun 2025 00:21:49 +0800
Subject: [PATCH 1365/1798] Delete
Flow.Launcher/Properties/Resources.fr-FR.resx
---
Flow.Launcher/Properties/Resources.fr-FR.resx | 130 ------------------
1 file changed, 130 deletions(-)
delete mode 100644 Flow.Launcher/Properties/Resources.fr-FR.resx
diff --git a/Flow.Launcher/Properties/Resources.fr-FR.resx b/Flow.Launcher/Properties/Resources.fr-FR.resx
deleted file mode 100644
index ca0f66f53..000000000
--- a/Flow.Launcher/Properties/Resources.fr-FR.resx
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\dev.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
\ No newline at end of file
From cce8d1ac23e5b3a57476e9f447b1c0b2bdcbfb88 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Fri, 13 Jun 2025 00:24:40 +0800
Subject: [PATCH 1366/1798] Delete
Flow.Launcher/Properties/Resources.he-IL.resx
---
Flow.Launcher/Properties/Resources.he-IL.resx | 130 ------------------
1 file changed, 130 deletions(-)
delete mode 100644 Flow.Launcher/Properties/Resources.he-IL.resx
diff --git a/Flow.Launcher/Properties/Resources.he-IL.resx b/Flow.Launcher/Properties/Resources.he-IL.resx
deleted file mode 100644
index ca0f66f53..000000000
--- a/Flow.Launcher/Properties/Resources.he-IL.resx
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\dev.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
\ No newline at end of file
From eb7a89292b2d61126ede55baf1affb3340bb28fa Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Fri, 13 Jun 2025 22:02:34 +1000
Subject: [PATCH 1367/1798] update OpenUrl method summary
---
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index b87cc52d0..09c402bcf 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -319,13 +319,15 @@ namespace Flow.Launcher.Plugin
public void OpenWebUrl(string url, bool? inPrivate = null);
///
- /// Opens the URL with the given Uri object.
+ /// Opens the URL with the given Uri object in browser if scheme is Http or Https.
+ /// If the URL is a local file, it will instead be opened with the default application for that file type.
/// The browser and mode used is based on what's configured in Flow's default browser settings.
///
public void OpenUrl(Uri url, bool? inPrivate = null);
///
- /// Opens the URL with the given string.
+ /// Opens the URL with the given string in browser if scheme is Http or Https.
+ /// If the URL is a local file, it will instead be opened with the default application for that file type.
/// The browser and mode used is based on what's configured in Flow's default browser settings.
/// Non-C# plugins should use this method.
///
From a77c80f7c140ab76e764a6d70e2924f46297bd84 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Fri, 13 Jun 2025 22:37:36 +1000
Subject: [PATCH 1368/1798] New Crowdin updates (#3615)
---
Flow.Launcher/Languages/ar.xaml | 10 ++++
Flow.Launcher/Languages/cs.xaml | 10 ++++
Flow.Launcher/Languages/da.xaml | 12 +++-
Flow.Launcher/Languages/de.xaml | 10 ++++
Flow.Launcher/Languages/es-419.xaml | 10 ++++
Flow.Launcher/Languages/es.xaml | 12 +++-
Flow.Launcher/Languages/fr.xaml | 12 +++-
Flow.Launcher/Languages/he.xaml | 10 ++++
Flow.Launcher/Languages/it.xaml | 10 ++++
Flow.Launcher/Languages/ja.xaml | 10 ++++
Flow.Launcher/Languages/ko.xaml | 10 ++++
Flow.Launcher/Languages/nb.xaml | 10 ++++
Flow.Launcher/Languages/nl.xaml | 10 ++++
Flow.Launcher/Languages/pl.xaml | 10 ++++
Flow.Launcher/Languages/pt-br.xaml | 10 ++++
Flow.Launcher/Languages/pt-pt.xaml | 14 ++++-
Flow.Launcher/Languages/ru.xaml | 10 ++++
Flow.Launcher/Languages/sk.xaml | 14 ++++-
Flow.Launcher/Languages/sr.xaml | 10 ++++
Flow.Launcher/Languages/tr.xaml | 60 +++++++++++--------
Flow.Launcher/Languages/uk-UA.xaml | 10 ++++
Flow.Launcher/Languages/vi.xaml | 10 ++++
Flow.Launcher/Languages/zh-cn.xaml | 12 +++-
Flow.Launcher/Languages/zh-tw.xaml | 10 ++++
.../Languages/ar.xaml | 2 +
.../Languages/cs.xaml | 2 +
.../Languages/da.xaml | 2 +
.../Languages/de.xaml | 2 +
.../Languages/es-419.xaml | 2 +
.../Languages/es.xaml | 2 +
.../Languages/fr.xaml | 2 +
.../Languages/he.xaml | 2 +
.../Languages/it.xaml | 2 +
.../Languages/ja.xaml | 2 +
.../Languages/ko.xaml | 2 +
.../Languages/nb.xaml | 2 +
.../Languages/nl.xaml | 2 +
.../Languages/pl.xaml | 2 +
.../Languages/pt-br.xaml | 2 +
.../Languages/pt-pt.xaml | 2 +
.../Languages/ru.xaml | 2 +
.../Languages/sk.xaml | 2 +
.../Languages/sr.xaml | 2 +
.../Languages/tr.xaml | 2 +
.../Languages/uk-UA.xaml | 2 +
.../Languages/vi.xaml | 2 +
.../Languages/zh-cn.xaml | 2 +
.../Languages/zh-tw.xaml | 2 +
.../Languages/ar.xaml | 11 ++++
.../Languages/cs.xaml | 11 ++++
.../Languages/da.xaml | 11 ++++
.../Languages/de.xaml | 11 ++++
.../Languages/es-419.xaml | 11 ++++
.../Languages/es.xaml | 11 ++++
.../Languages/fr.xaml | 11 ++++
.../Languages/he.xaml | 11 ++++
.../Languages/it.xaml | 11 ++++
.../Languages/ja.xaml | 11 ++++
.../Languages/ko.xaml | 11 ++++
.../Languages/nb.xaml | 11 ++++
.../Languages/nl.xaml | 11 ++++
.../Languages/pl.xaml | 11 ++++
.../Languages/pt-br.xaml | 11 ++++
.../Languages/pt-pt.xaml | 13 +++-
.../Languages/ru.xaml | 11 ++++
.../Languages/sk.xaml | 11 ++++
.../Languages/sr.xaml | 11 ++++
.../Languages/tr.xaml | 23 +++++--
.../Languages/uk-UA.xaml | 11 ++++
.../Languages/vi.xaml | 11 ++++
.../Languages/zh-cn.xaml | 11 ++++
.../Languages/zh-tw.xaml | 11 ++++
.../Languages/tr.xaml | 10 ++--
.../Languages/tr.xaml | 24 ++++----
.../Languages/tr.xaml | 8 +--
.../Properties/Resources.pt-PT.resx | 6 +-
76 files changed, 616 insertions(+), 64 deletions(-)
diff --git a/Flow.Launcher/Languages/ar.xaml b/Flow.Launcher/Languages/ar.xaml
index 88e8fbc61..b0d4b6818 100644
--- a/Flow.Launcher/Languages/ar.xaml
+++ b/Flow.Launcher/Languages/ar.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsالبحث عن إضافة
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
اختر مدير الملفاتLearn more
@@ -480,6 +489,7 @@
خطأAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowيرجى الانتظار...
diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml
index 552f1a36d..254298f80 100644
--- a/Flow.Launcher/Languages/cs.xaml
+++ b/Flow.Launcher/Languages/cs.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsVyhledat plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Vybrat správce souborůLearn more
@@ -480,6 +489,7 @@ Pokud před zkratku při zadávání přidáte znak "@", bude odpovíd
ChybaAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPočkejte prosím...
diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml
index 7fd6d478a..567532865 100644
--- a/Flow.Launcher/Languages/da.xaml
+++ b/Flow.Launcher/Languages/da.xaml
@@ -94,7 +94,7 @@
VælgSkjul Flow Launcher ved opstartFlow Launcher search window is hidden in the tray after starting up.
- Hide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Query Search PrecisionChanges minimum match score required for results.
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Select File ManagerLearn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPlease wait...
diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml
index 3c650920f..940881129 100644
--- a/Flow.Launcher/Languages/de.xaml
+++ b/Flow.Launcher/Languages/de.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsPlug-in suchen
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Dateimanager auswählenMehr erfahren
@@ -480,6 +489,7 @@ Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt die
FehlerAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowBitte warten Sie ...
diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml
index 5bd77a8dd..40fa76c3d 100644
--- a/Flow.Launcher/Languages/es-419.xaml
+++ b/Flow.Launcher/Languages/es-419.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Seleccionar Gestor de ArchivosLearn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPor favor espere...
diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml
index 7324fc01b..1a8b22303 100644
--- a/Flow.Launcher/Languages/es.xaml
+++ b/Flow.Launcher/Languages/es.xaml
@@ -136,6 +136,8 @@
Mostrar historial de resultados en la página de inicioNúmero máximo de resultados del historial en la página de inicioEsto solo se puede editar si el complemento soporta la función de Inicio y la Página de Inicio está activada.
+ Show Search Window at Topmost
+ Show search window above other windowsBuscar complemento
@@ -364,12 +366,19 @@
Ubicación de datos del usuarioLa 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
+ AvanzadoNivel de registroDepurarInformaciónConfiguración de fuente de la ventana
+
+ Ver más notas de la versión en GitHub
+ No se pudo obtener las notas de la versión
+ Por favor, compruebe su conexión de red o asegúrese de que GitHub es accesible
+ Flow Launcher ha sido actualizado a {0}
+ Haga clic aquí para ver las notas de la versión
+
Seleccionar administrador de archivosMás información
@@ -480,6 +489,7 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci
ErrorSe ha producido un error al abrir la carpeta. {0}
+ Se ha producido un error al abrir la URL en el navegador. Por favor, compruebe la configuración de su navegador web predeterminado en la sección General de la ventana de configuraciónPor favor espere...
diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml
index 95ad58d6e..e70e75a26 100644
--- a/Flow.Launcher/Languages/fr.xaml
+++ b/Flow.Launcher/Languages/fr.xaml
@@ -136,6 +136,8 @@
Afficher les résultats de l'historique sur la page d'accueilMaximum de résultats de l'historique affichés sur la page d'accueilCeci ne peut être édité que si le plugin prend en charge la fonction Accueil et que la page d'accueil est activée.
+ Afficher la fenêtre de recherche en premier plan
+ Afficher la fenêtre de recherche au-dessus des autres fenêtresRechercher des plugins
@@ -369,6 +371,13 @@
InfoRéglage de la police de la fenêtre
+
+ Voir plus de notes de version sur GitHub
+ Impossible de récupérer les notes de version
+ Veuillez vérifier votre connexion réseau ou vous assurer que GitHub est accessible
+ Flow Launcher a été mis à jour à {0}
+ Cliquez ici pour voir les notes de version
+
Sélectionner le gestionnaire de fichiersEn savoir plus
@@ -388,7 +397,7 @@
NavigateurNom du navigateurChemin du navigateur
- Nouvel onglet
+ Nouvelle fenêtreNouvel ongletMode privé
@@ -479,6 +488,7 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu
ErreurUne erreur s'est produite lors de l'ouverture du dossier. {0}
+ Une erreur s'est produite lors de l'ouverture de l'URL dans le navigateur. Veuillez vérifier la configuration de votre navigateur Web par défaut dans la section "Général" de la fenêtre des paramètresVeuillez patienter...
diff --git a/Flow.Launcher/Languages/he.xaml b/Flow.Launcher/Languages/he.xaml
index d1688b647..23f4b7541 100644
--- a/Flow.Launcher/Languages/he.xaml
+++ b/Flow.Launcher/Languages/he.xaml
@@ -135,6 +135,8 @@
Show History Results in Home PageMaximum History Results Shown in Home Pageניתן לערוך זאת רק אם התוסף תומך בתכונת הבית ודף הבית מופעל.
+ Show Search Window at Topmost
+ Show search window above other windowsחפש תוסף
@@ -369,6 +371,13 @@
מידעSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
בחר מנהל קבציםלמד עוד
@@ -479,6 +488,7 @@
שגיאהאירעה שגיאה בעת פתיחת התיקייה. {0}
+ אירעה שגיאה בעת פתיחת כתובת ה-URL בדפדפן. אנא בדוק את תצורת דפדפן האינטרנט המוגדר כברירת מחדל שלך במקטע הכללי של חלון ההגדרותאנא המתן...
diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml
index 64d9f5abe..f41d960f1 100644
--- a/Flow.Launcher/Languages/it.xaml
+++ b/Flow.Launcher/Languages/it.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsPlugin di ricerca
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Seleziona Gestore FileLearn more
@@ -480,6 +489,7 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowAttendere prego...
diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml
index c2e64ae26..6c1b364f3 100644
--- a/Flow.Launcher/Languages/ja.xaml
+++ b/Flow.Launcher/Languages/ja.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
デフォルトのファイルマネージャーLearn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPlease wait...
diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml
index b78c86a82..1b1eaf4fa 100644
--- a/Flow.Launcher/Languages/ko.xaml
+++ b/Flow.Launcher/Languages/ko.xaml
@@ -127,6 +127,8 @@
히스토리를 홈페이지에 표시홈페이지에 표시할 최대 히스토리 수This can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windows플러그인 검색
@@ -361,6 +363,13 @@
Info설정창 글꼴
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
파일관리자 선택더 알아보기
@@ -471,6 +480,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window잠시 기다려주세요...
diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml
index 9e62ec2cc..07dc84c36 100644
--- a/Flow.Launcher/Languages/nb.xaml
+++ b/Flow.Launcher/Languages/nb.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSøk etter programtillegg
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Velg filbehandlerLearn more
@@ -480,6 +489,7 @@ Hvis du legger til et @-prefiks mens du legger inn en snarvei, samsvarer det med
FeilAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowVennligst vent...
diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml
index 31e6ea768..c74c95010 100644
--- a/Flow.Launcher/Languages/nl.xaml
+++ b/Flow.Launcher/Languages/nl.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsPlug-ins zoeken
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Bestandsbeheerder selecterenLearn more
@@ -480,6 +489,7 @@ Als u een '@' voorvoegsel toevoegt tijdens het invoeren van een snelkoppeling, m
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPlease wait...
diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml
index f32a38585..e9ac041f8 100644
--- a/Flow.Launcher/Languages/pl.xaml
+++ b/Flow.Launcher/Languages/pl.xaml
@@ -136,6 +136,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSzukaj wtyczek
@@ -370,6 +372,13 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
InfoUstawienia czcionki okna
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Wybierz menedżer plikówLearn more
@@ -480,6 +489,7 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d
BłądAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowProszę czekać...
diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml
index bcbfa74af..3e83c1924 100644
--- a/Flow.Launcher/Languages/pt-br.xaml
+++ b/Flow.Launcher/Languages/pt-br.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsBuscar Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Selecione o Gerenciador de ArquivosLearn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPor favor, aguarde...
diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml
index 4eca2c5c6..1bb97f764 100644
--- a/Flow.Launcher/Languages/pt-pt.xaml
+++ b/Flow.Launcher/Languages/pt-pt.xaml
@@ -135,6 +135,8 @@
Mostrar histórico na página inicialMáximo de resultados a mostrar na Página inicialEsta opção apenas pode ser editada se o plugin tiver suporte a Página inicial e se estiver ativo.
+ Janela de pesquisa por cima
+ Mostrar caixa de pesquisa por cima das outras janelasPesquisar plugins
@@ -366,7 +368,14 @@
Nível de registoDepuraçãoInformação
- Setting Window Font
+ Tipo de letra da aplicação
+
+
+ Mostrar notas da versão no GitHub
+ Falha ao obter notas da versão
+ Verifique a sua ligação de rede e confirme se consegue aceder a GitHub
+ Flow Launcher foi atualizado para {0}
+ Clique aqui para ver as notas desta versãoSelecione o gestor de ficheiros
@@ -400,7 +409,7 @@
Palavra-chave atualNova palavra-chaveCancelar
- Feito
+ OKPlugin não encontradoA nova palavra-chave não pode estar vaziaEsta palavra-chave já está associada a um plugin. Por favor escolha outra.
@@ -478,6 +487,7 @@ Se adicionar o prefixo '@' durante a introdução do atalho, será utilizada qua
ErroOcorreu um erro ao abrir a pasta: {0}
+ Ocorreu um erro ao abrir o URL no navegador. Verifique a configuração Navegador web padrão na secção Geral das definições.Por favor aguarde...
diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml
index 3a63a4ea4..d52afae1f 100644
--- a/Flow.Launcher/Languages/ru.xaml
+++ b/Flow.Launcher/Languages/ru.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsПоиск плагина
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Выбор менеджера файловLearn more
@@ -480,6 +489,7 @@
ОшибкаAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowПожалуйста, подождите...
diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml
index 3c47d61fd..7aa6ecc65 100644
--- a/Flow.Launcher/Languages/sk.xaml
+++ b/Flow.Launcher/Languages/sk.xaml
@@ -134,8 +134,10 @@
Domovská stránkaZobraziť výsledky Domovskej stránky, keď je text dopytu prázdny.Zobraziť výsledky histórie na Domovskej stránke
- Maximálny počet histórie výsledkov zobrazenej na Domovskej stránke
+ Maximálny počet zobrazených výsledkov histórie na Domovskej stránkeÚprava je možná len vtedy, ak plugin podporuje funkciu Domovská stránka a Domovská stránka je povolená.
+ Zobraziť vyhľadávacie okno navrchu
+ Zobraziť okno vyhľadávania nad ostatnými oknamiVyhľadať plugin
@@ -242,7 +244,7 @@
Typ pozadia (backdrop)Efekt pozadia sa v náhľade nezobrazuje.Pozadie je podporované od Windows 11 zostava 22000 a novších
- Žiadna
+ ŽiadnyAcrylicMicaMica Alt
@@ -370,6 +372,13 @@
InfoNastavenie písma okna
+
+ Ďalšie poznámky k vydaniu na Githube
+ Nepodarilo sa načítať poznámky k vydaniu
+ Skontrolujte sieťové pripojenie alebo sa uistite, že je Github dostupný
+ Flow Launcher bol aktualizovaný na {0}
+ Na zobrazenie poznámok k vydaniu kliknite sem
+
Vyberte správcu súborovViac informácií
@@ -480,6 +489,7 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s
ChybaPočas otvárania priečinka sa vyskytla chyba. {0}
+ Pri otváraní adresy URL v prehliadači došlo k chybe. Skontrolujte konfiguráciu predvoleného webového prehliadača v nastaveniach VšeobecnéČakajte, prosím...
diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml
index 43f316a38..ae7aa7af2 100644
--- a/Flow.Launcher/Languages/sr.xaml
+++ b/Flow.Launcher/Languages/sr.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Select File ManagerLearn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPlease wait...
diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml
index 2f4e4d302..5c118be01 100644
--- a/Flow.Launcher/Languages/tr.xaml
+++ b/Flow.Launcher/Languages/tr.xaml
@@ -106,10 +106,10 @@
ÖnizlemeÖnizleme panelini her zaman aç. Önizlemeyi bu ayardan bağımsız {0} kısayolu ile açıp kapatabilirsiniz.Mevcut temada bulanıklık efekti etkinken gölgelendirme efektine izin verilmez
- Search Delay
+ Arama GecikmesiAdds 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
+ Varsayılan Arama Gecikme SüresiWait time before showing results after typing stops. Higher values wait longer. (ms)Information for Korean IME user
@@ -131,11 +131,13 @@
AçUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
- Home Page
+ Ana SayfaShow home page results when query text is empty.Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsEklenti Ara
@@ -154,11 +156,11 @@
Anahtar kelimeyi değiştirPlugin search delay timeChange Plugin Search Delay Time
- Advanced Settings:
+ Gelişmiş Ayarlar:Enabled
- Priority
- Search Delay
- Home Page
+ Öncelik
+ Arama Gecikmesi
+ Ana SayfaMevcut öncelikYeni ÖncelikÖncelik
@@ -239,12 +241,12 @@
ÖzelSaatTarih
- Backdrop Type
+ Arka Plan TürüThe backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveHiçbiri
- Acrylic
- Mica
+ Akrilik
+ MikaMica AltThis theme supports two (light/dark) modes.This theme supports Blur Transparent Background.
@@ -252,7 +254,7 @@
Display placeholder when query is emptyPlaceholder textChange placeholder text. Input empty will use: {0}
- Fixed Window Size
+ Sabit Pencere BoyutuThe window size is not adjustable by dragging.
@@ -356,23 +358,30 @@
Günlük KlasörüGünlükleri TemizleTüm günlük kayıtlarını silmek istediğinize emin misiniz?
- Cache Folder
- Clear Caches
+ Önbellek Klasörü
+ Önbelleği TemizleAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more informationKurulum SihirbazıKullanıcı Verisi DiziniKullanı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
+ Gelişmiş
+ Günlük Düzeyi
+ Hata ayıklama
+ BilgiSetting Window Font
+
+ See more release notes on GitHub
+ Sürüm notları alınamadı
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Sürüm notlarını görüntülemek için buraya tıklayın
+
Dosya Yöneticisi Seçenekleri
- Learn more
+ Daha fazla bilgiPlease 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
@@ -409,7 +418,7 @@
This new Action Keyword is the same as old, please choose a different oneBaşarılıBaşarıyla tamamlandı
- Failed to copy
+ Kopyalanamadı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.
@@ -417,7 +426,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
+ Ana SayfaEnable the plugin home page state if you like to show the plugin results when query is empty.
@@ -448,8 +457,8 @@
SıfırlaSilGüncelle
- Yes
- No
+ Evet
+ HayırArka plan
@@ -472,12 +481,13 @@
2. Copy below exception message
- File Manager Error
+ Dosya Yöneticisi Hatası
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}
+ Hata
+ Klasör açılırken bir hata oluştu. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowLütfen bekleyin...
diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml
index a7dfcda55..a8ee67653 100644
--- a/Flow.Launcher/Languages/uk-UA.xaml
+++ b/Flow.Launcher/Languages/uk-UA.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsПлагін для пошуку
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Виберіть файловий менеджерLearn more
@@ -480,6 +489,7 @@
ПомилкаAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowБудь ласка, зачекайте...
diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml
index b77c6d4e8..a2875f3c0 100644
--- a/Flow.Launcher/Languages/vi.xaml
+++ b/Flow.Launcher/Languages/vi.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsPlugin tìm kiếm
@@ -372,6 +374,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Chọn trình quản lý tệpLearn more
@@ -484,6 +493,7 @@
LỗiAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowCảnh báo nhỏ...
diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml
index 95a97d5ed..698eee1e3 100644
--- a/Flow.Launcher/Languages/zh-cn.xaml
+++ b/Flow.Launcher/Languages/zh-cn.xaml
@@ -136,6 +136,8 @@
在主页中显示历史记录在主页显示的最大历史结果数这只能在插件支持主页功能和主页启用时进行编辑。
+ Show Search Window at Topmost
+ Show search window above other windows搜索插件
@@ -239,7 +241,7 @@
自定义时钟日期
- 返回类型
+ 背景类型预览中没有应用背景效果。自 Windows 11 Build 22000 起支持背景效果无
@@ -370,6 +372,13 @@
信息设置窗口字体
+
+ 在 GitHub 上查看更多版本说明
+ 无法获取版本说明
+ 请检查您的网络连接或确认 GitHub 可访问
+ Flow Launcher 已更新到 {0}
+ 单击此处查看版本说明
+
默认文件管理器了解更多
@@ -480,6 +489,7 @@
错误打开文件夹时发生错误。{0}
+ 打开浏览器中的 URL 时发生错误。请在设置窗口的常规部分检查您的默认网页浏览器配置请稍等...
diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml
index 60531c6aa..0f6ad3f5b 100644
--- a/Flow.Launcher/Languages/zh-tw.xaml
+++ b/Flow.Launcher/Languages/zh-tw.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
選擇檔案管理器Learn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window請稍後...
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ar.xaml
index bde48c7d4..29b0d4ed1 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ar.xaml
@@ -25,4 +25,6 @@
محرك المتصفحإذا كنت لا تستخدم Chrome أو Firefox أو Edge، أو كنت تستخدم نسختهم المحمولة، ستحتاج إلى إضافة دليل بيانات الإشارات المرجعية وتحديد محرك المتصفح الصحيح لجعل هذه الإضافة تعمل.على سبيل المثال: محرك Brave هو Chromium؛ وموقع بيانات الإشارات المرجعية الافتراضي هو: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". بالنسبة لمحرك Firefox، دليل الإشارات المرجعية هو مجلد userdata الذي يحتوي على ملف places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml
index 7511b96f3..45f8d97da 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml
@@ -25,4 +25,6 @@
Jádro webového prohlížečePokud nepoužíváte prohlížeč Chrome, Firefox nebo Edge nebo používáte přenosnou verzi prohlížeče Chrome, Firefox nebo Edge, musíte přidat složku záložek a vybrat správné jádro prohlížeče, aby tento doplněk fungoval.Například: prohlížeč Brave má jádro Chromium; výchozí umístění pro data záložek je: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". V případě jádra Firefox je složkou záložek složka userdata, která obsahuje soubor places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml
index 49c087484..153b05d76 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml
@@ -25,4 +25,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml
index 4d1ad4bf1..4a764bbfa 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml
@@ -26,4 +26,6 @@
Wenn Sie nicht Chrome, Firefox oder Edge verwenden oder deren portable Version nutzen, müssen Sie das Lesezeichen-Datenverzeichnis hinzufügen und die richtige Browser-Engine auswählen, damit dieses Plug-in funktioniert.Zum Beispiel: Die Engine von Brave ist Chromium, und deren Standardspeicherort der Lesezeichen-Daten ist:
%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Bei der Firefox-Engine ist das Lesezeichenverzeichnis der Ordner userdata, der die Datei places.sqlite enthält.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml
index 0f7a95571..28524229b 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml
@@ -25,4 +25,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
index db87ee281..ba9efd7e0 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
@@ -25,4 +25,6 @@
Motor del navegadorSi no está utilizando Chrome, Firefox o Edge, o si está utilizando su versión portable, debe añadir el directorio de datos de los marcadores y seleccionar el motor del navegador correcto para que este complemento funcione.Por ejemplo: El motor de Brave es Chromium; y la ubicación por defecto de los datos de los marcadores es: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para el motor de Firefox, el directorio de los marcadores es la carpeta de datos del usuario que contiene el archivo places.sqlite.
+ Cargar favicons (puede llevar mucho tiempo durante el arranque)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml
index ea0092601..39546c102 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml
@@ -25,4 +25,6 @@
NavigateurSi vous n'utilisez pas Chrome, Firefox ou Edge, ou que vous utilisez leur version portable, vous devez ajouter un dossier de favoris et sélectionner le bon navigateur pour que ce plugin fonctionne.Par exemple : le moteur de Brave est Chromium ; et son emplacement par défaut des favoris est : "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Pour le moteur Firefox, le dossier des favoris est le dossier userdata contenant le fichier places.sqlite.
+ Charger les favicons (peut prendre du temps au démarrage)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml
index e524f1172..79490928d 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml
@@ -25,4 +25,6 @@
מנוע דפדפןאם אינך משתמש ב-Chrome, Firefox או Edge, או שאתה משתמש בגרסה הניידת שלהם, עליך להוסיף את ספריית נתוני הסימניות ולבחור את מנוע הדפדפן המתאים כדי שהתוסף יעבוד.לדוגמה: המנוע של Brave הוא Chromium, ומיקום ברירת המחדל של נתוני הסימניות שלו הוא: %LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData. עבור מנוע Firefox, ספריית הסימניות היא תיקיית המשתמש שמכילה את הקובץ places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
index 0491ba973..eb13bf852 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
@@ -25,4 +25,6 @@
Motore di NavigazioneSe non si utilizza Chrome, Firefox o Edge, o si utilizza la loro versione portatile, è necessario aggiungere la cartella dei segnalibri e selezionare il motore di navigazione corretto per far funzionare questo plugin.Per esempio: il motore di Brave è Chromium, e la sua posizione predefinita dei segnalibri è: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Per il motore di Firefox, la directory dei segnalibri è la cartella dei dati utente che contiene il file places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
index e553a1b7e..d08d67d98 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
@@ -25,4 +25,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
index a374e7fc1..bb7c9fc06 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
@@ -25,4 +25,6 @@
브라우저 엔진크롬, 파이어폭스 또는 엣지를 사용하지 않거나 이들의 포터블 버전을 사용하고 있다면, 이 플러그인을 작동시키기 위해 북마크 데이터 디렉토리를 추가하고 올바른 브라우저 엔진을 선택해야 합니다.예를 들어: Brave의 엔진은 Chromium이며, 기본 북마크 데이터 위치는 "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData"입니다. Firefox 엔진의 경우, 북마크 위치는 places.sqlite 파일이 포함된 userdata 폴더입니다.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml
index 273dad465..1c53a49d2 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml
@@ -25,4 +25,6 @@
NettlesermotorHvis du ikke bruker Chrome, Firefox eller Edge, eller hvis du bruker den bærbare versjonen, må du legge til bokmerkedatakatalog og velge riktig nettlesermotor for å få dette programtillegget til å fungere.For eksempel: Brave's motor er Chromium; og standardplasseringen av bokmerker er: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox-motoren er bokmerkekatalogen brukerdatamappen som inneholder places.sqlite-filen.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml
index 319606d22..407786cdd 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml
@@ -25,4 +25,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml
index f487874ac..2dff7543f 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml
@@ -25,4 +25,6 @@
Silnik przeglądarkiJeśli nie używasz Chrome, Firefox lub Edge, lub używasz ich wersji przenośnej, musisz dodać katalog danych zakładek i wybrać poprawny silnik przeglądarki, aby wtyczka działała.Na przykład: silnikiem przeglądarki Brave jest Chromium, a domyślna lokalizacja danych zakładek to: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". W przypadku silnika Firefoksa, katalog zakładek to folder danych użytkownika zawierający plik places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
index d8bb949fd..ce264bc5f 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
@@ -25,4 +25,6 @@
Motor do NavegadorSe você não estiver usando o Chrome, Firefox ou Edge, ou se estiver usando suas versões portáteis, você precisa adicionar o diretório de dados dos favoritos e selecionar a ferramenta de busca correta para fazer este plugin funcionar.Por exemplo: O motor do Brave é o Chromium; e seu diretório padrão de favoritos é "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para o motor do Firefox, o diretório de favoritos é a pasta do usuário que contém o arquivo "places.sqlite".
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
index 06af5ea5b..2818a0600 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
@@ -25,4 +25,6 @@
Motor do navegadorSe não estiver a usar o Chrome, Firefox ou Edge ou se estiver a usar a versão portátil, tem que adicionar o diretório de dados dos marcadores e selecionar o motor do navegador para que este plugin funcione.Por exemplo: o motor do Brave é Chromium e a localização padrão dos marcadores é "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para o navegador Firefox, o diretório de marcadores é a pasta de utilizador que contém o ficheiro places.sqlite.
+ Carregar "favicons" (pode atrasar o carregamento da aplicação)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml
index 2ebb286a4..bb8639d97 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml
@@ -25,4 +25,6 @@
Движок браузераЕсли вы не используете Chrome, Firefox или Edge, или используете их портативную версию, вам необходимо добавить каталог данных закладок и выбрать правильный движок браузера, чтобы этот плагин работал.Например: Движок Brave - Chromium; и его местоположение данных закладок по умолчанию: «%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData». Для движка Firefox каталог закладок находится в папке userdata и содержит файл places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
index 3c1ce9d22..c7556e877 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
@@ -25,4 +25,6 @@
Jadro prehliadačaAk nepoužívate prehliadač Chrome, Firefox alebo Edge alebo používate ich prenosnú verziu, musíte pridať priečinok s údajmi o záložkách a vybrať správne jadro prehliadača, aby tento plugin fungoval.Napríklad: Prehliadač Brave má jadro Chromium; predvolené umiestnenie údajov o záložkách je: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Pre jadro Firefoxu je priečinkom záložiek priečinok userdata, ktorý obsahuje súbor places.sqlite.
+ Načítať favicony (môže trvať dlhšie počas spúšťania)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml
index be113c8cf..84173e616 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml
@@ -25,4 +25,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
index 76ab14111..8c4280f63 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
@@ -25,4 +25,6 @@
Tarayıcı MotoruEğer Chrome, Firefox veya Edge kullanmıyor veya bu tarayıcıların taşınabilir sürümlerini kullanıyorsanız tarayıcı motorunu ve yer imlerinin saklandığı dizini elle girmeniz gerekir.Örneğin: Brave tarayıcısı Chromium tabanlıdır ve yer imleri varsayılan olarak "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData" klasöründe saklanır. Firefox tabanlı tarayıcılar için bu places.sqlite dosyasının bulunduğu kullanıcı verisi klasörüdür.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
index 93b20366e..b8fd4fb83 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
@@ -25,4 +25,6 @@
Браузерний рушійЯкщо ви не використовуєте Chrome, Firefox або Edge, або використовуєте їхні портативні версії, вам потрібно додати каталог даних закладок і вибрати правильний рушій браузера, щоб цей плагін працював.Наприклад: Рушій Brave - Chromium, і за замовчуванням розташування даних закладок: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Для браузера Firefox директорія закладок - це папка userdata, що містить файл places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml
index ddc10950e..662c87d49 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml
@@ -25,4 +25,6 @@
Công cụ trình duyệtNếu bạn không sử dụng Chrome, Firefox hoặc Edge hoặc bạn đang sử dụng phiên bản di động của chúng, bạn cần thêm thư mục dữ liệu dấu trang và chọn đúng công cụ trình duyệt để plugin này hoạt động.Ví dụ: Engine của Brave là Chrome; và vị trí dữ liệu dấu trang mặc định của nó là: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Đối với công cụ Firefox, thư mục dấu trang là thư mục dữ liệu người dùng chứa tệp địa điểm.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
index 7b628702d..934544367 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
@@ -25,4 +25,6 @@
浏览器引擎如果你没有使用 Chrome、 Firefox 或 Edge,或者正在使用它们的绿色版, 那么你需要添加书签数据目录并选择正确的浏览器引擎才能使此插件正常工作。例如:Brave 浏览器的引擎是 Chromium;其默认书签数据位置是 "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData"。 对于 Firefox 引擎的浏览器,书签目录是 places.sqlite 文件所在的用户数据文件夹。
+ 载入收藏夹图标 (启动时可能十分耗时)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml
index 8b21bd58d..7fa50a089 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml
@@ -25,4 +25,6 @@
瀏覽器引擎如果你沒有使用 Chrome、Firefox 或 Edge,或者使用它們的便攜版,你需要新增書籤資料位置並選擇正確的瀏覽器引擎,才能讓這個擴充功能正常運作。例如:Brave 瀏覽器的引擎是 Chromium;而它的預設書籤資料位置是「%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData」。對於 Firefox 瀏覽器引擎,書籤資料位置是包含 places.sqlite 檔案的 userdata 資料夾。
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
index 28f8557c2..d327dcebb 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
@@ -3,6 +3,8 @@
يرجى إجراء تحديد أولاً
+ Please select a folder path.
+ Please choose a different name or folder path.يرجى تحديد رابط المجلدهل أنت متأكد أنك تريد حذف {0}؟هل أنت متأكد أنك تريد حذف هذا الملف نهائيًا؟
@@ -25,6 +27,7 @@
إضافةإعدادات عامةتخصيص الكلمات المفتاحية للإجراءات
+ Customise Quick Accessروابط الوصول السريعإعدادات Everythingلوحة المعاينة
@@ -41,6 +44,7 @@
مسار الشلمسارات مستبعدة من البحث المفهرساستخدام موقع نتيجة البحث كدليل العمل للتنفيذ
+ Display more information like size and age in tooltipsاضغط Enter لفتح المجلد في مدير الملفات الافتراضياستخدام البحث المفهرس للبحث في المسارخيارات الفهرسة
@@ -77,6 +81,9 @@
Ctrl + Enter لفتح الدليلCtrl + Enter لفتح المجلد الحاوي
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}نسخ المسار
@@ -90,6 +97,7 @@
حذف الملف الحالي نهائيًاحذف المجلد الحالي نهائيًاالمسار:
+ Name:حذف المحددتشغيل كمستخدم مختلفتشغيل العنصر المحدد باستخدام حساب مستخدم مختلف
@@ -160,6 +168,9 @@
هل ترغب في تمكين البحث في المحتوى لـ Everything؟قد يكون بطيئًا جدًا بدون فهرسة (المدعومة فقط في Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
قائمة السياق الأصليةعرض قائمة السياق الأصلية (تجريبي)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
index 86f0d1170..80e181a8f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
@@ -3,6 +3,8 @@
Nejprve vyberte položku
+ Please select a folder path.
+ Please choose a different name or folder path.Vyberte odkaz na složkuOpravdu chcete odstranit {0}?Opravdu chcete trvale odstranit tento soubor?
@@ -25,6 +27,7 @@
PřidatVšeobecné nastaveníUpravit aktivační příkaz
+ Customise Quick AccessOdkazy rychlého přístupuNastavení EverythingPreview Panel
@@ -41,6 +44,7 @@
Cesta k příkazovému řádkuVyloučená místa indexováníPoužít umístění výsledků vyhledávání jako pracovní adresář spustitelného souboru
+ Display more information like size and age in tooltipsKlepnutím na Enter otevřete složku ve výchozím správci souborůK vyhledání cesty použijte indexové vyhledáváníMožnosti indexování
@@ -77,6 +81,9 @@
Ctrl + Enter pro otevření adresářeCtrl + Enter pro otevření umístění složky
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Neznámý
+ {0}{3}Space free: {1}{3}Total size: {2}Kopírovat cestu
@@ -90,6 +97,7 @@
Trvale odstranit aktuální souborTrvale smazat aktuální složkuCesta:
+ Name:Odstranit vybranýSpustit jako jiný uživatelSpustí vybranou položku jako uživatel s jiným účtem
@@ -160,6 +168,9 @@
Chcete povolit vyhledávání obsahu prostřednictvím služby Everything?Bez indexu (který je podporován pouze ve verzi Everything v1.5+) může být velmi pomalý
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
index 003db91d1..7cbe281d8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
TilføjGeneral SettingCustomise Action Keywords
+ Customise Quick AccessQuick Access LinksEverything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUse search result's location as the working directory of the executable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy path
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderPath:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
index d183d44dd..10700a0ee 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
@@ -3,6 +3,8 @@
Bitte treffen Sie zuerst eine Auswahl
+ Please select a folder path.
+ Please choose a different name or folder path.Bitte wählen Sie einen Ordner-Link ausSind Sie sicher, dass Sie {0} löschen wollen?Sind Sie sicher, dass Sie diese Datei dauerhaft löschen möchten?
@@ -25,6 +27,7 @@
HinzufügenAllgemeine EinstellungAktions-Schlüsselwörter individuell anpassen
+ Customise Quick AccessSchnellzugriff-LinksEveryhting-EinstellungVorschau-Panel
@@ -41,6 +44,7 @@
Shell-PfadIndexsuche ausgeschlossene PfadeOrt des Suchergebnisses als Arbeitsverzeichnis der ausführbaren Datei verwenden
+ Display more information like size and age in tooltipsDrücken Sie Enter, um Ordner im Default-Dateimanager zu öffnenIndexsuche für Pfadsuche verwendenIndexierungsoptionen
@@ -77,6 +81,9 @@
Strg+Enter, um das Verzeichnis zu öffnenStrg+Enter, um den enthaltenden Ordner zu öffnen
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unbekannt
+ {0}{3}Space free: {1}{3}Total size: {2}Pfad kopieren
@@ -90,6 +97,7 @@
Aktuelle Datei dauerhaft löschenAktuellen Ordner dauerhaft löschenPfad:
+ Name:Ausgewähltes löschenAls anderer Benutzer ausführenAusgewähltes unter Verwendung eines anderen Benutzerkontos ausführen
@@ -160,6 +168,9 @@
Möchten Sie die Inhaltssuche für Everything aktivieren?Es kann sehr langsam sein ohne Index (was nur in Everything v1.5+ unterstützt wird)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Natives KontextmenüNatives Kontextmenü anzeigen (experimentell)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
index 7f5fb043b..4e372adbe 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
@@ -3,6 +3,8 @@
Por favor, seleccione primero
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
AñadirGeneral SettingCustomise Action Keywords
+ Customise Quick AccessQuick Access LinksEverything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUsar la ubicación de los resultados de búsqueda como directorio de trabajo ejecutable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy path
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderPath:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
index 33fe8eba8..4f5977fa1 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
@@ -3,6 +3,8 @@
Por favor haga una selección primero
+ Por favor, seleccione una ruta de carpeta.
+ Por favor, elija un nombre o ruta de carpeta diferente.Por favor, seleccione un enlace de carpeta¿Está seguro de que desea eliminar {0}?¿Está seguro de que desea eliminar permanentemente este archivo?
@@ -25,6 +27,7 @@
AñadirConfiguración generalPersonalizar palabras clave de acción
+ Personalizar Acceso RápidoEnlaces de acceso rápidoConfiguración EverythingPanel de vista previa
@@ -41,6 +44,7 @@
Ruta del ShellRutas excluídas del índice de búsquedaUsar la ubicación de los resultados de búsqueda como directorio de trabajo del ejecutable
+ Mostrar más información, como tamaño y antigüedad, en los consejos (tooltips)Pulsar Entrar para abrir la carpeta en el administrador de archivos predeterminadoUsar búsqueda indexada para buscar rutasOpciones de indexación
@@ -77,6 +81,9 @@
Ctrl + Entrar para abrir el directorioCtrl + Entrar para abrir la carpeta contenedora
+ {0}{4}Tamaño: {1}{4}Fecha de creación: {2}{4}Fecha de modificación: {3}
+ Desconocido
+ {0}{3}Espacio libre: {1}{3}Tamaño total: {2}Copiar ruta
@@ -90,6 +97,7 @@
Elimina permanentemente el archivo actualElimina permanentemente la carpeta actualRuta:
+ Nombre:Elimina el seleccionadoEjecutar como usuario diferenteEjecuta la selección usando una cuenta de usuario diferente
@@ -160,6 +168,9 @@
¿Desea activar la búsqueda de contenidos de Everything?Puede ser muy lento sin índice (solo se admite en Everything v1.5+)
+ No se puede encontrar Everything.exe
+ No se ha podido instalar Everything, por favor, instálelo manualmente
+
Menú contextual nativoMostrar menú contextual nativo (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
index ab5e0d381..726fbe7d7 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
@@ -3,6 +3,8 @@
Veuillez d'abord effectuer une sélection
+ Veuillez sélectionner un chemin d'accès au dossier.
+ Veuillez choisir un nom ou un chemin d'accès différent.Veuillez sélectionner un lien vers un dossierÊtes-vous sûr de vouloir supprimer {0} ?Êtes-vous sûr de vouloir supprimer définitivement ce fichier ?
@@ -25,6 +27,7 @@
AjouterParamètres générauxPersonnaliser les mots-clés d'action
+ Personnaliser l'accès rapideLiens d'accès rapideParamètres EverythingPanneau d'aperçu
@@ -41,6 +44,7 @@
Chemin d'accès au ShellChemins exclus de la recherche d'indexUtiliser l'emplacement du résultat de la recherche comme répertoire de travail de l'exécutable
+ Afficher plus d'informations comme la taille et l'âge dans les infobullesAppuyez sur Entrée pour ouvrir le dossier dans le gestionnaire de fichiers par défautUtiliser la recherche d'index pour la recherche de chemin d'accèsOptions d'indexation
@@ -77,6 +81,9 @@
Ctrl + Entrée pour ouvrir le répertoireCtrl + Entrée pour ouvrir le dossier contenant
+ {0}{4} Taille : {1}{4}Date de création : {2}{4}Date de modification : {3}
+ Inconnu
+ {0}{3}Espace libre : {1}{3}Taille totale : {2}Copier le chemin
@@ -90,6 +97,7 @@
Supprimer définitivement le fichier actuelSupprimer définitivement le dossier actuelChemin :
+ Nom :Supprimer la sélectionExécuter en tant qu'utilisateur différentExécuter le programme sélectionné en utilisant un autre compte d'utilisateur
@@ -160,6 +168,9 @@
Voulez-vous activer la recherche de contenu pour Everything ?Il peut être très lent sans index (qui n'est supporté que dans Everything v1.5+).
+ Impossible de trouver Everything.exe
+ Impossible d'installer Everything, veuillez l'installer manuellement
+
Menu contextuel natifAfficher le menu contextuel natif (expérimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml
index 7c1003c2b..6e955848d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml
@@ -3,6 +3,8 @@
אנא בצע בחירה תחילה
+ אנא בחר נתיב לתיקייה.
+ אנא בחר שם או נתיב תיקייה אחר.אנא בחר קישור לתיקייההאם אתה בטוח שברצונך למחוק את {0}?האם אתה בטוח שברצונך למחוק קובץ זה לצמיתות?
@@ -25,6 +27,7 @@
הוסףהגדרות כלליותהתאמת מילות פעולה
+ התאמה אישית של גישה מהירהקישורי גישה מהירההגדרות Everythingחלונית תצוגה מקדימה
@@ -41,6 +44,7 @@
נתיב Shellנתיבים שלא נכללים בחיפוש אינדקסהשתמש במיקום תוצאת החיפוש כספריית העבודה של הקובץ להפעלה
+ Display more information like size and age in tooltipsלחץ Enter כדי לפתוח את התיקייה במנהל הקבצים המוגדר כברירת מחדלהשתמש בחיפוש אינדקס עבור חיפוש נתיביםאפשרויות אינדקס
@@ -77,6 +81,9 @@
Ctrl + Enter לפתיחת התיקייהCtrl + Enter לפתיחת התיקייה המכילה
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ לא ידוע
+ {0}{3}Space free: {1}{3}Total size: {2}העתק נתיב
@@ -90,6 +97,7 @@
מחק לצמיתות את הקובץ הנוכחימחק לצמיתות את התיקייה הנוכחיתנתיב:
+ שם:מחק את הפריט שנבחרהפעל כמשתמש אחרהפעל את הפריט שנבחר באמצעות חשבון משתמש אחר
@@ -160,6 +168,9 @@
האם ברצונך לאפשר חיפוש תוכן עבור Everything?החיפוש עשוי להיות איטי מאוד ללא אינדקס (שנתמך רק ב-Everything v1.5+)
+ לא ניתן למצוא את Everything.exe
+ נכשל בהתקנת Everything, אנא התקן אותו ידנית
+
תפריט הקשר מקוריהצג תפריט הקשר מקורי (ניסיוני)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
index d05ab66db..df756e886 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
@@ -3,6 +3,8 @@
Effettua prima una selezione
+ Please select a folder path.
+ Please choose a different name or folder path.Si prega di selezionare un collegamento alla cartellaSei sicuro di voler eliminare {0}?Sei sicuro di voler eliminare definitivamente questo file?
@@ -25,6 +27,7 @@
AggiungiImpostazione GeneralePersonalizza Parola Chiave
+ Customise Quick AccessCollegamenti ad Accesso RapidoImpostazioni di EverythingPannello Anteprima
@@ -41,6 +44,7 @@
Percorso ShellPercorsi Esclusi dall'Indice di RicercaUtilizza il percorso ottenuto dalla ricerca come cartella di lavoro
+ Display more information like size and age in tooltipsPremi Invio per aprire la cartella nel gestore file predefinitoUsa Indice di Ricerca per la Ricerca PercorsoOpzioni di Indicizzazione
@@ -77,6 +81,9 @@
Ctrl + Invio per aprire la cartellaCtrl + Invio per aprire la cartella che lo contiene
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copia percorso
@@ -90,6 +97,7 @@
Elimina permanentemente il file correnteElimina definitivamente la cartella correntePercorso:
+ Name:Elimina il selezionatoEsegui come utente differenteEsegui la selezione utilizzando un altro account utente
@@ -160,6 +168,9 @@
Vuoi abilitare la ricerca di contenuti per Everything?Può essere molto lento senza indice (che è supportato solo in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Menu Contestuale NativoVisualizza il menu contestuale nativo (sperimentale)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
index a0d45be00..3d944a2b8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
追加一般設定アクションキーワードのカスタマイズ
+ Customise Quick AccessQuick Access LinksEverything Settingプレビューパネル
@@ -41,6 +44,7 @@
Shell Pathインデックス検索の除外パス検索結果の場所を実行ファイルの作業ディレクトリとして使用
+ Display more information like size and age in tooltipsEnterキーで既定のファイルマネージャーでフォルダーを開くUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}パスをコピー
@@ -90,6 +97,7 @@
現在のファイルを完全に削除現在のフォルダーを完全に削除Path:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
index 82c3ef4e8..27e4aa76a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
@@ -3,6 +3,8 @@
항목을 먼저 선택하세요
+ Please select a folder path.
+ Please choose a different name or folder path.폴더 링크를 선택하세요{0} - 삭제하시겠습니까?이 파일을 영구적으로 삭제하시겠습니까?
@@ -25,6 +27,7 @@
추가일반 설정사용자 지정 액션 키워드
+ Customise Quick Access빠른 접근 항목Everything 설정미리보기 패널
@@ -41,6 +44,7 @@
쉘 경로색인 제외 경로검색 결과위치를 실행 가능한 작업 디렉토리(Working Directory)로 사용
+ Display more information like size and age in tooltipsEnter 키를 눌렀을 때 기본 파일 관리자에서 폴더 열기Use Index Search For Path Search색인 옵션
@@ -77,6 +81,9 @@
Ctrl + Enter으로 폴더 열기Ctrl + Enter으로 포함된 폴더 열기
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}경로 복사
@@ -90,6 +97,7 @@
이 파일을 영구적으로 삭제이 폴더를 영구적으로 삭제경로:
+ Name:선택 항목을 삭제다른 유저 권한으로 실행선택한 사용자 계정으로 실행
@@ -160,6 +168,9 @@
Eveyrhing으로 내용 검색을 활성화하시겠습니까?인덱스가 없으면 매우 느릴 수 있습니다.(Everything v1.5+에서만 지원)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
index f8c0374f3..e5ef88959 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
@@ -3,6 +3,8 @@
Vennligst gjør et valg først
+ Please select a folder path.
+ Please choose a different name or folder path.Velg en mappekoblingEr du sikker på at du ønsker å slette {0}?Er du sikker på at du vil slette denne filen permanent?
@@ -25,6 +27,7 @@
Legg tilGenerell innstillingTilpass handlingsnøkkelord
+ Customise Quick AccessKoblinger for hurtigtilgangEverything-innstillingForhåndsvisningspanel
@@ -41,6 +44,7 @@
Skall-stiSøk i indekser ekskluderte banerBruk søkeresultatets plassering som arbeidskatalogen til den kjørbare filen
+ Display more information like size and age in tooltipsTrykk Enter for å åpne mappen i standard filbehandlerBruk indekssøk for banesøkAlternativer for indeksering
@@ -77,6 +81,9 @@
Ctrl + Enter for å åpne katalogenCtrl + Enter for å åpne mappen som inneholder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Ukjent
+ {0}{3}Space free: {1}{3}Total size: {2}Kopier sti
@@ -90,6 +97,7 @@
Slett gjeldende fil permanentSlett gjeldende mappe permanentSti:
+ Name:Slett valgteKjør som annen brukerKjør valgte med en annen brukerkonto
@@ -160,6 +168,9 @@
Vil du aktivere innholdssøk for Everything?Det kan være veldig tregt uten indeks (som bare støttes i Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Opprinnelig hurtigmenyVis opprinnelig hurtigmeny (eksperimentell)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
index 23fdcc214..d8178a1f3 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
ToevoegenGeneral SettingCustomise Action Keywords
+ Customise Quick AccessQuick Access LinksEverything SettingVoorbeeld Paneel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUse search result's location as the working directory of the executable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy path
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderPath:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
index 5b7afac8e..5a29fd9ab 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
@@ -3,6 +3,8 @@
Pierw dokonaj wyboru
+ Please select a folder path.
+ Please choose a different name or folder path.Musisz wybrać któryś folder z listyCzy jesteś pewien że chcesz usunąć {0}?Jesteś pewny, że chcesz usunąć ten plik trwale?
@@ -25,6 +27,7 @@
DodajUstawienia ogólneZmień słowa kluczowe akcji
+ Customise Quick AccessLinki szybkiego dostępuUstawienia EverythingPanel podglądu
@@ -41,6 +44,7 @@
Ścieżka powłokiWykluczone ścieżki indeksuUżyj lokalizacji wyników wyszukiwania jako katalogu roboczego pliku wykonywalnego
+ Display more information like size and age in tooltipsNaciśnij Enter, aby otworzyć folder w domyślnym menedżerze plikówUżyj wyszukiwania indeksowego do przeszukiwania ścieżekOpcje indeksowania
@@ -77,6 +81,9 @@
Ctrl + Enter, aby otworzyć folderCtrl + Enter, aby otworzyć folder zawierający
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Nieznane
+ {0}{3}Space free: {1}{3}Total size: {2}Skopiuj Ścieżkę
@@ -90,6 +97,7 @@
Trwale usuń bieżący plikTrwale usuń bieżący folderŚcieżka:
+ Name:Usuń zaznaczoneUruchom jako inny użytkownikUruchom wybrane używając innego konta użytkownika
@@ -160,6 +168,9 @@
Czy chcesz włączyć wyszukiwanie zawartości dla programu Everything?Może działać bardzo wolno bez indeksu (który jest obsługiwany tylko w Everything w wersji 1.5 i nowszych)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Natywne menu kontekstoweWyświetl natywne menu kontekstowe (eksperymentalne)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
index 50aba68b8..5785a5616 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
AdicionarGeneral SettingCustomise Action Keywords
+ Customise Quick AccessLinks de Acesso RápidoEverything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUse search result's location as the working directory of the executable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy path
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderCaminho:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
index 7112f118d..5db8251e2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
@@ -3,6 +3,8 @@
Tem que efetuar uma seleção
+ Selecione o caminho da pasta.
+ Por favor, escolha um nome ou caminho diferente.Selecione a ligação para a pastaTem a certeza de que deseja eliminar {0}?Tem a certeza de que pretende eliminar permanentemente este ficheiro?
@@ -25,6 +27,7 @@
AdicionarDefinições geraisPersonalizar palavras-chave
+ Personalizar acesso rápidoLigações de acesso rápidoDefinições EverythingPainel de pré-visualização
@@ -41,6 +44,7 @@
Caminho da consolaCaminhos excluídos do índice de pesquisaUtilizar localização do resultado da pesquisa como pasta de trabalho do executável
+ Mostrar mais informações nas dicas (ex.: tamanho e antiguidade)Toque Enter para abrir a pasta no gestor de ficheirosUtilizar índice de pesquisa para o caminhoOpções de indexação
@@ -50,7 +54,7 @@
Pesquisa no índice:Acesso rápido:Palavra-chave atual
- Feito
+ OKAtivoSe desativar a opção, Flow Launcher não irá executar esta opção de pesquisa e utilizará '*' para libertar a palavra-chaveEverything
@@ -77,6 +81,9 @@
Ctrl+Enter para abrir a pastaCtrl+Enter para abrir a pasta de destino
+ {0}{4}Tamanho: {1}{4}Data de criação: {2}{4}Data de modificação: {3}
+ Desconhecido
+ {0}{3}Espaço livre: {1}{3}Tamanho total: {2}Copiar caminho
@@ -90,6 +97,7 @@
Eliminar permanentemente o ficheiro atualEliminar permanentemente a pasta atualCaminho:
+ Nome:Eliminar seleçãoExecutar com outro utilizadorExecutar ações com uma conta de utilizador diferente
@@ -160,6 +168,9 @@
Deseja ativar a pesquisa de conteúdo através de Everything?Pode ser muito lento sem índice (que apenas existe em Everything v1.5+)
+ Não foi possível encontrar Everything.exe
+ Não foi possível instalar Everything. Experimente instalar manualmente.
+
Menu de contexto nativoMostrar menu de contexto nativo (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
index ae5211b73..35bd1d87d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
@@ -3,6 +3,8 @@
Сначала отметьте что-нибудь
+ Please select a folder path.
+ Please choose a different name or folder path.Пожалуйста, выберите ссылку на папкуВы уверены, что хотите удалить {0}?Вы действительно хотите безвозвратно удалить этот файл?
@@ -25,6 +27,7 @@
ДобавитьGeneral SettingCustomise Action Keywords
+ Customise Quick AccessQuick Access LinksEverything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUse search result's location as the working directory of the executable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Скопировать путь
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderПуть:
+ Name:Delete the selectedЗапустить от имени другого пользователяRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
index 0bfb3d024..1323d6ae0 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
@@ -3,6 +3,8 @@
Najprv vyberte položku
+ Vyberte cestu k priečinku.
+ Vyberte iný názov alebo cestu k priečinku.Vyberte odkaz na priečinokNaozaj chcete odstrániť {0}?Naozaj chcete natrvalo odstrániť tento súbor?
@@ -25,6 +27,7 @@
PridaťVšeobecné nastaveniaUpraviť aktivačný príkaz
+ Prispôsobenie Rýchleho prístupuOdkazy Rýchleho prístupuNastavenia EverythingPanel náhľadu
@@ -41,6 +44,7 @@
Cesta k príkazovému riadkuVylúčené umiestnenia indexovaniaPoužiť umiestnenie výsledku vyhľadávania ako pracovný priečinok spustiteľného súboru
+ Zobraziť viac informácií v popise ako veľkosť a dátumyStlačením klávesu Enter otvoriť priečinok v predvolenom správcovi súborovNa vyhľadanie cesty použiť vyhľadávanie v indexeMožnosti indexovania
@@ -77,6 +81,9 @@
Ctrl + Enter na otvorenie priečinkaCtrl + Enter na otvorenie umiestnenia priečinka
+ {0}{4}Veľkosť: {1}{4}Dátum vytvorenia: {2}{4}Dátum úpravy: {3}
+ Neznáma
+ {0}{3}Voľné miesto: {1}{3}Celková veľkosť: {2}Kopírovať cestu
@@ -90,6 +97,7 @@
Natrvalo odstrániť aktuálny súborNatrvalo odstrániť aktuálny priečinokCesta:
+ Názov:Odstrániť vybranýSpustiť ako iný používateľSpustí vybranú položku ako používateľ s iným kontom
@@ -160,6 +168,9 @@
Chcete povoliť vyhľadávanie obsahu cez Everything?Bez indexu (ktorý je podporovaný len v Everything v1.5+) to môže byť veľmi pomalé
+ Nedá sa nájsť Everything.exe
+ Nepodarilo sa nainštalovať Everything, nainštalujte ho manuálne
+
Natívna kontextová ponukaZobraziť natívnu kontextovú ponuku (experimentálne)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
index 9e1a91d0c..6af550884 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
DodajGeneral SettingCustomise Action Keywords
+ Customise Quick AccessQuick Access LinksEverything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUse search result's location as the working directory of the executable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy path
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderPath:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
index a61ff488a..44674952b 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Lütfen bir klasör bağlantısı seçin{0} bağlantısını silmek istediğinize emin misiniz?Bu dosyayı kalıcı olarak silmek istediğinizden emin misiniz?
@@ -25,6 +27,7 @@
EkleGenel AyarlarAnahtar Kelimeler
+ Customise Quick AccessQuick Access LinksEverything AyarlarıÖnizleme Paneli
@@ -41,6 +44,7 @@
Komut İstemiHariç Tutulan DizinlerProgramın çalışma klasörü olarak sonuç klasörünü kullan
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Dizini açmak içi Ctrl + EnterDosya konumunu açmak için Ctrl + Enter
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Yolu kopyala
@@ -90,6 +97,7 @@
Mevcut dosyayı kalıcı olarak silMevcut klasörü kalıcı olarak silYol:
+ Name:Seçileni silBaşka bir kullanıcı olarak çalıştırRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
@@ -167,10 +178,10 @@
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
+ Bugün
+ {0} gün önce
+ 1 ay önce
+ {0} ay önce
+ 1 yıl önce
+ {0} yıl önce
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
index 885d5dd9f..b203687e9 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
@@ -3,6 +3,8 @@
Будь ласка, спочатку зробіть вибір
+ Please select a folder path.
+ Please choose a different name or folder path.Будь ласка, оберіть посилання на текуВи впевнені, що хочете видалити {0}?Ви впевнені, що хочете назавжди видалити цей файл?
@@ -25,6 +27,7 @@
ДодатиЗагальні налаштуванняНалаштувати ключові слова дії
+ Customise Quick AccessПосилання швидкого доступуНалаштування EverythingПанель поперегляду
@@ -41,6 +44,7 @@
Шлях до оболонки ShellВиключені шляхи індексного пошукуВикористовувати розташування результату пошуку як робочу директорію виконуваного файлу
+ Display more information like size and age in tooltipsНатисніть Enter, щоб відкрити папку у файловому менеджері за замовчуваннямВикористовуйте індексний пошук для пошуку шляхуПараметри індексації
@@ -77,6 +81,9 @@
Ctrl + Enter, щоб відкрити каталогCtrl + Enter, щоб відкрити відповідну папку
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Невідомо
+ {0}{3}Space free: {1}{3}Total size: {2}Копіювати шлях
@@ -90,6 +97,7 @@
Безповоротно видалити поточний файлНазавжди видалити поточну папкуШлях:
+ Name:Видалити вибранеЗапустити від імені іншого користувачаЗапустити вибране під обліковим записом іншого користувача
@@ -160,6 +168,9 @@
Бажаєте увімкнути пошук контенту для Everything?Без індексу (який підтримується лише у версії Everything v1.5+) воно може працювати дуже повільно
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Рідне контекстне менюВідображати рідне контекстне меню (експериментально)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml
index bcc094007..f41276a67 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml
@@ -3,6 +3,8 @@
Vui lòng lựa chọn trước
+ Please select a folder path.
+ Please choose a different name or folder path.Hãy chọn một thư mục.Bạn có chắc chắn muốn xóa {0} không?Bạn có chắc là muốn xóa vĩnh viễn các ảnh này?
@@ -25,6 +27,7 @@
ThêmCài đặt chungTùy chỉnh từ khóa hành động
+ Customise Quick AccessLiên kết truy cập nhanhCài đặt mọi thứBảng xem trước
@@ -41,6 +44,7 @@
Đường dẫn ShellĐường dẫn bị loại trừ tìm kiếm chỉ mụcSử dụng vị trí của kết quả tìm kiếm làm thư mục làm việc của tệp thực thi
+ Display more information like size and age in tooltipsChạy với tư cách quản trị viên / mở thư mục trong trình quản lý tệp tiêu chuẩnSử dụng Tìm kiếm Chỉ mục để Tìm kiếm Đường dẫnTùy chọn lập chỉ mục
@@ -77,6 +81,9 @@
Ctrl + Enter để mở thư mụcCtrl + Enter để mở thư mục chứa
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy đường dẫn
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderĐường dẫn:
+ Name:Xóa đã chọnXóa lựa chọn đã chọnChạy phần đã chọn bằng tài khoản người dùng khác
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
index fc76857bd..9bce72062 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
@@ -3,6 +3,8 @@
请先进行选择
+ 请选择一个文件夹路径。
+ 请选择不同的名称或文件夹路径。请选择一个文件夹链接您确定要删除 {0} 吗?您确定要永久删除此文件吗?
@@ -25,6 +27,7 @@
添加通用设置自定义动作关键字
+ 自定义快速访问快速访问链接Everything 设置预览面板
@@ -41,6 +44,7 @@
Shell 路径索引搜索排除的路径使用搜索结果的位置作为应用程序的工作目录
+ 在提示框中显示更多信息,例如大小和年龄点击回车在默认文件管理器中打开文件夹使用索引进行路径搜索索引选项
@@ -77,6 +81,9 @@
Ctrl + Enter 以打开目录Ctrl + Enter 以打开所在的文件夹
+ {0}{4}大小:{1}{4}创建日期:{2}{4}修改日期:{3}
+ 未知
+ {0}{3}空闲空间:{1}{3}总空间:{2}复制路径
@@ -90,6 +97,7 @@
永久删除当前文件永久删除当前文件夹路径:
+ 名称:删除所选内容以其他用户身份运行使用其他用户帐户运行所选内容
@@ -160,6 +168,9 @@
您想要启用 Everything 的内容搜索功能吗?如果没有索引,它可能会非常慢(索引仅在 Everything v1.5+ 中支持)
+ 找不到 Everything.exe
+ 安装 Everything 失败,请手动安装
+
本机上下文菜单显示本机上下文菜单(实验性)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
index dc75bc3bd..931c9de29 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.請選擇一個資料夾你確認要刪除{0}嗎?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
新增General SettingCustomise Action Keywords
+ Customise Quick Access快速訪問連結Everything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded Paths使用程式所在目錄作為工作目錄
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path Search索引選項
@@ -77,6 +81,9 @@
Ctrl + Enter 以開啟該目錄。Ctrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}複製路徑
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folder路徑:
+ Name:刪除所選內容Run as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
index 616ce779b..14f2e1309 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
@@ -2,9 +2,9 @@
- Downloading plugin
+ Eklenti indiriliyorSuccessfully downloaded
- Error: Unable to download the plugin
+ Hata: Eklenti indirilemiyor{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.{0} by {1} {2}{2}Would you like to uninstall this plugin?{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
@@ -22,14 +22,14 @@
Error occurred while trying to install {0}Error uninstalling pluginNo update available
- All plugins are up to date
+ Tüm eklentiler güncel{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.{0} by {1} {2}{2}Would you like to update this plugin?Plugin UpdateThis plugin is already installedPlugin Manifest Download FailedPlease check if you can connect to github.com. This error means you may not be able to install or update plugins.
- Update all plugins
+ Tüm eklentileri güncelleWould you like to update all plugins?Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.Would you like to update {0} plugins?
@@ -47,7 +47,7 @@
Plugins ManagerManagement of installing, uninstalling or updating Flow Launcher plugins
- Unknown Author
+ Bilinmeyen YazarOpen website
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
index 126613065..e75dd0fc9 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
@@ -2,33 +2,33 @@
- Reset Default
+ Varsayılana SıfırlaSilDüzenleEkle
- Name
+ AdEtkinEnabledDisable
- Status
+ DurumEnabledDisabledKonum
- All Programs
+ Tüm ProgramlarFile TypeYeniden İndeksleİndeksleniyorIndex Sources
- Options
- UWP Apps
+ Seçenekler
+ UWP UygulamalarıWhen enabled, Flow will load UWP Applications
- Start Menu
+ Başlat MenüsüWhen enabled, Flow will load programs from the start menuRegistryWhen enabled, Flow will load programs from the registry
- PATH
+ YOLWhen enabled, Flow will load programs from the PATH environment variable
- Hide app path
+ Uygulama yolunu gizleFor executable files such as UWP or lnk, hide the file path from being visibleHide uninstallersHides programs with common uninstaller names, such as unins000.exe
@@ -60,7 +60,7 @@
Protocols can't be emptyİndekslenecek Uzantılar
- URL Protocols
+ URL ProtokolleriSteam GamesEpic GamesHttp/Https
@@ -75,8 +75,8 @@
Run As Different UserYönetici Olarak Çalıştır
- Open containing folder
- Hide
+ İçeren klasörü aç
+ GizleOpen target folderProgram
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
index aaad035a0..b37070d93 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
@@ -3,10 +3,10 @@
Search Source SettingOpen search in:
- New Window
- New Tab
+ Yeni Pencere
+ Yeni SekmeSet browser from path:
- Choose
+ SeçSilDüzenleEkle
@@ -34,7 +34,7 @@
Başlık
- Status
+ DurumSimge SeçSimgeİptal
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
index 39062bbb8..5b0a57759 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
@@ -2016,7 +2016,7 @@
Agrupar janelas semelhantes na barra de tarefas
- Alterar configurações do Windows SideShow
+ Alterar definições do Windows SideShowUsar descrição de áudio para vídeos
@@ -2176,7 +2176,7 @@
Alterar configurações avançadas de gerenciamento de cores para telas, scanners e impressoras
- Permitir que o Windows sugira Facilidade de Acesso
+ Permitir que o Windows sugira a Facilidade de acessoLimpar espaço em disco excluindo arquivos desnecessários
@@ -2332,7 +2332,7 @@
Move the pointer with the keypad using MouseKeys
- Change Windows SideShow-compatible device settings
+ Alterar definições dos dispositivos compatíveis com SideShowAdjust commonly used mobility settings
From 74d54990c913cb6ebfaf07cec97fa1128a09812b Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Fri, 13 Jun 2025 00:21:49 +0800
Subject: [PATCH 1369/1798] Delete
Flow.Launcher/Properties/Resources.fr-FR.resx
---
Flow.Launcher/Properties/Resources.fr-FR.resx | 130 ------------------
1 file changed, 130 deletions(-)
delete mode 100644 Flow.Launcher/Properties/Resources.fr-FR.resx
diff --git a/Flow.Launcher/Properties/Resources.fr-FR.resx b/Flow.Launcher/Properties/Resources.fr-FR.resx
deleted file mode 100644
index ca0f66f53..000000000
--- a/Flow.Launcher/Properties/Resources.fr-FR.resx
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\dev.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
\ No newline at end of file
From 78ffeb8cf2508c56eb40bb027ca3ce73c551fe24 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Fri, 13 Jun 2025 00:24:40 +0800
Subject: [PATCH 1370/1798] Delete
Flow.Launcher/Properties/Resources.he-IL.resx
---
Flow.Launcher/Properties/Resources.he-IL.resx | 130 ------------------
1 file changed, 130 deletions(-)
delete mode 100644 Flow.Launcher/Properties/Resources.he-IL.resx
diff --git a/Flow.Launcher/Properties/Resources.he-IL.resx b/Flow.Launcher/Properties/Resources.he-IL.resx
deleted file mode 100644
index ca0f66f53..000000000
--- a/Flow.Launcher/Properties/Resources.he-IL.resx
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\dev.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
\ No newline at end of file
From 3eb5fead1f790120729f740a97cf9959a39a417a Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Wed, 11 Jun 2025 21:10:56 +1000
Subject: [PATCH 1371/1798] remove on tag deployment & change NuGet publish to
on master push
---
appveyor.yml | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/appveyor.yml b/appveyor.yml
index fa0b5956b..8fba05252 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -62,7 +62,7 @@ deploy:
api_key:
secure: sCSd5JWgdzJWDa9kpqECut5ACPKZqcoxKU8ERKC00k7VIjig3/+nFV5zzTcGb0w3
on:
- APPVEYOR_REPO_TAG: true
+ branch: master
- provider: GitHub
repository: Flow-Launcher/Prereleases
@@ -84,12 +84,3 @@ deploy:
force_update: true
on:
branch: master
-
- - provider: GitHub
- release: v$(flowVersion)
- auth_token:
- secure: ij4UeXUYQBDJxn2YRAAhUOjklOGVKDB87Hn5J8tKIzj13yatoI7sLM666QDQFEgv
- artifact: Squirrel Installer, Portable Version, Squirrel nupkg, Squirrel RELEASES
- force_update: true
- on:
- APPVEYOR_REPO_TAG: true
From 8f43de696731c7bb535d77a96e9f843de16e20b4 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 13:12:40 +0800
Subject: [PATCH 1372/1798] Support Msix FireFox bookmarks
---
.../FirefoxBookmarkLoader.cs | 165 +++++++++++-------
1 file changed, 98 insertions(+), 67 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index acace2506..42a288e3a 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -264,84 +264,115 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
///
public override List GetBookmarks()
{
- return GetBookmarksFromPath(PlacesPath);
+ var bookmarks1 = GetBookmarksFromPath(PlacesPath);
+ var bookmarks2 = GetBookmarksFromPath(MsixPlacesPath);
+ return bookmarks1.Concat(bookmarks2).ToList();
}
///
- /// Path to places.sqlite
+ /// Path to places.sqlite of Msi installer
+ /// E.g. C:\Users\{UserName}\AppData\Roaming\Mozilla\Firefox
+ ///
///
- ///
private static string PlacesPath
{
get
{
var profileFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Mozilla\Firefox");
- var profileIni = Path.Combine(profileFolderPath, @"profiles.ini");
-
- if (!File.Exists(profileIni))
- return string.Empty;
-
- // get firefox default profile directory from profiles.ini
- using var sReader = new StreamReader(profileIni);
- var ini = sReader.ReadToEnd();
-
- var lines = ini.Split("\r\n").ToList();
-
- var defaultProfileFolderNameRaw = lines.FirstOrDefault(x => x.Contains("Default=") && x != "Default=1") ?? string.Empty;
-
- if (string.IsNullOrEmpty(defaultProfileFolderNameRaw))
- return string.Empty;
-
- var defaultProfileFolderName = defaultProfileFolderNameRaw.Split('=').Last();
-
- var indexOfDefaultProfileAttributePath = lines.IndexOf("Path=" + defaultProfileFolderName);
-
- /*
- Current profiles.ini structure example as of Firefox version 69.0.1
-
- [Install736426B0AF4A39CB]
- Default=Profiles/7789f565.default-release <== this is the default profile this plugin will get the bookmarks from. When opened Firefox will load the default profile
- Locked=1
-
- [Profile2]
- Name=newblahprofile
- IsRelative=0
- Path=C:\t6h2yuq8.newblahprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code.
-
- [Profile1]
- Name=default
- IsRelative=1
- Path=Profiles/cydum7q4.default
- Default=1
-
- [Profile0]
- Name=default-release
- IsRelative=1
- Path=Profiles/7789f565.default-release
-
- [General]
- StartWithLastProfile=1
- Version=2
- */
- // Seen in the example above, the IsRelative attribute is always above the Path attribute
-
- var relativePath = Path.Combine(defaultProfileFolderName, "places.sqlite");
- var absoluePath = Path.Combine(profileFolderPath, relativePath);
-
- // If the index is out of range, it means that the default profile is in a custom location or the file is malformed
- // If the profile is in a custom location, we need to check
- if (indexOfDefaultProfileAttributePath - 1 < 0 ||
- indexOfDefaultProfileAttributePath - 1 >= lines.Count)
- {
- return Directory.Exists(absoluePath) ? absoluePath : relativePath;
- }
-
- var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
-
- return relativeAttribute == "0" // See above, the profile is located in a custom location, path is not relative, so IsRelative=0
- ? relativePath : absoluePath;
+ return GetProfileIniPath(profileFolderPath);
}
}
+
+ ///
+ /// Path to places.sqlite of MSIX installer
+ /// E.g. C:\Users\{UserName}\AppData\Local\Packages\Mozilla.Firefox_n80bbvh6b1yt2\LocalCache\Roaming\Mozilla\Firefox
+ ///
+ ///
+ public static string MsixPlacesPath
+ {
+ get
+ {
+ var platformPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
+ var packagesPath = Path.Combine(platformPath, "Packages");
+
+ // Search for folder with Mozilla.Firefox prefix
+ var firefoxPackageFolder = Directory.EnumerateDirectories(packagesPath, "Mozilla.Firefox*",
+ SearchOption.TopDirectoryOnly).FirstOrDefault();
+
+ // Msix FireFox not installed
+ if (firefoxPackageFolder == null) return string.Empty;
+
+ var profileFolderPath = Path.Combine(firefoxPackageFolder, @"LocalCache\Roaming\Mozilla\Firefox");
+ return GetProfileIniPath(profileFolderPath);
+ }
+ }
+
+ private static string GetProfileIniPath(string profileFolderPath)
+ {
+ var profileIni = Path.Combine(profileFolderPath, @"profiles.ini");
+ if (!File.Exists(profileIni))
+ return string.Empty;
+
+ // get firefox default profile directory from profiles.ini
+ using var sReader = new StreamReader(profileIni);
+ var ini = sReader.ReadToEnd();
+
+ var lines = ini.Split("\r\n").ToList();
+
+ var defaultProfileFolderNameRaw = lines.FirstOrDefault(x => x.Contains("Default=") && x != "Default=1") ?? string.Empty;
+
+ if (string.IsNullOrEmpty(defaultProfileFolderNameRaw))
+ return string.Empty;
+
+ var defaultProfileFolderName = defaultProfileFolderNameRaw.Split('=').Last();
+
+ var indexOfDefaultProfileAttributePath = lines.IndexOf("Path=" + defaultProfileFolderName);
+
+ /*
+ Current profiles.ini structure example as of Firefox version 69.0.1
+
+ [Install736426B0AF4A39CB]
+ Default=Profiles/7789f565.default-release <== this is the default profile this plugin will get the bookmarks from. When opened Firefox will load the default profile
+ Locked=1
+
+ [Profile2]
+ Name=newblahprofile
+ IsRelative=0
+ Path=C:\t6h2yuq8.newblahprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code.
+
+ [Profile1]
+ Name=default
+ IsRelative=1
+ Path=Profiles/cydum7q4.default
+ Default=1
+
+ [Profile0]
+ Name=default-release
+ IsRelative=1
+ Path=Profiles/7789f565.default-release
+
+ [General]
+ StartWithLastProfile=1
+ Version=2
+ */
+ // Seen in the example above, the IsRelative attribute is always above the Path attribute
+
+ var relativePath = Path.Combine(defaultProfileFolderName, "places.sqlite");
+ var absoluePath = Path.Combine(profileFolderPath, relativePath);
+
+ // If the index is out of range, it means that the default profile is in a custom location or the file is malformed
+ // If the profile is in a custom location, we need to check
+ if (indexOfDefaultProfileAttributePath - 1 < 0 ||
+ indexOfDefaultProfileAttributePath - 1 >= lines.Count)
+ {
+ return Directory.Exists(absoluePath) ? absoluePath : relativePath;
+ }
+
+ var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
+
+ return relativeAttribute == "0" // See above, the profile is located in a custom location, path is not relative, so IsRelative=0
+ ? relativePath : absoluePath;
+ }
}
public static class Extensions
From 281e042ab7016621c649defcca942cf854cd6129 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 13:21:51 +0800
Subject: [PATCH 1373/1798] Fix IsRelative logic.
---
.../FirefoxBookmarkLoader.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 42a288e3a..61fd05073 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -370,7 +370,8 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
- return relativeAttribute == "0" // See above, the profile is located in a custom location, path is not relative, so IsRelative=0
+ // See above, the profile is located in a custom location, path is not relative, so IsRelative=0
+ return (relativeAttribute == "0" || relativeAttribute == "IsRelative=0")
? relativePath : absoluePath;
}
}
From ceb05e8651f847cddf9e2fa00d15a1ef741f56b4 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 6 Jun 2025 13:25:43 +0800
Subject: [PATCH 1374/1798] Add error handling for directory operation
---
.../FirefoxBookmarkLoader.cs | 22 ++++++++++++-------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 61fd05073..ac382275f 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -294,16 +294,22 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
{
var platformPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
var packagesPath = Path.Combine(platformPath, "Packages");
-
- // Search for folder with Mozilla.Firefox prefix
- var firefoxPackageFolder = Directory.EnumerateDirectories(packagesPath, "Mozilla.Firefox*",
- SearchOption.TopDirectoryOnly).FirstOrDefault();
+ try
+ {
+ // Search for folder with Mozilla.Firefox prefix
+ var firefoxPackageFolder = Directory.EnumerateDirectories(packagesPath, "Mozilla.Firefox*",
+ SearchOption.TopDirectoryOnly).FirstOrDefault();
- // Msix FireFox not installed
- if (firefoxPackageFolder == null) return string.Empty;
+ // Msix FireFox not installed
+ if (firefoxPackageFolder == null) return string.Empty;
- var profileFolderPath = Path.Combine(firefoxPackageFolder, @"LocalCache\Roaming\Mozilla\Firefox");
- return GetProfileIniPath(profileFolderPath);
+ var profileFolderPath = Path.Combine(firefoxPackageFolder, @"LocalCache\Roaming\Mozilla\Firefox");
+ return GetProfileIniPath(profileFolderPath);
+ }
+ catch
+ {
+ return string.Empty;
+ }
}
}
From aaa8e4dc780900ce721555dba06c22fb6dd3de13 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 8 Jun 2025 12:09:07 +0800
Subject: [PATCH 1375/1798] Use AddRange
---
.../FirefoxBookmarkLoader.cs | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index ac382275f..dcf7763c3 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -264,9 +264,10 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
///
public override List GetBookmarks()
{
- var bookmarks1 = GetBookmarksFromPath(PlacesPath);
- var bookmarks2 = GetBookmarksFromPath(MsixPlacesPath);
- return bookmarks1.Concat(bookmarks2).ToList();
+ var bookmarks = new List();
+ bookmarks.AddRange(GetBookmarksFromPath(PlacesPath));
+ bookmarks.AddRange(GetBookmarksFromPath(MsixPlacesPath));
+ return bookmarks;
}
///
From 44304f25d68de8dd53b9a1ac414cffbffa07f2fb Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 11 Jun 2025 21:14:05 +0800
Subject: [PATCH 1376/1798] Change code comments
---
.../FirefoxBookmarkLoader.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index dcf7763c3..f214997c3 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -343,9 +343,9 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
Locked=1
[Profile2]
- Name=newblahprofile
+ Name=dummyprofile
IsRelative=0
- Path=C:\t6h2yuq8.newblahprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code.
+ Path=C:\t6h2yuq8.dummyprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code.
[Profile1]
Name=default
From 16fd256fd61873320691acd774c87cf7df4ee8be Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 12 Jun 2025 16:27:48 +0800
Subject: [PATCH 1377/1798] Fix typos
---
.../FirefoxBookmarkLoader.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index f214997c3..8dffeecdc 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -365,21 +365,21 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase
// Seen in the example above, the IsRelative attribute is always above the Path attribute
var relativePath = Path.Combine(defaultProfileFolderName, "places.sqlite");
- var absoluePath = Path.Combine(profileFolderPath, relativePath);
+ var absolutePath = Path.Combine(profileFolderPath, relativePath);
// If the index is out of range, it means that the default profile is in a custom location or the file is malformed
// If the profile is in a custom location, we need to check
if (indexOfDefaultProfileAttributePath - 1 < 0 ||
indexOfDefaultProfileAttributePath - 1 >= lines.Count)
{
- return Directory.Exists(absoluePath) ? absoluePath : relativePath;
+ return Directory.Exists(absolutePath) ? absolutePath : relativePath;
}
var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
// See above, the profile is located in a custom location, path is not relative, so IsRelative=0
return (relativeAttribute == "0" || relativeAttribute == "IsRelative=0")
- ? relativePath : absoluePath;
+ ? relativePath : absolutePath;
}
}
From fba42fff1799f8a2c9e9e68e7ab067a17a4690a2 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Fri, 13 Jun 2025 22:31:28 +0800
Subject: [PATCH 1378/1798] Fix transaltion logic
---
.../PinyinAlphabet.cs | 46 +++++++++----------
1 file changed, 22 insertions(+), 24 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index 1637a285c..090abb490 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -32,14 +32,14 @@ namespace Flow.Launcher.Infrastructure
{
if (_settings.ShouldUsePinyin)
{
- if (!_pinyinCache.TryGetValue(content, out var value))
+ if (true)
{
return BuildCacheFromContent(content);
}
- else
- {
- return value;
- }
+ //else
+ //{
+ // return value;
+ //}
}
return (content, null);
}
@@ -164,11 +164,10 @@ namespace Flow.Launcher.Infrastructure
// Check for initials that are two characters long (zh, ch, sh)
if (fullPinyin.Length >= 2)
{
- var firstTwo = fullPinyinSpan[..2];
- var firstTwoString = firstTwo.ToString();
- if (first.ContainsKey(firstTwoString))
+ var firstTwoString = fullPinyinSpan[..2].ToString();
+ if (first.TryGetValue(firstTwoString, out var firstTwoDoublePin))
{
- doublePin.Append(firstTwoString);
+ doublePin.Append(firstTwoDoublePin);
var lastTwo = fullPinyinSpan[2..];
var lastTwoString = lastTwo.ToString();
@@ -178,27 +177,26 @@ namespace Flow.Launcher.Infrastructure
}
else
{
- doublePin.Append(lastTwo);
+ doublePin.Append(lastTwo); // Todo: original pinyin, remove this line if not needed
}
}
- }
- // Handle single-character initials
- else
- {
- doublePin.Append(fullPinyinSpan[0]);
-
- var lastOne = fullPinyinSpan[1..];
- var lastOneString = lastOne.ToString();
- if (second.TryGetValue(lastOneString, out var tmp))
- {
- doublePin.Append(tmp);
- }
else
{
- doublePin.Append(lastOne);
+ // Handle single-character initials
+ doublePin.Append(fullPinyinSpan[0]);
+
+ var lastOne = fullPinyinSpan[1..];
+ var lastOneString = lastOne.ToString();
+ if (second.TryGetValue(lastOneString, out var tmp))
+ {
+ doublePin.Append(tmp);
+ }
+ else
+ {
+ doublePin.Append(lastOne);
+ }
}
}
-
return doublePin.ToString();
}
From b31a7408d3c279e92480530fc6a8cd8167b435c2 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Fri, 13 Jun 2025 23:39:14 +0800
Subject: [PATCH 1379/1798] Simple refactor
---
Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index 090abb490..2c548e0a3 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -30,18 +30,12 @@ namespace Flow.Launcher.Infrastructure
public (string translation, TranslationMapping map) Translate(string content)
{
- if (_settings.ShouldUsePinyin)
- {
- if (true)
- {
- return BuildCacheFromContent(content);
- }
- //else
- //{
- // return value;
- //}
- }
- return (content, null);
+ if (!_settings.ShouldUsePinyin)
+ return (content, null);
+
+ return _pinyinCache.TryGetValue(content, out var value)
+ ? value
+ : BuildCacheFromContent(content);
}
private (string translation, TranslationMapping map) BuildCacheFromContent(string content)
From 818aac715e47aa0bcda35b2431dbeda4219bb88d Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 14 Jun 2025 14:32:00 +0800
Subject: [PATCH 1380/1798] Use lookup table to translate full pinyin to double
pinyin
---
.../PinyinAlphabet.cs | 166 +-
.../UserSettings/Settings.cs | 2 +
Flow.Launcher/Flow.Launcher.csproj | 3 +
Flow.Launcher/Resources/double_pinyin.json | 3746 +++++++++++++++++
4 files changed, 3805 insertions(+), 112 deletions(-)
create mode 100644 Flow.Launcher/Resources/double_pinyin.json
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index 2c548e0a3..6a2cd1e66 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -2,10 +2,13 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using System.IO;
using System.Text;
+using System.Text.Json;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure.UserSettings;
using ToolGood.Words.Pinyin;
+using Flow.Launcher.Infrastructure.Logger;
namespace Flow.Launcher.Infrastructure
{
@@ -16,9 +19,49 @@ namespace Flow.Launcher.Infrastructure
private readonly Settings _settings;
+ private ReadOnlyDictionary currentDoublePinyinTable;
+
public PinyinAlphabet()
{
_settings = Ioc.Default.GetRequiredService();
+ LoadDoublePinyinTable();
+
+ _settings.PropertyChanged += (sender, e) =>
+ {
+ if (e.PropertyName == nameof(Settings.UseDoublePinyin) ||
+ e.PropertyName == nameof(Settings.DoublePinyinSchema))
+ {
+ LoadDoublePinyinTable();
+ _pinyinCache.Clear();
+ }
+ };
+ }
+
+ private void LoadDoublePinyinTable()
+ {
+ if (_settings.UseDoublePinyin)
+ {
+ var tablePath = Path.Join(AppContext.BaseDirectory, "Resources", "double_pinyin.json");
+ try
+ {
+ using var fs = File.OpenRead(tablePath);
+ Dictionary> table = JsonSerializer.Deserialize>>(fs);
+ if (!table.TryGetValue(_settings.DoublePinyinSchema, out var value))
+ {
+ throw new InvalidOperationException("DoublePinyinSchema is invalid.");
+ }
+ currentDoublePinyinTable = new ReadOnlyDictionary(value);
+ }
+ catch (System.Exception e)
+ {
+ Log.Exception(nameof(PinyinAlphabet), "Failed to load double pinyin table from file: " + tablePath, e);
+ currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary());
+ }
+ }
+ else
+ {
+ currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary());
+ }
}
public bool ShouldTranslate(string stringToTranslate)
@@ -50,7 +93,7 @@ namespace Flow.Launcher.Infrastructure
var resultBuilder = new StringBuilder();
var map = new TranslationMapping();
- var pre = false;
+ var previousIsChinese = false;
for (var i = 0; i < resultList.Length; i++)
{
@@ -58,18 +101,19 @@ namespace Flow.Launcher.Infrastructure
{
string dp = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i];
map.AddNewIndex(i, resultBuilder.Length, dp.Length + 1);
- resultBuilder.Append(' ');
+ if (previousIsChinese)
+ {
+ resultBuilder.Append(' ');
+ }
resultBuilder.Append(dp);
- pre = true;
}
else
{
- if (pre)
+ if (previousIsChinese)
{
- pre = false;
+ previousIsChinese = false;
resultBuilder.Append(' ');
}
-
resultBuilder.Append(resultList[i]);
}
}
@@ -83,115 +127,13 @@ namespace Flow.Launcher.Infrastructure
#region Double Pinyin
- private static readonly ReadOnlyDictionary special = new(new Dictionary(){
- {"A", "aa"},
- {"Ai", "ai"},
- {"An", "an"},
- {"Ang", "ah"},
- {"Ao", "ao"},
- {"E", "ee"},
- {"Ei", "ei"},
- {"En", "en"},
- {"Er", "er"},
- {"O", "oo"},
- {"Ou", "ou"}
- });
-
- private static readonly ReadOnlyDictionary first = new(new Dictionary(){
- {"Ch", "i"},
- {"Sh", "u"},
- {"Zh", "v"}
- });
-
- private static readonly ReadOnlyDictionary second = new(new Dictionary()
+ private string ToDoublePin(string fullPinyin)
{
- {"ua", "x"},
- {"ei", "w"},
- {"e", "e"},
- {"ou", "z"},
- {"iu", "q"},
- {"ve", "t"},
- {"ue", "t"},
- {"u", "u"},
- {"i", "i"},
- {"o", "o"},
- {"uo", "o"},
- {"ie", "p"},
- {"a", "a"},
- {"ong", "s"},
- {"iong", "s"},
- {"ai", "d"},
- {"ing", "k"},
- {"uai", "k"},
- {"ang", "h"},
- {"uan", "r"},
- {"an", "j"},
- {"en", "f"},
- {"ia", "x"},
- {"iang", "l"},
- {"uang", "l"},
- {"eng", "g"},
- {"in", "b"},
- {"ao", "c"},
- {"v", "v"},
- {"ui", "v"},
- {"un", "y"},
- {"iao", "n"},
- {"ian", "m"}
- });
-
- private static string ToDoublePin(string fullPinyin)
- {
- // Assuming s is valid
- var fullPinyinSpan = fullPinyin.AsSpan();
- var doublePin = new StringBuilder();
-
- // Handle special cases (a, o, e)
- if (fullPinyin.Length <= 3 && (fullPinyinSpan[0] == 'a' || fullPinyinSpan[0] == 'e' || fullPinyinSpan[0] == 'o'))
+ if (currentDoublePinyinTable.TryGetValue(fullPinyin, out var doublePinyinValue))
{
- if (special.TryGetValue(fullPinyin, out var value))
- {
- return value;
- }
+ return doublePinyinValue;
}
-
- // Check for initials that are two characters long (zh, ch, sh)
- if (fullPinyin.Length >= 2)
- {
- var firstTwoString = fullPinyinSpan[..2].ToString();
- if (first.TryGetValue(firstTwoString, out var firstTwoDoublePin))
- {
- doublePin.Append(firstTwoDoublePin);
-
- var lastTwo = fullPinyinSpan[2..];
- var lastTwoString = lastTwo.ToString();
- if (second.TryGetValue(lastTwoString, out var tmp))
- {
- doublePin.Append(tmp);
- }
- else
- {
- doublePin.Append(lastTwo); // Todo: original pinyin, remove this line if not needed
- }
- }
- else
- {
- // Handle single-character initials
- doublePin.Append(fullPinyinSpan[0]);
-
- var lastOne = fullPinyinSpan[1..];
- var lastOneString = lastOne.ToString();
- if (second.TryGetValue(lastOneString, out var tmp))
- {
- doublePin.Append(tmp);
- }
- else
- {
- doublePin.Append(lastOne);
- }
- }
- }
- return doublePin.ToString();
+ return fullPinyin;
}
#endregion
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index b10f9502e..e7306e3dd 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -292,6 +292,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool UseDoublePinyin { get; set; } = true; //For developing
+ public string DoublePinyinSchema { get; set; } = "XiaoHe"; //For developing
+
public bool AlwaysPreview { get; set; } = false;
public bool AlwaysStartEn { get; set; } = false;
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index d75d15a21..37e1f6bcf 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -127,6 +127,9 @@
PreserveNewest
+
+ PreserveNewest
+
diff --git a/Flow.Launcher/Resources/double_pinyin.json b/Flow.Launcher/Resources/double_pinyin.json
new file mode 100644
index 000000000..6b8ae06c0
--- /dev/null
+++ b/Flow.Launcher/Resources/double_pinyin.json
@@ -0,0 +1,3746 @@
+{
+ "XiaoHe": {
+ "Lv": "lv",
+ "Lve": "lt",
+ "Lue": "lt",
+ "Nv": "nv",
+ "Nve": "nt",
+ "Nue": "nt",
+ "A": "aa",
+ "O": "oo",
+ "E": "ee",
+ "Ai": "ai",
+ "Ei": "ei",
+ "Ao": "ao",
+ "Ou": "ou",
+ "An": "an",
+ "En": "en",
+ "Ang": "ah",
+ "Eng": "eg",
+ "Er": "er",
+ "Yi": "yi",
+ "Ya": "ya",
+ "Yo": "yo",
+ "Ye": "ye",
+ "Yao": "yc",
+ "You": "yz",
+ "Yan": "yj",
+ "Yin": "yb",
+ "Yang": "yh",
+ "Ying": "yk",
+ "Wu": "wu",
+ "Wa": "wa",
+ "Wo": "wo",
+ "Wai": "wd",
+ "Wei": "ww",
+ "Wan": "wj",
+ "Wen": "wf",
+ "Wang": "wh",
+ "Weng": "wg",
+ "Yu": "yu",
+ "Yue": "yt",
+ "Yuan": "yr",
+ "Yun": "yy",
+ "Yong": "ys",
+ "Ba": "ba",
+ "Bai": "bd",
+ "Ban": "bj",
+ "Bang": "bh",
+ "Bao": "bc",
+ "Bei": "bw",
+ "Ben": "bf",
+ "Beng": "bg",
+ "Bi": "bi",
+ "Bian": "bm",
+ "Biang": "bl",
+ "Biao": "bn",
+ "Bie": "bp",
+ "Bin": "bb",
+ "Bing": "bk",
+ "Bo": "bo",
+ "Bu": "bu",
+ "Ca": "ca",
+ "Cai": "cd",
+ "Can": "cj",
+ "Cang": "ch",
+ "Cao": "cc",
+ "Ce": "ce",
+ "Cen": "cf",
+ "Ceng": "cg",
+ "Cha": "ia",
+ "Chai": "id",
+ "Chan": "ij",
+ "Chang": "ih",
+ "Chao": "ic",
+ "Che": "ie",
+ "Chen": "if",
+ "Cheng": "ig",
+ "Chi": "ii",
+ "Chong": "is",
+ "Chou": "iz",
+ "Chu": "iu",
+ "Chua": "ix",
+ "Chuai": "ik",
+ "Chuan": "ir",
+ "Chuang": "il",
+ "Chui": "iv",
+ "Chun": "iy",
+ "Chuo": "io",
+ "Ci": "ci",
+ "Cong": "cs",
+ "Cou": "cz",
+ "Cu": "cu",
+ "Cuan": "cr",
+ "Cui": "cv",
+ "Cun": "cy",
+ "Cuo": "co",
+ "Da": "da",
+ "Dai": "dd",
+ "Dan": "dj",
+ "Dang": "dh",
+ "Dao": "dc",
+ "De": "de",
+ "Dei": "dw",
+ "Den": "df",
+ "Deng": "dg",
+ "Di": "di",
+ "Dia": "dx",
+ "Dian": "dm",
+ "Diao": "dn",
+ "Die": "dp",
+ "Ding": "dk",
+ "Diu": "dq",
+ "Dong": "ds",
+ "Dou": "dz",
+ "Du": "du",
+ "Duan": "dr",
+ "Dui": "dv",
+ "Dun": "dy",
+ "Duo": "do",
+ "Fa": "fa",
+ "Fan": "fj",
+ "Fang": "fh",
+ "Fei": "fw",
+ "Fen": "ff",
+ "Feng": "fg",
+ "Fiao": "fn",
+ "Fo": "fo",
+ "Fou": "fz",
+ "Fu": "fu",
+ "Ga": "ga",
+ "Gai": "gd",
+ "Gan": "gj",
+ "Gang": "gh",
+ "Gao": "gc",
+ "Ge": "ge",
+ "Gei": "gw",
+ "Gen": "gf",
+ "Geng": "gg",
+ "Gong": "gs",
+ "Gou": "gz",
+ "Gu": "gu",
+ "Gua": "gx",
+ "Guai": "gk",
+ "Guan": "gr",
+ "Guang": "gl",
+ "Gui": "gv",
+ "Gun": "gy",
+ "Guo": "go",
+ "Ha": "ha",
+ "Hai": "hd",
+ "Han": "hj",
+ "Hang": "hh",
+ "Hao": "hc",
+ "He": "he",
+ "Hei": "hw",
+ "Hen": "hf",
+ "Heng": "hg",
+ "Hong": "hs",
+ "Hou": "hz",
+ "Hu": "hu",
+ "Hua": "hx",
+ "Huai": "hk",
+ "Huan": "hr",
+ "Huang": "hl",
+ "Hui": "hv",
+ "Hun": "hy",
+ "Huo": "ho",
+ "Ji": "ji",
+ "Jia": "jx",
+ "Jian": "jm",
+ "Jiang": "jl",
+ "Jiao": "jn",
+ "Jie": "jp",
+ "Jin": "jb",
+ "Jing": "jk",
+ "Jiong": "js",
+ "Jiu": "jq",
+ "Ju": "ju",
+ "Juan": "jr",
+ "Jue": "jt",
+ "Jun": "jy",
+ "Ka": "ka",
+ "Kai": "kd",
+ "Kan": "kj",
+ "Kang": "kh",
+ "Kao": "kc",
+ "Ke": "ke",
+ "Ken": "kf",
+ "Keng": "kg",
+ "Kong": "ks",
+ "Kou": "kz",
+ "Ku": "ku",
+ "Kua": "kx",
+ "Kuai": "kk",
+ "Kuan": "kr",
+ "Kuang": "kl",
+ "Kui": "kv",
+ "Kun": "ky",
+ "Kuo": "ko",
+ "La": "la",
+ "Lai": "ld",
+ "Lan": "lj",
+ "Lang": "lh",
+ "Lao": "lc",
+ "Le": "le",
+ "Lei": "lw",
+ "Leng": "lg",
+ "Li": "li",
+ "Lia": "lx",
+ "Lian": "lm",
+ "Liang": "ll",
+ "Liao": "ln",
+ "Lie": "lp",
+ "Lin": "lb",
+ "Ling": "lk",
+ "Liu": "lq",
+ "Lo": "lo",
+ "Long": "ls",
+ "Lou": "lz",
+ "Lu": "lu",
+ "Luan": "lr",
+ "Lun": "ly",
+ "Luo": "lo",
+ "Ma": "ma",
+ "Mai": "md",
+ "Man": "mj",
+ "Mang": "mh",
+ "Mao": "mc",
+ "Me": "me",
+ "Mei": "mw",
+ "Men": "mf",
+ "Meng": "mg",
+ "Mi": "mi",
+ "Mian": "mm",
+ "Miao": "mn",
+ "Mie": "mp",
+ "Min": "mb",
+ "Ming": "mk",
+ "Miu": "mq",
+ "Mo": "mo",
+ "Mou": "mz",
+ "Mu": "mu",
+ "Na": "na",
+ "Nai": "nd",
+ "Nan": "nj",
+ "Nang": "nh",
+ "Nao": "nc",
+ "Ne": "ne",
+ "Nei": "nw",
+ "Nen": "nf",
+ "Neng": "ng",
+ "Ni": "ni",
+ "Nian": "nm",
+ "Niang": "nl",
+ "Niao": "nn",
+ "Nie": "np",
+ "Nin": "nb",
+ "Ning": "nk",
+ "Niu": "nq",
+ "Nong": "ns",
+ "Nou": "nz",
+ "Nu": "nu",
+ "Nuan": "nr",
+ "Nun": "ny",
+ "Nuo": "no",
+ "Pa": "pa",
+ "Pai": "pd",
+ "Pan": "pj",
+ "Pang": "ph",
+ "Pao": "pc",
+ "Pei": "pw",
+ "Pen": "pf",
+ "Peng": "pg",
+ "Pi": "pi",
+ "Pian": "pm",
+ "Piao": "pn",
+ "Pie": "pp",
+ "Pin": "pb",
+ "Ping": "pk",
+ "Po": "po",
+ "Pou": "pz",
+ "Pu": "pu",
+ "Qi": "qi",
+ "Qia": "qx",
+ "Qian": "qm",
+ "Qiang": "ql",
+ "Qiao": "qn",
+ "Qie": "qp",
+ "Qin": "qb",
+ "Qing": "qk",
+ "Qiong": "qs",
+ "Qiu": "qq",
+ "Qu": "qu",
+ "Quan": "qr",
+ "Que": "qt",
+ "Qun": "qy",
+ "Ran": "rj",
+ "Rang": "rh",
+ "Rao": "rc",
+ "Re": "re",
+ "Ren": "rf",
+ "Reng": "rg",
+ "Ri": "ri",
+ "Rong": "rs",
+ "Rou": "rz",
+ "Ru": "ru",
+ "Rua": "rx",
+ "Ruan": "rr",
+ "Rui": "rv",
+ "Run": "ry",
+ "Ruo": "ro",
+ "Sa": "sa",
+ "Sai": "sd",
+ "San": "sj",
+ "Sang": "sh",
+ "Sao": "sc",
+ "Se": "se",
+ "Sen": "sf",
+ "Seng": "sg",
+ "Sha": "ua",
+ "Shai": "ud",
+ "Shan": "uj",
+ "Shang": "uh",
+ "Shao": "uc",
+ "She": "ue",
+ "Shei": "uw",
+ "Shen": "uf",
+ "Sheng": "ug",
+ "Shi": "ui",
+ "Shou": "uz",
+ "Shu": "uu",
+ "Shua": "ux",
+ "Shuai": "uk",
+ "Shuan": "ur",
+ "Shuang": "ul",
+ "Shui": "uv",
+ "Shun": "uy",
+ "Shuo": "uo",
+ "Si": "si",
+ "Song": "ss",
+ "Sou": "sz",
+ "Su": "su",
+ "Suan": "sr",
+ "Sui": "sv",
+ "Sun": "sy",
+ "Suo": "so",
+ "Ta": "ta",
+ "Tai": "td",
+ "Tan": "tj",
+ "Tang": "th",
+ "Tao": "tc",
+ "Te": "te",
+ "Tei": "tw",
+ "Teng": "tg",
+ "Ti": "ti",
+ "Tian": "tm",
+ "Tiao": "tn",
+ "Tie": "tp",
+ "Ting": "tk",
+ "Tong": "ts",
+ "Tou": "tz",
+ "Tu": "tu",
+ "Tuan": "tr",
+ "Tui": "tv",
+ "Tun": "ty",
+ "Tuo": "to",
+ "Xi": "xi",
+ "Xia": "xx",
+ "Xian": "xm",
+ "Xiang": "xl",
+ "Xiao": "xn",
+ "Xie": "xp",
+ "Xin": "xb",
+ "Xing": "xk",
+ "Xiong": "xs",
+ "Xiu": "xq",
+ "Xu": "xu",
+ "Xuan": "xr",
+ "Xue": "xt",
+ "Xun": "xy",
+ "Za": "za",
+ "Zai": "zd",
+ "Zan": "zj",
+ "Zang": "zh",
+ "Zao": "zc",
+ "Ze": "ze",
+ "Zei": "zw",
+ "Zen": "zf",
+ "Zeng": "zg",
+ "Zha": "va",
+ "Zhai": "vd",
+ "Zhan": "vj",
+ "Zhang": "vh",
+ "Zhao": "vc",
+ "Zhe": "ve",
+ "Zhen": "vf",
+ "Zheng": "vg",
+ "Zhi": "vi",
+ "Zhong": "vs",
+ "Zhou": "vz",
+ "Zhu": "vu",
+ "Zhua": "vx",
+ "Zhuai": "vk",
+ "Zhuan": "vr",
+ "Zhuang": "vl",
+ "Zhui": "vv",
+ "Zhun": "vy",
+ "Zhuo": "vo",
+ "Zi": "zi",
+ "Zong": "zs",
+ "Zou": "zz",
+ "Zu": "zu",
+ "Zuan": "zr",
+ "Zui": "zv",
+ "Zun": "zy",
+ "Zuo": "zo"
+ },
+ "ZiRanMa": {
+ "Lv": "lv",
+ "Lve": "lt",
+ "Lue": "lt",
+ "Nv": "nv",
+ "Nve": "nt",
+ "Nue": "nt",
+ "A": "aa",
+ "O": "oo",
+ "E": "ee",
+ "Ai": "ai",
+ "Ei": "ei",
+ "Ao": "ao",
+ "Ou": "ou",
+ "An": "an",
+ "En": "en",
+ "Ang": "ah",
+ "Eng": "eg",
+ "Er": "er",
+ "Yi": "yi",
+ "Ya": "ya",
+ "Yo": "yo",
+ "Ye": "ye",
+ "Yao": "yk",
+ "You": "yb",
+ "Yan": "yj",
+ "Yin": "yn",
+ "Yang": "yh",
+ "Ying": "yy",
+ "Wu": "wu",
+ "Wa": "wa",
+ "Wo": "wo",
+ "Wai": "wl",
+ "Wei": "wz",
+ "Wan": "wj",
+ "Wen": "wf",
+ "Wang": "wh",
+ "Weng": "wg",
+ "Yu": "yu",
+ "Yue": "yt",
+ "Yuan": "yr",
+ "Yun": "yp",
+ "Yong": "ys",
+ "Ba": "ba",
+ "Bai": "bl",
+ "Ban": "bj",
+ "Bang": "bh",
+ "Bao": "bk",
+ "Bei": "bz",
+ "Ben": "bf",
+ "Beng": "bg",
+ "Bi": "bi",
+ "Bian": "bm",
+ "Biang": "bd",
+ "Biao": "bc",
+ "Bie": "bx",
+ "Bin": "bn",
+ "Bing": "by",
+ "Bo": "bo",
+ "Bu": "bu",
+ "Ca": "ca",
+ "Cai": "cl",
+ "Can": "cj",
+ "Cang": "ch",
+ "Cao": "ck",
+ "Ce": "ce",
+ "Cen": "cf",
+ "Ceng": "cg",
+ "Cha": "ia",
+ "Chai": "il",
+ "Chan": "ij",
+ "Chang": "ih",
+ "Chao": "ik",
+ "Che": "ie",
+ "Chen": "if",
+ "Cheng": "ig",
+ "Chi": "ii",
+ "Chong": "is",
+ "Chou": "ib",
+ "Chu": "iu",
+ "Chua": "iw",
+ "Chuai": "iy",
+ "Chuan": "ir",
+ "Chuang": "id",
+ "Chui": "iv",
+ "Chun": "ip",
+ "Chuo": "io",
+ "Ci": "ci",
+ "Cong": "cs",
+ "Cou": "cb",
+ "Cu": "cu",
+ "Cuan": "cr",
+ "Cui": "cv",
+ "Cun": "cp",
+ "Cuo": "co",
+ "Da": "da",
+ "Dai": "dl",
+ "Dan": "dj",
+ "Dang": "dh",
+ "Dao": "dk",
+ "De": "de",
+ "Dei": "dz",
+ "Den": "df",
+ "Deng": "dg",
+ "Di": "di",
+ "Dia": "dw",
+ "Dian": "dm",
+ "Diao": "dc",
+ "Die": "dx",
+ "Ding": "dy",
+ "Diu": "dq",
+ "Dong": "ds",
+ "Dou": "db",
+ "Du": "du",
+ "Duan": "dr",
+ "Dui": "dv",
+ "Dun": "dp",
+ "Duo": "do",
+ "Fa": "fa",
+ "Fan": "fj",
+ "Fang": "fh",
+ "Fei": "fz",
+ "Fen": "ff",
+ "Feng": "fg",
+ "Fiao": "fc",
+ "Fo": "fo",
+ "Fou": "fb",
+ "Fu": "fu",
+ "Ga": "ga",
+ "Gai": "gl",
+ "Gan": "gj",
+ "Gang": "gh",
+ "Gao": "gk",
+ "Ge": "ge",
+ "Gei": "gz",
+ "Gen": "gf",
+ "Geng": "gg",
+ "Gong": "gs",
+ "Gou": "gb",
+ "Gu": "gu",
+ "Gua": "gw",
+ "Guai": "gy",
+ "Guan": "gr",
+ "Guang": "gd",
+ "Gui": "gv",
+ "Gun": "gp",
+ "Guo": "go",
+ "Ha": "ha",
+ "Hai": "hl",
+ "Han": "hj",
+ "Hang": "hh",
+ "Hao": "hk",
+ "He": "he",
+ "Hei": "hz",
+ "Hen": "hf",
+ "Heng": "hg",
+ "Hong": "hs",
+ "Hou": "hb",
+ "Hu": "hu",
+ "Hua": "hw",
+ "Huai": "hy",
+ "Huan": "hr",
+ "Huang": "hd",
+ "Hui": "hv",
+ "Hun": "hp",
+ "Huo": "ho",
+ "Ji": "ji",
+ "Jia": "jw",
+ "Jian": "jm",
+ "Jiang": "jd",
+ "Jiao": "jc",
+ "Jie": "jx",
+ "Jin": "jn",
+ "Jing": "jy",
+ "Jiong": "js",
+ "Jiu": "jq",
+ "Ju": "ju",
+ "Juan": "jr",
+ "Jue": "jt",
+ "Jun": "jp",
+ "Ka": "ka",
+ "Kai": "kl",
+ "Kan": "kj",
+ "Kang": "kh",
+ "Kao": "kk",
+ "Ke": "ke",
+ "Ken": "kf",
+ "Keng": "kg",
+ "Kong": "ks",
+ "Kou": "kb",
+ "Ku": "ku",
+ "Kua": "kw",
+ "Kuai": "ky",
+ "Kuan": "kr",
+ "Kuang": "kd",
+ "Kui": "kv",
+ "Kun": "kp",
+ "Kuo": "ko",
+ "La": "la",
+ "Lai": "ll",
+ "Lan": "lj",
+ "Lang": "lh",
+ "Lao": "lk",
+ "Le": "le",
+ "Lei": "lz",
+ "Leng": "lg",
+ "Li": "li",
+ "Lia": "lw",
+ "Lian": "lm",
+ "Liang": "ld",
+ "Liao": "lc",
+ "Lie": "lx",
+ "Lin": "ln",
+ "Ling": "ly",
+ "Liu": "lq",
+ "Lo": "lo",
+ "Long": "ls",
+ "Lou": "lb",
+ "Lu": "lu",
+ "Luan": "lr",
+ "Lun": "lp",
+ "Luo": "lo",
+ "Ma": "ma",
+ "Mai": "ml",
+ "Man": "mj",
+ "Mang": "mh",
+ "Mao": "mk",
+ "Me": "me",
+ "Mei": "mz",
+ "Men": "mf",
+ "Meng": "mg",
+ "Mi": "mi",
+ "Mian": "mm",
+ "Miao": "mc",
+ "Mie": "mx",
+ "Min": "mn",
+ "Ming": "my",
+ "Miu": "mq",
+ "Mo": "mo",
+ "Mou": "mb",
+ "Mu": "mu",
+ "Na": "na",
+ "Nai": "nl",
+ "Nan": "nj",
+ "Nang": "nh",
+ "Nao": "nk",
+ "Ne": "ne",
+ "Nei": "nz",
+ "Nen": "nf",
+ "Neng": "ng",
+ "Ni": "ni",
+ "Nian": "nm",
+ "Niang": "nd",
+ "Niao": "nc",
+ "Nie": "nx",
+ "Nin": "nn",
+ "Ning": "ny",
+ "Niu": "nq",
+ "Nong": "ns",
+ "Nou": "nb",
+ "Nu": "nu",
+ "Nuan": "nr",
+ "Nun": "np",
+ "Nuo": "no",
+ "Pa": "pa",
+ "Pai": "pl",
+ "Pan": "pj",
+ "Pang": "ph",
+ "Pao": "pk",
+ "Pei": "pz",
+ "Pen": "pf",
+ "Peng": "pg",
+ "Pi": "pi",
+ "Pian": "pm",
+ "Piao": "pc",
+ "Pie": "px",
+ "Pin": "pn",
+ "Ping": "py",
+ "Po": "po",
+ "Pou": "pb",
+ "Pu": "pu",
+ "Qi": "qi",
+ "Qia": "qw",
+ "Qian": "qm",
+ "Qiang": "qd",
+ "Qiao": "qc",
+ "Qie": "qx",
+ "Qin": "qn",
+ "Qing": "qy",
+ "Qiong": "qs",
+ "Qiu": "qq",
+ "Qu": "qu",
+ "Quan": "qr",
+ "Que": "qt",
+ "Qun": "qp",
+ "Ran": "rj",
+ "Rang": "rh",
+ "Rao": "rk",
+ "Re": "re",
+ "Ren": "rf",
+ "Reng": "rg",
+ "Ri": "ri",
+ "Rong": "rs",
+ "Rou": "rb",
+ "Ru": "ru",
+ "Rua": "rw",
+ "Ruan": "rr",
+ "Rui": "rv",
+ "Run": "rp",
+ "Ruo": "ro",
+ "Sa": "sa",
+ "Sai": "sl",
+ "San": "sj",
+ "Sang": "sh",
+ "Sao": "sk",
+ "Se": "se",
+ "Sen": "sf",
+ "Seng": "sg",
+ "Sha": "ua",
+ "Shai": "ul",
+ "Shan": "uj",
+ "Shang": "uh",
+ "Shao": "uk",
+ "She": "ue",
+ "Shei": "uz",
+ "Shen": "uf",
+ "Sheng": "ug",
+ "Shi": "ui",
+ "Shou": "ub",
+ "Shu": "uu",
+ "Shua": "uw",
+ "Shuai": "uy",
+ "Shuan": "ur",
+ "Shuang": "ud",
+ "Shui": "uv",
+ "Shun": "up",
+ "Shuo": "uo",
+ "Si": "si",
+ "Song": "ss",
+ "Sou": "sb",
+ "Su": "su",
+ "Suan": "sr",
+ "Sui": "sv",
+ "Sun": "sp",
+ "Suo": "so",
+ "Ta": "ta",
+ "Tai": "tl",
+ "Tan": "tj",
+ "Tang": "th",
+ "Tao": "tk",
+ "Te": "te",
+ "Tei": "tz",
+ "Teng": "tg",
+ "Ti": "ti",
+ "Tian": "tm",
+ "Tiao": "tc",
+ "Tie": "tx",
+ "Ting": "ty",
+ "Tong": "ts",
+ "Tou": "tb",
+ "Tu": "tu",
+ "Tuan": "tr",
+ "Tui": "tv",
+ "Tun": "tp",
+ "Tuo": "to",
+ "Xi": "xi",
+ "Xia": "xw",
+ "Xian": "xm",
+ "Xiang": "xd",
+ "Xiao": "xc",
+ "Xie": "xx",
+ "Xin": "xn",
+ "Xing": "xy",
+ "Xiong": "xs",
+ "Xiu": "xq",
+ "Xu": "xu",
+ "Xuan": "xr",
+ "Xue": "xt",
+ "Xun": "xp",
+ "Za": "za",
+ "Zai": "zl",
+ "Zan": "zj",
+ "Zang": "zh",
+ "Zao": "zk",
+ "Ze": "ze",
+ "Zei": "zz",
+ "Zen": "zf",
+ "Zeng": "zg",
+ "Zha": "va",
+ "Zhai": "vl",
+ "Zhan": "vj",
+ "Zhang": "vh",
+ "Zhao": "vk",
+ "Zhe": "ve",
+ "Zhen": "vf",
+ "Zheng": "vg",
+ "Zhi": "vi",
+ "Zhong": "vs",
+ "Zhou": "vb",
+ "Zhu": "vu",
+ "Zhua": "vw",
+ "Zhuai": "vy",
+ "Zhuan": "vr",
+ "Zhuang": "vd",
+ "Zhui": "vv",
+ "Zhun": "vp",
+ "Zhuo": "vo",
+ "Zi": "zi",
+ "Zong": "zs",
+ "Zou": "zb",
+ "Zu": "zu",
+ "Zuan": "zr",
+ "Zui": "zv",
+ "Zun": "zp",
+ "Zuo": "zo"
+ },
+ "WeiRuan": {
+ "Lv": "ly",
+ "Lve": "lt",
+ "Lue": "lt",
+ "Nv": "ny",
+ "Nve": "nt",
+ "Nue": "nt",
+ "A": "oa",
+ "O": "oo",
+ "E": "oe",
+ "Ai": "ol",
+ "Ei": "oz",
+ "Ao": "ok",
+ "Ou": "ob",
+ "An": "oj",
+ "En": "of",
+ "Ang": "oh",
+ "Eng": "og",
+ "Er": "or",
+ "Yi": "yi",
+ "Ya": "ya",
+ "Yo": "yo",
+ "Ye": "ye",
+ "Yao": "yk",
+ "You": "yb",
+ "Yan": "yj",
+ "Yin": "yn",
+ "Yang": "yh",
+ "Ying": "y;",
+ "Wu": "wu",
+ "Wa": "wa",
+ "Wo": "wo",
+ "Wai": "wl",
+ "Wei": "wz",
+ "Wan": "wj",
+ "Wen": "wf",
+ "Wang": "wh",
+ "Weng": "wg",
+ "Yu": "yu",
+ "Yue": "yt",
+ "Yuan": "yr",
+ "Yun": "yp",
+ "Yong": "ys",
+ "Ba": "ba",
+ "Bai": "bl",
+ "Ban": "bj",
+ "Bang": "bh",
+ "Bao": "bk",
+ "Bei": "bz",
+ "Ben": "bf",
+ "Beng": "bg",
+ "Bi": "bi",
+ "Bian": "bm",
+ "Biang": "bd",
+ "Biao": "bc",
+ "Bie": "bx",
+ "Bin": "bn",
+ "Bing": "b;",
+ "Bo": "bo",
+ "Bu": "bu",
+ "Ca": "ca",
+ "Cai": "cl",
+ "Can": "cj",
+ "Cang": "ch",
+ "Cao": "ck",
+ "Ce": "ce",
+ "Cen": "cf",
+ "Ceng": "cg",
+ "Cha": "ia",
+ "Chai": "il",
+ "Chan": "ij",
+ "Chang": "ih",
+ "Chao": "ik",
+ "Che": "ie",
+ "Chen": "if",
+ "Cheng": "ig",
+ "Chi": "ii",
+ "Chong": "is",
+ "Chou": "ib",
+ "Chu": "iu",
+ "Chua": "iw",
+ "Chuai": "iy",
+ "Chuan": "ir",
+ "Chuang": "id",
+ "Chui": "iv",
+ "Chun": "ip",
+ "Chuo": "io",
+ "Ci": "ci",
+ "Cong": "cs",
+ "Cou": "cb",
+ "Cu": "cu",
+ "Cuan": "cr",
+ "Cui": "cv",
+ "Cun": "cp",
+ "Cuo": "co",
+ "Da": "da",
+ "Dai": "dl",
+ "Dan": "dj",
+ "Dang": "dh",
+ "Dao": "dk",
+ "De": "de",
+ "Dei": "dz",
+ "Den": "df",
+ "Deng": "dg",
+ "Di": "di",
+ "Dia": "dw",
+ "Dian": "dm",
+ "Diao": "dc",
+ "Die": "dx",
+ "Ding": "d;",
+ "Diu": "dq",
+ "Dong": "ds",
+ "Dou": "db",
+ "Du": "du",
+ "Duan": "dr",
+ "Dui": "dv",
+ "Dun": "dp",
+ "Duo": "do",
+ "Fa": "fa",
+ "Fan": "fj",
+ "Fang": "fh",
+ "Fei": "fz",
+ "Fen": "ff",
+ "Feng": "fg",
+ "Fiao": "fc",
+ "Fo": "fo",
+ "Fou": "fb",
+ "Fu": "fu",
+ "Ga": "ga",
+ "Gai": "gl",
+ "Gan": "gj",
+ "Gang": "gh",
+ "Gao": "gk",
+ "Ge": "ge",
+ "Gei": "gz",
+ "Gen": "gf",
+ "Geng": "gg",
+ "Gong": "gs",
+ "Gou": "gb",
+ "Gu": "gu",
+ "Gua": "gw",
+ "Guai": "gy",
+ "Guan": "gr",
+ "Guang": "gd",
+ "Gui": "gv",
+ "Gun": "gp",
+ "Guo": "go",
+ "Ha": "ha",
+ "Hai": "hl",
+ "Han": "hj",
+ "Hang": "hh",
+ "Hao": "hk",
+ "He": "he",
+ "Hei": "hz",
+ "Hen": "hf",
+ "Heng": "hg",
+ "Hong": "hs",
+ "Hou": "hb",
+ "Hu": "hu",
+ "Hua": "hw",
+ "Huai": "hy",
+ "Huan": "hr",
+ "Huang": "hd",
+ "Hui": "hv",
+ "Hun": "hp",
+ "Huo": "ho",
+ "Ji": "ji",
+ "Jia": "jw",
+ "Jian": "jm",
+ "Jiang": "jd",
+ "Jiao": "jc",
+ "Jie": "jx",
+ "Jin": "jn",
+ "Jing": "j;",
+ "Jiong": "js",
+ "Jiu": "jq",
+ "Ju": "ju",
+ "Juan": "jr",
+ "Jue": "jt",
+ "Jun": "jp",
+ "Ka": "ka",
+ "Kai": "kl",
+ "Kan": "kj",
+ "Kang": "kh",
+ "Kao": "kk",
+ "Ke": "ke",
+ "Ken": "kf",
+ "Keng": "kg",
+ "Kong": "ks",
+ "Kou": "kb",
+ "Ku": "ku",
+ "Kua": "kw",
+ "Kuai": "ky",
+ "Kuan": "kr",
+ "Kuang": "kd",
+ "Kui": "kv",
+ "Kun": "kp",
+ "Kuo": "ko",
+ "La": "la",
+ "Lai": "ll",
+ "Lan": "lj",
+ "Lang": "lh",
+ "Lao": "lk",
+ "Le": "le",
+ "Lei": "lz",
+ "Leng": "lg",
+ "Li": "li",
+ "Lia": "lw",
+ "Lian": "lm",
+ "Liang": "ld",
+ "Liao": "lc",
+ "Lie": "lx",
+ "Lin": "ln",
+ "Ling": "l;",
+ "Liu": "lq",
+ "Lo": "lo",
+ "Long": "ls",
+ "Lou": "lb",
+ "Lu": "lu",
+ "Luan": "lr",
+ "Lun": "lp",
+ "Luo": "lo",
+ "Ma": "ma",
+ "Mai": "ml",
+ "Man": "mj",
+ "Mang": "mh",
+ "Mao": "mk",
+ "Me": "me",
+ "Mei": "mz",
+ "Men": "mf",
+ "Meng": "mg",
+ "Mi": "mi",
+ "Mian": "mm",
+ "Miao": "mc",
+ "Mie": "mx",
+ "Min": "mn",
+ "Ming": "m;",
+ "Miu": "mq",
+ "Mo": "mo",
+ "Mou": "mb",
+ "Mu": "mu",
+ "Na": "na",
+ "Nai": "nl",
+ "Nan": "nj",
+ "Nang": "nh",
+ "Nao": "nk",
+ "Ne": "ne",
+ "Nei": "nz",
+ "Nen": "nf",
+ "Neng": "ng",
+ "Ni": "ni",
+ "Nian": "nm",
+ "Niang": "nd",
+ "Niao": "nc",
+ "Nie": "nx",
+ "Nin": "nn",
+ "Ning": "n;",
+ "Niu": "nq",
+ "Nong": "ns",
+ "Nou": "nb",
+ "Nu": "nu",
+ "Nuan": "nr",
+ "Nun": "np",
+ "Nuo": "no",
+ "Pa": "pa",
+ "Pai": "pl",
+ "Pan": "pj",
+ "Pang": "ph",
+ "Pao": "pk",
+ "Pei": "pz",
+ "Pen": "pf",
+ "Peng": "pg",
+ "Pi": "pi",
+ "Pian": "pm",
+ "Piao": "pc",
+ "Pie": "px",
+ "Pin": "pn",
+ "Ping": "p;",
+ "Po": "po",
+ "Pou": "pb",
+ "Pu": "pu",
+ "Qi": "qi",
+ "Qia": "qw",
+ "Qian": "qm",
+ "Qiang": "qd",
+ "Qiao": "qc",
+ "Qie": "qx",
+ "Qin": "qn",
+ "Qing": "q;",
+ "Qiong": "qs",
+ "Qiu": "qq",
+ "Qu": "qu",
+ "Quan": "qr",
+ "Que": "qt",
+ "Qun": "qp",
+ "Ran": "rj",
+ "Rang": "rh",
+ "Rao": "rk",
+ "Re": "re",
+ "Ren": "rf",
+ "Reng": "rg",
+ "Ri": "ri",
+ "Rong": "rs",
+ "Rou": "rb",
+ "Ru": "ru",
+ "Rua": "rw",
+ "Ruan": "rr",
+ "Rui": "rv",
+ "Run": "rp",
+ "Ruo": "ro",
+ "Sa": "sa",
+ "Sai": "sl",
+ "San": "sj",
+ "Sang": "sh",
+ "Sao": "sk",
+ "Se": "se",
+ "Sen": "sf",
+ "Seng": "sg",
+ "Sha": "ua",
+ "Shai": "ul",
+ "Shan": "uj",
+ "Shang": "uh",
+ "Shao": "uk",
+ "She": "ue",
+ "Shei": "uz",
+ "Shen": "uf",
+ "Sheng": "ug",
+ "Shi": "ui",
+ "Shou": "ub",
+ "Shu": "uu",
+ "Shua": "uw",
+ "Shuai": "uy",
+ "Shuan": "ur",
+ "Shuang": "ud",
+ "Shui": "uv",
+ "Shun": "up",
+ "Shuo": "uo",
+ "Si": "si",
+ "Song": "ss",
+ "Sou": "sb",
+ "Su": "su",
+ "Suan": "sr",
+ "Sui": "sv",
+ "Sun": "sp",
+ "Suo": "so",
+ "Ta": "ta",
+ "Tai": "tl",
+ "Tan": "tj",
+ "Tang": "th",
+ "Tao": "tk",
+ "Te": "te",
+ "Tei": "tz",
+ "Teng": "tg",
+ "Ti": "ti",
+ "Tian": "tm",
+ "Tiao": "tc",
+ "Tie": "tx",
+ "Ting": "t;",
+ "Tong": "ts",
+ "Tou": "tb",
+ "Tu": "tu",
+ "Tuan": "tr",
+ "Tui": "tv",
+ "Tun": "tp",
+ "Tuo": "to",
+ "Xi": "xi",
+ "Xia": "xw",
+ "Xian": "xm",
+ "Xiang": "xd",
+ "Xiao": "xc",
+ "Xie": "xx",
+ "Xin": "xn",
+ "Xing": "x;",
+ "Xiong": "xs",
+ "Xiu": "xq",
+ "Xu": "xu",
+ "Xuan": "xr",
+ "Xue": "xt",
+ "Xun": "xp",
+ "Za": "za",
+ "Zai": "zl",
+ "Zan": "zj",
+ "Zang": "zh",
+ "Zao": "zk",
+ "Ze": "ze",
+ "Zei": "zz",
+ "Zen": "zf",
+ "Zeng": "zg",
+ "Zha": "va",
+ "Zhai": "vl",
+ "Zhan": "vj",
+ "Zhang": "vh",
+ "Zhao": "vk",
+ "Zhe": "ve",
+ "Zhen": "vf",
+ "Zheng": "vg",
+ "Zhi": "vi",
+ "Zhong": "vs",
+ "Zhou": "vb",
+ "Zhu": "vu",
+ "Zhua": "vw",
+ "Zhuai": "vy",
+ "Zhuan": "vr",
+ "Zhuang": "vd",
+ "Zhui": "vv",
+ "Zhun": "vp",
+ "Zhuo": "vo",
+ "Zi": "zi",
+ "Zong": "zs",
+ "Zou": "zb",
+ "Zu": "zu",
+ "Zuan": "zr",
+ "Zui": "zv",
+ "Zun": "zp",
+ "Zuo": "zo"
+ },
+ "ZhiNengABC": {
+ "Lv": "lv",
+ "Lve": "lm",
+ "Lue": "lm",
+ "Nv": "nv",
+ "Nve": "nm",
+ "Nue": "nm",
+ "A": "oa",
+ "O": "oo",
+ "E": "oe",
+ "Ai": "ol",
+ "Ei": "oq",
+ "Ao": "ok",
+ "Ou": "ob",
+ "An": "oj",
+ "En": "of",
+ "Ang": "oh",
+ "Eng": "og",
+ "Er": "or",
+ "Yi": "yi",
+ "Ya": "ya",
+ "Yo": "yo",
+ "Ye": "ye",
+ "Yao": "yk",
+ "You": "yb",
+ "Yan": "yj",
+ "Yin": "yc",
+ "Yang": "yh",
+ "Ying": "yy",
+ "Wu": "wu",
+ "Wa": "wa",
+ "Wo": "wo",
+ "Wai": "wl",
+ "Wei": "wq",
+ "Wan": "wj",
+ "Wen": "wf",
+ "Wang": "wh",
+ "Weng": "wg",
+ "Yu": "yu",
+ "Yue": "ym",
+ "Yuan": "yp",
+ "Yun": "yn",
+ "Yong": "ys",
+ "Ba": "ba",
+ "Bai": "bl",
+ "Ban": "bj",
+ "Bang": "bh",
+ "Bao": "bk",
+ "Bei": "bq",
+ "Ben": "bf",
+ "Beng": "bg",
+ "Bi": "bi",
+ "Bian": "bw",
+ "Biang": "bt",
+ "Biao": "bz",
+ "Bie": "bx",
+ "Bin": "bc",
+ "Bing": "by",
+ "Bo": "bo",
+ "Bu": "bu",
+ "Ca": "ca",
+ "Cai": "cl",
+ "Can": "cj",
+ "Cang": "ch",
+ "Cao": "ck",
+ "Ce": "ce",
+ "Cen": "cf",
+ "Ceng": "cg",
+ "Cha": "ea",
+ "Chai": "el",
+ "Chan": "ej",
+ "Chang": "eh",
+ "Chao": "ek",
+ "Che": "ee",
+ "Chen": "ef",
+ "Cheng": "eg",
+ "Chi": "ei",
+ "Chong": "es",
+ "Chou": "eb",
+ "Chu": "eu",
+ "Chua": "ed",
+ "Chuai": "ec",
+ "Chuan": "ep",
+ "Chuang": "et",
+ "Chui": "em",
+ "Chun": "en",
+ "Chuo": "eo",
+ "Ci": "ci",
+ "Cong": "cs",
+ "Cou": "cb",
+ "Cu": "cu",
+ "Cuan": "cp",
+ "Cui": "cm",
+ "Cun": "cn",
+ "Cuo": "co",
+ "Da": "da",
+ "Dai": "dl",
+ "Dan": "dj",
+ "Dang": "dh",
+ "Dao": "dk",
+ "De": "de",
+ "Dei": "dq",
+ "Den": "df",
+ "Deng": "dg",
+ "Di": "di",
+ "Dia": "dd",
+ "Dian": "dw",
+ "Diao": "dz",
+ "Die": "dx",
+ "Ding": "dy",
+ "Diu": "dr",
+ "Dong": "ds",
+ "Dou": "db",
+ "Du": "du",
+ "Duan": "dp",
+ "Dui": "dm",
+ "Dun": "dn",
+ "Duo": "do",
+ "Fa": "fa",
+ "Fan": "fj",
+ "Fang": "fh",
+ "Fei": "fq",
+ "Fen": "ff",
+ "Feng": "fg",
+ "Fiao": "fz",
+ "Fo": "fo",
+ "Fou": "fb",
+ "Fu": "fu",
+ "Ga": "ga",
+ "Gai": "gl",
+ "Gan": "gj",
+ "Gang": "gh",
+ "Gao": "gk",
+ "Ge": "ge",
+ "Gei": "gq",
+ "Gen": "gf",
+ "Geng": "gg",
+ "Gong": "gs",
+ "Gou": "gb",
+ "Gu": "gu",
+ "Gua": "gd",
+ "Guai": "gc",
+ "Guan": "gp",
+ "Guang": "gt",
+ "Gui": "gm",
+ "Gun": "gn",
+ "Guo": "go",
+ "Ha": "ha",
+ "Hai": "hl",
+ "Han": "hj",
+ "Hang": "hh",
+ "Hao": "hk",
+ "He": "he",
+ "Hei": "hq",
+ "Hen": "hf",
+ "Heng": "hg",
+ "Hong": "hs",
+ "Hou": "hb",
+ "Hu": "hu",
+ "Hua": "hd",
+ "Huai": "hc",
+ "Huan": "hp",
+ "Huang": "ht",
+ "Hui": "hm",
+ "Hun": "hn",
+ "Huo": "ho",
+ "Ji": "ji",
+ "Jia": "jd",
+ "Jian": "jw",
+ "Jiang": "jt",
+ "Jiao": "jz",
+ "Jie": "jx",
+ "Jin": "jc",
+ "Jing": "jy",
+ "Jiong": "js",
+ "Jiu": "jr",
+ "Ju": "ju",
+ "Juan": "jp",
+ "Jue": "jm",
+ "Jun": "jn",
+ "Ka": "ka",
+ "Kai": "kl",
+ "Kan": "kj",
+ "Kang": "kh",
+ "Kao": "kk",
+ "Ke": "ke",
+ "Ken": "kf",
+ "Keng": "kg",
+ "Kong": "ks",
+ "Kou": "kb",
+ "Ku": "ku",
+ "Kua": "kd",
+ "Kuai": "kc",
+ "Kuan": "kp",
+ "Kuang": "kt",
+ "Kui": "km",
+ "Kun": "kn",
+ "Kuo": "ko",
+ "La": "la",
+ "Lai": "ll",
+ "Lan": "lj",
+ "Lang": "lh",
+ "Lao": "lk",
+ "Le": "le",
+ "Lei": "lq",
+ "Leng": "lg",
+ "Li": "li",
+ "Lia": "ld",
+ "Lian": "lw",
+ "Liang": "lt",
+ "Liao": "lz",
+ "Lie": "lx",
+ "Lin": "lc",
+ "Ling": "ly",
+ "Liu": "lr",
+ "Lo": "lo",
+ "Long": "ls",
+ "Lou": "lb",
+ "Lu": "lu",
+ "Luan": "lp",
+ "Lun": "ln",
+ "Luo": "lo",
+ "Ma": "ma",
+ "Mai": "ml",
+ "Man": "mj",
+ "Mang": "mh",
+ "Mao": "mk",
+ "Me": "me",
+ "Mei": "mq",
+ "Men": "mf",
+ "Meng": "mg",
+ "Mi": "mi",
+ "Mian": "mw",
+ "Miao": "mz",
+ "Mie": "mx",
+ "Min": "mc",
+ "Ming": "my",
+ "Miu": "mr",
+ "Mo": "mo",
+ "Mou": "mb",
+ "Mu": "mu",
+ "Na": "na",
+ "Nai": "nl",
+ "Nan": "nj",
+ "Nang": "nh",
+ "Nao": "nk",
+ "Ne": "ne",
+ "Nei": "nq",
+ "Nen": "nf",
+ "Neng": "ng",
+ "Ni": "ni",
+ "Nian": "nw",
+ "Niang": "nt",
+ "Niao": "nz",
+ "Nie": "nx",
+ "Nin": "nc",
+ "Ning": "ny",
+ "Niu": "nr",
+ "Nong": "ns",
+ "Nou": "nb",
+ "Nu": "nu",
+ "Nuan": "np",
+ "Nun": "nn",
+ "Nuo": "no",
+ "Pa": "pa",
+ "Pai": "pl",
+ "Pan": "pj",
+ "Pang": "ph",
+ "Pao": "pk",
+ "Pei": "pq",
+ "Pen": "pf",
+ "Peng": "pg",
+ "Pi": "pi",
+ "Pian": "pw",
+ "Piao": "pz",
+ "Pie": "px",
+ "Pin": "pc",
+ "Ping": "py",
+ "Po": "po",
+ "Pou": "pb",
+ "Pu": "pu",
+ "Qi": "qi",
+ "Qia": "qd",
+ "Qian": "qw",
+ "Qiang": "qt",
+ "Qiao": "qz",
+ "Qie": "qx",
+ "Qin": "qc",
+ "Qing": "qy",
+ "Qiong": "qs",
+ "Qiu": "qr",
+ "Qu": "qu",
+ "Quan": "qp",
+ "Que": "qm",
+ "Qun": "qn",
+ "Ran": "rj",
+ "Rang": "rh",
+ "Rao": "rk",
+ "Re": "re",
+ "Ren": "rf",
+ "Reng": "rg",
+ "Ri": "ri",
+ "Rong": "rs",
+ "Rou": "rb",
+ "Ru": "ru",
+ "Rua": "rd",
+ "Ruan": "rp",
+ "Rui": "rm",
+ "Run": "rn",
+ "Ruo": "ro",
+ "Sa": "sa",
+ "Sai": "sl",
+ "San": "sj",
+ "Sang": "sh",
+ "Sao": "sk",
+ "Se": "se",
+ "Sen": "sf",
+ "Seng": "sg",
+ "Sha": "va",
+ "Shai": "vl",
+ "Shan": "vj",
+ "Shang": "vh",
+ "Shao": "vk",
+ "She": "ve",
+ "Shei": "vq",
+ "Shen": "vf",
+ "Sheng": "vg",
+ "Shi": "vi",
+ "Shou": "vb",
+ "Shu": "vu",
+ "Shua": "vd",
+ "Shuai": "vc",
+ "Shuan": "vp",
+ "Shuang": "vt",
+ "Shui": "vm",
+ "Shun": "vn",
+ "Shuo": "vo",
+ "Si": "si",
+ "Song": "ss",
+ "Sou": "sb",
+ "Su": "su",
+ "Suan": "sp",
+ "Sui": "sm",
+ "Sun": "sn",
+ "Suo": "so",
+ "Ta": "ta",
+ "Tai": "tl",
+ "Tan": "tj",
+ "Tang": "th",
+ "Tao": "tk",
+ "Te": "te",
+ "Tei": "tq",
+ "Teng": "tg",
+ "Ti": "ti",
+ "Tian": "tw",
+ "Tiao": "tz",
+ "Tie": "tx",
+ "Ting": "ty",
+ "Tong": "ts",
+ "Tou": "tb",
+ "Tu": "tu",
+ "Tuan": "tp",
+ "Tui": "tm",
+ "Tun": "tn",
+ "Tuo": "to",
+ "Xi": "xi",
+ "Xia": "xd",
+ "Xian": "xw",
+ "Xiang": "xt",
+ "Xiao": "xz",
+ "Xie": "xx",
+ "Xin": "xc",
+ "Xing": "xy",
+ "Xiong": "xs",
+ "Xiu": "xr",
+ "Xu": "xu",
+ "Xuan": "xp",
+ "Xue": "xm",
+ "Xun": "xn",
+ "Za": "za",
+ "Zai": "zl",
+ "Zan": "zj",
+ "Zang": "zh",
+ "Zao": "zk",
+ "Ze": "ze",
+ "Zei": "zq",
+ "Zen": "zf",
+ "Zeng": "zg",
+ "Zha": "aa",
+ "Zhai": "al",
+ "Zhan": "aj",
+ "Zhang": "ah",
+ "Zhao": "ak",
+ "Zhe": "ae",
+ "Zhen": "af",
+ "Zheng": "ag",
+ "Zhi": "ai",
+ "Zhong": "as",
+ "Zhou": "ab",
+ "Zhu": "au",
+ "Zhua": "ad",
+ "Zhuai": "ac",
+ "Zhuan": "ap",
+ "Zhuang": "at",
+ "Zhui": "am",
+ "Zhun": "an",
+ "Zhuo": "ao",
+ "Zi": "zi",
+ "Zong": "zs",
+ "Zou": "zb",
+ "Zu": "zu",
+ "Zuan": "zp",
+ "Zui": "zm",
+ "Zun": "zn",
+ "Zuo": "zo"
+ },
+ "ZiGuangPinYin": {
+ "Lv": "lv",
+ "Lve": "ln",
+ "Lue": "ln",
+ "Nv": "nv",
+ "Nve": "nn",
+ "Nue": "nn",
+ "A": "oa",
+ "O": "oo",
+ "E": "oe",
+ "Ai": "op",
+ "Ei": "ok",
+ "Ao": "oq",
+ "Ou": "oz",
+ "An": "or",
+ "En": "ow",
+ "Ang": "os",
+ "Eng": "ot",
+ "Er": "oj",
+ "Yi": "yi",
+ "Ya": "ya",
+ "Yo": "yo",
+ "Ye": "ye",
+ "Yao": "yq",
+ "You": "yz",
+ "Yan": "yr",
+ "Yin": "yy",
+ "Yang": "ys",
+ "Ying": "yc",
+ "Wu": "wu",
+ "Wa": "wa",
+ "Wo": "wo",
+ "Wai": "wp",
+ "Wei": "wk",
+ "Wan": "wr",
+ "Wen": "ww",
+ "Wang": "ws",
+ "Weng": "wt",
+ "Yu": "yu",
+ "Yue": "yn",
+ "Yuan": "yl",
+ "Yun": "ym",
+ "Yong": "yh",
+ "Ba": "ba",
+ "Bai": "bp",
+ "Ban": "br",
+ "Bang": "bs",
+ "Bao": "bq",
+ "Bei": "bk",
+ "Ben": "bw",
+ "Beng": "bt",
+ "Bi": "bi",
+ "Bian": "bf",
+ "Biang": "bg",
+ "Biao": "bb",
+ "Bie": "bd",
+ "Bin": "by",
+ "Bing": "bc",
+ "Bo": "bo",
+ "Bu": "bu",
+ "Ca": "ca",
+ "Cai": "cp",
+ "Can": "cr",
+ "Cang": "cs",
+ "Cao": "cq",
+ "Ce": "ce",
+ "Cen": "cw",
+ "Ceng": "ct",
+ "Cha": "aa",
+ "Chai": "ap",
+ "Chan": "ar",
+ "Chang": "as",
+ "Chao": "aq",
+ "Che": "ae",
+ "Chen": "aw",
+ "Cheng": "at",
+ "Chi": "ai",
+ "Chong": "ah",
+ "Chou": "az",
+ "Chu": "au",
+ "Chua": "ax",
+ "Chuai": "ay",
+ "Chuan": "al",
+ "Chuang": "ag",
+ "Chui": "an",
+ "Chun": "am",
+ "Chuo": "ao",
+ "Ci": "ci",
+ "Cong": "ch",
+ "Cou": "cz",
+ "Cu": "cu",
+ "Cuan": "cl",
+ "Cui": "cn",
+ "Cun": "cm",
+ "Cuo": "co",
+ "Da": "da",
+ "Dai": "dp",
+ "Dan": "dr",
+ "Dang": "ds",
+ "Dao": "dq",
+ "De": "de",
+ "Dei": "dk",
+ "Den": "dw",
+ "Deng": "dt",
+ "Di": "di",
+ "Dia": "dx",
+ "Dian": "df",
+ "Diao": "db",
+ "Die": "dd",
+ "Ding": "dc",
+ "Diu": "dj",
+ "Dong": "dh",
+ "Dou": "dz",
+ "Du": "du",
+ "Duan": "dl",
+ "Dui": "dn",
+ "Dun": "dm",
+ "Duo": "do",
+ "Fa": "fa",
+ "Fan": "fr",
+ "Fang": "fs",
+ "Fei": "fk",
+ "Fen": "fw",
+ "Feng": "ft",
+ "Fiao": "fb",
+ "Fo": "fo",
+ "Fou": "fz",
+ "Fu": "fu",
+ "Ga": "ga",
+ "Gai": "gp",
+ "Gan": "gr",
+ "Gang": "gs",
+ "Gao": "gq",
+ "Ge": "ge",
+ "Gei": "gk",
+ "Gen": "gw",
+ "Geng": "gt",
+ "Gong": "gh",
+ "Gou": "gz",
+ "Gu": "gu",
+ "Gua": "gx",
+ "Guai": "gy",
+ "Guan": "gl",
+ "Guang": "gg",
+ "Gui": "gn",
+ "Gun": "gm",
+ "Guo": "go",
+ "Ha": "ha",
+ "Hai": "hp",
+ "Han": "hr",
+ "Hang": "hs",
+ "Hao": "hq",
+ "He": "he",
+ "Hei": "hk",
+ "Hen": "hw",
+ "Heng": "ht",
+ "Hong": "hh",
+ "Hou": "hz",
+ "Hu": "hu",
+ "Hua": "hx",
+ "Huai": "hy",
+ "Huan": "hl",
+ "Huang": "hg",
+ "Hui": "hn",
+ "Hun": "hm",
+ "Huo": "ho",
+ "Ji": "ji",
+ "Jia": "jx",
+ "Jian": "jf",
+ "Jiang": "jg",
+ "Jiao": "jb",
+ "Jie": "jd",
+ "Jin": "jy",
+ "Jing": "jc",
+ "Jiong": "jh",
+ "Jiu": "jj",
+ "Ju": "ju",
+ "Juan": "jl",
+ "Jue": "jn",
+ "Jun": "jm",
+ "Ka": "ka",
+ "Kai": "kp",
+ "Kan": "kr",
+ "Kang": "ks",
+ "Kao": "kq",
+ "Ke": "ke",
+ "Ken": "kw",
+ "Keng": "kt",
+ "Kong": "kh",
+ "Kou": "kz",
+ "Ku": "ku",
+ "Kua": "kx",
+ "Kuai": "ky",
+ "Kuan": "kl",
+ "Kuang": "kg",
+ "Kui": "kn",
+ "Kun": "km",
+ "Kuo": "ko",
+ "La": "la",
+ "Lai": "lp",
+ "Lan": "lr",
+ "Lang": "ls",
+ "Lao": "lq",
+ "Le": "le",
+ "Lei": "lk",
+ "Leng": "lt",
+ "Li": "li",
+ "Lia": "lx",
+ "Lian": "lf",
+ "Liang": "lg",
+ "Liao": "lb",
+ "Lie": "ld",
+ "Lin": "ly",
+ "Ling": "lc",
+ "Liu": "lj",
+ "Lo": "lo",
+ "Long": "lh",
+ "Lou": "lz",
+ "Lu": "lu",
+ "Luan": "ll",
+ "Lun": "lm",
+ "Luo": "lo",
+ "Ma": "ma",
+ "Mai": "mp",
+ "Man": "mr",
+ "Mang": "ms",
+ "Mao": "mq",
+ "Me": "me",
+ "Mei": "mk",
+ "Men": "mw",
+ "Meng": "mt",
+ "Mi": "mi",
+ "Mian": "mf",
+ "Miao": "mb",
+ "Mie": "md",
+ "Min": "my",
+ "Ming": "mc",
+ "Miu": "mj",
+ "Mo": "mo",
+ "Mou": "mz",
+ "Mu": "mu",
+ "Na": "na",
+ "Nai": "np",
+ "Nan": "nr",
+ "Nang": "ns",
+ "Nao": "nq",
+ "Ne": "ne",
+ "Nei": "nk",
+ "Nen": "nw",
+ "Neng": "nt",
+ "Ni": "ni",
+ "Nian": "nf",
+ "Niang": "ng",
+ "Niao": "nb",
+ "Nie": "nd",
+ "Nin": "ny",
+ "Ning": "nc",
+ "Niu": "nj",
+ "Nong": "nh",
+ "Nou": "nz",
+ "Nu": "nu",
+ "Nuan": "nl",
+ "Nun": "nm",
+ "Nuo": "no",
+ "Pa": "pa",
+ "Pai": "pp",
+ "Pan": "pr",
+ "Pang": "ps",
+ "Pao": "pq",
+ "Pei": "pk",
+ "Pen": "pw",
+ "Peng": "pt",
+ "Pi": "pi",
+ "Pian": "pf",
+ "Piao": "pb",
+ "Pie": "pd",
+ "Pin": "py",
+ "Ping": "pc",
+ "Po": "po",
+ "Pou": "pz",
+ "Pu": "pu",
+ "Qi": "qi",
+ "Qia": "qx",
+ "Qian": "qf",
+ "Qiang": "qg",
+ "Qiao": "qb",
+ "Qie": "qd",
+ "Qin": "qy",
+ "Qing": "qc",
+ "Qiong": "qh",
+ "Qiu": "qj",
+ "Qu": "qu",
+ "Quan": "ql",
+ "Que": "qn",
+ "Qun": "qm",
+ "Ran": "rr",
+ "Rang": "rs",
+ "Rao": "rq",
+ "Re": "re",
+ "Ren": "rw",
+ "Reng": "rt",
+ "Ri": "ri",
+ "Rong": "rh",
+ "Rou": "rz",
+ "Ru": "ru",
+ "Rua": "rx",
+ "Ruan": "rl",
+ "Rui": "rn",
+ "Run": "rm",
+ "Ruo": "ro",
+ "Sa": "sa",
+ "Sai": "sp",
+ "San": "sr",
+ "Sang": "ss",
+ "Sao": "sq",
+ "Se": "se",
+ "Sen": "sw",
+ "Seng": "st",
+ "Sha": "ia",
+ "Shai": "ip",
+ "Shan": "ir",
+ "Shang": "is",
+ "Shao": "iq",
+ "She": "ie",
+ "Shei": "ik",
+ "Shen": "iw",
+ "Sheng": "it",
+ "Shi": "ii",
+ "Shou": "iz",
+ "Shu": "iu",
+ "Shua": "ix",
+ "Shuai": "iy",
+ "Shuan": "il",
+ "Shuang": "ig",
+ "Shui": "in",
+ "Shun": "im",
+ "Shuo": "io",
+ "Si": "si",
+ "Song": "sh",
+ "Sou": "sz",
+ "Su": "su",
+ "Suan": "sl",
+ "Sui": "sn",
+ "Sun": "sm",
+ "Suo": "so",
+ "Ta": "ta",
+ "Tai": "tp",
+ "Tan": "tr",
+ "Tang": "ts",
+ "Tao": "tq",
+ "Te": "te",
+ "Tei": "tk",
+ "Teng": "tt",
+ "Ti": "ti",
+ "Tian": "tf",
+ "Tiao": "tb",
+ "Tie": "td",
+ "Ting": "tc",
+ "Tong": "th",
+ "Tou": "tz",
+ "Tu": "tu",
+ "Tuan": "tl",
+ "Tui": "tn",
+ "Tun": "tm",
+ "Tuo": "to",
+ "Xi": "xi",
+ "Xia": "xx",
+ "Xian": "xf",
+ "Xiang": "xg",
+ "Xiao": "xb",
+ "Xie": "xd",
+ "Xin": "xy",
+ "Xing": "xc",
+ "Xiong": "xh",
+ "Xiu": "xj",
+ "Xu": "xu",
+ "Xuan": "xl",
+ "Xue": "xn",
+ "Xun": "xm",
+ "Za": "za",
+ "Zai": "zp",
+ "Zan": "zr",
+ "Zang": "zs",
+ "Zao": "zq",
+ "Ze": "ze",
+ "Zei": "zk",
+ "Zen": "zw",
+ "Zeng": "zt",
+ "Zha": "ua",
+ "Zhai": "up",
+ "Zhan": "ur",
+ "Zhang": "us",
+ "Zhao": "uq",
+ "Zhe": "ue",
+ "Zhen": "uw",
+ "Zheng": "ut",
+ "Zhi": "ui",
+ "Zhong": "uh",
+ "Zhou": "uz",
+ "Zhu": "uu",
+ "Zhua": "ux",
+ "Zhuai": "uy",
+ "Zhuan": "ul",
+ "Zhuang": "ug",
+ "Zhui": "un",
+ "Zhun": "um",
+ "Zhuo": "uo",
+ "Zi": "zi",
+ "Zong": "zh",
+ "Zou": "zz",
+ "Zu": "zu",
+ "Zuan": "zl",
+ "Zui": "zn",
+ "Zun": "zm",
+ "Zuo": "zo"
+ },
+ "PinYinJiaJia": {
+ "Lv": "lv",
+ "Lve": "lx",
+ "Lue": "lx",
+ "Nv": "nv",
+ "Nve": "nx",
+ "Nue": "nx",
+ "A": "aa",
+ "O": "oo",
+ "E": "ee",
+ "Ai": "as",
+ "Ei": "ew",
+ "Ao": "ad",
+ "Ou": "op",
+ "An": "af",
+ "En": "er",
+ "Ang": "ag",
+ "Eng": "et",
+ "Er": "eq",
+ "Yi": "yi",
+ "Ya": "ya",
+ "Yo": "yo",
+ "Ye": "ye",
+ "Yao": "yd",
+ "You": "yp",
+ "Yan": "yf",
+ "Yin": "yl",
+ "Yang": "yg",
+ "Ying": "yq",
+ "Wu": "wu",
+ "Wa": "wa",
+ "Wo": "wo",
+ "Wai": "ws",
+ "Wei": "ww",
+ "Wan": "wf",
+ "Wen": "wr",
+ "Wang": "wg",
+ "Weng": "wt",
+ "Yu": "yu",
+ "Yue": "yx",
+ "Yuan": "yc",
+ "Yun": "yz",
+ "Yong": "yy",
+ "Ba": "ba",
+ "Bai": "bs",
+ "Ban": "bf",
+ "Bang": "bg",
+ "Bao": "bd",
+ "Bei": "bw",
+ "Ben": "br",
+ "Beng": "bt",
+ "Bi": "bi",
+ "Bian": "bj",
+ "Biang": "bh",
+ "Biao": "bk",
+ "Bie": "bm",
+ "Bin": "bl",
+ "Bing": "bq",
+ "Bo": "bo",
+ "Bu": "bu",
+ "Ca": "ca",
+ "Cai": "cs",
+ "Can": "cf",
+ "Cang": "cg",
+ "Cao": "cd",
+ "Ce": "ce",
+ "Cen": "cr",
+ "Ceng": "ct",
+ "Cha": "ua",
+ "Chai": "us",
+ "Chan": "uf",
+ "Chang": "ug",
+ "Chao": "ud",
+ "Che": "ue",
+ "Chen": "ur",
+ "Cheng": "ut",
+ "Chi": "ui",
+ "Chong": "uy",
+ "Chou": "up",
+ "Chu": "uu",
+ "Chua": "ub",
+ "Chuai": "ux",
+ "Chuan": "uc",
+ "Chuang": "uh",
+ "Chui": "uv",
+ "Chun": "uz",
+ "Chuo": "uo",
+ "Ci": "ci",
+ "Cong": "cy",
+ "Cou": "cp",
+ "Cu": "cu",
+ "Cuan": "cc",
+ "Cui": "cv",
+ "Cun": "cz",
+ "Cuo": "co",
+ "Da": "da",
+ "Dai": "ds",
+ "Dan": "df",
+ "Dang": "dg",
+ "Dao": "dd",
+ "De": "de",
+ "Dei": "dw",
+ "Den": "dr",
+ "Deng": "dt",
+ "Di": "di",
+ "Dia": "db",
+ "Dian": "dj",
+ "Diao": "dk",
+ "Die": "dm",
+ "Ding": "dq",
+ "Diu": "dn",
+ "Dong": "dy",
+ "Dou": "dp",
+ "Du": "du",
+ "Duan": "dc",
+ "Dui": "dv",
+ "Dun": "dz",
+ "Duo": "do",
+ "Fa": "fa",
+ "Fan": "ff",
+ "Fang": "fg",
+ "Fei": "fw",
+ "Fen": "fr",
+ "Feng": "ft",
+ "Fiao": "fk",
+ "Fo": "fo",
+ "Fou": "fp",
+ "Fu": "fu",
+ "Ga": "ga",
+ "Gai": "gs",
+ "Gan": "gf",
+ "Gang": "gg",
+ "Gao": "gd",
+ "Ge": "ge",
+ "Gei": "gw",
+ "Gen": "gr",
+ "Geng": "gt",
+ "Gong": "gy",
+ "Gou": "gp",
+ "Gu": "gu",
+ "Gua": "gb",
+ "Guai": "gx",
+ "Guan": "gc",
+ "Guang": "gh",
+ "Gui": "gv",
+ "Gun": "gz",
+ "Guo": "go",
+ "Ha": "ha",
+ "Hai": "hs",
+ "Han": "hf",
+ "Hang": "hg",
+ "Hao": "hd",
+ "He": "he",
+ "Hei": "hw",
+ "Hen": "hr",
+ "Heng": "ht",
+ "Hong": "hy",
+ "Hou": "hp",
+ "Hu": "hu",
+ "Hua": "hb",
+ "Huai": "hx",
+ "Huan": "hc",
+ "Huang": "hh",
+ "Hui": "hv",
+ "Hun": "hz",
+ "Huo": "ho",
+ "Ji": "ji",
+ "Jia": "jb",
+ "Jian": "jj",
+ "Jiang": "jh",
+ "Jiao": "jk",
+ "Jie": "jm",
+ "Jin": "jl",
+ "Jing": "jq",
+ "Jiong": "jy",
+ "Jiu": "jn",
+ "Ju": "ju",
+ "Juan": "jc",
+ "Jue": "jx",
+ "Jun": "jz",
+ "Ka": "ka",
+ "Kai": "ks",
+ "Kan": "kf",
+ "Kang": "kg",
+ "Kao": "kd",
+ "Ke": "ke",
+ "Ken": "kr",
+ "Keng": "kt",
+ "Kong": "ky",
+ "Kou": "kp",
+ "Ku": "ku",
+ "Kua": "kb",
+ "Kuai": "kx",
+ "Kuan": "kc",
+ "Kuang": "kh",
+ "Kui": "kv",
+ "Kun": "kz",
+ "Kuo": "ko",
+ "La": "la",
+ "Lai": "ls",
+ "Lan": "lf",
+ "Lang": "lg",
+ "Lao": "ld",
+ "Le": "le",
+ "Lei": "lw",
+ "Leng": "lt",
+ "Li": "li",
+ "Lia": "lb",
+ "Lian": "lj",
+ "Liang": "lh",
+ "Liao": "lk",
+ "Lie": "lm",
+ "Lin": "ll",
+ "Ling": "lq",
+ "Liu": "ln",
+ "Lo": "lo",
+ "Long": "ly",
+ "Lou": "lp",
+ "Lu": "lu",
+ "Luan": "lc",
+ "Lun": "lz",
+ "Luo": "lo",
+ "Ma": "ma",
+ "Mai": "ms",
+ "Man": "mf",
+ "Mang": "mg",
+ "Mao": "md",
+ "Me": "me",
+ "Mei": "mw",
+ "Men": "mr",
+ "Meng": "mt",
+ "Mi": "mi",
+ "Mian": "mj",
+ "Miao": "mk",
+ "Mie": "mm",
+ "Min": "ml",
+ "Ming": "mq",
+ "Miu": "mn",
+ "Mo": "mo",
+ "Mou": "mp",
+ "Mu": "mu",
+ "Na": "na",
+ "Nai": "ns",
+ "Nan": "nf",
+ "Nang": "ng",
+ "Nao": "nd",
+ "Ne": "ne",
+ "Nei": "nw",
+ "Nen": "nr",
+ "Neng": "nt",
+ "Ni": "ni",
+ "Nian": "nj",
+ "Niang": "nh",
+ "Niao": "nk",
+ "Nie": "nm",
+ "Nin": "nl",
+ "Ning": "nq",
+ "Niu": "nn",
+ "Nong": "ny",
+ "Nou": "np",
+ "Nu": "nu",
+ "Nuan": "nc",
+ "Nun": "nz",
+ "Nuo": "no",
+ "Pa": "pa",
+ "Pai": "ps",
+ "Pan": "pf",
+ "Pang": "pg",
+ "Pao": "pd",
+ "Pei": "pw",
+ "Pen": "pr",
+ "Peng": "pt",
+ "Pi": "pi",
+ "Pian": "pj",
+ "Piao": "pk",
+ "Pie": "pm",
+ "Pin": "pl",
+ "Ping": "pq",
+ "Po": "po",
+ "Pou": "pp",
+ "Pu": "pu",
+ "Qi": "qi",
+ "Qia": "qb",
+ "Qian": "qj",
+ "Qiang": "qh",
+ "Qiao": "qk",
+ "Qie": "qm",
+ "Qin": "ql",
+ "Qing": "qq",
+ "Qiong": "qy",
+ "Qiu": "qn",
+ "Qu": "qu",
+ "Quan": "qc",
+ "Que": "qx",
+ "Qun": "qz",
+ "Ran": "rf",
+ "Rang": "rg",
+ "Rao": "rd",
+ "Re": "re",
+ "Ren": "rr",
+ "Reng": "rt",
+ "Ri": "ri",
+ "Rong": "ry",
+ "Rou": "rp",
+ "Ru": "ru",
+ "Rua": "rb",
+ "Ruan": "rc",
+ "Rui": "rv",
+ "Run": "rz",
+ "Ruo": "ro",
+ "Sa": "sa",
+ "Sai": "ss",
+ "San": "sf",
+ "Sang": "sg",
+ "Sao": "sd",
+ "Se": "se",
+ "Sen": "sr",
+ "Seng": "st",
+ "Sha": "ia",
+ "Shai": "is",
+ "Shan": "if",
+ "Shang": "ig",
+ "Shao": "id",
+ "She": "ie",
+ "Shei": "iw",
+ "Shen": "ir",
+ "Sheng": "it",
+ "Shi": "ii",
+ "Shou": "ip",
+ "Shu": "iu",
+ "Shua": "ib",
+ "Shuai": "ix",
+ "Shuan": "ic",
+ "Shuang": "ih",
+ "Shui": "iv",
+ "Shun": "iz",
+ "Shuo": "io",
+ "Si": "si",
+ "Song": "sy",
+ "Sou": "sp",
+ "Su": "su",
+ "Suan": "sc",
+ "Sui": "sv",
+ "Sun": "sz",
+ "Suo": "so",
+ "Ta": "ta",
+ "Tai": "ts",
+ "Tan": "tf",
+ "Tang": "tg",
+ "Tao": "td",
+ "Te": "te",
+ "Tei": "tw",
+ "Teng": "tt",
+ "Ti": "ti",
+ "Tian": "tj",
+ "Tiao": "tk",
+ "Tie": "tm",
+ "Ting": "tq",
+ "Tong": "ty",
+ "Tou": "tp",
+ "Tu": "tu",
+ "Tuan": "tc",
+ "Tui": "tv",
+ "Tun": "tz",
+ "Tuo": "to",
+ "Xi": "xi",
+ "Xia": "xb",
+ "Xian": "xj",
+ "Xiang": "xh",
+ "Xiao": "xk",
+ "Xie": "xm",
+ "Xin": "xl",
+ "Xing": "xq",
+ "Xiong": "xy",
+ "Xiu": "xn",
+ "Xu": "xu",
+ "Xuan": "xc",
+ "Xue": "xx",
+ "Xun": "xz",
+ "Za": "za",
+ "Zai": "zs",
+ "Zan": "zf",
+ "Zang": "zg",
+ "Zao": "zd",
+ "Ze": "ze",
+ "Zei": "zw",
+ "Zen": "zr",
+ "Zeng": "zt",
+ "Zha": "va",
+ "Zhai": "vs",
+ "Zhan": "vf",
+ "Zhang": "vg",
+ "Zhao": "vd",
+ "Zhe": "ve",
+ "Zhen": "vr",
+ "Zheng": "vt",
+ "Zhi": "vi",
+ "Zhong": "vy",
+ "Zhou": "vp",
+ "Zhu": "vu",
+ "Zhua": "vb",
+ "Zhuai": "vx",
+ "Zhuan": "vc",
+ "Zhuang": "vh",
+ "Zhui": "vv",
+ "Zhun": "vz",
+ "Zhuo": "vo",
+ "Zi": "zi",
+ "Zong": "zy",
+ "Zou": "zp",
+ "Zu": "zu",
+ "Zuan": "zc",
+ "Zui": "zv",
+ "Zun": "zz",
+ "Zuo": "zo"
+ },
+ "XingKongJianDao": {
+ "Lv": "lv",
+ "Lve": "ly",
+ "Lue": "ly",
+ "Nv": "nv",
+ "Nve": "ny",
+ "Nue": "ny",
+ "A": "xa",
+ "O": "xo",
+ "E": "xe",
+ "Ai": "xj",
+ "Ei": "xw",
+ "Ao": "xs",
+ "Ou": "xt",
+ "An": "xd",
+ "En": "xk",
+ "Ang": "xf",
+ "Eng": "xh",
+ "Er": "xu",
+ "Yi": "yi",
+ "Ya": "ya",
+ "Yo": "yo",
+ "Ye": "ye",
+ "Yao": "ys",
+ "You": "yt",
+ "Yan": "yd",
+ "Yin": "yb",
+ "Yang": "yf",
+ "Ying": "yg",
+ "Wu": "wj",
+ "Wa": "ws",
+ "Wo": "wo",
+ "Wai": "wh",
+ "Wei": "ww",
+ "Wan": "wf",
+ "Wen": "wn",
+ "Wang": "wp",
+ "Weng": "wr",
+ "Yu": "yv",
+ "Yue": "yy",
+ "Yuan": "yr",
+ "Yun": "yw",
+ "Yong": "yl",
+ "Ba": "ba",
+ "Bai": "bj",
+ "Ban": "bd",
+ "Bang": "bf",
+ "Bao": "bs",
+ "Bei": "bw",
+ "Ben": "bk",
+ "Beng": "bh",
+ "Bi": "bi",
+ "Bian": "bm",
+ "Biang": "bx",
+ "Biao": "bp",
+ "Bie": "bc",
+ "Bin": "bb",
+ "Bing": "bg",
+ "Bo": "bo",
+ "Bu": "bu",
+ "Ca": "ca",
+ "Cai": "cj",
+ "Can": "cd",
+ "Cang": "cf",
+ "Cao": "cs",
+ "Ce": "ce",
+ "Cen": "ck",
+ "Ceng": "ch",
+ "Cha": "ja",
+ "Chai": "jj",
+ "Chan": "jd",
+ "Chang": "jf",
+ "Chao": "js",
+ "Che": "je",
+ "Chen": "jk",
+ "Cheng": "jh",
+ "Chi": "wi",
+ "Chong": "wl",
+ "Chou": "jt",
+ "Chu": "ju",
+ "Chua": "wx",
+ "Chuai": "wg",
+ "Chuan": "wr",
+ "Chuang": "wn",
+ "Chui": "wy",
+ "Chun": "jz",
+ "Chuo": "jo",
+ "Ci": "ci",
+ "Cong": "cl",
+ "Cou": "ct",
+ "Cu": "cu",
+ "Cuan": "cr",
+ "Cui": "cy",
+ "Cun": "cz",
+ "Cuo": "co",
+ "Da": "da",
+ "Dai": "dj",
+ "Dan": "dd",
+ "Dang": "df",
+ "Dao": "ds",
+ "De": "de",
+ "Dei": "dw",
+ "Den": "dk",
+ "Deng": "dh",
+ "Di": "di",
+ "Dia": "dx",
+ "Dian": "dm",
+ "Diao": "dp",
+ "Die": "dc",
+ "Ding": "dg",
+ "Diu": "dq",
+ "Dong": "dl",
+ "Dou": "dt",
+ "Du": "du",
+ "Duan": "dr",
+ "Dui": "dy",
+ "Dun": "dz",
+ "Duo": "do",
+ "Fa": "fs",
+ "Fan": "ff",
+ "Fang": "fp",
+ "Fei": "fw",
+ "Fen": "fn",
+ "Feng": "fr",
+ "Fiao": "fp",
+ "Fo": "fl",
+ "Fou": "fd",
+ "Fu": "fl",
+ "Ga": "ga",
+ "Gai": "gj",
+ "Gan": "gd",
+ "Gang": "gf",
+ "Gao": "gs",
+ "Ge": "ge",
+ "Gei": "gw",
+ "Gen": "gk",
+ "Geng": "gh",
+ "Gong": "gl",
+ "Gou": "gt",
+ "Gu": "gu",
+ "Gua": "gx",
+ "Guai": "gg",
+ "Guan": "gr",
+ "Guang": "gn",
+ "Gui": "gy",
+ "Gun": "gz",
+ "Guo": "go",
+ "Ha": "ha",
+ "Hai": "hj",
+ "Han": "hd",
+ "Hang": "hf",
+ "Hao": "hs",
+ "He": "he",
+ "Hei": "hw",
+ "Hen": "hk",
+ "Heng": "hh",
+ "Hong": "hl",
+ "Hou": "ht",
+ "Hu": "hu",
+ "Hua": "hx",
+ "Huai": "hg",
+ "Huan": "hr",
+ "Huang": "hn",
+ "Hui": "hy",
+ "Hun": "hz",
+ "Huo": "ho",
+ "Ji": "jk",
+ "Jia": "js",
+ "Jian": "jm",
+ "Jiang": "jn",
+ "Jiao": "jp",
+ "Jie": "jc",
+ "Jin": "jb",
+ "Jing": "jg",
+ "Jiong": "jy",
+ "Jiu": "jq",
+ "Ju": "jv",
+ "Juan": "jt",
+ "Jue": "jh",
+ "Jun": "jw",
+ "Ka": "ka",
+ "Kai": "kj",
+ "Kan": "kd",
+ "Kang": "kf",
+ "Kao": "ks",
+ "Ke": "ke",
+ "Ken": "kk",
+ "Keng": "kh",
+ "Kong": "kl",
+ "Kou": "kt",
+ "Ku": "ku",
+ "Kua": "kx",
+ "Kuai": "kg",
+ "Kuan": "kr",
+ "Kuang": "kn",
+ "Kui": "ky",
+ "Kun": "kz",
+ "Kuo": "ko",
+ "La": "la",
+ "Lai": "lj",
+ "Lan": "ld",
+ "Lang": "lf",
+ "Lao": "ls",
+ "Le": "le",
+ "Lei": "lw",
+ "Leng": "lh",
+ "Li": "li",
+ "Lia": "lx",
+ "Lian": "lm",
+ "Liang": "ln",
+ "Liao": "lp",
+ "Lie": "lc",
+ "Lin": "lb",
+ "Ling": "lg",
+ "Liu": "lq",
+ "Lo": "ll",
+ "Long": "ll",
+ "Lou": "lt",
+ "Lu": "lu",
+ "Luan": "lr",
+ "Lun": "lz",
+ "Luo": "lo",
+ "Ma": "ma",
+ "Mai": "mj",
+ "Man": "md",
+ "Mang": "mf",
+ "Mao": "ms",
+ "Me": "me",
+ "Mei": "mw",
+ "Men": "mk",
+ "Meng": "mh",
+ "Mi": "mi",
+ "Mian": "mm",
+ "Miao": "mp",
+ "Mie": "mc",
+ "Min": "mb",
+ "Ming": "mg",
+ "Miu": "mq",
+ "Mo": "mo",
+ "Mou": "mt",
+ "Mu": "mu",
+ "Na": "na",
+ "Nai": "nj",
+ "Nan": "nd",
+ "Nang": "nf",
+ "Nao": "ns",
+ "Ne": "ne",
+ "Nei": "nw",
+ "Nen": "nk",
+ "Neng": "nh",
+ "Ni": "ni",
+ "Nian": "nm",
+ "Niang": "nn",
+ "Niao": "np",
+ "Nie": "nc",
+ "Nin": "nb",
+ "Ning": "ng",
+ "Niu": "nq",
+ "Nong": "nl",
+ "Nou": "nt",
+ "Nu": "nu",
+ "Nuan": "nr",
+ "Nun": "nz",
+ "Nuo": "no",
+ "Pa": "pa",
+ "Pai": "pj",
+ "Pan": "pd",
+ "Pang": "pf",
+ "Pao": "ps",
+ "Pei": "pw",
+ "Pen": "pk",
+ "Peng": "ph",
+ "Pi": "pi",
+ "Pian": "pm",
+ "Piao": "pp",
+ "Pie": "pc",
+ "Pin": "pb",
+ "Ping": "pg",
+ "Po": "po",
+ "Pou": "pt",
+ "Pu": "pu",
+ "Qi": "qk",
+ "Qia": "qs",
+ "Qian": "qm",
+ "Qiang": "qx",
+ "Qiao": "qp",
+ "Qie": "qc",
+ "Qin": "qb",
+ "Qing": "qg",
+ "Qiong": "qy",
+ "Qiu": "qq",
+ "Qu": "qv",
+ "Quan": "qt",
+ "Que": "qh",
+ "Qun": "qw",
+ "Ran": "rd",
+ "Rang": "rf",
+ "Rao": "rs",
+ "Re": "re",
+ "Ren": "rk",
+ "Reng": "rh",
+ "Ri": "ri",
+ "Rong": "rl",
+ "Rou": "rt",
+ "Ru": "ru",
+ "Rua": "rx",
+ "Ruan": "rr",
+ "Rui": "ry",
+ "Run": "rz",
+ "Ruo": "ro",
+ "Sa": "sa",
+ "Sai": "sj",
+ "San": "sd",
+ "Sang": "sf",
+ "Sao": "ss",
+ "Se": "se",
+ "Sen": "sk",
+ "Seng": "sh",
+ "Sha": "ea",
+ "Shai": "ej",
+ "Shan": "ed",
+ "Shang": "ef",
+ "Shao": "es",
+ "She": "ee",
+ "Shei": "ew",
+ "Shen": "ek",
+ "Sheng": "eh",
+ "Shi": "ei",
+ "Shou": "et",
+ "Shu": "eu",
+ "Shua": "ex",
+ "Shuai": "eg",
+ "Shuan": "er",
+ "Shuang": "en",
+ "Shui": "ey",
+ "Shun": "ez",
+ "Shuo": "eo",
+ "Si": "si",
+ "Song": "sl",
+ "Sou": "st",
+ "Su": "su",
+ "Suan": "sr",
+ "Sui": "sy",
+ "Sun": "sz",
+ "Suo": "so",
+ "Ta": "ta",
+ "Tai": "tj",
+ "Tan": "td",
+ "Tang": "tf",
+ "Tao": "ts",
+ "Te": "te",
+ "Tei": "tw",
+ "Teng": "th",
+ "Ti": "ti",
+ "Tian": "tm",
+ "Tiao": "tp",
+ "Tie": "tc",
+ "Ting": "tg",
+ "Tong": "tl",
+ "Tou": "tt",
+ "Tu": "tu",
+ "Tuan": "tr",
+ "Tui": "ty",
+ "Tun": "tz",
+ "Tuo": "to",
+ "Xi": "xi",
+ "Xia": "xx",
+ "Xian": "xm",
+ "Xiang": "xn",
+ "Xiao": "xp",
+ "Xie": "xc",
+ "Xin": "xb",
+ "Xing": "xg",
+ "Xiong": "xl",
+ "Xiu": "xq",
+ "Xu": "xv",
+ "Xuan": "xr",
+ "Xue": "xy",
+ "Xun": "xw",
+ "Za": "za",
+ "Zai": "zj",
+ "Zan": "zd",
+ "Zang": "zf",
+ "Zao": "zs",
+ "Ze": "ze",
+ "Zei": "zw",
+ "Zen": "zk",
+ "Zeng": "zh",
+ "Zha": "qa",
+ "Zhai": "fj",
+ "Zhan": "qd",
+ "Zhang": "qf",
+ "Zhao": "fs",
+ "Zhe": "fe",
+ "Zhen": "qk",
+ "Zheng": "qh",
+ "Zhi": "fi",
+ "Zhong": "fy",
+ "Zhou": "qt",
+ "Zhu": "qu",
+ "Zhua": "fx",
+ "Zhuai": "fg",
+ "Zhuan": "fr",
+ "Zhuang": "fn",
+ "Zhui": "fy",
+ "Zhun": "fz",
+ "Zhuo": "qo",
+ "Zi": "zi",
+ "Zong": "zl",
+ "Zou": "zt",
+ "Zu": "zu",
+ "Zuan": "zr",
+ "Zui": "zy",
+ "Zun": "zz",
+ "Zuo": "zo"
+ },
+ "DaNiu": {
+ "Lv": "lv",
+ "Lve": "lx",
+ "Lue": "lx",
+ "Nv": "nv",
+ "Nve": "nx",
+ "Nue": "nx",
+ "A": "ea",
+ "O": "eo",
+ "E": "ee",
+ "Ai": "eh",
+ "Ei": "ew",
+ "Ao": "es",
+ "Ou": "er",
+ "An": "ed",
+ "En": "ek",
+ "Ang": "ef",
+ "Eng": "ej",
+ "Er": "eu",
+ "Yi": "yi",
+ "Ya": "ya",
+ "Yo": "yo",
+ "Ye": "ye",
+ "Yao": "ys",
+ "You": "yr",
+ "Yan": "yd",
+ "Yin": "yb",
+ "Yang": "yf",
+ "Ying": "yg",
+ "Wu": "wu",
+ "Wa": "wa",
+ "Wo": "wo",
+ "Wai": "wh",
+ "Wei": "ww",
+ "Wan": "wd",
+ "Wen": "wk",
+ "Wang": "wf",
+ "Weng": "wj",
+ "Yu": "yu",
+ "Yue": "yh",
+ "Yuan": "yj",
+ "Yun": "yw",
+ "Yong": "yl",
+ "Ba": "ba",
+ "Bai": "bh",
+ "Ban": "bd",
+ "Bang": "bf",
+ "Bao": "bs",
+ "Bei": "bw",
+ "Ben": "bk",
+ "Beng": "bj",
+ "Bi": "bi",
+ "Bian": "bc",
+ "Biang": "bn",
+ "Biao": "bm",
+ "Bie": "bp",
+ "Bin": "bb",
+ "Bing": "bg",
+ "Bo": "bo",
+ "Bu": "bu",
+ "Ca": "ca",
+ "Cai": "ch",
+ "Can": "cd",
+ "Cang": "cf",
+ "Cao": "cs",
+ "Ce": "ce",
+ "Cen": "ck",
+ "Ceng": "cj",
+ "Cha": "ia",
+ "Chai": "ih",
+ "Chan": "id",
+ "Chang": "if",
+ "Chao": "is",
+ "Che": "ie",
+ "Chen": "ik",
+ "Cheng": "ij",
+ "Chi": "ii",
+ "Chong": "il",
+ "Chou": "ir",
+ "Chu": "iu",
+ "Chua": "iq",
+ "Chuai": "ig",
+ "Chuan": "iz",
+ "Chuang": "ix",
+ "Chui": "in",
+ "Chun": "iy",
+ "Chuo": "io",
+ "Ci": "ci",
+ "Cong": "cl",
+ "Cou": "cr",
+ "Cu": "cu",
+ "Cuan": "cz",
+ "Cui": "cn",
+ "Cun": "cy",
+ "Cuo": "co",
+ "Da": "da",
+ "Dai": "dh",
+ "Dan": "dd",
+ "Dang": "df",
+ "Dao": "ds",
+ "De": "de",
+ "Dei": "dw",
+ "Den": "dk",
+ "Deng": "dj",
+ "Di": "di",
+ "Dia": "dk",
+ "Dian": "dc",
+ "Diao": "dm",
+ "Die": "dp",
+ "Ding": "dg",
+ "Diu": "dt",
+ "Dong": "dl",
+ "Dou": "dr",
+ "Du": "du",
+ "Duan": "dz",
+ "Dui": "dn",
+ "Dun": "dy",
+ "Duo": "do",
+ "Fa": "fa",
+ "Fan": "fd",
+ "Fang": "ff",
+ "Fei": "fw",
+ "Fen": "fk",
+ "Feng": "fj",
+ "Fiao": "fm",
+ "Fo": "fo",
+ "Fou": "fr",
+ "Fu": "fu",
+ "Ga": "ga",
+ "Gai": "gh",
+ "Gan": "gd",
+ "Gang": "gf",
+ "Gao": "gs",
+ "Ge": "ge",
+ "Gei": "gw",
+ "Gen": "gk",
+ "Geng": "gj",
+ "Gong": "gl",
+ "Gou": "gr",
+ "Gu": "gu",
+ "Gua": "gq",
+ "Guai": "gg",
+ "Guan": "gz",
+ "Guang": "gx",
+ "Gui": "gn",
+ "Gun": "gy",
+ "Guo": "go",
+ "Ha": "ha",
+ "Hai": "hh",
+ "Han": "hd",
+ "Hang": "hf",
+ "Hao": "hs",
+ "He": "he",
+ "Hei": "hw",
+ "Hen": "hk",
+ "Heng": "hj",
+ "Hong": "hl",
+ "Hou": "hr",
+ "Hu": "hu",
+ "Hua": "hq",
+ "Huai": "hg",
+ "Huan": "hz",
+ "Huang": "hx",
+ "Hui": "hn",
+ "Hun": "hy",
+ "Huo": "ho",
+ "Ji": "ji",
+ "Jia": "jk",
+ "Jian": "jc",
+ "Jiang": "jn",
+ "Jiao": "jm",
+ "Jie": "jp",
+ "Jin": "jb",
+ "Jing": "jg",
+ "Jiong": "jl",
+ "Jiu": "jt",
+ "Ju": "ju",
+ "Juan": "jj",
+ "Jue": "jh",
+ "Jun": "jw",
+ "Ka": "ka",
+ "Kai": "kh",
+ "Kan": "kd",
+ "Kang": "kf",
+ "Kao": "ks",
+ "Ke": "ke",
+ "Ken": "kk",
+ "Keng": "kj",
+ "Kong": "kl",
+ "Kou": "kr",
+ "Ku": "ku",
+ "Kua": "kq",
+ "Kuai": "kg",
+ "Kuan": "kz",
+ "Kuang": "kx",
+ "Kui": "kn",
+ "Kun": "ky",
+ "Kuo": "ko",
+ "La": "la",
+ "Lai": "lh",
+ "Lan": "ld",
+ "Lang": "lf",
+ "Lao": "ls",
+ "Le": "le",
+ "Lei": "lw",
+ "Leng": "lj",
+ "Li": "li",
+ "Lia": "lk",
+ "Lian": "lc",
+ "Liang": "ln",
+ "Liao": "lm",
+ "Lie": "lp",
+ "Lin": "lb",
+ "Ling": "lg",
+ "Liu": "lt",
+ "Lo": "lo",
+ "Long": "ll",
+ "Lou": "lr",
+ "Lu": "lu",
+ "Luan": "lz",
+ "Lun": "ly",
+ "Luo": "lo",
+ "Ma": "ma",
+ "Mai": "mh",
+ "Man": "md",
+ "Mang": "mf",
+ "Mao": "ms",
+ "Me": "me",
+ "Mei": "mw",
+ "Men": "mk",
+ "Meng": "mj",
+ "Mi": "mi",
+ "Mian": "mc",
+ "Miao": "mm",
+ "Mie": "mp",
+ "Min": "mb",
+ "Ming": "mg",
+ "Miu": "mt",
+ "Mo": "mo",
+ "Mou": "mr",
+ "Mu": "mu",
+ "Na": "na",
+ "Nai": "nh",
+ "Nan": "nd",
+ "Nang": "nf",
+ "Nao": "ns",
+ "Ne": "ne",
+ "Nei": "nw",
+ "Nen": "nk",
+ "Neng": "nj",
+ "Ni": "ni",
+ "Nian": "nc",
+ "Niang": "nn",
+ "Niao": "nm",
+ "Nie": "np",
+ "Nin": "nb",
+ "Ning": "ng",
+ "Niu": "nt",
+ "Nong": "nl",
+ "Nou": "nr",
+ "Nu": "nu",
+ "Nuan": "nz",
+ "Nun": "ny",
+ "Nuo": "no",
+ "Pa": "pa",
+ "Pai": "ph",
+ "Pan": "pd",
+ "Pang": "pf",
+ "Pao": "ps",
+ "Pei": "pw",
+ "Pen": "pk",
+ "Peng": "pj",
+ "Pi": "pi",
+ "Pian": "pc",
+ "Piao": "pm",
+ "Pie": "pp",
+ "Pin": "pb",
+ "Ping": "pg",
+ "Po": "po",
+ "Pou": "pr",
+ "Pu": "pu",
+ "Qi": "qi",
+ "Qia": "qk",
+ "Qian": "qc",
+ "Qiang": "qn",
+ "Qiao": "qm",
+ "Qie": "qp",
+ "Qin": "qb",
+ "Qing": "qg",
+ "Qiong": "ql",
+ "Qiu": "qt",
+ "Qu": "qu",
+ "Quan": "qj",
+ "Que": "qh",
+ "Qun": "qw",
+ "Ran": "rd",
+ "Rang": "rf",
+ "Rao": "rs",
+ "Re": "re",
+ "Ren": "rk",
+ "Reng": "rj",
+ "Ri": "ri",
+ "Rong": "rl",
+ "Rou": "rr",
+ "Ru": "ru",
+ "Rua": "rq",
+ "Ruan": "rz",
+ "Rui": "rn",
+ "Run": "ry",
+ "Ruo": "ro",
+ "Sa": "sa",
+ "Sai": "sh",
+ "San": "sd",
+ "Sang": "sf",
+ "Sao": "ss",
+ "Se": "se",
+ "Sen": "sk",
+ "Seng": "sj",
+ "Sha": "ua",
+ "Shai": "uh",
+ "Shan": "ud",
+ "Shang": "uf",
+ "Shao": "us",
+ "She": "ue",
+ "Shei": "uw",
+ "Shen": "uk",
+ "Sheng": "uj",
+ "Shi": "ui",
+ "Shou": "ur",
+ "Shu": "uu",
+ "Shua": "uq",
+ "Shuai": "ug",
+ "Shuan": "uz",
+ "Shuang": "ux",
+ "Shui": "un",
+ "Shun": "uy",
+ "Shuo": "uo",
+ "Si": "si",
+ "Song": "sl",
+ "Sou": "sr",
+ "Su": "su",
+ "Suan": "sz",
+ "Sui": "sn",
+ "Sun": "sy",
+ "Suo": "so",
+ "Ta": "ta",
+ "Tai": "th",
+ "Tan": "td",
+ "Tang": "tf",
+ "Tao": "ts",
+ "Te": "te",
+ "Tei": "tw",
+ "Teng": "tj",
+ "Ti": "ti",
+ "Tian": "tc",
+ "Tiao": "tm",
+ "Tie": "tp",
+ "Ting": "tg",
+ "Tong": "tl",
+ "Tou": "tr",
+ "Tu": "tu",
+ "Tuan": "tz",
+ "Tui": "tn",
+ "Tun": "ty",
+ "Tuo": "to",
+ "Xi": "xi",
+ "Xia": "xk",
+ "Xian": "xc",
+ "Xiang": "xn",
+ "Xiao": "xm",
+ "Xie": "xp",
+ "Xin": "xb",
+ "Xing": "xg",
+ "Xiong": "xl",
+ "Xiu": "xt",
+ "Xu": "xu",
+ "Xuan": "xj",
+ "Xue": "xh",
+ "Xun": "xw",
+ "Za": "za",
+ "Zai": "zh",
+ "Zan": "zd",
+ "Zang": "zf",
+ "Zao": "zs",
+ "Ze": "ze",
+ "Zei": "zw",
+ "Zen": "zk",
+ "Zeng": "zj",
+ "Zha": "aa",
+ "Zhai": "ah",
+ "Zhan": "ad",
+ "Zhang": "af",
+ "Zhao": "as",
+ "Zhe": "ae",
+ "Zhen": "ak",
+ "Zheng": "aj",
+ "Zhi": "ai",
+ "Zhong": "al",
+ "Zhou": "ar",
+ "Zhu": "au",
+ "Zhua": "aq",
+ "Zhuai": "ag",
+ "Zhuan": "az",
+ "Zhuang": "ax",
+ "Zhui": "an",
+ "Zhun": "ay",
+ "Zhuo": "ao",
+ "Zi": "zi",
+ "Zong": "zl",
+ "Zou": "zr",
+ "Zu": "zu",
+ "Zuan": "zz",
+ "Zui": "zn",
+ "Zun": "zy",
+ "Zuo": "zo"
+ },
+ "XiaoLang": {
+ "Lv": "lx",
+ "Lve": "lb",
+ "Lue": "lb",
+ "Nv": "nx",
+ "Nve": "nb",
+ "Nue": "nb",
+ "A": "aa",
+ "O": "oo",
+ "E": "uu",
+ "Ai": "ai",
+ "Ei": "ui",
+ "Ao": "ao",
+ "Ou": "ou",
+ "An": "an",
+ "En": "un",
+ "Ang": "ah",
+ "Eng": "un",
+ "Er": "ur",
+ "Yi": "yi",
+ "Ya": "ya",
+ "Yo": "yo",
+ "Ye": "ye",
+ "Yao": "ys",
+ "You": "yr",
+ "Yan": "yj",
+ "Yin": "yd",
+ "Yang": "yh",
+ "Ying": "yv",
+ "Wu": "wu",
+ "Wa": "wa",
+ "Wo": "wo",
+ "Wai": "wk",
+ "Wei": "ww",
+ "Wan": "wj",
+ "Wen": "wm",
+ "Wang": "wh",
+ "Weng": "wn",
+ "Yu": "yu",
+ "Yue": "yb",
+ "Yuan": "yg",
+ "Yun": "yy",
+ "Yong": "yl",
+ "Ba": "ba",
+ "Bai": "bk",
+ "Ban": "bj",
+ "Bang": "bh",
+ "Bao": "bs",
+ "Bei": "bw",
+ "Ben": "bm",
+ "Beng": "bn",
+ "Bi": "bi",
+ "Bian": "bf",
+ "Biang": "bm",
+ "Biao": "bc",
+ "Bie": "bp",
+ "Bin": "bd",
+ "Bing": "bv",
+ "Bo": "bo",
+ "Bu": "bu",
+ "Ca": "ca",
+ "Cai": "ck",
+ "Can": "cj",
+ "Cang": "ch",
+ "Cao": "cs",
+ "Ce": "ce",
+ "Cen": "cm",
+ "Ceng": "cn",
+ "Cha": "ia",
+ "Chai": "ik",
+ "Chan": "ij",
+ "Chang": "ih",
+ "Chao": "is",
+ "Che": "ie",
+ "Chen": "im",
+ "Cheng": "in",
+ "Chi": "ii",
+ "Chong": "il",
+ "Chou": "ir",
+ "Chu": "iu",
+ "Chua": "if",
+ "Chuai": "iv",
+ "Chuan": "ig",
+ "Chuang": "iz",
+ "Chui": "id",
+ "Chun": "iy",
+ "Chuo": "io",
+ "Ci": "ci",
+ "Cong": "cl",
+ "Cou": "cr",
+ "Cu": "cu",
+ "Cuan": "cg",
+ "Cui": "cd",
+ "Cun": "cy",
+ "Cuo": "co",
+ "Da": "da",
+ "Dai": "dk",
+ "Dan": "dj",
+ "Dang": "dh",
+ "Dao": "ds",
+ "De": "de",
+ "Dei": "dw",
+ "Den": "dm",
+ "Deng": "dn",
+ "Di": "di",
+ "Dia": "dk",
+ "Dian": "df",
+ "Diao": "dc",
+ "Die": "dp",
+ "Ding": "dv",
+ "Diu": "dt",
+ "Dong": "dl",
+ "Dou": "dr",
+ "Du": "du",
+ "Duan": "dg",
+ "Dui": "dd",
+ "Dun": "dy",
+ "Duo": "do",
+ "Fa": "fa",
+ "Fan": "fj",
+ "Fang": "fh",
+ "Fei": "fw",
+ "Fen": "fm",
+ "Feng": "fn",
+ "Fiao": "fc",
+ "Fo": "fo",
+ "Fou": "fr",
+ "Fu": "fu",
+ "Ga": "ga",
+ "Gai": "gk",
+ "Gan": "gj",
+ "Gang": "gh",
+ "Gao": "gs",
+ "Ge": "ge",
+ "Gei": "gw",
+ "Gen": "gm",
+ "Geng": "gn",
+ "Gong": "gl",
+ "Gou": "gr",
+ "Gu": "gu",
+ "Gua": "gf",
+ "Guai": "gv",
+ "Guan": "gg",
+ "Guang": "gz",
+ "Gui": "gd",
+ "Gun": "gy",
+ "Guo": "go",
+ "Ha": "ha",
+ "Hai": "hk",
+ "Han": "hj",
+ "Hang": "hh",
+ "Hao": "hs",
+ "He": "he",
+ "Hei": "hw",
+ "Hen": "hm",
+ "Heng": "hn",
+ "Hong": "hl",
+ "Hou": "hr",
+ "Hu": "hu",
+ "Hua": "hf",
+ "Huai": "hv",
+ "Huan": "hg",
+ "Huang": "hz",
+ "Hui": "hd",
+ "Hun": "hy",
+ "Huo": "ho",
+ "Ji": "ji",
+ "Jia": "jk",
+ "Jian": "jf",
+ "Jiang": "jm",
+ "Jiao": "jc",
+ "Jie": "jp",
+ "Jin": "jd",
+ "Jing": "jv",
+ "Jiong": "jj",
+ "Jiu": "jt",
+ "Ju": "ju",
+ "Juan": "jg",
+ "Jue": "jb",
+ "Jun": "jy",
+ "Ka": "ka",
+ "Kai": "kk",
+ "Kan": "kj",
+ "Kang": "kh",
+ "Kao": "ks",
+ "Ke": "ke",
+ "Ken": "km",
+ "Keng": "kn",
+ "Kong": "kl",
+ "Kou": "kr",
+ "Ku": "ku",
+ "Kua": "kf",
+ "Kuai": "kv",
+ "Kuan": "kg",
+ "Kuang": "kz",
+ "Kui": "kd",
+ "Kun": "ky",
+ "Kuo": "ko",
+ "La": "la",
+ "Lai": "lk",
+ "Lan": "lj",
+ "Lang": "lh",
+ "Lao": "ls",
+ "Le": "le",
+ "Lei": "lw",
+ "Leng": "ln",
+ "Li": "li",
+ "Lia": "lk",
+ "Lian": "lf",
+ "Liang": "lm",
+ "Liao": "lc",
+ "Lie": "lp",
+ "Lin": "ld",
+ "Ling": "lv",
+ "Liu": "lt",
+ "Lo": "lo",
+ "Long": "ll",
+ "Lou": "lr",
+ "Lu": "lu",
+ "Luan": "lg",
+ "Lun": "ly",
+ "Luo": "lo",
+ "Ma": "ma",
+ "Mai": "mk",
+ "Man": "mj",
+ "Mang": "mh",
+ "Mao": "ms",
+ "Me": "me",
+ "Mei": "mw",
+ "Men": "mm",
+ "Meng": "mn",
+ "Mi": "mi",
+ "Mian": "mf",
+ "Miao": "mc",
+ "Mie": "mp",
+ "Min": "md",
+ "Ming": "mv",
+ "Miu": "mt",
+ "Mo": "mo",
+ "Mou": "mr",
+ "Mu": "mu",
+ "Na": "na",
+ "Nai": "nk",
+ "Nan": "nj",
+ "Nang": "nh",
+ "Nao": "ns",
+ "Ne": "ne",
+ "Nei": "nw",
+ "Nen": "nm",
+ "Neng": "nn",
+ "Ni": "ni",
+ "Nian": "nf",
+ "Niang": "nm",
+ "Niao": "nc",
+ "Nie": "np",
+ "Nin": "nd",
+ "Ning": "nv",
+ "Niu": "nt",
+ "Nong": "nl",
+ "Nou": "nr",
+ "Nu": "nu",
+ "Nuan": "ng",
+ "Nun": "ny",
+ "Nuo": "no",
+ "Pa": "pa",
+ "Pai": "pk",
+ "Pan": "pj",
+ "Pang": "ph",
+ "Pao": "ps",
+ "Pei": "pw",
+ "Pen": "pm",
+ "Peng": "pn",
+ "Pi": "pi",
+ "Pian": "pf",
+ "Piao": "pc",
+ "Pie": "pp",
+ "Pin": "pd",
+ "Ping": "pv",
+ "Po": "po",
+ "Pou": "pr",
+ "Pu": "pu",
+ "Qi": "qi",
+ "Qia": "qk",
+ "Qian": "qf",
+ "Qiang": "qm",
+ "Qiao": "qc",
+ "Qie": "qp",
+ "Qin": "qd",
+ "Qing": "qv",
+ "Qiong": "qj",
+ "Qiu": "qt",
+ "Qu": "qu",
+ "Quan": "qg",
+ "Que": "qb",
+ "Qun": "qy",
+ "Ran": "rj",
+ "Rang": "rh",
+ "Rao": "rs",
+ "Re": "re",
+ "Ren": "rm",
+ "Reng": "rn",
+ "Ri": "ri",
+ "Rong": "rl",
+ "Rou": "rr",
+ "Ru": "ru",
+ "Rua": "rf",
+ "Ruan": "rg",
+ "Rui": "rd",
+ "Run": "ry",
+ "Ruo": "ro",
+ "Sa": "sa",
+ "Sai": "sk",
+ "San": "sj",
+ "Sang": "sh",
+ "Sao": "ss",
+ "Se": "se",
+ "Sen": "sm",
+ "Seng": "sn",
+ "Sha": "va",
+ "Shai": "vk",
+ "Shan": "vj",
+ "Shang": "vh",
+ "Shao": "vs",
+ "She": "ve",
+ "Shei": "vw",
+ "Shen": "vm",
+ "Sheng": "vn",
+ "Shi": "vi",
+ "Shou": "vr",
+ "Shu": "vu",
+ "Shua": "vf",
+ "Shuai": "vv",
+ "Shuan": "vg",
+ "Shuang": "vz",
+ "Shui": "vd",
+ "Shun": "vy",
+ "Shuo": "vo",
+ "Si": "si",
+ "Song": "sl",
+ "Sou": "sr",
+ "Su": "su",
+ "Suan": "sg",
+ "Sui": "sd",
+ "Sun": "sy",
+ "Suo": "so",
+ "Ta": "ta",
+ "Tai": "tk",
+ "Tan": "tj",
+ "Tang": "th",
+ "Tao": "ts",
+ "Te": "te",
+ "Tei": "tw",
+ "Teng": "tn",
+ "Ti": "ti",
+ "Tian": "tf",
+ "Tiao": "tc",
+ "Tie": "tp",
+ "Ting": "tv",
+ "Tong": "tl",
+ "Tou": "tr",
+ "Tu": "tu",
+ "Tuan": "tg",
+ "Tui": "td",
+ "Tun": "ty",
+ "Tuo": "to",
+ "Xi": "xi",
+ "Xia": "xk",
+ "Xian": "xf",
+ "Xiang": "xm",
+ "Xiao": "xc",
+ "Xie": "xp",
+ "Xin": "xd",
+ "Xing": "xv",
+ "Xiong": "xj",
+ "Xiu": "xt",
+ "Xu": "xu",
+ "Xuan": "xg",
+ "Xue": "xb",
+ "Xun": "xy",
+ "Za": "za",
+ "Zai": "zk",
+ "Zan": "zj",
+ "Zang": "zh",
+ "Zao": "zs",
+ "Ze": "ze",
+ "Zei": "zw",
+ "Zen": "zm",
+ "Zeng": "zn",
+ "Zha": "ea",
+ "Zhai": "ek",
+ "Zhan": "ej",
+ "Zhang": "eh",
+ "Zhao": "es",
+ "Zhe": "ee",
+ "Zhen": "em",
+ "Zheng": "en",
+ "Zhi": "ei",
+ "Zhong": "el",
+ "Zhou": "er",
+ "Zhu": "eu",
+ "Zhua": "ef",
+ "Zhuai": "ev",
+ "Zhuan": "eg",
+ "Zhuang": "ez",
+ "Zhui": "ed",
+ "Zhun": "ey",
+ "Zhuo": "eo",
+ "Zi": "zi",
+ "Zong": "zl",
+ "Zou": "zr",
+ "Zu": "zu",
+ "Zuan": "zg",
+ "Zui": "zd",
+ "Zun": "zy",
+ "Zuo": "zo"
+ }
+}
\ No newline at end of file
From 31cd8949fee2d156f16aaf45cb6e50cfac150e7c Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 14 Jun 2025 14:39:01 +0800
Subject: [PATCH 1381/1798] Compress json
---
Flow.Launcher/Resources/double_pinyin.json | 3747 +-------------------
1 file changed, 1 insertion(+), 3746 deletions(-)
diff --git a/Flow.Launcher/Resources/double_pinyin.json b/Flow.Launcher/Resources/double_pinyin.json
index 6b8ae06c0..83972038f 100644
--- a/Flow.Launcher/Resources/double_pinyin.json
+++ b/Flow.Launcher/Resources/double_pinyin.json
@@ -1,3746 +1 @@
-{
- "XiaoHe": {
- "Lv": "lv",
- "Lve": "lt",
- "Lue": "lt",
- "Nv": "nv",
- "Nve": "nt",
- "Nue": "nt",
- "A": "aa",
- "O": "oo",
- "E": "ee",
- "Ai": "ai",
- "Ei": "ei",
- "Ao": "ao",
- "Ou": "ou",
- "An": "an",
- "En": "en",
- "Ang": "ah",
- "Eng": "eg",
- "Er": "er",
- "Yi": "yi",
- "Ya": "ya",
- "Yo": "yo",
- "Ye": "ye",
- "Yao": "yc",
- "You": "yz",
- "Yan": "yj",
- "Yin": "yb",
- "Yang": "yh",
- "Ying": "yk",
- "Wu": "wu",
- "Wa": "wa",
- "Wo": "wo",
- "Wai": "wd",
- "Wei": "ww",
- "Wan": "wj",
- "Wen": "wf",
- "Wang": "wh",
- "Weng": "wg",
- "Yu": "yu",
- "Yue": "yt",
- "Yuan": "yr",
- "Yun": "yy",
- "Yong": "ys",
- "Ba": "ba",
- "Bai": "bd",
- "Ban": "bj",
- "Bang": "bh",
- "Bao": "bc",
- "Bei": "bw",
- "Ben": "bf",
- "Beng": "bg",
- "Bi": "bi",
- "Bian": "bm",
- "Biang": "bl",
- "Biao": "bn",
- "Bie": "bp",
- "Bin": "bb",
- "Bing": "bk",
- "Bo": "bo",
- "Bu": "bu",
- "Ca": "ca",
- "Cai": "cd",
- "Can": "cj",
- "Cang": "ch",
- "Cao": "cc",
- "Ce": "ce",
- "Cen": "cf",
- "Ceng": "cg",
- "Cha": "ia",
- "Chai": "id",
- "Chan": "ij",
- "Chang": "ih",
- "Chao": "ic",
- "Che": "ie",
- "Chen": "if",
- "Cheng": "ig",
- "Chi": "ii",
- "Chong": "is",
- "Chou": "iz",
- "Chu": "iu",
- "Chua": "ix",
- "Chuai": "ik",
- "Chuan": "ir",
- "Chuang": "il",
- "Chui": "iv",
- "Chun": "iy",
- "Chuo": "io",
- "Ci": "ci",
- "Cong": "cs",
- "Cou": "cz",
- "Cu": "cu",
- "Cuan": "cr",
- "Cui": "cv",
- "Cun": "cy",
- "Cuo": "co",
- "Da": "da",
- "Dai": "dd",
- "Dan": "dj",
- "Dang": "dh",
- "Dao": "dc",
- "De": "de",
- "Dei": "dw",
- "Den": "df",
- "Deng": "dg",
- "Di": "di",
- "Dia": "dx",
- "Dian": "dm",
- "Diao": "dn",
- "Die": "dp",
- "Ding": "dk",
- "Diu": "dq",
- "Dong": "ds",
- "Dou": "dz",
- "Du": "du",
- "Duan": "dr",
- "Dui": "dv",
- "Dun": "dy",
- "Duo": "do",
- "Fa": "fa",
- "Fan": "fj",
- "Fang": "fh",
- "Fei": "fw",
- "Fen": "ff",
- "Feng": "fg",
- "Fiao": "fn",
- "Fo": "fo",
- "Fou": "fz",
- "Fu": "fu",
- "Ga": "ga",
- "Gai": "gd",
- "Gan": "gj",
- "Gang": "gh",
- "Gao": "gc",
- "Ge": "ge",
- "Gei": "gw",
- "Gen": "gf",
- "Geng": "gg",
- "Gong": "gs",
- "Gou": "gz",
- "Gu": "gu",
- "Gua": "gx",
- "Guai": "gk",
- "Guan": "gr",
- "Guang": "gl",
- "Gui": "gv",
- "Gun": "gy",
- "Guo": "go",
- "Ha": "ha",
- "Hai": "hd",
- "Han": "hj",
- "Hang": "hh",
- "Hao": "hc",
- "He": "he",
- "Hei": "hw",
- "Hen": "hf",
- "Heng": "hg",
- "Hong": "hs",
- "Hou": "hz",
- "Hu": "hu",
- "Hua": "hx",
- "Huai": "hk",
- "Huan": "hr",
- "Huang": "hl",
- "Hui": "hv",
- "Hun": "hy",
- "Huo": "ho",
- "Ji": "ji",
- "Jia": "jx",
- "Jian": "jm",
- "Jiang": "jl",
- "Jiao": "jn",
- "Jie": "jp",
- "Jin": "jb",
- "Jing": "jk",
- "Jiong": "js",
- "Jiu": "jq",
- "Ju": "ju",
- "Juan": "jr",
- "Jue": "jt",
- "Jun": "jy",
- "Ka": "ka",
- "Kai": "kd",
- "Kan": "kj",
- "Kang": "kh",
- "Kao": "kc",
- "Ke": "ke",
- "Ken": "kf",
- "Keng": "kg",
- "Kong": "ks",
- "Kou": "kz",
- "Ku": "ku",
- "Kua": "kx",
- "Kuai": "kk",
- "Kuan": "kr",
- "Kuang": "kl",
- "Kui": "kv",
- "Kun": "ky",
- "Kuo": "ko",
- "La": "la",
- "Lai": "ld",
- "Lan": "lj",
- "Lang": "lh",
- "Lao": "lc",
- "Le": "le",
- "Lei": "lw",
- "Leng": "lg",
- "Li": "li",
- "Lia": "lx",
- "Lian": "lm",
- "Liang": "ll",
- "Liao": "ln",
- "Lie": "lp",
- "Lin": "lb",
- "Ling": "lk",
- "Liu": "lq",
- "Lo": "lo",
- "Long": "ls",
- "Lou": "lz",
- "Lu": "lu",
- "Luan": "lr",
- "Lun": "ly",
- "Luo": "lo",
- "Ma": "ma",
- "Mai": "md",
- "Man": "mj",
- "Mang": "mh",
- "Mao": "mc",
- "Me": "me",
- "Mei": "mw",
- "Men": "mf",
- "Meng": "mg",
- "Mi": "mi",
- "Mian": "mm",
- "Miao": "mn",
- "Mie": "mp",
- "Min": "mb",
- "Ming": "mk",
- "Miu": "mq",
- "Mo": "mo",
- "Mou": "mz",
- "Mu": "mu",
- "Na": "na",
- "Nai": "nd",
- "Nan": "nj",
- "Nang": "nh",
- "Nao": "nc",
- "Ne": "ne",
- "Nei": "nw",
- "Nen": "nf",
- "Neng": "ng",
- "Ni": "ni",
- "Nian": "nm",
- "Niang": "nl",
- "Niao": "nn",
- "Nie": "np",
- "Nin": "nb",
- "Ning": "nk",
- "Niu": "nq",
- "Nong": "ns",
- "Nou": "nz",
- "Nu": "nu",
- "Nuan": "nr",
- "Nun": "ny",
- "Nuo": "no",
- "Pa": "pa",
- "Pai": "pd",
- "Pan": "pj",
- "Pang": "ph",
- "Pao": "pc",
- "Pei": "pw",
- "Pen": "pf",
- "Peng": "pg",
- "Pi": "pi",
- "Pian": "pm",
- "Piao": "pn",
- "Pie": "pp",
- "Pin": "pb",
- "Ping": "pk",
- "Po": "po",
- "Pou": "pz",
- "Pu": "pu",
- "Qi": "qi",
- "Qia": "qx",
- "Qian": "qm",
- "Qiang": "ql",
- "Qiao": "qn",
- "Qie": "qp",
- "Qin": "qb",
- "Qing": "qk",
- "Qiong": "qs",
- "Qiu": "qq",
- "Qu": "qu",
- "Quan": "qr",
- "Que": "qt",
- "Qun": "qy",
- "Ran": "rj",
- "Rang": "rh",
- "Rao": "rc",
- "Re": "re",
- "Ren": "rf",
- "Reng": "rg",
- "Ri": "ri",
- "Rong": "rs",
- "Rou": "rz",
- "Ru": "ru",
- "Rua": "rx",
- "Ruan": "rr",
- "Rui": "rv",
- "Run": "ry",
- "Ruo": "ro",
- "Sa": "sa",
- "Sai": "sd",
- "San": "sj",
- "Sang": "sh",
- "Sao": "sc",
- "Se": "se",
- "Sen": "sf",
- "Seng": "sg",
- "Sha": "ua",
- "Shai": "ud",
- "Shan": "uj",
- "Shang": "uh",
- "Shao": "uc",
- "She": "ue",
- "Shei": "uw",
- "Shen": "uf",
- "Sheng": "ug",
- "Shi": "ui",
- "Shou": "uz",
- "Shu": "uu",
- "Shua": "ux",
- "Shuai": "uk",
- "Shuan": "ur",
- "Shuang": "ul",
- "Shui": "uv",
- "Shun": "uy",
- "Shuo": "uo",
- "Si": "si",
- "Song": "ss",
- "Sou": "sz",
- "Su": "su",
- "Suan": "sr",
- "Sui": "sv",
- "Sun": "sy",
- "Suo": "so",
- "Ta": "ta",
- "Tai": "td",
- "Tan": "tj",
- "Tang": "th",
- "Tao": "tc",
- "Te": "te",
- "Tei": "tw",
- "Teng": "tg",
- "Ti": "ti",
- "Tian": "tm",
- "Tiao": "tn",
- "Tie": "tp",
- "Ting": "tk",
- "Tong": "ts",
- "Tou": "tz",
- "Tu": "tu",
- "Tuan": "tr",
- "Tui": "tv",
- "Tun": "ty",
- "Tuo": "to",
- "Xi": "xi",
- "Xia": "xx",
- "Xian": "xm",
- "Xiang": "xl",
- "Xiao": "xn",
- "Xie": "xp",
- "Xin": "xb",
- "Xing": "xk",
- "Xiong": "xs",
- "Xiu": "xq",
- "Xu": "xu",
- "Xuan": "xr",
- "Xue": "xt",
- "Xun": "xy",
- "Za": "za",
- "Zai": "zd",
- "Zan": "zj",
- "Zang": "zh",
- "Zao": "zc",
- "Ze": "ze",
- "Zei": "zw",
- "Zen": "zf",
- "Zeng": "zg",
- "Zha": "va",
- "Zhai": "vd",
- "Zhan": "vj",
- "Zhang": "vh",
- "Zhao": "vc",
- "Zhe": "ve",
- "Zhen": "vf",
- "Zheng": "vg",
- "Zhi": "vi",
- "Zhong": "vs",
- "Zhou": "vz",
- "Zhu": "vu",
- "Zhua": "vx",
- "Zhuai": "vk",
- "Zhuan": "vr",
- "Zhuang": "vl",
- "Zhui": "vv",
- "Zhun": "vy",
- "Zhuo": "vo",
- "Zi": "zi",
- "Zong": "zs",
- "Zou": "zz",
- "Zu": "zu",
- "Zuan": "zr",
- "Zui": "zv",
- "Zun": "zy",
- "Zuo": "zo"
- },
- "ZiRanMa": {
- "Lv": "lv",
- "Lve": "lt",
- "Lue": "lt",
- "Nv": "nv",
- "Nve": "nt",
- "Nue": "nt",
- "A": "aa",
- "O": "oo",
- "E": "ee",
- "Ai": "ai",
- "Ei": "ei",
- "Ao": "ao",
- "Ou": "ou",
- "An": "an",
- "En": "en",
- "Ang": "ah",
- "Eng": "eg",
- "Er": "er",
- "Yi": "yi",
- "Ya": "ya",
- "Yo": "yo",
- "Ye": "ye",
- "Yao": "yk",
- "You": "yb",
- "Yan": "yj",
- "Yin": "yn",
- "Yang": "yh",
- "Ying": "yy",
- "Wu": "wu",
- "Wa": "wa",
- "Wo": "wo",
- "Wai": "wl",
- "Wei": "wz",
- "Wan": "wj",
- "Wen": "wf",
- "Wang": "wh",
- "Weng": "wg",
- "Yu": "yu",
- "Yue": "yt",
- "Yuan": "yr",
- "Yun": "yp",
- "Yong": "ys",
- "Ba": "ba",
- "Bai": "bl",
- "Ban": "bj",
- "Bang": "bh",
- "Bao": "bk",
- "Bei": "bz",
- "Ben": "bf",
- "Beng": "bg",
- "Bi": "bi",
- "Bian": "bm",
- "Biang": "bd",
- "Biao": "bc",
- "Bie": "bx",
- "Bin": "bn",
- "Bing": "by",
- "Bo": "bo",
- "Bu": "bu",
- "Ca": "ca",
- "Cai": "cl",
- "Can": "cj",
- "Cang": "ch",
- "Cao": "ck",
- "Ce": "ce",
- "Cen": "cf",
- "Ceng": "cg",
- "Cha": "ia",
- "Chai": "il",
- "Chan": "ij",
- "Chang": "ih",
- "Chao": "ik",
- "Che": "ie",
- "Chen": "if",
- "Cheng": "ig",
- "Chi": "ii",
- "Chong": "is",
- "Chou": "ib",
- "Chu": "iu",
- "Chua": "iw",
- "Chuai": "iy",
- "Chuan": "ir",
- "Chuang": "id",
- "Chui": "iv",
- "Chun": "ip",
- "Chuo": "io",
- "Ci": "ci",
- "Cong": "cs",
- "Cou": "cb",
- "Cu": "cu",
- "Cuan": "cr",
- "Cui": "cv",
- "Cun": "cp",
- "Cuo": "co",
- "Da": "da",
- "Dai": "dl",
- "Dan": "dj",
- "Dang": "dh",
- "Dao": "dk",
- "De": "de",
- "Dei": "dz",
- "Den": "df",
- "Deng": "dg",
- "Di": "di",
- "Dia": "dw",
- "Dian": "dm",
- "Diao": "dc",
- "Die": "dx",
- "Ding": "dy",
- "Diu": "dq",
- "Dong": "ds",
- "Dou": "db",
- "Du": "du",
- "Duan": "dr",
- "Dui": "dv",
- "Dun": "dp",
- "Duo": "do",
- "Fa": "fa",
- "Fan": "fj",
- "Fang": "fh",
- "Fei": "fz",
- "Fen": "ff",
- "Feng": "fg",
- "Fiao": "fc",
- "Fo": "fo",
- "Fou": "fb",
- "Fu": "fu",
- "Ga": "ga",
- "Gai": "gl",
- "Gan": "gj",
- "Gang": "gh",
- "Gao": "gk",
- "Ge": "ge",
- "Gei": "gz",
- "Gen": "gf",
- "Geng": "gg",
- "Gong": "gs",
- "Gou": "gb",
- "Gu": "gu",
- "Gua": "gw",
- "Guai": "gy",
- "Guan": "gr",
- "Guang": "gd",
- "Gui": "gv",
- "Gun": "gp",
- "Guo": "go",
- "Ha": "ha",
- "Hai": "hl",
- "Han": "hj",
- "Hang": "hh",
- "Hao": "hk",
- "He": "he",
- "Hei": "hz",
- "Hen": "hf",
- "Heng": "hg",
- "Hong": "hs",
- "Hou": "hb",
- "Hu": "hu",
- "Hua": "hw",
- "Huai": "hy",
- "Huan": "hr",
- "Huang": "hd",
- "Hui": "hv",
- "Hun": "hp",
- "Huo": "ho",
- "Ji": "ji",
- "Jia": "jw",
- "Jian": "jm",
- "Jiang": "jd",
- "Jiao": "jc",
- "Jie": "jx",
- "Jin": "jn",
- "Jing": "jy",
- "Jiong": "js",
- "Jiu": "jq",
- "Ju": "ju",
- "Juan": "jr",
- "Jue": "jt",
- "Jun": "jp",
- "Ka": "ka",
- "Kai": "kl",
- "Kan": "kj",
- "Kang": "kh",
- "Kao": "kk",
- "Ke": "ke",
- "Ken": "kf",
- "Keng": "kg",
- "Kong": "ks",
- "Kou": "kb",
- "Ku": "ku",
- "Kua": "kw",
- "Kuai": "ky",
- "Kuan": "kr",
- "Kuang": "kd",
- "Kui": "kv",
- "Kun": "kp",
- "Kuo": "ko",
- "La": "la",
- "Lai": "ll",
- "Lan": "lj",
- "Lang": "lh",
- "Lao": "lk",
- "Le": "le",
- "Lei": "lz",
- "Leng": "lg",
- "Li": "li",
- "Lia": "lw",
- "Lian": "lm",
- "Liang": "ld",
- "Liao": "lc",
- "Lie": "lx",
- "Lin": "ln",
- "Ling": "ly",
- "Liu": "lq",
- "Lo": "lo",
- "Long": "ls",
- "Lou": "lb",
- "Lu": "lu",
- "Luan": "lr",
- "Lun": "lp",
- "Luo": "lo",
- "Ma": "ma",
- "Mai": "ml",
- "Man": "mj",
- "Mang": "mh",
- "Mao": "mk",
- "Me": "me",
- "Mei": "mz",
- "Men": "mf",
- "Meng": "mg",
- "Mi": "mi",
- "Mian": "mm",
- "Miao": "mc",
- "Mie": "mx",
- "Min": "mn",
- "Ming": "my",
- "Miu": "mq",
- "Mo": "mo",
- "Mou": "mb",
- "Mu": "mu",
- "Na": "na",
- "Nai": "nl",
- "Nan": "nj",
- "Nang": "nh",
- "Nao": "nk",
- "Ne": "ne",
- "Nei": "nz",
- "Nen": "nf",
- "Neng": "ng",
- "Ni": "ni",
- "Nian": "nm",
- "Niang": "nd",
- "Niao": "nc",
- "Nie": "nx",
- "Nin": "nn",
- "Ning": "ny",
- "Niu": "nq",
- "Nong": "ns",
- "Nou": "nb",
- "Nu": "nu",
- "Nuan": "nr",
- "Nun": "np",
- "Nuo": "no",
- "Pa": "pa",
- "Pai": "pl",
- "Pan": "pj",
- "Pang": "ph",
- "Pao": "pk",
- "Pei": "pz",
- "Pen": "pf",
- "Peng": "pg",
- "Pi": "pi",
- "Pian": "pm",
- "Piao": "pc",
- "Pie": "px",
- "Pin": "pn",
- "Ping": "py",
- "Po": "po",
- "Pou": "pb",
- "Pu": "pu",
- "Qi": "qi",
- "Qia": "qw",
- "Qian": "qm",
- "Qiang": "qd",
- "Qiao": "qc",
- "Qie": "qx",
- "Qin": "qn",
- "Qing": "qy",
- "Qiong": "qs",
- "Qiu": "qq",
- "Qu": "qu",
- "Quan": "qr",
- "Que": "qt",
- "Qun": "qp",
- "Ran": "rj",
- "Rang": "rh",
- "Rao": "rk",
- "Re": "re",
- "Ren": "rf",
- "Reng": "rg",
- "Ri": "ri",
- "Rong": "rs",
- "Rou": "rb",
- "Ru": "ru",
- "Rua": "rw",
- "Ruan": "rr",
- "Rui": "rv",
- "Run": "rp",
- "Ruo": "ro",
- "Sa": "sa",
- "Sai": "sl",
- "San": "sj",
- "Sang": "sh",
- "Sao": "sk",
- "Se": "se",
- "Sen": "sf",
- "Seng": "sg",
- "Sha": "ua",
- "Shai": "ul",
- "Shan": "uj",
- "Shang": "uh",
- "Shao": "uk",
- "She": "ue",
- "Shei": "uz",
- "Shen": "uf",
- "Sheng": "ug",
- "Shi": "ui",
- "Shou": "ub",
- "Shu": "uu",
- "Shua": "uw",
- "Shuai": "uy",
- "Shuan": "ur",
- "Shuang": "ud",
- "Shui": "uv",
- "Shun": "up",
- "Shuo": "uo",
- "Si": "si",
- "Song": "ss",
- "Sou": "sb",
- "Su": "su",
- "Suan": "sr",
- "Sui": "sv",
- "Sun": "sp",
- "Suo": "so",
- "Ta": "ta",
- "Tai": "tl",
- "Tan": "tj",
- "Tang": "th",
- "Tao": "tk",
- "Te": "te",
- "Tei": "tz",
- "Teng": "tg",
- "Ti": "ti",
- "Tian": "tm",
- "Tiao": "tc",
- "Tie": "tx",
- "Ting": "ty",
- "Tong": "ts",
- "Tou": "tb",
- "Tu": "tu",
- "Tuan": "tr",
- "Tui": "tv",
- "Tun": "tp",
- "Tuo": "to",
- "Xi": "xi",
- "Xia": "xw",
- "Xian": "xm",
- "Xiang": "xd",
- "Xiao": "xc",
- "Xie": "xx",
- "Xin": "xn",
- "Xing": "xy",
- "Xiong": "xs",
- "Xiu": "xq",
- "Xu": "xu",
- "Xuan": "xr",
- "Xue": "xt",
- "Xun": "xp",
- "Za": "za",
- "Zai": "zl",
- "Zan": "zj",
- "Zang": "zh",
- "Zao": "zk",
- "Ze": "ze",
- "Zei": "zz",
- "Zen": "zf",
- "Zeng": "zg",
- "Zha": "va",
- "Zhai": "vl",
- "Zhan": "vj",
- "Zhang": "vh",
- "Zhao": "vk",
- "Zhe": "ve",
- "Zhen": "vf",
- "Zheng": "vg",
- "Zhi": "vi",
- "Zhong": "vs",
- "Zhou": "vb",
- "Zhu": "vu",
- "Zhua": "vw",
- "Zhuai": "vy",
- "Zhuan": "vr",
- "Zhuang": "vd",
- "Zhui": "vv",
- "Zhun": "vp",
- "Zhuo": "vo",
- "Zi": "zi",
- "Zong": "zs",
- "Zou": "zb",
- "Zu": "zu",
- "Zuan": "zr",
- "Zui": "zv",
- "Zun": "zp",
- "Zuo": "zo"
- },
- "WeiRuan": {
- "Lv": "ly",
- "Lve": "lt",
- "Lue": "lt",
- "Nv": "ny",
- "Nve": "nt",
- "Nue": "nt",
- "A": "oa",
- "O": "oo",
- "E": "oe",
- "Ai": "ol",
- "Ei": "oz",
- "Ao": "ok",
- "Ou": "ob",
- "An": "oj",
- "En": "of",
- "Ang": "oh",
- "Eng": "og",
- "Er": "or",
- "Yi": "yi",
- "Ya": "ya",
- "Yo": "yo",
- "Ye": "ye",
- "Yao": "yk",
- "You": "yb",
- "Yan": "yj",
- "Yin": "yn",
- "Yang": "yh",
- "Ying": "y;",
- "Wu": "wu",
- "Wa": "wa",
- "Wo": "wo",
- "Wai": "wl",
- "Wei": "wz",
- "Wan": "wj",
- "Wen": "wf",
- "Wang": "wh",
- "Weng": "wg",
- "Yu": "yu",
- "Yue": "yt",
- "Yuan": "yr",
- "Yun": "yp",
- "Yong": "ys",
- "Ba": "ba",
- "Bai": "bl",
- "Ban": "bj",
- "Bang": "bh",
- "Bao": "bk",
- "Bei": "bz",
- "Ben": "bf",
- "Beng": "bg",
- "Bi": "bi",
- "Bian": "bm",
- "Biang": "bd",
- "Biao": "bc",
- "Bie": "bx",
- "Bin": "bn",
- "Bing": "b;",
- "Bo": "bo",
- "Bu": "bu",
- "Ca": "ca",
- "Cai": "cl",
- "Can": "cj",
- "Cang": "ch",
- "Cao": "ck",
- "Ce": "ce",
- "Cen": "cf",
- "Ceng": "cg",
- "Cha": "ia",
- "Chai": "il",
- "Chan": "ij",
- "Chang": "ih",
- "Chao": "ik",
- "Che": "ie",
- "Chen": "if",
- "Cheng": "ig",
- "Chi": "ii",
- "Chong": "is",
- "Chou": "ib",
- "Chu": "iu",
- "Chua": "iw",
- "Chuai": "iy",
- "Chuan": "ir",
- "Chuang": "id",
- "Chui": "iv",
- "Chun": "ip",
- "Chuo": "io",
- "Ci": "ci",
- "Cong": "cs",
- "Cou": "cb",
- "Cu": "cu",
- "Cuan": "cr",
- "Cui": "cv",
- "Cun": "cp",
- "Cuo": "co",
- "Da": "da",
- "Dai": "dl",
- "Dan": "dj",
- "Dang": "dh",
- "Dao": "dk",
- "De": "de",
- "Dei": "dz",
- "Den": "df",
- "Deng": "dg",
- "Di": "di",
- "Dia": "dw",
- "Dian": "dm",
- "Diao": "dc",
- "Die": "dx",
- "Ding": "d;",
- "Diu": "dq",
- "Dong": "ds",
- "Dou": "db",
- "Du": "du",
- "Duan": "dr",
- "Dui": "dv",
- "Dun": "dp",
- "Duo": "do",
- "Fa": "fa",
- "Fan": "fj",
- "Fang": "fh",
- "Fei": "fz",
- "Fen": "ff",
- "Feng": "fg",
- "Fiao": "fc",
- "Fo": "fo",
- "Fou": "fb",
- "Fu": "fu",
- "Ga": "ga",
- "Gai": "gl",
- "Gan": "gj",
- "Gang": "gh",
- "Gao": "gk",
- "Ge": "ge",
- "Gei": "gz",
- "Gen": "gf",
- "Geng": "gg",
- "Gong": "gs",
- "Gou": "gb",
- "Gu": "gu",
- "Gua": "gw",
- "Guai": "gy",
- "Guan": "gr",
- "Guang": "gd",
- "Gui": "gv",
- "Gun": "gp",
- "Guo": "go",
- "Ha": "ha",
- "Hai": "hl",
- "Han": "hj",
- "Hang": "hh",
- "Hao": "hk",
- "He": "he",
- "Hei": "hz",
- "Hen": "hf",
- "Heng": "hg",
- "Hong": "hs",
- "Hou": "hb",
- "Hu": "hu",
- "Hua": "hw",
- "Huai": "hy",
- "Huan": "hr",
- "Huang": "hd",
- "Hui": "hv",
- "Hun": "hp",
- "Huo": "ho",
- "Ji": "ji",
- "Jia": "jw",
- "Jian": "jm",
- "Jiang": "jd",
- "Jiao": "jc",
- "Jie": "jx",
- "Jin": "jn",
- "Jing": "j;",
- "Jiong": "js",
- "Jiu": "jq",
- "Ju": "ju",
- "Juan": "jr",
- "Jue": "jt",
- "Jun": "jp",
- "Ka": "ka",
- "Kai": "kl",
- "Kan": "kj",
- "Kang": "kh",
- "Kao": "kk",
- "Ke": "ke",
- "Ken": "kf",
- "Keng": "kg",
- "Kong": "ks",
- "Kou": "kb",
- "Ku": "ku",
- "Kua": "kw",
- "Kuai": "ky",
- "Kuan": "kr",
- "Kuang": "kd",
- "Kui": "kv",
- "Kun": "kp",
- "Kuo": "ko",
- "La": "la",
- "Lai": "ll",
- "Lan": "lj",
- "Lang": "lh",
- "Lao": "lk",
- "Le": "le",
- "Lei": "lz",
- "Leng": "lg",
- "Li": "li",
- "Lia": "lw",
- "Lian": "lm",
- "Liang": "ld",
- "Liao": "lc",
- "Lie": "lx",
- "Lin": "ln",
- "Ling": "l;",
- "Liu": "lq",
- "Lo": "lo",
- "Long": "ls",
- "Lou": "lb",
- "Lu": "lu",
- "Luan": "lr",
- "Lun": "lp",
- "Luo": "lo",
- "Ma": "ma",
- "Mai": "ml",
- "Man": "mj",
- "Mang": "mh",
- "Mao": "mk",
- "Me": "me",
- "Mei": "mz",
- "Men": "mf",
- "Meng": "mg",
- "Mi": "mi",
- "Mian": "mm",
- "Miao": "mc",
- "Mie": "mx",
- "Min": "mn",
- "Ming": "m;",
- "Miu": "mq",
- "Mo": "mo",
- "Mou": "mb",
- "Mu": "mu",
- "Na": "na",
- "Nai": "nl",
- "Nan": "nj",
- "Nang": "nh",
- "Nao": "nk",
- "Ne": "ne",
- "Nei": "nz",
- "Nen": "nf",
- "Neng": "ng",
- "Ni": "ni",
- "Nian": "nm",
- "Niang": "nd",
- "Niao": "nc",
- "Nie": "nx",
- "Nin": "nn",
- "Ning": "n;",
- "Niu": "nq",
- "Nong": "ns",
- "Nou": "nb",
- "Nu": "nu",
- "Nuan": "nr",
- "Nun": "np",
- "Nuo": "no",
- "Pa": "pa",
- "Pai": "pl",
- "Pan": "pj",
- "Pang": "ph",
- "Pao": "pk",
- "Pei": "pz",
- "Pen": "pf",
- "Peng": "pg",
- "Pi": "pi",
- "Pian": "pm",
- "Piao": "pc",
- "Pie": "px",
- "Pin": "pn",
- "Ping": "p;",
- "Po": "po",
- "Pou": "pb",
- "Pu": "pu",
- "Qi": "qi",
- "Qia": "qw",
- "Qian": "qm",
- "Qiang": "qd",
- "Qiao": "qc",
- "Qie": "qx",
- "Qin": "qn",
- "Qing": "q;",
- "Qiong": "qs",
- "Qiu": "qq",
- "Qu": "qu",
- "Quan": "qr",
- "Que": "qt",
- "Qun": "qp",
- "Ran": "rj",
- "Rang": "rh",
- "Rao": "rk",
- "Re": "re",
- "Ren": "rf",
- "Reng": "rg",
- "Ri": "ri",
- "Rong": "rs",
- "Rou": "rb",
- "Ru": "ru",
- "Rua": "rw",
- "Ruan": "rr",
- "Rui": "rv",
- "Run": "rp",
- "Ruo": "ro",
- "Sa": "sa",
- "Sai": "sl",
- "San": "sj",
- "Sang": "sh",
- "Sao": "sk",
- "Se": "se",
- "Sen": "sf",
- "Seng": "sg",
- "Sha": "ua",
- "Shai": "ul",
- "Shan": "uj",
- "Shang": "uh",
- "Shao": "uk",
- "She": "ue",
- "Shei": "uz",
- "Shen": "uf",
- "Sheng": "ug",
- "Shi": "ui",
- "Shou": "ub",
- "Shu": "uu",
- "Shua": "uw",
- "Shuai": "uy",
- "Shuan": "ur",
- "Shuang": "ud",
- "Shui": "uv",
- "Shun": "up",
- "Shuo": "uo",
- "Si": "si",
- "Song": "ss",
- "Sou": "sb",
- "Su": "su",
- "Suan": "sr",
- "Sui": "sv",
- "Sun": "sp",
- "Suo": "so",
- "Ta": "ta",
- "Tai": "tl",
- "Tan": "tj",
- "Tang": "th",
- "Tao": "tk",
- "Te": "te",
- "Tei": "tz",
- "Teng": "tg",
- "Ti": "ti",
- "Tian": "tm",
- "Tiao": "tc",
- "Tie": "tx",
- "Ting": "t;",
- "Tong": "ts",
- "Tou": "tb",
- "Tu": "tu",
- "Tuan": "tr",
- "Tui": "tv",
- "Tun": "tp",
- "Tuo": "to",
- "Xi": "xi",
- "Xia": "xw",
- "Xian": "xm",
- "Xiang": "xd",
- "Xiao": "xc",
- "Xie": "xx",
- "Xin": "xn",
- "Xing": "x;",
- "Xiong": "xs",
- "Xiu": "xq",
- "Xu": "xu",
- "Xuan": "xr",
- "Xue": "xt",
- "Xun": "xp",
- "Za": "za",
- "Zai": "zl",
- "Zan": "zj",
- "Zang": "zh",
- "Zao": "zk",
- "Ze": "ze",
- "Zei": "zz",
- "Zen": "zf",
- "Zeng": "zg",
- "Zha": "va",
- "Zhai": "vl",
- "Zhan": "vj",
- "Zhang": "vh",
- "Zhao": "vk",
- "Zhe": "ve",
- "Zhen": "vf",
- "Zheng": "vg",
- "Zhi": "vi",
- "Zhong": "vs",
- "Zhou": "vb",
- "Zhu": "vu",
- "Zhua": "vw",
- "Zhuai": "vy",
- "Zhuan": "vr",
- "Zhuang": "vd",
- "Zhui": "vv",
- "Zhun": "vp",
- "Zhuo": "vo",
- "Zi": "zi",
- "Zong": "zs",
- "Zou": "zb",
- "Zu": "zu",
- "Zuan": "zr",
- "Zui": "zv",
- "Zun": "zp",
- "Zuo": "zo"
- },
- "ZhiNengABC": {
- "Lv": "lv",
- "Lve": "lm",
- "Lue": "lm",
- "Nv": "nv",
- "Nve": "nm",
- "Nue": "nm",
- "A": "oa",
- "O": "oo",
- "E": "oe",
- "Ai": "ol",
- "Ei": "oq",
- "Ao": "ok",
- "Ou": "ob",
- "An": "oj",
- "En": "of",
- "Ang": "oh",
- "Eng": "og",
- "Er": "or",
- "Yi": "yi",
- "Ya": "ya",
- "Yo": "yo",
- "Ye": "ye",
- "Yao": "yk",
- "You": "yb",
- "Yan": "yj",
- "Yin": "yc",
- "Yang": "yh",
- "Ying": "yy",
- "Wu": "wu",
- "Wa": "wa",
- "Wo": "wo",
- "Wai": "wl",
- "Wei": "wq",
- "Wan": "wj",
- "Wen": "wf",
- "Wang": "wh",
- "Weng": "wg",
- "Yu": "yu",
- "Yue": "ym",
- "Yuan": "yp",
- "Yun": "yn",
- "Yong": "ys",
- "Ba": "ba",
- "Bai": "bl",
- "Ban": "bj",
- "Bang": "bh",
- "Bao": "bk",
- "Bei": "bq",
- "Ben": "bf",
- "Beng": "bg",
- "Bi": "bi",
- "Bian": "bw",
- "Biang": "bt",
- "Biao": "bz",
- "Bie": "bx",
- "Bin": "bc",
- "Bing": "by",
- "Bo": "bo",
- "Bu": "bu",
- "Ca": "ca",
- "Cai": "cl",
- "Can": "cj",
- "Cang": "ch",
- "Cao": "ck",
- "Ce": "ce",
- "Cen": "cf",
- "Ceng": "cg",
- "Cha": "ea",
- "Chai": "el",
- "Chan": "ej",
- "Chang": "eh",
- "Chao": "ek",
- "Che": "ee",
- "Chen": "ef",
- "Cheng": "eg",
- "Chi": "ei",
- "Chong": "es",
- "Chou": "eb",
- "Chu": "eu",
- "Chua": "ed",
- "Chuai": "ec",
- "Chuan": "ep",
- "Chuang": "et",
- "Chui": "em",
- "Chun": "en",
- "Chuo": "eo",
- "Ci": "ci",
- "Cong": "cs",
- "Cou": "cb",
- "Cu": "cu",
- "Cuan": "cp",
- "Cui": "cm",
- "Cun": "cn",
- "Cuo": "co",
- "Da": "da",
- "Dai": "dl",
- "Dan": "dj",
- "Dang": "dh",
- "Dao": "dk",
- "De": "de",
- "Dei": "dq",
- "Den": "df",
- "Deng": "dg",
- "Di": "di",
- "Dia": "dd",
- "Dian": "dw",
- "Diao": "dz",
- "Die": "dx",
- "Ding": "dy",
- "Diu": "dr",
- "Dong": "ds",
- "Dou": "db",
- "Du": "du",
- "Duan": "dp",
- "Dui": "dm",
- "Dun": "dn",
- "Duo": "do",
- "Fa": "fa",
- "Fan": "fj",
- "Fang": "fh",
- "Fei": "fq",
- "Fen": "ff",
- "Feng": "fg",
- "Fiao": "fz",
- "Fo": "fo",
- "Fou": "fb",
- "Fu": "fu",
- "Ga": "ga",
- "Gai": "gl",
- "Gan": "gj",
- "Gang": "gh",
- "Gao": "gk",
- "Ge": "ge",
- "Gei": "gq",
- "Gen": "gf",
- "Geng": "gg",
- "Gong": "gs",
- "Gou": "gb",
- "Gu": "gu",
- "Gua": "gd",
- "Guai": "gc",
- "Guan": "gp",
- "Guang": "gt",
- "Gui": "gm",
- "Gun": "gn",
- "Guo": "go",
- "Ha": "ha",
- "Hai": "hl",
- "Han": "hj",
- "Hang": "hh",
- "Hao": "hk",
- "He": "he",
- "Hei": "hq",
- "Hen": "hf",
- "Heng": "hg",
- "Hong": "hs",
- "Hou": "hb",
- "Hu": "hu",
- "Hua": "hd",
- "Huai": "hc",
- "Huan": "hp",
- "Huang": "ht",
- "Hui": "hm",
- "Hun": "hn",
- "Huo": "ho",
- "Ji": "ji",
- "Jia": "jd",
- "Jian": "jw",
- "Jiang": "jt",
- "Jiao": "jz",
- "Jie": "jx",
- "Jin": "jc",
- "Jing": "jy",
- "Jiong": "js",
- "Jiu": "jr",
- "Ju": "ju",
- "Juan": "jp",
- "Jue": "jm",
- "Jun": "jn",
- "Ka": "ka",
- "Kai": "kl",
- "Kan": "kj",
- "Kang": "kh",
- "Kao": "kk",
- "Ke": "ke",
- "Ken": "kf",
- "Keng": "kg",
- "Kong": "ks",
- "Kou": "kb",
- "Ku": "ku",
- "Kua": "kd",
- "Kuai": "kc",
- "Kuan": "kp",
- "Kuang": "kt",
- "Kui": "km",
- "Kun": "kn",
- "Kuo": "ko",
- "La": "la",
- "Lai": "ll",
- "Lan": "lj",
- "Lang": "lh",
- "Lao": "lk",
- "Le": "le",
- "Lei": "lq",
- "Leng": "lg",
- "Li": "li",
- "Lia": "ld",
- "Lian": "lw",
- "Liang": "lt",
- "Liao": "lz",
- "Lie": "lx",
- "Lin": "lc",
- "Ling": "ly",
- "Liu": "lr",
- "Lo": "lo",
- "Long": "ls",
- "Lou": "lb",
- "Lu": "lu",
- "Luan": "lp",
- "Lun": "ln",
- "Luo": "lo",
- "Ma": "ma",
- "Mai": "ml",
- "Man": "mj",
- "Mang": "mh",
- "Mao": "mk",
- "Me": "me",
- "Mei": "mq",
- "Men": "mf",
- "Meng": "mg",
- "Mi": "mi",
- "Mian": "mw",
- "Miao": "mz",
- "Mie": "mx",
- "Min": "mc",
- "Ming": "my",
- "Miu": "mr",
- "Mo": "mo",
- "Mou": "mb",
- "Mu": "mu",
- "Na": "na",
- "Nai": "nl",
- "Nan": "nj",
- "Nang": "nh",
- "Nao": "nk",
- "Ne": "ne",
- "Nei": "nq",
- "Nen": "nf",
- "Neng": "ng",
- "Ni": "ni",
- "Nian": "nw",
- "Niang": "nt",
- "Niao": "nz",
- "Nie": "nx",
- "Nin": "nc",
- "Ning": "ny",
- "Niu": "nr",
- "Nong": "ns",
- "Nou": "nb",
- "Nu": "nu",
- "Nuan": "np",
- "Nun": "nn",
- "Nuo": "no",
- "Pa": "pa",
- "Pai": "pl",
- "Pan": "pj",
- "Pang": "ph",
- "Pao": "pk",
- "Pei": "pq",
- "Pen": "pf",
- "Peng": "pg",
- "Pi": "pi",
- "Pian": "pw",
- "Piao": "pz",
- "Pie": "px",
- "Pin": "pc",
- "Ping": "py",
- "Po": "po",
- "Pou": "pb",
- "Pu": "pu",
- "Qi": "qi",
- "Qia": "qd",
- "Qian": "qw",
- "Qiang": "qt",
- "Qiao": "qz",
- "Qie": "qx",
- "Qin": "qc",
- "Qing": "qy",
- "Qiong": "qs",
- "Qiu": "qr",
- "Qu": "qu",
- "Quan": "qp",
- "Que": "qm",
- "Qun": "qn",
- "Ran": "rj",
- "Rang": "rh",
- "Rao": "rk",
- "Re": "re",
- "Ren": "rf",
- "Reng": "rg",
- "Ri": "ri",
- "Rong": "rs",
- "Rou": "rb",
- "Ru": "ru",
- "Rua": "rd",
- "Ruan": "rp",
- "Rui": "rm",
- "Run": "rn",
- "Ruo": "ro",
- "Sa": "sa",
- "Sai": "sl",
- "San": "sj",
- "Sang": "sh",
- "Sao": "sk",
- "Se": "se",
- "Sen": "sf",
- "Seng": "sg",
- "Sha": "va",
- "Shai": "vl",
- "Shan": "vj",
- "Shang": "vh",
- "Shao": "vk",
- "She": "ve",
- "Shei": "vq",
- "Shen": "vf",
- "Sheng": "vg",
- "Shi": "vi",
- "Shou": "vb",
- "Shu": "vu",
- "Shua": "vd",
- "Shuai": "vc",
- "Shuan": "vp",
- "Shuang": "vt",
- "Shui": "vm",
- "Shun": "vn",
- "Shuo": "vo",
- "Si": "si",
- "Song": "ss",
- "Sou": "sb",
- "Su": "su",
- "Suan": "sp",
- "Sui": "sm",
- "Sun": "sn",
- "Suo": "so",
- "Ta": "ta",
- "Tai": "tl",
- "Tan": "tj",
- "Tang": "th",
- "Tao": "tk",
- "Te": "te",
- "Tei": "tq",
- "Teng": "tg",
- "Ti": "ti",
- "Tian": "tw",
- "Tiao": "tz",
- "Tie": "tx",
- "Ting": "ty",
- "Tong": "ts",
- "Tou": "tb",
- "Tu": "tu",
- "Tuan": "tp",
- "Tui": "tm",
- "Tun": "tn",
- "Tuo": "to",
- "Xi": "xi",
- "Xia": "xd",
- "Xian": "xw",
- "Xiang": "xt",
- "Xiao": "xz",
- "Xie": "xx",
- "Xin": "xc",
- "Xing": "xy",
- "Xiong": "xs",
- "Xiu": "xr",
- "Xu": "xu",
- "Xuan": "xp",
- "Xue": "xm",
- "Xun": "xn",
- "Za": "za",
- "Zai": "zl",
- "Zan": "zj",
- "Zang": "zh",
- "Zao": "zk",
- "Ze": "ze",
- "Zei": "zq",
- "Zen": "zf",
- "Zeng": "zg",
- "Zha": "aa",
- "Zhai": "al",
- "Zhan": "aj",
- "Zhang": "ah",
- "Zhao": "ak",
- "Zhe": "ae",
- "Zhen": "af",
- "Zheng": "ag",
- "Zhi": "ai",
- "Zhong": "as",
- "Zhou": "ab",
- "Zhu": "au",
- "Zhua": "ad",
- "Zhuai": "ac",
- "Zhuan": "ap",
- "Zhuang": "at",
- "Zhui": "am",
- "Zhun": "an",
- "Zhuo": "ao",
- "Zi": "zi",
- "Zong": "zs",
- "Zou": "zb",
- "Zu": "zu",
- "Zuan": "zp",
- "Zui": "zm",
- "Zun": "zn",
- "Zuo": "zo"
- },
- "ZiGuangPinYin": {
- "Lv": "lv",
- "Lve": "ln",
- "Lue": "ln",
- "Nv": "nv",
- "Nve": "nn",
- "Nue": "nn",
- "A": "oa",
- "O": "oo",
- "E": "oe",
- "Ai": "op",
- "Ei": "ok",
- "Ao": "oq",
- "Ou": "oz",
- "An": "or",
- "En": "ow",
- "Ang": "os",
- "Eng": "ot",
- "Er": "oj",
- "Yi": "yi",
- "Ya": "ya",
- "Yo": "yo",
- "Ye": "ye",
- "Yao": "yq",
- "You": "yz",
- "Yan": "yr",
- "Yin": "yy",
- "Yang": "ys",
- "Ying": "yc",
- "Wu": "wu",
- "Wa": "wa",
- "Wo": "wo",
- "Wai": "wp",
- "Wei": "wk",
- "Wan": "wr",
- "Wen": "ww",
- "Wang": "ws",
- "Weng": "wt",
- "Yu": "yu",
- "Yue": "yn",
- "Yuan": "yl",
- "Yun": "ym",
- "Yong": "yh",
- "Ba": "ba",
- "Bai": "bp",
- "Ban": "br",
- "Bang": "bs",
- "Bao": "bq",
- "Bei": "bk",
- "Ben": "bw",
- "Beng": "bt",
- "Bi": "bi",
- "Bian": "bf",
- "Biang": "bg",
- "Biao": "bb",
- "Bie": "bd",
- "Bin": "by",
- "Bing": "bc",
- "Bo": "bo",
- "Bu": "bu",
- "Ca": "ca",
- "Cai": "cp",
- "Can": "cr",
- "Cang": "cs",
- "Cao": "cq",
- "Ce": "ce",
- "Cen": "cw",
- "Ceng": "ct",
- "Cha": "aa",
- "Chai": "ap",
- "Chan": "ar",
- "Chang": "as",
- "Chao": "aq",
- "Che": "ae",
- "Chen": "aw",
- "Cheng": "at",
- "Chi": "ai",
- "Chong": "ah",
- "Chou": "az",
- "Chu": "au",
- "Chua": "ax",
- "Chuai": "ay",
- "Chuan": "al",
- "Chuang": "ag",
- "Chui": "an",
- "Chun": "am",
- "Chuo": "ao",
- "Ci": "ci",
- "Cong": "ch",
- "Cou": "cz",
- "Cu": "cu",
- "Cuan": "cl",
- "Cui": "cn",
- "Cun": "cm",
- "Cuo": "co",
- "Da": "da",
- "Dai": "dp",
- "Dan": "dr",
- "Dang": "ds",
- "Dao": "dq",
- "De": "de",
- "Dei": "dk",
- "Den": "dw",
- "Deng": "dt",
- "Di": "di",
- "Dia": "dx",
- "Dian": "df",
- "Diao": "db",
- "Die": "dd",
- "Ding": "dc",
- "Diu": "dj",
- "Dong": "dh",
- "Dou": "dz",
- "Du": "du",
- "Duan": "dl",
- "Dui": "dn",
- "Dun": "dm",
- "Duo": "do",
- "Fa": "fa",
- "Fan": "fr",
- "Fang": "fs",
- "Fei": "fk",
- "Fen": "fw",
- "Feng": "ft",
- "Fiao": "fb",
- "Fo": "fo",
- "Fou": "fz",
- "Fu": "fu",
- "Ga": "ga",
- "Gai": "gp",
- "Gan": "gr",
- "Gang": "gs",
- "Gao": "gq",
- "Ge": "ge",
- "Gei": "gk",
- "Gen": "gw",
- "Geng": "gt",
- "Gong": "gh",
- "Gou": "gz",
- "Gu": "gu",
- "Gua": "gx",
- "Guai": "gy",
- "Guan": "gl",
- "Guang": "gg",
- "Gui": "gn",
- "Gun": "gm",
- "Guo": "go",
- "Ha": "ha",
- "Hai": "hp",
- "Han": "hr",
- "Hang": "hs",
- "Hao": "hq",
- "He": "he",
- "Hei": "hk",
- "Hen": "hw",
- "Heng": "ht",
- "Hong": "hh",
- "Hou": "hz",
- "Hu": "hu",
- "Hua": "hx",
- "Huai": "hy",
- "Huan": "hl",
- "Huang": "hg",
- "Hui": "hn",
- "Hun": "hm",
- "Huo": "ho",
- "Ji": "ji",
- "Jia": "jx",
- "Jian": "jf",
- "Jiang": "jg",
- "Jiao": "jb",
- "Jie": "jd",
- "Jin": "jy",
- "Jing": "jc",
- "Jiong": "jh",
- "Jiu": "jj",
- "Ju": "ju",
- "Juan": "jl",
- "Jue": "jn",
- "Jun": "jm",
- "Ka": "ka",
- "Kai": "kp",
- "Kan": "kr",
- "Kang": "ks",
- "Kao": "kq",
- "Ke": "ke",
- "Ken": "kw",
- "Keng": "kt",
- "Kong": "kh",
- "Kou": "kz",
- "Ku": "ku",
- "Kua": "kx",
- "Kuai": "ky",
- "Kuan": "kl",
- "Kuang": "kg",
- "Kui": "kn",
- "Kun": "km",
- "Kuo": "ko",
- "La": "la",
- "Lai": "lp",
- "Lan": "lr",
- "Lang": "ls",
- "Lao": "lq",
- "Le": "le",
- "Lei": "lk",
- "Leng": "lt",
- "Li": "li",
- "Lia": "lx",
- "Lian": "lf",
- "Liang": "lg",
- "Liao": "lb",
- "Lie": "ld",
- "Lin": "ly",
- "Ling": "lc",
- "Liu": "lj",
- "Lo": "lo",
- "Long": "lh",
- "Lou": "lz",
- "Lu": "lu",
- "Luan": "ll",
- "Lun": "lm",
- "Luo": "lo",
- "Ma": "ma",
- "Mai": "mp",
- "Man": "mr",
- "Mang": "ms",
- "Mao": "mq",
- "Me": "me",
- "Mei": "mk",
- "Men": "mw",
- "Meng": "mt",
- "Mi": "mi",
- "Mian": "mf",
- "Miao": "mb",
- "Mie": "md",
- "Min": "my",
- "Ming": "mc",
- "Miu": "mj",
- "Mo": "mo",
- "Mou": "mz",
- "Mu": "mu",
- "Na": "na",
- "Nai": "np",
- "Nan": "nr",
- "Nang": "ns",
- "Nao": "nq",
- "Ne": "ne",
- "Nei": "nk",
- "Nen": "nw",
- "Neng": "nt",
- "Ni": "ni",
- "Nian": "nf",
- "Niang": "ng",
- "Niao": "nb",
- "Nie": "nd",
- "Nin": "ny",
- "Ning": "nc",
- "Niu": "nj",
- "Nong": "nh",
- "Nou": "nz",
- "Nu": "nu",
- "Nuan": "nl",
- "Nun": "nm",
- "Nuo": "no",
- "Pa": "pa",
- "Pai": "pp",
- "Pan": "pr",
- "Pang": "ps",
- "Pao": "pq",
- "Pei": "pk",
- "Pen": "pw",
- "Peng": "pt",
- "Pi": "pi",
- "Pian": "pf",
- "Piao": "pb",
- "Pie": "pd",
- "Pin": "py",
- "Ping": "pc",
- "Po": "po",
- "Pou": "pz",
- "Pu": "pu",
- "Qi": "qi",
- "Qia": "qx",
- "Qian": "qf",
- "Qiang": "qg",
- "Qiao": "qb",
- "Qie": "qd",
- "Qin": "qy",
- "Qing": "qc",
- "Qiong": "qh",
- "Qiu": "qj",
- "Qu": "qu",
- "Quan": "ql",
- "Que": "qn",
- "Qun": "qm",
- "Ran": "rr",
- "Rang": "rs",
- "Rao": "rq",
- "Re": "re",
- "Ren": "rw",
- "Reng": "rt",
- "Ri": "ri",
- "Rong": "rh",
- "Rou": "rz",
- "Ru": "ru",
- "Rua": "rx",
- "Ruan": "rl",
- "Rui": "rn",
- "Run": "rm",
- "Ruo": "ro",
- "Sa": "sa",
- "Sai": "sp",
- "San": "sr",
- "Sang": "ss",
- "Sao": "sq",
- "Se": "se",
- "Sen": "sw",
- "Seng": "st",
- "Sha": "ia",
- "Shai": "ip",
- "Shan": "ir",
- "Shang": "is",
- "Shao": "iq",
- "She": "ie",
- "Shei": "ik",
- "Shen": "iw",
- "Sheng": "it",
- "Shi": "ii",
- "Shou": "iz",
- "Shu": "iu",
- "Shua": "ix",
- "Shuai": "iy",
- "Shuan": "il",
- "Shuang": "ig",
- "Shui": "in",
- "Shun": "im",
- "Shuo": "io",
- "Si": "si",
- "Song": "sh",
- "Sou": "sz",
- "Su": "su",
- "Suan": "sl",
- "Sui": "sn",
- "Sun": "sm",
- "Suo": "so",
- "Ta": "ta",
- "Tai": "tp",
- "Tan": "tr",
- "Tang": "ts",
- "Tao": "tq",
- "Te": "te",
- "Tei": "tk",
- "Teng": "tt",
- "Ti": "ti",
- "Tian": "tf",
- "Tiao": "tb",
- "Tie": "td",
- "Ting": "tc",
- "Tong": "th",
- "Tou": "tz",
- "Tu": "tu",
- "Tuan": "tl",
- "Tui": "tn",
- "Tun": "tm",
- "Tuo": "to",
- "Xi": "xi",
- "Xia": "xx",
- "Xian": "xf",
- "Xiang": "xg",
- "Xiao": "xb",
- "Xie": "xd",
- "Xin": "xy",
- "Xing": "xc",
- "Xiong": "xh",
- "Xiu": "xj",
- "Xu": "xu",
- "Xuan": "xl",
- "Xue": "xn",
- "Xun": "xm",
- "Za": "za",
- "Zai": "zp",
- "Zan": "zr",
- "Zang": "zs",
- "Zao": "zq",
- "Ze": "ze",
- "Zei": "zk",
- "Zen": "zw",
- "Zeng": "zt",
- "Zha": "ua",
- "Zhai": "up",
- "Zhan": "ur",
- "Zhang": "us",
- "Zhao": "uq",
- "Zhe": "ue",
- "Zhen": "uw",
- "Zheng": "ut",
- "Zhi": "ui",
- "Zhong": "uh",
- "Zhou": "uz",
- "Zhu": "uu",
- "Zhua": "ux",
- "Zhuai": "uy",
- "Zhuan": "ul",
- "Zhuang": "ug",
- "Zhui": "un",
- "Zhun": "um",
- "Zhuo": "uo",
- "Zi": "zi",
- "Zong": "zh",
- "Zou": "zz",
- "Zu": "zu",
- "Zuan": "zl",
- "Zui": "zn",
- "Zun": "zm",
- "Zuo": "zo"
- },
- "PinYinJiaJia": {
- "Lv": "lv",
- "Lve": "lx",
- "Lue": "lx",
- "Nv": "nv",
- "Nve": "nx",
- "Nue": "nx",
- "A": "aa",
- "O": "oo",
- "E": "ee",
- "Ai": "as",
- "Ei": "ew",
- "Ao": "ad",
- "Ou": "op",
- "An": "af",
- "En": "er",
- "Ang": "ag",
- "Eng": "et",
- "Er": "eq",
- "Yi": "yi",
- "Ya": "ya",
- "Yo": "yo",
- "Ye": "ye",
- "Yao": "yd",
- "You": "yp",
- "Yan": "yf",
- "Yin": "yl",
- "Yang": "yg",
- "Ying": "yq",
- "Wu": "wu",
- "Wa": "wa",
- "Wo": "wo",
- "Wai": "ws",
- "Wei": "ww",
- "Wan": "wf",
- "Wen": "wr",
- "Wang": "wg",
- "Weng": "wt",
- "Yu": "yu",
- "Yue": "yx",
- "Yuan": "yc",
- "Yun": "yz",
- "Yong": "yy",
- "Ba": "ba",
- "Bai": "bs",
- "Ban": "bf",
- "Bang": "bg",
- "Bao": "bd",
- "Bei": "bw",
- "Ben": "br",
- "Beng": "bt",
- "Bi": "bi",
- "Bian": "bj",
- "Biang": "bh",
- "Biao": "bk",
- "Bie": "bm",
- "Bin": "bl",
- "Bing": "bq",
- "Bo": "bo",
- "Bu": "bu",
- "Ca": "ca",
- "Cai": "cs",
- "Can": "cf",
- "Cang": "cg",
- "Cao": "cd",
- "Ce": "ce",
- "Cen": "cr",
- "Ceng": "ct",
- "Cha": "ua",
- "Chai": "us",
- "Chan": "uf",
- "Chang": "ug",
- "Chao": "ud",
- "Che": "ue",
- "Chen": "ur",
- "Cheng": "ut",
- "Chi": "ui",
- "Chong": "uy",
- "Chou": "up",
- "Chu": "uu",
- "Chua": "ub",
- "Chuai": "ux",
- "Chuan": "uc",
- "Chuang": "uh",
- "Chui": "uv",
- "Chun": "uz",
- "Chuo": "uo",
- "Ci": "ci",
- "Cong": "cy",
- "Cou": "cp",
- "Cu": "cu",
- "Cuan": "cc",
- "Cui": "cv",
- "Cun": "cz",
- "Cuo": "co",
- "Da": "da",
- "Dai": "ds",
- "Dan": "df",
- "Dang": "dg",
- "Dao": "dd",
- "De": "de",
- "Dei": "dw",
- "Den": "dr",
- "Deng": "dt",
- "Di": "di",
- "Dia": "db",
- "Dian": "dj",
- "Diao": "dk",
- "Die": "dm",
- "Ding": "dq",
- "Diu": "dn",
- "Dong": "dy",
- "Dou": "dp",
- "Du": "du",
- "Duan": "dc",
- "Dui": "dv",
- "Dun": "dz",
- "Duo": "do",
- "Fa": "fa",
- "Fan": "ff",
- "Fang": "fg",
- "Fei": "fw",
- "Fen": "fr",
- "Feng": "ft",
- "Fiao": "fk",
- "Fo": "fo",
- "Fou": "fp",
- "Fu": "fu",
- "Ga": "ga",
- "Gai": "gs",
- "Gan": "gf",
- "Gang": "gg",
- "Gao": "gd",
- "Ge": "ge",
- "Gei": "gw",
- "Gen": "gr",
- "Geng": "gt",
- "Gong": "gy",
- "Gou": "gp",
- "Gu": "gu",
- "Gua": "gb",
- "Guai": "gx",
- "Guan": "gc",
- "Guang": "gh",
- "Gui": "gv",
- "Gun": "gz",
- "Guo": "go",
- "Ha": "ha",
- "Hai": "hs",
- "Han": "hf",
- "Hang": "hg",
- "Hao": "hd",
- "He": "he",
- "Hei": "hw",
- "Hen": "hr",
- "Heng": "ht",
- "Hong": "hy",
- "Hou": "hp",
- "Hu": "hu",
- "Hua": "hb",
- "Huai": "hx",
- "Huan": "hc",
- "Huang": "hh",
- "Hui": "hv",
- "Hun": "hz",
- "Huo": "ho",
- "Ji": "ji",
- "Jia": "jb",
- "Jian": "jj",
- "Jiang": "jh",
- "Jiao": "jk",
- "Jie": "jm",
- "Jin": "jl",
- "Jing": "jq",
- "Jiong": "jy",
- "Jiu": "jn",
- "Ju": "ju",
- "Juan": "jc",
- "Jue": "jx",
- "Jun": "jz",
- "Ka": "ka",
- "Kai": "ks",
- "Kan": "kf",
- "Kang": "kg",
- "Kao": "kd",
- "Ke": "ke",
- "Ken": "kr",
- "Keng": "kt",
- "Kong": "ky",
- "Kou": "kp",
- "Ku": "ku",
- "Kua": "kb",
- "Kuai": "kx",
- "Kuan": "kc",
- "Kuang": "kh",
- "Kui": "kv",
- "Kun": "kz",
- "Kuo": "ko",
- "La": "la",
- "Lai": "ls",
- "Lan": "lf",
- "Lang": "lg",
- "Lao": "ld",
- "Le": "le",
- "Lei": "lw",
- "Leng": "lt",
- "Li": "li",
- "Lia": "lb",
- "Lian": "lj",
- "Liang": "lh",
- "Liao": "lk",
- "Lie": "lm",
- "Lin": "ll",
- "Ling": "lq",
- "Liu": "ln",
- "Lo": "lo",
- "Long": "ly",
- "Lou": "lp",
- "Lu": "lu",
- "Luan": "lc",
- "Lun": "lz",
- "Luo": "lo",
- "Ma": "ma",
- "Mai": "ms",
- "Man": "mf",
- "Mang": "mg",
- "Mao": "md",
- "Me": "me",
- "Mei": "mw",
- "Men": "mr",
- "Meng": "mt",
- "Mi": "mi",
- "Mian": "mj",
- "Miao": "mk",
- "Mie": "mm",
- "Min": "ml",
- "Ming": "mq",
- "Miu": "mn",
- "Mo": "mo",
- "Mou": "mp",
- "Mu": "mu",
- "Na": "na",
- "Nai": "ns",
- "Nan": "nf",
- "Nang": "ng",
- "Nao": "nd",
- "Ne": "ne",
- "Nei": "nw",
- "Nen": "nr",
- "Neng": "nt",
- "Ni": "ni",
- "Nian": "nj",
- "Niang": "nh",
- "Niao": "nk",
- "Nie": "nm",
- "Nin": "nl",
- "Ning": "nq",
- "Niu": "nn",
- "Nong": "ny",
- "Nou": "np",
- "Nu": "nu",
- "Nuan": "nc",
- "Nun": "nz",
- "Nuo": "no",
- "Pa": "pa",
- "Pai": "ps",
- "Pan": "pf",
- "Pang": "pg",
- "Pao": "pd",
- "Pei": "pw",
- "Pen": "pr",
- "Peng": "pt",
- "Pi": "pi",
- "Pian": "pj",
- "Piao": "pk",
- "Pie": "pm",
- "Pin": "pl",
- "Ping": "pq",
- "Po": "po",
- "Pou": "pp",
- "Pu": "pu",
- "Qi": "qi",
- "Qia": "qb",
- "Qian": "qj",
- "Qiang": "qh",
- "Qiao": "qk",
- "Qie": "qm",
- "Qin": "ql",
- "Qing": "qq",
- "Qiong": "qy",
- "Qiu": "qn",
- "Qu": "qu",
- "Quan": "qc",
- "Que": "qx",
- "Qun": "qz",
- "Ran": "rf",
- "Rang": "rg",
- "Rao": "rd",
- "Re": "re",
- "Ren": "rr",
- "Reng": "rt",
- "Ri": "ri",
- "Rong": "ry",
- "Rou": "rp",
- "Ru": "ru",
- "Rua": "rb",
- "Ruan": "rc",
- "Rui": "rv",
- "Run": "rz",
- "Ruo": "ro",
- "Sa": "sa",
- "Sai": "ss",
- "San": "sf",
- "Sang": "sg",
- "Sao": "sd",
- "Se": "se",
- "Sen": "sr",
- "Seng": "st",
- "Sha": "ia",
- "Shai": "is",
- "Shan": "if",
- "Shang": "ig",
- "Shao": "id",
- "She": "ie",
- "Shei": "iw",
- "Shen": "ir",
- "Sheng": "it",
- "Shi": "ii",
- "Shou": "ip",
- "Shu": "iu",
- "Shua": "ib",
- "Shuai": "ix",
- "Shuan": "ic",
- "Shuang": "ih",
- "Shui": "iv",
- "Shun": "iz",
- "Shuo": "io",
- "Si": "si",
- "Song": "sy",
- "Sou": "sp",
- "Su": "su",
- "Suan": "sc",
- "Sui": "sv",
- "Sun": "sz",
- "Suo": "so",
- "Ta": "ta",
- "Tai": "ts",
- "Tan": "tf",
- "Tang": "tg",
- "Tao": "td",
- "Te": "te",
- "Tei": "tw",
- "Teng": "tt",
- "Ti": "ti",
- "Tian": "tj",
- "Tiao": "tk",
- "Tie": "tm",
- "Ting": "tq",
- "Tong": "ty",
- "Tou": "tp",
- "Tu": "tu",
- "Tuan": "tc",
- "Tui": "tv",
- "Tun": "tz",
- "Tuo": "to",
- "Xi": "xi",
- "Xia": "xb",
- "Xian": "xj",
- "Xiang": "xh",
- "Xiao": "xk",
- "Xie": "xm",
- "Xin": "xl",
- "Xing": "xq",
- "Xiong": "xy",
- "Xiu": "xn",
- "Xu": "xu",
- "Xuan": "xc",
- "Xue": "xx",
- "Xun": "xz",
- "Za": "za",
- "Zai": "zs",
- "Zan": "zf",
- "Zang": "zg",
- "Zao": "zd",
- "Ze": "ze",
- "Zei": "zw",
- "Zen": "zr",
- "Zeng": "zt",
- "Zha": "va",
- "Zhai": "vs",
- "Zhan": "vf",
- "Zhang": "vg",
- "Zhao": "vd",
- "Zhe": "ve",
- "Zhen": "vr",
- "Zheng": "vt",
- "Zhi": "vi",
- "Zhong": "vy",
- "Zhou": "vp",
- "Zhu": "vu",
- "Zhua": "vb",
- "Zhuai": "vx",
- "Zhuan": "vc",
- "Zhuang": "vh",
- "Zhui": "vv",
- "Zhun": "vz",
- "Zhuo": "vo",
- "Zi": "zi",
- "Zong": "zy",
- "Zou": "zp",
- "Zu": "zu",
- "Zuan": "zc",
- "Zui": "zv",
- "Zun": "zz",
- "Zuo": "zo"
- },
- "XingKongJianDao": {
- "Lv": "lv",
- "Lve": "ly",
- "Lue": "ly",
- "Nv": "nv",
- "Nve": "ny",
- "Nue": "ny",
- "A": "xa",
- "O": "xo",
- "E": "xe",
- "Ai": "xj",
- "Ei": "xw",
- "Ao": "xs",
- "Ou": "xt",
- "An": "xd",
- "En": "xk",
- "Ang": "xf",
- "Eng": "xh",
- "Er": "xu",
- "Yi": "yi",
- "Ya": "ya",
- "Yo": "yo",
- "Ye": "ye",
- "Yao": "ys",
- "You": "yt",
- "Yan": "yd",
- "Yin": "yb",
- "Yang": "yf",
- "Ying": "yg",
- "Wu": "wj",
- "Wa": "ws",
- "Wo": "wo",
- "Wai": "wh",
- "Wei": "ww",
- "Wan": "wf",
- "Wen": "wn",
- "Wang": "wp",
- "Weng": "wr",
- "Yu": "yv",
- "Yue": "yy",
- "Yuan": "yr",
- "Yun": "yw",
- "Yong": "yl",
- "Ba": "ba",
- "Bai": "bj",
- "Ban": "bd",
- "Bang": "bf",
- "Bao": "bs",
- "Bei": "bw",
- "Ben": "bk",
- "Beng": "bh",
- "Bi": "bi",
- "Bian": "bm",
- "Biang": "bx",
- "Biao": "bp",
- "Bie": "bc",
- "Bin": "bb",
- "Bing": "bg",
- "Bo": "bo",
- "Bu": "bu",
- "Ca": "ca",
- "Cai": "cj",
- "Can": "cd",
- "Cang": "cf",
- "Cao": "cs",
- "Ce": "ce",
- "Cen": "ck",
- "Ceng": "ch",
- "Cha": "ja",
- "Chai": "jj",
- "Chan": "jd",
- "Chang": "jf",
- "Chao": "js",
- "Che": "je",
- "Chen": "jk",
- "Cheng": "jh",
- "Chi": "wi",
- "Chong": "wl",
- "Chou": "jt",
- "Chu": "ju",
- "Chua": "wx",
- "Chuai": "wg",
- "Chuan": "wr",
- "Chuang": "wn",
- "Chui": "wy",
- "Chun": "jz",
- "Chuo": "jo",
- "Ci": "ci",
- "Cong": "cl",
- "Cou": "ct",
- "Cu": "cu",
- "Cuan": "cr",
- "Cui": "cy",
- "Cun": "cz",
- "Cuo": "co",
- "Da": "da",
- "Dai": "dj",
- "Dan": "dd",
- "Dang": "df",
- "Dao": "ds",
- "De": "de",
- "Dei": "dw",
- "Den": "dk",
- "Deng": "dh",
- "Di": "di",
- "Dia": "dx",
- "Dian": "dm",
- "Diao": "dp",
- "Die": "dc",
- "Ding": "dg",
- "Diu": "dq",
- "Dong": "dl",
- "Dou": "dt",
- "Du": "du",
- "Duan": "dr",
- "Dui": "dy",
- "Dun": "dz",
- "Duo": "do",
- "Fa": "fs",
- "Fan": "ff",
- "Fang": "fp",
- "Fei": "fw",
- "Fen": "fn",
- "Feng": "fr",
- "Fiao": "fp",
- "Fo": "fl",
- "Fou": "fd",
- "Fu": "fl",
- "Ga": "ga",
- "Gai": "gj",
- "Gan": "gd",
- "Gang": "gf",
- "Gao": "gs",
- "Ge": "ge",
- "Gei": "gw",
- "Gen": "gk",
- "Geng": "gh",
- "Gong": "gl",
- "Gou": "gt",
- "Gu": "gu",
- "Gua": "gx",
- "Guai": "gg",
- "Guan": "gr",
- "Guang": "gn",
- "Gui": "gy",
- "Gun": "gz",
- "Guo": "go",
- "Ha": "ha",
- "Hai": "hj",
- "Han": "hd",
- "Hang": "hf",
- "Hao": "hs",
- "He": "he",
- "Hei": "hw",
- "Hen": "hk",
- "Heng": "hh",
- "Hong": "hl",
- "Hou": "ht",
- "Hu": "hu",
- "Hua": "hx",
- "Huai": "hg",
- "Huan": "hr",
- "Huang": "hn",
- "Hui": "hy",
- "Hun": "hz",
- "Huo": "ho",
- "Ji": "jk",
- "Jia": "js",
- "Jian": "jm",
- "Jiang": "jn",
- "Jiao": "jp",
- "Jie": "jc",
- "Jin": "jb",
- "Jing": "jg",
- "Jiong": "jy",
- "Jiu": "jq",
- "Ju": "jv",
- "Juan": "jt",
- "Jue": "jh",
- "Jun": "jw",
- "Ka": "ka",
- "Kai": "kj",
- "Kan": "kd",
- "Kang": "kf",
- "Kao": "ks",
- "Ke": "ke",
- "Ken": "kk",
- "Keng": "kh",
- "Kong": "kl",
- "Kou": "kt",
- "Ku": "ku",
- "Kua": "kx",
- "Kuai": "kg",
- "Kuan": "kr",
- "Kuang": "kn",
- "Kui": "ky",
- "Kun": "kz",
- "Kuo": "ko",
- "La": "la",
- "Lai": "lj",
- "Lan": "ld",
- "Lang": "lf",
- "Lao": "ls",
- "Le": "le",
- "Lei": "lw",
- "Leng": "lh",
- "Li": "li",
- "Lia": "lx",
- "Lian": "lm",
- "Liang": "ln",
- "Liao": "lp",
- "Lie": "lc",
- "Lin": "lb",
- "Ling": "lg",
- "Liu": "lq",
- "Lo": "ll",
- "Long": "ll",
- "Lou": "lt",
- "Lu": "lu",
- "Luan": "lr",
- "Lun": "lz",
- "Luo": "lo",
- "Ma": "ma",
- "Mai": "mj",
- "Man": "md",
- "Mang": "mf",
- "Mao": "ms",
- "Me": "me",
- "Mei": "mw",
- "Men": "mk",
- "Meng": "mh",
- "Mi": "mi",
- "Mian": "mm",
- "Miao": "mp",
- "Mie": "mc",
- "Min": "mb",
- "Ming": "mg",
- "Miu": "mq",
- "Mo": "mo",
- "Mou": "mt",
- "Mu": "mu",
- "Na": "na",
- "Nai": "nj",
- "Nan": "nd",
- "Nang": "nf",
- "Nao": "ns",
- "Ne": "ne",
- "Nei": "nw",
- "Nen": "nk",
- "Neng": "nh",
- "Ni": "ni",
- "Nian": "nm",
- "Niang": "nn",
- "Niao": "np",
- "Nie": "nc",
- "Nin": "nb",
- "Ning": "ng",
- "Niu": "nq",
- "Nong": "nl",
- "Nou": "nt",
- "Nu": "nu",
- "Nuan": "nr",
- "Nun": "nz",
- "Nuo": "no",
- "Pa": "pa",
- "Pai": "pj",
- "Pan": "pd",
- "Pang": "pf",
- "Pao": "ps",
- "Pei": "pw",
- "Pen": "pk",
- "Peng": "ph",
- "Pi": "pi",
- "Pian": "pm",
- "Piao": "pp",
- "Pie": "pc",
- "Pin": "pb",
- "Ping": "pg",
- "Po": "po",
- "Pou": "pt",
- "Pu": "pu",
- "Qi": "qk",
- "Qia": "qs",
- "Qian": "qm",
- "Qiang": "qx",
- "Qiao": "qp",
- "Qie": "qc",
- "Qin": "qb",
- "Qing": "qg",
- "Qiong": "qy",
- "Qiu": "qq",
- "Qu": "qv",
- "Quan": "qt",
- "Que": "qh",
- "Qun": "qw",
- "Ran": "rd",
- "Rang": "rf",
- "Rao": "rs",
- "Re": "re",
- "Ren": "rk",
- "Reng": "rh",
- "Ri": "ri",
- "Rong": "rl",
- "Rou": "rt",
- "Ru": "ru",
- "Rua": "rx",
- "Ruan": "rr",
- "Rui": "ry",
- "Run": "rz",
- "Ruo": "ro",
- "Sa": "sa",
- "Sai": "sj",
- "San": "sd",
- "Sang": "sf",
- "Sao": "ss",
- "Se": "se",
- "Sen": "sk",
- "Seng": "sh",
- "Sha": "ea",
- "Shai": "ej",
- "Shan": "ed",
- "Shang": "ef",
- "Shao": "es",
- "She": "ee",
- "Shei": "ew",
- "Shen": "ek",
- "Sheng": "eh",
- "Shi": "ei",
- "Shou": "et",
- "Shu": "eu",
- "Shua": "ex",
- "Shuai": "eg",
- "Shuan": "er",
- "Shuang": "en",
- "Shui": "ey",
- "Shun": "ez",
- "Shuo": "eo",
- "Si": "si",
- "Song": "sl",
- "Sou": "st",
- "Su": "su",
- "Suan": "sr",
- "Sui": "sy",
- "Sun": "sz",
- "Suo": "so",
- "Ta": "ta",
- "Tai": "tj",
- "Tan": "td",
- "Tang": "tf",
- "Tao": "ts",
- "Te": "te",
- "Tei": "tw",
- "Teng": "th",
- "Ti": "ti",
- "Tian": "tm",
- "Tiao": "tp",
- "Tie": "tc",
- "Ting": "tg",
- "Tong": "tl",
- "Tou": "tt",
- "Tu": "tu",
- "Tuan": "tr",
- "Tui": "ty",
- "Tun": "tz",
- "Tuo": "to",
- "Xi": "xi",
- "Xia": "xx",
- "Xian": "xm",
- "Xiang": "xn",
- "Xiao": "xp",
- "Xie": "xc",
- "Xin": "xb",
- "Xing": "xg",
- "Xiong": "xl",
- "Xiu": "xq",
- "Xu": "xv",
- "Xuan": "xr",
- "Xue": "xy",
- "Xun": "xw",
- "Za": "za",
- "Zai": "zj",
- "Zan": "zd",
- "Zang": "zf",
- "Zao": "zs",
- "Ze": "ze",
- "Zei": "zw",
- "Zen": "zk",
- "Zeng": "zh",
- "Zha": "qa",
- "Zhai": "fj",
- "Zhan": "qd",
- "Zhang": "qf",
- "Zhao": "fs",
- "Zhe": "fe",
- "Zhen": "qk",
- "Zheng": "qh",
- "Zhi": "fi",
- "Zhong": "fy",
- "Zhou": "qt",
- "Zhu": "qu",
- "Zhua": "fx",
- "Zhuai": "fg",
- "Zhuan": "fr",
- "Zhuang": "fn",
- "Zhui": "fy",
- "Zhun": "fz",
- "Zhuo": "qo",
- "Zi": "zi",
- "Zong": "zl",
- "Zou": "zt",
- "Zu": "zu",
- "Zuan": "zr",
- "Zui": "zy",
- "Zun": "zz",
- "Zuo": "zo"
- },
- "DaNiu": {
- "Lv": "lv",
- "Lve": "lx",
- "Lue": "lx",
- "Nv": "nv",
- "Nve": "nx",
- "Nue": "nx",
- "A": "ea",
- "O": "eo",
- "E": "ee",
- "Ai": "eh",
- "Ei": "ew",
- "Ao": "es",
- "Ou": "er",
- "An": "ed",
- "En": "ek",
- "Ang": "ef",
- "Eng": "ej",
- "Er": "eu",
- "Yi": "yi",
- "Ya": "ya",
- "Yo": "yo",
- "Ye": "ye",
- "Yao": "ys",
- "You": "yr",
- "Yan": "yd",
- "Yin": "yb",
- "Yang": "yf",
- "Ying": "yg",
- "Wu": "wu",
- "Wa": "wa",
- "Wo": "wo",
- "Wai": "wh",
- "Wei": "ww",
- "Wan": "wd",
- "Wen": "wk",
- "Wang": "wf",
- "Weng": "wj",
- "Yu": "yu",
- "Yue": "yh",
- "Yuan": "yj",
- "Yun": "yw",
- "Yong": "yl",
- "Ba": "ba",
- "Bai": "bh",
- "Ban": "bd",
- "Bang": "bf",
- "Bao": "bs",
- "Bei": "bw",
- "Ben": "bk",
- "Beng": "bj",
- "Bi": "bi",
- "Bian": "bc",
- "Biang": "bn",
- "Biao": "bm",
- "Bie": "bp",
- "Bin": "bb",
- "Bing": "bg",
- "Bo": "bo",
- "Bu": "bu",
- "Ca": "ca",
- "Cai": "ch",
- "Can": "cd",
- "Cang": "cf",
- "Cao": "cs",
- "Ce": "ce",
- "Cen": "ck",
- "Ceng": "cj",
- "Cha": "ia",
- "Chai": "ih",
- "Chan": "id",
- "Chang": "if",
- "Chao": "is",
- "Che": "ie",
- "Chen": "ik",
- "Cheng": "ij",
- "Chi": "ii",
- "Chong": "il",
- "Chou": "ir",
- "Chu": "iu",
- "Chua": "iq",
- "Chuai": "ig",
- "Chuan": "iz",
- "Chuang": "ix",
- "Chui": "in",
- "Chun": "iy",
- "Chuo": "io",
- "Ci": "ci",
- "Cong": "cl",
- "Cou": "cr",
- "Cu": "cu",
- "Cuan": "cz",
- "Cui": "cn",
- "Cun": "cy",
- "Cuo": "co",
- "Da": "da",
- "Dai": "dh",
- "Dan": "dd",
- "Dang": "df",
- "Dao": "ds",
- "De": "de",
- "Dei": "dw",
- "Den": "dk",
- "Deng": "dj",
- "Di": "di",
- "Dia": "dk",
- "Dian": "dc",
- "Diao": "dm",
- "Die": "dp",
- "Ding": "dg",
- "Diu": "dt",
- "Dong": "dl",
- "Dou": "dr",
- "Du": "du",
- "Duan": "dz",
- "Dui": "dn",
- "Dun": "dy",
- "Duo": "do",
- "Fa": "fa",
- "Fan": "fd",
- "Fang": "ff",
- "Fei": "fw",
- "Fen": "fk",
- "Feng": "fj",
- "Fiao": "fm",
- "Fo": "fo",
- "Fou": "fr",
- "Fu": "fu",
- "Ga": "ga",
- "Gai": "gh",
- "Gan": "gd",
- "Gang": "gf",
- "Gao": "gs",
- "Ge": "ge",
- "Gei": "gw",
- "Gen": "gk",
- "Geng": "gj",
- "Gong": "gl",
- "Gou": "gr",
- "Gu": "gu",
- "Gua": "gq",
- "Guai": "gg",
- "Guan": "gz",
- "Guang": "gx",
- "Gui": "gn",
- "Gun": "gy",
- "Guo": "go",
- "Ha": "ha",
- "Hai": "hh",
- "Han": "hd",
- "Hang": "hf",
- "Hao": "hs",
- "He": "he",
- "Hei": "hw",
- "Hen": "hk",
- "Heng": "hj",
- "Hong": "hl",
- "Hou": "hr",
- "Hu": "hu",
- "Hua": "hq",
- "Huai": "hg",
- "Huan": "hz",
- "Huang": "hx",
- "Hui": "hn",
- "Hun": "hy",
- "Huo": "ho",
- "Ji": "ji",
- "Jia": "jk",
- "Jian": "jc",
- "Jiang": "jn",
- "Jiao": "jm",
- "Jie": "jp",
- "Jin": "jb",
- "Jing": "jg",
- "Jiong": "jl",
- "Jiu": "jt",
- "Ju": "ju",
- "Juan": "jj",
- "Jue": "jh",
- "Jun": "jw",
- "Ka": "ka",
- "Kai": "kh",
- "Kan": "kd",
- "Kang": "kf",
- "Kao": "ks",
- "Ke": "ke",
- "Ken": "kk",
- "Keng": "kj",
- "Kong": "kl",
- "Kou": "kr",
- "Ku": "ku",
- "Kua": "kq",
- "Kuai": "kg",
- "Kuan": "kz",
- "Kuang": "kx",
- "Kui": "kn",
- "Kun": "ky",
- "Kuo": "ko",
- "La": "la",
- "Lai": "lh",
- "Lan": "ld",
- "Lang": "lf",
- "Lao": "ls",
- "Le": "le",
- "Lei": "lw",
- "Leng": "lj",
- "Li": "li",
- "Lia": "lk",
- "Lian": "lc",
- "Liang": "ln",
- "Liao": "lm",
- "Lie": "lp",
- "Lin": "lb",
- "Ling": "lg",
- "Liu": "lt",
- "Lo": "lo",
- "Long": "ll",
- "Lou": "lr",
- "Lu": "lu",
- "Luan": "lz",
- "Lun": "ly",
- "Luo": "lo",
- "Ma": "ma",
- "Mai": "mh",
- "Man": "md",
- "Mang": "mf",
- "Mao": "ms",
- "Me": "me",
- "Mei": "mw",
- "Men": "mk",
- "Meng": "mj",
- "Mi": "mi",
- "Mian": "mc",
- "Miao": "mm",
- "Mie": "mp",
- "Min": "mb",
- "Ming": "mg",
- "Miu": "mt",
- "Mo": "mo",
- "Mou": "mr",
- "Mu": "mu",
- "Na": "na",
- "Nai": "nh",
- "Nan": "nd",
- "Nang": "nf",
- "Nao": "ns",
- "Ne": "ne",
- "Nei": "nw",
- "Nen": "nk",
- "Neng": "nj",
- "Ni": "ni",
- "Nian": "nc",
- "Niang": "nn",
- "Niao": "nm",
- "Nie": "np",
- "Nin": "nb",
- "Ning": "ng",
- "Niu": "nt",
- "Nong": "nl",
- "Nou": "nr",
- "Nu": "nu",
- "Nuan": "nz",
- "Nun": "ny",
- "Nuo": "no",
- "Pa": "pa",
- "Pai": "ph",
- "Pan": "pd",
- "Pang": "pf",
- "Pao": "ps",
- "Pei": "pw",
- "Pen": "pk",
- "Peng": "pj",
- "Pi": "pi",
- "Pian": "pc",
- "Piao": "pm",
- "Pie": "pp",
- "Pin": "pb",
- "Ping": "pg",
- "Po": "po",
- "Pou": "pr",
- "Pu": "pu",
- "Qi": "qi",
- "Qia": "qk",
- "Qian": "qc",
- "Qiang": "qn",
- "Qiao": "qm",
- "Qie": "qp",
- "Qin": "qb",
- "Qing": "qg",
- "Qiong": "ql",
- "Qiu": "qt",
- "Qu": "qu",
- "Quan": "qj",
- "Que": "qh",
- "Qun": "qw",
- "Ran": "rd",
- "Rang": "rf",
- "Rao": "rs",
- "Re": "re",
- "Ren": "rk",
- "Reng": "rj",
- "Ri": "ri",
- "Rong": "rl",
- "Rou": "rr",
- "Ru": "ru",
- "Rua": "rq",
- "Ruan": "rz",
- "Rui": "rn",
- "Run": "ry",
- "Ruo": "ro",
- "Sa": "sa",
- "Sai": "sh",
- "San": "sd",
- "Sang": "sf",
- "Sao": "ss",
- "Se": "se",
- "Sen": "sk",
- "Seng": "sj",
- "Sha": "ua",
- "Shai": "uh",
- "Shan": "ud",
- "Shang": "uf",
- "Shao": "us",
- "She": "ue",
- "Shei": "uw",
- "Shen": "uk",
- "Sheng": "uj",
- "Shi": "ui",
- "Shou": "ur",
- "Shu": "uu",
- "Shua": "uq",
- "Shuai": "ug",
- "Shuan": "uz",
- "Shuang": "ux",
- "Shui": "un",
- "Shun": "uy",
- "Shuo": "uo",
- "Si": "si",
- "Song": "sl",
- "Sou": "sr",
- "Su": "su",
- "Suan": "sz",
- "Sui": "sn",
- "Sun": "sy",
- "Suo": "so",
- "Ta": "ta",
- "Tai": "th",
- "Tan": "td",
- "Tang": "tf",
- "Tao": "ts",
- "Te": "te",
- "Tei": "tw",
- "Teng": "tj",
- "Ti": "ti",
- "Tian": "tc",
- "Tiao": "tm",
- "Tie": "tp",
- "Ting": "tg",
- "Tong": "tl",
- "Tou": "tr",
- "Tu": "tu",
- "Tuan": "tz",
- "Tui": "tn",
- "Tun": "ty",
- "Tuo": "to",
- "Xi": "xi",
- "Xia": "xk",
- "Xian": "xc",
- "Xiang": "xn",
- "Xiao": "xm",
- "Xie": "xp",
- "Xin": "xb",
- "Xing": "xg",
- "Xiong": "xl",
- "Xiu": "xt",
- "Xu": "xu",
- "Xuan": "xj",
- "Xue": "xh",
- "Xun": "xw",
- "Za": "za",
- "Zai": "zh",
- "Zan": "zd",
- "Zang": "zf",
- "Zao": "zs",
- "Ze": "ze",
- "Zei": "zw",
- "Zen": "zk",
- "Zeng": "zj",
- "Zha": "aa",
- "Zhai": "ah",
- "Zhan": "ad",
- "Zhang": "af",
- "Zhao": "as",
- "Zhe": "ae",
- "Zhen": "ak",
- "Zheng": "aj",
- "Zhi": "ai",
- "Zhong": "al",
- "Zhou": "ar",
- "Zhu": "au",
- "Zhua": "aq",
- "Zhuai": "ag",
- "Zhuan": "az",
- "Zhuang": "ax",
- "Zhui": "an",
- "Zhun": "ay",
- "Zhuo": "ao",
- "Zi": "zi",
- "Zong": "zl",
- "Zou": "zr",
- "Zu": "zu",
- "Zuan": "zz",
- "Zui": "zn",
- "Zun": "zy",
- "Zuo": "zo"
- },
- "XiaoLang": {
- "Lv": "lx",
- "Lve": "lb",
- "Lue": "lb",
- "Nv": "nx",
- "Nve": "nb",
- "Nue": "nb",
- "A": "aa",
- "O": "oo",
- "E": "uu",
- "Ai": "ai",
- "Ei": "ui",
- "Ao": "ao",
- "Ou": "ou",
- "An": "an",
- "En": "un",
- "Ang": "ah",
- "Eng": "un",
- "Er": "ur",
- "Yi": "yi",
- "Ya": "ya",
- "Yo": "yo",
- "Ye": "ye",
- "Yao": "ys",
- "You": "yr",
- "Yan": "yj",
- "Yin": "yd",
- "Yang": "yh",
- "Ying": "yv",
- "Wu": "wu",
- "Wa": "wa",
- "Wo": "wo",
- "Wai": "wk",
- "Wei": "ww",
- "Wan": "wj",
- "Wen": "wm",
- "Wang": "wh",
- "Weng": "wn",
- "Yu": "yu",
- "Yue": "yb",
- "Yuan": "yg",
- "Yun": "yy",
- "Yong": "yl",
- "Ba": "ba",
- "Bai": "bk",
- "Ban": "bj",
- "Bang": "bh",
- "Bao": "bs",
- "Bei": "bw",
- "Ben": "bm",
- "Beng": "bn",
- "Bi": "bi",
- "Bian": "bf",
- "Biang": "bm",
- "Biao": "bc",
- "Bie": "bp",
- "Bin": "bd",
- "Bing": "bv",
- "Bo": "bo",
- "Bu": "bu",
- "Ca": "ca",
- "Cai": "ck",
- "Can": "cj",
- "Cang": "ch",
- "Cao": "cs",
- "Ce": "ce",
- "Cen": "cm",
- "Ceng": "cn",
- "Cha": "ia",
- "Chai": "ik",
- "Chan": "ij",
- "Chang": "ih",
- "Chao": "is",
- "Che": "ie",
- "Chen": "im",
- "Cheng": "in",
- "Chi": "ii",
- "Chong": "il",
- "Chou": "ir",
- "Chu": "iu",
- "Chua": "if",
- "Chuai": "iv",
- "Chuan": "ig",
- "Chuang": "iz",
- "Chui": "id",
- "Chun": "iy",
- "Chuo": "io",
- "Ci": "ci",
- "Cong": "cl",
- "Cou": "cr",
- "Cu": "cu",
- "Cuan": "cg",
- "Cui": "cd",
- "Cun": "cy",
- "Cuo": "co",
- "Da": "da",
- "Dai": "dk",
- "Dan": "dj",
- "Dang": "dh",
- "Dao": "ds",
- "De": "de",
- "Dei": "dw",
- "Den": "dm",
- "Deng": "dn",
- "Di": "di",
- "Dia": "dk",
- "Dian": "df",
- "Diao": "dc",
- "Die": "dp",
- "Ding": "dv",
- "Diu": "dt",
- "Dong": "dl",
- "Dou": "dr",
- "Du": "du",
- "Duan": "dg",
- "Dui": "dd",
- "Dun": "dy",
- "Duo": "do",
- "Fa": "fa",
- "Fan": "fj",
- "Fang": "fh",
- "Fei": "fw",
- "Fen": "fm",
- "Feng": "fn",
- "Fiao": "fc",
- "Fo": "fo",
- "Fou": "fr",
- "Fu": "fu",
- "Ga": "ga",
- "Gai": "gk",
- "Gan": "gj",
- "Gang": "gh",
- "Gao": "gs",
- "Ge": "ge",
- "Gei": "gw",
- "Gen": "gm",
- "Geng": "gn",
- "Gong": "gl",
- "Gou": "gr",
- "Gu": "gu",
- "Gua": "gf",
- "Guai": "gv",
- "Guan": "gg",
- "Guang": "gz",
- "Gui": "gd",
- "Gun": "gy",
- "Guo": "go",
- "Ha": "ha",
- "Hai": "hk",
- "Han": "hj",
- "Hang": "hh",
- "Hao": "hs",
- "He": "he",
- "Hei": "hw",
- "Hen": "hm",
- "Heng": "hn",
- "Hong": "hl",
- "Hou": "hr",
- "Hu": "hu",
- "Hua": "hf",
- "Huai": "hv",
- "Huan": "hg",
- "Huang": "hz",
- "Hui": "hd",
- "Hun": "hy",
- "Huo": "ho",
- "Ji": "ji",
- "Jia": "jk",
- "Jian": "jf",
- "Jiang": "jm",
- "Jiao": "jc",
- "Jie": "jp",
- "Jin": "jd",
- "Jing": "jv",
- "Jiong": "jj",
- "Jiu": "jt",
- "Ju": "ju",
- "Juan": "jg",
- "Jue": "jb",
- "Jun": "jy",
- "Ka": "ka",
- "Kai": "kk",
- "Kan": "kj",
- "Kang": "kh",
- "Kao": "ks",
- "Ke": "ke",
- "Ken": "km",
- "Keng": "kn",
- "Kong": "kl",
- "Kou": "kr",
- "Ku": "ku",
- "Kua": "kf",
- "Kuai": "kv",
- "Kuan": "kg",
- "Kuang": "kz",
- "Kui": "kd",
- "Kun": "ky",
- "Kuo": "ko",
- "La": "la",
- "Lai": "lk",
- "Lan": "lj",
- "Lang": "lh",
- "Lao": "ls",
- "Le": "le",
- "Lei": "lw",
- "Leng": "ln",
- "Li": "li",
- "Lia": "lk",
- "Lian": "lf",
- "Liang": "lm",
- "Liao": "lc",
- "Lie": "lp",
- "Lin": "ld",
- "Ling": "lv",
- "Liu": "lt",
- "Lo": "lo",
- "Long": "ll",
- "Lou": "lr",
- "Lu": "lu",
- "Luan": "lg",
- "Lun": "ly",
- "Luo": "lo",
- "Ma": "ma",
- "Mai": "mk",
- "Man": "mj",
- "Mang": "mh",
- "Mao": "ms",
- "Me": "me",
- "Mei": "mw",
- "Men": "mm",
- "Meng": "mn",
- "Mi": "mi",
- "Mian": "mf",
- "Miao": "mc",
- "Mie": "mp",
- "Min": "md",
- "Ming": "mv",
- "Miu": "mt",
- "Mo": "mo",
- "Mou": "mr",
- "Mu": "mu",
- "Na": "na",
- "Nai": "nk",
- "Nan": "nj",
- "Nang": "nh",
- "Nao": "ns",
- "Ne": "ne",
- "Nei": "nw",
- "Nen": "nm",
- "Neng": "nn",
- "Ni": "ni",
- "Nian": "nf",
- "Niang": "nm",
- "Niao": "nc",
- "Nie": "np",
- "Nin": "nd",
- "Ning": "nv",
- "Niu": "nt",
- "Nong": "nl",
- "Nou": "nr",
- "Nu": "nu",
- "Nuan": "ng",
- "Nun": "ny",
- "Nuo": "no",
- "Pa": "pa",
- "Pai": "pk",
- "Pan": "pj",
- "Pang": "ph",
- "Pao": "ps",
- "Pei": "pw",
- "Pen": "pm",
- "Peng": "pn",
- "Pi": "pi",
- "Pian": "pf",
- "Piao": "pc",
- "Pie": "pp",
- "Pin": "pd",
- "Ping": "pv",
- "Po": "po",
- "Pou": "pr",
- "Pu": "pu",
- "Qi": "qi",
- "Qia": "qk",
- "Qian": "qf",
- "Qiang": "qm",
- "Qiao": "qc",
- "Qie": "qp",
- "Qin": "qd",
- "Qing": "qv",
- "Qiong": "qj",
- "Qiu": "qt",
- "Qu": "qu",
- "Quan": "qg",
- "Que": "qb",
- "Qun": "qy",
- "Ran": "rj",
- "Rang": "rh",
- "Rao": "rs",
- "Re": "re",
- "Ren": "rm",
- "Reng": "rn",
- "Ri": "ri",
- "Rong": "rl",
- "Rou": "rr",
- "Ru": "ru",
- "Rua": "rf",
- "Ruan": "rg",
- "Rui": "rd",
- "Run": "ry",
- "Ruo": "ro",
- "Sa": "sa",
- "Sai": "sk",
- "San": "sj",
- "Sang": "sh",
- "Sao": "ss",
- "Se": "se",
- "Sen": "sm",
- "Seng": "sn",
- "Sha": "va",
- "Shai": "vk",
- "Shan": "vj",
- "Shang": "vh",
- "Shao": "vs",
- "She": "ve",
- "Shei": "vw",
- "Shen": "vm",
- "Sheng": "vn",
- "Shi": "vi",
- "Shou": "vr",
- "Shu": "vu",
- "Shua": "vf",
- "Shuai": "vv",
- "Shuan": "vg",
- "Shuang": "vz",
- "Shui": "vd",
- "Shun": "vy",
- "Shuo": "vo",
- "Si": "si",
- "Song": "sl",
- "Sou": "sr",
- "Su": "su",
- "Suan": "sg",
- "Sui": "sd",
- "Sun": "sy",
- "Suo": "so",
- "Ta": "ta",
- "Tai": "tk",
- "Tan": "tj",
- "Tang": "th",
- "Tao": "ts",
- "Te": "te",
- "Tei": "tw",
- "Teng": "tn",
- "Ti": "ti",
- "Tian": "tf",
- "Tiao": "tc",
- "Tie": "tp",
- "Ting": "tv",
- "Tong": "tl",
- "Tou": "tr",
- "Tu": "tu",
- "Tuan": "tg",
- "Tui": "td",
- "Tun": "ty",
- "Tuo": "to",
- "Xi": "xi",
- "Xia": "xk",
- "Xian": "xf",
- "Xiang": "xm",
- "Xiao": "xc",
- "Xie": "xp",
- "Xin": "xd",
- "Xing": "xv",
- "Xiong": "xj",
- "Xiu": "xt",
- "Xu": "xu",
- "Xuan": "xg",
- "Xue": "xb",
- "Xun": "xy",
- "Za": "za",
- "Zai": "zk",
- "Zan": "zj",
- "Zang": "zh",
- "Zao": "zs",
- "Ze": "ze",
- "Zei": "zw",
- "Zen": "zm",
- "Zeng": "zn",
- "Zha": "ea",
- "Zhai": "ek",
- "Zhan": "ej",
- "Zhang": "eh",
- "Zhao": "es",
- "Zhe": "ee",
- "Zhen": "em",
- "Zheng": "en",
- "Zhi": "ei",
- "Zhong": "el",
- "Zhou": "er",
- "Zhu": "eu",
- "Zhua": "ef",
- "Zhuai": "ev",
- "Zhuan": "eg",
- "Zhuang": "ez",
- "Zhui": "ed",
- "Zhun": "ey",
- "Zhuo": "eo",
- "Zi": "zi",
- "Zong": "zl",
- "Zou": "zr",
- "Zu": "zu",
- "Zuan": "zg",
- "Zui": "zd",
- "Zun": "zy",
- "Zuo": "zo"
- }
-}
\ No newline at end of file
+{"XiaoHe":{"Lv":"lv","Lve":"lt","Lue":"lt","Nv":"nv","Nve":"nt","Nue":"nt","A":"aa","O":"oo","E":"ee","Ai":"ai","Ei":"ei","Ao":"ao","Ou":"ou","An":"an","En":"en","Ang":"ah","Eng":"eg","Er":"er","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yc","You":"yz","Yan":"yj","Yin":"yb","Yang":"yh","Ying":"yk","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wd","Wei":"ww","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"yt","Yuan":"yr","Yun":"yy","Yong":"ys","Ba":"ba","Bai":"bd","Ban":"bj","Bang":"bh","Bao":"bc","Bei":"bw","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bm","Biang":"bl","Biao":"bn","Bie":"bp","Bin":"bb","Bing":"bk","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cd","Can":"cj","Cang":"ch","Cao":"cc","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ia","Chai":"id","Chan":"ij","Chang":"ih","Chao":"ic","Che":"ie","Chen":"if","Cheng":"ig","Chi":"ii","Chong":"is","Chou":"iz","Chu":"iu","Chua":"ix","Chuai":"ik","Chuan":"ir","Chuang":"il","Chui":"iv","Chun":"iy","Chuo":"io","Ci":"ci","Cong":"cs","Cou":"cz","Cu":"cu","Cuan":"cr","Cui":"cv","Cun":"cy","Cuo":"co","Da":"da","Dai":"dd","Dan":"dj","Dang":"dh","Dao":"dc","De":"de","Dei":"dw","Den":"df","Deng":"dg","Di":"di","Dia":"dx","Dian":"dm","Diao":"dn","Die":"dp","Ding":"dk","Diu":"dq","Dong":"ds","Dou":"dz","Du":"du","Duan":"dr","Dui":"dv","Dun":"dy","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fw","Fen":"ff","Feng":"fg","Fiao":"fn","Fo":"fo","Fou":"fz","Fu":"fu","Ga":"ga","Gai":"gd","Gan":"gj","Gang":"gh","Gao":"gc","Ge":"ge","Gei":"gw","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gz","Gu":"gu","Gua":"gx","Guai":"gk","Guan":"gr","Guang":"gl","Gui":"gv","Gun":"gy","Guo":"go","Ha":"ha","Hai":"hd","Han":"hj","Hang":"hh","Hao":"hc","He":"he","Hei":"hw","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hz","Hu":"hu","Hua":"hx","Huai":"hk","Huan":"hr","Huang":"hl","Hui":"hv","Hun":"hy","Huo":"ho","Ji":"ji","Jia":"jx","Jian":"jm","Jiang":"jl","Jiao":"jn","Jie":"jp","Jin":"jb","Jing":"jk","Jiong":"js","Jiu":"jq","Ju":"ju","Juan":"jr","Jue":"jt","Jun":"jy","Ka":"ka","Kai":"kd","Kan":"kj","Kang":"kh","Kao":"kc","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kz","Ku":"ku","Kua":"kx","Kuai":"kk","Kuan":"kr","Kuang":"kl","Kui":"kv","Kun":"ky","Kuo":"ko","La":"la","Lai":"ld","Lan":"lj","Lang":"lh","Lao":"lc","Le":"le","Lei":"lw","Leng":"lg","Li":"li","Lia":"lx","Lian":"lm","Liang":"ll","Liao":"ln","Lie":"lp","Lin":"lb","Ling":"lk","Liu":"lq","Lo":"lo","Long":"ls","Lou":"lz","Lu":"lu","Luan":"lr","Lun":"ly","Luo":"lo","Ma":"ma","Mai":"md","Man":"mj","Mang":"mh","Mao":"mc","Me":"me","Mei":"mw","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mm","Miao":"mn","Mie":"mp","Min":"mb","Ming":"mk","Miu":"mq","Mo":"mo","Mou":"mz","Mu":"mu","Na":"na","Nai":"nd","Nan":"nj","Nang":"nh","Nao":"nc","Ne":"ne","Nei":"nw","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nm","Niang":"nl","Niao":"nn","Nie":"np","Nin":"nb","Ning":"nk","Niu":"nq","Nong":"ns","Nou":"nz","Nu":"nu","Nuan":"nr","Nun":"ny","Nuo":"no","Pa":"pa","Pai":"pd","Pan":"pj","Pang":"ph","Pao":"pc","Pei":"pw","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pm","Piao":"pn","Pie":"pp","Pin":"pb","Ping":"pk","Po":"po","Pou":"pz","Pu":"pu","Qi":"qi","Qia":"qx","Qian":"qm","Qiang":"ql","Qiao":"qn","Qie":"qp","Qin":"qb","Qing":"qk","Qiong":"qs","Qiu":"qq","Qu":"qu","Quan":"qr","Que":"qt","Qun":"qy","Ran":"rj","Rang":"rh","Rao":"rc","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rz","Ru":"ru","Rua":"rx","Ruan":"rr","Rui":"rv","Run":"ry","Ruo":"ro","Sa":"sa","Sai":"sd","San":"sj","Sang":"sh","Sao":"sc","Se":"se","Sen":"sf","Seng":"sg","Sha":"ua","Shai":"ud","Shan":"uj","Shang":"uh","Shao":"uc","She":"ue","Shei":"uw","Shen":"uf","Sheng":"ug","Shi":"ui","Shou":"uz","Shu":"uu","Shua":"ux","Shuai":"uk","Shuan":"ur","Shuang":"ul","Shui":"uv","Shun":"uy","Shuo":"uo","Si":"si","Song":"ss","Sou":"sz","Su":"su","Suan":"sr","Sui":"sv","Sun":"sy","Suo":"so","Ta":"ta","Tai":"td","Tan":"tj","Tang":"th","Tao":"tc","Te":"te","Tei":"tw","Teng":"tg","Ti":"ti","Tian":"tm","Tiao":"tn","Tie":"tp","Ting":"tk","Tong":"ts","Tou":"tz","Tu":"tu","Tuan":"tr","Tui":"tv","Tun":"ty","Tuo":"to","Xi":"xi","Xia":"xx","Xian":"xm","Xiang":"xl","Xiao":"xn","Xie":"xp","Xin":"xb","Xing":"xk","Xiong":"xs","Xiu":"xq","Xu":"xu","Xuan":"xr","Xue":"xt","Xun":"xy","Za":"za","Zai":"zd","Zan":"zj","Zang":"zh","Zao":"zc","Ze":"ze","Zei":"zw","Zen":"zf","Zeng":"zg","Zha":"va","Zhai":"vd","Zhan":"vj","Zhang":"vh","Zhao":"vc","Zhe":"ve","Zhen":"vf","Zheng":"vg","Zhi":"vi","Zhong":"vs","Zhou":"vz","Zhu":"vu","Zhua":"vx","Zhuai":"vk","Zhuan":"vr","Zhuang":"vl","Zhui":"vv","Zhun":"vy","Zhuo":"vo","Zi":"zi","Zong":"zs","Zou":"zz","Zu":"zu","Zuan":"zr","Zui":"zv","Zun":"zy","Zuo":"zo"},"ZiRanMa":{"Lv":"lv","Lve":"lt","Lue":"lt","Nv":"nv","Nve":"nt","Nue":"nt","A":"aa","O":"oo","E":"ee","Ai":"ai","Ei":"ei","Ao":"ao","Ou":"ou","An":"an","En":"en","Ang":"ah","Eng":"eg","Er":"er","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yk","You":"yb","Yan":"yj","Yin":"yn","Yang":"yh","Ying":"yy","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wl","Wei":"wz","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"yt","Yuan":"yr","Yun":"yp","Yong":"ys","Ba":"ba","Bai":"bl","Ban":"bj","Bang":"bh","Bao":"bk","Bei":"bz","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bm","Biang":"bd","Biao":"bc","Bie":"bx","Bin":"bn","Bing":"by","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cl","Can":"cj","Cang":"ch","Cao":"ck","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ia","Chai":"il","Chan":"ij","Chang":"ih","Chao":"ik","Che":"ie","Chen":"if","Cheng":"ig","Chi":"ii","Chong":"is","Chou":"ib","Chu":"iu","Chua":"iw","Chuai":"iy","Chuan":"ir","Chuang":"id","Chui":"iv","Chun":"ip","Chuo":"io","Ci":"ci","Cong":"cs","Cou":"cb","Cu":"cu","Cuan":"cr","Cui":"cv","Cun":"cp","Cuo":"co","Da":"da","Dai":"dl","Dan":"dj","Dang":"dh","Dao":"dk","De":"de","Dei":"dz","Den":"df","Deng":"dg","Di":"di","Dia":"dw","Dian":"dm","Diao":"dc","Die":"dx","Ding":"dy","Diu":"dq","Dong":"ds","Dou":"db","Du":"du","Duan":"dr","Dui":"dv","Dun":"dp","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fz","Fen":"ff","Feng":"fg","Fiao":"fc","Fo":"fo","Fou":"fb","Fu":"fu","Ga":"ga","Gai":"gl","Gan":"gj","Gang":"gh","Gao":"gk","Ge":"ge","Gei":"gz","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gb","Gu":"gu","Gua":"gw","Guai":"gy","Guan":"gr","Guang":"gd","Gui":"gv","Gun":"gp","Guo":"go","Ha":"ha","Hai":"hl","Han":"hj","Hang":"hh","Hao":"hk","He":"he","Hei":"hz","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hb","Hu":"hu","Hua":"hw","Huai":"hy","Huan":"hr","Huang":"hd","Hui":"hv","Hun":"hp","Huo":"ho","Ji":"ji","Jia":"jw","Jian":"jm","Jiang":"jd","Jiao":"jc","Jie":"jx","Jin":"jn","Jing":"jy","Jiong":"js","Jiu":"jq","Ju":"ju","Juan":"jr","Jue":"jt","Jun":"jp","Ka":"ka","Kai":"kl","Kan":"kj","Kang":"kh","Kao":"kk","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kb","Ku":"ku","Kua":"kw","Kuai":"ky","Kuan":"kr","Kuang":"kd","Kui":"kv","Kun":"kp","Kuo":"ko","La":"la","Lai":"ll","Lan":"lj","Lang":"lh","Lao":"lk","Le":"le","Lei":"lz","Leng":"lg","Li":"li","Lia":"lw","Lian":"lm","Liang":"ld","Liao":"lc","Lie":"lx","Lin":"ln","Ling":"ly","Liu":"lq","Lo":"lo","Long":"ls","Lou":"lb","Lu":"lu","Luan":"lr","Lun":"lp","Luo":"lo","Ma":"ma","Mai":"ml","Man":"mj","Mang":"mh","Mao":"mk","Me":"me","Mei":"mz","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mm","Miao":"mc","Mie":"mx","Min":"mn","Ming":"my","Miu":"mq","Mo":"mo","Mou":"mb","Mu":"mu","Na":"na","Nai":"nl","Nan":"nj","Nang":"nh","Nao":"nk","Ne":"ne","Nei":"nz","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nm","Niang":"nd","Niao":"nc","Nie":"nx","Nin":"nn","Ning":"ny","Niu":"nq","Nong":"ns","Nou":"nb","Nu":"nu","Nuan":"nr","Nun":"np","Nuo":"no","Pa":"pa","Pai":"pl","Pan":"pj","Pang":"ph","Pao":"pk","Pei":"pz","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pm","Piao":"pc","Pie":"px","Pin":"pn","Ping":"py","Po":"po","Pou":"pb","Pu":"pu","Qi":"qi","Qia":"qw","Qian":"qm","Qiang":"qd","Qiao":"qc","Qie":"qx","Qin":"qn","Qing":"qy","Qiong":"qs","Qiu":"qq","Qu":"qu","Quan":"qr","Que":"qt","Qun":"qp","Ran":"rj","Rang":"rh","Rao":"rk","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rb","Ru":"ru","Rua":"rw","Ruan":"rr","Rui":"rv","Run":"rp","Ruo":"ro","Sa":"sa","Sai":"sl","San":"sj","Sang":"sh","Sao":"sk","Se":"se","Sen":"sf","Seng":"sg","Sha":"ua","Shai":"ul","Shan":"uj","Shang":"uh","Shao":"uk","She":"ue","Shei":"uz","Shen":"uf","Sheng":"ug","Shi":"ui","Shou":"ub","Shu":"uu","Shua":"uw","Shuai":"uy","Shuan":"ur","Shuang":"ud","Shui":"uv","Shun":"up","Shuo":"uo","Si":"si","Song":"ss","Sou":"sb","Su":"su","Suan":"sr","Sui":"sv","Sun":"sp","Suo":"so","Ta":"ta","Tai":"tl","Tan":"tj","Tang":"th","Tao":"tk","Te":"te","Tei":"tz","Teng":"tg","Ti":"ti","Tian":"tm","Tiao":"tc","Tie":"tx","Ting":"ty","Tong":"ts","Tou":"tb","Tu":"tu","Tuan":"tr","Tui":"tv","Tun":"tp","Tuo":"to","Xi":"xi","Xia":"xw","Xian":"xm","Xiang":"xd","Xiao":"xc","Xie":"xx","Xin":"xn","Xing":"xy","Xiong":"xs","Xiu":"xq","Xu":"xu","Xuan":"xr","Xue":"xt","Xun":"xp","Za":"za","Zai":"zl","Zan":"zj","Zang":"zh","Zao":"zk","Ze":"ze","Zei":"zz","Zen":"zf","Zeng":"zg","Zha":"va","Zhai":"vl","Zhan":"vj","Zhang":"vh","Zhao":"vk","Zhe":"ve","Zhen":"vf","Zheng":"vg","Zhi":"vi","Zhong":"vs","Zhou":"vb","Zhu":"vu","Zhua":"vw","Zhuai":"vy","Zhuan":"vr","Zhuang":"vd","Zhui":"vv","Zhun":"vp","Zhuo":"vo","Zi":"zi","Zong":"zs","Zou":"zb","Zu":"zu","Zuan":"zr","Zui":"zv","Zun":"zp","Zuo":"zo"},"WeiRuan":{"Lv":"ly","Lve":"lt","Lue":"lt","Nv":"ny","Nve":"nt","Nue":"nt","A":"oa","O":"oo","E":"oe","Ai":"ol","Ei":"oz","Ao":"ok","Ou":"ob","An":"oj","En":"of","Ang":"oh","Eng":"og","Er":"or","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yk","You":"yb","Yan":"yj","Yin":"yn","Yang":"yh","Ying":"y;","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wl","Wei":"wz","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"yt","Yuan":"yr","Yun":"yp","Yong":"ys","Ba":"ba","Bai":"bl","Ban":"bj","Bang":"bh","Bao":"bk","Bei":"bz","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bm","Biang":"bd","Biao":"bc","Bie":"bx","Bin":"bn","Bing":"b;","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cl","Can":"cj","Cang":"ch","Cao":"ck","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ia","Chai":"il","Chan":"ij","Chang":"ih","Chao":"ik","Che":"ie","Chen":"if","Cheng":"ig","Chi":"ii","Chong":"is","Chou":"ib","Chu":"iu","Chua":"iw","Chuai":"iy","Chuan":"ir","Chuang":"id","Chui":"iv","Chun":"ip","Chuo":"io","Ci":"ci","Cong":"cs","Cou":"cb","Cu":"cu","Cuan":"cr","Cui":"cv","Cun":"cp","Cuo":"co","Da":"da","Dai":"dl","Dan":"dj","Dang":"dh","Dao":"dk","De":"de","Dei":"dz","Den":"df","Deng":"dg","Di":"di","Dia":"dw","Dian":"dm","Diao":"dc","Die":"dx","Ding":"d;","Diu":"dq","Dong":"ds","Dou":"db","Du":"du","Duan":"dr","Dui":"dv","Dun":"dp","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fz","Fen":"ff","Feng":"fg","Fiao":"fc","Fo":"fo","Fou":"fb","Fu":"fu","Ga":"ga","Gai":"gl","Gan":"gj","Gang":"gh","Gao":"gk","Ge":"ge","Gei":"gz","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gb","Gu":"gu","Gua":"gw","Guai":"gy","Guan":"gr","Guang":"gd","Gui":"gv","Gun":"gp","Guo":"go","Ha":"ha","Hai":"hl","Han":"hj","Hang":"hh","Hao":"hk","He":"he","Hei":"hz","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hb","Hu":"hu","Hua":"hw","Huai":"hy","Huan":"hr","Huang":"hd","Hui":"hv","Hun":"hp","Huo":"ho","Ji":"ji","Jia":"jw","Jian":"jm","Jiang":"jd","Jiao":"jc","Jie":"jx","Jin":"jn","Jing":"j;","Jiong":"js","Jiu":"jq","Ju":"ju","Juan":"jr","Jue":"jt","Jun":"jp","Ka":"ka","Kai":"kl","Kan":"kj","Kang":"kh","Kao":"kk","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kb","Ku":"ku","Kua":"kw","Kuai":"ky","Kuan":"kr","Kuang":"kd","Kui":"kv","Kun":"kp","Kuo":"ko","La":"la","Lai":"ll","Lan":"lj","Lang":"lh","Lao":"lk","Le":"le","Lei":"lz","Leng":"lg","Li":"li","Lia":"lw","Lian":"lm","Liang":"ld","Liao":"lc","Lie":"lx","Lin":"ln","Ling":"l;","Liu":"lq","Lo":"lo","Long":"ls","Lou":"lb","Lu":"lu","Luan":"lr","Lun":"lp","Luo":"lo","Ma":"ma","Mai":"ml","Man":"mj","Mang":"mh","Mao":"mk","Me":"me","Mei":"mz","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mm","Miao":"mc","Mie":"mx","Min":"mn","Ming":"m;","Miu":"mq","Mo":"mo","Mou":"mb","Mu":"mu","Na":"na","Nai":"nl","Nan":"nj","Nang":"nh","Nao":"nk","Ne":"ne","Nei":"nz","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nm","Niang":"nd","Niao":"nc","Nie":"nx","Nin":"nn","Ning":"n;","Niu":"nq","Nong":"ns","Nou":"nb","Nu":"nu","Nuan":"nr","Nun":"np","Nuo":"no","Pa":"pa","Pai":"pl","Pan":"pj","Pang":"ph","Pao":"pk","Pei":"pz","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pm","Piao":"pc","Pie":"px","Pin":"pn","Ping":"p;","Po":"po","Pou":"pb","Pu":"pu","Qi":"qi","Qia":"qw","Qian":"qm","Qiang":"qd","Qiao":"qc","Qie":"qx","Qin":"qn","Qing":"q;","Qiong":"qs","Qiu":"qq","Qu":"qu","Quan":"qr","Que":"qt","Qun":"qp","Ran":"rj","Rang":"rh","Rao":"rk","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rb","Ru":"ru","Rua":"rw","Ruan":"rr","Rui":"rv","Run":"rp","Ruo":"ro","Sa":"sa","Sai":"sl","San":"sj","Sang":"sh","Sao":"sk","Se":"se","Sen":"sf","Seng":"sg","Sha":"ua","Shai":"ul","Shan":"uj","Shang":"uh","Shao":"uk","She":"ue","Shei":"uz","Shen":"uf","Sheng":"ug","Shi":"ui","Shou":"ub","Shu":"uu","Shua":"uw","Shuai":"uy","Shuan":"ur","Shuang":"ud","Shui":"uv","Shun":"up","Shuo":"uo","Si":"si","Song":"ss","Sou":"sb","Su":"su","Suan":"sr","Sui":"sv","Sun":"sp","Suo":"so","Ta":"ta","Tai":"tl","Tan":"tj","Tang":"th","Tao":"tk","Te":"te","Tei":"tz","Teng":"tg","Ti":"ti","Tian":"tm","Tiao":"tc","Tie":"tx","Ting":"t;","Tong":"ts","Tou":"tb","Tu":"tu","Tuan":"tr","Tui":"tv","Tun":"tp","Tuo":"to","Xi":"xi","Xia":"xw","Xian":"xm","Xiang":"xd","Xiao":"xc","Xie":"xx","Xin":"xn","Xing":"x;","Xiong":"xs","Xiu":"xq","Xu":"xu","Xuan":"xr","Xue":"xt","Xun":"xp","Za":"za","Zai":"zl","Zan":"zj","Zang":"zh","Zao":"zk","Ze":"ze","Zei":"zz","Zen":"zf","Zeng":"zg","Zha":"va","Zhai":"vl","Zhan":"vj","Zhang":"vh","Zhao":"vk","Zhe":"ve","Zhen":"vf","Zheng":"vg","Zhi":"vi","Zhong":"vs","Zhou":"vb","Zhu":"vu","Zhua":"vw","Zhuai":"vy","Zhuan":"vr","Zhuang":"vd","Zhui":"vv","Zhun":"vp","Zhuo":"vo","Zi":"zi","Zong":"zs","Zou":"zb","Zu":"zu","Zuan":"zr","Zui":"zv","Zun":"zp","Zuo":"zo"},"ZhiNengABC":{"Lv":"lv","Lve":"lm","Lue":"lm","Nv":"nv","Nve":"nm","Nue":"nm","A":"oa","O":"oo","E":"oe","Ai":"ol","Ei":"oq","Ao":"ok","Ou":"ob","An":"oj","En":"of","Ang":"oh","Eng":"og","Er":"or","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yk","You":"yb","Yan":"yj","Yin":"yc","Yang":"yh","Ying":"yy","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wl","Wei":"wq","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"ym","Yuan":"yp","Yun":"yn","Yong":"ys","Ba":"ba","Bai":"bl","Ban":"bj","Bang":"bh","Bao":"bk","Bei":"bq","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bw","Biang":"bt","Biao":"bz","Bie":"bx","Bin":"bc","Bing":"by","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cl","Can":"cj","Cang":"ch","Cao":"ck","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ea","Chai":"el","Chan":"ej","Chang":"eh","Chao":"ek","Che":"ee","Chen":"ef","Cheng":"eg","Chi":"ei","Chong":"es","Chou":"eb","Chu":"eu","Chua":"ed","Chuai":"ec","Chuan":"ep","Chuang":"et","Chui":"em","Chun":"en","Chuo":"eo","Ci":"ci","Cong":"cs","Cou":"cb","Cu":"cu","Cuan":"cp","Cui":"cm","Cun":"cn","Cuo":"co","Da":"da","Dai":"dl","Dan":"dj","Dang":"dh","Dao":"dk","De":"de","Dei":"dq","Den":"df","Deng":"dg","Di":"di","Dia":"dd","Dian":"dw","Diao":"dz","Die":"dx","Ding":"dy","Diu":"dr","Dong":"ds","Dou":"db","Du":"du","Duan":"dp","Dui":"dm","Dun":"dn","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fq","Fen":"ff","Feng":"fg","Fiao":"fz","Fo":"fo","Fou":"fb","Fu":"fu","Ga":"ga","Gai":"gl","Gan":"gj","Gang":"gh","Gao":"gk","Ge":"ge","Gei":"gq","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gb","Gu":"gu","Gua":"gd","Guai":"gc","Guan":"gp","Guang":"gt","Gui":"gm","Gun":"gn","Guo":"go","Ha":"ha","Hai":"hl","Han":"hj","Hang":"hh","Hao":"hk","He":"he","Hei":"hq","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hb","Hu":"hu","Hua":"hd","Huai":"hc","Huan":"hp","Huang":"ht","Hui":"hm","Hun":"hn","Huo":"ho","Ji":"ji","Jia":"jd","Jian":"jw","Jiang":"jt","Jiao":"jz","Jie":"jx","Jin":"jc","Jing":"jy","Jiong":"js","Jiu":"jr","Ju":"ju","Juan":"jp","Jue":"jm","Jun":"jn","Ka":"ka","Kai":"kl","Kan":"kj","Kang":"kh","Kao":"kk","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kb","Ku":"ku","Kua":"kd","Kuai":"kc","Kuan":"kp","Kuang":"kt","Kui":"km","Kun":"kn","Kuo":"ko","La":"la","Lai":"ll","Lan":"lj","Lang":"lh","Lao":"lk","Le":"le","Lei":"lq","Leng":"lg","Li":"li","Lia":"ld","Lian":"lw","Liang":"lt","Liao":"lz","Lie":"lx","Lin":"lc","Ling":"ly","Liu":"lr","Lo":"lo","Long":"ls","Lou":"lb","Lu":"lu","Luan":"lp","Lun":"ln","Luo":"lo","Ma":"ma","Mai":"ml","Man":"mj","Mang":"mh","Mao":"mk","Me":"me","Mei":"mq","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mw","Miao":"mz","Mie":"mx","Min":"mc","Ming":"my","Miu":"mr","Mo":"mo","Mou":"mb","Mu":"mu","Na":"na","Nai":"nl","Nan":"nj","Nang":"nh","Nao":"nk","Ne":"ne","Nei":"nq","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nw","Niang":"nt","Niao":"nz","Nie":"nx","Nin":"nc","Ning":"ny","Niu":"nr","Nong":"ns","Nou":"nb","Nu":"nu","Nuan":"np","Nun":"nn","Nuo":"no","Pa":"pa","Pai":"pl","Pan":"pj","Pang":"ph","Pao":"pk","Pei":"pq","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pw","Piao":"pz","Pie":"px","Pin":"pc","Ping":"py","Po":"po","Pou":"pb","Pu":"pu","Qi":"qi","Qia":"qd","Qian":"qw","Qiang":"qt","Qiao":"qz","Qie":"qx","Qin":"qc","Qing":"qy","Qiong":"qs","Qiu":"qr","Qu":"qu","Quan":"qp","Que":"qm","Qun":"qn","Ran":"rj","Rang":"rh","Rao":"rk","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rb","Ru":"ru","Rua":"rd","Ruan":"rp","Rui":"rm","Run":"rn","Ruo":"ro","Sa":"sa","Sai":"sl","San":"sj","Sang":"sh","Sao":"sk","Se":"se","Sen":"sf","Seng":"sg","Sha":"va","Shai":"vl","Shan":"vj","Shang":"vh","Shao":"vk","She":"ve","Shei":"vq","Shen":"vf","Sheng":"vg","Shi":"vi","Shou":"vb","Shu":"vu","Shua":"vd","Shuai":"vc","Shuan":"vp","Shuang":"vt","Shui":"vm","Shun":"vn","Shuo":"vo","Si":"si","Song":"ss","Sou":"sb","Su":"su","Suan":"sp","Sui":"sm","Sun":"sn","Suo":"so","Ta":"ta","Tai":"tl","Tan":"tj","Tang":"th","Tao":"tk","Te":"te","Tei":"tq","Teng":"tg","Ti":"ti","Tian":"tw","Tiao":"tz","Tie":"tx","Ting":"ty","Tong":"ts","Tou":"tb","Tu":"tu","Tuan":"tp","Tui":"tm","Tun":"tn","Tuo":"to","Xi":"xi","Xia":"xd","Xian":"xw","Xiang":"xt","Xiao":"xz","Xie":"xx","Xin":"xc","Xing":"xy","Xiong":"xs","Xiu":"xr","Xu":"xu","Xuan":"xp","Xue":"xm","Xun":"xn","Za":"za","Zai":"zl","Zan":"zj","Zang":"zh","Zao":"zk","Ze":"ze","Zei":"zq","Zen":"zf","Zeng":"zg","Zha":"aa","Zhai":"al","Zhan":"aj","Zhang":"ah","Zhao":"ak","Zhe":"ae","Zhen":"af","Zheng":"ag","Zhi":"ai","Zhong":"as","Zhou":"ab","Zhu":"au","Zhua":"ad","Zhuai":"ac","Zhuan":"ap","Zhuang":"at","Zhui":"am","Zhun":"an","Zhuo":"ao","Zi":"zi","Zong":"zs","Zou":"zb","Zu":"zu","Zuan":"zp","Zui":"zm","Zun":"zn","Zuo":"zo"},"ZiGuangPinYin":{"Lv":"lv","Lve":"ln","Lue":"ln","Nv":"nv","Nve":"nn","Nue":"nn","A":"oa","O":"oo","E":"oe","Ai":"op","Ei":"ok","Ao":"oq","Ou":"oz","An":"or","En":"ow","Ang":"os","Eng":"ot","Er":"oj","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yq","You":"yz","Yan":"yr","Yin":"yy","Yang":"ys","Ying":"yc","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wp","Wei":"wk","Wan":"wr","Wen":"ww","Wang":"ws","Weng":"wt","Yu":"yu","Yue":"yn","Yuan":"yl","Yun":"ym","Yong":"yh","Ba":"ba","Bai":"bp","Ban":"br","Bang":"bs","Bao":"bq","Bei":"bk","Ben":"bw","Beng":"bt","Bi":"bi","Bian":"bf","Biang":"bg","Biao":"bb","Bie":"bd","Bin":"by","Bing":"bc","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cp","Can":"cr","Cang":"cs","Cao":"cq","Ce":"ce","Cen":"cw","Ceng":"ct","Cha":"aa","Chai":"ap","Chan":"ar","Chang":"as","Chao":"aq","Che":"ae","Chen":"aw","Cheng":"at","Chi":"ai","Chong":"ah","Chou":"az","Chu":"au","Chua":"ax","Chuai":"ay","Chuan":"al","Chuang":"ag","Chui":"an","Chun":"am","Chuo":"ao","Ci":"ci","Cong":"ch","Cou":"cz","Cu":"cu","Cuan":"cl","Cui":"cn","Cun":"cm","Cuo":"co","Da":"da","Dai":"dp","Dan":"dr","Dang":"ds","Dao":"dq","De":"de","Dei":"dk","Den":"dw","Deng":"dt","Di":"di","Dia":"dx","Dian":"df","Diao":"db","Die":"dd","Ding":"dc","Diu":"dj","Dong":"dh","Dou":"dz","Du":"du","Duan":"dl","Dui":"dn","Dun":"dm","Duo":"do","Fa":"fa","Fan":"fr","Fang":"fs","Fei":"fk","Fen":"fw","Feng":"ft","Fiao":"fb","Fo":"fo","Fou":"fz","Fu":"fu","Ga":"ga","Gai":"gp","Gan":"gr","Gang":"gs","Gao":"gq","Ge":"ge","Gei":"gk","Gen":"gw","Geng":"gt","Gong":"gh","Gou":"gz","Gu":"gu","Gua":"gx","Guai":"gy","Guan":"gl","Guang":"gg","Gui":"gn","Gun":"gm","Guo":"go","Ha":"ha","Hai":"hp","Han":"hr","Hang":"hs","Hao":"hq","He":"he","Hei":"hk","Hen":"hw","Heng":"ht","Hong":"hh","Hou":"hz","Hu":"hu","Hua":"hx","Huai":"hy","Huan":"hl","Huang":"hg","Hui":"hn","Hun":"hm","Huo":"ho","Ji":"ji","Jia":"jx","Jian":"jf","Jiang":"jg","Jiao":"jb","Jie":"jd","Jin":"jy","Jing":"jc","Jiong":"jh","Jiu":"jj","Ju":"ju","Juan":"jl","Jue":"jn","Jun":"jm","Ka":"ka","Kai":"kp","Kan":"kr","Kang":"ks","Kao":"kq","Ke":"ke","Ken":"kw","Keng":"kt","Kong":"kh","Kou":"kz","Ku":"ku","Kua":"kx","Kuai":"ky","Kuan":"kl","Kuang":"kg","Kui":"kn","Kun":"km","Kuo":"ko","La":"la","Lai":"lp","Lan":"lr","Lang":"ls","Lao":"lq","Le":"le","Lei":"lk","Leng":"lt","Li":"li","Lia":"lx","Lian":"lf","Liang":"lg","Liao":"lb","Lie":"ld","Lin":"ly","Ling":"lc","Liu":"lj","Lo":"lo","Long":"lh","Lou":"lz","Lu":"lu","Luan":"ll","Lun":"lm","Luo":"lo","Ma":"ma","Mai":"mp","Man":"mr","Mang":"ms","Mao":"mq","Me":"me","Mei":"mk","Men":"mw","Meng":"mt","Mi":"mi","Mian":"mf","Miao":"mb","Mie":"md","Min":"my","Ming":"mc","Miu":"mj","Mo":"mo","Mou":"mz","Mu":"mu","Na":"na","Nai":"np","Nan":"nr","Nang":"ns","Nao":"nq","Ne":"ne","Nei":"nk","Nen":"nw","Neng":"nt","Ni":"ni","Nian":"nf","Niang":"ng","Niao":"nb","Nie":"nd","Nin":"ny","Ning":"nc","Niu":"nj","Nong":"nh","Nou":"nz","Nu":"nu","Nuan":"nl","Nun":"nm","Nuo":"no","Pa":"pa","Pai":"pp","Pan":"pr","Pang":"ps","Pao":"pq","Pei":"pk","Pen":"pw","Peng":"pt","Pi":"pi","Pian":"pf","Piao":"pb","Pie":"pd","Pin":"py","Ping":"pc","Po":"po","Pou":"pz","Pu":"pu","Qi":"qi","Qia":"qx","Qian":"qf","Qiang":"qg","Qiao":"qb","Qie":"qd","Qin":"qy","Qing":"qc","Qiong":"qh","Qiu":"qj","Qu":"qu","Quan":"ql","Que":"qn","Qun":"qm","Ran":"rr","Rang":"rs","Rao":"rq","Re":"re","Ren":"rw","Reng":"rt","Ri":"ri","Rong":"rh","Rou":"rz","Ru":"ru","Rua":"rx","Ruan":"rl","Rui":"rn","Run":"rm","Ruo":"ro","Sa":"sa","Sai":"sp","San":"sr","Sang":"ss","Sao":"sq","Se":"se","Sen":"sw","Seng":"st","Sha":"ia","Shai":"ip","Shan":"ir","Shang":"is","Shao":"iq","She":"ie","Shei":"ik","Shen":"iw","Sheng":"it","Shi":"ii","Shou":"iz","Shu":"iu","Shua":"ix","Shuai":"iy","Shuan":"il","Shuang":"ig","Shui":"in","Shun":"im","Shuo":"io","Si":"si","Song":"sh","Sou":"sz","Su":"su","Suan":"sl","Sui":"sn","Sun":"sm","Suo":"so","Ta":"ta","Tai":"tp","Tan":"tr","Tang":"ts","Tao":"tq","Te":"te","Tei":"tk","Teng":"tt","Ti":"ti","Tian":"tf","Tiao":"tb","Tie":"td","Ting":"tc","Tong":"th","Tou":"tz","Tu":"tu","Tuan":"tl","Tui":"tn","Tun":"tm","Tuo":"to","Xi":"xi","Xia":"xx","Xian":"xf","Xiang":"xg","Xiao":"xb","Xie":"xd","Xin":"xy","Xing":"xc","Xiong":"xh","Xiu":"xj","Xu":"xu","Xuan":"xl","Xue":"xn","Xun":"xm","Za":"za","Zai":"zp","Zan":"zr","Zang":"zs","Zao":"zq","Ze":"ze","Zei":"zk","Zen":"zw","Zeng":"zt","Zha":"ua","Zhai":"up","Zhan":"ur","Zhang":"us","Zhao":"uq","Zhe":"ue","Zhen":"uw","Zheng":"ut","Zhi":"ui","Zhong":"uh","Zhou":"uz","Zhu":"uu","Zhua":"ux","Zhuai":"uy","Zhuan":"ul","Zhuang":"ug","Zhui":"un","Zhun":"um","Zhuo":"uo","Zi":"zi","Zong":"zh","Zou":"zz","Zu":"zu","Zuan":"zl","Zui":"zn","Zun":"zm","Zuo":"zo"},"PinYinJiaJia":{"Lv":"lv","Lve":"lx","Lue":"lx","Nv":"nv","Nve":"nx","Nue":"nx","A":"aa","O":"oo","E":"ee","Ai":"as","Ei":"ew","Ao":"ad","Ou":"op","An":"af","En":"er","Ang":"ag","Eng":"et","Er":"eq","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yd","You":"yp","Yan":"yf","Yin":"yl","Yang":"yg","Ying":"yq","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"ws","Wei":"ww","Wan":"wf","Wen":"wr","Wang":"wg","Weng":"wt","Yu":"yu","Yue":"yx","Yuan":"yc","Yun":"yz","Yong":"yy","Ba":"ba","Bai":"bs","Ban":"bf","Bang":"bg","Bao":"bd","Bei":"bw","Ben":"br","Beng":"bt","Bi":"bi","Bian":"bj","Biang":"bh","Biao":"bk","Bie":"bm","Bin":"bl","Bing":"bq","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cs","Can":"cf","Cang":"cg","Cao":"cd","Ce":"ce","Cen":"cr","Ceng":"ct","Cha":"ua","Chai":"us","Chan":"uf","Chang":"ug","Chao":"ud","Che":"ue","Chen":"ur","Cheng":"ut","Chi":"ui","Chong":"uy","Chou":"up","Chu":"uu","Chua":"ub","Chuai":"ux","Chuan":"uc","Chuang":"uh","Chui":"uv","Chun":"uz","Chuo":"uo","Ci":"ci","Cong":"cy","Cou":"cp","Cu":"cu","Cuan":"cc","Cui":"cv","Cun":"cz","Cuo":"co","Da":"da","Dai":"ds","Dan":"df","Dang":"dg","Dao":"dd","De":"de","Dei":"dw","Den":"dr","Deng":"dt","Di":"di","Dia":"db","Dian":"dj","Diao":"dk","Die":"dm","Ding":"dq","Diu":"dn","Dong":"dy","Dou":"dp","Du":"du","Duan":"dc","Dui":"dv","Dun":"dz","Duo":"do","Fa":"fa","Fan":"ff","Fang":"fg","Fei":"fw","Fen":"fr","Feng":"ft","Fiao":"fk","Fo":"fo","Fou":"fp","Fu":"fu","Ga":"ga","Gai":"gs","Gan":"gf","Gang":"gg","Gao":"gd","Ge":"ge","Gei":"gw","Gen":"gr","Geng":"gt","Gong":"gy","Gou":"gp","Gu":"gu","Gua":"gb","Guai":"gx","Guan":"gc","Guang":"gh","Gui":"gv","Gun":"gz","Guo":"go","Ha":"ha","Hai":"hs","Han":"hf","Hang":"hg","Hao":"hd","He":"he","Hei":"hw","Hen":"hr","Heng":"ht","Hong":"hy","Hou":"hp","Hu":"hu","Hua":"hb","Huai":"hx","Huan":"hc","Huang":"hh","Hui":"hv","Hun":"hz","Huo":"ho","Ji":"ji","Jia":"jb","Jian":"jj","Jiang":"jh","Jiao":"jk","Jie":"jm","Jin":"jl","Jing":"jq","Jiong":"jy","Jiu":"jn","Ju":"ju","Juan":"jc","Jue":"jx","Jun":"jz","Ka":"ka","Kai":"ks","Kan":"kf","Kang":"kg","Kao":"kd","Ke":"ke","Ken":"kr","Keng":"kt","Kong":"ky","Kou":"kp","Ku":"ku","Kua":"kb","Kuai":"kx","Kuan":"kc","Kuang":"kh","Kui":"kv","Kun":"kz","Kuo":"ko","La":"la","Lai":"ls","Lan":"lf","Lang":"lg","Lao":"ld","Le":"le","Lei":"lw","Leng":"lt","Li":"li","Lia":"lb","Lian":"lj","Liang":"lh","Liao":"lk","Lie":"lm","Lin":"ll","Ling":"lq","Liu":"ln","Lo":"lo","Long":"ly","Lou":"lp","Lu":"lu","Luan":"lc","Lun":"lz","Luo":"lo","Ma":"ma","Mai":"ms","Man":"mf","Mang":"mg","Mao":"md","Me":"me","Mei":"mw","Men":"mr","Meng":"mt","Mi":"mi","Mian":"mj","Miao":"mk","Mie":"mm","Min":"ml","Ming":"mq","Miu":"mn","Mo":"mo","Mou":"mp","Mu":"mu","Na":"na","Nai":"ns","Nan":"nf","Nang":"ng","Nao":"nd","Ne":"ne","Nei":"nw","Nen":"nr","Neng":"nt","Ni":"ni","Nian":"nj","Niang":"nh","Niao":"nk","Nie":"nm","Nin":"nl","Ning":"nq","Niu":"nn","Nong":"ny","Nou":"np","Nu":"nu","Nuan":"nc","Nun":"nz","Nuo":"no","Pa":"pa","Pai":"ps","Pan":"pf","Pang":"pg","Pao":"pd","Pei":"pw","Pen":"pr","Peng":"pt","Pi":"pi","Pian":"pj","Piao":"pk","Pie":"pm","Pin":"pl","Ping":"pq","Po":"po","Pou":"pp","Pu":"pu","Qi":"qi","Qia":"qb","Qian":"qj","Qiang":"qh","Qiao":"qk","Qie":"qm","Qin":"ql","Qing":"qq","Qiong":"qy","Qiu":"qn","Qu":"qu","Quan":"qc","Que":"qx","Qun":"qz","Ran":"rf","Rang":"rg","Rao":"rd","Re":"re","Ren":"rr","Reng":"rt","Ri":"ri","Rong":"ry","Rou":"rp","Ru":"ru","Rua":"rb","Ruan":"rc","Rui":"rv","Run":"rz","Ruo":"ro","Sa":"sa","Sai":"ss","San":"sf","Sang":"sg","Sao":"sd","Se":"se","Sen":"sr","Seng":"st","Sha":"ia","Shai":"is","Shan":"if","Shang":"ig","Shao":"id","She":"ie","Shei":"iw","Shen":"ir","Sheng":"it","Shi":"ii","Shou":"ip","Shu":"iu","Shua":"ib","Shuai":"ix","Shuan":"ic","Shuang":"ih","Shui":"iv","Shun":"iz","Shuo":"io","Si":"si","Song":"sy","Sou":"sp","Su":"su","Suan":"sc","Sui":"sv","Sun":"sz","Suo":"so","Ta":"ta","Tai":"ts","Tan":"tf","Tang":"tg","Tao":"td","Te":"te","Tei":"tw","Teng":"tt","Ti":"ti","Tian":"tj","Tiao":"tk","Tie":"tm","Ting":"tq","Tong":"ty","Tou":"tp","Tu":"tu","Tuan":"tc","Tui":"tv","Tun":"tz","Tuo":"to","Xi":"xi","Xia":"xb","Xian":"xj","Xiang":"xh","Xiao":"xk","Xie":"xm","Xin":"xl","Xing":"xq","Xiong":"xy","Xiu":"xn","Xu":"xu","Xuan":"xc","Xue":"xx","Xun":"xz","Za":"za","Zai":"zs","Zan":"zf","Zang":"zg","Zao":"zd","Ze":"ze","Zei":"zw","Zen":"zr","Zeng":"zt","Zha":"va","Zhai":"vs","Zhan":"vf","Zhang":"vg","Zhao":"vd","Zhe":"ve","Zhen":"vr","Zheng":"vt","Zhi":"vi","Zhong":"vy","Zhou":"vp","Zhu":"vu","Zhua":"vb","Zhuai":"vx","Zhuan":"vc","Zhuang":"vh","Zhui":"vv","Zhun":"vz","Zhuo":"vo","Zi":"zi","Zong":"zy","Zou":"zp","Zu":"zu","Zuan":"zc","Zui":"zv","Zun":"zz","Zuo":"zo"},"XingKongJianDao":{"Lv":"lv","Lve":"ly","Lue":"ly","Nv":"nv","Nve":"ny","Nue":"ny","A":"xa","O":"xo","E":"xe","Ai":"xj","Ei":"xw","Ao":"xs","Ou":"xt","An":"xd","En":"xk","Ang":"xf","Eng":"xh","Er":"xu","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"ys","You":"yt","Yan":"yd","Yin":"yb","Yang":"yf","Ying":"yg","Wu":"wj","Wa":"ws","Wo":"wo","Wai":"wh","Wei":"ww","Wan":"wf","Wen":"wn","Wang":"wp","Weng":"wr","Yu":"yv","Yue":"yy","Yuan":"yr","Yun":"yw","Yong":"yl","Ba":"ba","Bai":"bj","Ban":"bd","Bang":"bf","Bao":"bs","Bei":"bw","Ben":"bk","Beng":"bh","Bi":"bi","Bian":"bm","Biang":"bx","Biao":"bp","Bie":"bc","Bin":"bb","Bing":"bg","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cj","Can":"cd","Cang":"cf","Cao":"cs","Ce":"ce","Cen":"ck","Ceng":"ch","Cha":"ja","Chai":"jj","Chan":"jd","Chang":"jf","Chao":"js","Che":"je","Chen":"jk","Cheng":"jh","Chi":"wi","Chong":"wl","Chou":"jt","Chu":"ju","Chua":"wx","Chuai":"wg","Chuan":"wr","Chuang":"wn","Chui":"wy","Chun":"jz","Chuo":"jo","Ci":"ci","Cong":"cl","Cou":"ct","Cu":"cu","Cuan":"cr","Cui":"cy","Cun":"cz","Cuo":"co","Da":"da","Dai":"dj","Dan":"dd","Dang":"df","Dao":"ds","De":"de","Dei":"dw","Den":"dk","Deng":"dh","Di":"di","Dia":"dx","Dian":"dm","Diao":"dp","Die":"dc","Ding":"dg","Diu":"dq","Dong":"dl","Dou":"dt","Du":"du","Duan":"dr","Dui":"dy","Dun":"dz","Duo":"do","Fa":"fs","Fan":"ff","Fang":"fp","Fei":"fw","Fen":"fn","Feng":"fr","Fiao":"fp","Fo":"fl","Fou":"fd","Fu":"fl","Ga":"ga","Gai":"gj","Gan":"gd","Gang":"gf","Gao":"gs","Ge":"ge","Gei":"gw","Gen":"gk","Geng":"gh","Gong":"gl","Gou":"gt","Gu":"gu","Gua":"gx","Guai":"gg","Guan":"gr","Guang":"gn","Gui":"gy","Gun":"gz","Guo":"go","Ha":"ha","Hai":"hj","Han":"hd","Hang":"hf","Hao":"hs","He":"he","Hei":"hw","Hen":"hk","Heng":"hh","Hong":"hl","Hou":"ht","Hu":"hu","Hua":"hx","Huai":"hg","Huan":"hr","Huang":"hn","Hui":"hy","Hun":"hz","Huo":"ho","Ji":"jk","Jia":"js","Jian":"jm","Jiang":"jn","Jiao":"jp","Jie":"jc","Jin":"jb","Jing":"jg","Jiong":"jy","Jiu":"jq","Ju":"jv","Juan":"jt","Jue":"jh","Jun":"jw","Ka":"ka","Kai":"kj","Kan":"kd","Kang":"kf","Kao":"ks","Ke":"ke","Ken":"kk","Keng":"kh","Kong":"kl","Kou":"kt","Ku":"ku","Kua":"kx","Kuai":"kg","Kuan":"kr","Kuang":"kn","Kui":"ky","Kun":"kz","Kuo":"ko","La":"la","Lai":"lj","Lan":"ld","Lang":"lf","Lao":"ls","Le":"le","Lei":"lw","Leng":"lh","Li":"li","Lia":"lx","Lian":"lm","Liang":"ln","Liao":"lp","Lie":"lc","Lin":"lb","Ling":"lg","Liu":"lq","Lo":"ll","Long":"ll","Lou":"lt","Lu":"lu","Luan":"lr","Lun":"lz","Luo":"lo","Ma":"ma","Mai":"mj","Man":"md","Mang":"mf","Mao":"ms","Me":"me","Mei":"mw","Men":"mk","Meng":"mh","Mi":"mi","Mian":"mm","Miao":"mp","Mie":"mc","Min":"mb","Ming":"mg","Miu":"mq","Mo":"mo","Mou":"mt","Mu":"mu","Na":"na","Nai":"nj","Nan":"nd","Nang":"nf","Nao":"ns","Ne":"ne","Nei":"nw","Nen":"nk","Neng":"nh","Ni":"ni","Nian":"nm","Niang":"nn","Niao":"np","Nie":"nc","Nin":"nb","Ning":"ng","Niu":"nq","Nong":"nl","Nou":"nt","Nu":"nu","Nuan":"nr","Nun":"nz","Nuo":"no","Pa":"pa","Pai":"pj","Pan":"pd","Pang":"pf","Pao":"ps","Pei":"pw","Pen":"pk","Peng":"ph","Pi":"pi","Pian":"pm","Piao":"pp","Pie":"pc","Pin":"pb","Ping":"pg","Po":"po","Pou":"pt","Pu":"pu","Qi":"qk","Qia":"qs","Qian":"qm","Qiang":"qx","Qiao":"qp","Qie":"qc","Qin":"qb","Qing":"qg","Qiong":"qy","Qiu":"qq","Qu":"qv","Quan":"qt","Que":"qh","Qun":"qw","Ran":"rd","Rang":"rf","Rao":"rs","Re":"re","Ren":"rk","Reng":"rh","Ri":"ri","Rong":"rl","Rou":"rt","Ru":"ru","Rua":"rx","Ruan":"rr","Rui":"ry","Run":"rz","Ruo":"ro","Sa":"sa","Sai":"sj","San":"sd","Sang":"sf","Sao":"ss","Se":"se","Sen":"sk","Seng":"sh","Sha":"ea","Shai":"ej","Shan":"ed","Shang":"ef","Shao":"es","She":"ee","Shei":"ew","Shen":"ek","Sheng":"eh","Shi":"ei","Shou":"et","Shu":"eu","Shua":"ex","Shuai":"eg","Shuan":"er","Shuang":"en","Shui":"ey","Shun":"ez","Shuo":"eo","Si":"si","Song":"sl","Sou":"st","Su":"su","Suan":"sr","Sui":"sy","Sun":"sz","Suo":"so","Ta":"ta","Tai":"tj","Tan":"td","Tang":"tf","Tao":"ts","Te":"te","Tei":"tw","Teng":"th","Ti":"ti","Tian":"tm","Tiao":"tp","Tie":"tc","Ting":"tg","Tong":"tl","Tou":"tt","Tu":"tu","Tuan":"tr","Tui":"ty","Tun":"tz","Tuo":"to","Xi":"xi","Xia":"xx","Xian":"xm","Xiang":"xn","Xiao":"xp","Xie":"xc","Xin":"xb","Xing":"xg","Xiong":"xl","Xiu":"xq","Xu":"xv","Xuan":"xr","Xue":"xy","Xun":"xw","Za":"za","Zai":"zj","Zan":"zd","Zang":"zf","Zao":"zs","Ze":"ze","Zei":"zw","Zen":"zk","Zeng":"zh","Zha":"qa","Zhai":"fj","Zhan":"qd","Zhang":"qf","Zhao":"fs","Zhe":"fe","Zhen":"qk","Zheng":"qh","Zhi":"fi","Zhong":"fy","Zhou":"qt","Zhu":"qu","Zhua":"fx","Zhuai":"fg","Zhuan":"fr","Zhuang":"fn","Zhui":"fy","Zhun":"fz","Zhuo":"qo","Zi":"zi","Zong":"zl","Zou":"zt","Zu":"zu","Zuan":"zr","Zui":"zy","Zun":"zz","Zuo":"zo"},"DaNiu":{"Lv":"lv","Lve":"lx","Lue":"lx","Nv":"nv","Nve":"nx","Nue":"nx","A":"ea","O":"eo","E":"ee","Ai":"eh","Ei":"ew","Ao":"es","Ou":"er","An":"ed","En":"ek","Ang":"ef","Eng":"ej","Er":"eu","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"ys","You":"yr","Yan":"yd","Yin":"yb","Yang":"yf","Ying":"yg","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wh","Wei":"ww","Wan":"wd","Wen":"wk","Wang":"wf","Weng":"wj","Yu":"yu","Yue":"yh","Yuan":"yj","Yun":"yw","Yong":"yl","Ba":"ba","Bai":"bh","Ban":"bd","Bang":"bf","Bao":"bs","Bei":"bw","Ben":"bk","Beng":"bj","Bi":"bi","Bian":"bc","Biang":"bn","Biao":"bm","Bie":"bp","Bin":"bb","Bing":"bg","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"ch","Can":"cd","Cang":"cf","Cao":"cs","Ce":"ce","Cen":"ck","Ceng":"cj","Cha":"ia","Chai":"ih","Chan":"id","Chang":"if","Chao":"is","Che":"ie","Chen":"ik","Cheng":"ij","Chi":"ii","Chong":"il","Chou":"ir","Chu":"iu","Chua":"iq","Chuai":"ig","Chuan":"iz","Chuang":"ix","Chui":"in","Chun":"iy","Chuo":"io","Ci":"ci","Cong":"cl","Cou":"cr","Cu":"cu","Cuan":"cz","Cui":"cn","Cun":"cy","Cuo":"co","Da":"da","Dai":"dh","Dan":"dd","Dang":"df","Dao":"ds","De":"de","Dei":"dw","Den":"dk","Deng":"dj","Di":"di","Dia":"dk","Dian":"dc","Diao":"dm","Die":"dp","Ding":"dg","Diu":"dt","Dong":"dl","Dou":"dr","Du":"du","Duan":"dz","Dui":"dn","Dun":"dy","Duo":"do","Fa":"fa","Fan":"fd","Fang":"ff","Fei":"fw","Fen":"fk","Feng":"fj","Fiao":"fm","Fo":"fo","Fou":"fr","Fu":"fu","Ga":"ga","Gai":"gh","Gan":"gd","Gang":"gf","Gao":"gs","Ge":"ge","Gei":"gw","Gen":"gk","Geng":"gj","Gong":"gl","Gou":"gr","Gu":"gu","Gua":"gq","Guai":"gg","Guan":"gz","Guang":"gx","Gui":"gn","Gun":"gy","Guo":"go","Ha":"ha","Hai":"hh","Han":"hd","Hang":"hf","Hao":"hs","He":"he","Hei":"hw","Hen":"hk","Heng":"hj","Hong":"hl","Hou":"hr","Hu":"hu","Hua":"hq","Huai":"hg","Huan":"hz","Huang":"hx","Hui":"hn","Hun":"hy","Huo":"ho","Ji":"ji","Jia":"jk","Jian":"jc","Jiang":"jn","Jiao":"jm","Jie":"jp","Jin":"jb","Jing":"jg","Jiong":"jl","Jiu":"jt","Ju":"ju","Juan":"jj","Jue":"jh","Jun":"jw","Ka":"ka","Kai":"kh","Kan":"kd","Kang":"kf","Kao":"ks","Ke":"ke","Ken":"kk","Keng":"kj","Kong":"kl","Kou":"kr","Ku":"ku","Kua":"kq","Kuai":"kg","Kuan":"kz","Kuang":"kx","Kui":"kn","Kun":"ky","Kuo":"ko","La":"la","Lai":"lh","Lan":"ld","Lang":"lf","Lao":"ls","Le":"le","Lei":"lw","Leng":"lj","Li":"li","Lia":"lk","Lian":"lc","Liang":"ln","Liao":"lm","Lie":"lp","Lin":"lb","Ling":"lg","Liu":"lt","Lo":"lo","Long":"ll","Lou":"lr","Lu":"lu","Luan":"lz","Lun":"ly","Luo":"lo","Ma":"ma","Mai":"mh","Man":"md","Mang":"mf","Mao":"ms","Me":"me","Mei":"mw","Men":"mk","Meng":"mj","Mi":"mi","Mian":"mc","Miao":"mm","Mie":"mp","Min":"mb","Ming":"mg","Miu":"mt","Mo":"mo","Mou":"mr","Mu":"mu","Na":"na","Nai":"nh","Nan":"nd","Nang":"nf","Nao":"ns","Ne":"ne","Nei":"nw","Nen":"nk","Neng":"nj","Ni":"ni","Nian":"nc","Niang":"nn","Niao":"nm","Nie":"np","Nin":"nb","Ning":"ng","Niu":"nt","Nong":"nl","Nou":"nr","Nu":"nu","Nuan":"nz","Nun":"ny","Nuo":"no","Pa":"pa","Pai":"ph","Pan":"pd","Pang":"pf","Pao":"ps","Pei":"pw","Pen":"pk","Peng":"pj","Pi":"pi","Pian":"pc","Piao":"pm","Pie":"pp","Pin":"pb","Ping":"pg","Po":"po","Pou":"pr","Pu":"pu","Qi":"qi","Qia":"qk","Qian":"qc","Qiang":"qn","Qiao":"qm","Qie":"qp","Qin":"qb","Qing":"qg","Qiong":"ql","Qiu":"qt","Qu":"qu","Quan":"qj","Que":"qh","Qun":"qw","Ran":"rd","Rang":"rf","Rao":"rs","Re":"re","Ren":"rk","Reng":"rj","Ri":"ri","Rong":"rl","Rou":"rr","Ru":"ru","Rua":"rq","Ruan":"rz","Rui":"rn","Run":"ry","Ruo":"ro","Sa":"sa","Sai":"sh","San":"sd","Sang":"sf","Sao":"ss","Se":"se","Sen":"sk","Seng":"sj","Sha":"ua","Shai":"uh","Shan":"ud","Shang":"uf","Shao":"us","She":"ue","Shei":"uw","Shen":"uk","Sheng":"uj","Shi":"ui","Shou":"ur","Shu":"uu","Shua":"uq","Shuai":"ug","Shuan":"uz","Shuang":"ux","Shui":"un","Shun":"uy","Shuo":"uo","Si":"si","Song":"sl","Sou":"sr","Su":"su","Suan":"sz","Sui":"sn","Sun":"sy","Suo":"so","Ta":"ta","Tai":"th","Tan":"td","Tang":"tf","Tao":"ts","Te":"te","Tei":"tw","Teng":"tj","Ti":"ti","Tian":"tc","Tiao":"tm","Tie":"tp","Ting":"tg","Tong":"tl","Tou":"tr","Tu":"tu","Tuan":"tz","Tui":"tn","Tun":"ty","Tuo":"to","Xi":"xi","Xia":"xk","Xian":"xc","Xiang":"xn","Xiao":"xm","Xie":"xp","Xin":"xb","Xing":"xg","Xiong":"xl","Xiu":"xt","Xu":"xu","Xuan":"xj","Xue":"xh","Xun":"xw","Za":"za","Zai":"zh","Zan":"zd","Zang":"zf","Zao":"zs","Ze":"ze","Zei":"zw","Zen":"zk","Zeng":"zj","Zha":"aa","Zhai":"ah","Zhan":"ad","Zhang":"af","Zhao":"as","Zhe":"ae","Zhen":"ak","Zheng":"aj","Zhi":"ai","Zhong":"al","Zhou":"ar","Zhu":"au","Zhua":"aq","Zhuai":"ag","Zhuan":"az","Zhuang":"ax","Zhui":"an","Zhun":"ay","Zhuo":"ao","Zi":"zi","Zong":"zl","Zou":"zr","Zu":"zu","Zuan":"zz","Zui":"zn","Zun":"zy","Zuo":"zo"},"XiaoLang":{"Lv":"lx","Lve":"lb","Lue":"lb","Nv":"nx","Nve":"nb","Nue":"nb","A":"aa","O":"oo","E":"uu","Ai":"ai","Ei":"ui","Ao":"ao","Ou":"ou","An":"an","En":"un","Ang":"ah","Eng":"un","Er":"ur","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"ys","You":"yr","Yan":"yj","Yin":"yd","Yang":"yh","Ying":"yv","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wk","Wei":"ww","Wan":"wj","Wen":"wm","Wang":"wh","Weng":"wn","Yu":"yu","Yue":"yb","Yuan":"yg","Yun":"yy","Yong":"yl","Ba":"ba","Bai":"bk","Ban":"bj","Bang":"bh","Bao":"bs","Bei":"bw","Ben":"bm","Beng":"bn","Bi":"bi","Bian":"bf","Biang":"bm","Biao":"bc","Bie":"bp","Bin":"bd","Bing":"bv","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"ck","Can":"cj","Cang":"ch","Cao":"cs","Ce":"ce","Cen":"cm","Ceng":"cn","Cha":"ia","Chai":"ik","Chan":"ij","Chang":"ih","Chao":"is","Che":"ie","Chen":"im","Cheng":"in","Chi":"ii","Chong":"il","Chou":"ir","Chu":"iu","Chua":"if","Chuai":"iv","Chuan":"ig","Chuang":"iz","Chui":"id","Chun":"iy","Chuo":"io","Ci":"ci","Cong":"cl","Cou":"cr","Cu":"cu","Cuan":"cg","Cui":"cd","Cun":"cy","Cuo":"co","Da":"da","Dai":"dk","Dan":"dj","Dang":"dh","Dao":"ds","De":"de","Dei":"dw","Den":"dm","Deng":"dn","Di":"di","Dia":"dk","Dian":"df","Diao":"dc","Die":"dp","Ding":"dv","Diu":"dt","Dong":"dl","Dou":"dr","Du":"du","Duan":"dg","Dui":"dd","Dun":"dy","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fw","Fen":"fm","Feng":"fn","Fiao":"fc","Fo":"fo","Fou":"fr","Fu":"fu","Ga":"ga","Gai":"gk","Gan":"gj","Gang":"gh","Gao":"gs","Ge":"ge","Gei":"gw","Gen":"gm","Geng":"gn","Gong":"gl","Gou":"gr","Gu":"gu","Gua":"gf","Guai":"gv","Guan":"gg","Guang":"gz","Gui":"gd","Gun":"gy","Guo":"go","Ha":"ha","Hai":"hk","Han":"hj","Hang":"hh","Hao":"hs","He":"he","Hei":"hw","Hen":"hm","Heng":"hn","Hong":"hl","Hou":"hr","Hu":"hu","Hua":"hf","Huai":"hv","Huan":"hg","Huang":"hz","Hui":"hd","Hun":"hy","Huo":"ho","Ji":"ji","Jia":"jk","Jian":"jf","Jiang":"jm","Jiao":"jc","Jie":"jp","Jin":"jd","Jing":"jv","Jiong":"jj","Jiu":"jt","Ju":"ju","Juan":"jg","Jue":"jb","Jun":"jy","Ka":"ka","Kai":"kk","Kan":"kj","Kang":"kh","Kao":"ks","Ke":"ke","Ken":"km","Keng":"kn","Kong":"kl","Kou":"kr","Ku":"ku","Kua":"kf","Kuai":"kv","Kuan":"kg","Kuang":"kz","Kui":"kd","Kun":"ky","Kuo":"ko","La":"la","Lai":"lk","Lan":"lj","Lang":"lh","Lao":"ls","Le":"le","Lei":"lw","Leng":"ln","Li":"li","Lia":"lk","Lian":"lf","Liang":"lm","Liao":"lc","Lie":"lp","Lin":"ld","Ling":"lv","Liu":"lt","Lo":"lo","Long":"ll","Lou":"lr","Lu":"lu","Luan":"lg","Lun":"ly","Luo":"lo","Ma":"ma","Mai":"mk","Man":"mj","Mang":"mh","Mao":"ms","Me":"me","Mei":"mw","Men":"mm","Meng":"mn","Mi":"mi","Mian":"mf","Miao":"mc","Mie":"mp","Min":"md","Ming":"mv","Miu":"mt","Mo":"mo","Mou":"mr","Mu":"mu","Na":"na","Nai":"nk","Nan":"nj","Nang":"nh","Nao":"ns","Ne":"ne","Nei":"nw","Nen":"nm","Neng":"nn","Ni":"ni","Nian":"nf","Niang":"nm","Niao":"nc","Nie":"np","Nin":"nd","Ning":"nv","Niu":"nt","Nong":"nl","Nou":"nr","Nu":"nu","Nuan":"ng","Nun":"ny","Nuo":"no","Pa":"pa","Pai":"pk","Pan":"pj","Pang":"ph","Pao":"ps","Pei":"pw","Pen":"pm","Peng":"pn","Pi":"pi","Pian":"pf","Piao":"pc","Pie":"pp","Pin":"pd","Ping":"pv","Po":"po","Pou":"pr","Pu":"pu","Qi":"qi","Qia":"qk","Qian":"qf","Qiang":"qm","Qiao":"qc","Qie":"qp","Qin":"qd","Qing":"qv","Qiong":"qj","Qiu":"qt","Qu":"qu","Quan":"qg","Que":"qb","Qun":"qy","Ran":"rj","Rang":"rh","Rao":"rs","Re":"re","Ren":"rm","Reng":"rn","Ri":"ri","Rong":"rl","Rou":"rr","Ru":"ru","Rua":"rf","Ruan":"rg","Rui":"rd","Run":"ry","Ruo":"ro","Sa":"sa","Sai":"sk","San":"sj","Sang":"sh","Sao":"ss","Se":"se","Sen":"sm","Seng":"sn","Sha":"va","Shai":"vk","Shan":"vj","Shang":"vh","Shao":"vs","She":"ve","Shei":"vw","Shen":"vm","Sheng":"vn","Shi":"vi","Shou":"vr","Shu":"vu","Shua":"vf","Shuai":"vv","Shuan":"vg","Shuang":"vz","Shui":"vd","Shun":"vy","Shuo":"vo","Si":"si","Song":"sl","Sou":"sr","Su":"su","Suan":"sg","Sui":"sd","Sun":"sy","Suo":"so","Ta":"ta","Tai":"tk","Tan":"tj","Tang":"th","Tao":"ts","Te":"te","Tei":"tw","Teng":"tn","Ti":"ti","Tian":"tf","Tiao":"tc","Tie":"tp","Ting":"tv","Tong":"tl","Tou":"tr","Tu":"tu","Tuan":"tg","Tui":"td","Tun":"ty","Tuo":"to","Xi":"xi","Xia":"xk","Xian":"xf","Xiang":"xm","Xiao":"xc","Xie":"xp","Xin":"xd","Xing":"xv","Xiong":"xj","Xiu":"xt","Xu":"xu","Xuan":"xg","Xue":"xb","Xun":"xy","Za":"za","Zai":"zk","Zan":"zj","Zang":"zh","Zao":"zs","Ze":"ze","Zei":"zw","Zen":"zm","Zeng":"zn","Zha":"ea","Zhai":"ek","Zhan":"ej","Zhang":"eh","Zhao":"es","Zhe":"ee","Zhen":"em","Zheng":"en","Zhi":"ei","Zhong":"el","Zhou":"er","Zhu":"eu","Zhua":"ef","Zhuai":"ev","Zhuan":"eg","Zhuang":"ez","Zhui":"ed","Zhun":"ey","Zhuo":"eo","Zi":"zi","Zong":"zl","Zou":"zr","Zu":"zu","Zuan":"zg","Zui":"zd","Zun":"zy","Zuo":"zo"}}
\ No newline at end of file
From 4fb2e3d14e856cb6917204ce824d89b3cdf8de9c Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 14 Jun 2025 16:33:48 +0800
Subject: [PATCH 1382/1798] Fix translation mapping logic
---
Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index 6a2cd1e66..36f007f39 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -99,13 +99,19 @@ namespace Flow.Launcher.Infrastructure
{
if (content[i] >= 0x3400 && content[i] <= 0x9FD5)
{
- string dp = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i];
- map.AddNewIndex(i, resultBuilder.Length, dp.Length + 1);
+ string translated = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i];
if (previousIsChinese)
{
+ map.AddNewIndex(i, resultBuilder.Length, translated.Length + 1);
resultBuilder.Append(' ');
+ resultBuilder.Append(translated);
+ }
+ else
+ {
+ map.AddNewIndex(i, resultBuilder.Length, translated.Length);
+ resultBuilder.Append(translated);
+ previousIsChinese = true;
}
- resultBuilder.Append(dp);
}
else
{
From 7ae91b1af326126c88f22cc60d63f85b8b5263e8 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sat, 14 Jun 2025 20:45:30 +1000
Subject: [PATCH 1383/1798] Release 1.20.1 | Plugin 4.6.0 (#3706)
---
.github/ISSUE_TEMPLATE/bug-report.yaml | 2 +
.github/update_release_pr.py | 35 +-
.github/workflows/default_plugins.yml | 85 +-
.../Plugin/JsonRPCPluginSettings.cs | 2 +-
Flow.Launcher.Core/Resource/Theme.cs | 10 +-
.../Resource/TranslationConverter.cs | 25 -
.../NativeMethods.txt | 5 +
.../Storage/FlowLauncherJsonStorage.cs | 4 +-
.../Storage/PluginBinaryStorage.cs | 4 +-
.../Storage/PluginJsonStorage.cs | 4 +-
.../UserSettings/CustomShortcutModel.cs | 8 +
Flow.Launcher.Infrastructure/Win32Helper.cs | 5 +
.../Flow.Launcher.Plugin.csproj | 8 +-
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs | 19 +-
.../SharedCommands/SearchWeb.cs | 43 +-
Flow.Launcher/Helper/ErrorReporting.cs | 10 +-
Flow.Launcher/HotkeyControlDialog.xaml | 12 +-
Flow.Launcher/Languages/ar.xaml | 10 +
Flow.Launcher/Languages/cs.xaml | 10 +
Flow.Launcher/Languages/da.xaml | 12 +-
Flow.Launcher/Languages/de.xaml | 10 +
Flow.Launcher/Languages/en.xaml | 1 +
Flow.Launcher/Languages/es-419.xaml | 10 +
Flow.Launcher/Languages/es.xaml | 12 +-
Flow.Launcher/Languages/fr.xaml | 12 +-
Flow.Launcher/Languages/he.xaml | 10 +
Flow.Launcher/Languages/it.xaml | 10 +
Flow.Launcher/Languages/ja.xaml | 10 +
Flow.Launcher/Languages/ko.xaml | 10 +
Flow.Launcher/Languages/nb.xaml | 10 +
Flow.Launcher/Languages/nl.xaml | 10 +
Flow.Launcher/Languages/pl.xaml | 10 +
Flow.Launcher/Languages/pt-br.xaml | 10 +
Flow.Launcher/Languages/pt-pt.xaml | 14 +-
Flow.Launcher/Languages/ru.xaml | 10 +
Flow.Launcher/Languages/sk.xaml | 14 +-
Flow.Launcher/Languages/sr.xaml | 10 +
Flow.Launcher/Languages/tr.xaml | 60 +-
Flow.Launcher/Languages/uk-UA.xaml | 10 +
Flow.Launcher/Languages/vi.xaml | 10 +
Flow.Launcher/Languages/zh-cn.xaml | 12 +-
Flow.Launcher/Languages/zh-tw.xaml | 10 +
Flow.Launcher/MainWindow.xaml.cs | 146 +-
Flow.Launcher/Properties/Resources.fr-FR.resx | 130 --
Flow.Launcher/Properties/Resources.he-IL.resx | 130 --
Flow.Launcher/PublicAPIInstance.cs | 53 +-
.../InstalledPluginDisplayKeyword.xaml | 3 +-
.../Resources/CustomControlTemplate.xaml | 73 +
.../Resources/Pages/WelcomePage1.xaml | 6 +-
.../Resources/Pages/WelcomePage2.xaml | 10 +-
.../Resources/Pages/WelcomePage4.xaml | 2 +-
.../Resources/Pages/WelcomePage5.xaml | 10 +-
.../Resources/SettingWindowStyle.xaml | 1 -
.../SettingsPaneGeneralViewModel.cs | 2 +
.../Views/SettingsPaneGeneral.xaml | 3 +-
.../Views/SettingsPaneHotkey.xaml | 2 +-
Flow.Launcher/Themes/Base.xaml | 4 +
Flow.Launcher/WelcomeWindow.xaml | 6 +-
.../ChromiumBookmarkLoader.cs | 128 +-
.../FirefoxBookmarkLoader.cs | 284 ++--
.../Helper/FaviconHelper.cs | 76 +
.../Languages/ar.xaml | 2 +
.../Languages/cs.xaml | 2 +
.../Languages/da.xaml | 2 +
.../Languages/de.xaml | 2 +
.../Languages/en.xaml | 2 +
.../Languages/es-419.xaml | 2 +
.../Languages/es.xaml | 2 +
.../Languages/fr.xaml | 2 +
.../Languages/he.xaml | 2 +
.../Languages/it.xaml | 2 +
.../Languages/ja.xaml | 2 +
.../Languages/ko.xaml | 2 +
.../Languages/nb.xaml | 2 +
.../Languages/nl.xaml | 2 +
.../Languages/pl.xaml | 2 +
.../Languages/pt-br.xaml | 2 +
.../Languages/pt-pt.xaml | 2 +
.../Languages/ru.xaml | 2 +
.../Languages/sk.xaml | 2 +
.../Languages/sr.xaml | 2 +
.../Languages/tr.xaml | 2 +
.../Languages/uk-UA.xaml | 2 +
.../Languages/vi.xaml | 2 +
.../Languages/zh-cn.xaml | 2 +
.../Languages/zh-tw.xaml | 2 +
.../Main.cs | 12 +-
.../Models/Settings.cs | 2 +
.../Views/SettingsControl.xaml | 8 +
.../Flow.Launcher.Plugin.Explorer.csproj | 3 +-
.../Languages/ar.xaml | 11 +
.../Languages/cs.xaml | 11 +
.../Languages/da.xaml | 11 +
.../Languages/de.xaml | 11 +
.../Languages/en.xaml | 3 +
.../Languages/es-419.xaml | 11 +
.../Languages/es.xaml | 11 +
.../Languages/fr.xaml | 11 +
.../Languages/he.xaml | 11 +
.../Languages/it.xaml | 11 +
.../Languages/ja.xaml | 11 +
.../Languages/ko.xaml | 11 +
.../Languages/nb.xaml | 11 +
.../Languages/nl.xaml | 11 +
.../Languages/pl.xaml | 11 +
.../Languages/pt-br.xaml | 11 +
.../Languages/pt-pt.xaml | 13 +-
.../Languages/ru.xaml | 11 +
.../Languages/sk.xaml | 11 +
.../Languages/sr.xaml | 11 +
.../Languages/tr.xaml | 23 +-
.../Languages/uk-UA.xaml | 11 +
.../Languages/vi.xaml | 11 +
.../Languages/zh-cn.xaml | 11 +
.../Languages/zh-tw.xaml | 11 +
.../Everything/EverythingSearchManager.cs | 33 +-
.../Search/ResultManager.cs | 8 +-
.../ViewModels/ActionKeywordModel.cs | 2 +
.../Views/ExplorerSettings.xaml | 1461 +++++++++--------
.../Views/ExplorerSettings.xaml.cs | 58 +-
.../Languages/tr.xaml | 10 +-
.../PluginsManager.cs | 110 +-
.../Languages/tr.xaml | 24 +-
.../Programs/ShellLinkHelper.cs | 9 +-
Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 141 +-
.../Languages/tr.xaml | 8 +-
.../Flow.Launcher.Plugin.WebSearch/Main.cs | 4 +-
.../Properties/Resources.pt-PT.resx | 6 +-
README.md | 4 +
appveyor.yml | 15 +-
130 files changed, 2300 insertions(+), 1606 deletions(-)
delete mode 100644 Flow.Launcher.Core/Resource/TranslationConverter.cs
delete mode 100644 Flow.Launcher/Properties/Resources.fr-FR.resx
delete mode 100644 Flow.Launcher/Properties/Resources.he-IL.resx
create mode 100644 Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yaml b/.github/ISSUE_TEMPLATE/bug-report.yaml
index 294c06fc1..11a921955 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yaml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yaml
@@ -16,6 +16,8 @@ body:
I have checked that this issue has not already been reported.
- label: >
I am using the latest version of Flow Launcher.
+ - label: >
+ I am using the prerelease version of Flow Launcher.
- type: textarea
attributes:
diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py
index f90f6181d..ccea511b3 100644
--- a/.github/update_release_pr.py
+++ b/.github/update_release_pr.py
@@ -11,7 +11,7 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st
token (str): GitHub token.
owner (str): The owner of the repository.
repo (str): The name of the repository.
- label (str): The label name.
+ label (str): The label name. Filter is not applied when empty string.
state (str): State of PR, e.g. open, closed, all
Returns:
@@ -89,7 +89,7 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all")
Args:
pull_request_items (list[dict]): List of PR items.
- label (str): The label name.
+ label (str): The label name. Filter is not applied when empty string.
state (str): State of PR, e.g. open, closed, all
Returns:
@@ -99,14 +99,36 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "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]:
+ if state in [pr["state"], "all"] and (not label or [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}")
+ print(f"Found {count} PRs with {label if label else 'no filter on'} label and state as {state}")
return pr_list
+def get_prs_assignees(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[str]:
+ """
+ Returns a list of pull request assignees after applying the label and state filters, excludes jjw24.
+
+ Args:
+ pull_request_items (list[dict]): List of PR items.
+ label (str): The label name. Filter is not applied when empty string.
+ state (str): State of PR, e.g. open, closed, all
+
+ Returns:
+ list: A list of strs, where each string is an assignee name. List is not distinct, so can contain
+ duplicate names.
+ Returns an empty list if none are found.
+ """
+ assignee_list = []
+ for pr in pull_request_items:
+ if state in [pr["state"], "all"] and (not label or [item for item in pr["labels"] if item["name"] == label]):
+ [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24" ]
+
+ print(f"Found {len(assignee_list)} assignees with {label if label else 'no filter on'} label and state as {state}")
+
+ return assignee_list
def get_pr_descriptions(pull_request_items: list[dict]) -> str:
"""
@@ -208,6 +230,11 @@ 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 ""
+ assignees = list(set(get_prs_assignees(pull_requests, "enhancement", "closed") + get_prs_assignees(pull_requests, "bug", "closed")))
+ assignees.sort(key=str.lower)
+
+ description_content += f"### Authors:\n{', '.join(assignees)}"
+
update_pull_request_description(
github_token, repository_owner, repository_name, release_pr[0]["number"], description_content
)
diff --git a/.github/workflows/default_plugins.yml b/.github/workflows/default_plugins.yml
index 85acafae1..ec8dfcd4e 100644
--- a/.github/workflows/default_plugins.yml
+++ b/.github/workflows/default_plugins.yml
@@ -3,11 +3,10 @@ name: Publish Default Plugins
on:
push:
branches: ['master']
- paths: ['Plugins/**']
workflow_dispatch:
jobs:
- build:
+ publish:
runs-on: windows-latest
steps:
@@ -17,39 +16,24 @@ jobs:
with:
dotnet-version: 7.0.x
- - name: Determine New Plugin Updates
- uses: dorny/paths-filter@v3
- id: changes
- with:
- filters: |
- browserbookmark:
- - 'Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json'
- calculator:
- - 'Plugins/Flow.Launcher.Plugin.Calculator/plugin.json'
- explorer:
- - 'Plugins/Flow.Launcher.Plugin.Explorer/plugin.json'
- pluginindicator:
- - 'Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json'
- pluginsmanager:
- - 'Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json'
- processkiller:
- - 'Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json'
- program:
- - 'Plugins/Flow.Launcher.Plugin.Program/plugin.json'
- shell:
- - 'Plugins/Flow.Launcher.Plugin.Shell/plugin.json'
- sys:
- - 'Plugins/Flow.Launcher.Plugin.Sys/plugin.json'
- url:
- - 'Plugins/Flow.Launcher.Plugin.Url/plugin.json'
- websearch:
- - 'Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json'
- windowssettings:
- - 'Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json'
- base: 'master'
+ - name: Update Plugins To Production Version
+ run: |
+ $version = "1.0.0"
+ Get-Content appveyor.yml | ForEach-Object {
+ if ($_ -match "version:\s*'(\d+\.\d+\.\d+)\.") {
+ $version = $matches[1]
+ }
+ }
+
+ $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`": `"$version`"" | 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
+ }
- name: Get BrowserBookmark Version
- if: steps.changes.outputs.browserbookmark == 'true'
id: updated-version-browserbookmark
uses: notiz-dev/github-action-json-property@release
with:
@@ -57,14 +41,12 @@ jobs:
prop_path: 'Version'
- name: Build BrowserBookmark
- if: steps.changes.outputs.browserbookmark == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.BrowserBookmark"
7z a -tzip "Flow.Launcher.Plugin.BrowserBookmark.zip" "./Flow.Launcher.Plugin.BrowserBookmark/*"
rm -r "Flow.Launcher.Plugin.BrowserBookmark"
- name: Publish BrowserBookmark
- if: steps.changes.outputs.browserbookmark == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.BrowserBookmark"
@@ -76,7 +58,6 @@ jobs:
- name: Get Calculator Version
- if: steps.changes.outputs.calculator == 'true'
id: updated-version-calculator
uses: notiz-dev/github-action-json-property@release
with:
@@ -84,14 +65,12 @@ jobs:
prop_path: 'Version'
- name: Build Calculator
- if: steps.changes.outputs.calculator == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.Calculator"
7z a -tzip "Flow.Launcher.Plugin.Calculator.zip" "./Flow.Launcher.Plugin.Calculator/*"
rm -r "Flow.Launcher.Plugin.Calculator"
- name: Publish Calculator
- if: steps.changes.outputs.calculator == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Calculator"
@@ -103,7 +82,6 @@ jobs:
- name: Get Explorer Version
- if: steps.changes.outputs.explorer == 'true'
id: updated-version-explorer
uses: notiz-dev/github-action-json-property@release
with:
@@ -111,14 +89,12 @@ jobs:
prop_path: 'Version'
- name: Build Explorer
- if: steps.changes.outputs.explorer == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.Explorer"
7z a -tzip "Flow.Launcher.Plugin.Explorer.zip" "./Flow.Launcher.Plugin.Explorer/*"
rm -r "Flow.Launcher.Plugin.Explorer"
- name: Publish Explorer
- if: steps.changes.outputs.explorer == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Explorer"
@@ -130,7 +106,6 @@ jobs:
- name: Get PluginIndicator Version
- if: steps.changes.outputs.pluginindicator == 'true'
id: updated-version-pluginindicator
uses: notiz-dev/github-action-json-property@release
with:
@@ -138,14 +113,12 @@ jobs:
prop_path: 'Version'
- name: Build PluginIndicator
- if: steps.changes.outputs.pluginindicator == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.PluginIndicator/Flow.Launcher.Plugin.PluginIndicator.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.PluginIndicator"
7z a -tzip "Flow.Launcher.Plugin.PluginIndicator.zip" "./Flow.Launcher.Plugin.PluginIndicator/*"
rm -r "Flow.Launcher.Plugin.PluginIndicator"
- name: Publish PluginIndicator
- if: steps.changes.outputs.pluginindicator == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.PluginIndicator"
@@ -157,7 +130,6 @@ jobs:
- name: Get PluginsManager Version
- if: steps.changes.outputs.pluginsmanager == 'true'
id: updated-version-pluginsmanager
uses: notiz-dev/github-action-json-property@release
with:
@@ -165,14 +137,12 @@ jobs:
prop_path: 'Version'
- name: Build PluginsManager
- if: steps.changes.outputs.pluginsmanager == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.PluginsManager"
7z a -tzip "Flow.Launcher.Plugin.PluginsManager.zip" "./Flow.Launcher.Plugin.PluginsManager/*"
rm -r "Flow.Launcher.Plugin.PluginsManager"
- name: Publish PluginsManager
- if: steps.changes.outputs.pluginsmanager == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.PluginsManager"
@@ -184,7 +154,6 @@ jobs:
- name: Get ProcessKiller Version
- if: steps.changes.outputs.processkiller == 'true'
id: updated-version-processkiller
uses: notiz-dev/github-action-json-property@release
with:
@@ -192,14 +161,12 @@ jobs:
prop_path: 'Version'
- name: Build ProcessKiller
- if: steps.changes.outputs.processkiller == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.ProcessKiller"
7z a -tzip "Flow.Launcher.Plugin.ProcessKiller.zip" "./Flow.Launcher.Plugin.ProcessKiller/*"
rm -r "Flow.Launcher.Plugin.ProcessKiller"
- name: Publish ProcessKiller
- if: steps.changes.outputs.processkiller == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.ProcessKiller"
@@ -211,7 +178,6 @@ jobs:
- name: Get Program Version
- if: steps.changes.outputs.program == 'true'
id: updated-version-program
uses: notiz-dev/github-action-json-property@release
with:
@@ -219,14 +185,12 @@ jobs:
prop_path: 'Version'
- name: Build Program
- if: steps.changes.outputs.program == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj' --framework net7.0-windows10.0.19041.0 -c Release -o "Flow.Launcher.Plugin.Program"
7z a -tzip "Flow.Launcher.Plugin.Program.zip" "./Flow.Launcher.Plugin.Program/*"
rm -r "Flow.Launcher.Plugin.Program"
- name: Publish Program
- if: steps.changes.outputs.program == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Program"
@@ -238,7 +202,6 @@ jobs:
- name: Get Shell Version
- if: steps.changes.outputs.shell == 'true'
id: updated-version-shell
uses: notiz-dev/github-action-json-property@release
with:
@@ -246,14 +209,12 @@ jobs:
prop_path: 'Version'
- name: Build Shell
- if: steps.changes.outputs.shell == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.Shell"
7z a -tzip "Flow.Launcher.Plugin.Shell.zip" "./Flow.Launcher.Plugin.Shell/*"
rm -r "Flow.Launcher.Plugin.Shell"
- name: Publish Shell
- if: steps.changes.outputs.shell == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Shell"
@@ -265,7 +226,6 @@ jobs:
- name: Get Sys Version
- if: steps.changes.outputs.sys == 'true'
id: updated-version-sys
uses: notiz-dev/github-action-json-property@release
with:
@@ -273,14 +233,12 @@ jobs:
prop_path: 'Version'
- name: Build Sys
- if: steps.changes.outputs.sys == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.Sys"
7z a -tzip "Flow.Launcher.Plugin.Sys.zip" "./Flow.Launcher.Plugin.Sys/*"
rm -r "Flow.Launcher.Plugin.Sys"
- name: Publish Sys
- if: steps.changes.outputs.sys == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Sys"
@@ -292,7 +250,6 @@ jobs:
- name: Get Url Version
- if: steps.changes.outputs.url == 'true'
id: updated-version-url
uses: notiz-dev/github-action-json-property@release
with:
@@ -300,14 +257,12 @@ jobs:
prop_path: 'Version'
- name: Build Url
- if: steps.changes.outputs.url == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.Url"
7z a -tzip "Flow.Launcher.Plugin.Url.zip" "./Flow.Launcher.Plugin.Url/*"
rm -r "Flow.Launcher.Plugin.Url"
- name: Publish Url
- if: steps.changes.outputs.url == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Url"
@@ -319,7 +274,6 @@ jobs:
- name: Get WebSearch Version
- if: steps.changes.outputs.websearch == 'true'
id: updated-version-websearch
uses: notiz-dev/github-action-json-property@release
with:
@@ -327,14 +281,12 @@ jobs:
prop_path: 'Version'
- name: Build WebSearch
- if: steps.changes.outputs.websearch == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.WebSearch/Flow.Launcher.Plugin.WebSearch.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.WebSearch"
7z a -tzip "Flow.Launcher.Plugin.WebSearch.zip" "./Flow.Launcher.Plugin.WebSearch/*"
rm -r "Flow.Launcher.Plugin.WebSearch"
- name: Publish WebSearch
- if: steps.changes.outputs.websearch == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.WebSearch"
@@ -346,7 +298,6 @@ jobs:
- name: Get WindowsSettings Version
- if: steps.changes.outputs.windowssettings == 'true'
id: updated-version-windowssettings
uses: notiz-dev/github-action-json-property@release
with:
@@ -354,14 +305,12 @@ jobs:
prop_path: 'Version'
- name: Build WindowsSettings
- if: steps.changes.outputs.windowssettings == 'true'
run: |
dotnet publish 'Plugins/Flow.Launcher.Plugin.WindowsSettings/Flow.Launcher.Plugin.WindowsSettings.csproj' --framework net7.0-windows -c Release -o "Flow.Launcher.Plugin.WindowsSettings"
7z a -tzip "Flow.Launcher.Plugin.WindowsSettings.zip" "./Flow.Launcher.Plugin.WindowsSettings/*"
rm -r "Flow.Launcher.Plugin.WindowsSettings"
- name: Publish WindowsSettings
- if: steps.changes.outputs.windowssettings == 'true'
uses: softprops/action-gh-release@v2
with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.WindowsSettings"
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index 003e72a5d..435d97ab7 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -12,7 +12,7 @@ using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Plugin
{
- public class JsonRPCPluginSettings
+ public class JsonRPCPluginSettings : ISavable
{
public required JsonRpcConfigurationModel? Configuration { get; init; }
diff --git a/Flow.Launcher.Core/Resource/Theme.cs b/Flow.Launcher.Core/Resource/Theme.cs
index 059359694..a6e8dc6bf 100644
--- a/Flow.Launcher.Core/Resource/Theme.cs
+++ b/Flow.Launcher.Core/Resource/Theme.cs
@@ -671,7 +671,15 @@ namespace Flow.Launcher.Core.Resource
windowBorderStyle.Setters.Remove(windowBorderStyle.Setters.OfType().FirstOrDefault(x => x.Property.Name == "Background"));
windowBorderStyle.Setters.Add(new Setter(Border.BackgroundProperty, new SolidColorBrush(Colors.Transparent)));
}
-
+
+ // For themes with blur enabled, the window border is rendered by the system, so it's treated as a simple rectangle regardless of thickness.
+ //(This is to avoid issues when the window is forcibly changed to a rectangular shape during snap scenarios.)
+ var cornerRadiusSetter = windowBorderStyle.Setters.OfType().FirstOrDefault(x => x.Property == Border.CornerRadiusProperty);
+ if (cornerRadiusSetter != null)
+ cornerRadiusSetter.Value = new CornerRadius(0);
+ else
+ windowBorderStyle.Setters.Add(new Setter(Border.CornerRadiusProperty, new CornerRadius(0)));
+
// Apply the blur effect
Win32Helper.DWMSetBackdropForWindow(mainWindow, backdropType);
ColorizeWindow(theme, backdropType);
diff --git a/Flow.Launcher.Core/Resource/TranslationConverter.cs b/Flow.Launcher.Core/Resource/TranslationConverter.cs
deleted file mode 100644
index eb0032758..000000000
--- a/Flow.Launcher.Core/Resource/TranslationConverter.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using System;
-using System.Globalization;
-using System.Windows.Data;
-using CommunityToolkit.Mvvm.DependencyInjection;
-using Flow.Launcher.Plugin;
-
-namespace Flow.Launcher.Core.Resource
-{
- public class TranslationConverter : IValueConverter
- {
- // We should not initialize API in static constructor because it will create another API instance
- private static IPublicAPI api = null;
- private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService();
-
- public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
- {
- var key = value.ToString();
- if (string.IsNullOrEmpty(key)) return key;
- return API.GetTranslation(key);
- }
-
- public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
- throw new InvalidOperationException();
- }
-}
diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt
index 53c877c4f..edc71feef 100644
--- a/Flow.Launcher.Infrastructure/NativeMethods.txt
+++ b/Flow.Launcher.Infrastructure/NativeMethods.txt
@@ -42,6 +42,11 @@ MONITORINFOEXW
WM_ENTERSIZEMOVE
WM_EXITSIZEMOVE
+WM_NCLBUTTONDBLCLK
+WM_SYSCOMMAND
+
+SC_MAXIMIZE
+SC_MINIMIZE
OleInitialize
OleUninitialize
diff --git a/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs
index 158e0cdf5..857490bad 100644
--- a/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs
@@ -2,11 +2,13 @@
using System.Threading.Tasks;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
namespace Flow.Launcher.Infrastructure.Storage
{
- public class FlowLauncherJsonStorage : JsonStorage where T : new()
+ // Expose ISaveable interface in derived class to make sure we are calling the new version of Save method
+ public class FlowLauncherJsonStorage : JsonStorage, ISavable where T : new()
{
private static readonly string ClassName = "FlowLauncherJsonStorage";
diff --git a/Flow.Launcher.Infrastructure/Storage/PluginBinaryStorage.cs b/Flow.Launcher.Infrastructure/Storage/PluginBinaryStorage.cs
index 01da96d62..0e0906e73 100644
--- a/Flow.Launcher.Infrastructure/Storage/PluginBinaryStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/PluginBinaryStorage.cs
@@ -1,11 +1,13 @@
using System.IO;
using System.Threading.Tasks;
using Flow.Launcher.Infrastructure.Logger;
+using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
namespace Flow.Launcher.Infrastructure.Storage
{
- public class PluginBinaryStorage : BinaryStorage where T : new()
+ // Expose ISaveable interface in derived class to make sure we are calling the new version of Save method
+ public class PluginBinaryStorage : BinaryStorage, ISavable where T : new()
{
private static readonly string ClassName = "PluginBinaryStorage";
diff --git a/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs
index 147152949..d59083071 100644
--- a/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/PluginJsonStorage.cs
@@ -2,11 +2,13 @@
using System.Threading.Tasks;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
namespace Flow.Launcher.Infrastructure.Storage
{
- public class PluginJsonStorage : JsonStorage where T : new()
+ // Expose ISaveable interface in derived class to make sure we are calling the new version of Save method
+ public class PluginJsonStorage : JsonStorage, ISavable where T : new()
{
// Use assembly name to check which plugin is using this storage
public readonly string AssemblyName;
diff --git a/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
index 2d15b54c5..2603d4675 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs
@@ -1,6 +1,8 @@
using System;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
+using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.Plugin;
namespace Flow.Launcher.Infrastructure.UserSettings
{
@@ -53,6 +55,12 @@ namespace Flow.Launcher.Infrastructure.UserSettings
{
public string Description { get; set; }
+ public string LocalizedDescription => API.GetTranslation(Description);
+
+ // We should not initialize API in static constructor because it will create another API instance
+ private static IPublicAPI api = null;
+ private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService();
+
public BaseBuiltinShortcutModel(string key, string description)
{
Key = key;
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 1be803fd4..86e7b7c97 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -324,6 +324,11 @@ namespace Flow.Launcher.Infrastructure
public const int WM_ENTERSIZEMOVE = (int)PInvoke.WM_ENTERSIZEMOVE;
public const int WM_EXITSIZEMOVE = (int)PInvoke.WM_EXITSIZEMOVE;
+ public const int WM_NCLBUTTONDBLCLK = (int)PInvoke.WM_NCLBUTTONDBLCLK;
+ public const int WM_SYSCOMMAND = (int)PInvoke.WM_SYSCOMMAND;
+
+ public const int SC_MAXIMIZE = (int)PInvoke.SC_MAXIMIZE;
+ public const int SC_MINIMIZE = (int)PInvoke.SC_MINIMIZE;
#endregion
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index 4a26cec95..4a49e9589 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -14,10 +14,10 @@
- 4.5.0
- 4.5.0
- 4.5.0
- 4.5.0
+ 4.6.0
+ 4.6.0
+ 4.6.0
+ 4.6.0Flow.Launcher.PluginFlow-LauncherMIT
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index cb60251ed..09c402bcf 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -306,13 +306,28 @@ namespace Flow.Launcher.Plugin
public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null);
///
- /// Opens the URL with the given Uri object.
+ /// Opens the URL using the browser with the given Uri object, even if the URL is a local file.
+ /// The browser and mode used is based on what's configured in Flow's default browser settings.
+ ///
+ public void OpenWebUrl(Uri url, bool? inPrivate = null);
+
+ ///
+ /// Opens the URL using the browser with the given string, even if the URL is a local file.
+ /// The browser and mode used is based on what's configured in Flow's default browser settings.
+ /// Non-C# plugins should use this method.
+ ///
+ public void OpenWebUrl(string url, bool? inPrivate = null);
+
+ ///
+ /// Opens the URL with the given Uri object in browser if scheme is Http or Https.
+ /// If the URL is a local file, it will instead be opened with the default application for that file type.
/// The browser and mode used is based on what's configured in Flow's default browser settings.
///
public void OpenUrl(Uri url, bool? inPrivate = null);
///
- /// Opens the URL with the given string.
+ /// Opens the URL with the given string in browser if scheme is Http or Https.
+ /// If the URL is a local file, it will instead be opened with the default application for that file type.
/// The browser and mode used is based on what's configured in Flow's default browser settings.
/// Non-C# plugins should use this method.
///
diff --git a/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs b/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs
index 752c85933..ed3e91daf 100644
--- a/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs
+++ b/Flow.Launcher.Plugin/SharedCommands/SearchWeb.cs
@@ -1,8 +1,9 @@
-using Microsoft.Win32;
-using System;
+using System;
+using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
+using Microsoft.Win32;
namespace Flow.Launcher.Plugin.SharedCommands
{
@@ -13,7 +14,7 @@ namespace Flow.Launcher.Plugin.SharedCommands
{
private static string GetDefaultBrowserPath()
{
- string name = string.Empty;
+ var name = string.Empty;
try
{
using var regDefault = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice", false);
@@ -23,8 +24,7 @@ namespace Flow.Launcher.Plugin.SharedCommands
name = regKey.GetValue(null).ToString().ToLower().Replace("\"", "");
if (!name.EndsWith("exe"))
- name = name.Substring(0, name.LastIndexOf(".exe") + 4);
-
+ name = name[..(name.LastIndexOf(".exe") + 4)];
}
catch
{
@@ -65,12 +65,21 @@ namespace Flow.Launcher.Plugin.SharedCommands
{
Process.Start(psi)?.Dispose();
}
- catch (System.ComponentModel.Win32Exception)
+ // This error may be thrown if browser path is incorrect
+ catch (Win32Exception)
{
- Process.Start(new ProcessStartInfo
+ try
{
- FileName = url, UseShellExecute = true
- });
+ Process.Start(new ProcessStartInfo
+ {
+ FileName = url,
+ UseShellExecute = true
+ });
+ }
+ catch
+ {
+ throw; // Re-throw the exception if we cannot open the URL in the default browser
+ }
}
}
@@ -100,12 +109,20 @@ namespace Flow.Launcher.Plugin.SharedCommands
Process.Start(psi)?.Dispose();
}
// This error may be thrown if browser path is incorrect
- catch (System.ComponentModel.Win32Exception)
+ catch (Win32Exception)
{
- Process.Start(new ProcessStartInfo
+ try
{
- FileName = url, UseShellExecute = true
- });
+ Process.Start(new ProcessStartInfo
+ {
+ FileName = url,
+ UseShellExecute = true
+ });
+ }
+ catch
+ {
+ throw; // Re-throw the exception if we cannot open the URL in the default browser
+ }
}
}
}
diff --git a/Flow.Launcher/Helper/ErrorReporting.cs b/Flow.Launcher/Helper/ErrorReporting.cs
index aa810ba65..e201284cb 100644
--- a/Flow.Launcher/Helper/ErrorReporting.cs
+++ b/Flow.Launcher/Helper/ErrorReporting.cs
@@ -1,20 +1,21 @@
using System;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
-using System.Windows;
using System.Windows.Threading;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Exception;
+using Flow.Launcher.Infrastructure.Logger;
using NLog;
namespace Flow.Launcher.Helper;
public static class ErrorReporting
{
- private static void Report(Exception e, [CallerMemberName] string methodName = "UnHandledException")
+ private static void Report(Exception e, bool silent = false, [CallerMemberName] string methodName = "UnHandledException")
{
var logger = LogManager.GetLogger(methodName);
logger.Fatal(ExceptionFormatter.FormatExcpetion(e));
+ if (silent) return;
var reportWindow = new ReportWindow(e);
reportWindow.Show();
}
@@ -35,8 +36,9 @@ public static class ErrorReporting
public static void TaskSchedulerUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
- // handle unobserved task exceptions on UI thread
- Application.Current.Dispatcher.Invoke(() => Report(e.Exception));
+ // log exception but do not handle unobserved task exceptions on UI thread
+ //Application.Current.Dispatcher.Invoke(() => Report(e.Exception, true));
+ Log.Exception(nameof(ErrorReporting), "Unobserved task exception occurred.", e.Exception);
// prevent application exit, so the user can copy the prompted error info
e.SetObserved();
}
diff --git a/Flow.Launcher/HotkeyControlDialog.xaml b/Flow.Launcher/HotkeyControlDialog.xaml
index 1edce6d06..d416f1bdc 100644
--- a/Flow.Launcher/HotkeyControlDialog.xaml
+++ b/Flow.Launcher/HotkeyControlDialog.xaml
@@ -125,12 +125,12 @@
BorderThickness="0 1 0 0"
CornerRadius="0 0 8 8">
Show History Results in Home Page
Maximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsالبحث عن إضافة
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
اختر مدير الملفاتLearn more
@@ -480,6 +489,7 @@
خطأAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowيرجى الانتظار...
diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml
index 552f1a36d..254298f80 100644
--- a/Flow.Launcher/Languages/cs.xaml
+++ b/Flow.Launcher/Languages/cs.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsVyhledat plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Vybrat správce souborůLearn more
@@ -480,6 +489,7 @@ Pokud před zkratku při zadávání přidáte znak "@", bude odpovíd
ChybaAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPočkejte prosím...
diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml
index 7fd6d478a..567532865 100644
--- a/Flow.Launcher/Languages/da.xaml
+++ b/Flow.Launcher/Languages/da.xaml
@@ -94,7 +94,7 @@
VælgSkjul Flow Launcher ved opstartFlow Launcher search window is hidden in the tray after starting up.
- Hide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.Query Search PrecisionChanges minimum match score required for results.
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Select File ManagerLearn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPlease wait...
diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml
index 3c650920f..940881129 100644
--- a/Flow.Launcher/Languages/de.xaml
+++ b/Flow.Launcher/Languages/de.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsPlug-in suchen
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Dateimanager auswählenMehr erfahren
@@ -480,6 +489,7 @@ Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt die
FehlerAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowBitte warten Sie ...
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 28673c753..c9fc36892 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -473,6 +473,7 @@
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPlease wait...
diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml
index 5bd77a8dd..40fa76c3d 100644
--- a/Flow.Launcher/Languages/es-419.xaml
+++ b/Flow.Launcher/Languages/es-419.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Seleccionar Gestor de ArchivosLearn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPor favor espere...
diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml
index 7324fc01b..1a8b22303 100644
--- a/Flow.Launcher/Languages/es.xaml
+++ b/Flow.Launcher/Languages/es.xaml
@@ -136,6 +136,8 @@
Mostrar historial de resultados en la página de inicioNúmero máximo de resultados del historial en la página de inicioEsto solo se puede editar si el complemento soporta la función de Inicio y la Página de Inicio está activada.
+ Show Search Window at Topmost
+ Show search window above other windowsBuscar complemento
@@ -364,12 +366,19 @@
Ubicación de datos del usuarioLa 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
+ AvanzadoNivel de registroDepurarInformaciónConfiguración de fuente de la ventana
+
+ Ver más notas de la versión en GitHub
+ No se pudo obtener las notas de la versión
+ Por favor, compruebe su conexión de red o asegúrese de que GitHub es accesible
+ Flow Launcher ha sido actualizado a {0}
+ Haga clic aquí para ver las notas de la versión
+
Seleccionar administrador de archivosMás información
@@ -480,6 +489,7 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci
ErrorSe ha producido un error al abrir la carpeta. {0}
+ Se ha producido un error al abrir la URL en el navegador. Por favor, compruebe la configuración de su navegador web predeterminado en la sección General de la ventana de configuraciónPor favor espere...
diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml
index 95ad58d6e..e70e75a26 100644
--- a/Flow.Launcher/Languages/fr.xaml
+++ b/Flow.Launcher/Languages/fr.xaml
@@ -136,6 +136,8 @@
Afficher les résultats de l'historique sur la page d'accueilMaximum de résultats de l'historique affichés sur la page d'accueilCeci ne peut être édité que si le plugin prend en charge la fonction Accueil et que la page d'accueil est activée.
+ Afficher la fenêtre de recherche en premier plan
+ Afficher la fenêtre de recherche au-dessus des autres fenêtresRechercher des plugins
@@ -369,6 +371,13 @@
InfoRéglage de la police de la fenêtre
+
+ Voir plus de notes de version sur GitHub
+ Impossible de récupérer les notes de version
+ Veuillez vérifier votre connexion réseau ou vous assurer que GitHub est accessible
+ Flow Launcher a été mis à jour à {0}
+ Cliquez ici pour voir les notes de version
+
Sélectionner le gestionnaire de fichiersEn savoir plus
@@ -388,7 +397,7 @@
NavigateurNom du navigateurChemin du navigateur
- Nouvel onglet
+ Nouvelle fenêtreNouvel ongletMode privé
@@ -479,6 +488,7 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu
ErreurUne erreur s'est produite lors de l'ouverture du dossier. {0}
+ Une erreur s'est produite lors de l'ouverture de l'URL dans le navigateur. Veuillez vérifier la configuration de votre navigateur Web par défaut dans la section "Général" de la fenêtre des paramètresVeuillez patienter...
diff --git a/Flow.Launcher/Languages/he.xaml b/Flow.Launcher/Languages/he.xaml
index d1688b647..23f4b7541 100644
--- a/Flow.Launcher/Languages/he.xaml
+++ b/Flow.Launcher/Languages/he.xaml
@@ -135,6 +135,8 @@
Show History Results in Home PageMaximum History Results Shown in Home Pageניתן לערוך זאת רק אם התוסף תומך בתכונת הבית ודף הבית מופעל.
+ Show Search Window at Topmost
+ Show search window above other windowsחפש תוסף
@@ -369,6 +371,13 @@
מידעSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
בחר מנהל קבציםלמד עוד
@@ -479,6 +488,7 @@
שגיאהאירעה שגיאה בעת פתיחת התיקייה. {0}
+ אירעה שגיאה בעת פתיחת כתובת ה-URL בדפדפן. אנא בדוק את תצורת דפדפן האינטרנט המוגדר כברירת מחדל שלך במקטע הכללי של חלון ההגדרותאנא המתן...
diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml
index 64d9f5abe..f41d960f1 100644
--- a/Flow.Launcher/Languages/it.xaml
+++ b/Flow.Launcher/Languages/it.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsPlugin di ricerca
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Seleziona Gestore FileLearn more
@@ -480,6 +489,7 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowAttendere prego...
diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml
index c2e64ae26..6c1b364f3 100644
--- a/Flow.Launcher/Languages/ja.xaml
+++ b/Flow.Launcher/Languages/ja.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
デフォルトのファイルマネージャーLearn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPlease wait...
diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml
index b78c86a82..1b1eaf4fa 100644
--- a/Flow.Launcher/Languages/ko.xaml
+++ b/Flow.Launcher/Languages/ko.xaml
@@ -127,6 +127,8 @@
히스토리를 홈페이지에 표시홈페이지에 표시할 최대 히스토리 수This can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windows플러그인 검색
@@ -361,6 +363,13 @@
Info설정창 글꼴
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
파일관리자 선택더 알아보기
@@ -471,6 +480,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window잠시 기다려주세요...
diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml
index 9e62ec2cc..07dc84c36 100644
--- a/Flow.Launcher/Languages/nb.xaml
+++ b/Flow.Launcher/Languages/nb.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSøk etter programtillegg
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Velg filbehandlerLearn more
@@ -480,6 +489,7 @@ Hvis du legger til et @-prefiks mens du legger inn en snarvei, samsvarer det med
FeilAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowVennligst vent...
diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml
index 31e6ea768..c74c95010 100644
--- a/Flow.Launcher/Languages/nl.xaml
+++ b/Flow.Launcher/Languages/nl.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsPlug-ins zoeken
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Bestandsbeheerder selecterenLearn more
@@ -480,6 +489,7 @@ Als u een '@' voorvoegsel toevoegt tijdens het invoeren van een snelkoppeling, m
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPlease wait...
diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml
index f32a38585..e9ac041f8 100644
--- a/Flow.Launcher/Languages/pl.xaml
+++ b/Flow.Launcher/Languages/pl.xaml
@@ -136,6 +136,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSzukaj wtyczek
@@ -370,6 +372,13 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
InfoUstawienia czcionki okna
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Wybierz menedżer plikówLearn more
@@ -480,6 +489,7 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d
BłądAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowProszę czekać...
diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml
index bcbfa74af..3e83c1924 100644
--- a/Flow.Launcher/Languages/pt-br.xaml
+++ b/Flow.Launcher/Languages/pt-br.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsBuscar Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Selecione o Gerenciador de ArquivosLearn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPor favor, aguarde...
diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml
index 4eca2c5c6..1bb97f764 100644
--- a/Flow.Launcher/Languages/pt-pt.xaml
+++ b/Flow.Launcher/Languages/pt-pt.xaml
@@ -135,6 +135,8 @@
Mostrar histórico na página inicialMáximo de resultados a mostrar na Página inicialEsta opção apenas pode ser editada se o plugin tiver suporte a Página inicial e se estiver ativo.
+ Janela de pesquisa por cima
+ Mostrar caixa de pesquisa por cima das outras janelasPesquisar plugins
@@ -366,7 +368,14 @@
Nível de registoDepuraçãoInformação
- Setting Window Font
+ Tipo de letra da aplicação
+
+
+ Mostrar notas da versão no GitHub
+ Falha ao obter notas da versão
+ Verifique a sua ligação de rede e confirme se consegue aceder a GitHub
+ Flow Launcher foi atualizado para {0}
+ Clique aqui para ver as notas desta versãoSelecione o gestor de ficheiros
@@ -400,7 +409,7 @@
Palavra-chave atualNova palavra-chaveCancelar
- Feito
+ OKPlugin não encontradoA nova palavra-chave não pode estar vaziaEsta palavra-chave já está associada a um plugin. Por favor escolha outra.
@@ -478,6 +487,7 @@ Se adicionar o prefixo '@' durante a introdução do atalho, será utilizada qua
ErroOcorreu um erro ao abrir a pasta: {0}
+ Ocorreu um erro ao abrir o URL no navegador. Verifique a configuração Navegador web padrão na secção Geral das definições.Por favor aguarde...
diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml
index 3a63a4ea4..d52afae1f 100644
--- a/Flow.Launcher/Languages/ru.xaml
+++ b/Flow.Launcher/Languages/ru.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsПоиск плагина
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Выбор менеджера файловLearn more
@@ -480,6 +489,7 @@
ОшибкаAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowПожалуйста, подождите...
diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml
index 3c47d61fd..7aa6ecc65 100644
--- a/Flow.Launcher/Languages/sk.xaml
+++ b/Flow.Launcher/Languages/sk.xaml
@@ -134,8 +134,10 @@
Domovská stránkaZobraziť výsledky Domovskej stránky, keď je text dopytu prázdny.Zobraziť výsledky histórie na Domovskej stránke
- Maximálny počet histórie výsledkov zobrazenej na Domovskej stránke
+ Maximálny počet zobrazených výsledkov histórie na Domovskej stránkeÚprava je možná len vtedy, ak plugin podporuje funkciu Domovská stránka a Domovská stránka je povolená.
+ Zobraziť vyhľadávacie okno navrchu
+ Zobraziť okno vyhľadávania nad ostatnými oknamiVyhľadať plugin
@@ -242,7 +244,7 @@
Typ pozadia (backdrop)Efekt pozadia sa v náhľade nezobrazuje.Pozadie je podporované od Windows 11 zostava 22000 a novších
- Žiadna
+ ŽiadnyAcrylicMicaMica Alt
@@ -370,6 +372,13 @@
InfoNastavenie písma okna
+
+ Ďalšie poznámky k vydaniu na Githube
+ Nepodarilo sa načítať poznámky k vydaniu
+ Skontrolujte sieťové pripojenie alebo sa uistite, že je Github dostupný
+ Flow Launcher bol aktualizovaný na {0}
+ Na zobrazenie poznámok k vydaniu kliknite sem
+
Vyberte správcu súborovViac informácií
@@ -480,6 +489,7 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s
ChybaPočas otvárania priečinka sa vyskytla chyba. {0}
+ Pri otváraní adresy URL v prehliadači došlo k chybe. Skontrolujte konfiguráciu predvoleného webového prehliadača v nastaveniach VšeobecnéČakajte, prosím...
diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml
index 43f316a38..ae7aa7af2 100644
--- a/Flow.Launcher/Languages/sr.xaml
+++ b/Flow.Launcher/Languages/sr.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Select File ManagerLearn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowPlease wait...
diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml
index 2f4e4d302..5c118be01 100644
--- a/Flow.Launcher/Languages/tr.xaml
+++ b/Flow.Launcher/Languages/tr.xaml
@@ -106,10 +106,10 @@
ÖnizlemeÖnizleme panelini her zaman aç. Önizlemeyi bu ayardan bağımsız {0} kısayolu ile açıp kapatabilirsiniz.Mevcut temada bulanıklık efekti etkinken gölgelendirme efektine izin verilmez
- Search Delay
+ Arama GecikmesiAdds 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
+ Varsayılan Arama Gecikme SüresiWait time before showing results after typing stops. Higher values wait longer. (ms)Information for Korean IME user
@@ -131,11 +131,13 @@
AçUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
- Home Page
+ Ana SayfaShow home page results when query text is empty.Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsEklenti Ara
@@ -154,11 +156,11 @@
Anahtar kelimeyi değiştirPlugin search delay timeChange Plugin Search Delay Time
- Advanced Settings:
+ Gelişmiş Ayarlar:Enabled
- Priority
- Search Delay
- Home Page
+ Öncelik
+ Arama Gecikmesi
+ Ana SayfaMevcut öncelikYeni ÖncelikÖncelik
@@ -239,12 +241,12 @@
ÖzelSaatTarih
- Backdrop Type
+ Arka Plan TürüThe backdrop effect is not applied in the preview.Backdrop supported starting from Windows 11 build 22000 and aboveHiçbiri
- Acrylic
- Mica
+ Akrilik
+ MikaMica AltThis theme supports two (light/dark) modes.This theme supports Blur Transparent Background.
@@ -252,7 +254,7 @@
Display placeholder when query is emptyPlaceholder textChange placeholder text. Input empty will use: {0}
- Fixed Window Size
+ Sabit Pencere BoyutuThe window size is not adjustable by dragging.
@@ -356,23 +358,30 @@
Günlük KlasörüGünlükleri TemizleTüm günlük kayıtlarını silmek istediğinize emin misiniz?
- Cache Folder
- Clear Caches
+ Önbellek Klasörü
+ Önbelleği TemizleAre you sure you want to delete all caches?Failed to clear part of folders and files. Please see log file for more informationKurulum SihirbazıKullanıcı Verisi DiziniKullanı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
+ Gelişmiş
+ Günlük Düzeyi
+ Hata ayıklama
+ BilgiSetting Window Font
+
+ See more release notes on GitHub
+ Sürüm notları alınamadı
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Sürüm notlarını görüntülemek için buraya tıklayın
+
Dosya Yöneticisi Seçenekleri
- Learn more
+ Daha fazla bilgiPlease 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
@@ -409,7 +418,7 @@
This new Action Keyword is the same as old, please choose a different oneBaşarılıBaşarıyla tamamlandı
- Failed to copy
+ Kopyalanamadı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.
@@ -417,7 +426,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
+ Ana SayfaEnable the plugin home page state if you like to show the plugin results when query is empty.
@@ -448,8 +457,8 @@
SıfırlaSilGüncelle
- Yes
- No
+ Evet
+ HayırArka plan
@@ -472,12 +481,13 @@
2. Copy below exception message
- File Manager Error
+ Dosya Yöneticisi Hatası
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}
+ Hata
+ Klasör açılırken bir hata oluştu. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowLütfen bekleyin...
diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml
index a7dfcda55..a8ee67653 100644
--- a/Flow.Launcher/Languages/uk-UA.xaml
+++ b/Flow.Launcher/Languages/uk-UA.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsПлагін для пошуку
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Виберіть файловий менеджерLearn more
@@ -480,6 +489,7 @@
ПомилкаAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowБудь ласка, зачекайте...
diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml
index b77c6d4e8..a2875f3c0 100644
--- a/Flow.Launcher/Languages/vi.xaml
+++ b/Flow.Launcher/Languages/vi.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsPlugin tìm kiếm
@@ -372,6 +374,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
Chọn trình quản lý tệpLearn more
@@ -484,6 +493,7 @@
LỗiAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings windowCảnh báo nhỏ...
diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml
index 95a97d5ed..698eee1e3 100644
--- a/Flow.Launcher/Languages/zh-cn.xaml
+++ b/Flow.Launcher/Languages/zh-cn.xaml
@@ -136,6 +136,8 @@
在主页中显示历史记录在主页显示的最大历史结果数这只能在插件支持主页功能和主页启用时进行编辑。
+ Show Search Window at Topmost
+ Show search window above other windows搜索插件
@@ -239,7 +241,7 @@
自定义时钟日期
- 返回类型
+ 背景类型预览中没有应用背景效果。自 Windows 11 Build 22000 起支持背景效果无
@@ -370,6 +372,13 @@
信息设置窗口字体
+
+ 在 GitHub 上查看更多版本说明
+ 无法获取版本说明
+ 请检查您的网络连接或确认 GitHub 可访问
+ Flow Launcher 已更新到 {0}
+ 单击此处查看版本说明
+
默认文件管理器了解更多
@@ -480,6 +489,7 @@
错误打开文件夹时发生错误。{0}
+ 打开浏览器中的 URL 时发生错误。请在设置窗口的常规部分检查您的默认网页浏览器配置请稍等...
diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml
index 60531c6aa..0f6ad3f5b 100644
--- a/Flow.Launcher/Languages/zh-tw.xaml
+++ b/Flow.Launcher/Languages/zh-tw.xaml
@@ -136,6 +136,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
@@ -370,6 +372,13 @@
InfoSetting Window Font
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
選擇檔案管理器Learn more
@@ -480,6 +489,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
ErrorAn error occurred while opening the folder. {0}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window請稍後...
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index f15091e4a..a77d6471c 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -465,7 +465,55 @@ namespace Flow.Launcher
private void OnMouseDown(object sender, MouseButtonEventArgs e)
{
- if (e.ChangedButton == MouseButton.Left) DragMove();
+ // When the window is maximized via Snap,
+ // dragging attempts will first switch the window from Maximized to Normal state,
+ // and adjust the drag position accordingly.
+ if (e.ChangedButton == MouseButton.Left)
+ {
+ try
+ {
+ if (WindowState == WindowState.Maximized)
+ {
+ // Calculate ratio based on maximized window dimensions
+ double maxWidth = ActualWidth;
+ double maxHeight = ActualHeight;
+ var mousePos = e.GetPosition(this);
+ double xRatio = mousePos.X / maxWidth;
+ double yRatio = mousePos.Y / maxHeight;
+
+ // Current monitor information
+ var screen = Screen.FromHandle(new WindowInteropHelper(this).Handle);
+ var workingArea = screen.WorkingArea;
+ var screenLeftTop = Win32Helper.TransformPixelsToDIP(this, workingArea.X, workingArea.Y);
+
+ // Switch to Normal state
+ WindowState = WindowState.Normal;
+
+ Application.Current?.Dispatcher.Invoke(new Action(() =>
+ {
+ double normalWidth = Width;
+ double normalHeight = Height;
+
+ // Apply ratio based on the difference between maximized and normal window sizes
+ Left = screenLeftTop.X + (maxWidth - normalWidth) * xRatio;
+ Top = screenLeftTop.Y + (maxHeight - normalHeight) * yRatio;
+
+ if (Mouse.LeftButton == MouseButtonState.Pressed)
+ {
+ DragMove();
+ }
+ }), DispatcherPriority.ApplicationIdle);
+ }
+ else
+ {
+ DragMove();
+ }
+ }
+ catch (InvalidOperationException)
+ {
+ // Ignored - can occur if drag operation is already in progress
+ }
+ }
}
#endregion
@@ -490,56 +538,76 @@ namespace Flow.Launcher
#region Window WndProc
- private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
+ private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
- if (msg == Win32Helper.WM_ENTERSIZEMOVE)
+ switch (msg)
{
- _initialWidth = (int)Width;
- _initialHeight = (int)Height;
-
- handled = true;
- }
- else if (msg == Win32Helper.WM_EXITSIZEMOVE)
- {
- if (_initialHeight != (int)Height)
- {
- if (!_settings.KeepMaxResults)
+ case Win32Helper.WM_ENTERSIZEMOVE:
+ _initialWidth = (int)Width;
+ _initialHeight = (int)Height;
+ handled = true;
+ break;
+ case Win32Helper.WM_EXITSIZEMOVE:
+ //Prevent updating the number of results when the window height is below the height of a single result item.
+ //This situation occurs not only when the user manually resizes the window, but also when the window is released from a side snap, as the OS automatically adjusts the window height.
+ //(Without this check, releasing from a snap can cause the window height to hit the minimum, resulting in only 2 results being shown.)
+ if (_initialHeight != (int)Height && Height > (_settings.WindowHeightSize + _settings.ItemHeightSize))
{
- // Get shadow margin
- var shadowMargin = 0;
- var (_, useDropShadowEffect) = _theme.GetActualValue();
- if (useDropShadowEffect)
+ if (!_settings.KeepMaxResults)
{
- shadowMargin = 32;
+ // Get shadow margin
+ var shadowMargin = 0;
+ var (_, useDropShadowEffect) = _theme.GetActualValue();
+ if (useDropShadowEffect)
+ {
+ shadowMargin = 32;
+ }
+
+ // Calculate max results to show
+ var itemCount = (Height - (_settings.WindowHeightSize + 14) - shadowMargin) / _settings.ItemHeightSize;
+ if (itemCount < 2)
+ {
+ _settings.MaxResultsToShow = 2;
+ }
+ else
+ {
+ _settings.MaxResultsToShow = Convert.ToInt32(Math.Truncate(itemCount));
+ }
}
- // Calculate max results to show
- var itemCount = (Height - (_settings.WindowHeightSize + 14) - shadowMargin) / _settings.ItemHeightSize;
- if (itemCount < 2)
- {
- _settings.MaxResultsToShow = 2;
- }
- else
- {
- _settings.MaxResultsToShow = Convert.ToInt32(Math.Truncate(itemCount));
- }
+ SizeToContent = SizeToContent.Height;
+ }
+ else
+ {
+ // Update height when exiting maximized snap state.
+ SizeToContent = SizeToContent.Height;
}
- SizeToContent = SizeToContent.Height;
- }
-
- if (_initialWidth != (int)Width)
- {
- if (!_settings.KeepMaxResults)
+ if (_initialWidth != (int)Width)
{
- // Update width
- _viewModel.MainWindowWidth = Width;
+ if (!_settings.KeepMaxResults)
+ {
+ // Update width
+ _viewModel.MainWindowWidth = Width;
+ }
+
+ SizeToContent = SizeToContent.Height;
}
+ handled = true;
+ break;
+ case Win32Helper.WM_NCLBUTTONDBLCLK: // Block the double click in frame
SizeToContent = SizeToContent.Height;
- }
-
- handled = true;
+ handled = true;
+ break;
+ case Win32Helper.WM_SYSCOMMAND: // Block Maximize/Minimize by Win+Up and Win+Down Arrow
+ var command = wParam.ToInt32() & 0xFFF0;
+ if (command == Win32Helper.SC_MAXIMIZE || command == Win32Helper.SC_MINIMIZE)
+ {
+ SizeToContent = SizeToContent.Height;
+ handled = true;
+ }
+ break;
}
return IntPtr.Zero;
diff --git a/Flow.Launcher/Properties/Resources.fr-FR.resx b/Flow.Launcher/Properties/Resources.fr-FR.resx
deleted file mode 100644
index ca0f66f53..000000000
--- a/Flow.Launcher/Properties/Resources.fr-FR.resx
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\dev.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
\ No newline at end of file
diff --git a/Flow.Launcher/Properties/Resources.he-IL.resx b/Flow.Launcher/Properties/Resources.he-IL.resx
deleted file mode 100644
index ca0f66f53..000000000
--- a/Flow.Launcher/Properties/Resources.he-IL.resx
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
- ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\dev.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
- ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-
-
\ No newline at end of file
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index c06c56039..010dc3b87 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -251,7 +251,7 @@ namespace Flow.Launcher
Http.GetStreamAsync(url, token);
public Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath, Action reportProgress = null,
- CancellationToken token = default) =>Http.DownloadAsync(url, filePath, reportProgress, token);
+ CancellationToken token = default) => Http.DownloadAsync(url, filePath, reportProgress, token);
public void AddActionKeyword(string pluginId, string newActionKeyword) =>
PluginManager.AddActionKeyword(pluginId, newActionKeyword);
@@ -276,7 +276,7 @@ namespace Flow.Launcher
public void LogException(string className, string message, Exception e, [CallerMemberName] string methodName = "") =>
Log.Exception(className, message, e, methodName);
- private readonly ConcurrentDictionary _pluginJsonStorages = new();
+ private readonly ConcurrentDictionary _pluginJsonStorages = new();
public void RemovePluginSettings(string assemblyName)
{
@@ -294,10 +294,9 @@ namespace Flow.Launcher
public void SavePluginSettings()
{
- foreach (var value in _pluginJsonStorages.Values)
+ foreach (var savable in _pluginJsonStorages.Values)
{
- var savable = value as ISavable;
- savable?.Save();
+ savable.Save();
}
}
@@ -390,22 +389,35 @@ namespace Flow.Launcher
}
}
-
- private void OpenUri(Uri uri, bool? inPrivate = null)
+ private void OpenUri(Uri uri, bool? inPrivate = null, bool forceBrowser = false)
{
- if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)
+ if (forceBrowser || uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)
{
var browserInfo = _settings.CustomBrowser;
var path = browserInfo.Path == "*" ? "" : browserInfo.Path;
- if (browserInfo.OpenInTab)
+ try
{
- uri.AbsoluteUri.OpenInBrowserTab(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
+ if (browserInfo.OpenInTab)
+ {
+ uri.AbsoluteUri.OpenInBrowserTab(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
+ }
+ else
+ {
+ uri.AbsoluteUri.OpenInBrowserWindow(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
+ }
}
- else
+ catch (Exception e)
{
- uri.AbsoluteUri.OpenInBrowserWindow(path, inPrivate ?? browserInfo.EnablePrivate, browserInfo.PrivateArg);
+ var tabOrWindow = browserInfo.OpenInTab ? "tab" : "window";
+ LogException(ClassName, $"Failed to open URL in browser {tabOrWindow}: {path}, {inPrivate ?? browserInfo.EnablePrivate}, {browserInfo.PrivateArg}", e);
+ ShowMsgBox(
+ GetTranslation("browserOpenError"),
+ GetTranslation("errorTitle"),
+ MessageBoxButton.OK,
+ MessageBoxImage.Error
+ );
}
}
else
@@ -420,6 +432,16 @@ namespace Flow.Launcher
}
}
+ public void OpenWebUrl(string url, bool? inPrivate = null)
+ {
+ OpenUri(new Uri(url), inPrivate, true);
+ }
+
+ public void OpenWebUrl(Uri url, bool? inPrivate = null)
+ {
+ OpenUri(url, inPrivate, true);
+ }
+
public void OpenUrl(string url, bool? inPrivate = null)
{
OpenUri(new Uri(url), inPrivate);
@@ -482,7 +504,7 @@ namespace Flow.Launcher
public bool SetCurrentTheme(ThemeData theme) =>
Theme.ChangeTheme(theme.FileNameWithoutExtension);
- private readonly ConcurrentDictionary<(string, string, Type), object> _pluginBinaryStorages = new();
+ private readonly ConcurrentDictionary<(string, string, Type), ISavable> _pluginBinaryStorages = new();
public void RemovePluginCaches(string cacheDirectory)
{
@@ -499,10 +521,9 @@ namespace Flow.Launcher
public void SavePluginCaches()
{
- foreach (var value in _pluginBinaryStorages.Values)
+ foreach (var savable in _pluginBinaryStorages.Values)
{
- var savable = value as ISavable;
- savable?.Save();
+ savable.Save();
}
}
diff --git a/Flow.Launcher/Resources/Controls/InstalledPluginDisplayKeyword.xaml b/Flow.Launcher/Resources/Controls/InstalledPluginDisplayKeyword.xaml
index ded6e0e27..bb1d3cc0f 100644
--- a/Flow.Launcher/Resources/Controls/InstalledPluginDisplayKeyword.xaml
+++ b/Flow.Launcher/Resources/Controls/InstalledPluginDisplayKeyword.xaml
@@ -36,7 +36,8 @@
Text="{DynamicResource actionKeywords}" />
+
+
+
+
+
diff --git a/Flow.Launcher/WelcomeWindow.xaml b/Flow.Launcher/WelcomeWindow.xaml
index 5d91db749..f008827da 100644
--- a/Flow.Launcher/WelcomeWindow.xaml
+++ b/Flow.Launcher/WelcomeWindow.xaml
@@ -10,11 +10,11 @@
Name="FlowWelcomeWindow"
Title="{DynamicResource Welcome_Page1_Title}"
Width="550"
- Height="650"
+ Height="700"
MinWidth="550"
- MinHeight="650"
+ MinHeight="700"
MaxWidth="550"
- MaxHeight="650"
+ MaxHeight="700"
d:DataContext="{d:DesignInstance Type=vm:WelcomeViewModel}"
Activated="OnActivated"
Background="{DynamicResource Color00B}"
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index e859976bd..6e6b2e5f4 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -1,7 +1,10 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
using System.IO;
using System.Text.Json;
-using System;
+using System.Threading.Tasks;
+using Flow.Launcher.Plugin.BrowserBookmark.Helper;
using Flow.Launcher.Plugin.BrowserBookmark.Models;
using Microsoft.Data.Sqlite;
@@ -43,16 +46,23 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
catch (Exception ex)
{
Main._context.API.LogException(ClassName, $"Failed to register bookmark file monitoring: {bookmarkPath}", ex);
+ continue;
}
var source = name + (Path.GetFileName(profile) == "Default" ? "" : $" ({Path.GetFileName(profile)})");
var profileBookmarks = LoadBookmarksFromFile(bookmarkPath, source);
// Load favicons after loading bookmarks
- var faviconDbPath = Path.Combine(profile, "Favicons");
- if (File.Exists(faviconDbPath))
+ if (Main._settings.EnableFavicons)
{
- LoadFaviconsFromDb(faviconDbPath, profileBookmarks);
+ var faviconDbPath = Path.Combine(profile, "Favicons");
+ if (File.Exists(faviconDbPath))
+ {
+ Main._context.API.StopwatchLogInfo(ClassName, $"Load {profileBookmarks.Count} favicons cost", () =>
+ {
+ LoadFaviconsFromDb(faviconDbPath, profileBookmarks);
+ });
+ }
}
bookmarks.AddRange(profileBookmarks);
@@ -122,72 +132,59 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
private void LoadFaviconsFromDb(string dbPath, List bookmarks)
{
- // Use a copy to avoid lock issues with the original file
- var tempDbPath = Path.Combine(_faviconCacheDir, $"tempfavicons_{Guid.NewGuid()}.db");
-
- try
+ FaviconHelper.LoadFaviconsFromDb(_faviconCacheDir, dbPath, (tempDbPath) =>
{
- File.Copy(dbPath, tempDbPath, true);
- }
- catch (Exception ex)
- {
- try
- {
- if (File.Exists(tempDbPath))
- {
- File.Delete(tempDbPath);
- }
- }
- catch (Exception ex1)
- {
- Main._context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex1);
- }
- Main._context.API.LogException(ClassName, $"Failed to copy favicon DB: {dbPath}", ex);
- return;
- }
+ // Since some bookmarks may have same favicon id, we need to record them to avoid duplicates
+ var savedPaths = new ConcurrentDictionary();
- try
- {
- using var connection = new SqliteConnection($"Data Source={tempDbPath}");
- connection.Open();
-
- foreach (var bookmark in bookmarks)
+ // Get favicons based on bookmarks concurrently
+ Parallel.ForEach(bookmarks, bookmark =>
{
+ // Use read-only connection to avoid locking issues
+ // Do not use pooling so that we do not need to clear pool: https://github.com/dotnet/efcore/issues/26580
+ var connection = new SqliteConnection($"Data Source={tempDbPath};Mode=ReadOnly;Pooling=false");
+ connection.Open();
+
try
{
var url = bookmark.Url;
- if (string.IsNullOrEmpty(url)) continue;
+ if (string.IsNullOrEmpty(url)) return;
// Extract domain from URL
if (!Uri.TryCreate(url, UriKind.Absolute, out Uri uri))
- continue;
+ return;
var domain = uri.Host;
using var cmd = connection.CreateCommand();
cmd.CommandText = @"
- SELECT f.id, b.image_data
- FROM favicons f
- JOIN favicon_bitmaps b ON f.id = b.icon_id
- JOIN icon_mapping m ON f.id = m.icon_id
- WHERE m.page_url LIKE @url
- ORDER BY b.width DESC
- LIMIT 1";
+ SELECT f.id, b.image_data
+ FROM favicons f
+ JOIN favicon_bitmaps b ON f.id = b.icon_id
+ JOIN icon_mapping m ON f.id = m.icon_id
+ WHERE m.page_url LIKE @url
+ ORDER BY b.width DESC
+ LIMIT 1";
cmd.Parameters.AddWithValue("@url", $"%{domain}%");
using var reader = cmd.ExecuteReader();
if (!reader.Read() || reader.IsDBNull(1))
- continue;
+ return;
var iconId = reader.GetInt64(0).ToString();
var imageData = (byte[])reader["image_data"];
if (imageData is not { Length: > 0 })
- continue;
+ return;
var faviconPath = Path.Combine(_faviconCacheDir, $"chromium_{domain}_{iconId}.png");
- SaveBitmapData(imageData, faviconPath);
+
+ // Filter out duplicate favicons
+ if (savedPaths.TryAdd(faviconPath, true))
+ {
+ FaviconHelper.SaveBitmapData(imageData, faviconPath);
+ }
bookmark.FaviconPath = faviconPath;
}
@@ -195,37 +192,14 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
{
Main._context.API.LogException(ClassName, $"Failed to extract bookmark favicon: {bookmark.Url}", ex);
}
- }
-
- // https://github.com/dotnet/efcore/issues/26580
- SqliteConnection.ClearPool(connection);
- connection.Close();
- }
- catch (Exception ex)
- {
- Main._context.API.LogException(ClassName, $"Failed to connect to SQLite: {tempDbPath}", ex);
- }
-
- // Delete temporary file
- try
- {
- File.Delete(tempDbPath);
- }
- catch (Exception ex)
- {
- Main._context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex);
- }
- }
-
- private static void SaveBitmapData(byte[] imageData, string outputPath)
- {
- try
- {
- File.WriteAllBytes(outputPath, imageData);
- }
- catch (Exception ex)
- {
- Main._context.API.LogException(ClassName, $"Failed to save image: {outputPath}", ex);
- }
+ finally
+ {
+ // Cache connection and clear pool after all operations to avoid issue:
+ // ObjectDisposedException: Safe handle has been closed.
+ connection.Close();
+ connection.Dispose();
+ }
+ });
+ });
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 75f26d322..ec3b867ea 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -1,7 +1,10 @@
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using System.Threading.Tasks;
+using Flow.Launcher.Plugin.BrowserBookmark.Helper;
using Flow.Launcher.Plugin.BrowserBookmark.Models;
using Microsoft.Data.Sqlite;
@@ -30,8 +33,6 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
ORDER BY moz_places.visit_count DESC
""";
- private const string DbPathFormat = "Data Source={0}";
-
protected List GetBookmarksFromPath(string placesPath)
{
// Variable to store bookmark list
@@ -41,30 +42,32 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
if (string.IsNullOrEmpty(placesPath) || !File.Exists(placesPath))
return bookmarks;
+ // Try to register file monitoring
+ try
+ {
+ Main.RegisterBookmarkFile(placesPath);
+ }
+ catch (Exception ex)
+ {
+ Main._context.API.LogException(ClassName, $"Failed to register Firefox bookmark file monitoring: {placesPath}", ex);
+ return bookmarks;
+ }
+
var tempDbPath = Path.Combine(_faviconCacheDir, $"tempplaces_{Guid.NewGuid()}.sqlite");
try
{
- // Try to register file monitoring
- try
- {
- Main.RegisterBookmarkFile(placesPath);
- }
- catch (Exception ex)
- {
- Main._context.API.LogException(ClassName, $"Failed to register Firefox bookmark file monitoring: {placesPath}", ex);
- }
-
// Use a copy to avoid lock issues with the original file
File.Copy(placesPath, tempDbPath, true);
- // Connect to database and execute query
- string dbPath = string.Format(DbPathFormat, tempDbPath);
- using var dbConnection = new SqliteConnection(dbPath);
+ // Create the connection string and init the connection
+ using var dbConnection = new SqliteConnection($"Data Source={tempDbPath};Mode=ReadOnly");
+
+ // Open connection to the database file and execute the query
dbConnection.Open();
var reader = new SqliteCommand(QueryAllBookmarks, dbConnection).ExecuteReader();
- // Create bookmark list
+ // Get results in List format
bookmarks = reader
.Select(
x => new Bookmark(
@@ -75,12 +78,20 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
)
.ToList();
- // Path to favicon database
- var faviconDbPath = Path.Combine(Path.GetDirectoryName(placesPath), "favicons.sqlite");
- if (File.Exists(faviconDbPath))
+ // Load favicons after loading bookmarks
+ if (Main._settings.EnableFavicons)
{
- LoadFaviconsFromDb(faviconDbPath, bookmarks);
+ var faviconDbPath = Path.Combine(Path.GetDirectoryName(placesPath), "favicons.sqlite");
+ if (File.Exists(faviconDbPath))
+ {
+ Main._context.API.StopwatchLogInfo(ClassName, $"Load {bookmarks.Count} favicons cost", () =>
+ {
+ LoadFaviconsFromDb(faviconDbPath, bookmarks);
+ });
+ }
}
+
+ // Close the connection so that we can delete the temporary file
// https://github.com/dotnet/efcore/issues/26580
SqliteConnection.ClearPool(dbConnection);
dbConnection.Close();
@@ -93,7 +104,10 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
// Delete temporary file
try
{
- File.Delete(tempDbPath);
+ if (File.Exists(tempDbPath))
+ {
+ File.Delete(tempDbPath);
+ }
}
catch (Exception ex)
{
@@ -103,34 +117,29 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
return bookmarks;
}
- private void LoadFaviconsFromDb(string faviconDbPath, List bookmarks)
+ private void LoadFaviconsFromDb(string dbPath, List bookmarks)
{
- var tempDbPath = Path.Combine(_faviconCacheDir, $"tempfavicons_{Guid.NewGuid()}.sqlite");
-
- try
+ FaviconHelper.LoadFaviconsFromDb(_faviconCacheDir, dbPath, (tempDbPath) =>
{
- // Use a copy to avoid lock issues with the original file
- File.Copy(faviconDbPath, tempDbPath, true);
-
- var defaultIconPath = Path.Combine(
- Path.GetDirectoryName(typeof(FirefoxBookmarkLoaderBase).Assembly.Location),
- "bookmark.png");
+ // Since some bookmarks may have same favicon id, we need to record them to avoid duplicates
+ var savedPaths = new ConcurrentDictionary();
- string dbPath = string.Format(DbPathFormat, tempDbPath);
- using var connection = new SqliteConnection(dbPath);
- connection.Open();
-
- // Get favicons based on bookmark URLs
- foreach (var bookmark in bookmarks)
+ // Get favicons based on bookmarks concurrently
+ Parallel.ForEach(bookmarks, bookmark =>
{
+ // Use read-only connection to avoid locking issues
+ // Do not use pooling so that we do not need to clear pool: https://github.com/dotnet/efcore/issues/26580
+ var connection = new SqliteConnection($"Data Source={tempDbPath};Mode=ReadOnly;Pooling=false");
+ connection.Open();
+
try
{
if (string.IsNullOrEmpty(bookmark.Url))
- continue;
+ return;
// Extract domain from URL
if (!Uri.TryCreate(bookmark.Url, UriKind.Absolute, out Uri uri))
- continue;
+ return;
var domain = uri.Host;
@@ -150,15 +159,15 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
using var reader = cmd.ExecuteReader();
if (!reader.Read() || reader.IsDBNull(0))
- continue;
+ return;
var imageData = (byte[])reader["data"];
if (imageData is not { Length: > 0 })
- continue;
+ return;
string faviconPath;
- if (IsSvgData(imageData))
+ if (FaviconHelper.IsSvgData(imageData))
{
faviconPath = Path.Combine(_faviconCacheDir, $"firefox_{domain}.svg");
}
@@ -166,7 +175,12 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
{
faviconPath = Path.Combine(_faviconCacheDir, $"firefox_{domain}.png");
}
- SaveBitmapData(imageData, faviconPath);
+
+ // Filter out duplicate favicons
+ if (savedPaths.TryAdd(faviconPath, true))
+ {
+ FaviconHelper.SaveBitmapData(imageData, faviconPath);
+ }
bookmark.FaviconPath = faviconPath;
}
@@ -174,47 +188,15 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
{
Main._context.API.LogException(ClassName, $"Failed to extract Firefox favicon: {bookmark.Url}", ex);
}
- }
-
- // https://github.com/dotnet/efcore/issues/26580
- SqliteConnection.ClearPool(connection);
- connection.Close();
- }
- catch (Exception ex)
- {
- Main._context.API.LogException(ClassName, $"Failed to load Firefox favicon DB: {faviconDbPath}", ex);
- }
-
- // Delete temporary file
- try
- {
- File.Delete(tempDbPath);
- }
- catch (Exception ex)
- {
- Main._context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex);
- }
- }
-
- private static void SaveBitmapData(byte[] imageData, string outputPath)
- {
- try
- {
- File.WriteAllBytes(outputPath, imageData);
- }
- catch (Exception ex)
- {
- Main._context.API.LogException(ClassName, $"Failed to save image: {outputPath}", ex);
- }
- }
-
- private static bool IsSvgData(byte[] data)
- {
- if (data.Length < 5)
- return false;
- string start = System.Text.Encoding.ASCII.GetString(data, 0, Math.Min(100, data.Length));
- return start.Contains("
public override List GetBookmarks()
{
- return GetBookmarksFromPath(PlacesPath);
+ var bookmarks = new List();
+ bookmarks.AddRange(GetBookmarksFromPath(PlacesPath));
+ bookmarks.AddRange(GetBookmarksFromPath(MsixPlacesPath));
+ return bookmarks;
}
///
- /// Path to places.sqlite
+ /// Path to places.sqlite of Msi installer
+ /// E.g. C:\Users\{UserName}\AppData\Roaming\Mozilla\Firefox
+ ///
///
private static string PlacesPath
{
get
{
var profileFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Mozilla\Firefox");
- var profileIni = Path.Combine(profileFolderPath, @"profiles.ini");
-
- if (!File.Exists(profileIni))
- return string.Empty;
-
- // get firefox default profile directory from profiles.ini
- using var sReader = new StreamReader(profileIni);
- var ini = sReader.ReadToEnd();
-
- var lines = ini.Split("\r\n").ToList();
-
- var defaultProfileFolderNameRaw = lines.FirstOrDefault(x => x.Contains("Default=") && x != "Default=1") ?? string.Empty;
-
- if (string.IsNullOrEmpty(defaultProfileFolderNameRaw))
- return string.Empty;
-
- var defaultProfileFolderName = defaultProfileFolderNameRaw.Split('=').Last();
-
- var indexOfDefaultProfileAttributePath = lines.IndexOf("Path=" + defaultProfileFolderName);
-
- // Seen in the example above, the IsRelative attribute is always above the Path attribute
- var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
-
- return relativeAttribute == "0" // See above, the profile is located in a custom location, path is not relative, so IsRelative=0
- ? defaultProfileFolderName + @"\places.sqlite"
- : Path.Combine(profileFolderPath, defaultProfileFolderName) + @"\places.sqlite";
+ return GetProfileIniPath(profileFolderPath);
}
}
+
+ ///
+ /// Path to places.sqlite of MSIX installer
+ /// E.g. C:\Users\{UserName}\AppData\Local\Packages\Mozilla.Firefox_n80bbvh6b1yt2\LocalCache\Roaming\Mozilla\Firefox
+ ///
+ ///
+ public static string MsixPlacesPath
+ {
+ get
+ {
+ var platformPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
+ var packagesPath = Path.Combine(platformPath, "Packages");
+ try
+ {
+ // Search for folder with Mozilla.Firefox prefix
+ var firefoxPackageFolder = Directory.EnumerateDirectories(packagesPath, "Mozilla.Firefox*",
+ SearchOption.TopDirectoryOnly).FirstOrDefault();
+
+ // Msix FireFox not installed
+ if (firefoxPackageFolder == null) return string.Empty;
+
+ var profileFolderPath = Path.Combine(firefoxPackageFolder, @"LocalCache\Roaming\Mozilla\Firefox");
+ return GetProfileIniPath(profileFolderPath);
+ }
+ catch
+ {
+ return string.Empty;
+ }
+ }
+ }
+
+ private static string GetProfileIniPath(string profileFolderPath)
+ {
+ var profileIni = Path.Combine(profileFolderPath, @"profiles.ini");
+ if (!File.Exists(profileIni))
+ return string.Empty;
+
+ // get firefox default profile directory from profiles.ini
+ using var sReader = new StreamReader(profileIni);
+ var ini = sReader.ReadToEnd();
+
+ var lines = ini.Split("\r\n").ToList();
+
+ var defaultProfileFolderNameRaw = lines.FirstOrDefault(x => x.Contains("Default=") && x != "Default=1") ?? string.Empty;
+
+ if (string.IsNullOrEmpty(defaultProfileFolderNameRaw))
+ return string.Empty;
+
+ var defaultProfileFolderName = defaultProfileFolderNameRaw.Split('=').Last();
+
+ var indexOfDefaultProfileAttributePath = lines.IndexOf("Path=" + defaultProfileFolderName);
+
+ /*
+ Current profiles.ini structure example as of Firefox version 69.0.1
+
+ [Install736426B0AF4A39CB]
+ Default=Profiles/7789f565.default-release <== this is the default profile this plugin will get the bookmarks from. When opened Firefox will load the default profile
+ Locked=1
+
+ [Profile2]
+ Name=dummyprofile
+ IsRelative=0
+ Path=C:\t6h2yuq8.dummyprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code.
+
+ [Profile1]
+ Name=default
+ IsRelative=1
+ Path=Profiles/cydum7q4.default
+ Default=1
+
+ [Profile0]
+ Name=default-release
+ IsRelative=1
+ Path=Profiles/7789f565.default-release
+
+ [General]
+ StartWithLastProfile=1
+ Version=2
+ */
+ // Seen in the example above, the IsRelative attribute is always above the Path attribute
+
+ var relativePath = Path.Combine(defaultProfileFolderName, "places.sqlite");
+ var absolutePath = Path.Combine(profileFolderPath, relativePath);
+
+ // If the index is out of range, it means that the default profile is in a custom location or the file is malformed
+ // If the profile is in a custom location, we need to check
+ if (indexOfDefaultProfileAttributePath - 1 < 0 ||
+ indexOfDefaultProfileAttributePath - 1 >= lines.Count)
+ {
+ return Directory.Exists(absolutePath) ? absolutePath : relativePath;
+ }
+
+ var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1];
+
+ // See above, the profile is located in a custom location, path is not relative, so IsRelative=0
+ return (relativeAttribute == "0" || relativeAttribute == "IsRelative=0")
+ ? relativePath : absolutePath;
+ }
}
public static class Extensions
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
new file mode 100644
index 000000000..a879dcefd
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
@@ -0,0 +1,76 @@
+using System;
+using System.IO;
+
+namespace Flow.Launcher.Plugin.BrowserBookmark.Helper;
+
+public static class FaviconHelper
+{
+ private static readonly string ClassName = nameof(FaviconHelper);
+
+ public static void LoadFaviconsFromDb(string faviconCacheDir, string dbPath, Action loadAction)
+ {
+ // Use a copy to avoid lock issues with the original file
+ var tempDbPath = Path.Combine(faviconCacheDir, $"tempfavicons_{Guid.NewGuid()}.db");
+
+ try
+ {
+ File.Copy(dbPath, tempDbPath, true);
+ }
+ catch (Exception ex)
+ {
+ try
+ {
+ if (File.Exists(tempDbPath))
+ {
+ File.Delete(tempDbPath);
+ }
+ }
+ catch (Exception ex1)
+ {
+ Main._context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex1);
+ }
+ Main._context.API.LogException(ClassName, $"Failed to copy favicon DB: {dbPath}", ex);
+ return;
+ }
+
+ try
+ {
+ loadAction(tempDbPath);
+ }
+ catch (Exception ex)
+ {
+ Main._context.API.LogException(ClassName, $"Failed to connect to SQLite: {tempDbPath}", ex);
+ }
+
+ // Delete temporary file
+ try
+ {
+ File.Delete(tempDbPath);
+ }
+ catch (Exception ex)
+ {
+ Main._context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex);
+ }
+ }
+
+ public static void SaveBitmapData(byte[] imageData, string outputPath)
+ {
+ try
+ {
+ File.WriteAllBytes(outputPath, imageData);
+ }
+ catch (Exception ex)
+ {
+ Main._context.API.LogException(ClassName, $"Failed to save image: {outputPath}", ex);
+ }
+ }
+
+ public static bool IsSvgData(byte[] data)
+ {
+ if (data.Length < 5)
+ return false;
+ string start = System.Text.Encoding.ASCII.GetString(data, 0, Math.Min(100, data.Length));
+ return start.Contains("محرك المتصفح
إذا كنت لا تستخدم Chrome أو Firefox أو Edge، أو كنت تستخدم نسختهم المحمولة، ستحتاج إلى إضافة دليل بيانات الإشارات المرجعية وتحديد محرك المتصفح الصحيح لجعل هذه الإضافة تعمل.على سبيل المثال: محرك Brave هو Chromium؛ وموقع بيانات الإشارات المرجعية الافتراضي هو: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". بالنسبة لمحرك Firefox، دليل الإشارات المرجعية هو مجلد userdata الذي يحتوي على ملف places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml
index 7511b96f3..45f8d97da 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml
@@ -25,4 +25,6 @@
Jádro webového prohlížečePokud nepoužíváte prohlížeč Chrome, Firefox nebo Edge nebo používáte přenosnou verzi prohlížeče Chrome, Firefox nebo Edge, musíte přidat složku záložek a vybrat správné jádro prohlížeče, aby tento doplněk fungoval.Například: prohlížeč Brave má jádro Chromium; výchozí umístění pro data záložek je: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". V případě jádra Firefox je složkou záložek složka userdata, která obsahuje soubor places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml
index 49c087484..153b05d76 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml
@@ -25,4 +25,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml
index 4d1ad4bf1..4a764bbfa 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml
@@ -26,4 +26,6 @@
Wenn Sie nicht Chrome, Firefox oder Edge verwenden oder deren portable Version nutzen, müssen Sie das Lesezeichen-Datenverzeichnis hinzufügen und die richtige Browser-Engine auswählen, damit dieses Plug-in funktioniert.Zum Beispiel: Die Engine von Brave ist Chromium, und deren Standardspeicherort der Lesezeichen-Daten ist:
%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Bei der Firefox-Engine ist das Lesezeichenverzeichnis der Ordner userdata, der die Datei places.sqlite enthält.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
index e5f3d541e..22830e7c8 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
@@ -27,4 +27,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml
index 0f7a95571..28524229b 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml
@@ -25,4 +25,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
index db87ee281..ba9efd7e0 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
@@ -25,4 +25,6 @@
Motor del navegadorSi no está utilizando Chrome, Firefox o Edge, o si está utilizando su versión portable, debe añadir el directorio de datos de los marcadores y seleccionar el motor del navegador correcto para que este complemento funcione.Por ejemplo: El motor de Brave es Chromium; y la ubicación por defecto de los datos de los marcadores es: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para el motor de Firefox, el directorio de los marcadores es la carpeta de datos del usuario que contiene el archivo places.sqlite.
+ Cargar favicons (puede llevar mucho tiempo durante el arranque)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml
index ea0092601..39546c102 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml
@@ -25,4 +25,6 @@
NavigateurSi vous n'utilisez pas Chrome, Firefox ou Edge, ou que vous utilisez leur version portable, vous devez ajouter un dossier de favoris et sélectionner le bon navigateur pour que ce plugin fonctionne.Par exemple : le moteur de Brave est Chromium ; et son emplacement par défaut des favoris est : "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Pour le moteur Firefox, le dossier des favoris est le dossier userdata contenant le fichier places.sqlite.
+ Charger les favicons (peut prendre du temps au démarrage)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml
index e524f1172..79490928d 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml
@@ -25,4 +25,6 @@
מנוע דפדפןאם אינך משתמש ב-Chrome, Firefox או Edge, או שאתה משתמש בגרסה הניידת שלהם, עליך להוסיף את ספריית נתוני הסימניות ולבחור את מנוע הדפדפן המתאים כדי שהתוסף יעבוד.לדוגמה: המנוע של Brave הוא Chromium, ומיקום ברירת המחדל של נתוני הסימניות שלו הוא: %LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData. עבור מנוע Firefox, ספריית הסימניות היא תיקיית המשתמש שמכילה את הקובץ places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
index 0491ba973..eb13bf852 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
@@ -25,4 +25,6 @@
Motore di NavigazioneSe non si utilizza Chrome, Firefox o Edge, o si utilizza la loro versione portatile, è necessario aggiungere la cartella dei segnalibri e selezionare il motore di navigazione corretto per far funzionare questo plugin.Per esempio: il motore di Brave è Chromium, e la sua posizione predefinita dei segnalibri è: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Per il motore di Firefox, la directory dei segnalibri è la cartella dei dati utente che contiene il file places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
index e553a1b7e..d08d67d98 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
@@ -25,4 +25,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
index a374e7fc1..bb7c9fc06 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
@@ -25,4 +25,6 @@
브라우저 엔진크롬, 파이어폭스 또는 엣지를 사용하지 않거나 이들의 포터블 버전을 사용하고 있다면, 이 플러그인을 작동시키기 위해 북마크 데이터 디렉토리를 추가하고 올바른 브라우저 엔진을 선택해야 합니다.예를 들어: Brave의 엔진은 Chromium이며, 기본 북마크 데이터 위치는 "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData"입니다. Firefox 엔진의 경우, 북마크 위치는 places.sqlite 파일이 포함된 userdata 폴더입니다.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml
index 273dad465..1c53a49d2 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml
@@ -25,4 +25,6 @@
NettlesermotorHvis du ikke bruker Chrome, Firefox eller Edge, eller hvis du bruker den bærbare versjonen, må du legge til bokmerkedatakatalog og velge riktig nettlesermotor for å få dette programtillegget til å fungere.For eksempel: Brave's motor er Chromium; og standardplasseringen av bokmerker er: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox-motoren er bokmerkekatalogen brukerdatamappen som inneholder places.sqlite-filen.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml
index 319606d22..407786cdd 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml
@@ -25,4 +25,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml
index f487874ac..2dff7543f 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml
@@ -25,4 +25,6 @@
Silnik przeglądarkiJeśli nie używasz Chrome, Firefox lub Edge, lub używasz ich wersji przenośnej, musisz dodać katalog danych zakładek i wybrać poprawny silnik przeglądarki, aby wtyczka działała.Na przykład: silnikiem przeglądarki Brave jest Chromium, a domyślna lokalizacja danych zakładek to: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". W przypadku silnika Firefoksa, katalog zakładek to folder danych użytkownika zawierający plik places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
index d8bb949fd..ce264bc5f 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
@@ -25,4 +25,6 @@
Motor do NavegadorSe você não estiver usando o Chrome, Firefox ou Edge, ou se estiver usando suas versões portáteis, você precisa adicionar o diretório de dados dos favoritos e selecionar a ferramenta de busca correta para fazer este plugin funcionar.Por exemplo: O motor do Brave é o Chromium; e seu diretório padrão de favoritos é "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para o motor do Firefox, o diretório de favoritos é a pasta do usuário que contém o arquivo "places.sqlite".
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
index 06af5ea5b..2818a0600 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
@@ -25,4 +25,6 @@
Motor do navegadorSe não estiver a usar o Chrome, Firefox ou Edge ou se estiver a usar a versão portátil, tem que adicionar o diretório de dados dos marcadores e selecionar o motor do navegador para que este plugin funcione.Por exemplo: o motor do Brave é Chromium e a localização padrão dos marcadores é "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para o navegador Firefox, o diretório de marcadores é a pasta de utilizador que contém o ficheiro places.sqlite.
+ Carregar "favicons" (pode atrasar o carregamento da aplicação)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml
index 2ebb286a4..bb8639d97 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml
@@ -25,4 +25,6 @@
Движок браузераЕсли вы не используете Chrome, Firefox или Edge, или используете их портативную версию, вам необходимо добавить каталог данных закладок и выбрать правильный движок браузера, чтобы этот плагин работал.Например: Движок Brave - Chromium; и его местоположение данных закладок по умолчанию: «%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData». Для движка Firefox каталог закладок находится в папке userdata и содержит файл places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
index 3c1ce9d22..c7556e877 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
@@ -25,4 +25,6 @@
Jadro prehliadačaAk nepoužívate prehliadač Chrome, Firefox alebo Edge alebo používate ich prenosnú verziu, musíte pridať priečinok s údajmi o záložkách a vybrať správne jadro prehliadača, aby tento plugin fungoval.Napríklad: Prehliadač Brave má jadro Chromium; predvolené umiestnenie údajov o záložkách je: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Pre jadro Firefoxu je priečinkom záložiek priečinok userdata, ktorý obsahuje súbor places.sqlite.
+ Načítať favicony (môže trvať dlhšie počas spúšťania)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml
index be113c8cf..84173e616 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml
@@ -25,4 +25,6 @@
Browser EngineIf you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
index 76ab14111..8c4280f63 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
@@ -25,4 +25,6 @@
Tarayıcı MotoruEğer Chrome, Firefox veya Edge kullanmıyor veya bu tarayıcıların taşınabilir sürümlerini kullanıyorsanız tarayıcı motorunu ve yer imlerinin saklandığı dizini elle girmeniz gerekir.Örneğin: Brave tarayıcısı Chromium tabanlıdır ve yer imleri varsayılan olarak "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData" klasöründe saklanır. Firefox tabanlı tarayıcılar için bu places.sqlite dosyasının bulunduğu kullanıcı verisi klasörüdür.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
index 93b20366e..b8fd4fb83 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
@@ -25,4 +25,6 @@
Браузерний рушійЯкщо ви не використовуєте Chrome, Firefox або Edge, або використовуєте їхні портативні версії, вам потрібно додати каталог даних закладок і вибрати правильний рушій браузера, щоб цей плагін працював.Наприклад: Рушій Brave - Chromium, і за замовчуванням розташування даних закладок: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Для браузера Firefox директорія закладок - це папка userdata, що містить файл places.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml
index ddc10950e..662c87d49 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml
@@ -25,4 +25,6 @@
Công cụ trình duyệtNếu bạn không sử dụng Chrome, Firefox hoặc Edge hoặc bạn đang sử dụng phiên bản di động của chúng, bạn cần thêm thư mục dữ liệu dấu trang và chọn đúng công cụ trình duyệt để plugin này hoạt động.Ví dụ: Engine của Brave là Chrome; và vị trí dữ liệu dấu trang mặc định của nó là: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Đối với công cụ Firefox, thư mục dấu trang là thư mục dữ liệu người dùng chứa tệp địa điểm.sqlite.
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
index 7b628702d..934544367 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
@@ -25,4 +25,6 @@
浏览器引擎如果你没有使用 Chrome、 Firefox 或 Edge,或者正在使用它们的绿色版, 那么你需要添加书签数据目录并选择正确的浏览器引擎才能使此插件正常工作。例如:Brave 浏览器的引擎是 Chromium;其默认书签数据位置是 "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData"。 对于 Firefox 引擎的浏览器,书签目录是 places.sqlite 文件所在的用户数据文件夹。
+ 载入收藏夹图标 (启动时可能十分耗时)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml
index 8b21bd58d..7fa50a089 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml
@@ -25,4 +25,6 @@
瀏覽器引擎如果你沒有使用 Chrome、Firefox 或 Edge,或者使用它們的便攜版,你需要新增書籤資料位置並選擇正確的瀏覽器引擎,才能讓這個擴充功能正常運作。例如:Brave 瀏覽器的引擎是 Chromium;而它的預設書籤資料位置是「%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData」。對於 Firefox 瀏覽器引擎,書籤資料位置是包含 places.sqlite 檔案的 userdata 資料夾。
+ Load favicons (can be time consuming during startup)
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
index 155069495..91ade206b 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
@@ -1,14 +1,14 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
+using System.Threading.Channels;
+using System.Threading.Tasks;
+using System.Threading;
using System.Windows.Controls;
using Flow.Launcher.Plugin.BrowserBookmark.Commands;
using Flow.Launcher.Plugin.BrowserBookmark.Models;
using Flow.Launcher.Plugin.BrowserBookmark.Views;
-using System.IO;
-using System.Threading.Channels;
-using System.Threading.Tasks;
-using System.Threading;
using Flow.Launcher.Plugin.SharedCommands;
namespace Flow.Launcher.Plugin.BrowserBookmark;
@@ -21,9 +21,9 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
internal static PluginInitContext _context;
- private static List _cachedBookmarks = new();
+ internal static Settings _settings;
- private static Settings _settings;
+ private static List _cachedBookmarks = new();
private static bool _initialized = false;
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
index 86532d275..a0041e0d6 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/Settings.cs
@@ -8,6 +8,8 @@ public class Settings : BaseModel
public string BrowserPath { get; set; }
+ public bool EnableFavicons { get; set; } = false;
+
public bool LoadChromeBookmark { get; set; } = true;
public bool LoadFirefoxBookmark { get; set; } = true;
public bool LoadEdgeBookmark { get; set; } = true;
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
index 30424f4e8..0767ee980 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml
@@ -12,6 +12,7 @@
+
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index 98164f489..93691814a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -46,6 +46,7 @@
+
@@ -53,8 +54,6 @@
-
-
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
index 28f8557c2..d327dcebb 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
@@ -3,6 +3,8 @@
يرجى إجراء تحديد أولاً
+ Please select a folder path.
+ Please choose a different name or folder path.يرجى تحديد رابط المجلدهل أنت متأكد أنك تريد حذف {0}؟هل أنت متأكد أنك تريد حذف هذا الملف نهائيًا؟
@@ -25,6 +27,7 @@
إضافةإعدادات عامةتخصيص الكلمات المفتاحية للإجراءات
+ Customise Quick Accessروابط الوصول السريعإعدادات Everythingلوحة المعاينة
@@ -41,6 +44,7 @@
مسار الشلمسارات مستبعدة من البحث المفهرساستخدام موقع نتيجة البحث كدليل العمل للتنفيذ
+ Display more information like size and age in tooltipsاضغط Enter لفتح المجلد في مدير الملفات الافتراضياستخدام البحث المفهرس للبحث في المسارخيارات الفهرسة
@@ -77,6 +81,9 @@
Ctrl + Enter لفتح الدليلCtrl + Enter لفتح المجلد الحاوي
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}نسخ المسار
@@ -90,6 +97,7 @@
حذف الملف الحالي نهائيًاحذف المجلد الحالي نهائيًاالمسار:
+ Name:حذف المحددتشغيل كمستخدم مختلفتشغيل العنصر المحدد باستخدام حساب مستخدم مختلف
@@ -160,6 +168,9 @@
هل ترغب في تمكين البحث في المحتوى لـ Everything؟قد يكون بطيئًا جدًا بدون فهرسة (المدعومة فقط في Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
قائمة السياق الأصليةعرض قائمة السياق الأصلية (تجريبي)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
index 86f0d1170..80e181a8f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
@@ -3,6 +3,8 @@
Nejprve vyberte položku
+ Please select a folder path.
+ Please choose a different name or folder path.Vyberte odkaz na složkuOpravdu chcete odstranit {0}?Opravdu chcete trvale odstranit tento soubor?
@@ -25,6 +27,7 @@
PřidatVšeobecné nastaveníUpravit aktivační příkaz
+ Customise Quick AccessOdkazy rychlého přístupuNastavení EverythingPreview Panel
@@ -41,6 +44,7 @@
Cesta k příkazovému řádkuVyloučená místa indexováníPoužít umístění výsledků vyhledávání jako pracovní adresář spustitelného souboru
+ Display more information like size and age in tooltipsKlepnutím na Enter otevřete složku ve výchozím správci souborůK vyhledání cesty použijte indexové vyhledáváníMožnosti indexování
@@ -77,6 +81,9 @@
Ctrl + Enter pro otevření adresářeCtrl + Enter pro otevření umístění složky
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Neznámý
+ {0}{3}Space free: {1}{3}Total size: {2}Kopírovat cestu
@@ -90,6 +97,7 @@
Trvale odstranit aktuální souborTrvale smazat aktuální složkuCesta:
+ Name:Odstranit vybranýSpustit jako jiný uživatelSpustí vybranou položku jako uživatel s jiným účtem
@@ -160,6 +168,9 @@
Chcete povolit vyhledávání obsahu prostřednictvím služby Everything?Bez indexu (který je podporován pouze ve verzi Everything v1.5+) může být velmi pomalý
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
index 003db91d1..7cbe281d8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
TilføjGeneral SettingCustomise Action Keywords
+ Customise Quick AccessQuick Access LinksEverything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUse search result's location as the working directory of the executable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy path
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderPath:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
index d183d44dd..10700a0ee 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
@@ -3,6 +3,8 @@
Bitte treffen Sie zuerst eine Auswahl
+ Please select a folder path.
+ Please choose a different name or folder path.Bitte wählen Sie einen Ordner-Link ausSind Sie sicher, dass Sie {0} löschen wollen?Sind Sie sicher, dass Sie diese Datei dauerhaft löschen möchten?
@@ -25,6 +27,7 @@
HinzufügenAllgemeine EinstellungAktions-Schlüsselwörter individuell anpassen
+ Customise Quick AccessSchnellzugriff-LinksEveryhting-EinstellungVorschau-Panel
@@ -41,6 +44,7 @@
Shell-PfadIndexsuche ausgeschlossene PfadeOrt des Suchergebnisses als Arbeitsverzeichnis der ausführbaren Datei verwenden
+ Display more information like size and age in tooltipsDrücken Sie Enter, um Ordner im Default-Dateimanager zu öffnenIndexsuche für Pfadsuche verwendenIndexierungsoptionen
@@ -77,6 +81,9 @@
Strg+Enter, um das Verzeichnis zu öffnenStrg+Enter, um den enthaltenden Ordner zu öffnen
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unbekannt
+ {0}{3}Space free: {1}{3}Total size: {2}Pfad kopieren
@@ -90,6 +97,7 @@
Aktuelle Datei dauerhaft löschenAktuellen Ordner dauerhaft löschenPfad:
+ Name:Ausgewähltes löschenAls anderer Benutzer ausführenAusgewähltes unter Verwendung eines anderen Benutzerkontos ausführen
@@ -160,6 +168,9 @@
Möchten Sie die Inhaltssuche für Everything aktivieren?Es kann sehr langsam sein ohne Index (was nur in Everything v1.5+ unterstützt wird)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Natives KontextmenüNatives Kontextmenü anzeigen (experimentell)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index eefd6f4eb..9f60aaa43 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -162,6 +162,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
index 7f5fb043b..4e372adbe 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
@@ -3,6 +3,8 @@
Por favor, seleccione primero
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
AñadirGeneral SettingCustomise Action Keywords
+ Customise Quick AccessQuick Access LinksEverything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUsar la ubicación de los resultados de búsqueda como directorio de trabajo ejecutable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy path
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderPath:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
index 33fe8eba8..4f5977fa1 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
@@ -3,6 +3,8 @@
Por favor haga una selección primero
+ Por favor, seleccione una ruta de carpeta.
+ Por favor, elija un nombre o ruta de carpeta diferente.Por favor, seleccione un enlace de carpeta¿Está seguro de que desea eliminar {0}?¿Está seguro de que desea eliminar permanentemente este archivo?
@@ -25,6 +27,7 @@
AñadirConfiguración generalPersonalizar palabras clave de acción
+ Personalizar Acceso RápidoEnlaces de acceso rápidoConfiguración EverythingPanel de vista previa
@@ -41,6 +44,7 @@
Ruta del ShellRutas excluídas del índice de búsquedaUsar la ubicación de los resultados de búsqueda como directorio de trabajo del ejecutable
+ Mostrar más información, como tamaño y antigüedad, en los consejos (tooltips)Pulsar Entrar para abrir la carpeta en el administrador de archivos predeterminadoUsar búsqueda indexada para buscar rutasOpciones de indexación
@@ -77,6 +81,9 @@
Ctrl + Entrar para abrir el directorioCtrl + Entrar para abrir la carpeta contenedora
+ {0}{4}Tamaño: {1}{4}Fecha de creación: {2}{4}Fecha de modificación: {3}
+ Desconocido
+ {0}{3}Espacio libre: {1}{3}Tamaño total: {2}Copiar ruta
@@ -90,6 +97,7 @@
Elimina permanentemente el archivo actualElimina permanentemente la carpeta actualRuta:
+ Nombre:Elimina el seleccionadoEjecutar como usuario diferenteEjecuta la selección usando una cuenta de usuario diferente
@@ -160,6 +168,9 @@
¿Desea activar la búsqueda de contenidos de Everything?Puede ser muy lento sin índice (solo se admite en Everything v1.5+)
+ No se puede encontrar Everything.exe
+ No se ha podido instalar Everything, por favor, instálelo manualmente
+
Menú contextual nativoMostrar menú contextual nativo (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
index ab5e0d381..726fbe7d7 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
@@ -3,6 +3,8 @@
Veuillez d'abord effectuer une sélection
+ Veuillez sélectionner un chemin d'accès au dossier.
+ Veuillez choisir un nom ou un chemin d'accès différent.Veuillez sélectionner un lien vers un dossierÊtes-vous sûr de vouloir supprimer {0} ?Êtes-vous sûr de vouloir supprimer définitivement ce fichier ?
@@ -25,6 +27,7 @@
AjouterParamètres générauxPersonnaliser les mots-clés d'action
+ Personnaliser l'accès rapideLiens d'accès rapideParamètres EverythingPanneau d'aperçu
@@ -41,6 +44,7 @@
Chemin d'accès au ShellChemins exclus de la recherche d'indexUtiliser l'emplacement du résultat de la recherche comme répertoire de travail de l'exécutable
+ Afficher plus d'informations comme la taille et l'âge dans les infobullesAppuyez sur Entrée pour ouvrir le dossier dans le gestionnaire de fichiers par défautUtiliser la recherche d'index pour la recherche de chemin d'accèsOptions d'indexation
@@ -77,6 +81,9 @@
Ctrl + Entrée pour ouvrir le répertoireCtrl + Entrée pour ouvrir le dossier contenant
+ {0}{4} Taille : {1}{4}Date de création : {2}{4}Date de modification : {3}
+ Inconnu
+ {0}{3}Espace libre : {1}{3}Taille totale : {2}Copier le chemin
@@ -90,6 +97,7 @@
Supprimer définitivement le fichier actuelSupprimer définitivement le dossier actuelChemin :
+ Nom :Supprimer la sélectionExécuter en tant qu'utilisateur différentExécuter le programme sélectionné en utilisant un autre compte d'utilisateur
@@ -160,6 +168,9 @@
Voulez-vous activer la recherche de contenu pour Everything ?Il peut être très lent sans index (qui n'est supporté que dans Everything v1.5+).
+ Impossible de trouver Everything.exe
+ Impossible d'installer Everything, veuillez l'installer manuellement
+
Menu contextuel natifAfficher le menu contextuel natif (expérimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml
index 7c1003c2b..6e955848d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml
@@ -3,6 +3,8 @@
אנא בצע בחירה תחילה
+ אנא בחר נתיב לתיקייה.
+ אנא בחר שם או נתיב תיקייה אחר.אנא בחר קישור לתיקייההאם אתה בטוח שברצונך למחוק את {0}?האם אתה בטוח שברצונך למחוק קובץ זה לצמיתות?
@@ -25,6 +27,7 @@
הוסףהגדרות כלליותהתאמת מילות פעולה
+ התאמה אישית של גישה מהירהקישורי גישה מהירההגדרות Everythingחלונית תצוגה מקדימה
@@ -41,6 +44,7 @@
נתיב Shellנתיבים שלא נכללים בחיפוש אינדקסהשתמש במיקום תוצאת החיפוש כספריית העבודה של הקובץ להפעלה
+ Display more information like size and age in tooltipsלחץ Enter כדי לפתוח את התיקייה במנהל הקבצים המוגדר כברירת מחדלהשתמש בחיפוש אינדקס עבור חיפוש נתיביםאפשרויות אינדקס
@@ -77,6 +81,9 @@
Ctrl + Enter לפתיחת התיקייהCtrl + Enter לפתיחת התיקייה המכילה
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ לא ידוע
+ {0}{3}Space free: {1}{3}Total size: {2}העתק נתיב
@@ -90,6 +97,7 @@
מחק לצמיתות את הקובץ הנוכחימחק לצמיתות את התיקייה הנוכחיתנתיב:
+ שם:מחק את הפריט שנבחרהפעל כמשתמש אחרהפעל את הפריט שנבחר באמצעות חשבון משתמש אחר
@@ -160,6 +168,9 @@
האם ברצונך לאפשר חיפוש תוכן עבור Everything?החיפוש עשוי להיות איטי מאוד ללא אינדקס (שנתמך רק ב-Everything v1.5+)
+ לא ניתן למצוא את Everything.exe
+ נכשל בהתקנת Everything, אנא התקן אותו ידנית
+
תפריט הקשר מקוריהצג תפריט הקשר מקורי (ניסיוני)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
index d05ab66db..df756e886 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
@@ -3,6 +3,8 @@
Effettua prima una selezione
+ Please select a folder path.
+ Please choose a different name or folder path.Si prega di selezionare un collegamento alla cartellaSei sicuro di voler eliminare {0}?Sei sicuro di voler eliminare definitivamente questo file?
@@ -25,6 +27,7 @@
AggiungiImpostazione GeneralePersonalizza Parola Chiave
+ Customise Quick AccessCollegamenti ad Accesso RapidoImpostazioni di EverythingPannello Anteprima
@@ -41,6 +44,7 @@
Percorso ShellPercorsi Esclusi dall'Indice di RicercaUtilizza il percorso ottenuto dalla ricerca come cartella di lavoro
+ Display more information like size and age in tooltipsPremi Invio per aprire la cartella nel gestore file predefinitoUsa Indice di Ricerca per la Ricerca PercorsoOpzioni di Indicizzazione
@@ -77,6 +81,9 @@
Ctrl + Invio per aprire la cartellaCtrl + Invio per aprire la cartella che lo contiene
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copia percorso
@@ -90,6 +97,7 @@
Elimina permanentemente il file correnteElimina definitivamente la cartella correntePercorso:
+ Name:Elimina il selezionatoEsegui come utente differenteEsegui la selezione utilizzando un altro account utente
@@ -160,6 +168,9 @@
Vuoi abilitare la ricerca di contenuti per Everything?Può essere molto lento senza indice (che è supportato solo in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Menu Contestuale NativoVisualizza il menu contestuale nativo (sperimentale)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
index a0d45be00..3d944a2b8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
追加一般設定アクションキーワードのカスタマイズ
+ Customise Quick AccessQuick Access LinksEverything Settingプレビューパネル
@@ -41,6 +44,7 @@
Shell Pathインデックス検索の除外パス検索結果の場所を実行ファイルの作業ディレクトリとして使用
+ Display more information like size and age in tooltipsEnterキーで既定のファイルマネージャーでフォルダーを開くUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}パスをコピー
@@ -90,6 +97,7 @@
現在のファイルを完全に削除現在のフォルダーを完全に削除Path:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
index 82c3ef4e8..27e4aa76a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
@@ -3,6 +3,8 @@
항목을 먼저 선택하세요
+ Please select a folder path.
+ Please choose a different name or folder path.폴더 링크를 선택하세요{0} - 삭제하시겠습니까?이 파일을 영구적으로 삭제하시겠습니까?
@@ -25,6 +27,7 @@
추가일반 설정사용자 지정 액션 키워드
+ Customise Quick Access빠른 접근 항목Everything 설정미리보기 패널
@@ -41,6 +44,7 @@
쉘 경로색인 제외 경로검색 결과위치를 실행 가능한 작업 디렉토리(Working Directory)로 사용
+ Display more information like size and age in tooltipsEnter 키를 눌렀을 때 기본 파일 관리자에서 폴더 열기Use Index Search For Path Search색인 옵션
@@ -77,6 +81,9 @@
Ctrl + Enter으로 폴더 열기Ctrl + Enter으로 포함된 폴더 열기
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}경로 복사
@@ -90,6 +97,7 @@
이 파일을 영구적으로 삭제이 폴더를 영구적으로 삭제경로:
+ Name:선택 항목을 삭제다른 유저 권한으로 실행선택한 사용자 계정으로 실행
@@ -160,6 +168,9 @@
Eveyrhing으로 내용 검색을 활성화하시겠습니까?인덱스가 없으면 매우 느릴 수 있습니다.(Everything v1.5+에서만 지원)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
index f8c0374f3..e5ef88959 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
@@ -3,6 +3,8 @@
Vennligst gjør et valg først
+ Please select a folder path.
+ Please choose a different name or folder path.Velg en mappekoblingEr du sikker på at du ønsker å slette {0}?Er du sikker på at du vil slette denne filen permanent?
@@ -25,6 +27,7 @@
Legg tilGenerell innstillingTilpass handlingsnøkkelord
+ Customise Quick AccessKoblinger for hurtigtilgangEverything-innstillingForhåndsvisningspanel
@@ -41,6 +44,7 @@
Skall-stiSøk i indekser ekskluderte banerBruk søkeresultatets plassering som arbeidskatalogen til den kjørbare filen
+ Display more information like size and age in tooltipsTrykk Enter for å åpne mappen i standard filbehandlerBruk indekssøk for banesøkAlternativer for indeksering
@@ -77,6 +81,9 @@
Ctrl + Enter for å åpne katalogenCtrl + Enter for å åpne mappen som inneholder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Ukjent
+ {0}{3}Space free: {1}{3}Total size: {2}Kopier sti
@@ -90,6 +97,7 @@
Slett gjeldende fil permanentSlett gjeldende mappe permanentSti:
+ Name:Slett valgteKjør som annen brukerKjør valgte med en annen brukerkonto
@@ -160,6 +168,9 @@
Vil du aktivere innholdssøk for Everything?Det kan være veldig tregt uten indeks (som bare støttes i Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Opprinnelig hurtigmenyVis opprinnelig hurtigmeny (eksperimentell)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
index 23fdcc214..d8178a1f3 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
ToevoegenGeneral SettingCustomise Action Keywords
+ Customise Quick AccessQuick Access LinksEverything SettingVoorbeeld Paneel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUse search result's location as the working directory of the executable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy path
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderPath:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
index 5b7afac8e..5a29fd9ab 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
@@ -3,6 +3,8 @@
Pierw dokonaj wyboru
+ Please select a folder path.
+ Please choose a different name or folder path.Musisz wybrać któryś folder z listyCzy jesteś pewien że chcesz usunąć {0}?Jesteś pewny, że chcesz usunąć ten plik trwale?
@@ -25,6 +27,7 @@
DodajUstawienia ogólneZmień słowa kluczowe akcji
+ Customise Quick AccessLinki szybkiego dostępuUstawienia EverythingPanel podglądu
@@ -41,6 +44,7 @@
Ścieżka powłokiWykluczone ścieżki indeksuUżyj lokalizacji wyników wyszukiwania jako katalogu roboczego pliku wykonywalnego
+ Display more information like size and age in tooltipsNaciśnij Enter, aby otworzyć folder w domyślnym menedżerze plikówUżyj wyszukiwania indeksowego do przeszukiwania ścieżekOpcje indeksowania
@@ -77,6 +81,9 @@
Ctrl + Enter, aby otworzyć folderCtrl + Enter, aby otworzyć folder zawierający
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Nieznane
+ {0}{3}Space free: {1}{3}Total size: {2}Skopiuj Ścieżkę
@@ -90,6 +97,7 @@
Trwale usuń bieżący plikTrwale usuń bieżący folderŚcieżka:
+ Name:Usuń zaznaczoneUruchom jako inny użytkownikUruchom wybrane używając innego konta użytkownika
@@ -160,6 +168,9 @@
Czy chcesz włączyć wyszukiwanie zawartości dla programu Everything?Może działać bardzo wolno bez indeksu (który jest obsługiwany tylko w Everything w wersji 1.5 i nowszych)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Natywne menu kontekstoweWyświetl natywne menu kontekstowe (eksperymentalne)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
index 50aba68b8..5785a5616 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
AdicionarGeneral SettingCustomise Action Keywords
+ Customise Quick AccessLinks de Acesso RápidoEverything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUse search result's location as the working directory of the executable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy path
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderCaminho:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
index 7112f118d..5db8251e2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
@@ -3,6 +3,8 @@
Tem que efetuar uma seleção
+ Selecione o caminho da pasta.
+ Por favor, escolha um nome ou caminho diferente.Selecione a ligação para a pastaTem a certeza de que deseja eliminar {0}?Tem a certeza de que pretende eliminar permanentemente este ficheiro?
@@ -25,6 +27,7 @@
AdicionarDefinições geraisPersonalizar palavras-chave
+ Personalizar acesso rápidoLigações de acesso rápidoDefinições EverythingPainel de pré-visualização
@@ -41,6 +44,7 @@
Caminho da consolaCaminhos excluídos do índice de pesquisaUtilizar localização do resultado da pesquisa como pasta de trabalho do executável
+ Mostrar mais informações nas dicas (ex.: tamanho e antiguidade)Toque Enter para abrir a pasta no gestor de ficheirosUtilizar índice de pesquisa para o caminhoOpções de indexação
@@ -50,7 +54,7 @@
Pesquisa no índice:Acesso rápido:Palavra-chave atual
- Feito
+ OKAtivoSe desativar a opção, Flow Launcher não irá executar esta opção de pesquisa e utilizará '*' para libertar a palavra-chaveEverything
@@ -77,6 +81,9 @@
Ctrl+Enter para abrir a pastaCtrl+Enter para abrir a pasta de destino
+ {0}{4}Tamanho: {1}{4}Data de criação: {2}{4}Data de modificação: {3}
+ Desconhecido
+ {0}{3}Espaço livre: {1}{3}Tamanho total: {2}Copiar caminho
@@ -90,6 +97,7 @@
Eliminar permanentemente o ficheiro atualEliminar permanentemente a pasta atualCaminho:
+ Nome:Eliminar seleçãoExecutar com outro utilizadorExecutar ações com uma conta de utilizador diferente
@@ -160,6 +168,9 @@
Deseja ativar a pesquisa de conteúdo através de Everything?Pode ser muito lento sem índice (que apenas existe em Everything v1.5+)
+ Não foi possível encontrar Everything.exe
+ Não foi possível instalar Everything. Experimente instalar manualmente.
+
Menu de contexto nativoMostrar menu de contexto nativo (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
index ae5211b73..35bd1d87d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
@@ -3,6 +3,8 @@
Сначала отметьте что-нибудь
+ Please select a folder path.
+ Please choose a different name or folder path.Пожалуйста, выберите ссылку на папкуВы уверены, что хотите удалить {0}?Вы действительно хотите безвозвратно удалить этот файл?
@@ -25,6 +27,7 @@
ДобавитьGeneral SettingCustomise Action Keywords
+ Customise Quick AccessQuick Access LinksEverything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUse search result's location as the working directory of the executable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Скопировать путь
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderПуть:
+ Name:Delete the selectedЗапустить от имени другого пользователяRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
index 0bfb3d024..1323d6ae0 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
@@ -3,6 +3,8 @@
Najprv vyberte položku
+ Vyberte cestu k priečinku.
+ Vyberte iný názov alebo cestu k priečinku.Vyberte odkaz na priečinokNaozaj chcete odstrániť {0}?Naozaj chcete natrvalo odstrániť tento súbor?
@@ -25,6 +27,7 @@
PridaťVšeobecné nastaveniaUpraviť aktivačný príkaz
+ Prispôsobenie Rýchleho prístupuOdkazy Rýchleho prístupuNastavenia EverythingPanel náhľadu
@@ -41,6 +44,7 @@
Cesta k príkazovému riadkuVylúčené umiestnenia indexovaniaPoužiť umiestnenie výsledku vyhľadávania ako pracovný priečinok spustiteľného súboru
+ Zobraziť viac informácií v popise ako veľkosť a dátumyStlačením klávesu Enter otvoriť priečinok v predvolenom správcovi súborovNa vyhľadanie cesty použiť vyhľadávanie v indexeMožnosti indexovania
@@ -77,6 +81,9 @@
Ctrl + Enter na otvorenie priečinkaCtrl + Enter na otvorenie umiestnenia priečinka
+ {0}{4}Veľkosť: {1}{4}Dátum vytvorenia: {2}{4}Dátum úpravy: {3}
+ Neznáma
+ {0}{3}Voľné miesto: {1}{3}Celková veľkosť: {2}Kopírovať cestu
@@ -90,6 +97,7 @@
Natrvalo odstrániť aktuálny súborNatrvalo odstrániť aktuálny priečinokCesta:
+ Názov:Odstrániť vybranýSpustiť ako iný používateľSpustí vybranú položku ako používateľ s iným kontom
@@ -160,6 +168,9 @@
Chcete povoliť vyhľadávanie obsahu cez Everything?Bez indexu (ktorý je podporovaný len v Everything v1.5+) to môže byť veľmi pomalé
+ Nedá sa nájsť Everything.exe
+ Nepodarilo sa nainštalovať Everything, nainštalujte ho manuálne
+
Natívna kontextová ponukaZobraziť natívnu kontextovú ponuku (experimentálne)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
index 9e1a91d0c..6af550884 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
DodajGeneral SettingCustomise Action Keywords
+ Customise Quick AccessQuick Access LinksEverything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded PathsUse search result's location as the working directory of the executable
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Ctrl + Enter to open the directoryCtrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy path
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderPath:
+ Name:Delete the selectedRun as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
index a61ff488a..44674952b 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.Lütfen bir klasör bağlantısı seçin{0} bağlantısını silmek istediğinize emin misiniz?Bu dosyayı kalıcı olarak silmek istediğinizden emin misiniz?
@@ -25,6 +27,7 @@
EkleGenel AyarlarAnahtar Kelimeler
+ Customise Quick AccessQuick Access LinksEverything AyarlarıÖnizleme Paneli
@@ -41,6 +44,7 @@
Komut İstemiHariç Tutulan DizinlerProgramın çalışma klasörü olarak sonuç klasörünü kullan
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path SearchIndexing Options
@@ -77,6 +81,9 @@
Dizini açmak içi Ctrl + EnterDosya konumunu açmak için Ctrl + Enter
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Yolu kopyala
@@ -90,6 +97,7 @@
Mevcut dosyayı kalıcı olarak silMevcut klasörü kalıcı olarak silYol:
+ Name:Seçileni silBaşka bir kullanıcı olarak çalıştırRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
@@ -167,10 +178,10 @@
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
+ Bugün
+ {0} gün önce
+ 1 ay önce
+ {0} ay önce
+ 1 yıl önce
+ {0} yıl önce
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
index 885d5dd9f..b203687e9 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
@@ -3,6 +3,8 @@
Будь ласка, спочатку зробіть вибір
+ Please select a folder path.
+ Please choose a different name or folder path.Будь ласка, оберіть посилання на текуВи впевнені, що хочете видалити {0}?Ви впевнені, що хочете назавжди видалити цей файл?
@@ -25,6 +27,7 @@
ДодатиЗагальні налаштуванняНалаштувати ключові слова дії
+ Customise Quick AccessПосилання швидкого доступуНалаштування EverythingПанель поперегляду
@@ -41,6 +44,7 @@
Шлях до оболонки ShellВиключені шляхи індексного пошукуВикористовувати розташування результату пошуку як робочу директорію виконуваного файлу
+ Display more information like size and age in tooltipsНатисніть Enter, щоб відкрити папку у файловому менеджері за замовчуваннямВикористовуйте індексний пошук для пошуку шляхуПараметри індексації
@@ -77,6 +81,9 @@
Ctrl + Enter, щоб відкрити каталогCtrl + Enter, щоб відкрити відповідну папку
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Невідомо
+ {0}{3}Space free: {1}{3}Total size: {2}Копіювати шлях
@@ -90,6 +97,7 @@
Безповоротно видалити поточний файлНазавжди видалити поточну папкуШлях:
+ Name:Видалити вибранеЗапустити від імені іншого користувачаЗапустити вибране під обліковим записом іншого користувача
@@ -160,6 +168,9 @@
Бажаєте увімкнути пошук контенту для Everything?Без індексу (який підтримується лише у версії Everything v1.5+) воно може працювати дуже повільно
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Рідне контекстне менюВідображати рідне контекстне меню (експериментально)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml
index bcc094007..f41276a67 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml
@@ -3,6 +3,8 @@
Vui lòng lựa chọn trước
+ Please select a folder path.
+ Please choose a different name or folder path.Hãy chọn một thư mục.Bạn có chắc chắn muốn xóa {0} không?Bạn có chắc là muốn xóa vĩnh viễn các ảnh này?
@@ -25,6 +27,7 @@
ThêmCài đặt chungTùy chỉnh từ khóa hành động
+ Customise Quick AccessLiên kết truy cập nhanhCài đặt mọi thứBảng xem trước
@@ -41,6 +44,7 @@
Đường dẫn ShellĐường dẫn bị loại trừ tìm kiếm chỉ mụcSử dụng vị trí của kết quả tìm kiếm làm thư mục làm việc của tệp thực thi
+ Display more information like size and age in tooltipsChạy với tư cách quản trị viên / mở thư mục trong trình quản lý tệp tiêu chuẩnSử dụng Tìm kiếm Chỉ mục để Tìm kiếm Đường dẫnTùy chọn lập chỉ mục
@@ -77,6 +81,9 @@
Ctrl + Enter để mở thư mụcCtrl + Enter để mở thư mục chứa
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}Copy đường dẫn
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folderĐường dẫn:
+ Name:Xóa đã chọnXóa lựa chọn đã chọnChạy phần đã chọn bằng tài khoản người dùng khác
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
index fc76857bd..9bce72062 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
@@ -3,6 +3,8 @@
请先进行选择
+ 请选择一个文件夹路径。
+ 请选择不同的名称或文件夹路径。请选择一个文件夹链接您确定要删除 {0} 吗?您确定要永久删除此文件吗?
@@ -25,6 +27,7 @@
添加通用设置自定义动作关键字
+ 自定义快速访问快速访问链接Everything 设置预览面板
@@ -41,6 +44,7 @@
Shell 路径索引搜索排除的路径使用搜索结果的位置作为应用程序的工作目录
+ 在提示框中显示更多信息,例如大小和年龄点击回车在默认文件管理器中打开文件夹使用索引进行路径搜索索引选项
@@ -77,6 +81,9 @@
Ctrl + Enter 以打开目录Ctrl + Enter 以打开所在的文件夹
+ {0}{4}大小:{1}{4}创建日期:{2}{4}修改日期:{3}
+ 未知
+ {0}{3}空闲空间:{1}{3}总空间:{2}复制路径
@@ -90,6 +97,7 @@
永久删除当前文件永久删除当前文件夹路径:
+ 名称:删除所选内容以其他用户身份运行使用其他用户帐户运行所选内容
@@ -160,6 +168,9 @@
您想要启用 Everything 的内容搜索功能吗?如果没有索引,它可能会非常慢(索引仅在 Everything v1.5+ 中支持)
+ 找不到 Everything.exe
+ 安装 Everything 失败,请手动安装
+
本机上下文菜单显示本机上下文菜单(实验性)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
index dc75bc3bd..931c9de29 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
@@ -3,6 +3,8 @@
Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.請選擇一個資料夾你確認要刪除{0}嗎?Are you sure you want to permanently delete this file?
@@ -25,6 +27,7 @@
新增General SettingCustomise Action Keywords
+ Customise Quick Access快速訪問連結Everything SettingPreview Panel
@@ -41,6 +44,7 @@
Shell PathIndex Search Excluded Paths使用程式所在目錄作為工作目錄
+ Display more information like size and age in tooltipsHit Enter to open folder in Default File ManagerUse Index Search For Path Search索引選項
@@ -77,6 +81,9 @@
Ctrl + Enter 以開啟該目錄。Ctrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}複製路徑
@@ -90,6 +97,7 @@
Permanently delete current filePermanently delete current folder路徑:
+ Name:刪除所選內容Run as different userRun the selected using a different user account
@@ -160,6 +168,9 @@
Do you want to enable content search for Everything?It can be very slow without index (which is only supported in Everything v1.5+)
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
Native Context MenuDisplay native context menu (experimental)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchManager.cs
index 6c9155539..ce71c94ba 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchManager.cs
@@ -11,6 +11,8 @@ namespace Flow.Launcher.Plugin.Explorer.Search.Everything
{
public class EverythingSearchManager : IIndexProvider, IContentIndexProvider, IPathIndexProvider
{
+ private static readonly string ClassName = nameof(EverythingSearchManager);
+
private Settings Settings { get; }
public EverythingSearchManager(Settings settings)
@@ -42,19 +44,32 @@ namespace Flow.Launcher.Plugin.Explorer.Search.Everything
private async ValueTask ClickToInstallEverythingAsync(ActionContext _)
{
- var installedPath = await EverythingDownloadHelper.PromptDownloadIfNotInstallAsync(Settings.EverythingInstalledPath, Main.Context.API);
-
- if (installedPath == null)
+ try
{
- Main.Context.API.ShowMsgError("Unable to find Everything.exe");
+ var installedPath = await EverythingDownloadHelper.PromptDownloadIfNotInstallAsync(Settings.EverythingInstalledPath, Main.Context.API);
+
+ if (installedPath == null)
+ {
+ Main.Context.API.ShowMsgError(Main.Context.API.GetTranslation("flowlauncher_plugin_everything_not_found"));
+ Main.Context.API.LogError(ClassName, "Unable to find Everything.exe");
+
+ return false;
+ }
+
+ Settings.EverythingInstalledPath = installedPath;
+ Process.Start(installedPath, "-startup");
+
+ return true;
+ }
+ // Sometimes Everything installation will fail because of permission issues or file not found issues
+ // Just let the user know that Everything is not installed properly and ask them to install it manually
+ catch (Exception e)
+ {
+ Main.Context.API.ShowMsgError(Main.Context.API.GetTranslation("flowlauncher_plugin_everything_install_issue"));
+ Main.Context.API.LogException(ClassName, "Failed to install Everything", e);
return false;
}
-
- Settings.EverythingInstalledPath = installedPath;
- Process.Start(installedPath, "-startup");
-
- return true;
}
public async IAsyncEnumerable SearchAsync(string search, [EnumeratorCancellation] CancellationToken token)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
index 5c4accdc0..eaae3b4a9 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@@ -349,7 +349,11 @@ namespace Flow.Launcher.Plugin.Explorer.Search
_ = Task.Run(() => EverythingApi.IncrementRunCounterAsync(fileOrFolder));
}
- private static readonly string[] MediaExtensions = { ".jpg", ".png", ".avi", ".mkv", ".bmp", ".gif", ".wmv", ".mp3", ".flac", ".mp4" };
+ private static readonly string[] MediaExtensions =
+ {
+ ".jpg", ".png", ".avi", ".mkv", ".bmp", ".gif", ".wmv", ".mp3", ".flac", ".mp4",
+ ".m4a", ".m4v", ".heic", ".mov", ".flv", ".webm"
+ };
}
public enum ResultType
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
index d4cd1348e..745032d2c 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
@@ -24,6 +24,8 @@ namespace Flow.Launcher.Plugin.Explorer.Views
public string Description { get; private init; }
+ public string LocalizedDescription => Main.Context.API.GetTranslation(Description);
+
internal Settings.ActionKeyword KeywordProperty { get; }
private void OnPropertyChanged([CallerMemberName] string propertyName = "")
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 4302e721a..a8097d748 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -3,7 +3,6 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:Flow.Launcher.Plugin.Explorer.Views.Converters"
- xmlns:core="clr-namespace:Flow.Launcher.Core.Resource;assembly=Flow.Launcher.Core"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:qa="clr-namespace:Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks"
@@ -16,91 +15,6 @@
mc:Ignorable="d">
-
-
@@ -109,7 +23,7 @@
+ Text="{Binding LocalizedDescription, Mode=OneTime}">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ VerticalAlignment="Center"
+ Text="{Binding FileEditorPath}"
+ TextWrapping="NoWrap" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ DockPanel.Dock="Right">
+
+
+
+
+
+
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ DockPanel.Dock="Right"
+ IsEnabled="{Binding ShowPreviewPanelDateTimeChoices}"
+ Visibility="{Binding PreviewPanelDateTimeChoicesVisibility}">
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
index 9203ece9a..2c50f1c6f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
@@ -1,4 +1,5 @@
-using System.ComponentModel;
+using System.Collections.Generic;
+using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Windows;
@@ -11,28 +12,32 @@ using DragEventArgs = System.Windows.DragEventArgs;
namespace Flow.Launcher.Plugin.Explorer.Views
{
- ///
- /// Interaction logic for ExplorerSettings.xaml
- ///
public partial class ExplorerSettings
{
- private readonly SettingsViewModel viewModel;
+ private readonly SettingsViewModel _viewModel;
+ private readonly List _expanders;
public ExplorerSettings(SettingsViewModel viewModel)
{
+ _viewModel = viewModel;
DataContext = viewModel;
InitializeComponent();
- this.viewModel = viewModel;
-
DataContext = viewModel;
ActionKeywordModel.Init(viewModel.Settings);
- lbxAccessLinks.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
-
- lbxExcludedPaths.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
+ _expanders = new List
+ {
+ GeneralSettingsExpander,
+ ContextMenuExpander,
+ PreviewPanelExpander,
+ EverythingExpander,
+ ActionKeywordsExpander,
+ QuickAccessExpander,
+ ExcludedPathsExpander
+ };
}
private void AccessLinkDragDrop(string containerName, DragEventArgs e)
@@ -51,7 +56,7 @@ namespace Flow.Launcher.Plugin.Explorer.Views
{
Path = s
};
- viewModel.AppendLink(containerName, newFolderLink);
+ _viewModel.AppendLink(containerName, newFolderLink);
}
}
}
@@ -76,8 +81,8 @@ namespace Flow.Launcher.Plugin.Explorer.Views
{
if (tbFastSortWarning is not null)
{
- tbFastSortWarning.Visibility = viewModel.FastSortWarningVisibility;
- tbFastSortWarning.Text = viewModel.SortOptionWarningMessage;
+ tbFastSortWarning.Visibility = _viewModel.FastSortWarningVisibility;
+ tbFastSortWarning.Text = _viewModel.SortOptionWarningMessage;
}
}
private void LbxAccessLinks_OnDrop(object sender, DragEventArgs e)
@@ -93,5 +98,32 @@ namespace Flow.Launcher.Plugin.Explorer.Views
{
e.Handled = e.Text.ToCharArray().Any(c => !char.IsDigit(c));
}
+
+ private void Expander_Expanded(object sender, RoutedEventArgs e)
+ {
+ if (sender is Expander expandedExpander)
+ {
+ // Ensure _expanders is not null and contains items
+ if (_expanders == null || !_expanders.Any()) return;
+
+ foreach (var expander in _expanders)
+ {
+ if (expander != null && expander != expandedExpander && expander.IsExpanded)
+ {
+ expander.IsExpanded = false;
+ }
+ }
+ }
+ }
+
+ private void lbxAccessLinks_Loaded(object sender, RoutedEventArgs e)
+ {
+ lbxAccessLinks.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
+ }
+
+ private void lbxExcludedPaths_Loaded(object sender, RoutedEventArgs e)
+ {
+ lbxExcludedPaths.Items.SortDescriptions.Add(new SortDescription("Path", ListSortDirection.Ascending));
+ }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
index 616ce779b..14f2e1309 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
@@ -2,9 +2,9 @@
- Downloading plugin
+ Eklenti indiriliyorSuccessfully downloaded
- Error: Unable to download the plugin
+ Hata: Eklenti indirilemiyor{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.{0} by {1} {2}{2}Would you like to uninstall this plugin?{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
@@ -22,14 +22,14 @@
Error occurred while trying to install {0}Error uninstalling pluginNo update available
- All plugins are up to date
+ Tüm eklentiler güncel{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.{0} by {1} {2}{2}Would you like to update this plugin?Plugin UpdateThis plugin is already installedPlugin Manifest Download FailedPlease check if you can connect to github.com. This error means you may not be able to install or update plugins.
- Update all plugins
+ Tüm eklentileri güncelleWould you like to update all plugins?Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.Would you like to update {0} plugins?
@@ -47,7 +47,7 @@
Plugins ManagerManagement of installing, uninstalling or updating Flow Launcher plugins
- Unknown Author
+ Bilinmeyen YazarOpen website
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index a16778ff4..25182f6d3 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -316,61 +316,75 @@ namespace Flow.Launcher.Plugin.PluginsManager
var downloadToFilePath = Path.Combine(Path.GetTempPath(),
$"{x.Name}-{x.NewVersion}.zip");
- _ = Task.Run(async delegate
+ _ = Task.Run(async () =>
{
- using var cts = new CancellationTokenSource();
+ try
+ {
+ using var cts = new CancellationTokenSource();
- if (!x.PluginNewUserPlugin.IsFromLocalInstallPath)
- {
- await DownloadFileAsync(
- $"{Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin")} {x.PluginNewUserPlugin.Name}",
- x.PluginNewUserPlugin.UrlDownload, downloadToFilePath, cts);
- }
- else
- {
- downloadToFilePath = x.PluginNewUserPlugin.LocalInstallPath;
- }
-
- // check if user cancelled download before installing plugin
- if (cts.IsCancellationRequested)
- {
- return;
- }
- else
- {
- await Context.API.UpdatePluginAsync(x.PluginExistingMetadata, x.PluginNewUserPlugin,
- downloadToFilePath);
-
- if (Settings.AutoRestartAfterChanging)
+ if (!x.PluginNewUserPlugin.IsFromLocalInstallPath)
{
- Context.API.ShowMsg(
- Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- string.Format(
- Context.API.GetTranslation(
- "plugin_pluginsmanager_update_success_restart"),
- x.Name));
- Context.API.RestartApp();
+ await DownloadFileAsync(
+ $"{Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin")} {x.PluginNewUserPlugin.Name}",
+ x.PluginNewUserPlugin.UrlDownload, downloadToFilePath, cts);
}
else
{
- Context.API.ShowMsg(
- Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- string.Format(
- Context.API.GetTranslation(
- "plugin_pluginsmanager_update_success_no_restart"),
- x.Name));
+ downloadToFilePath = x.PluginNewUserPlugin.LocalInstallPath;
+ }
+
+ // check if user cancelled download before installing plugin
+ if (cts.IsCancellationRequested)
+ {
+ return;
+ }
+ else
+ {
+ await Context.API.UpdatePluginAsync(x.PluginExistingMetadata, x.PluginNewUserPlugin,
+ downloadToFilePath);
+
+ if (Settings.AutoRestartAfterChanging)
+ {
+ Context.API.ShowMsg(
+ Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ string.Format(
+ Context.API.GetTranslation(
+ "plugin_pluginsmanager_update_success_restart"),
+ x.Name));
+ Context.API.RestartApp();
+ }
+ else
+ {
+ Context.API.ShowMsg(
+ Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ string.Format(
+ Context.API.GetTranslation(
+ "plugin_pluginsmanager_update_success_no_restart"),
+ x.Name));
+ }
}
}
- }).ContinueWith(t =>
- {
- Context.API.LogException(ClassName, $"Update failed for {x.Name}",
- t.Exception.InnerException);
- Context.API.ShowMsg(
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
- string.Format(
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
- x.Name));
- }, token, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
+ catch (HttpRequestException e)
+ {
+ // show error message
+ Context.API.ShowMsgError(
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"), x.Name),
+ Context.API.GetTranslation("plugin_pluginsmanager_download_error"));
+ Context.API.LogException(ClassName, "An error occurred while downloading plugin", e);
+ return;
+ }
+ catch (Exception e)
+ {
+ // show error message
+ Context.API.LogException(ClassName, $"Update failed for {x.Name}", e);
+ Context.API.ShowMsgError(
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
+ string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
+ x.Name));
+ return;
+ }
+ });
return true;
},
@@ -436,7 +450,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
catch (Exception ex)
{
Context.API.LogException(ClassName, $"Update failed for {plugin.Name}", ex.InnerException);
- Context.API.ShowMsg(
+ Context.API.ShowMsgError(
Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
string.Format(
Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
index 126613065..e75dd0fc9 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
@@ -2,33 +2,33 @@
- Reset Default
+ Varsayılana SıfırlaSilDüzenleEkle
- Name
+ AdEtkinEnabledDisable
- Status
+ DurumEnabledDisabledKonum
- All Programs
+ Tüm ProgramlarFile TypeYeniden İndeksleİndeksleniyorIndex Sources
- Options
- UWP Apps
+ Seçenekler
+ UWP UygulamalarıWhen enabled, Flow will load UWP Applications
- Start Menu
+ Başlat MenüsüWhen enabled, Flow will load programs from the start menuRegistryWhen enabled, Flow will load programs from the registry
- PATH
+ YOLWhen enabled, Flow will load programs from the PATH environment variable
- Hide app path
+ Uygulama yolunu gizleFor executable files such as UWP or lnk, hide the file path from being visibleHide uninstallersHides programs with common uninstaller names, such as unins000.exe
@@ -60,7 +60,7 @@
Protocols can't be emptyİndekslenecek Uzantılar
- URL Protocols
+ URL ProtokolleriSteam GamesEpic GamesHttp/Https
@@ -75,8 +75,8 @@
Run As Different UserYönetici Olarak Çalıştır
- Open containing folder
- Hide
+ İçeren klasörü aç
+ GizleOpen target folderProgram
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs
index a77b2ace8..34b3a6df2 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs
@@ -8,9 +8,8 @@ using Windows.Win32.Storage.FileSystem;
namespace Flow.Launcher.Plugin.Program.Programs
{
- class ShellLinkHelper
+ public class ShellLinkHelper
{
-
// Reference : http://www.pinvoke.net/default.aspx/Interfaces.IShellLinkW
[ComImport(), Guid("00021401-0000-0000-C000-000000000046")]
public class ShellLink
@@ -28,7 +27,9 @@ namespace Flow.Launcher.Plugin.Program.Programs
const int STGM_READ = 0;
((IPersistFile)link).Load(path, STGM_READ);
var hwnd = new HWND(IntPtr.Zero);
- ((IShellLinkW)link).Resolve(hwnd, 0);
+ // Use SLR_NO_UI to avoid showing any UI during resolution, like Problem with Shortcut dialogs
+ // https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ishelllinka-resolve
+ ((IShellLinkW)link).Resolve(hwnd, (uint)SLR_FLAGS.SLR_NO_UI);
const int MAX_PATH = 260;
Span buffer = stackalloc char[MAX_PATH];
@@ -79,6 +80,6 @@ namespace Flow.Launcher.Plugin.Program.Programs
Marshal.ReleaseComObject(link);
return target;
- }
+ }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
index 2613c770b..d0add9f31 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -201,94 +201,101 @@ namespace Flow.Launcher.Plugin.Shell
switch (_settings.Shell)
{
case Shell.Cmd:
- {
- if (_settings.UseWindowsTerminal)
{
- info.FileName = "wt.exe";
- info.ArgumentList.Add("cmd");
- }
- else
- {
- info.FileName = "cmd.exe";
- }
+ if (_settings.UseWindowsTerminal)
+ {
+ info.FileName = "wt.exe";
+ info.ArgumentList.Add("cmd");
+ }
+ else
+ {
+ info.FileName = "cmd.exe";
+ }
- info.ArgumentList.Add($"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command} {(_settings.CloseShellAfterPress ? $"&& echo {Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")} && pause > nul /c" : "")}");
- break;
- }
+ info.ArgumentList.Add($"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command} {(_settings.CloseShellAfterPress ? $"&& echo {Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")} && pause > nul /c" : "")}");
+ break;
+ }
case Shell.Powershell:
- {
- if (_settings.UseWindowsTerminal)
{
- info.FileName = "wt.exe";
- info.ArgumentList.Add("powershell");
+ // Using just a ; doesn't work with wt, as it's used to create a new tab for the terminal window
+ // \\ must be escaped for it to work properly, or breaking it into multiple arguments
+ var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
+ if (_settings.UseWindowsTerminal)
+ {
+ info.FileName = "wt.exe";
+ info.ArgumentList.Add("powershell");
+ }
+ else
+ {
+ info.FileName = "powershell.exe";
+ }
+ if (_settings.LeaveShellOpen)
+ {
+ info.ArgumentList.Add("-NoExit");
+ info.ArgumentList.Add(command);
+ }
+ else
+ {
+ info.ArgumentList.Add("-Command");
+ info.ArgumentList.Add($"{command}{addedCharacter}; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" : "")}");
+ }
+ break;
}
- else
- {
- info.FileName = "powershell.exe";
- }
- if (_settings.LeaveShellOpen)
- {
- info.ArgumentList.Add("-NoExit");
- info.ArgumentList.Add(command);
- }
- else
- {
- info.ArgumentList.Add("-Command");
- info.ArgumentList.Add($"{command}\\; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'\\; [System.Console]::ReadKey()\\; exit" : "")}");
- }
- break;
- }
case Shell.Pwsh:
- {
- if (_settings.UseWindowsTerminal)
{
- info.FileName = "wt.exe";
- info.ArgumentList.Add("pwsh");
+ // Using just a ; doesn't work with wt, as it's used to create a new tab for the terminal window
+ // \\ must be escaped for it to work properly, or breaking it into multiple arguments
+ var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
+ if (_settings.UseWindowsTerminal)
+ {
+ info.FileName = "wt.exe";
+ info.ArgumentList.Add("pwsh");
+ }
+ else
+ {
+ info.FileName = "pwsh.exe";
+ }
+ if (_settings.LeaveShellOpen)
+ {
+ info.ArgumentList.Add("-NoExit");
+ }
+ info.ArgumentList.Add("-Command");
+ info.ArgumentList.Add($"{command}{addedCharacter}; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" : "")}");
+ break;
}
- else
- {
- info.FileName = "pwsh.exe";
- }
- if (_settings.LeaveShellOpen)
- {
- info.ArgumentList.Add("-NoExit");
- }
- info.ArgumentList.Add("-Command");
- info.ArgumentList.Add($"{command}\\; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'\\; [System.Console]::ReadKey()\\; exit" : "")}");
- break;
- }
case Shell.RunCommand:
- {
- var parts = command.Split(new[]
{
- ' '
- }, 2);
- if (parts.Length == 2)
- {
- var filename = parts[0];
- if (ExistInPath(filename))
+ var parts = command.Split(new[]
{
- var arguments = parts[1];
- info.FileName = filename;
- info.ArgumentList.Add(arguments);
+ ' '
+ }, 2);
+ if (parts.Length == 2)
+ {
+ var filename = parts[0];
+ if (ExistInPath(filename))
+ {
+ var arguments = parts[1];
+ info.FileName = filename;
+ info.ArgumentList.Add(arguments);
+ }
+ else
+ {
+ info.FileName = command;
+ }
}
else
{
info.FileName = command;
}
- }
- else
- {
- info.FileName = command;
+
+ info.UseShellExecute = true;
+
+ break;
}
- info.UseShellExecute = true;
-
- break;
- }
default:
throw new NotImplementedException();
}
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
index aaad035a0..b37070d93 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
@@ -3,10 +3,10 @@
Search Source SettingOpen search in:
- New Window
- New Tab
+ Yeni Pencere
+ Yeni SekmeSet browser from path:
- Choose
+ SeçSilDüzenleEkle
@@ -34,7 +34,7 @@
Başlık
- Status
+ DurumSimge SeçSimgeİptal
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs
index 76aeb3250..0040cffa7 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs
@@ -71,7 +71,7 @@ namespace Flow.Launcher.Plugin.WebSearch
Score = score,
Action = c =>
{
- _context.API.OpenUrl(searchSource.Url.Replace("{q}", Uri.EscapeDataString(keyword)));
+ _context.API.OpenWebUrl(searchSource.Url.Replace("{q}", Uri.EscapeDataString(keyword)));
return true;
},
@@ -135,7 +135,7 @@ namespace Flow.Launcher.Plugin.WebSearch
ActionKeywordAssigned = searchSource.ActionKeyword == SearchSourceGlobalPluginWildCardSign ? string.Empty : searchSource.ActionKeyword,
Action = c =>
{
- _context.API.OpenUrl(searchSource.Url.Replace("{q}", Uri.EscapeDataString(o)));
+ _context.API.OpenWebUrl(searchSource.Url.Replace("{q}", Uri.EscapeDataString(o)));
return true;
},
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
index 39062bbb8..5b0a57759 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
@@ -2016,7 +2016,7 @@
Agrupar janelas semelhantes na barra de tarefas
- Alterar configurações do Windows SideShow
+ Alterar definições do Windows SideShowUsar descrição de áudio para vídeos
@@ -2176,7 +2176,7 @@
Alterar configurações avançadas de gerenciamento de cores para telas, scanners e impressoras
- Permitir que o Windows sugira Facilidade de Acesso
+ Permitir que o Windows sugira a Facilidade de acessoLimpar espaço em disco excluindo arquivos desnecessários
@@ -2332,7 +2332,7 @@
Move the pointer with the keypad using MouseKeys
- Change Windows SideShow-compatible device settings
+ Alterar definições dos dispositivos compatíveis com SideShowAdjust commonly used mobility settings
diff --git a/README.md b/README.md
index d8ecfa671..4cd8e059e 100644
--- a/README.md
+++ b/README.md
@@ -375,6 +375,10 @@ Yes please, let us know in the [Q&A](https://github.com/Flow-Launcher/Flow.Launc
## Development
+### Localization
+
+Our project localization is based on [Crowdin](https://crowdin.com). If you would like to change them, please go to https://crowdin.com/project/flow-launcher.
+
### New changes
All changes to flow are captured via pull requests. Some new changes will have been merged but still pending release, this means whilst a change may not exist in the current release, it may very well have been accepted and merged into the dev branch and available as a pre-release download. It is therefore a good idea that before you start to make changes, search through the open and closed pull requests to make sure the change you intend to make is not already done.
diff --git a/appveyor.yml b/appveyor.yml
index fa0b5956b..b38e5bb1a 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,4 @@
-version: '1.20.0.{build}'
+version: '1.20.1.{build}'
init:
- ps: |
@@ -60,9 +60,9 @@ deploy:
- provider: NuGet
artifact: Plugin nupkg
api_key:
- secure: sCSd5JWgdzJWDa9kpqECut5ACPKZqcoxKU8ERKC00k7VIjig3/+nFV5zzTcGb0w3
+ secure: en+/GPSgfUVARoX0+lOeAAlbzvcCZAyBeVQaNq1AeXuRjjHgMwhBnt0PHVJXOepS
on:
- APPVEYOR_REPO_TAG: true
+ branch: master
- provider: GitHub
repository: Flow-Launcher/Prereleases
@@ -84,12 +84,3 @@ deploy:
force_update: true
on:
branch: master
-
- - provider: GitHub
- release: v$(flowVersion)
- auth_token:
- secure: ij4UeXUYQBDJxn2YRAAhUOjklOGVKDB87Hn5J8tKIzj13yatoI7sLM666QDQFEgv
- artifact: Squirrel Installer, Portable Version, Squirrel nupkg, Squirrel RELEASES
- force_update: true
- on:
- APPVEYOR_REPO_TAG: true
From 7784fe439c003636ac73e13b63b8024e6461ff03 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sat, 14 Jun 2025 22:25:55 +1000
Subject: [PATCH 1384/1798] Merge release v1.20.1 back into dev
---
Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj | 8 ++++----
appveyor.yml | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index 4a26cec95..4a49e9589 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -14,10 +14,10 @@
- 4.5.0
- 4.5.0
- 4.5.0
- 4.5.0
+ 4.6.0
+ 4.6.0
+ 4.6.0
+ 4.6.0Flow.Launcher.PluginFlow-LauncherMIT
diff --git a/appveyor.yml b/appveyor.yml
index 8fba05252..b38e5bb1a 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,4 @@
-version: '1.20.0.{build}'
+version: '1.20.1.{build}'
init:
- ps: |
@@ -60,7 +60,7 @@ deploy:
- provider: NuGet
artifact: Plugin nupkg
api_key:
- secure: sCSd5JWgdzJWDa9kpqECut5ACPKZqcoxKU8ERKC00k7VIjig3/+nFV5zzTcGb0w3
+ secure: en+/GPSgfUVARoX0+lOeAAlbzvcCZAyBeVQaNq1AeXuRjjHgMwhBnt0PHVJXOepS
on:
branch: master
From c06fdb9134da07c0a6ad989847f3196e5d8f82db Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 14 Jun 2025 20:35:09 +0800
Subject: [PATCH 1385/1798] Set topmost default value to false
---
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 975609e0f..33f7c5fc2 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -383,7 +383,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool LeaveCmdOpen { get; set; }
public bool HideWhenDeactivated { get; set; } = true;
- private bool _showAtTopmost = true;
+ private bool _showAtTopmost = false;
public bool ShowAtTopmost
{
get => _showAtTopmost;
From d9a30f6450705d3aed34d8e6a87adf8e19de7f58 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sat, 14 Jun 2025 22:56:08 +1000
Subject: [PATCH 1386/1798] add skip build on tag
---
appveyor.yml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index b38e5bb1a..a430b28f4 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,5 +1,8 @@
version: '1.20.1.{build}'
+# Do not build on tags because we create a release on merge to master. Otherwise will upload artifacts twice changing the hash, as well as triggering duplicate GitHub release action & NuGet deployments.
+skip_tags: true
+
init:
- ps: |
$version = new-object System.Version $env:APPVEYOR_BUILD_VERSION
@@ -14,7 +17,6 @@ init:
cache:
- '%USERPROFILE%\.nuget\packages -> **.sln, **.csproj' # preserve nuget folder (packages) unless the solution or projects change
-
assembly_info:
patch: true
file: SolutionAssemblyInfo.cs
From f30c6fc577c9fd60ee2de0db6f275847c2ff8f4c Mon Sep 17 00:00:00 2001
From: DB P
Date: Sat, 14 Jun 2025 22:19:31 +0900
Subject: [PATCH 1387/1798] Modified strings and added BoolNegationConverter
---
.../Converters/BoolNegationConverter.cs | 23 +++++++++++++++
Flow.Launcher/Languages/en.xaml | 4 +--
.../Views/SettingsPaneGeneral.xaml | 28 ++++++++++---------
3 files changed, 40 insertions(+), 15 deletions(-)
create mode 100644 Flow.Launcher/Converters/BoolNegationConverter.cs
diff --git a/Flow.Launcher/Converters/BoolNegationConverter.cs b/Flow.Launcher/Converters/BoolNegationConverter.cs
new file mode 100644
index 000000000..50a5c0f34
--- /dev/null
+++ b/Flow.Launcher/Converters/BoolNegationConverter.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Globalization;
+using System.Windows.Data;
+
+namespace Flow.Launcher.Converters
+{
+ public class BoolNegationConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is bool b)
+ return !b;
+ return value;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is bool b)
+ return !b;
+ return value;
+ }
+ }
+}
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index f7f8dfd42..4df6b3155 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -131,8 +131,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
- Show Search Window at Topmost
- Show search window above other windows
+ Keep on top
+ Keeps the search window on top even after it loses focus.Search Plugin
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index e8ae0dc3c..ae1648076 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -17,6 +17,7 @@
mc:Ignorable="d">
+
-
-
+
+
-
+
+
+
+
+
-
-
-
From 4b6231ba8b807a62cd1fef17d370b3bd7b0fb31a Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 14 Jun 2025 22:22:25 +0800
Subject: [PATCH 1388/1798] Extract methods for readability
---
.../PinyinAlphabet.cs | 33 +++++++++++--------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index 36f007f39..37b7bb8c3 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -31,12 +31,27 @@ namespace Flow.Launcher.Infrastructure
if (e.PropertyName == nameof(Settings.UseDoublePinyin) ||
e.PropertyName == nameof(Settings.DoublePinyinSchema))
{
- LoadDoublePinyinTable();
- _pinyinCache.Clear();
+ Reload();
}
};
}
+ public void Reload()
+ {
+ LoadDoublePinyinTable();
+ _pinyinCache.Clear();
+ }
+
+ private void CreateDoublePinyinTableFromStream(Stream jsonStream)
+ {
+ Dictionary> table = JsonSerializer.Deserialize>>(jsonStream);
+ if (!table.TryGetValue(_settings.DoublePinyinSchema, out var value))
+ {
+ throw new InvalidOperationException("DoublePinyinSchema is invalid or double pinyin table is broken.");
+ }
+ currentDoublePinyinTable = new ReadOnlyDictionary(value);
+ }
+
private void LoadDoublePinyinTable()
{
if (_settings.UseDoublePinyin)
@@ -45,12 +60,7 @@ namespace Flow.Launcher.Infrastructure
try
{
using var fs = File.OpenRead(tablePath);
- Dictionary> table = JsonSerializer.Deserialize>>(fs);
- if (!table.TryGetValue(_settings.DoublePinyinSchema, out var value))
- {
- throw new InvalidOperationException("DoublePinyinSchema is invalid.");
- }
- currentDoublePinyinTable = new ReadOnlyDictionary(value);
+ CreateDoublePinyinTableFromStream(fs);
}
catch (System.Exception e)
{
@@ -73,7 +83,7 @@ namespace Flow.Launcher.Infrastructure
public (string translation, TranslationMapping map) Translate(string content)
{
- if (!_settings.ShouldUsePinyin)
+ if (!_settings.ShouldUsePinyin || !WordsHelper.HasChinese(content))
return (content, null);
return _pinyinCache.TryGetValue(content, out var value)
@@ -83,11 +93,6 @@ namespace Flow.Launcher.Infrastructure
private (string translation, TranslationMapping map) BuildCacheFromContent(string content)
{
- if (!WordsHelper.HasChinese(content))
- {
- return (content, null);
- }
-
var resultList = WordsHelper.GetPinyinList(content);
var resultBuilder = new StringBuilder();
From 27daffe515319317682afb263e532fdd11e221b2 Mon Sep 17 00:00:00 2001
From: DB P
Date: Sat, 14 Jun 2025 23:26:08 +0900
Subject: [PATCH 1389/1798] Revert "Modified strings and added
BoolNegationConverter"
This reverts commit f30c6fc577c9fd60ee2de0db6f275847c2ff8f4c.
---
.../Converters/BoolNegationConverter.cs | 23 ---------------
Flow.Launcher/Languages/en.xaml | 4 +--
.../Views/SettingsPaneGeneral.xaml | 28 +++++++++----------
3 files changed, 15 insertions(+), 40 deletions(-)
delete mode 100644 Flow.Launcher/Converters/BoolNegationConverter.cs
diff --git a/Flow.Launcher/Converters/BoolNegationConverter.cs b/Flow.Launcher/Converters/BoolNegationConverter.cs
deleted file mode 100644
index 50a5c0f34..000000000
--- a/Flow.Launcher/Converters/BoolNegationConverter.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System;
-using System.Globalization;
-using System.Windows.Data;
-
-namespace Flow.Launcher.Converters
-{
- public class BoolNegationConverter : IValueConverter
- {
- public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
- {
- if (value is bool b)
- return !b;
- return value;
- }
-
- public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
- {
- if (value is bool b)
- return !b;
- return value;
- }
- }
-}
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 4df6b3155..f7f8dfd42 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -131,8 +131,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
- Keep on top
- Keeps the search window on top even after it loses focus.
+ Show Search Window at Topmost
+ Show search window above other windowsSearch Plugin
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index ae1648076..e8ae0dc3c 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -17,7 +17,6 @@
mc:Ignorable="d">
-
-
-
-
+
-
-
-
-
-
+
+
+
+
From 4c7f966e7c2af0ee7d231a0422dc3b8831fafc7d Mon Sep 17 00:00:00 2001
From: DB P
Date: Sat, 14 Jun 2025 23:55:34 +0900
Subject: [PATCH 1390/1798] UI improvement and text update - en.xaml: Updated
"showAtTopmost" and tooltip text - SettingsPaneGeneral.xaml: Added "Hide
Notify Icon" card and updated icon - Adjusted card group margins
---
Flow.Launcher/Languages/en.xaml | 4 ++--
Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml | 6 ++++--
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index f7f8dfd42..bd4cbd282 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -131,8 +131,8 @@
Show History Results in Home PageMaximum History Results Shown in Home PageThis can only be edited if plugin supports Home feature and Home Page is enabled.
- Show Search Window at Topmost
- Show search window above other windows
+ Show Search Window at Foremost
+ Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.Search Plugin
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index e8ae0dc3c..7f8555d65 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -70,6 +70,7 @@
OnContent="{DynamicResource enable}" />
+
+
-
+
Date: Sun, 15 Jun 2025 21:21:46 +0800
Subject: [PATCH 1391/1798] Fix one more whitespace after commands
---
Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 24 +++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
index d0add9f31..37f382ad1 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -194,10 +194,12 @@ namespace Flow.Launcher.Plugin.Shell
var workingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
var runAsAdministratorArg = !runAsAdministrator && !_settings.RunAsAdministrator ? "" : "runas";
- ProcessStartInfo info = new()
+ var info = new ProcessStartInfo()
{
- Verb = runAsAdministratorArg, WorkingDirectory = workingDirectory,
+ Verb = runAsAdministratorArg,
+ WorkingDirectory = workingDirectory,
};
+ var notifyStr = Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close");
switch (_settings.Shell)
{
case Shell.Cmd:
@@ -212,7 +214,11 @@ namespace Flow.Launcher.Plugin.Shell
info.FileName = "cmd.exe";
}
- info.ArgumentList.Add($"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command} {(_settings.CloseShellAfterPress ? $"&& echo {Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")} && pause > nul /c" : "")}");
+ info.ArgumentList.Add(
+ $"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command}" +
+ $"{(_settings.CloseShellAfterPress ?
+ $" && echo {notifyStr} && pause > nul /c" :
+ "")}");
break;
}
@@ -238,7 +244,11 @@ namespace Flow.Launcher.Plugin.Shell
else
{
info.ArgumentList.Add("-Command");
- info.ArgumentList.Add($"{command}{addedCharacter}; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" : "")}");
+ info.ArgumentList.Add(
+ $"{command}{addedCharacter};" +
+ $"{(_settings.CloseShellAfterPress ?
+ $" Write-Host '{notifyStr}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" :
+ "")}");
}
break;
}
@@ -262,7 +272,11 @@ namespace Flow.Launcher.Plugin.Shell
info.ArgumentList.Add("-NoExit");
}
info.ArgumentList.Add("-Command");
- info.ArgumentList.Add($"{command}{addedCharacter}; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" : "")}");
+ info.ArgumentList.Add(
+ $"{command}{addedCharacter};" +
+ $"{(_settings.CloseShellAfterPress ?
+ $" Write-Host '{notifyStr}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" :
+ "")}");
break;
}
From 89214fb58a0844854a99fcd8ac35a185436caa6d Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 16 Jun 2025 12:38:31 +0800
Subject: [PATCH 1392/1798] Improve code quality
---
Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
index 37f382ad1..a51aadec7 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -200,6 +200,7 @@ namespace Flow.Launcher.Plugin.Shell
WorkingDirectory = workingDirectory,
};
var notifyStr = Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close");
+ var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
switch (_settings.Shell)
{
case Shell.Cmd:
@@ -213,9 +214,16 @@ namespace Flow.Launcher.Plugin.Shell
{
info.FileName = "cmd.exe";
}
-
+ if (_settings.LeaveShellOpen)
+ {
+ info.ArgumentList.Add("/k");
+ }
+ else
+ {
+ info.ArgumentList.Add("/c");
+ }
info.ArgumentList.Add(
- $"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command}" +
+ $"{command}" +
$"{(_settings.CloseShellAfterPress ?
$" && echo {notifyStr} && pause > nul /c" :
"")}");
@@ -226,7 +234,6 @@ namespace Flow.Launcher.Plugin.Shell
{
// Using just a ; doesn't work with wt, as it's used to create a new tab for the terminal window
// \\ must be escaped for it to work properly, or breaking it into multiple arguments
- var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
if (_settings.UseWindowsTerminal)
{
info.FileName = "wt.exe";
@@ -257,7 +264,6 @@ namespace Flow.Launcher.Plugin.Shell
{
// Using just a ; doesn't work with wt, as it's used to create a new tab for the terminal window
// \\ must be escaped for it to work properly, or breaking it into multiple arguments
- var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
if (_settings.UseWindowsTerminal)
{
info.FileName = "wt.exe";
From 30d10bb37f6fb903f4d7c9cfbea82571eb9372b7 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 16 Jun 2025 21:11:50 +0800
Subject: [PATCH 1393/1798] Add try catch for register key check
---
Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs b/Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs
index 9d2046972..2da2cf034 100644
--- a/Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs
+++ b/Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs
@@ -1,11 +1,19 @@
using Microsoft.Win32;
namespace Flow.Launcher.Helper;
+
internal static class WindowsMediaPlayerHelper
{
internal static bool IsWindowsMediaPlayerInstalled()
{
- using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\MediaPlayer");
- return key?.GetValue("Installation Directory") != null;
+ try
+ {
+ using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\MediaPlayer");
+ return key?.GetValue("Installation Directory") != null;
+ }
+ catch
+ {
+ return false;
+ }
}
}
From be15b836fc631a74bc8cba0a6139e424bef0039c Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 16 Jun 2025 21:12:06 +0800
Subject: [PATCH 1394/1798] Add blank line
---
Flow.Launcher/App.xaml.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 69aa834ca..5df1f88ae 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -56,6 +56,7 @@ namespace Flow.Launcher
{
// Initialize settings
_settings.WMPInstalled = WindowsMediaPlayerHelper.IsWindowsMediaPlayerInstalled();
+
// Configure the dependency injection container
try
{
From 9e24d2cb9191df33fafee41284a27dd4dfb14874 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 16 Jun 2025 21:31:51 +0800
Subject: [PATCH 1395/1798] Output log info
---
Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs b/Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs
index 2da2cf034..b05409de2 100644
--- a/Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs
+++ b/Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs
@@ -1,9 +1,12 @@
-using Microsoft.Win32;
+using System;
+using Microsoft.Win32;
namespace Flow.Launcher.Helper;
internal static class WindowsMediaPlayerHelper
{
+ private static readonly string ClassName = nameof(WindowsMediaPlayerHelper);
+
internal static bool IsWindowsMediaPlayerInstalled()
{
try
@@ -11,8 +14,9 @@ internal static class WindowsMediaPlayerHelper
using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\MediaPlayer");
return key?.GetValue("Installation Directory") != null;
}
- catch
+ catch (Exception e)
{
+ App.API.LogException(ClassName, "Failed to check if Windows Media Player is installed", e);
return false;
}
}
From f3ce6975c9f465c772cf0c16fb1cc2e76268eb5c Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 17 Jun 2025 13:28:04 +0800
Subject: [PATCH 1396/1798] Fix tab sequence
---
Flow.Launcher/CustomShortcutSetting.xaml | 26 +++++++++++++-----------
1 file changed, 14 insertions(+), 12 deletions(-)
diff --git a/Flow.Launcher/CustomShortcutSetting.xaml b/Flow.Launcher/CustomShortcutSetting.xaml
index d8623753f..5185354e7 100644
--- a/Flow.Launcher/CustomShortcutSetting.xaml
+++ b/Flow.Launcher/CustomShortcutSetting.xaml
@@ -118,24 +118,26 @@
FontSize="14"
Text="{DynamicResource customShortcutExpansion}" />
-
-
+
+
+
+
+
-
+
+
From 4dd783360389b78e9c046b04a1d77aea023687e7 Mon Sep 17 00:00:00 2001
From: DB P
Date: Tue, 17 Jun 2025 16:45:44 +0900
Subject: [PATCH 1397/1798] UI improvements and file/folder selection feature
added - Updated "Name" and "Path" keys and added new keys in en.xaml. -
Modified QuickAccessLinkSettings.xaml: increased Window height and improved
layout using Grid structure. - Added new UI elements: implemented radio
buttons for file/folder selection. - Added and initialized QuickAccessLinks
property in QuickAccessLinkSettings.xaml.cs. - Added file selection dialog in
SelectPath_OnClick method. - Added IsFileSelected and IsFolderSelected
properties to implement selection functionality.
---
.../Languages/en.xaml | 7 +-
.../Views/QuickAccessLinkSettings.xaml | 135 +++++++++++-------
.../Views/QuickAccessLinkSettings.xaml.cs | 42 +++++-
3 files changed, 126 insertions(+), 58 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index 7d0a553a4..2e0f6a67d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -98,8 +98,11 @@
DeletePermanently delete current filePermanently delete current folder
- Path:
- Name:
+ Name
+ Type
+ Path
+ File
+ FolderDelete the selectedRun as different userRun the selected using a different user account
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
index e9ba53618..f35633bc5 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
@@ -1,22 +1,23 @@
-
-
-
-
+
+
+
+
@@ -58,55 +59,91 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
-
-
+ IsReadOnly="True"
+ Text="{Binding SelectedPath, Mode=TwoWay}" />
-
-
+ Click="SelectPath_OnClick"
+ Content="{DynamicResource select}" />
+
@@ -134,4 +171,4 @@
-
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 36a00e9e5..1e52ea81e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -49,9 +49,9 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
private bool IsEdit { get; }
private AccessLink SelectedAccessLink { get; }
-
+
public ObservableCollection QuickAccessLinks { get; }
-
+
public QuickAccessLinkSettings(ObservableCollection quickAccessLinks)
{
IsEdit = false;
@@ -96,7 +96,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
}
// If editing, update the existing link
- if (IsEdit)
+ if (IsEdit)
{
if (SelectedAccessLink == null) return;
@@ -130,12 +130,30 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
private void SelectPath_OnClick(object commandParameter, RoutedEventArgs e)
{
- var folderBrowserDialog = new FolderBrowserDialog();
+ // Open file or folder selection dialog based on the selected radio button
+ if (IsFileSelected)
+ {
+ var openFileDialog = new Microsoft.Win32.OpenFileDialog
+ {
+ Multiselect = false,
+ CheckFileExists = true,
+ CheckPathExists = true
+ };
- if (folderBrowserDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK)
- return;
+ if (openFileDialog.ShowDialog() == true)
+ {
+ SelectedPath = openFileDialog.FileName;
+ }
+ }
+ else // Folder selection
+ {
+ var folderBrowserDialog = new FolderBrowserDialog();
- SelectedPath = folderBrowserDialog.SelectedPath;
+ if (folderBrowserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+ {
+ SelectedPath = folderBrowserDialog.SelectedPath;
+ }
+ }
}
public event PropertyChangedEventHandler PropertyChanged;
@@ -144,4 +162,14 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
+
+ public bool IsFileSelected { get; set; }
+ public bool IsFolderSelected { get; set; }
+
+ public QuickAccessLinkSettings()
+ {
+ IsFolderSelected = true; // Default to folder selection
+ InitializeComponent();
+ DataContext = this;
+ }
}
From 52da1c97d998e5901e3699bc11a40d753da2de5f Mon Sep 17 00:00:00 2001
From: DB P
Date: Tue, 17 Jun 2025 16:50:42 +0900
Subject: [PATCH 1398/1798] Adjust Button Size
---
.../Views/QuickAccessLinkSettings.xaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
index f35633bc5..e977a72c2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml
@@ -155,14 +155,14 @@
From 42dc582ec1fd5bc06aedf75030ec34e0227cd315 Mon Sep 17 00:00:00 2001
From: DB P
Date: Tue, 17 Jun 2025 17:07:02 +0900
Subject: [PATCH 1399/1798] Change default value to file
---
.../Views/QuickAccessLinkSettings.xaml.cs | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 1e52ea81e..1cfc3b6c0 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -163,13 +163,11 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
- public bool IsFileSelected { get; set; }
- public bool IsFolderSelected { get; set; }
+ public bool IsFileSelected { get; set; } = true; // Default to File
+ public bool IsFolderSelected { get; set; }
public QuickAccessLinkSettings()
{
- IsFolderSelected = true; // Default to folder selection
InitializeComponent();
- DataContext = this;
}
}
From 12b51eb2392fae9f251476dbd29a69df9291abd8 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 17 Jun 2025 16:31:11 +0800
Subject: [PATCH 1400/1798] Code quality
---
.../Views/QuickAccessLinkSettings.xaml.cs | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 1cfc3b6c0..7cc46434f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -47,6 +47,9 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
}
}
+ public bool IsFileSelected { get; set; } = true; // Default to File
+ public bool IsFolderSelected { get; set; }
+
private bool IsEdit { get; }
private AccessLink SelectedAccessLink { get; }
@@ -162,12 +165,4 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
-
- public bool IsFileSelected { get; set; } = true; // Default to File
- public bool IsFolderSelected { get; set; }
-
- public QuickAccessLinkSettings()
- {
- InitializeComponent();
- }
}
From 76972d38496e95d32f4f7aeea3bb35bf1bba6993 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 17 Jun 2025 16:31:25 +0800
Subject: [PATCH 1401/1798] Use form dialog
---
.../Views/QuickAccessLinkSettings.xaml.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 7cc46434f..445c128e2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -136,7 +136,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
// Open file or folder selection dialog based on the selected radio button
if (IsFileSelected)
{
- var openFileDialog = new Microsoft.Win32.OpenFileDialog
+ var openFileDialog = new OpenFileDialog
{
Multiselect = false,
CheckFileExists = true,
From 1c652320e6d1186fdd5dbe186bcac0bf731bb33a Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 17 Jun 2025 16:32:18 +0800
Subject: [PATCH 1402/1798] Get access link type
---
.../Views/QuickAccessLinkSettings.xaml.cs | 54 +++++++++++++++----
1 file changed, 45 insertions(+), 9 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 445c128e2..c520c2a39 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -6,12 +6,15 @@ using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Forms;
using Flow.Launcher.Plugin.Explorer.Helper;
+using Flow.Launcher.Plugin.Explorer.Search;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
namespace Flow.Launcher.Plugin.Explorer.Views;
public partial class QuickAccessLinkSettings : INotifyPropertyChanged
{
+ private ResultType _accessLinkType = ResultType.Folder;
+
private string _selectedPath;
public string SelectedPath
{
@@ -25,6 +28,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
if (string.IsNullOrEmpty(_selectedName))
{
SelectedName = _selectedPath.GetPathName();
+ _accessLinkType = GetResultType(_selectedPath);
}
}
}
@@ -67,6 +71,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
IsEdit = true;
_selectedName = selectedAccessLink.Name;
_selectedPath = selectedAccessLink.Path;
+ _accessLinkType = GetResultType(_selectedPath);
SelectedAccessLink = selectedAccessLink;
QuickAccessLinks = quickAccessLinks;
InitializeComponent();
@@ -109,7 +114,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
var updatedLink = new AccessLink
{
Name = SelectedName,
- Type = SelectedAccessLink.Type,
+ Type = _accessLinkType,
Path = SelectedPath
};
QuickAccessLinks[index] = updatedLink;
@@ -123,6 +128,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
var newAccessLink = new AccessLink
{
Name = SelectedName,
+ Type = _accessLinkType,
Path = SelectedPath
};
QuickAccessLinks.Add(newAccessLink);
@@ -143,19 +149,49 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
CheckPathExists = true
};
- if (openFileDialog.ShowDialog() == true)
- {
- SelectedPath = openFileDialog.FileName;
- }
+ if (openFileDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK ||
+ string.IsNullOrEmpty(openFileDialog.FileName))
+ return;
+
+ SelectedPath = openFileDialog.FileName;
}
else // Folder selection
{
- var folderBrowserDialog = new FolderBrowserDialog();
-
- if (folderBrowserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+ var folderBrowserDialog = new FolderBrowserDialog
{
- SelectedPath = folderBrowserDialog.SelectedPath;
+ ShowNewFolderButton = true
+ };
+
+ if (folderBrowserDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK ||
+ string.IsNullOrEmpty(folderBrowserDialog.SelectedPath))
+ return;
+
+ SelectedPath = folderBrowserDialog.SelectedPath;
+ }
+ }
+
+ private static ResultType GetResultType(string path)
+ {
+ // Check if the path is a file or folder
+ if (System.IO.File.Exists(path))
+ {
+ return ResultType.File;
+ }
+ else if (System.IO.Directory.Exists(path))
+ {
+ if (string.Equals(System.IO.Path.GetPathRoot(path), path, StringComparison.OrdinalIgnoreCase))
+ {
+ return ResultType.Volume;
}
+ else
+ {
+ return ResultType.Folder;
+ }
+ }
+ else
+ {
+ // This should not happen, but just in case, we assume it's a folder
+ return ResultType.Folder;
}
}
From af92bda06dbcd34bebfdf70e8f63d60e355b64b2 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 17 Jun 2025 16:33:25 +0800
Subject: [PATCH 1403/1798] Initialize default access link type
---
.../Views/QuickAccessLinkSettings.xaml.cs | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index c520c2a39..798d26b42 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -71,7 +71,9 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
IsEdit = true;
_selectedName = selectedAccessLink.Name;
_selectedPath = selectedAccessLink.Path;
- _accessLinkType = GetResultType(_selectedPath);
+ _accessLinkType = GetResultType(_selectedPath); // Initialize link type
+ IsFileSelected = selectedAccessLink.Type == ResultType.File; // Initialize default selection
+ IsFolderSelected = !IsFileSelected;
SelectedAccessLink = selectedAccessLink;
QuickAccessLinks = quickAccessLinks;
InitializeComponent();
From b28bb38f52b0714c603c85ee48de4250b45ce4ce Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 17 Jun 2025 16:34:43 +0800
Subject: [PATCH 1404/1798] Add new link if selected link is null
---
.../Views/QuickAccessLinkSettings.xaml.cs | 35 ++++++++++++-------
1 file changed, 23 insertions(+), 12 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index 798d26b42..a94aa6b02 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -108,24 +108,35 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
// If editing, update the existing link
if (IsEdit)
{
- if (SelectedAccessLink == null) return;
-
- var index = QuickAccessLinks.IndexOf(SelectedAccessLink);
- if (index >= 0)
+ if (SelectedAccessLink != null)
{
- var updatedLink = new AccessLink
+ var index = QuickAccessLinks.IndexOf(SelectedAccessLink);
+ if (index >= 0)
{
- Name = SelectedName,
- Type = _accessLinkType,
- Path = SelectedPath
- };
- QuickAccessLinks[index] = updatedLink;
+ var updatedLink = new AccessLink
+ {
+ Name = SelectedName,
+ Type = _accessLinkType,
+ Path = SelectedPath
+ };
+ QuickAccessLinks[index] = updatedLink;
+ }
+ DialogResult = true;
+ Close();
+ }
+ // Add a new one if the selected access link is null (should not happen in edit mode, but just in case)
+ else
+ {
+ AddNewAccessLink();
}
- DialogResult = true;
- Close();
}
// Otherwise, add a new one
else
+ {
+ AddNewAccessLink();
+ }
+
+ void AddNewAccessLink()
{
var newAccessLink = new AccessLink
{
From 054ee4cdbe779bca503732f8694867ac855aaa07 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 17 Jun 2025 16:37:17 +0800
Subject: [PATCH 1405/1798] Default to folder
---
.../Views/QuickAccessLinkSettings.xaml.cs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
index a94aa6b02..7b4d92bf5 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs
@@ -13,8 +13,6 @@ namespace Flow.Launcher.Plugin.Explorer.Views;
public partial class QuickAccessLinkSettings : INotifyPropertyChanged
{
- private ResultType _accessLinkType = ResultType.Folder;
-
private string _selectedPath;
public string SelectedPath
{
@@ -51,14 +49,16 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged
}
}
- public bool IsFileSelected { get; set; } = true; // Default to File
- public bool IsFolderSelected { get; set; }
+ public bool IsFileSelected { get; set; }
+ public bool IsFolderSelected { get; set; } = true; // Default to Folder
private bool IsEdit { get; }
private AccessLink SelectedAccessLink { get; }
public ObservableCollection QuickAccessLinks { get; }
+ private ResultType _accessLinkType = ResultType.Folder; // Default to Folder
+
public QuickAccessLinkSettings(ObservableCollection quickAccessLinks)
{
IsEdit = false;
From b18d0a8bdbcff45ec470528f83f30e1656964772 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 17 Jun 2025 16:55:23 +0800
Subject: [PATCH 1406/1798] Improve code quality
---
.../ViewModels/ActionKeywordModel.cs | 19 +++--------
.../Views/ActionKeywordSetting.xaml.cs | 32 ++++---------------
.../Views/ExplorerSettings.xaml | 3 +-
.../Views/PreviewPanel.xaml.cs | 12 ++-----
.../Views/QuickAccessLinkSettings.xaml.cs | 12 ++-----
5 files changed, 18 insertions(+), 60 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
index 745032d2c..2c4c4e54f 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs
@@ -1,16 +1,11 @@
-using System.ComponentModel;
-using System.Runtime.CompilerServices;
+#nullable enable
-#nullable enable
-
-namespace Flow.Launcher.Plugin.Explorer.Views
+namespace Flow.Launcher.Plugin.Explorer.ViewModels
{
- public class ActionKeywordModel : INotifyPropertyChanged
+ public partial class ActionKeywordModel : BaseModel
{
private static Settings _settings = null!;
- public event PropertyChangedEventHandler? PropertyChanged;
-
public static void Init(Settings settings)
{
_settings = settings;
@@ -28,13 +23,7 @@ namespace Flow.Launcher.Plugin.Explorer.Views
internal Settings.ActionKeyword KeywordProperty { get; }
- private void OnPropertyChanged([CallerMemberName] string propertyName = "")
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
-
private string? keyword;
-
public string Keyword
{
get => keyword ??= _settings.GetActionKeyword(KeywordProperty);
@@ -45,8 +34,8 @@ namespace Flow.Launcher.Plugin.Explorer.Views
OnPropertyChanged();
}
}
- private bool? enabled;
+ private bool? enabled;
public bool Enabled
{
get => enabled ??= _settings.GetActionKeywordEnabled(KeywordProperty);
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs
index 10ce28fe4..829a2feed 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ActionKeywordSetting.xaml.cs
@@ -1,16 +1,13 @@
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.Runtime.CompilerServices;
+using System.Linq;
using System.Windows;
using System.Windows.Input;
+using CommunityToolkit.Mvvm.ComponentModel;
+using Flow.Launcher.Plugin.Explorer.ViewModels;
namespace Flow.Launcher.Plugin.Explorer.Views
{
- ///
- /// Interaction logic for ActionKeywordSetting.xaml
- ///
- public partial class ActionKeywordSetting : INotifyPropertyChanged
+ [INotifyPropertyChanged]
+ public partial class ActionKeywordSetting
{
private ActionKeywordModel CurrentActionKeyword { get; }
@@ -21,14 +18,14 @@ namespace Flow.Launcher.Plugin.Explorer.Views
{
// Set Enable to be true if user change ActionKeyword
KeywordEnabled = true;
- _ = SetField(ref actionKeyword, value);
+ _ = SetProperty(ref actionKeyword, value);
}
}
public bool KeywordEnabled
{
get => _keywordEnabled;
- set => SetField(ref _keywordEnabled, value);
+ set => _ = SetProperty(ref _keywordEnabled, value);
}
private string actionKeyword;
@@ -116,20 +113,5 @@ namespace Flow.Launcher.Plugin.Explorer.Views
e.CancelCommand();
}
}
-
- public event PropertyChangedEventHandler PropertyChanged;
- protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
-
- private bool SetField(ref T field, T value, [CallerMemberName] string propertyName = null)
- {
- if (EqualityComparer.Default.Equals(field, value))
- return false;
- field = value;
- OnPropertyChanged(propertyName);
- return true;
- }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 8f4b4d862..59373b4de 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -8,7 +8,6 @@
xmlns:qa="clr-namespace:Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks"
xmlns:ui="http://schemas.modernwpf.com/2019"
xmlns:viewModels="clr-namespace:Flow.Launcher.Plugin.Explorer.ViewModels"
- xmlns:views="clr-namespace:Flow.Launcher.Plugin.Explorer.Views"
d:DataContext="{d:DesignInstance viewModels:SettingsViewModel}"
d:DesignHeight="450"
d:DesignWidth="800"
@@ -18,7 +17,7 @@
-
+
Date: Tue, 17 Jun 2025 16:58:48 +0800
Subject: [PATCH 1407/1798] Improve code quality
---
...low.Launcher.Plugin.BrowserBookmark.csproj | 35 ++-----------------
.../Views/SettingsControl.xaml.cs | 11 +++---
2 files changed, 8 insertions(+), 38 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 49ae26564..1211cdf18 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -37,41 +37,11 @@
-
+
-
+
@@ -95,6 +65,7 @@
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml.cs
index 3182adfed..1ee6b5c45 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/SettingsControl.xaml.cs
@@ -1,12 +1,13 @@
using System.Windows;
-using Flow.Launcher.Plugin.BrowserBookmark.Models;
using System.Windows.Input;
-using System.ComponentModel;
using System.Threading.Tasks;
+using CommunityToolkit.Mvvm.ComponentModel;
+using Flow.Launcher.Plugin.BrowserBookmark.Models;
namespace Flow.Launcher.Plugin.BrowserBookmark.Views;
-public partial class SettingsControl : INotifyPropertyChanged
+[INotifyPropertyChanged]
+public partial class SettingsControl
{
public Settings Settings { get; }
public CustomBrowser SelectedCustomBrowser { get; set; }
@@ -53,12 +54,10 @@ public partial class SettingsControl : INotifyPropertyChanged
set
{
Settings.OpenInNewBrowserWindow = value;
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(OpenInNewBrowserWindow)));
+ OnPropertyChanged();
}
}
- public event PropertyChangedEventHandler PropertyChanged;
-
private void NewCustomBrowser(object sender, RoutedEventArgs e)
{
var newBrowser = new CustomBrowser();
From bc8e77ae02ce8b41f6062b700426c15e81a04c05 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 17 Jun 2025 17:00:28 +0800
Subject: [PATCH 1408/1798] Fix format
---
...low.Launcher.Plugin.BrowserBookmark.csproj | 34 +++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 1211cdf18..3fb0fa46f 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -37,11 +37,41 @@
-
+
-
+
From 7b726d86d3b9820eb4bbd2382e4d05bce18c1cd7 Mon Sep 17 00:00:00 2001
From: DB P
Date: Wed, 18 Jun 2025 18:23:00 +0900
Subject: [PATCH 1409/1798] Add new time format option "dd MMMM yyyy"
---
.../SettingPages/ViewModels/SettingsPaneThemeViewModel.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
index 79465cd71..b62a35495 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
@@ -170,7 +170,8 @@ public partial class SettingsPaneThemeViewModel : BaseModel
"dddd dd', 'MMMM",
"dd', 'MMMM",
"dd.MM.yy",
- "dd.MM.yyyy"
+ "dd.MM.yyyy",
+ "dd MMMM yyyy"
};
public string TimeFormat
From 8a54cc20ce991c46aed158e13cf5b3d537541a45 Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Wed, 18 Jun 2025 21:17:04 +1000
Subject: [PATCH 1410/1798] update pre-release's release message
---
appveyor.yml | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index a430b28f4..646594f4a 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -69,7 +69,17 @@ deploy:
- provider: GitHub
repository: Flow-Launcher/Prereleases
release: v$(prereleaseTag)
- description: 'This is the early access build of our upcoming release. All changes contained here are reviewed, tested and stable to use.\n\nSee our [release](https://github.com/Flow-Launcher/Flow.Launcher/pulls?q=is%3Aopen+is%3Apr+label%3Arelease) Pull Request for details.\n\nFor latest production release visit [here](https://github.com/Flow-Launcher/Flow.Launcher/releases/latest)\n\nPlease report any bugs or issues over at the [main repository](https://github.com/Flow-Launcher/Flow.Launcher/issues)'
+ description: |
+ This is the early access build of our upcoming release.
+ All changes contained here are reviewed, tested and stable to use.
+
+ This build includes new changes from commit:
+ $(APPVEYOR_REPO_COMMIT_MESSAGE)
+
+ See all changes in this early access by going to the [milstones](https://github.com/Flow-Launcher/Flow.Launcher/milestones?sort=title&direction=asc) section and choosing the upcoming milestone.
+ For latest production release visit [here](https://github.com/Flow-Launcher/Flow.Launcher/releases/latest)
+
+ Please report any bugs or issues over at the [main repository](https://github.com/Flow-Launcher/Flow.Launcher/issues)'
auth_token:
secure: ij4UeXUYQBDJxn2YRAAhUOjklOGVKDB87Hn5J8tKIzj13yatoI7sLM666QDQFEgv
artifact: Squirrel Installer, Portable Version, Squirrel nupkg, Squirrel RELEASES
From 40e5c04ca1aacac34809ba1f0f95ac4f7bde76dd Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 19 Jun 2025 21:05:26 +1000
Subject: [PATCH 1411/1798] Fix false failing spell check rules (#3745)
---
.github/actions/spelling/expect.txt | 15 ++-------------
.github/actions/spelling/patterns.txt | 12 ++++++++++++
2 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
index 6ba41e410..177c00fa2 100644
--- a/.github/actions/spelling/expect.txt
+++ b/.github/actions/spelling/expect.txt
@@ -1,3 +1,5 @@
+# This file should contain names of products, companies, or individuals that aren't in a standard dictionary (e.g., GitHub, Keptn, VSCode).
+
crowdin
DWM
workflows
@@ -34,7 +36,6 @@ mscorlib
pythonw
dotnet
winget
-jjw24
wolframalpha
gmail
duckduckgo
@@ -49,7 +50,6 @@ srchadmin
EWX
dlgtext
CMD
-appref-ms
appref
TSource
runas
@@ -57,7 +57,6 @@ dpi
popup
ptr
pluginindicator
-TobiasSekan
img
resx
bak
@@ -68,9 +67,6 @@ dlg
ddd
dddd
clearlogfolder
-ACCENT_ENABLE_TRANSPARENTGRADIENT
-ACCENT_ENABLE_BLURBEHIND
-WCA_ACCENT_POLICY
HGlobal
dopusrt
firefox
@@ -91,22 +87,15 @@ keyevent
KListener
requery
vkcode
-čeština
Polski
Srpski
-Português
-Português (Brasil)
Italiano
-Slovenský
quicklook
-Tiếng Việt
Droplex
Preinstalled
errormetadatafile
noresult
pluginsmanager
alreadyexists
-JsonRPC
-JsonRPCV2
Softpedia
img
diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt
index f29f57ad5..5ef8859fc 100644
--- a/.github/actions/spelling/patterns.txt
+++ b/.github/actions/spelling/patterns.txt
@@ -1,4 +1,6 @@
# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns
+# This file should contain strings that contain a mix of letters and numbers, or specific symbols
+
# Questionably acceptable forms of `in to`
# Personally, I prefer `log into`, but people object
@@ -121,3 +123,13 @@
# version suffix v#
(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_]))
+
+\bjjw24\b
+\bappref-ms\b
+\bTobiasSekan\b
+\bJsonRPC\b
+\bJsonRPCV2\b
+\bTiếng Việt\b
+\bPortuguês (Brasil)\b
+\bčeština\b
+\bPortuguês\b
From 64a3aa583f72be608e3e513aebf2c0f028e49346 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Thu, 19 Jun 2025 19:29:50 +0800
Subject: [PATCH 1412/1798] Fix Off-by-one in index mapping when consecutive
Chinese chars
Found by code rabbit
---
Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index 37b7bb8c3..ffb92a9bf 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -107,8 +107,8 @@ namespace Flow.Launcher.Infrastructure
string translated = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i];
if (previousIsChinese)
{
- map.AddNewIndex(i, resultBuilder.Length, translated.Length + 1);
resultBuilder.Append(' ');
+ map.AddNewIndex(i, resultBuilder.Length, translated.Length + 1);
resultBuilder.Append(translated);
}
else
From b18959514d439bfb4571cb75dc1661e03c22a7bf Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Thu, 19 Jun 2025 19:35:01 +0800
Subject: [PATCH 1413/1798] Add OnPropertyChanged() for double pinyin
properties
---
.../UserSettings/Settings.cs | 28 +++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index e7306e3dd..ae3c4a396 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -290,9 +290,33 @@ namespace Flow.Launcher.Infrastructure.UserSettings
///
public bool ShouldUsePinyin { get; set; } = false;
- public bool UseDoublePinyin { get; set; } = true; //For developing
+ private bool _useDoublePinyin = true; // TODO: change default to false BEFORE RELEASE
+ public bool UseDoublePinyin
+ {
+ get => _useDoublePinyin;
+ set
+ {
+ if (_useDoublePinyin != value)
+ {
+ _useDoublePinyin = value;
+ OnPropertyChanged();
+ }
+ }
+ }
- public string DoublePinyinSchema { get; set; } = "XiaoHe"; //For developing
+ private string _doublePinyinSchema = "XiaoHe";
+ public string DoublePinyinSchema
+ {
+ get => _doublePinyinSchema;
+ set
+ {
+ if (_doublePinyinSchema != value)
+ {
+ _doublePinyinSchema = value;
+ OnPropertyChanged();
+ }
+ }
+ }
public bool AlwaysPreview { get; set; } = false;
From d2dc307bc020ebd8205ce01ee8ae5e262703a943 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Thu, 19 Jun 2025 20:06:01 +0800
Subject: [PATCH 1414/1798] Fix logic of ShouldTranslate()
---
Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index ffb92a9bf..91c13ffad 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -76,9 +76,7 @@ namespace Flow.Launcher.Infrastructure
public bool ShouldTranslate(string stringToTranslate)
{
- return _settings.UseDoublePinyin ?
- (!WordsHelper.HasChinese(stringToTranslate) && stringToTranslate.Length % 2 == 0) :
- !WordsHelper.HasChinese(stringToTranslate);
+ return WordsHelper.HasChinese(stringToTranslate);
}
public (string translation, TranslationMapping map) Translate(string content)
From 1bc80d5dd99cdc2fdf6ee900c1c5c4d351a0a1eb Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Thu, 19 Jun 2025 21:52:15 +0800
Subject: [PATCH 1415/1798] Fix translated length
---
Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index 91c13ffad..f11a49613 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -106,7 +106,7 @@ namespace Flow.Launcher.Infrastructure
if (previousIsChinese)
{
resultBuilder.Append(' ');
- map.AddNewIndex(i, resultBuilder.Length, translated.Length + 1);
+ map.AddNewIndex(i, resultBuilder.Length, translated.Length);
resultBuilder.Append(translated);
}
else
From 247355e1427af61d73f39fafedd66b2f0d2f6909 Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Sat, 21 Jun 2025 21:34:49 +1000
Subject: [PATCH 1416/1798] simplify assignee by using filtered PR list
---
.github/update_release_pr.py | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py
index ccea511b3..bf5f9a15e 100644
--- a/.github/update_release_pr.py
+++ b/.github/update_release_pr.py
@@ -107,14 +107,12 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all")
return pr_list
-def get_prs_assignees(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[str]:
+def get_prs_assignees(pull_request_items: list[dict]) -> list[str]:
"""
- Returns a list of pull request assignees after applying the label and state filters, excludes jjw24.
+ Returns a list of pull request assignees, excludes jjw24.
Args:
- pull_request_items (list[dict]): List of PR items.
- label (str): The label name. Filter is not applied when empty string.
- state (str): State of PR, e.g. open, closed, all
+ pull_request_items (list[dict]): List of PR items to get the assignees from.
Returns:
list: A list of strs, where each string is an assignee name. List is not distinct, so can contain
@@ -123,10 +121,9 @@ def get_prs_assignees(pull_request_items: list[dict], label: str = "", state: st
"""
assignee_list = []
for pr in pull_request_items:
- if state in [pr["state"], "all"] and (not label or [item for item in pr["labels"] if item["name"] == label]):
- [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24" ]
+ [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24" ]
- print(f"Found {len(assignee_list)} assignees with {label if label else 'no filter on'} label and state as {state}")
+ print(f"Found {len(assignee_list)} assignees")
return assignee_list
@@ -230,7 +227,7 @@ 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 ""
- assignees = list(set(get_prs_assignees(pull_requests, "enhancement", "closed") + get_prs_assignees(pull_requests, "bug", "closed")))
+ assignees = list(set(get_prs_assignees(enhancement_prs) + get_prs_assignees(bug_fix_prs)))
assignees.sort(key=str.lower)
description_content += f"### Authors:\n{', '.join(assignees)}"
From 4e57e3a66cebec0af365c2bc6b7e462644d5c92d Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Sat, 21 Jun 2025 21:37:12 +1000
Subject: [PATCH 1417/1798] determine milestone from release PR instead of
querying milestones
---
.github/update_release_pr.py | 77 ++++++++++++++++--------------------
1 file changed, 34 insertions(+), 43 deletions(-)
diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py
index bf5f9a15e..0ae83151d 100644
--- a/.github/update_release_pr.py
+++ b/.github/update_release_pr.py
@@ -1,11 +1,12 @@
from os import getenv
+from typing import Optional
import requests
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.
+ Fetches pull requests from a GitHub repository that match a given label and state.
Args:
token (str): GitHub token.
@@ -23,39 +24,10 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st
"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()
- milestones = response.json()
-
- if len(milestones) > 2:
- print("More than two milestones found, unable to determine the milestone required.")
- exit(1)
-
- # milestones.pop()
- for ms in milestones:
- if ms["title"] != "Future":
- milestone_id = ms["number"]
- 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)
-
- except requests.exceptions.RequestException as e:
- print(f"Error fetching milestones: {e}")
- exit(1)
-
- # This endpoint allows filtering by milestone and label. A PR in GH's perspective is a type of issue.
+ # This endpoint allows filtering by label(and milestone). 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,
}
@@ -83,7 +55,7 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st
return all_prs
-def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[dict]:
+def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all", milestone_number: Optional[int] = None) -> list[dict]:
"""
Returns a list of pull requests after applying the label and state filters.
@@ -91,6 +63,7 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all")
pull_request_items (list[dict]): List of PR items.
label (str): The label name. Filter is not applied when empty string.
state (str): State of PR, e.g. open, closed, all
+ milestone_number (Optional[int]): The milestone number to filter by. If None, no milestone filtering is applied.
Returns:
list: A list of dictionaries, where each dictionary represents a pull request.
@@ -99,11 +72,20 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all")
pr_list = []
count = 0
for pr in pull_request_items:
- if state in [pr["state"], "all"] and (not label or [item for item in pr["labels"] if item["name"] == label]):
- pr_list.append(pr)
- count += 1
+ if state not in [pr["state"], "all"]:
+ continue
- print(f"Found {count} PRs with {label if label else 'no filter on'} label and state as {state}")
+ if label and not [item for item in pr["labels"] if item["name"] == label]:
+ continue
+
+ if milestone_number:
+ if not pr.get("milestone") or pr["milestone"]["number"] != milestone_number:
+ continue
+
+ pr_list.append(pr)
+ count += 1
+
+ print(f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr.get("milestone",{}).get("number","None")}")
return pr_list
@@ -204,15 +186,16 @@ if __name__ == "__main__":
print(f"Fetching {state} PRs for {repository_owner}/{repository_name} ...")
- pull_requests = get_github_prs(github_token, repository_owner, repository_name)
+ # First, get all PRs to find the release PR and determine the milestone
+ all_pull_requests = get_github_prs(github_token, repository_owner, repository_name)
- if not pull_requests:
- print("No matching pull requests found")
+ if not all_pull_requests:
+ print("No pull requests found")
exit(1)
- print(f"\nFound total of {len(pull_requests)} pull requests")
+ print(f"\nFound total of {len(all_pull_requests)} pull requests")
- release_pr = get_prs(pull_requests, "release", "open")
+ release_pr = get_prs(all_pull_requests, "release", "open")
if len(release_pr) != 1:
print(f"Unable to find the exact release PR. Returned result: {release_pr}")
@@ -220,8 +203,16 @@ if __name__ == "__main__":
print(f"Found release PR: {release_pr[0]['title']}")
- enhancement_prs = get_prs(pull_requests, "enhancement", "closed")
- bug_fix_prs = get_prs(pull_requests, "bug", "closed")
+ release_milestone_number = release_pr[0].get("milestone",{}).get("number",None)
+
+ if not release_milestone_number:
+ print("Release PR does not have a milestone assigned.")
+ exit(1)
+
+ print(f"Using milestone number: {release_milestone_number}")
+
+ enhancement_prs = get_prs(all_pull_requests, "enhancement", "closed", release_milestone_number)
+ bug_fix_prs = get_prs(all_pull_requests, "bug", "closed", release_milestone_number)
description_content = "# Release notes\n"
description_content += f"## Features\n{get_pr_descriptions(enhancement_prs)}" if enhancement_prs else ""
From 60d59668636db3bbef2488b0291328a78eacc655 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sat, 21 Jun 2025 11:46:12 +0000
Subject: [PATCH 1418/1798] formatting
---
.github/update_release_pr.py | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py
index 0ae83151d..68e4c0659 100644
--- a/.github/update_release_pr.py
+++ b/.github/update_release_pr.py
@@ -55,7 +55,9 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st
return all_prs
-def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all", milestone_number: Optional[int] = None) -> list[dict]:
+def get_prs(
+ pull_request_items: list[dict], label: str = "", state: str = "all", milestone_number: Optional[int] = None
+) -> list[dict]:
"""
Returns a list of pull requests after applying the label and state filters.
@@ -85,10 +87,13 @@ 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 filter on'} label, state as {state}, and milestone {pr.get("milestone",{}).get("number","None")}")
+ print(
+ f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr.get("milestone",{}).get("number","None")}"
+ )
return pr_list
+
def get_prs_assignees(pull_request_items: list[dict]) -> list[str]:
"""
Returns a list of pull request assignees, excludes jjw24.
@@ -103,12 +108,13 @@ def get_prs_assignees(pull_request_items: list[dict]) -> list[str]:
"""
assignee_list = []
for pr in pull_request_items:
- [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24" ]
+ [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24"]
print(f"Found {len(assignee_list)} assignees")
return assignee_list
+
def get_pr_descriptions(pull_request_items: list[dict]) -> str:
"""
Returns the concatenated string of pr title and number in the format of
@@ -203,7 +209,7 @@ if __name__ == "__main__":
print(f"Found release PR: {release_pr[0]['title']}")
- release_milestone_number = release_pr[0].get("milestone",{}).get("number",None)
+ release_milestone_number = release_pr[0].get("milestone", {}).get("number", None)
if not release_milestone_number:
print("Release PR does not have a milestone assigned.")
From 9b02e1f74e180c906a7b0f13cde1cfb3c38904de Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sat, 21 Jun 2025 21:52:54 +1000
Subject: [PATCH 1419/1798] fix typo
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
.github/update_release_pr.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py
index 68e4c0659..d637a3275 100644
--- a/.github/update_release_pr.py
+++ b/.github/update_release_pr.py
@@ -88,7 +88,7 @@ def get_prs(
count += 1
print(
- f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr.get("milestone",{}).get("number","None")}"
+ f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr.get('milestone', {}).get('number', 'None')}"
)
return pr_list
From fe7985d5644a2c3b86ff369736fb461e7fc0fba4 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 23 Jun 2025 12:25:16 +0800
Subject: [PATCH 1420/1798] Use Flow.Launcher.Localization to improve code
quality
---
.../DecimalSeparator.cs | 11 +++---
.../Flow.Launcher.Plugin.Calculator.csproj | 2 +-
.../Flow.Launcher.Plugin.Calculator/Main.cs | 35 +++++++++----------
.../ViewModels/SettingsViewModel.cs | 16 +++++++++
.../Views/CalculatorSettings.xaml | 19 +++-------
.../Views/CalculatorSettings.xaml.cs | 12 +++----
6 files changed, 48 insertions(+), 47 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs b/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs
index 81a68739b..0ece36d54 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs
@@ -1,18 +1,17 @@
-using System.ComponentModel;
-using Flow.Launcher.Core.Resource;
+using Flow.Launcher.Localization.Attributes;
namespace Flow.Launcher.Plugin.Calculator
{
- [TypeConverter(typeof(LocalizationConverter))]
+ [EnumLocalize]
public enum DecimalSeparator
{
- [LocalizedDescription("flowlauncher_plugin_calculator_decimal_seperator_use_system_locale")]
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_calculator_decimal_seperator_use_system_locale))]
UseSystemLocale,
- [LocalizedDescription("flowlauncher_plugin_calculator_decimal_seperator_dot")]
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_calculator_decimal_seperator_dot))]
Dot,
- [LocalizedDescription("flowlauncher_plugin_calculator_decimal_seperator_comma")]
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_calculator_decimal_seperator_comma))]
Comma
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
index 9cdef365d..73dacf3d1 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
@@ -42,7 +42,6 @@
-
@@ -63,6 +62,7 @@
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index b1e4cd606..f35e64237 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -5,7 +5,6 @@ using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Windows.Controls;
using Mages.Core;
-using Flow.Launcher.Plugin.Calculator.ViewModels;
using Flow.Launcher.Plugin.Calculator.Views;
namespace Flow.Launcher.Plugin.Calculator
@@ -24,19 +23,17 @@ namespace Flow.Launcher.Plugin.Calculator
@")+$", RegexOptions.Compiled);
private static readonly Regex RegBrackets = new Regex(@"[\(\)\[\]]", RegexOptions.Compiled);
private static Engine MagesEngine;
- private const string comma = ",";
- private const string dot = ".";
+ private const string Comma = ",";
+ private const string Dot = ".";
- private PluginInitContext Context { get; set; }
+ internal static PluginInitContext Context { get; set; } = null!;
private static Settings _settings;
- private static SettingsViewModel _viewModel;
public void Init(PluginInitContext context)
{
Context = context;
_settings = context.API.LoadSettingJsonStorage();
- _viewModel = new SettingsViewModel(_settings);
MagesEngine = new Engine(new Configuration
{
@@ -72,10 +69,10 @@ namespace Flow.Launcher.Plugin.Calculator
var result = MagesEngine.Interpret(expression);
if (result?.ToString() == "NaN")
- result = Context.API.GetTranslation("flowlauncher_plugin_calculator_not_a_number");
+ result = Localize.flowlauncher_plugin_calculator_not_a_number();
if (result is Function)
- result = Context.API.GetTranslation("flowlauncher_plugin_calculator_expression_not_complete");
+ result = Localize.flowlauncher_plugin_calculator_expression_not_complete();
if (!string.IsNullOrEmpty(result?.ToString()))
{
@@ -89,7 +86,7 @@ namespace Flow.Launcher.Plugin.Calculator
Title = newResult,
IcoPath = "Images/calculator.png",
Score = 300,
- SubTitle = Context.API.GetTranslation("flowlauncher_plugin_calculator_copy_number_to_clipboard"),
+ SubTitle = Localize.flowlauncher_plugin_calculator_copy_number_to_clipboard(),
CopyText = newResult,
Action = c =>
{
@@ -134,16 +131,16 @@ namespace Flow.Launcher.Plugin.Calculator
return false;
}
- if ((query.Search.Contains(dot) && GetDecimalSeparator() != dot) ||
- (query.Search.Contains(comma) && GetDecimalSeparator() != comma))
+ if ((query.Search.Contains(Dot) && GetDecimalSeparator() != Dot) ||
+ (query.Search.Contains(Comma) && GetDecimalSeparator() != Comma))
return false;
return true;
}
- private string ChangeDecimalSeparator(decimal value, string newDecimalSeparator)
+ private static string ChangeDecimalSeparator(decimal value, string newDecimalSeparator)
{
- if (String.IsNullOrEmpty(newDecimalSeparator))
+ if (string.IsNullOrEmpty(newDecimalSeparator))
{
return value.ToString();
}
@@ -161,13 +158,13 @@ namespace Flow.Launcher.Plugin.Calculator
return _settings.DecimalSeparator switch
{
DecimalSeparator.UseSystemLocale => systemDecimalSeparator,
- DecimalSeparator.Dot => dot,
- DecimalSeparator.Comma => comma,
+ DecimalSeparator.Dot => Dot,
+ DecimalSeparator.Comma => Comma,
_ => systemDecimalSeparator,
};
}
- private bool IsBracketComplete(string query)
+ private static bool IsBracketComplete(string query)
{
var matchs = RegBrackets.Matches(query);
var leftBracketCount = 0;
@@ -188,17 +185,17 @@ namespace Flow.Launcher.Plugin.Calculator
public string GetTranslatedPluginTitle()
{
- return Context.API.GetTranslation("flowlauncher_plugin_caculator_plugin_name");
+ return Localize.flowlauncher_plugin_caculator_plugin_name();
}
public string GetTranslatedPluginDescription()
{
- return Context.API.GetTranslation("flowlauncher_plugin_caculator_plugin_description");
+ return Localize.flowlauncher_plugin_caculator_plugin_description();
}
public Control CreateSettingPanel()
{
- return new CalculatorSettings(_viewModel);
+ return new CalculatorSettings(_settings);
}
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs
index 09f745669..a1f07bd17 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs
@@ -8,10 +8,26 @@ namespace Flow.Launcher.Plugin.Calculator.ViewModels
public SettingsViewModel(Settings settings)
{
Settings = settings;
+ DecimalSeparatorLocalized.UpdateLabels(AllDecimalSeparator);
}
public Settings Settings { get; init; }
public IEnumerable MaxDecimalPlacesRange => Enumerable.Range(1, 20);
+
+ public List AllDecimalSeparator { get; } = DecimalSeparatorLocalized.GetValues();
+
+ public DecimalSeparator SelectedDecimalSeparator
+ {
+ get => Settings.DecimalSeparator;
+ set
+ {
+ if (Settings.DecimalSeparator != value)
+ {
+ Settings.DecimalSeparator = value;
+ OnPropertyChanged();
+ }
+ }
+ }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
index ceee3897c..589f3ddcd 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
@@ -3,20 +3,15 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:calculator="clr-namespace:Flow.Launcher.Plugin.Calculator"
- xmlns:core="clr-namespace:Flow.Launcher.Core.Resource;assembly=Flow.Launcher.Core"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:ui="clr-namespace:Flow.Launcher.Infrastructure.UI;assembly=Flow.Launcher.Infrastructure"
xmlns:viewModels="clr-namespace:Flow.Launcher.Plugin.Calculator.ViewModels"
+ d:DataContext="{d:DesignInstance Type=viewModels:SettingsViewModel}"
d:DesignHeight="450"
d:DesignWidth="800"
Loaded="CalculatorSettings_Loaded"
mc:Ignorable="d">
-
-
-
-
@@ -42,14 +37,10 @@
Margin="{StaticResource SettingPanelItemRightTopBottomMargin}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
- ItemsSource="{Binding Source={ui:EnumBindingSource {x:Type calculator:DecimalSeparator}}}"
- SelectedItem="{Binding Settings.DecimalSeparator}">
-
-
-
-
-
-
+ DisplayMemberPath="Display"
+ ItemsSource="{Binding AllDecimalSeparator}"
+ SelectedValue="{Binding SelectedDecimalSeparator, Mode=TwoWay}"
+ SelectedValuePath="Value" />
Date: Mon, 23 Jun 2025 12:37:58 +0800
Subject: [PATCH 1421/1798] Adjust indent
---
.../Flow.Launcher.Plugin.Calculator.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
index 73dacf3d1..719b6c74f 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
@@ -62,7 +62,7 @@
-
+
From 1b05643b64acaa357bb5f3195f933d0d1210fbf7 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 23 Jun 2025 12:38:27 +0800
Subject: [PATCH 1422/1798] Use Flow.Launcher.Localization to improve code
quality
---
.../ChromiumBookmarkLoader.cs | 8 ++---
.../Commands/BookmarkLoader.cs | 4 +--
.../FirefoxBookmarkLoader.cs | 10 +++---
...low.Launcher.Plugin.BrowserBookmark.csproj | 2 +-
.../Helper/FaviconHelper.cs | 10 +++---
.../Main.cs | 24 +++++++-------
.../Models/CustomBrowser.cs | 32 +++++++++++++++----
.../Views/CustomBrowserSetting.xaml | 7 ++--
8 files changed, 58 insertions(+), 39 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index 6e6b2e5f4..6dc0f7a9a 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -45,7 +45,7 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
}
catch (Exception ex)
{
- Main._context.API.LogException(ClassName, $"Failed to register bookmark file monitoring: {bookmarkPath}", ex);
+ Main.Context.API.LogException(ClassName, $"Failed to register bookmark file monitoring: {bookmarkPath}", ex);
continue;
}
@@ -58,7 +58,7 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
var faviconDbPath = Path.Combine(profile, "Favicons");
if (File.Exists(faviconDbPath))
{
- Main._context.API.StopwatchLogInfo(ClassName, $"Load {profileBookmarks.Count} favicons cost", () =>
+ Main.Context.API.StopwatchLogInfo(ClassName, $"Load {profileBookmarks.Count} favicons cost", () =>
{
LoadFaviconsFromDb(faviconDbPath, profileBookmarks);
});
@@ -125,7 +125,7 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
}
else
{
- Main._context.API.LogError(ClassName, $"type property not found for {subElement.GetString()}");
+ Main.Context.API.LogError(ClassName, $"type property not found for {subElement.GetString()}");
}
}
}
@@ -190,7 +190,7 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader
}
catch (Exception ex)
{
- Main._context.API.LogException(ClassName, $"Failed to extract bookmark favicon: {bookmark.Url}", ex);
+ Main.Context.API.LogException(ClassName, $"Failed to extract bookmark favicon: {bookmark.Url}", ex);
}
finally
{
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Commands/BookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Commands/BookmarkLoader.cs
index 758ce68ae..b76adae93 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Commands/BookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Commands/BookmarkLoader.cs
@@ -9,11 +9,11 @@ internal static class BookmarkLoader
{
internal static MatchResult MatchProgram(Bookmark bookmark, string queryString)
{
- var match = Main._context.API.FuzzySearch(queryString, bookmark.Name);
+ var match = Main.Context.API.FuzzySearch(queryString, bookmark.Name);
if (match.IsSearchPrecisionScoreMet())
return match;
- return Main._context.API.FuzzySearch(queryString, bookmark.Url);
+ return Main.Context.API.FuzzySearch(queryString, bookmark.Url);
}
internal static List LoadAllBookmarks(Settings setting)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index ec3b867ea..68e5d5caa 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -49,7 +49,7 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
}
catch (Exception ex)
{
- Main._context.API.LogException(ClassName, $"Failed to register Firefox bookmark file monitoring: {placesPath}", ex);
+ Main.Context.API.LogException(ClassName, $"Failed to register Firefox bookmark file monitoring: {placesPath}", ex);
return bookmarks;
}
@@ -84,7 +84,7 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
var faviconDbPath = Path.Combine(Path.GetDirectoryName(placesPath), "favicons.sqlite");
if (File.Exists(faviconDbPath))
{
- Main._context.API.StopwatchLogInfo(ClassName, $"Load {bookmarks.Count} favicons cost", () =>
+ Main.Context.API.StopwatchLogInfo(ClassName, $"Load {bookmarks.Count} favicons cost", () =>
{
LoadFaviconsFromDb(faviconDbPath, bookmarks);
});
@@ -98,7 +98,7 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
}
catch (Exception ex)
{
- Main._context.API.LogException(ClassName, $"Failed to load Firefox bookmarks: {placesPath}", ex);
+ Main.Context.API.LogException(ClassName, $"Failed to load Firefox bookmarks: {placesPath}", ex);
}
// Delete temporary file
@@ -111,7 +111,7 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
}
catch (Exception ex)
{
- Main._context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex);
+ Main.Context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex);
}
return bookmarks;
@@ -186,7 +186,7 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
}
catch (Exception ex)
{
- Main._context.API.LogException(ClassName, $"Failed to extract Firefox favicon: {bookmark.Url}", ex);
+ Main.Context.API.LogException(ClassName, $"Failed to extract Firefox favicon: {bookmark.Url}", ex);
}
finally
{
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 3fb0fa46f..bf558bc31 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -81,7 +81,6 @@
-
@@ -96,6 +95,7 @@
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
index a879dcefd..b88bd7640 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
@@ -27,9 +27,9 @@ public static class FaviconHelper
}
catch (Exception ex1)
{
- Main._context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex1);
+ Main.Context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex1);
}
- Main._context.API.LogException(ClassName, $"Failed to copy favicon DB: {dbPath}", ex);
+ Main.Context.API.LogException(ClassName, $"Failed to copy favicon DB: {dbPath}", ex);
return;
}
@@ -39,7 +39,7 @@ public static class FaviconHelper
}
catch (Exception ex)
{
- Main._context.API.LogException(ClassName, $"Failed to connect to SQLite: {tempDbPath}", ex);
+ Main.Context.API.LogException(ClassName, $"Failed to connect to SQLite: {tempDbPath}", ex);
}
// Delete temporary file
@@ -49,7 +49,7 @@ public static class FaviconHelper
}
catch (Exception ex)
{
- Main._context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex);
+ Main.Context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex);
}
}
@@ -61,7 +61,7 @@ public static class FaviconHelper
}
catch (Exception ex)
{
- Main._context.API.LogException(ClassName, $"Failed to save image: {outputPath}", ex);
+ Main.Context.API.LogException(ClassName, $"Failed to save image: {outputPath}", ex);
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
index 91ade206b..3b67e6f18 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
@@ -19,7 +19,7 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
internal static string _faviconCacheDir;
- internal static PluginInitContext _context;
+ internal static PluginInitContext Context { get; set; }
internal static Settings _settings;
@@ -29,7 +29,7 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
public void Init(PluginInitContext context)
{
- _context = context;
+ Context = context;
_settings = context.API.LoadSettingJsonStorage();
@@ -42,7 +42,7 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
private static void LoadBookmarksIfEnabled()
{
- if (_context.CurrentPluginMetadata.Disabled)
+ if (Context.CurrentPluginMetadata.Disabled)
{
// Don't load or monitor files if disabled
return;
@@ -84,7 +84,7 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
Score = BookmarkLoader.MatchProgram(c, param).Score,
Action = _ =>
{
- _context.API.OpenUrl(c.Url);
+ Context.API.OpenUrl(c.Url);
return true;
},
@@ -108,7 +108,7 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
Score = 5,
Action = _ =>
{
- _context.API.OpenUrl(c.Url);
+ Context.API.OpenUrl(c.Url);
return true;
},
ContextData = new BookmarkAttributes { Url = c.Url }
@@ -192,12 +192,12 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
public string GetTranslatedPluginTitle()
{
- return _context.API.GetTranslation("flowlauncher_plugin_browserbookmark_plugin_name");
+ return Localize.flowlauncher_plugin_browserbookmark_plugin_name();
}
public string GetTranslatedPluginDescription()
{
- return _context.API.GetTranslation("flowlauncher_plugin_browserbookmark_plugin_description");
+ return Localize.flowlauncher_plugin_browserbookmark_plugin_description();
}
public Control CreateSettingPanel()
@@ -211,22 +211,22 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
{
new()
{
- Title = _context.API.GetTranslation("flowlauncher_plugin_browserbookmark_copyurl_title"),
- SubTitle = _context.API.GetTranslation("flowlauncher_plugin_browserbookmark_copyurl_subtitle"),
+ Title = Localize.flowlauncher_plugin_browserbookmark_copyurl_title(),
+ SubTitle = Localize.flowlauncher_plugin_browserbookmark_copyurl_subtitle(),
Action = _ =>
{
try
{
- _context.API.CopyToClipboard(((BookmarkAttributes)selectedResult.ContextData).Url);
+ Context.API.CopyToClipboard(((BookmarkAttributes)selectedResult.ContextData).Url);
return true;
}
catch (Exception e)
{
var message = "Failed to set url in clipboard";
- _context.API.LogException(ClassName, message, e);
+ Context.API.LogException(ClassName, message, e);
- _context.API.ShowMsg(message);
+ Context.API.ShowMsg(message);
return false;
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/CustomBrowser.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/CustomBrowser.cs
index 74e0f299a..af1e3fee4 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/CustomBrowser.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Models/CustomBrowser.cs
@@ -1,4 +1,7 @@
-namespace Flow.Launcher.Plugin.BrowserBookmark.Models;
+using System.Collections.Generic;
+using Flow.Launcher.Localization.Attributes;
+
+namespace Flow.Launcher.Plugin.BrowserBookmark.Models;
public class CustomBrowser : BaseModel
{
@@ -11,8 +14,11 @@ public class CustomBrowser : BaseModel
get => _name;
set
{
- _name = value;
- OnPropertyChanged();
+ if (_name != value)
+ {
+ _name = value;
+ OnPropertyChanged();
+ }
}
}
@@ -21,24 +27,36 @@ public class CustomBrowser : BaseModel
get => _dataDirectoryPath;
set
{
- _dataDirectoryPath = value;
- OnPropertyChanged();
+ if (_dataDirectoryPath != value)
+ {
+ _dataDirectoryPath = value;
+ OnPropertyChanged();
+ }
}
}
+ public List AllBrowserTypes { get; } = BrowserTypeLocalized.GetValues();
+
public BrowserType BrowserType
{
get => _browserType;
set
{
- _browserType = value;
- OnPropertyChanged();
+ if (_browserType != value)
+ {
+ _browserType = value;
+ OnPropertyChanged();
+ }
}
}
}
+[EnumLocalize]
public enum BrowserType
{
+ [EnumLocalizeValue("Chromium")]
Chromium,
+
+ [EnumLocalizeValue("Firefox")]
Firefox,
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml
index 80b004ff9..f67d359bf 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Views/CustomBrowserSetting.xaml
@@ -5,7 +5,6 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Flow.Launcher.Plugin.BrowserBookmark.Models"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:ui="clr-namespace:Flow.Launcher.Infrastructure.UI;assembly=Flow.Launcher.Infrastructure"
Title="{DynamicResource flowlauncher_plugin_browserbookmark_bookmarkDataSetting}"
Width="550"
Background="{DynamicResource PopuBGColor}"
@@ -142,8 +141,10 @@
Margin="5 10 10 0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
- ItemsSource="{Binding Source={ui:EnumBindingSource {x:Type local:BrowserType}}}"
- SelectedItem="{Binding BrowserType}" />
+ DisplayMemberPath="Display"
+ ItemsSource="{Binding AllBrowserTypes}"
+ SelectedValue="{Binding BrowserType}"
+ SelectedValuePath="Value" />
Date: Mon, 23 Jun 2025 12:45:31 +0800
Subject: [PATCH 1423/1798] Use trick to get the cache directory path
---
.../Flow.Launcher.Plugin.Program.csproj | 1 -
Plugins/Flow.Launcher.Plugin.Program/Main.cs | 11 ++++++++---
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
index 99c1a12e9..7e61f19b3 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
@@ -58,7 +58,6 @@
-
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Main.cs b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
index d28845994..211afcfb0 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
@@ -6,7 +6,6 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Controls;
-using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin.Program.Programs;
using Flow.Launcher.Plugin.Program.Views;
using Flow.Launcher.Plugin.Program.Views.Models;
@@ -234,11 +233,17 @@ namespace Flow.Launcher.Plugin.Program
}
}
+ // If plugin cache directory is this: D:\\Data\\Cache\\Plugins\\Flow.Launcher.Plugin.Program
+ // then the parent directory is: D:\\Data\\Cache
+ // So we can use the parent of the parent directory to get the cache directory path
+ var directoryInfo = new DirectoryInfo(pluginCacheDirectory);
+ var cacheDirectory = directoryInfo.Parent.Parent.FullName;
+
// Move old cache files to the new cache directory
- var oldWin32CacheFile = Path.Combine(DataLocation.CacheDirectory, $"{Win32CacheName}.cache");
+ var oldWin32CacheFile = Path.Combine(cacheDirectory, $"{Win32CacheName}.cache");
var newWin32CacheFile = Path.Combine(pluginCacheDirectory, $"{Win32CacheName}.cache");
MoveFile(oldWin32CacheFile, newWin32CacheFile);
- var oldUWPCacheFile = Path.Combine(DataLocation.CacheDirectory, $"{UwpCacheName}.cache");
+ var oldUWPCacheFile = Path.Combine(cacheDirectory, $"{UwpCacheName}.cache");
var newUWPCacheFile = Path.Combine(pluginCacheDirectory, $"{UwpCacheName}.cache");
MoveFile(oldUWPCacheFile, newUWPCacheFile);
From 6143c9945497397c19ef3476c8a17ebd0c922bd1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 23 Jun 2025 12:47:44 +0800
Subject: [PATCH 1424/1798] Remove useless class
---
.../UI/EnumBindingSource.cs | 58 -------------------
1 file changed, 58 deletions(-)
delete mode 100644 Flow.Launcher.Infrastructure/UI/EnumBindingSource.cs
diff --git a/Flow.Launcher.Infrastructure/UI/EnumBindingSource.cs b/Flow.Launcher.Infrastructure/UI/EnumBindingSource.cs
deleted file mode 100644
index f9504e6d9..000000000
--- a/Flow.Launcher.Infrastructure/UI/EnumBindingSource.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System;
-using System.Windows.Markup;
-
-namespace Flow.Launcher.Infrastructure.UI
-{
- [Obsolete("EnumBindingSourceExtension is obsolete. Use with Flow.Launcher.Localization NuGet package instead.")]
- public class EnumBindingSourceExtension : MarkupExtension
- {
- private Type _enumType;
- public Type EnumType
- {
- get { return _enumType; }
- set
- {
- if (value != _enumType)
- {
- if (value != null)
- {
- Type enumType = Nullable.GetUnderlyingType(value) ?? value;
- if (!enumType.IsEnum)
- {
- throw new ArgumentException("Type must represent an enum.");
- }
- }
-
- _enumType = value;
- }
- }
- }
-
- public EnumBindingSourceExtension() { }
-
- public EnumBindingSourceExtension(Type enumType)
- {
- EnumType = enumType;
- }
-
- public override object ProvideValue(IServiceProvider serviceProvider)
- {
- if (_enumType == null)
- {
- throw new InvalidOperationException("The EnumType must be specified.");
- }
-
- Type actualEnumType = Nullable.GetUnderlyingType(_enumType) ?? _enumType;
- Array enumValues = Enum.GetValues(actualEnumType);
-
- if (actualEnumType == _enumType)
- {
- return enumValues;
- }
-
- Array tempArray = Array.CreateInstance(actualEnumType, enumValues.Length + 1);
- enumValues.CopyTo(tempArray, 1);
- return tempArray;
- }
- }
-}
From 107da050a57dca45991be856cfba3c6640e8e9c8 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 23 Jun 2025 13:02:04 +0800
Subject: [PATCH 1425/1798] Fix build issue
---
.../Flow.Launcher.Plugin.Program.csproj | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
index 7e61f19b3..16a8c03f4 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
@@ -63,11 +63,13 @@
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
+
\ No newline at end of file
From 9be2ef092476727aaf9404e0a196165df4535fbc Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 23 Jun 2025 13:03:45 +0800
Subject: [PATCH 1426/1798] Remove unused class
---
.../Resource/LocalizationConverter.cs | 38 -------------------
1 file changed, 38 deletions(-)
delete mode 100644 Flow.Launcher.Core/Resource/LocalizationConverter.cs
diff --git a/Flow.Launcher.Core/Resource/LocalizationConverter.cs b/Flow.Launcher.Core/Resource/LocalizationConverter.cs
deleted file mode 100644
index fdda33926..000000000
--- a/Flow.Launcher.Core/Resource/LocalizationConverter.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System;
-using System.ComponentModel;
-using System.Globalization;
-using System.Reflection;
-using System.Windows.Data;
-
-namespace Flow.Launcher.Core.Resource
-{
- [Obsolete("LocalizationConverter is obsolete. Use with Flow.Launcher.Localization NuGet package instead.")]
- public class LocalizationConverter : IValueConverter
- {
- public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
- {
- if (targetType == typeof(string) && value != null)
- {
- FieldInfo fi = value.GetType().GetField(value.ToString());
- if (fi != null)
- {
- string localizedDescription = string.Empty;
- var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
- if ((attributes.Length > 0) && (!String.IsNullOrEmpty(attributes[0].Description)))
- {
- localizedDescription = attributes[0].Description;
- }
-
- return (!String.IsNullOrEmpty(localizedDescription)) ? localizedDescription : value.ToString();
- }
- }
-
- return string.Empty;
- }
-
- public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
- {
- throw new NotImplementedException();
- }
- }
-}
From c4cbf941cf4a681255a39c9fc38850b178be1fde Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 23 Jun 2025 13:13:45 +0800
Subject: [PATCH 1427/1798] Add directory null check
---
Plugins/Flow.Launcher.Plugin.Program/Main.cs | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Main.cs b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
index 211afcfb0..b9187a801 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
@@ -237,15 +237,17 @@ namespace Flow.Launcher.Plugin.Program
// then the parent directory is: D:\\Data\\Cache
// So we can use the parent of the parent directory to get the cache directory path
var directoryInfo = new DirectoryInfo(pluginCacheDirectory);
- var cacheDirectory = directoryInfo.Parent.Parent.FullName;
-
- // Move old cache files to the new cache directory
- var oldWin32CacheFile = Path.Combine(cacheDirectory, $"{Win32CacheName}.cache");
- var newWin32CacheFile = Path.Combine(pluginCacheDirectory, $"{Win32CacheName}.cache");
- MoveFile(oldWin32CacheFile, newWin32CacheFile);
- var oldUWPCacheFile = Path.Combine(cacheDirectory, $"{UwpCacheName}.cache");
- var newUWPCacheFile = Path.Combine(pluginCacheDirectory, $"{UwpCacheName}.cache");
- MoveFile(oldUWPCacheFile, newUWPCacheFile);
+ var cacheDirectory = directoryInfo.Parent?.Parent?.FullName;
+ // Move old cache files to the new cache directory if cache directory exists
+ if (!string.IsNullOrEmpty(cacheDirectory))
+ {
+ var oldWin32CacheFile = Path.Combine(cacheDirectory, $"{Win32CacheName}.cache");
+ var newWin32CacheFile = Path.Combine(pluginCacheDirectory, $"{Win32CacheName}.cache");
+ MoveFile(oldWin32CacheFile, newWin32CacheFile);
+ var oldUWPCacheFile = Path.Combine(cacheDirectory, $"{UwpCacheName}.cache");
+ var newUWPCacheFile = Path.Combine(pluginCacheDirectory, $"{UwpCacheName}.cache");
+ MoveFile(oldUWPCacheFile, newUWPCacheFile);
+ }
await _win32sLock.WaitAsync();
_win32s = await context.API.LoadCacheBinaryStorageAsync(Win32CacheName, pluginCacheDirectory, new List());
From d68964bfa2e0942ae3345adecf5fe507e4bdb266 Mon Sep 17 00:00:00 2001
From: TBM13
Date: Thu, 26 Jun 2025 02:58:24 -0300
Subject: [PATCH 1428/1798] Calculator: Support hex numbers
---
Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index b1e4cd606..eb3c808e7 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -20,7 +20,7 @@ namespace Flow.Launcher.Plugin.Calculator
@"bin2dec|hex2dec|oct2dec|" +
@"factorial|sign|isprime|isinfty|" +
@"==|~=|&&|\|\||(?:\<|\>)=?|" +
- @"[ei]|[0-9]|[\+\%\-\*\/\^\., ""]|[\(\)\|\!\[\]]" +
+ @"[ei]|[0-9]|0x[\da-fA-F]+|[\+\%\-\*\/\^\., ""]|[\(\)\|\!\[\]]" +
@")+$", RegexOptions.Compiled);
private static readonly Regex RegBrackets = new Regex(@"[\(\)\[\]]", RegexOptions.Compiled);
private static Engine MagesEngine;
From c9de2f02f8f2466da2853404bdeb49056ac17d61 Mon Sep 17 00:00:00 2001
From: DB P
Date: Fri, 27 Jun 2025 18:51:51 +0900
Subject: [PATCH 1429/1798] Fix Card Error
---
Flow.Launcher/Resources/Controls/Card.xaml | 6 ++---
Flow.Launcher/Resources/Controls/Card.xaml.cs | 5 ++++-
.../Views/SettingsPaneGeneral.xaml | 22 ++++++++++++++-----
.../Views/SettingsPaneHotkey.xaml | 19 ++++++++++++++--
.../SettingPages/Views/SettingsPaneProxy.xaml | 10 ++++-----
.../SettingPages/Views/SettingsPaneTheme.xaml | 16 ++++++++++----
6 files changed, 58 insertions(+), 20 deletions(-)
diff --git a/Flow.Launcher/Resources/Controls/Card.xaml b/Flow.Launcher/Resources/Controls/Card.xaml
index 33c1299a9..e3c5f8194 100644
--- a/Flow.Launcher/Resources/Controls/Card.xaml
+++ b/Flow.Launcher/Resources/Controls/Card.xaml
@@ -38,21 +38,21 @@
-
+
-
+
-
+
diff --git a/Flow.Launcher/Resources/Controls/Card.xaml.cs b/Flow.Launcher/Resources/Controls/Card.xaml.cs
index c8f788aca..6a70dded2 100644
--- a/Flow.Launcher/Resources/Controls/Card.xaml.cs
+++ b/Flow.Launcher/Resources/Controls/Card.xaml.cs
@@ -9,7 +9,10 @@ namespace Flow.Launcher.Resources.Controls
{
Default,
Inside,
- InsideFit
+ InsideFit,
+ First,
+ Middle,
+ Last
}
public Card()
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index 7f8555d65..d114736d5 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -91,7 +91,10 @@
-
+
@@ -196,7 +200,10 @@
-
+
-
+
+ Sub="{DynamicResource KoreanImeRegistryTooltip}"
+ Type="First">
+ Sub="{DynamicResource KoreanImeOpenLinkToolTip}"
+ Type="Last">
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
index 89eb2dccd..0bf4ed8ce 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
@@ -51,7 +51,10 @@
-
+
-
+
+
+
+
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml
index f429a6e29..588f9228e 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml
@@ -32,35 +32,35 @@
TextAlignment="left" />
-
+
-
+
-
+
-
+
-
+
+ Sub="{Binding BackdropSubText}"
+ Type="First">
+ Icon=""
+ Type="Last">
-
+
-
+
Date: Fri, 27 Jun 2025 18:51:51 +0900
Subject: [PATCH 1430/1798] Fix Card Error
---
Flow.Launcher/Resources/Controls/Card.xaml | 6 ++---
Flow.Launcher/Resources/Controls/Card.xaml.cs | 5 ++++-
.../Views/SettingsPaneGeneral.xaml | 22 ++++++++++++++-----
.../Views/SettingsPaneHotkey.xaml | 19 ++++++++++++++--
.../SettingPages/Views/SettingsPaneProxy.xaml | 10 ++++-----
.../SettingPages/Views/SettingsPaneTheme.xaml | 16 ++++++++++----
6 files changed, 58 insertions(+), 20 deletions(-)
diff --git a/Flow.Launcher/Resources/Controls/Card.xaml b/Flow.Launcher/Resources/Controls/Card.xaml
index 33c1299a9..e3c5f8194 100644
--- a/Flow.Launcher/Resources/Controls/Card.xaml
+++ b/Flow.Launcher/Resources/Controls/Card.xaml
@@ -38,21 +38,21 @@
-
+
-
+
-
+
diff --git a/Flow.Launcher/Resources/Controls/Card.xaml.cs b/Flow.Launcher/Resources/Controls/Card.xaml.cs
index c8f788aca..6a70dded2 100644
--- a/Flow.Launcher/Resources/Controls/Card.xaml.cs
+++ b/Flow.Launcher/Resources/Controls/Card.xaml.cs
@@ -9,7 +9,10 @@ namespace Flow.Launcher.Resources.Controls
{
Default,
Inside,
- InsideFit
+ InsideFit,
+ First,
+ Middle,
+ Last
}
public Card()
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index 7f8555d65..d114736d5 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -91,7 +91,10 @@
-
+
@@ -196,7 +200,10 @@
-
+
-
+
+ Sub="{DynamicResource KoreanImeRegistryTooltip}"
+ Type="First">
+ Sub="{DynamicResource KoreanImeOpenLinkToolTip}"
+ Type="Last">
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
index 89eb2dccd..0bf4ed8ce 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
@@ -51,7 +51,10 @@
-
+
-
+
+
+
+
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml
index f429a6e29..7d894e1b3 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml
@@ -32,35 +32,35 @@
TextAlignment="left" />
-
+
-
+
-
+
-
+
-
+
+ Sub="{Binding BackdropSubText}"
+ Type="First">
+ Icon=""
+ Type="Last">
-
+
-
+
Date: Fri, 27 Jun 2025 19:53:09 +0900
Subject: [PATCH 1431/1798] Add Separator and margin
---
Flow.Launcher/ReleaseNotesWindow.xaml.cs | 39 ++++++++++++++++--------
1 file changed, 27 insertions(+), 12 deletions(-)
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
index 59646f35a..9a05bb46a 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml.cs
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
@@ -189,31 +189,46 @@ namespace Flow.Launcher
var releases = JsonSerializer.Deserialize>(releaseNotesJSON);
// Get the latest releases
- var latestReleases = releases.OrderByDescending(release => release.PublishedDate).Take(3);
+ var latestReleases = releases.OrderByDescending(release => release.PublishedDate).Take(3).ToList(); // .ToList()를 추가하여 인덱스로 접근 가능하게 함
// Build the release notes in Markdown format
var releaseNotesHtmlBuilder = new StringBuilder(string.Empty);
- foreach (var release in latestReleases)
+
+ for (int i = 0; i < latestReleases.Count; i++)
{
+ var release = latestReleases[i];
releaseNotesHtmlBuilder.AppendLine("# " + release.Name);
// Because MdXaml.Html package cannot correctly render images without units,
// We need to manually add unit for images
// E.g. Replace with
var notes = ImageUnitRegex().Replace(release.ReleaseNotes, m =>
- {
- var prefix = m.Groups[1].Value;
- var widthValue = m.Groups[2].Value;
- var quote = m.Groups[3].Value;
- var suffix = m.Groups[4].Value;
- // Only replace if width is number like 500 without units like 500px
- if (IsNumber(widthValue))
- return $"{prefix}{widthValue}px{quote}{suffix}";
- return m.Value;
- });
+ {
+ var prefix = m.Groups[1].Value;
+ var widthValue = m.Groups[2].Value;
+ var quote = m.Groups[3].Value;
+ var suffix = m.Groups[4].Value;
+ // Only replace if width is number like 500 without units like 500px
+ if (IsNumber(widthValue))
+ return $"{prefix}{widthValue}px{quote}{suffix}";
+ return m.Value;
+ });
releaseNotesHtmlBuilder.AppendLine(notes);
releaseNotesHtmlBuilder.AppendLine();
+
+ // If not last release note
+ if (i < latestReleases.Count - 1)
+ {
+ releaseNotesHtmlBuilder.Append(" ");
+ releaseNotesHtmlBuilder.Append("\n\n");
+
+ releaseNotesHtmlBuilder.AppendLine("---");
+
+ releaseNotesHtmlBuilder.Append("\n\n");
+ releaseNotesHtmlBuilder.Append(" ");
+ releaseNotesHtmlBuilder.Append("\n\n");
+ }
}
return releaseNotesHtmlBuilder.ToString();
From 35a38f6c33370d85cdb189c2d21f924756401eea Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 27 Jun 2025 19:16:00 +0800
Subject: [PATCH 1432/1798] Improve code comments
---
Flow.Launcher/ReleaseNotesWindow.xaml.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
index 9a05bb46a..ce7a3e084 100644
--- a/Flow.Launcher/ReleaseNotesWindow.xaml.cs
+++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs
@@ -189,7 +189,7 @@ namespace Flow.Launcher
var releases = JsonSerializer.Deserialize>(releaseNotesJSON);
// Get the latest releases
- var latestReleases = releases.OrderByDescending(release => release.PublishedDate).Take(3).ToList(); // .ToList()를 추가하여 인덱스로 접근 가능하게 함
+ var latestReleases = releases.OrderByDescending(release => release.PublishedDate).Take(3).ToList();
// Build the release notes in Markdown format
var releaseNotesHtmlBuilder = new StringBuilder(string.Empty);
@@ -217,7 +217,7 @@ namespace Flow.Launcher
releaseNotesHtmlBuilder.AppendLine(notes);
releaseNotesHtmlBuilder.AppendLine();
- // If not last release note
+ // Add separator if it is not last release note
if (i < latestReleases.Count - 1)
{
releaseNotesHtmlBuilder.Append(" ");
From bafb5d7b0a97c035160c8da1c21304cf5018d509 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 27 Jun 2025 19:38:36 +0800
Subject: [PATCH 1433/1798] Removed RenameFileHotkey
---
Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
index 0bf4ed8ce..d7f5772bb 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
@@ -210,15 +210,6 @@
-
-
-
From 71e975a68c422e0887e71b1a3f9c848ae3469e18 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Fri, 27 Jun 2025 22:58:20 +1000
Subject: [PATCH 1434/1798] Update Calculator plugin description (#3781)
---
Plugins/Flow.Launcher.Plugin.Calculator/plugin.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
index 485babd26..3168edfcc 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
@@ -2,11 +2,11 @@
"ID": "CEA0FDFC6D3B4085823D60DC76F28855",
"ActionKeyword": "*",
"Name": "Calculator",
- "Description": "Provide mathematical calculations.(Try 5*3-2 in Flow Launcher)",
+ "Description": "Perform mathematical calculations (including hexadecimal values)",
"Author": "cxfksword",
"Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Calculator.dll",
"IcoPath": "Images\\calculator.png"
-}
\ No newline at end of file
+}
From 03c1e589225cf5e46234567bbf9867d9af14b029 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 28 Jun 2025 11:00:56 +0800
Subject: [PATCH 1435/1798] Support volume type for quick access link
---
Plugins/Flow.Launcher.Plugin.Explorer/Main.cs | 2 +-
.../Search/QuickAccessLinks/QuickAccess.cs | 10 ++++++----
.../Search/ResultManager.cs | 12 +++++++++++-
.../Search/SearchManager.cs | 12 ++++++++++++
4 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
index 283820204..0d1d99f8a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
@@ -17,7 +17,7 @@ namespace Flow.Launcher.Plugin.Explorer
{
internal static PluginInitContext Context { get; set; }
- internal Settings Settings;
+ internal static Settings Settings { get; set; }
private SettingsViewModel viewModel;
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
index 85b595390..d2fa4b9ef 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
@@ -6,7 +6,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
{
internal static class QuickAccess
{
- private const int quickAccessResultScore = 100;
+ private const int QuickAccessResultScore = 100;
internal static List AccessLinkListMatched(Query query, IEnumerable accessLinks)
{
@@ -19,8 +19,9 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
.ThenBy(x => x.Name)
.Select(l => l.Type switch
{
- ResultType.Folder => ResultManager.CreateFolderResult(l.Name, l.Path, l.Path, query, quickAccessResultScore),
- ResultType.File => ResultManager.CreateFileResult(l.Path, query, quickAccessResultScore),
+ ResultType.Volume => ResultManager.CreateDriveSpaceDisplayResult(l.Path, query.ActionKeyword, QuickAccessResultScore),
+ ResultType.Folder => ResultManager.CreateFolderResult(l.Name, l.Path, l.Path, query, QuickAccessResultScore),
+ ResultType.File => ResultManager.CreateFileResult(l.Path, query, QuickAccessResultScore),
_ => throw new ArgumentOutOfRangeException()
})
.ToList();
@@ -32,8 +33,9 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
.ThenBy(x => x.Name)
.Select(l => l.Type switch
{
+ ResultType.Volume => ResultManager.CreateDriveSpaceDisplayResult(l.Path, query.ActionKeyword, QuickAccessResultScore),
ResultType.Folder => ResultManager.CreateFolderResult(l.Name, l.Path, l.Path, query),
- ResultType.File => ResultManager.CreateFileResult(l.Path, query, quickAccessResultScore),
+ ResultType.File => ResultManager.CreateFileResult(l.Path, query, QuickAccessResultScore),
_ => throw new ArgumentOutOfRangeException()
}).ToList();
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
index e87d2df97..7791a9881 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
@@ -171,7 +171,17 @@ namespace Flow.Launcher.Plugin.Explorer.Search
};
}
+ internal static Result CreateDriveSpaceDisplayResult(string path, string actionKeyword, int score)
+ {
+ return CreateDriveSpaceDisplayResult(path, actionKeyword, score, SearchManager.UseIndexSearch(path));
+ }
+
internal static Result CreateDriveSpaceDisplayResult(string path, string actionKeyword, bool windowsIndexed = false)
+ {
+ return CreateDriveSpaceDisplayResult(path, actionKeyword, 500, windowsIndexed);
+ }
+
+ private static Result CreateDriveSpaceDisplayResult(string path, string actionKeyword, int score, bool windowsIndexed = false)
{
var progressBarColor = "#26a0da";
var title = string.Empty; // hide title when use progress bar,
@@ -197,7 +207,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search
SubTitle = subtitle,
AutoCompleteText = GetPathWithActionKeyword(path, ResultType.Folder, actionKeyword),
IcoPath = path,
- Score = 500,
+ Score = score,
ProgressBar = progressValue,
ProgressBarColor = progressBarColor,
Preview = new Result.PreviewInfo
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs
index 12df6c145..f4f87d4d4 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs
@@ -246,6 +246,18 @@ namespace Flow.Launcher.Plugin.Explorer.Search
public bool IsFileContentSearch(string actionKeyword) => actionKeyword == Settings.FileContentSearchActionKeyword;
+ public static bool UseIndexSearch(string path)
+ {
+ if (Main.Settings.IndexSearchEngine is not Settings.IndexSearchEngineOption.WindowsIndex)
+ return false;
+
+ // Check if the path is using windows index search
+ var pathToDirectory = FilesFolders.ReturnPreviousDirectoryIfIncompleteString(path);
+
+ return !Main.Settings.IndexSearchExcludedSubdirectoryPaths.Any(
+ x => FilesFolders.ReturnPreviousDirectoryIfIncompleteString(pathToDirectory).StartsWith(x.Path, StringComparison.OrdinalIgnoreCase))
+ && WindowsIndex.WindowsIndex.PathIsIndexed(pathToDirectory);
+ }
private bool UseWindowsIndexForDirectorySearch(string locationPath)
{
From d6310bc4f0e129970f162ce2e54775af28d96e8a Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 28 Jun 2025 11:02:44 +0800
Subject: [PATCH 1436/1798] Add quick access result score for folder results
---
.../Search/QuickAccessLinks/QuickAccess.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
index d2fa4b9ef..32651ecb8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
@@ -34,7 +34,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
.Select(l => l.Type switch
{
ResultType.Volume => ResultManager.CreateDriveSpaceDisplayResult(l.Path, query.ActionKeyword, QuickAccessResultScore),
- ResultType.Folder => ResultManager.CreateFolderResult(l.Name, l.Path, l.Path, query),
+ ResultType.Folder => ResultManager.CreateFolderResult(l.Name, l.Path, l.Path, query, QuickAccessResultScore),
ResultType.File => ResultManager.CreateFileResult(l.Path, query, QuickAccessResultScore),
_ => throw new ArgumentOutOfRangeException()
}).ToList();
From 7c3c7680c0b8b2180ba6393300c65b5ac558a542 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 29 Jun 2025 15:47:46 +0800
Subject: [PATCH 1437/1798] Add type for card elements inside card group
---
Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index d831774fb..ac27c3b40 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -229,7 +229,8 @@
+ Sub="{DynamicResource autoRestartAfterChangingToolTip}"
+ Type="First">
+ Sub="{DynamicResource showUnknownSourceWarningToolTip}"
+ Type="Last">
Date: Sun, 29 Jun 2025 15:48:08 +0800
Subject: [PATCH 1438/1798] Move codes to new place
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 264 ----------------
.../Helper/PluginInstallationHelper.cs | 283 ++++++++++++++++++
.../SettingsPanePluginStoreViewModel.cs | 4 +-
.../ViewModel/PluginStoreItemViewModel.cs | 7 +-
Flow.Launcher/ViewModel/PluginViewModel.cs | 3 +-
5 files changed, 291 insertions(+), 270 deletions(-)
create mode 100644 Flow.Launcher/Helper/PluginInstallationHelper.cs
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index f7a2461ab..9b525f331 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -2,12 +2,10 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
-using System.IO.Compression;
using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
-using System.Windows;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Core.ExternalPlugins;
using Flow.Launcher.Infrastructure;
@@ -26,8 +24,6 @@ namespace Flow.Launcher.Core.Plugin
{
private static readonly string ClassName = nameof(PluginManager);
- private static readonly Settings FlowSettings = Ioc.Default.GetRequiredService();
-
private static IEnumerable _contextMenuPlugins;
private static IEnumerable _homePlugins;
@@ -561,213 +557,6 @@ namespace Flow.Launcher.Core.Plugin
await UninstallPluginAsync(plugin, removePluginFromSettings, removePluginSettings, true);
}
- public static async Task InstallPluginAndCheckRestartAsync(UserPlugin newPlugin)
- {
- if (API.ShowMsgBox(
- string.Format(
- API.GetTranslation("InstallPromptSubtitle"),
- newPlugin.Name, newPlugin.Author, Environment.NewLine),
- API.GetTranslation("InstallPromptTitle"),
- button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
-
- try
- {
- // at minimum should provide a name, but handle plugin that is not downloaded from plugins manifest and is a url download
- var downloadFilename = string.IsNullOrEmpty(newPlugin.Version)
- ? $"{newPlugin.Name}-{Guid.NewGuid()}.zip"
- : $"{newPlugin.Name}-{newPlugin.Version}.zip";
-
- var filePath = Path.Combine(Path.GetTempPath(), downloadFilename);
-
- using var cts = new CancellationTokenSource();
-
- if (!newPlugin.IsFromLocalInstallPath)
- {
- await DownloadFileAsync(
- $"{API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
- newPlugin.UrlDownload, filePath, cts);
- }
- else
- {
- filePath = newPlugin.LocalInstallPath;
- }
-
- // check if user cancelled download before installing plugin
- if (cts.IsCancellationRequested)
- {
- return;
- }
- else
- {
- if (!File.Exists(filePath))
- {
- throw new FileNotFoundException($"Plugin {newPlugin.ID} zip file not found at {filePath}", filePath);
- }
-
- API.InstallPlugin(newPlugin, filePath);
-
- if (!newPlugin.IsFromLocalInstallPath)
- {
- File.Delete(filePath);
- }
- }
- }
- catch (Exception e)
- {
- API.LogException(ClassName, "Failed to install plugin", e);
- API.ShowMsgError(API.GetTranslation("ErrorInstallingPlugin"));
- return; // don’t restart on failure
- }
-
- if (FlowSettings.AutoRestartAfterChanging)
- {
- API.RestartApp();
- }
- else
- {
- API.ShowMsg(
- API.GetTranslation("installbtn"),
- string.Format(
- API.GetTranslation(
- "InstallSuccessNoRestart"),
- newPlugin.Name));
- }
- }
-
- public static async Task InstallPluginAndCheckRestartAsync(string filePath)
- {
- UserPlugin plugin;
- try
- {
- using ZipArchive archive = ZipFile.OpenRead(filePath);
- var pluginJsonPath = archive.Entries.FirstOrDefault(x => x.Name == "plugin.json") ??
- throw new FileNotFoundException("The zip file does not contain a plugin.json file.");
- var pluginJsonEntry = archive.GetEntry(pluginJsonPath.ToString()) ??
- throw new FileNotFoundException("The zip file does not contain a plugin.json file.");
-
- using Stream stream = pluginJsonEntry.Open();
- plugin = JsonSerializer.Deserialize(stream);
- plugin.IcoPath = "Images\\zipfolder.png";
- plugin.LocalInstallPath = filePath;
- }
- catch (Exception e)
- {
- API.LogException(ClassName, "Failed to validate zip file", e);
- API.ShowMsgError(API.GetTranslation("ZipFileNotHavePluginJson"));
- return;
- }
-
- if (FlowSettings.ShowUnknownSourceWarning)
- {
- if (!InstallSourceKnown(plugin.Website)
- && API.ShowMsgBox(string.Format(
- API.GetTranslation("InstallFromUnknownSourceSubtitle"), Environment.NewLine),
- API.GetTranslation("InstallFromUnknownSourceTitle"),
- MessageBoxButton.YesNo) == MessageBoxResult.No)
- return;
- }
-
- await InstallPluginAndCheckRestartAsync(plugin);
- }
-
- public static async Task UninstallPluginAndCheckRestartAsync(PluginMetadata oldPlugin)
- {
- if (API.ShowMsgBox(
- string.Format(
- API.GetTranslation("UninstallPromptSubtitle"),
- oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
- API.GetTranslation("UninstallPromptTitle"),
- button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
-
- var removePluginSettings = API.ShowMsgBox(
- API.GetTranslation("KeepPluginSettingsSubtitle"),
- API.GetTranslation("KeepPluginSettingsTitle"),
- button: MessageBoxButton.YesNo) == MessageBoxResult.No;
-
- try
- {
- await API.UninstallPluginAsync(oldPlugin, removePluginSettings);
- }
- catch (Exception e)
- {
- API.LogException(ClassName, "Failed to uninstall plugin", e);
- API.ShowMsgError(API.GetTranslation("ErrorUninstallingPlugin"));
- return; // don’t restart on failure
- }
-
- if (FlowSettings.AutoRestartAfterChanging)
- {
- API.RestartApp();
- }
- else
- {
- API.ShowMsg(
- API.GetTranslation("uninstallbtn"),
- string.Format(
- API.GetTranslation(
- "UninstallSuccessNoRestart"),
- oldPlugin.Name));
- }
- }
-
- public static async Task UpdatePluginAndCheckRestartAsync(UserPlugin newPlugin, PluginMetadata oldPlugin)
- {
- if (API.ShowMsgBox(
- string.Format(
- API.GetTranslation("UpdatePromptSubtitle"),
- oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
- API.GetTranslation("UpdatePromptTitle"),
- button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
-
- try
- {
- var filePath = Path.Combine(Path.GetTempPath(), $"{newPlugin.Name}-{newPlugin.Version}.zip");
-
- using var cts = new CancellationTokenSource();
-
- if (!newPlugin.IsFromLocalInstallPath)
- {
- await DownloadFileAsync(
- $"{API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
- newPlugin.UrlDownload, filePath, cts);
- }
- else
- {
- filePath = newPlugin.LocalInstallPath;
- }
-
- // check if user cancelled download before installing plugin
- if (cts.IsCancellationRequested)
- {
- return;
- }
- else
- {
- await API.UpdatePluginAsync(oldPlugin, newPlugin, filePath);
- }
- }
- catch (Exception e)
- {
- API.LogException(ClassName, "Failed to update plugin", e);
- API.ShowMsgError(API.GetTranslation("ErrorUpdatingPlugin"));
- return; // don’t restart on failure
- }
-
- if (FlowSettings.AutoRestartAfterChanging)
- {
- API.RestartApp();
- }
- else
- {
- API.ShowMsg(
- API.GetTranslation("updatebtn"),
- string.Format(
- API.GetTranslation(
- "UpdateSuccessNoRestart"),
- newPlugin.Name));
- }
- }
-
#endregion
#region Internal functions
@@ -915,59 +704,6 @@ namespace Flow.Launcher.Core.Plugin
}
}
- internal static async Task DownloadFileAsync(string prgBoxTitle, string downloadUrl, string filePath, CancellationTokenSource cts, bool deleteFile = true, bool showProgress = true)
- {
- if (deleteFile && File.Exists(filePath))
- File.Delete(filePath);
-
- if (showProgress)
- {
- var exceptionHappened = false;
- await API.ShowProgressBoxAsync(prgBoxTitle,
- async (reportProgress) =>
- {
- if (reportProgress == null)
- {
- // when reportProgress is null, it means there is expcetion with the progress box
- // so we record it with exceptionHappened and return so that progress box will close instantly
- exceptionHappened = true;
- return;
- }
- else
- {
- await API.HttpDownloadAsync(downloadUrl, filePath, reportProgress, cts.Token).ConfigureAwait(false);
- }
- }, cts.Cancel);
-
- // if exception happened while downloading and user does not cancel downloading,
- // we need to redownload the plugin
- if (exceptionHappened && (!cts.IsCancellationRequested))
- await API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
- }
- else
- {
- await API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
- }
- }
-
- private static bool InstallSourceKnown(string url)
- {
- var pieces = url.Split('/');
-
- if (pieces.Length < 4)
- return false;
-
- var author = pieces[3];
- var acceptedSource = "https://github.com";
- var constructedUrlPart = string.Format("{0}/{1}/", acceptedSource, author);
-
- return url.StartsWith(acceptedSource) &&
- API.GetAllPlugins().Any(x =>
- !string.IsNullOrEmpty(x.Metadata.Website) &&
- x.Metadata.Website.StartsWith(constructedUrlPart)
- );
- }
-
#endregion
}
}
diff --git a/Flow.Launcher/Helper/PluginInstallationHelper.cs b/Flow.Launcher/Helper/PluginInstallationHelper.cs
new file mode 100644
index 000000000..570c5d34c
--- /dev/null
+++ b/Flow.Launcher/Helper/PluginInstallationHelper.cs
@@ -0,0 +1,283 @@
+using System;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.Helper;
+
+///
+/// Helper class for installing, updating, and uninstalling plugins.
+///
+public static class PluginInstallationHelper
+{
+ private static readonly string ClassName = nameof(PluginInstallationHelper);
+
+ private static readonly Settings Settings = Ioc.Default.GetRequiredService();
+
+ public static async Task InstallPluginAndCheckRestartAsync(UserPlugin newPlugin)
+ {
+ if (App.API.ShowMsgBox(
+ string.Format(
+ App.API.GetTranslation("InstallPromptSubtitle"),
+ newPlugin.Name, newPlugin.Author, Environment.NewLine),
+ App.API.GetTranslation("InstallPromptTitle"),
+ button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
+
+ try
+ {
+ // at minimum should provide a name, but handle plugin that is not downloaded from plugins manifest and is a url download
+ var downloadFilename = string.IsNullOrEmpty(newPlugin.Version)
+ ? $"{newPlugin.Name}-{Guid.NewGuid()}.zip"
+ : $"{newPlugin.Name}-{newPlugin.Version}.zip";
+
+ var filePath = Path.Combine(Path.GetTempPath(), downloadFilename);
+
+ using var cts = new CancellationTokenSource();
+
+ if (!newPlugin.IsFromLocalInstallPath)
+ {
+ await DownloadFileAsync(
+ $"{App.API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
+ newPlugin.UrlDownload, filePath, cts);
+ }
+ else
+ {
+ filePath = newPlugin.LocalInstallPath;
+ }
+
+ // check if user cancelled download before installing plugin
+ if (cts.IsCancellationRequested)
+ {
+ return;
+ }
+ else
+ {
+ if (!File.Exists(filePath))
+ {
+ throw new FileNotFoundException($"Plugin {newPlugin.ID} zip file not found at {filePath}", filePath);
+ }
+
+ App.API.InstallPlugin(newPlugin, filePath);
+
+ if (!newPlugin.IsFromLocalInstallPath)
+ {
+ File.Delete(filePath);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ App.API.LogException(ClassName, "Failed to install plugin", e);
+ App.API.ShowMsgError(App.API.GetTranslation("ErrorInstallingPlugin"));
+ return; // don’t restart on failure
+ }
+
+ if (Settings.AutoRestartAfterChanging)
+ {
+ App.API.RestartApp();
+ }
+ else
+ {
+ App.API.ShowMsg(
+ App.API.GetTranslation("installbtn"),
+ string.Format(
+ App.API.GetTranslation(
+ "InstallSuccessNoRestart"),
+ newPlugin.Name));
+ }
+ }
+
+ public static async Task InstallPluginAndCheckRestartAsync(string filePath)
+ {
+ UserPlugin plugin;
+ try
+ {
+ using ZipArchive archive = ZipFile.OpenRead(filePath);
+ var pluginJsonPath = archive.Entries.FirstOrDefault(x => x.Name == "plugin.json") ??
+ throw new FileNotFoundException("The zip file does not contain a plugin.json file.");
+ var pluginJsonEntry = archive.GetEntry(pluginJsonPath.ToString()) ??
+ throw new FileNotFoundException("The zip file does not contain a plugin.json file.");
+
+ using Stream stream = pluginJsonEntry.Open();
+ plugin = JsonSerializer.Deserialize(stream);
+ plugin.IcoPath = "Images\\zipfolder.png";
+ plugin.LocalInstallPath = filePath;
+ }
+ catch (Exception e)
+ {
+ App.API.LogException(ClassName, "Failed to validate zip file", e);
+ App.API.ShowMsgError(App.API.GetTranslation("ZipFileNotHavePluginJson"));
+ return;
+ }
+
+ if (Settings.ShowUnknownSourceWarning)
+ {
+ if (!InstallSourceKnown(plugin.Website)
+ && App.API.ShowMsgBox(string.Format(
+ App.API.GetTranslation("InstallFromUnknownSourceSubtitle"), Environment.NewLine),
+ App.API.GetTranslation("InstallFromUnknownSourceTitle"),
+ MessageBoxButton.YesNo) == MessageBoxResult.No)
+ return;
+ }
+
+ await InstallPluginAndCheckRestartAsync(plugin);
+ }
+
+ public static async Task UninstallPluginAndCheckRestartAsync(PluginMetadata oldPlugin)
+ {
+ if (App.API.ShowMsgBox(
+ string.Format(
+ App.API.GetTranslation("UninstallPromptSubtitle"),
+ oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
+ App.API.GetTranslation("UninstallPromptTitle"),
+ button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
+
+ var removePluginSettings = App.API.ShowMsgBox(
+ App.API.GetTranslation("KeepPluginSettingsSubtitle"),
+ App.API.GetTranslation("KeepPluginSettingsTitle"),
+ button: MessageBoxButton.YesNo) == MessageBoxResult.No;
+
+ try
+ {
+ await App.API.UninstallPluginAsync(oldPlugin, removePluginSettings);
+ }
+ catch (Exception e)
+ {
+ App.API.LogException(ClassName, "Failed to uninstall plugin", e);
+ App.API.ShowMsgError(App.API.GetTranslation("ErrorUninstallingPlugin"));
+ return; // don’t restart on failure
+ }
+
+ if (Settings.AutoRestartAfterChanging)
+ {
+ App.API.RestartApp();
+ }
+ else
+ {
+ App.API.ShowMsg(
+ App.API.GetTranslation("uninstallbtn"),
+ string.Format(
+ App.API.GetTranslation(
+ "UninstallSuccessNoRestart"),
+ oldPlugin.Name));
+ }
+ }
+
+ public static async Task UpdatePluginAndCheckRestartAsync(UserPlugin newPlugin, PluginMetadata oldPlugin)
+ {
+ if (App.API.ShowMsgBox(
+ string.Format(
+ App.API.GetTranslation("UpdatePromptSubtitle"),
+ oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
+ App.API.GetTranslation("UpdatePromptTitle"),
+ button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
+
+ try
+ {
+ var filePath = Path.Combine(Path.GetTempPath(), $"{newPlugin.Name}-{newPlugin.Version}.zip");
+
+ using var cts = new CancellationTokenSource();
+
+ if (!newPlugin.IsFromLocalInstallPath)
+ {
+ await DownloadFileAsync(
+ $"{App.API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
+ newPlugin.UrlDownload, filePath, cts);
+ }
+ else
+ {
+ filePath = newPlugin.LocalInstallPath;
+ }
+
+ // check if user cancelled download before installing plugin
+ if (cts.IsCancellationRequested)
+ {
+ return;
+ }
+ else
+ {
+ await App.API.UpdatePluginAsync(oldPlugin, newPlugin, filePath);
+ }
+ }
+ catch (Exception e)
+ {
+ App.API.LogException(ClassName, "Failed to update plugin", e);
+ App.API.ShowMsgError(App.API.GetTranslation("ErrorUpdatingPlugin"));
+ return; // don’t restart on failure
+ }
+
+ if (Settings.AutoRestartAfterChanging)
+ {
+ App.API.RestartApp();
+ }
+ else
+ {
+ App.API.ShowMsg(
+ App.API.GetTranslation("updatebtn"),
+ string.Format(
+ App.API.GetTranslation(
+ "UpdateSuccessNoRestart"),
+ newPlugin.Name));
+ }
+ }
+
+ private static async Task DownloadFileAsync(string prgBoxTitle, string downloadUrl, string filePath, CancellationTokenSource cts, bool deleteFile = true, bool showProgress = true)
+ {
+ if (deleteFile && File.Exists(filePath))
+ File.Delete(filePath);
+
+ if (showProgress)
+ {
+ var exceptionHappened = false;
+ await App.API.ShowProgressBoxAsync(prgBoxTitle,
+ async (reportProgress) =>
+ {
+ if (reportProgress == null)
+ {
+ // when reportProgress is null, it means there is expcetion with the progress box
+ // so we record it with exceptionHappened and return so that progress box will close instantly
+ exceptionHappened = true;
+ return;
+ }
+ else
+ {
+ await App.API.HttpDownloadAsync(downloadUrl, filePath, reportProgress, cts.Token).ConfigureAwait(false);
+ }
+ }, cts.Cancel);
+
+ // if exception happened while downloading and user does not cancel downloading,
+ // we need to redownload the plugin
+ if (exceptionHappened && (!cts.IsCancellationRequested))
+ await App.API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
+ }
+ else
+ {
+ await App.API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
+ }
+ }
+
+ private static bool InstallSourceKnown(string url)
+ {
+ var pieces = url.Split('/');
+
+ if (pieces.Length < 4)
+ return false;
+
+ var author = pieces[3];
+ var acceptedSource = "https://github.com";
+ var constructedUrlPart = string.Format("{0}/{1}/", acceptedSource, author);
+
+ return url.StartsWith(acceptedSource) &&
+ App.API.GetAllPlugins().Any(x =>
+ !string.IsNullOrEmpty(x.Metadata.Website) &&
+ x.Metadata.Website.StartsWith(constructedUrlPart)
+ );
+ }
+}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
index b9b7c12fa..bce7201b8 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
@@ -4,7 +4,7 @@ using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using CommunityToolkit.Mvvm.Input;
-using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Helper;
using Flow.Launcher.Plugin;
using Flow.Launcher.ViewModel;
@@ -107,7 +107,7 @@ public partial class SettingsPanePluginStoreViewModel : BaseModel
$"{App.API.GetTranslation("ZipFiles")} (*.zip)|*.zip");
if (!string.IsNullOrEmpty(file))
- await PluginManager.InstallPluginAndCheckRestartAsync(file);
+ await PluginInstallationHelper.InstallPluginAndCheckRestartAsync(file);
}
private static string GetFileFromDialog(string title, string filter = "")
diff --git a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
index a504b7a05..f03d2740e 100644
--- a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
@@ -2,6 +2,7 @@
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Helper;
using Flow.Launcher.Plugin;
using Version = SemanticVersioning.Version;
@@ -65,13 +66,13 @@ namespace Flow.Launcher.ViewModel
switch (action)
{
case "install":
- await PluginManager.InstallPluginAndCheckRestartAsync(_newPlugin);
+ await PluginInstallationHelper.InstallPluginAndCheckRestartAsync(_newPlugin);
break;
case "uninstall":
- await PluginManager.UninstallPluginAndCheckRestartAsync(_oldPluginPair.Metadata);
+ await PluginInstallationHelper.UninstallPluginAndCheckRestartAsync(_oldPluginPair.Metadata);
break;
case "update":
- await PluginManager.UpdatePluginAndCheckRestartAsync(_newPlugin, _oldPluginPair.Metadata);
+ await PluginInstallationHelper.UpdatePluginAndCheckRestartAsync(_newPlugin, _oldPluginPair.Metadata);
break;
default:
break;
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index f902fb037..131972e85 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -5,6 +5,7 @@ using System.Windows.Media;
using CommunityToolkit.Mvvm.DependencyInjection;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure.Image;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
@@ -172,7 +173,7 @@ namespace Flow.Launcher.ViewModel
[RelayCommand]
private async Task OpenDeletePluginWindowAsync()
{
- await PluginManager.UninstallPluginAndCheckRestartAsync(PluginPair.Metadata);
+ await PluginInstallationHelper.UninstallPluginAndCheckRestartAsync(PluginPair.Metadata);
}
[RelayCommand]
From 135fd03f88d78e85f2b3471396c58be0c8740de1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 29 Jun 2025 15:58:52 +0800
Subject: [PATCH 1439/1798] Improve code quality
---
.../Helper/PluginInstallationHelper.cs | 24 ++++++++-----------
1 file changed, 10 insertions(+), 14 deletions(-)
diff --git a/Flow.Launcher/Helper/PluginInstallationHelper.cs b/Flow.Launcher/Helper/PluginInstallationHelper.cs
index 570c5d34c..d7ce2934c 100644
--- a/Flow.Launcher/Helper/PluginInstallationHelper.cs
+++ b/Flow.Launcher/Helper/PluginInstallationHelper.cs
@@ -57,19 +57,17 @@ public static class PluginInstallationHelper
{
return;
}
- else
+
+ if (!File.Exists(filePath))
{
- if (!File.Exists(filePath))
- {
- throw new FileNotFoundException($"Plugin {newPlugin.ID} zip file not found at {filePath}", filePath);
- }
+ throw new FileNotFoundException($"Plugin {newPlugin.ID} zip file not found at {filePath}", filePath);
+ }
- App.API.InstallPlugin(newPlugin, filePath);
+ App.API.InstallPlugin(newPlugin, filePath);
- if (!newPlugin.IsFromLocalInstallPath)
- {
- File.Delete(filePath);
- }
+ if (!newPlugin.IsFromLocalInstallPath)
+ {
+ File.Delete(filePath);
}
}
catch (Exception e)
@@ -201,10 +199,8 @@ public static class PluginInstallationHelper
{
return;
}
- else
- {
- await App.API.UpdatePluginAsync(oldPlugin, newPlugin, filePath);
- }
+
+ await App.API.UpdatePluginAsync(oldPlugin, newPlugin, filePath);
}
catch (Exception e)
{
From c5dd19ef300acc396c2a0d037ebb52f5aa288864 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 29 Jun 2025 16:03:19 +0800
Subject: [PATCH 1440/1798] Use Microsoft.Win32.OpenFileDialog instead
---
.../ViewModels/SettingsPanePluginStoreViewModel.cs | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
index bce7201b8..2b12ba70f 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using System.Windows.Forms;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Helper;
using Flow.Launcher.Plugin;
@@ -112,7 +111,7 @@ public partial class SettingsPanePluginStoreViewModel : BaseModel
private static string GetFileFromDialog(string title, string filter = "")
{
- var dlg = new OpenFileDialog
+ var dlg = new Microsoft.Win32.OpenFileDialog
{
InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\Downloads",
Multiselect = false,
@@ -121,12 +120,11 @@ public partial class SettingsPanePluginStoreViewModel : BaseModel
Title = title,
Filter = filter
};
+ var result = dlg.ShowDialog();
+ if (result == true)
+ return dlg.FileName;
- return dlg.ShowDialog() switch
- {
- DialogResult.OK => dlg.FileName,
- _ => string.Empty
- };
+ return string.Empty;
}
public bool SatisfiesFilter(PluginStoreItemViewModel plugin)
From 104b4b26805196bfb6c43327dac9bdf05b0d0266 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 29 Jun 2025 16:09:06 +0800
Subject: [PATCH 1441/1798] Improve code quality
---
Flow.Launcher/Helper/PluginInstallationHelper.cs | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/Flow.Launcher/Helper/PluginInstallationHelper.cs b/Flow.Launcher/Helper/PluginInstallationHelper.cs
index d7ce2934c..0d3d2df67 100644
--- a/Flow.Launcher/Helper/PluginInstallationHelper.cs
+++ b/Flow.Launcher/Helper/PluginInstallationHelper.cs
@@ -98,9 +98,7 @@ public static class PluginInstallationHelper
try
{
using ZipArchive archive = ZipFile.OpenRead(filePath);
- var pluginJsonPath = archive.Entries.FirstOrDefault(x => x.Name == "plugin.json") ??
- throw new FileNotFoundException("The zip file does not contain a plugin.json file.");
- var pluginJsonEntry = archive.GetEntry(pluginJsonPath.ToString()) ??
+ var pluginJsonEntry = archive.Entries.FirstOrDefault(x => x.Name == "plugin.json") ??
throw new FileNotFoundException("The zip file does not contain a plugin.json file.");
using Stream stream = pluginJsonEntry.Open();
From 3e9e91d71c8b0f9d63a9c7b97acb89aa6cd4d394 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 29 Jun 2025 16:24:21 +0800
Subject: [PATCH 1442/1798] Fix possible exception when extracting zip file
---
.../Languages/en.xaml | 3 +++
.../PluginsManager.cs | 26 +++++++++++++++++++
.../Utilities.cs | 4 +--
3 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
index 573ca9051..bb0d6e5fb 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
@@ -46,6 +46,9 @@
{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ Invalid zip installer file
+ Please check if there is plugin.json in {0}
+
Plugins ManagerManagement of installing, uninstalling or updating Flow Launcher plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 25182f6d3..6ccd781c3 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -242,6 +242,18 @@ namespace Flow.Launcher.Plugin.PluginsManager
if (FilesFolders.IsZipFilePath(search, checkFileExists: true))
{
pluginFromLocalPath = Utilities.GetPluginInfoFromZip(search);
+
+ if (pluginFromLocalPath == null) return new List
+ {
+ new()
+ {
+ Title = Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_title"),
+ SubTitle = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_subtitle"),
+ search),
+ IcoPath = icoPath
+ }
+ };
+
pluginFromLocalPath.LocalInstallPath = search;
updateFromLocalPath = true;
}
@@ -559,6 +571,20 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
var plugin = Utilities.GetPluginInfoFromZip(localPath);
+ if (plugin == null)
+ {
+ return new List
+ {
+ new()
+ {
+ Title = Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_title"),
+ SubTitle = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_subtitle"),
+ localPath),
+ IcoPath = icoPath
+ }
+ };
+ }
+
plugin.LocalInstallPath = localPath;
return new List
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs
index 4bb78f6ff..d76ce40c4 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs
@@ -65,9 +65,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
using (ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(filePath))
{
- var pluginJsonPath = archive.Entries.FirstOrDefault(x => x.Name == "plugin.json").ToString();
- ZipArchiveEntry pluginJsonEntry = archive.GetEntry(pluginJsonPath);
-
+ var pluginJsonEntry = archive.Entries.FirstOrDefault(x => x.Name == "plugin.json");
if (pluginJsonEntry != null)
{
using Stream stream = pluginJsonEntry.Open();
From a3a0c59fa3e2c3372a7c08f51d522a4a6e49149e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 29 Jun 2025 16:29:45 +0800
Subject: [PATCH 1443/1798] Check url nullability
---
Flow.Launcher/Helper/PluginInstallationHelper.cs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Flow.Launcher/Helper/PluginInstallationHelper.cs b/Flow.Launcher/Helper/PluginInstallationHelper.cs
index 0d3d2df67..0e94566b8 100644
--- a/Flow.Launcher/Helper/PluginInstallationHelper.cs
+++ b/Flow.Launcher/Helper/PluginInstallationHelper.cs
@@ -259,6 +259,9 @@ public static class PluginInstallationHelper
private static bool InstallSourceKnown(string url)
{
+ if (string.IsNullOrEmpty(url))
+ return false;
+
var pieces = url.Split('/');
if (pieces.Length < 4)
From bdb3616977529f256d312486b23c54687603a3f7 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 29 Jun 2025 16:34:18 +0800
Subject: [PATCH 1444/1798] Improve string resource
---
Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
index bb0d6e5fb..742d5d8b9 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
@@ -47,7 +47,7 @@
Plugin {0} has already been modified. Please restart Flow before making any further changes.Invalid zip installer file
- Please check if there is plugin.json in {0}
+ Please check if there is a plugin.json in {0}Plugins Manager
From 8e6a410cfcd6ebe56b893797bc4ba646e73c8ba7 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 29 Jun 2025 17:06:29 +0800
Subject: [PATCH 1445/1798] Use url host
---
Flow.Launcher/Helper/PluginInstallationHelper.cs | 13 ++++++++-----
.../PluginsManager.cs | 13 ++++++++-----
2 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/Flow.Launcher/Helper/PluginInstallationHelper.cs b/Flow.Launcher/Helper/PluginInstallationHelper.cs
index 0e94566b8..ea5f07bda 100644
--- a/Flow.Launcher/Helper/PluginInstallationHelper.cs
+++ b/Flow.Launcher/Helper/PluginInstallationHelper.cs
@@ -268,13 +268,16 @@ public static class PluginInstallationHelper
return false;
var author = pieces[3];
+ var acceptedHost = "github.com";
var acceptedSource = "https://github.com";
var constructedUrlPart = string.Format("{0}/{1}/", acceptedSource, author);
- return url.StartsWith(acceptedSource) &&
- App.API.GetAllPlugins().Any(x =>
- !string.IsNullOrEmpty(x.Metadata.Website) &&
- x.Metadata.Website.StartsWith(constructedUrlPart)
- );
+ if (!Uri.TryCreate(url, UriKind.Absolute, out var uri) || uri.Host != acceptedHost)
+ return false;
+
+ return App.API.GetAllPlugins().Any(x =>
+ !string.IsNullOrEmpty(x.Metadata.Website) &&
+ x.Metadata.Website.StartsWith(constructedUrlPart)
+ );
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 6ccd781c3..c7c3ff3a2 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -626,14 +626,17 @@ namespace Flow.Launcher.Plugin.PluginsManager
return false;
var author = pieces[3];
+ var acceptedHost = "github.com";
var acceptedSource = "https://github.com";
var constructedUrlPart = string.Format("{0}/{1}/", acceptedSource, author);
- return url.StartsWith(acceptedSource) &&
- Context.API.GetAllPlugins().Any(x =>
- !string.IsNullOrEmpty(x.Metadata.Website) &&
- x.Metadata.Website.StartsWith(constructedUrlPart)
- );
+ if (!Uri.TryCreate(url, UriKind.Absolute, out var uri) || uri.Host != acceptedHost)
+ return false;
+
+ return Context.API.GetAllPlugins().Any(x =>
+ !string.IsNullOrEmpty(x.Metadata.Website) &&
+ x.Metadata.Website.StartsWith(constructedUrlPart)
+ );
}
internal async ValueTask> RequestInstallOrUpdateAsync(string search, CancellationToken token,
From 19cb3eaf6a52f651986301b06de0246ed6e9ee90 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 29 Jun 2025 18:20:47 +0800
Subject: [PATCH 1446/1798] Fix typos
---
Flow.Launcher/Helper/PluginInstallationHelper.cs | 2 +-
Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/Helper/PluginInstallationHelper.cs b/Flow.Launcher/Helper/PluginInstallationHelper.cs
index ea5f07bda..ea8195e57 100644
--- a/Flow.Launcher/Helper/PluginInstallationHelper.cs
+++ b/Flow.Launcher/Helper/PluginInstallationHelper.cs
@@ -235,7 +235,7 @@ public static class PluginInstallationHelper
{
if (reportProgress == null)
{
- // when reportProgress is null, it means there is expcetion with the progress box
+ // when reportProgress is null, it means there is exception with the progress box
// so we record it with exceptionHappened and return so that progress box will close instantly
exceptionHappened = true;
return;
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index c7c3ff3a2..c1d3a81a2 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -209,7 +209,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
if (reportProgress == null)
{
- // when reportProgress is null, it means there is expcetion with the progress box
+ // when reportProgress is null, it means there is exception with the progress box
// so we record it with exceptionHappened and return so that progress box will close instantly
exceptionHappened = true;
return;
From 9e868e7e3fec02ac340b79cc1f9d505d33616176 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 29 Jun 2025 22:35:14 +0800
Subject: [PATCH 1447/1798] Move plugin installer location
---
.../Plugin/PluginInstaller.cs | 100 +++++++++---------
.../SettingsPanePluginStoreViewModel.cs | 4 +-
.../ViewModel/PluginStoreItemViewModel.cs | 6 +-
Flow.Launcher/ViewModel/PluginViewModel.cs | 3 +-
.../ViewModel/SelectBrowserViewModel.cs | 1 -
5 files changed, 58 insertions(+), 56 deletions(-)
rename Flow.Launcher/Helper/PluginInstallationHelper.cs => Flow.Launcher.Core/Plugin/PluginInstaller.cs (71%)
diff --git a/Flow.Launcher/Helper/PluginInstallationHelper.cs b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
similarity index 71%
rename from Flow.Launcher/Helper/PluginInstallationHelper.cs
rename to Flow.Launcher.Core/Plugin/PluginInstaller.cs
index ea8195e57..a69ab322e 100644
--- a/Flow.Launcher/Helper/PluginInstallationHelper.cs
+++ b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
@@ -10,24 +10,28 @@ using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
-namespace Flow.Launcher.Helper;
+namespace Flow.Launcher.Core.Plugin;
///
/// Helper class for installing, updating, and uninstalling plugins.
///
-public static class PluginInstallationHelper
+public static class PluginInstaller
{
- private static readonly string ClassName = nameof(PluginInstallationHelper);
+ private static readonly string ClassName = nameof(PluginInstaller);
private static readonly Settings Settings = Ioc.Default.GetRequiredService();
+ // We should not initialize API in static constructor because it will create another API instance
+ private static IPublicAPI api = null;
+ private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService();
+
public static async Task InstallPluginAndCheckRestartAsync(UserPlugin newPlugin)
{
- if (App.API.ShowMsgBox(
+ if (API.ShowMsgBox(
string.Format(
- App.API.GetTranslation("InstallPromptSubtitle"),
+ API.GetTranslation("InstallPromptSubtitle"),
newPlugin.Name, newPlugin.Author, Environment.NewLine),
- App.API.GetTranslation("InstallPromptTitle"),
+ API.GetTranslation("InstallPromptTitle"),
button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
try
@@ -44,7 +48,7 @@ public static class PluginInstallationHelper
if (!newPlugin.IsFromLocalInstallPath)
{
await DownloadFileAsync(
- $"{App.API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
+ $"{API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
newPlugin.UrlDownload, filePath, cts);
}
else
@@ -63,7 +67,7 @@ public static class PluginInstallationHelper
throw new FileNotFoundException($"Plugin {newPlugin.ID} zip file not found at {filePath}", filePath);
}
- App.API.InstallPlugin(newPlugin, filePath);
+ API.InstallPlugin(newPlugin, filePath);
if (!newPlugin.IsFromLocalInstallPath)
{
@@ -72,21 +76,21 @@ public static class PluginInstallationHelper
}
catch (Exception e)
{
- App.API.LogException(ClassName, "Failed to install plugin", e);
- App.API.ShowMsgError(App.API.GetTranslation("ErrorInstallingPlugin"));
+ API.LogException(ClassName, "Failed to install plugin", e);
+ API.ShowMsgError(API.GetTranslation("ErrorInstallingPlugin"));
return; // don’t restart on failure
}
if (Settings.AutoRestartAfterChanging)
{
- App.API.RestartApp();
+ API.RestartApp();
}
else
{
- App.API.ShowMsg(
- App.API.GetTranslation("installbtn"),
+ API.ShowMsg(
+ API.GetTranslation("installbtn"),
string.Format(
- App.API.GetTranslation(
+ API.GetTranslation(
"InstallSuccessNoRestart"),
newPlugin.Name));
}
@@ -108,17 +112,17 @@ public static class PluginInstallationHelper
}
catch (Exception e)
{
- App.API.LogException(ClassName, "Failed to validate zip file", e);
- App.API.ShowMsgError(App.API.GetTranslation("ZipFileNotHavePluginJson"));
+ API.LogException(ClassName, "Failed to validate zip file", e);
+ API.ShowMsgError(API.GetTranslation("ZipFileNotHavePluginJson"));
return;
}
if (Settings.ShowUnknownSourceWarning)
{
if (!InstallSourceKnown(plugin.Website)
- && App.API.ShowMsgBox(string.Format(
- App.API.GetTranslation("InstallFromUnknownSourceSubtitle"), Environment.NewLine),
- App.API.GetTranslation("InstallFromUnknownSourceTitle"),
+ && API.ShowMsgBox(string.Format(
+ API.GetTranslation("InstallFromUnknownSourceSubtitle"), Environment.NewLine),
+ API.GetTranslation("InstallFromUnknownSourceTitle"),
MessageBoxButton.YesNo) == MessageBoxResult.No)
return;
}
@@ -128,39 +132,39 @@ public static class PluginInstallationHelper
public static async Task UninstallPluginAndCheckRestartAsync(PluginMetadata oldPlugin)
{
- if (App.API.ShowMsgBox(
+ if (API.ShowMsgBox(
string.Format(
- App.API.GetTranslation("UninstallPromptSubtitle"),
+ API.GetTranslation("UninstallPromptSubtitle"),
oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
- App.API.GetTranslation("UninstallPromptTitle"),
+ API.GetTranslation("UninstallPromptTitle"),
button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
- var removePluginSettings = App.API.ShowMsgBox(
- App.API.GetTranslation("KeepPluginSettingsSubtitle"),
- App.API.GetTranslation("KeepPluginSettingsTitle"),
+ var removePluginSettings = API.ShowMsgBox(
+ API.GetTranslation("KeepPluginSettingsSubtitle"),
+ API.GetTranslation("KeepPluginSettingsTitle"),
button: MessageBoxButton.YesNo) == MessageBoxResult.No;
try
{
- await App.API.UninstallPluginAsync(oldPlugin, removePluginSettings);
+ await API.UninstallPluginAsync(oldPlugin, removePluginSettings);
}
catch (Exception e)
{
- App.API.LogException(ClassName, "Failed to uninstall plugin", e);
- App.API.ShowMsgError(App.API.GetTranslation("ErrorUninstallingPlugin"));
+ API.LogException(ClassName, "Failed to uninstall plugin", e);
+ API.ShowMsgError(API.GetTranslation("ErrorUninstallingPlugin"));
return; // don’t restart on failure
}
if (Settings.AutoRestartAfterChanging)
{
- App.API.RestartApp();
+ API.RestartApp();
}
else
{
- App.API.ShowMsg(
- App.API.GetTranslation("uninstallbtn"),
+ API.ShowMsg(
+ API.GetTranslation("uninstallbtn"),
string.Format(
- App.API.GetTranslation(
+ API.GetTranslation(
"UninstallSuccessNoRestart"),
oldPlugin.Name));
}
@@ -168,11 +172,11 @@ public static class PluginInstallationHelper
public static async Task UpdatePluginAndCheckRestartAsync(UserPlugin newPlugin, PluginMetadata oldPlugin)
{
- if (App.API.ShowMsgBox(
+ if (API.ShowMsgBox(
string.Format(
- App.API.GetTranslation("UpdatePromptSubtitle"),
+ API.GetTranslation("UpdatePromptSubtitle"),
oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
- App.API.GetTranslation("UpdatePromptTitle"),
+ API.GetTranslation("UpdatePromptTitle"),
button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
try
@@ -184,7 +188,7 @@ public static class PluginInstallationHelper
if (!newPlugin.IsFromLocalInstallPath)
{
await DownloadFileAsync(
- $"{App.API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
+ $"{API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
newPlugin.UrlDownload, filePath, cts);
}
else
@@ -198,25 +202,25 @@ public static class PluginInstallationHelper
return;
}
- await App.API.UpdatePluginAsync(oldPlugin, newPlugin, filePath);
+ await API.UpdatePluginAsync(oldPlugin, newPlugin, filePath);
}
catch (Exception e)
{
- App.API.LogException(ClassName, "Failed to update plugin", e);
- App.API.ShowMsgError(App.API.GetTranslation("ErrorUpdatingPlugin"));
+ API.LogException(ClassName, "Failed to update plugin", e);
+ API.ShowMsgError(API.GetTranslation("ErrorUpdatingPlugin"));
return; // don’t restart on failure
}
if (Settings.AutoRestartAfterChanging)
{
- App.API.RestartApp();
+ API.RestartApp();
}
else
{
- App.API.ShowMsg(
- App.API.GetTranslation("updatebtn"),
+ API.ShowMsg(
+ API.GetTranslation("updatebtn"),
string.Format(
- App.API.GetTranslation(
+ API.GetTranslation(
"UpdateSuccessNoRestart"),
newPlugin.Name));
}
@@ -230,7 +234,7 @@ public static class PluginInstallationHelper
if (showProgress)
{
var exceptionHappened = false;
- await App.API.ShowProgressBoxAsync(prgBoxTitle,
+ await API.ShowProgressBoxAsync(prgBoxTitle,
async (reportProgress) =>
{
if (reportProgress == null)
@@ -242,18 +246,18 @@ public static class PluginInstallationHelper
}
else
{
- await App.API.HttpDownloadAsync(downloadUrl, filePath, reportProgress, cts.Token).ConfigureAwait(false);
+ await API.HttpDownloadAsync(downloadUrl, filePath, reportProgress, cts.Token).ConfigureAwait(false);
}
}, cts.Cancel);
// if exception happened while downloading and user does not cancel downloading,
// we need to redownload the plugin
if (exceptionHappened && (!cts.IsCancellationRequested))
- await App.API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
+ await API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
}
else
{
- await App.API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
+ await API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
}
}
@@ -275,7 +279,7 @@ public static class PluginInstallationHelper
if (!Uri.TryCreate(url, UriKind.Absolute, out var uri) || uri.Host != acceptedHost)
return false;
- return App.API.GetAllPlugins().Any(x =>
+ return API.GetAllPlugins().Any(x =>
!string.IsNullOrEmpty(x.Metadata.Website) &&
x.Metadata.Website.StartsWith(constructedUrlPart)
);
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
index 2b12ba70f..efe67d016 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Input;
-using Flow.Launcher.Helper;
+using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Plugin;
using Flow.Launcher.ViewModel;
@@ -106,7 +106,7 @@ public partial class SettingsPanePluginStoreViewModel : BaseModel
$"{App.API.GetTranslation("ZipFiles")} (*.zip)|*.zip");
if (!string.IsNullOrEmpty(file))
- await PluginInstallationHelper.InstallPluginAndCheckRestartAsync(file);
+ await PluginInstaller.InstallPluginAndCheckRestartAsync(file);
}
private static string GetFileFromDialog(string title, string filter = "")
diff --git a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
index f03d2740e..a985ca7ff 100644
--- a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
@@ -66,13 +66,13 @@ namespace Flow.Launcher.ViewModel
switch (action)
{
case "install":
- await PluginInstallationHelper.InstallPluginAndCheckRestartAsync(_newPlugin);
+ await PluginInstaller.InstallPluginAndCheckRestartAsync(_newPlugin);
break;
case "uninstall":
- await PluginInstallationHelper.UninstallPluginAndCheckRestartAsync(_oldPluginPair.Metadata);
+ await PluginInstaller.UninstallPluginAndCheckRestartAsync(_oldPluginPair.Metadata);
break;
case "update":
- await PluginInstallationHelper.UpdatePluginAndCheckRestartAsync(_newPlugin, _oldPluginPair.Metadata);
+ await PluginInstaller.UpdatePluginAndCheckRestartAsync(_newPlugin, _oldPluginPair.Metadata);
break;
default:
break;
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index 131972e85..ea222d023 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -5,7 +5,6 @@ using System.Windows.Media;
using CommunityToolkit.Mvvm.DependencyInjection;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core.Plugin;
-using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure.Image;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
@@ -173,7 +172,7 @@ namespace Flow.Launcher.ViewModel
[RelayCommand]
private async Task OpenDeletePluginWindowAsync()
{
- await PluginInstallationHelper.UninstallPluginAndCheckRestartAsync(PluginPair.Metadata);
+ await PluginInstaller.UninstallPluginAndCheckRestartAsync(PluginPair.Metadata);
}
[RelayCommand]
diff --git a/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
index 1eee6dba5..67bbbd930 100644
--- a/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
+++ b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
@@ -1,6 +1,5 @@
using System.Collections.ObjectModel;
using System.Linq;
-using System.Windows;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
From 0290675e1100fa2eab509cd4e2227efe68172e30 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 30 Jun 2025 12:12:47 +0800
Subject: [PATCH 1448/1798] Fix explorer plugin preview margin
---
.../Views/PreviewPanel.xaml | 143 +++++++++---------
1 file changed, 69 insertions(+), 74 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
index e200a187f..284ad32ad 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
@@ -8,10 +8,7 @@
d:DesignHeight="300"
d:DesignWidth="300"
mc:Ignorable="d">
-
+
@@ -90,78 +87,76 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
From dafb0caac4a4a7745e26c5e49e1a94933e1089c0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 30 Jun 2025 12:42:09 +0800
Subject: [PATCH 1449/1798] Remove unused using
---
Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
index a985ca7ff..f5523212e 100644
--- a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs
@@ -2,7 +2,6 @@
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core.Plugin;
-using Flow.Launcher.Helper;
using Flow.Launcher.Plugin;
using Version = SemanticVersioning.Version;
From ea25a661eec75486ce7b8ad3dad41addac97b2fe Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 30 Jun 2025 12:46:41 +0800
Subject: [PATCH 1450/1798] Fix an issue that after uninstalling pm, store no
longer fetches plugin until clicking on refresh.
---
Flow.Launcher/App.xaml.cs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 5df1f88ae..6d1499f2d 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -208,6 +208,9 @@ namespace Flow.Launcher
Http.Proxy = _settings.Proxy;
+ // Initialize plugin manifest before initializing plugins so that they can use the manifest instantly
+ await API.UpdatePluginManifestAsync();
+
await PluginManager.InitializePluginsAsync();
// Change language after all plugins are initialized because we need to update plugin title based on their api
From 5b8b84a34c97b2503732311e3fd9b00a5b89b2a0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 30 Jun 2025 12:58:44 +0800
Subject: [PATCH 1451/1798] Fix code comments
---
Flow.Launcher.Core/Plugin/PluginInstaller.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginInstaller.cs b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
index a69ab322e..781ad3ff0 100644
--- a/Flow.Launcher.Core/Plugin/PluginInstaller.cs
+++ b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
@@ -78,7 +78,7 @@ public static class PluginInstaller
{
API.LogException(ClassName, "Failed to install plugin", e);
API.ShowMsgError(API.GetTranslation("ErrorInstallingPlugin"));
- return; // don’t restart on failure
+ return; // do not restart on failure
}
if (Settings.AutoRestartAfterChanging)
@@ -152,7 +152,7 @@ public static class PluginInstaller
{
API.LogException(ClassName, "Failed to uninstall plugin", e);
API.ShowMsgError(API.GetTranslation("ErrorUninstallingPlugin"));
- return; // don’t restart on failure
+ return; // don not restart on failure
}
if (Settings.AutoRestartAfterChanging)
@@ -208,7 +208,7 @@ public static class PluginInstaller
{
API.LogException(ClassName, "Failed to update plugin", e);
API.ShowMsgError(API.GetTranslation("ErrorUpdatingPlugin"));
- return; // don’t restart on failure
+ return; // do not restart on failure
}
if (Settings.AutoRestartAfterChanging)
From 01e749ac88e2aa4f9bc5e5bcc8ee5920ec68e9ee Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 30 Jun 2025 13:07:19 +0800
Subject: [PATCH 1452/1798] Fix an issue that store install/uninstall same
plugin without restart shows error message error, should say already
installed/uninstalled
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 24 +++++++++++++++-------
Flow.Launcher/Languages/en.xaml | 5 +++++
2 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index 9b525f331..5b74d80f0 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -542,7 +542,8 @@ namespace Flow.Launcher.Core.Plugin
public static async Task UpdatePluginAsync(PluginMetadata existingVersion, UserPlugin newVersion, string zipFilePath)
{
- InstallPlugin(newVersion, zipFilePath, checkModified:false);
+ var success = InstallPlugin(newVersion, zipFilePath, checkModified:false);
+ if (!success) return;
await UninstallPluginAsync(existingVersion, removePluginFromSettings:false, removePluginSettings:false, checkModified: false);
_modifiedPlugins.Add(existingVersion.ID);
}
@@ -561,12 +562,13 @@ namespace Flow.Launcher.Core.Plugin
#region Internal functions
- internal static void InstallPlugin(UserPlugin plugin, string zipFilePath, bool checkModified)
+ internal static bool InstallPlugin(UserPlugin plugin, string zipFilePath, bool checkModified)
{
if (checkModified && PluginModified(plugin.ID))
{
- // Distinguish exception from installing same or less version
- throw new ArgumentException($"Plugin {plugin.Name} {plugin.ID} has been modified.", nameof(plugin));
+ API.ShowMsg(string.Format(API.GetTranslation("failedToInstallPluginTitle"), plugin.Name),
+ API.GetTranslation("pluginModifiedAlreadyMessage"));
+ return false;
}
// Unzip plugin files to temp folder
@@ -584,12 +586,16 @@ namespace Flow.Launcher.Core.Plugin
if (string.IsNullOrEmpty(metadataJsonFilePath) || string.IsNullOrEmpty(pluginFolderPath))
{
- throw new FileNotFoundException($"Unable to find plugin.json from the extracted zip file, or this path {pluginFolderPath} does not exist");
+ API.ShowMsg(string.Format(API.GetTranslation("failedToInstallPluginTitle"), plugin.Name),
+ string.Format(API.GetTranslation("fileNotFoundMessage"), pluginFolderPath));
+ return false;
}
if (SameOrLesserPluginVersionExists(metadataJsonFilePath))
{
- throw new InvalidOperationException($"A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin {plugin.Name}");
+ API.ShowMsg(string.Format(API.GetTranslation("failedToInstallPluginTitle"), plugin.Name),
+ API.GetTranslation("pluginExistAlreadyMessage"));
+ return false;
}
var folderName = string.IsNullOrEmpty(plugin.Version) ? $"{plugin.Name}-{Guid.NewGuid()}" : $"{plugin.Name}-{plugin.Version}";
@@ -633,13 +639,17 @@ namespace Flow.Launcher.Core.Plugin
{
_modifiedPlugins.Add(plugin.ID);
}
+
+ return true;
}
internal static async Task UninstallPluginAsync(PluginMetadata plugin, bool removePluginFromSettings, bool removePluginSettings, bool checkModified)
{
if (checkModified && PluginModified(plugin.ID))
{
- throw new ArgumentException($"Plugin {plugin.Name} has been modified");
+ API.ShowMsg(string.Format(API.GetTranslation("failedToUninstallPluginTitle"), plugin.Name),
+ API.GetTranslation("pluginModifiedAlreadyMessage"));
+ return;
}
if (removePluginSettings || removePluginFromSettings)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index e71ece19d..1cc03d6b1 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -175,6 +175,11 @@
Plugins: {0} - Fail to remove plugin settings files, please remove them manuallyFail to remove plugin cachePlugins: {0} - Fail to remove plugin cache files, please remove them manually
+ Fail to install {0}
+ Fail to uninstall {0}
+ This plugin has been installed or uninstalled already, please restart Flow
+ Unable to find plugin.json from the extracted zip file, or this path {0} does not exist
+ A plugin with the same ID and version already exists, or the version is greater than this downloaded pluginPlugin Store
From 6318bbe1878d54ebc2c19670e6a9d06e1035b95b Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 30 Jun 2025 13:16:59 +0800
Subject: [PATCH 1453/1798] Fix an issue that pm install/uninstall same plugin
without restart says correct message but another message also pops up to say
it's successfully installed
---
Flow.Launcher.Core/Plugin/PluginInstaller.cs | 21 ++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/Flow.Launcher.Core/Plugin/PluginInstaller.cs b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
index 781ad3ff0..4cdab09f9 100644
--- a/Flow.Launcher.Core/Plugin/PluginInstaller.cs
+++ b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
@@ -27,6 +27,13 @@ public static class PluginInstaller
public static async Task InstallPluginAndCheckRestartAsync(UserPlugin newPlugin)
{
+ if (API.PluginModified(newPlugin.ID))
+ {
+ API.ShowMsg(string.Format(API.GetTranslation("failedToInstallPluginTitle"), newPlugin.Name),
+ API.GetTranslation("pluginModifiedAlreadyMessage"));
+ return;
+ }
+
if (API.ShowMsgBox(
string.Format(
API.GetTranslation("InstallPromptSubtitle"),
@@ -117,6 +124,13 @@ public static class PluginInstaller
return;
}
+ if (API.PluginModified(plugin.ID))
+ {
+ API.ShowMsg(string.Format(API.GetTranslation("failedToInstallPluginTitle"), plugin.Name),
+ API.GetTranslation("pluginModifiedAlreadyMessage"));
+ return;
+ }
+
if (Settings.ShowUnknownSourceWarning)
{
if (!InstallSourceKnown(plugin.Website)
@@ -132,6 +146,13 @@ public static class PluginInstaller
public static async Task UninstallPluginAndCheckRestartAsync(PluginMetadata oldPlugin)
{
+ if (API.PluginModified(oldPlugin.ID))
+ {
+ API.ShowMsg(string.Format(API.GetTranslation("failedToUninstallPluginTitle"), oldPlugin.Name),
+ API.GetTranslation("pluginModifiedAlreadyMessage"));
+ return;
+ }
+
if (API.ShowMsgBox(
string.Format(
API.GetTranslation("UninstallPromptSubtitle"),
From 0c1fcad06f8df0a654b4b476fcf9c22321db41b5 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 30 Jun 2025 14:39:29 +0800
Subject: [PATCH 1454/1798] Fix grid row issue
---
Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
index 284ad32ad..0daa36e63 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
@@ -44,7 +44,7 @@
TextWrapping="Wrap" />
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml
index 6fb809d90..8a75cde72 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml
@@ -43,10 +43,15 @@
تم تحديث الإضافة {0} بنجاح. يرجى إعادة تشغيل Flow.تم تحديث {0} إضافات بنجاح. يرجى إعادة تشغيل Flow.تم تعديل الإضافة {0} بالفعل. يرجى إعادة تشغيل Flow قبل إجراء أي تغييرات أخرى.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}مدير الإضافات
- إدارة تثبيت وإلغاء تثبيت أو تحديث إضافات Flow Launcher
+ Install, uninstall or update Flow Launcher plugins via the search windowمؤلف غير معروف
@@ -61,5 +66,5 @@
تحذير التثبيت من مصدر غير معروف
- إعادة تشغيل Flow Launcher تلقائيًا بعد تثبيت/إلغاء تثبيت/تحديث الإضافات
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml
index d47e1814b..5ca1700d4 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Správce pluginů
- Správa instalace, odinstalace nebo aktualizace pluginů Flow Launcheru
+ Install, uninstall or update Flow Launcher plugins via the search windowNeznámý autor
@@ -61,5 +66,5 @@
Upozornění na instalaci z neznámého zdroje
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml
index 616ce779b..a5d0231ce 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Plugins Manager
- Management of installing, uninstalling or updating Flow Launcher plugins
+ Install, uninstall or update Flow Launcher plugins via the search windowUnknown Author
@@ -61,5 +66,5 @@
Install from unknown source warning
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml
index 47ea31cce..c7ef77801 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml
@@ -43,10 +43,15 @@
Plug-in {0} erfolgreich aktualisiert. Bitte starten Sie Flow neu.{0} Plug-ins erfolgreich aktualisiert. Bitte starten Sie Flow neu.Plug-in {0} ist bereits modifiziert worden. Bitte starten Sie Flow neu, bevor Sie irgendwelche weitere Änderungen vornehmen.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Plug-ins-Manager
- Verwaltung der Installation, Deinstallation oder Aktualisierung der Plug-ins von Flow Launcher
+ Install, uninstall or update Flow Launcher plugins via the search windowUnbekannter Autor
@@ -61,5 +66,5 @@
Warnung vor Installation aus unbekannter Quelle
- Automatischer Neustart von Flow Launcher nach Installation/Deinstallation/Aktualisierung von Plug-ins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
index 573ca9051..fa2e65240 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
@@ -45,10 +45,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Plugins Manager
- Management of installing, uninstalling or updating Flow Launcher plugins
+ Install, uninstall or update Flow Launcher plugins via the search windowUnknown Author
@@ -63,5 +68,5 @@
Install from unknown source warning
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml
index 616ce779b..a5d0231ce 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Plugins Manager
- Management of installing, uninstalling or updating Flow Launcher plugins
+ Install, uninstall or update Flow Launcher plugins via the search windowUnknown Author
@@ -61,5 +66,5 @@
Install from unknown source warning
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml
index b0f25f3ea..b6a3a6cbc 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml
@@ -43,10 +43,15 @@
Complemento {0} actualizado correctamente. Por favor, reinicie Flow.{0} complementos se han actualizado correctamente. Por favor, reinicie Flow.El complemento {0} ya ha sido modificado. Por favor, reinicie Flow antes de realizar más cambios.
+ {0} ya está modificado
+ Reiniciar Flow antes de realizar más cambios
+
+ Archivo de instalación zip no válido
+ Por favor, compruebe si hay un plugin.json en {0}Administrador de complementos
- Administración de instalación, desinstalación o actualización de los complementos de Flow Launcher
+ Instalar, desinstalar o actualizar complementos de Flow Launcher desde la ventana de búsquedaAutor desconocido
@@ -61,5 +66,5 @@
Aviso de instalación desde fuentes desconocidas
- Reiniciar automáticamente Flow Launcher después de instalar/desinstalar/actualizar complementos
+ Reiniciar Flow Launcher automáticamente después de instalar/desinstalar/actualizar el complemento a través del Administrador de complementos
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml
index 3142ef86d..c95c97231 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml
@@ -43,10 +43,15 @@
Plugin {0} mis à jour avec succès. Veuillez redémarrer Flow.{0} plugins mis à jour avec succès. Veuillez redémarrer Flow.Le plugin {0} a déjà été modifié. Veuillez redémarrer Flow avant de faire d'autres modifications.
+ {0} est déjà modifié
+ Veuillez redémarrer Flow avant d'apporter d'autres modifications
+
+ Fichier d'installation zip invalide
+ Veuillez vérifier s'il y a un plugin.json dans {0}Gestionnaire de plugins
- Gestion de l'installation, de la désinstallation ou de la mise à jour des plugins Flow Launcher
+ Installer, désinstaller ou mettre à jour les plugins Flow Launcher via la fenêtre de rechercheAuteur inconnu
@@ -61,5 +66,5 @@
Avertissement d'installation à partir d'une source inconnue
- Redémarrer automatiquement Flow Launcher après l'installation/désinstallation/mise à jour des plugins
+ Redémarrer Flow Launcher automatiquement après l'installation/désinstallation/mise à jour du plugin via le gestionnaire de plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml
index 8c7f0cf02..3fe7fd968 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml
@@ -43,10 +43,15 @@
התוסף {0} עודכן בהצלחה. נא הפעל מחדש את Flow.{0} תוספים עודכנו בהצלחה. נא הפעל מחדש את Flow.התוסף {0} כבר השתנה. נא הפעל מחדש את Flow לפני ביצוע שינויים נוספים.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}מנהל תוספים
- ניהול התקנה, הסרה או עדכון של תוספים עבור Flow Launcher
+ Install, uninstall or update Flow Launcher plugins via the search windowמחבר לא ידוע
@@ -61,5 +66,5 @@
אזהרה בעת התקנה ממקור לא ידוע
- הפעל מחדש את Flow Launcher באופן אוטומטי לאחר התקנה/הסרה/עדכון של תוספים
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml
index d154e59dc..3ccefa2db 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml
@@ -43,10 +43,15 @@
Il plugin {0} aggiornato con successo. Riavviare Flow.{0} plugin aggiornato con successo. Riavviare Flow.Il plugin {0} è già stato modificato. Riavviare Flow prima di fare altre modifiche.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Gestore dei plugin
- Gestione dell'installazione, disinstallazione o aggiornamento dei plugin di Flow Launcher
+ Install, uninstall or update Flow Launcher plugins via the search windowAutore Sconosciuto
@@ -61,5 +66,5 @@
Avviso di installazione da sorgenti sconosciute
- Riavvia automaticamente Flow Launcher dopo l'installazione/disinstallazione/aggiornamento dei plugin
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml
index 616ce779b..d62f0f61b 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Plugins Manager
- Management of installing, uninstalling or updating Flow Launcher plugins
+ Install, uninstall or update Flow Launcher plugins via the search windowUnknown Author
@@ -60,6 +65,6 @@
Visit the PluginsManifest repository to see community-made plugin submissions
- Install from unknown source warning
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ 不明な提供元からインストールするとき警告する
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml
index f6f46448d..8c15f27ad 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}플러그인 관리자
- 플러그인의 설치/삭제/업데이트를 관리하는 플러그인
+ Install, uninstall or update Flow Launcher plugins via the search window알수없는 제작자
@@ -61,5 +66,5 @@
Install from unknown source warning
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml
index b0fd2d10a..bccd55459 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml
@@ -43,10 +43,15 @@
Programtillegg {0} oppdatert. Vennligst restart Flow.{0} programtillegg oppdatert. Start Flow på nytt.Programtillegg {0} er allerede endret. Start Flow på nytt før nye endringer foretas.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Programtilleggsbehandling
- Administrasjon av installasjon, avinstallere eller oppdatere Flow Launcher programtillegg
+ Install, uninstall or update Flow Launcher plugins via the search windowUkjent utvikler
@@ -61,5 +66,5 @@
Advarsel om installering fra ukjent kilde
- Start Flow Launcher automatisk på nytt etter installasjon/avinstallering/oppdatering av programtillegg
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml
index 616ce779b..a5d0231ce 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Plugins Manager
- Management of installing, uninstalling or updating Flow Launcher plugins
+ Install, uninstall or update Flow Launcher plugins via the search windowUnknown Author
@@ -61,5 +66,5 @@
Install from unknown source warning
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml
index 187900931..3124cc634 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml
@@ -43,10 +43,15 @@
Wtyczka {0} została pomyślnie zaktualizowana. Proszę ponownie uruchomić Flow.{0} wtyczek zaktualizowano pomyślnie. Proszę ponownie uruchomić Flow.Wtyczka {0} została już zmodyfikowana. Proszę ponownie uruchomić Flow przed wprowadzeniem dalszych zmian.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Menadżer wtyczek
- Zarządzanie instalowaniem, odinstalowywaniem i aktualizowaniem wtyczek Flow Launcher
+ Install, uninstall or update Flow Launcher plugins via the search windowNieznany autor
@@ -61,5 +66,5 @@
Ostrzeżenie o instalacji z nieznanego źródła
- Automatycznie uruchom ponownie Flow Launcher po zainstalowaniu/odinstalowaniu/zaktualizowaniu wtyczek
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml
index 179bcab97..2407d5b6e 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Plugins Manager
- Management of installing, uninstalling or updating Flow Launcher plugins
+ Install, uninstall or update Flow Launcher plugins via the search windowUnknown Author
@@ -61,5 +66,5 @@
Install from unknown source warning
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml
index 01535c689..40cfc8253 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml
@@ -43,10 +43,15 @@
Plugin {0} atualizado com sucesso. Por favor, reinicie o Flow Launcher.{0} plugins atualizados com sucesso. Deve reiniciar Flow Launcher.O plugin {0} foi modificado. Por favor, reinicie o Flow Launcher antes de fazer mais alterações.
+ {0} já modificado
+ Reinicie Flow Launcher antes de fazer mais alterações
+
+ Ficheiro Zip inválido
+ Verifique se existe o ficheiro "plugin.json" em {0}Gestor de plugins
- Módulo para instalar, desinstalar e atualizar os plugins do Flow Launcher
+ Instalar, desinstalar ou atualizar plugins do Flow Launcher através da janela de pesquisaAutor desconhecido
@@ -61,5 +66,5 @@
Aviso ao instalar de fontes desconhecidas
- Reiniciar automaticamente após instalar/desinstalar/atualizar plugins
+ Reiniciar Flow Launcher após instalar/desinstalar/atualizar um plugin via Gestor de plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml
index 5b0a379b5..18913c7c6 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Plugins Manager
- Management of installing, uninstalling or updating Flow Launcher plugins
+ Install, uninstall or update Flow Launcher plugins via the search windowАвтор неизвестен
@@ -61,5 +66,5 @@
Install from unknown source warning
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml
index 5529b2fc1..f788c9ce3 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml
@@ -43,10 +43,15 @@
Plugin {0} bol úspešne aktualizovaný. Prosím, reštartuje Flow.Pluginy úspešne aktualizované ({0}). Reštartuje Flow.Plugin {0} už bol upravený. Prosím, reštartuje Flow pred ďalšími zmenami.
+ Plugin {0} už bol upravený
+ Pred vykonaním ďalších zmien reštartujte Flow Launcher
+
+ Neplatný inštalačný súbor zip
+ Skontrolujte, či sa v {0} nachádza plugin.jsonSprávca pluginov
- Správa inštalácie, odinštalácie alebo aktualizácie pluginov programu Flow Launcher
+ Inštalovať, odinštalovať alebo aktualizovať pluginy Flow Launchera cez vyhľadávacie oknoNeznámy autor
@@ -61,5 +66,5 @@
Upozornenie na inštaláciu z neznámeho zdroja
- Automaticky reštartovať Flow Launcher po inštalácií/odinštalácii/aktualizáciu pluginov
+ Automaticky reštartovať Flow Launcher po inštalácii/odinštalácii/aktualizáciu pluginu cez Správcu pluginov
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml
index 616ce779b..a5d0231ce 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Plugins Manager
- Management of installing, uninstalling or updating Flow Launcher plugins
+ Install, uninstall or update Flow Launcher plugins via the search windowUnknown Author
@@ -61,5 +66,5 @@
Install from unknown source warning
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
index 14f2e1309..ed9aaf4b3 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Plugins Manager
- Management of installing, uninstalling or updating Flow Launcher plugins
+ Install, uninstall or update Flow Launcher plugins via the search windowBilinmeyen Yazar
@@ -61,5 +66,5 @@
Install from unknown source warning
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml
index 3d2b50a78..e07f417c7 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml
@@ -13,8 +13,8 @@
Встановлення плагінаЗавантажити та встановити {0}Видалення плагіна
- Keep plugin settings
- Do you want to keep the settings of the plugin for the next usage?
+ Зберегти налаштування плагіну
+ Хочете зберегти налаштування плагіну для наступного використання?Plugin successfully installed. Restarting Flow, please wait...Не вдалося знайти файл метаданих plugin.json у розпакованому zip-архіві.Помилка: Плагін, який має ідентичну або новішу версію з {0}, вже існує.
@@ -43,10 +43,15 @@
Плагін {0} успішно оновлено. Будь ласка, перезапустіть Flow.{0} плагіни успішно оновлено. Будь ласка, перезапустіть Flow.Плагін {0} вже було змінено. Будь ласка, перезапустіть Flow, перш ніж вносити будь-які подальші зміни.
+ {0} вже змінено
+ Перезапустіть Flow перед тим, як вносити будь-які подальші зміни.
+
+ Неправильний встановлюваний zip-файл
+ Перевірте, чи є файл plugin.json у {0}.Менеджер плагінів
- Керування встановленням, видаленням або оновленням плагінів Flow Launcher
+ Встановити, видалити або оновити плагіни Flow Launcher через вікно пошуку.Невідомий автор
@@ -61,5 +66,5 @@
Попередження про встановлення з невідомого джерела
- Автоматичний перезапуск Flow Launcher після встановлення/видалення/оновлення плагінів
+ Автоматично перезапускати Flow Launcher після встановлення / видалення / оновлення плагіну за допомогою Менеджера плагінів
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml
index 3f9315d60..1a2a5c93a 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}Trình quản lý plugin
- Quản lý cài đặt, gỡ cài đặt hoặc cập nhật plugin Flow Launcher
+ Install, uninstall or update Flow Launcher plugins via the search windowKhông rõ tác giả
@@ -61,5 +66,5 @@
Cảnh báo cài đặt từ nguồn không xác định
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml
index 1a4199965..446609850 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml
@@ -43,10 +43,15 @@
成功更新插件{0}。请重新启动 Flow Launcher。插件 {0} 更新成功。请重新启动 Flow Launcher。插件 {0} 已被修改。请在进行任何进一步更改之前重新启动Flow。
+ {0} 已被修改
+ 请在进行任何进一步更改之前重新启动 Flow
+
+ 无效的 zip 安装程序文件
+ 请检查 {0} 中是否有plugin.json插件管理
- 安装,卸载或更新 Flow Launcher 插件
+ 通过搜索窗口安装、卸载或更新 Flow Launcher 插件未知作者
@@ -61,5 +66,5 @@
未知源安装警告
- 安装/卸载/更新插件后自动重启 Flow Launcher
+ 通过插件管理器安装/卸载/更新插件后自动重启 Flow Launcher
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml
index f16feb050..ddd24d0ed 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml
@@ -43,10 +43,15 @@
Plugin {0} successfully updated. Please restart Flow.{0} plugins successfully updated. Please restart Flow.Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}擴充功能管理
- Management of installing, uninstalling or updating Flow Launcher plugins
+ Install, uninstall or update Flow Launcher plugins via the search window未知的作者
@@ -61,5 +66,5 @@
Install from unknown source warning
- Automatically restart Flow Launcher after installing/uninstalling/updating plugins
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 25182f6d3..efbe8d7ba 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -114,6 +114,14 @@ namespace Flow.Launcher.Plugin.PluginsManager
return;
}
+ if (Context.API.PluginModified(plugin.ID))
+ {
+ Context.API.ShowMsgError(
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_title"), plugin.Name),
+ Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_message"));
+ return;
+ }
+
string message;
if (Settings.AutoRestartAfterChanging)
{
@@ -158,7 +166,8 @@ namespace Flow.Launcher.Plugin.PluginsManager
if (cts.IsCancellationRequested)
return;
else
- Install(plugin, filePath);
+ if (!Install(plugin, filePath))
+ return;
}
catch (HttpRequestException e)
{
@@ -196,7 +205,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
}
}
- private async Task DownloadFileAsync(string prgBoxTitle, string downloadUrl, string filePath, CancellationTokenSource cts, bool deleteFile = true, bool showProgress = true)
+ private async Task DownloadFileAsync(string progressBoxTitle, string downloadUrl, string filePath, CancellationTokenSource cts, bool deleteFile = true, bool showProgress = true)
{
if (deleteFile && File.Exists(filePath))
File.Delete(filePath);
@@ -204,12 +213,12 @@ namespace Flow.Launcher.Plugin.PluginsManager
if (showProgress)
{
var exceptionHappened = false;
- await Context.API.ShowProgressBoxAsync(prgBoxTitle,
+ await Context.API.ShowProgressBoxAsync(progressBoxTitle,
async (reportProgress) =>
{
if (reportProgress == null)
{
- // when reportProgress is null, it means there is expcetion with the progress box
+ // when reportProgress is null, it means there is exception with the progress box
// so we record it with exceptionHappened and return so that progress box will close instantly
exceptionHappened = true;
return;
@@ -242,6 +251,18 @@ namespace Flow.Launcher.Plugin.PluginsManager
if (FilesFolders.IsZipFilePath(search, checkFileExists: true))
{
pluginFromLocalPath = Utilities.GetPluginInfoFromZip(search);
+
+ if (pluginFromLocalPath == null) return new List
+ {
+ new()
+ {
+ Title = Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_title"),
+ SubTitle = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_subtitle"),
+ search),
+ IcoPath = icoPath
+ }
+ };
+
pluginFromLocalPath.LocalInstallPath = search;
updateFromLocalPath = true;
}
@@ -261,6 +282,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
select
new
{
+ existingPlugin.Metadata.ID,
pluginUpdateSource.Name,
pluginUpdateSource.Author,
CurrentVersion = existingPlugin.Metadata.Version,
@@ -290,6 +312,14 @@ namespace Flow.Launcher.Plugin.PluginsManager
IcoPath = x.IcoPath,
Action = e =>
{
+ if (Context.API.PluginModified(x.ID))
+ {
+ Context.API.ShowMsgError(
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_title"), x.Name),
+ Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_message"));
+ return false;
+ }
+
string message;
if (Settings.AutoRestartAfterChanging)
{
@@ -340,8 +370,11 @@ namespace Flow.Launcher.Plugin.PluginsManager
}
else
{
- await Context.API.UpdatePluginAsync(x.PluginExistingMetadata, x.PluginNewUserPlugin,
- downloadToFilePath);
+ if (!await Context.API.UpdatePluginAsync(x.PluginExistingMetadata, x.PluginNewUserPlugin,
+ downloadToFilePath))
+ {
+ return;
+ }
if (Settings.AutoRestartAfterChanging)
{
@@ -406,6 +439,14 @@ namespace Flow.Launcher.Plugin.PluginsManager
IcoPath = icoPath,
AsyncAction = async e =>
{
+ if (resultsForUpdate.All(x => Context.API.PluginModified(x.ID)))
+ {
+ Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"),
+ string.Join(" ", resultsForUpdate.Select(x => x.Name))));
+ return false;
+ }
+
string message;
if (Settings.AutoRestartAfterChanging)
{
@@ -427,6 +468,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
return false;
}
+ var anyPluginSuccess = false;
await Task.WhenAll(resultsForUpdate.Select(async plugin =>
{
var downloadToFilePath = Path.Combine(Path.GetTempPath(),
@@ -444,8 +486,11 @@ namespace Flow.Launcher.Plugin.PluginsManager
if (cts.IsCancellationRequested)
return;
else
- await Context.API.UpdatePluginAsync(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin,
- downloadToFilePath);
+ if (!await Context.API.UpdatePluginAsync(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin,
+ downloadToFilePath))
+ return;
+
+ anyPluginSuccess = true;
}
catch (Exception ex)
{
@@ -458,6 +503,8 @@ namespace Flow.Launcher.Plugin.PluginsManager
}
}));
+ if (!anyPluginSuccess) return false;
+
if (Settings.AutoRestartAfterChanging)
{
Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
@@ -559,6 +606,20 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
var plugin = Utilities.GetPluginInfoFromZip(localPath);
+ if (plugin == null)
+ {
+ return new List
+ {
+ new()
+ {
+ Title = Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_title"),
+ SubTitle = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_subtitle"),
+ localPath),
+ IcoPath = icoPath
+ }
+ };
+ }
+
plugin.LocalInstallPath = localPath;
return new List
@@ -600,14 +661,17 @@ namespace Flow.Launcher.Plugin.PluginsManager
return false;
var author = pieces[3];
+ var acceptedHost = "github.com";
var acceptedSource = "https://github.com";
var constructedUrlPart = string.Format("{0}/{1}/", acceptedSource, author);
- return url.StartsWith(acceptedSource) &&
- Context.API.GetAllPlugins().Any(x =>
- !string.IsNullOrEmpty(x.Metadata.Website) &&
- x.Metadata.Website.StartsWith(constructedUrlPart)
- );
+ if (!Uri.TryCreate(url, UriKind.Absolute, out var uri) || uri.Host != acceptedHost)
+ return false;
+
+ return Context.API.GetAllPlugins().Any(x =>
+ !string.IsNullOrEmpty(x.Metadata.Website) &&
+ x.Metadata.Website.StartsWith(constructedUrlPart)
+ );
}
internal async ValueTask> RequestInstallOrUpdateAsync(string search, CancellationToken token,
@@ -649,7 +713,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
return Search(results, search);
}
- private void Install(UserPlugin plugin, string downloadedFilePath)
+ private bool Install(UserPlugin plugin, string downloadedFilePath)
{
if (!File.Exists(downloadedFilePath))
throw new FileNotFoundException($"Plugin {plugin.ID} zip file not found at {downloadedFilePath}",
@@ -657,10 +721,13 @@ namespace Flow.Launcher.Plugin.PluginsManager
try
{
- Context.API.InstallPlugin(plugin, downloadedFilePath);
+ if (!Context.API.InstallPlugin(plugin, downloadedFilePath))
+ return false;
if (!plugin.IsFromLocalInstallPath)
File.Delete(downloadedFilePath);
+
+ return true;
}
catch (FileNotFoundException e)
{
@@ -682,6 +749,8 @@ namespace Flow.Launcher.Plugin.PluginsManager
plugin.Name));
Context.API.LogException(ClassName, e.Message, e);
}
+
+ return false;
}
internal List RequestUninstall(string search)
@@ -696,6 +765,14 @@ namespace Flow.Launcher.Plugin.PluginsManager
IcoPath = x.Metadata.IcoPath,
AsyncAction = async e =>
{
+ if (Context.API.PluginModified(x.Metadata.ID))
+ {
+ Context.API.ShowMsgError(
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_title"), x.Metadata.Name),
+ Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_message"));
+ return false;
+ }
+
string message;
if (Settings.AutoRestartAfterChanging)
{
@@ -717,7 +794,10 @@ namespace Flow.Launcher.Plugin.PluginsManager
MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
Context.API.HideMainWindow();
- await UninstallAsync(x.Metadata);
+ if (!await UninstallAsync(x.Metadata))
+ {
+ return false;
+ }
if (Settings.AutoRestartAfterChanging)
{
Context.API.RestartApp();
@@ -742,7 +822,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
return Search(results, search);
}
- private async Task UninstallAsync(PluginMetadata plugin)
+ private async Task UninstallAsync(PluginMetadata plugin)
{
try
{
@@ -750,13 +830,14 @@ namespace Flow.Launcher.Plugin.PluginsManager
Context.API.GetTranslation("plugin_pluginsmanager_keep_plugin_settings_subtitle"),
Context.API.GetTranslation("plugin_pluginsmanager_keep_plugin_settings_title"),
button: MessageBoxButton.YesNo) == MessageBoxResult.No;
- await Context.API.UninstallPluginAsync(plugin, removePluginSettings);
+ return await Context.API.UninstallPluginAsync(plugin, removePluginSettings);
}
catch (ArgumentException e)
{
Context.API.LogException(ClassName, e.Message, e);
Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_error_title"),
- Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"));
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"), plugin.Name));
+ return false;
}
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs
index 4bb78f6ff..d76ce40c4 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs
@@ -65,9 +65,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
using (ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(filePath))
{
- var pluginJsonPath = archive.Entries.FirstOrDefault(x => x.Name == "plugin.json").ToString();
- ZipArchiveEntry pluginJsonEntry = archive.GetEntry(pluginJsonPath);
-
+ var pluginJsonEntry = archive.Entries.FirstOrDefault(x => x.Name == "plugin.json");
if (pluginJsonEntry != null)
{
using Stream stream = pluginJsonEntry.Open();
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
index 327011ac3..949e9e9db 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
@@ -4,7 +4,7 @@
"pm"
],
"Name": "Plugins Manager",
- "Description": "Management of installing, uninstalling or updating Flow Launcher plugins",
+ "Description": "Install, uninstall or update Flow Launcher plugins via the search window",
"Author": "Jeremy Wu",
"Version": "1.0.0",
"Language": "csharp",
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml
index 7e59db5ec..1d7ff227b 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml
@@ -8,7 +8,7 @@
zamknij {0} procesówzamknij wszystkie instancje
- Show title for processes with visible windows
- Put processes with visible windows on the top
+ Pokaż tytuł dla procesów z widocznymi oknami
+ Umieść procesy z widocznymi oknami na górze
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml
index 56004028b..6d2086abc 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.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/de.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml
index 7919ae7cb..cf716a153 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml
@@ -46,8 +46,8 @@
Bitte wählen Sie eine Programmquelle ausSind 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
+ Bitte wählen Sie die Programmquellen aus, die nicht von Ihnen hinzugefügt werden
+ Bitte wählen Sie die Programmquellen aus, die von Ihnen hinzugefügt werdenEine andere Programmquelle mit dem gleichen Ort ist bereits vorhanden.Programmquelle
@@ -76,7 +76,7 @@
Als anderer Benutzer ausführenAls Administrator ausführenEnthaltenden Ordner öffnen
- Hide
+ AusblendenZielordner öffnenProgramm
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml
index 4a1d815ec..0134627c5 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml
@@ -6,14 +6,14 @@
削除編集追加
- Name
+ 名前有効Enabled無効StatusEnabledDisabled
- Location
+ 場所All ProgramsFile TypeReindex
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
index 290954d5f..29158b2ce 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
@@ -34,8 +34,8 @@
Приховує програми з поширеними назвами деінсталяторів, наприклад, unins000.exeПошук в описі програмиFlow буде шукати опис програми
- Hide duplicated apps
- Hide duplicated Win32 programs that are already in the UWP list
+ Приховати дублікати застосунків
+ Приховати дублікати програми Win32, які вже є в списку UWPСуфіксиМаксимальна глибина
@@ -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
+ ПриховатиВідкрити цільову папкуПрограма
@@ -86,7 +86,7 @@
Кастомізований провідникАргументи
- You can customize the explorer used for opening the container folder by inputing the Environmental Variable of the explorer you want to use. It will be useful to use CMD to test whether the Environmental Variable is available.
+ Ви можете налаштувати провідник, який використовується для відкриття теки контейнера, ввівши змінну середовища провідника, який ви хочете використовувати. Буде корисно використовувати CMD, аби перевірити, чи доступна змінна середовища.Введіть спеціальні аргументи, які ви хочете додати до вашого провідника. %s для батьківського каталогу, %f для повного шляху (працює лише для win32). Докладнішу інформацію можна знайти на веб-сайті провідника.
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
index cb33250e1..c2f4574a9 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
@@ -290,12 +290,13 @@ namespace Flow.Launcher.Plugin.Program.Programs
}
private static readonly Channel PackageChangeChannel = Channel.CreateBounded(1);
+ private static PackageCatalog? catalog;
public static async Task WatchPackageChangeAsync()
{
if (Environment.OSVersion.Version.Major >= 10)
{
- var catalog = PackageCatalog.OpenForCurrentUser();
+ catalog ??= PackageCatalog.OpenForCurrentUser();
catalog.PackageInstalling += (_, args) =>
{
if (args.IsComplete)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
index d209cb739..d47474784 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
@@ -6,7 +6,7 @@
Натисніть будь-яку клавішу, щоб закрити це вікно...Не закривати командний рядок після виконання командиЗавжди запускати від імені адміністратора
- Use Windows Terminal
+ Використовувати Термінал WindowsЗапустити від імені іншого користувачаShellДозволяє виконувати системні команди з Flow Launcher
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
index d0add9f31..a51aadec7 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -194,10 +194,13 @@ namespace Flow.Launcher.Plugin.Shell
var workingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
var runAsAdministratorArg = !runAsAdministrator && !_settings.RunAsAdministrator ? "" : "runas";
- ProcessStartInfo info = new()
+ var info = new ProcessStartInfo()
{
- Verb = runAsAdministratorArg, WorkingDirectory = workingDirectory,
+ Verb = runAsAdministratorArg,
+ WorkingDirectory = workingDirectory,
};
+ var notifyStr = Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close");
+ var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
switch (_settings.Shell)
{
case Shell.Cmd:
@@ -211,8 +214,19 @@ namespace Flow.Launcher.Plugin.Shell
{
info.FileName = "cmd.exe";
}
-
- info.ArgumentList.Add($"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command} {(_settings.CloseShellAfterPress ? $"&& echo {Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")} && pause > nul /c" : "")}");
+ if (_settings.LeaveShellOpen)
+ {
+ info.ArgumentList.Add("/k");
+ }
+ else
+ {
+ info.ArgumentList.Add("/c");
+ }
+ info.ArgumentList.Add(
+ $"{command}" +
+ $"{(_settings.CloseShellAfterPress ?
+ $" && echo {notifyStr} && pause > nul /c" :
+ "")}");
break;
}
@@ -220,7 +234,6 @@ namespace Flow.Launcher.Plugin.Shell
{
// Using just a ; doesn't work with wt, as it's used to create a new tab for the terminal window
// \\ must be escaped for it to work properly, or breaking it into multiple arguments
- var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
if (_settings.UseWindowsTerminal)
{
info.FileName = "wt.exe";
@@ -238,7 +251,11 @@ namespace Flow.Launcher.Plugin.Shell
else
{
info.ArgumentList.Add("-Command");
- info.ArgumentList.Add($"{command}{addedCharacter}; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" : "")}");
+ info.ArgumentList.Add(
+ $"{command}{addedCharacter};" +
+ $"{(_settings.CloseShellAfterPress ?
+ $" Write-Host '{notifyStr}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" :
+ "")}");
}
break;
}
@@ -247,7 +264,6 @@ namespace Flow.Launcher.Plugin.Shell
{
// Using just a ; doesn't work with wt, as it's used to create a new tab for the terminal window
// \\ must be escaped for it to work properly, or breaking it into multiple arguments
- var addedCharacter = _settings.UseWindowsTerminal ? "\\" : "";
if (_settings.UseWindowsTerminal)
{
info.FileName = "wt.exe";
@@ -262,7 +278,11 @@ namespace Flow.Launcher.Plugin.Shell
info.ArgumentList.Add("-NoExit");
}
info.ArgumentList.Add("-Command");
- info.ArgumentList.Add($"{command}{addedCharacter}; {(_settings.CloseShellAfterPress ? $"Write-Host '{Context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" : "")}");
+ info.ArgumentList.Add(
+ $"{command}{addedCharacter};" +
+ $"{(_settings.CloseShellAfterPress ?
+ $" Write-Host '{notifyStr}'{addedCharacter}; [System.Console]::ReadKey(){addedCharacter}; exit" :
+ "")}");
break;
}
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
index 27fee87be..7d131d944 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
@@ -2,7 +2,7 @@
- Name
+ 名前説明コマンド
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
index c09a447d2..33cee56d8 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
@@ -69,7 +69,7 @@
ZresetujPotwierdźAnuluj
- Please enter a non-empty command keyword
+ Proszę wprowadzić niepuste słowo kluczowe poleceniaKomendy systemoweWykonywanie komend systemowych, np. wyłącz, zablokuj komputer, otwórz ustawienia itp.
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
index 19d69511b..c82be249a 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
@@ -26,7 +26,7 @@
Поради щодо Flow LauncherТека UserData 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.WebSearch/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
index d693a3f28..05ee39777 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
@@ -17,7 +17,7 @@
WyzwalaczAdres URLSzukaj
- Use Search Query Autocomplete
+ Użyj autouzupełniania zapytań wyszukiwaniaAutouzupełnianie danych z:Musisz wybrać coś z listyCzy jesteś pewien że chcesz usunąć {0}?
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
index 5536a7e68..51e1efc6e 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
@@ -17,7 +17,7 @@
Ключове слово діїURLПошук
- Use Search Query Autocomplete
+ Використовувати автозаповнення пошукового запитуАвтозаповнення даних з:Будь ласка, виберіть пошуковий запит в ІнтернетіВи впевнені, що хочете видалити {0}?
@@ -29,8 +29,8 @@
Таким чином, загальна формула для пошуку на Netflix має вигляд https://www.netflix.com/search?q={q}
- Copy URL
- Copy search URL to clipboard
+ Копіювати URL
+ Скопіювати URL-адресу пошуку в буфер обмінуНазва
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 d9de28e4b..e963e34da 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.de-DE.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.de-DE.resx
@@ -348,7 +348,7 @@
Area UpdateAndSecurity
- Sichern und wiederherstellen
+ Sichern und WiederherstellenArea Control Panel (legacy settings)
@@ -1324,7 +1324,7 @@
Area Control Panel (legacy settings)
- Remotedesktop
+ Remote-DesktopArea System
@@ -1752,7 +1752,7 @@
Einen Dateityp immer in einem spezifischen Programm öffnen lassen
- Stimme ändern
+ Ändern der Stimme des ErzählersTastaturprobleme finden und beheben
@@ -1761,7 +1761,7 @@
Screenreader verwenden
- Arbeitsgruppe auf diesem Computer Anzeigen
+ Anzeigen, zu welcher Arbeitsgruppe dieser Computer gehörtMausrad-Einstellungen ändern
@@ -1773,7 +1773,7 @@
Probleme finden und beheben
- Einstellung für empfangene Inhalte von Tippen und Senden
+ Ändern der Einstellungen für Inhalte, die über Tippen und Senden empfangen werdenChange default settings for media or devices
@@ -1812,7 +1812,7 @@
Ein Bluetooth-Gerät hinzufügen
- Customise the mouse buttons
+ Individuelles Anpassen der MaustastenSet tablet buttons to perform certain tasks
@@ -1869,16 +1869,16 @@
Scanner und Kameras ansehen
- Microsoft IME Register Word (Japanese)
+ Microsoft IME Register Word (Japanisch)
- Restore your files with File History
+ Ihre Dateien mit File History wiederherstellenTurn On-Screen keyboard on or off
- Block or allow third-party cookies
+ Cookies von Drittanbietern blockieren oder zulassenAudioaufzeichnungsprobleme finden und beheben
@@ -1902,7 +1902,7 @@
Preview, delete, show or hide fonts
- Microsoft Quick Settings
+ Microsoft-SchnelleinstellungenView reliability history
@@ -1917,7 +1917,7 @@
Sicherheitsrichtlinien zurücksetzen
- Pop-ups blockieren oder erlauben
+ Pop-ups blockieren oder zulassenAutovervollständigung im Internet Explorer ein- oder ausschalten
@@ -1938,7 +1938,7 @@
Automatische Fensteranordnung ausschalten
- Troubleshooting History
+ FehlerbehebungshistorieSpeicherprobleme Ihres Computers diagnostizieren
@@ -1968,13 +1968,13 @@
Specify single- or double-click to open
- Select users who can use remote desktop
+ Benutzer auswählen, die den Remote-Desktop verwenden können
- Show which programs are installed on your computer
+ Anzeigen, welche Programme auf Ihrem Computer installiert sind
- Allow remote access to your computer
+ Remote-Zugriff auf Ihren Computer erlaubenErweiterte Systemeinstellungen ansehen
@@ -2082,7 +2082,7 @@
Ihren Wiederherstellungsschlüssel sichern
- Save backup copies of your files with File History
+ Backup-Kopien Ihrer Dateien mit File History speichernView current accessibility settings
@@ -2143,7 +2143,7 @@
Windows-Features ein- oder ausschalten
- Betriebssystem, welches auf deinem Computer läuft, anzeigen
+ Anzeigen, welches Betriebssystem auf Ihrem Computer ausgeführt wirdLokale Dienste ansehen
@@ -2176,7 +2176,7 @@
Change advanced colour management settings for displays, scanners and printers
- Lasse Windows Vereinfachte Zugriffseinstellungen vorschlagen
+ Windows die Einstellungen für erleichterte Bedienung vorschlagen lassenClear disk space by deleting unnecessary files
@@ -2191,16 +2191,16 @@
Record steps to reproduce a problem
- Aussehen und Leistung von Windows anpassen
+ Anpassen des Erscheinungsbildes und der Leistung von WindowsEinstellungen für Microsoft IME (Japanisch)
- Lade jemanden ein, sich mit deinem PC zu verbinden und dir zu helfen oder anderen zu helfen
+ Laden Sie jemanden ein, eine Verbindung zu Ihrem PC herzustellen und Ihnen zu helfen, oder bieten Sie an, jemand anderem zu helfen
- Programme für frühere Versionen von Windows ausführen
+ Programme ausführen, die für frühere Versionen von Windows entwickelt wurdenChoose the order of how your screen rotates
@@ -2239,7 +2239,7 @@
Wählen Sie, wie Sie Links öffnen
- Allow Remote Assistance invitations to be sent from this computer
+ Erlauben, dass Einladungen zur Remote-Unterstützung von diesem Computer aus gesendet werdenTask-Manager
@@ -2257,7 +2257,7 @@
Lupe ein- oder ausschalten
- See the name of this computer
+ Den Namen dieses Computers ansehenNetzwerkverbindungen ansehen
@@ -2302,13 +2302,13 @@
How to change the size of virtual memory
- Hear text read aloud with Narrator
+ Text mit Erzähler vorlesen lassenSet up USB game controllers
- Show which domain your computer is on
+ Anzeigen, in welcher Domäne sich Ihr Computer befindetAlle Problemberichte ansehen
@@ -2401,7 +2401,7 @@
Create and format hard disk partitions
- Change date, time or number formats
+ Datums-, Zeit- oder Zahlenformate ändernChange PC wake-up settings
@@ -2452,13 +2452,13 @@
Change the way measurements are displayed
- Press key combinations one at a time
+ Tastenkombinationen nacheinander drücken
- Restore data, files or computer from backup (Windows 7)
+ Daten, Dateien oder Computer aus Backup wiederherstellen (Windows 7)
- Set your default programs
+ Ihre per Default vorgegebenen Programme festlegenEine Breitbandverbindung einrichten
@@ -2473,10 +2473,10 @@
Geplante Tasks
- Ignore repeated keystrokes using FilterKeys
+ Wiederholte Tastenanschläge unter Verwendung von FilterKeys ignorieren
- Find and fix bluescreen problems
+ Probleme mit Bluescreens finden und behebenEinen Ton hören, wenn Tasten gedrückt werden
@@ -2485,16 +2485,16 @@
Browsing-Historie löschen
- Change what the power buttons do
+ Ändern, was die Power-Tasten bewirken
- Create standard user account
+ Standard-Benutzerkonto erstellenTake speech tutorials
- View system resource usage in Task Manager
+ Systemressourcennutzung im Task-Manager ansehenEinen Account erstellen
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 91be8a392..6625a42dd 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx
@@ -837,7 +837,7 @@
ライト モード
- Location
+ 場所Area Privacy
diff --git a/appveyor.yml b/appveyor.yml
index b38e5bb1a..39e2a114c 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,7 @@
-version: '1.20.1.{build}'
+version: '1.20.2.{build}'
+
+# Do not build on tags because we create a release on merge to master. Otherwise will upload artifacts twice changing the hash, as well as triggering duplicate GitHub release action & NuGet deployments.
+skip_tags: true
init:
- ps: |
@@ -14,7 +17,6 @@ init:
cache:
- '%USERPROFILE%\.nuget\packages -> **.sln, **.csproj' # preserve nuget folder (packages) unless the solution or projects change
-
assembly_info:
patch: true
file: SolutionAssemblyInfo.cs
@@ -67,7 +69,17 @@ deploy:
- provider: GitHub
repository: Flow-Launcher/Prereleases
release: v$(prereleaseTag)
- description: 'This is the early access build of our upcoming release. All changes contained here are reviewed, tested and stable to use.\n\nSee our [release](https://github.com/Flow-Launcher/Flow.Launcher/pulls?q=is%3Aopen+is%3Apr+label%3Arelease) Pull Request for details.\n\nFor latest production release visit [here](https://github.com/Flow-Launcher/Flow.Launcher/releases/latest)\n\nPlease report any bugs or issues over at the [main repository](https://github.com/Flow-Launcher/Flow.Launcher/issues)'
+ description: |
+ This is the early access build of our upcoming release.
+ All changes contained here are reviewed, tested and stable to use.
+
+ This build includes new changes from commit:
+ $(APPVEYOR_REPO_COMMIT_MESSAGE)
+
+ See all changes in this early access by going to the [milstones](https://github.com/Flow-Launcher/Flow.Launcher/milestones?sort=title&direction=asc) section and choosing the upcoming milestone.
+ For latest production release visit [here](https://github.com/Flow-Launcher/Flow.Launcher/releases/latest)
+
+ Please report any bugs or issues over at the [main repository](https://github.com/Flow-Launcher/Flow.Launcher/issues)'
auth_token:
secure: ij4UeXUYQBDJxn2YRAAhUOjklOGVKDB87Hn5J8tKIzj13yatoI7sLM666QDQFEgv
artifact: Squirrel Installer, Portable Version, Squirrel nupkg, Squirrel RELEASES
From 3cdf9197b91a7bf398d566d7c584b662b42db742 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Mon, 14 Jul 2025 01:11:06 +1000
Subject: [PATCH 1518/1798] Merge release v1.20.2 back to dev (#3823)
---
Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj | 8 ++++----
appveyor.yml | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index 1d51b6534..1831bf46f 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -14,10 +14,10 @@
- 4.6.0
- 4.6.0
- 4.6.0
- 4.6.0
+ 4.7.0
+ 4.7.0
+ 4.7.0
+ 4.7.0Flow.Launcher.PluginFlow-LauncherMIT
diff --git a/appveyor.yml b/appveyor.yml
index 646594f4a..39e2a114c 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,4 @@
-version: '1.20.1.{build}'
+version: '1.20.2.{build}'
# Do not build on tags because we create a release on merge to master. Otherwise will upload artifacts twice changing the hash, as well as triggering duplicate GitHub release action & NuGet deployments.
skip_tags: true
From 2316c36a051034b5dba35aa36651b811f7eb2280 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sun, 13 Jul 2025 23:29:41 +0800
Subject: [PATCH 1519/1798] Improve performance and readablility
---
.../PinyinAlphabet.cs | 123 ++++++++++++------
.../TranslationMapping.cs | 20 +--
2 files changed, 90 insertions(+), 53 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index b5344c7e9..3850a3bcb 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -14,11 +14,8 @@ namespace Flow.Launcher.Infrastructure
{
public class PinyinAlphabet : IAlphabet
{
- private ConcurrentDictionary _pinyinCache =
- new();
-
+ private readonly ConcurrentDictionary _pinyinCache = new();
private readonly Settings _settings;
-
private ReadOnlyDictionary currentDoublePinyinTable;
public PinyinAlphabet()
@@ -44,105 +41,145 @@ namespace Flow.Launcher.Infrastructure
private void CreateDoublePinyinTableFromStream(Stream jsonStream)
{
- Dictionary> table = JsonSerializer.Deserialize>>(jsonStream);
- string schemaKey = _settings.DoublePinyinSchema.ToString(); // Convert enum to string
- if (!table.TryGetValue(schemaKey, out var value))
+ var table = JsonSerializer.Deserialize>>(jsonStream);
+ if (table == null)
{
- throw new ArgumentException("DoublePinyinSchema is invalid or double pinyin table is broken.");
+ throw new InvalidOperationException("Failed to deserialize double pinyin table: result is null");
}
- currentDoublePinyinTable = new ReadOnlyDictionary(value);
+
+ var schemaKey = _settings.DoublePinyinSchema.ToString();
+ if (!table.TryGetValue(schemaKey, out var schemaDict))
+ {
+ throw new ArgumentException($"DoublePinyinSchema '{schemaKey}' is invalid or double pinyin table is broken.");
+ }
+
+ currentDoublePinyinTable = new ReadOnlyDictionary(schemaDict);
}
private void LoadDoublePinyinTable()
{
- if (_settings.UseDoublePinyin)
+ if (!_settings.UseDoublePinyin)
{
- var tablePath = Path.Join(AppContext.BaseDirectory, "Resources", "double_pinyin.json");
- try
- {
- using var fs = File.OpenRead(tablePath);
- CreateDoublePinyinTableFromStream(fs);
- }
- catch (System.Exception e)
- {
- Log.Exception(nameof(PinyinAlphabet), "Failed to load double pinyin table from file: " + tablePath, e);
- currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary());
- }
+ currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary());
+ return;
}
- else
+
+ var tablePath = Path.Combine(AppContext.BaseDirectory, "Resources", "double_pinyin.json");
+ try
{
+ using var fs = File.OpenRead(tablePath);
+ CreateDoublePinyinTableFromStream(fs);
+ }
+ catch (FileNotFoundException e)
+ {
+ Log.Exception(nameof(PinyinAlphabet), $"Double pinyin table file not found: {tablePath}", e);
+ currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary());
+ }
+ catch (DirectoryNotFoundException e)
+ {
+ Log.Exception(nameof(PinyinAlphabet), $"Directory not found for double pinyin table: {tablePath}", e);
+ currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary());
+ }
+ catch (UnauthorizedAccessException e)
+ {
+ Log.Exception(nameof(PinyinAlphabet), $"Access denied to double pinyin table: {tablePath}", e);
+ currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary());
+ }
+ catch (System.Exception e)
+ {
+ Log.Exception(nameof(PinyinAlphabet), $"Failed to load double pinyin table from file: {tablePath}", e);
currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary());
}
}
public bool ShouldTranslate(string stringToTranslate)
{
- // If a string has Chinese characters, we don't need to translate it to pinyin.
- return _settings.ShouldUsePinyin && !WordsHelper.HasChinese(stringToTranslate);
+ // If the query (stringToTranslate) does NOT contain Chinese characters,
+ // we should translate the target string to pinyin for matching
+ return _settings.ShouldUsePinyin && !ContainsChinese(stringToTranslate);
}
public (string translation, TranslationMapping map) Translate(string content)
{
- if (!_settings.ShouldUsePinyin || !WordsHelper.HasChinese(content))
+ if (!_settings.ShouldUsePinyin || !ContainsChinese(content))
return (content, null);
- return _pinyinCache.TryGetValue(content, out var value)
- ? value
- : BuildCacheFromContent(content);
+ return _pinyinCache.TryGetValue(content, out var cached) ? cached : BuildCacheFromContent(content);
}
private (string translation, TranslationMapping map) BuildCacheFromContent(string content)
{
var resultList = WordsHelper.GetPinyinList(content);
-
- var resultBuilder = new StringBuilder();
+ var resultBuilder = new StringBuilder(_settings.UseDoublePinyin ? 3 : 4); // Pre-allocate with estimated capacity
var map = new TranslationMapping();
var previousIsChinese = false;
for (var i = 0; i < resultList.Length; i++)
{
- if (content[i] >= 0x3400 && content[i] <= 0x9FD5)
+ if (IsChineseCharacter(content[i]))
{
- string translated = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i];
+ var translated = _settings.UseDoublePinyin ? ToDoublePinyin(resultList[i]) : resultList[i];
+
if (i > 0)
{
resultBuilder.Append(' ');
}
+
map.AddNewIndex(resultBuilder.Length, translated.Length);
resultBuilder.Append(translated);
previousIsChinese = true;
}
else
{
+ // Add space after Chinese characters before non-Chinese characters
if (previousIsChinese)
{
previousIsChinese = false;
resultBuilder.Append(' ');
}
+
map.AddNewIndex(resultBuilder.Length, resultList[i].Length);
resultBuilder.Append(resultList[i]);
}
}
- map.endConstruct();
+ map.EndConstruct();
- var key = resultBuilder.ToString();
-
- return _pinyinCache[content] = (key, map);
+ var translation = resultBuilder.ToString();
+ var result = (translation, map);
+
+ return _pinyinCache[content] = result;
}
- #region Double Pinyin
-
- private string ToDoublePin(string fullPinyin)
+ ///
+ /// Optimized Chinese character detection using the comprehensive CJK Unicode ranges
+ ///
+ private static bool ContainsChinese(ReadOnlySpan text)
{
- if (currentDoublePinyinTable.TryGetValue(fullPinyin, out var doublePinyinValue))
+ foreach (var c in text)
{
- return doublePinyinValue;
+ if (IsChineseCharacter(c))
+ return true;
}
- return fullPinyin;
+ return false;
}
- #endregion
+ ///
+ /// Check if a character is a Chinese character using comprehensive Unicode ranges
+ /// Covers CJK Unified Ideographs, Extension A
+ ///
+ private static bool IsChineseCharacter(char c)
+ {
+ return (c >= 0x4E00 && c <= 0x9FFF) || // CJK Unified Ideographs
+ (c >= 0x3400 && c <= 0x4DBF); // CJK Extension A
+ }
+
+ private string ToDoublePinyin(string fullPinyin)
+ {
+ return currentDoublePinyinTable.TryGetValue(fullPinyin, out var doublePinyinValue)
+ ? doublePinyinValue
+ : fullPinyin;
+ }
}
}
diff --git a/Flow.Launcher.Infrastructure/TranslationMapping.cs b/Flow.Launcher.Infrastructure/TranslationMapping.cs
index 951979fa7..13d8342ac 100644
--- a/Flow.Launcher.Infrastructure/TranslationMapping.cs
+++ b/Flow.Launcher.Infrastructure/TranslationMapping.cs
@@ -6,31 +6,31 @@ namespace Flow.Launcher.Infrastructure
{
public class TranslationMapping
{
- private bool constructed;
+ private bool _isConstructed;
// Assuming one original item maps to multi translated items
// list[i] is the last translated index + 1 of original index i
- private readonly List originalToTranslated = new List();
+ private readonly List _originalToTranslated = new();
public void AddNewIndex(int translatedIndex, int length)
{
- if (constructed)
- throw new InvalidOperationException("Mapping shouldn't be changed after constructed");
+ if (_isConstructed)
+ throw new InvalidOperationException("Mapping shouldn't be changed after construction");
- originalToTranslated.Add(translatedIndex + length);
+ _originalToTranslated.Add(translatedIndex + length);
}
public int MapToOriginalIndex(int translatedIndex)
{
- int loc = originalToTranslated.BinarySearch(translatedIndex);
- return loc >= 0 ? loc : ~loc;
+ var searchResult = _originalToTranslated.BinarySearch(translatedIndex);
+ return searchResult >= 0 ? searchResult : ~searchResult;
}
- public void endConstruct()
+ public void EndConstruct()
{
- if (constructed)
+ if (_isConstructed)
throw new InvalidOperationException("Mapping has already been constructed");
- constructed = true;
+ _isConstructed = true;
}
}
}
From 78b4c7db855a2daee98e830613a3f331ba89395e Mon Sep 17 00:00:00 2001
From: dcog989
Date: Mon, 14 Jul 2025 00:43:39 +0100
Subject: [PATCH 1520/1798] Fix BrowserBookmark '100% CPU' issue
# Fix BrowserBookmark plugin locking threads at 100% CPU
The following files were modified to implement this fix:
1. /Flow.Launcher.Plugin.BrowserBookmark.csproj
- packages SkiaSharp and Svg.Skia added to output WEBP
2. /Helper/FaviconHelper.cs
- new method, TryConvertToWebp, added to take any image data and encode to WEBP
3. /FirefoxBookmarkLoader.cs
- LoadFaviconsFromDb to use the new helper which ensures only safe WEBP files are used by the UI, which resolves the CPU-locking. It was GZIPped SVGs that were causing the thread / CPU lock.
---
.../FirefoxBookmarkLoader.cs | 48 +++++++-------
...low.Launcher.Plugin.BrowserBookmark.csproj | 2 +
.../Helper/FaviconHelper.cs | 62 ++++++++++++++++---
3 files changed, 82 insertions(+), 30 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index ec3b867ea..f933fa2bb 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -2,6 +2,7 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
+using System.IO.Compression;
using System.Linq;
using System.Threading.Tasks;
using Flow.Launcher.Plugin.BrowserBookmark.Helper;
@@ -134,10 +135,6 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
try
{
- if (string.IsNullOrEmpty(bookmark.Url))
- return;
-
- // Extract domain from URL
if (!Uri.TryCreate(bookmark.Url, UriKind.Absolute, out Uri uri))
return;
@@ -146,43 +143,48 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
// Query for latest Firefox version favicon structure
using var cmd = connection.CreateCommand();
cmd.CommandText = @"
- SELECT i.data
+ SELECT i.id, i.data
FROM moz_icons i
JOIN moz_icons_to_pages ip ON i.id = ip.icon_id
JOIN moz_pages_w_icons p ON ip.page_id = p.id
- WHERE p.page_url LIKE @url
- AND i.data IS NOT NULL
- ORDER BY i.width DESC -- Select largest icon available
+ WHERE p.page_url LIKE @domain
+ ORDER BY i.width DESC
LIMIT 1";
- cmd.Parameters.AddWithValue("@url", $"%{domain}%");
+ cmd.Parameters.AddWithValue("@domain", $"%{domain}%");
using var reader = cmd.ExecuteReader();
- if (!reader.Read() || reader.IsDBNull(0))
+ if (!reader.Read() || reader.IsDBNull(1))
return;
+ var iconId = reader.GetInt64(0).ToString();
var imageData = (byte[])reader["data"];
if (imageData is not { Length: > 0 })
return;
-
- string faviconPath;
- if (FaviconHelper.IsSvgData(imageData))
+
+ if (imageData.Length > 2 && imageData[0] == 0x1f && imageData[1] == 0x8b)
{
- faviconPath = Path.Combine(_faviconCacheDir, $"firefox_{domain}.svg");
+ using var inputStream = new MemoryStream(imageData);
+ using var gZipStream = new GZipStream(inputStream, CompressionMode.Decompress);
+ using var outputStream = new MemoryStream();
+ gZipStream.CopyTo(outputStream);
+ imageData = outputStream.ToArray();
}
- else
+
+ var webpData = FaviconHelper.TryConvertToWebp(imageData);
+
+ if (webpData != null)
{
- faviconPath = Path.Combine(_faviconCacheDir, $"firefox_{domain}.png");
- }
+ var faviconPath = Path.Combine(_faviconCacheDir, $"firefox_{domain}_{iconId}.webp");
- // Filter out duplicate favicons
- if (savedPaths.TryAdd(faviconPath, true))
- {
- FaviconHelper.SaveBitmapData(imageData, faviconPath);
- }
+ if (savedPaths.TryAdd(faviconPath, true))
+ {
+ FaviconHelper.SaveBitmapData(webpData, faviconPath);
+ }
- bookmark.FaviconPath = faviconPath;
+ bookmark.FaviconPath = faviconPath;
+ }
}
catch (Exception ex)
{
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 3fb0fa46f..7b2fb47f8 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -97,6 +97,8 @@
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
index a879dcefd..bd8492408 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
@@ -1,5 +1,7 @@
using System;
using System.IO;
+using SkiaSharp;
+using Svg.Skia;
namespace Flow.Launcher.Plugin.BrowserBookmark.Helper;
@@ -65,12 +67,58 @@ public static class FaviconHelper
}
}
- public static bool IsSvgData(byte[] data)
+ public static byte[] TryConvertToWebp(byte[] data)
{
- if (data.Length < 5)
- return false;
- string start = System.Text.Encoding.ASCII.GetString(data, 0, Math.Min(100, data.Length));
- return start.Contains("
Date: Mon, 14 Jul 2025 09:01:59 +0800
Subject: [PATCH 1521/1798] Add code comments
---
.../FirefoxBookmarkLoader.cs | 7 ++++---
.../Helper/FaviconHelper.cs | 2 +-
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index f933fa2bb..ef029809a 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -162,7 +162,8 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
if (imageData is not { Length: > 0 })
return;
-
+
+ // Check if the image data is compressed (GZip)
if (imageData.Length > 2 && imageData[0] == 0x1f && imageData[1] == 0x8b)
{
using var inputStream = new MemoryStream(imageData);
@@ -171,9 +172,9 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
gZipStream.CopyTo(outputStream);
imageData = outputStream.ToArray();
}
-
+
+ // Convert the image data to WebP format
var webpData = FaviconHelper.TryConvertToWebp(imageData);
-
if (webpData != null)
{
var faviconPath = Path.Combine(_faviconCacheDir, $"firefox_{domain}_{iconId}.webp");
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
index bd8492408..72cb15b33 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
@@ -121,4 +121,4 @@ public static class FaviconHelper
return null;
}
-}
\ No newline at end of file
+}
From 071b75bcb585ae9109e65d525b72a5612570a597 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 14 Jul 2025 09:12:14 +0800
Subject: [PATCH 1522/1798] Improve code quality
---
Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index 3850a3bcb..cc4eccdc5 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -41,11 +41,8 @@ namespace Flow.Launcher.Infrastructure
private void CreateDoublePinyinTableFromStream(Stream jsonStream)
{
- var table = JsonSerializer.Deserialize>>(jsonStream);
- if (table == null)
- {
+ var table = JsonSerializer.Deserialize>>(jsonStream) ??
throw new InvalidOperationException("Failed to deserialize double pinyin table: result is null");
- }
var schemaKey = _settings.DoublePinyinSchema.ToString();
if (!table.TryGetValue(schemaKey, out var schemaDict))
From d7d3549c828f8845dccdc62ff1b233b0caad0d45 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 14 Jul 2025 09:17:32 +0800
Subject: [PATCH 1523/1798] Improve code quality
---
.../TranslationMapping.cs | 2 --
Flow.Launcher.Test/TranslationMappingTest.cs | 17 +++++++++--------
2 files changed, 9 insertions(+), 10 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/TranslationMapping.cs b/Flow.Launcher.Infrastructure/TranslationMapping.cs
index 395b4a4b2..b4c6764df 100644
--- a/Flow.Launcher.Infrastructure/TranslationMapping.cs
+++ b/Flow.Launcher.Infrastructure/TranslationMapping.cs
@@ -11,12 +11,10 @@ namespace Flow.Launcher.Infrastructure
// list[i] is the last translated index + 1 of original index i
private readonly List _originalToTranslated = new();
-
public void AddNewIndex(int translatedIndex, int length)
{
if (_isConstructed)
throw new InvalidOperationException("Mapping shouldn't be changed after construction");
-
_originalToTranslated.Add(translatedIndex + length);
}
diff --git a/Flow.Launcher.Test/TranslationMappingTest.cs b/Flow.Launcher.Test/TranslationMappingTest.cs
index 10d765f5a..829dbee81 100644
--- a/Flow.Launcher.Test/TranslationMappingTest.cs
+++ b/Flow.Launcher.Test/TranslationMappingTest.cs
@@ -1,4 +1,6 @@
-using Flow.Launcher.Infrastructure;
+using System.Collections.Generic;
+using System.Reflection;
+using Flow.Launcher.Infrastructure;
using NUnit.Framework;
using NUnit.Framework.Legacy;
@@ -34,22 +36,21 @@ namespace Flow.Launcher.Test
mapping.AddNewIndex(2, 2);
mapping.AddNewIndex(5, 3);
-
var result = mapping.MapToOriginalIndex(translatedIndex);
ClassicAssert.AreEqual(expectedOriginalIndex, result);
}
- private int GetOriginalToTranslatedCount(TranslationMapping mapping)
+ private static int GetOriginalToTranslatedCount(TranslationMapping mapping)
{
- var field = typeof(TranslationMapping).GetField("originalToTranslated", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
- var list = (System.Collections.Generic.List)field.GetValue(mapping);
+ var field = typeof(TranslationMapping).GetField("originalToTranslated", BindingFlags.NonPublic | BindingFlags.Instance);
+ var list = (List)field.GetValue(mapping);
return list.Count;
}
- private int GetOriginalToTranslatedAt(TranslationMapping mapping, int index)
+ private static int GetOriginalToTranslatedAt(TranslationMapping mapping, int index)
{
- var field = typeof(TranslationMapping).GetField("originalToTranslated", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
- var list = (System.Collections.Generic.List)field.GetValue(mapping);
+ var field = typeof(TranslationMapping).GetField("originalToTranslated", BindingFlags.NonPublic | BindingFlags.Instance);
+ var list = (List)field.GetValue(mapping);
return list[index];
}
}
From 88a6e59f46c2789d85d2b4cdf81c0a6ef317c1a7 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 14 Jul 2025 09:19:46 +0800
Subject: [PATCH 1524/1798] Fix test project field issue
---
Flow.Launcher.Test/TranslationMappingTest.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Test/TranslationMappingTest.cs b/Flow.Launcher.Test/TranslationMappingTest.cs
index 829dbee81..bd3636f0a 100644
--- a/Flow.Launcher.Test/TranslationMappingTest.cs
+++ b/Flow.Launcher.Test/TranslationMappingTest.cs
@@ -42,14 +42,14 @@ namespace Flow.Launcher.Test
private static int GetOriginalToTranslatedCount(TranslationMapping mapping)
{
- var field = typeof(TranslationMapping).GetField("originalToTranslated", BindingFlags.NonPublic | BindingFlags.Instance);
+ var field = typeof(TranslationMapping).GetField("_originalToTranslated", BindingFlags.NonPublic | BindingFlags.Instance);
var list = (List)field.GetValue(mapping);
return list.Count;
}
private static int GetOriginalToTranslatedAt(TranslationMapping mapping, int index)
{
- var field = typeof(TranslationMapping).GetField("originalToTranslated", BindingFlags.NonPublic | BindingFlags.Instance);
+ var field = typeof(TranslationMapping).GetField("_originalToTranslated", BindingFlags.NonPublic | BindingFlags.Instance);
var list = (List)field.GetValue(mapping);
return list[index];
}
From bdf5ccd3a97459ae69f25ffe9023a63d9e94e1a0 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Mon, 14 Jul 2025 09:28:52 +0800
Subject: [PATCH 1525/1798] Add word
---
.github/actions/spelling/expect.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
index 5b3419041..0fea6d9ab 100644
--- a/.github/actions/spelling/expect.txt
+++ b/.github/actions/spelling/expect.txt
@@ -103,3 +103,4 @@ Reloadable
metadatas
WMP
VSTHRD
+CJK
From 79f81a6274e7bdaa3a62ff8afa012f56dca40c43 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 14 Jul 2025 15:35:23 +0800
Subject: [PATCH 1526/1798] Improve code quality
---
Flow.Launcher/App.xaml.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 7b82748fc..ad7b44f10 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -251,7 +251,7 @@ namespace Flow.Launcher
/// Check startup only for Release
///
[Conditional("RELEASE")]
- private void AutoStartup()
+ private static void AutoStartup()
{
// we try to enable auto-startup on first launch, or reenable if it was removed
// but the user still has the setting set
@@ -272,7 +272,7 @@ namespace Flow.Launcher
}
[Conditional("RELEASE")]
- private void AutoUpdates()
+ private static void AutoUpdates()
{
_ = Task.Run(async () =>
{
From c0c7546cfc07c68478300572f6dee21a21b91967 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 14 Jul 2025 15:48:15 +0800
Subject: [PATCH 1527/1798] Add auto plugin update setting & UI
---
.../UserSettings/Settings.cs | 1 +
Flow.Launcher/Languages/en.xaml | 4 ++-
.../Views/SettingsPaneGeneral.xaml | 27 +++++++++++++------
3 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 6b10d693d..54c313146 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -233,6 +233,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool AutoRestartAfterChanging { get; set; } = false;
public bool ShowUnknownSourceWarning { get; set; } = true;
+ public bool AutoUpdatePlugins { get; set; } = true;
public int CustomExplorerIndex { get; set; } = 0;
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 2fca06605..57ad1ce9a 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -117,7 +117,7 @@
Xing Kong Jian DaoDa NiuXiao Lang
-
+
Always PreviewAlways open preview panel when Flow activates. Press {0} to toggle preview.Shadow effect is not allowed while current theme has blur effect enabled
@@ -150,6 +150,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates every 1 hour and notify if there are any updates availableSearch Plugin
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index df0243ce8..78b6d8db0 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -241,12 +241,23 @@
Title="{DynamicResource showUnknownSourceWarning}"
Icon=""
Sub="{DynamicResource showUnknownSourceWarningToolTip}"
- Type="Last">
+ Type="Middle">
+
+
+
+
-
+ Type="Middle"
+ Visibility="{ext:VisibleWhen {Binding ShouldUsePinyin},
+ IsEqualToBool=True}">
+ Type="Last"
+ Visibility="{ext:VisibleWhen {Binding UseDoublePinyin},
+ IsEqualToBool=True}">
Date: Mon, 14 Jul 2025 16:14:13 +0800
Subject: [PATCH 1528/1798] Update string resource
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 57ad1ce9a..7a5dc0c07 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -151,7 +151,7 @@
Show unknown source warningShow warning when installing plugins from unknown sourcesAuto update plugins
- Automatically check plugin updates every 1 hour and notify if there are any updates available
+ Automatically check plugin updates and notify if there are any updates availableSearch Plugin
From 6eb52b8961882f0d1e723c733cecad3408b94840 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 14 Jul 2025 16:18:22 +0800
Subject: [PATCH 1529/1798] Check plugin updates in the background
---
Flow.Launcher.Core/Plugin/PluginInstaller.cs | 91 ++++++++++++++++++++
Flow.Launcher/App.xaml.cs | 18 ++++
Flow.Launcher/Languages/en.xaml | 4 +
3 files changed, 113 insertions(+)
diff --git a/Flow.Launcher.Core/Plugin/PluginInstaller.cs b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
index 33963c01a..692fe3ce1 100644
--- a/Flow.Launcher.Core/Plugin/PluginInstaller.cs
+++ b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
@@ -277,6 +277,97 @@ public static class PluginInstaller
}
}
+ ///
+ /// Updates the plugin to the latest version available from its source.
+ ///
+ /// If true, do not show any messages when there is no udpate available.
+ /// If true, only use the primary URL for updates.
+ /// Cancellation token to cancel the update operation.
+ ///
+ public static async Task UpdatePluginAsync(bool silentUpdate = true, bool usePrimaryUrlOnly = false, CancellationToken token = default)
+ {
+ // Update the plugin manifest
+ await API.UpdatePluginManifestAsync(usePrimaryUrlOnly, token);
+
+ // Get all plugins that can be updated
+ var resultsForUpdate = (
+ from existingPlugin in API.GetAllPlugins()
+ join pluginUpdateSource in API.GetPluginManifest()
+ on existingPlugin.Metadata.ID equals pluginUpdateSource.ID
+ where string.Compare(existingPlugin.Metadata.Version, pluginUpdateSource.Version,
+ StringComparison.InvariantCulture) <
+ 0 // if current version precedes version of the plugin from update source (e.g. PluginsManifest)
+ && !API.PluginModified(existingPlugin.Metadata.ID)
+ select
+ new
+ {
+ existingPlugin.Metadata.ID,
+ pluginUpdateSource.Name,
+ pluginUpdateSource.Author,
+ CurrentVersion = existingPlugin.Metadata.Version,
+ NewVersion = pluginUpdateSource.Version,
+ existingPlugin.Metadata.IcoPath,
+ PluginExistingMetadata = existingPlugin.Metadata,
+ PluginNewUserPlugin = pluginUpdateSource
+ }).ToList();
+
+ // No updates
+ if (!resultsForUpdate.Any())
+ {
+ if (!silentUpdate)
+ {
+ API.ShowMsg(API.GetTranslation("updateNoResultTitle"), API.GetTranslation("updateNoResultSubtitle"));
+ }
+ return;
+ }
+
+ // If all plugins are modified, just return
+ if (resultsForUpdate.All(x => API.PluginModified(x.ID)))
+ {
+ return;
+ }
+
+ if (API.ShowMsgBox(
+ string.Format(API.GetTranslation("updateAllPluginsSubtitle"),
+ Environment.NewLine, string.Join(", ", resultsForUpdate.Select(x => x.PluginExistingMetadata.Name))),
+ API.GetTranslation("updateAllPluginsTitle"),
+ MessageBoxButton.YesNo) == MessageBoxResult.No)
+ {
+ return;
+ }
+
+ // Update all plugins
+ await Task.WhenAll(resultsForUpdate.Select(async plugin =>
+ {
+ var downloadToFilePath = Path.Combine(Path.GetTempPath(), $"{plugin.Name}-{plugin.NewVersion}.zip");
+
+ try
+ {
+ using var cts = new CancellationTokenSource();
+
+ await DownloadFileAsync(
+ $"{API.GetTranslation("DownloadingPlugin")} {plugin.PluginNewUserPlugin.Name}",
+ plugin.PluginNewUserPlugin.UrlDownload, downloadToFilePath, cts);
+
+ // check if user cancelled download before installing plugin
+ if (cts.IsCancellationRequested)
+ {
+ return;
+ }
+
+ if (!await API.UpdatePluginAsync(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, downloadToFilePath))
+ {
+ return;
+ }
+ }
+ catch (Exception e)
+ {
+ API.LogException(ClassName, "Failed to update plugin", e);
+ API.ShowMsgError(API.GetTranslation("ErrorUpdatingPlugin"));
+ }
+ }));
+ }
+
///
/// Downloads a file from a URL to a local path, optionally showing a progress box and handling cancellation.
///
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index ad7b44f10..6b04f11d9 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -239,6 +239,7 @@ namespace Flow.Launcher
AutoStartup();
AutoUpdates();
+ AutoPluginUpdates();
API.SaveAppAllSettings();
API.LogInfo(ClassName, "End Flow Launcher startup ----------------------------------------------------");
@@ -289,6 +290,23 @@ namespace Flow.Launcher
});
}
+ private static void AutoPluginUpdates()
+ {
+ _ = Task.Run(async () =>
+ {
+ if (_settings.AutoUpdatePlugins)
+ {
+ // check plugin updates every 5 hour
+ var timer = new PeriodicTimer(TimeSpan.FromHours(5));
+ await PluginInstaller.UpdatePluginAsync();
+
+ while (await timer.WaitForNextTickAsync())
+ // check updates on startup
+ await PluginInstaller.UpdatePluginAsync();
+ }
+ });
+ }
+
#endregion
#region Register Events
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 7a5dc0c07..efbb1de3b 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -233,6 +233,10 @@
Zip filesPlease select zip fileInstall plugin from local path
+ No update available
+ All plugins are up to date
+ Update all plugins
+ Would you like to update these plugins?{0}{0}{1}Theme
From b393d361865bf66688e0cb5ecf83f38ff468571f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 14 Jul 2025 16:24:09 +0800
Subject: [PATCH 1530/1798] Add check plugin update button
---
Flow.Launcher/Languages/en.xaml | 1 +
.../ViewModels/SettingsPanePluginStoreViewModel.cs | 6 ++++++
.../SettingPages/Views/SettingsPanePluginStore.xaml | 7 +++++++
3 files changed, 14 insertions(+)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index efbb1de3b..ee500324e 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -237,6 +237,7 @@
All plugins are up to dateUpdate all pluginsWould you like to update these plugins?{0}{0}{1}
+ Check plugin updatesTheme
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
index efe67d016..bfec08c52 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
@@ -109,6 +109,12 @@ public partial class SettingsPanePluginStoreViewModel : BaseModel
await PluginInstaller.InstallPluginAndCheckRestartAsync(file);
}
+ [RelayCommand]
+ private async Task CheckPluginUpdatesAsync()
+ {
+ await PluginInstaller.UpdatePluginAsync(silentUpdate: false);
+ }
+
private static string GetFileFromDialog(string title, string filter = "")
{
var dlg = new Microsoft.Win32.OpenFileDialog
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
index 68f78d46c..21290bb62 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
@@ -99,6 +99,13 @@
ToolTip="{DynamicResource installLocalPluginTooltip}">
+
+
+
Date: Mon, 14 Jul 2025 16:24:46 +0800
Subject: [PATCH 1531/1798] Rename function name
---
Flow.Launcher.Core/Plugin/PluginInstaller.cs | 2 +-
Flow.Launcher/App.xaml.cs | 4 ++--
.../ViewModels/SettingsPanePluginStoreViewModel.cs | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginInstaller.cs b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
index 692fe3ce1..4c551f993 100644
--- a/Flow.Launcher.Core/Plugin/PluginInstaller.cs
+++ b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
@@ -284,7 +284,7 @@ public static class PluginInstaller
/// If true, only use the primary URL for updates.
/// Cancellation token to cancel the update operation.
///
- public static async Task UpdatePluginAsync(bool silentUpdate = true, bool usePrimaryUrlOnly = false, CancellationToken token = default)
+ public static async Task CheckForPluginUpdatesAsync(bool silentUpdate = true, bool usePrimaryUrlOnly = false, CancellationToken token = default)
{
// Update the plugin manifest
await API.UpdatePluginManifestAsync(usePrimaryUrlOnly, token);
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 6b04f11d9..7e3915b2b 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -298,11 +298,11 @@ namespace Flow.Launcher
{
// check plugin updates every 5 hour
var timer = new PeriodicTimer(TimeSpan.FromHours(5));
- await PluginInstaller.UpdatePluginAsync();
+ await PluginInstaller.CheckForPluginUpdatesAsync();
while (await timer.WaitForNextTickAsync())
// check updates on startup
- await PluginInstaller.UpdatePluginAsync();
+ await PluginInstaller.CheckForPluginUpdatesAsync();
}
});
}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
index bfec08c52..96cd44072 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
@@ -112,7 +112,7 @@ public partial class SettingsPanePluginStoreViewModel : BaseModel
[RelayCommand]
private async Task CheckPluginUpdatesAsync()
{
- await PluginInstaller.UpdatePluginAsync(silentUpdate: false);
+ await PluginInstaller.CheckForPluginUpdatesAsync(silentUpdate: false);
}
private static string GetFileFromDialog(string title, string filter = "")
From 69d5e33150c83ceaf455aec48a1b83004efc83ad Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 14 Jul 2025 16:31:09 +0800
Subject: [PATCH 1532/1798] Show message box with button instead
---
Flow.Launcher.Core/Plugin/PluginInstaller.cs | 22 ++++++++++++--------
Flow.Launcher/Languages/en.xaml | 4 ++--
2 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginInstaller.cs b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
index 4c551f993..84f0f1fd9 100644
--- a/Flow.Launcher.Core/Plugin/PluginInstaller.cs
+++ b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
@@ -327,17 +328,20 @@ public static class PluginInstaller
return;
}
- if (API.ShowMsgBox(
- string.Format(API.GetTranslation("updateAllPluginsSubtitle"),
- Environment.NewLine, string.Join(", ", resultsForUpdate.Select(x => x.PluginExistingMetadata.Name))),
+ // Show message box with button to update all plugins
+ API.ShowMsgWithButton(
API.GetTranslation("updateAllPluginsTitle"),
- MessageBoxButton.YesNo) == MessageBoxResult.No)
- {
- return;
- }
+ API.GetTranslation("updateAllPluginsButtonContent"),
+ () =>
+ {
+ UpdateAllPlugins(resultsForUpdate);
+ },
+ string.Join(", ", resultsForUpdate.Select(x => x.PluginExistingMetadata.Name)));
+ }
- // Update all plugins
- await Task.WhenAll(resultsForUpdate.Select(async plugin =>
+ private static void UpdateAllPlugins(IEnumerable resultsForUpdate)
+ {
+ _ = Task.WhenAll(resultsForUpdate.Select(async plugin =>
{
var downloadToFilePath = Path.Combine(Path.GetTempPath(), $"{plugin.Name}-{plugin.NewVersion}.zip");
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index ee500324e..53f26c5f4 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -235,8 +235,8 @@
Install plugin from local pathNo update availableAll plugins are up to date
- Update all plugins
- Would you like to update these plugins?{0}{0}{1}
+ Plugin updates available
+ Update all pluginsCheck plugin updates
From 44fbc6eed5763b089c78cc8f9a2eab3e8cb33185 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 14 Jul 2025 16:35:48 +0800
Subject: [PATCH 1533/1798] Add auto update subtitle
---
Flow.Launcher/Languages/en.xaml | 1 +
Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 53f26c5f4..3905df7c6 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -93,6 +93,7 @@
Always Start Typing in English ModeTemporarily change your input method to English mode when activating Flow.Auto Update
+ Automatically check app updates and notify if there are any updates availableSelectHide Flow Launcher on startupFlow Launcher search window is hidden in the tray after starting up.
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index 78b6d8db0..cfb292633 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -182,7 +182,8 @@
+ Icon=""
+ Sub="{DynamicResource autoUpdatesTooltip}">
Date: Mon, 14 Jul 2025 16:49:04 +0800
Subject: [PATCH 1534/1798] Change double pinyin panel design
---
.../Views/SettingsPaneGeneral.xaml | 47 ++++++++-----------
1 file changed, 20 insertions(+), 27 deletions(-)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index df0243ce8..38fc8df54 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -371,44 +371,37 @@
OnContent="{DynamicResource enable}" />
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
+
Date: Mon, 14 Jul 2025 16:56:12 +0800
Subject: [PATCH 1535/1798] Replace dynamic type with a strongly-typed model
---
Flow.Launcher.Core/Plugin/PluginInstaller.cs | 24 +++++++++++++++-----
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginInstaller.cs b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
index 84f0f1fd9..c00c83d9e 100644
--- a/Flow.Launcher.Core/Plugin/PluginInstaller.cs
+++ b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
@@ -300,14 +300,14 @@ public static class PluginInstaller
0 // if current version precedes version of the plugin from update source (e.g. PluginsManifest)
&& !API.PluginModified(existingPlugin.Metadata.ID)
select
- new
+ new PluginUpdateInfo()
{
- existingPlugin.Metadata.ID,
- pluginUpdateSource.Name,
- pluginUpdateSource.Author,
+ ID = existingPlugin.Metadata.ID,
+ Name = existingPlugin.Metadata.Name,
+ Author = existingPlugin.Metadata.Author,
CurrentVersion = existingPlugin.Metadata.Version,
NewVersion = pluginUpdateSource.Version,
- existingPlugin.Metadata.IcoPath,
+ IcoPath = existingPlugin.Metadata.IcoPath,
PluginExistingMetadata = existingPlugin.Metadata,
PluginNewUserPlugin = pluginUpdateSource
}).ToList();
@@ -339,7 +339,7 @@ public static class PluginInstaller
string.Join(", ", resultsForUpdate.Select(x => x.PluginExistingMetadata.Name)));
}
- private static void UpdateAllPlugins(IEnumerable resultsForUpdate)
+ private static void UpdateAllPlugins(IEnumerable resultsForUpdate)
{
_ = Task.WhenAll(resultsForUpdate.Select(async plugin =>
{
@@ -445,4 +445,16 @@ public static class PluginInstaller
x.Metadata.Website.StartsWith(constructedUrlPart)
);
}
+
+ private record PluginUpdateInfo
+ {
+ public string ID { get; init; }
+ public string Name { get; init; }
+ public string Author { get; init; }
+ public string CurrentVersion { get; init; }
+ public string NewVersion { get; init; }
+ public string IcoPath { get; init; }
+ public PluginMetadata PluginExistingMetadata { get; init; }
+ public UserPlugin PluginNewUserPlugin { get; init; }
+ }
}
From 6317d0eec6f42b788324fdcf9e6a2c2fdea388f4 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 14 Jul 2025 19:29:12 +0800
Subject: [PATCH 1536/1798] Reload on all settings change
---
Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 13 ++++++++++---
.../UserSettings/Settings.cs | 14 +++++++++++++-
2 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index cc4eccdc5..0f6d00014 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -25,10 +25,17 @@ namespace Flow.Launcher.Infrastructure
_settings.PropertyChanged += (sender, e) =>
{
- if (e.PropertyName == nameof(Settings.UseDoublePinyin) ||
- e.PropertyName == nameof(Settings.DoublePinyinSchema))
+ switch (e.PropertyName)
{
- Reload();
+ case nameof(Settings.ShouldUsePinyin):
+ Reload();
+ break;
+ case nameof(Settings.UseDoublePinyin):
+ Reload();
+ break;
+ case nameof(Settings.DoublePinyinSchema):
+ Reload();
+ break;
}
};
}
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 6b10d693d..726a0023b 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -328,7 +328,19 @@ namespace Flow.Launcher.Infrastructure.UserSettings
///
/// when false Alphabet static service will always return empty results
///
- public bool ShouldUsePinyin { get; set; } = false;
+ private bool _useAlphabet = true;
+ public bool ShouldUsePinyin
+ {
+ get => _useAlphabet;
+ set
+ {
+ if (_useAlphabet != value)
+ {
+ _useAlphabet = value;
+ OnPropertyChanged();
+ }
+ }
+ }
private bool _useDoublePinyin = false;
public bool UseDoublePinyin
From 8c56c0bddf4a4b7b361b26a3a6b32038144c2f35 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 14 Jul 2025 19:30:16 +0800
Subject: [PATCH 1537/1798] Fix logic
---
Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
index 0f6d00014..1c0cc6872 100644
--- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
+++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs
@@ -27,14 +27,18 @@ namespace Flow.Launcher.Infrastructure
{
switch (e.PropertyName)
{
- case nameof(Settings.ShouldUsePinyin):
- Reload();
+ case nameof (Settings.ShouldUsePinyin):
+ if (_settings.ShouldUsePinyin)
+ {
+ Reload();
+ }
break;
case nameof(Settings.UseDoublePinyin):
- Reload();
- break;
case nameof(Settings.DoublePinyinSchema):
- Reload();
+ if (_settings.UseDoublePinyin)
+ {
+ Reload();
+ }
break;
}
};
From fd4efe009cf2839b5eb01c95aaceb025a84edda2 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Mon, 14 Jul 2025 21:07:25 +0800
Subject: [PATCH 1538/1798] Hide double pin card when use pinyin is false
---
Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index 38fc8df54..a879007c3 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -386,6 +386,8 @@
Date: Mon, 14 Jul 2025 21:21:47 +0800
Subject: [PATCH 1539/1798] Update spell check
---
.github/actions/spelling/expect.txt | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
index 0fea6d9ab..d8c99bce9 100644
--- a/.github/actions/spelling/expect.txt
+++ b/.github/actions/spelling/expect.txt
@@ -104,3 +104,12 @@ metadatas
WMP
VSTHRD
CJK
+XiaoHe
+ZiRanMa
+WeiRuan
+ZhiNengABC
+ZiGuangPinYin
+PinYinJiaJia
+XingKongJianDao
+DaNiu
+XiaoLang
From 970aa5eefe89d3a3009753ed76a8bec64cd1d827 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Mon, 14 Jul 2025 21:24:11 +0800
Subject: [PATCH 1540/1798] Fix typo
---
.../UserSettings/Settings.cs | 2 +-
.../ChineseDetectionPerformanceTest.cs | 265 ++++++++++++++++++
2 files changed, 266 insertions(+), 1 deletion(-)
create mode 100644 Flow.Launcher.Test/ChineseDetectionPerformanceTest.cs
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 726a0023b..271f618da 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -514,7 +514,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
{
var list = FixedHotkeys();
- // Customizeable hotkeys
+ // Customizable hotkeys
if (!string.IsNullOrEmpty(Hotkey))
list.Add(new(Hotkey, "flowlauncherHotkey", () => Hotkey = ""));
if (!string.IsNullOrEmpty(PreviewHotkey))
diff --git a/Flow.Launcher.Test/ChineseDetectionPerformanceTest.cs b/Flow.Launcher.Test/ChineseDetectionPerformanceTest.cs
new file mode 100644
index 000000000..1747f2b4a
--- /dev/null
+++ b/Flow.Launcher.Test/ChineseDetectionPerformanceTest.cs
@@ -0,0 +1,265 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using NUnit.Framework;
+using NUnit.Framework.Legacy;
+using Flow.Launcher.Infrastructure;
+using ToolGood.Words.Pinyin;
+
+namespace Flow.Launcher.Test
+{
+ ///
+ /// Performance test comparing ContainsChinese() vs WordsHelper.HasChinese()
+ ///
+ /// This test verifies:
+ /// 1. Both methods produce identical results (correctness)
+ /// 2. Performance characteristics of both implementations
+ /// 3. Memory allocation patterns
+ ///
+ /// The ContainsChinese() method uses optimized Unicode range checking with ReadOnlySpan
+ /// while WordsHelper.HasChinese() uses the ToolGood.Words library implementation.
+ ///
+ [TestFixture]
+ public class ChineseDetectionPerformanceTest
+ {
+ private readonly List _testStrings = new()
+ {
+ // Pure English - should return false
+ "Hello World",
+ "Visual Studio Code",
+ "Microsoft Office 2023",
+ "Adobe Photoshop Creative Suite",
+ "Google Chrome Browser Application",
+
+ // Pure Chinese - should return true
+ "你好世界",
+ "微软办公软件",
+ "谷歌浏览器",
+ "北京大学计算机科学与技术学院",
+ "中华人民共和国国家发展和改革委员会",
+
+ // Mixed content - should return true
+ "Hello 世界",
+ "Visual Studio 代码编辑器",
+ "QQ音乐 Music Player",
+ "Windows 10 操作系统",
+ "GitHub 代码仓库管理平台",
+
+ // Edge cases
+ "",
+ " ",
+ "123456",
+ "!@#$%^&*()",
+ "café résumé naïve", // Accented characters (not Chinese)
+
+ // Long strings for performance testing
+ "This is a very long English string that contains no Chinese characters but is designed to test performance with longer text content that might appear in file names or application descriptions",
+ "这是一个非常长的中文字符串,包含了很多汉字,用来测试在处理较长中文文本时的性能表现,比如可能出现在文件名或应用程序描述中的文本内容",
+ "This is a mixed 混合内容的字符串 that contains both English and Chinese characters 中英文混合 to test performance with 复杂的文本内容 in real-world scenarios 真实场景中的应用"
+ };
+
+ [Test]
+ public void ContainsChinese_CorrectnessTest()
+ {
+ // Verify ContainsChinese works correctly for known cases
+ ClassicAssert.IsFalse(ContainsChinese("Hello World"), "Pure English should return false");
+ ClassicAssert.IsTrue(ContainsChinese("你好世界"), "Pure Chinese should return true");
+ ClassicAssert.IsTrue(ContainsChinese("Hello 世界"), "Mixed content should return true");
+ ClassicAssert.IsFalse(ContainsChinese(""), "Empty string should return false");
+ ClassicAssert.IsFalse(ContainsChinese("123456"), "Numbers should return false");
+ ClassicAssert.IsFalse(ContainsChinese("café résumé"), "Accented characters should return false");
+ }
+
+ [Test]
+ public void WordsHelper_CorrectnessTest()
+ {
+ // Verify WordsHelper.HasChinese works correctly for known cases
+ ClassicAssert.IsFalse(WordsHelper.HasChinese("Hello World"), "Pure English should return false");
+ ClassicAssert.IsTrue(WordsHelper.HasChinese("你好世界"), "Pure Chinese should return true");
+ ClassicAssert.IsTrue(WordsHelper.HasChinese("Hello 世界"), "Mixed content should return true");
+ ClassicAssert.IsFalse(WordsHelper.HasChinese(""), "Empty string should return false");
+ ClassicAssert.IsFalse(WordsHelper.HasChinese("123456"), "Numbers should return false");
+ ClassicAssert.IsFalse(WordsHelper.HasChinese("café résumé"), "Accented characters should return false");
+ }
+
+ [Test]
+ public void BothMethods_ShouldProduceSameResults()
+ {
+ // Critical test: verify both methods produce identical results for all test cases
+ foreach (var testString in _testStrings)
+ {
+ var wordsHelperResult = WordsHelper.HasChinese(testString);
+ var containsChineseResult = ContainsChinese(testString);
+
+ ClassicAssert.AreEqual(wordsHelperResult, containsChineseResult,
+ $"Results differ for string: '{testString}'. WordsHelper: {wordsHelperResult}, ContainsChinese: {containsChineseResult}");
+ }
+
+ Console.WriteLine($"✓ Both methods produce identical results for all {_testStrings.Count} test cases");
+ }
+
+ [Test]
+ public void PerformanceComparison_BasicBenchmark()
+ {
+ const int iterations = 1000000;
+
+ Console.WriteLine("=== CHINESE CHARACTER DETECTION PERFORMANCE TEST ===");
+ Console.WriteLine($"Test iterations: {iterations:N0}");
+ Console.WriteLine($"Test strings: {_testStrings.Count}");
+ Console.WriteLine($"Total operations: {iterations * _testStrings.Count:N0}");
+ Console.WriteLine();
+
+ // Warmup to ensure JIT compilation
+ Console.WriteLine("Warming up...");
+ for (int i = 0; i < 1000; i++)
+ {
+ foreach (var testString in _testStrings)
+ {
+ _ = ContainsChinese(testString);
+ _ = WordsHelper.HasChinese(testString);
+ }
+ }
+
+ // Benchmark ContainsChinese method
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ var sw1 = System.Diagnostics.Stopwatch.StartNew();
+ for (int i = 0; i < iterations; i++)
+ {
+ foreach (var testString in _testStrings)
+ {
+ _ = ContainsChinese(testString);
+ }
+ }
+ sw1.Stop();
+
+ // Benchmark WordsHelper.HasChinese method
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+
+ var sw2 = System.Diagnostics.Stopwatch.StartNew();
+ for (int i = 0; i < iterations; i++)
+ {
+ foreach (var testString in _testStrings)
+ {
+ _ = WordsHelper.HasChinese(testString);
+ }
+ }
+ sw2.Stop();
+
+ // Calculate and display results
+ var containsChineseMs = sw1.Elapsed.TotalMilliseconds;
+ var wordsHelperMs = sw2.Elapsed.TotalMilliseconds;
+ var speedRatio = wordsHelperMs / containsChineseMs;
+ var timeDifference = wordsHelperMs - containsChineseMs;
+
+ Console.WriteLine("RESULTS:");
+ Console.WriteLine($"ContainsChinese(): {containsChineseMs:F3} ms");
+ Console.WriteLine($"WordsHelper.HasChinese(): {wordsHelperMs:F3} ms");
+ Console.WriteLine($"Time difference: {timeDifference:F3} ms");
+ Console.WriteLine($"Speed improvement: {speedRatio:F2}x");
+ Console.WriteLine($"Performance gain: {((speedRatio - 1) * 100):F1}%");
+ Console.WriteLine();
+
+ if (speedRatio > 1.0)
+ {
+ Console.WriteLine($"✓ ContainsChinese() is {speedRatio:F2}x faster than WordsHelper.HasChinese()");
+ }
+ else
+ {
+ Console.WriteLine($"⚠ WordsHelper.HasChinese() is {(1/speedRatio):F2}x faster than ContainsChinese()");
+ }
+
+ // Test always passes - this is a measurement test
+ ClassicAssert.IsTrue(true);
+ }
+
+ [Test]
+ public void PerformanceComparison_ByStringType()
+ {
+ Console.WriteLine("=== PERFORMANCE BY STRING TYPE ===");
+
+ var categories = new Dictionary>
+ {
+ ["Pure English"] = _testStrings.Where(s => !ContainsChinese(s) && s.All(c => c <= 127)).ToList(),
+ ["Pure Chinese"] = _testStrings.Where(s => ContainsChinese(s) && s.All(c => IsChineseCharacter(c) || char.IsWhiteSpace(c))).ToList(),
+ ["Mixed Content"] = _testStrings.Where(s => ContainsChinese(s) && s.Any(c => c <= 127 && char.IsLetter(c))).ToList(),
+ ["Edge Cases"] = _testStrings.Where(s => string.IsNullOrWhiteSpace(s) || s.All(c => !char.IsLetter(c))).ToList()
+ };
+
+ foreach (var category in categories)
+ {
+ if (category.Value.Count == 0) continue;
+
+ Console.WriteLine($"\n{category.Key} ({category.Value.Count} strings):");
+
+ var sample = category.Value.First();
+ var displayText = sample.Length > 40 ? sample.Substring(0, 40) + "..." : sample;
+ Console.WriteLine($" Sample: '{displayText}'");
+
+ const int categoryIterations = 5000;
+
+ // Test each method
+ var sw1 = System.Diagnostics.Stopwatch.StartNew();
+ for (int i = 0; i < categoryIterations; i++)
+ {
+ foreach (var str in category.Value)
+ {
+ _ = ContainsChinese(str);
+ }
+ }
+ sw1.Stop();
+
+ var sw2 = System.Diagnostics.Stopwatch.StartNew();
+ for (int i = 0; i < categoryIterations; i++)
+ {
+ foreach (var str in category.Value)
+ {
+ _ = WordsHelper.HasChinese(str);
+ }
+ }
+ sw2.Stop();
+
+ var ratio = (double)sw2.ElapsedTicks / sw1.ElapsedTicks;
+ Console.WriteLine($" Performance: ContainsChinese is {ratio:F2}x faster");
+ }
+
+ ClassicAssert.IsTrue(true);
+ }
+
+ ///
+ /// Optimized Chinese character detection using comprehensive CJK Unicode ranges
+ /// This method uses ReadOnlySpan for better performance and covers all CJK character ranges
+ ///
+ private static bool ContainsChinese(ReadOnlySpan text)
+ {
+ foreach (var c in text)
+ {
+ if (IsChineseCharacter(c))
+ return true;
+ }
+ return false;
+ }
+
+ ///
+ /// Check if a character is a Chinese character using comprehensive Unicode ranges
+ /// Covers CJK Unified Ideographs and all extension blocks
+ ///
+ private static bool IsChineseCharacter(char c)
+ {
+ return (c >= 0x4E00 && c <= 0x9FFF) || // CJK Unified Ideographs (most common Chinese characters)
+ (c >= 0x3400 && c <= 0x4DBF) || // CJK Extension A
+ (c >= 0x20000 && c <= 0x2A6DF) || // CJK Extension B
+ (c >= 0x2A700 && c <= 0x2B73F) || // CJK Extension C
+ (c >= 0x2B740 && c <= 0x2B81F) || // CJK Extension D
+ (c >= 0x2B820 && c <= 0x2CEAF) || // CJK Extension E
+ (c >= 0x2CEB0 && c <= 0x2EBEF) || // CJK Extension F
+ (c >= 0xF900 && c <= 0xFAFF) || // CJK Compatibility Ideographs
+ (c >= 0x2F800 && c <= 0x2FA1F); // CJK Compatibility Supplement
+ }
+ }
+}
From f3bca632326a215836daa84cc3ef056fc1ad9157 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Mon, 14 Jul 2025 21:46:54 +0800
Subject: [PATCH 1541/1798] Update wording
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 2fca06605..acd38baac 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -106,7 +106,7 @@
Search with PinyinAllows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.Use Double Pinyin
- Allows using Double Pinyin to search. Double Pinyin is a variation of Pinyin that uses two characters.
+ Use Double Pinyin instead of Full Pinyin to search.Double Pinyin SchemaXiao HeZi Ran Ma
From dae16b9b8de42752162c21d07741425d86c62d4e Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Mon, 14 Jul 2025 21:53:49 +0800
Subject: [PATCH 1542/1798] Try to fix false spell check alarms by using stable
version
---
.github/workflows/spelling.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml
index 47bd66107..eb3bec416 100644
--- a/.github/workflows/spelling.yml
+++ b/.github/workflows/spelling.yml
@@ -72,7 +72,7 @@ jobs:
steps:
- name: check-spelling
id: spelling
- uses: check-spelling/check-spelling@prerelease
+ uses: check-spelling/check-spelling@0.0.25
with:
suppress_push_for_open_pull_request: 1
checkout: true
From c15ff61f92e6d1a5a755ca9c559a327728be3b5c Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Mon, 14 Jul 2025 22:19:34 +0800
Subject: [PATCH 1543/1798] Use stable version
---
.github/workflows/spelling.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml
index eb3bec416..ebea86d62 100644
--- a/.github/workflows/spelling.yml
+++ b/.github/workflows/spelling.yml
@@ -128,7 +128,7 @@ jobs:
if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request')
steps:
- name: comment
- uses: check-spelling/check-spelling@prerelease
+ uses: check-spelling/check-spelling@0.0.25
with:
checkout: true
spell_check_this: check-spelling/spell-check-this@main
From e08b73154880ae1b1065195a2b39c253937da587 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 15 Jul 2025 00:10:44 +0800
Subject: [PATCH 1544/1798] Disable line_forbidden.patterns
---
.../actions/spelling/line_forbidden.patterns | 124 +++++++++---------
1 file changed, 62 insertions(+), 62 deletions(-)
diff --git a/.github/actions/spelling/line_forbidden.patterns b/.github/actions/spelling/line_forbidden.patterns
index 7341d9b73..119d89321 100644
--- a/.github/actions/spelling/line_forbidden.patterns
+++ b/.github/actions/spelling/line_forbidden.patterns
@@ -1,62 +1,62 @@
-# reject `m_data` as there's a certain OS which has evil defines that break things if it's used elsewhere
-# \bm_data\b
-
-# If you have a framework that uses `it()` for testing and `fit()` for debugging a specific test,
-# you might not want to check in code where you were debugging w/ `fit()`, in which case, you might want
-# to use this:
-#\bfit\(
-
-# s.b. GitHub
-#\bGithub\b
-
-# s.b. GitLab
-\bGitlab\b
-
-# s.b. JavaScript
-\bJavascript\b
-
-# s.b. Microsoft
-\bMicroSoft\b
-
-# s.b. another
-\ban[- ]other\b
-
-# s.b. greater than
-\bgreater then\b
-
-# s.b. into
-\sin to\s
-
-# s.b. opt-in
-\sopt in\s
-
-# s.b. less than
-\bless then\b
-
-# s.b. otherwise
-\bother[- ]wise\b
-
-# s.b. nonexistent
-\bnon existing\b
-\b[Nn]o[nt][- ]existent\b
-
-# s.b. preexisting
-[Pp]re[- ]existing
-
-# s.b. preempt
-[Pp]re[- ]empt\b
-
-# s.b. preemptively
-[Pp]re[- ]emptively
-
-# s.b. reentrancy
-[Rr]e[- ]entrancy
-
-# s.b. reentrant
-[Rr]e[- ]entrant
-
-# s.b. workaround(s)
-\bwork[- ]arounds?\b
-
-# Reject duplicate words
-\s([A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})\s\g{-1}\s
+## reject `m_data` as there's a certain OS which has evil defines that break things if it's used elsewhere
+## \bm_data\b
+#
+## If you have a framework that uses `it()` for testing and `fit()` for debugging a specific test,
+## you might not want to check in code where you were debugging w/ `fit()`, in which case, you might want
+## to use this:
+##\bfit\(
+#
+## s.b. GitHub
+##\bGithub\b
+#
+## s.b. GitLab
+#\bGitlab\b
+#
+## s.b. JavaScript
+#\bJavascript\b
+#
+## s.b. Microsoft
+#\bMicroSoft\b
+#
+## s.b. another
+#\ban[- ]other\b
+#
+## s.b. greater than
+#\bgreater then\b
+#
+## s.b. into
+#\sin to\s
+#
+## s.b. opt-in
+#\sopt in\s
+#
+## s.b. less than
+#\bless then\b
+#
+## s.b. otherwise
+#\bother[- ]wise\b
+#
+## s.b. nonexistent
+#\bnon existing\b
+#\b[Nn]o[nt][- ]existent\b
+#
+## s.b. preexisting
+#[Pp]re[- ]existing
+#
+## s.b. preempt
+#[Pp]re[- ]empt\b
+#
+## s.b. preemptively
+#[Pp]re[- ]emptively
+#
+## s.b. reentrancy
+#[Rr]e[- ]entrancy
+#
+## s.b. reentrant
+#[Rr]e[- ]entrant
+#
+## s.b. workaround(s)
+#\bwork[- ]arounds?\b
+#
+## Reject duplicate words
+#\s([A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})\s\g{-1}\s
From ab0e6640734df9ab78e403f7576d83c897c9748c Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 15 Jul 2025 19:16:59 +0800
Subject: [PATCH 1545/1798] Use a stable version
---
.github/workflows/spelling.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml
index 47bd66107..f738263fa 100644
--- a/.github/workflows/spelling.yml
+++ b/.github/workflows/spelling.yml
@@ -72,7 +72,7 @@ jobs:
steps:
- name: check-spelling
id: spelling
- uses: check-spelling/check-spelling@prerelease
+ uses: check-spelling/check-spelling@0.0.24
with:
suppress_push_for_open_pull_request: 1
checkout: true
@@ -128,7 +128,7 @@ jobs:
if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request')
steps:
- name: comment
- uses: check-spelling/check-spelling@prerelease
+ uses: check-spelling/check-spelling@0.0.24
with:
checkout: true
spell_check_this: check-spelling/spell-check-this@main
From af50c7bdc3181665915656b3f52a46f52f860729 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 15 Jul 2025 19:57:42 +0800
Subject: [PATCH 1546/1798] Add double pinyin schemas to patterns
They are not well formed English words so can be rejected by built-in checks. Use regex as a workaround.
---
.github/actions/spelling/allow.txt | 2 --
.github/actions/spelling/expect.txt | 9 ---------
.github/actions/spelling/patterns.txt | 9 +++++++++
3 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
index a36a6af3e..1d7f12d4a 100644
--- a/.github/actions/spelling/allow.txt
+++ b/.github/actions/spelling/allow.txt
@@ -4,5 +4,3 @@ ssh
ubuntu
runcount
Firefox
-Português
-Português (Brasil)
diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
index d8c99bce9..0fea6d9ab 100644
--- a/.github/actions/spelling/expect.txt
+++ b/.github/actions/spelling/expect.txt
@@ -104,12 +104,3 @@ metadatas
WMP
VSTHRD
CJK
-XiaoHe
-ZiRanMa
-WeiRuan
-ZhiNengABC
-ZiGuangPinYin
-PinYinJiaJia
-XingKongJianDao
-DaNiu
-XiaoLang
diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt
index f308ec599..f7c54aa73 100644
--- a/.github/actions/spelling/patterns.txt
+++ b/.github/actions/spelling/patterns.txt
@@ -134,3 +134,12 @@
\bčeština\b
\bPortuguês\b
\bIoc\b
+\bXiaoHe\b
+\bZiRanMa\b
+\bWeiRuan\b
+\bZhiNengABC\b
+\bZiGuangPinYin\b
+\bPinYinJiaJia\b
+\bXingKongJianDao\b
+\bDaNiu\b
+\bXiaoLang\b
From a858aa8f5554b7e87d01c4c3d563516625ffdbc2 Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Tue, 15 Jul 2025 19:58:12 +0800
Subject: [PATCH 1547/1798] Update auto update desc
Co-authored-by: Jeremy Wu
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 3905df7c6..725d8d3e1 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -93,7 +93,7 @@
Always Start Typing in English ModeTemporarily change your input method to English mode when activating Flow.Auto Update
- Automatically check app updates and notify if there are any updates available
+ Automatically check and update the app when availableSelectHide Flow Launcher on startupFlow Launcher search window is hidden in the tray after starting up.
From 34238051cf2cca8be2cabec27d599548f27d2645 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 15 Jul 2025 20:03:17 +0800
Subject: [PATCH 1548/1798] Update spelling patterns to support optional spaces
in Pinyin matching
---
.github/actions/spelling/patterns.txt | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt
index f7c54aa73..eb8534c49 100644
--- a/.github/actions/spelling/patterns.txt
+++ b/.github/actions/spelling/patterns.txt
@@ -134,12 +134,12 @@
\bčeština\b
\bPortuguês\b
\bIoc\b
-\bXiaoHe\b
-\bZiRanMa\b
-\bWeiRuan\b
-\bZhiNengABC\b
-\bZiGuangPinYin\b
-\bPinYinJiaJia\b
-\bXingKongJianDao\b
-\bDaNiu\b
-\bXiaoLang\b
+\bXiao\s*He\b
+\bZi\s*Ran\s*Ma\b
+\bWei\s*Ruan\b
+\bZhi\s*Neng\s*ABC\b
+\bZi\s*Guang\s*Pin\s*Yin\b
+\bPin\s*Yin\s*Jia\s*Jia\b
+\bXing\s*Kong\s*Jian\s*Dao\b
+\bDa\s*Niu\b
+\bXiao\s*Lang\b
From 07415913ed5d0741fa021370bf459a89aad1c6f8 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 15 Jul 2025 20:05:03 +0800
Subject: [PATCH 1549/1798] Add word
---
.github/actions/spelling/allow.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
index 1d7f12d4a..5bcf16c97 100644
--- a/.github/actions/spelling/allow.txt
+++ b/.github/actions/spelling/allow.txt
@@ -4,3 +4,4 @@ ssh
ubuntu
runcount
Firefox
+workaround
\ No newline at end of file
From e3e8eff5c989b2a6ef28aefd185b2dbe98952f2f Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 15 Jul 2025 20:06:33 +0800
Subject: [PATCH 1550/1798] Fix EOF newline
---
.github/actions/spelling/allow.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
index 5bcf16c97..670a7a799 100644
--- a/.github/actions/spelling/allow.txt
+++ b/.github/actions/spelling/allow.txt
@@ -4,4 +4,4 @@ ssh
ubuntu
runcount
Firefox
-workaround
\ No newline at end of file
+workaround
From 37d6cea2d32822c9b26ede0ee6f2b1a1e4cf5f63 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Tue, 15 Jul 2025 22:10:07 +1000
Subject: [PATCH 1551/1798] fix typo
---
Flow.Launcher.Core/Plugin/PluginInstaller.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginInstaller.cs b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
index c00c83d9e..a79f4b47c 100644
--- a/Flow.Launcher.Core/Plugin/PluginInstaller.cs
+++ b/Flow.Launcher.Core/Plugin/PluginInstaller.cs
@@ -281,7 +281,7 @@ public static class PluginInstaller
///
/// Updates the plugin to the latest version available from its source.
///
- /// If true, do not show any messages when there is no udpate available.
+ /// If true, do not show any messages when there is no update available.
/// If true, only use the primary URL for updates.
/// Cancellation token to cancel the update operation.
///
From a34b8f2630a93c439dfea4107a9f27eeb5b3c464 Mon Sep 17 00:00:00 2001
From: WayneFerdon
Date: Tue, 15 Jul 2025 21:22:19 +0800
Subject: [PATCH 1552/1798] [Plugin.Sys Enhancement] Support returning all
usable commands while query is empty; ChangeQuery by ThemeSelector Action
with ActionKeyword at the front as well
---
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 39bf49654..09581709f 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -70,13 +70,19 @@ namespace Flow.Launcher.Plugin.Sys
return _themeSelector.Query(query);
}
- var commands = Commands();
+ var commands = Commands(query);
var results = new List();
+ var isEmptyQuery = string.IsNullOrEmpty(query.Search) || string.IsNullOrWhiteSpace(query.Search);
foreach (var c in commands)
{
var command = _settings.Commands.First(x => x.Key == c.Title);
c.Title = command.Name;
c.SubTitle = command.Description;
+ if (isEmptyQuery)
+ {
+ results.Add(c);
+ continue;
+ }
// Match from localized title & localized subtitle & keyword
var titleMatch = _context.API.FuzzySearch(query.Search, c.Title);
@@ -188,7 +194,7 @@ namespace Flow.Launcher.Plugin.Sys
}
}
- private List Commands()
+ private List Commands(Query query)
{
var results = new List();
var recycleBinFolder = "shell:RecycleBinFolder";
@@ -491,7 +497,7 @@ namespace Flow.Launcher.Plugin.Sys
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\ue790"),
Action = c =>
{
- _context.API.ChangeQuery($"{ThemeSelector.Keyword} ");
+ _context.API.ChangeQuery($"{query.ActionKeyword}{ (string.IsNullOrEmpty(query.ActionKeyword) ? string.Empty : Plugin.Query.ActionKeywordSeparator)}{ThemeSelector.Keyword}{Plugin.Query.ActionKeywordSeparator}");
return false;
}
}
From aece80390560dec310327817f6c26618a8bacabc Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Jul 2025 21:50:41 +0800
Subject: [PATCH 1553/1798] Simplify logic
---
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 09581709f..fc0770375 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -72,7 +72,7 @@ namespace Flow.Launcher.Plugin.Sys
var commands = Commands(query);
var results = new List();
- var isEmptyQuery = string.IsNullOrEmpty(query.Search) || string.IsNullOrWhiteSpace(query.Search);
+ var isEmptyQuery = string.IsNullOrWhiteSpace(query.Search);
foreach (var c in commands)
{
var command = _settings.Commands.First(x => x.Key == c.Title);
From 539a8523636678b8b10daa60181b04a13bc3cc25 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 15 Jul 2025 21:59:40 +0800
Subject: [PATCH 1554/1798] Improve logic
---
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index fc0770375..d2dcf6e5a 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -497,7 +497,15 @@ namespace Flow.Launcher.Plugin.Sys
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\ue790"),
Action = c =>
{
- _context.API.ChangeQuery($"{query.ActionKeyword}{ (string.IsNullOrEmpty(query.ActionKeyword) ? string.Empty : Plugin.Query.ActionKeywordSeparator)}{ThemeSelector.Keyword}{Plugin.Query.ActionKeywordSeparator}");
+ if (string.IsNullOrEmpty(query.ActionKeyword))
+ {
+ _context.API.ChangeQuery($"{ThemeSelector.Keyword}{Plugin.Query.ActionKeywordSeparator}");
+ }
+ else
+ {
+ _context.API.ChangeQuery($"{query.ActionKeyword}{Plugin.Query.ActionKeywordSeparator}{ThemeSelector.Keyword}{Plugin.Query.ActionKeywordSeparator}");
+
+ }
return false;
}
}
From 3bf1887362513444a45bd48e5b6c19f37056807b Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 15 Jul 2025 23:56:03 +0800
Subject: [PATCH 1555/1798] Intoduce dependency
---
.../Flow.Launcher.Plugin.Explorer.csproj | 1 +
1 file changed, 1 insertion(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index 93691814a..6b1fcdd0d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -47,6 +47,7 @@
+
From e116668ef9223ec24d3e4f8e1b26325ea9f9d4e7 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 15 Jul 2025 23:57:21 +0800
Subject: [PATCH 1556/1798] Rename file
---
.../Search/Everything/{SortOption.cs => EverythingSortOption.cs} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/{SortOption.cs => EverythingSortOption.cs} (100%)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/SortOption.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSortOption.cs
similarity index 100%
rename from Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/SortOption.cs
rename to Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSortOption.cs
From 363c0fb2a0984d7616c6fe7b496f1bef5ed7935e Mon Sep 17 00:00:00 2001
From: Kevin Zhang <45326534+taooceros@users.noreply.github.com>
Date: Tue, 15 Jul 2025 18:11:16 -0500
Subject: [PATCH 1557/1798] Update dotnet.yml
---
.github/workflows/dotnet.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
index 7498262de..812a56257 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/dotnet.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: windows-latest
env:
- FlowVersion: 1.19.5
+ FlowVersion: 1.20.2
NUGET_CERT_REVOCATION_MODE: offline
BUILD_NUMBER: ${{ github.run_number }}
steps:
From 5ed017b026ca3638a728b46027992aab7c691e07 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Wed, 16 Jul 2025 10:02:58 +0800
Subject: [PATCH 1558/1798] Revert line_forbidden.patterns
---
.../actions/spelling/line_forbidden.patterns | 124 +++++++++---------
1 file changed, 62 insertions(+), 62 deletions(-)
diff --git a/.github/actions/spelling/line_forbidden.patterns b/.github/actions/spelling/line_forbidden.patterns
index 119d89321..7341d9b73 100644
--- a/.github/actions/spelling/line_forbidden.patterns
+++ b/.github/actions/spelling/line_forbidden.patterns
@@ -1,62 +1,62 @@
-## reject `m_data` as there's a certain OS which has evil defines that break things if it's used elsewhere
-## \bm_data\b
-#
-## If you have a framework that uses `it()` for testing and `fit()` for debugging a specific test,
-## you might not want to check in code where you were debugging w/ `fit()`, in which case, you might want
-## to use this:
-##\bfit\(
-#
-## s.b. GitHub
-##\bGithub\b
-#
-## s.b. GitLab
-#\bGitlab\b
-#
-## s.b. JavaScript
-#\bJavascript\b
-#
-## s.b. Microsoft
-#\bMicroSoft\b
-#
-## s.b. another
-#\ban[- ]other\b
-#
-## s.b. greater than
-#\bgreater then\b
-#
-## s.b. into
-#\sin to\s
-#
-## s.b. opt-in
-#\sopt in\s
-#
-## s.b. less than
-#\bless then\b
-#
-## s.b. otherwise
-#\bother[- ]wise\b
-#
-## s.b. nonexistent
-#\bnon existing\b
-#\b[Nn]o[nt][- ]existent\b
-#
-## s.b. preexisting
-#[Pp]re[- ]existing
-#
-## s.b. preempt
-#[Pp]re[- ]empt\b
-#
-## s.b. preemptively
-#[Pp]re[- ]emptively
-#
-## s.b. reentrancy
-#[Rr]e[- ]entrancy
-#
-## s.b. reentrant
-#[Rr]e[- ]entrant
-#
-## s.b. workaround(s)
-#\bwork[- ]arounds?\b
-#
-## Reject duplicate words
-#\s([A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})\s\g{-1}\s
+# reject `m_data` as there's a certain OS which has evil defines that break things if it's used elsewhere
+# \bm_data\b
+
+# If you have a framework that uses `it()` for testing and `fit()` for debugging a specific test,
+# you might not want to check in code where you were debugging w/ `fit()`, in which case, you might want
+# to use this:
+#\bfit\(
+
+# s.b. GitHub
+#\bGithub\b
+
+# s.b. GitLab
+\bGitlab\b
+
+# s.b. JavaScript
+\bJavascript\b
+
+# s.b. Microsoft
+\bMicroSoft\b
+
+# s.b. another
+\ban[- ]other\b
+
+# s.b. greater than
+\bgreater then\b
+
+# s.b. into
+\sin to\s
+
+# s.b. opt-in
+\sopt in\s
+
+# s.b. less than
+\bless then\b
+
+# s.b. otherwise
+\bother[- ]wise\b
+
+# s.b. nonexistent
+\bnon existing\b
+\b[Nn]o[nt][- ]existent\b
+
+# s.b. preexisting
+[Pp]re[- ]existing
+
+# s.b. preempt
+[Pp]re[- ]empt\b
+
+# s.b. preemptively
+[Pp]re[- ]emptively
+
+# s.b. reentrancy
+[Rr]e[- ]entrancy
+
+# s.b. reentrant
+[Rr]e[- ]entrant
+
+# s.b. workaround(s)
+\bwork[- ]arounds?\b
+
+# Reject duplicate words
+\s([A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})\s\g{-1}\s
From 30f7ae0d6726557bdd6d5878e240fe8817847bb6 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Wed, 16 Jul 2025 21:28:17 +0800
Subject: [PATCH 1559/1798] Use Localization for Explorer plugin
---
.../Helper/SortOptionTranslationHelper.cs | 25 -----------
.../Languages/en.xaml | 41 ++++++++++++-------
Plugins/Flow.Launcher.Plugin.Explorer/Main.cs | 2 -
.../Search/Everything/EverythingAPI.cs | 7 ++--
.../Everything/EverythingApiDllImport.cs | 9 ++--
.../Everything/EverythingSearchOption.cs | 6 +--
.../Search/Everything/EverythingSortOption.cs | 32 ++++++++++++++-
.../Flow.Launcher.Plugin.Explorer/Settings.cs | 8 +---
.../ViewModels/SettingsViewModel.cs | 21 ++++++++--
.../Converters/EverythingEnumNameConverter.cs | 20 ---------
.../Views/ExplorerSettings.xaml | 21 +++-------
.../Views/ExplorerSettings.xaml.cs | 9 +---
12 files changed, 93 insertions(+), 108 deletions(-)
delete mode 100644 Plugins/Flow.Launcher.Plugin.Explorer/Helper/SortOptionTranslationHelper.cs
delete mode 100644 Plugins/Flow.Launcher.Plugin.Explorer/Views/Converters/EverythingEnumNameConverter.cs
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/SortOptionTranslationHelper.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/SortOptionTranslationHelper.cs
deleted file mode 100644
index 72f58f5b6..000000000
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/SortOptionTranslationHelper.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using Flow.Launcher.Plugin.Everything.Everything;
-using JetBrains.Annotations;
-using System;
-
-namespace Flow.Launcher.Plugin.Explorer.Helper;
-
-public static class SortOptionTranslationHelper
-{
- [CanBeNull]
- public static IPublicAPI API { get; internal set; }
-
- public static string GetTranslatedName(this SortOption sortOption)
- {
- const string prefix = "flowlauncher_plugin_everything_sort_by_";
-
- ArgumentNullException.ThrowIfNull(API);
-
- var enumName = Enum.GetName(sortOption);
- var splited = enumName!.Split('_');
- var name = string.Join('_', splited[..^1]);
- var direction = splited[^1];
-
- return $"{API.GetTranslation(prefix + name.ToLower())} {API.GetTranslation(prefix + direction.ToLower())}";
- }
-}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index 2e0f6a67d..6a28a5be8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -143,20 +143,33 @@
Warning: Everything service is not runningError while querying EverythingSort By
- Name
- Path
- Size
- Extension
- Type Name
- Date Created
- Date Modified
- Attributes
- File List FileName
- Run Count
- Date Recently Changed
- Date Accessed
- Date Run
- ↑
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓
+ ↓Warning: This is not a Fast Sort option, searches may be slow
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
index f1aea98b4..54292d550 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
@@ -42,8 +42,6 @@ namespace Flow.Launcher.Plugin.Explorer
contextMenu = new ContextMenu(Context, Settings, viewModel);
searchManager = new SearchManager(Settings, Context);
ResultManager.Init(Context, Settings);
-
- SortOptionTranslationHelper.API = context.API;
EverythingApiDllImport.Load(Path.Combine(Context.CurrentPluginMetadata.PluginDirectory, "EverythingSDK",
Environment.Is64BitProcess ? "x64" : "x86"));
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingAPI.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingAPI.cs
index 6159c9355..fd62566d5 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingAPI.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingAPI.cs
@@ -1,5 +1,4 @@
-using Flow.Launcher.Plugin.Everything.Everything;
-using Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions;
+using Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions;
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
@@ -36,7 +35,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.Everything
///
/// Checks whether the sort option is Fast Sort.
///
- public static bool IsFastSortOption(SortOption sortOption)
+ public static bool IsFastSortOption(EverythingSortOption sortOption)
{
var fastSortOptionEnabled = EverythingApiDllImport.Everything_IsFastSort(sortOption);
@@ -112,7 +111,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.Everything
EverythingApiDllImport.Everything_SetSort(option.SortOption);
EverythingApiDllImport.Everything_SetMatchPath(option.IsFullPathSearch);
- if (option.SortOption == SortOption.RUN_COUNT_DESCENDING)
+ if (option.SortOption == EverythingSortOption.RUN_COUNT_DESCENDING)
{
EverythingApiDllImport.Everything_SetRequestFlags(EVERYTHING_REQUEST_FULL_PATH_AND_FILE_NAME | EVERYTHING_REQUEST_RUN_COUNT);
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingApiDllImport.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingApiDllImport.cs
index 5b80819fa..c952a980c 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingApiDllImport.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingApiDllImport.cs
@@ -1,5 +1,4 @@
-using Flow.Launcher.Plugin.Everything.Everything;
-using System;
+using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
@@ -114,11 +113,11 @@ namespace Flow.Launcher.Plugin.Explorer.Search.Everything
// Everything 1.4
[DllImport(DLL)]
- public static extern void Everything_SetSort(SortOption dwSortType);
+ public static extern void Everything_SetSort(EverythingSortOption dwSortType);
[DllImport(DLL)]
- public static extern bool Everything_IsFastSort(SortOption dwSortType);
+ public static extern bool Everything_IsFastSort(EverythingSortOption dwSortType);
[DllImport(DLL)]
- public static extern SortOption Everything_GetSort();
+ public static extern EverythingSortOption Everything_GetSort();
[DllImport(DLL)]
public static extern uint Everything_GetResultListSort();
[DllImport(DLL)]
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchOption.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchOption.cs
index 92b8e9623..d8b670a08 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchOption.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSearchOption.cs
@@ -1,10 +1,8 @@
-using Flow.Launcher.Plugin.Everything.Everything;
-
-namespace Flow.Launcher.Plugin.Explorer.Search.Everything
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything
{
public record struct EverythingSearchOption(
string Keyword,
- SortOption SortOption,
+ EverythingSortOption SortOption,
bool IsContentSearch = false,
string ContentSearchKeyword = default,
string ParentPath = default,
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSortOption.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSortOption.cs
index 3c2fc3660..6a3d7cb67 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSortOption.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/Everything/EverythingSortOption.cs
@@ -1,31 +1,59 @@
-namespace Flow.Launcher.Plugin.Everything.Everything
+using Flow.Launcher.Localization.Attributes;
+
+namespace Flow.Launcher.Plugin.Explorer.Search.Everything
{
- public enum SortOption : uint
+ [EnumLocalize]
+ public enum EverythingSortOption : uint
{
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_name_ascending))]
NAME_ASCENDING = 1u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_name_descending))]
NAME_DESCENDING = 2u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_path_ascending))]
PATH_ASCENDING = 3u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_path_descending))]
PATH_DESCENDING = 4u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_size_ascending))]
SIZE_ASCENDING = 5u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_size_descending))]
SIZE_DESCENDING = 6u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_extension_ascending))]
EXTENSION_ASCENDING = 7u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_extension_descending))]
EXTENSION_DESCENDING = 8u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_type_name_ascending))]
TYPE_NAME_ASCENDING = 9u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_type_name_descending))]
TYPE_NAME_DESCENDING = 10u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_date_created_ascending))]
DATE_CREATED_ASCENDING = 11u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_date_created_descending))]
DATE_CREATED_DESCENDING = 12u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_date_modified_ascending))]
DATE_MODIFIED_ASCENDING = 13u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_date_modified_descending))]
DATE_MODIFIED_DESCENDING = 14u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_attributes_ascending))]
ATTRIBUTES_ASCENDING = 15u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_attributes_descending))]
ATTRIBUTES_DESCENDING = 16u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_file_list_filename_ascending))]
FILE_LIST_FILENAME_ASCENDING = 17u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_file_list_filename_descending))]
FILE_LIST_FILENAME_DESCENDING = 18u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_run_count_descending))]
RUN_COUNT_DESCENDING = 20u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_date_recently_changed_ascending))]
DATE_RECENTLY_CHANGED_ASCENDING = 21u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_date_recently_changed_descending))]
DATE_RECENTLY_CHANGED_DESCENDING = 22u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_date_accessed_ascending))]
DATE_ACCESSED_ASCENDING = 23u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_date_accessed_descending))]
DATE_ACCESSED_DESCENDING = 24u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_date_run_ascending))]
DATE_RUN_ASCENDING = 25u,
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_everything_sort_by_date_run_descending))]
DATE_RUN_DESCENDING = 26u
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
index 77540f3a8..672e81d03 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
@@ -1,5 +1,4 @@
-using Flow.Launcher.Plugin.Everything.Everything;
-using Flow.Launcher.Plugin.Explorer.Search;
+using Flow.Launcher.Plugin.Explorer.Search;
using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
using Flow.Launcher.Plugin.Explorer.Search.WindowsIndex;
@@ -145,10 +144,7 @@ namespace Flow.Launcher.Plugin.Explorer
public string EverythingInstalledPath { get; set; }
- [JsonIgnore]
- public SortOption[] SortOptions { get; set; } = Enum.GetValues();
-
- public SortOption SortOption { get; set; } = SortOption.NAME_ASCENDING;
+ public EverythingSortOption SortOption { get; set; } = EverythingSortOption.NAME_ASCENDING;
public bool EnableEverythingContentSearch { get; set; } = false;
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index 5aa6a13be..efffb19e0 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -35,6 +35,7 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
InitializeEngineSelection();
InitializeActionKeywordModels();
+ EverythingSortOptionLocalized.UpdateLabels(AllEverythingSortOptions);
}
public void Save()
@@ -578,6 +579,20 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
#region Everything FastSortWarning
+ public List AllEverythingSortOptions { get; } = EverythingSortOptionLocalized.GetValues();
+
+ public EverythingSortOption SelectedEverythingSortOption
+ {
+ get => Settings.SortOption;
+ set
+ {
+ Settings.SortOption = value;
+ OnPropertyChanged(nameof(SelectedEverythingSortOption));
+ OnPropertyChanged(nameof(FastSortWarningVisibility));
+ OnPropertyChanged(nameof(SortOptionWarningMessage));
+ }
+ }
+
public Visibility FastSortWarningVisibility
{
get
@@ -607,15 +622,15 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
// this method is used to determine if Everything service is running because as at Everything v1.4.1
// the sdk does not provide a dedicated interface to determine if it is running.
return EverythingApi.IsFastSortOption(Settings.SortOption) ? string.Empty
- : Context.API.GetTranslation("flowlauncher_plugin_everything_nonfastsort_warning");
+ : Localize.flowlauncher_plugin_everything_nonfastsort_warning();
}
catch (IPCErrorException)
{
- return Context.API.GetTranslation("flowlauncher_plugin_everything_is_not_running");
+ return Localize.flowlauncher_plugin_everything_is_not_running();
}
catch (DllNotFoundException)
{
- return Context.API.GetTranslation("flowlauncher_plugin_everything_sdk_issue");
+ return Localize.flowlauncher_plugin_everything_sdk_issue();
}
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/Converters/EverythingEnumNameConverter.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/Converters/EverythingEnumNameConverter.cs
deleted file mode 100644
index e24b21dcd..000000000
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/Converters/EverythingEnumNameConverter.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using Flow.Launcher.Plugin.Everything.Everything;
-using Flow.Launcher.Plugin.Explorer.Helper;
-using System;
-using System.Globalization;
-using System.Windows.Data;
-
-namespace Flow.Launcher.Plugin.Explorer.Views.Converters;
-
-public class EnumNameConverter : IValueConverter
-{
- public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
- {
- return value is SortOption option ? option.GetTranslatedName() : value;
- }
-
- public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
- {
- throw new NotImplementedException();
- }
-}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index 59373b4de..08abc3ba6 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -2,7 +2,6 @@
x:Class="Flow.Launcher.Plugin.Explorer.Views.ExplorerSettings"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:converters="clr-namespace:Flow.Launcher.Plugin.Explorer.Views.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:qa="clr-namespace:Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks"
@@ -74,8 +73,6 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/PluginUpdateWindow.xaml.cs b/Flow.Launcher/PluginUpdateWindow.xaml.cs
new file mode 100644
index 000000000..20f033425
--- /dev/null
+++ b/Flow.Launcher/PluginUpdateWindow.xaml.cs
@@ -0,0 +1,85 @@
+using System.Collections.Generic;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Infrastructure.UserSettings;
+
+namespace Flow.Launcher
+{
+ public partial class PluginUpdateWindow : Window
+ {
+ public List Plugins { get; set; } = new();
+ public bool Restart { get; set; }
+
+ private readonly Settings _settings = Ioc.Default.GetRequiredService();
+
+ public PluginUpdateWindow(List allPlugins)
+ {
+ Restart = _settings.AutoRestartAfterChanging;
+ InitializeComponent();
+ foreach (var plugin in allPlugins)
+ {
+ var checkBox = new CheckBox
+ {
+ Content = string.Format(App.API.GetTranslation("updatePluginCheckboxContent"), plugin.Name, plugin.CurrentVersion, plugin.NewVersion),
+ IsChecked = true,
+ Margin = new Thickness(0, 5, 0, 5),
+ Tag = plugin,
+ VerticalAlignment = VerticalAlignment.Center,
+ };
+ checkBox.Checked += CheckBox_Checked;
+ checkBox.Unchecked += CheckBox_Unchecked;
+ UpdatePluginStackPanel.Children.Add(checkBox);
+ Plugins.Add(plugin);
+ }
+ }
+
+ private void CheckBox_Checked(object sender, RoutedEventArgs e)
+ {
+ if (sender is not CheckBox cb) return;
+ if (cb.Tag is not PluginUpdateInfo plugin) return;
+ if (!Plugins.Contains(plugin))
+ {
+ Plugins.Add(plugin);
+ }
+ }
+
+ private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
+ {
+ if (sender is not CheckBox cb) return;
+ if (cb.Tag is not PluginUpdateInfo plugin) return;
+ if (Plugins.Contains(plugin))
+ {
+ Plugins.Remove(plugin);
+ }
+ }
+
+ private void BtnCancel_OnClick(object sender, RoutedEventArgs e)
+ {
+ DialogResult = false;
+ Close();
+ }
+
+ private void btnUpdate_OnClick(object sender, RoutedEventArgs e)
+ {
+ if (Plugins.Count == 0)
+ {
+ App.API.ShowMsgBox(App.API.GetTranslation("updatePluginNoSelected"));
+ return;
+ }
+
+ _ = PluginInstaller.UpdateAllPluginsAsync(Plugins, Restart);
+
+ DialogResult = true;
+ Close();
+ }
+
+ private void cmdEsc_OnPress(object sender, ExecutedRoutedEventArgs e)
+ {
+ DialogResult = false;
+ Close();
+ }
+ }
+}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
index 96cd44072..140a1765b 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using System.Windows;
using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Plugin;
@@ -112,7 +113,14 @@ public partial class SettingsPanePluginStoreViewModel : BaseModel
[RelayCommand]
private async Task CheckPluginUpdatesAsync()
{
- await PluginInstaller.CheckForPluginUpdatesAsync(silentUpdate: false);
+ await PluginInstaller.CheckForPluginUpdatesAsync((plugins) =>
+ {
+ Application.Current.Dispatcher.Invoke(() =>
+ {
+ var pluginUpdateWindow = new PluginUpdateWindow(plugins);
+ pluginUpdateWindow.ShowDialog();
+ });
+ }, silentUpdate: false);
}
private static string GetFileFromDialog(string title, string filter = "")
From c4090bbfe1275b2c1851c0dcd7afbc266da60606 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 18 Jul 2025 15:29:52 +0800
Subject: [PATCH 1572/1798] Use ScrollViewer for max height
---
Flow.Launcher/PluginUpdateWindow.xaml | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/PluginUpdateWindow.xaml b/Flow.Launcher/PluginUpdateWindow.xaml
index eb7e2219d..04cd1f7bc 100644
--- a/Flow.Launcher/PluginUpdateWindow.xaml
+++ b/Flow.Launcher/PluginUpdateWindow.xaml
@@ -66,7 +66,13 @@
Text="{DynamicResource updateAllPluginsButtonContent}"
TextAlignment="Left" />
-
+
+
+
Date: Fri, 18 Jul 2025 21:07:53 +0800
Subject: [PATCH 1573/1798] Update labels on first get
---
.../ViewModels/SettingsViewModel.cs | 15 +++++++++++++--
.../Views/ExplorerSettings.xaml.cs | 2 --
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index efffb19e0..171b5ce00 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -35,7 +35,6 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
InitializeEngineSelection();
InitializeActionKeywordModels();
- EverythingSortOptionLocalized.UpdateLabels(AllEverythingSortOptions);
}
public void Save()
@@ -579,7 +578,19 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
#region Everything FastSortWarning
- public List AllEverythingSortOptions { get; } = EverythingSortOptionLocalized.GetValues();
+ private List _allEverythingSortOptions = new();
+ public List AllEverythingSortOptions
+ {
+ get
+ {
+ if (_allEverythingSortOptions.Count == 0)
+ {
+ _allEverythingSortOptions = EverythingSortOptionLocalized.GetValues();
+ EverythingSortOptionLocalized.UpdateLabels(_allEverythingSortOptions);
+ }
+ return _allEverythingSortOptions;
+ }
+ }
public EverythingSortOption SelectedEverythingSortOption
{
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
index ddbaa7d70..38928ff03 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
@@ -39,8 +39,6 @@ namespace Flow.Launcher.Plugin.Explorer.Views
ExcludedPathsExpander
};
- // Update labels because the view model is initialized in InitAsync
- Search.Everything.EverythingSortOptionLocalized.UpdateLabels(_viewModel.AllEverythingSortOptions);
}
private void AccessLinkDragDrop(string containerName, DragEventArgs e)
From b03dae638faa1e2ef9b9b3f31e2f1e5011ebe76f Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Fri, 18 Jul 2025 21:17:48 +0800
Subject: [PATCH 1574/1798] Remove redundent save settings call
---
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 5a589f24f..8c137a497 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
@@ -81,7 +81,7 @@ namespace Flow.Launcher.Plugin.Explorer
Context.API.GetTranslation("plugin_explorer_addfilefoldersuccess_detail"),
Constants.ExplorerIconImageFullPath);
- Context.API.SaveSettingJsonStorage();
+
return true;
},
@@ -105,7 +105,7 @@ namespace Flow.Launcher.Plugin.Explorer
Context.API.GetTranslation("plugin_explorer_removefilefoldersuccess_detail"),
Constants.ExplorerIconImageFullPath);
- Context.API.SaveSettingJsonStorage();
+
return true;
},
From 5d0bf8f882cd0bea4401f4d8dd5455fedae2c18f Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Fri, 18 Jul 2025 21:22:29 +0800
Subject: [PATCH 1575/1798] Update spell check
---
.github/actions/spelling/allow.txt | 2 ++
.github/actions/spelling/patterns.txt | 6 ++++++
2 files changed, 8 insertions(+)
diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
index a36a6af3e..5a5193585 100644
--- a/.github/actions/spelling/allow.txt
+++ b/.github/actions/spelling/allow.txt
@@ -6,3 +6,5 @@ runcount
Firefox
Português
Português (Brasil)
+favicons
+moz
diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt
index f308ec599..e79343a77 100644
--- a/.github/actions/spelling/patterns.txt
+++ b/.github/actions/spelling/patterns.txt
@@ -124,6 +124,10 @@
# version suffix v#
(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_]))
+# Non-English
+[a-zA-Z]*[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3}[a-zA-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]*
+
+
\bjjw24\b
\bappref-ms\b
\bTobiasSekan\b
@@ -134,3 +138,5 @@
\bčeština\b
\bPortuguês\b
\bIoc\b
+\b[Ss]ettings [Ss]ettings\b
+
From 81ae8a46870cdfc9445ed57362b2603483a84594 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Fri, 18 Jul 2025 21:33:32 +0800
Subject: [PATCH 1576/1798] Only assign when value is different
---
.../ViewModels/SettingsViewModel.cs | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index 676a0239b..b50496e6e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -611,6 +611,8 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
get => Settings.SortOption;
set
{
+ if (value == Settings.SortOption)
+ return;
Settings.SortOption = value;
OnPropertyChanged(nameof(SelectedEverythingSortOption));
OnPropertyChanged(nameof(FastSortWarningVisibility));
From 56128a12a862f1e09fb848e771e7dd6a4fb9e712 Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Sat, 19 Jul 2025 18:08:42 +1000
Subject: [PATCH 1577/1798] update readme
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index dee89aca3..692291cc0 100644
--- a/README.md
+++ b/README.md
@@ -395,7 +395,7 @@ Get in touch if you like to join the Flow-Launcher Team and help build this grea
### Developing/Debugging
-- Flow Launcher's target framework is .Net 7
+- Flow Launcher's target framework is .Net 9
- Install Visual Studio 2022
From 50377388dd9d9c1892afec5c110f8d25bee9b4f5 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 19 Jul 2025 16:19:24 +0800
Subject: [PATCH 1578/1798] Remove duplicated nuget packages
---
.../Flow.Launcher.Infrastructure.csproj | 6 ------
1 file changed, 6 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 9f3ab8a67..be9e4e0f9 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -72,15 +72,9 @@
-
- all
-
-
-
-
\ No newline at end of file
From 0e4c3208be68e78729973a5fe241fe5a4409595b Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Sat, 19 Jul 2025 21:17:33 +1000
Subject: [PATCH 1579/1798] split readme changes out
---
README.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 692291cc0..4cd8e059e 100644
--- a/README.md
+++ b/README.md
@@ -395,11 +395,11 @@ Get in touch if you like to join the Flow-Launcher Team and help build this grea
### Developing/Debugging
-- Flow Launcher's target framework is .Net 9
+- Flow Launcher's target framework is .Net 7
- Install Visual Studio 2022
-- Install .Net 9 SDK
+- Install .Net 7 SDK
- via Visual Studio installer
- - via winget `winget install Microsoft.DotNet.SDK.9`
- - Manually from [here](https://dotnet.microsoft.com/en-us/download/dotnet/9.0)
+ - via winget `winget install Microsoft.DotNet.SDK.7`
+ - Manually from [here](https://dotnet.microsoft.com/en-us/download/dotnet/7.0)
From fe4984a9ae3d5313ed9b1d81d7e6fbfc3cae2af3 Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Sat, 19 Jul 2025 21:23:13 +1000
Subject: [PATCH 1580/1798] update readme for .Net 9
---
README.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 4cd8e059e..692291cc0 100644
--- a/README.md
+++ b/README.md
@@ -395,11 +395,11 @@ Get in touch if you like to join the Flow-Launcher Team and help build this grea
### Developing/Debugging
-- Flow Launcher's target framework is .Net 7
+- Flow Launcher's target framework is .Net 9
- Install Visual Studio 2022
-- Install .Net 7 SDK
+- Install .Net 9 SDK
- via Visual Studio installer
- - via winget `winget install Microsoft.DotNet.SDK.7`
- - Manually from [here](https://dotnet.microsoft.com/en-us/download/dotnet/7.0)
+ - via winget `winget install Microsoft.DotNet.SDK.9`
+ - Manually from [here](https://dotnet.microsoft.com/en-us/download/dotnet/9.0)
From 7af3c5febfe1877aba59f55bb31a756d32a69df0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 19 Jul 2025 20:26:33 +0800
Subject: [PATCH 1581/1798] Upgrade NuGet dependency
---
Flow.Launcher.Core/Flow.Launcher.Core.csproj | 6 +-
Flow.Launcher.Core/packages.lock.json | 126 +--
.../Flow.Launcher.Infrastructure.csproj | 14 +-
Flow.Launcher.Infrastructure/Win32Helper.cs | 10 +-
.../packages.lock.json | 100 +--
.../Flow.Launcher.Plugin.csproj | 8 +-
Flow.Launcher.Plugin/packages.lock.json | 52 +-
Flow.Launcher.Test/Flow.Launcher.Test.csproj | 6 +-
Flow.Launcher/Flow.Launcher.csproj | 15 +-
Flow.Launcher/packages.lock.json | 725 +++++++++++-------
...low.Launcher.Plugin.BrowserBookmark.csproj | 2 +-
.../Flow.Launcher.Plugin.Explorer.csproj | 5 +-
.../Flow.Launcher.Plugin.ProcessKiller.csproj | 2 +-
.../ProcessHelper.cs | 15 +-
.../Flow.Launcher.Plugin.Program.csproj | 4 +-
.../Programs/ShellLocalization.cs | 44 +-
.../Flow.Launcher.Plugin.Sys.csproj | 2 +-
17 files changed, 685 insertions(+), 451 deletions(-)
diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
index b31793450..527950061 100644
--- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj
+++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
@@ -55,12 +55,12 @@
-
-
+
+
-
+
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index 0c513951b..067c704af 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -13,15 +13,15 @@
},
"FSharp.Core": {
"type": "Direct",
- "requested": "[9.0.101, )",
- "resolved": "9.0.101",
- "contentHash": "3/YR1SDWFA+Ojx9HiBwND+0UR8ZWoeZfkhD0DWAPCDdr/YI+CyFkArmMGzGSyPXeYtjG0sy0emzfyNwjt7zhig=="
+ "requested": "[9.0.300, )",
+ "resolved": "9.0.300",
+ "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ=="
},
"Meziantou.Framework.Win32.Jobs": {
"type": "Direct",
- "requested": "[3.4.0, )",
- "resolved": "3.4.0",
- "contentHash": "5GGLckfpwoC1jznInEYfK2INrHyD7K1RtwZJ98kNPKBU6jeu24i4zfgDGHHfb+eK3J+eFPAxo0aYcbUxNXIbNw=="
+ "requested": "[3.4.3, )",
+ "resolved": "3.4.3",
+ "contentHash": "REjInKnQ0OrhjjtSMPQtLtdURctCroB4L8Sd2gjTOYDysklvsdnrStx1tHS7uLv+fSyFF3aazZmo5Ka0v1oz/w=="
},
"Microsoft.IO.RecyclableMemoryStream": {
"type": "Direct",
@@ -29,6 +29,12 @@
"resolved": "3.0.1",
"contentHash": "s/s20YTVY9r9TPfTrN5g8zPF1YhwxyqO6PxUkrYTGI2B+OGPe9AdajWZrLhFqXIvqIW23fnUE4+ztrUWNU1+9g=="
},
+ "SemanticVersioning": {
+ "type": "Direct",
+ "requested": "[3.0.0, )",
+ "resolved": "3.0.0",
+ "contentHash": "RR+8GbPQ/gjDqov/1QN1OPoUlbUruNwcL3WjWCeLw+MY7+od/ENhnkYxCfAC6rQLIu3QifaJt3kPYyP3RumqMQ=="
+ },
"squirrel.windows": {
"type": "Direct",
"requested": "[1.5.2, )",
@@ -42,16 +48,15 @@
},
"StreamJsonRpc": {
"type": "Direct",
- "requested": "[2.20.20, )",
- "resolved": "2.20.20",
- "contentHash": "gwG7KViLbSWS7EI0kYevinVmIga9wZNrpSY/FnWyC6DbdjKJ1xlv/FV1L9b0rLkVP8cGxfIMexdvo/+2W5eq6Q==",
+ "requested": "[2.22.11, )",
+ "resolved": "2.22.11",
+ "contentHash": "TQcqBFswLNpdSJANjhxZmIIe0Yl0kGqzjZ+uHLdhrkxntofvNu6C53XPEEYQ3Wkj8AorKumkuv/VMvTH4BHOZw==",
"dependencies": {
- "MessagePack": "2.5.187",
- "Microsoft.VisualStudio.Threading": "17.10.48",
- "Microsoft.VisualStudio.Threading.Analyzers": "17.10.48",
+ "MessagePack": "2.5.192",
+ "Microsoft.VisualStudio.Threading.Only": "17.13.61",
"Microsoft.VisualStudio.Validation": "17.8.8",
- "Nerdbank.Streams": "2.11.74",
- "Newtonsoft.Json": "13.0.1",
+ "Nerdbank.Streams": "2.12.87",
+ "Newtonsoft.Json": "13.0.3",
"System.IO.Pipelines": "8.0.0"
}
},
@@ -65,8 +70,8 @@
},
"BitFaster.Caching": {
"type": "Transitive",
- "resolved": "2.5.3",
- "contentHash": "Vo/39qcam5Xe+DbyfH0JZyqPswdOoa7jv4PGtRJ6Wj8AU+aZ+TuJRlJcIe+MQjRTJwliI8k8VSQpN8sEoBIv2g=="
+ "resolved": "2.5.4",
+ "contentHash": "1QroTY1PVCZOSG9FnkkCrmCKk/+bZCgI/YXq376HnYwUDJ4Ho0EaV4YaA/5v5WYLnwIwIO7RZkdWbg9pxIpueQ=="
},
"CommunityToolkit.Mvvm": {
"type": "Transitive",
@@ -85,36 +90,36 @@
},
"MemoryPack": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "cwCtED8y400vMWx/Vp0QCSeEpVFjDU4JwF52VX9WTaqVERUvNqjG9n6osFlmFuytegyXnHvYEu1qRJ8rv/rkbg==",
+ "resolved": "1.21.4",
+ "contentHash": "wy3JTBNBsO8LfQcBvvYsWr3lm2Oakolrfu0UQ3oSJSEiD+7ye0GUhYTaXuYYBowqsXBXWD9gf2218ae0JRiYVQ==",
"dependencies": {
- "MemoryPack.Core": "1.21.3",
- "MemoryPack.Generator": "1.21.3"
+ "MemoryPack.Core": "1.21.4",
+ "MemoryPack.Generator": "1.21.4"
}
},
"MemoryPack.Core": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "ajrYoBWT2aKeH4tlY8q/1C9qK1R/NK+7FkuVOX58ebOSxkABoFTqCR7W+Zk2rakUHZiEgNdRqO67hiRZPq6fLA=="
+ "resolved": "1.21.4",
+ "contentHash": "6RszGorZ0ejNmp37ZcboPBMvvPCuNW2jlrdQfcs/lMzE5b3pmPF6hsm/laDc34hRlbAST1ZxaX/DvYu2DF5sBQ=="
},
"MemoryPack.Generator": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "hYU0TAIarDKnbkNIWvb7P4zBUL+CTahkuNkczsKvycSMR5kiwQ4IfLexywNKX3s05Izp4gzDSPbueepNWZRpWA=="
+ "resolved": "1.21.4",
+ "contentHash": "g14EsSS85yn0lHTi0J9ivqlZMf09A2iI51fmI+0KkzIzyCbWOBWPi5mdaY7YWmXprk12aYh9u/qfWHQUYthlwg=="
},
"MessagePack": {
"type": "Transitive",
- "resolved": "2.5.187",
- "contentHash": "uW4j8m4Nc+2Mk5n6arOChavJ9bLjkis0qWASOj2h2OwmfINuzYv+mjCHUymrYhmyyKTu3N+ObtTXAY4uQ7jIhg==",
+ "resolved": "2.5.192",
+ "contentHash": "Jtle5MaFeIFkdXtxQeL9Tu2Y3HsAQGoSntOzrn6Br/jrl6c8QmG22GEioT5HBtZJR0zw0s46OnKU8ei2M3QifA==",
"dependencies": {
- "MessagePack.Annotations": "2.5.187",
+ "MessagePack.Annotations": "2.5.192",
"Microsoft.NET.StringTools": "17.6.3"
}
},
"MessagePack.Annotations": {
"type": "Transitive",
- "resolved": "2.5.187",
- "contentHash": "/IvvMMS8opvlHjEJ/fR2Cal4Co726Kj77Z8KiohFhuHfLHHmb9uUxW5+tSCL4ToKFfkQlrS3HD638mRq83ySqA=="
+ "resolved": "2.5.192",
+ "contentHash": "jaJuwcgovWIZ8Zysdyf3b7b34/BrADw4v82GaEZymUhDd3ScMPrYd/cttekeDteJJPXseJxp04yTIcxiVUjTWg=="
},
"Microsoft.NET.StringTools": {
"type": "Transitive",
@@ -123,17 +128,26 @@
},
"Microsoft.VisualStudio.Threading": {
"type": "Transitive",
- "resolved": "17.12.19",
- "contentHash": "eLiGMkMYyaSguqHs3lsrFxy3tAWSLuPEL2pIWRcADMDVAs2xqm3dr1d9QYjiEusTgiClF9KD6OB2NdZP72Oy0Q==",
+ "resolved": "17.14.15",
+ "contentHash": "1DrCusT3xNLSlaJg77BsUSAzrhjdZBAvvsS0PMzyPM+fGais6SnISOhqdZQop8VVMIBLsYm2gyF9W7THjgavwA==",
"dependencies": {
- "Microsoft.VisualStudio.Threading.Analyzers": "17.12.19",
+ "Microsoft.VisualStudio.Threading.Analyzers": "17.14.15",
+ "Microsoft.VisualStudio.Threading.Only": "17.14.15",
"Microsoft.VisualStudio.Validation": "17.8.8"
}
},
"Microsoft.VisualStudio.Threading.Analyzers": {
"type": "Transitive",
- "resolved": "17.12.19",
- "contentHash": "v3IYeedjoktvZ+GqYmLudxZJngmf/YWIxNT2Uy6QMMN19cvw+nkWoip1Gr1RtnFkUo1MPUVMis4C8Kj8d8DpSQ=="
+ "resolved": "17.14.15",
+ "contentHash": "mXQPJsbuUD2ydq4/ffd8h8tSOFCXec+2xJOVNCvXjuMOq/+5EKHq3D2m2MC2+nUaXeFMSt66VS/J4HdKBixgcw=="
+ },
+ "Microsoft.VisualStudio.Threading.Only": {
+ "type": "Transitive",
+ "resolved": "17.14.15",
+ "contentHash": "NqONyw1RXyj9P3k5e1uU2k9kc1ptwuU5NJQzG+MPq7vQVHUzBY8HLuJf/N2Rw5H/myD96CVxziDxmjawPuzntw==",
+ "dependencies": {
+ "Microsoft.VisualStudio.Validation": "17.8.8"
+ }
},
"Microsoft.VisualStudio.Validation": {
"type": "Transitive",
@@ -142,8 +156,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.2",
- "contentHash": "5BkGZ6mHp2dHydR29sb0fDfAuqkv30AHtTih8wMzvPZysOmBFvHfnkR2w3tsc0pSiIg8ZoKyefJXWy9r3pBh0w=="
+ "resolved": "9.0.7",
+ "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
},
"Mono.Cecil": {
"type": "Transitive",
@@ -152,31 +166,28 @@
},
"Nerdbank.Streams": {
"type": "Transitive",
- "resolved": "2.11.74",
- "contentHash": "r4G7uHHfoo8LCilPOdtf2C+Q5ymHOAXtciT4ZtB2xRlAvv4gPkWBYNAijFblStv3+uidp81j5DP11jMZl4BfJw==",
+ "resolved": "2.12.87",
+ "contentHash": "oDKOeKZ865I5X8qmU3IXMyrAnssYEiYWTobPGdrqubN3RtTzEHIv+D6fwhdcfrdhPJzHjCkK/ORztR/IsnmA6g==",
"dependencies": {
- "Microsoft.VisualStudio.Threading": "17.10.48",
+ "Microsoft.VisualStudio.Threading.Only": "17.13.61",
"Microsoft.VisualStudio.Validation": "17.8.8",
"System.IO.Pipelines": "8.0.0"
}
},
"Newtonsoft.Json": {
"type": "Transitive",
- "resolved": "13.0.1",
- "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
+ "resolved": "13.0.3",
+ "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
},
"NLog": {
"type": "Transitive",
"resolved": "4.7.10",
"contentHash": "rcegW7kYOCjl7wX0SzsqpPBqnJ51JKi1WkYb6QBVX0Wc5IgH19Pv4t/co+T0s06OS0Ne44xgkY/mHg0PdrmJow=="
},
- "PropertyChanged.Fody": {
+ "SharpVectors.Wpf": {
"type": "Transitive",
- "resolved": "3.4.0",
- "contentHash": "IAZyq0uolKo2WYm4mjx+q7A8fSGFT0x2e1s3y+ODn4JI0kqTDoo9GF2tdaypUzRFJZfdMxfC5HZW9QzdJLtOnA==",
- "dependencies": {
- "Fody": "6.5.1"
- }
+ "resolved": "1.8.4.2",
+ "contentHash": "PNxLkMBJnV8A+6yH9OqOlhLJegvWP/dvh0rAJp2l0kcrR+rB4R2tQ9vhUqka+UilH4atN8T6zvjDOizVyfz2Ng=="
},
"Splat": {
"type": "Transitive",
@@ -185,10 +196,10 @@
},
"System.Drawing.Common": {
"type": "Transitive",
- "resolved": "9.0.2",
- "contentHash": "JU947wzf8JbBS16Y5EIZzAlyQU+k68D7LRx6y03s2wlhlvLqkt/8uPBrjv2hJnnaJKbdb0GhQ3JZsfYXhrRjyg==",
+ "resolved": "9.0.7",
+ "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.2"
+ "Microsoft.Win32.SystemEvents": "9.0.7"
}
},
"System.IO.Pipelines": {
@@ -215,22 +226,21 @@
"type": "Project",
"dependencies": {
"Ben.Demystifier": "[0.4.1, )",
- "BitFaster.Caching": "[2.5.3, )",
+ "BitFaster.Caching": "[2.5.4, )",
"CommunityToolkit.Mvvm": "[8.4.0, )",
- "Flow.Launcher.Plugin": "[4.4.0, )",
- "MemoryPack": "[1.21.3, )",
- "Microsoft.VisualStudio.Threading": "[17.12.19, )",
+ "Flow.Launcher.Plugin": "[4.7.0, )",
+ "MemoryPack": "[1.21.4, )",
+ "Microsoft.VisualStudio.Threading": "[17.14.15, )",
"NLog": "[4.7.10, )",
- "PropertyChanged.Fody": "[3.4.0, )",
- "System.Drawing.Common": "[9.0.2, )",
+ "SharpVectors.Wpf": "[1.8.4.2, )",
+ "System.Drawing.Common": "[9.0.7, )",
"ToolGood.Words.Pinyin": "[3.0.1.4, )"
}
},
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2024.3.0, )",
- "PropertyChanged.Fody": "[3.4.0, )"
+ "JetBrains.Annotations": "[2024.3.0, )"
}
}
}
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index be9e4e0f9..dd9a305a2 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -1,4 +1,4 @@
-
+net9.0-windows
@@ -54,24 +54,24 @@
-
+
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
-
+ all
-
+
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 32ed31137..57c41181b 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -118,9 +118,9 @@ namespace Flow.Launcher.Infrastructure
#region Window Foreground
- public static nint GetForegroundWindow()
+ public static unsafe nint GetForegroundWindow()
{
- return PInvoke.GetForegroundWindow().Value;
+ return (nint)PInvoke.GetForegroundWindow().Value;
}
public static bool SetForegroundWindow(Window window)
@@ -279,7 +279,7 @@ namespace Flow.Launcher.Infrastructure
{
var hWndDesktop = PInvoke.FindWindowEx(hWnd, HWND.Null, "SHELLDLL_DefView", null);
hWndDesktop = PInvoke.FindWindowEx(hWndDesktop, HWND.Null, "SysListView32", "FolderView");
- if (hWndDesktop.Value != IntPtr.Zero)
+ if (hWndDesktop != HWND.Null)
{
return false;
}
@@ -480,7 +480,7 @@ namespace Flow.Launcher.Infrastructure
/// Restores the previously backed-up keyboard layout.
/// If it wasn't backed up or has already been restored, this method does nothing.
///
- public static void RestorePreviousKeyboardLayout()
+ public unsafe static void RestorePreviousKeyboardLayout()
{
if (_previousLayout == HKL.Null) return;
@@ -491,7 +491,7 @@ namespace Flow.Launcher.Infrastructure
hwnd,
PInvoke.WM_INPUTLANGCHANGEREQUEST,
PInvoke.INPUTLANGCHANGE_FORWARD,
- _previousLayout.Value
+ new LPARAM((nint)_previousLayout.Value)
);
_previousLayout = HKL.Null;
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index f38f91ef9..47c87f1ca 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -13,9 +13,9 @@
},
"BitFaster.Caching": {
"type": "Direct",
- "requested": "[2.5.3, )",
- "resolved": "2.5.3",
- "contentHash": "Vo/39qcam5Xe+DbyfH0JZyqPswdOoa7jv4PGtRJ6Wj8AU+aZ+TuJRlJcIe+MQjRTJwliI8k8VSQpN8sEoBIv2g=="
+ "requested": "[2.5.4, )",
+ "resolved": "2.5.4",
+ "contentHash": "1QroTY1PVCZOSG9FnkkCrmCKk/+bZCgI/YXq376HnYwUDJ4Ho0EaV4YaA/5v5WYLnwIwIO7RZkdWbg9pxIpueQ=="
},
"CommunityToolkit.Mvvm": {
"type": "Direct",
@@ -25,39 +25,40 @@
},
"Fody": {
"type": "Direct",
- "requested": "[6.5.5, )",
- "resolved": "6.5.5",
- "contentHash": "Krca41L/PDva1VsmDec5n52cQZxQAQp/bsHdzsNi8iLLI0lqKL94fNIkNaC8tVolUkCyWsbzvxfxJCeD2789fA=="
+ "requested": "[6.9.2, )",
+ "resolved": "6.9.2",
+ "contentHash": "YBHobPGogb0vYhGYIxn/ndWqTjNWZveDi5jdjrcshL2vjwU3gQGyDeI7vGgye+2rAM5fGRvlLgNWLW3DpviS/w=="
},
"MemoryPack": {
"type": "Direct",
- "requested": "[1.21.3, )",
- "resolved": "1.21.3",
- "contentHash": "cwCtED8y400vMWx/Vp0QCSeEpVFjDU4JwF52VX9WTaqVERUvNqjG9n6osFlmFuytegyXnHvYEu1qRJ8rv/rkbg==",
+ "requested": "[1.21.4, )",
+ "resolved": "1.21.4",
+ "contentHash": "wy3JTBNBsO8LfQcBvvYsWr3lm2Oakolrfu0UQ3oSJSEiD+7ye0GUhYTaXuYYBowqsXBXWD9gf2218ae0JRiYVQ==",
"dependencies": {
- "MemoryPack.Core": "1.21.3",
- "MemoryPack.Generator": "1.21.3"
+ "MemoryPack.Core": "1.21.4",
+ "MemoryPack.Generator": "1.21.4"
}
},
"Microsoft.VisualStudio.Threading": {
"type": "Direct",
- "requested": "[17.12.19, )",
- "resolved": "17.12.19",
- "contentHash": "eLiGMkMYyaSguqHs3lsrFxy3tAWSLuPEL2pIWRcADMDVAs2xqm3dr1d9QYjiEusTgiClF9KD6OB2NdZP72Oy0Q==",
+ "requested": "[17.14.15, )",
+ "resolved": "17.14.15",
+ "contentHash": "1DrCusT3xNLSlaJg77BsUSAzrhjdZBAvvsS0PMzyPM+fGais6SnISOhqdZQop8VVMIBLsYm2gyF9W7THjgavwA==",
"dependencies": {
- "Microsoft.VisualStudio.Threading.Analyzers": "17.12.19",
+ "Microsoft.VisualStudio.Threading.Analyzers": "17.14.15",
+ "Microsoft.VisualStudio.Threading.Only": "17.14.15",
"Microsoft.VisualStudio.Validation": "17.8.8"
}
},
"Microsoft.Windows.CsWin32": {
"type": "Direct",
- "requested": "[0.3.106, )",
- "resolved": "0.3.106",
- "contentHash": "Mx5fK7uN6fwLR4wUghs6//HonAnwPBNmC2oonyJVhCUlHS/r6SUS3NkBc3+gaQiv+0/9bqdj1oSCKQFkNI+21Q==",
+ "requested": "[0.3.183, )",
+ "resolved": "0.3.183",
+ "contentHash": "Ze3aE2y7xgzKxEWtNb4SH0CExXpCHr3sbmwnvMiWMzJhWDX/G4Rs5wgg2UNs3VN+qVHh/DkDWLCPaVQv/b//Nw==",
"dependencies": {
"Microsoft.Windows.SDK.Win32Docs": "0.1.42-alpha",
- "Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview",
- "Microsoft.Windows.WDK.Win32Metadata": "0.11.4-experimental"
+ "Microsoft.Windows.SDK.Win32Metadata": "61.0.15-preview",
+ "Microsoft.Windows.WDK.Win32Metadata": "0.12.8-experimental"
}
},
"NLog": {
@@ -68,20 +69,26 @@
},
"PropertyChanged.Fody": {
"type": "Direct",
- "requested": "[3.4.0, )",
- "resolved": "3.4.0",
- "contentHash": "IAZyq0uolKo2WYm4mjx+q7A8fSGFT0x2e1s3y+ODn4JI0kqTDoo9GF2tdaypUzRFJZfdMxfC5HZW9QzdJLtOnA==",
+ "requested": "[4.1.0, )",
+ "resolved": "4.1.0",
+ "contentHash": "6v+f9cI8YjnZH2WBHuOqWEAo8DFFNGFIdU8xD3AsL6fhV6Y8oAmVWd7XKk49t8DpeUBwhR/X+97+6Epvek0Y3A==",
"dependencies": {
- "Fody": "6.5.1"
+ "Fody": "6.6.4"
}
},
+ "SharpVectors.Wpf": {
+ "type": "Direct",
+ "requested": "[1.8.4.2, )",
+ "resolved": "1.8.4.2",
+ "contentHash": "PNxLkMBJnV8A+6yH9OqOlhLJegvWP/dvh0rAJp2l0kcrR+rB4R2tQ9vhUqka+UilH4atN8T6zvjDOizVyfz2Ng=="
+ },
"System.Drawing.Common": {
"type": "Direct",
- "requested": "[9.0.2, )",
- "resolved": "9.0.2",
- "contentHash": "JU947wzf8JbBS16Y5EIZzAlyQU+k68D7LRx6y03s2wlhlvLqkt/8uPBrjv2hJnnaJKbdb0GhQ3JZsfYXhrRjyg==",
+ "requested": "[9.0.7, )",
+ "resolved": "9.0.7",
+ "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.2"
+ "Microsoft.Win32.SystemEvents": "9.0.7"
}
},
"ToolGood.Words.Pinyin": {
@@ -97,18 +104,26 @@
},
"MemoryPack.Core": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "ajrYoBWT2aKeH4tlY8q/1C9qK1R/NK+7FkuVOX58ebOSxkABoFTqCR7W+Zk2rakUHZiEgNdRqO67hiRZPq6fLA=="
+ "resolved": "1.21.4",
+ "contentHash": "6RszGorZ0ejNmp37ZcboPBMvvPCuNW2jlrdQfcs/lMzE5b3pmPF6hsm/laDc34hRlbAST1ZxaX/DvYu2DF5sBQ=="
},
"MemoryPack.Generator": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "hYU0TAIarDKnbkNIWvb7P4zBUL+CTahkuNkczsKvycSMR5kiwQ4IfLexywNKX3s05Izp4gzDSPbueepNWZRpWA=="
+ "resolved": "1.21.4",
+ "contentHash": "g14EsSS85yn0lHTi0J9ivqlZMf09A2iI51fmI+0KkzIzyCbWOBWPi5mdaY7YWmXprk12aYh9u/qfWHQUYthlwg=="
},
"Microsoft.VisualStudio.Threading.Analyzers": {
"type": "Transitive",
- "resolved": "17.12.19",
- "contentHash": "v3IYeedjoktvZ+GqYmLudxZJngmf/YWIxNT2Uy6QMMN19cvw+nkWoip1Gr1RtnFkUo1MPUVMis4C8Kj8d8DpSQ=="
+ "resolved": "17.14.15",
+ "contentHash": "mXQPJsbuUD2ydq4/ffd8h8tSOFCXec+2xJOVNCvXjuMOq/+5EKHq3D2m2MC2+nUaXeFMSt66VS/J4HdKBixgcw=="
+ },
+ "Microsoft.VisualStudio.Threading.Only": {
+ "type": "Transitive",
+ "resolved": "17.14.15",
+ "contentHash": "NqONyw1RXyj9P3k5e1uU2k9kc1ptwuU5NJQzG+MPq7vQVHUzBY8HLuJf/N2Rw5H/myD96CVxziDxmjawPuzntw==",
+ "dependencies": {
+ "Microsoft.VisualStudio.Validation": "17.8.8"
+ }
},
"Microsoft.VisualStudio.Validation": {
"type": "Transitive",
@@ -117,8 +132,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.2",
- "contentHash": "5BkGZ6mHp2dHydR29sb0fDfAuqkv30AHtTih8wMzvPZysOmBFvHfnkR2w3tsc0pSiIg8ZoKyefJXWy9r3pBh0w=="
+ "resolved": "9.0.7",
+ "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
},
"Microsoft.Windows.SDK.Win32Docs": {
"type": "Transitive",
@@ -127,15 +142,15 @@
},
"Microsoft.Windows.SDK.Win32Metadata": {
"type": "Transitive",
- "resolved": "60.0.34-preview",
- "contentHash": "TA3DUNi4CTeo+ItTXBnGZFt2159XOGSl0UOlG5vjDj4WHqZjhwYyyUnzOtrbCERiSaP2Hzg7otJNWwOSZgutyA=="
+ "resolved": "61.0.15-preview",
+ "contentHash": "cysex3dazKtCPALCluC2XX3f5Aedy9H2pw5jb+TW5uas2rkem1Z7FRnbUrg2vKx0pk0Qz+4EJNr37HdYTEcvEQ=="
},
"Microsoft.Windows.WDK.Win32Metadata": {
"type": "Transitive",
- "resolved": "0.11.4-experimental",
- "contentHash": "bf5MCmUyZf0gBlYQjx9UpRAZWBkRndyt9XicR+UNLvAUAFTZQbu6YaX/sNKZlR98Grn0gydfh/yT4I3vc0AIQA==",
+ "resolved": "0.12.8-experimental",
+ "contentHash": "3n8R44/Z96Ly+ty4eYVJfESqbzvpw96lRLs3zOzyDmr1x1Kw7FNn5CyE416q+bZQV3e1HRuMUvyegMeRE/WedA==",
"dependencies": {
- "Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview"
+ "Microsoft.Windows.SDK.Win32Metadata": "61.0.15-preview"
}
},
"System.Reflection.Metadata": {
@@ -146,8 +161,7 @@
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2024.3.0, )",
- "PropertyChanged.Fody": "[3.4.0, )"
+ "JetBrains.Annotations": "[2024.3.0, )"
}
}
}
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index a4ef39ac3..eee8d5f4e 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -68,17 +68,17 @@
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
-
+
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
-
+ all
diff --git a/Flow.Launcher.Plugin/packages.lock.json b/Flow.Launcher.Plugin/packages.lock.json
index 6cdf96e07..af835c598 100644
--- a/Flow.Launcher.Plugin/packages.lock.json
+++ b/Flow.Launcher.Plugin/packages.lock.json
@@ -4,9 +4,9 @@
"net9.0-windows7.0": {
"Fody": {
"type": "Direct",
- "requested": "[6.5.4, )",
- "resolved": "6.5.4",
- "contentHash": "GXZuti428IZctfby10xkMbWLCibcb6s29I/psLbBoO2vHJI5eTNVybnlV/Wi1tlIu9GG0bgW/PQwMH+MCldHxw=="
+ "requested": "[6.9.2, )",
+ "resolved": "6.9.2",
+ "contentHash": "YBHobPGogb0vYhGYIxn/ndWqTjNWZveDi5jdjrcshL2vjwU3gQGyDeI7vGgye+2rAM5fGRvlLgNWLW3DpviS/w=="
},
"JetBrains.Annotations": {
"type": "Direct",
@@ -16,43 +16,43 @@
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
- "requested": "[1.1.1, )",
- "resolved": "1.1.1",
- "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==",
+ "requested": "[8.0.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
"dependencies": {
- "Microsoft.Build.Tasks.Git": "1.1.1",
- "Microsoft.SourceLink.Common": "1.1.1"
+ "Microsoft.Build.Tasks.Git": "8.0.0",
+ "Microsoft.SourceLink.Common": "8.0.0"
}
},
"Microsoft.Windows.CsWin32": {
"type": "Direct",
- "requested": "[0.3.106, )",
- "resolved": "0.3.106",
- "contentHash": "Mx5fK7uN6fwLR4wUghs6//HonAnwPBNmC2oonyJVhCUlHS/r6SUS3NkBc3+gaQiv+0/9bqdj1oSCKQFkNI+21Q==",
+ "requested": "[0.3.183, )",
+ "resolved": "0.3.183",
+ "contentHash": "Ze3aE2y7xgzKxEWtNb4SH0CExXpCHr3sbmwnvMiWMzJhWDX/G4Rs5wgg2UNs3VN+qVHh/DkDWLCPaVQv/b//Nw==",
"dependencies": {
"Microsoft.Windows.SDK.Win32Docs": "0.1.42-alpha",
- "Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview",
- "Microsoft.Windows.WDK.Win32Metadata": "0.11.4-experimental"
+ "Microsoft.Windows.SDK.Win32Metadata": "61.0.15-preview",
+ "Microsoft.Windows.WDK.Win32Metadata": "0.12.8-experimental"
}
},
"PropertyChanged.Fody": {
"type": "Direct",
- "requested": "[3.4.0, )",
- "resolved": "3.4.0",
- "contentHash": "IAZyq0uolKo2WYm4mjx+q7A8fSGFT0x2e1s3y+ODn4JI0kqTDoo9GF2tdaypUzRFJZfdMxfC5HZW9QzdJLtOnA==",
+ "requested": "[4.1.0, )",
+ "resolved": "4.1.0",
+ "contentHash": "6v+f9cI8YjnZH2WBHuOqWEAo8DFFNGFIdU8xD3AsL6fhV6Y8oAmVWd7XKk49t8DpeUBwhR/X+97+6Epvek0Y3A==",
"dependencies": {
- "Fody": "6.5.1"
+ "Fody": "6.6.4"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
- "resolved": "1.1.1",
- "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q=="
+ "resolved": "8.0.0",
+ "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
- "resolved": "1.1.1",
- "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg=="
+ "resolved": "8.0.0",
+ "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
},
"Microsoft.Windows.SDK.Win32Docs": {
"type": "Transitive",
@@ -61,15 +61,15 @@
},
"Microsoft.Windows.SDK.Win32Metadata": {
"type": "Transitive",
- "resolved": "60.0.34-preview",
- "contentHash": "TA3DUNi4CTeo+ItTXBnGZFt2159XOGSl0UOlG5vjDj4WHqZjhwYyyUnzOtrbCERiSaP2Hzg7otJNWwOSZgutyA=="
+ "resolved": "61.0.15-preview",
+ "contentHash": "cysex3dazKtCPALCluC2XX3f5Aedy9H2pw5jb+TW5uas2rkem1Z7FRnbUrg2vKx0pk0Qz+4EJNr37HdYTEcvEQ=="
},
"Microsoft.Windows.WDK.Win32Metadata": {
"type": "Transitive",
- "resolved": "0.11.4-experimental",
- "contentHash": "bf5MCmUyZf0gBlYQjx9UpRAZWBkRndyt9XicR+UNLvAUAFTZQbu6YaX/sNKZlR98Grn0gydfh/yT4I3vc0AIQA==",
+ "resolved": "0.12.8-experimental",
+ "contentHash": "3n8R44/Z96Ly+ty4eYVJfESqbzvpw96lRLs3zOzyDmr1x1Kw7FNn5CyE416q+bZQV3e1HRuMUvyegMeRE/WedA==",
"dependencies": {
- "Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview"
+ "Microsoft.Windows.SDK.Win32Metadata": "61.0.15-preview"
}
}
}
diff --git a/Flow.Launcher.Test/Flow.Launcher.Test.csproj b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
index f04a9dcc9..33479c5a0 100644
--- a/Flow.Launcher.Test/Flow.Launcher.Test.csproj
+++ b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
@@ -48,13 +48,13 @@
-
+
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
-
+
\ No newline at end of file
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index f438859f2..d14055831 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -86,7 +86,7 @@
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
@@ -96,20 +96,19 @@
-
-
-
+
+
-
+
-
+ all
-
-
+
+
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index 017065044..344f06d3a 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -16,9 +16,9 @@
},
"Fody": {
"type": "Direct",
- "requested": "[6.5.4, )",
- "resolved": "6.5.4",
- "contentHash": "GXZuti428IZctfby10xkMbWLCibcb6s29I/psLbBoO2vHJI5eTNVybnlV/Wi1tlIu9GG0bgW/PQwMH+MCldHxw=="
+ "requested": "[6.9.2, )",
+ "resolved": "6.9.2",
+ "contentHash": "YBHobPGogb0vYhGYIxn/ndWqTjNWZveDi5jdjrcshL2vjwU3gQGyDeI7vGgye+2rAM5fGRvlLgNWLW3DpviS/w=="
},
"InputSimulator": {
"type": "Direct",
@@ -26,54 +26,92 @@
"resolved": "1.0.4",
"contentHash": "D0LvRCPQMX6/FJHBjng+RO+wRDuHTJrfo7IAc7rmkPvRqchdVGJWg3y70peOtDy3OLNK+HSOwVkH4GiuLnkKgA=="
},
- "Jack251970.TaskScheduler": {
+ "MdXaml": {
"type": "Direct",
- "requested": "[2.12.1, )",
- "resolved": "2.12.1",
- "contentHash": "+epAtsLMugiznJCNRYCYB6eBcr+bx+CVlwPWMprO5CbnNkWu9mlSV8XN5BQJrGYwmlAtlGfZA3p3PcFFlrgR6A==",
+ "requested": "[1.27.0, )",
+ "resolved": "1.27.0",
+ "contentHash": "VWhqhCeKVkJe8vkPmXuGZlRX01WDrTugOLeUvJn18jH/8DrGGVBvtgIlJoELHD2f1DiEWqF3lxxjV55vnzE7Tg==",
"dependencies": {
- "Microsoft.Win32.Registry": "5.0.0",
- "System.Diagnostics.EventLog": "8.0.0",
- "System.Security.AccessControl": "6.0.1"
+ "AvalonEdit": "6.3.0.90",
+ "MdXaml.Plugins": "1.27.0"
+ }
+ },
+ "MdXaml.AnimatedGif": {
+ "type": "Direct",
+ "requested": "[1.27.0, )",
+ "resolved": "1.27.0",
+ "contentHash": "Xrr9IgyAfqDbruqCp2Wxzthbc87QMvMR2YXQsGDyacLtowleefP1Jt3cesZCbI44YcZTGjyJNIkvRAyzzlgsOQ==",
+ "dependencies": {
+ "MdXaml.Plugins": "1.27.0",
+ "WpfAnimatedGif": "2.0.2"
+ }
+ },
+ "MdXaml.Html": {
+ "type": "Direct",
+ "requested": "[1.27.0, )",
+ "resolved": "1.27.0",
+ "contentHash": "3AI0g7EwsTuvhhNd9bjb3J7v5aXFk1dLaf1CNbLjkcZs/MwnEUHNgzF+sLQBYYVdG2DqfV1BsuFoPWSG7IdHvg==",
+ "dependencies": {
+ "AvalonEdit": "6.3.0.90",
+ "HtmlAgilityPack": "1.11.42",
+ "MdXaml": "1.27.0",
+ "MdXaml.Plugins": "1.27.0"
+ }
+ },
+ "MdXaml.Plugins": {
+ "type": "Direct",
+ "requested": "[1.27.0, )",
+ "resolved": "1.27.0",
+ "contentHash": "We7LtBdoukRg9mqTfa1f5n8z/GQPMKBRj3URk9DiMuqzIHkW1lTgK5njVPSScxsRt4YzW22423tSnLWNm2MJKg=="
+ },
+ "MdXaml.Svg": {
+ "type": "Direct",
+ "requested": "[1.27.0, )",
+ "resolved": "1.27.0",
+ "contentHash": "zHtzcQrEVDoTDRvxFAccAIQG3UHCUW2cdWrGCg9yfT6344hhqc6d9t/93kBqQ6j+f580YeevtMeraz9PWmzpfw==",
+ "dependencies": {
+ "MdXaml": "1.27.0",
+ "MdXaml.Plugins": "1.27.0",
+ "Svg": "3.0.84"
}
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Direct",
- "requested": "[7.0.0, )",
- "resolved": "7.0.0",
- "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==",
+ "requested": "[9.0.7, )",
+ "resolved": "9.0.7",
+ "contentHash": "i05AYA91vgq0as84ROVCyltD2gnxaba/f1Qw2rG7mUsS0gv8cPTr1Gm7jPQHq7JTr4MJoQUcanLVs16tIOUJaQ==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7"
}
},
"Microsoft.Extensions.Hosting": {
"type": "Direct",
- "requested": "[7.0.1, )",
- "resolved": "7.0.1",
- "contentHash": "aoeMou6XSW84wiqd895OdaGyO9PfH6nohQJ0XBcshRDafbdIU6PQIVl8TpOCssPYq3ciRseP5064hbFyCR9J9w==",
+ "requested": "[9.0.7, )",
+ "resolved": "9.0.7",
+ "contentHash": "Dkv55VfitwJjPUk9mFHxT9MJAd8su7eJNaCHhBU/Y9xFqw3ZNHwrpeptXeaXiaPtfQq+alMmawIz1Impk5pHkQ==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "7.0.0",
- "Microsoft.Extensions.Configuration.Abstractions": "7.0.0",
- "Microsoft.Extensions.Configuration.Binder": "7.0.3",
- "Microsoft.Extensions.Configuration.CommandLine": "7.0.0",
- "Microsoft.Extensions.Configuration.EnvironmentVariables": "7.0.0",
- "Microsoft.Extensions.Configuration.FileExtensions": "7.0.0",
- "Microsoft.Extensions.Configuration.Json": "7.0.0",
- "Microsoft.Extensions.Configuration.UserSecrets": "7.0.0",
- "Microsoft.Extensions.DependencyInjection": "7.0.0",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
- "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0",
- "Microsoft.Extensions.FileProviders.Physical": "7.0.0",
- "Microsoft.Extensions.Hosting.Abstractions": "7.0.0",
- "Microsoft.Extensions.Logging": "7.0.0",
- "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
- "Microsoft.Extensions.Logging.Configuration": "7.0.0",
- "Microsoft.Extensions.Logging.Console": "7.0.0",
- "Microsoft.Extensions.Logging.Debug": "7.0.0",
- "Microsoft.Extensions.Logging.EventLog": "7.0.0",
- "Microsoft.Extensions.Logging.EventSource": "7.0.0",
- "Microsoft.Extensions.Options": "7.0.1",
- "System.Diagnostics.DiagnosticSource": "7.0.1"
+ "Microsoft.Extensions.Configuration": "9.0.7",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.7",
+ "Microsoft.Extensions.Configuration.CommandLine": "9.0.7",
+ "Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.7",
+ "Microsoft.Extensions.Configuration.FileExtensions": "9.0.7",
+ "Microsoft.Extensions.Configuration.Json": "9.0.7",
+ "Microsoft.Extensions.Configuration.UserSecrets": "9.0.7",
+ "Microsoft.Extensions.DependencyInjection": "9.0.7",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Diagnostics": "9.0.7",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.7",
+ "Microsoft.Extensions.Hosting.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Logging": "9.0.7",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Logging.Configuration": "9.0.7",
+ "Microsoft.Extensions.Logging.Console": "9.0.7",
+ "Microsoft.Extensions.Logging.Debug": "9.0.7",
+ "Microsoft.Extensions.Logging.EventLog": "9.0.7",
+ "Microsoft.Extensions.Logging.EventSource": "9.0.7",
+ "Microsoft.Extensions.Options": "9.0.7"
}
},
"Microsoft.Toolkit.Uwp.Notifications": {
@@ -88,22 +126,11 @@
"System.ValueTuple": "4.5.0"
}
},
- "Microsoft.Windows.CsWin32": {
- "type": "Direct",
- "requested": "[0.3.106, )",
- "resolved": "0.3.106",
- "contentHash": "Mx5fK7uN6fwLR4wUghs6//HonAnwPBNmC2oonyJVhCUlHS/r6SUS3NkBc3+gaQiv+0/9bqdj1oSCKQFkNI+21Q==",
- "dependencies": {
- "Microsoft.Windows.SDK.Win32Docs": "0.1.42-alpha",
- "Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview",
- "Microsoft.Windows.WDK.Win32Metadata": "0.11.4-experimental"
- }
- },
"ModernWpfUI": {
"type": "Direct",
- "requested": "[0.9.4, )",
- "resolved": "0.9.4",
- "contentHash": "HJ07Be9KOiGKGcMLz/AwY+84h3yGHRPuYpYXCE6h1yPtaFwGMWfanZ70jX7W5XWx8+Qk1vGox+WGKgxxsy6EHw=="
+ "requested": "[0.9.5, )",
+ "resolved": "0.9.5",
+ "contentHash": "Y3XkH0wmzDUdbFglykkIIRVPVsmIqN+rKoLZFaMDh9yMG39AJ6VannEmRCzjVLn7f8pg4SqBWC0PGT49BqTACA=="
},
"NHotkey.Wpf": {
"type": "Direct",
@@ -116,11 +143,11 @@
},
"PropertyChanged.Fody": {
"type": "Direct",
- "requested": "[3.4.0, )",
- "resolved": "3.4.0",
- "contentHash": "IAZyq0uolKo2WYm4mjx+q7A8fSGFT0x2e1s3y+ODn4JI0kqTDoo9GF2tdaypUzRFJZfdMxfC5HZW9QzdJLtOnA==",
+ "requested": "[4.1.0, )",
+ "resolved": "4.1.0",
+ "contentHash": "6v+f9cI8YjnZH2WBHuOqWEAo8DFFNGFIdU8xD3AsL6fhV6Y8oAmVWd7XKk49t8DpeUBwhR/X+97+6Epvek0Y3A==",
"dependencies": {
- "Fody": "6.5.1"
+ "Fody": "6.6.4"
}
},
"SemanticVersioning": {
@@ -129,11 +156,27 @@
"resolved": "3.0.0",
"contentHash": "RR+8GbPQ/gjDqov/1QN1OPoUlbUruNwcL3WjWCeLw+MY7+od/ENhnkYxCfAC6rQLIu3QifaJt3kPYyP3RumqMQ=="
},
+ "TaskScheduler": {
+ "type": "Direct",
+ "requested": "[2.12.2, )",
+ "resolved": "2.12.2",
+ "contentHash": "glpAb3VrwfdAofp6PIyAzL0ZeTV7XUJ8muu0oZoTeyU5jtk2sMJ6QAMRRuFbovcaj+SBJiEUGklxIWOqQoxshA==",
+ "dependencies": {
+ "Microsoft.Win32.Registry": "5.0.0",
+ "System.Diagnostics.EventLog": "9.0.2",
+ "System.Security.AccessControl": "6.0.1"
+ }
+ },
"VirtualizingWrapPanel": {
"type": "Direct",
- "requested": "[2.1.1, )",
- "resolved": "2.1.1",
- "contentHash": "Fc/yjU8jqC3qpIsNxeO5RjK2lPU7xnJtBLMSQ6L9egA2PyJLQeVeXpG8WBb5N1kN15rlJEYG8dHWJ5qUGgaNrg=="
+ "requested": "[2.3.0, )",
+ "resolved": "2.3.0",
+ "contentHash": "Dpmtcpn2HqAWZR0NkN7Qd4YCjf+sdQcemIMKm2suZVbOIB9NsmKZnYaQDIpXWTh87a9+nArVto6Od1cM2ohzCQ=="
+ },
+ "AvalonEdit": {
+ "type": "Transitive",
+ "resolved": "6.3.0.90",
+ "contentHash": "WVTb5MxwGqKdeasd3nG5udlV4t6OpvkFanziwI133K0/QJ5FvZmfzRQgpAjGTJhQfIA8GP7AzKQ3sTY9JOFk8Q=="
},
"Ben.Demystifier": {
"type": "Transitive",
@@ -145,8 +188,8 @@
},
"BitFaster.Caching": {
"type": "Transitive",
- "resolved": "2.5.3",
- "contentHash": "Vo/39qcam5Xe+DbyfH0JZyqPswdOoa7jv4PGtRJ6Wj8AU+aZ+TuJRlJcIe+MQjRTJwliI8k8VSQpN8sEoBIv2g=="
+ "resolved": "2.5.4",
+ "contentHash": "1QroTY1PVCZOSG9FnkkCrmCKk/+bZCgI/YXq376HnYwUDJ4Ho0EaV4YaA/5v5WYLnwIwIO7RZkdWbg9pxIpueQ=="
},
"DeltaCompressionDotNet": {
"type": "Transitive",
@@ -161,10 +204,20 @@
"YamlDotNet": "9.1.0"
}
},
+ "Fizzler": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "jH8KFyDJtgqLl3jZwbwgR3nA9dyebKPBgLwBx0bjPvxvvoCqHPD5IPedRGYzki8RYFpjxCFMlLtnNFPYq2OgmQ=="
+ },
"FSharp.Core": {
"type": "Transitive",
- "resolved": "9.0.101",
- "contentHash": "3/YR1SDWFA+Ojx9HiBwND+0UR8ZWoeZfkhD0DWAPCDdr/YI+CyFkArmMGzGSyPXeYtjG0sy0emzfyNwjt7zhig=="
+ "resolved": "9.0.300",
+ "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ=="
+ },
+ "HtmlAgilityPack": {
+ "type": "Transitive",
+ "resolved": "1.11.42",
+ "contentHash": "LDc1bEfF14EY2DZzak4xvzWvbpNXK3vi1u0KQbBpLUN4+cx/VrvXhgCAMSJhSU5vz0oMfW9JZIR20vj/PkDHPA=="
},
"JetBrains.Annotations": {
"type": "Transitive",
@@ -173,262 +226,282 @@
},
"MemoryPack": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "cwCtED8y400vMWx/Vp0QCSeEpVFjDU4JwF52VX9WTaqVERUvNqjG9n6osFlmFuytegyXnHvYEu1qRJ8rv/rkbg==",
+ "resolved": "1.21.4",
+ "contentHash": "wy3JTBNBsO8LfQcBvvYsWr3lm2Oakolrfu0UQ3oSJSEiD+7ye0GUhYTaXuYYBowqsXBXWD9gf2218ae0JRiYVQ==",
"dependencies": {
- "MemoryPack.Core": "1.21.3",
- "MemoryPack.Generator": "1.21.3"
+ "MemoryPack.Core": "1.21.4",
+ "MemoryPack.Generator": "1.21.4"
}
},
"MemoryPack.Core": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "ajrYoBWT2aKeH4tlY8q/1C9qK1R/NK+7FkuVOX58ebOSxkABoFTqCR7W+Zk2rakUHZiEgNdRqO67hiRZPq6fLA=="
+ "resolved": "1.21.4",
+ "contentHash": "6RszGorZ0ejNmp37ZcboPBMvvPCuNW2jlrdQfcs/lMzE5b3pmPF6hsm/laDc34hRlbAST1ZxaX/DvYu2DF5sBQ=="
},
"MemoryPack.Generator": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "hYU0TAIarDKnbkNIWvb7P4zBUL+CTahkuNkczsKvycSMR5kiwQ4IfLexywNKX3s05Izp4gzDSPbueepNWZRpWA=="
+ "resolved": "1.21.4",
+ "contentHash": "g14EsSS85yn0lHTi0J9ivqlZMf09A2iI51fmI+0KkzIzyCbWOBWPi5mdaY7YWmXprk12aYh9u/qfWHQUYthlwg=="
},
"MessagePack": {
"type": "Transitive",
- "resolved": "2.5.187",
- "contentHash": "uW4j8m4Nc+2Mk5n6arOChavJ9bLjkis0qWASOj2h2OwmfINuzYv+mjCHUymrYhmyyKTu3N+ObtTXAY4uQ7jIhg==",
+ "resolved": "2.5.192",
+ "contentHash": "Jtle5MaFeIFkdXtxQeL9Tu2Y3HsAQGoSntOzrn6Br/jrl6c8QmG22GEioT5HBtZJR0zw0s46OnKU8ei2M3QifA==",
"dependencies": {
- "MessagePack.Annotations": "2.5.187",
+ "MessagePack.Annotations": "2.5.192",
"Microsoft.NET.StringTools": "17.6.3"
}
},
"MessagePack.Annotations": {
"type": "Transitive",
- "resolved": "2.5.187",
- "contentHash": "/IvvMMS8opvlHjEJ/fR2Cal4Co726Kj77Z8KiohFhuHfLHHmb9uUxW5+tSCL4ToKFfkQlrS3HD638mRq83ySqA=="
+ "resolved": "2.5.192",
+ "contentHash": "jaJuwcgovWIZ8Zysdyf3b7b34/BrADw4v82GaEZymUhDd3ScMPrYd/cttekeDteJJPXseJxp04yTIcxiVUjTWg=="
},
"Meziantou.Framework.Win32.Jobs": {
"type": "Transitive",
- "resolved": "3.4.0",
- "contentHash": "5GGLckfpwoC1jznInEYfK2INrHyD7K1RtwZJ98kNPKBU6jeu24i4zfgDGHHfb+eK3J+eFPAxo0aYcbUxNXIbNw=="
+ "resolved": "3.4.3",
+ "contentHash": "REjInKnQ0OrhjjtSMPQtLtdURctCroB4L8Sd2gjTOYDysklvsdnrStx1tHS7uLv+fSyFF3aazZmo5Ka0v1oz/w=="
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==",
+ "resolved": "9.0.7",
+ "contentHash": "oxGR51+w5cXm5B9gU6XwpAB2sTiyPSmZm7hjvv0rzRnmL5o/KZzE103AuQj7sK26OBupjVzU/bZxDWvvU4nhEg==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "7.0.0",
- "Microsoft.Extensions.Primitives": "7.0.0"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Primitives": "9.0.7"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==",
+ "resolved": "9.0.7",
+ "contentHash": "lut/kiVvNsQ120VERMUYSFhpXPpKjjql+giy03LesASPBBcC0o6+aoFdzJH9GaYpFTQ3fGVhVjKjvJDoAW5/IQ==",
"dependencies": {
- "Microsoft.Extensions.Primitives": "7.0.0"
+ "Microsoft.Extensions.Primitives": "9.0.7"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
- "resolved": "7.0.3",
- "contentHash": "1eRFwJBrkkncTpvh6mivB8zg4uBVm6+Y6stEJERrVEqZZc8Hvf+N1iIgj2ySYDUQko4J1Gw1rLf1M8bG83F0eA==",
+ "resolved": "9.0.7",
+ "contentHash": "ExY+zXHhU4o9KC2alp3ZdLWyVWVRSn5INqax5ABk+HEOHlAHzomhJ7ek9HHliyOMiVGoYWYaMFOGr9q59mSAGA==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "7.0.0"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.7"
}
},
"Microsoft.Extensions.Configuration.CommandLine": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "a8Iq8SCw5m8W5pZJcPCgBpBO4E89+NaObPng+ApIhrGSv9X4JPrcFAaGM4sDgR0X83uhLgsNJq8VnGP/wqhr8A==",
+ "resolved": "9.0.7",
+ "contentHash": "LqwdkMNFeRyuqExewBSaWj8roEgZH8JQ9zEAmHl5ZFcnhCvjAdHICdYVRIiSEq9RWGB731LL8kZJM8tdTKEscA==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "7.0.0",
- "Microsoft.Extensions.Configuration.Abstractions": "7.0.0"
+ "Microsoft.Extensions.Configuration": "9.0.7",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.7"
}
},
"Microsoft.Extensions.Configuration.EnvironmentVariables": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "RIkfqCkvrAogirjsqSrG1E1FxgrLsOZU2nhRbl07lrajnxzSU2isj2lwQah0CtCbLWo/pOIukQzM1GfneBUnxA==",
+ "resolved": "9.0.7",
+ "contentHash": "R8kgazVpDr4k1K7MeWPLAwsi5VpwrhE3ubXK38D9gpHEvf9XhZhJ8kWHKK00LDg5hJ7pMQLggdZ7XFdQ5182Ug==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "7.0.0",
- "Microsoft.Extensions.Configuration.Abstractions": "7.0.0"
+ "Microsoft.Extensions.Configuration": "9.0.7",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.7"
}
},
"Microsoft.Extensions.Configuration.FileExtensions": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "xk2lRJ1RDuqe57BmgvRPyCt6zyePKUmvT6iuXqiHR+/OIIgWVR8Ff5k2p6DwmqY8a17hx/OnrekEhziEIeQP6Q==",
+ "resolved": "9.0.7",
+ "contentHash": "3LVg32iMfR9ENeegXAo73L+877iOcQauLJsXlKZNVSsLA/HbPgClZdeMGdjLSkaidYw3l02XbXTlOdGYNgu91Q==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "7.0.0",
- "Microsoft.Extensions.Configuration.Abstractions": "7.0.0",
- "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0",
- "Microsoft.Extensions.FileProviders.Physical": "7.0.0",
- "Microsoft.Extensions.Primitives": "7.0.0"
+ "Microsoft.Extensions.Configuration": "9.0.7",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.7",
+ "Microsoft.Extensions.Primitives": "9.0.7"
}
},
"Microsoft.Extensions.Configuration.Json": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "LDNYe3uw76W35Jci+be4LDf2lkQZe0A7EEYQVChFbc509CpZ4Iupod8li4PUXPBhEUOFI/rlQNf5xkzJRQGvtA==",
+ "resolved": "9.0.7",
+ "contentHash": "3HQV326liEInT9UKEc+k73f1ECwNhvDS/DJAe5WvtMKDJTJqTH2ujrUC2ZlK/j6pXyPbV9f0Ku8JB20JveGImg==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "7.0.0",
- "Microsoft.Extensions.Configuration.Abstractions": "7.0.0",
- "Microsoft.Extensions.Configuration.FileExtensions": "7.0.0",
- "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0",
- "System.Text.Json": "7.0.0"
+ "Microsoft.Extensions.Configuration": "9.0.7",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Configuration.FileExtensions": "9.0.7",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7"
}
},
"Microsoft.Extensions.Configuration.UserSecrets": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "33HPW1PmB2RS0ietBQyvOxjp4O3wlt+4tIs8KPyMn1kqp04goiZGa7+3mc69NRLv6bphkLDy0YR7Uw3aZyf8Zw==",
+ "resolved": "9.0.7",
+ "contentHash": "ouDuPgRdeF4TJXKUh+lbm6QwyWwnCy+ijiqfFM2cI5NmW83MwKg1WNp2nCdMVcwQW8wJXteF/L9lA6ZPS3bCIQ==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "7.0.0",
- "Microsoft.Extensions.Configuration.Json": "7.0.0",
- "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0",
- "Microsoft.Extensions.FileProviders.Physical": "7.0.0"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Configuration.Json": "9.0.7",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.7"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw=="
+ "resolved": "9.0.7",
+ "contentHash": "iPK1FxbGFr2Xb+4Y+dTYI8Gupu9pOi8I3JPuPsrogUmEhe2hzZ9LpCmolMEBhVDo2ikcSr7G5zYiwaapHSQTew=="
+ },
+ "Microsoft.Extensions.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "9.0.7",
+ "contentHash": "6ykfInm6yw7pPHJACgnrPUXxUWVslFnzad44K/siXk6Ovan6fNMnXxI5X9vphHJuZ4JbMOdPIgsfTmLD+Dyxug==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "9.0.7",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.7"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.Abstractions": {
+ "type": "Transitive",
+ "resolved": "9.0.7",
+ "contentHash": "d39Ov1JpeWCGLCOTinlaDkujhrSAQ0HFxb7Su1BjhCKBfmDcQ6Ia1i3JI6kd3NFgwi1dexTunu82daDNwt7E6w==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Options": "9.0.7"
+ }
},
"Microsoft.Extensions.FileProviders.Abstractions": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "NyawiW9ZT/liQb34k9YqBSNPLuuPkrjMgQZ24Y/xXX1RoiBkLUdPMaQTmxhZ5TYu8ZKZ9qayzil75JX95vGQUg==",
+ "resolved": "9.0.7",
+ "contentHash": "y9djCca1cz/oz/J8jTxtoecNiNvaiGBJeWd7XOPxonH+FnfHqcfslJMcSr5JMinmWFyS7eh3C9L6m6oURZ5lSA==",
"dependencies": {
- "Microsoft.Extensions.Primitives": "7.0.0"
+ "Microsoft.Extensions.Primitives": "9.0.7"
}
},
"Microsoft.Extensions.FileProviders.Physical": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "K8D2MTR+EtzkbZ8z80LrG7Ur64R7ZZdRLt1J5cgpc/pUWl0C6IkAUapPuK28oionHueCPELUqq0oYEvZfalNdg==",
+ "resolved": "9.0.7",
+ "contentHash": "JYEPYrb+YBpFTCdmSBrk8cg3wAi1V4so7ccq04qbhg3FQHQqgJk28L3heEOKMXcZobOBUjTnGCFJD49Ez9kG5w==",
"dependencies": {
- "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0",
- "Microsoft.Extensions.FileSystemGlobbing": "7.0.0",
- "Microsoft.Extensions.Primitives": "7.0.0"
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7",
+ "Microsoft.Extensions.FileSystemGlobbing": "9.0.7",
+ "Microsoft.Extensions.Primitives": "9.0.7"
}
},
"Microsoft.Extensions.FileSystemGlobbing": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "2jONjKHiF+E92ynz2ZFcr9OvxIw+rTGMPEH+UZGeHTEComVav93jQUWGkso8yWwVBcEJGcNcZAaqY01FFJcj7w=="
+ "resolved": "9.0.7",
+ "contentHash": "5VKpTH2ME0SSs0lrtkpKgjCeHzXR5ka/H+qThPwuWi78wHubApZ/atD7w69FDt0OOM7UMV6LIbkqEQgoby4IXA=="
},
"Microsoft.Extensions.Hosting.Abstractions": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "43n9Je09z0p/7ViPxfRqs5BUItRLNVh5b6JH40F2Agkh2NBsY/jpNYTtbCcxrHCsA3oRmbR6RJBzUutB4VZvNQ==",
+ "resolved": "9.0.7",
+ "contentHash": "yG2JCXAR+VqI1mKqynLPNJlNlrUJeEISEpX4UznOp2uM4IEFz3pDDauzyMvTjICutEJtOigJ1yWBvxbaIlibBw==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "7.0.0",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
- "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.7",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.7"
}
},
"Microsoft.Extensions.Logging": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==",
+ "resolved": "9.0.7",
+ "contentHash": "fdIeQpXYV8yxSWG03cCbU2Otdrq4NWuhnQLXokWLv3L9YcK055E7u8WFJvP+uuP4CFeCEoqZQL4yPcjuXhCZrg==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection": "7.0.0",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
- "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
- "Microsoft.Extensions.Options": "7.0.0"
+ "Microsoft.Extensions.DependencyInjection": "9.0.7",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Options": "9.0.7"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw=="
+ "resolved": "9.0.7",
+ "contentHash": "sMM6NEAdUTE/elJ2wqjOi0iBWqZmSyaTByLF9e8XHv6DRJFFnOe0N+s8Uc6C91E4SboQCfLswaBIZ+9ZXA98AA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7"
+ }
},
"Microsoft.Extensions.Logging.Configuration": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "FLDA0HcffKA8ycoDQLJuCNGIE42cLWPxgdQGRBaSzZrYTkMBjnf9zrr8pGT06psLq9Q+RKWmmZczQ9bCrXEBcA==",
+ "resolved": "9.0.7",
+ "contentHash": "AEBty9rvFGvdFRqgIDEhQmiCnIfQWyzVoOZrO244cfu+n9M+wI1QLDpuROVILlplIBtLVmOezAF7d1H3Qog6Xw==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "7.0.0",
- "Microsoft.Extensions.Configuration.Abstractions": "7.0.0",
- "Microsoft.Extensions.Configuration.Binder": "7.0.0",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
- "Microsoft.Extensions.Logging": "7.0.0",
- "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
- "Microsoft.Extensions.Options": "7.0.0",
- "Microsoft.Extensions.Options.ConfigurationExtensions": "7.0.0"
+ "Microsoft.Extensions.Configuration": "9.0.7",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.7",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Logging": "9.0.7",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Options": "9.0.7",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.7"
}
},
"Microsoft.Extensions.Logging.Console": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "qt5n8bHLZPUfuRnFxJKW5q9ZwOTncdh96rtWzWpX3Y/064MlxzCSw2ELF5Jlwdo+Y4wK3I47NmUTFsV7Sg8rqg==",
+ "resolved": "9.0.7",
+ "contentHash": "pEHlNa8iCfKsBFA3YVDn/8EicjSU/m8uDfyoR0i4svONDss4Yu9Kznw53E/TyI+TveTo7CwRid4kfd4pLYXBig==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
- "Microsoft.Extensions.Logging": "7.0.0",
- "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
- "Microsoft.Extensions.Logging.Configuration": "7.0.0",
- "Microsoft.Extensions.Options": "7.0.0",
- "System.Text.Json": "7.0.0"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Logging": "9.0.7",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Logging.Configuration": "9.0.7",
+ "Microsoft.Extensions.Options": "9.0.7"
}
},
"Microsoft.Extensions.Logging.Debug": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "tFGGyPDpJ8ZdQdeckCArP7nZuoY3am9zJWuvp4OD1bHq65S0epW9BNHzAWeaIO4eYwWnGm1jRNt3vRciH8H6MA==",
+ "resolved": "9.0.7",
+ "contentHash": "MxzZj7XbsYJwfjclVTjJym2/nVIkksu7l7tC/4HYy+YRdDmpE4B+hTzCXu3BNfLNhdLPZsWpyXuYe6UGgWDm3g==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
- "Microsoft.Extensions.Logging": "7.0.0",
- "Microsoft.Extensions.Logging.Abstractions": "7.0.0"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Logging": "9.0.7",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.7"
}
},
"Microsoft.Extensions.Logging.EventLog": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "Rp7cYL9xQRVTgjMl77H5YDxszAaO+mlA+KT0BnLSVhuCoKQQOOs1sSK2/x8BK2dZ/lKeAC/CVF+20Ef2dpKXwg==",
+ "resolved": "9.0.7",
+ "contentHash": "usrMVsY7c8M8fESt34Y3eEIQIlRlKXfPDlI+vYEb6xT7SUjhua2ey3NpHgQktiTgz8Uo5RiWqGD8ieiyo2WaDA==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
- "Microsoft.Extensions.Logging": "7.0.0",
- "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
- "Microsoft.Extensions.Options": "7.0.0",
- "System.Diagnostics.EventLog": "7.0.0"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Logging": "9.0.7",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Options": "9.0.7",
+ "System.Diagnostics.EventLog": "9.0.7"
}
},
"Microsoft.Extensions.Logging.EventSource": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "MxQXndQFviIyOPqyMeLNshXnmqcfzEHE2wWcr7BF1unSisJgouZ3tItnq+aJLGPojrW8OZSC/ZdRoR6wAq+c7w==",
+ "resolved": "9.0.7",
+ "contentHash": "/wwi6ckTEegCExFV6gVToCO7CvysZnmE50fpdkYUsSMh0ue9vRkQ7uOqkHyHol93ASYTEahrp+guMtS/+fZKaA==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
- "Microsoft.Extensions.Logging": "7.0.0",
- "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
- "Microsoft.Extensions.Options": "7.0.0",
- "Microsoft.Extensions.Primitives": "7.0.0",
- "System.Text.Json": "7.0.0"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Logging": "9.0.7",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Options": "9.0.7",
+ "Microsoft.Extensions.Primitives": "9.0.7"
}
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
- "resolved": "7.0.1",
- "contentHash": "pZRDYdN1FpepOIfHU62QoBQ6zdAoTvnjxFfqAzEd9Jhb2dfhA5i6jeTdgGgcgTWFRC7oT0+3XrbQu4LjvgX1Nw==",
+ "resolved": "9.0.7",
+ "contentHash": "trJnF6cRWgR5uMmHpGoHmM1wOVFdIYlELlkO9zX+RfieK0321Y55zrcs4AaEymKup7dxgEN/uJU25CAcMNQRXw==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
- "Microsoft.Extensions.Primitives": "7.0.0"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Primitives": "9.0.7"
}
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "95UnxZkkFdXxF6vSrtJsMHCzkDeSMuUWGs2hDT54cX+U5eVajrCJ3qLyQRW+CtpTt5OJ8bmTvpQVHu1DLhH+cA==",
+ "resolved": "9.0.7",
+ "contentHash": "pE/jeAWHEIy/8HsqYA+I1+toTsdvsv+WywAcRoNSvPoFwjOREa8Fqn7D0/i0PbiXsDLFupltTTctliePx8ib4w==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "7.0.0",
- "Microsoft.Extensions.Configuration.Binder": "7.0.0",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
- "Microsoft.Extensions.Options": "7.0.0",
- "Microsoft.Extensions.Primitives": "7.0.0"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.7",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
+ "Microsoft.Extensions.Options": "9.0.7",
+ "Microsoft.Extensions.Primitives": "9.0.7"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q=="
+ "resolved": "9.0.7",
+ "contentHash": "ti/zD9BuuO50IqlvhWQs9GHxkCmoph5BHjGiWKdg2t6Or8XoyAfRJiKag+uvd/fpASnNklfsB01WpZ4fhAe0VQ=="
},
"Microsoft.IO.RecyclableMemoryStream": {
"type": "Transitive",
@@ -440,19 +513,38 @@
"resolved": "17.6.3",
"contentHash": "N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA=="
},
+ "Microsoft.NETCore.Platforms": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A=="
+ },
+ "Microsoft.NETCore.Targets": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg=="
+ },
"Microsoft.VisualStudio.Threading": {
"type": "Transitive",
- "resolved": "17.12.19",
- "contentHash": "eLiGMkMYyaSguqHs3lsrFxy3tAWSLuPEL2pIWRcADMDVAs2xqm3dr1d9QYjiEusTgiClF9KD6OB2NdZP72Oy0Q==",
+ "resolved": "17.14.15",
+ "contentHash": "1DrCusT3xNLSlaJg77BsUSAzrhjdZBAvvsS0PMzyPM+fGais6SnISOhqdZQop8VVMIBLsYm2gyF9W7THjgavwA==",
"dependencies": {
- "Microsoft.VisualStudio.Threading.Analyzers": "17.12.19",
+ "Microsoft.VisualStudio.Threading.Analyzers": "17.14.15",
+ "Microsoft.VisualStudio.Threading.Only": "17.14.15",
"Microsoft.VisualStudio.Validation": "17.8.8"
}
},
"Microsoft.VisualStudio.Threading.Analyzers": {
"type": "Transitive",
- "resolved": "17.12.19",
- "contentHash": "v3IYeedjoktvZ+GqYmLudxZJngmf/YWIxNT2Uy6QMMN19cvw+nkWoip1Gr1RtnFkUo1MPUVMis4C8Kj8d8DpSQ=="
+ "resolved": "17.14.15",
+ "contentHash": "mXQPJsbuUD2ydq4/ffd8h8tSOFCXec+2xJOVNCvXjuMOq/+5EKHq3D2m2MC2+nUaXeFMSt66VS/J4HdKBixgcw=="
+ },
+ "Microsoft.VisualStudio.Threading.Only": {
+ "type": "Transitive",
+ "resolved": "17.14.15",
+ "contentHash": "NqONyw1RXyj9P3k5e1uU2k9kc1ptwuU5NJQzG+MPq7vQVHUzBY8HLuJf/N2Rw5H/myD96CVxziDxmjawPuzntw==",
+ "dependencies": {
+ "Microsoft.VisualStudio.Validation": "17.8.8"
+ }
},
"Microsoft.VisualStudio.Validation": {
"type": "Transitive",
@@ -470,26 +562,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.2",
- "contentHash": "5BkGZ6mHp2dHydR29sb0fDfAuqkv30AHtTih8wMzvPZysOmBFvHfnkR2w3tsc0pSiIg8ZoKyefJXWy9r3pBh0w=="
- },
- "Microsoft.Windows.SDK.Win32Docs": {
- "type": "Transitive",
- "resolved": "0.1.42-alpha",
- "contentHash": "Z/9po23gUA9aoukirh2ItMU2ZS9++Js9Gdds9fu5yuMojDrmArvY2y+tq9985tR3cxFxpZO1O35Wjfo0khj5HA=="
- },
- "Microsoft.Windows.SDK.Win32Metadata": {
- "type": "Transitive",
- "resolved": "60.0.34-preview",
- "contentHash": "TA3DUNi4CTeo+ItTXBnGZFt2159XOGSl0UOlG5vjDj4WHqZjhwYyyUnzOtrbCERiSaP2Hzg7otJNWwOSZgutyA=="
- },
- "Microsoft.Windows.WDK.Win32Metadata": {
- "type": "Transitive",
- "resolved": "0.11.4-experimental",
- "contentHash": "bf5MCmUyZf0gBlYQjx9UpRAZWBkRndyt9XicR+UNLvAUAFTZQbu6YaX/sNKZlR98Grn0gydfh/yT4I3vc0AIQA==",
- "dependencies": {
- "Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview"
- }
+ "resolved": "9.0.7",
+ "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
},
"Mono.Cecil": {
"type": "Transitive",
@@ -498,18 +572,18 @@
},
"Nerdbank.Streams": {
"type": "Transitive",
- "resolved": "2.11.74",
- "contentHash": "r4G7uHHfoo8LCilPOdtf2C+Q5ymHOAXtciT4ZtB2xRlAvv4gPkWBYNAijFblStv3+uidp81j5DP11jMZl4BfJw==",
+ "resolved": "2.12.87",
+ "contentHash": "oDKOeKZ865I5X8qmU3IXMyrAnssYEiYWTobPGdrqubN3RtTzEHIv+D6fwhdcfrdhPJzHjCkK/ORztR/IsnmA6g==",
"dependencies": {
- "Microsoft.VisualStudio.Threading": "17.10.48",
+ "Microsoft.VisualStudio.Threading.Only": "17.13.61",
"Microsoft.VisualStudio.Validation": "17.8.8",
"System.IO.Pipelines": "8.0.0"
}
},
"Newtonsoft.Json": {
"type": "Transitive",
- "resolved": "13.0.1",
- "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
+ "resolved": "13.0.3",
+ "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
},
"NHotkey": {
"type": "Transitive",
@@ -521,6 +595,16 @@
"resolved": "4.7.10",
"contentHash": "rcegW7kYOCjl7wX0SzsqpPBqnJ51JKi1WkYb6QBVX0Wc5IgH19Pv4t/co+T0s06OS0Ne44xgkY/mHg0PdrmJow=="
},
+ "runtime.osx.10.10-x64.CoreCompat.System.Drawing": {
+ "type": "Transitive",
+ "resolved": "5.8.64",
+ "contentHash": "Ey7xQgWwixxdrmhzEUvaR4kxZDSQMWQScp8ViLvmL5xCBKG6U3TaMv/jzHilpfQXpHmJ4IylKGzzMvnYX2FwHQ=="
+ },
+ "SharpVectors.Wpf": {
+ "type": "Transitive",
+ "resolved": "1.8.4.2",
+ "contentHash": "PNxLkMBJnV8A+6yH9OqOlhLJegvWP/dvh0rAJp2l0kcrR+rB4R2tQ9vhUqka+UilH4atN8T6zvjDOizVyfz2Ng=="
+ },
"Splat": {
"type": "Transitive",
"resolved": "1.6.2",
@@ -538,34 +622,81 @@
},
"StreamJsonRpc": {
"type": "Transitive",
- "resolved": "2.20.20",
- "contentHash": "gwG7KViLbSWS7EI0kYevinVmIga9wZNrpSY/FnWyC6DbdjKJ1xlv/FV1L9b0rLkVP8cGxfIMexdvo/+2W5eq6Q==",
+ "resolved": "2.22.11",
+ "contentHash": "TQcqBFswLNpdSJANjhxZmIIe0Yl0kGqzjZ+uHLdhrkxntofvNu6C53XPEEYQ3Wkj8AorKumkuv/VMvTH4BHOZw==",
"dependencies": {
- "MessagePack": "2.5.187",
- "Microsoft.VisualStudio.Threading": "17.10.48",
- "Microsoft.VisualStudio.Threading.Analyzers": "17.10.48",
+ "MessagePack": "2.5.192",
+ "Microsoft.VisualStudio.Threading.Only": "17.13.61",
"Microsoft.VisualStudio.Validation": "17.8.8",
- "Nerdbank.Streams": "2.11.74",
- "Newtonsoft.Json": "13.0.1",
+ "Nerdbank.Streams": "2.12.87",
+ "Newtonsoft.Json": "13.0.3",
"System.IO.Pipelines": "8.0.0"
}
},
- "System.Diagnostics.DiagnosticSource": {
+ "Svg": {
"type": "Transitive",
- "resolved": "7.0.1",
- "contentHash": "T9SLFxzDp0SreCffRDXSAS5G+lq6E8qP4knHS2IBjwCdx2KEvGnGZsq7gFpselYOda7l6gXsJMD93TQsFj/URA=="
+ "resolved": "3.0.84",
+ "contentHash": "QI35/+zRerIuOTBAw0GhbEQhuesSd3nYha9ibgyv6ofe4XRpFSjaXyQJJGssaUVZaBb2vwMAFKqb5uWnTAB2Sg==",
+ "dependencies": {
+ "Fizzler": "1.1.0",
+ "System.Drawing.Common": "4.5.1",
+ "System.ObjectModel": "4.3.0",
+ "runtime.osx.10.10-x64.CoreCompat.System.Drawing": "5.8.64"
+ }
+ },
+ "System.Collections": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Debug": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
- "resolved": "8.0.0",
- "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A=="
+ "resolved": "9.0.7",
+ "contentHash": "AJ+9fyCtQUImntxAJ9l4PZiCd4iepuk4pm7Qcno7PBIWQnfXlvwKuFsGk2H+QyY69GUVzDP2heELW6ho5BCXUg=="
},
"System.Drawing.Common": {
"type": "Transitive",
- "resolved": "9.0.2",
- "contentHash": "JU947wzf8JbBS16Y5EIZzAlyQU+k68D7LRx6y03s2wlhlvLqkt/8uPBrjv2hJnnaJKbdb0GhQ3JZsfYXhrRjyg==",
+ "resolved": "9.0.7",
+ "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.2"
+ "Microsoft.Win32.SystemEvents": "9.0.7"
+ }
+ },
+ "System.Globalization": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.IO": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
}
},
"System.IO.Pipelines": {
@@ -573,6 +704,30 @@
"resolved": "8.0.0",
"contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA=="
},
+ "System.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Reflection": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
"System.Reflection.Emit": {
"type": "Transitive",
"resolved": "4.7.0",
@@ -583,6 +738,37 @@
"resolved": "5.0.0",
"contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ=="
},
+ "System.Reflection.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Resources.ResourceManager": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Runtime": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
"System.Security.AccessControl": {
"type": "Transitive",
"resolved": "6.0.1",
@@ -593,17 +779,33 @@
"resolved": "5.0.0",
"contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
},
- "System.Text.Encodings.Web": {
+ "System.Text.Encoding": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg=="
- },
- "System.Text.Json": {
- "type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "DaGSsVqKsn/ia6RG8frjwmJonfos0srquhw09TlT8KRw5I43E+4gs+/bZj4K0vShJ5H9imCuXupb4RmS+dBy3w==",
+ "resolved": "4.3.0",
+ "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
"dependencies": {
- "System.Text.Encodings.Web": "7.0.0"
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Threading": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==",
+ "dependencies": {
+ "System.Runtime": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Threading.Tasks": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
}
},
"System.ValueTuple": {
@@ -616,6 +818,11 @@
"resolved": "3.0.1.4",
"contentHash": "uQo97618y9yzLDxrnehPN+/tuiOlk5BqieEdwctHZOAS9miMXnHKgMFYVw8CSGXRglyTYXlrW7qtUlU7Fje5Ew=="
},
+ "WpfAnimatedGif": {
+ "type": "Transitive",
+ "resolved": "2.0.2",
+ "contentHash": "B0j9SqtThyHVTiOPvu6yR+39Te0g3o+7Jjb+qEm7+Iz1HRqbE5/4QV+ntHWOYYBPOUFr9x1mdzGl/EzWP+nKiA=="
+ },
"YamlDotNet": {
"type": "Transitive",
"resolved": "9.1.0",
@@ -625,12 +832,13 @@
"type": "Project",
"dependencies": {
"Droplex": "[1.7.0, )",
- "FSharp.Core": "[9.0.101, )",
+ "FSharp.Core": "[9.0.300, )",
"Flow.Launcher.Infrastructure": "[1.0.0, )",
- "Flow.Launcher.Plugin": "[4.4.0, )",
- "Meziantou.Framework.Win32.Jobs": "[3.4.0, )",
+ "Flow.Launcher.Plugin": "[4.7.0, )",
+ "Meziantou.Framework.Win32.Jobs": "[3.4.3, )",
"Microsoft.IO.RecyclableMemoryStream": "[3.0.1, )",
- "StreamJsonRpc": "[2.20.20, )",
+ "SemanticVersioning": "[3.0.0, )",
+ "StreamJsonRpc": "[2.22.11, )",
"squirrel.windows": "[1.5.2, )"
}
},
@@ -638,22 +846,21 @@
"type": "Project",
"dependencies": {
"Ben.Demystifier": "[0.4.1, )",
- "BitFaster.Caching": "[2.5.3, )",
+ "BitFaster.Caching": "[2.5.4, )",
"CommunityToolkit.Mvvm": "[8.4.0, )",
- "Flow.Launcher.Plugin": "[4.4.0, )",
- "MemoryPack": "[1.21.3, )",
- "Microsoft.VisualStudio.Threading": "[17.12.19, )",
+ "Flow.Launcher.Plugin": "[4.7.0, )",
+ "MemoryPack": "[1.21.4, )",
+ "Microsoft.VisualStudio.Threading": "[17.14.15, )",
"NLog": "[4.7.10, )",
- "PropertyChanged.Fody": "[3.4.0, )",
- "System.Drawing.Common": "[9.0.2, )",
+ "SharpVectors.Wpf": "[1.8.4.2, )",
+ "System.Drawing.Common": "[9.0.7, )",
"ToolGood.Words.Pinyin": "[3.0.1.4, )"
}
},
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2024.3.0, )",
- "PropertyChanged.Fody": "[3.4.0, )"
+ "JetBrains.Annotations": "[2024.3.0, )"
}
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index fdd41c28d..953b7a54e 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -96,7 +96,7 @@
-
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index ea0803978..b444fb8f6 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -47,9 +47,8 @@
-
-
-
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj
index cd310fb35..2da97ebbd 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj
@@ -52,7 +52,7 @@
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/ProcessHelper.cs b/Plugins/Flow.Launcher.Plugin.ProcessKiller/ProcessHelper.cs
index 386782905..cea34f7dc 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/ProcessHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/ProcessHelper.cs
@@ -163,23 +163,20 @@ namespace Flow.Launcher.Plugin.ProcessKiller
try
{
var handle = PInvoke.OpenProcess(PROCESS_ACCESS_RIGHTS.PROCESS_QUERY_LIMITED_INFORMATION, false, (uint)p.Id);
- if (handle.Value == IntPtr.Zero)
+ if (handle == HWND.Null)
{
return string.Empty;
}
- using var safeHandle = new SafeProcessHandle(handle.Value, true);
+ using var safeHandle = new SafeProcessHandle((nint)handle.Value, true);
uint capacity = 2000;
Span buffer = new char[capacity];
- fixed (char* pBuffer = buffer)
+ if (!PInvoke.QueryFullProcessImageName(safeHandle, PROCESS_NAME_FORMAT.PROCESS_NAME_WIN32, buffer, ref capacity))
{
- if (!PInvoke.QueryFullProcessImageName(safeHandle, PROCESS_NAME_FORMAT.PROCESS_NAME_WIN32, (PWSTR)pBuffer, ref capacity))
- {
- return string.Empty;
- }
-
- return buffer[..(int)capacity].ToString();
+ return string.Empty;
}
+
+ return buffer[..(int)capacity].ToString();
}
catch
{
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
index 0c45a8590..cb2b6470b 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
@@ -64,8 +64,8 @@
-
-
+
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLocalization.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLocalization.cs
index fac3ab181..5c2f6f976 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLocalization.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLocalization.cs
@@ -27,28 +27,36 @@ namespace Flow.Launcher.Plugin.Program.Programs
// If there is no resource to localize a file name the method returns a non zero value.
fixed (char* bufferPtr = buffer)
{
- var result = PInvoke.SHGetLocalizedName(path, bufferPtr, capacity, out var id);
- if (result != HRESULT.S_OK)
+ int id;
+ fixed (char* pathPtr = path)
{
- return string.Empty;
- }
+ var result = PInvoke.SHGetLocalizedName(new PCWSTR(pathPtr), bufferPtr, capacity, &id);
- var resourcePathStr = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(bufferPtr).ToString();
- _ = PInvoke.ExpandEnvironmentStrings(resourcePathStr, bufferPtr, capacity);
- using var handle = PInvoke.LoadLibraryEx(resourcePathStr,
- LOAD_LIBRARY_FLAGS.DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_FLAGS.LOAD_LIBRARY_AS_DATAFILE);
- if (handle.IsInvalid)
- {
- return string.Empty;
- }
+ if (result != HRESULT.S_OK)
+ {
+ return string.Empty;
+ }
- // not sure about the behavior of Pinvoke.LoadString, so we clear the buffer before using it (so it must be a null-terminated string)
- buffer.Clear();
+ var resourcePathStr = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(bufferPtr).ToString();
+ fixed (char* resourcePathPtr = resourcePathStr)
+ {
+ _ = PInvoke.ExpandEnvironmentStrings(new PCWSTR(resourcePathPtr), bufferPtr, capacity);
+ using var handle = PInvoke.LoadLibraryEx(resourcePathStr,
+ LOAD_LIBRARY_FLAGS.DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_FLAGS.LOAD_LIBRARY_AS_DATAFILE);
+ if (handle.IsInvalid)
+ {
+ return string.Empty;
+ }
- if (PInvoke.LoadString(handle, (uint)id, bufferPtr, capacity) != 0)
- {
- var lString = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(bufferPtr).ToString();
- return lString;
+ // not sure about the behavior of Pinvoke.LoadString, so we clear the buffer before using it (so it must be a null-terminated string)
+ buffer.Clear();
+
+ if (PInvoke.LoadString(handle, (uint)id, buffer, capacity) != 0)
+ {
+ var lString = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(bufferPtr).ToString();
+ return lString;
+ }
+ }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj b/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
index 999003fd8..cb5b3233f 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
@@ -59,7 +59,7 @@
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
From 13cf4338894fc60fb1ff8b241aafafeed17e1465 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 19 Jul 2025 20:37:14 +0800
Subject: [PATCH 1582/1798] Upgrade NLog to 6.0.1 and resolve new package
NLog.OutputDebugString
---
Flow.Launcher.Core/packages.lock.json | 15 ++++++++++++---
.../Flow.Launcher.Infrastructure.csproj | 3 ++-
Flow.Launcher.Infrastructure/packages.lock.json | 15 ++++++++++++---
Flow.Launcher/packages.lock.json | 15 ++++++++++++---
4 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index 067c704af..b7bc7ce0f 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -181,8 +181,16 @@
},
"NLog": {
"type": "Transitive",
- "resolved": "4.7.10",
- "contentHash": "rcegW7kYOCjl7wX0SzsqpPBqnJ51JKi1WkYb6QBVX0Wc5IgH19Pv4t/co+T0s06OS0Ne44xgkY/mHg0PdrmJow=="
+ "resolved": "6.0.1",
+ "contentHash": "qDWiqy8/xdpZKtHna/645KbalwP86N2NFJEzfqhcv+Si4V2iNaEfR/dCneuF/4+Dcwl3f7jHMXj3ndWYftV3Ug=="
+ },
+ "NLog.OutputDebugString": {
+ "type": "Transitive",
+ "resolved": "6.0.1",
+ "contentHash": "wwJCQLaHVzuRf8TsXB+EEdrzVvE3dnzCSMQMDgwkw3AXp8VSp3JSVF/Q/H0oEqggKgKhPs13hh3a7svyQr4s3A==",
+ "dependencies": {
+ "NLog": "6.0.1"
+ }
},
"SharpVectors.Wpf": {
"type": "Transitive",
@@ -231,7 +239,8 @@
"Flow.Launcher.Plugin": "[4.7.0, )",
"MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.14.15, )",
- "NLog": "[4.7.10, )",
+ "NLog": "[6.0.1, )",
+ "NLog.OutputDebugString": "[6.0.1, )",
"SharpVectors.Wpf": "[1.8.4.2, )",
"System.Drawing.Common": "[9.0.7, )",
"ToolGood.Words.Pinyin": "[3.0.1.4, )"
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index dd9a305a2..82963fa32 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -66,7 +66,8 @@
allruntime; build; native; contentfiles; analyzers; buildtransitive
-
+
+ all
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index 47c87f1ca..152ee4877 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -63,9 +63,18 @@
},
"NLog": {
"type": "Direct",
- "requested": "[4.7.10, )",
- "resolved": "4.7.10",
- "contentHash": "rcegW7kYOCjl7wX0SzsqpPBqnJ51JKi1WkYb6QBVX0Wc5IgH19Pv4t/co+T0s06OS0Ne44xgkY/mHg0PdrmJow=="
+ "requested": "[6.0.1, )",
+ "resolved": "6.0.1",
+ "contentHash": "qDWiqy8/xdpZKtHna/645KbalwP86N2NFJEzfqhcv+Si4V2iNaEfR/dCneuF/4+Dcwl3f7jHMXj3ndWYftV3Ug=="
+ },
+ "NLog.OutputDebugString": {
+ "type": "Direct",
+ "requested": "[6.0.1, )",
+ "resolved": "6.0.1",
+ "contentHash": "wwJCQLaHVzuRf8TsXB+EEdrzVvE3dnzCSMQMDgwkw3AXp8VSp3JSVF/Q/H0oEqggKgKhPs13hh3a7svyQr4s3A==",
+ "dependencies": {
+ "NLog": "6.0.1"
+ }
},
"PropertyChanged.Fody": {
"type": "Direct",
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index 344f06d3a..3dde15f2c 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -592,8 +592,16 @@
},
"NLog": {
"type": "Transitive",
- "resolved": "4.7.10",
- "contentHash": "rcegW7kYOCjl7wX0SzsqpPBqnJ51JKi1WkYb6QBVX0Wc5IgH19Pv4t/co+T0s06OS0Ne44xgkY/mHg0PdrmJow=="
+ "resolved": "6.0.1",
+ "contentHash": "qDWiqy8/xdpZKtHna/645KbalwP86N2NFJEzfqhcv+Si4V2iNaEfR/dCneuF/4+Dcwl3f7jHMXj3ndWYftV3Ug=="
+ },
+ "NLog.OutputDebugString": {
+ "type": "Transitive",
+ "resolved": "6.0.1",
+ "contentHash": "wwJCQLaHVzuRf8TsXB+EEdrzVvE3dnzCSMQMDgwkw3AXp8VSp3JSVF/Q/H0oEqggKgKhPs13hh3a7svyQr4s3A==",
+ "dependencies": {
+ "NLog": "6.0.1"
+ }
},
"runtime.osx.10.10-x64.CoreCompat.System.Drawing": {
"type": "Transitive",
@@ -851,7 +859,8 @@
"Flow.Launcher.Plugin": "[4.7.0, )",
"MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.14.15, )",
- "NLog": "[4.7.10, )",
+ "NLog": "[6.0.1, )",
+ "NLog.OutputDebugString": "[6.0.1, )",
"SharpVectors.Wpf": "[1.8.4.2, )",
"System.Drawing.Common": "[9.0.7, )",
"ToolGood.Words.Pinyin": "[3.0.1.4, )"
From 34cba653f866c90ca3f575902fa574ecfe7b6b5b Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 08:39:35 +0800
Subject: [PATCH 1583/1798] Upgrade PinYin to 3.1.0.x
---
Flow.Launcher.Core/packages.lock.json | 6 +++---
.../Flow.Launcher.Infrastructure.csproj | 4 +---
Flow.Launcher.Infrastructure/packages.lock.json | 6 +++---
Flow.Launcher/packages.lock.json | 6 +++---
4 files changed, 10 insertions(+), 12 deletions(-)
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index b7bc7ce0f..dfb099166 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -222,8 +222,8 @@
},
"ToolGood.Words.Pinyin": {
"type": "Transitive",
- "resolved": "3.0.1.4",
- "contentHash": "uQo97618y9yzLDxrnehPN+/tuiOlk5BqieEdwctHZOAS9miMXnHKgMFYVw8CSGXRglyTYXlrW7qtUlU7Fje5Ew=="
+ "resolved": "3.1.0.3",
+ "contentHash": "VKcf8sUq/+LyY99WgLhOu7Q32ROEyR30/2xCCj9ADRi45wVC7kpXrYCf9vH1qirkmrIfpL8inoxAbrqAlfXxsQ=="
},
"YamlDotNet": {
"type": "Transitive",
@@ -243,7 +243,7 @@
"NLog.OutputDebugString": "[6.0.1, )",
"SharpVectors.Wpf": "[1.8.4.2, )",
"System.Drawing.Common": "[9.0.7, )",
- "ToolGood.Words.Pinyin": "[3.0.1.4, )"
+ "ToolGood.Words.Pinyin": "[3.1.0.3, )"
}
},
"flow.launcher.plugin": {
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 82963fa32..81be26196 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -73,9 +73,7 @@
-
-
-
+
\ No newline at end of file
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index 152ee4877..0e830661c 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -102,9 +102,9 @@
},
"ToolGood.Words.Pinyin": {
"type": "Direct",
- "requested": "[3.0.1.4, )",
- "resolved": "3.0.1.4",
- "contentHash": "uQo97618y9yzLDxrnehPN+/tuiOlk5BqieEdwctHZOAS9miMXnHKgMFYVw8CSGXRglyTYXlrW7qtUlU7Fje5Ew=="
+ "requested": "[3.1.0.3, )",
+ "resolved": "3.1.0.3",
+ "contentHash": "VKcf8sUq/+LyY99WgLhOu7Q32ROEyR30/2xCCj9ADRi45wVC7kpXrYCf9vH1qirkmrIfpL8inoxAbrqAlfXxsQ=="
},
"JetBrains.Annotations": {
"type": "Transitive",
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index 3dde15f2c..591ee2a3c 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -823,8 +823,8 @@
},
"ToolGood.Words.Pinyin": {
"type": "Transitive",
- "resolved": "3.0.1.4",
- "contentHash": "uQo97618y9yzLDxrnehPN+/tuiOlk5BqieEdwctHZOAS9miMXnHKgMFYVw8CSGXRglyTYXlrW7qtUlU7Fje5Ew=="
+ "resolved": "3.1.0.3",
+ "contentHash": "VKcf8sUq/+LyY99WgLhOu7Q32ROEyR30/2xCCj9ADRi45wVC7kpXrYCf9vH1qirkmrIfpL8inoxAbrqAlfXxsQ=="
},
"WpfAnimatedGif": {
"type": "Transitive",
@@ -863,7 +863,7 @@
"NLog.OutputDebugString": "[6.0.1, )",
"SharpVectors.Wpf": "[1.8.4.2, )",
"System.Drawing.Common": "[9.0.7, )",
- "ToolGood.Words.Pinyin": "[3.0.1.4, )"
+ "ToolGood.Words.Pinyin": "[3.1.0.3, )"
}
},
"flow.launcher.plugin": {
From 9f63291fda08c6cee071e0d578db7110fbba07e1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 09:35:29 +0800
Subject: [PATCH 1584/1798] Improve setting dialog command
---
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index d2dcf6e5a..4f44c033f 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -404,6 +404,8 @@ namespace Flow.Launcher.Plugin.Sys
IcoPath = "Images\\app.png",
Action = c =>
{
+ // Hide the window first then open setting dialog because main window can be topmost window which will still display on top of the setting dialog for a while
+ _context.API.HideMainWindow();
_context.API.OpenSettingDialog();
return true;
}
From 365dd5ee17baf43a5e00d3720a81b1f048da09b2 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 09:42:32 +0800
Subject: [PATCH 1585/1798] Use translation for constant strings
---
Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml | 2 ++
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 8 +++-----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
index ad3f8553b..3c8e37b53 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
@@ -63,6 +63,8 @@
Are you sure you want to restart the computer?Are you sure you want to restart the computer with Advanced Boot Options?Are you sure you want to log off?
+ Error
+ Failed to empty the recycle bin. This might happen if:{0}- A file in the recycle bin is in use{0}- You don't have permission to delete some items{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 4f44c033f..0b45b1524 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -338,11 +338,9 @@ namespace Flow.Launcher.Plugin.Sys
var result = PInvoke.SHEmptyRecycleBin(new(), string.Empty, 0);
if (result != HRESULT.S_OK && result != HRESULT.E_UNEXPECTED)
{
- _context.API.ShowMsgBox("Failed to empty the recycle bin. This might happen if:\n" +
- "- A file in the recycle bin is in use\n" +
- "- You don't have permission to delete some items\n" +
- "Please close any applications that might be using these files and try again.",
- "Error",
+ _context.API.ShowMsgBox(
+ string.Format(_context.API.GetTranslation("flowlauncher_plugin_sys_dlgtext_empty_recycle_bin_failed"), Environment.NewLine),
+ _context.API.GetTranslation("flowlauncher_plugin_sys_dlgtitle_error"),
MessageBoxButton.OK, MessageBoxImage.Error);
}
From 96e6882ec10bd90af9508be373d82ca2b4fd27dc Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 09:50:07 +0800
Subject: [PATCH 1586/1798] Improve string resource
---
Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
index 3c8e37b53..398724f67 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
@@ -64,7 +64,7 @@
Are you sure you want to restart the computer with Advanced Boot Options?Are you sure you want to log off?Error
- Failed to empty the recycle bin. This might happen if:{0}- A file in the recycle bin is in use{0}- You don't have permission to delete some items{0}Please close any applications that might be using these files and try again.
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permission{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
From b6ecfdcf638b13b63bb4ebb901a56fd32309cb31 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 09:58:30 +0800
Subject: [PATCH 1587/1798] Remove project reference in Sys plugin to
Flow.Launcher.Infrastructure
---
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs | 12 ++++++++++
Flow.Launcher/PublicAPIInstance.cs | 4 ++++
.../Flow.Launcher.Plugin.Sys.csproj | 1 -
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 22 +++++++++----------
4 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index cfa813d3f..0238bdc1d 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -613,5 +613,17 @@ namespace Flow.Launcher.Plugin
/// Invoked when the actual theme of the application has changed. Currently, the plugin will continue to be subscribed even if it is turned off.
///
event ActualApplicationThemeChangedEventHandler ActualApplicationThemeChanged;
+
+ ///
+ /// Get the data directory of Flow Launcher.
+ ///
+ ///
+ string GetDataDirectory();
+
+ ///
+ /// Get the log directory of Flow Launcher.
+ ///
+ ///
+ string GetLogDirectory();
}
}
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index d865a087b..e0ed105cf 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -599,6 +599,10 @@ namespace Flow.Launcher
remove => _mainVM.ActualApplicationThemeChanged -= value;
}
+ public string GetDataDirectory() => DataLocation.DataDirectory();
+
+ public string GetLogDirectory() => DataLocation.VersionLogDirectory;
+
#endregion
#region Private Methods
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj b/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
index 999003fd8..1e2deb558 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj
@@ -37,7 +37,6 @@
-
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 0b45b1524..77278a054 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -5,8 +5,6 @@ using System.Globalization;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows;
-using Flow.Launcher.Infrastructure;
-using Flow.Launcher.Infrastructure.UserSettings;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.Security;
@@ -52,6 +50,8 @@ namespace Flow.Launcher.Plugin.Sys
private const SHUTDOWN_REASON REASON = SHUTDOWN_REASON.SHTDN_REASON_MAJOR_OTHER |
SHUTDOWN_REASON.SHTDN_REASON_FLAG_PLANNED;
+ private const string Documentation = "https://flowlauncher.com/docs/#/usage-tips";
+
private PluginInitContext _context;
private Settings _settings;
private ThemeSelector _themeSelector;
@@ -445,11 +445,11 @@ namespace Flow.Launcher.Plugin.Sys
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xf12b"),
Title = "Open Log Location",
IcoPath = "Images\\app.png",
- CopyText = DataLocation.VersionLogDirectory,
- AutoCompleteText = DataLocation.VersionLogDirectory,
+ CopyText = _context.API.GetLogDirectory(),
+ AutoCompleteText = _context.API.GetLogDirectory(),
Action = c =>
{
- _context.API.OpenDirectory(DataLocation.VersionLogDirectory);
+ _context.API.OpenDirectory(_context.API.GetLogDirectory());
return true;
}
},
@@ -458,11 +458,11 @@ namespace Flow.Launcher.Plugin.Sys
Title = "Flow Launcher Tips",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe897"),
IcoPath = "Images\\app.png",
- CopyText = Constant.Documentation,
- AutoCompleteText = Constant.Documentation,
+ CopyText = Documentation,
+ AutoCompleteText = Documentation,
Action = c =>
{
- _context.API.OpenUrl(Constant.Documentation);
+ _context.API.OpenUrl(Documentation);
return true;
}
},
@@ -471,11 +471,11 @@ namespace Flow.Launcher.Plugin.Sys
Title = "Flow Launcher UserData Folder",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xf12b"),
IcoPath = "Images\\app.png",
- CopyText = DataLocation.DataDirectory(),
- AutoCompleteText = DataLocation.DataDirectory(),
+ CopyText = _context.API.GetDataDirectory(),
+ AutoCompleteText = _context.API.GetDataDirectory(),
Action = c =>
{
- _context.API.OpenDirectory(DataLocation.DataDirectory());
+ _context.API.OpenDirectory(_context.API.GetDataDirectory());
return true;
}
},
From 4652392c71e5510c31f491d5c15197efd5c14011 Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Sun, 20 Jul 2025 11:29:15 +0800
Subject: [PATCH 1588/1798] Update translations
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
index 398724f67..56899eef3 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
@@ -64,7 +64,7 @@
Are you sure you want to restart the computer with Advanced Boot Options?Are you sure you want to log off?Error
- Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permission{0}Please close any applications that might be using these files and try again.
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
From b9418f12721f991ffae6d8bc1cdd24f8fc9087c4 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 11:33:12 +0800
Subject: [PATCH 1589/1798] Add translations
---
Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml | 8 +++++---
Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 2 +-
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
index 0e0911a70..e646bab0e 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
@@ -1,6 +1,7 @@
-
+CalculatorAllows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
@@ -13,4 +14,5 @@
Comma (,)Dot (.)Max. decimal places
+ Copy failed, please try later
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index eb3c808e7..3d06c4ce0 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -100,7 +100,7 @@ namespace Flow.Launcher.Plugin.Calculator
}
catch (ExternalException)
{
- Context.API.ShowMsgBox("Copy failed, please try later");
+ Context.API.ShowMsgBox(Context.API.GetTranslation("flowlauncher_plugin_calculator_failed_to_copy"));
return false;
}
}
From 0682e9bed15d37899dff37e291e93a7957a2876a Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 11:38:44 +0800
Subject: [PATCH 1590/1798] Improve code quality for public api
---
Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs | 6 +++++-
Flow.Launcher.Core/Plugin/PluginsLoader.cs | 2 +-
Flow.Launcher.Core/Resource/Internationalization.cs | 2 +-
Flow.Launcher.Infrastructure/Http/Http.cs | 6 +++++-
4 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs b/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
index 7ca91eaec..e58b299f6 100644
--- a/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
@@ -22,6 +22,10 @@ namespace Flow.Launcher.Core.ExternalPlugins
private static DateTime lastFetchedAt = DateTime.MinValue;
private static readonly TimeSpan fetchTimeout = TimeSpan.FromMinutes(2);
+ // We should not initialize API in static constructor because it will create another API instance
+ private static IPublicAPI api = null;
+ private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService();
+
public static List UserPlugins { get; private set; }
public static async Task UpdateManifestAsync(bool usePrimaryUrlOnly = false, CancellationToken token = default)
@@ -46,7 +50,7 @@ namespace Flow.Launcher.Core.ExternalPlugins
}
catch (Exception e)
{
- Ioc.Default.GetRequiredService().LogException(ClassName, "Http request failed", e);
+ API.LogException(ClassName, "Http request failed", e);
}
finally
{
diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
index 256c36065..a17d55f02 100644
--- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs
+++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
@@ -126,7 +126,7 @@ namespace Flow.Launcher.Core.Plugin
_ = Task.Run(() =>
{
- Ioc.Default.GetRequiredService().ShowMsgBox($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" +
+ API.ShowMsgBox($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" +
$"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" +
$"Please refer to the logs for more information", "",
MessageBoxButton.OK, MessageBoxImage.Warning);
diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs
index 7b7d6eef6..256975654 100644
--- a/Flow.Launcher.Core/Resource/Internationalization.cs
+++ b/Flow.Launcher.Core/Resource/Internationalization.cs
@@ -214,7 +214,7 @@ namespace Flow.Launcher.Core.Resource
// "Do you want to search with pinyin?"
string text = languageToSet == AvailableLanguages.Chinese ? "是否启用拼音搜索?" : "是否啓用拼音搜索?" ;
- if (Ioc.Default.GetRequiredService().ShowMsgBox(text, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
+ if (API.ShowMsgBox(text, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
return false;
return true;
diff --git a/Flow.Launcher.Infrastructure/Http/Http.cs b/Flow.Launcher.Infrastructure/Http/Http.cs
index 22eb065f5..44b70baae 100644
--- a/Flow.Launcher.Infrastructure/Http/Http.cs
+++ b/Flow.Launcher.Infrastructure/Http/Http.cs
@@ -20,6 +20,10 @@ namespace Flow.Launcher.Infrastructure.Http
private static readonly HttpClient client = new();
+ // We should not initialize API in static constructor because it will create another API instance
+ private static IPublicAPI api = null;
+ private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService();
+
static Http()
{
// need to be added so it would work on a win10 machine
@@ -78,7 +82,7 @@ namespace Flow.Launcher.Infrastructure.Http
}
catch (UriFormatException e)
{
- Ioc.Default.GetRequiredService().ShowMsg("Please try again", "Unable to parse Http Proxy");
+ API.ShowMsg("Please try again", "Unable to parse Http Proxy");
Log.Exception(ClassName, "Unable to parse Uri", e);
}
}
From 85ffd6024bf1ac244919bac56065f285d06f1929 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 12:07:15 +0800
Subject: [PATCH 1591/1798] Add translations
---
.../Flow.Launcher.Plugin.Explorer/ContextMenu.cs | 16 +++++++---------
.../Languages/en.xaml | 3 +++
2 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
index c331c4985..dfaefe03a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
@@ -221,9 +221,8 @@ namespace Flow.Launcher.Plugin.Explorer
}
catch (Exception e)
{
- var message = $"Fail to delete {record.FullPath}";
- LogException(message, e);
- Context.API.ShowMsgError(message);
+ LogException($"Fail to delete {record.FullPath}", e);
+ Context.API.ShowMsgError(string.Format(Context.API.GetTranslation("plugin_explorer_fail_to_delete"), record.FullPath));
return false;
}
@@ -265,9 +264,9 @@ namespace Flow.Launcher.Plugin.Explorer
}
catch (FileNotFoundException e)
{
- var name = "Plugin: Folder";
- var message = $"File not found: {e.Message}";
- Context.API.ShowMsgError(name, message);
+ Context.API.ShowMsgError(
+ Context.API.GetTranslation("plugin_explorer_plugin_name"),
+ string.Format(Context.API.GetTranslation("plugin_explorer_file_not_found"), e.Message));
return false;
}
@@ -334,9 +333,8 @@ namespace Flow.Launcher.Plugin.Explorer
}
catch (Exception e)
{
- var message = $"Fail to open file at {record.FullPath}";
- LogException(message, e);
- Context.API.ShowMsgError(message);
+ LogException($"Fail to open file at {record.FullPath}", e);
+ Context.API.ShowMsgError(string.Format(Context.API.GetTranslation("plugin_explorer_fail_to_open"), record.FullPath));
return false;
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index 40aeda957..e3c76d626 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -132,6 +132,9 @@
Show Windows Context MenuOpen WithSelect a program to open with
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}{0} free of {1}
From 06b3219dcb6d7f0ae1c70200b15006e11bb39d7c Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 12:07:19 +0800
Subject: [PATCH 1592/1798] Add translations
---
Flow.Launcher.Core/Configuration/Portable.cs | 19 +++++++------------
Flow.Launcher.Core/Plugin/PluginsLoader.cs | 8 ++++----
Flow.Launcher/Languages/en.xaml | 12 ++++++++++++
3 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/Flow.Launcher.Core/Configuration/Portable.cs b/Flow.Launcher.Core/Configuration/Portable.cs
index 7f02cef09..721e14dca 100644
--- a/Flow.Launcher.Core/Configuration/Portable.cs
+++ b/Flow.Launcher.Core/Configuration/Portable.cs
@@ -45,8 +45,7 @@ namespace Flow.Launcher.Core.Configuration
#endif
IndicateDeletion(DataLocation.PortableDataPath);
- API.ShowMsgBox("Flow Launcher needs to restart to finish disabling portable mode, " +
- "after the restart your portable data profile will be deleted and roaming data profile kept");
+ API.ShowMsgBox(API.GetTranslation("restartToDisablePortableMode"));
UpdateManager.RestartApp(Constant.ApplicationFileName);
}
@@ -69,8 +68,7 @@ namespace Flow.Launcher.Core.Configuration
#endif
IndicateDeletion(DataLocation.RoamingDataPath);
- API.ShowMsgBox("Flow Launcher needs to restart to finish enabling portable mode, " +
- "after the restart your roaming data profile will be deleted and portable data profile kept");
+ API.ShowMsgBox(API.GetTranslation("restartToEnablePortableMode"));
UpdateManager.RestartApp(Constant.ApplicationFileName);
}
@@ -154,9 +152,8 @@ namespace Flow.Launcher.Core.Configuration
{
FilesFolders.RemoveFolderIfExists(roamingDataDir, (s) => API.ShowMsgBox(s));
- if (API.ShowMsgBox("Flow Launcher has detected you enabled portable mode, " +
- "would you like to move it to a different location?", string.Empty,
- MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ if (API.ShowMsgBox(API.GetTranslation("moveToDifferentLocation"),
+ string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
FilesFolders.OpenPath(Constant.RootDirectory, (s) => API.ShowMsgBox(s));
@@ -169,8 +166,7 @@ namespace Flow.Launcher.Core.Configuration
{
FilesFolders.RemoveFolderIfExists(portableDataDir, (s) => API.ShowMsgBox(s));
- API.ShowMsgBox("Flow Launcher has detected you disabled portable mode, " +
- "the relevant shortcuts and uninstaller entry have been created");
+ API.ShowMsgBox(API.GetTranslation("shortcutsUninstallerCreated"));
}
}
@@ -181,9 +177,8 @@ namespace Flow.Launcher.Core.Configuration
if (roamingLocationExists && portableLocationExists)
{
- API.ShowMsgBox(string.Format("Flow Launcher detected your user data exists both in {0} and " +
- "{1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.",
- DataLocation.PortableDataPath, DataLocation.RoamingDataPath, Environment.NewLine));
+ API.ShowMsgBox(string.Format(API.GetTranslation("userDataDuplicated"),
+ DataLocation.PortableDataPath, DataLocation.RoamingDataPath, Environment.NewLine));
return false;
}
diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
index a17d55f02..9d511297e 100644
--- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs
+++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
@@ -120,15 +120,15 @@ namespace Flow.Launcher.Core.Plugin
{
var errorPluginString = string.Join(Environment.NewLine, erroredPlugins);
- var errorMessage = "The following "
- + (erroredPlugins.Count > 1 ? "plugins have " : "plugin has ")
- + "errored and cannot be loaded:";
+ var errorMessage = erroredPlugins.Count > 1 ?
+ API.GetTranslation("pluginsHaveErrored") :
+ API.GetTranslation("pluginHasErrored");
_ = Task.Run(() =>
{
API.ShowMsgBox($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" +
$"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" +
- $"Please refer to the logs for more information", "",
+ API.GetTranslation("referToLogs"), string.Empty,
MessageBoxButton.OK, MessageBoxImage.Warning);
});
}
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index ac58fdc5f..ed7dd9496 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -18,6 +18,18 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.Failed to unregister hotkey "{0}". Please try again or see log for details
From aed134f5897f99a24c7b3ae9d47c1b99d0eee8c9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 12:15:48 +0800
Subject: [PATCH 1593/1798] Add translations
---
Flow.Launcher.Infrastructure/Http/Http.cs | 2 +-
Flow.Launcher/Languages/en.xaml | 6 ++++++
.../SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs | 4 ++--
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Http/Http.cs b/Flow.Launcher.Infrastructure/Http/Http.cs
index 44b70baae..ec0456fef 100644
--- a/Flow.Launcher.Infrastructure/Http/Http.cs
+++ b/Flow.Launcher.Infrastructure/Http/Http.cs
@@ -82,7 +82,7 @@ namespace Flow.Launcher.Infrastructure.Http
}
catch (UriFormatException e)
{
- API.ShowMsg("Please try again", "Unable to parse Http Proxy");
+ API.ShowMsg(API.GetTranslation("pleaseTryAgain"), API.GetTranslation("parseProxyFailed"));
Log.Exception(ClassName, "Unable to parse Uri", e);
}
}
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index ed7dd9496..b105f2658 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -30,6 +30,10 @@
The following plugins have errored and cannot be loaded:Please refer to the logs for more information
+
+ Please try again
+ Unable to parse Http Proxy
+
Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -152,6 +156,8 @@
OpenUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
index e5b70cd87..1038abc0b 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
@@ -216,8 +216,8 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
}
else
{
- //Since this is rarely seen text, language support is not provided.
- App.API.ShowMsg("Failed to change Korean IME setting", "Please check your system registry access or contact support.");
+ // Since this is rarely seen text, language support is not provided.
+ App.API.ShowMsg(App.API.GetTranslation("KoreanImeSettingChangeFailTitle"), App.API.GetTranslation("KoreanImeSettingChangeFailSubTitle"));
}
}
}
From ba0a113cc9d4104a89cce11285d04bb2f9fc2922 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 12:28:55 +0800
Subject: [PATCH 1594/1798] Add translations & Use ShowMsgError
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 4 ++--
Flow.Launcher.Core/Updater.cs | 2 +-
Flow.Launcher.Infrastructure/Http/Http.cs | 2 +-
Flow.Launcher/App.xaml.cs | 2 +-
.../Resources/Pages/WelcomePage5.xaml.cs | 2 +-
.../ViewModels/SettingsPaneGeneralViewModel.cs | 6 +++---
.../Languages/en.xaml | 3 +++
.../Flow.Launcher.Plugin.BrowserBookmark/Main.cs | 7 ++-----
.../Flow.Launcher.Plugin.Explorer/ContextMenu.cs | 15 ++++++---------
.../Languages/en.xaml | 2 ++
Plugins/Flow.Launcher.Plugin.Program/Main.cs | 2 +-
.../Programs/UWPPackage.cs | 2 +-
.../Flow.Launcher.Plugin.Shell/Languages/en.xaml | 9 ++++++---
Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 14 ++++++++------
Plugins/Flow.Launcher.Plugin.Url/Main.cs | 2 +-
15 files changed, 39 insertions(+), 35 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index d88f2f050..9c54ad7b1 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -719,7 +719,7 @@ namespace Flow.Launcher.Core.Plugin
catch (Exception e)
{
API.LogException(ClassName, $"Failed to delete plugin settings folder for {plugin.Name}", e);
- API.ShowMsg(API.GetTranslation("failedToRemovePluginSettingsTitle"),
+ API.ShowMsgError(API.GetTranslation("failedToRemovePluginSettingsTitle"),
string.Format(API.GetTranslation("failedToRemovePluginSettingsMessage"), plugin.Name));
}
}
@@ -735,7 +735,7 @@ namespace Flow.Launcher.Core.Plugin
catch (Exception e)
{
API.LogException(ClassName, $"Failed to delete plugin cache folder for {plugin.Name}", e);
- API.ShowMsg(API.GetTranslation("failedToRemovePluginCacheTitle"),
+ API.ShowMsgError(API.GetTranslation("failedToRemovePluginCacheTitle"),
string.Format(API.GetTranslation("failedToRemovePluginCacheMessage"), plugin.Name));
}
Settings.RemovePluginSettings(plugin.ID);
diff --git a/Flow.Launcher.Core/Updater.cs b/Flow.Launcher.Core/Updater.cs
index 5b67ffabc..45275696c 100644
--- a/Flow.Launcher.Core/Updater.cs
+++ b/Flow.Launcher.Core/Updater.cs
@@ -111,7 +111,7 @@ namespace Flow.Launcher.Core
}
if (!silentUpdate)
- _api.ShowMsg(_api.GetTranslation("update_flowlauncher_fail"),
+ _api.ShowMsgError(_api.GetTranslation("update_flowlauncher_fail"),
_api.GetTranslation("update_flowlauncher_check_connection"));
}
finally
diff --git a/Flow.Launcher.Infrastructure/Http/Http.cs b/Flow.Launcher.Infrastructure/Http/Http.cs
index ec0456fef..8afab419b 100644
--- a/Flow.Launcher.Infrastructure/Http/Http.cs
+++ b/Flow.Launcher.Infrastructure/Http/Http.cs
@@ -82,7 +82,7 @@ namespace Flow.Launcher.Infrastructure.Http
}
catch (UriFormatException e)
{
- API.ShowMsg(API.GetTranslation("pleaseTryAgain"), API.GetTranslation("parseProxyFailed"));
+ API.ShowMsgError(API.GetTranslation("pleaseTryAgain"), API.GetTranslation("parseProxyFailed"));
Log.Exception(ClassName, "Unable to parse Uri", e);
}
}
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 1bef1166e..93fd88e4f 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -267,7 +267,7 @@ namespace Flow.Launcher
// but if it fails (permissions, etc) then don't keep retrying
// this also gives the user a visual indication in the Settings widget
_settings.StartFlowLauncherOnSystemStartup = false;
- API.ShowMsg(API.GetTranslation("setAutoStartFailed"), e.Message);
+ API.ShowMsgError(API.GetTranslation("setAutoStartFailed"), e.Message);
}
}
}
diff --git a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs
index 8db0a9f7e..10cd18821 100644
--- a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs
+++ b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs
@@ -59,7 +59,7 @@ namespace Flow.Launcher.Resources.Pages
}
catch (Exception e)
{
- App.API.ShowMsg(App.API.GetTranslation("setAutoStartFailed"), e.Message);
+ App.API.ShowMsgError(App.API.GetTranslation("setAutoStartFailed"), e.Message);
}
}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
index 1038abc0b..7cd429058 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
@@ -64,7 +64,7 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
}
catch (Exception e)
{
- App.API.ShowMsg(App.API.GetTranslation("setAutoStartFailed"), e.Message);
+ App.API.ShowMsgError(App.API.GetTranslation("setAutoStartFailed"), e.Message);
}
}
}
@@ -91,7 +91,7 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
}
catch (Exception e)
{
- App.API.ShowMsg(App.API.GetTranslation("setAutoStartFailed"), e.Message);
+ App.API.ShowMsgError(App.API.GetTranslation("setAutoStartFailed"), e.Message);
}
}
}
@@ -217,7 +217,7 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
else
{
// Since this is rarely seen text, language support is not provided.
- App.API.ShowMsg(App.API.GetTranslation("KoreanImeSettingChangeFailTitle"), App.API.GetTranslation("KoreanImeSettingChangeFailSubTitle"));
+ App.API.ShowMsgError(App.API.GetTranslation("KoreanImeSettingChangeFailTitle"), App.API.GetTranslation("KoreanImeSettingChangeFailSubTitle"));
}
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
index 22830e7c8..8f98213a4 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
@@ -7,6 +7,9 @@
Browser BookmarksSearch your browser bookmarks
+
+ Failed to set url in clipboard
+ "
Bookmark DataOpen bookmarks in:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
index 91ade206b..b1600862e 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
@@ -223,11 +223,8 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
}
catch (Exception e)
{
- var message = "Failed to set url in clipboard";
- _context.API.LogException(ClassName, message, e);
-
- _context.API.ShowMsg(message);
-
+ _context.API.LogException(ClassName, "Failed to set url in clipboard", e);
+ _context.API.ShowMsgError(_context.API.GetTranslation("flowlauncher_plugin_browserbookmark_copy_failed"));
return false;
}
},
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
index dfaefe03a..c18abb3a2 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
@@ -132,9 +132,8 @@ namespace Flow.Launcher.Plugin.Explorer
}
catch (Exception e)
{
- var message = "Fail to set text in clipboard";
- LogException(message, e);
- Context.API.ShowMsg(message);
+ LogException("Fail to set text in clipboard", e);
+ Context.API.ShowMsgError(Context.API.GetTranslation("plugin_explorer_fail_to_set_text"));
return false;
}
},
@@ -155,9 +154,8 @@ namespace Flow.Launcher.Plugin.Explorer
}
catch (Exception e)
{
- var message = "Fail to set text in clipboard";
- LogException(message, e);
- Context.API.ShowMsg(message);
+ LogException("Fail to set text in clipboard", e);
+ Context.API.ShowMsgError(Context.API.GetTranslation("plugin_explorer_fail_to_set_text"));
return false;
}
},
@@ -178,9 +176,8 @@ namespace Flow.Launcher.Plugin.Explorer
}
catch (Exception e)
{
- var message = $"Fail to set file/folder in clipboard";
- LogException(message, e);
- Context.API.ShowMsg(message);
+ LogException($"Fail to set file/folder in clipboard", e);
+ Context.API.ShowMsgError(Context.API.GetTranslation("plugin_explorer_fail_to_set_files"));
return false;
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index e3c76d626..a2e26a0f0 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -135,6 +135,8 @@
Fail to delete {0}File not found: {0}Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} free of {1}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Main.cs b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
index fd687bfae..3a5270905 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
@@ -446,7 +446,7 @@ namespace Flow.Launcher.Plugin.Program
var title = Context.API.GetTranslation("flowlauncher_plugin_program_disable_dlgtitle_error");
var message = string.Format(Context.API.GetTranslation("flowlauncher_plugin_program_run_failed"),
info.FileName);
- Context.API.ShowMsg(title, string.Format(message, info.FileName), string.Empty);
+ Context.API.ShowMsgError(title, string.Format(message, info.FileName));
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
index 28f774333..9a8326e9a 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
@@ -462,7 +462,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
var message =
api.GetTranslation(
"flowlauncher_plugin_program_run_as_administrator_not_supported_message");
- api.ShowMsg(title, message, string.Empty);
+ api.ShowMsgError(title, message);
}
return true;
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
index 645a0e14f..f27361c50 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
@@ -1,6 +1,7 @@
-
+Replace Win+RClose Command Prompt after pressing any key
@@ -16,4 +17,6 @@
Run As AdministratorCopy the commandOnly show number of most used commands:
+ Command not found: {0}
+ Error running the command: {0}"
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
index a51aadec7..888009976 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -335,15 +335,17 @@ namespace Flow.Launcher.Plugin.Shell
}
catch (FileNotFoundException e)
{
- var name = "Plugin: Shell";
- var message = $"Command not found: {e.Message}";
- Context.API.ShowMsg(name, message);
+ Context.API.ShowMsgError(GetTranslatedPluginTitle(),
+ string.Format(Context.API.GetTranslation("flowlauncher_plugin_cmd_command_not_found"), e.Message));
}
catch (Win32Exception e)
{
- var name = "Plugin: Shell";
- var message = $"Error running the command: {e.Message}";
- Context.API.ShowMsg(name, message);
+ Context.API.ShowMsgError(GetTranslatedPluginTitle(),
+ string.Format(Context.API.GetTranslation("flowlauncher_plugin_cmd_error_running_command"), e.Message));
+ }
+ catch (Exception e)
+ {
+ Context.API.LogException(ClassName, $"Error executing command: {info.FileName} {string.Join(" ", info.ArgumentList)}", e);
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Url/Main.cs b/Plugins/Flow.Launcher.Plugin.Url/Main.cs
index 03516636d..9fa52c8da 100644
--- a/Plugins/Flow.Launcher.Plugin.Url/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Url/Main.cs
@@ -70,7 +70,7 @@ namespace Flow.Launcher.Plugin.Url
}
catch(Exception)
{
- context.API.ShowMsg(string.Format(context.API.GetTranslation("flowlauncher_plugin_url_cannot_open_url"), raw));
+ context.API.ShowMsgError(string.Format(context.API.GetTranslation("flowlauncher_plugin_url_cannot_open_url"), raw));
return false;
}
}
From d7e09abde36af13ce6d8ded99c335a2bf61d4625 Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Sun, 20 Jul 2025 12:52:39 +0800
Subject: [PATCH 1595/1798] Fix translations
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
index f27361c50..2fb9c6b67 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
@@ -18,5 +18,5 @@
Copy the commandOnly show number of most used commands:Command not found: {0}
- Error running the command: {0}"
+ Error running the command: {0}
From 1c76114bb075baf8337ebe5658ff9c145741cfe2 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 12:53:14 +0800
Subject: [PATCH 1596/1798] Fix translations
---
Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
index 8f98213a4..564714173 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/en.xaml
@@ -9,7 +9,7 @@
Failed to set url in clipboard
- "
+
Bookmark DataOpen bookmarks in:
From e931f3ae41c89c49cffb69d59685b1b8e2f71076 Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Sun, 20 Jul 2025 12:57:04 +0800
Subject: [PATCH 1597/1798] Fix translations
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
---
Plugins/Flow.Launcher.Plugin.Program/Main.cs | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Main.cs b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
index 3a5270905..a0832e756 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
@@ -446,7 +446,9 @@ namespace Flow.Launcher.Plugin.Program
var title = Context.API.GetTranslation("flowlauncher_plugin_program_disable_dlgtitle_error");
var message = string.Format(Context.API.GetTranslation("flowlauncher_plugin_program_run_failed"),
info.FileName);
- Context.API.ShowMsgError(title, string.Format(message, info.FileName));
+@@ Plugins/Flow.Launcher.Plugin.Program/Main.cs:449
+- Context.API.ShowMsgError(title, string.Format(message, info.FileName));
++ Context.API.ShowMsgError(title, message);
}
}
From d71d3a5094fca474d1801ae21b1b8ed9c8a8b089 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 12:57:56 +0800
Subject: [PATCH 1598/1798] Fix build issue
---
Plugins/Flow.Launcher.Plugin.Program/Main.cs | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Main.cs b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
index a0832e756..73d893858 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
@@ -446,9 +446,7 @@ namespace Flow.Launcher.Plugin.Program
var title = Context.API.GetTranslation("flowlauncher_plugin_program_disable_dlgtitle_error");
var message = string.Format(Context.API.GetTranslation("flowlauncher_plugin_program_run_failed"),
info.FileName);
-@@ Plugins/Flow.Launcher.Plugin.Program/Main.cs:449
-- Context.API.ShowMsgError(title, string.Format(message, info.FileName));
-+ Context.API.ShowMsgError(title, message);
+ Context.API.ShowMsgError(title, message);
}
}
From 2ee53dfbf771ba00dc603dff25851a655e302633 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 15:20:18 +0800
Subject: [PATCH 1599/1798] Initialize language before portable clean up since
it needs translations
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 2 +-
.../Resource/Internationalization.cs | 116 +++++++++++-------
Flow.Launcher/App.xaml.cs | 7 +-
3 files changed, 78 insertions(+), 47 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index 9c54ad7b1..8f134c194 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -43,7 +43,7 @@ namespace Flow.Launcher.Core.Plugin
///
/// Directories that will hold Flow Launcher plugin directory
///
- private static readonly string[] Directories =
+ public static readonly string[] Directories =
{
Constant.PreinstalledDirectory, DataLocation.PluginsDirectory
};
diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs
index 256975654..99bc9a844 100644
--- a/Flow.Launcher.Core/Resource/Internationalization.cs
+++ b/Flow.Launcher.Core/Resource/Internationalization.cs
@@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
-using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
@@ -35,13 +34,6 @@ namespace Flow.Launcher.Core.Resource
public Internationalization(Settings settings)
{
_settings = settings;
- AddFlowLauncherLanguageDirectory();
- }
-
- private void AddFlowLauncherLanguageDirectory()
- {
- var directory = Path.Combine(Constant.ProgramDirectory, Folder);
- _languageDirectories.Add(directory);
}
public static void InitSystemLanguageCode()
@@ -72,35 +64,6 @@ namespace Flow.Launcher.Core.Resource
SystemLanguageCode = DefaultLanguageCode;
}
- private void AddPluginLanguageDirectories()
- {
- foreach (var plugin in PluginManager.GetTranslationPlugins())
- {
- var location = Assembly.GetAssembly(plugin.Plugin.GetType()).Location;
- var dir = Path.GetDirectoryName(location);
- if (dir != null)
- {
- var pluginThemeDirectory = Path.Combine(dir, Folder);
- _languageDirectories.Add(pluginThemeDirectory);
- }
- else
- {
- API.LogError(ClassName, $"Can't find plugin path <{location}> for <{plugin.Metadata.Name}>");
- }
- }
-
- LoadDefaultLanguage();
- }
-
- private void LoadDefaultLanguage()
- {
- // Removes language files loaded before any plugins were loaded.
- // Prevents the language Flow started in from overwriting English if the user switches back to English
- RemoveOldLanguageFiles();
- LoadLanguage(AvailableLanguages.English);
- _oldResources.Clear();
- }
-
///
/// Initialize language. Will change app language and plugin language based on settings.
///
@@ -116,11 +79,73 @@ namespace Flow.Launcher.Core.Resource
// Get language by language code and change language
var language = GetLanguageByLanguageCode(languageCode);
+ // Add Flow Launcher language directory
+ AddFlowLauncherLanguageDirectory();
+
// Add plugin language directories first so that we can load language files from plugins
AddPluginLanguageDirectories();
+ // Load default language resources
+ LoadDefaultLanguage();
+
// Change language
- await ChangeLanguageAsync(language);
+ await ChangeLanguageAsync(language, false);
+ }
+
+ private void AddFlowLauncherLanguageDirectory()
+ {
+ // Check if Flow Launcher language directory exists
+ var directory = Path.Combine(Constant.ProgramDirectory, Folder);
+ if (!Directory.Exists(directory))
+ {
+ API.LogError(ClassName, $"Flow Launcher language directory can't be found <{directory}>");
+ return;
+ }
+
+ // Check if the language directory contains default language file
+ if (!File.Exists(Path.Combine(directory, DefaultFile)))
+ {
+ API.LogError(ClassName, $"Default language file can't be found in path <{directory}>");
+ return;
+ }
+
+ _languageDirectories.Add(directory);
+ }
+
+ private void AddPluginLanguageDirectories()
+ {
+ foreach (var pluginsDir in PluginManager.Directories)
+ {
+ if (!Directory.Exists(pluginsDir)) continue;
+
+ // Enumerate all top directories in the plugin directory
+ foreach (var dir in Directory.GetDirectories(pluginsDir))
+ {
+ // Check if the directory contains a language folder
+ var pluginLanguageDir = Path.Combine(dir, Folder);
+ if (!Directory.Exists(pluginLanguageDir)) continue;
+
+ // Check if the language directory contains default language file
+ if (File.Exists(Path.Combine(pluginLanguageDir, DefaultFile)))
+ {
+ // Add the plugin language directory to the list
+ _languageDirectories.Add(pluginLanguageDir);
+ }
+ else
+ {
+ API.LogError(ClassName, $"Can't find default language file in path <{pluginLanguageDir}>");
+ }
+ }
+ }
+ }
+
+ private void LoadDefaultLanguage()
+ {
+ // Removes language files loaded before any plugins were loaded.
+ // Prevents the language Flow started in from overwriting English if the user switches back to English
+ RemoveOldLanguageFiles();
+ LoadLanguage(AvailableLanguages.English);
+ _oldResources.Clear();
}
///
@@ -152,7 +177,7 @@ namespace Flow.Launcher.Core.Resource
private static Language GetLanguageByLanguageCode(string languageCode)
{
var lowercase = languageCode.ToLower();
- var language = AvailableLanguages.GetAvailableLanguages().FirstOrDefault(o => o.LanguageCode.ToLower() == lowercase);
+ var language = AvailableLanguages.GetAvailableLanguages().FirstOrDefault(o => o.LanguageCode.Equals(lowercase, StringComparison.CurrentCultureIgnoreCase));
if (language == null)
{
API.LogError(ClassName, $"Language code can't be found <{languageCode}>");
@@ -164,7 +189,7 @@ namespace Flow.Launcher.Core.Resource
}
}
- private async Task ChangeLanguageAsync(Language language)
+ private async Task ChangeLanguageAsync(Language language, bool updateMetadata = true)
{
// Remove old language files and load language
RemoveOldLanguageFiles();
@@ -176,8 +201,11 @@ namespace Flow.Launcher.Core.Resource
// Change culture info
ChangeCultureInfo(language.LanguageCode);
- // Raise event for plugins after culture is set
- await Task.Run(UpdatePluginMetadataTranslations);
+ if (updateMetadata)
+ {
+ // Raise event for plugins after culture is set
+ await Task.Run(UpdatePluginMetadataTranslations);
+ }
}
public static void ChangeCultureInfo(string languageCode)
@@ -212,7 +240,7 @@ namespace Flow.Launcher.Core.Resource
// No other languages should show the following text so just make it hard-coded
// "Do you want to search with pinyin?"
- string text = languageToSet == AvailableLanguages.Chinese ? "是否启用拼音搜索?" : "是否啓用拼音搜索?" ;
+ string text = languageToSet == AvailableLanguages.Chinese ? "是否启用拼音搜索?" : "是否啓用拼音搜索?";
if (API.ShowMsgBox(text, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
return false;
@@ -276,7 +304,7 @@ namespace Flow.Launcher.Core.Resource
}
}
- private void UpdatePluginMetadataTranslations()
+ public static void UpdatePluginMetadataTranslations()
{
// Update plugin metadata name & description
foreach (var p in PluginManager.GetTranslationPlugins())
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 93fd88e4f..f48829bb3 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -191,6 +191,9 @@ namespace Flow.Launcher
// Enable Win32 dark mode if the system is in dark mode before creating all windows
Win32Helper.EnableWin32DarkMode(_settings.ColorScheme);
+ // Initialize language before portable clean up since it needs translations
+ await Ioc.Default.GetRequiredService().InitializeLanguageAsync();
+
Ioc.Default.GetRequiredService().PreStartCleanUpAfterPortabilityUpdate();
API.LogInfo(ClassName, "Begin Flow Launcher startup ----------------------------------------------------");
@@ -216,8 +219,8 @@ namespace Flow.Launcher
await PluginManager.InitializePluginsAsync();
- // Change language after all plugins are initialized because we need to update plugin title based on their api
- await Ioc.Default.GetRequiredService().InitializeLanguageAsync();
+ // Update plugin titles after plugins are initialized with their api instances
+ Internationalization.UpdatePluginMetadataTranslations();
await imageLoadertask;
From 634bdc5bd685c717b6e44b393b9d14a69eacfe99 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 15:26:07 +0800
Subject: [PATCH 1600/1798] Do not check Flow Launcher default language file
since it is binary embedded
---
Flow.Launcher.Core/Resource/Internationalization.cs | 7 -------
1 file changed, 7 deletions(-)
diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs
index 99bc9a844..5500f5421 100644
--- a/Flow.Launcher.Core/Resource/Internationalization.cs
+++ b/Flow.Launcher.Core/Resource/Internationalization.cs
@@ -102,13 +102,6 @@ namespace Flow.Launcher.Core.Resource
return;
}
- // Check if the language directory contains default language file
- if (!File.Exists(Path.Combine(directory, DefaultFile)))
- {
- API.LogError(ClassName, $"Default language file can't be found in path <{directory}>");
- return;
- }
-
_languageDirectories.Add(directory);
}
From 5e8acf7d747990a76067b636aa773ddecbfbdab3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 15:29:27 +0800
Subject: [PATCH 1601/1798] Use OrdinalIgnoreCase
---
Flow.Launcher.Core/Resource/Internationalization.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs
index 5500f5421..bd138b179 100644
--- a/Flow.Launcher.Core/Resource/Internationalization.cs
+++ b/Flow.Launcher.Core/Resource/Internationalization.cs
@@ -170,7 +170,7 @@ namespace Flow.Launcher.Core.Resource
private static Language GetLanguageByLanguageCode(string languageCode)
{
var lowercase = languageCode.ToLower();
- var language = AvailableLanguages.GetAvailableLanguages().FirstOrDefault(o => o.LanguageCode.Equals(lowercase, StringComparison.CurrentCultureIgnoreCase));
+ var language = AvailableLanguages.GetAvailableLanguages().FirstOrDefault(o => o.LanguageCode.Equals(lowercase, StringComparison.OrdinalIgnoreCase));
if (language == null)
{
API.LogError(ClassName, $"Language code can't be found <{languageCode}>");
From ac7da2d2d61092eacc7e1cdee618cef619c3f0ef Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 17:26:14 +0800
Subject: [PATCH 1602/1798] Do not check if the language directory contains
default language file
---
Flow.Launcher.Core/Resource/Internationalization.cs | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs
index bd138b179..10258f080 100644
--- a/Flow.Launcher.Core/Resource/Internationalization.cs
+++ b/Flow.Launcher.Core/Resource/Internationalization.cs
@@ -118,16 +118,8 @@ namespace Flow.Launcher.Core.Resource
var pluginLanguageDir = Path.Combine(dir, Folder);
if (!Directory.Exists(pluginLanguageDir)) continue;
- // Check if the language directory contains default language file
- if (File.Exists(Path.Combine(pluginLanguageDir, DefaultFile)))
- {
- // Add the plugin language directory to the list
- _languageDirectories.Add(pluginLanguageDir);
- }
- else
- {
- API.LogError(ClassName, $"Can't find default language file in path <{pluginLanguageDir}>");
- }
+ // Check if the language directory contains default language file since it will be checked later
+ _languageDirectories.Add(pluginLanguageDir);
}
}
}
From f77f14b0ee19bf0b83f21167cf459e00b80e1a42 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 17:35:07 +0800
Subject: [PATCH 1603/1798] Improve code quality
---
.../Resource/Internationalization.cs | 115 +++++++++++-------
1 file changed, 73 insertions(+), 42 deletions(-)
diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs
index 10258f080..c1e1dbe79 100644
--- a/Flow.Launcher.Core/Resource/Internationalization.cs
+++ b/Flow.Launcher.Core/Resource/Internationalization.cs
@@ -27,8 +27,8 @@ namespace Flow.Launcher.Core.Resource
private const string DefaultFile = "en.xaml";
private const string Extension = ".xaml";
private readonly Settings _settings;
- private readonly List _languageDirectories = new();
- private readonly List _oldResources = new();
+ private readonly List _languageDirectories = [];
+ private readonly List _oldResources = [];
private static string SystemLanguageCode;
public Internationalization(Settings settings)
@@ -36,6 +36,11 @@ namespace Flow.Launcher.Core.Resource
_settings = settings;
}
+ #region Initialization
+
+ ///
+ /// Initialize the system language code based on the current culture.
+ ///
public static void InitSystemLanguageCode()
{
var availableLanguages = AvailableLanguages.GetAvailableLanguages();
@@ -133,6 +138,10 @@ namespace Flow.Launcher.Core.Resource
_oldResources.Clear();
}
+ #endregion
+
+ #region Change Language
+
///
/// Change language during runtime. Will change app language and plugin language & save settings.
///
@@ -213,6 +222,10 @@ namespace Flow.Launcher.Core.Resource
thread.CurrentUICulture = currentCulture;
}
+ #endregion
+
+ #region Prompt Pinyin
+
public bool PromptShouldUsePinyin(string languageCodeToSet)
{
var languageToSet = GetLanguageByLanguageCode(languageCodeToSet);
@@ -233,6 +246,10 @@ namespace Flow.Launcher.Core.Resource
return true;
}
+ #endregion
+
+ #region Language Resources Management
+
private void RemoveOldLanguageFiles()
{
var dicts = Application.Current.Resources.MergedDictionaries;
@@ -268,46 +285,6 @@ namespace Flow.Launcher.Core.Resource
}
}
- public List LoadAvailableLanguages()
- {
- var list = AvailableLanguages.GetAvailableLanguages();
- list.Insert(0, new Language(Constant.SystemLanguageCode, AvailableLanguages.GetSystemTranslation(SystemLanguageCode)));
- return list;
- }
-
- public static string GetTranslation(string key)
- {
- var translation = Application.Current.TryFindResource(key);
- if (translation is string)
- {
- return translation.ToString();
- }
- else
- {
- API.LogError(ClassName, $"No Translation for key {key}");
- return $"No Translation for key {key}";
- }
- }
-
- public static void UpdatePluginMetadataTranslations()
- {
- // Update plugin metadata name & description
- foreach (var p in PluginManager.GetTranslationPlugins())
- {
- if (p.Plugin is not IPluginI18n pluginI18N) return;
- try
- {
- p.Metadata.Name = pluginI18N.GetTranslatedPluginTitle();
- p.Metadata.Description = pluginI18N.GetTranslatedPluginDescription();
- pluginI18N.OnCultureInfoChanged(CultureInfo.CurrentCulture);
- }
- catch (Exception e)
- {
- API.LogException(ClassName, $"Failed for <{p.Metadata.Name}>", e);
- }
- }
- }
-
private static string LanguageFile(string folder, string language)
{
if (Directory.Exists(folder))
@@ -337,5 +314,59 @@ namespace Flow.Launcher.Core.Resource
return string.Empty;
}
}
+
+ #endregion
+
+ #region Available Languages
+
+ public List LoadAvailableLanguages()
+ {
+ var list = AvailableLanguages.GetAvailableLanguages();
+ list.Insert(0, new Language(Constant.SystemLanguageCode, AvailableLanguages.GetSystemTranslation(SystemLanguageCode)));
+ return list;
+ }
+
+ #endregion
+
+ #region Get Translations
+
+ public static string GetTranslation(string key)
+ {
+ var translation = Application.Current.TryFindResource(key);
+ if (translation is string)
+ {
+ return translation.ToString();
+ }
+ else
+ {
+ API.LogError(ClassName, $"No Translation for key {key}");
+ return $"No Translation for key {key}";
+ }
+ }
+
+ #endregion
+
+ #region Update Metadata
+
+ public static void UpdatePluginMetadataTranslations()
+ {
+ // Update plugin metadata name & description
+ foreach (var p in PluginManager.GetTranslationPlugins())
+ {
+ if (p.Plugin is not IPluginI18n pluginI18N) return;
+ try
+ {
+ p.Metadata.Name = pluginI18N.GetTranslatedPluginTitle();
+ p.Metadata.Description = pluginI18N.GetTranslatedPluginDescription();
+ pluginI18N.OnCultureInfoChanged(CultureInfo.CurrentCulture);
+ }
+ catch (Exception e)
+ {
+ API.LogException(ClassName, $"Failed for <{p.Metadata.Name}>", e);
+ }
+ }
+ }
+
+ #endregion
}
}
From fea899d09aa362b2a5285db9ce8936c44a36baa6 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 17:37:12 +0800
Subject: [PATCH 1604/1798] No need to get lower for language code
---
Flow.Launcher.Core/Resource/Internationalization.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs
index c1e1dbe79..d2ab2d028 100644
--- a/Flow.Launcher.Core/Resource/Internationalization.cs
+++ b/Flow.Launcher.Core/Resource/Internationalization.cs
@@ -170,8 +170,8 @@ namespace Flow.Launcher.Core.Resource
private static Language GetLanguageByLanguageCode(string languageCode)
{
- var lowercase = languageCode.ToLower();
- var language = AvailableLanguages.GetAvailableLanguages().FirstOrDefault(o => o.LanguageCode.Equals(lowercase, StringComparison.OrdinalIgnoreCase));
+ var language = AvailableLanguages.GetAvailableLanguages().
+ FirstOrDefault(o => o.LanguageCode.Equals(languageCode, StringComparison.OrdinalIgnoreCase));
if (language == null)
{
API.LogError(ClassName, $"Language code can't be found <{languageCode}>");
From 4f269d3fa9fdaa0e7d2c920997c6f47348963d6b Mon Sep 17 00:00:00 2001
From: Kevin Zhang <45326534+taooceros@users.noreply.github.com>
Date: Sun, 20 Jul 2025 04:11:09 -0700
Subject: [PATCH 1605/1798] Dialog Jump - Quickly navigate the Open/Save As
dialog window (#1018)
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 78 +-
.../DialogJump/DialogJump.cs | 1079 +++++++++++++++++
.../DialogJump/DialogJumpPair.cs | 63 +
.../DialogJump/Models/WindowsDialog.cs | 345 ++++++
.../DialogJump/Models/WindowsExplorer.cs | 260 ++++
.../Flow.Launcher.Infrastructure.csproj | 4 +-
.../NativeMethods.txt | 24 +
.../UserSettings/Settings.cs | 37 +
Flow.Launcher.Infrastructure/Win32Helper.cs | 76 ++
Flow.Launcher.Plugin/DialogJumpResult.cs | 92 ++
.../Interfaces/IAsyncDialogJump.cs | 24 +
.../Interfaces/IDialogJump.cs | 29 +
.../Interfaces/IDialogJumpDialog.cs | 96 ++
.../Interfaces/IDialogJumpExplorer.cs | 40 +
Flow.Launcher.Plugin/Interfaces/IPlugin.cs | 2 +-
Flow.Launcher.Plugin/Result.cs | 2 +-
Flow.Launcher/App.xaml.cs | 5 +
Flow.Launcher/Flow.Launcher.csproj | 2 -
Flow.Launcher/Helper/HotKeyMapper.cs | 17 +-
Flow.Launcher/HotkeyControl.xaml.cs | 9 +-
Flow.Launcher/Languages/en.xaml | 22 +
Flow.Launcher/MainWindow.xaml.cs | 90 +-
.../SettingsPaneGeneralViewModel.cs | 40 +-
.../ViewModels/SettingsPaneHotkeyViewModel.cs | 10 +
.../Views/SettingsPaneGeneral.xaml | 76 +-
.../Views/SettingsPaneHotkey.xaml | 12 +
Flow.Launcher/ViewModel/MainViewModel.cs | 415 +++++--
Plugins/Flow.Launcher.Plugin.Explorer/Main.cs | 20 +-
.../Search/ResultManager.cs | 11 +-
29 files changed, 2877 insertions(+), 103 deletions(-)
create mode 100644 Flow.Launcher.Infrastructure/DialogJump/DialogJump.cs
create mode 100644 Flow.Launcher.Infrastructure/DialogJump/DialogJumpPair.cs
create mode 100644 Flow.Launcher.Infrastructure/DialogJump/Models/WindowsDialog.cs
create mode 100644 Flow.Launcher.Infrastructure/DialogJump/Models/WindowsExplorer.cs
create mode 100644 Flow.Launcher.Plugin/DialogJumpResult.cs
create mode 100644 Flow.Launcher.Plugin/Interfaces/IAsyncDialogJump.cs
create mode 100644 Flow.Launcher.Plugin/Interfaces/IDialogJump.cs
create mode 100644 Flow.Launcher.Plugin/Interfaces/IDialogJumpDialog.cs
create mode 100644 Flow.Launcher.Plugin/Interfaces/IDialogJumpExplorer.cs
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index 9c54ad7b1..3904fba70 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
@@ -9,6 +9,7 @@ using System.Threading.Tasks;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Core.ExternalPlugins;
using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Infrastructure.DialogJump;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
@@ -40,6 +41,9 @@ namespace Flow.Launcher.Core.Plugin
private static IEnumerable _resultUpdatePlugin;
private static IEnumerable _translationPlugins;
+ private static readonly List _dialogJumpExplorerPlugins = new();
+ private static readonly List _dialogJumpDialogPlugins = new();
+
///
/// Directories that will hold Flow Launcher plugin directory
///
@@ -186,6 +190,24 @@ namespace Flow.Launcher.Core.Plugin
_homePlugins = GetPluginsForInterface();
_resultUpdatePlugin = GetPluginsForInterface();
_translationPlugins = GetPluginsForInterface();
+
+ // Initialize Dialog Jump plugin pairs
+ foreach (var pair in GetPluginsForInterface())
+ {
+ _dialogJumpExplorerPlugins.Add(new DialogJumpExplorerPair
+ {
+ Plugin = (IDialogJumpExplorer)pair.Plugin,
+ Metadata = pair.Metadata
+ });
+ }
+ foreach (var pair in GetPluginsForInterface())
+ {
+ _dialogJumpDialogPlugins.Add(new DialogJumpDialogPair
+ {
+ Plugin = (IDialogJumpDialog)pair.Plugin,
+ Metadata = pair.Metadata
+ });
+ }
}
private static void UpdatePluginDirectory(List metadatas)
@@ -288,20 +310,24 @@ namespace Flow.Launcher.Core.Plugin
}
}
- public static ICollection ValidPluginsForQuery(Query query)
+ public static ICollection ValidPluginsForQuery(Query query, bool dialogJump)
{
if (query is null)
return Array.Empty();
if (!NonGlobalPlugins.TryGetValue(query.ActionKeyword, out var plugin))
{
- return GlobalPlugins.Where(p => !PluginModified(p.Metadata.ID)).ToList();
+ if (dialogJump)
+ return GlobalPlugins.Where(p => p.Plugin is IAsyncDialogJump && !PluginModified(p.Metadata.ID)).ToList();
+ else
+ return GlobalPlugins.Where(p => !PluginModified(p.Metadata.ID)).ToList();
}
- if (API.PluginModified(plugin.Metadata.ID))
- {
+ if (dialogJump && plugin.Plugin is not IAsyncDialogJump)
+ return Array.Empty();
+
+ if (API.PluginModified(plugin.Metadata.ID))
return Array.Empty();
- }
return new List
{
@@ -388,6 +414,36 @@ namespace Flow.Launcher.Core.Plugin
return results;
}
+ public static async Task> QueryDialogJumpForPluginAsync(PluginPair pair, Query query, CancellationToken token)
+ {
+ var results = new List();
+ var metadata = pair.Metadata;
+
+ try
+ {
+ var milliseconds = await API.StopwatchLogDebugAsync(ClassName, $"Cost for {metadata.Name}",
+ async () => results = await ((IAsyncDialogJump)pair.Plugin).QueryDialogJumpAsync(query, token).ConfigureAwait(false));
+
+ token.ThrowIfCancellationRequested();
+ if (results == null)
+ return null;
+ UpdatePluginMetadata(results, metadata, query);
+
+ token.ThrowIfCancellationRequested();
+ }
+ catch (OperationCanceledException)
+ {
+ // null will be fine since the results will only be added into queue if the token hasn't been cancelled
+ return null;
+ }
+ catch (Exception e)
+ {
+ API.LogException(ClassName, $"Failed to query Dialog Jump for plugin: {metadata.Name}", e);
+ return null;
+ }
+ return results;
+ }
+
public static void UpdatePluginMetadata(IReadOnlyList results, PluginMetadata metadata, Query query)
{
foreach (var r in results)
@@ -463,6 +519,16 @@ namespace Flow.Launcher.Core.Plugin
return _homePlugins.Where(p => !PluginModified(p.Metadata.ID)).Any(p => p.Metadata.ID == id);
}
+ public static IList GetDialogJumpExplorers()
+ {
+ return _dialogJumpExplorerPlugins.Where(p => !PluginModified(p.Metadata.ID)).ToList();
+ }
+
+ public static IList GetDialogJumpDialogs()
+ {
+ return _dialogJumpDialogPlugins.Where(p => !PluginModified(p.Metadata.ID)).ToList();
+ }
+
public static bool ActionKeywordRegistered(string actionKeyword)
{
// this method is only checking for action keywords (defined as not '*') registration
diff --git a/Flow.Launcher.Infrastructure/DialogJump/DialogJump.cs b/Flow.Launcher.Infrastructure/DialogJump/DialogJump.cs
new file mode 100644
index 000000000..65652878f
--- /dev/null
+++ b/Flow.Launcher.Infrastructure/DialogJump/DialogJump.cs
@@ -0,0 +1,1079 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Threading;
+using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.Infrastructure.Logger;
+using Flow.Launcher.Infrastructure.DialogJump.Models;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+using NHotkey;
+using Windows.Win32;
+using Windows.Win32.Foundation;
+using Windows.Win32.UI.Accessibility;
+
+namespace Flow.Launcher.Infrastructure.DialogJump
+{
+ public static class DialogJump
+ {
+ #region Public Properties
+
+ public static Func ShowDialogJumpWindowAsync { get; set; } = null;
+
+ public static Action UpdateDialogJumpWindow { get; set; } = null;
+
+ public static Action ResetDialogJumpWindow { get; set; } = null;
+
+ public static Action HideDialogJumpWindow { get; set; } = null;
+
+ public static DialogJumpWindowPositions DialogJumpWindowPosition { get; private set; }
+
+ public static DialogJumpExplorerPair WindowsDialogJumpExplorer { get; } = new()
+ {
+ Metadata = new()
+ {
+ ID = "298b197c08a24e90ab66ac060ee2b6b8", // ID is for calculating the hash id of the Dialog Jump pairs
+ Disabled = false // Disabled is for enabling the Windows DialogJump explorers & dialogs
+ },
+ Plugin = new WindowsExplorer()
+ };
+
+ public static DialogJumpDialogPair WindowsDialogJumpDialog { get; } = new()
+ {
+ Metadata = new()
+ {
+ ID = "a4a113dc51094077ab4abb391e866c7b", // ID is for calculating the hash id of the Dialog Jump pairs
+ Disabled = false // Disabled is for enabling the Windows DialogJump explorers & dialogs
+ },
+ Plugin = new WindowsDialog()
+ };
+
+ #endregion
+
+ #region Private Fields
+
+ private static readonly string ClassName = nameof(DialogJump);
+
+ private static readonly Settings _settings = Ioc.Default.GetRequiredService();
+
+ // We should not initialize API in static constructor because it will create another API instance
+ private static IPublicAPI api = null;
+ private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService();
+
+ private static HWND _mainWindowHandle = HWND.Null;
+
+ private static readonly Dictionary _dialogJumpExplorers = new();
+
+ private static DialogJumpExplorerPair _lastExplorer = null;
+ private static readonly object _lastExplorerLock = new();
+
+ private static readonly Dictionary _dialogJumpDialogs = new();
+
+ private static IDialogJumpDialogWindow _dialogWindow = null;
+ private static readonly object _dialogWindowLock = new();
+
+ private static HWINEVENTHOOK _foregroundChangeHook = HWINEVENTHOOK.Null;
+ private static HWINEVENTHOOK _locationChangeHook = HWINEVENTHOOK.Null;
+ private static HWINEVENTHOOK _destroyChangeHook = HWINEVENTHOOK.Null;
+ private static HWINEVENTHOOK _hideChangeHook = HWINEVENTHOOK.Null;
+ private static HWINEVENTHOOK _dialogEndChangeHook = HWINEVENTHOOK.Null;
+
+ private static readonly WINEVENTPROC _fgProc = ForegroundChangeCallback;
+ private static readonly WINEVENTPROC _locProc = LocationChangeCallback;
+ private static readonly WINEVENTPROC _desProc = DestroyChangeCallback;
+ private static readonly WINEVENTPROC _hideProc = HideChangeCallback;
+ private static readonly WINEVENTPROC _dialogEndProc = DialogEndChangeCallback;
+
+ private static DispatcherTimer _dragMoveTimer = null;
+
+ // A list of all file dialog windows that are auto switched already
+ private static readonly List _autoSwitchedDialogs = new();
+ private static readonly object _autoSwitchedDialogsLock = new();
+
+ private static HWINEVENTHOOK _moveSizeHook = HWINEVENTHOOK.Null;
+ private static readonly WINEVENTPROC _moveProc = MoveSizeCallBack;
+
+ private static readonly SemaphoreSlim _foregroundChangeLock = new(1, 1);
+ private static readonly SemaphoreSlim _navigationLock = new(1, 1);
+
+ private static bool _initialized = false;
+ private static bool _enabled = false;
+
+ #endregion
+
+ #region Initialize & Setup
+
+ public static void InitializeDialogJump(IList dialogJumpExplorers,
+ IList dialogJumpDialogs)
+ {
+ if (_initialized) return;
+
+ // Initialize Dialog Jump explorers & dialogs
+ _dialogJumpExplorers.Add(WindowsDialogJumpExplorer, null);
+ foreach (var explorer in dialogJumpExplorers)
+ {
+ _dialogJumpExplorers.Add(explorer, null);
+ }
+ _dialogJumpDialogs.Add(WindowsDialogJumpDialog, null);
+ foreach (var dialog in dialogJumpDialogs)
+ {
+ _dialogJumpDialogs.Add(dialog, null);
+ }
+
+ // Initialize main window handle
+ _mainWindowHandle = Win32Helper.GetMainWindowHandle();
+
+ // Initialize timer
+ _dragMoveTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(10) };
+ _dragMoveTimer.Tick += (s, e) => InvokeUpdateDialogJumpWindow();
+
+ // Initialize Dialog Jump window position
+ DialogJumpWindowPosition = _settings.DialogJumpWindowPosition;
+
+ _initialized = true;
+ }
+
+ public static void SetupDialogJump(bool enabled)
+ {
+ if (enabled == _enabled) return;
+
+ if (enabled)
+ {
+ // Check if there are explorer windows and get the topmost one
+ try
+ {
+ if (RefreshLastExplorer())
+ {
+ Log.Debug(ClassName, $"Explorer window found");
+ }
+ }
+ catch (System.Exception)
+ {
+ // Ignored
+ }
+
+ // Unhook events
+ if (!_foregroundChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_foregroundChangeHook);
+ _foregroundChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_locationChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_locationChangeHook);
+ _locationChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_destroyChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_destroyChangeHook);
+ _destroyChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_hideChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_hideChangeHook);
+ _hideChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_dialogEndChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_dialogEndChangeHook);
+ _dialogEndChangeHook = HWINEVENTHOOK.Null;
+ }
+
+ // Hook events
+ _foregroundChangeHook = PInvoke.SetWinEventHook(
+ PInvoke.EVENT_SYSTEM_FOREGROUND,
+ PInvoke.EVENT_SYSTEM_FOREGROUND,
+ PInvoke.GetModuleHandle((PCWSTR)null),
+ _fgProc,
+ 0,
+ 0,
+ PInvoke.WINEVENT_OUTOFCONTEXT);
+ _locationChangeHook = PInvoke.SetWinEventHook(
+ PInvoke.EVENT_OBJECT_LOCATIONCHANGE,
+ PInvoke.EVENT_OBJECT_LOCATIONCHANGE,
+ PInvoke.GetModuleHandle((PCWSTR)null),
+ _locProc,
+ 0,
+ 0,
+ PInvoke.WINEVENT_OUTOFCONTEXT);
+ _destroyChangeHook = PInvoke.SetWinEventHook(
+ PInvoke.EVENT_OBJECT_DESTROY,
+ PInvoke.EVENT_OBJECT_DESTROY,
+ PInvoke.GetModuleHandle((PCWSTR)null),
+ _desProc,
+ 0,
+ 0,
+ PInvoke.WINEVENT_OUTOFCONTEXT);
+ _hideChangeHook = PInvoke.SetWinEventHook(
+ PInvoke.EVENT_OBJECT_HIDE,
+ PInvoke.EVENT_OBJECT_HIDE,
+ PInvoke.GetModuleHandle((PCWSTR)null),
+ _hideProc,
+ 0,
+ 0,
+ PInvoke.WINEVENT_OUTOFCONTEXT);
+ _dialogEndChangeHook = PInvoke.SetWinEventHook(
+ PInvoke.EVENT_SYSTEM_DIALOGEND,
+ PInvoke.EVENT_SYSTEM_DIALOGEND,
+ PInvoke.GetModuleHandle((PCWSTR)null),
+ _dialogEndProc,
+ 0,
+ 0,
+ PInvoke.WINEVENT_OUTOFCONTEXT);
+
+ if (_foregroundChangeHook.IsNull ||
+ _locationChangeHook.IsNull ||
+ _destroyChangeHook.IsNull ||
+ _hideChangeHook.IsNull ||
+ _dialogEndChangeHook.IsNull)
+ {
+ Log.Error(ClassName, "Failed to enable DialogJump");
+ return;
+ }
+ }
+ else
+ {
+ // Remove explorer windows
+ foreach (var explorer in _dialogJumpExplorers.Keys)
+ {
+ _dialogJumpExplorers[explorer] = null;
+ }
+
+ // Remove dialog windows
+ foreach (var dialog in _dialogJumpDialogs.Keys)
+ {
+ _dialogJumpDialogs[dialog] = null;
+ }
+
+ // Remove dialog window handle
+ var dialogWindowExists = false;
+ lock (_dialogWindowLock)
+ {
+ if (_dialogWindow != null)
+ {
+ _dialogWindow = null;
+ dialogWindowExists = true;
+ }
+ }
+
+ // Remove auto switched dialogs
+ lock (_autoSwitchedDialogsLock)
+ {
+ _autoSwitchedDialogs.Clear();
+ }
+
+ // Unhook events
+ if (!_foregroundChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_foregroundChangeHook);
+ _foregroundChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_locationChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_locationChangeHook);
+ _locationChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_destroyChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_destroyChangeHook);
+ _destroyChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_hideChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_hideChangeHook);
+ _hideChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_dialogEndChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_dialogEndChangeHook);
+ _dialogEndChangeHook = HWINEVENTHOOK.Null;
+ }
+
+ // Stop drag move timer
+ _dragMoveTimer?.Stop();
+
+ // Reset Dialog Jump window
+ if (dialogWindowExists)
+ {
+ InvokeResetDialogJumpWindow();
+ }
+ }
+
+ _enabled = enabled;
+ }
+
+ private static bool RefreshLastExplorer()
+ {
+ var found = false;
+
+ lock (_lastExplorerLock)
+ {
+ // Enum windows from the top to the bottom
+ PInvoke.EnumWindows((hWnd, _) =>
+ {
+ foreach (var explorer in _dialogJumpExplorers.Keys)
+ {
+ if (API.PluginModified(explorer.Metadata.ID) || // Plugin is modified
+ explorer.Metadata.Disabled) continue; // Plugin is disabled
+
+ var explorerWindow = explorer.Plugin.CheckExplorerWindow(hWnd);
+ if (explorerWindow != null)
+ {
+ _dialogJumpExplorers[explorer] = explorerWindow;
+ _lastExplorer = explorer;
+ found = true;
+ return false;
+ }
+ }
+
+ // If we reach here, it means that the window is not a file explorer
+ return true;
+ }, IntPtr.Zero);
+ }
+
+ return found;
+ }
+
+ #endregion
+
+ #region Active Explorer
+
+ public static string GetActiveExplorerPath()
+ {
+ return RefreshLastExplorer() ? _dialogJumpExplorers[_lastExplorer].GetExplorerPath() : string.Empty;
+ }
+
+ #endregion
+
+ #region Events
+
+ #region Invoke Property Events
+
+ private static async Task InvokeShowDialogJumpWindowAsync(bool dialogWindowChanged)
+ {
+ // Show Dialog Jump window
+ if (_settings.ShowDialogJumpWindow)
+ {
+ // Save Dialog Jump window position for one file dialog
+ if (dialogWindowChanged)
+ {
+ DialogJumpWindowPosition = _settings.DialogJumpWindowPosition;
+ }
+
+ // Call show Dialog Jump window
+ IDialogJumpDialogWindow dialogWindow;
+ lock (_dialogWindowLock)
+ {
+ dialogWindow = _dialogWindow;
+ }
+ if (dialogWindow != null && ShowDialogJumpWindowAsync != null)
+ {
+ await ShowDialogJumpWindowAsync.Invoke(dialogWindow.Handle);
+ }
+
+ // Hook move size event if Dialog Jump window is under dialog & dialog window changed
+ if (DialogJumpWindowPosition == DialogJumpWindowPositions.UnderDialog)
+ {
+ if (dialogWindowChanged)
+ {
+ HWND dialogWindowHandle = HWND.Null;
+ lock (_dialogWindowLock)
+ {
+ if (_dialogWindow != null)
+ {
+ dialogWindowHandle = new(_dialogWindow.Handle);
+ }
+ }
+
+ if (dialogWindowHandle == HWND.Null) return;
+
+ if (!_moveSizeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_moveSizeHook);
+ _moveSizeHook = HWINEVENTHOOK.Null;
+ }
+
+ // Call _moveProc when the window is moved or resized
+ SetMoveProc(dialogWindowHandle);
+ }
+ }
+ }
+
+ static unsafe void SetMoveProc(HWND handle)
+ {
+ uint processId;
+ var threadId = PInvoke.GetWindowThreadProcessId(handle, &processId);
+ _moveSizeHook = PInvoke.SetWinEventHook(
+ PInvoke.EVENT_SYSTEM_MOVESIZESTART,
+ PInvoke.EVENT_SYSTEM_MOVESIZEEND,
+ PInvoke.GetModuleHandle((PCWSTR)null),
+ _moveProc,
+ processId,
+ threadId,
+ PInvoke.WINEVENT_OUTOFCONTEXT);
+ }
+ }
+
+ private static void InvokeUpdateDialogJumpWindow()
+ {
+ UpdateDialogJumpWindow?.Invoke();
+ }
+
+ private static void InvokeResetDialogJumpWindow()
+ {
+ lock (_dialogWindowLock)
+ {
+ _dialogWindow = null;
+ }
+
+ // Reset Dialog Jump window
+ ResetDialogJumpWindow?.Invoke();
+
+ // Stop drag move timer
+ _dragMoveTimer?.Stop();
+
+ // Unhook move size event
+ if (!_moveSizeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_moveSizeHook);
+ _moveSizeHook = HWINEVENTHOOK.Null;
+ }
+ }
+
+ private static void InvokeHideDialogJumpWindow()
+ {
+ // Hide Dialog Jump window
+ HideDialogJumpWindow?.Invoke();
+
+ // Stop drag move timer
+ _dragMoveTimer?.Stop();
+ }
+
+ #endregion
+
+ #region Hotkey
+
+ public static void OnToggleHotkey(object sender, HotkeyEventArgs args)
+ {
+ _ = Task.Run(async () =>
+ {
+ try
+ {
+ await NavigateDialogPathAsync(PInvoke.GetForegroundWindow());
+ }
+ catch (System.Exception ex)
+ {
+ Log.Exception(ClassName, "Failed to navigate dialog path", ex);
+ }
+ });
+ }
+
+ #endregion
+
+ #region Windows Events
+
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
+ private static async void ForegroundChangeCallback(
+ HWINEVENTHOOK hWinEventHook,
+ uint eventType,
+ HWND hwnd,
+ int idObject,
+ int idChild,
+ uint dwEventThread,
+ uint dwmsEventTime
+ )
+ {
+ await _foregroundChangeLock.WaitAsync();
+ try
+ {
+ // Check if it is a file dialog window
+ var isDialogWindow = false;
+ var dialogWindowChanged = false;
+ foreach (var dialog in _dialogJumpDialogs.Keys)
+ {
+ if (API.PluginModified(dialog.Metadata.ID) || // Plugin is modified
+ dialog.Metadata.Disabled) continue; // Plugin is disabled
+
+ IDialogJumpDialogWindow dialogWindow;
+ var existingDialogWindow = _dialogJumpDialogs[dialog];
+ if (existingDialogWindow != null && existingDialogWindow.Handle == hwnd)
+ {
+ // If the dialog window is already in the list, no need to check again
+ dialogWindow = existingDialogWindow;
+ }
+ else
+ {
+ dialogWindow = dialog.Plugin.CheckDialogWindow(hwnd);
+ }
+
+ // If the dialog window is found, set it
+ if (dialogWindow != null)
+ {
+ lock (_dialogWindowLock)
+ {
+ dialogWindowChanged = _dialogWindow == null || _dialogWindow.Handle != hwnd;
+ _dialogWindow = dialogWindow;
+ }
+
+ isDialogWindow = true;
+ break;
+ }
+ }
+
+ // Handle window based on its type
+ if (isDialogWindow)
+ {
+ Log.Debug(ClassName, $"Dialog Window: {hwnd}");
+ // Navigate to path
+ if (_settings.AutoDialogJump)
+ {
+ // Check if we have already switched for this dialog
+ bool alreadySwitched;
+ lock (_autoSwitchedDialogsLock)
+ {
+ alreadySwitched = _autoSwitchedDialogs.Contains(hwnd);
+ }
+
+ // Just show Dialog Jump window
+ if (alreadySwitched)
+ {
+ await InvokeShowDialogJumpWindowAsync(dialogWindowChanged);
+ }
+ // Show Dialog Jump window after navigating the path
+ else
+ {
+ if (!await Task.Run(async () =>
+ {
+ try
+ {
+ return await NavigateDialogPathAsync(hwnd, true);
+ }
+ catch (System.Exception ex)
+ {
+ Log.Exception(ClassName, "Failed to navigate dialog path", ex);
+ return false;
+ }
+ }))
+ {
+ await InvokeShowDialogJumpWindowAsync(dialogWindowChanged);
+ }
+ }
+ }
+ else
+ {
+ await InvokeShowDialogJumpWindowAsync(dialogWindowChanged);
+ }
+ }
+ // Dialog jump window
+ else if (hwnd == _mainWindowHandle)
+ {
+ Log.Debug(ClassName, $"Main Window: {hwnd}");
+ }
+ // Other window
+ else
+ {
+ Log.Debug(ClassName, $"Other Window: {hwnd}");
+ var dialogWindowExist = false;
+ lock (_dialogWindowLock)
+ {
+ if (_dialogWindow != null)
+ {
+ dialogWindowExist = true;
+ }
+ }
+ if (dialogWindowExist) // Neither Dialog Jump window nor file dialog window is foreground
+ {
+ // Hide Dialog Jump window until the file dialog window is brought to the foreground
+ InvokeHideDialogJumpWindow();
+ }
+
+ // Check if there are foreground explorer windows
+ try
+ {
+ lock (_lastExplorerLock)
+ {
+ foreach (var explorer in _dialogJumpExplorers.Keys)
+ {
+ if (API.PluginModified(explorer.Metadata.ID) || // Plugin is modified
+ explorer.Metadata.Disabled) continue; // Plugin is disabled
+
+ var explorerWindow = explorer.Plugin.CheckExplorerWindow(hwnd);
+ if (explorerWindow != null)
+ {
+ Log.Debug(ClassName, $"Explorer window: {hwnd}");
+ _dialogJumpExplorers[explorer] = explorerWindow;
+ _lastExplorer = explorer;
+ break;
+ }
+ }
+ }
+ }
+ catch (System.Exception ex)
+ {
+ Log.Exception(ClassName, "An error occurred while checking foreground explorer windows", ex);
+ }
+ }
+ }
+ catch (System.Exception ex)
+ {
+ Log.Exception(ClassName, "Failed to invoke ForegroundChangeCallback", ex);
+ }
+ finally
+ {
+ _foregroundChangeLock.Release();
+ }
+ }
+
+ private static void LocationChangeCallback(
+ HWINEVENTHOOK hWinEventHook,
+ uint eventType,
+ HWND hwnd,
+ int idObject,
+ int idChild,
+ uint dwEventThread,
+ uint dwmsEventTime
+ )
+ {
+ // If the dialog window is moved, update the Dialog Jump window position
+ var dialogWindowExist = false;
+ lock (_dialogWindowLock)
+ {
+ if (_dialogWindow != null && _dialogWindow.Handle == hwnd)
+ {
+ dialogWindowExist = true;
+ }
+ }
+ if (dialogWindowExist)
+ {
+ InvokeUpdateDialogJumpWindow();
+ }
+ }
+
+ private static void MoveSizeCallBack(
+ HWINEVENTHOOK hWinEventHook,
+ uint eventType,
+ HWND hwnd,
+ int idObject,
+ int idChild,
+ uint dwEventThread,
+ uint dwmsEventTime
+ )
+ {
+ // If the dialog window is moved or resized, update the Dialog Jump window position
+ if (_dragMoveTimer != null)
+ {
+ switch (eventType)
+ {
+ case PInvoke.EVENT_SYSTEM_MOVESIZESTART:
+ _dragMoveTimer.Start(); // Start dragging position
+ break;
+ case PInvoke.EVENT_SYSTEM_MOVESIZEEND:
+ _dragMoveTimer.Stop(); // Stop dragging
+ break;
+ }
+ }
+ }
+
+ private static void DestroyChangeCallback(
+ HWINEVENTHOOK hWinEventHook,
+ uint eventType,
+ HWND hwnd,
+ int idObject,
+ int idChild,
+ uint dwEventThread,
+ uint dwmsEventTime
+ )
+ {
+ // If the dialog window is destroyed, set _dialogWindowHandle to null
+ var dialogWindowExist = false;
+ lock (_dialogWindowLock)
+ {
+ if (_dialogWindow != null && _dialogWindow.Handle == hwnd)
+ {
+ Log.Debug(ClassName, $"Destory dialog: {hwnd}");
+ _dialogWindow = null;
+ dialogWindowExist = true;
+ }
+ }
+ if (dialogWindowExist)
+ {
+ lock (_autoSwitchedDialogsLock)
+ {
+ _autoSwitchedDialogs.Remove(hwnd);
+ }
+ InvokeResetDialogJumpWindow();
+ }
+ }
+
+ private static void HideChangeCallback(
+ HWINEVENTHOOK hWinEventHook,
+ uint eventType,
+ HWND hwnd,
+ int idObject,
+ int idChild,
+ uint dwEventThread,
+ uint dwmsEventTime
+ )
+ {
+ // If the dialog window is hidden, set _dialogWindowHandle to null
+ var dialogWindowExist = false;
+ lock (_dialogWindowLock)
+ {
+ if (_dialogWindow != null && _dialogWindow.Handle == hwnd)
+ {
+ Log.Debug(ClassName, $"Hide dialog: {hwnd}");
+ _dialogWindow = null;
+ dialogWindowExist = true;
+ }
+ }
+ if (dialogWindowExist)
+ {
+ lock (_autoSwitchedDialogsLock)
+ {
+ _autoSwitchedDialogs.Remove(hwnd);
+ }
+ InvokeResetDialogJumpWindow();
+ }
+ }
+
+ private static void DialogEndChangeCallback(
+ HWINEVENTHOOK hWinEventHook,
+ uint eventType,
+ HWND hwnd,
+ int idObject,
+ int idChild,
+ uint dwEventThread,
+ uint dwmsEventTime
+ )
+ {
+ // If the dialog window is ended, set _dialogWindowHandle to null
+ var dialogWindowExist = false;
+ lock (_dialogWindowLock)
+ {
+ if (_dialogWindow != null && _dialogWindow.Handle == hwnd)
+ {
+ Log.Debug(ClassName, $"End dialog: {hwnd}");
+ _dialogWindow = null;
+ dialogWindowExist = true;
+ }
+ }
+ if (dialogWindowExist)
+ {
+ lock (_autoSwitchedDialogsLock)
+ {
+ _autoSwitchedDialogs.Remove(hwnd);
+ }
+ InvokeResetDialogJumpWindow();
+ }
+ }
+
+ #endregion
+
+ #endregion
+
+ #region Path Navigation
+
+ // Edited from: https://github.com/idkidknow/Flow.Launcher.Plugin.DirQuickJump
+
+ public static async Task JumpToPathAsync(nint hwnd, string path)
+ {
+ // Check handle
+ if (hwnd == nint.Zero) return false;
+
+ // Check path null or empty
+ if (string.IsNullOrEmpty(path)) return false;
+
+ // Check path
+ if (!CheckPath(path, out var isFile)) return false;
+
+ // Get dialog tab
+ var dialogWindowTab = GetDialogWindowTab(new(hwnd));
+ if (dialogWindowTab == null) return false;
+
+ return await JumpToPathAsync(dialogWindowTab, path, isFile, false);
+ }
+
+ private static async Task NavigateDialogPathAsync(HWND hwnd, bool auto = false)
+ {
+ // Check handle
+ if (hwnd == HWND.Null) return false;
+
+ // Get explorer path
+ string path;
+ lock (_lastExplorerLock)
+ {
+ path = _dialogJumpExplorers[_lastExplorer]?.GetExplorerPath();
+ }
+
+ // Check path null or empty
+ if (string.IsNullOrEmpty(path)) return false;
+
+ // Check path
+ if (!CheckPath(path, out var isFile)) return false;
+
+ // Get dialog tab
+ var dialogWindowTab = GetDialogWindowTab(hwnd);
+ if (dialogWindowTab == null) return false;
+
+ // Jump to path
+ return await JumpToPathAsync(dialogWindowTab, path, isFile, auto);
+ }
+
+ private static bool CheckPath(string path, out bool file)
+ {
+ file = false;
+ try
+ {
+ // shell: and shell::: paths
+ if (path.StartsWith("shell:", StringComparison.OrdinalIgnoreCase))
+ {
+ return true;
+ }
+ // file: URI paths
+ var localPath = path.StartsWith("file:", StringComparison.OrdinalIgnoreCase)
+ ? new Uri(path).LocalPath
+ : path;
+ // Is folder?
+ var isFolder = Directory.Exists(localPath);
+ // Is file?
+ var isFile = File.Exists(localPath);
+ file = isFile;
+ return isFolder || isFile;
+ }
+ catch (System.Exception e)
+ {
+ Log.Exception(ClassName, "Failed to check path", e);
+ return false;
+ }
+ }
+
+ private static IDialogJumpDialogWindowTab GetDialogWindowTab(HWND hwnd)
+ {
+ var dialogWindow = GetDialogWindow(hwnd);
+ if (dialogWindow == null) return null;
+ var dialogWindowTab = dialogWindow.GetCurrentTab();
+ return dialogWindowTab;
+ }
+
+ private static IDialogJumpDialogWindow GetDialogWindow(HWND hwnd)
+ {
+ // First check dialog window
+ lock (_dialogWindowLock)
+ {
+ if (_dialogWindow != null && _dialogWindow.Handle == hwnd)
+ {
+ return _dialogWindow;
+ }
+ }
+
+ // Then check all dialog windows
+ foreach (var dialog in _dialogJumpDialogs.Keys)
+ {
+ if (API.PluginModified(dialog.Metadata.ID) || // Plugin is modified
+ dialog.Metadata.Disabled) continue; // Plugin is disabled
+
+ var dialogWindow = _dialogJumpDialogs[dialog];
+ if (dialogWindow != null && dialogWindow.Handle == hwnd)
+ {
+ return dialogWindow;
+ }
+ }
+
+ // Finally search for the dialog window again
+ foreach (var dialog in _dialogJumpDialogs.Keys)
+ {
+ if (API.PluginModified(dialog.Metadata.ID) || // Plugin is modified
+ dialog.Metadata.Disabled) continue; // Plugin is disabled
+
+ IDialogJumpDialogWindow dialogWindow;
+ var existingDialogWindow = _dialogJumpDialogs[dialog];
+ if (existingDialogWindow != null && existingDialogWindow.Handle == hwnd)
+ {
+ // If the dialog window is already in the list, no need to check again
+ dialogWindow = existingDialogWindow;
+ }
+ else
+ {
+ dialogWindow = dialog.Plugin.CheckDialogWindow(hwnd);
+ }
+
+ // Update dialog window if found
+ if (dialogWindow != null)
+ {
+ _dialogJumpDialogs[dialog] = dialogWindow;
+ return dialogWindow;
+ }
+ }
+
+ return null;
+ }
+
+ private static async Task JumpToPathAsync(IDialogJumpDialogWindowTab dialog, string path, bool isFile, bool auto = false)
+ {
+ // Jump after flow launcher window vanished (after JumpAction returned true)
+ // and the dialog had been in the foreground.
+ var dialogHandle = dialog.Handle;
+ var timeOut = !SpinWait.SpinUntil(() => Win32Helper.IsForegroundWindow(dialogHandle), 1000);
+ if (timeOut) return false;
+
+ // Assume that the dialog is in the foreground now
+ await _navigationLock.WaitAsync();
+ try
+ {
+ bool result;
+ if (isFile)
+ {
+ switch (_settings.DialogJumpFileResultBehaviour)
+ {
+ case DialogJumpFileResultBehaviours.FullPath:
+ Log.Debug(ClassName, $"File Jump FullPath: {path}");
+ result = FileJump(path, dialog);
+ break;
+ case DialogJumpFileResultBehaviours.FullPathOpen:
+ Log.Debug(ClassName, $"File Jump FullPathOpen: {path}");
+ result = FileJump(path, dialog, openFile: true);
+ break;
+ case DialogJumpFileResultBehaviours.Directory:
+ Log.Debug(ClassName, $"File Jump Directory (Auto: {auto}): {path}");
+ result = DirJump(Path.GetDirectoryName(path), dialog, auto);
+ break;
+ default:
+ return false;
+ }
+ }
+ else
+ {
+ Log.Debug(ClassName, $"Dir Jump: {path}");
+ result = DirJump(path, dialog, auto);
+ }
+
+ if (result)
+ {
+ lock (_autoSwitchedDialogsLock)
+ {
+ _autoSwitchedDialogs.Add(new(dialogHandle));
+ }
+ }
+
+ return result;
+ }
+ catch (System.Exception e)
+ {
+ Log.Exception(ClassName, "Failed to jump to path", e);
+ return false;
+ }
+ finally
+ {
+ _navigationLock.Release();
+ }
+ }
+
+ private static bool FileJump(string filePath, IDialogJumpDialogWindowTab dialog, bool openFile = false)
+ {
+ if (!dialog.JumpFile(filePath))
+ {
+ Log.Error(ClassName, "Failed to jump file");
+ return false;
+ }
+
+ if (openFile && !dialog.Open())
+ {
+ Log.Error(ClassName, "Failed to open file");
+ return false;
+ }
+
+ return true;
+ }
+
+ private static bool DirJump(string dirPath, IDialogJumpDialogWindowTab dialog, bool auto = false)
+ {
+ if (!dialog.JumpFolder(dirPath, auto))
+ {
+ Log.Error(ClassName, "Failed to jump folder");
+ return false;
+ }
+
+ return true;
+ }
+
+ #endregion
+
+ #region Dispose
+
+ public static void Dispose()
+ {
+ // Reset flags
+ _enabled = false;
+ _initialized = false;
+
+ // Unhook events
+ if (!_foregroundChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_foregroundChangeHook);
+ _foregroundChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_locationChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_locationChangeHook);
+ _locationChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_moveSizeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_moveSizeHook);
+ _moveSizeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_destroyChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_destroyChangeHook);
+ _destroyChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_hideChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_hideChangeHook);
+ _hideChangeHook = HWINEVENTHOOK.Null;
+ }
+ if (!_dialogEndChangeHook.IsNull)
+ {
+ PInvoke.UnhookWinEvent(_dialogEndChangeHook);
+ _dialogEndChangeHook = HWINEVENTHOOK.Null;
+ }
+
+ // Dispose explorers
+ foreach (var explorer in _dialogJumpExplorers.Keys)
+ {
+ _dialogJumpExplorers[explorer]?.Dispose();
+ }
+ _dialogJumpExplorers.Clear();
+ lock (_lastExplorerLock)
+ {
+ _lastExplorer = null;
+ }
+
+ // Dispose dialogs
+ foreach (var dialog in _dialogJumpDialogs.Keys)
+ {
+ _dialogJumpDialogs[dialog]?.Dispose();
+ }
+ _dialogJumpDialogs.Clear();
+ lock (_dialogWindowLock)
+ {
+ _dialogWindow = null;
+ }
+
+ // Dispose locks
+ _foregroundChangeLock.Dispose();
+ _navigationLock.Dispose();
+
+ // Stop drag move timer
+ if (_dragMoveTimer != null)
+ {
+ _dragMoveTimer.Stop();
+ _dragMoveTimer = null;
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/Flow.Launcher.Infrastructure/DialogJump/DialogJumpPair.cs b/Flow.Launcher.Infrastructure/DialogJump/DialogJumpPair.cs
new file mode 100644
index 000000000..d1248eac1
--- /dev/null
+++ b/Flow.Launcher.Infrastructure/DialogJump/DialogJumpPair.cs
@@ -0,0 +1,63 @@
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.Infrastructure.DialogJump;
+
+public class DialogJumpExplorerPair
+{
+ public IDialogJumpExplorer Plugin { get; init; }
+
+ public PluginMetadata Metadata { get; init; }
+
+ public override string ToString()
+ {
+ return Metadata.Name;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (obj is DialogJumpExplorerPair r)
+ {
+ return string.Equals(r.Metadata.ID, Metadata.ID);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public override int GetHashCode()
+ {
+ var hashcode = Metadata.ID?.GetHashCode() ?? 0;
+ return hashcode;
+ }
+}
+
+public class DialogJumpDialogPair
+{
+ public IDialogJumpDialog Plugin { get; init; }
+
+ public PluginMetadata Metadata { get; init; }
+
+ public override string ToString()
+ {
+ return Metadata.Name;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (obj is DialogJumpDialogPair r)
+ {
+ return string.Equals(r.Metadata.ID, Metadata.ID);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public override int GetHashCode()
+ {
+ var hashcode = Metadata.ID?.GetHashCode() ?? 0;
+ return hashcode;
+ }
+}
diff --git a/Flow.Launcher.Infrastructure/DialogJump/Models/WindowsDialog.cs b/Flow.Launcher.Infrastructure/DialogJump/Models/WindowsDialog.cs
new file mode 100644
index 000000000..ee4e03433
--- /dev/null
+++ b/Flow.Launcher.Infrastructure/DialogJump/Models/WindowsDialog.cs
@@ -0,0 +1,345 @@
+using System;
+using System.Threading;
+using Flow.Launcher.Infrastructure.Logger;
+using Flow.Launcher.Plugin;
+using Windows.Win32;
+using Windows.Win32.Foundation;
+using Windows.Win32.UI.WindowsAndMessaging;
+using WindowsInput;
+using WindowsInput.Native;
+
+namespace Flow.Launcher.Infrastructure.DialogJump.Models
+{
+ ///
+ /// Class for handling Windows File Dialog instances in DialogJump.
+ ///
+ public class WindowsDialog : IDialogJumpDialog
+ {
+ private const string WindowsDialogClassName = "#32770";
+
+ public IDialogJumpDialogWindow CheckDialogWindow(IntPtr hwnd)
+ {
+ // Is it a Win32 dialog box?
+ if (GetClassName(new(hwnd)) == WindowsDialogClassName)
+ {
+ // Is it a windows file dialog?
+ var dialogType = GetFileDialogType(new(hwnd));
+ if (dialogType != DialogType.Others)
+ {
+ return new WindowsDialogWindow(hwnd, dialogType);
+ }
+ }
+
+ return null;
+ }
+
+ public void Dispose()
+ {
+
+ }
+
+ #region Help Methods
+
+ private static unsafe string GetClassName(HWND handle)
+ {
+ fixed (char* buf = new char[256])
+ {
+ return PInvoke.GetClassName(handle, buf, 256) switch
+ {
+ 0 => string.Empty,
+ _ => new string(buf),
+ };
+ }
+ }
+
+ private static DialogType GetFileDialogType(HWND handle)
+ {
+ // Is it a Windows Open file dialog?
+ var fileEditor = PInvoke.GetDlgItem(handle, 0x047C);
+ if (fileEditor != HWND.Null && GetClassName(fileEditor) == "ComboBoxEx32") return DialogType.Open;
+
+ // Is it a Windows Save or Save As file dialog?
+ fileEditor = PInvoke.GetDlgItem(handle, 0x0000);
+ if (fileEditor != HWND.Null && GetClassName(fileEditor) == "DUIViewWndClassName") return DialogType.SaveOrSaveAs;
+
+ return DialogType.Others;
+ }
+
+ #endregion
+ }
+
+ public class WindowsDialogWindow : IDialogJumpDialogWindow
+ {
+ public IntPtr Handle { get; private set; } = IntPtr.Zero;
+
+ // After jumping folder, file editor handle of Save / SaveAs file dialogs cannot be found anymore
+ // So we need to cache the current tab and use the original handle
+ private IDialogJumpDialogWindowTab _currentTab { get; set; } = null;
+
+ private readonly DialogType _dialogType;
+
+ internal WindowsDialogWindow(IntPtr handle, DialogType dialogType)
+ {
+ Handle = handle;
+ _dialogType = dialogType;
+ }
+
+ public IDialogJumpDialogWindowTab GetCurrentTab()
+ {
+ return _currentTab ??= new WindowsDialogTab(Handle, _dialogType);
+ }
+
+ public void Dispose()
+ {
+
+ }
+ }
+
+ public class WindowsDialogTab : IDialogJumpDialogWindowTab
+ {
+ #region Public Properties
+
+ public IntPtr Handle { get; private set; } = IntPtr.Zero;
+
+ #endregion
+
+ #region Private Fields
+
+ private static readonly string ClassName = nameof(WindowsDialogTab);
+
+ private static readonly InputSimulator _inputSimulator = new();
+
+ private readonly DialogType _dialogType;
+
+ private bool _legacy { get; set; } = false;
+ private HWND _pathControl { get; set; } = HWND.Null;
+ private HWND _pathEditor { get; set; } = HWND.Null;
+ private HWND _fileEditor { get; set; } = HWND.Null;
+ private HWND _openButton { get; set; } = HWND.Null;
+
+ #endregion
+
+ #region Constructor
+
+ internal WindowsDialogTab(IntPtr handle, DialogType dialogType)
+ {
+ Handle = handle;
+ _dialogType = dialogType;
+ Log.Debug(ClassName, $"File dialog type: {dialogType}");
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ public string GetCurrentFolder()
+ {
+ if (_pathEditor.IsNull && !GetPathControlEditor()) return string.Empty;
+ return GetWindowText(_pathEditor);
+ }
+
+ public string GetCurrentFile()
+ {
+ if (_fileEditor.IsNull && !GetFileEditor()) return string.Empty;
+ return GetWindowText(_fileEditor);
+ }
+
+ public bool JumpFolder(string path, bool auto)
+ {
+ if (auto)
+ {
+ // Use legacy jump folder method for auto Dialog Jump because file editor is default value.
+ // After setting path using file editor, we do not need to revert its value.
+ return JumpFolderWithFileEditor(path, false);
+ }
+
+ // Alt-D or Ctrl-L to focus on the path input box
+ // "ComboBoxEx32" is not visible when the path editor is not with the keyboard focus
+ _inputSimulator.Keyboard.ModifiedKeyStroke(VirtualKeyCode.LMENU, VirtualKeyCode.VK_D);
+ // _inputSimulator.Keyboard.ModifiedKeyStroke(VirtualKeyCode.LCONTROL, VirtualKeyCode.VK_L);
+
+ if (_pathControl.IsNull && !GetPathControlEditor())
+ {
+ // https://github.com/idkidknow/Flow.Launcher.Plugin.DirQuickJump/issues/1
+ // The dialog is a legacy one, so we can only edit file editor directly.
+ Log.Debug(ClassName, "Legacy dialog, using legacy jump folder method");
+ return JumpFolderWithFileEditor(path, true);
+ }
+
+ var timeOut = !SpinWait.SpinUntil(() =>
+ {
+ var style = PInvoke.GetWindowLongPtr(_pathControl, WINDOW_LONG_PTR_INDEX.GWL_STYLE);
+ return (style & (int)WINDOW_STYLE.WS_VISIBLE) != 0;
+ }, 1000);
+ if (timeOut)
+ {
+ // Path control is not visible, so we can only edit file editor directly.
+ Log.Debug(ClassName, "Path control is not visible, using legacy jump folder method");
+ return JumpFolderWithFileEditor(path, true);
+ }
+
+ if (_pathEditor.IsNull)
+ {
+ // Path editor cannot be found, so we can only edit file editor directly.
+ Log.Debug(ClassName, "Path editor cannot be found, using legacy jump folder method");
+ return JumpFolderWithFileEditor(path, true);
+ }
+ SetWindowText(_pathEditor, path);
+
+ _inputSimulator.Keyboard.KeyPress(VirtualKeyCode.RETURN);
+
+ return true;
+ }
+
+ public bool JumpFile(string path)
+ {
+ if (_fileEditor.IsNull && !GetFileEditor()) return false;
+ SetWindowText(_fileEditor, path);
+
+ return true;
+ }
+
+ public bool Open()
+ {
+ if (_openButton.IsNull && !GetOpenButton()) return false;
+ PInvoke.PostMessage(_openButton, PInvoke.BM_CLICK, 0, 0);
+
+ return true;
+ }
+
+ public void Dispose()
+ {
+
+ }
+
+ #endregion
+
+ #region Helper Methods
+
+ #region Get Handles
+
+ private bool GetPathControlEditor()
+ {
+ // Get the handle of the path editor
+ // Must use PInvoke.FindWindowEx because PInvoke.GetDlgItem(Handle, 0x0000) will get another control
+ _pathControl = PInvoke.FindWindowEx(new(Handle), HWND.Null, "WorkerW", null); // 0x0000
+ _pathControl = PInvoke.FindWindowEx(_pathControl, HWND.Null, "ReBarWindow32", null); // 0xA005
+ _pathControl = PInvoke.FindWindowEx(_pathControl, HWND.Null, "Address Band Root", null); // 0xA205
+ _pathControl = PInvoke.FindWindowEx(_pathControl, HWND.Null, "msctls_progress32", null); // 0x0000
+ _pathControl = PInvoke.FindWindowEx(_pathControl, HWND.Null, "ComboBoxEx32", null); // 0xA205
+ if (_pathControl == HWND.Null)
+ {
+ _pathEditor = HWND.Null;
+ _legacy = true;
+ Log.Info(ClassName, "Legacy dialog");
+ }
+ else
+ {
+ _pathEditor = PInvoke.GetDlgItem(_pathControl, 0xA205); // ComboBox
+ _pathEditor = PInvoke.GetDlgItem(_pathEditor, 0xA205); // Edit
+ if (_pathEditor == HWND.Null)
+ {
+ _legacy = true;
+ Log.Error(ClassName, "Failed to find path editor handle");
+ }
+ }
+
+ return !_legacy;
+ }
+
+ private bool GetFileEditor()
+ {
+ if (_dialogType == DialogType.Open)
+ {
+ // Get the handle of the file name editor of Open file dialog
+ _fileEditor = PInvoke.GetDlgItem(new(Handle), 0x047C); // ComboBoxEx32
+ _fileEditor = PInvoke.GetDlgItem(_fileEditor, 0x047C); // ComboBox
+ _fileEditor = PInvoke.GetDlgItem(_fileEditor, 0x047C); // Edit
+ }
+ else
+ {
+ // Get the handle of the file name editor of Save / SaveAs file dialog
+ _fileEditor = PInvoke.GetDlgItem(new(Handle), 0x0000); // DUIViewWndClassName
+ _fileEditor = PInvoke.GetDlgItem(_fileEditor, 0x0000); // DirectUIHWND
+ _fileEditor = PInvoke.GetDlgItem(_fileEditor, 0x0000); // FloatNotifySink
+ _fileEditor = PInvoke.GetDlgItem(_fileEditor, 0x0000); // ComboBox
+ _fileEditor = PInvoke.GetDlgItem(_fileEditor, 0x03E9); // Edit
+ }
+
+ if (_fileEditor == HWND.Null)
+ {
+ Log.Error(ClassName, "Failed to find file name editor handle");
+ return false;
+ }
+
+ return true;
+ }
+
+ private bool GetOpenButton()
+ {
+ // Get the handle of the open button
+ _openButton = PInvoke.GetDlgItem(new(Handle), 0x0001); // Open/Save/SaveAs Button
+ if (_openButton == HWND.Null)
+ {
+ Log.Error(ClassName, "Failed to find open button handle");
+ return false;
+ }
+
+ return true;
+ }
+
+ #endregion
+
+ #region Windows Text
+
+ private static unsafe string GetWindowText(HWND handle)
+ {
+ int length;
+ Span buffer = stackalloc char[1000];
+ fixed (char* pBuffer = buffer)
+ {
+ // If the control has no title bar or text, or if the control handle is invalid, the return value is zero.
+ length = (int)PInvoke.SendMessage(handle, PInvoke.WM_GETTEXT, 1000, (nint)pBuffer);
+ }
+
+ return buffer[..length].ToString();
+ }
+
+ private static unsafe nint SetWindowText(HWND handle, string text)
+ {
+ fixed (char* textPtr = text + '\0')
+ {
+ return PInvoke.SendMessage(handle, PInvoke.WM_SETTEXT, 0, (nint)textPtr).Value;
+ }
+ }
+
+ #endregion
+
+ #region Legacy Jump Folder
+
+ private bool JumpFolderWithFileEditor(string path, bool resetFocus)
+ {
+ // For Save / Save As dialog, the default value in file editor is not null and it can cause strange behaviors.
+ if (resetFocus && _dialogType == DialogType.SaveOrSaveAs) return false;
+
+ if (_fileEditor.IsNull && !GetFileEditor()) return false;
+ SetWindowText(_fileEditor, path);
+
+ if (_openButton.IsNull && !GetOpenButton()) return false;
+ PInvoke.SendMessage(_openButton, PInvoke.BM_CLICK, 0, 0);
+
+ return true;
+ }
+
+ #endregion
+
+ #endregion
+ }
+
+ internal enum DialogType
+ {
+ Others,
+ Open,
+ SaveOrSaveAs
+ }
+}
diff --git a/Flow.Launcher.Infrastructure/DialogJump/Models/WindowsExplorer.cs b/Flow.Launcher.Infrastructure/DialogJump/Models/WindowsExplorer.cs
new file mode 100644
index 000000000..e9ed9dae7
--- /dev/null
+++ b/Flow.Launcher.Infrastructure/DialogJump/Models/WindowsExplorer.cs
@@ -0,0 +1,260 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+using Flow.Launcher.Plugin;
+using Windows.Win32;
+using Windows.Win32.Foundation;
+using Windows.Win32.System.Com;
+using Windows.Win32.UI.Shell;
+
+namespace Flow.Launcher.Infrastructure.DialogJump.Models
+{
+ ///
+ /// Class for handling Windows Explorer instances in DialogJump.
+ ///
+ public class WindowsExplorer : IDialogJumpExplorer
+ {
+ public IDialogJumpExplorerWindow CheckExplorerWindow(IntPtr hwnd)
+ {
+ IDialogJumpExplorerWindow explorerWindow = null;
+
+ // Is it from Explorer?
+ var processName = Win32Helper.GetProcessNameFromHwnd(new(hwnd));
+ if (processName.Equals("explorer.exe", StringComparison.OrdinalIgnoreCase))
+ {
+ EnumerateShellWindows((shellWindow) =>
+ {
+ try
+ {
+ if (shellWindow is not IWebBrowser2 explorer) return true;
+
+ if (explorer.HWND != hwnd) return true;
+
+ explorerWindow = new WindowsExplorerWindow(hwnd);
+ return false;
+ }
+ catch
+ {
+ // Ignored
+ }
+
+ return true;
+ });
+ }
+ return explorerWindow;
+ }
+
+ internal static unsafe void EnumerateShellWindows(Func action)
+ {
+ // Create an instance of ShellWindows
+ var clsidShellWindows = new Guid("9BA05972-F6A8-11CF-A442-00A0C90A8F39"); // ShellWindowsClass
+ var iidIShellWindows = typeof(IShellWindows).GUID; // IShellWindows
+
+ var result = PInvoke.CoCreateInstance(
+ &clsidShellWindows,
+ null,
+ CLSCTX.CLSCTX_ALL,
+ &iidIShellWindows,
+ out var shellWindowsObj);
+
+ if (result.Failed) return;
+
+ var shellWindows = (IShellWindows)shellWindowsObj;
+
+ // Enumerate the shell windows
+ var count = shellWindows.Count;
+ for (var i = 0; i < count; i++)
+ {
+ if (!action(shellWindows.Item(i)))
+ {
+ return;
+ }
+ }
+ }
+
+ public void Dispose()
+ {
+
+ }
+ }
+
+ public class WindowsExplorerWindow : IDialogJumpExplorerWindow
+ {
+ public IntPtr Handle { get; }
+
+ private static Guid _shellBrowserGuid = typeof(IShellBrowser).GUID;
+
+ internal WindowsExplorerWindow(IntPtr handle)
+ {
+ Handle = handle;
+ }
+
+ public string GetExplorerPath()
+ {
+ if (Handle == IntPtr.Zero) return null;
+
+ var activeTabHandle = GetActiveTabHandle(new(Handle));
+ if (activeTabHandle.IsNull) return null;
+
+ var window = GetExplorerByTabHandle(activeTabHandle);
+ if (window == null) return null;
+
+ var path = GetLocation(window);
+ return path;
+ }
+
+ public void Dispose()
+ {
+
+ }
+
+ #region Helper Methods
+
+ // Inspired by: https://github.com/w4po/ExplorerTabUtility
+
+ private static HWND GetActiveTabHandle(HWND windowHandle)
+ {
+ // Active tab always at the top of the z-index, so it is the first child of the ShellTabWindowClass.
+ var activeTab = PInvoke.FindWindowEx(windowHandle, HWND.Null, "ShellTabWindowClass", null);
+ return activeTab;
+ }
+
+ private static IWebBrowser2 GetExplorerByTabHandle(HWND tabHandle)
+ {
+ if (tabHandle.IsNull) return null;
+
+ IWebBrowser2 window = null;
+ WindowsExplorer.EnumerateShellWindows((shellWindow) =>
+ {
+ try
+ {
+ return StartSTAThread(() =>
+ {
+ if (shellWindow is not IWebBrowser2 explorer) return true;
+
+ if (explorer is not IServiceProvider sp) return true;
+
+ sp.QueryService(ref _shellBrowserGuid, ref _shellBrowserGuid, out var shellBrowser);
+ if (shellBrowser == null) return true;
+
+ try
+ {
+ shellBrowser.GetWindow(out var hWnd); // Must execute in STA thread to get this hWnd
+
+ if (hWnd == tabHandle)
+ {
+ window = explorer;
+ return false;
+ }
+ }
+ catch
+ {
+ // Ignored
+ }
+ finally
+ {
+ Marshal.ReleaseComObject(shellBrowser);
+ }
+
+ return true;
+ }) ?? true;
+ }
+ catch
+ {
+ // Ignored
+ }
+
+ return true;
+ });
+
+ return window;
+ }
+
+ private static bool? StartSTAThread(Func action)
+ {
+ bool? result = null;
+ var thread = new Thread(() =>
+ {
+ result = action();
+ })
+ {
+ IsBackground = true
+ };
+ thread.SetApartmentState(ApartmentState.STA);
+ thread.Start();
+ thread.Join();
+ return result;
+ }
+
+ private static string GetLocation(IWebBrowser2 window)
+ {
+ var path = window.LocationURL.ToString();
+ if (!string.IsNullOrWhiteSpace(path)) return NormalizeLocation(path);
+
+ // Recycle Bin, This PC, etc
+ if (window.Document is not IShellFolderViewDual folderView) return null;
+
+ // Attempt to get the path from the folder view
+ try
+ {
+ // CSWin32 Folder does not have Self, so we need to use dynamic type here
+ // Use dynamic to bypass static typing
+ dynamic folder = folderView.Folder;
+
+ // Access the Self property via dynamic binding
+ dynamic folderItem = folder.Self;
+
+ // Get path from the folder item
+ path = folderItem.Path;
+ }
+ catch
+ {
+ return null;
+ }
+
+ return NormalizeLocation(path);
+ }
+
+ private static string NormalizeLocation(string location)
+ {
+ if (location.IndexOf('%') > -1)
+ location = Environment.ExpandEnvironmentVariables(location);
+
+ if (location.StartsWith("::", StringComparison.Ordinal))
+ location = $"shell:{location}";
+
+ else if (location.StartsWith("{", StringComparison.Ordinal))
+ location = $"shell:::{location}";
+
+ location = location.Trim(' ', '/', '\\', '\n', '\'', '"');
+
+ return location.Replace('/', '\\');
+ }
+
+ #endregion
+ }
+
+ #region COM Interfaces
+
+ // Inspired by: https://github.com/w4po/ExplorerTabUtility
+
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ [Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
+ [ComImport]
+ public interface IServiceProvider
+ {
+ [PreserveSig]
+ int QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out IShellBrowser ppvObject);
+ }
+
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ [Guid("000214E2-0000-0000-C000-000000000046")]
+ [ComImport]
+ public interface IShellBrowser
+ {
+ [PreserveSig]
+ int GetWindow(out nint handle);
+ }
+
+ #endregion
+}
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index be9e4e0f9..390de341d 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -1,4 +1,4 @@
-
+net9.0-windows
@@ -60,12 +60,14 @@
allruntime; build; native; contentfiles; analyzers; buildtransitive
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
+ all
diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt
index edc71feef..965ab6caa 100644
--- a/Flow.Launcher.Infrastructure/NativeMethods.txt
+++ b/Flow.Launcher.Infrastructure/NativeMethods.txt
@@ -66,3 +66,27 @@ LOCALE_TRANSIENT_KEYBOARD4
SHParseDisplayName
SHOpenFolderAndSelectItems
CoTaskMemFree
+
+SetWinEventHook
+UnhookWinEvent
+SendMessage
+EVENT_SYSTEM_FOREGROUND
+WINEVENT_OUTOFCONTEXT
+WM_SETTEXT
+IShellFolderViewDual2
+CoCreateInstance
+CLSCTX
+IShellWindows
+IWebBrowser2
+EVENT_OBJECT_DESTROY
+EVENT_OBJECT_LOCATIONCHANGE
+EVENT_SYSTEM_MOVESIZESTART
+EVENT_SYSTEM_MOVESIZEEND
+GetDlgItem
+PostMessage
+BM_CLICK
+WM_GETTEXT
+OpenProcess
+QueryFullProcessImageName
+EVENT_OBJECT_HIDE
+EVENT_SYSTEM_DIALOGEND
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 00ecb9bb4..23f9047fe 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -86,6 +86,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public string OpenHistoryHotkey { get; set; } = $"Ctrl+H";
public string CycleHistoryUpHotkey { get; set; } = $"{KeyConstant.Alt} + Up";
public string CycleHistoryDownHotkey { get; set; } = $"{KeyConstant.Alt} + Down";
+ public string DialogJumpHotkey { get; set; } = $"{KeyConstant.Alt} + G";
private string _language = Constant.SystemLanguageCode;
public string Language
@@ -323,6 +324,21 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
};
+ public bool EnableDialogJump { get; set; } = true;
+
+ public bool AutoDialogJump { get; set; } = false;
+
+ public bool ShowDialogJumpWindow { get; set; } = false;
+
+ [JsonConverter(typeof(JsonStringEnumConverter))]
+ public DialogJumpWindowPositions DialogJumpWindowPosition { get; set; } = DialogJumpWindowPositions.UnderDialog;
+
+ [JsonConverter(typeof(JsonStringEnumConverter))]
+ public DialogJumpResultBehaviours DialogJumpResultBehaviour { get; set; } = DialogJumpResultBehaviours.LeftClick;
+
+ [JsonConverter(typeof(JsonStringEnumConverter))]
+ public DialogJumpFileResultBehaviours DialogJumpFileResultBehaviour { get; set; } = DialogJumpFileResultBehaviours.FullPath;
+
[JsonConverter(typeof(JsonStringEnumConverter))]
public LOGLEVEL LogLevel { get; set; } = LOGLEVEL.INFO;
@@ -546,6 +562,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
list.Add(new(CycleHistoryUpHotkey, "CycleHistoryUpHotkey", () => CycleHistoryUpHotkey = ""));
if (!string.IsNullOrEmpty(CycleHistoryDownHotkey))
list.Add(new(CycleHistoryDownHotkey, "CycleHistoryDownHotkey", () => CycleHistoryDownHotkey = ""));
+ if (!string.IsNullOrEmpty(DialogJumpHotkey))
+ list.Add(new(DialogJumpHotkey, "dialogJumpHotkey", () => DialogJumpHotkey = ""));
// Custom Query Hotkeys
foreach (var customPluginHotkey in CustomPluginHotkeys)
@@ -659,4 +677,23 @@ namespace Flow.Launcher.Infrastructure.UserSettings
DaNiu,
XiaoLang
}
+
+ public enum DialogJumpWindowPositions
+ {
+ UnderDialog,
+ FollowDefault
+ }
+
+ public enum DialogJumpResultBehaviours
+ {
+ LeftClick,
+ RightClick
+ }
+
+ public enum DialogJumpFileResultBehaviours
+ {
+ FullPath,
+ FullPathOpen,
+ Directory
+ }
}
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 32ed31137..bb1996c3b 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -14,9 +14,11 @@ using System.Windows.Markup;
using System.Windows.Media;
using Flow.Launcher.Infrastructure.UserSettings;
using Microsoft.Win32;
+using Microsoft.Win32.SafeHandles;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.Graphics.Dwm;
+using Windows.Win32.System.Threading;
using Windows.Win32.UI.Input.KeyboardAndMouse;
using Windows.Win32.UI.Shell.Common;
using Windows.Win32.UI.WindowsAndMessaging;
@@ -138,6 +140,11 @@ namespace Flow.Launcher.Infrastructure
return IsForegroundWindow(GetWindowHandle(window));
}
+ public static bool IsForegroundWindow(nint handle)
+ {
+ return IsForegroundWindow(new HWND(handle));
+ }
+
internal static bool IsForegroundWindow(HWND handle)
{
return handle.Equals(PInvoke.GetForegroundWindow());
@@ -344,6 +351,16 @@ namespace Flow.Launcher.Infrastructure
return new(windowHelper.Handle);
}
+ internal static HWND GetMainWindowHandle()
+ {
+ // When application is exiting, the Application.Current will be null
+ if (Application.Current == null) return HWND.Null;
+
+ // Get the FL main window
+ var hwnd = GetWindowHandle(Application.Current.MainWindow, true);
+ return hwnd;
+ }
+
#endregion
#region STA Thread
@@ -761,6 +778,65 @@ namespace Flow.Launcher.Infrastructure
#endregion
+ #region Window Rect
+
+ public static unsafe bool GetWindowRect(nint handle, out Rect outRect)
+ {
+ var rect = new RECT();
+ var result = PInvoke.GetWindowRect(new(handle), &rect);
+ if (!result)
+ {
+ outRect = new Rect();
+ return false;
+ }
+
+ // Convert RECT to Rect
+ outRect = new Rect(
+ rect.left,
+ rect.top,
+ rect.right - rect.left,
+ rect.bottom - rect.top
+ );
+ return true;
+ }
+
+ #endregion
+
+ #region Window Process
+
+ internal static unsafe string GetProcessNameFromHwnd(HWND hWnd)
+ {
+ return Path.GetFileName(GetProcessPathFromHwnd(hWnd));
+ }
+
+ internal static unsafe string GetProcessPathFromHwnd(HWND hWnd)
+ {
+ uint pid;
+ var threadId = PInvoke.GetWindowThreadProcessId(hWnd, &pid);
+ if (threadId == 0) return string.Empty;
+
+ var process = PInvoke.OpenProcess(PROCESS_ACCESS_RIGHTS.PROCESS_QUERY_LIMITED_INFORMATION, false, pid);
+ if (process.Value != IntPtr.Zero)
+ {
+ using var safeHandle = new SafeProcessHandle(process.Value, true);
+ uint capacity = 2000;
+ Span buffer = new char[capacity];
+ fixed (char* pBuffer = buffer)
+ {
+ if (!PInvoke.QueryFullProcessImageName(safeHandle, PROCESS_NAME_FORMAT.PROCESS_NAME_WIN32, (PWSTR)pBuffer, ref capacity))
+ {
+ return string.Empty;
+ }
+
+ return buffer[..(int)capacity].ToString();
+ }
+ }
+
+ return string.Empty;
+ }
+
+ #endregion
+
#region Explorer
// https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shopenfolderandselectitems
diff --git a/Flow.Launcher.Plugin/DialogJumpResult.cs b/Flow.Launcher.Plugin/DialogJumpResult.cs
new file mode 100644
index 000000000..2c9f0c139
--- /dev/null
+++ b/Flow.Launcher.Plugin/DialogJumpResult.cs
@@ -0,0 +1,92 @@
+namespace Flow.Launcher.Plugin
+{
+ ///
+ /// Describes a result of a executed by a plugin in Dialog Jump window
+ ///
+ public class DialogJumpResult : Result
+ {
+ ///
+ /// This holds the path which can be provided by plugin to be navigated to the
+ /// file dialog when records in Dialog Jump window is right clicked on a result.
+ ///
+ public required string DialogJumpPath { get; init; }
+
+ ///
+ /// Clones the current Dialog Jump result
+ ///
+ public new DialogJumpResult Clone()
+ {
+ return new DialogJumpResult
+ {
+ Title = Title,
+ SubTitle = SubTitle,
+ ActionKeywordAssigned = ActionKeywordAssigned,
+ CopyText = CopyText,
+ AutoCompleteText = AutoCompleteText,
+ IcoPath = IcoPath,
+ BadgeIcoPath = BadgeIcoPath,
+ RoundedIcon = RoundedIcon,
+ Icon = Icon,
+ BadgeIcon = BadgeIcon,
+ Glyph = Glyph,
+ Action = Action,
+ AsyncAction = AsyncAction,
+ Score = Score,
+ TitleHighlightData = TitleHighlightData,
+ OriginQuery = OriginQuery,
+ PluginDirectory = PluginDirectory,
+ ContextData = ContextData,
+ PluginID = PluginID,
+ TitleToolTip = TitleToolTip,
+ SubTitleToolTip = SubTitleToolTip,
+ PreviewPanel = PreviewPanel,
+ ProgressBar = ProgressBar,
+ ProgressBarColor = ProgressBarColor,
+ Preview = Preview,
+ AddSelectedCount = AddSelectedCount,
+ RecordKey = RecordKey,
+ ShowBadge = ShowBadge,
+ DialogJumpPath = DialogJumpPath
+ };
+ }
+
+ ///
+ /// Convert to .
+ ///
+ public static DialogJumpResult From(Result result, string dialogJumpPath)
+ {
+ return new DialogJumpResult
+ {
+ Title = result.Title,
+ SubTitle = result.SubTitle,
+ ActionKeywordAssigned = result.ActionKeywordAssigned,
+ CopyText = result.CopyText,
+ AutoCompleteText = result.AutoCompleteText,
+ IcoPath = result.IcoPath,
+ BadgeIcoPath = result.BadgeIcoPath,
+ RoundedIcon = result.RoundedIcon,
+ Icon = result.Icon,
+ BadgeIcon = result.BadgeIcon,
+ Glyph = result.Glyph,
+ Action = result.Action,
+ AsyncAction = result.AsyncAction,
+ Score = result.Score,
+ TitleHighlightData = result.TitleHighlightData,
+ OriginQuery = result.OriginQuery,
+ PluginDirectory = result.PluginDirectory,
+ ContextData = result.ContextData,
+ PluginID = result.PluginID,
+ TitleToolTip = result.TitleToolTip,
+ SubTitleToolTip = result.SubTitleToolTip,
+ PreviewPanel = result.PreviewPanel,
+ ProgressBar = result.ProgressBar,
+ ProgressBarColor = result.ProgressBarColor,
+ Preview = result.Preview,
+ AddSelectedCount = result.AddSelectedCount,
+ RecordKey = result.RecordKey,
+ ShowBadge = result.ShowBadge,
+ DialogJumpPath = dialogJumpPath
+ };
+ }
+ }
+}
diff --git a/Flow.Launcher.Plugin/Interfaces/IAsyncDialogJump.cs b/Flow.Launcher.Plugin/Interfaces/IAsyncDialogJump.cs
new file mode 100644
index 000000000..e028ebb12
--- /dev/null
+++ b/Flow.Launcher.Plugin/Interfaces/IAsyncDialogJump.cs
@@ -0,0 +1,24 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using System.Threading;
+
+namespace Flow.Launcher.Plugin
+{
+ ///
+ /// Asynchronous Dialog Jump Model
+ ///
+ public interface IAsyncDialogJump : IFeatures
+ {
+ ///
+ /// Asynchronous querying for Dialog Jump window
+ ///
+ ///
+ /// If the Querying method requires high IO transmission
+ /// or performing CPU intense jobs (performing better with cancellation), please use this IAsyncDialogJump interface
+ ///
+ /// Query to search
+ /// Cancel when querying job is obsolete
+ ///
+ Task> QueryDialogJumpAsync(Query query, CancellationToken token);
+ }
+}
diff --git a/Flow.Launcher.Plugin/Interfaces/IDialogJump.cs b/Flow.Launcher.Plugin/Interfaces/IDialogJump.cs
new file mode 100644
index 000000000..d81b2bd19
--- /dev/null
+++ b/Flow.Launcher.Plugin/Interfaces/IDialogJump.cs
@@ -0,0 +1,29 @@
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Flow.Launcher.Plugin
+{
+ ///
+ /// Synchronous Dialog Jump Model
+ ///
+ /// If the Querying method requires high IO transmission
+ /// or performing CPU intense jobs (performing better with cancellation), please try the IAsyncDialogJump interface
+ ///
+ ///
+ public interface IDialogJump : IAsyncDialogJump
+ {
+ ///
+ /// Querying for Dialog Jump window
+ ///
+ /// This method will be called within a Task.Run,
+ /// so please avoid synchrously wait for long.
+ ///
+ ///
+ /// Query to search
+ ///
+ List QueryDialogJump(Query query);
+
+ Task> IAsyncDialogJump.QueryDialogJumpAsync(Query query, CancellationToken token) => Task.Run(() => QueryDialogJump(query), token);
+ }
+}
diff --git a/Flow.Launcher.Plugin/Interfaces/IDialogJumpDialog.cs b/Flow.Launcher.Plugin/Interfaces/IDialogJumpDialog.cs
new file mode 100644
index 000000000..33ad9ae73
--- /dev/null
+++ b/Flow.Launcher.Plugin/Interfaces/IDialogJumpDialog.cs
@@ -0,0 +1,96 @@
+using System;
+
+#nullable enable
+
+namespace Flow.Launcher.Plugin
+{
+ ///
+ /// Interface for handling file dialog instances in DialogJump.
+ ///
+ public interface IDialogJumpDialog : IFeatures, IDisposable
+ {
+ ///
+ /// Check if the foreground window is a file dialog instance.
+ ///
+ ///
+ /// The handle of the foreground window to check.
+ ///
+ ///
+ /// The window if the foreground window is a file dialog instance. Null if it is not.
+ ///
+ IDialogJumpDialogWindow? CheckDialogWindow(IntPtr hwnd);
+ }
+
+ ///
+ /// Interface for handling a specific file dialog window in DialogJump.
+ ///
+ public interface IDialogJumpDialogWindow : IDisposable
+ {
+ ///
+ /// The handle of the dialog window.
+ ///
+ IntPtr Handle { get; }
+
+ ///
+ /// Get the current tab of the dialog window.
+ ///
+ ///
+ IDialogJumpDialogWindowTab GetCurrentTab();
+ }
+
+ ///
+ /// Interface for handling a specific tab in a file dialog window in DialogJump.
+ ///
+ public interface IDialogJumpDialogWindowTab : IDisposable
+ {
+ ///
+ /// The handle of the dialog tab.
+ ///
+ IntPtr Handle { get; }
+
+ ///
+ /// Get the current folder path of the dialog tab.
+ ///
+ ///
+ string GetCurrentFolder();
+
+ ///
+ /// Get the current file of the dialog tab.
+ ///
+ ///
+ string GetCurrentFile();
+
+ ///
+ /// Jump to a folder in the dialog tab.
+ ///
+ ///
+ /// The path to the folder to jump to.
+ ///
+ ///
+ /// Whether folder jump is under automatical mode.
+ ///
+ ///
+ /// True if the jump was successful, false otherwise.
+ ///
+ bool JumpFolder(string path, bool auto);
+
+ ///
+ /// Jump to a file in the dialog tab.
+ ///
+ ///
+ /// The path to the file to jump to.
+ ///
+ ///
+ /// True if the jump was successful, false otherwise.
+ ///
+ bool JumpFile(string path);
+
+ ///
+ /// Open the file in the dialog tab.
+ ///
+ ///
+ /// True if the file was opened successfully, false otherwise.
+ ///
+ bool Open();
+ }
+}
diff --git a/Flow.Launcher.Plugin/Interfaces/IDialogJumpExplorer.cs b/Flow.Launcher.Plugin/Interfaces/IDialogJumpExplorer.cs
new file mode 100644
index 000000000..9a2b879d0
--- /dev/null
+++ b/Flow.Launcher.Plugin/Interfaces/IDialogJumpExplorer.cs
@@ -0,0 +1,40 @@
+using System;
+
+#nullable enable
+
+namespace Flow.Launcher.Plugin
+{
+ ///
+ /// Interface for handling file explorer instances in DialogJump.
+ ///
+ public interface IDialogJumpExplorer : IFeatures, IDisposable
+ {
+ ///
+ /// Check if the foreground window is a Windows Explorer instance.
+ ///
+ ///
+ /// The handle of the foreground window to check.
+ ///
+ ///
+ /// The window if the foreground window is a file explorer instance. Null if it is not.
+ ///
+ IDialogJumpExplorerWindow? CheckExplorerWindow(IntPtr hwnd);
+ }
+
+ ///
+ /// Interface for handling a specific file explorer window in DialogJump.
+ ///
+ public interface IDialogJumpExplorerWindow : IDisposable
+ {
+ ///
+ /// The handle of the explorer window.
+ ///
+ IntPtr Handle { get; }
+
+ ///
+ /// Get the current folder path of the explorer window.
+ ///
+ ///
+ string? GetExplorerPath();
+ }
+}
diff --git a/Flow.Launcher.Plugin/Interfaces/IPlugin.cs b/Flow.Launcher.Plugin/Interfaces/IPlugin.cs
index bac93d090..cf5a8a582 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPlugin.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPlugin.cs
@@ -32,6 +32,6 @@ namespace Flow.Launcher.Plugin
Task IAsyncPlugin.InitAsync(PluginInitContext context) => Task.Run(() => Init(context));
- Task> IAsyncPlugin.QueryAsync(Query query, CancellationToken token) => Task.Run(() => Query(query));
+ Task> IAsyncPlugin.QueryAsync(Query query, CancellationToken token) => Task.Run(() => Query(query), token);
}
}
diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs
index f0fcd48ff..a459e9ee6 100644
--- a/Flow.Launcher.Plugin/Result.cs
+++ b/Flow.Launcher.Plugin/Result.cs
@@ -307,7 +307,7 @@ namespace Flow.Launcher.Plugin
Preview = Preview,
AddSelectedCount = AddSelectedCount,
RecordKey = RecordKey,
- ShowBadge = ShowBadge,
+ ShowBadge = ShowBadge
};
}
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 93fd88e4f..4d522f75a 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -16,6 +16,7 @@ using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Http;
using Flow.Launcher.Infrastructure.Image;
using Flow.Launcher.Infrastructure.Logger;
+using Flow.Launcher.Infrastructure.DialogJump;
using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
@@ -233,6 +234,9 @@ namespace Flow.Launcher
// Initialize theme for main window
Ioc.Default.GetRequiredService().ChangeTheme();
+ DialogJump.InitializeDialogJump(PluginManager.GetDialogJumpExplorers(), PluginManager.GetDialogJumpDialogs());
+ DialogJump.SetupDialogJump(_settings.EnableDialogJump);
+
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
RegisterExitEvents();
@@ -412,6 +416,7 @@ namespace Flow.Launcher
// since some resources owned by the thread need to be disposed.
_mainWindow?.Dispatcher.Invoke(_mainWindow.Dispose);
_mainVM?.Dispose();
+ DialogJump.Dispose();
}
API.LogInfo(ClassName, "End Flow Launcher dispose ----------------------------------------------------");
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index f438859f2..67939af14 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -90,7 +90,6 @@
allruntime; build; native; contentfiles; analyzers; buildtransitive
-
@@ -103,7 +102,6 @@
- all
diff --git a/Flow.Launcher/Helper/HotKeyMapper.cs b/Flow.Launcher/Helper/HotKeyMapper.cs
index e5fabb3a8..86a68475e 100644
--- a/Flow.Launcher/Helper/HotKeyMapper.cs
+++ b/Flow.Launcher/Helper/HotKeyMapper.cs
@@ -1,11 +1,12 @@
-using Flow.Launcher.Infrastructure.Hotkey;
-using Flow.Launcher.Infrastructure.UserSettings;
-using System;
-using NHotkey;
-using NHotkey.Wpf;
-using Flow.Launcher.ViewModel;
+using System;
using ChefKeys;
using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.Infrastructure.Hotkey;
+using Flow.Launcher.Infrastructure.DialogJump;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.ViewModel;
+using NHotkey;
+using NHotkey.Wpf;
namespace Flow.Launcher.Helper;
@@ -22,6 +23,10 @@ internal static class HotKeyMapper
_settings = Ioc.Default.GetService();
SetHotkey(_settings.Hotkey, OnToggleHotkey);
+ if (_settings.EnableDialogJump)
+ {
+ SetHotkey(_settings.DialogJumpHotkey, DialogJump.OnToggleHotkey);
+ }
LoadCustomPluginHotkey();
}
diff --git a/Flow.Launcher/HotkeyControl.xaml.cs b/Flow.Launcher/HotkeyControl.xaml.cs
index e8961058c..89bfde349 100644
--- a/Flow.Launcher/HotkeyControl.xaml.cs
+++ b/Flow.Launcher/HotkeyControl.xaml.cs
@@ -1,4 +1,4 @@
-using System.Collections.ObjectModel;
+using System.Collections.ObjectModel;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
@@ -110,7 +110,8 @@ namespace Flow.Launcher
SelectPrevItemHotkey,
SelectPrevItemHotkey2,
SelectNextItemHotkey,
- SelectNextItemHotkey2
+ SelectNextItemHotkey2,
+ DialogJumpHotkey,
}
// We can initialize settings in static field because it has been constructed in App constuctor
@@ -142,6 +143,7 @@ namespace Flow.Launcher
HotkeyType.SelectPrevItemHotkey2 => _settings.SelectPrevItemHotkey2,
HotkeyType.SelectNextItemHotkey => _settings.SelectNextItemHotkey,
HotkeyType.SelectNextItemHotkey2 => _settings.SelectNextItemHotkey2,
+ HotkeyType.DialogJumpHotkey => _settings.DialogJumpHotkey,
_ => throw new System.NotImplementedException("Hotkey type not set")
};
}
@@ -201,6 +203,9 @@ namespace Flow.Launcher
case HotkeyType.SelectNextItemHotkey2:
_settings.SelectNextItemHotkey2 = value;
break;
+ case HotkeyType.DialogJumpHotkey:
+ _settings.DialogJumpHotkey = value;
+ break;
default:
throw new System.NotImplementedException("Hotkey type not set");
}
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index b105f2658..f37568419 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -385,6 +385,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxHTTP Proxy
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 0c8fb4d02..2ddce8190 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.ComponentModel;
using System.Linq;
using System.Media;
@@ -19,6 +19,7 @@ using Flow.Launcher.Core.Resource;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Infrastructure.Image;
+using Flow.Launcher.Infrastructure.DialogJump;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
@@ -119,7 +120,7 @@ namespace Flow.Launcher
Win32Helper.DisableControlBox(this);
}
- private void OnLoaded(object sender, RoutedEventArgs _)
+ private void OnLoaded(object sender, RoutedEventArgs e)
{
// Check first launch
if (_settings.FirstLaunch)
@@ -168,10 +169,12 @@ namespace Flow.Launcher
if (_settings.HideOnStartup)
{
_viewModel.Hide();
+ _viewModel.InitializeVisibilityStatus(false);
}
else
{
_viewModel.Show();
+ _viewModel.InitializeVisibilityStatus(true);
// When HideOnStartup is off and UseAnimation is on,
// there was a bug where the clock would not appear at all on the initial launch
// So we need to forcibly trigger animation here to ensure the clock is visible
@@ -214,6 +217,9 @@ namespace Flow.Launcher
// Without this part, when shown for the first time, switching the context menu does not move the cursor to the end.
_viewModel.QueryTextCursorMovedToEnd = false;
+ // Register Dialog Jump events
+ InitializeDialogJump();
+
// View model property changed event
_viewModel.PropertyChanged += (o, e) =>
{
@@ -226,7 +232,7 @@ namespace Flow.Launcher
if (_viewModel.MainWindowVisibilityStatus)
{
// Play sound effect before activing the window
- if (_settings.UseSound)
+ if (_settings.UseSound && !_viewModel.IsDialogJumpWindowUnderDialog())
{
SoundPlay();
}
@@ -249,7 +255,7 @@ namespace Flow.Launcher
QueryTextBox.Focus();
// Play window animation
- if (_settings.UseAnimation)
+ if (_settings.UseAnimation && !_viewModel.IsDialogJumpWindowUnderDialog())
{
WindowAnimation();
}
@@ -379,6 +385,11 @@ namespace Flow.Launcher
private void OnLocationChanged(object sender, EventArgs e)
{
+ if (_viewModel.IsDialogJumpWindowUnderDialog())
+ {
+ return;
+ }
+
if (IsLoaded)
{
_settings.WindowLeft = Left;
@@ -388,6 +399,11 @@ namespace Flow.Launcher
private async void OnDeactivated(object sender, EventArgs e)
{
+ if (_viewModel.IsDialogJumpWindowUnderDialog())
+ {
+ return;
+ }
+
_settings.WindowLeft = Left;
_settings.WindowTop = Top;
@@ -577,11 +593,23 @@ namespace Flow.Launcher
switch (msg)
{
case Win32Helper.WM_ENTERSIZEMOVE:
+ // Do do handle size move event for dialog jump window
+ if (_viewModel.IsDialogJumpWindowUnderDialog())
+ {
+ return IntPtr.Zero;
+ }
+
_initialWidth = (int)Width;
_initialHeight = (int)Height;
handled = true;
break;
case Win32Helper.WM_EXITSIZEMOVE:
+ // Do do handle size move event for Dialog Jump window
+ if (_viewModel.IsDialogJumpWindowUnderDialog())
+ {
+ return IntPtr.Zero;
+ }
+
//Prevent updating the number of results when the window height is below the height of a single result item.
//This situation occurs not only when the user manually resizes the window, but also when the window is released from a side snap, as the OS automatically adjusts the window height.
//(Without this check, releasing from a snap can cause the window height to hit the minimum, resulting in only 2 results being shown.)
@@ -792,11 +820,19 @@ namespace Flow.Launcher
#region Window Position
- private void UpdatePosition()
+ public void UpdatePosition()
{
// Initialize call twice to work around multi-display alignment issue- https://github.com/Flow-Launcher/Flow.Launcher/issues/2910
- InitializePosition();
- InitializePosition();
+ if (_viewModel.IsDialogJumpWindowUnderDialog())
+ {
+ InitializeDialogJumpPosition();
+ InitializeDialogJumpPosition();
+ }
+ else
+ {
+ InitializePosition();
+ InitializePosition();
+ }
}
private async Task PositionResetAsync()
@@ -1354,6 +1390,46 @@ namespace Flow.Launcher
#endregion
+ #region Dialog Jump
+
+ private void InitializeDialogJump()
+ {
+ DialogJump.ShowDialogJumpWindowAsync = _viewModel.SetupDialogJumpAsync;
+ DialogJump.UpdateDialogJumpWindow = InitializeDialogJumpPosition;
+ DialogJump.ResetDialogJumpWindow = _viewModel.ResetDialogJump;
+ DialogJump.HideDialogJumpWindow = _viewModel.HideDialogJump;
+ }
+
+ private void InitializeDialogJumpPosition()
+ {
+ if (_viewModel.DialogWindowHandle == nint.Zero || !_viewModel.MainWindowVisibilityStatus) return;
+ if (!_viewModel.IsDialogJumpWindowUnderDialog()) return;
+
+ // Get dialog window rect
+ var result = Win32Helper.GetWindowRect(_viewModel.DialogWindowHandle, out var window);
+ if (!result) return;
+
+ // Move window below the bottom of the dialog and keep it center
+ Top = VerticalBottom(window);
+ Left = HorizonCenter(window);
+ }
+
+ private double HorizonCenter(Rect window)
+ {
+ var dip1 = Win32Helper.TransformPixelsToDIP(this, window.X, 0);
+ var dip2 = Win32Helper.TransformPixelsToDIP(this, window.Width, 0);
+ var left = (dip2.X - ActualWidth) / 2 + dip1.X;
+ return left;
+ }
+
+ private double VerticalBottom(Rect window)
+ {
+ var dip1 = Win32Helper.TransformPixelsToDIP(this, 0, window.Bottom);
+ return dip1.Y;
+ }
+
+ #endregion
+
#region IDisposable
protected virtual void Dispose(bool disposing)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
index 7cd429058..21444ccee 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
@@ -8,6 +8,7 @@ using Flow.Launcher.Core.Configuration;
using Flow.Launcher.Core.Resource;
using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Infrastructure.DialogJump;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedModels;
@@ -146,6 +147,40 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
public List LastQueryModes { get; } =
DropdownDataGeneric.GetValues("LastQuery");
+ public bool EnableDialogJump
+ {
+ get => Settings.EnableDialogJump;
+ set
+ {
+ if (Settings.EnableDialogJump != value)
+ {
+ Settings.EnableDialogJump = value;
+ DialogJump.SetupDialogJump(value);
+ if (Settings.EnableDialogJump)
+ {
+ HotKeyMapper.SetHotkey(new(Settings.DialogJumpHotkey), DialogJump.OnToggleHotkey);
+ }
+ else
+ {
+ HotKeyMapper.RemoveHotkey(Settings.DialogJumpHotkey);
+ }
+ }
+ }
+ }
+
+ public class DialogJumpWindowPositionData : DropdownDataGeneric { }
+ public class DialogJumpResultBehaviourData : DropdownDataGeneric { }
+ public class DialogJumpFileResultBehaviourData : DropdownDataGeneric { }
+
+ public List DialogJumpWindowPositions { get; } =
+ DropdownDataGeneric.GetValues("DialogJumpWindowPosition");
+
+ public List DialogJumpResultBehaviours { get; } =
+ DropdownDataGeneric.GetValues("DialogJumpResultBehaviour");
+
+ public List DialogJumpFileResultBehaviours { get; } =
+ DropdownDataGeneric.GetValues("DialogJumpFileResultBehaviour");
+
public int SearchDelayTimeValue
{
get => Settings.SearchDelayTime;
@@ -179,6 +214,9 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
DropdownDataGeneric.UpdateLabels(SearchPrecisionScores);
DropdownDataGeneric.UpdateLabels(LastQueryModes);
DropdownDataGeneric.UpdateLabels(DoublePinyinSchemas);
+ DropdownDataGeneric.UpdateLabels(DialogJumpWindowPositions);
+ DropdownDataGeneric.UpdateLabels(DialogJumpResultBehaviours);
+ DropdownDataGeneric.UpdateLabels(DialogJumpFileResultBehaviours);
// Since we are using Binding instead of DynamicResource, we need to manually trigger the update
OnPropertyChanged(nameof(AlwaysPreviewToolTip));
}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs
index fdc9ef530..9e6a31dc7 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs
@@ -4,6 +4,7 @@ using CommunityToolkit.Mvvm.Input;
using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Hotkey;
+using Flow.Launcher.Infrastructure.DialogJump;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
@@ -34,6 +35,15 @@ public partial class SettingsPaneHotkeyViewModel : BaseModel
HotKeyMapper.SetHotkey(hotkey, HotKeyMapper.OnToggleHotkey);
}
+ [RelayCommand]
+ private void SetDialogJumpHotkey(HotkeyModel hotkey)
+ {
+ if (Settings.EnableDialogJump)
+ {
+ HotKeyMapper.SetHotkey(hotkey, DialogJump.OnToggleHotkey);
+ }
+ }
+
[RelayCommand]
private void CustomHotkeyDelete()
{
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
index f539510b0..81e15df69 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
@@ -1,4 +1,4 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
_emptyResult = new List();
+ private readonly IReadOnlyList _emptyDialogJumpResult = new List();
private readonly PluginMetadata _historyMetadata = new()
{
@@ -215,7 +217,8 @@ namespace Flow.Launcher.ViewModel
var resultUpdateChannel = Channel.CreateUnbounded();
_resultsUpdateChannelWriter = resultUpdateChannel.Writer;
_resultsViewUpdateTask =
- Task.Run(UpdateActionAsync).ContinueWith(continueAction, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
+ Task.Run(UpdateActionAsync).ContinueWith(continueAction,
+ CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.Default);
async Task UpdateActionAsync()
{
@@ -285,8 +288,16 @@ namespace Flow.Launcher.ViewModel
var token = e.Token == default ? _updateToken : e.Token;
- // make a clone to avoid possible issue that plugin will also change the list and items when updating view model
- var resultsCopy = DeepCloneResults(e.Results, token);
+ IReadOnlyList resultsCopy;
+ if (e.Results == null)
+ {
+ resultsCopy = _emptyResult;
+ }
+ else
+ {
+ // make a clone to avoid possible issue that plugin will also change the list and items when updating view model
+ resultsCopy = DeepCloneResults(e.Results, false, token);
+ }
foreach (var result in resultsCopy)
{
@@ -394,12 +405,30 @@ namespace Flow.Launcher.ViewModel
[RelayCommand]
private void LoadContextMenu()
{
+ // For Dialog Jump and right click mode, we need to navigate to the path
+ if (_isDialogJump && Settings.DialogJumpResultBehaviour == DialogJumpResultBehaviours.RightClick)
+ {
+ if (SelectedResults.SelectedItem != null && DialogWindowHandle != nint.Zero)
+ {
+ var result = SelectedResults.SelectedItem.Result;
+ if (result is DialogJumpResult dialogJumpResult)
+ {
+ Win32Helper.SetForegroundWindow(DialogWindowHandle);
+ _ = Task.Run(() => DialogJump.JumpToPathAsync(DialogWindowHandle, dialogJumpResult.DialogJumpPath));
+ }
+ }
+ return;
+ }
+
+ // For query mode, we load context menu
if (QueryResultsSelected())
{
// When switch to ContextMenu from QueryResults, but no item being chosen, should do nothing
// i.e. Shift+Enter/Ctrl+O right after Alt + Space should do nothing
if (SelectedResults.SelectedItem != null)
+ {
SelectedResults = ContextMenu;
+ }
}
else
{
@@ -469,12 +498,34 @@ namespace Flow.Launcher.ViewModel
return;
}
- var hideWindow = await result.ExecuteAsync(new ActionContext
+ // For Dialog Jump and left click mode, we need to navigate to the path
+ if (_isDialogJump && Settings.DialogJumpResultBehaviour == DialogJumpResultBehaviours.LeftClick)
{
- // not null means pressing modifier key + number, should ignore the modifier key
- SpecialKeyState = index is not null ? SpecialKeyState.Default : GlobalHotkey.CheckModifiers()
- })
- .ConfigureAwait(false);
+ Hide();
+
+ if (SelectedResults.SelectedItem != null && DialogWindowHandle != nint.Zero)
+ {
+ if (result is DialogJumpResult dialogJumpResult)
+ {
+ Win32Helper.SetForegroundWindow(DialogWindowHandle);
+ _ = Task.Run(() => DialogJump.JumpToPathAsync(DialogWindowHandle, dialogJumpResult.DialogJumpPath));
+ }
+ }
+ }
+ // For query mode, we execute the result
+ else
+ {
+ var hideWindow = await result.ExecuteAsync(new ActionContext
+ {
+ // not null means pressing modifier key + number, should ignore the modifier key
+ SpecialKeyState = index is not null ? SpecialKeyState.Default : GlobalHotkey.CheckModifiers()
+ }).ConfigureAwait(false);
+
+ if (hideWindow)
+ {
+ Hide();
+ }
+ }
if (QueryResultsSelected())
{
@@ -482,26 +533,33 @@ namespace Flow.Launcher.ViewModel
_history.Add(result.OriginQuery.RawQuery);
lastHistoryIndex = 1;
}
-
- if (hideWindow)
- {
- Hide();
- }
}
- private static IReadOnlyList DeepCloneResults(IReadOnlyList results, CancellationToken token = default)
+ private static IReadOnlyList DeepCloneResults(IReadOnlyList results, bool isDialogJump, CancellationToken token = default)
{
var resultsCopy = new List();
- foreach (var result in results.ToList())
- {
- if (token.IsCancellationRequested)
- {
- break;
- }
- var resultCopy = result.Clone();
- resultsCopy.Add(resultCopy);
+ if (isDialogJump)
+ {
+ foreach (var result in results.ToList())
+ {
+ if (token.IsCancellationRequested) break;
+
+ var resultCopy = ((DialogJumpResult)result).Clone();
+ resultsCopy.Add(resultCopy);
+ }
}
+ else
+ {
+ foreach (var result in results.ToList())
+ {
+ if (token.IsCancellationRequested) break;
+
+ var resultCopy = result.Clone();
+ resultsCopy.Add(resultCopy);
+ }
+ }
+
return resultsCopy;
}
@@ -1279,25 +1337,21 @@ namespace Flow.Launcher.ViewModel
if (query == null) // shortcut expanded
{
- App.API.LogDebug(ClassName, $"Clear query results");
-
- // Hide and clear results again because running query may show and add some results
- Results.Visibility = Visibility.Collapsed;
- Results.Clear();
-
- // Reset plugin icon
- PluginIconPath = null;
- PluginIconSource = null;
- SearchIconVisibility = Visibility.Visible;
-
- // Hide progress bar again because running query may set this to visible
- ProgressBarVisibility = Visibility.Hidden;
+ ClearResults();
return;
}
App.API.LogDebug(ClassName, $"Start query with ActionKeyword <{query.ActionKeyword}> and RawQuery <{query.RawQuery}>");
var currentIsHomeQuery = query.IsHomeQuery;
+ var currentIsDialogJump = _isDialogJump;
+
+ // Do not show home page for Dialog Jump window
+ if (currentIsHomeQuery && currentIsDialogJump)
+ {
+ ClearResults();
+ return;
+ }
_updateSource?.Dispose();
@@ -1331,7 +1385,7 @@ namespace Flow.Launcher.ViewModel
}
else
{
- plugins = PluginManager.ValidPluginsForQuery(query);
+ plugins = PluginManager.ValidPluginsForQuery(query, currentIsDialogJump);
if (plugins.Count == 1)
{
@@ -1425,6 +1479,23 @@ namespace Flow.Launcher.ViewModel
}
// Local function
+ void ClearResults()
+ {
+ App.API.LogDebug(ClassName, $"Clear query results");
+
+ // Hide and clear results again because running query may show and add some results
+ Results.Visibility = Visibility.Collapsed;
+ Results.Clear();
+
+ // Reset plugin icon
+ PluginIconPath = null;
+ PluginIconSource = null;
+ SearchIconVisibility = Visibility.Visible;
+
+ // Hide progress bar again because running query may set this to visible
+ ProgressBarVisibility = Visibility.Hidden;
+ }
+
async Task QueryTaskAsync(PluginPair plugin, CancellationToken token)
{
App.API.LogDebug(ClassName, $"Wait for querying plugin <{plugin.Metadata.Name}>");
@@ -1442,21 +1513,23 @@ namespace Flow.Launcher.ViewModel
// Task.Yield will force it to run in ThreadPool
await Task.Yield();
- var results = currentIsHomeQuery ?
- await PluginManager.QueryHomeForPluginAsync(plugin, query, token) :
- await PluginManager.QueryForPluginAsync(plugin, query, token);
+ IReadOnlyList results = currentIsDialogJump ?
+ await PluginManager.QueryDialogJumpForPluginAsync(plugin, query, token) :
+ currentIsHomeQuery ?
+ await PluginManager.QueryHomeForPluginAsync(plugin, query, token) :
+ await PluginManager.QueryForPluginAsync(plugin, query, token);
if (token.IsCancellationRequested) return;
IReadOnlyList resultsCopy;
if (results == null)
{
- resultsCopy = _emptyResult;
+ resultsCopy = currentIsDialogJump ? _emptyDialogJumpResult : _emptyResult;
}
else
{
// make a copy of results to avoid possible issue that FL changes some properties of the records, like score, etc.
- resultsCopy = DeepCloneResults(results, token);
+ resultsCopy = DeepCloneResults(results, currentIsDialogJump, token);
}
foreach (var result in resultsCopy)
@@ -1751,6 +1824,208 @@ namespace Flow.Launcher.ViewModel
#endregion
+ #region Dialog Jump
+
+ public nint DialogWindowHandle { get; private set; } = nint.Zero;
+
+ private bool _isDialogJump = false;
+
+ private bool _previousMainWindowVisibilityStatus;
+
+ private CancellationTokenSource _dialogJumpSource;
+
+ public void InitializeVisibilityStatus(bool visibilityStatus)
+ {
+ _previousMainWindowVisibilityStatus = visibilityStatus;
+ }
+
+ public bool IsDialogJumpWindowUnderDialog()
+ {
+ return _isDialogJump && DialogJump.DialogJumpWindowPosition == DialogJumpWindowPositions.UnderDialog;
+ }
+
+ public async Task SetupDialogJumpAsync(nint handle)
+ {
+ if (handle == nint.Zero) return;
+
+ // Only set flag & reset window once for one file dialog
+ var dialogWindowHandleChanged = false;
+ if (DialogWindowHandle != handle)
+ {
+ DialogWindowHandle = handle;
+ _previousMainWindowVisibilityStatus = MainWindowVisibilityStatus;
+ _isDialogJump = true;
+
+ dialogWindowHandleChanged = true;
+
+ // If don't give a time, Positioning will be weird
+ await Task.Delay(300);
+ }
+
+ // If handle is cleared, which means the dialog is closed, clear Dialog Jump state
+ if (DialogWindowHandle == nint.Zero)
+ {
+ _isDialogJump = false;
+ return;
+ }
+
+ // Initialize Dialog Jump window
+ if (MainWindowVisibilityStatus)
+ {
+ if (dialogWindowHandleChanged)
+ {
+ // Only update the position
+ Application.Current?.Dispatcher.Invoke(() =>
+ {
+ (Application.Current?.MainWindow as MainWindow)?.UpdatePosition();
+ });
+
+ _ = ResetWindowAsync();
+ }
+ }
+ else
+ {
+ if (DialogJump.DialogJumpWindowPosition == DialogJumpWindowPositions.UnderDialog)
+ {
+ // We wait for window to be reset before showing it because if window has results,
+ // showing it before resetting will cause flickering when results are clearing
+ if (dialogWindowHandleChanged)
+ {
+ await ResetWindowAsync();
+ }
+
+ Show();
+ }
+ else
+ {
+ if (dialogWindowHandleChanged)
+ {
+ _ = ResetWindowAsync();
+ }
+ }
+ }
+
+ if (DialogJump.DialogJumpWindowPosition == DialogJumpWindowPositions.UnderDialog)
+ {
+ // Cancel the previous Dialog Jump task
+ _dialogJumpSource?.Cancel();
+
+ // Create a new cancellation token source
+ _dialogJumpSource = new CancellationTokenSource();
+
+ _ = Task.Run(() =>
+ {
+ try
+ {
+ // Check task cancellation
+ if (_dialogJumpSource.Token.IsCancellationRequested) return;
+
+ // Check dialog handle
+ if (DialogWindowHandle == nint.Zero) return;
+
+ // Wait 150ms to check if Dialog Jump window gets the focus
+ var timeOut = !SpinWait.SpinUntil(() => !Win32Helper.IsForegroundWindow(DialogWindowHandle), 150);
+ if (timeOut) return;
+
+ // Bring focus back to the dialog
+ Win32Helper.SetForegroundWindow(DialogWindowHandle);
+ }
+ catch (Exception e)
+ {
+ App.API.LogException(ClassName, "Failed to focus on dialog window", e);
+ }
+ });
+ }
+ }
+
+#pragma warning disable VSTHRD100 // Avoid async void methods
+
+ public async void ResetDialogJump()
+ {
+ // Cache original dialog window handle
+ var dialogWindowHandle = DialogWindowHandle;
+
+ // Reset the Dialog Jump state
+ DialogWindowHandle = nint.Zero;
+ _isDialogJump = false;
+
+ // If dialog window handle is not set, we should not reset the main window visibility
+ if (dialogWindowHandle == nint.Zero) return;
+
+ if (_previousMainWindowVisibilityStatus != MainWindowVisibilityStatus)
+ {
+ // We wait for window to be reset before showing it because if window has results,
+ // showing it before resetting will cause flickering when results are clearing
+ await ResetWindowAsync();
+
+ // Show or hide to change visibility
+ if (_previousMainWindowVisibilityStatus)
+ {
+ Show();
+ }
+ else
+ {
+ Hide(false);
+ }
+ }
+ else
+ {
+ if (_previousMainWindowVisibilityStatus)
+ {
+ // Only update the position
+ Application.Current?.Dispatcher.Invoke(() =>
+ {
+ (Application.Current?.MainWindow as MainWindow)?.UpdatePosition();
+ });
+
+ _ = ResetWindowAsync();
+ }
+ else
+ {
+ _ = ResetWindowAsync();
+ }
+ }
+ }
+
+#pragma warning restore VSTHRD100 // Avoid async void methods
+
+ public void HideDialogJump()
+ {
+ if (DialogWindowHandle != nint.Zero)
+ {
+ if (DialogJump.DialogJumpWindowPosition == DialogJumpWindowPositions.UnderDialog)
+ {
+ // Warning: Main window is already in foreground
+ // This is because if you click popup menus in other applications to hide Dialog Jump window,
+ // they can steal focus before showing main window
+ if (MainWindowVisibilityStatus)
+ {
+ Hide();
+ }
+ }
+ }
+ }
+
+ // Reset index & preview & selected results & query text
+ private async Task ResetWindowAsync()
+ {
+ lastHistoryIndex = 1;
+
+ if (ExternalPreviewVisible)
+ {
+ await CloseExternalPreviewAsync();
+ }
+
+ if (!QueryResultsSelected())
+ {
+ SelectedResults = Results;
+ }
+
+ await ChangeQueryTextAsync(string.Empty, true);
+ }
+
+ #endregion
+
#region Public Methods
#pragma warning disable VSTHRD100 // Avoid async void methods
@@ -1770,7 +2045,7 @@ namespace Flow.Launcher.ViewModel
Win32Helper.DWMSetCloakForWindow(mainWindow, false);
// Set clock and search icon opacity
- var opacity = Settings.UseAnimation ? 0.0 : 1.0;
+ var opacity = (Settings.UseAnimation && !_isDialogJump) ? 0.0 : 1.0;
ClockPanelOpacity = opacity;
SearchIconOpacity = opacity;
@@ -1799,37 +2074,40 @@ namespace Flow.Launcher.ViewModel
}
}
- public async void Hide()
+ public async void Hide(bool reset = true)
{
- lastHistoryIndex = 1;
-
- if (ExternalPreviewVisible)
+ if (reset)
{
- await CloseExternalPreviewAsync();
- }
+ lastHistoryIndex = 1;
- BackToQueryResults();
+ if (ExternalPreviewVisible)
+ {
+ await CloseExternalPreviewAsync();
+ }
- switch (Settings.LastQueryMode)
- {
- case LastQueryMode.Empty:
- await ChangeQueryTextAsync(string.Empty);
- break;
- case LastQueryMode.Preserved:
- case LastQueryMode.Selected:
- LastQuerySelected = Settings.LastQueryMode == LastQueryMode.Preserved;
- break;
- case LastQueryMode.ActionKeywordPreserved:
- case LastQueryMode.ActionKeywordSelected:
- var newQuery = _lastQuery?.ActionKeyword;
+ BackToQueryResults();
- if (!string.IsNullOrEmpty(newQuery))
- newQuery += " ";
- await ChangeQueryTextAsync(newQuery);
+ switch (Settings.LastQueryMode)
+ {
+ case LastQueryMode.Empty:
+ await ChangeQueryTextAsync(string.Empty);
+ break;
+ case LastQueryMode.Preserved:
+ case LastQueryMode.Selected:
+ LastQuerySelected = Settings.LastQueryMode == LastQueryMode.Preserved;
+ break;
+ case LastQueryMode.ActionKeywordPreserved:
+ case LastQueryMode.ActionKeywordSelected:
+ var newQuery = _lastQuery.ActionKeyword;
- if (Settings.LastQueryMode == LastQueryMode.ActionKeywordSelected)
- LastQuerySelected = false;
- break;
+ if (!string.IsNullOrEmpty(newQuery))
+ newQuery += " ";
+ await ChangeQueryTextAsync(newQuery);
+
+ if (Settings.LastQueryMode == LastQueryMode.ActionKeywordSelected)
+ LastQuerySelected = false;
+ break;
+ }
}
// When application is exiting, the Application.Current will be null
@@ -1839,7 +2117,7 @@ namespace Flow.Launcher.ViewModel
if (Application.Current?.MainWindow is MainWindow mainWindow)
{
// Set clock and search icon opacity
- var opacity = Settings.UseAnimation ? 0.0 : 1.0;
+ var opacity = (Settings.UseAnimation && !_isDialogJump) ? 0.0 : 1.0;
ClockPanelOpacity = opacity;
SearchIconOpacity = opacity;
@@ -1984,6 +2262,7 @@ namespace Flow.Launcher.ViewModel
if (disposing)
{
_updateSource?.Dispose();
+ _dialogJumpSource?.Dispose();
_resultsUpdateChannelWriter?.Complete();
if (_resultsViewUpdateTask?.IsCompleted == true)
{
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
index f1aea98b4..fbaefa9d6 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
@@ -1,4 +1,4 @@
-using Flow.Launcher.Plugin.Explorer.Helper;
+using Flow.Launcher.Plugin.Explorer.Helper;
using Flow.Launcher.Plugin.Explorer.Search;
using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.ViewModels;
@@ -10,10 +10,11 @@ using System.Threading;
using System.Threading.Tasks;
using System.Windows.Controls;
using Flow.Launcher.Plugin.Explorer.Exceptions;
+using System.Linq;
namespace Flow.Launcher.Plugin.Explorer
{
- public class Main : ISettingProvider, IAsyncPlugin, IContextMenu, IPluginI18n
+ public class Main : ISettingProvider, IAsyncPlugin, IContextMenu, IPluginI18n, IAsyncDialogJump
{
internal static PluginInitContext Context { get; set; }
@@ -25,6 +26,8 @@ namespace Flow.Launcher.Plugin.Explorer
private SearchManager searchManager;
+ private static readonly List _emptyDialogJumpResultList = new();
+
public Control CreateSettingPanel()
{
return new ExplorerSettings(viewModel);
@@ -108,5 +111,18 @@ namespace Flow.Launcher.Plugin.Explorer
}
}
}
+
+ public async Task> QueryDialogJumpAsync(Query query, CancellationToken token)
+ {
+ try
+ {
+ var results = await searchManager.SearchAsync(query, token);
+ return results.Select(r => DialogJumpResult.From(r, r.CopyText)).ToList();
+ }
+ catch (Exception e) when (e is SearchException or EngineNotAvailableException)
+ {
+ return _emptyDialogJumpResultList;
+ }
+ }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
index 7791a9881..cbf6f1f8b 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
@@ -283,15 +283,16 @@ namespace Flow.Launcher.Plugin.Explorer.Search
internal static Result CreateFileResult(string filePath, Query query, int score = 0, bool windowsIndexed = false)
{
- bool isMedia = IsMedia(Path.GetExtension(filePath));
- var title = Path.GetFileName(filePath);
+ var isMedia = IsMedia(Path.GetExtension(filePath));
+ var title = Path.GetFileName(filePath) ?? string.Empty;
+ var directory = Path.GetDirectoryName(filePath) ?? string.Empty;
/* Preview Detail */
var result = new Result
{
Title = title,
- SubTitle = Path.GetDirectoryName(filePath),
+ SubTitle = directory,
IcoPath = filePath,
Preview = new Result.PreviewInfo
{
@@ -315,7 +316,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search
{
if (c.SpecialKeyState.ToModifierKeys() == (ModifierKeys.Control | ModifierKeys.Shift))
{
- OpenFile(filePath, Settings.UseLocationAsWorkingDir ? Path.GetDirectoryName(filePath) : string.Empty, true);
+ OpenFile(filePath, Settings.UseLocationAsWorkingDir ? directory : string.Empty, true);
}
else if (c.SpecialKeyState.ToModifierKeys() == ModifierKeys.Control)
{
@@ -323,7 +324,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search
}
else
{
- OpenFile(filePath, Settings.UseLocationAsWorkingDir ? Path.GetDirectoryName(filePath) : string.Empty);
+ OpenFile(filePath, Settings.UseLocationAsWorkingDir ? directory : string.Empty);
}
}
catch (Exception ex)
From b7096ddc321f556f803a240853a468e3fd88759a Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 19:22:14 +0800
Subject: [PATCH 1606/1798] Fix uri exception in Report window
---
Flow.Launcher/ReportWindow.xaml.cs | 43 +++++++++++++++++++++---------
1 file changed, 31 insertions(+), 12 deletions(-)
diff --git a/Flow.Launcher/ReportWindow.xaml.cs b/Flow.Launcher/ReportWindow.xaml.cs
index 24801cf52..ae0767934 100644
--- a/Flow.Launcher/ReportWindow.xaml.cs
+++ b/Flow.Launcher/ReportWindow.xaml.cs
@@ -1,15 +1,15 @@
-using Flow.Launcher.Core.ExternalPlugins;
-using System;
+using System;
using System.Globalization;
using System.IO;
-using System.Text;
using System.Linq;
+using System.Text;
using System.Windows;
using System.Windows.Documents;
+using Flow.Launcher.Core.ExternalPlugins;
using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure;
-using Flow.Launcher.Plugin.SharedCommands;
using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin.SharedCommands;
namespace Flow.Launcher
{
@@ -44,7 +44,7 @@ namespace Flow.Launcher
var websiteUrl = exception switch
{
- FlowPluginException pluginException =>GetIssuesUrl(pluginException.Metadata.Website),
+ FlowPluginException pluginException => GetIssuesUrl(pluginException.Metadata.Website),
_ => Constant.IssuesUrl
};
@@ -73,17 +73,36 @@ namespace Flow.Launcher
Margin = new Thickness(0)
};
- var link = new Hyperlink
+ Hyperlink link = null;
+ try
{
- IsEnabled = true
- };
- link.Inlines.Add(url);
- link.NavigateUri = new Uri(url);
- link.Click += (s, e) => SearchWeb.OpenInBrowserTab(url);
+ var uri = new Uri(url);
+
+ link = new Hyperlink
+ {
+ IsEnabled = true
+ };
+ link.Inlines.Add(url);
+ link.NavigateUri = uri;
+ link.Click += (s, e) => SearchWeb.OpenInBrowserTab(url);
+ }
+ catch (Exception)
+ {
+ // Leave link as null if the URL is invalid
+ }
paragraph.Inlines.Add(textBeforeUrl);
paragraph.Inlines.Add(" ");
- paragraph.Inlines.Add(link);
+ if (link is null)
+ {
+ // Add the URL as plain text if it is invalid
+ paragraph.Inlines.Add(url);
+ }
+ else
+ {
+ // Add the hyperlink if it is valid
+ paragraph.Inlines.Add(link);
+ }
paragraph.Inlines.Add("\n");
return paragraph;
From 90eec91c4e201c0ded1c9c548a35d89426ab52a3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 19:56:54 +0800
Subject: [PATCH 1607/1798] Fix ModernWpfUI version & Restore nuget
---
Flow.Launcher.Core/packages.lock.json | 20 +++++++++++
.../packages.lock.json | 20 +++++++++++
Flow.Launcher/packages.lock.json | 36 +++++++++----------
3 files changed, 58 insertions(+), 18 deletions(-)
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index dfb099166..caec08ebf 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -83,6 +83,11 @@
"resolved": "1.0.0",
"contentHash": "nwbZAYd+DblXAIzlnwDSnl0CiCm8jWLfHSYnoN4wYhtIav6AegB3+T/vKzLbU2IZlPB8Bvl8U3NXpx3eaz+N5w=="
},
+ "InputSimulator": {
+ "type": "Transitive",
+ "resolved": "1.0.4",
+ "contentHash": "D0LvRCPQMX6/FJHBjng+RO+wRDuHTJrfo7IAc7rmkPvRqchdVGJWg3y70peOtDy3OLNK+HSOwVkH4GiuLnkKgA=="
+ },
"JetBrains.Annotations": {
"type": "Transitive",
"resolved": "2024.3.0",
@@ -179,6 +184,19 @@
"resolved": "13.0.3",
"contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
},
+ "NHotkey": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "IEghs0QqWsQYH0uUmvIl0Ye6RaebWRh38eB6ToOkDnQucTYRGFOgtig0gSxlwCszTilYFz3n1ZuY762x+kDR3A=="
+ },
+ "NHotkey.Wpf": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "BIUKlhTG5KtFf9OQzWvkmVmktt5/FFj6AOEgag8Uf0R2YdZt5ajUzs3sVskcJcT2TztWlEHKQr1jFj3KQ0D9Nw==",
+ "dependencies": {
+ "NHotkey": "3.0.0"
+ }
+ },
"NLog": {
"type": "Transitive",
"resolved": "6.0.1",
@@ -237,8 +255,10 @@
"BitFaster.Caching": "[2.5.4, )",
"CommunityToolkit.Mvvm": "[8.4.0, )",
"Flow.Launcher.Plugin": "[4.7.0, )",
+ "InputSimulator": "[1.0.4, )",
"MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.14.15, )",
+ "NHotkey.Wpf": "[3.0.0, )",
"NLog": "[6.0.1, )",
"NLog.OutputDebugString": "[6.0.1, )",
"SharpVectors.Wpf": "[1.8.4.2, )",
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index 0e830661c..87b4bb6da 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -29,6 +29,12 @@
"resolved": "6.9.2",
"contentHash": "YBHobPGogb0vYhGYIxn/ndWqTjNWZveDi5jdjrcshL2vjwU3gQGyDeI7vGgye+2rAM5fGRvlLgNWLW3DpviS/w=="
},
+ "InputSimulator": {
+ "type": "Direct",
+ "requested": "[1.0.4, )",
+ "resolved": "1.0.4",
+ "contentHash": "D0LvRCPQMX6/FJHBjng+RO+wRDuHTJrfo7IAc7rmkPvRqchdVGJWg3y70peOtDy3OLNK+HSOwVkH4GiuLnkKgA=="
+ },
"MemoryPack": {
"type": "Direct",
"requested": "[1.21.4, )",
@@ -61,6 +67,15 @@
"Microsoft.Windows.WDK.Win32Metadata": "0.12.8-experimental"
}
},
+ "NHotkey.Wpf": {
+ "type": "Direct",
+ "requested": "[3.0.0, )",
+ "resolved": "3.0.0",
+ "contentHash": "BIUKlhTG5KtFf9OQzWvkmVmktt5/FFj6AOEgag8Uf0R2YdZt5ajUzs3sVskcJcT2TztWlEHKQr1jFj3KQ0D9Nw==",
+ "dependencies": {
+ "NHotkey": "3.0.0"
+ }
+ },
"NLog": {
"type": "Direct",
"requested": "[6.0.1, )",
@@ -162,6 +177,11 @@
"Microsoft.Windows.SDK.Win32Metadata": "61.0.15-preview"
}
},
+ "NHotkey": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "IEghs0QqWsQYH0uUmvIl0Ye6RaebWRh38eB6ToOkDnQucTYRGFOgtig0gSxlwCszTilYFz3n1ZuY762x+kDR3A=="
+ },
"System.Reflection.Metadata": {
"type": "Transitive",
"resolved": "5.0.0",
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index 591ee2a3c..1047b1f3f 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -20,12 +20,6 @@
"resolved": "6.9.2",
"contentHash": "YBHobPGogb0vYhGYIxn/ndWqTjNWZveDi5jdjrcshL2vjwU3gQGyDeI7vGgye+2rAM5fGRvlLgNWLW3DpviS/w=="
},
- "InputSimulator": {
- "type": "Direct",
- "requested": "[1.0.4, )",
- "resolved": "1.0.4",
- "contentHash": "D0LvRCPQMX6/FJHBjng+RO+wRDuHTJrfo7IAc7rmkPvRqchdVGJWg3y70peOtDy3OLNK+HSOwVkH4GiuLnkKgA=="
- },
"MdXaml": {
"type": "Direct",
"requested": "[1.27.0, )",
@@ -128,18 +122,9 @@
},
"ModernWpfUI": {
"type": "Direct",
- "requested": "[0.9.5, )",
- "resolved": "0.9.5",
- "contentHash": "Y3XkH0wmzDUdbFglykkIIRVPVsmIqN+rKoLZFaMDh9yMG39AJ6VannEmRCzjVLn7f8pg4SqBWC0PGT49BqTACA=="
- },
- "NHotkey.Wpf": {
- "type": "Direct",
- "requested": "[3.0.0, )",
- "resolved": "3.0.0",
- "contentHash": "BIUKlhTG5KtFf9OQzWvkmVmktt5/FFj6AOEgag8Uf0R2YdZt5ajUzs3sVskcJcT2TztWlEHKQr1jFj3KQ0D9Nw==",
- "dependencies": {
- "NHotkey": "3.0.0"
- }
+ "requested": "[0.9.4, )",
+ "resolved": "0.9.4",
+ "contentHash": "HJ07Be9KOiGKGcMLz/AwY+84h3yGHRPuYpYXCE6h1yPtaFwGMWfanZ70jX7W5XWx8+Qk1vGox+WGKgxxsy6EHw=="
},
"PropertyChanged.Fody": {
"type": "Direct",
@@ -219,6 +204,11 @@
"resolved": "1.11.42",
"contentHash": "LDc1bEfF14EY2DZzak4xvzWvbpNXK3vi1u0KQbBpLUN4+cx/VrvXhgCAMSJhSU5vz0oMfW9JZIR20vj/PkDHPA=="
},
+ "InputSimulator": {
+ "type": "Transitive",
+ "resolved": "1.0.4",
+ "contentHash": "D0LvRCPQMX6/FJHBjng+RO+wRDuHTJrfo7IAc7rmkPvRqchdVGJWg3y70peOtDy3OLNK+HSOwVkH4GiuLnkKgA=="
+ },
"JetBrains.Annotations": {
"type": "Transitive",
"resolved": "2024.3.0",
@@ -590,6 +580,14 @@
"resolved": "3.0.0",
"contentHash": "IEghs0QqWsQYH0uUmvIl0Ye6RaebWRh38eB6ToOkDnQucTYRGFOgtig0gSxlwCszTilYFz3n1ZuY762x+kDR3A=="
},
+ "NHotkey.Wpf": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "BIUKlhTG5KtFf9OQzWvkmVmktt5/FFj6AOEgag8Uf0R2YdZt5ajUzs3sVskcJcT2TztWlEHKQr1jFj3KQ0D9Nw==",
+ "dependencies": {
+ "NHotkey": "3.0.0"
+ }
+ },
"NLog": {
"type": "Transitive",
"resolved": "6.0.1",
@@ -857,8 +855,10 @@
"BitFaster.Caching": "[2.5.4, )",
"CommunityToolkit.Mvvm": "[8.4.0, )",
"Flow.Launcher.Plugin": "[4.7.0, )",
+ "InputSimulator": "[1.0.4, )",
"MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.14.15, )",
+ "NHotkey.Wpf": "[3.0.0, )",
"NLog": "[6.0.1, )",
"NLog.OutputDebugString": "[6.0.1, )",
"SharpVectors.Wpf": "[1.8.4.2, )",
From 55589f872a72d7274934cf5b74f297b9f9dae170 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 19:58:49 +0800
Subject: [PATCH 1608/1798] Resolve conflicts
---
Flow.Launcher.Infrastructure/Win32Helper.cs | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 0e7554d42..5770bbf12 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -816,20 +816,17 @@ namespace Flow.Launcher.Infrastructure
if (threadId == 0) return string.Empty;
var process = PInvoke.OpenProcess(PROCESS_ACCESS_RIGHTS.PROCESS_QUERY_LIMITED_INFORMATION, false, pid);
- if (process.Value != IntPtr.Zero)
+ if (process != HWND.Null)
{
- using var safeHandle = new SafeProcessHandle(process.Value, true);
+ using var safeHandle = new SafeProcessHandle((nint)process.Value, true);
uint capacity = 2000;
Span buffer = new char[capacity];
- fixed (char* pBuffer = buffer)
+ if (!PInvoke.QueryFullProcessImageName(safeHandle, PROCESS_NAME_FORMAT.PROCESS_NAME_WIN32, buffer, ref capacity))
{
- if (!PInvoke.QueryFullProcessImageName(safeHandle, PROCESS_NAME_FORMAT.PROCESS_NAME_WIN32, (PWSTR)pBuffer, ref capacity))
- {
- return string.Empty;
- }
-
- return buffer[..(int)capacity].ToString();
+ return string.Empty;
}
+
+ return buffer[..(int)capacity].ToString();
}
return string.Empty;
From 8e898de968d8021625fbe0872020883a85cacd0a Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 21:01:22 +0800
Subject: [PATCH 1609/1798] Fix build issue
---
Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
index aec343777..55576166d 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
@@ -223,8 +223,8 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
}
catch (Exception e)
{
- _context.API.LogException(ClassName, "Failed to set url in clipboard", e);
- _context.API.ShowMsgError(_context.API.GetTranslation("flowlauncher_plugin_browserbookmark_copy_failed"));
+ Context.API.LogException(ClassName, "Failed to set url in clipboard", e);
+ Context.API.ShowMsgError(Context.API.GetTranslation("flowlauncher_plugin_browserbookmark_copy_failed"));
return false;
}
},
From 71c8fce4a0a003705fa2e8bd133ba824b898eb53 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 20 Jul 2025 21:01:48 +0800
Subject: [PATCH 1610/1798] Improve code quality
---
Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
index 55576166d..33d7725f1 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
@@ -224,7 +224,7 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
catch (Exception e)
{
Context.API.LogException(ClassName, "Failed to set url in clipboard", e);
- Context.API.ShowMsgError(Context.API.GetTranslation("flowlauncher_plugin_browserbookmark_copy_failed"));
+ Context.API.ShowMsgError(Localize.flowlauncher_plugin_browserbookmark_copy_failed());
return false;
}
},
From bea1078d207cb6ff5a0b645fde338eaf35c608db Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sun, 20 Jul 2025 23:20:55 +0800
Subject: [PATCH 1611/1798] Remove redundant function call
---
.../ViewModels/SettingsViewModel.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index b50496e6e..229fec868 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -600,7 +600,6 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
if (_allEverythingSortOptions.Count == 0)
{
_allEverythingSortOptions = EverythingSortOptionLocalized.GetValues();
- EverythingSortOptionLocalized.UpdateLabels(_allEverythingSortOptions);
}
return _allEverythingSortOptions;
}
From ad1d42b5dde8a19d51028ab819a9ed718d4f7f0c Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sun, 20 Jul 2025 23:23:36 +0800
Subject: [PATCH 1612/1798] Update labels on initialization to update on
language change
---
.../Views/ExplorerSettings.xaml.cs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
index 38928ff03..4b8fe26db 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
@@ -4,6 +4,7 @@ using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
+using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
using Flow.Launcher.Plugin.Explorer.ViewModels;
using DataFormats = System.Windows.DataFormats;
@@ -39,6 +40,8 @@ namespace Flow.Launcher.Plugin.Explorer.Views
ExcludedPathsExpander
};
+ // Update labels on initialization to update on language change
+ EverythingSortOptionLocalized.UpdateLabels(_viewModel.AllEverythingSortOptions);
}
private void AccessLinkDragDrop(string containerName, DragEventArgs e)
From 1e4ff43bfc62efd86067a4ed286510c9d4536f5f Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sun, 20 Jul 2025 23:33:38 +0800
Subject: [PATCH 1613/1798] Use length and count instead of Any()
---
.../Views/ExplorerSettings.xaml.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
index 4b8fe26db..de33b80d6 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
@@ -48,7 +48,7 @@ namespace Flow.Launcher.Plugin.Explorer.Views
{
var files = (string[])e.Data.GetData(DataFormats.FileDrop);
- if (files == null || !files.Any())
+ if (files == null || files.Length == 0)
{
return;
}
@@ -101,7 +101,7 @@ namespace Flow.Launcher.Plugin.Explorer.Views
if (sender is Expander expandedExpander)
{
// Ensure _expanders is not null and contains items
- if (_expanders == null || !_expanders.Any()) return;
+ if (_expanders == null || _expanders.Count == 0) return;
foreach (var expander in _expanders)
{
From df0f8e01b95568a8bad0653b9aa5b2f267040c78 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Mon, 21 Jul 2025 08:58:12 +0800
Subject: [PATCH 1614/1798] Fix typo
---
appveyor.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index 39e2a114c..a4a8e6f16 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -76,7 +76,7 @@ deploy:
This build includes new changes from commit:
$(APPVEYOR_REPO_COMMIT_MESSAGE)
- See all changes in this early access by going to the [milstones](https://github.com/Flow-Launcher/Flow.Launcher/milestones?sort=title&direction=asc) section and choosing the upcoming milestone.
+ See all changes in this early access by going to the [milestones](https://github.com/Flow-Launcher/Flow.Launcher/milestones?sort=title&direction=asc) section and choosing the upcoming milestone.
For latest production release visit [here](https://github.com/Flow-Launcher/Flow.Launcher/releases/latest)
Please report any bugs or issues over at the [main repository](https://github.com/Flow-Launcher/Flow.Launcher/issues)'
From b9e0669c4639b1bbd377ba7b5bc6a45bdac710e1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 21 Jul 2025 10:27:25 +0800
Subject: [PATCH 1615/1798] Intialize translations in InitAsync
---
.../ViewModels/SettingsViewModel.cs | 13 +------------
1 file changed, 1 insertion(+), 12 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index 229fec868..2d636d01a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -592,18 +592,7 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
#region Everything FastSortWarning
- private List _allEverythingSortOptions = new();
- public List AllEverythingSortOptions
- {
- get
- {
- if (_allEverythingSortOptions.Count == 0)
- {
- _allEverythingSortOptions = EverythingSortOptionLocalized.GetValues();
- }
- return _allEverythingSortOptions;
- }
- }
+ public List AllEverythingSortOptions = EverythingSortOptionLocalized.GetValues();
public EverythingSortOption SelectedEverythingSortOption
{
From af3aaa8ce79bbd6e1552aa67da2f8603d23e64e1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 21 Jul 2025 10:29:14 +0800
Subject: [PATCH 1616/1798] Update labels for setting view model when culture
info changes
---
Plugins/Flow.Launcher.Plugin.Explorer/Main.cs | 9 ++++++++-
.../Views/ExplorerSettings.xaml.cs | 4 ----
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
index 719e60af3..0850d4e10 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
@@ -1,4 +1,4 @@
-using Flow.Launcher.Plugin.Explorer.Helper;
+using Flow.Launcher.Plugin.Explorer.Helper;
using Flow.Launcher.Plugin.Explorer.Search;
using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.ViewModels;
@@ -11,6 +11,7 @@ using System.Threading.Tasks;
using System.Windows.Controls;
using Flow.Launcher.Plugin.Explorer.Exceptions;
using System.Linq;
+using System.Globalization;
namespace Flow.Launcher.Plugin.Explorer
{
@@ -97,6 +98,12 @@ namespace Flow.Launcher.Plugin.Explorer
return Context.API.GetTranslation("plugin_explorer_plugin_description");
}
+ public void OnCultureInfoChanged(CultureInfo newCulture)
+ {
+ // Update labels for setting view model
+ EverythingSortOptionLocalized.UpdateLabels(viewModel.AllEverythingSortOptions);
+ }
+
private static void FillQuickAccessLinkNames()
{
// Legacy version does not have names for quick access links, so we fill them with the path name.
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
index de33b80d6..7cdc7b6cf 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml.cs
@@ -4,7 +4,6 @@ using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
-using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
using Flow.Launcher.Plugin.Explorer.ViewModels;
using DataFormats = System.Windows.DataFormats;
@@ -39,9 +38,6 @@ namespace Flow.Launcher.Plugin.Explorer.Views
QuickAccessExpander,
ExcludedPathsExpander
};
-
- // Update labels on initialization to update on language change
- EverythingSortOptionLocalized.UpdateLabels(_viewModel.AllEverythingSortOptions);
}
private void AccessLinkDragDrop(string containerName, DragEventArgs e)
From d8740768c72885f6fa4726e4f716e381173f2f67 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Mon, 21 Jul 2025 21:33:57 +1000
Subject: [PATCH 1617/1798] wording
---
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index 0238bdc1d..dcccaebeb 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -615,7 +615,7 @@ namespace Flow.Launcher.Plugin
event ActualApplicationThemeChangedEventHandler ActualApplicationThemeChanged;
///
- /// Get the data directory of Flow Launcher.
+ /// Get the user data directory of Flow Launcher.
///
///
string GetDataDirectory();
From ea7833efe463213c7ee6ff633816bf2d1dfa9deb Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 22 Jul 2025 19:15:54 +0800
Subject: [PATCH 1618/1798] Add glyph for dialog jump hotkey card item
---
Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
index c69053629..d82d6baa0 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
@@ -76,6 +76,7 @@
Date: Tue, 22 Jul 2025 23:48:39 +0800
Subject: [PATCH 1619/1798] Update labels on language change and other refactor
- Bring back viewmodel construction on init
- Remove redundant init code
---
Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 12 ++++++++++--
.../ViewModels/SettingsViewModel.cs | 3 +--
.../Views/CalculatorSettings.xaml | 1 -
.../Views/CalculatorSettings.xaml.cs | 6 ------
4 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index 9e5e8b7df..09810b974 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -6,6 +6,7 @@ using System.Text.RegularExpressions;
using System.Windows.Controls;
using Mages.Core;
using Flow.Launcher.Plugin.Calculator.Views;
+using Flow.Launcher.Plugin.Calculator.ViewModels;
namespace Flow.Launcher.Plugin.Calculator
{
@@ -28,12 +29,14 @@ namespace Flow.Launcher.Plugin.Calculator
internal static PluginInitContext Context { get; set; } = null!;
- private static Settings _settings;
+ private Settings _settings;
+ private SettingsViewModel _viewModel;
public void Init(PluginInitContext context)
{
Context = context;
_settings = context.API.LoadSettingJsonStorage();
+ _viewModel = new SettingsViewModel(_settings);
MagesEngine = new Engine(new Configuration
{
@@ -152,7 +155,7 @@ namespace Flow.Launcher.Plugin.Calculator
return value.ToString(numberFormatInfo);
}
- private static string GetDecimalSeparator()
+ private string GetDecimalSeparator()
{
string systemDecimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
return _settings.DecimalSeparator switch
@@ -197,5 +200,10 @@ namespace Flow.Launcher.Plugin.Calculator
{
return new CalculatorSettings(_settings);
}
+
+ public void OnCultureInfoChanged(CultureInfo newCulture)
+ {
+ DecimalSeparatorLocalized.UpdateLabels(_viewModel.AllDecimalSeparator);
+ }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs
index a1f07bd17..87ae72fb6 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs
@@ -8,12 +8,11 @@ namespace Flow.Launcher.Plugin.Calculator.ViewModels
public SettingsViewModel(Settings settings)
{
Settings = settings;
- DecimalSeparatorLocalized.UpdateLabels(AllDecimalSeparator);
}
public Settings Settings { get; init; }
- public IEnumerable MaxDecimalPlacesRange => Enumerable.Range(1, 20);
+ public static IEnumerable MaxDecimalPlacesRange => Enumerable.Range(1, 20);
public List AllDecimalSeparator { get; } = DecimalSeparatorLocalized.GetValues();
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
index 589f3ddcd..3355be095 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
@@ -9,7 +9,6 @@
d:DataContext="{d:DesignInstance Type=viewModels:SettingsViewModel}"
d:DesignHeight="450"
d:DesignWidth="800"
- Loaded="CalculatorSettings_Loaded"
mc:Ignorable="d">
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
index cbc74a19d..77cb4627d 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
@@ -19,11 +19,5 @@ namespace Flow.Launcher.Plugin.Calculator.Views
DataContext = _viewModel;
InitializeComponent();
}
-
- private void CalculatorSettings_Loaded(object sender, RoutedEventArgs e)
- {
- DecimalSeparatorComboBox.SelectedItem = _settings.DecimalSeparator;
- MaxDecimalPlaces.SelectedItem = _settings.MaxDecimalPlaces;
- }
}
}
From 6579a4647d699a540274809a32c7cdec90ee96e6 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 22 Jul 2025 23:59:33 +0800
Subject: [PATCH 1620/1798] Compile regex on build time
---
Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 15 +++------------
.../MainRegexHelper.cs | 13 +++++++++++++
2 files changed, 16 insertions(+), 12 deletions(-)
create mode 100644 Plugins/Flow.Launcher.Plugin.Calculator/MainRegexHelper.cs
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index 09810b974..282eda7c3 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -12,17 +12,8 @@ namespace Flow.Launcher.Plugin.Calculator
{
public class Main : IPlugin, IPluginI18n, ISettingProvider
{
- private static readonly Regex RegValidExpressChar = new Regex(
- @"^(" +
- @"ceil|floor|exp|pi|e|max|min|det|abs|log|ln|sqrt|" +
- @"sin|cos|tan|arcsin|arccos|arctan|" +
- @"eigval|eigvec|eig|sum|polar|plot|round|sort|real|zeta|" +
- @"bin2dec|hex2dec|oct2dec|" +
- @"factorial|sign|isprime|isinfty|" +
- @"==|~=|&&|\|\||(?:\<|\>)=?|" +
- @"[ei]|[0-9]|0x[\da-fA-F]+|[\+\%\-\*\/\^\., ""]|[\(\)\|\!\[\]]" +
- @")+$", RegexOptions.Compiled);
- private static readonly Regex RegBrackets = new Regex(@"[\(\)\[\]]", RegexOptions.Compiled);
+ private static readonly Regex RegValidExpressChar = MainRegexHelper.GetRegValidExpressChar();
+ private static readonly Regex RegBrackets = MainRegexHelper.GetRegBrackets();
private static Engine MagesEngine;
private const string Comma = ",";
private const string Dot = ".";
@@ -155,7 +146,7 @@ namespace Flow.Launcher.Plugin.Calculator
return value.ToString(numberFormatInfo);
}
- private string GetDecimalSeparator()
+ private string GetDecimalSeparator()
{
string systemDecimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
return _settings.DecimalSeparator switch
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/MainRegexHelper.cs b/Plugins/Flow.Launcher.Plugin.Calculator/MainRegexHelper.cs
new file mode 100644
index 000000000..8ffc547d1
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/MainRegexHelper.cs
@@ -0,0 +1,13 @@
+using System.Text.RegularExpressions;
+
+namespace Flow.Launcher.Plugin.Calculator;
+
+internal static partial class MainRegexHelper
+{
+
+ [GeneratedRegex(@"[\(\)\[\]]", RegexOptions.Compiled)]
+ public static partial Regex GetRegBrackets();
+
+ [GeneratedRegex(@"^(ceil|floor|exp|pi|e|max|min|det|abs|log|ln|sqrt|sin|cos|tan|arcsin|arccos|arctan|eigval|eigvec|eig|sum|polar|plot|round|sort|real|zeta|bin2dec|hex2dec|oct2dec|factorial|sign|isprime|isinfty|==|~=|&&|\|\||(?:\<|\>)=?|[ei]|[0-9]|0x[\da-fA-F]+|[\+\%\-\*\/\^\., ""]|[\(\)\|\!\[\]])+$", RegexOptions.Compiled)]
+ public static partial Regex GetRegValidExpressChar();
+}
From 63009ba332a820b3319e82d9854c2a7ff921e097 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Wed, 23 Jul 2025 00:03:48 +0800
Subject: [PATCH 1621/1798] Use ContextMenu class instead of interface
---
Plugins/Flow.Launcher.Plugin.Explorer/Main.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
index 0850d4e10..d93c6c77b 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs
@@ -23,7 +23,7 @@ namespace Flow.Launcher.Plugin.Explorer
private SettingsViewModel viewModel;
- private IContextMenu contextMenu;
+ private ContextMenu contextMenu;
private SearchManager searchManager;
From 282581940af20d240e7c8a568bc9fca866efa493 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Wed, 23 Jul 2025 00:04:52 +0800
Subject: [PATCH 1622/1798] Use new Localization package
---
Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index 282eda7c3..195d63e47 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -91,7 +91,7 @@ namespace Flow.Launcher.Plugin.Calculator
}
catch (ExternalException)
{
- Context.API.ShowMsgBox(Context.API.GetTranslation("flowlauncher_plugin_calculator_failed_to_copy"));
+ Context.API.ShowMsgBox(Localize.flowlauncher_plugin_calculator_failed_to_copy());
return false;
}
}
From 113baac567f91b30a7fb8164fa72eafb7cfb68e0 Mon Sep 17 00:00:00 2001
From: dcog989
Date: Tue, 22 Jul 2025 23:48:11 +0100
Subject: [PATCH 1623/1798] Smart thousands and decimals
## Core Logic
* **Advanced Number Parsing:** We now process numbers with various decimal and thousand-separator formats (e.g., `1,234.56` and `1.234,56`). We distinguish between separator types based on their position and surrounding digits.
* **Context-Aware Output Formatting:** We now mirror the output format based on the user's input. If a query includes thousand separators, the result will also have them. The decimal separator in the result will match the one used in the query.
## Code Cleanup
* **Deleted Unused File:** `NumberTranslator.cs` was unused and therefore removed.
* **Removed Redundant UI Code:** The `CalculatorSettings_Loaded` event handler in `CalculatorSettings.xaml.cs` (and its XAML registration) was removed. The functionality was already handled automatically by data binding.
## Maintainability
* **Added Code Documentation:** An XML summary comment was added to the new `NormalizeNumber` method in `Main.cs` to clarify its purpose.
So, the plugin is now much more flexible, and will accept whatever format the user gives it regardless of Windows region settings.
---
.../Flow.Launcher.Plugin.Calculator/Main.cs | 157 ++++++++++++++----
.../NumberTranslator.cs | 91 ----------
.../Views/CalculatorSettings.xaml | 1 -
.../Views/CalculatorSettings.xaml.cs | 8 -
.../plugin.json | 6 +-
5 files changed, 129 insertions(+), 134 deletions(-)
delete mode 100644 Plugins/Flow.Launcher.Plugin.Calculator/NumberTranslator.cs
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index 3d06c4ce0..2787adbbc 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
+using System.Linq;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Windows.Controls;
@@ -23,6 +24,7 @@ namespace Flow.Launcher.Plugin.Calculator
@"[ei]|[0-9]|0x[\da-fA-F]+|[\+\%\-\*\/\^\., ""]|[\(\)\|\!\[\]]" +
@")+$", RegexOptions.Compiled);
private static readonly Regex RegBrackets = new Regex(@"[\(\)\[\]]", RegexOptions.Compiled);
+ private static readonly Regex ThousandGroupRegex = new Regex(@"\B(?=(\d{3})+(?!\d))");
private static Engine MagesEngine;
private const string comma = ",";
private const string dot = ".";
@@ -32,6 +34,9 @@ namespace Flow.Launcher.Plugin.Calculator
private static Settings _settings;
private static SettingsViewModel _viewModel;
+ private string _inputDecimalSeparator;
+ private bool _inputUsesGroupSeparators;
+
public void Init(PluginInitContext context)
{
Context = context;
@@ -54,20 +59,13 @@ namespace Flow.Launcher.Plugin.Calculator
return new List();
}
+ _inputDecimalSeparator = null;
+ _inputUsesGroupSeparators = false;
+
try
{
- string expression;
-
- switch (_settings.DecimalSeparator)
- {
- case DecimalSeparator.Comma:
- case DecimalSeparator.UseSystemLocale when CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator == ",":
- expression = query.Search.Replace(",", ".");
- break;
- default:
- expression = query.Search;
- break;
- }
+ var numberRegex = new Regex(@"[\d\.,]+");
+ var expression = numberRegex.Replace(query.Search, m => NormalizeNumber(m.Value));
var result = MagesEngine.Interpret(expression);
@@ -80,7 +78,7 @@ namespace Flow.Launcher.Plugin.Calculator
if (!string.IsNullOrEmpty(result?.ToString()))
{
decimal roundedResult = Math.Round(Convert.ToDecimal(result), _settings.MaxDecimalPlaces, MidpointRounding.AwayFromZero);
- string newResult = ChangeDecimalSeparator(roundedResult, GetDecimalSeparator());
+ string newResult = FormatResult(roundedResult);
return new List
{
@@ -115,6 +113,121 @@ namespace Flow.Launcher.Plugin.Calculator
return new List();
}
+
+ ///
+ /// Parses a string representation of a number, detecting its format. It uses structural analysis
+ /// (checking for 3-digit groups) and falls back to system culture for ambiguous cases (e.g., "1,234").
+ /// It sets instance fields to remember the user's format for later output formatting.
+ ///
+ /// A normalized number string with '.' as the decimal separator for the Mages engine.
+ private string NormalizeNumber(string numberStr)
+ {
+ var systemFormat = CultureInfo.CurrentCulture.NumberFormat;
+ string systemDecimalSeparator = systemFormat.NumberDecimalSeparator;
+
+ bool hasDot = numberStr.Contains(dot);
+ bool hasComma = numberStr.Contains(comma);
+
+ // Unambiguous case: both separators are present. The last one wins as decimal separator.
+ if (hasDot && hasComma)
+ {
+ _inputUsesGroupSeparators = true;
+ int lastDotPos = numberStr.LastIndexOf(dot);
+ int lastCommaPos = numberStr.LastIndexOf(comma);
+
+ if (lastDotPos > lastCommaPos) // e.g. 1,234.56
+ {
+ _inputDecimalSeparator = dot;
+ return numberStr.Replace(comma, string.Empty);
+ }
+ else // e.g. 1.234,56
+ {
+ _inputDecimalSeparator = comma;
+ return numberStr.Replace(dot, string.Empty).Replace(comma, dot);
+ }
+ }
+
+ if (hasComma)
+ {
+ string[] parts = numberStr.Split(',');
+ // If all parts after the first are 3 digits, it's a potential group separator.
+ bool isGroupCandidate = parts.Length > 1 && parts.Skip(1).All(p => p.Length == 3);
+
+ if (isGroupCandidate)
+ {
+ // Ambiguous case: "1,234". Resolve using culture.
+ if (systemDecimalSeparator == comma)
+ {
+ _inputDecimalSeparator = comma;
+ return numberStr.Replace(comma, dot);
+ }
+ else
+ {
+ _inputUsesGroupSeparators = true;
+ return numberStr.Replace(comma, string.Empty);
+ }
+ }
+ else
+ {
+ // Unambiguous decimal: "123,45" or "1,2,345"
+ _inputDecimalSeparator = comma;
+ return numberStr.Replace(comma, dot);
+ }
+ }
+
+ if (hasDot)
+ {
+ string[] parts = numberStr.Split('.');
+ bool isGroupCandidate = parts.Length > 1 && parts.Skip(1).All(p => p.Length == 3);
+
+ if (isGroupCandidate)
+ {
+ if (systemDecimalSeparator == dot)
+ {
+ _inputDecimalSeparator = dot;
+ return numberStr;
+ }
+ else
+ {
+ _inputUsesGroupSeparators = true;
+ return numberStr.Replace(dot, string.Empty);
+ }
+ }
+ else
+ {
+ _inputDecimalSeparator = dot;
+ return numberStr; // Already in Mages-compatible format
+ }
+ }
+
+ // No separators.
+ return numberStr;
+ }
+
+ private string FormatResult(decimal roundedResult)
+ {
+ // Use the detected decimal separator from the input; otherwise, fall back to settings.
+ string decimalSeparator = _inputDecimalSeparator ?? GetDecimalSeparator();
+ string groupSeparator = decimalSeparator == dot ? comma : dot;
+
+ string resultStr = roundedResult.ToString(CultureInfo.InvariantCulture);
+
+ string[] parts = resultStr.Split('.');
+ string integerPart = parts[0];
+ string fractionalPart = parts.Length > 1 ? parts[1] : string.Empty;
+
+ if (_inputUsesGroupSeparators)
+ {
+ integerPart = ThousandGroupRegex.Replace(integerPart, groupSeparator);
+ }
+
+ if (!string.IsNullOrEmpty(fractionalPart))
+ {
+ return integerPart + decimalSeparator + fractionalPart;
+ }
+
+ return integerPart;
+ }
private bool CanCalculate(Query query)
{
@@ -134,27 +247,9 @@ namespace Flow.Launcher.Plugin.Calculator
return false;
}
- if ((query.Search.Contains(dot) && GetDecimalSeparator() != dot) ||
- (query.Search.Contains(comma) && GetDecimalSeparator() != comma))
- return false;
-
return true;
}
- private string ChangeDecimalSeparator(decimal value, string newDecimalSeparator)
- {
- if (String.IsNullOrEmpty(newDecimalSeparator))
- {
- return value.ToString();
- }
-
- var numberFormatInfo = new NumberFormatInfo
- {
- NumberDecimalSeparator = newDecimalSeparator
- };
- return value.ToString(numberFormatInfo);
- }
-
private static string GetDecimalSeparator()
{
string systemDecimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/NumberTranslator.cs b/Plugins/Flow.Launcher.Plugin.Calculator/NumberTranslator.cs
deleted file mode 100644
index 4eacb9d34..000000000
--- a/Plugins/Flow.Launcher.Plugin.Calculator/NumberTranslator.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-using System.Globalization;
-using System.Text;
-using System.Text.RegularExpressions;
-
-namespace Flow.Launcher.Plugin.Calculator
-{
- ///
- /// Tries to convert all numbers in a text from one culture format to another.
- ///
- public class NumberTranslator
- {
- private readonly CultureInfo sourceCulture;
- private readonly CultureInfo targetCulture;
- private readonly Regex splitRegexForSource;
- private readonly Regex splitRegexForTarget;
-
- private NumberTranslator(CultureInfo sourceCulture, CultureInfo targetCulture)
- {
- this.sourceCulture = sourceCulture;
- this.targetCulture = targetCulture;
-
- this.splitRegexForSource = GetSplitRegex(this.sourceCulture);
- this.splitRegexForTarget = GetSplitRegex(this.targetCulture);
- }
-
- ///
- /// Create a new - returns null if no number conversion
- /// is required between the cultures.
- ///
- /// source culture
- /// target culture
- ///
- public static NumberTranslator Create(CultureInfo sourceCulture, CultureInfo targetCulture)
- {
- bool conversionRequired = sourceCulture.NumberFormat.NumberDecimalSeparator != targetCulture.NumberFormat.NumberDecimalSeparator
- || sourceCulture.NumberFormat.PercentGroupSeparator != targetCulture.NumberFormat.PercentGroupSeparator
- || sourceCulture.NumberFormat.NumberGroupSizes != targetCulture.NumberFormat.NumberGroupSizes;
- return conversionRequired
- ? new NumberTranslator(sourceCulture, targetCulture)
- : null;
- }
-
- ///
- /// Translate from source to target culture.
- ///
- ///
- ///
- public string Translate(string input)
- {
- return this.Translate(input, this.sourceCulture, this.targetCulture, this.splitRegexForSource);
- }
-
- ///
- /// Translate from target to source culture.
- ///
- ///
- ///
- public string TranslateBack(string input)
- {
- return this.Translate(input, this.targetCulture, this.sourceCulture, this.splitRegexForTarget);
- }
-
- private string Translate(string input, CultureInfo cultureFrom, CultureInfo cultureTo, Regex splitRegex)
- {
- var outputBuilder = new StringBuilder();
-
- string[] tokens = splitRegex.Split(input);
- foreach (string token in tokens)
- {
- decimal number;
- outputBuilder.Append(
- decimal.TryParse(token, NumberStyles.Number, cultureFrom, out number)
- ? number.ToString(cultureTo)
- : token);
- }
-
- return outputBuilder.ToString();
- }
-
- private Regex GetSplitRegex(CultureInfo culture)
- {
- var splitPattern = $"((?:\\d|{Regex.Escape(culture.NumberFormat.NumberDecimalSeparator)}";
- if (!string.IsNullOrEmpty(culture.NumberFormat.NumberGroupSeparator))
- {
- splitPattern += $"|{Regex.Escape(culture.NumberFormat.NumberGroupSeparator)}";
- }
- splitPattern += ")+)";
- return new Regex(splitPattern);
- }
- }
-}
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
index ceee3897c..36beebc33 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
@@ -10,7 +10,6 @@
xmlns:viewModels="clr-namespace:Flow.Launcher.Plugin.Calculator.ViewModels"
d:DesignHeight="450"
d:DesignWidth="800"
- Loaded="CalculatorSettings_Loaded"
mc:Ignorable="d">
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
index edb73470c..117a19b25 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
@@ -1,4 +1,3 @@
-using System.Windows;
using System.Windows.Controls;
using Flow.Launcher.Plugin.Calculator.ViewModels;
@@ -19,13 +18,6 @@ namespace Flow.Launcher.Plugin.Calculator.Views
DataContext = viewModel;
InitializeComponent();
}
-
- private void CalculatorSettings_Loaded(object sender, RoutedEventArgs e)
- {
- DecimalSeparatorComboBox.SelectedItem = _settings.DecimalSeparator;
- MaxDecimalPlaces.SelectedItem = _settings.MaxDecimalPlaces;
- }
}
-
}
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
index 3168edfcc..739572930 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
@@ -2,9 +2,9 @@
"ID": "CEA0FDFC6D3B4085823D60DC76F28855",
"ActionKeyword": "*",
"Name": "Calculator",
- "Description": "Perform mathematical calculations (including hexadecimal values)",
- "Author": "cxfksword",
- "Version": "1.0.0",
+ "Description": "Perform mathematical calculations (including hexadecimal values). Use ',' or '.' as thousand separator or decimal place.",
+ "Author": "cxfksword, dcog989",
+ "Version": "1.1.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Calculator.dll",
From c83a29fb1824e0f4d11a662bdee62c3b057ab1c1 Mon Sep 17 00:00:00 2001
From: dcog989
Date: Wed, 23 Jul 2025 01:18:26 +0100
Subject: [PATCH 1624/1798] PR review changes
---
.../Flow.Launcher.Plugin.Calculator/Main.cs | 49 +++++++++++--------
1 file changed, 28 insertions(+), 21 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index 2787adbbc..2894c2159 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -25,6 +25,8 @@ namespace Flow.Launcher.Plugin.Calculator
@")+$", RegexOptions.Compiled);
private static readonly Regex RegBrackets = new Regex(@"[\(\)\[\]]", RegexOptions.Compiled);
private static readonly Regex ThousandGroupRegex = new Regex(@"\B(?=(\d{3})+(?!\d))");
+ private static readonly Regex NumberRegex = new Regex(@"[\d\.,]+", RegexOptions.Compiled);
+
private static Engine MagesEngine;
private const string comma = ",";
private const string dot = ".";
@@ -34,8 +36,15 @@ namespace Flow.Launcher.Plugin.Calculator
private static Settings _settings;
private static SettingsViewModel _viewModel;
- private string _inputDecimalSeparator;
- private bool _inputUsesGroupSeparators;
+ ///
+ /// Holds the formatting information for a single query.
+ /// This is used to ensure thread safety by keeping query state local.
+ ///
+ private class ParsingContext
+ {
+ public string InputDecimalSeparator { get; set; }
+ public bool InputUsesGroupSeparators { get; set; }
+ }
public void Init(PluginInitContext context)
{
@@ -59,13 +68,11 @@ namespace Flow.Launcher.Plugin.Calculator
return new List();
}
- _inputDecimalSeparator = null;
- _inputUsesGroupSeparators = false;
+ var context = new ParsingContext();
try
{
- var numberRegex = new Regex(@"[\d\.,]+");
- var expression = numberRegex.Replace(query.Search, m => NormalizeNumber(m.Value));
+ var expression = NumberRegex.Replace(query.Search, m => NormalizeNumber(m.Value, context));
var result = MagesEngine.Interpret(expression);
@@ -78,7 +85,7 @@ namespace Flow.Launcher.Plugin.Calculator
if (!string.IsNullOrEmpty(result?.ToString()))
{
decimal roundedResult = Math.Round(Convert.ToDecimal(result), _settings.MaxDecimalPlaces, MidpointRounding.AwayFromZero);
- string newResult = FormatResult(roundedResult);
+ string newResult = FormatResult(roundedResult, context);
return new List
{
@@ -117,10 +124,10 @@ namespace Flow.Launcher.Plugin.Calculator
///
/// Parses a string representation of a number, detecting its format. It uses structural analysis
/// (checking for 3-digit groups) and falls back to system culture for ambiguous cases (e.g., "1,234").
- /// It sets instance fields to remember the user's format for later output formatting.
+ /// It populates the provided ParsingContext with the detected format for later use.
///
/// A normalized number string with '.' as the decimal separator for the Mages engine.
- private string NormalizeNumber(string numberStr)
+ private string NormalizeNumber(string numberStr, ParsingContext context)
{
var systemFormat = CultureInfo.CurrentCulture.NumberFormat;
string systemDecimalSeparator = systemFormat.NumberDecimalSeparator;
@@ -131,18 +138,18 @@ namespace Flow.Launcher.Plugin.Calculator
// Unambiguous case: both separators are present. The last one wins as decimal separator.
if (hasDot && hasComma)
{
- _inputUsesGroupSeparators = true;
+ context.InputUsesGroupSeparators = true;
int lastDotPos = numberStr.LastIndexOf(dot);
int lastCommaPos = numberStr.LastIndexOf(comma);
if (lastDotPos > lastCommaPos) // e.g. 1,234.56
{
- _inputDecimalSeparator = dot;
+ context.InputDecimalSeparator = dot;
return numberStr.Replace(comma, string.Empty);
}
else // e.g. 1.234,56
{
- _inputDecimalSeparator = comma;
+ context.InputDecimalSeparator = comma;
return numberStr.Replace(dot, string.Empty).Replace(comma, dot);
}
}
@@ -158,19 +165,19 @@ namespace Flow.Launcher.Plugin.Calculator
// Ambiguous case: "1,234". Resolve using culture.
if (systemDecimalSeparator == comma)
{
- _inputDecimalSeparator = comma;
+ context.InputDecimalSeparator = comma;
return numberStr.Replace(comma, dot);
}
else
{
- _inputUsesGroupSeparators = true;
+ context.InputUsesGroupSeparators = true;
return numberStr.Replace(comma, string.Empty);
}
}
else
{
// Unambiguous decimal: "123,45" or "1,2,345"
- _inputDecimalSeparator = comma;
+ context.InputDecimalSeparator = comma;
return numberStr.Replace(comma, dot);
}
}
@@ -184,18 +191,18 @@ namespace Flow.Launcher.Plugin.Calculator
{
if (systemDecimalSeparator == dot)
{
- _inputDecimalSeparator = dot;
+ context.InputDecimalSeparator = dot;
return numberStr;
}
else
{
- _inputUsesGroupSeparators = true;
+ context.InputUsesGroupSeparators = true;
return numberStr.Replace(dot, string.Empty);
}
}
else
{
- _inputDecimalSeparator = dot;
+ context.InputDecimalSeparator = dot;
return numberStr; // Already in Mages-compatible format
}
}
@@ -204,10 +211,10 @@ namespace Flow.Launcher.Plugin.Calculator
return numberStr;
}
- private string FormatResult(decimal roundedResult)
+ private string FormatResult(decimal roundedResult, ParsingContext context)
{
// Use the detected decimal separator from the input; otherwise, fall back to settings.
- string decimalSeparator = _inputDecimalSeparator ?? GetDecimalSeparator();
+ string decimalSeparator = context.InputDecimalSeparator ?? GetDecimalSeparator();
string groupSeparator = decimalSeparator == dot ? comma : dot;
string resultStr = roundedResult.ToString(CultureInfo.InvariantCulture);
@@ -216,7 +223,7 @@ namespace Flow.Launcher.Plugin.Calculator
string integerPart = parts[0];
string fractionalPart = parts.Length > 1 ? parts[1] : string.Empty;
- if (_inputUsesGroupSeparators)
+ if (context.InputUsesGroupSeparators)
{
integerPart = ThousandGroupRegex.Replace(integerPart, groupSeparator);
}
From 69c4d19f8b582603754f5ef330ceaad48d606c2c Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Jul 2025 09:09:12 +0800
Subject: [PATCH 1625/1798] Improve code quality
---
.../ViewModels/SettingsViewModel.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index 2d636d01a..7292697ce 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -602,7 +602,7 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
if (value == Settings.SortOption)
return;
Settings.SortOption = value;
- OnPropertyChanged(nameof(SelectedEverythingSortOption));
+ OnPropertyChanged();
OnPropertyChanged(nameof(FastSortWarningVisibility));
OnPropertyChanged(nameof(SortOptionWarningMessage));
}
@@ -628,6 +628,7 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
}
}
}
+
public string SortOptionWarningMessage
{
get
From 5161bbe660a5dce00034ed4cec77f12a59d71a06 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Jul 2025 09:33:14 +0800
Subject: [PATCH 1626/1798] Remove unused comments & blank line
---
.../Views/CalculatorSettings.xaml.cs | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
index 117a19b25..d0d79cd72 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
@@ -1,11 +1,8 @@
-using System.Windows.Controls;
+using System.Windows.Controls;
using Flow.Launcher.Plugin.Calculator.ViewModels;
namespace Flow.Launcher.Plugin.Calculator.Views
{
- ///
- /// Interaction logic for CalculatorSettings.xaml
- ///
public partial class CalculatorSettings : UserControl
{
private readonly SettingsViewModel _viewModel;
@@ -19,5 +16,4 @@ namespace Flow.Launcher.Plugin.Calculator.Views
InitializeComponent();
}
}
-
}
From 5ff8a5b1d59dd95ae8c0a79decb2714ee38e9cf8 Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Wed, 23 Jul 2025 09:59:09 +0800
Subject: [PATCH 1627/1798] Use compiled regex
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index 2894c2159..b972394a4 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -24,7 +24,7 @@ namespace Flow.Launcher.Plugin.Calculator
@"[ei]|[0-9]|0x[\da-fA-F]+|[\+\%\-\*\/\^\., ""]|[\(\)\|\!\[\]]" +
@")+$", RegexOptions.Compiled);
private static readonly Regex RegBrackets = new Regex(@"[\(\)\[\]]", RegexOptions.Compiled);
- private static readonly Regex ThousandGroupRegex = new Regex(@"\B(?=(\d{3})+(?!\d))");
+ private static readonly Regex ThousandGroupRegex = new Regex(@"\B(?=(\d{3})+(?!\d))", RegexOptions.Compiled);
private static readonly Regex NumberRegex = new Regex(@"[\d\.,]+", RegexOptions.Compiled);
private static Engine MagesEngine;
From 852b2f517be223e3a9be419ea61271a7eefd6206 Mon Sep 17 00:00:00 2001
From: dcog989
Date: Wed, 23 Jul 2025 04:27:19 +0100
Subject: [PATCH 1628/1798] fix for regression from first review, plus issues
with e.g. '0,123' and ',123'
---
Flow.Launcher.Core/packages.lock.json | 84 ++--
.../packages.lock.json | 59 ++-
Flow.Launcher.Plugin/packages.lock.json | 6 +-
Flow.Launcher/packages.lock.json | 361 ++++++++++++++----
.../Flow.Launcher.Plugin.Calculator/Main.cs | 116 +++---
5 files changed, 439 insertions(+), 187 deletions(-)
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index 0c513951b..dec7bf0b4 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -13,9 +13,9 @@
},
"FSharp.Core": {
"type": "Direct",
- "requested": "[9.0.101, )",
- "resolved": "9.0.101",
- "contentHash": "3/YR1SDWFA+Ojx9HiBwND+0UR8ZWoeZfkhD0DWAPCDdr/YI+CyFkArmMGzGSyPXeYtjG0sy0emzfyNwjt7zhig=="
+ "requested": "[9.0.201, )",
+ "resolved": "9.0.201",
+ "contentHash": "Ozq4T0ISTkqTYJ035XW/JkdDDaXofbykvfyVwkjLSqaDZ/4uNXfpf92cjcMI9lf9CxWqmlWHScViPh/4AvnWcw=="
},
"Meziantou.Framework.Win32.Jobs": {
"type": "Direct",
@@ -29,6 +29,12 @@
"resolved": "3.0.1",
"contentHash": "s/s20YTVY9r9TPfTrN5g8zPF1YhwxyqO6PxUkrYTGI2B+OGPe9AdajWZrLhFqXIvqIW23fnUE4+ztrUWNU1+9g=="
},
+ "SemanticVersioning": {
+ "type": "Direct",
+ "requested": "[3.0.0, )",
+ "resolved": "3.0.0",
+ "contentHash": "RR+8GbPQ/gjDqov/1QN1OPoUlbUruNwcL3WjWCeLw+MY7+od/ENhnkYxCfAC6rQLIu3QifaJt3kPYyP3RumqMQ=="
+ },
"squirrel.windows": {
"type": "Direct",
"requested": "[1.5.2, )",
@@ -42,9 +48,9 @@
},
"StreamJsonRpc": {
"type": "Direct",
- "requested": "[2.20.20, )",
- "resolved": "2.20.20",
- "contentHash": "gwG7KViLbSWS7EI0kYevinVmIga9wZNrpSY/FnWyC6DbdjKJ1xlv/FV1L9b0rLkVP8cGxfIMexdvo/+2W5eq6Q==",
+ "requested": "[2.21.10, )",
+ "resolved": "2.21.10",
+ "contentHash": "wjBlFiaE+npUco9Jj4K11EEZfmAg4poRFYhcCJOiVdiHZ3UxapbGemtLNRcVYGXa/p8nqvZ38TfJPHnlrromDg==",
"dependencies": {
"MessagePack": "2.5.187",
"Microsoft.VisualStudio.Threading": "17.10.48",
@@ -78,6 +84,11 @@
"resolved": "1.0.0",
"contentHash": "nwbZAYd+DblXAIzlnwDSnl0CiCm8jWLfHSYnoN4wYhtIav6AegB3+T/vKzLbU2IZlPB8Bvl8U3NXpx3eaz+N5w=="
},
+ "InputSimulator": {
+ "type": "Transitive",
+ "resolved": "1.0.4",
+ "contentHash": "D0LvRCPQMX6/FJHBjng+RO+wRDuHTJrfo7IAc7rmkPvRqchdVGJWg3y70peOtDy3OLNK+HSOwVkH4GiuLnkKgA=="
+ },
"JetBrains.Annotations": {
"type": "Transitive",
"resolved": "2024.3.0",
@@ -85,22 +96,22 @@
},
"MemoryPack": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "cwCtED8y400vMWx/Vp0QCSeEpVFjDU4JwF52VX9WTaqVERUvNqjG9n6osFlmFuytegyXnHvYEu1qRJ8rv/rkbg==",
+ "resolved": "1.21.4",
+ "contentHash": "wy3JTBNBsO8LfQcBvvYsWr3lm2Oakolrfu0UQ3oSJSEiD+7ye0GUhYTaXuYYBowqsXBXWD9gf2218ae0JRiYVQ==",
"dependencies": {
- "MemoryPack.Core": "1.21.3",
- "MemoryPack.Generator": "1.21.3"
+ "MemoryPack.Core": "1.21.4",
+ "MemoryPack.Generator": "1.21.4"
}
},
"MemoryPack.Core": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "ajrYoBWT2aKeH4tlY8q/1C9qK1R/NK+7FkuVOX58ebOSxkABoFTqCR7W+Zk2rakUHZiEgNdRqO67hiRZPq6fLA=="
+ "resolved": "1.21.4",
+ "contentHash": "6RszGorZ0ejNmp37ZcboPBMvvPCuNW2jlrdQfcs/lMzE5b3pmPF6hsm/laDc34hRlbAST1ZxaX/DvYu2DF5sBQ=="
},
"MemoryPack.Generator": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "hYU0TAIarDKnbkNIWvb7P4zBUL+CTahkuNkczsKvycSMR5kiwQ4IfLexywNKX3s05Izp4gzDSPbueepNWZRpWA=="
+ "resolved": "1.21.4",
+ "contentHash": "g14EsSS85yn0lHTi0J9ivqlZMf09A2iI51fmI+0KkzIzyCbWOBWPi5mdaY7YWmXprk12aYh9u/qfWHQUYthlwg=="
},
"MessagePack": {
"type": "Transitive",
@@ -142,8 +153,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.2",
- "contentHash": "5BkGZ6mHp2dHydR29sb0fDfAuqkv30AHtTih8wMzvPZysOmBFvHfnkR2w3tsc0pSiIg8ZoKyefJXWy9r3pBh0w=="
+ "resolved": "7.0.0",
+ "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
},
"Mono.Cecil": {
"type": "Transitive",
@@ -165,18 +176,28 @@
"resolved": "13.0.1",
"contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
},
+ "NHotkey": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "IEghs0QqWsQYH0uUmvIl0Ye6RaebWRh38eB6ToOkDnQucTYRGFOgtig0gSxlwCszTilYFz3n1ZuY762x+kDR3A=="
+ },
+ "NHotkey.Wpf": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "BIUKlhTG5KtFf9OQzWvkmVmktt5/FFj6AOEgag8Uf0R2YdZt5ajUzs3sVskcJcT2TztWlEHKQr1jFj3KQ0D9Nw==",
+ "dependencies": {
+ "NHotkey": "3.0.0"
+ }
+ },
"NLog": {
"type": "Transitive",
"resolved": "4.7.10",
"contentHash": "rcegW7kYOCjl7wX0SzsqpPBqnJ51JKi1WkYb6QBVX0Wc5IgH19Pv4t/co+T0s06OS0Ne44xgkY/mHg0PdrmJow=="
},
- "PropertyChanged.Fody": {
+ "SharpVectors.Wpf": {
"type": "Transitive",
- "resolved": "3.4.0",
- "contentHash": "IAZyq0uolKo2WYm4mjx+q7A8fSGFT0x2e1s3y+ODn4JI0kqTDoo9GF2tdaypUzRFJZfdMxfC5HZW9QzdJLtOnA==",
- "dependencies": {
- "Fody": "6.5.1"
- }
+ "resolved": "1.8.4.2",
+ "contentHash": "PNxLkMBJnV8A+6yH9OqOlhLJegvWP/dvh0rAJp2l0kcrR+rB4R2tQ9vhUqka+UilH4atN8T6zvjDOizVyfz2Ng=="
},
"Splat": {
"type": "Transitive",
@@ -185,10 +206,10 @@
},
"System.Drawing.Common": {
"type": "Transitive",
- "resolved": "9.0.2",
- "contentHash": "JU947wzf8JbBS16Y5EIZzAlyQU+k68D7LRx6y03s2wlhlvLqkt/8uPBrjv2hJnnaJKbdb0GhQ3JZsfYXhrRjyg==",
+ "resolved": "7.0.0",
+ "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.2"
+ "Microsoft.Win32.SystemEvents": "7.0.0"
}
},
"System.IO.Pipelines": {
@@ -217,20 +238,21 @@
"Ben.Demystifier": "[0.4.1, )",
"BitFaster.Caching": "[2.5.3, )",
"CommunityToolkit.Mvvm": "[8.4.0, )",
- "Flow.Launcher.Plugin": "[4.4.0, )",
- "MemoryPack": "[1.21.3, )",
+ "Flow.Launcher.Plugin": "[4.7.0, )",
+ "InputSimulator": "[1.0.4, )",
+ "MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.12.19, )",
+ "NHotkey.Wpf": "[3.0.0, )",
"NLog": "[4.7.10, )",
- "PropertyChanged.Fody": "[3.4.0, )",
- "System.Drawing.Common": "[9.0.2, )",
+ "SharpVectors.Wpf": "[1.8.4.2, )",
+ "System.Drawing.Common": "[7.0.0, )",
"ToolGood.Words.Pinyin": "[3.0.1.4, )"
}
},
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2024.3.0, )",
- "PropertyChanged.Fody": "[3.4.0, )"
+ "JetBrains.Annotations": "[2024.3.0, )"
}
}
}
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index f38f91ef9..27dfd1cd6 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -29,14 +29,20 @@
"resolved": "6.5.5",
"contentHash": "Krca41L/PDva1VsmDec5n52cQZxQAQp/bsHdzsNi8iLLI0lqKL94fNIkNaC8tVolUkCyWsbzvxfxJCeD2789fA=="
},
+ "InputSimulator": {
+ "type": "Direct",
+ "requested": "[1.0.4, )",
+ "resolved": "1.0.4",
+ "contentHash": "D0LvRCPQMX6/FJHBjng+RO+wRDuHTJrfo7IAc7rmkPvRqchdVGJWg3y70peOtDy3OLNK+HSOwVkH4GiuLnkKgA=="
+ },
"MemoryPack": {
"type": "Direct",
- "requested": "[1.21.3, )",
- "resolved": "1.21.3",
- "contentHash": "cwCtED8y400vMWx/Vp0QCSeEpVFjDU4JwF52VX9WTaqVERUvNqjG9n6osFlmFuytegyXnHvYEu1qRJ8rv/rkbg==",
+ "requested": "[1.21.4, )",
+ "resolved": "1.21.4",
+ "contentHash": "wy3JTBNBsO8LfQcBvvYsWr3lm2Oakolrfu0UQ3oSJSEiD+7ye0GUhYTaXuYYBowqsXBXWD9gf2218ae0JRiYVQ==",
"dependencies": {
- "MemoryPack.Core": "1.21.3",
- "MemoryPack.Generator": "1.21.3"
+ "MemoryPack.Core": "1.21.4",
+ "MemoryPack.Generator": "1.21.4"
}
},
"Microsoft.VisualStudio.Threading": {
@@ -60,6 +66,15 @@
"Microsoft.Windows.WDK.Win32Metadata": "0.11.4-experimental"
}
},
+ "NHotkey.Wpf": {
+ "type": "Direct",
+ "requested": "[3.0.0, )",
+ "resolved": "3.0.0",
+ "contentHash": "BIUKlhTG5KtFf9OQzWvkmVmktt5/FFj6AOEgag8Uf0R2YdZt5ajUzs3sVskcJcT2TztWlEHKQr1jFj3KQ0D9Nw==",
+ "dependencies": {
+ "NHotkey": "3.0.0"
+ }
+ },
"NLog": {
"type": "Direct",
"requested": "[4.7.10, )",
@@ -75,13 +90,19 @@
"Fody": "6.5.1"
}
},
+ "SharpVectors.Wpf": {
+ "type": "Direct",
+ "requested": "[1.8.4.2, )",
+ "resolved": "1.8.4.2",
+ "contentHash": "PNxLkMBJnV8A+6yH9OqOlhLJegvWP/dvh0rAJp2l0kcrR+rB4R2tQ9vhUqka+UilH4atN8T6zvjDOizVyfz2Ng=="
+ },
"System.Drawing.Common": {
"type": "Direct",
- "requested": "[9.0.2, )",
- "resolved": "9.0.2",
- "contentHash": "JU947wzf8JbBS16Y5EIZzAlyQU+k68D7LRx6y03s2wlhlvLqkt/8uPBrjv2hJnnaJKbdb0GhQ3JZsfYXhrRjyg==",
+ "requested": "[7.0.0, )",
+ "resolved": "7.0.0",
+ "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.2"
+ "Microsoft.Win32.SystemEvents": "7.0.0"
}
},
"ToolGood.Words.Pinyin": {
@@ -97,13 +118,13 @@
},
"MemoryPack.Core": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "ajrYoBWT2aKeH4tlY8q/1C9qK1R/NK+7FkuVOX58ebOSxkABoFTqCR7W+Zk2rakUHZiEgNdRqO67hiRZPq6fLA=="
+ "resolved": "1.21.4",
+ "contentHash": "6RszGorZ0ejNmp37ZcboPBMvvPCuNW2jlrdQfcs/lMzE5b3pmPF6hsm/laDc34hRlbAST1ZxaX/DvYu2DF5sBQ=="
},
"MemoryPack.Generator": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "hYU0TAIarDKnbkNIWvb7P4zBUL+CTahkuNkczsKvycSMR5kiwQ4IfLexywNKX3s05Izp4gzDSPbueepNWZRpWA=="
+ "resolved": "1.21.4",
+ "contentHash": "g14EsSS85yn0lHTi0J9ivqlZMf09A2iI51fmI+0KkzIzyCbWOBWPi5mdaY7YWmXprk12aYh9u/qfWHQUYthlwg=="
},
"Microsoft.VisualStudio.Threading.Analyzers": {
"type": "Transitive",
@@ -117,8 +138,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.2",
- "contentHash": "5BkGZ6mHp2dHydR29sb0fDfAuqkv30AHtTih8wMzvPZysOmBFvHfnkR2w3tsc0pSiIg8ZoKyefJXWy9r3pBh0w=="
+ "resolved": "7.0.0",
+ "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
},
"Microsoft.Windows.SDK.Win32Docs": {
"type": "Transitive",
@@ -138,6 +159,11 @@
"Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview"
}
},
+ "NHotkey": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "IEghs0QqWsQYH0uUmvIl0Ye6RaebWRh38eB6ToOkDnQucTYRGFOgtig0gSxlwCszTilYFz3n1ZuY762x+kDR3A=="
+ },
"System.Reflection.Metadata": {
"type": "Transitive",
"resolved": "5.0.0",
@@ -146,8 +172,7 @@
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2024.3.0, )",
- "PropertyChanged.Fody": "[3.4.0, )"
+ "JetBrains.Annotations": "[2024.3.0, )"
}
}
}
diff --git a/Flow.Launcher.Plugin/packages.lock.json b/Flow.Launcher.Plugin/packages.lock.json
index 6cdf96e07..aad21a318 100644
--- a/Flow.Launcher.Plugin/packages.lock.json
+++ b/Flow.Launcher.Plugin/packages.lock.json
@@ -4,9 +4,9 @@
"net9.0-windows7.0": {
"Fody": {
"type": "Direct",
- "requested": "[6.5.4, )",
- "resolved": "6.5.4",
- "contentHash": "GXZuti428IZctfby10xkMbWLCibcb6s29I/psLbBoO2vHJI5eTNVybnlV/Wi1tlIu9GG0bgW/PQwMH+MCldHxw=="
+ "requested": "[6.5.5, )",
+ "resolved": "6.5.5",
+ "contentHash": "Krca41L/PDva1VsmDec5n52cQZxQAQp/bsHdzsNi8iLLI0lqKL94fNIkNaC8tVolUkCyWsbzvxfxJCeD2789fA=="
},
"JetBrains.Annotations": {
"type": "Direct",
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index 017065044..f0409c131 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -16,25 +16,57 @@
},
"Fody": {
"type": "Direct",
- "requested": "[6.5.4, )",
- "resolved": "6.5.4",
- "contentHash": "GXZuti428IZctfby10xkMbWLCibcb6s29I/psLbBoO2vHJI5eTNVybnlV/Wi1tlIu9GG0bgW/PQwMH+MCldHxw=="
+ "requested": "[6.5.5, )",
+ "resolved": "6.5.5",
+ "contentHash": "Krca41L/PDva1VsmDec5n52cQZxQAQp/bsHdzsNi8iLLI0lqKL94fNIkNaC8tVolUkCyWsbzvxfxJCeD2789fA=="
},
- "InputSimulator": {
+ "MdXaml": {
"type": "Direct",
- "requested": "[1.0.4, )",
- "resolved": "1.0.4",
- "contentHash": "D0LvRCPQMX6/FJHBjng+RO+wRDuHTJrfo7IAc7rmkPvRqchdVGJWg3y70peOtDy3OLNK+HSOwVkH4GiuLnkKgA=="
- },
- "Jack251970.TaskScheduler": {
- "type": "Direct",
- "requested": "[2.12.1, )",
- "resolved": "2.12.1",
- "contentHash": "+epAtsLMugiznJCNRYCYB6eBcr+bx+CVlwPWMprO5CbnNkWu9mlSV8XN5BQJrGYwmlAtlGfZA3p3PcFFlrgR6A==",
+ "requested": "[1.27.0, )",
+ "resolved": "1.27.0",
+ "contentHash": "VWhqhCeKVkJe8vkPmXuGZlRX01WDrTugOLeUvJn18jH/8DrGGVBvtgIlJoELHD2f1DiEWqF3lxxjV55vnzE7Tg==",
"dependencies": {
- "Microsoft.Win32.Registry": "5.0.0",
- "System.Diagnostics.EventLog": "8.0.0",
- "System.Security.AccessControl": "6.0.1"
+ "AvalonEdit": "6.3.0.90",
+ "MdXaml.Plugins": "1.27.0"
+ }
+ },
+ "MdXaml.AnimatedGif": {
+ "type": "Direct",
+ "requested": "[1.27.0, )",
+ "resolved": "1.27.0",
+ "contentHash": "Xrr9IgyAfqDbruqCp2Wxzthbc87QMvMR2YXQsGDyacLtowleefP1Jt3cesZCbI44YcZTGjyJNIkvRAyzzlgsOQ==",
+ "dependencies": {
+ "MdXaml.Plugins": "1.27.0",
+ "WpfAnimatedGif": "2.0.2"
+ }
+ },
+ "MdXaml.Html": {
+ "type": "Direct",
+ "requested": "[1.27.0, )",
+ "resolved": "1.27.0",
+ "contentHash": "3AI0g7EwsTuvhhNd9bjb3J7v5aXFk1dLaf1CNbLjkcZs/MwnEUHNgzF+sLQBYYVdG2DqfV1BsuFoPWSG7IdHvg==",
+ "dependencies": {
+ "AvalonEdit": "6.3.0.90",
+ "HtmlAgilityPack": "1.11.42",
+ "MdXaml": "1.27.0",
+ "MdXaml.Plugins": "1.27.0"
+ }
+ },
+ "MdXaml.Plugins": {
+ "type": "Direct",
+ "requested": "[1.27.0, )",
+ "resolved": "1.27.0",
+ "contentHash": "We7LtBdoukRg9mqTfa1f5n8z/GQPMKBRj3URk9DiMuqzIHkW1lTgK5njVPSScxsRt4YzW22423tSnLWNm2MJKg=="
+ },
+ "MdXaml.Svg": {
+ "type": "Direct",
+ "requested": "[1.27.0, )",
+ "resolved": "1.27.0",
+ "contentHash": "zHtzcQrEVDoTDRvxFAccAIQG3UHCUW2cdWrGCg9yfT6344hhqc6d9t/93kBqQ6j+f580YeevtMeraz9PWmzpfw==",
+ "dependencies": {
+ "MdXaml": "1.27.0",
+ "MdXaml.Plugins": "1.27.0",
+ "Svg": "3.0.84"
}
},
"Microsoft.Extensions.DependencyInjection": {
@@ -88,32 +120,12 @@
"System.ValueTuple": "4.5.0"
}
},
- "Microsoft.Windows.CsWin32": {
- "type": "Direct",
- "requested": "[0.3.106, )",
- "resolved": "0.3.106",
- "contentHash": "Mx5fK7uN6fwLR4wUghs6//HonAnwPBNmC2oonyJVhCUlHS/r6SUS3NkBc3+gaQiv+0/9bqdj1oSCKQFkNI+21Q==",
- "dependencies": {
- "Microsoft.Windows.SDK.Win32Docs": "0.1.42-alpha",
- "Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview",
- "Microsoft.Windows.WDK.Win32Metadata": "0.11.4-experimental"
- }
- },
"ModernWpfUI": {
"type": "Direct",
"requested": "[0.9.4, )",
"resolved": "0.9.4",
"contentHash": "HJ07Be9KOiGKGcMLz/AwY+84h3yGHRPuYpYXCE6h1yPtaFwGMWfanZ70jX7W5XWx8+Qk1vGox+WGKgxxsy6EHw=="
},
- "NHotkey.Wpf": {
- "type": "Direct",
- "requested": "[3.0.0, )",
- "resolved": "3.0.0",
- "contentHash": "BIUKlhTG5KtFf9OQzWvkmVmktt5/FFj6AOEgag8Uf0R2YdZt5ajUzs3sVskcJcT2TztWlEHKQr1jFj3KQ0D9Nw==",
- "dependencies": {
- "NHotkey": "3.0.0"
- }
- },
"PropertyChanged.Fody": {
"type": "Direct",
"requested": "[3.4.0, )",
@@ -129,12 +141,28 @@
"resolved": "3.0.0",
"contentHash": "RR+8GbPQ/gjDqov/1QN1OPoUlbUruNwcL3WjWCeLw+MY7+od/ENhnkYxCfAC6rQLIu3QifaJt3kPYyP3RumqMQ=="
},
+ "TaskScheduler": {
+ "type": "Direct",
+ "requested": "[2.12.1, )",
+ "resolved": "2.12.1",
+ "contentHash": "DzSVmVs0i5yHmuDy9ZMcTtKg48GU0aEFBbhp2XJrzA4saTRec/KbU5aGE/4P4FE499G3PDx9KPOHysoKzS/i3g==",
+ "dependencies": {
+ "Microsoft.Win32.Registry": "5.0.0",
+ "System.Diagnostics.EventLog": "9.0.2",
+ "System.Security.AccessControl": "6.0.1"
+ }
+ },
"VirtualizingWrapPanel": {
"type": "Direct",
"requested": "[2.1.1, )",
"resolved": "2.1.1",
"contentHash": "Fc/yjU8jqC3qpIsNxeO5RjK2lPU7xnJtBLMSQ6L9egA2PyJLQeVeXpG8WBb5N1kN15rlJEYG8dHWJ5qUGgaNrg=="
},
+ "AvalonEdit": {
+ "type": "Transitive",
+ "resolved": "6.3.0.90",
+ "contentHash": "WVTb5MxwGqKdeasd3nG5udlV4t6OpvkFanziwI133K0/QJ5FvZmfzRQgpAjGTJhQfIA8GP7AzKQ3sTY9JOFk8Q=="
+ },
"Ben.Demystifier": {
"type": "Transitive",
"resolved": "0.4.1",
@@ -161,10 +189,25 @@
"YamlDotNet": "9.1.0"
}
},
+ "Fizzler": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "jH8KFyDJtgqLl3jZwbwgR3nA9dyebKPBgLwBx0bjPvxvvoCqHPD5IPedRGYzki8RYFpjxCFMlLtnNFPYq2OgmQ=="
+ },
"FSharp.Core": {
"type": "Transitive",
- "resolved": "9.0.101",
- "contentHash": "3/YR1SDWFA+Ojx9HiBwND+0UR8ZWoeZfkhD0DWAPCDdr/YI+CyFkArmMGzGSyPXeYtjG0sy0emzfyNwjt7zhig=="
+ "resolved": "9.0.201",
+ "contentHash": "Ozq4T0ISTkqTYJ035XW/JkdDDaXofbykvfyVwkjLSqaDZ/4uNXfpf92cjcMI9lf9CxWqmlWHScViPh/4AvnWcw=="
+ },
+ "HtmlAgilityPack": {
+ "type": "Transitive",
+ "resolved": "1.11.42",
+ "contentHash": "LDc1bEfF14EY2DZzak4xvzWvbpNXK3vi1u0KQbBpLUN4+cx/VrvXhgCAMSJhSU5vz0oMfW9JZIR20vj/PkDHPA=="
+ },
+ "InputSimulator": {
+ "type": "Transitive",
+ "resolved": "1.0.4",
+ "contentHash": "D0LvRCPQMX6/FJHBjng+RO+wRDuHTJrfo7IAc7rmkPvRqchdVGJWg3y70peOtDy3OLNK+HSOwVkH4GiuLnkKgA=="
},
"JetBrains.Annotations": {
"type": "Transitive",
@@ -173,22 +216,22 @@
},
"MemoryPack": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "cwCtED8y400vMWx/Vp0QCSeEpVFjDU4JwF52VX9WTaqVERUvNqjG9n6osFlmFuytegyXnHvYEu1qRJ8rv/rkbg==",
+ "resolved": "1.21.4",
+ "contentHash": "wy3JTBNBsO8LfQcBvvYsWr3lm2Oakolrfu0UQ3oSJSEiD+7ye0GUhYTaXuYYBowqsXBXWD9gf2218ae0JRiYVQ==",
"dependencies": {
- "MemoryPack.Core": "1.21.3",
- "MemoryPack.Generator": "1.21.3"
+ "MemoryPack.Core": "1.21.4",
+ "MemoryPack.Generator": "1.21.4"
}
},
"MemoryPack.Core": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "ajrYoBWT2aKeH4tlY8q/1C9qK1R/NK+7FkuVOX58ebOSxkABoFTqCR7W+Zk2rakUHZiEgNdRqO67hiRZPq6fLA=="
+ "resolved": "1.21.4",
+ "contentHash": "6RszGorZ0ejNmp37ZcboPBMvvPCuNW2jlrdQfcs/lMzE5b3pmPF6hsm/laDc34hRlbAST1ZxaX/DvYu2DF5sBQ=="
},
"MemoryPack.Generator": {
"type": "Transitive",
- "resolved": "1.21.3",
- "contentHash": "hYU0TAIarDKnbkNIWvb7P4zBUL+CTahkuNkczsKvycSMR5kiwQ4IfLexywNKX3s05Izp4gzDSPbueepNWZRpWA=="
+ "resolved": "1.21.4",
+ "contentHash": "g14EsSS85yn0lHTi0J9ivqlZMf09A2iI51fmI+0KkzIzyCbWOBWPi5mdaY7YWmXprk12aYh9u/qfWHQUYthlwg=="
},
"MessagePack": {
"type": "Transitive",
@@ -440,6 +483,16 @@
"resolved": "17.6.3",
"contentHash": "N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA=="
},
+ "Microsoft.NETCore.Platforms": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A=="
+ },
+ "Microsoft.NETCore.Targets": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg=="
+ },
"Microsoft.VisualStudio.Threading": {
"type": "Transitive",
"resolved": "17.12.19",
@@ -470,26 +523,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.2",
- "contentHash": "5BkGZ6mHp2dHydR29sb0fDfAuqkv30AHtTih8wMzvPZysOmBFvHfnkR2w3tsc0pSiIg8ZoKyefJXWy9r3pBh0w=="
- },
- "Microsoft.Windows.SDK.Win32Docs": {
- "type": "Transitive",
- "resolved": "0.1.42-alpha",
- "contentHash": "Z/9po23gUA9aoukirh2ItMU2ZS9++Js9Gdds9fu5yuMojDrmArvY2y+tq9985tR3cxFxpZO1O35Wjfo0khj5HA=="
- },
- "Microsoft.Windows.SDK.Win32Metadata": {
- "type": "Transitive",
- "resolved": "60.0.34-preview",
- "contentHash": "TA3DUNi4CTeo+ItTXBnGZFt2159XOGSl0UOlG5vjDj4WHqZjhwYyyUnzOtrbCERiSaP2Hzg7otJNWwOSZgutyA=="
- },
- "Microsoft.Windows.WDK.Win32Metadata": {
- "type": "Transitive",
- "resolved": "0.11.4-experimental",
- "contentHash": "bf5MCmUyZf0gBlYQjx9UpRAZWBkRndyt9XicR+UNLvAUAFTZQbu6YaX/sNKZlR98Grn0gydfh/yT4I3vc0AIQA==",
- "dependencies": {
- "Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview"
- }
+ "resolved": "7.0.0",
+ "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
},
"Mono.Cecil": {
"type": "Transitive",
@@ -516,11 +551,29 @@
"resolved": "3.0.0",
"contentHash": "IEghs0QqWsQYH0uUmvIl0Ye6RaebWRh38eB6ToOkDnQucTYRGFOgtig0gSxlwCszTilYFz3n1ZuY762x+kDR3A=="
},
+ "NHotkey.Wpf": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "BIUKlhTG5KtFf9OQzWvkmVmktt5/FFj6AOEgag8Uf0R2YdZt5ajUzs3sVskcJcT2TztWlEHKQr1jFj3KQ0D9Nw==",
+ "dependencies": {
+ "NHotkey": "3.0.0"
+ }
+ },
"NLog": {
"type": "Transitive",
"resolved": "4.7.10",
"contentHash": "rcegW7kYOCjl7wX0SzsqpPBqnJ51JKi1WkYb6QBVX0Wc5IgH19Pv4t/co+T0s06OS0Ne44xgkY/mHg0PdrmJow=="
},
+ "runtime.osx.10.10-x64.CoreCompat.System.Drawing": {
+ "type": "Transitive",
+ "resolved": "5.8.64",
+ "contentHash": "Ey7xQgWwixxdrmhzEUvaR4kxZDSQMWQScp8ViLvmL5xCBKG6U3TaMv/jzHilpfQXpHmJ4IylKGzzMvnYX2FwHQ=="
+ },
+ "SharpVectors.Wpf": {
+ "type": "Transitive",
+ "resolved": "1.8.4.2",
+ "contentHash": "PNxLkMBJnV8A+6yH9OqOlhLJegvWP/dvh0rAJp2l0kcrR+rB4R2tQ9vhUqka+UilH4atN8T6zvjDOizVyfz2Ng=="
+ },
"Splat": {
"type": "Transitive",
"resolved": "1.6.2",
@@ -538,8 +591,8 @@
},
"StreamJsonRpc": {
"type": "Transitive",
- "resolved": "2.20.20",
- "contentHash": "gwG7KViLbSWS7EI0kYevinVmIga9wZNrpSY/FnWyC6DbdjKJ1xlv/FV1L9b0rLkVP8cGxfIMexdvo/+2W5eq6Q==",
+ "resolved": "2.21.10",
+ "contentHash": "wjBlFiaE+npUco9Jj4K11EEZfmAg4poRFYhcCJOiVdiHZ3UxapbGemtLNRcVYGXa/p8nqvZ38TfJPHnlrromDg==",
"dependencies": {
"MessagePack": "2.5.187",
"Microsoft.VisualStudio.Threading": "17.10.48",
@@ -550,6 +603,37 @@
"System.IO.Pipelines": "8.0.0"
}
},
+ "Svg": {
+ "type": "Transitive",
+ "resolved": "3.0.84",
+ "contentHash": "QI35/+zRerIuOTBAw0GhbEQhuesSd3nYha9ibgyv6ofe4XRpFSjaXyQJJGssaUVZaBb2vwMAFKqb5uWnTAB2Sg==",
+ "dependencies": {
+ "Fizzler": "1.1.0",
+ "System.Drawing.Common": "4.5.1",
+ "System.ObjectModel": "4.3.0",
+ "runtime.osx.10.10-x64.CoreCompat.System.Drawing": "5.8.64"
+ }
+ },
+ "System.Collections": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Debug": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
"System.Diagnostics.DiagnosticSource": {
"type": "Transitive",
"resolved": "7.0.1",
@@ -557,15 +641,37 @@
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
- "resolved": "8.0.0",
- "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A=="
+ "resolved": "9.0.2",
+ "contentHash": "i+Fe6Fpst/onydFLBGilCr/Eh9OFdlaTU/c3alPp6IbLZXQJOgpIu3l4MOnmsN8fDYq5nAyHSqNIJesc74Yw3Q=="
},
"System.Drawing.Common": {
"type": "Transitive",
- "resolved": "9.0.2",
- "contentHash": "JU947wzf8JbBS16Y5EIZzAlyQU+k68D7LRx6y03s2wlhlvLqkt/8uPBrjv2hJnnaJKbdb0GhQ3JZsfYXhrRjyg==",
+ "resolved": "7.0.0",
+ "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.2"
+ "Microsoft.Win32.SystemEvents": "7.0.0"
+ }
+ },
+ "System.Globalization": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.IO": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
}
},
"System.IO.Pipelines": {
@@ -573,6 +679,30 @@
"resolved": "8.0.0",
"contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA=="
},
+ "System.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Reflection": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
"System.Reflection.Emit": {
"type": "Transitive",
"resolved": "4.7.0",
@@ -583,6 +713,37 @@
"resolved": "5.0.0",
"contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ=="
},
+ "System.Reflection.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Resources.ResourceManager": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Runtime": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
"System.Security.AccessControl": {
"type": "Transitive",
"resolved": "6.0.1",
@@ -593,6 +754,16 @@
"resolved": "5.0.0",
"contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
},
+ "System.Text.Encoding": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "7.0.0",
@@ -606,6 +777,25 @@
"System.Text.Encodings.Web": "7.0.0"
}
},
+ "System.Threading": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==",
+ "dependencies": {
+ "System.Runtime": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Threading.Tasks": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
"System.ValueTuple": {
"type": "Transitive",
"resolved": "4.5.0",
@@ -616,6 +806,11 @@
"resolved": "3.0.1.4",
"contentHash": "uQo97618y9yzLDxrnehPN+/tuiOlk5BqieEdwctHZOAS9miMXnHKgMFYVw8CSGXRglyTYXlrW7qtUlU7Fje5Ew=="
},
+ "WpfAnimatedGif": {
+ "type": "Transitive",
+ "resolved": "2.0.2",
+ "contentHash": "B0j9SqtThyHVTiOPvu6yR+39Te0g3o+7Jjb+qEm7+Iz1HRqbE5/4QV+ntHWOYYBPOUFr9x1mdzGl/EzWP+nKiA=="
+ },
"YamlDotNet": {
"type": "Transitive",
"resolved": "9.1.0",
@@ -625,12 +820,13 @@
"type": "Project",
"dependencies": {
"Droplex": "[1.7.0, )",
- "FSharp.Core": "[9.0.101, )",
+ "FSharp.Core": "[9.0.201, )",
"Flow.Launcher.Infrastructure": "[1.0.0, )",
- "Flow.Launcher.Plugin": "[4.4.0, )",
+ "Flow.Launcher.Plugin": "[4.7.0, )",
"Meziantou.Framework.Win32.Jobs": "[3.4.0, )",
"Microsoft.IO.RecyclableMemoryStream": "[3.0.1, )",
- "StreamJsonRpc": "[2.20.20, )",
+ "SemanticVersioning": "[3.0.0, )",
+ "StreamJsonRpc": "[2.21.10, )",
"squirrel.windows": "[1.5.2, )"
}
},
@@ -640,20 +836,21 @@
"Ben.Demystifier": "[0.4.1, )",
"BitFaster.Caching": "[2.5.3, )",
"CommunityToolkit.Mvvm": "[8.4.0, )",
- "Flow.Launcher.Plugin": "[4.4.0, )",
- "MemoryPack": "[1.21.3, )",
+ "Flow.Launcher.Plugin": "[4.7.0, )",
+ "InputSimulator": "[1.0.4, )",
+ "MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.12.19, )",
+ "NHotkey.Wpf": "[3.0.0, )",
"NLog": "[4.7.10, )",
- "PropertyChanged.Fody": "[3.4.0, )",
- "System.Drawing.Common": "[9.0.2, )",
+ "SharpVectors.Wpf": "[1.8.4.2, )",
+ "System.Drawing.Common": "[7.0.0, )",
"ToolGood.Words.Pinyin": "[3.0.1.4, )"
}
},
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2024.3.0, )",
- "PropertyChanged.Fody": "[3.4.0, )"
+ "JetBrains.Annotations": "[2024.3.0, )"
}
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index 2894c2159..afd0ddfe5 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -24,7 +24,7 @@ namespace Flow.Launcher.Plugin.Calculator
@"[ei]|[0-9]|0x[\da-fA-F]+|[\+\%\-\*\/\^\., ""]|[\(\)\|\!\[\]]" +
@")+$", RegexOptions.Compiled);
private static readonly Regex RegBrackets = new Regex(@"[\(\)\[\]]", RegexOptions.Compiled);
- private static readonly Regex ThousandGroupRegex = new Regex(@"\B(?=(\d{3})+(?!\d))");
+ private static readonly Regex ThousandGroupRegex = new Regex(@"\B(?=(\d{3})+(?!\d))", RegexOptions.Compiled);
private static readonly Regex NumberRegex = new Regex(@"[\d\.,]+", RegexOptions.Compiled);
private static Engine MagesEngine;
@@ -120,100 +120,108 @@ namespace Flow.Launcher.Plugin.Calculator
return new List();
}
-
+
///
/// Parses a string representation of a number, detecting its format. It uses structural analysis
- /// (checking for 3-digit groups) and falls back to system culture for ambiguous cases (e.g., "1,234").
+ /// and falls back to system culture for truly ambiguous cases (e.g., "1,234").
/// It populates the provided ParsingContext with the detected format for later use.
///
/// A normalized number string with '.' as the decimal separator for the Mages engine.
private string NormalizeNumber(string numberStr, ParsingContext context)
{
- var systemFormat = CultureInfo.CurrentCulture.NumberFormat;
- string systemDecimalSeparator = systemFormat.NumberDecimalSeparator;
+ var systemGroupSep = CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator;
+ int dotCount = numberStr.Count(f => f == '.');
+ int commaCount = numberStr.Count(f => f == ',');
- bool hasDot = numberStr.Contains(dot);
- bool hasComma = numberStr.Contains(comma);
-
- // Unambiguous case: both separators are present. The last one wins as decimal separator.
- if (hasDot && hasComma)
+ // Case 1: Unambiguous mixed separators (e.g., "1.234,56")
+ if (dotCount > 0 && commaCount > 0)
{
context.InputUsesGroupSeparators = true;
- int lastDotPos = numberStr.LastIndexOf(dot);
- int lastCommaPos = numberStr.LastIndexOf(comma);
-
- if (lastDotPos > lastCommaPos) // e.g. 1,234.56
+ if (numberStr.LastIndexOf('.') > numberStr.LastIndexOf(','))
{
context.InputDecimalSeparator = dot;
return numberStr.Replace(comma, string.Empty);
}
- else // e.g. 1.234,56
+ else
{
context.InputDecimalSeparator = comma;
return numberStr.Replace(dot, string.Empty).Replace(comma, dot);
}
}
- if (hasComma)
+ // Case 2: Only dots
+ if (dotCount > 0)
{
- string[] parts = numberStr.Split(',');
- // If all parts after the first are 3 digits, it's a potential group separator.
- bool isGroupCandidate = parts.Length > 1 && parts.Skip(1).All(p => p.Length == 3);
-
- if (isGroupCandidate)
+ if (dotCount > 1)
{
- // Ambiguous case: "1,234". Resolve using culture.
- if (systemDecimalSeparator == comma)
+ context.InputUsesGroupSeparators = true;
+ return numberStr.Replace(dot, string.Empty);
+ }
+ // A number is ambiguous if it has a single dot in the thousands position,
+ // and does not start with a "0." or "."
+ bool isAmbiguous = numberStr.Length - numberStr.LastIndexOf('.') == 4
+ && !numberStr.StartsWith("0.")
+ && !numberStr.StartsWith(".");
+ if (isAmbiguous)
+ {
+ if (systemGroupSep == dot)
{
- context.InputDecimalSeparator = comma;
- return numberStr.Replace(comma, dot);
+ context.InputUsesGroupSeparators = true;
+ return numberStr.Replace(dot, string.Empty);
}
else
+ {
+ context.InputDecimalSeparator = dot;
+ return numberStr;
+ }
+ }
+ else // Unambiguous decimal (e.g., "12.34" or "0.123" or ".123")
+ {
+ context.InputDecimalSeparator = dot;
+ return numberStr;
+ }
+ }
+
+ // Case 3: Only commas
+ if (commaCount > 0)
+ {
+ if (commaCount > 1)
+ {
+ context.InputUsesGroupSeparators = true;
+ return numberStr.Replace(comma, string.Empty);
+ }
+ // A number is ambiguous if it has a single comma in the thousands position,
+ // and does not start with a "0," or ","
+ bool isAmbiguous = numberStr.Length - numberStr.LastIndexOf(',') == 4
+ && !numberStr.StartsWith("0,")
+ && !numberStr.StartsWith(",");
+ if (isAmbiguous)
+ {
+ if (systemGroupSep == comma)
{
context.InputUsesGroupSeparators = true;
return numberStr.Replace(comma, string.Empty);
}
+ else
+ {
+ context.InputDecimalSeparator = comma;
+ return numberStr.Replace(comma, dot);
+ }
}
- else
+ else // Unambiguous decimal (e.g., "12,34" or "0,123" or ",123")
{
- // Unambiguous decimal: "123,45" or "1,2,345"
context.InputDecimalSeparator = comma;
return numberStr.Replace(comma, dot);
}
}
- if (hasDot)
- {
- string[] parts = numberStr.Split('.');
- bool isGroupCandidate = parts.Length > 1 && parts.Skip(1).All(p => p.Length == 3);
-
- if (isGroupCandidate)
- {
- if (systemDecimalSeparator == dot)
- {
- context.InputDecimalSeparator = dot;
- return numberStr;
- }
- else
- {
- context.InputUsesGroupSeparators = true;
- return numberStr.Replace(dot, string.Empty);
- }
- }
- else
- {
- context.InputDecimalSeparator = dot;
- return numberStr; // Already in Mages-compatible format
- }
- }
-
- // No separators.
+ // Case 4: No separators
return numberStr;
}
+
private string FormatResult(decimal roundedResult, ParsingContext context)
{
- // Use the detected decimal separator from the input; otherwise, fall back to settings.
string decimalSeparator = context.InputDecimalSeparator ?? GetDecimalSeparator();
string groupSeparator = decimalSeparator == dot ? comma : dot;
From cf40045acdc31740782c036e87d8593aaca681fd Mon Sep 17 00:00:00 2001
From: dcog989 <89043002+dcog989@users.noreply.github.com>
Date: Wed, 23 Jul 2025 04:34:54 +0100
Subject: [PATCH 1629/1798] Delete Flow.Launcher.Core/packages.lock.json
---
Flow.Launcher.Core/packages.lock.json | 260 --------------------------
1 file changed, 260 deletions(-)
delete mode 100644 Flow.Launcher.Core/packages.lock.json
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
deleted file mode 100644
index dec7bf0b4..000000000
--- a/Flow.Launcher.Core/packages.lock.json
+++ /dev/null
@@ -1,260 +0,0 @@
-{
- "version": 1,
- "dependencies": {
- "net9.0-windows7.0": {
- "Droplex": {
- "type": "Direct",
- "requested": "[1.7.0, )",
- "resolved": "1.7.0",
- "contentHash": "wutfIus/Ufw/9TDsp86R1ycnIH+wWrj4UhcmrzAHWjsdyC2iM07WEQ9+APTB7pQynsDnYH1r2i58XgAJ3lxUXA==",
- "dependencies": {
- "YamlDotNet": "9.1.0"
- }
- },
- "FSharp.Core": {
- "type": "Direct",
- "requested": "[9.0.201, )",
- "resolved": "9.0.201",
- "contentHash": "Ozq4T0ISTkqTYJ035XW/JkdDDaXofbykvfyVwkjLSqaDZ/4uNXfpf92cjcMI9lf9CxWqmlWHScViPh/4AvnWcw=="
- },
- "Meziantou.Framework.Win32.Jobs": {
- "type": "Direct",
- "requested": "[3.4.0, )",
- "resolved": "3.4.0",
- "contentHash": "5GGLckfpwoC1jznInEYfK2INrHyD7K1RtwZJ98kNPKBU6jeu24i4zfgDGHHfb+eK3J+eFPAxo0aYcbUxNXIbNw=="
- },
- "Microsoft.IO.RecyclableMemoryStream": {
- "type": "Direct",
- "requested": "[3.0.1, )",
- "resolved": "3.0.1",
- "contentHash": "s/s20YTVY9r9TPfTrN5g8zPF1YhwxyqO6PxUkrYTGI2B+OGPe9AdajWZrLhFqXIvqIW23fnUE4+ztrUWNU1+9g=="
- },
- "SemanticVersioning": {
- "type": "Direct",
- "requested": "[3.0.0, )",
- "resolved": "3.0.0",
- "contentHash": "RR+8GbPQ/gjDqov/1QN1OPoUlbUruNwcL3WjWCeLw+MY7+od/ENhnkYxCfAC6rQLIu3QifaJt3kPYyP3RumqMQ=="
- },
- "squirrel.windows": {
- "type": "Direct",
- "requested": "[1.5.2, )",
- "resolved": "1.5.2",
- "contentHash": "89Y/CFxWm7SEOjvuV2stVa8p+SNM9GOLk4tUNm2nUF792nfkimAgwRA/umVsdyd/OXBH8byXSh4V1qck88ZAyQ==",
- "dependencies": {
- "DeltaCompressionDotNet": "[1.0.0, 2.0.0)",
- "Mono.Cecil": "0.9.6.1",
- "Splat": "1.6.2"
- }
- },
- "StreamJsonRpc": {
- "type": "Direct",
- "requested": "[2.21.10, )",
- "resolved": "2.21.10",
- "contentHash": "wjBlFiaE+npUco9Jj4K11EEZfmAg4poRFYhcCJOiVdiHZ3UxapbGemtLNRcVYGXa/p8nqvZ38TfJPHnlrromDg==",
- "dependencies": {
- "MessagePack": "2.5.187",
- "Microsoft.VisualStudio.Threading": "17.10.48",
- "Microsoft.VisualStudio.Threading.Analyzers": "17.10.48",
- "Microsoft.VisualStudio.Validation": "17.8.8",
- "Nerdbank.Streams": "2.11.74",
- "Newtonsoft.Json": "13.0.1",
- "System.IO.Pipelines": "8.0.0"
- }
- },
- "Ben.Demystifier": {
- "type": "Transitive",
- "resolved": "0.4.1",
- "contentHash": "axFeEMfmEORy3ipAzOXG/lE+KcNptRbei3F0C4kQCdeiQtW+qJW90K5iIovITGrdLt8AjhNCwk5qLSX9/rFpoA==",
- "dependencies": {
- "System.Reflection.Metadata": "5.0.0"
- }
- },
- "BitFaster.Caching": {
- "type": "Transitive",
- "resolved": "2.5.3",
- "contentHash": "Vo/39qcam5Xe+DbyfH0JZyqPswdOoa7jv4PGtRJ6Wj8AU+aZ+TuJRlJcIe+MQjRTJwliI8k8VSQpN8sEoBIv2g=="
- },
- "CommunityToolkit.Mvvm": {
- "type": "Transitive",
- "resolved": "8.4.0",
- "contentHash": "tqVU8yc/ADO9oiTRyTnwhFN68hCwvkliMierptWOudIAvWY1mWCh5VFh+guwHJmpMwfg0J0rY+yyd5Oy7ty9Uw=="
- },
- "DeltaCompressionDotNet": {
- "type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "nwbZAYd+DblXAIzlnwDSnl0CiCm8jWLfHSYnoN4wYhtIav6AegB3+T/vKzLbU2IZlPB8Bvl8U3NXpx3eaz+N5w=="
- },
- "InputSimulator": {
- "type": "Transitive",
- "resolved": "1.0.4",
- "contentHash": "D0LvRCPQMX6/FJHBjng+RO+wRDuHTJrfo7IAc7rmkPvRqchdVGJWg3y70peOtDy3OLNK+HSOwVkH4GiuLnkKgA=="
- },
- "JetBrains.Annotations": {
- "type": "Transitive",
- "resolved": "2024.3.0",
- "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug=="
- },
- "MemoryPack": {
- "type": "Transitive",
- "resolved": "1.21.4",
- "contentHash": "wy3JTBNBsO8LfQcBvvYsWr3lm2Oakolrfu0UQ3oSJSEiD+7ye0GUhYTaXuYYBowqsXBXWD9gf2218ae0JRiYVQ==",
- "dependencies": {
- "MemoryPack.Core": "1.21.4",
- "MemoryPack.Generator": "1.21.4"
- }
- },
- "MemoryPack.Core": {
- "type": "Transitive",
- "resolved": "1.21.4",
- "contentHash": "6RszGorZ0ejNmp37ZcboPBMvvPCuNW2jlrdQfcs/lMzE5b3pmPF6hsm/laDc34hRlbAST1ZxaX/DvYu2DF5sBQ=="
- },
- "MemoryPack.Generator": {
- "type": "Transitive",
- "resolved": "1.21.4",
- "contentHash": "g14EsSS85yn0lHTi0J9ivqlZMf09A2iI51fmI+0KkzIzyCbWOBWPi5mdaY7YWmXprk12aYh9u/qfWHQUYthlwg=="
- },
- "MessagePack": {
- "type": "Transitive",
- "resolved": "2.5.187",
- "contentHash": "uW4j8m4Nc+2Mk5n6arOChavJ9bLjkis0qWASOj2h2OwmfINuzYv+mjCHUymrYhmyyKTu3N+ObtTXAY4uQ7jIhg==",
- "dependencies": {
- "MessagePack.Annotations": "2.5.187",
- "Microsoft.NET.StringTools": "17.6.3"
- }
- },
- "MessagePack.Annotations": {
- "type": "Transitive",
- "resolved": "2.5.187",
- "contentHash": "/IvvMMS8opvlHjEJ/fR2Cal4Co726Kj77Z8KiohFhuHfLHHmb9uUxW5+tSCL4ToKFfkQlrS3HD638mRq83ySqA=="
- },
- "Microsoft.NET.StringTools": {
- "type": "Transitive",
- "resolved": "17.6.3",
- "contentHash": "N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA=="
- },
- "Microsoft.VisualStudio.Threading": {
- "type": "Transitive",
- "resolved": "17.12.19",
- "contentHash": "eLiGMkMYyaSguqHs3lsrFxy3tAWSLuPEL2pIWRcADMDVAs2xqm3dr1d9QYjiEusTgiClF9KD6OB2NdZP72Oy0Q==",
- "dependencies": {
- "Microsoft.VisualStudio.Threading.Analyzers": "17.12.19",
- "Microsoft.VisualStudio.Validation": "17.8.8"
- }
- },
- "Microsoft.VisualStudio.Threading.Analyzers": {
- "type": "Transitive",
- "resolved": "17.12.19",
- "contentHash": "v3IYeedjoktvZ+GqYmLudxZJngmf/YWIxNT2Uy6QMMN19cvw+nkWoip1Gr1RtnFkUo1MPUVMis4C8Kj8d8DpSQ=="
- },
- "Microsoft.VisualStudio.Validation": {
- "type": "Transitive",
- "resolved": "17.8.8",
- "contentHash": "rWXThIpyQd4YIXghNkiv2+VLvzS+MCMKVRDR0GAMlflsdo+YcAN2g2r5U1Ah98OFjQMRexTFtXQQ2LkajxZi3g=="
- },
- "Microsoft.Win32.SystemEvents": {
- "type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
- },
- "Mono.Cecil": {
- "type": "Transitive",
- "resolved": "0.9.6.1",
- "contentHash": "yMsurNaOxxKIjyW9pEB+tRrR1S3DFnN1+iBgKvYvXG8kW0Y6yknJeMAe/tl3+P78/2C6304TgF7aVqpqXgEQ9Q=="
- },
- "Nerdbank.Streams": {
- "type": "Transitive",
- "resolved": "2.11.74",
- "contentHash": "r4G7uHHfoo8LCilPOdtf2C+Q5ymHOAXtciT4ZtB2xRlAvv4gPkWBYNAijFblStv3+uidp81j5DP11jMZl4BfJw==",
- "dependencies": {
- "Microsoft.VisualStudio.Threading": "17.10.48",
- "Microsoft.VisualStudio.Validation": "17.8.8",
- "System.IO.Pipelines": "8.0.0"
- }
- },
- "Newtonsoft.Json": {
- "type": "Transitive",
- "resolved": "13.0.1",
- "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
- },
- "NHotkey": {
- "type": "Transitive",
- "resolved": "3.0.0",
- "contentHash": "IEghs0QqWsQYH0uUmvIl0Ye6RaebWRh38eB6ToOkDnQucTYRGFOgtig0gSxlwCszTilYFz3n1ZuY762x+kDR3A=="
- },
- "NHotkey.Wpf": {
- "type": "Transitive",
- "resolved": "3.0.0",
- "contentHash": "BIUKlhTG5KtFf9OQzWvkmVmktt5/FFj6AOEgag8Uf0R2YdZt5ajUzs3sVskcJcT2TztWlEHKQr1jFj3KQ0D9Nw==",
- "dependencies": {
- "NHotkey": "3.0.0"
- }
- },
- "NLog": {
- "type": "Transitive",
- "resolved": "4.7.10",
- "contentHash": "rcegW7kYOCjl7wX0SzsqpPBqnJ51JKi1WkYb6QBVX0Wc5IgH19Pv4t/co+T0s06OS0Ne44xgkY/mHg0PdrmJow=="
- },
- "SharpVectors.Wpf": {
- "type": "Transitive",
- "resolved": "1.8.4.2",
- "contentHash": "PNxLkMBJnV8A+6yH9OqOlhLJegvWP/dvh0rAJp2l0kcrR+rB4R2tQ9vhUqka+UilH4atN8T6zvjDOizVyfz2Ng=="
- },
- "Splat": {
- "type": "Transitive",
- "resolved": "1.6.2",
- "contentHash": "DeH0MxPU+D4JchkIDPYG4vUT+hsWs9S41cFle0/4K5EJMXWurx5DzAkj2366DfK14/XKNhsu6tCl4dZXJ3CD4w=="
- },
- "System.Drawing.Common": {
- "type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
- "dependencies": {
- "Microsoft.Win32.SystemEvents": "7.0.0"
- }
- },
- "System.IO.Pipelines": {
- "type": "Transitive",
- "resolved": "8.0.0",
- "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA=="
- },
- "System.Reflection.Metadata": {
- "type": "Transitive",
- "resolved": "5.0.0",
- "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ=="
- },
- "ToolGood.Words.Pinyin": {
- "type": "Transitive",
- "resolved": "3.0.1.4",
- "contentHash": "uQo97618y9yzLDxrnehPN+/tuiOlk5BqieEdwctHZOAS9miMXnHKgMFYVw8CSGXRglyTYXlrW7qtUlU7Fje5Ew=="
- },
- "YamlDotNet": {
- "type": "Transitive",
- "resolved": "9.1.0",
- "contentHash": "fuvGXU4Ec5HrsmEc+BiFTNPCRf1cGBI2kh/3RzMWgddM2M4ALhbSPoI3X3mhXZUD1qqQd9oSkFAtWjpz8z9eRg=="
- },
- "flow.launcher.infrastructure": {
- "type": "Project",
- "dependencies": {
- "Ben.Demystifier": "[0.4.1, )",
- "BitFaster.Caching": "[2.5.3, )",
- "CommunityToolkit.Mvvm": "[8.4.0, )",
- "Flow.Launcher.Plugin": "[4.7.0, )",
- "InputSimulator": "[1.0.4, )",
- "MemoryPack": "[1.21.4, )",
- "Microsoft.VisualStudio.Threading": "[17.12.19, )",
- "NHotkey.Wpf": "[3.0.0, )",
- "NLog": "[4.7.10, )",
- "SharpVectors.Wpf": "[1.8.4.2, )",
- "System.Drawing.Common": "[7.0.0, )",
- "ToolGood.Words.Pinyin": "[3.0.1.4, )"
- }
- },
- "flow.launcher.plugin": {
- "type": "Project",
- "dependencies": {
- "JetBrains.Annotations": "[2024.3.0, )"
- }
- }
- }
- }
-}
\ No newline at end of file
From 1fed54b615d7f1fb2a475801cd559157b3434769 Mon Sep 17 00:00:00 2001
From: dcog989 <89043002+dcog989@users.noreply.github.com>
Date: Wed, 23 Jul 2025 04:35:18 +0100
Subject: [PATCH 1630/1798] Delete Flow.Launcher.Plugin/packages.lock.json
---
Flow.Launcher.Plugin/packages.lock.json | 77 -------------------------
1 file changed, 77 deletions(-)
delete mode 100644 Flow.Launcher.Plugin/packages.lock.json
diff --git a/Flow.Launcher.Plugin/packages.lock.json b/Flow.Launcher.Plugin/packages.lock.json
deleted file mode 100644
index aad21a318..000000000
--- a/Flow.Launcher.Plugin/packages.lock.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
- "version": 1,
- "dependencies": {
- "net9.0-windows7.0": {
- "Fody": {
- "type": "Direct",
- "requested": "[6.5.5, )",
- "resolved": "6.5.5",
- "contentHash": "Krca41L/PDva1VsmDec5n52cQZxQAQp/bsHdzsNi8iLLI0lqKL94fNIkNaC8tVolUkCyWsbzvxfxJCeD2789fA=="
- },
- "JetBrains.Annotations": {
- "type": "Direct",
- "requested": "[2024.3.0, )",
- "resolved": "2024.3.0",
- "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug=="
- },
- "Microsoft.SourceLink.GitHub": {
- "type": "Direct",
- "requested": "[1.1.1, )",
- "resolved": "1.1.1",
- "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==",
- "dependencies": {
- "Microsoft.Build.Tasks.Git": "1.1.1",
- "Microsoft.SourceLink.Common": "1.1.1"
- }
- },
- "Microsoft.Windows.CsWin32": {
- "type": "Direct",
- "requested": "[0.3.106, )",
- "resolved": "0.3.106",
- "contentHash": "Mx5fK7uN6fwLR4wUghs6//HonAnwPBNmC2oonyJVhCUlHS/r6SUS3NkBc3+gaQiv+0/9bqdj1oSCKQFkNI+21Q==",
- "dependencies": {
- "Microsoft.Windows.SDK.Win32Docs": "0.1.42-alpha",
- "Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview",
- "Microsoft.Windows.WDK.Win32Metadata": "0.11.4-experimental"
- }
- },
- "PropertyChanged.Fody": {
- "type": "Direct",
- "requested": "[3.4.0, )",
- "resolved": "3.4.0",
- "contentHash": "IAZyq0uolKo2WYm4mjx+q7A8fSGFT0x2e1s3y+ODn4JI0kqTDoo9GF2tdaypUzRFJZfdMxfC5HZW9QzdJLtOnA==",
- "dependencies": {
- "Fody": "6.5.1"
- }
- },
- "Microsoft.Build.Tasks.Git": {
- "type": "Transitive",
- "resolved": "1.1.1",
- "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q=="
- },
- "Microsoft.SourceLink.Common": {
- "type": "Transitive",
- "resolved": "1.1.1",
- "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg=="
- },
- "Microsoft.Windows.SDK.Win32Docs": {
- "type": "Transitive",
- "resolved": "0.1.42-alpha",
- "contentHash": "Z/9po23gUA9aoukirh2ItMU2ZS9++Js9Gdds9fu5yuMojDrmArvY2y+tq9985tR3cxFxpZO1O35Wjfo0khj5HA=="
- },
- "Microsoft.Windows.SDK.Win32Metadata": {
- "type": "Transitive",
- "resolved": "60.0.34-preview",
- "contentHash": "TA3DUNi4CTeo+ItTXBnGZFt2159XOGSl0UOlG5vjDj4WHqZjhwYyyUnzOtrbCERiSaP2Hzg7otJNWwOSZgutyA=="
- },
- "Microsoft.Windows.WDK.Win32Metadata": {
- "type": "Transitive",
- "resolved": "0.11.4-experimental",
- "contentHash": "bf5MCmUyZf0gBlYQjx9UpRAZWBkRndyt9XicR+UNLvAUAFTZQbu6YaX/sNKZlR98Grn0gydfh/yT4I3vc0AIQA==",
- "dependencies": {
- "Microsoft.Windows.SDK.Win32Metadata": "60.0.34-preview"
- }
- }
- }
- }
-}
\ No newline at end of file
From 16603697a569620e568c42dffbd2957bce6890d0 Mon Sep 17 00:00:00 2001
From: Kevin Zhang <45326534+taooceros@users.noreply.github.com>
Date: Tue, 22 Jul 2025 22:48:19 -0500
Subject: [PATCH 1631/1798] Add Srpski (Cyrillic)
---
Flow.Launcher.Core/Resource/AvailableLanguages.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Resource/AvailableLanguages.cs b/Flow.Launcher.Core/Resource/AvailableLanguages.cs
index ecaecf646..3919e2227 100644
--- a/Flow.Launcher.Core/Resource/AvailableLanguages.cs
+++ b/Flow.Launcher.Core/Resource/AvailableLanguages.cs
@@ -17,6 +17,7 @@ namespace Flow.Launcher.Core.Resource
public static Language German = new Language("de", "Deutsch");
public static Language Korean = new Language("ko", "한국어");
public static Language Serbian = new Language("sr", "Srpski");
+ public static Language Serbian_Cyrillic = new Language("sr-Cyrl-RS", "Српска");
public static Language Portuguese_Portugal = new Language("pt-pt", "Português");
public static Language Portuguese_Brazil = new Language("pt-br", "Português (Brasil)");
public static Language Spanish = new Language("es", "Spanish");
@@ -47,6 +48,7 @@ namespace Flow.Launcher.Core.Resource
German,
Korean,
Serbian,
+ Serbian_Cyrillic,
Portuguese_Portugal,
Portuguese_Brazil,
Spanish,
@@ -79,7 +81,8 @@ namespace Flow.Launcher.Core.Resource
"da" => "System",
"de" => "System",
"ko" => "시스템",
- "sr" => "Систем",
+ "sr" => "Srpski",
+ "sr-Cyrl-RS" => "Систем",
"pt-pt" => "Sistema",
"pt-br" => "Sistema",
"es" => "Sistema",
From e63941275e539fd5dd2044c9e9bb93915dda0392 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Jul 2025 13:27:36 +0800
Subject: [PATCH 1632/1798] Upgrade MonitorInfo class
---
Flow.Launcher.Infrastructure/MonitorInfo.cs | 91 ++++++++++++++++---
.../NativeMethods.txt | 4 +-
Flow.Launcher.Infrastructure/Win32Helper.cs | 4 +-
3 files changed, 81 insertions(+), 18 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/MonitorInfo.cs b/Flow.Launcher.Infrastructure/MonitorInfo.cs
index 3221708c1..53617f7e9 100644
--- a/Flow.Launcher.Infrastructure/MonitorInfo.cs
+++ b/Flow.Launcher.Infrastructure/MonitorInfo.cs
@@ -1,5 +1,5 @@
-using System.Collections.Generic;
-using System;
+using System;
+using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows;
using Windows.Win32;
@@ -11,9 +11,12 @@ namespace Flow.Launcher.Infrastructure;
///
/// Contains full information about a display monitor.
-/// Codes are edited from: .
+/// Inspired from: https://github.com/Jack251970/DesktopWidgets3.
///
-internal class MonitorInfo
+///
+/// Use this class to replace the System.Windows.Forms.Screen class which can cause possible System.PlatformNotSupportedException.
+///
+public class MonitorInfo
{
///
/// Gets the display monitors (including invisible pseudo-monitors associated with the mirroring drivers).
@@ -23,14 +26,14 @@ internal class MonitorInfo
{
var monitorCount = PInvoke.GetSystemMetrics(SYSTEM_METRICS_INDEX.SM_CMONITORS);
var list = new List(monitorCount);
- var callback = new MONITORENUMPROC((HMONITOR monitor, HDC deviceContext, RECT* rect, LPARAM data) =>
+ var callback = new MONITORENUMPROC((monitor, deviceContext, rect, data) =>
{
list.Add(new MonitorInfo(monitor, rect));
return true;
});
var dwData = new LPARAM();
var hdc = new HDC();
- bool ok = PInvoke.EnumDisplayMonitors(hdc, (RECT?)null, callback, dwData);
+ bool ok = PInvoke.EnumDisplayMonitors(hdc, null, callback, dwData);
if (!ok)
{
Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
@@ -43,11 +46,11 @@ internal class MonitorInfo
///
/// Window handle
/// The display monitor that is nearest to a given window, or null if no monitor is found.
- public static unsafe MonitorInfo GetNearestDisplayMonitor(HWND hwnd)
+ public static unsafe MonitorInfo GetNearestDisplayMonitor(nint hwnd)
{
- var nearestMonitor = PInvoke.MonitorFromWindow(hwnd, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST);
+ var nearestMonitor = PInvoke.MonitorFromWindow(new(hwnd), MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST);
MonitorInfo nearestMonitorInfo = null;
- var callback = new MONITORENUMPROC((HMONITOR monitor, HDC deviceContext, RECT* rect, LPARAM data) =>
+ var callback = new MONITORENUMPROC((monitor, deviceContext, rect, data) =>
{
if (monitor == nearestMonitor)
{
@@ -58,7 +61,7 @@ internal class MonitorInfo
});
var dwData = new LPARAM();
var hdc = new HDC();
- bool ok = PInvoke.EnumDisplayMonitors(hdc, (RECT?)null, callback, dwData);
+ bool ok = PInvoke.EnumDisplayMonitors(hdc, null, callback, dwData);
if (!ok)
{
Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
@@ -66,17 +69,75 @@ internal class MonitorInfo
return nearestMonitorInfo;
}
+ ///
+ /// Gets the primary display monitor (the one that contains the taskbar).
+ ///
+ /// The primary display monitor, or null if no monitor is found.
+ public static unsafe MonitorInfo GetPrimaryDisplayMonitor()
+ {
+ var primaryMonitor = PInvoke.MonitorFromWindow(new HWND(IntPtr.Zero), MONITOR_FROM_FLAGS.MONITOR_DEFAULTTOPRIMARY);
+ MonitorInfo primaryMonitorInfo = null;
+ var callback = new MONITORENUMPROC((monitor, deviceContext, rect, data) =>
+ {
+ if (monitor == primaryMonitor)
+ {
+ primaryMonitorInfo = new MonitorInfo(monitor, rect);
+ return false;
+ }
+ return true;
+ });
+ var dwData = new LPARAM();
+ var hdc = new HDC();
+ bool ok = PInvoke.EnumDisplayMonitors(hdc, null, callback, dwData);
+ if (!ok)
+ {
+ Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
+ }
+ return primaryMonitorInfo;
+ }
+
+ ///
+ /// Gets the display monitor that contains the cursor.
+ ///
+ /// The display monitor that contains the cursor, or null if no monitor is found.
+ public static unsafe MonitorInfo GetCursorDisplayMonitor()
+ {
+ if (!PInvoke.GetCursorPos(out var pt))
+ {
+ Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
+ }
+ var cursorMonitor = PInvoke.MonitorFromPoint(pt, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST);
+ MonitorInfo cursorMonitorInfo = null;
+ var callback = new MONITORENUMPROC((monitor, deviceContext, rect, data) =>
+ {
+ if (monitor == cursorMonitor)
+ {
+ cursorMonitorInfo = new MonitorInfo(monitor, rect);
+ return false;
+ }
+ return true;
+ });
+ var dwData = new LPARAM();
+ var hdc = new HDC();
+ bool ok = PInvoke.EnumDisplayMonitors(hdc, null, callback, dwData);
+ if (!ok)
+ {
+ Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
+ }
+ return cursorMonitorInfo;
+ }
+
private readonly HMONITOR _monitor;
internal unsafe MonitorInfo(HMONITOR monitor, RECT* rect)
{
- RectMonitor =
+ Bounds =
new Rect(new Point(rect->left, rect->top),
new Point(rect->right, rect->bottom));
_monitor = monitor;
var info = new MONITORINFOEXW() { monitorInfo = new MONITORINFO() { cbSize = (uint)sizeof(MONITORINFOEXW) } };
GetMonitorInfo(monitor, ref info);
- RectWork =
+ WorkingArea =
new Rect(new Point(info.monitorInfo.rcWork.left, info.monitorInfo.rcWork.top),
new Point(info.monitorInfo.rcWork.right, info.monitorInfo.rcWork.bottom));
Name = new string(info.szDevice.AsSpan()).Replace("\0", "").Trim();
@@ -93,7 +154,7 @@ internal class MonitorInfo
///
/// If the monitor is not the primary display monitor, some of the rectangle's coordinates may be negative values.
///
- public Rect RectMonitor { get; }
+ public Rect Bounds { get; }
///
/// Gets the work area rectangle of the display monitor, expressed in virtual-screen coordinates.
@@ -101,7 +162,7 @@ internal class MonitorInfo
///
/// If the monitor is not the primary display monitor, some of the rectangle's coordinates may be negative values.
///
- public Rect RectWork { get; }
+ public Rect WorkingArea { get; }
///
/// Gets if the monitor is the the primary display monitor.
@@ -109,7 +170,7 @@ internal class MonitorInfo
public bool IsPrimary => _monitor == PInvoke.MonitorFromWindow(new(IntPtr.Zero), MONITOR_FROM_FLAGS.MONITOR_DEFAULTTOPRIMARY);
///
- public override string ToString() => $"{Name} {RectMonitor.Width}x{RectMonitor.Height}";
+ public override string ToString() => $"{Name} {Bounds.Width}x{Bounds.Height}";
private static unsafe bool GetMonitorInfo(HMONITOR hMonitor, ref MONITORINFOEXW lpmi)
{
diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt
index 965ab6caa..2054bc2c0 100644
--- a/Flow.Launcher.Infrastructure/NativeMethods.txt
+++ b/Flow.Launcher.Infrastructure/NativeMethods.txt
@@ -39,6 +39,8 @@ EnumDisplayMonitors
MonitorFromWindow
GetMonitorInfo
MONITORINFOEXW
+GetCursorPos
+MonitorFromPoint
WM_ENTERSIZEMOVE
WM_EXITSIZEMOVE
@@ -89,4 +91,4 @@ WM_GETTEXT
OpenProcess
QueryFullProcessImageName
EVENT_OBJECT_HIDE
-EVENT_SYSTEM_DIALOGEND
+EVENT_SYSTEM_DIALOGEND
\ No newline at end of file
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 5770bbf12..84880d68c 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -293,8 +293,8 @@ namespace Flow.Launcher.Infrastructure
}
var monitorInfo = MonitorInfo.GetNearestDisplayMonitor(hWnd);
- return (appBounds.bottom - appBounds.top) == monitorInfo.RectMonitor.Height &&
- (appBounds.right - appBounds.left) == monitorInfo.RectMonitor.Width;
+ return (appBounds.bottom - appBounds.top) == monitorInfo.Bounds.Height &&
+ (appBounds.right - appBounds.left) == monitorInfo.Bounds.Width;
}
#endregion
From 527c27f67556cc735dd850bf78b93e19070f72f6 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Jul 2025 13:28:50 +0800
Subject: [PATCH 1633/1798] Remove System.Windows.Forms.Screen reference
---
Flow.Launcher/MainWindow.xaml.cs | 41 +++++++++----------
Flow.Launcher/Msg.xaml.cs | 3 +-
Flow.Launcher/MsgWithButton.xaml.cs | 3 +-
.../SettingsPaneGeneralViewModel.cs | 6 +--
Flow.Launcher/SettingWindow.xaml.cs | 7 ++--
5 files changed, 28 insertions(+), 32 deletions(-)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 2ddce8190..429a4aece 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.ComponentModel;
using System.Linq;
using System.Media;
@@ -30,7 +30,6 @@ using DataObject = System.Windows.DataObject;
using Key = System.Windows.Input.Key;
using MouseButtons = System.Windows.Forms.MouseButtons;
using NotifyIcon = System.Windows.Forms.NotifyIcon;
-using Screen = System.Windows.Forms.Screen;
namespace Flow.Launcher
{
@@ -532,7 +531,7 @@ namespace Flow.Launcher
double yRatio = mousePos.Y / maxHeight;
// Current monitor information
- var screen = Screen.FromHandle(new WindowInteropHelper(this).Handle);
+ var screen = MonitorInfo.GetNearestDisplayMonitor(new WindowInteropHelper(this).Handle);
var workingArea = screen.WorkingArea;
var screenLeftTop = Win32Helper.TransformPixelsToDIP(this, workingArea.X, workingArea.Y);
@@ -954,36 +953,36 @@ namespace Flow.Launcher
}
}
- private Screen SelectedScreen()
+ private MonitorInfo SelectedScreen()
{
- Screen screen;
+ MonitorInfo screen;
switch (_settings.SearchWindowScreen)
{
case SearchWindowScreens.Cursor:
- screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
- break;
- case SearchWindowScreens.Primary:
- screen = Screen.PrimaryScreen;
+ screen = MonitorInfo.GetCursorDisplayMonitor();
break;
case SearchWindowScreens.Focus:
- var foregroundWindowHandle = Win32Helper.GetForegroundWindow();
- screen = Screen.FromHandle(foregroundWindowHandle);
+ screen = MonitorInfo.GetNearestDisplayMonitor(Win32Helper.GetForegroundWindow());
+ break;
+ case SearchWindowScreens.Primary:
+ screen = MonitorInfo.GetPrimaryDisplayMonitor();
break;
case SearchWindowScreens.Custom:
- if (_settings.CustomScreenNumber <= Screen.AllScreens.Length)
- screen = Screen.AllScreens[_settings.CustomScreenNumber - 1];
+ var allScreens = MonitorInfo.GetDisplayMonitors();
+ if (_settings.CustomScreenNumber <= allScreens.Count)
+ screen = allScreens[_settings.CustomScreenNumber - 1];
else
- screen = Screen.AllScreens[0];
+ screen = allScreens[0];
break;
default:
- screen = Screen.AllScreens[0];
+ screen = MonitorInfo.GetDisplayMonitors()[0];
break;
}
- return screen ?? Screen.AllScreens[0];
+ return screen ?? MonitorInfo.GetDisplayMonitors()[0];
}
- private double HorizonCenter(Screen screen)
+ private double HorizonCenter(MonitorInfo screen)
{
var dip1 = Win32Helper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
var dip2 = Win32Helper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
@@ -991,7 +990,7 @@ namespace Flow.Launcher
return left;
}
- private double VerticalCenter(Screen screen)
+ private double VerticalCenter(MonitorInfo screen)
{
var dip1 = Win32Helper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
var dip2 = Win32Helper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height);
@@ -999,7 +998,7 @@ namespace Flow.Launcher
return top;
}
- private double HorizonRight(Screen screen)
+ private double HorizonRight(MonitorInfo screen)
{
var dip1 = Win32Helper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
var dip2 = Win32Helper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
@@ -1007,14 +1006,14 @@ namespace Flow.Launcher
return left;
}
- private double HorizonLeft(Screen screen)
+ private double HorizonLeft(MonitorInfo screen)
{
var dip1 = Win32Helper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
var left = dip1.X + 10;
return left;
}
- public double VerticalTop(Screen screen)
+ private double VerticalTop(MonitorInfo screen)
{
var dip1 = Win32Helper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
var top = dip1.Y + 10;
diff --git a/Flow.Launcher/Msg.xaml.cs b/Flow.Launcher/Msg.xaml.cs
index 923c3692f..6063e489c 100644
--- a/Flow.Launcher/Msg.xaml.cs
+++ b/Flow.Launcher/Msg.xaml.cs
@@ -1,7 +1,6 @@
using System;
using System.IO;
using System.Windows;
-using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media.Animation;
using Flow.Launcher.Infrastructure;
@@ -16,7 +15,7 @@ namespace Flow.Launcher
public Msg()
{
InitializeComponent();
- var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ var screen = MonitorInfo.GetCursorDisplayMonitor();
var dipWorkingArea = Win32Helper.TransformPixelsToDIP(this,
screen.WorkingArea.Width,
screen.WorkingArea.Height);
diff --git a/Flow.Launcher/MsgWithButton.xaml.cs b/Flow.Launcher/MsgWithButton.xaml.cs
index 8ccd19c46..89149c2d4 100644
--- a/Flow.Launcher/MsgWithButton.xaml.cs
+++ b/Flow.Launcher/MsgWithButton.xaml.cs
@@ -1,7 +1,6 @@
using System;
using System.IO;
using System.Windows;
-using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media.Animation;
using Flow.Launcher.Infrastructure;
@@ -16,7 +15,7 @@ namespace Flow.Launcher
public MsgWithButton()
{
InitializeComponent();
- var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ var screen = MonitorInfo.GetCursorDisplayMonitor();
var dipWorkingArea = Win32Helper.TransformPixelsToDIP(this,
screen.WorkingArea.Width,
screen.WorkingArea.Height);
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
index 21444ccee..5057ebb44 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
@@ -111,9 +111,9 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
{
get
{
- var screens = Screen.AllScreens;
+ var screens = MonitorInfo.GetDisplayMonitors();
var screenNumbers = new List();
- for (int i = 1; i <= screens.Length; i++)
+ for (int i = 1; i <= screens.Count; i++)
{
screenNumbers.Add(i);
}
diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs
index c1c0f96a7..b4f6bcf69 100644
--- a/Flow.Launcher/SettingWindow.xaml.cs
+++ b/Flow.Launcher/SettingWindow.xaml.cs
@@ -10,7 +10,6 @@ using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.SettingPages.Views;
using Flow.Launcher.ViewModel;
using ModernWpf.Controls;
-using Screen = System.Windows.Forms.Screen;
namespace Flow.Launcher;
@@ -202,7 +201,7 @@ public partial class SettingWindow
private static bool IsPositionValid(double top, double left)
{
- foreach (var screen in Screen.AllScreens)
+ foreach (var screen in MonitorInfo.GetDisplayMonitors())
{
var workingArea = screen.WorkingArea;
@@ -217,7 +216,7 @@ public partial class SettingWindow
private double WindowLeft()
{
- var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ var screen = MonitorInfo.GetCursorDisplayMonitor();
var dip1 = Win32Helper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
var dip2 = Win32Helper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
var left = (dip2.X - ActualWidth) / 2 + dip1.X;
@@ -226,7 +225,7 @@ public partial class SettingWindow
private double WindowTop()
{
- var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ var screen = MonitorInfo.GetCursorDisplayMonitor();
var dip1 = Win32Helper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
var dip2 = Win32Helper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height);
var top = (dip2.Y - ActualHeight) / 2 + dip1.Y - 20;
From 1946afbfe8152eb5d130a70f236d257cc9f88789 Mon Sep 17 00:00:00 2001
From: Jack Ye <1160210343@qq.com>
Date: Wed, 23 Jul 2025 13:33:22 +0800
Subject: [PATCH 1634/1798] Fix typos
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
---
Flow.Launcher.Infrastructure/MonitorInfo.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Infrastructure/MonitorInfo.cs b/Flow.Launcher.Infrastructure/MonitorInfo.cs
index 53617f7e9..9a62fc0f4 100644
--- a/Flow.Launcher.Infrastructure/MonitorInfo.cs
+++ b/Flow.Launcher.Infrastructure/MonitorInfo.cs
@@ -165,7 +165,7 @@ public class MonitorInfo
public Rect WorkingArea { get; }
///
- /// Gets if the monitor is the the primary display monitor.
+ /// Gets if the monitor is the primary display monitor.
///
public bool IsPrimary => _monitor == PInvoke.MonitorFromWindow(new(IntPtr.Zero), MONITOR_FROM_FLAGS.MONITOR_DEFAULTTOPRIMARY);
From cbbd09b8a500e7a7c14575c51f45acaf290958a0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Jul 2025 13:41:01 +0800
Subject: [PATCH 1635/1798] Add cursor info class
---
Flow.Launcher.Infrastructure/CursorInfo.cs | 26 +++++++++++++++++++++
Flow.Launcher.Infrastructure/MonitorInfo.cs | 6 +----
2 files changed, 27 insertions(+), 5 deletions(-)
create mode 100644 Flow.Launcher.Infrastructure/CursorInfo.cs
diff --git a/Flow.Launcher.Infrastructure/CursorInfo.cs b/Flow.Launcher.Infrastructure/CursorInfo.cs
new file mode 100644
index 000000000..046dc4ba9
--- /dev/null
+++ b/Flow.Launcher.Infrastructure/CursorInfo.cs
@@ -0,0 +1,26 @@
+using System.Drawing;
+using System.Runtime.InteropServices;
+using Windows.Win32;
+
+namespace Flow.Launcher.Infrastructure;
+
+///
+/// Contains full information about a cursor.
+///
+///
+/// Use this class to replace the System.Windows.Forms.Cursor class which can cause possible System.PlatformNotSupportedException.
+///
+public class CursorInfo
+{
+ public static Point Position
+ {
+ get
+ {
+ if (!PInvoke.GetCursorPos(out var pt))
+ {
+ Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
+ }
+ return pt;
+ }
+ }
+}
diff --git a/Flow.Launcher.Infrastructure/MonitorInfo.cs b/Flow.Launcher.Infrastructure/MonitorInfo.cs
index 9a62fc0f4..a87aab7d8 100644
--- a/Flow.Launcher.Infrastructure/MonitorInfo.cs
+++ b/Flow.Launcher.Infrastructure/MonitorInfo.cs
@@ -102,11 +102,7 @@ public class MonitorInfo
/// The display monitor that contains the cursor, or null if no monitor is found.
public static unsafe MonitorInfo GetCursorDisplayMonitor()
{
- if (!PInvoke.GetCursorPos(out var pt))
- {
- Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
- }
- var cursorMonitor = PInvoke.MonitorFromPoint(pt, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST);
+ var cursorMonitor = PInvoke.MonitorFromPoint(CursorInfo.Position, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST);
MonitorInfo cursorMonitorInfo = null;
var callback = new MONITORENUMPROC((monitor, deviceContext, rect, data) =>
{
From 4f423c47cdf6568e7e0fa2eff6e8a89bcdcabf37 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Jul 2025 13:44:31 +0800
Subject: [PATCH 1636/1798] Allow all projects to access MonitorInfo &
CursorInfo
---
Flow.Launcher.Infrastructure/NativeMethods.txt | 8 --------
Flow.Launcher.Plugin/NativeMethods.txt | 10 +++++++++-
.../SharedModels}/CursorInfo.cs | 5 ++++-
.../SharedModels}/MonitorInfo.cs | 6 +++---
4 files changed, 16 insertions(+), 13 deletions(-)
rename {Flow.Launcher.Infrastructure => Flow.Launcher.Plugin/SharedModels}/CursorInfo.cs (79%)
rename {Flow.Launcher.Infrastructure => Flow.Launcher.Plugin/SharedModels}/MonitorInfo.cs (97%)
diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt
index 2054bc2c0..e87004251 100644
--- a/Flow.Launcher.Infrastructure/NativeMethods.txt
+++ b/Flow.Launcher.Infrastructure/NativeMethods.txt
@@ -34,14 +34,6 @@ WINDOW_STYLE
SetLastError
WINDOW_EX_STYLE
-GetSystemMetrics
-EnumDisplayMonitors
-MonitorFromWindow
-GetMonitorInfo
-MONITORINFOEXW
-GetCursorPos
-MonitorFromPoint
-
WM_ENTERSIZEMOVE
WM_EXITSIZEMOVE
WM_NCLBUTTONDBLCLK
diff --git a/Flow.Launcher.Plugin/NativeMethods.txt b/Flow.Launcher.Plugin/NativeMethods.txt
index 0596691cc..901695a8b 100644
--- a/Flow.Launcher.Plugin/NativeMethods.txt
+++ b/Flow.Launcher.Plugin/NativeMethods.txt
@@ -5,4 +5,12 @@ GetWindowTextLength
WM_KEYDOWN
WM_KEYUP
WM_SYSKEYDOWN
-WM_SYSKEYUP
\ No newline at end of file
+WM_SYSKEYUP
+
+GetSystemMetrics
+EnumDisplayMonitors
+MonitorFromWindow
+GetMonitorInfo
+MONITORINFOEXW
+GetCursorPos
+MonitorFromPoint
\ No newline at end of file
diff --git a/Flow.Launcher.Infrastructure/CursorInfo.cs b/Flow.Launcher.Plugin/SharedModels/CursorInfo.cs
similarity index 79%
rename from Flow.Launcher.Infrastructure/CursorInfo.cs
rename to Flow.Launcher.Plugin/SharedModels/CursorInfo.cs
index 046dc4ba9..720bf2ae3 100644
--- a/Flow.Launcher.Infrastructure/CursorInfo.cs
+++ b/Flow.Launcher.Plugin/SharedModels/CursorInfo.cs
@@ -2,7 +2,7 @@
using System.Runtime.InteropServices;
using Windows.Win32;
-namespace Flow.Launcher.Infrastructure;
+namespace Flow.Launcher.Plugin.SharedModels;
///
/// Contains full information about a cursor.
@@ -12,6 +12,9 @@ namespace Flow.Launcher.Infrastructure;
///
public class CursorInfo
{
+ ///
+ /// Gets the current position of the cursor in screen coordinates.
+ ///
public static Point Position
{
get
diff --git a/Flow.Launcher.Infrastructure/MonitorInfo.cs b/Flow.Launcher.Plugin/SharedModels/MonitorInfo.cs
similarity index 97%
rename from Flow.Launcher.Infrastructure/MonitorInfo.cs
rename to Flow.Launcher.Plugin/SharedModels/MonitorInfo.cs
index a87aab7d8..22e09e2f5 100644
--- a/Flow.Launcher.Infrastructure/MonitorInfo.cs
+++ b/Flow.Launcher.Plugin/SharedModels/MonitorInfo.cs
@@ -7,7 +7,7 @@ using Windows.Win32.Foundation;
using Windows.Win32.Graphics.Gdi;
using Windows.Win32.UI.WindowsAndMessaging;
-namespace Flow.Launcher.Infrastructure;
+namespace Flow.Launcher.Plugin.SharedModels;
///
/// Contains full information about a display monitor.
@@ -75,7 +75,7 @@ public class MonitorInfo
/// The primary display monitor, or null if no monitor is found.
public static unsafe MonitorInfo GetPrimaryDisplayMonitor()
{
- var primaryMonitor = PInvoke.MonitorFromWindow(new HWND(IntPtr.Zero), MONITOR_FROM_FLAGS.MONITOR_DEFAULTTOPRIMARY);
+ var primaryMonitor = PInvoke.MonitorFromWindow(new HWND(nint.Zero), MONITOR_FROM_FLAGS.MONITOR_DEFAULTTOPRIMARY);
MonitorInfo primaryMonitorInfo = null;
var callback = new MONITORENUMPROC((monitor, deviceContext, rect, data) =>
{
@@ -163,7 +163,7 @@ public class MonitorInfo
///
/// Gets if the monitor is the primary display monitor.
///
- public bool IsPrimary => _monitor == PInvoke.MonitorFromWindow(new(IntPtr.Zero), MONITOR_FROM_FLAGS.MONITOR_DEFAULTTOPRIMARY);
+ public bool IsPrimary => _monitor == PInvoke.MonitorFromWindow(new(nint.Zero), MONITOR_FROM_FLAGS.MONITOR_DEFAULTTOPRIMARY);
///
public override string ToString() => $"{Name} {Bounds.Width}x{Bounds.Height}";
From 3cfe122c7bb21f69e0b8bcb0e4a4d59bc571e4d3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Jul 2025 13:51:35 +0800
Subject: [PATCH 1637/1798] Use new MonitorInfo class class
---
Flow.Launcher.Infrastructure/Win32Helper.cs | 1 +
Flow.Launcher/MainWindow.xaml.cs | 1 +
Flow.Launcher/Msg.xaml.cs | 1 +
Flow.Launcher/MsgWithButton.xaml.cs | 1 +
Flow.Launcher/SettingWindow.xaml.cs | 1 +
.../Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs | 5 +++--
6 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 84880d68c..68d382377 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -13,6 +13,7 @@ using System.Windows.Interop;
using System.Windows.Markup;
using System.Windows.Media;
using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin.SharedModels;
using Microsoft.Win32;
using Microsoft.Win32.SafeHandles;
using Windows.Win32;
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 429a4aece..e69de67cf 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -23,6 +23,7 @@ using Flow.Launcher.Infrastructure.DialogJump;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
+using Flow.Launcher.Plugin.SharedModels;
using Flow.Launcher.ViewModel;
using Microsoft.Win32;
using ModernWpf.Controls;
diff --git a/Flow.Launcher/Msg.xaml.cs b/Flow.Launcher/Msg.xaml.cs
index 6063e489c..dd7d4495c 100644
--- a/Flow.Launcher/Msg.xaml.cs
+++ b/Flow.Launcher/Msg.xaml.cs
@@ -4,6 +4,7 @@ using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Animation;
using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Plugin.SharedModels;
namespace Flow.Launcher
{
diff --git a/Flow.Launcher/MsgWithButton.xaml.cs b/Flow.Launcher/MsgWithButton.xaml.cs
index 89149c2d4..7ae53e6c5 100644
--- a/Flow.Launcher/MsgWithButton.xaml.cs
+++ b/Flow.Launcher/MsgWithButton.xaml.cs
@@ -4,6 +4,7 @@ using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Animation;
using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Plugin.SharedModels;
namespace Flow.Launcher
{
diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs
index b4f6bcf69..0e3e69996 100644
--- a/Flow.Launcher/SettingWindow.xaml.cs
+++ b/Flow.Launcher/SettingWindow.xaml.cs
@@ -7,6 +7,7 @@ using System.Windows.Interop;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin.SharedModels;
using Flow.Launcher.SettingPages.Views;
using Flow.Launcher.ViewModel;
using ModernWpf.Controls;
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
index cbf6f1f8b..274537cd3 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
@@ -7,6 +7,7 @@ using System.Windows.Input;
using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.Views;
using Flow.Launcher.Plugin.SharedCommands;
+using Flow.Launcher.Plugin.SharedModels;
using Peter;
using Path = System.IO.Path;
@@ -72,10 +73,10 @@ namespace Flow.Launcher.Plugin.Explorer.Search
internal static void ShowNativeContextMenu(string path, ResultType type)
{
- var screenWithMouseCursor = System.Windows.Forms.Screen.FromPoint(System.Windows.Forms.Cursor.Position);
+ var screenWithMouseCursor = MonitorInfo.GetCursorDisplayMonitor();
var xOfScreenCenter = screenWithMouseCursor.WorkingArea.Left + screenWithMouseCursor.WorkingArea.Width / 2;
var yOfScreenCenter = screenWithMouseCursor.WorkingArea.Top + screenWithMouseCursor.WorkingArea.Height / 2;
- var showPosition = new System.Drawing.Point(xOfScreenCenter, yOfScreenCenter);
+ var showPosition = new System.Drawing.Point((int)xOfScreenCenter, (int)yOfScreenCenter);
switch (type)
{
From 3cd7c3ce009822566cb6f9330cdf092e39198296 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Jul 2025 13:52:31 +0800
Subject: [PATCH 1638/1798] Remove CursorInfo class
---
.../SharedModels/CursorInfo.cs | 29 -------------------
.../SharedModels/MonitorInfo.cs | 9 ++++--
2 files changed, 6 insertions(+), 32 deletions(-)
delete mode 100644 Flow.Launcher.Plugin/SharedModels/CursorInfo.cs
diff --git a/Flow.Launcher.Plugin/SharedModels/CursorInfo.cs b/Flow.Launcher.Plugin/SharedModels/CursorInfo.cs
deleted file mode 100644
index 720bf2ae3..000000000
--- a/Flow.Launcher.Plugin/SharedModels/CursorInfo.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System.Drawing;
-using System.Runtime.InteropServices;
-using Windows.Win32;
-
-namespace Flow.Launcher.Plugin.SharedModels;
-
-///
-/// Contains full information about a cursor.
-///
-///
-/// Use this class to replace the System.Windows.Forms.Cursor class which can cause possible System.PlatformNotSupportedException.
-///
-public class CursorInfo
-{
- ///
- /// Gets the current position of the cursor in screen coordinates.
- ///
- public static Point Position
- {
- get
- {
- if (!PInvoke.GetCursorPos(out var pt))
- {
- Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
- }
- return pt;
- }
- }
-}
diff --git a/Flow.Launcher.Plugin/SharedModels/MonitorInfo.cs b/Flow.Launcher.Plugin/SharedModels/MonitorInfo.cs
index 22e09e2f5..6808c9c91 100644
--- a/Flow.Launcher.Plugin/SharedModels/MonitorInfo.cs
+++ b/Flow.Launcher.Plugin/SharedModels/MonitorInfo.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows;
using Windows.Win32;
@@ -102,7 +101,11 @@ public class MonitorInfo
/// The display monitor that contains the cursor, or null if no monitor is found.
public static unsafe MonitorInfo GetCursorDisplayMonitor()
{
- var cursorMonitor = PInvoke.MonitorFromPoint(CursorInfo.Position, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST);
+ if (!PInvoke.GetCursorPos(out var pt))
+ {
+ Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error());
+ }
+ var cursorMonitor = PInvoke.MonitorFromPoint(pt, MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST);
MonitorInfo cursorMonitorInfo = null;
var callback = new MONITORENUMPROC((monitor, deviceContext, rect, data) =>
{
From 74306f0a7616d6807ee992f3b4e2ee78c617f84c Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Jul 2025 14:15:20 +0800
Subject: [PATCH 1639/1798] Use PInvoke to register SystemEvents
---
.../NativeMethods.txt | 5 +++-
Flow.Launcher.Infrastructure/Win32Helper.cs | 3 +++
Flow.Launcher/MainWindow.xaml.cs | 23 ++++++++-----------
3 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt
index e87004251..eb844dd7c 100644
--- a/Flow.Launcher.Infrastructure/NativeMethods.txt
+++ b/Flow.Launcher.Infrastructure/NativeMethods.txt
@@ -83,4 +83,7 @@ WM_GETTEXT
OpenProcess
QueryFullProcessImageName
EVENT_OBJECT_HIDE
-EVENT_SYSTEM_DIALOGEND
\ No newline at end of file
+EVENT_SYSTEM_DIALOGEND
+
+WM_POWERBROADCAST
+PBT_APMRESUMEAUTOMATIC
\ No newline at end of file
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 68d382377..7cc644eaa 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -338,6 +338,9 @@ namespace Flow.Launcher.Infrastructure
public const int SC_MAXIMIZE = (int)PInvoke.SC_MAXIMIZE;
public const int SC_MINIMIZE = (int)PInvoke.SC_MINIMIZE;
+ public const int WM_POWERBROADCAST = (int)PInvoke.WM_POWERBROADCAST;
+ public const int PBT_APMRESUMEAUTOMATIC = (int)PInvoke.PBT_APMRESUMEAUTOMATIC;
+
#endregion
#region Window Handle
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index e69de67cf..8eb41e032 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -25,7 +25,6 @@ using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
using Flow.Launcher.Plugin.SharedModels;
using Flow.Launcher.ViewModel;
-using Microsoft.Win32;
using ModernWpf.Controls;
using DataObject = System.Windows.DataObject;
using Key = System.Windows.Input.Key;
@@ -96,7 +95,6 @@ namespace Flow.Launcher
InitSoundEffects();
DataObject.AddPastingHandler(QueryTextBox, QueryTextBox_OnPaste);
- SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
_viewModel.ActualApplicationThemeChanged += ViewModel_ActualApplicationThemeChanged;
}
@@ -670,6 +668,16 @@ namespace Flow.Launcher
handled = true;
}
break;
+ case Win32Helper.WM_POWERBROADCAST: // Handle power broadcast messages
+ // https://learn.microsoft.com/en-us/windows/win32/power/wm-powerbroadcast
+ if (wParam.ToInt32() == Win32Helper.PBT_APMRESUMEAUTOMATIC)
+ {
+ // Fix for sound not playing after sleep / hibernate
+ // https://stackoverflow.com/questions/64805186/mediaplayer-doesnt-play-after-computer-sleeps
+ InitSoundEffects();
+ }
+ handled = true;
+ break;
}
return IntPtr.Zero;
@@ -679,16 +687,6 @@ namespace Flow.Launcher
#region Window Sound Effects
- private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
- {
- // Fix for sound not playing after sleep / hibernate
- // https://stackoverflow.com/questions/64805186/mediaplayer-doesnt-play-after-computer-sleeps
- if (e.Mode == PowerModes.Resume)
- {
- InitSoundEffects();
- }
- }
-
private void InitSoundEffects()
{
if (_settings.WMPInstalled)
@@ -1443,7 +1441,6 @@ namespace Flow.Launcher
animationSoundWMP?.Close();
animationSoundWPF?.Dispose();
_viewModel.ActualApplicationThemeChanged -= ViewModel_ActualApplicationThemeChanged;
- SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
}
_disposed = true;
From 20f6a74fbe299e6d2992e4cd58688198e43f6610 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 23 Jul 2025 17:33:03 +0800
Subject: [PATCH 1640/1798] Fix dialog jump issue when result will not be
execueted under empty query option
---
Flow.Launcher/ViewModel/MainViewModel.cs | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 5eae23c27..045ff46cc 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -501,15 +501,14 @@ namespace Flow.Launcher.ViewModel
// For Dialog Jump and left click mode, we need to navigate to the path
if (_isDialogJump && Settings.DialogJumpResultBehaviour == DialogJumpResultBehaviours.LeftClick)
{
- Hide();
-
- if (SelectedResults.SelectedItem != null && DialogWindowHandle != nint.Zero)
+ if (result is DialogJumpResult dialogJumpResult)
{
- if (result is DialogJumpResult dialogJumpResult)
- {
- Win32Helper.SetForegroundWindow(DialogWindowHandle);
- _ = Task.Run(() => DialogJump.JumpToPathAsync(DialogWindowHandle, dialogJumpResult.DialogJumpPath));
- }
+ Win32Helper.SetForegroundWindow(DialogWindowHandle);
+ _ = Task.Run(() => DialogJump.JumpToPathAsync(DialogWindowHandle, dialogJumpResult.DialogJumpPath));
+ }
+ else
+ {
+ App.API.LogError(ClassName, "DialogJumpResult expected but got a different result type.");
}
}
// For query mode, we execute the result
From 0b6309f175002a68ed034795421f5f5f285be733 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Wed, 23 Jul 2025 19:39:17 +0800
Subject: [PATCH 1641/1798] Fix typo
---
.../Flow.Launcher.Plugin.Calculator/Languages/ar.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/cs.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/da.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/de.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/en.xaml | 10 +++++-----
.../Languages/es-419.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/es.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/fr.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/he.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/it.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/ja.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/ko.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/nb.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/nl.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/pl.xaml | 10 +++++-----
.../Languages/pt-br.xaml | 10 +++++-----
.../Languages/pt-pt.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/ru.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/sk.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/sr.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/tr.xaml | 10 +++++-----
.../Languages/uk-UA.xaml | 10 +++++-----
.../Flow.Launcher.Plugin.Calculator/Languages/vi.xaml | 10 +++++-----
.../Languages/zh-cn.xaml | 10 +++++-----
.../Languages/zh-tw.xaml | 10 +++++-----
.../Views/CalculatorSettings.xaml | 2 +-
26 files changed, 126 insertions(+), 126 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml
index 3219d647e..df523b17b 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml
@@ -6,10 +6,10 @@
ليست رقمًا (NaN)التعبير خاطئ أو غير مكتمل (هل نسيت بعض الأقواس؟)نسخ هذا الرقم إلى الحافظة
- فاصل عشري
- الفاصل العشري الذي سيتم استخدامه في الناتج.
- استخدام إعدادات النظام المحلية
- فاصلة (,)
- نقطة (.)
+ فاصل عشري
+ الفاصل العشري الذي سيتم استخدامه في الناتج.
+ استخدام إعدادات النظام المحلية
+ فاصلة (,)
+ نقطة (.)أقصى عدد من المنازل العشرية
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml
index ed8cb3fdb..0767248b7 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml
@@ -6,10 +6,10 @@
Není číslo (NaN)Nesprávný nebo neúplný výraz (Nezapomněli jste na závorky?)Kopírování výsledku do schránky
- Oddělovač desetinných míst
- Oddělovač desetinných míst použitý ve výsledku.
- Použít podle systému
- Čárka (,)
- Tečka (.)
+ Oddělovač desetinných míst
+ Oddělovač desetinných míst použitý ve výsledku.
+ Použít podle systému
+ Čárka (,)
+ Tečka (.)Desetinná místa
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml
index 15598118c..8287fe2f1 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml
@@ -6,10 +6,10 @@
Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
- Decimal separator
- The decimal separator to be used in the output.
- Use system locale
- Comma (,)
- Dot (.)
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)Max. decimal places
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml
index d8da714dc..eead8b6ca 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml
@@ -6,10 +6,10 @@
Nicht eine Zahl (NaN)Ausdruck falsch oder unvollständig (Haben Sie einige Klammern vergessen?)Diese Zahl in die Zwischenablage kopieren
- Dezimaltrennzeichen
- Das Dezimaltrennzeichen, das in der Ausgabe verwendet werden soll.
- Systemgebietsschema verwenden
- Komma (,)
- Punkt (.)
+ Dezimaltrennzeichen
+ Das Dezimaltrennzeichen, das in der Ausgabe verwendet werden soll.
+ Systemgebietsschema verwenden
+ Komma (,)
+ Punkt (.)Max. Dezimalstellen
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
index e646bab0e..502c07238 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
@@ -8,11 +8,11 @@
Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
- Decimal separator
- The decimal separator to be used in the output.
- Use system locale
- Comma (,)
- Dot (.)
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)Max. decimal placesCopy failed, please try later
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml
index 685bc136c..7d04db7f5 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml
@@ -6,10 +6,10 @@
No es un número (NaN)Expresión incorrecta o incompleta (¿Olvidó algún paréntesis?)Copiar este número al portapapeles
- Separador decimal
- El separador decimal que se usará en el resultado.
- Usar configuración del sistema
- Coma (,)
- Punto (.)
+ Separador decimal
+ El separador decimal que se usará en el resultado.
+ Usar configuración del sistema
+ Coma (,)
+ Punto (.)Número máximo de decimales
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml
index 657c471d5..7f6e230db 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml
@@ -6,10 +6,10 @@
No es un número (NaN)Expresión incorrecta o incompleta (¿Ha olvidado algunos paréntesis?)Copiar este número al portapapeles
- Separador decimal
- El separador decimal que se utilizará en la salida.
- Usar configuración regional del sistema
- Coma (,)
- Punto (.)
+ Separador decimal
+ El separador decimal que se utilizará en la salida.
+ Usar configuración regional del sistema
+ Coma (,)
+ Punto (.)Número máximo de decimales
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml
index c462ccc43..60087c9a2 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml
@@ -6,10 +6,10 @@
Pas un nombre (NaN)Expression incorrecte ou incomplète (avez-vous oublié certaines parenthèses ?)Copier ce chiffre dans le presse-papiers
- Séparateur décimal
- Le séparateur décimal à utiliser dans la sortie.
- Utiliser les paramètres régionaux du système
- Virgule (,)
- Point (.)
+ Séparateur décimal
+ Le séparateur décimal à utiliser dans la sortie.
+ Utiliser les paramètres régionaux du système
+ Virgule (,)
+ Point (.)Décimales max.
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml
index 9fe80bc47..6bc43d2db 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml
@@ -6,10 +6,10 @@
לא מספר (NaN)הביטוי שגוי או לא שלם (האם שכחת סוגריים?)העתק מספר זה ללוח
- מפריד עשרוני
- מפריד עשרוני שישמש בתוצאה.
- השתמש בהגדרת מערכת
- פסיק (,)
- נקודה (.)
+ מפריד עשרוני
+ מפריד עשרוני שישמש בתוצאה.
+ השתמש בהגדרת מערכת
+ פסיק (,)
+ נקודה (.)מספר מקסימלי של מקומות עשרוניים
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
index fa4651a97..343e0feb3 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
@@ -6,10 +6,10 @@
Non è un numero (NaN)Espressione sbagliata o incompleta (avete dimenticato delle parentesi?)Copiare questo numero negli appunti
- Separatore decimale
- Il separatore decimale da usare nell'output.
- Usa il locale del sistema
- Virgola (,)
- Punto (.)
+ Separatore decimale
+ Il separatore decimale da usare nell'output.
+ Usa il locale del sistema
+ Virgola (,)
+ Punto (.)Max. cifre decimali
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
index 757394b4c..735f145d9 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
@@ -6,10 +6,10 @@
Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)この数字をクリップボードにコピーします
- Decimal separator
- The decimal separator to be used in the output.
- Use system locale
- Comma (,)
- Dot (.)
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)Max. decimal places
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml
index ee2ae77a1..14e3079f8 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml
@@ -6,10 +6,10 @@
숫자가 아님 (NaN)표현식이 잘못되었거나 불완전합니다. (괄호를 깜빡하셨나요?)해당 숫자를 클립보드에 복사
- 소수 구분자
- 출력에 사용할 소수점 구분자
- 시스템 설정 사용
- 쉼표 (,)
- 마침표 (.)
+ 소수 구분자
+ 출력에 사용할 소수점 구분자
+ 시스템 설정 사용
+ 쉼표 (,)
+ 마침표 (.)최대 소수점 아래 자릿 수
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml
index 527df1d21..34a3f9638 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml
@@ -6,10 +6,10 @@
Ikke et tall (NaN)Uttrykk feil eller ufullstendig (glem noen parenteser?)Kopier dette nummeret til utklippstavlen
- Desimalskille
- Desimalskilletegnet som skal brukes i utdataene.
- Bruk systemets nasjonale innstilling
- Komma (,)
- Prikk (.)
+ Desimalskille
+ Desimalskilletegnet som skal brukes i utdataene.
+ Bruk systemets nasjonale innstilling
+ Komma (,)
+ Prikk (.)Maks. desimaler
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml
index 15598118c..8287fe2f1 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml
@@ -6,10 +6,10 @@
Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
- Decimal separator
- The decimal separator to be used in the output.
- Use system locale
- Comma (,)
- Dot (.)
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)Max. decimal places
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
index f697d2e6d..5f6d6e766 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
@@ -6,10 +6,10 @@
Nie liczba (NaN)Wyrażenie niepoprawne lub niekompletne (Czy zapomniałeś o nawiasach?)Skopiuj ten numer do schowka
- Separator dziesiętny
- Separator dziesiętny używany w wyniku.
- Użyj ustawień regionalnych systemu
- Przecinek (,)
- Kropka (.)
+ Separator dziesiętny
+ Separator dziesiętny używany w wyniku.
+ Użyj ustawień regionalnych systemu
+ Przecinek (,)
+ Kropka (.)Maks. liczba miejsc po przecinku
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml
index 6dd903fa4..0eb4f3cd8 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml
@@ -6,10 +6,10 @@
Não é um número (NaN)Expressão errada ou incompleta (Você esqueceu de adicionar parênteses?)Copiar este numero para a área de transferência
- Separador decimal
- O separador decimal a ser usado no resultado.
- Use system locale
- Vírgula (,)
- Ponto (.)
+ Separador decimal
+ O separador decimal a ser usado no resultado.
+ Use system locale
+ Vírgula (,)
+ Ponto (.)Max. decimal places
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
index b751f3f39..937ebb841 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
@@ -6,10 +6,10 @@
Não é número (NN)Expressão errada ou incompleta (esqueceu-se de algum parêntese?)Copiar número para a área de transferência
- Separador decimal
- O separador decimal para utilizar no resultado.
- Utilizar definições do sistema
- Vírgula (,)
- Ponto (.)
+ Separador decimal
+ O separador decimal para utilizar no resultado.
+ Utilizar definições do sistema
+ Vírgula (,)
+ Ponto (.)Número máximo de casas decimais
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml
index 30c557536..3adb1ea49 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml
@@ -6,10 +6,10 @@
Не является числом (NaN)Выражение неправильное или неполное (Вы забыли скобки?)Скопировать этот номер в буфер обмена
- Десятичный разделитель
- Десятичный разделитель, который будет использоваться в результате.
- Использовать системный язык
- Запятая (,)
- Точка (.)
+ Десятичный разделитель
+ Десятичный разделитель, который будет использоваться в результате.
+ Использовать системный язык
+ Запятая (,)
+ Точка (.)Макс. число знаков после запятой
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml
index d8d3a586f..cf2de9fe5 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml
@@ -6,10 +6,10 @@
Nie je číslo (NaN)Nesprávny alebo neúplný výraz (Nezabudli ste na zátvorky?)Kopírovať výsledok do schránky
- Oddeľovač desatinných miest
- Oddeľovač desatinných miest použitý vo výsledku.
- Použiť podľa systému
- Čiarka (,)
- Bodka (.)
+ Oddeľovač desatinných miest
+ Oddeľovač desatinných miest použitý vo výsledku.
+ Použiť podľa systému
+ Čiarka (,)
+ Bodka (.)Desatinné miesta
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml
index 15598118c..8287fe2f1 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml
@@ -6,10 +6,10 @@
Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
- Decimal separator
- The decimal separator to be used in the output.
- Use system locale
- Comma (,)
- Dot (.)
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)Max. decimal places
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
index 345c81433..9c722bde5 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
@@ -6,10 +6,10 @@
Sayı değil (NaN)İfade hatalı ya da eksik. (Parantez koymayı mı unuttunuz?)Bu sayıyı panoya kopyala
- Ondalık ayracı
- Ondalık kısımları ayırmak için kullanılacak işaret.
- Sistem yerelleştirme ayarını kullan
- Virgül (,)
- Nokta (.)
+ Ondalık ayracı
+ Ondalık kısımları ayırmak için kullanılacak işaret.
+ Sistem yerelleştirme ayarını kullan
+ Virgül (,)
+ Nokta (.)Maks. ondalık basamak
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
index 014755929..b33993c4a 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
@@ -6,10 +6,10 @@
Не є числом (NaN)Вираз неправильний або неповний (Ви забули якісь дужки?)Скопіюйте це число в буфер обміну
- Десятковий роздільник
- Десятковий роздільник, який буде використовуватися у виведенні.
- Використовувати системну локаль
- Кома (,)
- Крапка (.)
+ Десятковий роздільник
+ Десятковий роздільник, який буде використовуватися у виведенні.
+ Використовувати системну локаль
+ Кома (,)
+ Крапка (.)Макс. кількість знаків після коми
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml
index 82ebbbe93..f03af4ef0 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml
@@ -6,10 +6,10 @@
Không phải là số (NaN)Biểu thức sai hoặc không đầy đủ (Bạn có quên một số dấu ngoặc đơn không?)Sao chép số này vào clipboard
- Dấu tách thập phân
- Dấu phân cách thập phân được sử dụng ở đầu ra.
- Sử dụng ngôn ngữ hệ thống
- Dấu phẩy (,)
- dấu chấm (.)
+ Dấu tách thập phân
+ Dấu phân cách thập phân được sử dụng ở đầu ra.
+ Sử dụng ngôn ngữ hệ thống
+ Dấu phẩy (,)
+ dấu chấm (.)Tối đa. chữ số thập phân
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
index aada17d5a..a0e3d0f92 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
@@ -6,10 +6,10 @@
请输入数字表达错误或不完整(您是否忘记了一些括号?)将结果复制到剪贴板
- 十进制分隔符
- 在输出中使用的十进制分隔符
- 使用系统区域设置
- 逗号(,)
- 点(.)
+ 十进制分隔符
+ 在输出中使用的十进制分隔符
+ 使用系统区域设置
+ 逗号(,)
+ 点(.)小数点后最大位数
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
index 83df3e7cd..39b8d4e01 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
@@ -6,10 +6,10 @@
不是一個數 (NaN)Expression wrong or incomplete (Did you forget some parentheses?)複製此數至剪貼簿
- 小數點分隔符號
- The decimal separator to be used in the output.
- 使用系統區域設定
- 逗號 (,)
- 點 (.)
+ 小數點分隔符號
+ The decimal separator to be used in the output.
+ 使用系統區域設定
+ 逗號 (,)
+ 點 (.)小數點後最大位數
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
index 3355be095..8d240ef39 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml
@@ -27,7 +27,7 @@
Margin="{StaticResource SettingPanelItemRightTopBottomMargin}"
VerticalAlignment="Center"
FontSize="14"
- Text="{DynamicResource flowlauncher_plugin_calculator_output_decimal_seperator}" />
+ Text="{DynamicResource flowlauncher_plugin_calculator_output_decimal_separator}" />
Date: Wed, 23 Jul 2025 17:26:18 +0100
Subject: [PATCH 1642/1798] Delete
Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
---
.../Views/CalculatorSettings.xaml.cs | 19 -------------------
1 file changed, 19 deletions(-)
delete mode 100644 Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
deleted file mode 100644
index d0d79cd72..000000000
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System.Windows.Controls;
-using Flow.Launcher.Plugin.Calculator.ViewModels;
-
-namespace Flow.Launcher.Plugin.Calculator.Views
-{
- public partial class CalculatorSettings : UserControl
- {
- private readonly SettingsViewModel _viewModel;
- private readonly Settings _settings;
-
- public CalculatorSettings(SettingsViewModel viewModel)
- {
- _viewModel = viewModel;
- _settings = viewModel.Settings;
- DataContext = viewModel;
- InitializeComponent();
- }
- }
-}
From 76f834ff1b88fe09c2025cef55b7aa968e85f424 Mon Sep 17 00:00:00 2001
From: dcog989
Date: Wed, 23 Jul 2025 17:56:58 +0100
Subject: [PATCH 1643/1798] PR review changes
---
Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 15 +++++++++++----
.../Flow.Launcher.Plugin.Calculator/plugin.json | 2 +-
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index afd0ddfe5..e9ea2d08c 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -219,11 +219,10 @@ namespace Flow.Launcher.Plugin.Calculator
return numberStr;
}
-
private string FormatResult(decimal roundedResult, ParsingContext context)
{
string decimalSeparator = context.InputDecimalSeparator ?? GetDecimalSeparator();
- string groupSeparator = decimalSeparator == dot ? comma : dot;
+ string groupSeparator = GetGroupSeparator(decimalSeparator);
string resultStr = roundedResult.ToString(CultureInfo.InvariantCulture);
@@ -231,7 +230,7 @@ namespace Flow.Launcher.Plugin.Calculator
string integerPart = parts[0];
string fractionalPart = parts.Length > 1 ? parts[1] : string.Empty;
- if (context.InputUsesGroupSeparators)
+ if (context.InputUsesGroupSeparators && integerPart.Length > 3)
{
integerPart = ThousandGroupRegex.Replace(integerPart, groupSeparator);
}
@@ -244,9 +243,17 @@ namespace Flow.Launcher.Plugin.Calculator
return integerPart;
}
+ private string GetGroupSeparator(string decimalSeparator)
+ {
+ // Use system culture's group separator when available and it doesn't conflict
+ var systemGroupSep = CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator;
+ return decimalSeparator == systemGroupSep
+ ? (decimalSeparator == dot ? comma : dot)
+ : systemGroupSep;
+ }
+
private bool CanCalculate(Query query)
{
- // Don't execute when user only input "e" or "i" keyword
if (query.Search.Length < 2)
{
return false;
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
index 739572930..c9435e043 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
@@ -4,7 +4,7 @@
"Name": "Calculator",
"Description": "Perform mathematical calculations (including hexadecimal values). Use ',' or '.' as thousand separator or decimal place.",
"Author": "cxfksword, dcog989",
- "Version": "1.1.0",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Calculator.dll",
From f8a6b02c80559d020437ebc166a18c8e88fd78d9 Mon Sep 17 00:00:00 2001
From: dcog989
Date: Thu, 24 Jul 2025 02:33:59 +0100
Subject: [PATCH 1644/1798] fix for GitHub build server failure
Removes external dependency for NumberGroupSeparator so it builds anywhere.
---
.../Flow.Launcher.Plugin.Calculator/Main.cs | 8 +++----
.../Views/CalculatorSettings.xaml.cs | 23 +++++++++++++++++++
2 files changed, 26 insertions(+), 5 deletions(-)
create mode 100644 Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index e9ea2d08c..cc5032c6b 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -245,11 +245,9 @@ namespace Flow.Launcher.Plugin.Calculator
private string GetGroupSeparator(string decimalSeparator)
{
- // Use system culture's group separator when available and it doesn't conflict
- var systemGroupSep = CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator;
- return decimalSeparator == systemGroupSep
- ? (decimalSeparator == dot ? comma : dot)
- : systemGroupSep;
+ // This logic is now independent of the system's group separator
+ // to ensure consistent output for unit testing.
+ return decimalSeparator == dot ? comma : dot;
}
private bool CanCalculate(Query query)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
new file mode 100644
index 000000000..64e2adc6e
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml.cs
@@ -0,0 +1,23 @@
+using System.Windows.Controls;
+using Flow.Launcher.Plugin.Calculator.ViewModels;
+
+namespace Flow.Launcher.Plugin.Calculator.Views
+{
+ ///
+ /// Interaction logic for CalculatorSettings.xaml
+ ///
+ public partial class CalculatorSettings : UserControl
+ {
+ private readonly SettingsViewModel _viewModel;
+ private readonly Settings _settings;
+
+ public CalculatorSettings(SettingsViewModel viewModel)
+ {
+ _viewModel = viewModel;
+ _settings = viewModel.Settings;
+ DataContext = viewModel;
+ InitializeComponent();
+ }
+ }
+
+}
\ No newline at end of file
From c42f84f246721accc1b860c616da725a354bd1d2 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Jul 2025 16:39:58 +0800
Subject: [PATCH 1645/1798] Update Pinyin description
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index f37568419..0bea11c12 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -121,7 +121,7 @@
LowRegularSearch with Pinyin
- Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese. Enabling it can introduce more memory usage during searching.Use Double PinyinUse Double Pinyin instead of Full Pinyin to search.Double Pinyin Schema
From 0564e5814b242b4efa2f711ab28e28bf44290db9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Jul 2025 16:54:19 +0800
Subject: [PATCH 1646/1798] Update description
---
Flow.Launcher/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 0bea11c12..bf6cb674e 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -121,7 +121,7 @@
LowRegularSearch with Pinyin
- Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese. Enabling it can introduce more memory usage during searching.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.Use Double PinyinUse Double Pinyin instead of Full Pinyin to search.Double Pinyin Schema
From 14282b67343e5b03ef75d66eb7bced7d70e1efb3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 24 Jul 2025 19:16:58 +0800
Subject: [PATCH 1647/1798] Fix typos
---
Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs b/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs
index 0ece36d54..b3f5a8b4b 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs
@@ -5,13 +5,13 @@ namespace Flow.Launcher.Plugin.Calculator
[EnumLocalize]
public enum DecimalSeparator
{
- [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_calculator_decimal_seperator_use_system_locale))]
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_calculator_decimal_separator_use_system_locale))]
UseSystemLocale,
- [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_calculator_decimal_seperator_dot))]
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_calculator_decimal_separator_dot))]
Dot,
- [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_calculator_decimal_seperator_comma))]
+ [EnumLocalizeKey(nameof(Localize.flowlauncher_plugin_calculator_decimal_separator_comma))]
Comma
}
}
From 277767f101f6949c82ad55332902f1ad4afd0a34 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 25 Jul 2025 09:55:26 +0800
Subject: [PATCH 1648/1798] Do not create customized preview panel when preview
is off
---
Flow.Launcher/MainWindow.xaml | 6 +++---
Flow.Launcher/ViewModel/MainViewModel.cs | 7 +++++++
Flow.Launcher/ViewModel/ResultViewModel.cs | 2 --
3 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml
index 9ff38a564..fe5423592 100644
--- a/Flow.Launcher/MainWindow.xaml
+++ b/Flow.Launcher/MainWindow.xaml
@@ -534,10 +534,10 @@
MinHeight="380"
MaxHeight="{Binding ElementName=ResultListBox, Path=ActualHeight}"
Padding="0 0 10 10"
- d:DataContext="{d:DesignInstance vm:ResultViewModel}"
- DataContext="{Binding PreviewSelectedItem, Mode=OneWay}"
+
+
Visibility="{Binding ShowCustomizedPreview}">
-
+
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 045ff46cc..d492f28c5 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -9,6 +9,7 @@ using System.Threading.Channels;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
+using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Threading;
using CommunityToolkit.Mvvm.DependencyInjection;
@@ -883,6 +884,12 @@ namespace Flow.Launcher.ViewModel
}
}
+ public Visibility ShowCustomizedPreview
+ => InternalPreviewVisible && PreviewSelectedItem?.Result.PreviewPanel != null ? Visibility.Visible : Visibility.Collapsed;
+
+ public UserControl CustomizedPreviewControl
+ => ShowCustomizedPreview == Visibility.Visible ? PreviewSelectedItem?.Result.PreviewPanel.Value : null;
+
public Visibility ProgressBarVisibility { get; set; }
public Visibility MainWindowVisibility { get; set; }
diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs
index c58abae28..d4382fb7f 100644
--- a/Flow.Launcher/ViewModel/ResultViewModel.cs
+++ b/Flow.Launcher/ViewModel/ResultViewModel.cs
@@ -66,8 +66,6 @@ namespace Flow.Launcher.ViewModel
public Visibility ShowDefaultPreview => Result.PreviewPanel == null ? Visibility.Visible : Visibility.Collapsed;
- public Visibility ShowCustomizedPreview => Result.PreviewPanel == null ? Visibility.Collapsed : Visibility.Visible;
-
public Visibility ShowIcon
{
get
From 14af7af2d1225a0814e91f747f97b5871a0f40fb Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 25 Jul 2025 15:32:09 +0800
Subject: [PATCH 1649/1798] Remove blank lines
---
Flow.Launcher/MainWindow.xaml | 2 --
1 file changed, 2 deletions(-)
diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml
index fe5423592..132ec8389 100644
--- a/Flow.Launcher/MainWindow.xaml
+++ b/Flow.Launcher/MainWindow.xaml
@@ -534,8 +534,6 @@
MinHeight="380"
MaxHeight="{Binding ElementName=ResultListBox, Path=ActualHeight}"
Padding="0 0 10 10"
-
-
Visibility="{Binding ShowCustomizedPreview}">
From b637e0a028330fee5f6e2901a3674f94f37d1921 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sun, 27 Jul 2025 00:17:09 +0800
Subject: [PATCH 1650/1798] Use Flow.Launcher.Localization 0.0.4 & update
expect list
---
.github/actions/spelling/expect.txt | 4 ++++
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 2 +-
.../Flow.Launcher.Plugin.Calculator.csproj | 2 +-
.../Flow.Launcher.Plugin.Explorer.csproj | 2 +-
4 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
index 0fea6d9ab..81b9aba97 100644
--- a/.github/actions/spelling/expect.txt
+++ b/.github/actions/spelling/expect.txt
@@ -104,3 +104,7 @@ metadatas
WMP
VSTHRD
CJK
+Msix
+dummyprofile
+browserbookmark
+copyurl
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index be4e0ce7b..078476242 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -95,7 +95,7 @@
-
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
index 09a5b4ab4..43a2c2f3c 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
@@ -62,7 +62,7 @@
-
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index f19eabd0b..2f24015ad 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -47,7 +47,7 @@
-
+
From 443d4f7c02d0ea00eb593a9e7af12029100b2dd1 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sun, 27 Jul 2025 18:39:38 +0800
Subject: [PATCH 1651/1798] Build regex at compile time
---
Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 5 ++---
Plugins/Flow.Launcher.Plugin.Calculator/MainRegexHelper.cs | 6 ++++++
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index 78c182f30..0744024f4 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -15,9 +15,8 @@ namespace Flow.Launcher.Plugin.Calculator
{
private static readonly Regex RegValidExpressChar = MainRegexHelper.GetRegValidExpressChar();
private static readonly Regex RegBrackets = MainRegexHelper.GetRegBrackets();
- private static readonly Regex ThousandGroupRegex = new Regex(@"\B(?=(\d{3})+(?!\d))", RegexOptions.Compiled);
- private static readonly Regex NumberRegex = new Regex(@"[\d\.,]+", RegexOptions.Compiled);
-
+ private static readonly Regex ThousandGroupRegex = MainRegexHelper.GetThousandGroupRegex();
+ private static readonly Regex NumberRegex = MainRegexHelper.GetNumberRegex();
private static Engine MagesEngine;
private const string Comma = ",";
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/MainRegexHelper.cs b/Plugins/Flow.Launcher.Plugin.Calculator/MainRegexHelper.cs
index 8ffc547d1..f4e2090e7 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/MainRegexHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/MainRegexHelper.cs
@@ -10,4 +10,10 @@ internal static partial class MainRegexHelper
[GeneratedRegex(@"^(ceil|floor|exp|pi|e|max|min|det|abs|log|ln|sqrt|sin|cos|tan|arcsin|arccos|arctan|eigval|eigvec|eig|sum|polar|plot|round|sort|real|zeta|bin2dec|hex2dec|oct2dec|factorial|sign|isprime|isinfty|==|~=|&&|\|\||(?:\<|\>)=?|[ei]|[0-9]|0x[\da-fA-F]+|[\+\%\-\*\/\^\., ""]|[\(\)\|\!\[\]])+$", RegexOptions.Compiled)]
public static partial Regex GetRegValidExpressChar();
+
+ [GeneratedRegex(@"[\d\.,]+", RegexOptions.Compiled)]
+ public static partial Regex GetNumberRegex();
+
+ [GeneratedRegex(@"\B(?=(\d{3})+(?!\d))", RegexOptions.Compiled)]
+ public static partial Regex GetThousandGroupRegex();
}
From 53255c3a9c19e736d3a689796a153f22f919f530 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sun, 27 Jul 2025 18:41:23 +0800
Subject: [PATCH 1652/1798] Fix typo
---
Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml | 4 ++--
Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 4 ++--
26 files changed, 52 insertions(+), 52 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml
index df523b17b..d38f136a6 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml
@@ -1,8 +1,8 @@
- آلة حاسبة
- تمكنك من إجراء العمليات الحسابية. (جرب 5*3-2 في Flow Launcher)
+ آلة حاسبة
+ تمكنك من إجراء العمليات الحسابية. (جرب 5*3-2 في Flow Launcher)ليست رقمًا (NaN)التعبير خاطئ أو غير مكتمل (هل نسيت بعض الأقواس؟)نسخ هذا الرقم إلى الحافظة
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml
index 0767248b7..56b908031 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml
@@ -1,8 +1,8 @@
- Kalkulačka
- Umožňuje provádět matematické výpočty.(Try 5*3-2 v průtokovém spouštěči)
+ Kalkulačka
+ Umožňuje provádět matematické výpočty.(Try 5*3-2 v průtokovém spouštěči)Není číslo (NaN)Nesprávný nebo neúplný výraz (Nezapomněli jste na závorky?)Kopírování výsledku do schránky
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml
index 8287fe2f1..c5690a3d5 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml
@@ -1,8 +1,8 @@
- Calculator
- Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Calculator
+ Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml
index eead8b6ca..9b8654962 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml
@@ -1,8 +1,8 @@
- Rechner
- Ermöglicht mathematische Berechnungen. (Versuchen Sie 5*3-2 in Flow Launcher)
+ Rechner
+ Ermöglicht mathematische Berechnungen. (Versuchen Sie 5*3-2 in Flow Launcher)Nicht eine Zahl (NaN)Ausdruck falsch oder unvollständig (Haben Sie einige Klammern vergessen?)Diese Zahl in die Zwischenablage kopieren
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
index 502c07238..e0084a31d 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
@@ -3,8 +3,8 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib">
- Calculator
- Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Calculator
+ Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml
index 7d04db7f5..6b69c06a4 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml
@@ -1,8 +1,8 @@
- Calculadora
- Permite hacer cálculos matemáticos. (Pruebe con 5*3-2 en Flow Launcher)
+ Calculadora
+ Permite hacer cálculos matemáticos. (Pruebe con 5*3-2 en Flow Launcher)No es un número (NaN)Expresión incorrecta o incompleta (¿Olvidó algún paréntesis?)Copiar este número al portapapeles
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml
index 7f6e230db..3dfdff680 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml
@@ -1,8 +1,8 @@
- Calculadora
- Permite hacer cálculos matemáticos. (Pruebe 5*3-2 en Flow Launcher)
+ Calculadora
+ Permite hacer cálculos matemáticos. (Pruebe 5*3-2 en Flow Launcher)No es un número (NaN)Expresión incorrecta o incompleta (¿Ha olvidado algunos paréntesis?)Copiar este número al portapapeles
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml
index 60087c9a2..a86c020be 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml
@@ -1,8 +1,8 @@
- Calculatrice
- Permet de faire des calculs mathématiques.(Essayez 5*3-2 dans Flow Launcher)
+ Calculatrice
+ Permet de faire des calculs mathématiques.(Essayez 5*3-2 dans Flow Launcher)Pas un nombre (NaN)Expression incorrecte ou incomplète (avez-vous oublié certaines parenthèses ?)Copier ce chiffre dans le presse-papiers
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml
index 6bc43d2db..1d297381c 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml
@@ -1,8 +1,8 @@
- מחשבון
- מאפשר לבצע חישובים מתמטיים. (נסה 5*3-2 ב-Flow Launcher)
+ מחשבון
+ מאפשר לבצע חישובים מתמטיים. (נסה 5*3-2 ב-Flow Launcher)לא מספר (NaN)הביטוי שגוי או לא שלם (האם שכחת סוגריים?)העתק מספר זה ללוח
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
index 343e0feb3..27bd75304 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
@@ -1,8 +1,8 @@
- Calcolatrice
- Consente di eseguire calcoli matematici (provare 5*3-2 in Flow Launcher)
+ Calcolatrice
+ Consente di eseguire calcoli matematici (provare 5*3-2 in Flow Launcher)Non è un numero (NaN)Espressione sbagliata o incompleta (avete dimenticato delle parentesi?)Copiare questo numero negli appunti
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
index 735f145d9..30bae550a 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
@@ -1,8 +1,8 @@
- 電卓
- 数式の計算ができます(Flow Launcherで「5*3-2」と入力してみてください)
+ 電卓
+ 数式の計算ができます(Flow Launcherで「5*3-2」と入力してみてください)Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)この数字をクリップボードにコピーします
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml
index 14e3079f8..30e9b40a0 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml
@@ -1,8 +1,8 @@
- 계산기
- 수학 계산을 할 수 있습니다. Flow Launcher에서 5*3-2를 입력해보세요.
+ 계산기
+ 수학 계산을 할 수 있습니다. Flow Launcher에서 5*3-2를 입력해보세요.숫자가 아님 (NaN)표현식이 잘못되었거나 불완전합니다. (괄호를 깜빡하셨나요?)해당 숫자를 클립보드에 복사
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml
index 34a3f9638..be233767f 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml
@@ -1,8 +1,8 @@
- Kalkulator
- Lar deg gjøre matematiske beregninger. (Prøv 5*3-2 i Flow Launcher)
+ Kalkulator
+ Lar deg gjøre matematiske beregninger. (Prøv 5*3-2 i Flow Launcher)Ikke et tall (NaN)Uttrykk feil eller ufullstendig (glem noen parenteser?)Kopier dette nummeret til utklippstavlen
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml
index 8287fe2f1..c5690a3d5 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml
@@ -1,8 +1,8 @@
- Calculator
- Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Calculator
+ Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
index 5f6d6e766..75b52685a 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
@@ -1,8 +1,8 @@
- Kalkulator
- Szybkie wykonywanie obliczeń matematycznych. (Spróbuj wpisać 5*3-2 w oknie Flow Launchera)
+ Kalkulator
+ Szybkie wykonywanie obliczeń matematycznych. (Spróbuj wpisać 5*3-2 w oknie Flow Launchera)Nie liczba (NaN)Wyrażenie niepoprawne lub niekompletne (Czy zapomniałeś o nawiasach?)Skopiuj ten numer do schowka
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml
index 0eb4f3cd8..9b6f3708a 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml
@@ -1,8 +1,8 @@
- Calculadora
- Permite fazer cálculos matemáticos.(Tente 5*3-2 no Flow Launcher)
+ Calculadora
+ Permite fazer cálculos matemáticos.(Tente 5*3-2 no Flow Launcher)Não é um número (NaN)Expressão errada ou incompleta (Você esqueceu de adicionar parênteses?)Copiar este numero para a área de transferência
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
index 937ebb841..7b48d6fe9 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
@@ -1,8 +1,8 @@
- Calculadora
- Permite a execução de cálculos matemáticos (experimente 5*3-2)
+ Calculadora
+ Permite a execução de cálculos matemáticos (experimente 5*3-2)Não é número (NN)Expressão errada ou incompleta (esqueceu-se de algum parêntese?)Copiar número para a área de transferência
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml
index 3adb1ea49..d1d03d604 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml
@@ -1,8 +1,8 @@
- Калькулятор
- Позволяет выполнять математические вычисления. (Попробуйте 5*3-2 в Flow Launcher)
+ Калькулятор
+ Позволяет выполнять математические вычисления. (Попробуйте 5*3-2 в Flow Launcher)Не является числом (NaN)Выражение неправильное или неполное (Вы забыли скобки?)Скопировать этот номер в буфер обмена
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml
index cf2de9fe5..b1cf4a735 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml
@@ -1,8 +1,8 @@
- Kalkulačka
- Spracúva matematické operácie. (Skúste 5*3-2 vo Flow Launcheri)
+ Kalkulačka
+ Spracúva matematické operácie. (Skúste 5*3-2 vo Flow Launcheri)Nie je číslo (NaN)Nesprávny alebo neúplný výraz (Nezabudli ste na zátvorky?)Kopírovať výsledok do schránky
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml
index 8287fe2f1..c5690a3d5 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml
@@ -1,8 +1,8 @@
- Calculator
- Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Calculator
+ Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
index 9c722bde5..f307c65e2 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
@@ -1,8 +1,8 @@
- Hesap Makinesi
- Matematiksel hesaplamalar yapmaya yarar. (5*3-2 yazmayı deneyin)
+ Hesap Makinesi
+ Matematiksel hesaplamalar yapmaya yarar. (5*3-2 yazmayı deneyin)Sayı değil (NaN)İfade hatalı ya da eksik. (Parantez koymayı mı unuttunuz?)Bu sayıyı panoya kopyala
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
index b33993c4a..9f60f570a 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
@@ -1,8 +1,8 @@
- Калькулятор
- Дозволяє виконувати математичні обчислення (спробуйте 5*3-2 у Flow Launcher)
+ Калькулятор
+ Дозволяє виконувати математичні обчислення (спробуйте 5*3-2 у Flow Launcher)Не є числом (NaN)Вираз неправильний або неповний (Ви забули якісь дужки?)Скопіюйте це число в буфер обміну
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml
index f03af4ef0..688623b04 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml
@@ -1,8 +1,8 @@
- Máy tính
- Cho phép thực hiện các phép tính toán học. (Thử 5*3-2 trong Flow Launcher)
+ Máy tính
+ Cho phép thực hiện các phép tính toán học. (Thử 5*3-2 trong Flow Launcher)Không phải là số (NaN)Biểu thức sai hoặc không đầy đủ (Bạn có quên một số dấu ngoặc đơn không?)Sao chép số này vào clipboard
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
index a0e3d0f92..85159ed4f 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
@@ -1,8 +1,8 @@
- 计算器
- 为 Flow Launcher 提供数学计算能力。(试着在 Flow Launcher 输入 5*3-2)
+ 计算器
+ 为 Flow Launcher 提供数学计算能力。(试着在 Flow Launcher 输入 5*3-2)请输入数字表达错误或不完整(您是否忘记了一些括号?)将结果复制到剪贴板
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
index 39b8d4e01..d3d448e1c 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
@@ -1,8 +1,8 @@
- 計算機
- 為 Flow Launcher 提供數學計算功能。(試著在 Flow Launcher 輸入 5*3-2)
+ 計算機
+ 為 Flow Launcher 提供數學計算功能。(試著在 Flow Launcher 輸入 5*3-2)不是一個數 (NaN)Expression wrong or incomplete (Did you forget some parentheses?)複製此數至剪貼簿
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index 195d63e47..6bbc466ca 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -179,12 +179,12 @@ namespace Flow.Launcher.Plugin.Calculator
public string GetTranslatedPluginTitle()
{
- return Localize.flowlauncher_plugin_caculator_plugin_name();
+ return Localize.flowlauncher_plugin_calculator_plugin_name();
}
public string GetTranslatedPluginDescription()
{
- return Localize.flowlauncher_plugin_caculator_plugin_description();
+ return Localize.flowlauncher_plugin_calculator_plugin_description();
}
public Control CreateSettingPanel()
From afc969d00fc54be017bb7da7edadecd446142de0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 27 Jul 2025 20:03:33 +0800
Subject: [PATCH 1653/1798] Update translations in language file
---
Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
index 502c07238..25aaf97e7 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml
@@ -4,7 +4,7 @@
xmlns:system="clr-namespace:System;assembly=mscorlib">
Calculator
- Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Perform mathematical calculations (including hexadecimal values). Use ',' or '.' as thousand separator or decimal place.Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
From ee4dc394d409ca20ba206ea5b8dffa0709a60051 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 28 Jul 2025 14:28:55 +0800
Subject: [PATCH 1654/1798] Clear plugin list selection to make sure all items
can be mouse hovered
---
.../SettingPages/Views/SettingsPanePlugins.xaml | 1 +
.../SettingPages/Views/SettingsPanePlugins.xaml.cs | 10 ++++++++++
2 files changed, 11 insertions(+)
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml
index 52d77f914..aa7c219e5 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml
@@ -122,6 +122,7 @@
FontSize="14"
ItemContainerStyle="{StaticResource PluginList}"
ItemsSource="{Binding Source={StaticResource PluginCollectionView}}"
+ Loaded="PluginListBox_Loaded"
ScrollViewer.CanContentScroll="False"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
SnapsToDevicePixels="True"
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs
index f486a3443..e77a30843 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs
@@ -1,4 +1,6 @@
using System.ComponentModel;
+using System.Windows;
+using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Navigation;
@@ -33,6 +35,14 @@ public partial class SettingsPanePlugins
base.OnNavigatedTo(e);
}
+ private void PluginListBox_Loaded(object sender, RoutedEventArgs e)
+ {
+ // After list is loaded, we need to clear selection to make sure all items can be mouse hovered
+ // because the selected item cannot be hovered.
+ if (sender is not ListBox listBox) return;
+ listBox.SelectedIndex = -1;
+ }
+
private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(SettingsPanePluginsViewModel.FilterText))
From 7664944ff265febcd9192deb6e434626d3a8efda Mon Sep 17 00:00:00 2001
From: Kevin Zhang <45326534+taooceros@users.noreply.github.com>
Date: Mon, 28 Jul 2025 16:27:47 -0500
Subject: [PATCH 1655/1798] Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
Flow.Launcher.Core/Resource/AvailableLanguages.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Resource/AvailableLanguages.cs b/Flow.Launcher.Core/Resource/AvailableLanguages.cs
index 3919e2227..34eaf29eb 100644
--- a/Flow.Launcher.Core/Resource/AvailableLanguages.cs
+++ b/Flow.Launcher.Core/Resource/AvailableLanguages.cs
@@ -81,7 +81,7 @@ namespace Flow.Launcher.Core.Resource
"da" => "System",
"de" => "System",
"ko" => "시스템",
- "sr" => "Srpski",
+ "sr" => "Sistem",
"sr-Cyrl-RS" => "Систем",
"pt-pt" => "Sistema",
"pt-br" => "Sistema",
From 4db825debd08e6bb9f64dc3e26a29f14850f7fda Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 5 Aug 2025 15:15:11 +0800
Subject: [PATCH 1656/1798] Set CETCompat to false
---
Directory.Build.props | 2 ++
Flow.Launcher/Flow.Launcher.csproj | 1 -
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index fa499273c..a5545af12 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -1,5 +1,7 @@
true
+
+ false
\ No newline at end of file
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 7db769c70..12c726e95 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -136,7 +136,6 @@
-
From d9ee6665ef9708149512c2d65e90249387a2f8d0 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 5 Aug 2025 22:22:22 +0000
Subject: [PATCH 1657/1798] Bump Microsoft.Data.Sqlite from 9.0.7 to 9.0.8
---
updated-dependencies:
- dependency-name: Microsoft.Data.Sqlite
dependency-version: 9.0.8
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 078476242..4d1109980 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -96,7 +96,7 @@
-
+
From 2a5ac092f0a175d80f9a0298bbb1e02da10e7ec4 Mon Sep 17 00:00:00 2001
From: dcog989 <89043002+dcog989@users.noreply.github.com>
Date: Wed, 6 Aug 2025 13:46:25 +0100
Subject: [PATCH 1658/1798] Update Flow.Launcher.Plugin.BrowserBookmark.csproj
bump Microsoft.Data.Sqlite
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 615d89f09..6840af5d2 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -96,7 +96,7 @@
-
+
From dcc0866de1f5857a50c1343239f331032327f627 Mon Sep 17 00:00:00 2001
From: dcog989 <89043002+dcog989@users.noreply.github.com>
Date: Wed, 6 Aug 2025 13:58:36 +0100
Subject: [PATCH 1659/1798] Update Flow.Launcher.Plugin.BrowserBookmark.csproj
bump Svg.Skia
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 6840af5d2..fb5d4df5e 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -97,7 +97,7 @@
-
+
From 8f88998d34a2ce544958b017f651d81f4aca44e9 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 7 Aug 2025 08:57:21 +0800
Subject: [PATCH 1660/1798] Remove more unnecessary runtimes
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index fb5d4df5e..7d3cf164c 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -45,12 +45,14 @@
$(OutputPath)runtimes\linux-musl-arm;
$(OutputPath)runtimes\linux-musl-arm64;
$(OutputPath)runtimes\linux-musl-x64;
+ $(OutputPath)runtimes\linux-musl-s390x;
$(OutputPath)runtimes\linux-ppc64le;
$(OutputPath)runtimes\linux-s390x;
$(OutputPath)runtimes\linux-x64;
$(OutputPath)runtimes\linux-x86;
$(OutputPath)runtimes\maccatalyst-arm64;
$(OutputPath)runtimes\maccatalyst-x64;
+ $(OutputPath)runtimes\osx;
$(OutputPath)runtimes\osx-arm64;
$(OutputPath)runtimes\osx-x64"/>
@@ -64,12 +66,14 @@
$(PublishDir)runtimes\linux-musl-arm;
$(PublishDir)runtimes\linux-musl-arm64;
$(PublishDir)runtimes\linux-musl-x64;
+ $(PublishDir)runtimes\linux-musl-s390x;
$(PublishDir)runtimes\linux-ppc64le;
$(PublishDir)runtimes\linux-s390x;
$(PublishDir)runtimes\linux-x64;
$(PublishDir)runtimes\linux-x86;
$(PublishDir)runtimes\maccatalyst-arm64;
$(PublishDir)runtimes\maccatalyst-x64;
+ $(PublishDir)runtimes\osx;
$(PublishDir)runtimes\osx-arm64;
$(PublishDir)runtimes\osx-x64"/>
From 2d1aa2333b5cc6c9098dcea774e8597bd056e782 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 7 Aug 2025 09:12:07 +0800
Subject: [PATCH 1661/1798] Remove unnecessary runtime files
---
Flow.Launcher/Flow.Launcher.csproj | 42 ++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 12c726e95..fe84b5e1e 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -39,6 +39,48 @@
false
+
+
+
+
+
+
+
+
From 9f5d578aea8cc63287f01fa873dd07cfac7d8ff5 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 7 Aug 2025 09:29:51 +0800
Subject: [PATCH 1662/1798] Set RuntimeIdentifier to win-x64 for directory
build properties
---
Directory.Build.props | 3 +
Flow.Launcher.Core/packages.lock.json | 7 +
.../packages.lock.json | 7 +
Flow.Launcher.Plugin/packages.lock.json | 3 +-
Flow.Launcher/Flow.Launcher.csproj | 42 ----
Flow.Launcher/packages.lock.json | 216 ++++++++++++++++++
...low.Launcher.Plugin.BrowserBookmark.csproj | 38 ---
7 files changed, 235 insertions(+), 81 deletions(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index a5545af12..1fa8d4511 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -3,5 +3,8 @@
truefalse
+
+
+ win-x64
\ No newline at end of file
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index caec08ebf..23eacbf2c 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -272,6 +272,13 @@
"JetBrains.Annotations": "[2024.3.0, )"
}
}
+ },
+ "net9.0-windows7.0/win-x64": {
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "9.0.7",
+ "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
+ }
}
}
}
\ No newline at end of file
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index 87b4bb6da..c86db40a3 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -193,6 +193,13 @@
"JetBrains.Annotations": "[2024.3.0, )"
}
}
+ },
+ "net9.0-windows7.0/win-x64": {
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "9.0.7",
+ "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
+ }
}
}
}
\ No newline at end of file
diff --git a/Flow.Launcher.Plugin/packages.lock.json b/Flow.Launcher.Plugin/packages.lock.json
index af835c598..31722cd4a 100644
--- a/Flow.Launcher.Plugin/packages.lock.json
+++ b/Flow.Launcher.Plugin/packages.lock.json
@@ -72,6 +72,7 @@
"Microsoft.Windows.SDK.Win32Metadata": "61.0.15-preview"
}
}
- }
+ },
+ "net9.0-windows7.0/win-x64": {}
}
}
\ No newline at end of file
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index fe84b5e1e..12c726e95 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -39,48 +39,6 @@
false
-
-
-
-
-
-
-
-
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index 1047b1f3f..889739480 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -872,6 +872,222 @@
"JetBrains.Annotations": "[2024.3.0, )"
}
}
+ },
+ "net9.0-windows10.0.19041/win-x64": {
+ "Microsoft.Win32.Registry": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
+ "dependencies": {
+ "System.Security.AccessControl": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "9.0.7",
+ "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
+ },
+ "runtime.any.System.Collections": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "runtime.any.System.Globalization": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw=="
+ },
+ "runtime.any.System.IO": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ=="
+ },
+ "runtime.any.System.Reflection": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ=="
+ },
+ "runtime.any.System.Reflection.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg=="
+ },
+ "runtime.any.System.Resources.ResourceManager": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ=="
+ },
+ "runtime.any.System.Runtime": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==",
+ "dependencies": {
+ "System.Private.Uri": "4.3.0"
+ }
+ },
+ "runtime.any.System.Text.Encoding": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ=="
+ },
+ "runtime.any.System.Threading.Tasks": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w=="
+ },
+ "runtime.osx.10.10-x64.CoreCompat.System.Drawing": {
+ "type": "Transitive",
+ "resolved": "5.8.64",
+ "contentHash": "Ey7xQgWwixxdrmhzEUvaR4kxZDSQMWQScp8ViLvmL5xCBKG6U3TaMv/jzHilpfQXpHmJ4IylKGzzMvnYX2FwHQ=="
+ },
+ "runtime.win.System.Diagnostics.Debug": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g=="
+ },
+ "System.Collections": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "runtime.any.System.Collections": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Debug": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "runtime.win.System.Diagnostics.Debug": "4.3.0"
+ }
+ },
+ "System.Diagnostics.EventLog": {
+ "type": "Transitive",
+ "resolved": "9.0.7",
+ "contentHash": "AJ+9fyCtQUImntxAJ9l4PZiCd4iepuk4pm7Qcno7PBIWQnfXlvwKuFsGk2H+QyY69GUVzDP2heELW6ho5BCXUg=="
+ },
+ "System.Globalization": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "runtime.any.System.Globalization": "4.3.0"
+ }
+ },
+ "System.IO": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "runtime.any.System.IO": "4.3.0"
+ }
+ },
+ "System.Private.Uri": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "System.Reflection": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "runtime.any.System.Reflection": "4.3.0"
+ }
+ },
+ "System.Reflection.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "runtime.any.System.Reflection.Primitives": "4.3.0"
+ }
+ },
+ "System.Resources.ResourceManager": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "runtime.any.System.Resources.ResourceManager": "4.3.0"
+ }
+ },
+ "System.Runtime": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "runtime.any.System.Runtime": "4.3.0"
+ }
+ },
+ "System.Security.AccessControl": {
+ "type": "Transitive",
+ "resolved": "6.0.1",
+ "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw=="
+ },
+ "System.Security.Principal.Windows": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
+ },
+ "System.Text.Encoding": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "runtime.any.System.Text.Encoding": "4.3.0"
+ }
+ },
+ "System.Threading.Tasks": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "runtime.any.System.Threading.Tasks": "4.3.0"
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 4d1109980..c636e6882 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -36,44 +36,6 @@
false
-
-
-
-
-
-
-
-
PreserveNewest
From b9c18e7d4fa2cad79e3b231736b6687a4f20cd33 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 7 Aug 2025 09:33:31 +0800
Subject: [PATCH 1663/1798] Revert "Set RuntimeIdentifier to win-x64 for
directory build properties"
This reverts commit 9f5d578aea8cc63287f01fa873dd07cfac7d8ff5.
---
Directory.Build.props | 3 -
Flow.Launcher.Core/packages.lock.json | 7 -
.../packages.lock.json | 7 -
Flow.Launcher.Plugin/packages.lock.json | 3 +-
Flow.Launcher/Flow.Launcher.csproj | 42 ++++
Flow.Launcher/packages.lock.json | 216 ------------------
...low.Launcher.Plugin.BrowserBookmark.csproj | 38 +++
7 files changed, 81 insertions(+), 235 deletions(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index 1fa8d4511..a5545af12 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -3,8 +3,5 @@
truefalse
-
-
- win-x64
\ No newline at end of file
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index 23eacbf2c..caec08ebf 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -272,13 +272,6 @@
"JetBrains.Annotations": "[2024.3.0, )"
}
}
- },
- "net9.0-windows7.0/win-x64": {
- "Microsoft.Win32.SystemEvents": {
- "type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
- }
}
}
}
\ No newline at end of file
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index c86db40a3..87b4bb6da 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -193,13 +193,6 @@
"JetBrains.Annotations": "[2024.3.0, )"
}
}
- },
- "net9.0-windows7.0/win-x64": {
- "Microsoft.Win32.SystemEvents": {
- "type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
- }
}
}
}
\ No newline at end of file
diff --git a/Flow.Launcher.Plugin/packages.lock.json b/Flow.Launcher.Plugin/packages.lock.json
index 31722cd4a..af835c598 100644
--- a/Flow.Launcher.Plugin/packages.lock.json
+++ b/Flow.Launcher.Plugin/packages.lock.json
@@ -72,7 +72,6 @@
"Microsoft.Windows.SDK.Win32Metadata": "61.0.15-preview"
}
}
- },
- "net9.0-windows7.0/win-x64": {}
+ }
}
}
\ No newline at end of file
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 12c726e95..fe84b5e1e 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -39,6 +39,48 @@
false
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index 889739480..1047b1f3f 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -872,222 +872,6 @@
"JetBrains.Annotations": "[2024.3.0, )"
}
}
- },
- "net9.0-windows10.0.19041/win-x64": {
- "Microsoft.Win32.Registry": {
- "type": "Transitive",
- "resolved": "5.0.0",
- "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
- "dependencies": {
- "System.Security.AccessControl": "5.0.0",
- "System.Security.Principal.Windows": "5.0.0"
- }
- },
- "Microsoft.Win32.SystemEvents": {
- "type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
- },
- "runtime.any.System.Collections": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==",
- "dependencies": {
- "System.Runtime": "4.3.0"
- }
- },
- "runtime.any.System.Globalization": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw=="
- },
- "runtime.any.System.IO": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ=="
- },
- "runtime.any.System.Reflection": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ=="
- },
- "runtime.any.System.Reflection.Primitives": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg=="
- },
- "runtime.any.System.Resources.ResourceManager": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ=="
- },
- "runtime.any.System.Runtime": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==",
- "dependencies": {
- "System.Private.Uri": "4.3.0"
- }
- },
- "runtime.any.System.Text.Encoding": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ=="
- },
- "runtime.any.System.Threading.Tasks": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w=="
- },
- "runtime.osx.10.10-x64.CoreCompat.System.Drawing": {
- "type": "Transitive",
- "resolved": "5.8.64",
- "contentHash": "Ey7xQgWwixxdrmhzEUvaR4kxZDSQMWQScp8ViLvmL5xCBKG6U3TaMv/jzHilpfQXpHmJ4IylKGzzMvnYX2FwHQ=="
- },
- "runtime.win.System.Diagnostics.Debug": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g=="
- },
- "System.Collections": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "Microsoft.NETCore.Targets": "1.1.0",
- "System.Runtime": "4.3.0",
- "runtime.any.System.Collections": "4.3.0"
- }
- },
- "System.Diagnostics.Debug": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "Microsoft.NETCore.Targets": "1.1.0",
- "System.Runtime": "4.3.0",
- "runtime.win.System.Diagnostics.Debug": "4.3.0"
- }
- },
- "System.Diagnostics.EventLog": {
- "type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "AJ+9fyCtQUImntxAJ9l4PZiCd4iepuk4pm7Qcno7PBIWQnfXlvwKuFsGk2H+QyY69GUVzDP2heELW6ho5BCXUg=="
- },
- "System.Globalization": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "Microsoft.NETCore.Targets": "1.1.0",
- "System.Runtime": "4.3.0",
- "runtime.any.System.Globalization": "4.3.0"
- }
- },
- "System.IO": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "Microsoft.NETCore.Targets": "1.1.0",
- "System.Runtime": "4.3.0",
- "System.Text.Encoding": "4.3.0",
- "System.Threading.Tasks": "4.3.0",
- "runtime.any.System.IO": "4.3.0"
- }
- },
- "System.Private.Uri": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "Microsoft.NETCore.Targets": "1.1.0"
- }
- },
- "System.Reflection": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "Microsoft.NETCore.Targets": "1.1.0",
- "System.IO": "4.3.0",
- "System.Reflection.Primitives": "4.3.0",
- "System.Runtime": "4.3.0",
- "runtime.any.System.Reflection": "4.3.0"
- }
- },
- "System.Reflection.Primitives": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "Microsoft.NETCore.Targets": "1.1.0",
- "System.Runtime": "4.3.0",
- "runtime.any.System.Reflection.Primitives": "4.3.0"
- }
- },
- "System.Resources.ResourceManager": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "Microsoft.NETCore.Targets": "1.1.0",
- "System.Globalization": "4.3.0",
- "System.Reflection": "4.3.0",
- "System.Runtime": "4.3.0",
- "runtime.any.System.Resources.ResourceManager": "4.3.0"
- }
- },
- "System.Runtime": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "Microsoft.NETCore.Targets": "1.1.0",
- "runtime.any.System.Runtime": "4.3.0"
- }
- },
- "System.Security.AccessControl": {
- "type": "Transitive",
- "resolved": "6.0.1",
- "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw=="
- },
- "System.Security.Principal.Windows": {
- "type": "Transitive",
- "resolved": "5.0.0",
- "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
- },
- "System.Text.Encoding": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "Microsoft.NETCore.Targets": "1.1.0",
- "System.Runtime": "4.3.0",
- "runtime.any.System.Text.Encoding": "4.3.0"
- }
- },
- "System.Threading.Tasks": {
- "type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "Microsoft.NETCore.Targets": "1.1.0",
- "System.Runtime": "4.3.0",
- "runtime.any.System.Threading.Tasks": "4.3.0"
- }
- }
}
}
}
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index c636e6882..4d1109980 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -36,6 +36,44 @@
false
+
+
+
+
+
+
+
+
PreserveNewest
From 15b874728071c9ce62ccaa71669731cff551392e Mon Sep 17 00:00:00 2001
From: zoltanvi
Date: Sat, 9 Aug 2025 11:51:12 +0200
Subject: [PATCH 1664/1798] Fix IsEnabled binding for suggestion combobox
---
Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs | 12 +++++++++++-
.../SettingsControl.xaml | 3 +--
Plugins/Flow.Launcher.Plugin.WebSearch/setting.json | 4 ++--
3 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
index f0e5ac327..04112f965 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
@@ -7,6 +7,8 @@ namespace Flow.Launcher.Plugin.WebSearch
{
public class Settings : BaseModel
{
+ private bool enableSuggestion;
+
public Settings()
{
SelectedSuggestion = Suggestions[0];
@@ -191,7 +193,15 @@ namespace Flow.Launcher.Plugin.WebSearch
[JsonIgnore]
public SearchSource SelectedSearchSource { get; set; }
- public bool EnableSuggestion { get; set; }
+ public bool EnableSuggestion
+ {
+ get => enableSuggestion;
+ set
+ {
+ enableSuggestion = value;
+ OnPropertyChanged(nameof(EnableSuggestion));
+ }
+ }
[JsonIgnore]
public SuggestionSource[] Suggestions { get; set; } = {
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml
index 1ce9b70b4..bee133496 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml
@@ -138,7 +138,7 @@
Margin="{StaticResource SettingPanelItemLeftMargin}"
VerticalAlignment="Center"
FontSize="11"
- IsEnabled="{Binding ElementName=EnableSuggestion, Path=IsChecked}"
+ IsEnabled="{Binding Settings.EnableSuggestion}"
ItemsSource="{Binding Settings.Suggestions}"
SelectedItem="{Binding Settings.SelectedSuggestion}" />
-
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/setting.json b/Plugins/Flow.Launcher.Plugin.WebSearch/setting.json
index 533b894b8..a10ea6f33 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/setting.json
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/setting.json
@@ -141,6 +141,6 @@
"Enabled": true
}
],
- "EnableWebSearchSuggestion": false,
- "WebSearchSuggestionSource": "Google"
+ "EnableSuggestion": false,
+ "Suggestion": "Google"
}
\ No newline at end of file
From 09d8cefcef770fa02f5d196bdfaf99e7fc7c5481 Mon Sep 17 00:00:00 2001
From: zoltanvi
Date: Sat, 9 Aug 2025 11:56:13 +0200
Subject: [PATCH 1665/1798] Remove unused properties
---
Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs | 4 ----
Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml | 4 ----
.../Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs | 3 ++-
3 files changed, 2 insertions(+), 9 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
index 04112f965..1682a9a4b 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
@@ -231,9 +231,5 @@ namespace Flow.Launcher.Plugin.WebSearch
}
}
}
-
- public string BrowserPath { get; set; }
-
- public bool OpenInNewBrowser { get; set; } = true;
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml
index bee133496..79d6265fe 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml
@@ -11,10 +11,6 @@
mc:Ignorable="d">
-
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs
index e53f4ec75..71dc6ece7 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml.cs
@@ -94,7 +94,8 @@ namespace Flow.Launcher.Plugin.WebSearch
var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;
var sortBy = columnBinding?.Path.Path ?? headerClicked.Column.Header as string;
- if(sortBy != null) {
+ if (sortBy != null)
+ {
Sort(sortBy, direction);
if (direction == ListSortDirection.Ascending)
From 0a848a32f7cd51a77bcf43c11d4bbf2ef7436d07 Mon Sep 17 00:00:00 2001
From: zoltanvi
Date: Sat, 9 Aug 2025 16:21:10 +0200
Subject: [PATCH 1666/1798] Add private mode option to WebSearch items
---
.../Languages/ar.xaml | 1 +
.../Languages/cs.xaml | 1 +
.../Languages/da.xaml | 1 +
.../Languages/de.xaml | 1 +
.../Languages/en.xaml | 1 +
.../Languages/es-419.xaml | 1 +
.../Languages/es.xaml | 1 +
.../Languages/fr.xaml | 1 +
.../Languages/he.xaml | 1 +
.../Languages/it.xaml | 1 +
.../Languages/ja.xaml | 1 +
.../Languages/ko.xaml | 1 +
.../Languages/nb.xaml | 1 +
.../Languages/nl.xaml | 1 +
.../Languages/pl.xaml | 1 +
.../Languages/pt-br.xaml | 1 +
.../Languages/pt-pt.xaml | 1 +
.../Languages/ru.xaml | 1 +
.../Languages/sk.xaml | 1 +
.../Languages/sr.xaml | 1 +
.../Languages/tr.xaml | 1 +
.../Languages/uk-UA.xaml | 1 +
.../Languages/vi.xaml | 1 +
.../Languages/zh-cn.xaml | 1 +
.../Languages/zh-tw.xaml | 1 +
.../Flow.Launcher.Plugin.WebSearch/Main.cs | 4 ++--
.../SearchSource.cs | 19 +++++++++----------
.../SearchSourceSetting.xaml | 17 ++++++++++++++++-
.../SettingsControl.xaml | 14 ++++++++++++++
29 files changed, 66 insertions(+), 13 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
index cefb5d1d1..141e3a3dc 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
@@ -11,6 +11,7 @@
تعديلإضافةمفعل
+ Private modeمفعلمُعطّلتأكيد
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
index ca98581c3..1eade1ba7 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
@@ -11,6 +11,7 @@
EditovatPřidatPovoleno
+ Private modePovolenoDeaktivovánPotvrdit
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
index b1113acb7..545e36735 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
@@ -11,6 +11,7 @@
RedigerTilføjEnabled
+ Private modeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
index 2a7dca596..44d9dcade 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
@@ -11,6 +11,7 @@
BearbeitenHinzufügenAktiviert
+ Private modeAktiviertDeaktiviertBestätigen
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/en.xaml
index 21f836bec..b024d8a96 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/en.xaml
@@ -13,6 +13,7 @@
EditAddEnabled
+ Private modeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
index 3ce22bb78..29b2f2bce 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
@@ -11,6 +11,7 @@
EditarAñadirEnabled
+ Private modeEnabledDisabledConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
index 7f14b59c6..ab9878908 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
@@ -11,6 +11,7 @@
EditarAñadirActivado
+ Private modeActivadoDesactivadoConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
index f04cfb48a..c264fe54e 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
@@ -11,6 +11,7 @@
ModifierAjouterActivé
+ Private modeActivéDésactivéConfirmer
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
index 78ee7ca7d..ecf3b50b9 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
@@ -11,6 +11,7 @@
ערוהוסףמופעל
+ Private modeמופעלמושבתאישו
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
index db2a4dfeb..cebd9b322 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
@@ -11,6 +11,7 @@
ModificaAggiungiAbilitato
+ Private modeAbilitatoDisabilitatoConferma
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
index 4112f41ff..b14d3af3a 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
@@ -11,6 +11,7 @@
編集追加Enabled
+ Private modeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
index c8f069ca7..3c9a37026 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
@@ -11,6 +11,7 @@
편집추가켬
+ Private mode켬Disabled확인
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
index 9f793c43f..dfe698fbe 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
@@ -11,6 +11,7 @@
RedigerLegg tilAktivert
+ Private modeAktivertDeaktivertBekreft
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
index a18710324..2068d7209 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
@@ -11,6 +11,7 @@
BewerkenToevoegenEnabled
+ Private modeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
index 05ee39777..cfa54111b 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
@@ -11,6 +11,7 @@
EdytujDodajAktywny
+ Private modeAktywnyWyłączonyPotwierdź
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
index 6f0d7fcc9..f9bdb0d6f 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
@@ -11,6 +11,7 @@
EditarAdicionarEnabled
+ Private modeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
index 1a2476a2c..5ee67a088 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
@@ -11,6 +11,7 @@
EditarAdicionarAtivo
+ Private modeAtivoInativoConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
index 1fd9aca96..ab5604e35 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
@@ -11,6 +11,7 @@
РедактироватьДобавитьEnabled
+ Private modeEnabledОтключёнConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
index 1afcdb360..70220d8a8 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
@@ -11,6 +11,7 @@
UpraviťPridaťPovolené
+ Private modeZapnutéVypnutéPotvrdiť
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
index 06707b4af..4f47a2975 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
@@ -11,6 +11,7 @@
IzmeniDodajEnabled
+ Private modeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
index b37070d93..32a7bcf52 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
@@ -11,6 +11,7 @@
DüzenleEkleEnabled
+ Private modeEnabledDisabledOnayla
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
index 51e1efc6e..ac5fa7710 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
@@ -11,6 +11,7 @@
РедагуватиДодатиУвімкнено
+ Private modeУвімкненоВимкненоПідтвердити
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
index 731275c5e..de73afcc7 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
@@ -11,6 +11,7 @@
SửaThêmĐã bật
+ Private modeĐã bậtVô hiệu hóaXác nhận
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
index 7b8a72d6b..0b0c6bab3 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
@@ -11,6 +11,7 @@
编辑添加启用
+ Private mode已启用已禁用确认
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
index 727b2f4a9..27cc777d2 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
@@ -11,6 +11,7 @@
編輯新增已啟用
+ Private mode已啟用Disabled確定
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs
index 0040cffa7..97f90b52c 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Main.cs
@@ -71,7 +71,7 @@ namespace Flow.Launcher.Plugin.WebSearch
Score = score,
Action = c =>
{
- _context.API.OpenWebUrl(searchSource.Url.Replace("{q}", Uri.EscapeDataString(keyword)));
+ _context.API.OpenWebUrl(searchSource.Url.Replace("{q}", Uri.EscapeDataString(keyword)), searchSource.IsPrivateMode);
return true;
},
@@ -135,7 +135,7 @@ namespace Flow.Launcher.Plugin.WebSearch
ActionKeywordAssigned = searchSource.ActionKeyword == SearchSourceGlobalPluginWildCardSign ? string.Empty : searchSource.ActionKeyword,
Action = c =>
{
- _context.API.OpenWebUrl(searchSource.Url.Replace("{q}", Uri.EscapeDataString(o)));
+ _context.API.OpenWebUrl(searchSource.Url.Replace("{q}", Uri.EscapeDataString(o)), searchSource.IsPrivateMode);
return true;
},
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSource.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSource.cs
index 9eedd29a3..bfd95c242 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSource.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSource.cs
@@ -7,6 +7,7 @@ namespace Flow.Launcher.Plugin.WebSearch
public class SearchSource : BaseModel
{
public string Title { get; set; }
+
public string ActionKeyword { get; set; }
[NotNull]
@@ -19,21 +20,17 @@ namespace Flow.Launcher.Plugin.WebSearch
/// Custom icons are placed in the user data directory
///
[JsonIgnore]
- public string IconPath
- {
- get
- {
- if (CustomIcon)
- return Path.Combine(Main.CustomImagesDirectory, Icon);
-
- return Path.Combine(Main.DefaultImagesDirectory, Icon);
- }
- }
+ public string IconPath => CustomIcon
+ ? Path.Combine(Main.CustomImagesDirectory, Icon)
+ : Path.Combine(Main.DefaultImagesDirectory, Icon);
public string Url { get; set; }
[JsonIgnore]
public bool Status => Enabled;
+
+ public bool IsPrivateMode { get; set; }
+
public bool Enabled { get; set; }
public SearchSource DeepCopy()
@@ -45,8 +42,10 @@ namespace Flow.Launcher.Plugin.WebSearch
Url = Url,
Icon = Icon,
CustomIcon = CustomIcon,
+ IsPrivateMode = IsPrivateMode,
Enabled = Enabled
};
+
return webSearch;
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSourceSetting.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSourceSetting.xaml
index 746c9cf84..c6f9b27f3 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSourceSetting.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SearchSourceSetting.xaml
@@ -101,6 +101,7 @@
+
+ Text="{DynamicResource flowlauncher_plugin_websearch_private_mode_label}" />
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml
index 1ce9b70b4..7b35019fd 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/SettingsControl.xaml
@@ -96,6 +96,20 @@
+
+
+
+
+
+
+
From 1df6ac00b0f0a83f10010be3bce89a053e0c74bd Mon Sep 17 00:00:00 2001
From: zoltanvi
Date: Tue, 12 Aug 2025 07:28:18 +0200
Subject: [PATCH 1667/1798] Fix label in language files
---
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/en.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml | 2 +-
25 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
index 141e3a3dc..edbbb0443 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
@@ -11,7 +11,7 @@
تعديلإضافةمفعل
- Private mode
+ Private Modeمفعلمُعطّلتأكيد
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
index 1eade1ba7..e60acf67b 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
@@ -11,7 +11,7 @@
EditovatPřidatPovoleno
- Private mode
+ Private ModePovolenoDeaktivovánPotvrdit
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
index 545e36735..067bf2344 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
@@ -11,7 +11,7 @@
RedigerTilføjEnabled
- Private mode
+ Private ModeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
index 44d9dcade..994665375 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
@@ -11,7 +11,7 @@
BearbeitenHinzufügenAktiviert
- Private mode
+ Private ModeAktiviertDeaktiviertBestätigen
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/en.xaml
index b024d8a96..c6a74a047 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/en.xaml
@@ -13,7 +13,7 @@
EditAddEnabled
- Private mode
+ Private ModeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
index 29b2f2bce..8d2cfd525 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
@@ -11,7 +11,7 @@
EditarAñadirEnabled
- Private mode
+ Private ModeEnabledDisabledConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
index ab9878908..107443425 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
@@ -11,7 +11,7 @@
EditarAñadirActivado
- Private mode
+ Private ModeActivadoDesactivadoConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
index c264fe54e..5fd501cdb 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
@@ -11,7 +11,7 @@
ModifierAjouterActivé
- Private mode
+ Private ModeActivéDésactivéConfirmer
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
index ecf3b50b9..bdf4ad04f 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
@@ -11,7 +11,7 @@
ערוהוסףמופעל
- Private mode
+ Private Modeמופעלמושבתאישו
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
index cebd9b322..a5e91d678 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
@@ -11,7 +11,7 @@
ModificaAggiungiAbilitato
- Private mode
+ Private ModeAbilitatoDisabilitatoConferma
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
index b14d3af3a..16c5fb3e9 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
@@ -11,7 +11,7 @@
編集追加Enabled
- Private mode
+ Private ModeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
index 3c9a37026..c147a1a49 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
@@ -11,7 +11,7 @@
편집추가켬
- Private mode
+ Private Mode켬Disabled확인
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
index dfe698fbe..e6ebc30e4 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
@@ -11,7 +11,7 @@
RedigerLegg tilAktivert
- Private mode
+ Private modusAktivertDeaktivertBekreft
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
index 2068d7209..e36cd8a2d 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
@@ -11,7 +11,7 @@
BewerkenToevoegenEnabled
- Private mode
+ Private ModeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
index cfa54111b..815f42b39 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
@@ -11,7 +11,7 @@
EdytujDodajAktywny
- Private mode
+ Private ModeAktywnyWyłączonyPotwierdź
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
index f9bdb0d6f..8ece2d0b7 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
@@ -11,7 +11,7 @@
EditarAdicionarEnabled
- Private mode
+ Modo privadoEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
index 5ee67a088..22be076cb 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
@@ -11,7 +11,7 @@
EditarAdicionarAtivo
- Private mode
+ Modo privadoAtivoInativoConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
index ab5604e35..d01c8b4de 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
@@ -11,7 +11,7 @@
РедактироватьДобавитьEnabled
- Private mode
+ Private ModeEnabledОтключёнConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
index 70220d8a8..baac85bd7 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
@@ -11,7 +11,7 @@
UpraviťPridaťPovolené
- Private mode
+ Súkromný režimZapnutéVypnutéPotvrdiť
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
index 4f47a2975..dee50fac7 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
@@ -11,7 +11,7 @@
IzmeniDodajEnabled
- Private mode
+ Privatni RežimEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
index 32a7bcf52..829b7a9ad 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
@@ -11,7 +11,7 @@
DüzenleEkleEnabled
- Private mode
+ Private ModeEnabledDisabledOnayla
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
index ac5fa7710..a7cf61340 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
@@ -11,7 +11,7 @@
РедагуватиДодатиУвімкнено
- Private mode
+ Приватний режимУвімкненоВимкненоПідтвердити
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
index de73afcc7..aaa409aeb 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
@@ -11,7 +11,7 @@
SửaThêmĐã bật
- Private mode
+ Private ModeĐã bậtVô hiệu hóaXác nhận
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
index 0b0c6bab3..5defda37b 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
@@ -11,7 +11,7 @@
编辑添加启用
- Private mode
+ Private Mode已启用已禁用确认
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
index 27cc777d2..3208de092 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
@@ -11,7 +11,7 @@
編輯新增已啟用
- Private mode
+ Private Mode已啟用Disabled確定
From 37c529e012a83199cbadbc2b8d0cd1832645fb78 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 12 Aug 2025 06:40:12 +0000
Subject: [PATCH 1668/1798] Bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '5'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/default_plugins.yml | 2 +-
.github/workflows/dotnet.yml | 2 +-
.github/workflows/release_pr.yml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/default_plugins.yml b/.github/workflows/default_plugins.yml
index 59cedc1e8..d0ba62c17 100644
--- a/.github/workflows/default_plugins.yml
+++ b/.github/workflows/default_plugins.yml
@@ -10,7 +10,7 @@ jobs:
runs-on: windows-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
index 988548bee..9a09198fe 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/dotnet.yml
@@ -20,7 +20,7 @@ jobs:
NUGET_CERT_REVOCATION_MODE: offline
BUILD_NUMBER: ${{ github.run_number }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set Flow.Launcher.csproj version
id: update
uses: vers-one/dotnet-project-version-updater@v1.7
diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml
index 451bf386c..65946755b 100644
--- a/.github/workflows/release_pr.yml
+++ b/.github/workflows/release_pr.yml
@@ -11,7 +11,7 @@ jobs:
update-pr:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
From cc2df8d680bb0d2861732e527442e91110027e64 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 12 Aug 2025 17:31:26 +0800
Subject: [PATCH 1669/1798] Improve code quality
---
Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs b/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
index 1682a9a4b..0c0ac4b84 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Settings.cs
@@ -7,8 +7,6 @@ namespace Flow.Launcher.Plugin.WebSearch
{
public class Settings : BaseModel
{
- private bool enableSuggestion;
-
public Settings()
{
SelectedSuggestion = Suggestions[0];
@@ -193,13 +191,17 @@ namespace Flow.Launcher.Plugin.WebSearch
[JsonIgnore]
public SearchSource SelectedSearchSource { get; set; }
+ private bool enableSuggestion;
public bool EnableSuggestion
{
get => enableSuggestion;
set
{
- enableSuggestion = value;
- OnPropertyChanged(nameof(EnableSuggestion));
+ if (enableSuggestion != value)
+ {
+ enableSuggestion = value;
+ OnPropertyChanged(nameof(EnableSuggestion));
+ }
}
}
From 99f2b313cd2c70efa541220311781d550679963c Mon Sep 17 00:00:00 2001
From: zoltanvi
Date: Tue, 12 Aug 2025 15:06:00 +0200
Subject: [PATCH 1670/1798] Fix new label in more language files
---
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml | 2 +-
18 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
index edbbb0443..edb44f8f4 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
@@ -11,7 +11,7 @@
تعديلإضافةمفعل
- Private Mode
+ الوضع الخاصمفعلمُعطّلتأكيد
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
index e60acf67b..2e49f4965 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
@@ -11,7 +11,7 @@
EditovatPřidatPovoleno
- Private Mode
+ Soukromý režimPovolenoDeaktivovánPotvrdit
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
index 067bf2344..41e96eb60 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
@@ -11,7 +11,7 @@
RedigerTilføjEnabled
- Private Mode
+ Privat tilstandEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
index 994665375..41a798d44 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
@@ -11,7 +11,7 @@
BearbeitenHinzufügenAktiviert
- Private Mode
+ Privater ModusAktiviertDeaktiviertBestätigen
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
index 8d2cfd525..376b36b4d 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
@@ -11,7 +11,7 @@
EditarAñadirEnabled
- Private Mode
+ Modo privadoEnabledDisabledConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
index 107443425..5c956d8f8 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
@@ -11,7 +11,7 @@
EditarAñadirActivado
- Private Mode
+ Modo privadoActivadoDesactivadoConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
index 5fd501cdb..3c9003ebf 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
@@ -11,7 +11,7 @@
ModifierAjouterActivé
- Private Mode
+ Mode privéActivéDésactivéConfirmer
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
index bdf4ad04f..583f63bde 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
@@ -11,7 +11,7 @@
ערוהוסףמופעל
- Private Mode
+ מצב פרטימופעלמושבתאישו
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
index a5e91d678..7f7db8b96 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
@@ -11,7 +11,7 @@
ModificaAggiungiAbilitato
- Private Mode
+ Modalità privataAbilitatoDisabilitatoConferma
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
index 16c5fb3e9..b5cdc65ba 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
@@ -11,7 +11,7 @@
編集追加Enabled
- Private Mode
+ プライベートモードEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
index c147a1a49..373202439 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
@@ -11,7 +11,7 @@
편집추가켬
- Private Mode
+ 비공개 모드켬Disabled확인
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
index e36cd8a2d..25187d0b6 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
@@ -11,7 +11,7 @@
BewerkenToevoegenEnabled
- Private Mode
+ PrivémodusEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
index 815f42b39..bc32a1b7e 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
@@ -11,7 +11,7 @@
EdytujDodajAktywny
- Private Mode
+ Tryb prywatnyAktywnyWyłączonyPotwierdź
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
index d01c8b4de..67435b5b9 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
@@ -11,7 +11,7 @@
РедактироватьДобавитьEnabled
- Private Mode
+ Приватный режимEnabledОтключёнConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
index 829b7a9ad..f51f314e3 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
@@ -11,7 +11,7 @@
DüzenleEkleEnabled
- Private Mode
+ Gizli modEnabledDisabledOnayla
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
index aaa409aeb..fb99024ec 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
@@ -11,7 +11,7 @@
SửaThêmĐã bật
- Private Mode
+ Chế độ riêng tưĐã bậtVô hiệu hóaXác nhận
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
index 5defda37b..edec299c6 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
@@ -11,7 +11,7 @@
编辑添加启用
- Private Mode
+ 隐私模式已启用已禁用确认
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
index 3208de092..f8e3a7442 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
@@ -11,7 +11,7 @@
編輯新增已啟用
- Private Mode
+ 隱私模式已啟用Disabled確定
From 2aa07a25a77855365fb484c752b589a4aff44ab1 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 13 Aug 2025 13:37:23 +0800
Subject: [PATCH 1671/1798] Fix possible image recursive loading
---
Flow.Launcher/ViewModel/PluginViewModel.cs | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs
index ea222d023..d889bdd52 100644
--- a/Flow.Launcher/ViewModel/PluginViewModel.cs
+++ b/Flow.Launcher/ViewModel/PluginViewModel.cs
@@ -37,12 +37,17 @@ namespace Flow.Launcher.ViewModel
OnPropertyChanged(nameof(Image));
}
+ private bool _imageLoaded = false;
+
public ImageSource Image
{
get
{
- if (_image == ImageLoader.MissingImage)
+ if (!_imageLoaded)
+ {
+ _imageLoaded = true;
_ = LoadIconAsync();
+ }
return _image;
}
From 3afc52187f831f0d7b5a619d201ebbd33a33480e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 13 Aug 2025 13:58:02 +0800
Subject: [PATCH 1672/1798] Add non-async version load in BinaryStorage & Use
non-async version for ImageLoader
---
.../Image/ImageLoader.cs | 75 ++++++++-----------
.../Storage/BinaryStorage.cs | 68 +++++++++++++----
Flow.Launcher/MainWindow.xaml.cs | 2 -
Flow.Launcher/PublicAPIInstance.cs | 7 +-
4 files changed, 89 insertions(+), 63 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
index 86df01a30..758f9f557 100644
--- a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
+++ b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
@@ -19,7 +19,7 @@ namespace Flow.Launcher.Infrastructure.Image
private static readonly string ClassName = nameof(ImageLoader);
private static readonly ImageCache ImageCache = new();
- private static SemaphoreSlim storageLock { get; } = new SemaphoreSlim(1, 1);
+ private static Lock storageLock { get; } = new();
private static BinaryStorage> _storage;
private static readonly ConcurrentDictionary GuidToKey = new();
private static IImageHashGenerator _hashGenerator;
@@ -36,20 +36,25 @@ namespace Flow.Launcher.Infrastructure.Image
public static async Task InitializeAsync()
{
- _storage = new BinaryStorage>("Image");
- _hashGenerator = new ImageHashGenerator();
-
- var usage = await LoadStorageToConcurrentDictionaryAsync();
- _storage.ClearData();
-
- ImageCache.Initialize(usage);
-
- foreach (var icon in new[] { Constant.DefaultIcon, Constant.MissingImgIcon })
+ var usage = await Task.Run(() =>
{
- ImageSource img = new BitmapImage(new Uri(icon));
- img.Freeze();
- ImageCache[icon, false] = img;
- }
+ _storage = new BinaryStorage>("Image");
+ _hashGenerator = new ImageHashGenerator();
+
+ var usage = LoadStorageToConcurrentDictionary();
+ _storage.ClearData();
+
+ ImageCache.Initialize(usage);
+
+ foreach (var icon in new[] { Constant.DefaultIcon, Constant.MissingImgIcon })
+ {
+ ImageSource img = new BitmapImage(new Uri(icon));
+ img.Freeze();
+ ImageCache[icon, false] = img;
+ }
+
+ return usage;
+ });
_ = Task.Run(async () =>
{
@@ -64,42 +69,26 @@ namespace Flow.Launcher.Infrastructure.Image
});
}
- public static async Task SaveAsync()
+ public static void Save()
{
- await storageLock.WaitAsync();
-
- try
+ lock (storageLock)
{
- await _storage.SaveAsync(ImageCache.EnumerateEntries()
- .Select(x => x.Key)
- .ToList());
- }
- catch (System.Exception e)
- {
- Log.Exception(ClassName, "Failed to save image cache to file", e);
- }
- finally
- {
- storageLock.Release();
+ try
+ {
+ _storage.Save([.. ImageCache.EnumerateEntries().Select(x => x.Key)]);
+ }
+ catch (System.Exception e)
+ {
+ Log.Exception(ClassName, "Failed to save image cache to file", e);
+ }
}
}
- public static async Task WaitSaveAsync()
+ private static List<(string, bool)> LoadStorageToConcurrentDictionary()
{
- await storageLock.WaitAsync();
- storageLock.Release();
- }
-
- private static async Task> LoadStorageToConcurrentDictionaryAsync()
- {
- await storageLock.WaitAsync();
- try
+ lock (storageLock)
{
- return await _storage.TryLoadAsync(new List<(string, bool)>());
- }
- finally
- {
- storageLock.Release();
+ return _storage.TryLoad([]);
}
}
diff --git a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
index 48e6b5523..d36b05ed0 100644
--- a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
@@ -53,6 +53,45 @@ namespace Flow.Launcher.Infrastructure.Storage
FilePath = Path.Combine(DirectoryPath, $"{filename}{FileSuffix}");
}
+ public T TryLoad(T defaultData)
+ {
+ if (Data != null) return Data;
+
+ if (File.Exists(FilePath))
+ {
+ if (new FileInfo(FilePath).Length == 0)
+ {
+ Log.Error(ClassName, $"Zero length cache file <{FilePath}>");
+ Data = defaultData;
+ Save();
+ }
+
+ var bytes = File.ReadAllBytes(FilePath);
+ Data = Deserialize(bytes, defaultData);
+ }
+ else
+ {
+ Log.Info(ClassName, "Cache file not exist, load default data");
+ Data = defaultData;
+ Save();
+ }
+ return Data;
+ }
+
+ private T Deserialize(ReadOnlySpan bytes, T defaultData)
+ {
+ try
+ {
+ var t = MemoryPackSerializer.Deserialize(bytes);
+ return t ?? defaultData;
+ }
+ catch (System.Exception e)
+ {
+ Log.Exception(ClassName, $"Deserialize error for file <{FilePath}>", e);
+ return defaultData;
+ }
+ }
+
public async ValueTask TryLoadAsync(T defaultData)
{
if (Data != null) return Data;
@@ -79,26 +118,31 @@ namespace Flow.Launcher.Infrastructure.Storage
return Data;
}
- private static async ValueTask DeserializeAsync(Stream stream, T defaultData)
+ private async ValueTask DeserializeAsync(Stream stream, T defaultData)
{
try
{
var t = await MemoryPackSerializer.DeserializeAsync(stream);
return t ?? defaultData;
}
- catch (System.Exception)
+ catch (System.Exception e)
{
- // Log.Exception($"|BinaryStorage.Deserialize|Deserialize error for file <{FilePath}>", e);
+ Log.Exception(ClassName, $"Deserialize error for file <{FilePath}>", e);
return defaultData;
}
}
public void Save()
+ {
+ Save(Data.NonNull());
+ }
+
+ public void Save(T data)
{
// User may delete the directory, so we need to check it
FilesFolders.ValidateDirectory(DirectoryPath);
- var serialized = MemoryPackSerializer.Serialize(Data);
+ var serialized = MemoryPackSerializer.Serialize(data);
File.WriteAllBytes(FilePath, serialized);
}
@@ -107,15 +151,6 @@ namespace Flow.Launcher.Infrastructure.Storage
await SaveAsync(Data.NonNull());
}
- // ImageCache need to convert data into concurrent dictionary for usage,
- // so we would better to clear the data
- public void ClearData()
- {
- Data = default;
- }
-
- // ImageCache storages data in its class,
- // so we need to pass it to SaveAsync
public async ValueTask SaveAsync(T data)
{
// User may delete the directory, so we need to check it
@@ -124,5 +159,12 @@ namespace Flow.Launcher.Infrastructure.Storage
await using var stream = new FileStream(FilePath, FileMode.Create);
await MemoryPackSerializer.SerializeAsync(stream, data);
}
+
+ // ImageCache need to convert data into concurrent dictionary for usage,
+ // so we would better to clear the data
+ public void ClearData()
+ {
+ Data = default;
+ }
}
}
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 8eb41e032..76603e777 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -18,7 +18,6 @@ using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Core.Resource;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Hotkey;
-using Flow.Launcher.Infrastructure.Image;
using Flow.Launcher.Infrastructure.DialogJump;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
@@ -358,7 +357,6 @@ namespace Flow.Launcher
_notifyIcon.Visible = false;
App.API.SaveAppAllSettings();
e.Cancel = true;
- await ImageLoader.WaitSaveAsync();
await PluginManager.DisposePluginsAsync();
Notification.Uninstall();
// After plugins are all disposed, we shutdown application to close app
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index e0ed105cf..0f66db773 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -74,7 +74,7 @@ namespace Flow.Launcher
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")]
- public async void RestartApp()
+ public void RestartApp()
{
_mainVM.Hide();
@@ -83,9 +83,6 @@ namespace Flow.Launcher
// which will cause ungraceful exit
SaveAppAllSettings();
- // Wait for all image caches to be saved before restarting
- await ImageLoader.WaitSaveAsync();
-
// Restart requires Squirrel's Update.exe to be present in the parent folder,
// it is only published from the project's release pipeline. When debugging without it,
// the project may not restart or just terminates. This is expected.
@@ -115,8 +112,8 @@ namespace Flow.Launcher
_settings.Save();
PluginManager.Save();
_mainVM.Save();
+ ImageLoader.Save();
}
- _ = ImageLoader.SaveAsync();
}
public Task ReloadAllPluginData() => PluginManager.ReloadDataAsync();
From e06e6e2b5ab0a25c72a57c2387aa8146ff2470da Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 13 Aug 2025 14:01:04 +0800
Subject: [PATCH 1673/1798] Load images into ImageCache
---
Flow.Launcher.Infrastructure/Image/ImageLoader.cs | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
index 758f9f557..64d323de6 100644
--- a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
+++ b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
@@ -24,9 +24,9 @@ namespace Flow.Launcher.Infrastructure.Image
private static readonly ConcurrentDictionary GuidToKey = new();
private static IImageHashGenerator _hashGenerator;
private static readonly bool EnableImageHash = true;
- public static ImageSource Image { get; } = new BitmapImage(new Uri(Constant.ImageIcon));
- public static ImageSource MissingImage { get; } = new BitmapImage(new Uri(Constant.MissingImgIcon));
- public static ImageSource LoadingImage { get; } = new BitmapImage(new Uri(Constant.LoadingImgIcon));
+ public static ImageSource Image => ImageCache[Constant.ImageIcon, false];
+ public static ImageSource MissingImage => ImageCache[Constant.MissingImgIcon, false];
+ public static ImageSource LoadingImage => ImageCache[Constant.LoadingImgIcon, false];
public const int SmallIconSize = 64;
public const int FullIconSize = 256;
public const int FullImageSize = 320;
@@ -46,7 +46,7 @@ namespace Flow.Launcher.Infrastructure.Image
ImageCache.Initialize(usage);
- foreach (var icon in new[] { Constant.DefaultIcon, Constant.MissingImgIcon })
+ foreach (var icon in new[] { Constant.DefaultIcon, Constant.ImageIcon, Constant.MissingImgIcon, Constant.LoadingImgIcon })
{
ImageSource img = new BitmapImage(new Uri(icon));
img.Freeze();
@@ -163,7 +163,7 @@ namespace Flow.Launcher.Infrastructure.Image
Log.Exception(ClassName, $"Failed to get thumbnail for {path} on first try", e);
Log.Exception(ClassName, $"Failed to get thumbnail for {path} on second try", e2);
- ImageSource image = ImageCache[Constant.MissingImgIcon, false];
+ ImageSource image = MissingImage;
ImageCache[path, false] = image;
imageResult = new ImageResult(image, ImageType.Error);
}
@@ -262,7 +262,7 @@ namespace Flow.Launcher.Infrastructure.Image
}
else
{
- image = ImageCache[Constant.MissingImgIcon, false];
+ image = MissingImage;
path = Constant.MissingImgIcon;
}
From 3727bff8651d53475158f482fa8dd21ba93fa0b0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 13 Aug 2025 14:19:52 +0800
Subject: [PATCH 1674/1798] Fix typos
---
Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
index d36b05ed0..15200f5aa 100644
--- a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
@@ -12,7 +12,7 @@ using MemoryPack;
namespace Flow.Launcher.Infrastructure.Storage
{
///
- /// Stroage object using binary data
+ /// Storage object using binary data
/// Normally, it has better performance, but not readable
///
///
From 8c6f9c9875d549f123fe938da425931e93fdf9c3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 13 Aug 2025 20:26:23 +0800
Subject: [PATCH 1675/1798] Add new api Result.QuerySuggestionText
---
Flow.Launcher.Plugin/Result.cs | 6 ++++++
Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs | 8 +++++---
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs
index a459e9ee6..b9f3ba45b 100644
--- a/Flow.Launcher.Plugin/Result.cs
+++ b/Flow.Launcher.Plugin/Result.cs
@@ -257,6 +257,12 @@ namespace Flow.Launcher.Plugin
///
public bool ShowBadge { get; set; } = false;
+ ///
+ /// This holds the text which can be shown as a query suggestion.
+ ///
+ /// When a value is not set, the will be used.
+ public string QuerySuggestionText { get; set; }
+
///
/// Run this result, asynchronously
///
diff --git a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs
index eb492e334..270dac4dc 100644
--- a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs
+++ b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs
@@ -33,15 +33,17 @@ public class QuerySuggestionBoxConverter : IMultiValueConverter
{
var selectedResult = selectedItem.Result;
var selectedResultActionKeyword = string.IsNullOrEmpty(selectedResult.ActionKeywordAssigned) ? "" : selectedResult.ActionKeywordAssigned + " ";
- var selectedResultPossibleSuggestion = selectedResultActionKeyword + selectedResult.Title;
+ var selectedResultPossibleSuggestion = selectedResultActionKeyword +
+ (string.IsNullOrEmpty(selectedResult.QuerySuggestionText) ?
+ selectedResult.Title :
+ selectedResult.QuerySuggestionText);
if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase))
return string.Empty;
-
// For AutocompleteQueryCommand.
// When user typed lower case and result title is uppercase, we still want to display suggestion
- selectedItem.QuerySuggestionText = queryText + selectedResultPossibleSuggestion.Substring(queryText.Length);
+ selectedItem.QuerySuggestionText = string.Concat(queryText, selectedResultPossibleSuggestion.AsSpan(queryText.Length));
// Check if Text will be larger than our QueryTextBox
Typeface typeface = new Typeface(queryTextBox.FontFamily, queryTextBox.FontStyle, queryTextBox.FontWeight, queryTextBox.FontStretch);
From 2a1584e2dd38815111cd927aba4876946989f7ab Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 13 Aug 2025 20:43:51 +0800
Subject: [PATCH 1676/1798] Add code comments
---
Flow.Launcher.Plugin/Result.cs | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs
index b9f3ba45b..76d3d7d34 100644
--- a/Flow.Launcher.Plugin/Result.cs
+++ b/Flow.Launcher.Plugin/Result.cs
@@ -260,7 +260,11 @@ namespace Flow.Launcher.Plugin
///
/// This holds the text which can be shown as a query suggestion.
///
- /// When a value is not set, the will be used.
+ ///
+ /// When a value is not set, the will be used.
+ /// If the it does not start with the query text, it will not be shown as a suggestion.
+ /// So make sure to set this value to start with the query text.
+ ///
public string QuerySuggestionText { get; set; }
///
From 063836266decfce8ed31ab7113b6d06b6b4c8d7e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 13 Aug 2025 20:44:00 +0800
Subject: [PATCH 1677/1798] Fix Result.Clone
---
Flow.Launcher.Plugin/Result.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs
index 76d3d7d34..fb4313e36 100644
--- a/Flow.Launcher.Plugin/Result.cs
+++ b/Flow.Launcher.Plugin/Result.cs
@@ -317,7 +317,8 @@ namespace Flow.Launcher.Plugin
Preview = Preview,
AddSelectedCount = AddSelectedCount,
RecordKey = RecordKey,
- ShowBadge = ShowBadge
+ ShowBadge = ShowBadge,
+ QuerySuggestionText = QuerySuggestionText
};
}
From c895b2acb0cc0364067c5fd89b3e7f6cb62630a0 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 13 Aug 2025 20:53:53 +0800
Subject: [PATCH 1678/1798] Improve selectedResultPossibleSuggestion check
logic
---
.../Converters/QuerySuggestionBoxConverter.cs | 32 ++++++++++++++++---
1 file changed, 27 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs
index 270dac4dc..c2d7d016c 100644
--- a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs
+++ b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs
@@ -33,12 +33,34 @@ public class QuerySuggestionBoxConverter : IMultiValueConverter
{
var selectedResult = selectedItem.Result;
var selectedResultActionKeyword = string.IsNullOrEmpty(selectedResult.ActionKeywordAssigned) ? "" : selectedResult.ActionKeywordAssigned + " ";
- var selectedResultPossibleSuggestion = selectedResultActionKeyword +
- (string.IsNullOrEmpty(selectedResult.QuerySuggestionText) ?
- selectedResult.Title :
- selectedResult.QuerySuggestionText);
- if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase))
+ string selectedResultPossibleSuggestion = null;
+
+ // Firstly check if the result has QuerySuggestionText
+ if (!string.IsNullOrEmpty(selectedResult.QuerySuggestionText))
+ {
+ selectedResultPossibleSuggestion = selectedResultActionKeyword + selectedResult.QuerySuggestionText;
+
+ // If this QuerySuggestionText does not start with the queryText, set it to null
+ if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase))
+ {
+ selectedResultPossibleSuggestion = null;
+ }
+ }
+
+ // Then check Title as suggestion
+ if (string.IsNullOrEmpty(selectedResultPossibleSuggestion))
+ {
+ selectedResultPossibleSuggestion = selectedResultActionKeyword + selectedResult.Title;
+
+ // If this QuerySuggestionText does not start with the queryText, set it to null
+ if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase))
+ {
+ selectedResultPossibleSuggestion = null;
+ }
+ }
+
+ if (string.IsNullOrEmpty(selectedResultPossibleSuggestion))
return string.Empty;
// For AutocompleteQueryCommand.
From bf07f2e72c9e4ffd660c8689cb478b99e291fe4f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Wed, 13 Aug 2025 21:00:17 +0800
Subject: [PATCH 1679/1798] Improve xml documents
---
Flow.Launcher.Plugin/Result.cs | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs
index fb4313e36..2c9b8d4fd 100644
--- a/Flow.Launcher.Plugin/Result.cs
+++ b/Flow.Launcher.Plugin/Result.cs
@@ -57,7 +57,10 @@ namespace Flow.Launcher.Plugin
/// for user on the plugin result. If autocomplete action for example is tab, pressing tab will have
/// the default constructed autocomplete text (result's Title), or the text provided here if not empty.
///
- /// When a value is not set, the will be used.
+ ///
+ /// When a value is not set, the will be used.
+ /// Please include the action keyword prefix when necessary because Flow does not prepend it automatically.
+ ///
public string AutoCompleteText { get; set; }
///
@@ -262,6 +265,7 @@ namespace Flow.Launcher.Plugin
///
///
/// When a value is not set, the will be used.
+ /// Do not include the action keyword prefix because Flow prepends it automatically.
/// If the it does not start with the query text, it will not be shown as a suggestion.
/// So make sure to set this value to start with the query text.
///
From 361c2a4a249e859d11468bb541d480691bc36c4c Mon Sep 17 00:00:00 2001
From: zoltanvi
Date: Wed, 13 Aug 2025 16:15:10 +0200
Subject: [PATCH 1680/1798] Revert language files other than english
---
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml | 1 -
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml | 1 -
24 files changed, 24 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
index edb44f8f4..cefb5d1d1 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
@@ -11,7 +11,6 @@
تعديلإضافةمفعل
- الوضع الخاصمفعلمُعطّلتأكيد
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
index 2e49f4965..ca98581c3 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
@@ -11,7 +11,6 @@
EditovatPřidatPovoleno
- Soukromý režimPovolenoDeaktivovánPotvrdit
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
index 41e96eb60..b1113acb7 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
@@ -11,7 +11,6 @@
RedigerTilføjEnabled
- Privat tilstandEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
index 41a798d44..2a7dca596 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
@@ -11,7 +11,6 @@
BearbeitenHinzufügenAktiviert
- Privater ModusAktiviertDeaktiviertBestätigen
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
index 376b36b4d..3ce22bb78 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
@@ -11,7 +11,6 @@
EditarAñadirEnabled
- Modo privadoEnabledDisabledConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
index 5c956d8f8..7f14b59c6 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
@@ -11,7 +11,6 @@
EditarAñadirActivado
- Modo privadoActivadoDesactivadoConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
index 3c9003ebf..f04cfb48a 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
@@ -11,7 +11,6 @@
ModifierAjouterActivé
- Mode privéActivéDésactivéConfirmer
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
index 583f63bde..78ee7ca7d 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
@@ -11,7 +11,6 @@
ערוהוסףמופעל
- מצב פרטימופעלמושבתאישו
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
index 7f7db8b96..db2a4dfeb 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
@@ -11,7 +11,6 @@
ModificaAggiungiAbilitato
- Modalità privataAbilitatoDisabilitatoConferma
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
index b5cdc65ba..4112f41ff 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
@@ -11,7 +11,6 @@
編集追加Enabled
- プライベートモードEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
index 373202439..c8f069ca7 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
@@ -11,7 +11,6 @@
편집추가켬
- 비공개 모드켬Disabled확인
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
index e6ebc30e4..9f793c43f 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
@@ -11,7 +11,6 @@
RedigerLegg tilAktivert
- Private modusAktivertDeaktivertBekreft
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
index 25187d0b6..a18710324 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
@@ -11,7 +11,6 @@
BewerkenToevoegenEnabled
- PrivémodusEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
index bc32a1b7e..05ee39777 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
@@ -11,7 +11,6 @@
EdytujDodajAktywny
- Tryb prywatnyAktywnyWyłączonyPotwierdź
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
index 8ece2d0b7..6f0d7fcc9 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
@@ -11,7 +11,6 @@
EditarAdicionarEnabled
- Modo privadoEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
index 22be076cb..1a2476a2c 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
@@ -11,7 +11,6 @@
EditarAdicionarAtivo
- Modo privadoAtivoInativoConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
index 67435b5b9..1fd9aca96 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
@@ -11,7 +11,6 @@
РедактироватьДобавитьEnabled
- Приватный режимEnabledОтключёнConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
index baac85bd7..1afcdb360 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
@@ -11,7 +11,6 @@
UpraviťPridaťPovolené
- Súkromný režimZapnutéVypnutéPotvrdiť
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
index dee50fac7..06707b4af 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
@@ -11,7 +11,6 @@
IzmeniDodajEnabled
- Privatni RežimEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
index f51f314e3..b37070d93 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
@@ -11,7 +11,6 @@
DüzenleEkleEnabled
- Gizli modEnabledDisabledOnayla
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
index a7cf61340..51e1efc6e 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
@@ -11,7 +11,6 @@
РедагуватиДодатиУвімкнено
- Приватний режимУвімкненоВимкненоПідтвердити
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
index fb99024ec..731275c5e 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
@@ -11,7 +11,6 @@
SửaThêmĐã bật
- Chế độ riêng tưĐã bậtVô hiệu hóaXác nhận
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
index edec299c6..7b8a72d6b 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
@@ -11,7 +11,6 @@
编辑添加启用
- 隐私模式已启用已禁用确认
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
index f8e3a7442..727b2f4a9 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
@@ -11,7 +11,6 @@
編輯新增已啟用
- 隱私模式已啟用Disabled確定
From 4cbc9f18c78ef208a6851f9fb6f37ebc7b6ab1e7 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 14 Aug 2025 14:24:54 +0800
Subject: [PATCH 1681/1798] Add error handler for DroplexPackage.Drop
---
.../Environments/PythonEnvironment.cs | 17 +++++++++++++++--
.../Environments/TypeScriptEnvironment.cs | 17 +++++++++++++++--
.../Environments/TypeScriptV2Environment.cs | 17 +++++++++++++++--
Flow.Launcher/Languages/en.xaml | 4 ++++
4 files changed, 49 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs
index 455ee096d..89286dfb0 100644
--- a/Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/PythonEnvironment.cs
@@ -11,6 +11,8 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
{
internal class PythonEnvironment : AbstractPluginEnvironment
{
+ private static readonly string ClassName = nameof(PythonEnvironment);
+
internal override string Language => AllowedLanguage.Python;
internal override string EnvName => DataLocation.PythonEnvironmentName;
@@ -39,9 +41,20 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
// Python 3.11.4 is no longer Windows 7 compatible. If user is on Win 7 and
// uses Python plugin they need to custom install and use v3.8.9
- JTF.Run(() => DroplexPackage.Drop(App.python_3_11_4_embeddable, InstallPath));
+ JTF.Run(async () =>
+ {
+ try
+ {
+ await DroplexPackage.Drop(App.python_3_11_4_embeddable, InstallPath);
- PluginsSettingsFilePath = ExecutablePath;
+ PluginsSettingsFilePath = ExecutablePath;
+ }
+ catch (System.Exception e)
+ {
+ API.ShowMsgError(API.GetTranslation("failToInstallPythonEnv"));
+ API.LogException(ClassName, "Failed to install Python environment", e);
+ }
+ });
}
internal override PluginPair CreatePluginPair(string filePath, PluginMetadata metadata)
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs
index 12965286f..724ae20f4 100644
--- a/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptEnvironment.cs
@@ -11,6 +11,8 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
{
internal class TypeScriptEnvironment : AbstractPluginEnvironment
{
+ private static readonly string ClassName = nameof(TypeScriptEnvironment);
+
internal override string Language => AllowedLanguage.TypeScript;
internal override string EnvName => DataLocation.NodeEnvironmentName;
@@ -34,9 +36,20 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
{
FilesFolders.RemoveFolderIfExists(InstallPath, (s) => API.ShowMsgBox(s));
- JTF.Run(() => DroplexPackage.Drop(App.nodejs_16_18_0, InstallPath));
+ JTF.Run(async () =>
+ {
+ try
+ {
+ await DroplexPackage.Drop(App.nodejs_16_18_0, InstallPath);
- PluginsSettingsFilePath = ExecutablePath;
+ PluginsSettingsFilePath = ExecutablePath;
+ }
+ catch (System.Exception e)
+ {
+ API.ShowMsgError(API.GetTranslation("failToInstallTypeScriptEnv"));
+ API.LogException(ClassName, "Failed to install TypeScript environment", e);
+ }
+ });
}
internal override PluginPair CreatePluginPair(string filePath, PluginMetadata metadata)
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs
index 6960b79c9..6a32664a1 100644
--- a/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs
@@ -11,6 +11,8 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
{
internal class TypeScriptV2Environment : AbstractPluginEnvironment
{
+ private static readonly string ClassName = nameof(TypeScriptV2Environment);
+
internal override string Language => AllowedLanguage.TypeScriptV2;
internal override string EnvName => DataLocation.NodeEnvironmentName;
@@ -34,9 +36,20 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
{
FilesFolders.RemoveFolderIfExists(InstallPath, (s) => API.ShowMsgBox(s));
- JTF.Run(() => DroplexPackage.Drop(App.nodejs_16_18_0, InstallPath));
+ JTF.Run(async () =>
+ {
+ try
+ {
+ await DroplexPackage.Drop(App.nodejs_16_18_0, InstallPath);
- PluginsSettingsFilePath = ExecutablePath;
+ PluginsSettingsFilePath = ExecutablePath;
+ }
+ catch (System.Exception e)
+ {
+ API.ShowMsgError(API.GetTranslation("failToInstallTypeScriptEnv"));
+ API.LogException(ClassName, "Failed to install TypeScript environment", e);
+ }
+ });
}
internal override PluginPair CreatePluginPair(string filePath, PluginMetadata metadata)
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index bf6cb674e..a9694eba8 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -34,6 +34,10 @@
Please try againUnable to parse Http Proxy
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.Failed to unregister hotkey "{0}". Please try again or see log for details
From 4a0f126c34b16ee6aa478faa4cdea98eea72c7a3 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 14 Aug 2025 14:39:41 +0800
Subject: [PATCH 1682/1798] Use ShowMsgError instead of ShowMsgBox
---
Flow.Launcher/PublicAPIInstance.cs | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index e0ed105cf..37bc16d58 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -382,21 +382,17 @@ namespace Flow.Launcher
catch (Win32Exception ex) when (ex.NativeErrorCode == 2)
{
LogError(ClassName, "File Manager not found");
- ShowMsgBox(
+ ShowMsgError(
string.Format(GetTranslation("fileManagerNotFound"), ex.Message),
- GetTranslation("fileManagerNotFoundTitle"),
- MessageBoxButton.OK,
- MessageBoxImage.Error
+ GetTranslation("fileManagerNotFoundTitle")
);
}
catch (Exception ex)
{
LogException(ClassName, "Failed to open folder", ex);
- ShowMsgBox(
+ ShowMsgError(
string.Format(GetTranslation("folderOpenError"), ex.Message),
- GetTranslation("errorTitle"),
- MessageBoxButton.OK,
- MessageBoxImage.Error
+ GetTranslation("errorTitle")
);
}
}
@@ -424,11 +420,9 @@ namespace Flow.Launcher
{
var tabOrWindow = browserInfo.OpenInTab ? "tab" : "window";
LogException(ClassName, $"Failed to open URL in browser {tabOrWindow}: {path}, {inPrivate ?? browserInfo.EnablePrivate}, {browserInfo.PrivateArg}", e);
- ShowMsgBox(
+ ShowMsgError(
GetTranslation("browserOpenError"),
- GetTranslation("errorTitle"),
- MessageBoxButton.OK,
- MessageBoxImage.Error
+ GetTranslation("errorTitle")
);
}
}
From c00d8db5ade73f815507bfe9949c4e3bf1d76263 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 14 Aug 2025 14:39:58 +0800
Subject: [PATCH 1683/1798] Handle E_ABORT
---
Flow.Launcher/PublicAPIInstance.cs | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index 37bc16d58..002e3c58b 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;
@@ -379,6 +380,21 @@ namespace Flow.Launcher
explorer.Start();
}
}
+ catch (COMException ex) when (ex.ErrorCode == unchecked((int)0x80004004))
+ {
+ /*
+ * The COMException with HResult 0x80004004 is E_ABORT (operation aborted).
+ * Shell APIs often return this when the operation is canceled or the shell cannot complete it cleanly.
+ * It most likely comes from Win32Helper.OpenFolderAndSelectFile(targetPath).
+ * Typical triggers:
+ * The target file/folder was deleted/moved between computing targetPath and the shell call.
+ * The folder is on an offline network/removable drive.
+ * Explorer is restarting/busy and aborts the request.
+ * A selection request to a new/closing Explorer window is canceled.
+ * Because it is commonly user- or environment-driven and not actionable,
+ * we should treat it as expected noise and ignore it to avoid bothering users.
+ */
+ }
catch (Win32Exception ex) when (ex.NativeErrorCode == 2)
{
LogError(ClassName, "File Manager not found");
From cdd5bf1a763f2bf902d627d465624390e7a67495 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 14 Aug 2025 14:51:50 +0800
Subject: [PATCH 1684/1798] Swap title/subtitle for ShowMsgError
---
Flow.Launcher/PublicAPIInstance.cs | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index 002e3c58b..38ca18147 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -399,16 +399,16 @@ namespace Flow.Launcher
{
LogError(ClassName, "File Manager not found");
ShowMsgError(
- string.Format(GetTranslation("fileManagerNotFound"), ex.Message),
- GetTranslation("fileManagerNotFoundTitle")
+ GetTranslation("fileManagerNotFoundTitle"),
+ string.Format(GetTranslation("fileManagerNotFound"), ex.Message)
);
}
catch (Exception ex)
{
LogException(ClassName, "Failed to open folder", ex);
ShowMsgError(
- string.Format(GetTranslation("folderOpenError"), ex.Message),
- GetTranslation("errorTitle")
+ GetTranslation("errorTitle"),
+ string.Format(GetTranslation("folderOpenError"), ex.Message)
);
}
}
@@ -437,8 +437,8 @@ namespace Flow.Launcher
var tabOrWindow = browserInfo.OpenInTab ? "tab" : "window";
LogException(ClassName, $"Failed to open URL in browser {tabOrWindow}: {path}, {inPrivate ?? browserInfo.EnablePrivate}, {browserInfo.PrivateArg}", e);
ShowMsgError(
- GetTranslation("browserOpenError"),
- GetTranslation("errorTitle")
+ GetTranslation("errorTitle"),
+ GetTranslation("browserOpenError")
);
}
}
From 7264f5493f8a16bc36cfbc769dff3b5e232d0a92 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 14 Aug 2025 18:34:03 +0800
Subject: [PATCH 1685/1798] Use ShowMsgError for plugin load fail message
---
Flow.Launcher.Core/Plugin/PluginsLoader.cs | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
index 9d511297e..fbd0d07be 100644
--- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs
+++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
@@ -126,10 +126,9 @@ namespace Flow.Launcher.Core.Plugin
_ = Task.Run(() =>
{
- API.ShowMsgBox($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" +
- $"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" +
- API.GetTranslation("referToLogs"), string.Empty,
- MessageBoxButton.OK, MessageBoxImage.Warning);
+ API.ShowMsgError($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" +
+ $"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" +
+ API.GetTranslation("referToLogs"));
});
}
From 556dce9bed5345ab27679ba42ebe9fd258378c05 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 14 Aug 2025 19:22:03 +0800
Subject: [PATCH 1686/1798] Remove unnecessary Task.Run
---
Flow.Launcher.Core/Plugin/PluginsLoader.cs | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
index fbd0d07be..e9e5ee367 100644
--- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs
+++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
@@ -124,12 +124,9 @@ namespace Flow.Launcher.Core.Plugin
API.GetTranslation("pluginsHaveErrored") :
API.GetTranslation("pluginHasErrored");
- _ = Task.Run(() =>
- {
- API.ShowMsgError($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" +
- $"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" +
- API.GetTranslation("referToLogs"));
- });
+ API.ShowMsgError($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" +
+ $"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" +
+ API.GetTranslation("referToLogs"));
}
return plugins;
From 693636c94221e6d8778e4532b9a088f662011737 Mon Sep 17 00:00:00 2001
From: dcog989
Date: Thu, 14 Aug 2025 13:06:39 +0100
Subject: [PATCH 1687/1798] Clean orphan files, temp fix
Clean orphan SQLite files on start-up that are being created by BrowserBookmark plugin. This is a temporary solution to prevent users' cache accumulating very large numbers of files / MB.
Will be addressed properly with new version of plugin (complete rewrite for Flow Launcher V2).
---
.../Main.cs | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
index 33d7725f1..07ce510fb 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs
@@ -36,6 +36,26 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex
_faviconCacheDir = Path.Combine(
context.CurrentPluginMetadata.PluginCacheDirectoryPath,
"FaviconCache");
+
+ try
+ {
+ if (Directory.Exists(_faviconCacheDir))
+ {
+ var files = Directory.GetFiles(_faviconCacheDir);
+ foreach (var file in files)
+ {
+ var extension = Path.GetExtension(file);
+ if (extension is ".db-shm" or ".db-wal" or ".sqlite-shm" or ".sqlite-wal")
+ {
+ File.Delete(file);
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Context.API.LogException(ClassName, "Failed to clean up orphaned cache files.", e);
+ }
LoadBookmarksIfEnabled();
}
From d8f8de2abe057f62ce60cfdffc24b27fa4ec8eac Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 16 Aug 2025 11:41:25 +0800
Subject: [PATCH 1688/1798] =?UTF-8?q?Use=20=D0=A1=D1=80=D0=BF=D1=81=D0=BA?=
=?UTF-8?q?=D0=B8=20instead=20of=20=D0=A1=D1=80=D0=BF=D1=81=D0=BA=D0=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Flow.Launcher.Core/Resource/AvailableLanguages.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Resource/AvailableLanguages.cs b/Flow.Launcher.Core/Resource/AvailableLanguages.cs
index 34eaf29eb..5534ea172 100644
--- a/Flow.Launcher.Core/Resource/AvailableLanguages.cs
+++ b/Flow.Launcher.Core/Resource/AvailableLanguages.cs
@@ -17,7 +17,7 @@ namespace Flow.Launcher.Core.Resource
public static Language German = new Language("de", "Deutsch");
public static Language Korean = new Language("ko", "한국어");
public static Language Serbian = new Language("sr", "Srpski");
- public static Language Serbian_Cyrillic = new Language("sr-Cyrl-RS", "Српска");
+ public static Language Serbian_Cyrillic = new Language("sr-Cyrl-RS", "Српски");
public static Language Portuguese_Portugal = new Language("pt-pt", "Português");
public static Language Portuguese_Brazil = new Language("pt-br", "Português (Brasil)");
public static Language Spanish = new Language("es", "Spanish");
From 9f8ff121553a9e23246086ecd636bccc714d77df Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 17 Aug 2025 14:13:32 +0800
Subject: [PATCH 1689/1798] Bind DataContext to itself
---
Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
index 0daa36e63..b9417addf 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
@@ -5,6 +5,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sys="clr-namespace:System;assembly=System.Runtime"
+ DataContext="{Binding RelativeSource={RelativeSource Self}}"
d:DesignHeight="300"
d:DesignWidth="300"
mc:Ignorable="d">
From f1628eec66e7bd26b4e68aaae48157157d6c96ad Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 17 Aug 2025 14:14:02 +0800
Subject: [PATCH 1690/1798] Add MaxHeight & MaxWidth for preview image
---
.../Views/PreviewPanel.xaml | 15 +++------------
1 file changed, 3 insertions(+), 12 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
index b9417addf..08e2c8f24 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
@@ -21,19 +21,10 @@
-
-
-
-
+ Source="{Binding PreviewImage, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" />
Date: Sun, 17 Aug 2025 14:14:17 +0800
Subject: [PATCH 1691/1798] Show FileName under preview image
---
Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
index 08e2c8f24..aad27e764 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
@@ -31,7 +31,7 @@
HorizontalAlignment="Stretch"
VerticalAlignment="Top"
Style="{DynamicResource PreviewItemTitleStyle}"
- Text="{Binding Result.Title}"
+ Text="{Binding FileName}"
TextAlignment="Center"
TextWrapping="Wrap" />
From 21299d153f481d56400b52271da40a19ef29a0ba Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 17 Aug 2025 14:18:18 +0800
Subject: [PATCH 1692/1798] Add FileName & FilePath as public properties
---
.../Views/PreviewPanel.xaml.cs | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index 6e3cf8466..c931a014e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -21,7 +21,8 @@ public partial class PreviewPanel : UserControl
{
private static readonly string ClassName = nameof(PreviewPanel);
- private string FilePath { get; }
+ public string FilePath { get; }
+ public string FileName { get; }
public string FileSize { get; private set; } = Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
public string CreatedAt { get; } = "";
public string LastModifiedAt { get; } = "";
@@ -57,11 +58,11 @@ public partial class PreviewPanel : UserControl
public PreviewPanel(Settings settings, string filePath, ResultType type)
{
- InitializeComponent();
-
Settings = settings;
-
FilePath = filePath;
+ FileName = Path.GetFileName(filePath);
+
+ InitializeComponent();
if (Settings.ShowFileSizeInPreviewPanel)
{
From ce8b544ff5293afb4fcd3aaf22cddbad23118204 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 17 Aug 2025 14:20:55 +0800
Subject: [PATCH 1693/1798] Display FilePath in preview panel
---
Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
index aad27e764..fe1df0dbe 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
@@ -56,7 +56,7 @@
+ Text="{Binding FilePath}" />
Date: Sun, 17 Aug 2025 14:22:50 +0800
Subject: [PATCH 1694/1798] Remove unused trigger
---
.../Views/PreviewPanel.xaml | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
index fe1df0dbe..e4423ca47 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
@@ -37,15 +37,6 @@
-
-
-
Date: Sun, 17 Aug 2025 14:23:04 +0800
Subject: [PATCH 1695/1798] Apply style formatter
---
Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
index e4423ca47..a43297951 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
@@ -5,9 +5,9 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sys="clr-namespace:System;assembly=System.Runtime"
- DataContext="{Binding RelativeSource={RelativeSource Self}}"
d:DesignHeight="300"
d:DesignWidth="300"
+ DataContext="{Binding RelativeSource={RelativeSource Self}}"
mc:Ignorable="d">
From 6751942179585433c153d4741234ef28faf0c126 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 17 Aug 2025 14:30:03 +0800
Subject: [PATCH 1696/1798] Use Binding instead of RelativeResource for code
quality
---
.../Views/PreviewPanel.xaml | 32 +++++++++----------
.../Views/PreviewPanel.xaml.cs | 27 ++++++++--------
2 files changed, 29 insertions(+), 30 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
index a43297951..4479571e3 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml
@@ -24,14 +24,14 @@
MaxWidth="96"
MaxHeight="96"
Margin="5 12 8 0"
- Source="{Binding PreviewImage, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" />
+ Source="{Binding PreviewImage, IsAsync=True, Mode=OneWay}" />
@@ -47,7 +47,7 @@
+ Text="{Binding FilePath, Mode=OneTime}" />
-
-
-
+
+
+
@@ -70,7 +70,7 @@
-
+
@@ -88,7 +88,7 @@
Style="{DynamicResource PreviewItemSubTitleStyle}"
Text="{DynamicResource FileSize}"
TextWrapping="Wrap"
- Visibility="{Binding FileSizeVisibility, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" />
+ Visibility="{Binding FileSizeVisibility, Mode=OneTime}" />
+ Visibility="{Binding FileSizeVisibility, Mode=OneTime}" />
+ Visibility="{Binding CreatedAtVisibility, Mode=OneTime}" />
+ Visibility="{Binding CreatedAtVisibility, Mode=OneTime}" />
+ Visibility="{Binding LastModifiedAtVisibility, Mode=OneTime}" />
+ Visibility="{Binding LastModifiedAtVisibility, Mode=OneTime}" />
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index c931a014e..4dd0588ee 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -23,21 +23,20 @@ public partial class PreviewPanel : UserControl
public string FilePath { get; }
public string FileName { get; }
- public string FileSize { get; private set; } = Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
- public string CreatedAt { get; } = "";
- public string LastModifiedAt { get; } = "";
- private ImageSource _previewImage = new BitmapImage();
- private Settings Settings { get; }
- public ImageSource PreviewImage
- {
- get => _previewImage;
- private set
- {
- _previewImage = value;
- OnPropertyChanged();
- }
- }
+ [ObservableProperty]
+ private string _fileSize = Main.Context.API.GetTranslation("plugin_explorer_plugin_tooltip_more_info_unknown");
+
+ [ObservableProperty]
+ private string _createdAt = "";
+
+ [ObservableProperty]
+ private string _lastModifiedAt = "";
+
+ [ObservableProperty]
+ private ImageSource _previewImage = new BitmapImage();
+
+ private Settings Settings { get; }
public Visibility FileSizeVisibility => Settings.ShowFileSizeInPreviewPanel
? Visibility.Visible
From 922c3d561153931a61eae909c10eca44bfcd8f5f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 17 Aug 2025 16:54:41 +0800
Subject: [PATCH 1697/1798] Upgrade nuget packages & Update lock files
---
Flow.Launcher.Core/Flow.Launcher.Core.csproj | 2 +-
Flow.Launcher.Core/packages.lock.json | 44 +--
.../Flow.Launcher.Infrastructure.csproj | 8 +-
.../packages.lock.json | 38 +-
.../Flow.Launcher.Plugin.csproj | 2 +-
Flow.Launcher.Plugin/packages.lock.json | 6 +-
Flow.Launcher.Test/Flow.Launcher.Test.csproj | 4 +-
Flow.Launcher/Flow.Launcher.csproj | 6 +-
Flow.Launcher/packages.lock.json | 356 +++++++++---------
...low.Launcher.Plugin.BrowserBookmark.csproj | 4 +-
.../Flow.Launcher.Plugin.Calculator.csproj | 2 +-
.../Flow.Launcher.Plugin.Explorer.csproj | 4 +-
.../Flow.Launcher.Plugin.Program.csproj | 4 +-
13 files changed, 240 insertions(+), 240 deletions(-)
diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
index 527950061..1aae953a4 100644
--- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj
+++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
@@ -55,7 +55,7 @@
-
+
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index caec08ebf..598662936 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -13,9 +13,9 @@
},
"FSharp.Core": {
"type": "Direct",
- "requested": "[9.0.300, )",
- "resolved": "9.0.300",
- "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ=="
+ "requested": "[9.0.303, )",
+ "resolved": "9.0.303",
+ "contentHash": "6JlV8aD8qQvcmfoe/PMOxCHXc0uX4lR23u0fAyQtnVQxYULLoTZgwgZHSnRcuUHOvS3wULFWcwdnP1iwslH60g=="
},
"Meziantou.Framework.Win32.Jobs": {
"type": "Direct",
@@ -90,8 +90,8 @@
},
"JetBrains.Annotations": {
"type": "Transitive",
- "resolved": "2024.3.0",
- "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug=="
+ "resolved": "2025.2.0",
+ "contentHash": "2BvMkOSW+50EbQFhWFIPWTqmcDLiyyjwkMN7lN386bhP2vN/7ts5t59qu11HtenmHFxqDzaD8J1fFoh+QTOzVA=="
},
"MemoryPack": {
"type": "Transitive",
@@ -161,8 +161,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
+ "resolved": "9.0.8",
+ "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA=="
},
"Mono.Cecil": {
"type": "Transitive",
@@ -199,21 +199,21 @@
},
"NLog": {
"type": "Transitive",
- "resolved": "6.0.1",
- "contentHash": "qDWiqy8/xdpZKtHna/645KbalwP86N2NFJEzfqhcv+Si4V2iNaEfR/dCneuF/4+Dcwl3f7jHMXj3ndWYftV3Ug=="
+ "resolved": "6.0.3",
+ "contentHash": "5RMrpvadysflvDOi5ozD7aK1P+YL2DyZbQSxzE8qBKkw2pxPNOQA6vJtumcT6SuzE9qxhwGkQwMkLLaKnALwiw=="
},
"NLog.OutputDebugString": {
"type": "Transitive",
- "resolved": "6.0.1",
- "contentHash": "wwJCQLaHVzuRf8TsXB+EEdrzVvE3dnzCSMQMDgwkw3AXp8VSp3JSVF/Q/H0oEqggKgKhPs13hh3a7svyQr4s3A==",
+ "resolved": "6.0.3",
+ "contentHash": "0qojvaBMAruTDIbjRXMwft3hdkg8tPl0BMD8+tR8TpK78a8DrgKAq/h5LcHPQ/0xERZ66y+00bsn0n1VeJjlmg==",
"dependencies": {
- "NLog": "6.0.1"
+ "NLog": "6.0.3"
}
},
"SharpVectors.Wpf": {
"type": "Transitive",
- "resolved": "1.8.4.2",
- "contentHash": "PNxLkMBJnV8A+6yH9OqOlhLJegvWP/dvh0rAJp2l0kcrR+rB4R2tQ9vhUqka+UilH4atN8T6zvjDOizVyfz2Ng=="
+ "resolved": "1.8.5",
+ "contentHash": "WURdBDq5AE8RjKV9pFS7lNkJe81gxja9SaMGE4URq9GJUZ6M+5DGUL0Lm3B0iYW2/Meyowaz4ffGsyW+RBSTtg=="
},
"Splat": {
"type": "Transitive",
@@ -222,10 +222,10 @@
},
"System.Drawing.Common": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==",
+ "resolved": "9.0.8",
+ "contentHash": "ineIJmF+yuBEHGft9R153J9kmBFaeEfFL5Put5nzENneRcGGPUb3MvM8zrZ5pERQ0jPPSE3Wqw/clXvOq2F/Kw==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.7"
+ "Microsoft.Win32.SystemEvents": "9.0.8"
}
},
"System.IO.Pipelines": {
@@ -259,17 +259,17 @@
"MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.14.15, )",
"NHotkey.Wpf": "[3.0.0, )",
- "NLog": "[6.0.1, )",
- "NLog.OutputDebugString": "[6.0.1, )",
- "SharpVectors.Wpf": "[1.8.4.2, )",
- "System.Drawing.Common": "[9.0.7, )",
+ "NLog": "[6.0.3, )",
+ "NLog.OutputDebugString": "[6.0.3, )",
+ "SharpVectors.Wpf": "[1.8.5, )",
+ "System.Drawing.Common": "[9.0.8, )",
"ToolGood.Words.Pinyin": "[3.1.0.3, )"
}
},
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2024.3.0, )"
+ "JetBrains.Annotations": "[2025.2.0, )"
}
}
}
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 51b1d5175..7bb8786cd 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -68,13 +68,13 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+ all
-
-
+
+
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index 87b4bb6da..bcb3031e0 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -78,17 +78,17 @@
},
"NLog": {
"type": "Direct",
- "requested": "[6.0.1, )",
- "resolved": "6.0.1",
- "contentHash": "qDWiqy8/xdpZKtHna/645KbalwP86N2NFJEzfqhcv+Si4V2iNaEfR/dCneuF/4+Dcwl3f7jHMXj3ndWYftV3Ug=="
+ "requested": "[6.0.3, )",
+ "resolved": "6.0.3",
+ "contentHash": "5RMrpvadysflvDOi5ozD7aK1P+YL2DyZbQSxzE8qBKkw2pxPNOQA6vJtumcT6SuzE9qxhwGkQwMkLLaKnALwiw=="
},
"NLog.OutputDebugString": {
"type": "Direct",
- "requested": "[6.0.1, )",
- "resolved": "6.0.1",
- "contentHash": "wwJCQLaHVzuRf8TsXB+EEdrzVvE3dnzCSMQMDgwkw3AXp8VSp3JSVF/Q/H0oEqggKgKhPs13hh3a7svyQr4s3A==",
+ "requested": "[6.0.3, )",
+ "resolved": "6.0.3",
+ "contentHash": "0qojvaBMAruTDIbjRXMwft3hdkg8tPl0BMD8+tR8TpK78a8DrgKAq/h5LcHPQ/0xERZ66y+00bsn0n1VeJjlmg==",
"dependencies": {
- "NLog": "6.0.1"
+ "NLog": "6.0.3"
}
},
"PropertyChanged.Fody": {
@@ -102,17 +102,17 @@
},
"SharpVectors.Wpf": {
"type": "Direct",
- "requested": "[1.8.4.2, )",
- "resolved": "1.8.4.2",
- "contentHash": "PNxLkMBJnV8A+6yH9OqOlhLJegvWP/dvh0rAJp2l0kcrR+rB4R2tQ9vhUqka+UilH4atN8T6zvjDOizVyfz2Ng=="
+ "requested": "[1.8.5, )",
+ "resolved": "1.8.5",
+ "contentHash": "WURdBDq5AE8RjKV9pFS7lNkJe81gxja9SaMGE4URq9GJUZ6M+5DGUL0Lm3B0iYW2/Meyowaz4ffGsyW+RBSTtg=="
},
"System.Drawing.Common": {
"type": "Direct",
- "requested": "[9.0.7, )",
- "resolved": "9.0.7",
- "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==",
+ "requested": "[9.0.8, )",
+ "resolved": "9.0.8",
+ "contentHash": "ineIJmF+yuBEHGft9R153J9kmBFaeEfFL5Put5nzENneRcGGPUb3MvM8zrZ5pERQ0jPPSE3Wqw/clXvOq2F/Kw==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.7"
+ "Microsoft.Win32.SystemEvents": "9.0.8"
}
},
"ToolGood.Words.Pinyin": {
@@ -123,8 +123,8 @@
},
"JetBrains.Annotations": {
"type": "Transitive",
- "resolved": "2024.3.0",
- "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug=="
+ "resolved": "2025.2.0",
+ "contentHash": "2BvMkOSW+50EbQFhWFIPWTqmcDLiyyjwkMN7lN386bhP2vN/7ts5t59qu11HtenmHFxqDzaD8J1fFoh+QTOzVA=="
},
"MemoryPack.Core": {
"type": "Transitive",
@@ -156,8 +156,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
+ "resolved": "9.0.8",
+ "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA=="
},
"Microsoft.Windows.SDK.Win32Docs": {
"type": "Transitive",
@@ -190,7 +190,7 @@
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2024.3.0, )"
+ "JetBrains.Annotations": "[2025.2.0, )"
}
}
}
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index eee8d5f4e..ccb9332b4 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -73,7 +73,7 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Flow.Launcher.Plugin/packages.lock.json b/Flow.Launcher.Plugin/packages.lock.json
index af835c598..56b343e6b 100644
--- a/Flow.Launcher.Plugin/packages.lock.json
+++ b/Flow.Launcher.Plugin/packages.lock.json
@@ -10,9 +10,9 @@
},
"JetBrains.Annotations": {
"type": "Direct",
- "requested": "[2024.3.0, )",
- "resolved": "2024.3.0",
- "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug=="
+ "requested": "[2025.2.0, )",
+ "resolved": "2025.2.0",
+ "contentHash": "2BvMkOSW+50EbQFhWFIPWTqmcDLiyyjwkMN7lN386bhP2vN/7ts5t59qu11HtenmHFxqDzaD8J1fFoh+QTOzVA=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/Flow.Launcher.Test/Flow.Launcher.Test.csproj b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
index 33479c5a0..1164e5ebe 100644
--- a/Flow.Launcher.Test/Flow.Launcher.Test.csproj
+++ b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
@@ -49,8 +49,8 @@
-
-
+
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index fe84b5e1e..6d6b454c0 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -137,8 +137,8 @@
-
-
+
+
@@ -148,7 +148,7 @@
-
+
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index 1047b1f3f..483766978 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -71,41 +71,41 @@
},
"Microsoft.Extensions.DependencyInjection": {
"type": "Direct",
- "requested": "[9.0.7, )",
- "resolved": "9.0.7",
- "contentHash": "i05AYA91vgq0as84ROVCyltD2gnxaba/f1Qw2rG7mUsS0gv8cPTr1Gm7jPQHq7JTr4MJoQUcanLVs16tIOUJaQ==",
+ "requested": "[9.0.8, )",
+ "resolved": "9.0.8",
+ "contentHash": "JJjI2Fa+QtZcUyuNjbKn04OjIUX5IgFGFu/Xc+qvzh1rXdZHLcnqqVXhR4093bGirTwacRlHiVg1XYI9xum6QQ==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8"
}
},
"Microsoft.Extensions.Hosting": {
"type": "Direct",
- "requested": "[9.0.7, )",
- "resolved": "9.0.7",
- "contentHash": "Dkv55VfitwJjPUk9mFHxT9MJAd8su7eJNaCHhBU/Y9xFqw3ZNHwrpeptXeaXiaPtfQq+alMmawIz1Impk5pHkQ==",
+ "requested": "[9.0.8, )",
+ "resolved": "9.0.8",
+ "contentHash": "O2VlzORrBbS2it203k5FOHrudDdmdrJovA73P/shdRGeLzvet4e4yXhGx52V2PNjYBQ0IO5M4xiNcL+6xIX6Bg==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.7",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
- "Microsoft.Extensions.Configuration.Binder": "9.0.7",
- "Microsoft.Extensions.Configuration.CommandLine": "9.0.7",
- "Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.7",
- "Microsoft.Extensions.Configuration.FileExtensions": "9.0.7",
- "Microsoft.Extensions.Configuration.Json": "9.0.7",
- "Microsoft.Extensions.Configuration.UserSecrets": "9.0.7",
- "Microsoft.Extensions.DependencyInjection": "9.0.7",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
- "Microsoft.Extensions.Diagnostics": "9.0.7",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7",
- "Microsoft.Extensions.FileProviders.Physical": "9.0.7",
- "Microsoft.Extensions.Hosting.Abstractions": "9.0.7",
- "Microsoft.Extensions.Logging": "9.0.7",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
- "Microsoft.Extensions.Logging.Configuration": "9.0.7",
- "Microsoft.Extensions.Logging.Console": "9.0.7",
- "Microsoft.Extensions.Logging.Debug": "9.0.7",
- "Microsoft.Extensions.Logging.EventLog": "9.0.7",
- "Microsoft.Extensions.Logging.EventSource": "9.0.7",
- "Microsoft.Extensions.Options": "9.0.7"
+ "Microsoft.Extensions.Configuration": "9.0.8",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.8",
+ "Microsoft.Extensions.Configuration.CommandLine": "9.0.8",
+ "Microsoft.Extensions.Configuration.EnvironmentVariables": "9.0.8",
+ "Microsoft.Extensions.Configuration.FileExtensions": "9.0.8",
+ "Microsoft.Extensions.Configuration.Json": "9.0.8",
+ "Microsoft.Extensions.Configuration.UserSecrets": "9.0.8",
+ "Microsoft.Extensions.DependencyInjection": "9.0.8",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Diagnostics": "9.0.8",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.8",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.8",
+ "Microsoft.Extensions.Hosting.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Logging": "9.0.8",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Logging.Configuration": "9.0.8",
+ "Microsoft.Extensions.Logging.Console": "9.0.8",
+ "Microsoft.Extensions.Logging.Debug": "9.0.8",
+ "Microsoft.Extensions.Logging.EventLog": "9.0.8",
+ "Microsoft.Extensions.Logging.EventSource": "9.0.8",
+ "Microsoft.Extensions.Options": "9.0.8"
}
},
"Microsoft.Toolkit.Uwp.Notifications": {
@@ -154,9 +154,9 @@
},
"VirtualizingWrapPanel": {
"type": "Direct",
- "requested": "[2.3.0, )",
- "resolved": "2.3.0",
- "contentHash": "Dpmtcpn2HqAWZR0NkN7Qd4YCjf+sdQcemIMKm2suZVbOIB9NsmKZnYaQDIpXWTh87a9+nArVto6Od1cM2ohzCQ=="
+ "requested": "[2.3.1, )",
+ "resolved": "2.3.1",
+ "contentHash": "imph3SJqFFgX8vc7XRBcftfgzIL7Q+uE0Tvk7dbY0KY0tcqUCs0ZmKV3Gt9QX2745v6bSw6ns8UHpXtiptHqdA=="
},
"AvalonEdit": {
"type": "Transitive",
@@ -196,8 +196,8 @@
},
"FSharp.Core": {
"type": "Transitive",
- "resolved": "9.0.300",
- "contentHash": "TVt2J7RCE1KCS2IaONF+p8/KIZ1eHNbW+7qmKF6hGoD4tXl+o07ja1mPtFjMqRa5uHMFaTrGTPn/m945WnDLiQ=="
+ "resolved": "9.0.303",
+ "contentHash": "6JlV8aD8qQvcmfoe/PMOxCHXc0uX4lR23u0fAyQtnVQxYULLoTZgwgZHSnRcuUHOvS3wULFWcwdnP1iwslH60g=="
},
"HtmlAgilityPack": {
"type": "Transitive",
@@ -211,8 +211,8 @@
},
"JetBrains.Annotations": {
"type": "Transitive",
- "resolved": "2024.3.0",
- "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug=="
+ "resolved": "2025.2.0",
+ "contentHash": "2BvMkOSW+50EbQFhWFIPWTqmcDLiyyjwkMN7lN386bhP2vN/7ts5t59qu11HtenmHFxqDzaD8J1fFoh+QTOzVA=="
},
"MemoryPack": {
"type": "Transitive",
@@ -254,244 +254,244 @@
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "oxGR51+w5cXm5B9gU6XwpAB2sTiyPSmZm7hjvv0rzRnmL5o/KZzE103AuQj7sK26OBupjVzU/bZxDWvvU4nhEg==",
+ "resolved": "9.0.8",
+ "contentHash": "6m+8Xgmf8UWL0p/oGqBM+0KbHE5/ePXbV1hKXgC59zEv0aa0DW5oiiyxDbK5kH5j4gIvyD5uWL0+HadKBJngvQ==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
- "Microsoft.Extensions.Primitives": "9.0.7"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Primitives": "9.0.8"
}
},
"Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "lut/kiVvNsQ120VERMUYSFhpXPpKjjql+giy03LesASPBBcC0o6+aoFdzJH9GaYpFTQ3fGVhVjKjvJDoAW5/IQ==",
+ "resolved": "9.0.8",
+ "contentHash": "yNou2KM35RvzOh4vUFtl2l33rWPvOCoba+nzEDJ+BgD8aOL/jew4WPCibQvntRfOJ2pJU8ARygSMD+pdjvDHuA==",
"dependencies": {
- "Microsoft.Extensions.Primitives": "9.0.7"
+ "Microsoft.Extensions.Primitives": "9.0.8"
}
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "ExY+zXHhU4o9KC2alp3ZdLWyVWVRSn5INqax5ABk+HEOHlAHzomhJ7ek9HHliyOMiVGoYWYaMFOGr9q59mSAGA==",
+ "resolved": "9.0.8",
+ "contentHash": "0vK9DnYrYChdiH3yRZWkkp4x4LbrfkWEdBc5HOsQ8t/0CLOWKXKkkhOE8A1shlex0hGydbGrhObeypxz/QTm+w==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.7"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.8"
}
},
"Microsoft.Extensions.Configuration.CommandLine": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "LqwdkMNFeRyuqExewBSaWj8roEgZH8JQ9zEAmHl5ZFcnhCvjAdHICdYVRIiSEq9RWGB731LL8kZJM8tdTKEscA==",
+ "resolved": "9.0.8",
+ "contentHash": "vB6eDQ5prED5jHBqmSDNYzlCXsTSylYY7co9c7guhnz0zhx+jZ8BTHgO7y/Wl1dV2jAO15mKNWuyHRIRtWwGQg==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.7",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.7"
+ "Microsoft.Extensions.Configuration": "9.0.8",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.8"
}
},
"Microsoft.Extensions.Configuration.EnvironmentVariables": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "R8kgazVpDr4k1K7MeWPLAwsi5VpwrhE3ubXK38D9gpHEvf9XhZhJ8kWHKK00LDg5hJ7pMQLggdZ7XFdQ5182Ug==",
+ "resolved": "9.0.8",
+ "contentHash": "9qileEYXDodlPN9DfPd5sHSfU2nSrI1r5BHVqLaLyb/7mPi335cy4ar/0ix4tXb2Aer/Pu4e5/zdwxt7lrtSyQ==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.7",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.7"
+ "Microsoft.Extensions.Configuration": "9.0.8",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.8"
}
},
"Microsoft.Extensions.Configuration.FileExtensions": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "3LVg32iMfR9ENeegXAo73L+877iOcQauLJsXlKZNVSsLA/HbPgClZdeMGdjLSkaidYw3l02XbXTlOdGYNgu91Q==",
+ "resolved": "9.0.8",
+ "contentHash": "2jgx58Jpk3oKT7KRn8x/cFf3QDTjQP+KUbyBnynAcB2iBx1Eq9EdNMCu0QEbYuaZOaQru/Kwdffary+hn58Wwg==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.7",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7",
- "Microsoft.Extensions.FileProviders.Physical": "9.0.7",
- "Microsoft.Extensions.Primitives": "9.0.7"
+ "Microsoft.Extensions.Configuration": "9.0.8",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.8",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.8",
+ "Microsoft.Extensions.Primitives": "9.0.8"
}
},
"Microsoft.Extensions.Configuration.Json": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "3HQV326liEInT9UKEc+k73f1ECwNhvDS/DJAe5WvtMKDJTJqTH2ujrUC2ZlK/j6pXyPbV9f0Ku8JB20JveGImg==",
+ "resolved": "9.0.8",
+ "contentHash": "vjxzcnL7ul322+kpvELisXaZl8/5MYs6JfI9DZLQWsao1nA/4FL48yPwDK986hbJTWc64JxOOaMym0SQ/dy32w==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.7",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
- "Microsoft.Extensions.Configuration.FileExtensions": "9.0.7",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7"
+ "Microsoft.Extensions.Configuration": "9.0.8",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Configuration.FileExtensions": "9.0.8",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.8"
}
},
"Microsoft.Extensions.Configuration.UserSecrets": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "ouDuPgRdeF4TJXKUh+lbm6QwyWwnCy+ijiqfFM2cI5NmW83MwKg1WNp2nCdMVcwQW8wJXteF/L9lA6ZPS3bCIQ==",
+ "resolved": "9.0.8",
+ "contentHash": "UgH18nQkuMJgxjn1539I83N6LhnKQlLhQm3ppe+PGsFpYsC6eGpF/1KvDRm/bmqsrg0NXhurrv4k2r0e8vWX/Q==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
- "Microsoft.Extensions.Configuration.Json": "9.0.7",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7",
- "Microsoft.Extensions.FileProviders.Physical": "9.0.7"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Configuration.Json": "9.0.8",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.8",
+ "Microsoft.Extensions.FileProviders.Physical": "9.0.8"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "iPK1FxbGFr2Xb+4Y+dTYI8Gupu9pOi8I3JPuPsrogUmEhe2hzZ9LpCmolMEBhVDo2ikcSr7G5zYiwaapHSQTew=="
+ "resolved": "9.0.8",
+ "contentHash": "xY3lTjj4+ZYmiKIkyWitddrp1uL5uYiweQjqo4BKBw01ZC4HhcfgLghDpPZcUlppgWAFqFy9SgkiYWOMx365pw=="
},
"Microsoft.Extensions.Diagnostics": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "6ykfInm6yw7pPHJACgnrPUXxUWVslFnzad44K/siXk6Ovan6fNMnXxI5X9vphHJuZ4JbMOdPIgsfTmLD+Dyxug==",
+ "resolved": "9.0.8",
+ "contentHash": "BKkLCFXzJvNmdngeYBf72VXoZqTJSb1orvjdzDLaGobicoGFBPW8ug2ru1nnEewMEwJzMgnsjHQY8EaKWmVhKg==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.7",
- "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.7",
- "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.7"
+ "Microsoft.Extensions.Configuration": "9.0.8",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.8"
}
},
"Microsoft.Extensions.Diagnostics.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "d39Ov1JpeWCGLCOTinlaDkujhrSAQ0HFxb7Su1BjhCKBfmDcQ6Ia1i3JI6kd3NFgwi1dexTunu82daDNwt7E6w==",
+ "resolved": "9.0.8",
+ "contentHash": "UDY7blv4DCyIJ/8CkNrQKLaAZFypXQavRZ2DWf/2zi1mxYYKKw2t8AOCBWxNntyPZHPGhtEmL3snFM98ADZqTw==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
- "Microsoft.Extensions.Options": "9.0.7"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Options": "9.0.8"
}
},
"Microsoft.Extensions.FileProviders.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "y9djCca1cz/oz/J8jTxtoecNiNvaiGBJeWd7XOPxonH+FnfHqcfslJMcSr5JMinmWFyS7eh3C9L6m6oURZ5lSA==",
+ "resolved": "9.0.8",
+ "contentHash": "4zZbQ4w+hCMm9J+z5NOj3giIPT2MhZxx05HX/MGuAmDBbjOuXlYIIRN+t4V6OLxy5nXZIcXO+dQMB/OWubuDkw==",
"dependencies": {
- "Microsoft.Extensions.Primitives": "9.0.7"
+ "Microsoft.Extensions.Primitives": "9.0.8"
}
},
"Microsoft.Extensions.FileProviders.Physical": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "JYEPYrb+YBpFTCdmSBrk8cg3wAi1V4so7ccq04qbhg3FQHQqgJk28L3heEOKMXcZobOBUjTnGCFJD49Ez9kG5w==",
+ "resolved": "9.0.8",
+ "contentHash": "FlOe2i7UUIfY0l0ChaIYtlXjdWWutR4DMRKZaGD6z4G1uVTteFkbBfxUIoi1uGmrZQxXe/yv/cfwiT0tK2xyXA==",
"dependencies": {
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7",
- "Microsoft.Extensions.FileSystemGlobbing": "9.0.7",
- "Microsoft.Extensions.Primitives": "9.0.7"
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.8",
+ "Microsoft.Extensions.FileSystemGlobbing": "9.0.8",
+ "Microsoft.Extensions.Primitives": "9.0.8"
}
},
"Microsoft.Extensions.FileSystemGlobbing": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "5VKpTH2ME0SSs0lrtkpKgjCeHzXR5ka/H+qThPwuWi78wHubApZ/atD7w69FDt0OOM7UMV6LIbkqEQgoby4IXA=="
+ "resolved": "9.0.8",
+ "contentHash": "96Ub5LmwYfIGVoXkbe4kjs+ivK6fLBTwKJAOMfUNV0R+AkZRItlgROFqXEWMUlXBTPM1/kKu26Ueu5As6RDzJA=="
},
"Microsoft.Extensions.Hosting.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "yG2JCXAR+VqI1mKqynLPNJlNlrUJeEISEpX4UznOp2uM4IEFz3pDDauzyMvTjICutEJtOigJ1yWBvxbaIlibBw==",
+ "resolved": "9.0.8",
+ "contentHash": "WNrad20tySNCPe9aJUK7Wfwh+RiyLF+id02FKW8Qfc+HAzNQHazcqMXAbwG/kmbS89uvan/nKK1MufkRahjrJA==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
- "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.7",
- "Microsoft.Extensions.FileProviders.Abstractions": "9.0.7",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.7"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "9.0.8",
+ "Microsoft.Extensions.FileProviders.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.8"
}
},
"Microsoft.Extensions.Logging": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "fdIeQpXYV8yxSWG03cCbU2Otdrq4NWuhnQLXokWLv3L9YcK055E7u8WFJvP+uuP4CFeCEoqZQL4yPcjuXhCZrg==",
+ "resolved": "9.0.8",
+ "contentHash": "Z/7ze+0iheT7FJeZPqJKARYvyC2bmwu3whbm/48BJjdlGVvgDguoCqJIkI/67NkroTYobd5geai1WheNQvWrgA==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection": "9.0.7",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
- "Microsoft.Extensions.Options": "9.0.7"
+ "Microsoft.Extensions.DependencyInjection": "9.0.8",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Options": "9.0.8"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "sMM6NEAdUTE/elJ2wqjOi0iBWqZmSyaTByLF9e8XHv6DRJFFnOe0N+s8Uc6C91E4SboQCfLswaBIZ+9ZXA98AA==",
+ "resolved": "9.0.8",
+ "contentHash": "pYnAffJL7ARD/HCnnPvnFKSIHnTSmWz84WIlT9tPeQ4lHNiu0Az7N/8itihWvcF8sT+VVD5lq8V+ckMzu4SbOw==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8"
}
},
"Microsoft.Extensions.Logging.Configuration": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "AEBty9rvFGvdFRqgIDEhQmiCnIfQWyzVoOZrO244cfu+n9M+wI1QLDpuROVILlplIBtLVmOezAF7d1H3Qog6Xw==",
+ "resolved": "9.0.8",
+ "contentHash": "Us4evDN3lbp1beVgrpxkSXKrbntVGAK+YbSo9P9driiU9PK05+ShhgesJ3aj7SuDfr3mqqcEgrMJ87Vu8t5dhw==",
"dependencies": {
- "Microsoft.Extensions.Configuration": "9.0.7",
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
- "Microsoft.Extensions.Configuration.Binder": "9.0.7",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
- "Microsoft.Extensions.Logging": "9.0.7",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
- "Microsoft.Extensions.Options": "9.0.7",
- "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.7"
+ "Microsoft.Extensions.Configuration": "9.0.8",
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.8",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Logging": "9.0.8",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Options": "9.0.8",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.8"
}
},
"Microsoft.Extensions.Logging.Console": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "pEHlNa8iCfKsBFA3YVDn/8EicjSU/m8uDfyoR0i4svONDss4Yu9Kznw53E/TyI+TveTo7CwRid4kfd4pLYXBig==",
+ "resolved": "9.0.8",
+ "contentHash": "mPp9xB9MjiPuodh9z/+6zEGNj2kSVeXQtdbIBHlhUYqxX22gzJkx0ycPY42q4/OT/SzFV/TJ989Pa3sA/8ZBeA==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
- "Microsoft.Extensions.Logging": "9.0.7",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
- "Microsoft.Extensions.Logging.Configuration": "9.0.7",
- "Microsoft.Extensions.Options": "9.0.7"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Logging": "9.0.8",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Logging.Configuration": "9.0.8",
+ "Microsoft.Extensions.Options": "9.0.8"
}
},
"Microsoft.Extensions.Logging.Debug": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "MxzZj7XbsYJwfjclVTjJym2/nVIkksu7l7tC/4HYy+YRdDmpE4B+hTzCXu3BNfLNhdLPZsWpyXuYe6UGgWDm3g==",
+ "resolved": "9.0.8",
+ "contentHash": "OwHQFVITsONEoizShc1yNYTUvMq0kT9j/LhwAKMsA7OZqtrBXuqjosbSvzkJZ9o+KWAozDh5Y1Vtpe5p/8/1qA==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
- "Microsoft.Extensions.Logging": "9.0.7",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.7"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Logging": "9.0.8",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.8"
}
},
"Microsoft.Extensions.Logging.EventLog": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "usrMVsY7c8M8fESt34Y3eEIQIlRlKXfPDlI+vYEb6xT7SUjhua2ey3NpHgQktiTgz8Uo5RiWqGD8ieiyo2WaDA==",
+ "resolved": "9.0.8",
+ "contentHash": "/gMwlll21UJcaXlitUqd+rs9jH36EJz5BpFVPshyOqz5u0qyV1pFnTWm5vhyx+g6gwVYENSLgpazR1urNv83xw==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
- "Microsoft.Extensions.Logging": "9.0.7",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
- "Microsoft.Extensions.Options": "9.0.7",
- "System.Diagnostics.EventLog": "9.0.7"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Logging": "9.0.8",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Options": "9.0.8",
+ "System.Diagnostics.EventLog": "9.0.8"
}
},
"Microsoft.Extensions.Logging.EventSource": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "/wwi6ckTEegCExFV6gVToCO7CvysZnmE50fpdkYUsSMh0ue9vRkQ7uOqkHyHol93ASYTEahrp+guMtS/+fZKaA==",
+ "resolved": "9.0.8",
+ "contentHash": "aGMFc/1P+315d07iyxSe6lEoZ0JjOPJ+Mfv9rrV2PvR2DFu1/pSi/SItHw1iChJOZgslNKJE97g1a9nLX3qQYA==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
- "Microsoft.Extensions.Logging": "9.0.7",
- "Microsoft.Extensions.Logging.Abstractions": "9.0.7",
- "Microsoft.Extensions.Options": "9.0.7",
- "Microsoft.Extensions.Primitives": "9.0.7"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Logging": "9.0.8",
+ "Microsoft.Extensions.Logging.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Options": "9.0.8",
+ "Microsoft.Extensions.Primitives": "9.0.8"
}
},
"Microsoft.Extensions.Options": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "trJnF6cRWgR5uMmHpGoHmM1wOVFdIYlELlkO9zX+RfieK0321Y55zrcs4AaEymKup7dxgEN/uJU25CAcMNQRXw==",
+ "resolved": "9.0.8",
+ "contentHash": "OmTaQ0v4gxGQkehpwWIqPoEiwsPuG/u4HUsbOFoWGx4DKET2AXzopnFe/fE608FIhzc/kcg2p8JdyMRCCUzitQ==",
"dependencies": {
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
- "Microsoft.Extensions.Primitives": "9.0.7"
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Primitives": "9.0.8"
}
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "pE/jeAWHEIy/8HsqYA+I1+toTsdvsv+WywAcRoNSvPoFwjOREa8Fqn7D0/i0PbiXsDLFupltTTctliePx8ib4w==",
+ "resolved": "9.0.8",
+ "contentHash": "eW2s6n06x0w6w4nsX+SvpgsFYkl+Y0CttYAt6DKUXeqprX+hzNqjSfOh637fwNJBg7wRBrOIRHe49gKiTgJxzQ==",
"dependencies": {
- "Microsoft.Extensions.Configuration.Abstractions": "9.0.7",
- "Microsoft.Extensions.Configuration.Binder": "9.0.7",
- "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7",
- "Microsoft.Extensions.Options": "9.0.7",
- "Microsoft.Extensions.Primitives": "9.0.7"
+ "Microsoft.Extensions.Configuration.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Configuration.Binder": "9.0.8",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.8",
+ "Microsoft.Extensions.Options": "9.0.8",
+ "Microsoft.Extensions.Primitives": "9.0.8"
}
},
"Microsoft.Extensions.Primitives": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "ti/zD9BuuO50IqlvhWQs9GHxkCmoph5BHjGiWKdg2t6Or8XoyAfRJiKag+uvd/fpASnNklfsB01WpZ4fhAe0VQ=="
+ "resolved": "9.0.8",
+ "contentHash": "tizSIOEsIgSNSSh+hKeUVPK7xmTIjR8s+mJWOu1KXV3htvNQiPMFRMO17OdI1y/4ZApdBVk49u/08QGC9yvLug=="
},
"Microsoft.IO.RecyclableMemoryStream": {
"type": "Transitive",
@@ -552,8 +552,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
+ "resolved": "9.0.8",
+ "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA=="
},
"Mono.Cecil": {
"type": "Transitive",
@@ -590,15 +590,15 @@
},
"NLog": {
"type": "Transitive",
- "resolved": "6.0.1",
- "contentHash": "qDWiqy8/xdpZKtHna/645KbalwP86N2NFJEzfqhcv+Si4V2iNaEfR/dCneuF/4+Dcwl3f7jHMXj3ndWYftV3Ug=="
+ "resolved": "6.0.3",
+ "contentHash": "5RMrpvadysflvDOi5ozD7aK1P+YL2DyZbQSxzE8qBKkw2pxPNOQA6vJtumcT6SuzE9qxhwGkQwMkLLaKnALwiw=="
},
"NLog.OutputDebugString": {
"type": "Transitive",
- "resolved": "6.0.1",
- "contentHash": "wwJCQLaHVzuRf8TsXB+EEdrzVvE3dnzCSMQMDgwkw3AXp8VSp3JSVF/Q/H0oEqggKgKhPs13hh3a7svyQr4s3A==",
+ "resolved": "6.0.3",
+ "contentHash": "0qojvaBMAruTDIbjRXMwft3hdkg8tPl0BMD8+tR8TpK78a8DrgKAq/h5LcHPQ/0xERZ66y+00bsn0n1VeJjlmg==",
"dependencies": {
- "NLog": "6.0.1"
+ "NLog": "6.0.3"
}
},
"runtime.osx.10.10-x64.CoreCompat.System.Drawing": {
@@ -608,8 +608,8 @@
},
"SharpVectors.Wpf": {
"type": "Transitive",
- "resolved": "1.8.4.2",
- "contentHash": "PNxLkMBJnV8A+6yH9OqOlhLJegvWP/dvh0rAJp2l0kcrR+rB4R2tQ9vhUqka+UilH4atN8T6zvjDOizVyfz2Ng=="
+ "resolved": "1.8.5",
+ "contentHash": "WURdBDq5AE8RjKV9pFS7lNkJe81gxja9SaMGE4URq9GJUZ6M+5DGUL0Lm3B0iYW2/Meyowaz4ffGsyW+RBSTtg=="
},
"Splat": {
"type": "Transitive",
@@ -672,15 +672,15 @@
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "AJ+9fyCtQUImntxAJ9l4PZiCd4iepuk4pm7Qcno7PBIWQnfXlvwKuFsGk2H+QyY69GUVzDP2heELW6ho5BCXUg=="
+ "resolved": "9.0.8",
+ "contentHash": "gebRF3JLLJ76jz1CQpvwezNapZUjFq20JQsaGHzBH0DzlkHBLpdhwkOei9usiOkIGMwU/L0ALWpNe1JE+5/itw=="
},
"System.Drawing.Common": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==",
+ "resolved": "9.0.8",
+ "contentHash": "ineIJmF+yuBEHGft9R153J9kmBFaeEfFL5Put5nzENneRcGGPUb3MvM8zrZ5pERQ0jPPSE3Wqw/clXvOq2F/Kw==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.7"
+ "Microsoft.Win32.SystemEvents": "9.0.8"
}
},
"System.Globalization": {
@@ -838,7 +838,7 @@
"type": "Project",
"dependencies": {
"Droplex": "[1.7.0, )",
- "FSharp.Core": "[9.0.300, )",
+ "FSharp.Core": "[9.0.303, )",
"Flow.Launcher.Infrastructure": "[1.0.0, )",
"Flow.Launcher.Plugin": "[4.7.0, )",
"Meziantou.Framework.Win32.Jobs": "[3.4.3, )",
@@ -859,17 +859,17 @@
"MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.14.15, )",
"NHotkey.Wpf": "[3.0.0, )",
- "NLog": "[6.0.1, )",
- "NLog.OutputDebugString": "[6.0.1, )",
- "SharpVectors.Wpf": "[1.8.4.2, )",
- "System.Drawing.Common": "[9.0.7, )",
+ "NLog": "[6.0.3, )",
+ "NLog.OutputDebugString": "[6.0.3, )",
+ "SharpVectors.Wpf": "[1.8.5, )",
+ "System.Drawing.Common": "[9.0.8, )",
"ToolGood.Words.Pinyin": "[3.1.0.3, )"
}
},
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2024.3.0, )"
+ "JetBrains.Annotations": "[2025.2.0, )"
}
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 7d3cf164c..935c81859 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -99,9 +99,9 @@
-
+
-
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
index 43a2c2f3c..23964f650 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
@@ -62,7 +62,7 @@
-
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index 2f24015ad..679a17f61 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -47,8 +47,8 @@
-
-
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
index da2b19d7c..c33a26300 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj
@@ -64,12 +64,12 @@
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
-
+
\ No newline at end of file
From b07763ad054e084a9decf196254dcdde877b1535 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Tue, 19 Aug 2025 14:27:45 +0800
Subject: [PATCH 1698/1798] Suppress FLSG0007
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 1 +
.../Flow.Launcher.Plugin.Calculator.csproj | 1 +
.../Flow.Launcher.Plugin.Explorer.csproj | 1 +
3 files changed, 3 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 935c81859..055cee4b8 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -34,6 +34,7 @@
prompt4false
+ FLSG0007
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
index 23964f650..7bfa2ba19 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
@@ -33,6 +33,7 @@
prompt4false
+ FLSG0007
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index 679a17f61..751f92557 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -19,6 +19,7 @@
..\..\Output\Release\Plugins\Flow.Launcher.Plugin.Explorer
+ FLSG0007
From 6b6037388630ad78b5100dd2cc67f520164eac3b Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 25 Aug 2025 18:50:02 +0800
Subject: [PATCH 1699/1798] Upgrade nuget packages
---
.../Flow.Launcher.Infrastructure.csproj | 2 +-
Flow.Launcher.Infrastructure/packages.lock.json | 6 +++---
Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj | 2 +-
Flow.Launcher.Plugin/packages.lock.json | 6 +++---
Flow.Launcher/Flow.Launcher.csproj | 2 +-
Flow.Launcher/packages.lock.json | 6 +++---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 2 +-
7 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 7bb8786cd..9f01d5d0f 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -56,7 +56,7 @@
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index bcb3031e0..6786b0f49 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -25,9 +25,9 @@
},
"Fody": {
"type": "Direct",
- "requested": "[6.9.2, )",
- "resolved": "6.9.2",
- "contentHash": "YBHobPGogb0vYhGYIxn/ndWqTjNWZveDi5jdjrcshL2vjwU3gQGyDeI7vGgye+2rAM5fGRvlLgNWLW3DpviS/w=="
+ "requested": "[6.9.3, )",
+ "resolved": "6.9.3",
+ "contentHash": "1CUGgFdyECDKgi5HaUBhdv6k+VG9Iy4OCforGfHyar3xQXAJypZkzymgKtWj/4SPd6nSG0Qi7NH71qHrDSZLaA=="
},
"InputSimulator": {
"type": "Direct",
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index ccb9332b4..fcc087b62 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -68,7 +68,7 @@
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Flow.Launcher.Plugin/packages.lock.json b/Flow.Launcher.Plugin/packages.lock.json
index 56b343e6b..b009c54c8 100644
--- a/Flow.Launcher.Plugin/packages.lock.json
+++ b/Flow.Launcher.Plugin/packages.lock.json
@@ -4,9 +4,9 @@
"net9.0-windows7.0": {
"Fody": {
"type": "Direct",
- "requested": "[6.9.2, )",
- "resolved": "6.9.2",
- "contentHash": "YBHobPGogb0vYhGYIxn/ndWqTjNWZveDi5jdjrcshL2vjwU3gQGyDeI7vGgye+2rAM5fGRvlLgNWLW3DpviS/w=="
+ "requested": "[6.9.3, )",
+ "resolved": "6.9.3",
+ "contentHash": "1CUGgFdyECDKgi5HaUBhdv6k+VG9Iy4OCforGfHyar3xQXAJypZkzymgKtWj/4SPd6nSG0Qi7NH71qHrDSZLaA=="
},
"JetBrains.Annotations": {
"type": "Direct",
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 6d6b454c0..d7991572a 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -128,7 +128,7 @@
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index 483766978..9b1bc94a7 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -16,9 +16,9 @@
},
"Fody": {
"type": "Direct",
- "requested": "[6.9.2, )",
- "resolved": "6.9.2",
- "contentHash": "YBHobPGogb0vYhGYIxn/ndWqTjNWZveDi5jdjrcshL2vjwU3gQGyDeI7vGgye+2rAM5fGRvlLgNWLW3DpviS/w=="
+ "requested": "[6.9.3, )",
+ "resolved": "6.9.3",
+ "contentHash": "1CUGgFdyECDKgi5HaUBhdv6k+VG9Iy4OCforGfHyar3xQXAJypZkzymgKtWj/4SPd6nSG0Qi7NH71qHrDSZLaA=="
},
"MdXaml": {
"type": "Direct",
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 055cee4b8..ee89df8d1 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -102,7 +102,7 @@
-
+
From 233f8cd0f3811f68029c05192fc3d9b280390a8f Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Mon, 25 Aug 2025 19:02:04 +0800
Subject: [PATCH 1700/1798] Check plugin updates only for Release
---
Flow.Launcher/App.xaml.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 6e053db29..0360c761e 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -297,6 +297,7 @@ namespace Flow.Launcher
});
}
+ [Conditional("RELEASE")]
private static void AutoPluginUpdates()
{
_ = Task.Run(async () =>
From 9ac32b0bee0f8ec3c2a2c22db87c8405b7a7f3ca Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 29 Aug 2025 11:40:33 +0800
Subject: [PATCH 1701/1798] Use 7.0.0 SystemEvents
---
Flow.Launcher.Core/packages.lock.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index caec08ebf..18488cb63 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -161,8 +161,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
+ "resolved": "7.0.0",
+ "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
},
"Mono.Cecil": {
"type": "Transitive",
From afafd6dc0bc64846dbf1dcef5c9e42470764d6da Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 29 Aug 2025 11:44:20 +0800
Subject: [PATCH 1702/1798] Add Microsoft.Win32.SystemEvents
---
Flow.Launcher.Core/packages.lock.json | 5 +++--
.../Flow.Launcher.Infrastructure.csproj | 1 +
Flow.Launcher.Infrastructure/packages.lock.json | 11 ++++++-----
Flow.Launcher/packages.lock.json | 5 +++--
4 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index 18488cb63..09b9ef54d 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -161,8 +161,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "7.0.0",
- "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
+ "resolved": "9.0.8",
+ "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA=="
},
"Mono.Cecil": {
"type": "Transitive",
@@ -258,6 +258,7 @@
"InputSimulator": "[1.0.4, )",
"MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.14.15, )",
+ "Microsoft.Win32.SystemEvents": "[9.0.8, )",
"NHotkey.Wpf": "[3.0.0, )",
"NLog": "[6.0.1, )",
"NLog.OutputDebugString": "[6.0.1, )",
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 51b1d5175..7d1d31461 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -63,6 +63,7 @@
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index 87b4bb6da..606168fd3 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -56,6 +56,12 @@
"Microsoft.VisualStudio.Validation": "17.8.8"
}
},
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Direct",
+ "requested": "[9.0.8, )",
+ "resolved": "9.0.8",
+ "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA=="
+ },
"Microsoft.Windows.CsWin32": {
"type": "Direct",
"requested": "[0.3.183, )",
@@ -154,11 +160,6 @@
"resolved": "17.8.8",
"contentHash": "rWXThIpyQd4YIXghNkiv2+VLvzS+MCMKVRDR0GAMlflsdo+YcAN2g2r5U1Ah98OFjQMRexTFtXQQ2LkajxZi3g=="
},
- "Microsoft.Win32.SystemEvents": {
- "type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
- },
"Microsoft.Windows.SDK.Win32Docs": {
"type": "Transitive",
"resolved": "0.1.42-alpha",
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index 1047b1f3f..e4dfe0803 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -552,8 +552,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "lFGY2aGgmMREPJEfOmZcA6v0CLjWVpcfNHRgqYMoSQhy80+GxhYqdW5xe+DCLrVqE1M7/0RpOkIo49/KH/cd/A=="
+ "resolved": "9.0.8",
+ "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA=="
},
"Mono.Cecil": {
"type": "Transitive",
@@ -858,6 +858,7 @@
"InputSimulator": "[1.0.4, )",
"MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.14.15, )",
+ "Microsoft.Win32.SystemEvents": "[9.0.8, )",
"NHotkey.Wpf": "[3.0.0, )",
"NLog": "[6.0.1, )",
"NLog.OutputDebugString": "[6.0.1, )",
From 054135df5522444939f2129a8ad958ca7da59a20 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Fri, 29 Aug 2025 13:03:34 +0800
Subject: [PATCH 1703/1798] Downgrade System.Drawing.Common version
---
Flow.Launcher.Core/packages.lock.json | 13 ++++++-------
.../Flow.Launcher.Infrastructure.csproj | 5 +++--
.../packages.lock.json | 19 +++++++++----------
Flow.Launcher/packages.lock.json | 13 ++++++-------
4 files changed, 24 insertions(+), 26 deletions(-)
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index 09b9ef54d..5e9abc24c 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -161,8 +161,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.8",
- "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA=="
+ "resolved": "7.0.0",
+ "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
},
"Mono.Cecil": {
"type": "Transitive",
@@ -222,10 +222,10 @@
},
"System.Drawing.Common": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==",
+ "resolved": "7.0.0",
+ "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.7"
+ "Microsoft.Win32.SystemEvents": "7.0.0"
}
},
"System.IO.Pipelines": {
@@ -258,12 +258,11 @@
"InputSimulator": "[1.0.4, )",
"MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.14.15, )",
- "Microsoft.Win32.SystemEvents": "[9.0.8, )",
"NHotkey.Wpf": "[3.0.0, )",
"NLog": "[6.0.1, )",
"NLog.OutputDebugString": "[6.0.1, )",
"SharpVectors.Wpf": "[1.8.4.2, )",
- "System.Drawing.Common": "[9.0.7, )",
+ "System.Drawing.Common": "[7.0.0, )",
"ToolGood.Words.Pinyin": "[3.1.0.3, )"
}
},
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 7d1d31461..c32c36248 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -63,7 +63,6 @@
- allruntime; build; native; contentfiles; analyzers; buildtransitive
@@ -75,7 +74,9 @@
all
-
+
+
+
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index 606168fd3..abd250f7c 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -56,12 +56,6 @@
"Microsoft.VisualStudio.Validation": "17.8.8"
}
},
- "Microsoft.Win32.SystemEvents": {
- "type": "Direct",
- "requested": "[9.0.8, )",
- "resolved": "9.0.8",
- "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA=="
- },
"Microsoft.Windows.CsWin32": {
"type": "Direct",
"requested": "[0.3.183, )",
@@ -114,11 +108,11 @@
},
"System.Drawing.Common": {
"type": "Direct",
- "requested": "[9.0.7, )",
- "resolved": "9.0.7",
- "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==",
+ "requested": "[7.0.0, )",
+ "resolved": "7.0.0",
+ "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.7"
+ "Microsoft.Win32.SystemEvents": "7.0.0"
}
},
"ToolGood.Words.Pinyin": {
@@ -160,6 +154,11 @@
"resolved": "17.8.8",
"contentHash": "rWXThIpyQd4YIXghNkiv2+VLvzS+MCMKVRDR0GAMlflsdo+YcAN2g2r5U1Ah98OFjQMRexTFtXQQ2LkajxZi3g=="
},
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
+ },
"Microsoft.Windows.SDK.Win32Docs": {
"type": "Transitive",
"resolved": "0.1.42-alpha",
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index e4dfe0803..32b78c334 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -552,8 +552,8 @@
},
"Microsoft.Win32.SystemEvents": {
"type": "Transitive",
- "resolved": "9.0.8",
- "contentHash": "64oQBN8I8EOcyHGNt6+rlcqm4tlcKfqOpswtBCJZnpzBQ15L6IFKqjnbjbOWBpG9wKq9A/aC2LFSmSqplbwTYA=="
+ "resolved": "7.0.0",
+ "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ=="
},
"Mono.Cecil": {
"type": "Transitive",
@@ -677,10 +677,10 @@
},
"System.Drawing.Common": {
"type": "Transitive",
- "resolved": "9.0.7",
- "contentHash": "1k/Pk7hcM3vP2tfIRRS2ECCCN7ya+hvocsM1JMc4ZDCU6qw7yOuUmqmCDfgXZ4Q4FS6jass2EAai5ByKodDi0g==",
+ "resolved": "7.0.0",
+ "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
"dependencies": {
- "Microsoft.Win32.SystemEvents": "9.0.7"
+ "Microsoft.Win32.SystemEvents": "7.0.0"
}
},
"System.Globalization": {
@@ -858,12 +858,11 @@
"InputSimulator": "[1.0.4, )",
"MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.14.15, )",
- "Microsoft.Win32.SystemEvents": "[9.0.8, )",
"NHotkey.Wpf": "[3.0.0, )",
"NLog": "[6.0.1, )",
"NLog.OutputDebugString": "[6.0.1, )",
"SharpVectors.Wpf": "[1.8.4.2, )",
- "System.Drawing.Common": "[9.0.7, )",
+ "System.Drawing.Common": "[7.0.0, )",
"ToolGood.Words.Pinyin": "[3.1.0.3, )"
}
},
From 6e873abc7bcf7d21e5dd37f3f082785c02c087af Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sat, 30 Aug 2025 16:34:34 +0800
Subject: [PATCH 1704/1798] Upgrade nuget package & Fix lock file issue
---
Flow.Launcher.Core/packages.lock.json | 8 ++++----
Flow.Launcher.Infrastructure/packages.lock.json | 6 +++---
Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj | 2 +-
Flow.Launcher.Plugin/packages.lock.json | 6 +++---
Flow.Launcher/packages.lock.json | 8 ++++----
5 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/Flow.Launcher.Core/packages.lock.json b/Flow.Launcher.Core/packages.lock.json
index f5f81e874..e237568fa 100644
--- a/Flow.Launcher.Core/packages.lock.json
+++ b/Flow.Launcher.Core/packages.lock.json
@@ -90,8 +90,8 @@
},
"JetBrains.Annotations": {
"type": "Transitive",
- "resolved": "2025.2.0",
- "contentHash": "2BvMkOSW+50EbQFhWFIPWTqmcDLiyyjwkMN7lN386bhP2vN/7ts5t59qu11HtenmHFxqDzaD8J1fFoh+QTOzVA=="
+ "resolved": "2025.2.1",
+ "contentHash": "63fHdqhM9JuFSithjKbbcEPf1BA76JyXgRqYO6paN9xcKeL6XvttjUUjrfiZ94v8aXn9+6U4pYSHIYAY+5qgFQ=="
},
"MemoryPack": {
"type": "Transitive",
@@ -262,14 +262,14 @@
"NLog": "[6.0.3, )",
"NLog.OutputDebugString": "[6.0.3, )",
"SharpVectors.Wpf": "[1.8.5, )",
- "System.Drawing.Common": "[9.0.8, )",
+ "System.Drawing.Common": "[7.0.0, )",
"ToolGood.Words.Pinyin": "[3.1.0.3, )"
}
},
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2025.2.0, )"
+ "JetBrains.Annotations": "[2025.2.1, )"
}
}
}
diff --git a/Flow.Launcher.Infrastructure/packages.lock.json b/Flow.Launcher.Infrastructure/packages.lock.json
index ac00d0202..a1c56c4bf 100644
--- a/Flow.Launcher.Infrastructure/packages.lock.json
+++ b/Flow.Launcher.Infrastructure/packages.lock.json
@@ -123,8 +123,8 @@
},
"JetBrains.Annotations": {
"type": "Transitive",
- "resolved": "2025.2.0",
- "contentHash": "2BvMkOSW+50EbQFhWFIPWTqmcDLiyyjwkMN7lN386bhP2vN/7ts5t59qu11HtenmHFxqDzaD8J1fFoh+QTOzVA=="
+ "resolved": "2025.2.1",
+ "contentHash": "63fHdqhM9JuFSithjKbbcEPf1BA76JyXgRqYO6paN9xcKeL6XvttjUUjrfiZ94v8aXn9+6U4pYSHIYAY+5qgFQ=="
},
"MemoryPack.Core": {
"type": "Transitive",
@@ -190,7 +190,7 @@
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2025.2.0, )"
+ "JetBrains.Annotations": "[2025.2.1, )"
}
}
}
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index fcc087b62..cf4aa02f0 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -73,7 +73,7 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Flow.Launcher.Plugin/packages.lock.json b/Flow.Launcher.Plugin/packages.lock.json
index b009c54c8..1ba5b0103 100644
--- a/Flow.Launcher.Plugin/packages.lock.json
+++ b/Flow.Launcher.Plugin/packages.lock.json
@@ -10,9 +10,9 @@
},
"JetBrains.Annotations": {
"type": "Direct",
- "requested": "[2025.2.0, )",
- "resolved": "2025.2.0",
- "contentHash": "2BvMkOSW+50EbQFhWFIPWTqmcDLiyyjwkMN7lN386bhP2vN/7ts5t59qu11HtenmHFxqDzaD8J1fFoh+QTOzVA=="
+ "requested": "[2025.2.1, )",
+ "resolved": "2025.2.1",
+ "contentHash": "63fHdqhM9JuFSithjKbbcEPf1BA76JyXgRqYO6paN9xcKeL6XvttjUUjrfiZ94v8aXn9+6U4pYSHIYAY+5qgFQ=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
diff --git a/Flow.Launcher/packages.lock.json b/Flow.Launcher/packages.lock.json
index a4a3bcd6c..ffaceb356 100644
--- a/Flow.Launcher/packages.lock.json
+++ b/Flow.Launcher/packages.lock.json
@@ -211,8 +211,8 @@
},
"JetBrains.Annotations": {
"type": "Transitive",
- "resolved": "2025.2.0",
- "contentHash": "2BvMkOSW+50EbQFhWFIPWTqmcDLiyyjwkMN7lN386bhP2vN/7ts5t59qu11HtenmHFxqDzaD8J1fFoh+QTOzVA=="
+ "resolved": "2025.2.1",
+ "contentHash": "63fHdqhM9JuFSithjKbbcEPf1BA76JyXgRqYO6paN9xcKeL6XvttjUUjrfiZ94v8aXn9+6U4pYSHIYAY+5qgFQ=="
},
"MemoryPack": {
"type": "Transitive",
@@ -862,14 +862,14 @@
"NLog": "[6.0.3, )",
"NLog.OutputDebugString": "[6.0.3, )",
"SharpVectors.Wpf": "[1.8.5, )",
- "System.Drawing.Common": "[9.0.8, )",
+ "System.Drawing.Common": "[7.0.0, )",
"ToolGood.Words.Pinyin": "[3.1.0.3, )"
}
},
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
- "JetBrains.Annotations": "[2025.2.0, )"
+ "JetBrains.Annotations": "[2025.2.1, )"
}
}
}
From 2e2d7fe51507777c790681b4036e7f9ec9c8676e Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 31 Aug 2025 14:45:40 +0800
Subject: [PATCH 1705/1798] Test
---
Flow.Launcher/Flow.Launcher.csproj | 10 ++++++++--
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 10 ++++++++--
2 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index fe84b5e1e..9ba570589 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -57,7 +57,10 @@
$(OutputPath)runtimes\maccatalyst-x64;
$(OutputPath)runtimes\osx;
$(OutputPath)runtimes\osx-arm64;
- $(OutputPath)runtimes\osx-x64"/>
+ $(OutputPath)runtimes\osx-x64;
+ $(PublishDir)runtimes\win-arm;
+ $(PublishDir)runtimes\win-arm64;
+ $(PublishDir)runtimes\win-x86;"/>
@@ -78,7 +81,10 @@
$(PublishDir)runtimes\maccatalyst-x64;
$(PublishDir)runtimes\osx;
$(PublishDir)runtimes\osx-arm64;
- $(PublishDir)runtimes\osx-x64"/>
+ $(PublishDir)runtimes\osx-x64;
+ $(PublishDir)runtimes\win-arm;
+ $(PublishDir)runtimes\win-arm64;
+ $(PublishDir)runtimes\win-x86;"/>
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 7d3cf164c..7df927f6e 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -54,7 +54,10 @@
$(OutputPath)runtimes\maccatalyst-x64;
$(OutputPath)runtimes\osx;
$(OutputPath)runtimes\osx-arm64;
- $(OutputPath)runtimes\osx-x64"/>
+ $(OutputPath)runtimes\osx-x64;
+ $(PublishDir)runtimes\win-arm;
+ $(PublishDir)runtimes\win-arm64;
+ $(PublishDir)runtimes\win-x86"/>
@@ -75,7 +78,10 @@
$(PublishDir)runtimes\maccatalyst-x64;
$(PublishDir)runtimes\osx;
$(PublishDir)runtimes\osx-arm64;
- $(PublishDir)runtimes\osx-x64"/>
+ $(PublishDir)runtimes\osx-x64;
+ $(PublishDir)runtimes\win-arm;
+ $(PublishDir)runtimes\win-arm64;
+ $(PublishDir)runtimes\win-x86"/>
From 5108114f2f00e8288a3390226b37acb7506fd50d Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 31 Aug 2025 14:45:59 +0800
Subject: [PATCH 1706/1798] Test1
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 7df927f6e..04478a008 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -57,7 +57,7 @@
$(OutputPath)runtimes\osx-x64;
$(PublishDir)runtimes\win-arm;
$(PublishDir)runtimes\win-arm64;
- $(PublishDir)runtimes\win-x86"/>
+ $(PublishDir)runtimes\win-x86;"/>
@@ -81,7 +81,7 @@
$(PublishDir)runtimes\osx-x64;
$(PublishDir)runtimes\win-arm;
$(PublishDir)runtimes\win-arm64;
- $(PublishDir)runtimes\win-x86"/>
+ $(PublishDir)runtimes\win-x86;"/>
From 3906fd46afdca0bada51d93775f2df2fa5c3c31d Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 31 Aug 2025 14:53:38 +0800
Subject: [PATCH 1707/1798] Fix
---
Flow.Launcher/Flow.Launcher.csproj | 6 +++---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 9ba570589..f40324884 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -58,9 +58,9 @@
$(OutputPath)runtimes\osx;
$(OutputPath)runtimes\osx-arm64;
$(OutputPath)runtimes\osx-x64;
- $(PublishDir)runtimes\win-arm;
- $(PublishDir)runtimes\win-arm64;
- $(PublishDir)runtimes\win-x86;"/>
+ $(OutputPath)runtimes\win-arm;
+ $(OutputPath)runtimes\win-arm64;
+ $(OutputPath)runtimes\win-x86;"/>
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 04478a008..6e9f37381 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -55,9 +55,9 @@
$(OutputPath)runtimes\osx;
$(OutputPath)runtimes\osx-arm64;
$(OutputPath)runtimes\osx-x64;
- $(PublishDir)runtimes\win-arm;
- $(PublishDir)runtimes\win-arm64;
- $(PublishDir)runtimes\win-x86;"/>
+ $(OutputPath)runtimes\win-arm;
+ $(OutputPath)runtimes\win-arm64;
+ $(OutputPath)runtimes\win-x86;"/>
From 9a2f813ea2901bf046d611af256d39172b61cb23 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Sun, 31 Aug 2025 15:09:48 +0800
Subject: [PATCH 1708/1798] Keep x86 runtime files
---
Flow.Launcher/Flow.Launcher.csproj | 6 ++----
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 6 ++----
2 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index f40324884..fa23d8886 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -59,8 +59,7 @@
$(OutputPath)runtimes\osx-arm64;
$(OutputPath)runtimes\osx-x64;
$(OutputPath)runtimes\win-arm;
- $(OutputPath)runtimes\win-arm64;
- $(OutputPath)runtimes\win-x86;"/>
+ $(OutputPath)runtimes\win-arm64;"/>
@@ -83,8 +82,7 @@
$(PublishDir)runtimes\osx-arm64;
$(PublishDir)runtimes\osx-x64;
$(PublishDir)runtimes\win-arm;
- $(PublishDir)runtimes\win-arm64;
- $(PublishDir)runtimes\win-x86;"/>
+ $(PublishDir)runtimes\win-arm64;"/>
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 6e9f37381..901dc2a37 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -56,8 +56,7 @@
$(OutputPath)runtimes\osx-arm64;
$(OutputPath)runtimes\osx-x64;
$(OutputPath)runtimes\win-arm;
- $(OutputPath)runtimes\win-arm64;
- $(OutputPath)runtimes\win-x86;"/>
+ $(OutputPath)runtimes\win-arm64;"/>
@@ -80,8 +79,7 @@
$(PublishDir)runtimes\osx-arm64;
$(PublishDir)runtimes\osx-x64;
$(PublishDir)runtimes\win-arm;
- $(PublishDir)runtimes\win-arm64;
- $(PublishDir)runtimes\win-x86;"/>
+ $(PublishDir)runtimes\win-arm64;"/>
From e05c94d9e4109bba065c1cd1ccd92e8ae589e829 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 31 Aug 2025 18:22:41 +1000
Subject: [PATCH 1709/1798] bump version
---
appveyor.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index a4a8e6f16..911e30423 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,4 @@
-version: '1.20.2.{build}'
+version: '2.0.0.{build}'
# Do not build on tags because we create a release on merge to master. Otherwise will upload artifacts twice changing the hash, as well as triggering duplicate GitHub release action & NuGet deployments.
skip_tags: true
From 82106ccc0f82ab62c22b15d1e8c5c38b6c7d77c6 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 31 Aug 2025 18:23:37 +1000
Subject: [PATCH 1710/1798] bump plugin project version
---
Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index eee8d5f4e..9427e2229 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -15,10 +15,10 @@
- 4.7.0
- 4.7.0
- 4.7.0
- 4.7.0
+ 4.8.0
+ 4.8.0
+ 4.8.0
+ 4.8.0Flow.Launcher.PluginFlow-LauncherMIT
From 19848aafb04e4631682164a0afe028f573a6db74 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 31 Aug 2025 18:28:43 +1000
Subject: [PATCH 1711/1798] update readme for Windows 10+ only support
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 4cd8e059e..f3be5190c 100644
--- a/README.md
+++ b/README.md
@@ -42,7 +42,7 @@ Dedicated to making your work flow more seamless. Search everything from applica
### Installation
-[Windows 7+ Installer](https://github.com/Flow-Launcher/Flow.Launcher/releases/latest/download/Flow-Launcher-Setup.exe) or [Portable Version](https://github.com/Flow-Launcher/Flow.Launcher/releases/latest/download/Flow-Launcher-Portable.zip)
+[Windows 10+ Installer](https://github.com/Flow-Launcher/Flow.Launcher/releases/latest/download/Flow-Launcher-Setup.exe) or [Portable Version](https://github.com/Flow-Launcher/Flow.Launcher/releases/latest/download/Flow-Launcher-Portable.zip)
#### Winget
From ca01d15dded048872ab29011b72fabc9bfd51950 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 31 Aug 2025 20:05:43 +1000
Subject: [PATCH 1712/1798] New Crowdin updates (#3824)
* New translations en.xaml (German)
[ci skip]
* New translations en.xaml (French)
[ci skip]
* New translations en.xaml (Arabic)
[ci skip]
* New translations en.xaml (Czech)
[ci skip]
* New translations en.xaml (Danish)
[ci skip]
* New translations en.xaml (Hebrew)
[ci skip]
* New translations en.xaml (Italian)
[ci skip]
* New translations en.xaml (Japanese)
[ci skip]
* New translations en.xaml (Korean)
[ci skip]
* New translations en.xaml (Dutch)
[ci skip]
* New translations en.xaml (Polish)
[ci skip]
* New translations en.xaml (Portuguese)
[ci skip]
* New translations en.xaml (Russian)
[ci skip]
* New translations en.xaml (Slovak)
[ci skip]
* New translations en.xaml (Turkish)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (Chinese Simplified)
[ci skip]
* New translations en.xaml (Chinese Traditional)
[ci skip]
* New translations en.xaml (Vietnamese)
[ci skip]
* New translations en.xaml (Portuguese, Brazilian)
[ci skip]
* New translations en.xaml (Norwegian Bokmal)
[ci skip]
* New translations en.xaml (Serbian (Latin))
[ci skip]
* New translations en.xaml (Spanish (Modern))
[ci skip]
* New translations en.xaml (Spanish, Latin America)
[ci skip]
* New translations en.xaml (French)
[ci skip]
* New translations en.xaml (Slovak)
[ci skip]
* New translations en.xaml (Chinese Simplified)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (French)
[ci skip]
* New translations en.xaml (Chinese Simplified)
[ci skip]
* New translations en.xaml (Chinese Simplified)
[ci skip]
* New translations en.xaml (Portuguese)
[ci skip]
* New translations en.xaml (German)
[ci skip]
* New translations en.xaml (French)
[ci skip]
* New translations en.xaml (Arabic)
[ci skip]
* New translations en.xaml (Czech)
[ci skip]
* New translations en.xaml (Danish)
[ci skip]
* New translations en.xaml (Hebrew)
[ci skip]
* New translations en.xaml (Italian)
[ci skip]
* New translations en.xaml (Japanese)
[ci skip]
* New translations en.xaml (Korean)
[ci skip]
* New translations en.xaml (Dutch)
[ci skip]
* New translations en.xaml (Polish)
[ci skip]
* New translations en.xaml (Portuguese)
[ci skip]
* New translations en.xaml (Russian)
[ci skip]
* New translations en.xaml (Slovak)
[ci skip]
* New translations en.xaml (Turkish)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (Chinese Simplified)
[ci skip]
* New translations en.xaml (Chinese Traditional)
[ci skip]
* New translations en.xaml (Vietnamese)
[ci skip]
* New translations en.xaml (Portuguese, Brazilian)
[ci skip]
* New translations en.xaml (Norwegian Bokmal)
[ci skip]
* New translations en.xaml (Serbian (Latin))
[ci skip]
* New translations en.xaml (Spanish (Modern))
[ci skip]
* New translations en.xaml (Spanish, Latin America)
[ci skip]
* New translations en.xaml (Slovak)
[ci skip]
* New translations en.xaml (French)
[ci skip]
---
Flow.Launcher/Languages/ar.xaml | 73 +-
Flow.Launcher/Languages/cs.xaml | 73 +-
Flow.Launcher/Languages/da.xaml | 73 +-
Flow.Launcher/Languages/de.xaml | 97 +-
Flow.Launcher/Languages/es-419.xaml | 73 +-
Flow.Launcher/Languages/es.xaml | 103 +-
Flow.Launcher/Languages/fr.xaml | 79 +-
Flow.Launcher/Languages/he.xaml | 73 +-
Flow.Launcher/Languages/it.xaml | 73 +-
Flow.Launcher/Languages/ja.xaml | 73 +-
Flow.Launcher/Languages/ko.xaml | 73 +-
Flow.Launcher/Languages/nb.xaml | 73 +-
Flow.Launcher/Languages/nl.xaml | 89 +-
Flow.Launcher/Languages/pl.xaml | 73 +-
Flow.Launcher/Languages/pt-br.xaml | 73 +-
Flow.Launcher/Languages/pt-pt.xaml | 123 +-
Flow.Launcher/Languages/ru.xaml | 73 +-
Flow.Launcher/Languages/sk.xaml | 76 +-
Flow.Launcher/Languages/sr-Cyrl-RS.xaml | 670 +++++
Flow.Launcher/Languages/sr.xaml | 73 +-
Flow.Launcher/Languages/tr.xaml | 299 +-
Flow.Launcher/Languages/uk-UA.xaml | 99 +-
Flow.Launcher/Languages/vi.xaml | 73 +-
Flow.Launcher/Languages/zh-cn.xaml | 73 +-
Flow.Launcher/Languages/zh-tw.xaml | 73 +-
.../Languages/ar.xaml | 3 +
.../Languages/cs.xaml | 3 +
.../Languages/da.xaml | 3 +
.../Languages/de.xaml | 3 +
.../Languages/es-419.xaml | 3 +
.../Languages/es.xaml | 3 +
.../Languages/fr.xaml | 3 +
.../Languages/he.xaml | 3 +
.../Languages/it.xaml | 3 +
.../Languages/ja.xaml | 3 +
.../Languages/ko.xaml | 3 +
.../Languages/nb.xaml | 3 +
.../Languages/nl.xaml | 3 +
.../Languages/pl.xaml | 3 +
.../Languages/pt-br.xaml | 3 +
.../Languages/pt-pt.xaml | 3 +
.../Languages/ru.xaml | 3 +
.../Languages/sk.xaml | 3 +
.../Languages/sr-Cyrl-RS.xaml | 33 +
.../Languages/sr.xaml | 3 +
.../Languages/tr.xaml | 5 +-
.../Languages/uk-UA.xaml | 5 +-
.../Languages/vi.xaml | 3 +
.../Languages/zh-cn.xaml | 3 +
.../Languages/zh-tw.xaml | 3 +
.../Languages/ar.xaml | 5 +-
.../Languages/cs.xaml | 3 +-
.../Languages/da.xaml | 5 +-
.../Languages/de.xaml | 7 +-
.../Languages/es-419.xaml | 3 +-
.../Languages/es.xaml | 9 +-
.../Languages/fr.xaml | 9 +-
.../Languages/he.xaml | 9 +-
.../Languages/it.xaml | 3 +-
.../Languages/ja.xaml | 3 +-
.../Languages/ko.xaml | 3 +-
.../Languages/nb.xaml | 3 +-
.../Languages/nl.xaml | 5 +-
.../Languages/pl.xaml | 3 +-
.../Languages/pt-br.xaml | 3 +-
.../Languages/pt-pt.xaml | 7 +-
.../Languages/ru.xaml | 7 +-
.../Languages/sk.xaml | 5 +-
.../Languages/sr-Cyrl-RS.xaml | 16 +
.../Languages/sr.xaml | 5 +-
.../Languages/tr.xaml | 3 +-
.../Languages/uk-UA.xaml | 5 +-
.../Languages/vi.xaml | 3 +-
.../Languages/zh-cn.xaml | 5 +-
.../Languages/zh-tw.xaml | 3 +-
.../Languages/ar.xaml | 46 +-
.../Languages/cs.xaml | 46 +-
.../Languages/da.xaml | 46 +-
.../Languages/de.xaml | 46 +-
.../Languages/es-419.xaml | 46 +-
.../Languages/es.xaml | 50 +-
.../Languages/fr.xaml | 46 +-
.../Languages/he.xaml | 46 +-
.../Languages/it.xaml | 46 +-
.../Languages/ja.xaml | 46 +-
.../Languages/ko.xaml | 46 +-
.../Languages/nb.xaml | 46 +-
.../Languages/nl.xaml | 46 +-
.../Languages/pl.xaml | 46 +-
.../Languages/pt-br.xaml | 46 +-
.../Languages/pt-pt.xaml | 46 +-
.../Languages/ru.xaml | 46 +-
.../Languages/sk.xaml | 46 +-
.../Languages/sr-Cyrl-RS.xaml | 210 ++
.../Languages/sr.xaml | 46 +-
.../Languages/tr.xaml | 164 +-
.../Languages/uk-UA.xaml | 56 +-
.../Languages/vi.xaml | 46 +-
.../Languages/zh-cn.xaml | 46 +-
.../Languages/zh-tw.xaml | 46 +-
.../Languages/sr-Cyrl-RS.xaml | 9 +
.../Languages/tr.xaml | 2 +-
.../Languages/de.xaml | 12 +-
.../Languages/es.xaml | 2 +-
.../Languages/sr-Cyrl-RS.xaml | 70 +
.../Languages/tr.xaml | 98 +-
.../Languages/sr-Cyrl-RS.xaml | 14 +
.../Languages/tr.xaml | 14 +-
.../Languages/sr-Cyrl-RS.xaml | 99 +
.../Languages/tr.xaml | 76 +-
.../Languages/uk-UA.xaml | 8 +-
.../Languages/ar.xaml | 2 +
.../Languages/cs.xaml | 2 +
.../Languages/da.xaml | 2 +
.../Languages/de.xaml | 2 +
.../Languages/es-419.xaml | 2 +
.../Languages/es.xaml | 2 +
.../Languages/fr.xaml | 2 +
.../Languages/he.xaml | 2 +
.../Languages/it.xaml | 2 +
.../Languages/ja.xaml | 2 +
.../Languages/ko.xaml | 2 +
.../Languages/nb.xaml | 2 +
.../Languages/nl.xaml | 2 +
.../Languages/pl.xaml | 2 +
.../Languages/pt-br.xaml | 2 +
.../Languages/pt-pt.xaml | 2 +
.../Languages/ru.xaml | 2 +
.../Languages/sk.xaml | 2 +
.../Languages/sr-Cyrl-RS.xaml | 20 +
.../Languages/sr.xaml | 2 +
.../Languages/tr.xaml | 22 +-
.../Languages/uk-UA.xaml | 2 +
.../Languages/vi.xaml | 2 +
.../Languages/zh-cn.xaml | 2 +
.../Languages/zh-tw.xaml | 2 +
.../Languages/ar.xaml | 2 +
.../Languages/cs.xaml | 2 +
.../Languages/da.xaml | 2 +
.../Languages/de.xaml | 2 +
.../Languages/es-419.xaml | 2 +
.../Languages/es.xaml | 2 +
.../Languages/fr.xaml | 2 +
.../Languages/he.xaml | 2 +
.../Languages/it.xaml | 2 +
.../Languages/ja.xaml | 2 +
.../Languages/ko.xaml | 2 +
.../Languages/nb.xaml | 2 +
.../Languages/nl.xaml | 2 +
.../Languages/pl.xaml | 2 +
.../Languages/pt-br.xaml | 2 +
.../Languages/pt-pt.xaml | 2 +
.../Languages/ru.xaml | 2 +
.../Languages/sk.xaml | 6 +-
.../Languages/sr-Cyrl-RS.xaml | 79 +
.../Languages/sr.xaml | 2 +
.../Languages/tr.xaml | 76 +-
.../Languages/uk-UA.xaml | 2 +
.../Languages/vi.xaml | 2 +
.../Languages/zh-cn.xaml | 2 +
.../Languages/zh-tw.xaml | 2 +
.../Languages/sr-Cyrl-RS.xaml | 17 +
.../Languages/tr.xaml | 6 +-
.../Languages/ar.xaml | 1 +
.../Languages/cs.xaml | 1 +
.../Languages/da.xaml | 1 +
.../Languages/de.xaml | 1 +
.../Languages/es-419.xaml | 1 +
.../Languages/es.xaml | 1 +
.../Languages/fr.xaml | 1 +
.../Languages/he.xaml | 1 +
.../Languages/it.xaml | 1 +
.../Languages/ja.xaml | 1 +
.../Languages/ko.xaml | 1 +
.../Languages/nb.xaml | 1 +
.../Languages/nl.xaml | 1 +
.../Languages/pl.xaml | 1 +
.../Languages/pt-br.xaml | 1 +
.../Languages/pt-pt.xaml | 1 +
.../Languages/ru.xaml | 1 +
.../Languages/sk.xaml | 1 +
.../Languages/sr-Cyrl-RS.xaml | 53 +
.../Languages/sr.xaml | 1 +
.../Languages/tr.xaml | 31 +-
.../Languages/uk-UA.xaml | 9 +-
.../Languages/vi.xaml | 1 +
.../Languages/zh-cn.xaml | 1 +
.../Languages/zh-tw.xaml | 1 +
.../Properties/Resources.pt-PT.resx | 6 +-
.../Properties/Resources.sr-SP.resx | 2514 +++++++++++++++++
.../Properties/Resources.tr-TR.resx | 426 +--
.../Properties/Resources.uk-UA.resx | 40 +-
192 files changed, 7258 insertions(+), 1053 deletions(-)
create mode 100644 Flow.Launcher/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.Program/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.Shell/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.Sys/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.Url/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr-Cyrl-RS.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.sr-SP.resx
diff --git a/Flow.Launcher/Languages/ar.xaml b/Flow.Launcher/Languages/ar.xaml
index 80fde6441..4a7efc125 100644
--- a/Flow.Launcher/Languages/ar.xaml
+++ b/Flow.Launcher/Languages/ar.xaml
@@ -16,6 +16,26 @@
فشل في تهيئة الإضافاتالإضافات: {0} - فشل في التحميل وسيتم تعطيلها، يرجى الاتصال بمطور الإضافة للحصول على المساعدة
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
فشل في تسجيل مفتاح التشغيل السريع "{0}". قد يكون المفتاح مستخدمًا من قبل برنامج آخر. قم بتغيير المفتاح، أو قم بإغلاق البرنامج الآخر.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
دائمًا ابدأ الكتابة بوضع الإنجليزيةتغيير مؤقت لطريقة الإدخال إلى وضع الإنجليزية عند تنشيط Flow.التحديث التلقائي
+ Automatically check and update the app when availableاخترإخفاء Flow Launcher عند بدء التشغيليتم إخفاء نافذة بحث Flow Launcher في العلبة بعد بدء التشغيل.
@@ -102,7 +123,20 @@
منخفضةعاديةالبحث باستخدام Pinyin
- السماح باستخدام Pinyin للبحث. Pinyin هو نظام التهجئة الروماني القياسي لترجمة الصينية.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
دائمًا معاينةفتح لوحة المعاينة دائمًا عند تنشيط Flow. اضغط على {0} للتبديل بين المعاينة وعدمها.تأثير الظل غير مسموح به بينما يتم تمكين تأثير التمويه في السمة الحالية
@@ -131,6 +165,8 @@
فتحUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableالبحث عن إضافة
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ لا توجد تحديثات متاح
+ جميع الإضافات محدث
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.السمة
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxبروكسي HTTP
@@ -549,6 +615,11 @@
تحديث الملفاتوصف التحديث
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
تخطيمرحبًا بك في Flow Launcher
diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml
index aa13f2203..a737002fb 100644
--- a/Flow.Launcher/Languages/cs.xaml
+++ b/Flow.Launcher/Languages/cs.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Nepodařilo se zaregistrovat hotkey "{0}". Klávesová zkratka může být používána jiným programem. Změňte na jinou klávesu nebo ukončíte jiný program.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
Vždy spouštět psaní v anglickém rozvržení klávesniceDočasně změní metodu vstupu do angličtiny při zobrazení Flow Launcher.Automatické aktualizace
+ Automatically check and update the app when availableVybratSkrýt Flow Launcher při spuštěníFlow Launcher search window is hidden in the tray after starting up.
@@ -102,7 +123,20 @@
LowRegularVyhledávání pomocí pchin-jin
- Umožňuje vyhledávání pomocí pchin-jin. Pchin-jin je systém zápisu čínského jazyka pomocí písmen latinky.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Vždy zobrazit náhledPři aktivaci služby Flow vždy otevřete panel náhledu. Stisknutím klávesy {0} přepnete náhled.Stínový efekt není povolen, pokud je aktivní efekt rozostření
@@ -131,6 +165,8 @@
OtevřítUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableVyhledat plugin
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ Nejsou dostupné žádné aktualizace
+ Všechny pluginy jsou aktuální
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.Motiv
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxHTTP Proxy
@@ -549,6 +615,11 @@ Pokud před zkratku při zadávání přidáte znak "@", bude odpovíd
Aktualizovat souboryAktualizovat popis
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
PřeskočitVítejte v Flow Launcheru
diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml
index d734b4356..4ed75f118 100644
--- a/Flow.Launcher/Languages/da.xaml
+++ b/Flow.Launcher/Languages/da.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
Always Start Typing in English ModeTemporarily change your input method to English mode when activating Flow.Autoopdatering
+ Automatically check and update the app when availableVælgSkjul Flow Launcher ved opstartFlow Launcher search window is hidden in the tray after starting up.
@@ -102,7 +123,20 @@
LowRegularSearch with Pinyin
- Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Always PreviewAlways open preview panel when Flow activates. Press {0} to toggle preview.Skyggeeffekt er ikke tilladt, når det aktuelle tema har sløringseffekt aktiveret
@@ -131,6 +165,8 @@
ÅbenUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableSearch Plugin
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ No update available
+ All plugins are up to date
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.Tema
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxHTTP Proxy
@@ -549,6 +615,11 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
OpdatereringsfilerOpdateringsbeskrivelse
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
SkipWelcome to Flow Launcher
diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml
index ca2a1bd0b..5c116946a 100644
--- a/Flow.Launcher/Languages/de.xaml
+++ b/Flow.Launcher/Languages/de.xaml
@@ -16,6 +16,26 @@
Plug-ins können nicht initialisiert werdenPlug-ins: {0} - können nicht geladen werden und wird deaktiviert, bitte kontaktieren Sie den Ersteller des Plug-ins für Hilfe
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Bitte versuchen Sie es erneut
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Hotkey "{0}" konnte nicht registriert werden. Der Hotkey ist möglicherweise von einem anderen Programm in Verwendung. Wechseln Sie zu einem anderen Hotkey oder beenden Sie das andere Programm.Registrierung des Hotkeys "{0}" konnte nicht aufgehoben werden. Bitte versuchen Sie es erneut oder lesen Sie das Log für Details
@@ -91,6 +111,7 @@
Tippen immer im englischen Modus startenÄndern Sie Ihre Eingabemethode temporär in den englischen Modus, wenn Sie Flow aktivieren.Auto-Update
+ Automatically check and update the app when availableAuswählenFlow Launcher beim Start ausblendenFlow Launcher-Suchfenster wird nach dem Start in der Taskleiste ausgeblendet.
@@ -102,7 +123,20 @@
GeringRegelmäßigSuche mit Pinyin
- Ermöglicht die Verwendung von Pinyin für die Suche. Pinyin ist das Standardsystem der romanisierten Schreibweise für die Übersetzung von chinesischen Texten.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Double Pinyin verwenden
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin-Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Immer VorschauVorschau-Panel immer öffnen, wenn Flow aktiviert ist. Drücken Sie {0}, um Vorschau umzuschalten.Schatteneffekt ist nicht erlaubt, während das aktuelle Theme den Unschärfe-Effekt aktiviert hat
@@ -131,6 +165,8 @@
ÖffnenVorherige koreanische IME verwendenSie können die Einstellungen des vorherigen koreanischen IME direkt von hier aus ändern
+ Koreanische IME-Einstellung konnte nicht geändert werden
+ Please check your system registry access or contact support.HomepageErgebnisse der Homepage zeigen, wenn Abfragetext leer ist.Historie-Ergebnisse auf Homepage zeigen
@@ -140,8 +176,10 @@
Setzt die Einstellung 'Immer im Vordergrund' anderer Programme außer Kraft und zeigt Flow in der vordersten Position an.Restart after modifying plugin via Plugin StoreRestart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store
- Show unknown source warning
+ Unbekannte Quellwarnung zeigenShow warning when installing plugins from unknown sources
+ Plug-ins automatisch aktualisieren
+ Automatically check plugin updates and notify if there are any updates availablePlug-in suchen
@@ -180,7 +218,7 @@
Plug-ins: {0} - Plug-in-Einstellungsdateien können nicht entfernt werden, bitte entfernen Sie diese manuellPlug-in-Cache kann nicht entfernt werdenPlug-ins: {0} - Plug-in-Cache-Dateien können nicht entfernt werden, bitte entfernen Sie diese manuell
- {0} modified already
+ {0} bereits modifiziertPlease restart Flow before making any further changesFail to install {0}Fail to uninstall {0}
@@ -203,26 +241,32 @@
Neues Update ist verfügbarFehler bei Installation des Plug-insFehler bei Deinstallation des Plug-ins
- Error updating plugin
+ Fehler bei Aktualisierung des Plug-insPlug-in-Einstellungen beibehaltenMöchten Sie die Einstellungen des Plug-ins für die nächste Nutzung beibehalten?Plug-in {0} erfolgreich installiert. Bitte starten Sie Flow neu.Plug-in {0} erfolgreich deinstalliert. Bitte starten Sie Flow neu.Plug-in {0} erfolgreich aktualisiert. Bitte starten Sie Flow neu.
- Plugin install
+ Plug-in-Installation{0} von {1} {2}{2}Möchten Sie dieses Plug-in installieren?
- Plugin uninstall
+ Plug-in-Deinstallation{0} von {1} {2}{2}Möchten Sie dieses Plug-in deinstallieren?
- Plugin update
+ Plug-in-Update{0} von {1} {2}{2}Möchten Sie dieses Plugin aktualisieren?Plug-in wird heruntergeladenAutomatically restart after installing/uninstalling/updating plugins in plugin storeZip file does not have a valid plugin.json configurationInstallation aus unbekannter QuelleThis plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window)
- Zip files
- Please select zip file
- Install plugin from local path
+ Zip-Dateien
+ Bitte wählen Sie eine Zip-Datei aus
+ Plug-in aus lokalem Pfad installieren
+ Kein Update verfügbar
+ Alle Plug-ins sind auf dem neuesten Stand
+ Plug-in-Updates verfügbar
+ Plug-ins aktualisieren
+ Plug-in-Updates überprüfen
+ Plug-ins sind erfolgreich aktualisiert. Bitte starten Sie Flow neu.Theme
@@ -350,6 +394,28 @@
Ergebnis-Badges zeigenFür unterstützte Plug-ins werden Badges zur besseren Unterscheidung angezeigt.Ergebnis-Badges nur für globale Abfrage zeigen
+ Badges nur für globale Abfrageergebnisse zeigen
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Linksklick oder Enter-Taste
+ Rechtsklick
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Vollständigen Pfad in Dateinamensbox ausfüllen
+ Vollständigen Pfad in Dateinamensbox ausfüllen und öffnen
+ Verzeichnis in Pfadbox ausfüllenHTTP-Proxy
@@ -466,14 +532,14 @@
Drücken Sie einen benutzerdefinierten Hotkey, um Flow Launcher zu öffnen und die spezifizierte Abfrage automatisch einzugeben.VorschauHotkey ist nicht verfügbar, bitte wählen Sie einen neuen Hotkey aus
- Hotkey is invalid
+ Hotkey ist ungültigAktualisierenBindung HotkeyAktueller Hotkey ist nicht verfügbar.Dieser Hotkey ist für "{0}" reserviert und kann nicht verwendet werden. Bitte wählen Sie einen anderen Hotkey.Dieser Hotkey ist bereits in Verwendung von "{0}". Wenn Sie "Überschreiben" drücken, wird dieser aus "{0}" entfernt.Drücken Sie die Tasten, die Sie für diese Funktion verwenden möchten.
- Hotkey and action keyword are empty
+ Hotkey und Aktions-Schlüsselwort sind leerBenutzerdefinierter Abfrage-Shortcut
@@ -484,7 +550,7 @@ Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt die
Shortcut ist bereits vorhanden, bitte geben Sie einen neuen Shortcut ein oder bearbeiten Sie den vorhandenen.Shortcut und/oder dessen Erweiterung ist leer.
- Shortcut is invalid
+ Shortcut ist ungültigSpeichern
@@ -549,6 +615,11 @@ Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt die
Daten aktualisierenUpdate-Beschreibung
+
+ Flow Launcher nach Aktualisierung der Plug-ins neu starten
+ {0}: Update von v{1} auf v{2}
+ Kein Plug-In ausgewählt
+
ÜberspringenWillkommen bei Flow Launcher
diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml
index 814cea882..b976787c3 100644
--- a/Flow.Launcher/Languages/es-419.xaml
+++ b/Flow.Launcher/Languages/es-419.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
Always Start Typing in English ModeTemporarily change your input method to English mode when activating Flow.Actualización automática
+ Automatically check and update the app when availableSeleccionarOcultar Flow Launcher al arrancar el sistemaFlow Launcher search window is hidden in the tray after starting up.
@@ -102,7 +123,20 @@
LowRegularSearch with Pinyin
- Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Always PreviewAlways open preview panel when Flow activates. Press {0} to toggle preview.El efecto de sombra no está permitido mientras el tema actual tenga el efecto de desenfoque habilitado
@@ -131,6 +165,8 @@
AbrirUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableSearch Plugin
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ No update available
+ All plugins are up to date
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.Tema
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxProxy HTTP
@@ -549,6 +615,11 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Actualizar archivosActualizar descripción
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
OmitirBienvenido a Flow Launcher
diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml
index c65773212..e75ec4a6c 100644
--- a/Flow.Launcher/Languages/es.xaml
+++ b/Flow.Launcher/Languages/es.xaml
@@ -16,6 +16,26 @@
Fallo al iniciar los complementosComplemento: {0} - no se pudo cargar y se desactivará, póngase en contacto con el creador del complemento para obtener ayuda
+
+ Flow Launcher necesita reiniciarse para terminar de deshabilitar el modo portable, después de reiniciar se borrará el perfil de datos portables y se mantendrá el perfil de datos itinerantes
+ Flow Launcher necesita reiniciarse para terminar de habilitar el modo portable, después de reiniciar se borrará el perfil de datos itinerantes y se mantendrá el perfil de datos portables
+ Flow Launcher ha detectado que tiene activado el modo portable, ¿desea moverlo a otra ubicación?
+ Flow Launcher ha detectado que tiene desactivado el modo portable, los accesos directos relevantes y la entrada del desinstalador han sido creados
+ Flow Launcher ha detectado que los datos de usario existen tanto en {0} como en {1}. {2}{2}Por favor, elimine {1} para continuar. No se han producido cambios.
+
+
+ El siguiente complemento ha sufrido un error y no puede cargarse:
+ Los siguientes complementos han sufrido un error y no pueden cargarse:
+ Por favor, consulte los registros para más información
+
+
+ Por favor inténtelo de nuevo
+ No se puede analizar el proxy Http
+
+
+ No se ha podido instalar el entorno TypeScript. Por favor, inténtelo de nuevo más tarde.
+ No se ha podido instalar el entorno Python. Por favor, inténtelo de nuevo más tarde.
+
No se ha podido registrar el atajo de teclado "{0}". El atajo de teclado puede estar siendo utilizado por otro programa. Seleccione un atajo de teclado diferente o salga del otro programa.No se ha podido anular el registro de la tecla de acceso rápido «{0}». Inténtelo de nuevo o consulte el registro para obtener más detalles
@@ -91,6 +111,7 @@
Empezar a escribir siempre en modo inglésCambia temporalmente el método de entrada al modo inglés cuando se activa Flow.Actualización automática
+ Comprueba y actualiza automáticamente la aplicación cuando esté disponibleSeleccionarOcultar Flow Launcher al inicioLa ventana de búsqueda de Flow Launcher se oculta en la bandeja del sistema tras el arranque.
@@ -102,7 +123,20 @@
BajaNormalBuscar con Pinyin
- Permite utilizar Pinyin para la búsqueda. Pinyin es el sistema estándar de ortografía romanizado para traducir chino.
+ Pinyin es el sistema estándar de ortografía romanizada para traducir chino. Tenga en cuenta que activar esta opción puede aumentar significativamente el uso de memoria durante la búsqueda.
+ Utilizar Doble Pinyin
+ Utiliza Doble Pinyin en lugar de Pinyin Completo para buscar.
+ Esquema Doble Pinyin
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Mostrar siempre vista previaMuestra siempre el panel de vista previa al iniciar Flow. Pulsar {0} para mostrar/ocultar la vista previa.El efecto de sombra no está permitido si el tema actual tiene activado el efecto de desenfoque
@@ -131,6 +165,8 @@
AbrirUtilizar IME Coreano anteriorSe puede cambiar la configuración anterior del IME coreano directamente desde aquí
+ No se ha podido cambiar la configuración del IME coreano
+ Por favor, compruebe el acceso al registro de su sistema o póngase en contacto con el soporte técnico.Página de inicioMuestra los resultados de la página de inicio cuando el texto de la consulta está vacío.Mostrar historial de resultados en la página de inicio
@@ -139,9 +175,11 @@
Mostrar ventana de búsqueda en primer planoAnula el ajuste «Siempre arriba» de otros programas y muestra Flow en primer plano.Reiniciar después de modificar el complemento a través de la Tienda de complementos
- Reiniciar Flow Launcher automáticamente después de instalar/desinstalar/actualizar el complemento a través de la Tienda de complementos
+ Reinicia Flow Launcher automáticamente después de instalar/desinstalar/actualizar el complemento a través de la Tienda de complementosMostrar advertencia de fuente desconocida
- Mostrar advertencia al instalar complementos desde fuentes desconocidas
+ Muestra advertencia al instalar complementos desde fuentes desconocidas
+ Actualizar automáticamente los complementos
+ Comprueba automáticamente las actualizaciones del complemento y notifica si hay actualizaciones disponiblesBuscar complemento
@@ -182,8 +220,8 @@
Complementos: {0} - Fallo al eliminar los archivos de caché del complemento, por favor elimínelos manualmente{0} ya está modificadoReiniciar Flow antes de realizar más cambios
- No se pudo instalar {0}
- No se pudo desinstalar {0}
+ Fallo al instalar {0}
+ Fallo al desinstalar {0}No se puede encontrar plugin.json en el archivo zip extraído, o esta ruta {0} no existeYa existe un complemento con el mismo ID y versión, o la versión es superior a la de este complemento descargado
@@ -222,7 +260,13 @@
¡Este complemento es de una fuente desconocida y puede contener riesgos potenciales!{0}{0}Asegúrese de entender de dónde proviene este complemento y que es seguro.{0}{0}¿Desea continuar aún?{0}{0}(Puede desactivar esta advertencia en la sección general de la ventana de configuración)Archivos ZipPor favor, seleccione archivo zip
- Instalar complemento desde la ruta local
+ Instalar complemento desde ruta local
+ No hay actualizaciones disponibles
+ Todos los complementos están actualizados
+ Actualizaciones de complementos disponibles
+ Actualizar complementos
+ Comprobar actualizaciones de los complementos
+ Los complementos se han actualizado correctamente. Por favor, reinicie Flow.Tema
@@ -251,7 +295,7 @@
Modo VentanaOpacidadEl tema {0} no existe, activando el tema por defecto
- Fallo al cargar el tema {0}, activando el tema predeterminado
+ Fallo al cargar el tema {0}, volver al tema predeterminadoCarpeta de temas del usuarioAbrir carpeta de temasEsquema de colores
@@ -283,9 +327,9 @@
Este tema soporta dos modos (claro/oscuro).Este tema soporta fondo transparente desenfocado.Mostrar marcador de posición
- Mostrar marcador de posición cuando la consulta esté vacía
+ Muestra marcador de posición cuando la consulta esté vacíaTexto del marcador de posición
- Cambiar el texto del marcador de posición. La entrada vacía utilizará: {0}
+ Cambia el texto del marcador de posición. La entrada vacía utilizará: {0}Tamaño fijo de la ventanaEl tamaño de la ventana no se puede ajustar mediante arrastre.
@@ -293,9 +337,9 @@
Atajo de tecladoAtajos de tecladoAbrir/Cerrar Flow Launcher
- Introduzca el atajo de teclado para abrir/cerrar Flow Launcher.
+ Introducir atajo de teclado para abrir/cerrar Flow Launcher.Mostrar/Ocultar vista previa
- Introduzca el atajo de teclado para mostrar/ocultar la vista previa en la ventana de búsqueda.
+ Introducir atajo de teclado para mostrar/ocultar la vista previa en la ventana de búsqueda.Atajos de teclado preestablecidosLista de atajos de teclado actualmente registradosTecla modificadora para abrir resultado
@@ -350,6 +394,28 @@
Mostrar distintivos en resultadosPara los complementos compatibles, se muestran distintivos que ayudan a distinguirlos más fácilmente.Mostrar distintivos en resultados solo para consulta global
+ Mostrar distintivos solo para los resultados de consultas globales
+ Salto de diálogo
+ Introducir atajo de teclado para acceder rápidamente a la ventana de diálogo Abrir/Guardar como en la ruta del administrador de archivos actual.
+ Salto de diálogo
+ Cuando se abre la ventana de diálogo Abrir/Guardar como, accede rápidamente a la ruta actual del administrador de archivos.
+ Salto de diálogo automáticamente
+ Cuando se muestra la ventana de diálogo Abrir/Guardar como, accede automáticamente a la ruta del administrador de archivos actual. (Experimental)
+ Mostrar ventana de salto de diálogo
+ Muestra la ventana de búsqueda de salto de diálogo cuando se presenta la ventana de diálogo de abrir/guardar para acceder rápidamente a las ubicaciones de los archivos/carpetas.
+ Posición de la ventana de salto de diálogo
+ Selecciona la posición de la ventana de búsqueda de salto de diálogo
+ Fijada bajo la ventana de diálogo Abrir/Guardar como. Se muestra al abrir y permanece hasta que se cierra la ventana
+ Posición predeterminada de la ventana de búsqueda. Se muestra cuando se activa con el atajo de teclado de la ventana de búsqueda
+ Comportamiento de navegación de los resultados de salto de diálogo
+ Comportamiento de navegación de la ventana de diálogo Abrir/Guardar como según la ruta de resultados seleccionada
+ Clic izquierdo o tecla Entrar
+ Clic derecho
+ Comportamiento de navegación de archivos de salto de diálogo
+ Comportamiento de navegación de la ventana de diálogo Abrir/Guardar como cuando el resultado es una ruta de archivo
+ Rellenar la ruta completa en el cuadro del nombre del archivo
+ Rellenar la ruta completa en el cuadro del nombre del archivo y abrir
+ Rellenar directorio en el cuadro de rutaProxy HTTP
@@ -378,9 +444,9 @@
Buscar actualizacionesHágase PatrocinadorLa nueva versión {0} está disponible, ¿desea reiniciar Flow Launcher para actualizar?
- La comprobación de las actualizaciones ha fallado, por favor, compruebe la configuración de su proxy y conexión a api.github.com.
+ Ha fallado la comprobación de las actualizaciones, por favor, compruebe la configuración de su proxy y conexión a api.github.com.
- La descarga de las actualizaciones ha fallado, por favor, compruebe la configuración de su proxy y conexión a github-cloud.s3.amazonaws.com,
+ Ha fallado la descarga de las actualizaciones, por favor, compruebe la configuración de su proxy y conexión a github-cloud.s3.amazonaws.com,
o diríjase a https://github.com/Flow-Launcher/Flow.Launcher/releases para descargar actualizaciones manualmente.
Notas de la versión
@@ -393,7 +459,7 @@
Carpeta del cachéLimpiar cachés¿Está seguro de que desea eliminar todos los cachés?
- No se pudo eliminar parte de las carpetas y archivos. Por favor, consulte el archivo de registro para más información
+ No se ha podido eliminar parte de las carpetas y archivos. Por favor, consulte el archivo de registro para más informaciónAsistenteUbicación de datos del usuarioLa 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.
@@ -406,7 +472,7 @@
Ver más notas de la versión en GitHub
- No se pudo obtener las notas de la versión
+ No se ha podido obtener las notas de la versiónPor favor, compruebe su conexión de red o asegúrese de que GitHub es accesibleFlow Launcher ha sido actualizado a {0}Haga clic aquí para ver las notas de la versión
@@ -450,7 +516,7 @@
Esta nueva palabra clave de acción es la misma que la anterior, por favor elija una diferenteCorrectoFinalizado correctamente
- No se pudo copiar
+ No se ha podido copiarIntroducir las palabras claves de acción que se desean utilizar para iniciar el complemento, utilizando espacios en blanco para separarlas. Utilizar * si no se desea especificar ninguna, para que el complemento se inicie sin ninguna palabra clave de acción.
@@ -549,6 +615,11 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci
Actualizar archivosActualizar descripción
+
+ Reiniciar Flow Launcher después de actualizar complementos
+ {0}: Actualizar desde v{1} a v{2}
+ No se ha seleccionado ningún complemento
+
OmitirBienvenido a Flow Launcher
diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml
index 52013a7db..0ad69810b 100644
--- a/Flow.Launcher/Languages/fr.xaml
+++ b/Flow.Launcher/Languages/fr.xaml
@@ -16,6 +16,26 @@
Échec de l'initialisation des pluginsPlugins : {0} - n'ont pas pu être chargés et doivent être désactivés, veuillez contacter le créateur du plugin pour obtenir de l'aide
+
+ Flow Launcher doit redémarrer pour terminer la désactivation le mode portable, après le redémarrage, les données du profile portable seront supprimé et les données roaming conservé
+ Flow Launcher doit redémarrer pour terminer l'activation du mode portable, après le redémarrage, les données du profile roaming seront supprimé et les données du profile portable conservé
+ Flow Launcher à détecter que vous avez activé le mode portable, voulez-vous le déplacer à un autre emplacement ?
+ Flow Launcher a détecté que vous avez désactivé le mode portable, les raccourcis liés et l'entrée de désinstallation ont été créés
+ Flow Launcher a détecté que vos données utilisateur existent à la fois dans {0} et {1}. {2}{2}Veuillez supprimer {1} pour continuer. Aucune modification n'a été apportée.
+
+
+ Le plugin suivant a produit une erreur et ne peut être chargé :
+ Les plugins suivants ont produit une erreur et ne peuvent pas être chargés :
+ Veuillez vous référer aux logs pour plus d'informations
+
+
+ Veuillez réessayer
+ Impossible d'analyser le proxy Http
+
+
+ Échec de l'installation de l'environnement TypeScript. Veuillez réessayer plus tard.
+ Échec de l'installation de l'environnement Python. Veuillez réessayer plus tard.
+
Échec lors de l'enregistrement du raccourci : {0}Échec de la réinitialisation du raccourci "{0}". Veuillez réessayer ou consulter le journal pour plus de détails
@@ -91,6 +111,7 @@
Toujours commencer à taper en mode anglaisChangez temporairement votre mode de saisie en mode anglais lors de l'activation de Flow.Mettre à jour automatiquement
+ Vérifier et mettre à jour automatiquement l'application lorsqu'une nouvelle version est disponibleSélectionnerCacher Flow Launcher au démarrageLa fenêtre de recherche de Flow Launcher est cachée dans la barre d’état après le démarrage.
@@ -102,7 +123,20 @@
FaibleNormalDevrait utiliser Pinyin
- Permet d'utiliser Pinyin pour la recherche. Pinyin est le système standard d'orthographe romanisée pour la traduction du chinois
+ Pinyin est le système standard d'orthographe romanisée pour traduire le chinois. Veuillez noter que cela peut augmenter considérablement l'utilisation de la mémoire pendant la recherche.
+ Utiliser Double Pinyin
+ Utilisez Double Pinyin au lieu de Full Pinyin pour rechercher.
+ Schéma double Pinyin
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Toujours prévisualiserToujours ouvrir le panneau d'aperçu lorsque Flow s'active. Appuyez sur {0} pour activer/désactiver l'aperçu.L'effet d'ombre n'est pas autorisé lorsque le thème actuel à un effet de flou activé
@@ -131,6 +165,8 @@
OuvrirUtilisez l'IME coréenne précédenteVous pouvez modifier les paramètres de l'IME coréen précédent directement à partir d'ici
+ Impossible de changer le paramètre IME coréen
+ Veuillez vérifier votre accès au registre du système ou contacter le support.Page d'accueilAfficher les résultats de la page d'accueil lorsque le texte de la requête est vide.Afficher les résultats de l'historique sur la page d'accueil
@@ -142,6 +178,8 @@
Redémarrez automatiquement Flow Launcher après l'installation / désinstallation / mise à jour du plugin via le magasin des pluginsAfficher l'avertissement de source inconnueAfficher un avertissement lors de l'installation de plugins à partir de sources inconnues
+ Mettre à jour automatiquement les plugins
+ Vérifier automatiquement les mises à jour des plugins et notifier s'il y a des mises à jour disponiblesRechercher des plugins
@@ -223,6 +261,12 @@
Fichiers zipVeuillez sélectionner un fichier zipInstaller le plugin depuis le chemin local
+ Aucune mise à jour disponible
+ Tous les plugins sont à jour
+ Mises à jour de plugins disponibles
+ Mettre à jour les plugins
+ Vérifier les mises à jour des plugins
+ Plugins mis à jour avec succès. Veuillez redémarrer Flow.Thèmes
@@ -350,6 +394,28 @@
Afficher les badges de résultatsPour les plugins pris en charge, des badges sont affichés afin de les distinguer plus facilement.Afficher les badges de résultats pour la requête globale uniquement
+ Afficher les badges pour les résultats des requêtes globales uniquement
+ Dialog Jump
+ Entrez le raccourci pour naviguer rapidement dans la fenêtre de dialogue Ouvrir/Enregistrer sous, vers le chemin du gestionnaire de fichiers actuel.
+ Dialog Jump
+ Lorsque la fenêtre de dialogue Ouvrir/Enregistrer sous s'ouvre, accédez rapidement au chemin d'accès actuel du gestionnaire de fichiers.
+ Dialog Jump Automatically
+ Lorsque la fenêtre de dialogue Ouvrir/Enregistrer sous est affichée, naviguez automatiquement vers le chemin du gestionnaire de fichiers actuel. (Expérimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Clique droit
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Remplir le chemin complet dans la zone de nom de fichier
+ Remplir le chemin complet dans la zone de nom de fichier et ouvrir
+ Remplir le répertoire dans la zone de cheminProxy HTTP
@@ -377,7 +443,7 @@
Vous avez utilisé Flow Launcher {0} foisVérifier les mises à jourDevenir un Sponsor
- Nouvelle version {0} disponible, veuillez redémarrer Flow Launcher
+ Nouvelle version {0} disponible, souhaitez-vous redémarrer Flow Launcher pour l'installer ?Échec de la vérification de la mise à jour, vérifiez votre connexion et vos paramètres de configuration proxy pour pouvoir acceder à api.github.com.
Échec du téléchargement de la mise à jour, vérifiez votre connexion et vos paramètres de configuration proxy pour pouvoir acceder à github-cloud.s3.amazonaws.com, ou téléchargez manuelement la mise à jour sur https://github.com/Flow-Launcher/Flow.Launcher/releases.
@@ -536,8 +602,8 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu
Flow Launcher n'a pas pu déplacer les données de votre profil utilisateur vers la nouvelle version de mise à jour.
Veuillez déplacer manuellement le dossier de données de votre profil de {0} vers {1}
- Nouvelle mise à jour
- Version v{0} de Flow Launcher disponible
+ Mise à jour disponible
+ La nouvelle version {0} de Flow Launcher est maintenant disponibleUne erreur s'est produite lors de l'installation de la mise à jourMettre à jourAnnuler
@@ -548,6 +614,11 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu
Fichiers mis à jourDescription de la mise à jour
+
+ Redémarrer Flow Launcher après la mise à jour des plugins
+ {0}: Mis à jour de v{1} vers v{2}
+ Aucun plugin sélectionné
+
PasserBienvenue dans Flow Launcher
diff --git a/Flow.Launcher/Languages/he.xaml b/Flow.Launcher/Languages/he.xaml
index b72125214..03c3afc9b 100644
--- a/Flow.Launcher/Languages/he.xaml
+++ b/Flow.Launcher/Languages/he.xaml
@@ -16,6 +16,26 @@
נכשל בהפעלת תוספיםתוספים: {0} - נכשלו בטעינה ויושבתו, אנא צור קשר עם יוצרי התוספים לקבלת עזרה
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
רישום מקש הקיצור "{0}" נכשל. ייתכן שמקש הקיצור נמצא בשימוש על ידי תוכנה אחרת. שנה למקש קיצור אחר, או צא מהתוכנה האחרת.ביטול הרישום של מקש קיצור "{0}" נכשל. אנא נסה שוב או עיין ביומן הרישום לפרטים נוספים
@@ -91,6 +111,7 @@
תמיד התחל להקליד במצב אנגליתשנה זמנית את שיטת הקלט שלך למצב אנגלית בעת הפעלת Flow.עדכון אוטומטי
+ Automatically check and update the app when availableבחרהסתר את Flow Launcher בהפעלת המחשבחלון החיפוש של Flow Launcher מוסתר במגש לאחר ההפעלה.
@@ -102,7 +123,20 @@
נמוךRegularחפש באמצעות Pinyin
- מאפשר חיפוש באמצעות Pinyin, מערכת הכתיבה הסטנדרטית לתרגום סינית.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
הצג תמיד תצוגה מקדימהפתח תמיד את לוח התצוגה המקדימה כאשר Flow מופעל. הקש על {0} כדי להחליף את התצוגה המקדימה.לא ניתן להחיל אפקט צל כאשר העיצוב הנוכחי מוגדר לאפקט טשטוש
@@ -130,6 +164,8 @@
פתחהשתמש ב־IME הקוריאני הקודםבאפשרותך לשנות את הגדרות ה־IME הקוריאני הקודם ישירות מכאן
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.דף הביתShow home page results when query text is empty.Show History Results in Home Page
@@ -141,6 +177,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableחפש תוסף
@@ -222,6 +260,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ אין עדכון זמי
+ כל התוספים מעודכנים
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.ערכת נושא
@@ -349,6 +393,28 @@
הצג תגי תוצאותעבור תוספים נתמכים, מוצגים תגים כדי לעזור להבחין ביניהם ביתר קלות.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxHTTP Proxy
@@ -548,6 +614,11 @@
עדכן קבציםעדכן תיאור
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
דלגברוך הבא אל Flow Launcher
diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml
index 83867d00e..c9fb04b04 100644
--- a/Flow.Launcher/Languages/it.xaml
+++ b/Flow.Launcher/Languages/it.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Registrazione del tasto di scelta rapida "{0}" non riuscita. Il tasto di scelta rapida potrebbe essere in uso da un altro programma. Passa a un altro tasto di scelta rapida o esci da un altro programma.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
Inizia sempre a digitare in modalità ingleseCambiare temporaneamente il metodo di input in modalità inglese quando si attiva Flow.Aggiornamento automatico
+ Automatically check and update the app when availableSelezionaNascondi Flow Launcher all'avvioLa finestra di ricerca di Flow Launcher è nascosta nelle applicazioni nascoste dopo l'avvio.
@@ -102,7 +123,20 @@
BassaNormaleDovrebbe usare il Pinyin
- Consente di utilizzare il Pinyin per la ricerca. Il Pinyin è il sistema standard di ortografia romanizzata per la traduzione del cinese.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Mostra Sempre AnteprimaApri sempre il pannello di anteprima quando Flow si attiva. Premi {0} per attivare l'anteprima.L'effetto ombra non è consentito mentre il tema corrente ha un effetto di sfocatura abilitato
@@ -131,6 +165,8 @@
ApriUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availablePlugin di ricerca
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ Nessun aggiornamento disponibile
+ Tutti i plugin sono aggiornati
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.Tema
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxProxy HTTP
@@ -549,6 +615,11 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde
File aggiornatiDescrizione aggiornamento
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
SaltaBenvenuto su Flow Launcher
diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml
index 22451ed27..9bc7ddd24 100644
--- a/Flow.Launcher/Languages/ja.xaml
+++ b/Flow.Launcher/Languages/ja.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
ホットキー "{0}" の登録に失敗しました。このホットキーは別のプログラムで使用されている可能性があります。別のホットキーに変更するか、このホットキーを使用しているプログラムを終了してください。Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
常に英語モードで入力を開始するFlowを起動したとき、一時的に入力方法を英語モードに変更します。自動更新
+ Automatically check and update the app when available選択起動時にFlow Launcherを隠す起動後、Flow Launcher の検索ウィンドウは非表示になり、トレイに格納されます。
@@ -102,7 +123,20 @@
LowRegularピンインによる検索
- ピンインを使用して検索できるようにします。ピンインは、中国語をローマ字表記するための標準的な表記体系です。
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
常にプレビューするFlow が有効になったとき、常にプレビューパネルを開きます。 {0} を押してプレビューの表示/非表示を切り替えます。現在のテーマでぼかしの効果が有効になっている場合、影の効果を有効にすることはできません
@@ -131,6 +165,8 @@
開くUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableSearch Plugin
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ No update available
+ All plugins are up to date
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.テーマ
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxHTTP プロキシ
@@ -549,6 +615,11 @@
更新ファイル一覧アップデートの詳細
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
スキップFlow Launcherへようこそ
diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml
index b0c13d2e6..e519b4f59 100644
--- a/Flow.Launcher/Languages/ko.xaml
+++ b/Flow.Launcher/Languages/ko.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.단축키 "{0}" 등록 해제에 실패했습니다. 다시 시도하시거나 로그를 확인하세요
@@ -91,6 +111,7 @@
항상 영어입력 모드에서 시작Flow 시작시 영어 상태에서 입력을 시작합니다.자동 업데이트
+ Automatically check and update the app when available선택시작 시 Flow Launcher 숨김Flowr Launcher가 트레이에 숨겨진 상태로 시작합니다.
@@ -102,7 +123,20 @@
낮음보통항상 Pinyin 사용
- Pinyin을 사용하여 검색할 수 있습니다. Pinyin (병음) 은 로마자 중국어 입력 방식입니다.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
항상 미리보기Flow 사용시 항상 미리보기 패널을 열어둡니다. {0} 키를 눌러 프리뷰창을 켜고 끌 수 있습니다.반투명 흐림 효과를 사용하는 경우, 그림자 효과를 쓸 수 없습니다.
@@ -122,6 +156,8 @@
열기이전 버전의 Microsoft IME 사용이전 버전의 IME를 사용하도록 시스템 설정을 변경합니다
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.홈페이지쿼리 입력창이 비어있을때, 홈페이지의 결과를 표시합니다.히스토리를 홈페이지에 표시
@@ -133,6 +169,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates available플러그인 검색
@@ -214,6 +252,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ 사용 가능한 업데이트가 없습니다
+ All plugins are up to date
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.테마
@@ -341,6 +385,28 @@
결과 뱃지 표시For supported plugins, badges are displayed to help distinguish them more easily.전역 검색 결과에서만 뱃지 표시
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxHTTP 프록시
@@ -540,6 +606,11 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
업데이트 파일업데이트 설명
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
건너뛰기Flow Launcher에 오신 것을 환영합니다
diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml
index c3879e203..6bfd05258 100644
--- a/Flow.Launcher/Languages/nb.xaml
+++ b/Flow.Launcher/Languages/nb.xaml
@@ -16,6 +16,26 @@
Mislykkes i å initialisere programtilleggProgramtillegg: {0} - mislykkes å lastes inn og vil bli deaktivert, vennligst kontakt utvikleren av programtillegget for hjelp
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Kan ikke registrere hurtigtasten "{0}". Hurtigtasten kan være i bruk av et annet program. Endre til en annen hurtigtast, eller avslutt et annet program.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
Begynn alltid å skrive i engelsk modusBytt inndatametode midlertidig til engelsk modus når du aktiverer Flow.Automatisk oppdatering
+ Automatically check and update the app when availableVelgSkjul Flow Launcher ved oppstartSøkevinduet for Flow Launcher er skjult i systemstatusfeltet etter oppstart.
@@ -102,7 +123,20 @@
LavVanligSøk med Pinyin
- Tillater bruk av Pinyin for å søke. Pinyin er standardsystemet for romanisert stavemåte for å oversette kinesisk.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Alltid forhåndsvisningÅpne alltid forhåndsvisningspanel når Flow aktiveres. Trykk på {0} for å velge forhåndsvisning.Skyggeeffekt er ikke tillatt mens gjeldende tema har uskarphet-effekt aktivert
@@ -131,6 +165,8 @@
ÅpneUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableSøk etter programtillegg
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ Ingen oppdatering tilgjengelig
+ Alle programtillegg er oppdatert
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.Drakt
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxHTTP proxy
@@ -549,6 +615,11 @@ Hvis du legger til et @-prefiks mens du legger inn en snarvei, samsvarer det med
Oppdater filerBeskrivelse av oppdatering
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
Hopp overVelkommen til Flow Launcher
diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml
index 96a7e43dd..8b85130af 100644
--- a/Flow.Launcher/Languages/nl.xaml
+++ b/Flow.Launcher/Languages/nl.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Probeer het opnieuw
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Sneltoets "{0}" registreren. De sneltoets kan in gebruik zijn door een ander programma. Verander naar een andere sneltoets of sluit een ander programma.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -43,7 +63,7 @@
Stop het gebruik van Sneltoetsen.Positie resettenReset search window position
- Type here to search
+ Type om te zoekenInstellingen
@@ -91,6 +111,7 @@
Begin altijd met typen in Engelse modusVerander tijdelijk je invoermethode in de Engelse modus bij het activeren van Flow.Automatische Update
+ Automatically check and update the app when availableSelecteerVerberg Flow Launcher als systeem opstartFlow Launcher zoekvenster is verborgen in het systeemvak na het opstarten.
@@ -102,16 +123,29 @@
LaagNormaalZou Pinyin moeten gebruiken
- Zorgt ervoor dat Pinyin gebruikt kan worden om te zoeken. Pinyin is het standaard systeem van geromaniseerde spelling voor het vertalen van Chinees.
+ Pinyin is het standaard systeem van geromaniseerde spelling voor Chinees vertalen. Let op, het inschakelen van dit systeem kan het geheugengebruik tijdens het zoeken aanzienlijk verhogen.
+ Dubbele Pinyin gebruiken
+ Gebruik Double Pinyin in plaats van Full Pinyin om te zoeken.
+ Double Pinyin Schema
+ Xiao Hij
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Altijd voorbeeldOpen altijd het voorbeeld paneel wanneer Flow activeert. Druk op {0} om voorbeeld te schakelen.Schaduw effect is niet toegestaan omdat het huidige thema een vervagingseffect heeft
- 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
+ Vertraging voor zoeken
+ Voegt een korte vertraging toe tijdens het typen om flikkeren van de UI en systeembelasting te verminderen. Aanbevolen als uw typsnelheid gemiddeld is.
+ Voer de wachttijd in (in ms) totdat de invoer is voltooid. Dit kan alleen worden bewerkt als de Vertraging voor zoeken optie is ingeschakeld.
+ Standaard wachttijd Vertraging voor zoeken
+ Wacht op het tonen van resultaten na het typen stopt. Hogere waarden wachten langer. (ms)
+ Informatie voor Koreaanse IME-gebruiker
The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
@@ -131,6 +165,8 @@
OpenenUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availablePlug-ins zoeken
@@ -163,7 +201,7 @@
Advanced Settings:EnabledPriority
- Search Delay
+ Vertraging voor zoekenHome PageHuidige PrioriteitNieuwe Prioriteit
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ No update available
+ All plugins are up to date
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.Thema
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxHTTP Proxy
@@ -549,6 +615,11 @@ Als u een '@' voorvoegsel toevoegt tijdens het invoeren van een snelkoppeling, m
Update bestandenUpdate beschrijving
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
SkipWelcome to Flow Launcher
diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml
index ff3c548ad..50f3245d8 100644
--- a/Flow.Launcher/Languages/pl.xaml
+++ b/Flow.Launcher/Languages/pl.xaml
@@ -16,6 +16,26 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Nie udało się zainicjować wtyczekWtyczki: {0} – nie udało się ich wczytać i zostaną wyłączone. Skontaktuj się z twórcą wtyczki, aby uzyskać pomoc
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Nie udało się zarejestrować skrótu klawiszowego „{0}”. Skrót może być używany przez inny program. Zmień skrót na inny lub zamknij program, który go używa.Nie udało się wyrejestrować skrótu „{0}”. Spróbuj ponownie lub sprawdź szczegóły w dzienniku
@@ -91,6 +111,7 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Zawsze rozpoczynaj wpisywanie w trybie angielskimTymczasowo zmień metodę wprowadzania na tryb angielski podczas aktywacji Flow.Automatyczne aktualizacje
+ Automatically check and update the app when availableWybierzUruchamiaj Flow Launcher zminimalizowanyOkno wyszukiwania Flow Launcher jest ukryte w zasobniku systemowym po uruchomieniu.
@@ -102,7 +123,20 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
NiskaStandardowaSzukaj z Pinyin
- Umożliwia wyszukiwanie przy użyciu Pinyin. Pinyin to standardowy system pisowni zromanizowanej służący do tłumaczenia języka chińskiego.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Zawsze podglądZawsze otwieraj panel podglądu, gdy aktywowany jest Flow. Naciśnij {0}, aby przełączyć podgląd.Efekt cienia jest niedozwolony, gdy bieżący motyw ma włączony efekt rozmycia
@@ -130,6 +164,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
OtwórzUżyj poprzedniego koreańskiego IMEMożesz bezpośrednio zmienić ustawienia poprzedniego koreańskiego IME tutaj
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Strona głównaWyświetl wyniki strony głównej, gdy pole wyszukiwania jest puste.Pokaż wyniki historii na stronie głównej
@@ -141,6 +177,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableSzukaj wtyczek
@@ -222,6 +260,12 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Zip filesPlease select zip fileInstall plugin from local path
+ Brak dostępnych aktualizacji
+ Wszystkie wtyczki są aktualne
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.Motyw
@@ -349,6 +393,28 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Pokaż odznaki wynikówW przypadku wspieranych wtyczek wyświetlane są odznaki, aby łatwiej je rozróżnić.Pokaż odznaki wyników tylko dla zapytań globalnych
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxSerwer proxy HTTP
@@ -548,6 +614,11 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d
Aktualizuj plikiOpis aktualizacji
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
PomińWitamy w Flow Launcher
diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml
index fcdb14590..31604e798 100644
--- a/Flow.Launcher/Languages/pt-br.xaml
+++ b/Flow.Launcher/Languages/pt-br.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Falha em registrar a tecla de atalho "{0}". A combinação pode estar em uso por outro programa. Mude para uma tecla de atalho diferente, ou encerre o outro programa.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
Sempre Começar Digitando em Modo InglêsTemporariamente altere seu método de entrada para o Modo Inglês ao ativar o Flow.Atualizar Automaticamente
+ Automatically check and update the app when availableSelecionarEsconder Flow Launcher na inicializaçãoFlow Launcher search window is hidden in the tray after starting up.
@@ -102,7 +123,20 @@
LowRegularBuscar com Pinyin
- Permite o uso de Pinyin para busca. Pinyin é o sistema padrão de escrita romanizada para traduzir chinês.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Sempre Pré-visualizarSempre abrir o painel de pré-visualização quando o Flow é ativado. Pressione {0} para ativar ou desativar a pré-visualização.O efeito de sombra não é permitido enquanto o tema atual tem o efeito de desfoque ativado
@@ -131,6 +165,8 @@
AbrirUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableBuscar Plugin
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ No update available
+ All plugins are up to date
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.Tema
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxProxy HTTP
@@ -549,6 +615,11 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Atualizar arquivosAtualizar descrição
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
PularBem-vindo ao Flow Launcher
diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml
index 5d64d429f..06c15977d 100644
--- a/Flow.Launcher/Languages/pt-pt.xaml
+++ b/Flow.Launcher/Languages/pt-pt.xaml
@@ -8,23 +8,43 @@
Por favor, selecione o executável {0}
- Your selected {0} executable is invalid.
+ O executável {0} é inválido.
{2}{2}
- Click yes if you would like select the {0} executable again. Click no if you would like to download {1}
+ Clique Sim se quiser escolher o novo executável {0}. Clique Não se quiser descarregar {1}.
Não foi possível definir o caminho do executável {0}. Experimente definir o caminho nas definições (desloque até ao fundo).Falha ao iniciar os pluginsPlugin: {0} - não foi possível iniciar e será desativado. Contacte o criador do plugin para obter ajuda.
+
+ Tem que reiniciar Flow Launcher para terminar a desativação do modo portátil. Após reiniciar, o seu perfil de dados portáteis será eliminado mas o perfil na pasta "Roaming" será mantido.
+ Tem que reiniciar Flow Launcher para terminar a ativação do modo portátil. Após reiniciar, o seu perfil de dados na pasta "Roaming" será eliminado mas o perfil de dados portáteis será mantido.
+ Flow Launcher detetou que você ativou o modo portátil . Gostaria de mover a pasta da aplicação para outro local?
+ Flow Launcher detetou que desativou o modo portátil. De seguida, serão criados os atalhos e o desintalador.
+ Flow Launcher detetou que os seus dados de utilizador existem e {0} e {1}. {2}{2}Deve eliminar {1} para continuar. Nenhuma alteração foi efetuada.
+
+
+ Ocorreu um erro com o plugin indicado e os dados não foram carregados:
+ Ocorreu um erro com os plugins indicados e os dados não foram carregados:
+ Consulte o registo para mais informações
+
+
+ Por favor tente novamente
+ Não foi possível processar o proxy HTTP
+
+
+ Falha ao instalar o ambiente TypeScript. Por favor, tente mais tarde.
+ Falha ao instalar o ambiente Python. Por favor, tente mais tarde.
+
Falha ao registar a tecla de atalho "{0}". A tecla de atalho pode estar a ser usada por outra aplicação. Utilize uma tecla de atalho diferente ou feche o outro programa.Falha ao cancelar a atribuição da tecla de atalho "{0}". Tente novamente ou consulte o registo para mais detalhes.Flow LauncherNão foi possível iniciar {0}Formato do ficheiro inválido como plugin
- Definir como principal para esta consulta
- Cancelar como principal para esta consulta
- Executar consulta: {0}
+ Definir como principal para esta pesquisa
+ Cancelar como principal para esta pesquisa
+ Executar pesquisa: {0}Última execução: {0}AbrirDefinições
@@ -69,11 +89,11 @@
Direita, cimaPosição personalizadaIdioma
- Estilo da última consulta
+ Estilo da última pesquisaMostrar/ocultar resultados anteriores ao reiniciar Flow Launcher
- Manter última consulta
- Selecionar última consulta
- Limpar última consulta
+ Manter última pesquisa
+ Selecionar última pesquisa
+ Limpar última pesquisaManter palavra-chave da última açãoSelecionar palavra-chave da última açãoNúmero máximo de resultados
@@ -91,18 +111,32 @@
Escrever sempre em inglêsAlterar, temporariamente, o método de introdução para inglês ao iniciar Flow launcher.Atualização automática
+ Procurar atualizações da aplicação e aplicar automaticamente ao iniciarSelecionarOcultar Flow Launcher ao arrancarOcultar caixa de pesquisa na bandeja após iniciar Flow Launcher.Ocultar ícone na bandejaSe o ícone da bandeja estiver oculto, pode abrir as Definições com um clique com o botão direito do rato na caixa de pesquisa.
- Precisão da consulta
- Altera a precisão mínima necessário para obter resultados
+ Precisão da pesquisa
+ Altera a precisão mínima para a obtenção dos resultadosNenhumaBaixaNormalPesquisar com Pinyin
- Permite a utilização de Pinyin para pesquisar. Pinyin é um sistema normalizado de ortografia romanizada para tradução de mandarim.
+ Pinyin é o sistema padrão de ortografia romanizada para traduzir Mandarim. Tenha em atenção de que, se ativar esta opção, pode aumentar a utilização de memória durantes as pesquisas.
+ Utilizar Pinyin duplo
+ Utilizar Pinyin duplo em vez de Pinyin completo para as pesquisas
+ Esquema Pinyin duplo
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Pré-visualizar sempreAbrir painel de pré-visualização ao ativar Flow Launcher. Prima {0} para comutar a pré-visualização.O efeito sombra não é permitido com este tema porque o efeito desfocar está ativo
@@ -130,6 +164,8 @@
AbrirUtilizar versão anterior de IME CoreanoPode alterar as definições do método de introdução coreano aqui
+ falha ao alterar a definição IME Coreano
+ Verifique se tem acesso ao registo do sistema ou contacte o suporte.Página inicialMostrar resultados da página inicial se o termo de pesquisa estiver vazio.Mostrar histórico na página inicial
@@ -141,6 +177,8 @@
Reiniciar Flow Launcher após instalar/desinstalar/atualizar um plugin via Loja de pluginsMostrar aviso de origem desconhecidaMostrar aviso ao instalar plugins de origens desconhecidas
+ Atualizar plugins automaticamente
+ Procurar atualizações para plugins automaticamente e notificar se existiremPesquisar plugins
@@ -171,7 +209,7 @@
Pasta de pluginsdeTempo de arranque:
- Tempo de consulta:
+ Tempo de pesquisa:VersãoSiteDesinstalar
@@ -222,6 +260,12 @@
Ficheiros ZipSelecione o ficheiro ZipInstalar plugin de um caminho local
+ Não existem atualizações
+ Todos os plugins estão atualizados
+ Existem atualizações para plugins
+ Atualizar plugins
+ Procurar atualizações para plugins
+ Plugins atualizados com sucesso. Reinicie Flow Launcher.Tema
@@ -239,7 +283,7 @@
Terminar processos indesejadosAltura da barra de pesquisaAltura do item
- Tipo de letra da consulta
+ Tipo de letra da caixa de pesquisaTipo de letra dos títulosTipo de letra dos subtítulosRepor
@@ -282,7 +326,7 @@
Este tema tem suporte a dois modos (claro/escuro).Este tema tem suporte a fundo transparente desfocado.Mostrar marcador de posição
- Mostrar marcador de posição se a consulta estiver vazia
+ Mostrar marcador de posição se a pesquisa estiver vaziaTexto do marcadorO texto do marcador de posição. Se vazio, será utilizado: {0}Janela com tamanho fixo
@@ -307,8 +351,8 @@
Selecionar anteriorPágina seguintePágina anterior
- Ir para consulta anterior
- Ir para consulta seguinte
+ Ir para pesquisa anterior
+ Ir para pesquisa seguinteAbrir menu de contextoAbrir menu de contexto nativoAbrir janela de definições
@@ -324,9 +368,9 @@
Para utilizar quando pretende recarregar o plugin e os dados existentes.Ainda pode adicionar mais uma tecla de atalho para esta função.Teclas de atalho personalizadas
- Atalhos de consultas personalizadas
+ Atalhos personalizados para pesquisasAtalhos nativos
- Consulta
+ PesquisaAtalhoExpansãoDescrição
@@ -346,9 +390,31 @@
Utilizar ícones Segoe FluentSe possível, utilizar ícones Segoe Fluent para os resultadosPrima a tecla
- Mostrar emblemas dos resultados
- Para plugins suportados, são mostrados emblemas para nos ajudar a distingui-los mais facilmente.
- Mostrar emblemas apenas para a consulta global
+ Mostrar indicador dos resultados
+ Para plugins suportados, são mostrados indicadores para nos ajudar a distingui-los mais facilmente.
+ Mostrar indicadores apenas para a pesquisa global
+ Mostrar indicadores apenas para a pesquisa global
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxProxy HTTP
@@ -413,7 +479,7 @@
Selecione o gestor de ficheirosSaber maisPor 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.
- 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 fields blank.
+ 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 ficheirosNome do perfilCaminho do gestor de ficheiros
@@ -464,14 +530,14 @@
Prima uma tecla de atalho personalizada para abrir Flow Launcher e escrever automaticamente a pesquisa.AntevisãoTecla de atalho indisponível, por favor escolha outra
- Hotkey is invalid
+ Tecla de atalho inválidaAtualizarAssociar tecla de atalhoA tecla de atalho atual não está disponível.Esta tecla de atalho está reservada para "{0}" e não pode ser usada. Por favor, escolha outra.Esta tecla de atalho está a ser utilizada por "{0}". Se escolher "Substituir", será removida de "{0}".Prima as teclas que pretende utilizar para esta função.
- Hotkey and action keyword are empty
+ Tecla de atalho e palavra-chave vaziasAtalho de consulta personalizada
@@ -482,7 +548,7 @@ Se adicionar o prefixo '@' durante a introdução do atalho, será utilizada qua
Este atallho já existe. Por favor escolha outro ou edite o existente.O atalho e/ou a expansão não estão preenchidos.
- Shortcut is invalid
+ Atalho inválidoGuardar
@@ -547,6 +613,11 @@ Queira por favor mover a pasta do seu perfil de {0} para {1}
Atualizar ficheirosAtualizar descrição
+
+ Reiniciar Flow Launcher após atualizar os plugins
+ {0}: Atualizar de v{1} para v{2}
+ Nada selecionado
+
IgnorarObrigado por utilizar Flow Launcher
diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml
index aa4505580..773516e16 100644
--- a/Flow.Launcher/Languages/ru.xaml
+++ b/Flow.Launcher/Languages/ru.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Не удалось зарегистрировать сочетание клавиш "{0}". Возможно, оно используется другой программой. Измените сочетание клавиш или закройте другую программу.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
Всегда начинать печатать в английском режимеВременно изменить способ ввода на английский при запуске Flow.Автообновление
+ Automatically check and update the app when availableВыборСкрыть Flow Launcher при запускеFlow Launcher search window is hidden in the tray after starting up.
@@ -102,7 +123,20 @@
LowRegularПоиск с использованием пиньинь
- Позволяет использовать пиньинь для поиска. Пиньинь - это стандартная система латинизированной орфографии для перевода китайского языка.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Всегда предпросмотрВсегда открывать панель предварительного просмотра при запуске Flow. Нажмите {0}, чтобы переключить предварительный просмотр.Эффект тени не допускается, если в текущей теме включён эффект размытия
@@ -131,6 +165,8 @@
ОткрытьUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableПоиск плагина
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ No update available
+ All plugins are up to date
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.Тема
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxНТТР-прокси
@@ -549,6 +615,11 @@
Обновить файлыОбновить описание
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
ПропуститьДобро пожаловать в Flow Launcher
diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml
index f7a2ce05a..cbaa5abe7 100644
--- a/Flow.Launcher/Languages/sk.xaml
+++ b/Flow.Launcher/Languages/sk.xaml
@@ -16,9 +16,30 @@
Nepodarilo sa inicializovať pluginyPluginy: {0} – nepodarilo sa načítať a mal by byť zakázaný, na pomoc kontaktujte autora pluginu
+
+ Flow Launcher sa musí reštartovať, aby sa vypol prenosný režim, po reštarte sa váš prenosný dátový profil odstráni a roamingový dátový profil sa zachová
+ Flow Launcher sa musí reštartovať, aby sa zapol prenosný režim, po reštarte sa váš roamingový dátový profil odstráni a prenosný dátový profil sa zachová
+ Flow Launcher zistil, že máte zapnutý prenosný režim, chcete ho presunúť na iné miesto?
+ Flow Launcher zistil, že máte vypnutý prenosný režim, boli vytvorení príslušní zástupcovia a položka odinštalátora
+ Flow Launcher zistil, že vaše používateľské údaje existujú v {0} aj {1}. {2}{2}Prosím, odstráňte {1}, aby ste mohli pokračovať.
+Nevykonali sa žiadne zmeny.
+
+
+ Nasledujúci plugin je chybný a nie je možné ho načítať:
+ Nasledujúc pluginy sú chybné nie je možné ich načítať:
+ Ďalšie informácie nájdete v logoch
+
+
+ Prosím, skúste to znova
+ Nie je možné analyzovať Http Proxy
+
+
+ Nepodarilo sa nainštalovať prostredie TypeScript. Skúste to neskôr.
+ Nepodarilo sa nainštalovať prostredie Python. Skúste to neskôr.
+
Nepodarilo sa zaregistrovať klávesovú skratku "{0}". Klávesová skratka môže byť používaná iným programom. Zmeňte klávesovú skratku na inú alebo ukončite iný program.
- Nepodarilo sa registrovať klávesovú skratku "{0}". Skúste to znova alebo si pozrite podrobnosti v denníku
+ Nepodarilo sa registrovať klávesovú skratku "{0}". Skúste to znova alebo si pozrite podrobnosti v loguFlow LauncherNepodarilo sa spustiť {0}Neplatný formát súboru pre plugin Flow Launchera
@@ -91,6 +112,7 @@
Vždy písať s anglickou klávesnicouPri aktivácii Flowu sa dočasne zmení klávesnica na anglickú.Automatická aktualizácia
+ Automaticky skontrolovať a aktualizovať aplikáciu, ak je to možnéVybraťSchovať Flow Launcher po spusteníVyhľadávacie okno Flow launchera sa po spustení skryje v oblasti oznámení.
@@ -102,7 +124,20 @@
NízkaNormálnaVyhľadávanie pomocou pchin-jin
- Umožňuje vyhľadávanie pomocou pchin-jin. Pchin-jin je systém zápisu čínskeho jazyka pomocou písmen latinky.
+ Pchin-jin je systém zápisu čínskeho jazyka pomocou písmen latinky. Upozorňujeme, že zapnutie tejto funkcie môže výrazne zvýšiť využitie pamäte počas vyhľadávania.
+ Použiť Double Pinyin
+ Na vyhľadávanie použiť namiesto úplného Pinyinu Double Pinyin.
+ Schéma Double Pinyin
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Vždy zobraziť náhľadPri aktivácii Flowu vždy otvoriť panel s náhľadom. Stlačením klávesu {0} prepnete náhľad.Efekt tieňa nie je povolený, kým má aktuálny motív povolený efekt rozostrenia
@@ -131,6 +166,8 @@
OtvoriťPoužiť predchádzajúcu verziu editora Microsoft IMEZmeniť na predchádzajúcu verziu editora Microsoft IME môžete priamo tu
+ Nepodarilo sa zmeniť nastavenie kórejského IME
+ Skontrolujte prístup do systémového registra alebo kontaktujte podporu.Domovská stránkaZobraziť výsledky Domovskej stránky, keď je text dopytu prázdny.Zobraziť výsledky histórie na Domovskej stránke
@@ -142,6 +179,8 @@
Automaticky reštartovať Flow Launcher po inštalácii/odinštalácii/aktualizáciu pluginu cez Repozitár pluginovZobraziť upozornenie na neznámy zdrojZobraziť upozornenie pri inštalácii z neznámych zdrojov
+ Automaticky aktualizovať pluginy
+ Automaticky kontrolovať aktualizácie pluginov a upozorniť na ne, ak sú k dispozíciiVyhľadať plugin
@@ -223,6 +262,12 @@
Zip súboryVyberte zip súborInštalovať plugin z miestneho úložiska
+ Nie je k dispozícii žiadna aktualizácia
+ Všetky pluginy sú aktuálne
+ Dostupná aktualizácia pluginu
+ Aktualizovať pluginy
+ Skontrolovať dostupnosť aktualizácií
+ Pluginy {0} boli úspešne aktualizované. Prosím, reštartuje Flow.Motív
@@ -350,6 +395,28 @@
Zobraziť výsledok v odznakuAk to plugin podporuje, zobrazí sa jeho ikona v odznaku na jednoduchšie odlíšenie.Zobraziť výsledok v odznaku len pre globálne vyhľadávanie
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxHTTP proxy
@@ -549,6 +616,11 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s
Aktualizovať súboryAktualizovať popis
+
+ Po aktualizácii pluginov reštartovať Flow Launcher
+ {0}: Aktualizované z v{1} na v{2}
+ Nie je vybraný žiaden plugin
+
PreskočiťVitajte vo Flow Launcheri
diff --git a/Flow.Launcher/Languages/sr-Cyrl-RS.xaml b/Flow.Launcher/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..a3b937881
--- /dev/null
+++ b/Flow.Launcher/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,670 @@
+
+
+
+
+ Flow detected you have installed {0} plugins, which will require {1} to run. Would you like to download {1}?
+ {2}{2}
+ Click no if it's already installed, and you will be prompted to select the folder that contains the {1} executable
+
+ Please select the {0} executable
+
+ Your selected {0} executable is invalid.
+ {2}{2}
+ Click yes if you would like select the {0} executable again. Click no if you would like to download {1}
+
+ Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom).
+ Fail to Init Plugins
+ Plugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
+
+ Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.
+ Failed to unregister hotkey "{0}". Please try again or see log for details
+ Flow Launcher
+ Could not start {0}
+ Invalid Flow Launcher plugin file format
+ Set as topmost in this query
+ Cancel topmost in this query
+ Execute query: {0}
+ Last execution time: {0}
+ Open
+ Settings
+ About
+ Exit
+ Close
+ Copy
+ Cut
+ Paste
+ Undo
+ Select All
+ File
+ Folder
+ Text
+ Game Mode
+ Suspend the use of Hotkeys.
+ Position Reset
+ Reset search window position
+ Type here to search
+
+
+ Settings
+ General
+ Portable Mode
+ Store all settings and user data in one folder (Useful when used with removable drives or cloud services).
+ Start Flow Launcher on system startup
+ 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
+ Error setting launch on startup
+ Hide Flow Launcher when focus is lost
+ Do not show new version notifications
+ Search Window Location
+ Remember Last Position
+ Monitor with Mouse Cursor
+ Monitor with Focused Window
+ Primary Monitor
+ Custom Monitor
+ Search Window Position on Monitor
+ Center
+ Center Top
+ Left Top
+ Right Top
+ Custom Position
+ Language
+ Last Query Style
+ Show/Hide previous results when Flow Launcher is reactivated.
+ Preserve Last Query
+ Select last Query
+ Empty last Query
+ Preserve Last Action Keyword
+ Select Last Action Keyword
+ Maximum results shown
+ You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ignore hotkeys in fullscreen mode
+ Disable Flow Launcher activation when a full screen application is active (Recommended for games).
+ Default File Manager
+ Select the file manager to use when opening the folder.
+ Default Web Browser
+ Setting for New Tab, New Window, Private Mode.
+ Python Path
+ Node.js Path
+ Please select the Node.js executable
+ Please select pythonw.exe
+ Always Start Typing in English Mode
+ Temporarily change your input method to English mode when activating Flow.
+ Auto Update
+ Automatically check and update the app when available
+ Select
+ Hide Flow Launcher on startup
+ Flow Launcher search window is hidden in the tray after starting up.
+ Hide tray icon
+ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Query Search Precision
+ Changes minimum match score required for results.
+ None
+ Low
+ Regular
+ Search with Pinyin
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
+ Always Preview
+ Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Shadow effect is not allowed while current theme has blur effect enabled
+ 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
+
+ The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+
+ If you experience any problems, you may need to enable "Use previous version of Korean IME".
+
+
+ Open Setting in Windows 11 and go to:
+
+ Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+
+ and enable "Use previous version of Microsoft IME".
+
+
+
+ Open Language and Region System Settings
+ Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Open
+ Use Previous Korean IME
+ You can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.
+ 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.
+ Show Search Window at Foremost
+ Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.
+ Restart after modifying plugin via Plugin Store
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store
+ Show unknown source warning
+ Show warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates available
+
+
+ Search Plugin
+ Ctrl+F to search plugins
+ No results found
+ Please try a different search.
+ Plugin
+ Plugins
+ Find more plugins
+ On
+ Off
+ Action keyword Setting
+ Action keyword
+ Current action keyword
+ New action keyword
+ Change Action Keywords
+ Plugin search delay time
+ Change Plugin Search Delay Time
+ Advanced Settings:
+ Enabled
+ Priority
+ Search Delay
+ Home Page
+ Current Priority
+ New Priority
+ Priority
+ Change Plugin Results Priority
+ Plugin Directory
+ by
+ Init time:
+ Query time:
+ Version
+ Website
+ Uninstall
+ 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} modified already
+ Please restart Flow before making any further changes
+ Fail to install {0}
+ Fail to uninstall {0}
+ Unable to find plugin.json from the extracted zip file, or this path {0} does not exist
+ A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin
+
+
+ Plugin Store
+ New Release
+ Recently Updated
+ Plugins
+ Installed
+ Refresh
+ Install
+ Uninstall
+ Update
+ Plugin already installed
+ New Version
+ This plugin has been updated within the last 7 days
+ New Update is Available
+ Error installing plugin
+ Error uninstalling plugin
+ Error updating plugin
+ Keep plugin settings
+ Do you want to keep the settings of the plugin for the next usage?
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ Plugin install
+ {0} by {1} {2}{2}Would you like to install this plugin?
+ Plugin uninstall
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
+ Plugin update
+ {0} by {1} {2}{2}Would you like to update this plugin?
+ Downloading plugin
+ Automatically restart after installing/uninstalling/updating plugins in plugin store
+ Zip file does not have a valid plugin.json configuration
+ Installing from an unknown source
+ This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window)
+ Zip files
+ Please select zip file
+ Install plugin from local path
+ No update available
+ All plugins are up to date
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.
+
+
+ Theme
+ Appearance
+ Theme Gallery
+ How to create a theme
+ Hi There
+ Explorer
+ Search for files, folders and file contents
+ WebSearch
+ Search the web with different search engine support
+ Program
+ Launch programs as admin or a different user
+ ProcessKiller
+ Terminate unwanted processes
+ Search Bar Height
+ Item Height
+ Query Box Font
+ Result Title Font
+ Result Subtitle Font
+ Reset
+ 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.
+ Customize
+ Window Mode
+ Opacity
+ Theme {0} not exists, fallback to default theme
+ Fail to load theme {0}, fallback to default theme
+ Theme Folder
+ Open Theme Folder
+ Color Scheme
+ System Default
+ Light
+ Dark
+ Sound Effect
+ Play a small sound when the search window opens
+ Sound Effect Volume
+ Adjust the volume of the sound effect
+ Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume.
+ Animation
+ Use Animation in UI
+ Animation Speed
+ The speed of the UI animation
+ Slow
+ Medium
+ Fast
+ Custom
+ Clock
+ Date
+ Backdrop Type
+ The backdrop effect is not applied in the preview.
+ Backdrop supported starting from Windows 11 build 22000 and above
+ None
+ Acrylic
+ Mica
+ Mica Alt
+ This theme supports two (light/dark) modes.
+ This theme supports Blur Transparent Background.
+ 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.
+
+
+ Hotkey
+ Hotkeys
+ Open Flow Launcher
+ Enter shortcut to show/hide Flow Launcher.
+ Toggle Preview
+ Enter shortcut to show/hide preview in search window.
+ Hotkey Presets
+ List of currently registered hotkeys
+ Open Result Modifier Key
+ Select a modifier key to open selected result via keyboard.
+ Show Hotkey
+ Show result selection hotkey with results.
+ Auto Complete
+ Runs autocomplete for the selected items.
+ Select Next Item
+ Select Previous Item
+ Next Page
+ Previous Page
+ Cycle Previous Query
+ Cycle Next Query
+ Open Context Menu
+ Open Native Context Menu
+ Open Setting Window
+ Copy File Path
+ Toggle Game Mode
+ Toggle History
+ Open Containing Folder
+ Run As Admin
+ Refresh Search Results
+ Reload Plugins Data
+ Quick Adjust Window Width
+ Quick Adjust Window Height
+ Use when require plugins to reload and update their existing data.
+ You can add one more hotkey for this function.
+ Custom Query Hotkeys
+ Custom Query Shortcuts
+ Built-in Shortcuts
+ Query
+ Shortcut
+ Expansion
+ Description
+ Delete
+ Edit
+ Add
+ None
+ Please select an item
+ Are you sure you want to delete {0} plugin hotkey?
+ Are you sure you want to delete shortcut: {0} with expansion {1}?
+ Get text from clipboard.
+ Get path from active explorer.
+ Query window shadow effect
+ Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ Window Width Size
+ You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Use Segoe Fluent Icons
+ Use Segoe Fluent Icons for query results where supported
+ Press Key
+ Show Result Badges
+ For supported plugins, badges are displayed to help distinguish them more easily.
+ Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path box
+
+
+ HTTP Proxy
+ Enable HTTP Proxy
+ HTTP Server
+ Port
+ User Name
+ Password
+ Test Proxy
+ Save
+ Server field can't be empty
+ Port field can't be empty
+ Invalid port format
+ Proxy configuration saved successfully
+ Proxy configured correctly
+ Proxy connection failed
+
+
+ About
+ Website
+ GitHub
+ Docs
+ Version
+ Icons
+ You have activated Flow Launcher {0} times
+ Check for Updates
+ Become A Sponsor
+ New version {0} is available, would you like to restart Flow Launcher to use the update?
+ Check updates failed, please check your connection and proxy settings to api.github.com.
+
+ Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
+ or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
+
+ Release Notes
+ Usage Tips
+ DevTools
+ Setting Folder
+ Log Folder
+ Clear Logs
+ Are you sure you want to delete all logs?
+ 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
+ Wizard
+ 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
+ Setting Window Font
+
+
+ See more release notes on GitHub
+ Failed to fetch release notes
+ Please check your network connection or ensure GitHub is accessible
+ Flow Launcher has been updated to {0}
+ Click here to view the release notes
+
+
+ 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 fields blank.
+ File Manager
+ Profile Name
+ 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
+ The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Browser
+ Browser Name
+ Browser Path
+ New Window
+ New Tab
+ Private Mode
+
+
+ Change Priority
+ Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
+ Please provide an valid integer for Priority!
+
+
+ Old Action Keyword
+ New Action Keyword
+ Cancel
+ Done
+ Can't find specified plugin
+ New Action Keyword can't be empty
+ This new Action Keyword is already assigned to another plugin, please choose a different one
+ This new Action Keyword is the same as old, please choose a different one
+ Success
+ Completed successfully
+ 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.
+
+
+ Custom Query Hotkey
+ Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Preview
+ Hotkey is unavailable, please select a new hotkey
+ Hotkey is invalid
+ Update
+ Binding Hotkey
+ Current hotkey is unavailable.
+ This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey.
+ This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}".
+ Press the keys you want to use for this function.
+ Hotkey and action keyword are empty
+
+
+ Custom Query Shortcut
+ Enter a shortcut that automatically expands to the specified query.
+ A shortcut is expanded when it exactly matches the query.
+
+If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query.
+
+ Shortcut already exists, please enter a new Shortcut or edit the existing one.
+ Shortcut and/or its expansion is empty.
+ Shortcut is invalid
+
+
+ Save
+ Overwrite
+ Cancel
+ Reset
+ Delete
+ OK
+ Yes
+ No
+ Background
+
+
+ Version
+ Time
+ Please tell us how application crashed so we can fix it
+ Send Report
+ Cancel
+ General
+ Exceptions
+ Exception Type
+ Source
+ Stack Trace
+ Sending
+ Report sent successfully
+ Failed to send report
+ Flow Launcher got an error
+ Please open new issue 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}
+ An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window
+
+
+ Please wait...
+
+
+ Checking for new update
+ You already have the latest Flow Launcher version
+ Update found
+ Updating...
+
+ Flow Launcher was not able to move your user profile data to the new update version.
+ Please manually move your profile data folder from {0} to {1}
+
+ New Update
+ New Flow Launcher release {0} is now available
+ An error occurred while trying to install software updates
+ Update
+ Cancel
+ Update Failed
+ Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ This upgrade will restart Flow Launcher
+ Following files will be updated
+ Update files
+ Update description
+
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
+
+ Skip
+ Welcome to Flow Launcher
+ Hello, this is the first time you are running Flow Launcher!
+ Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
+ Search and run all files and applications on your PC
+ Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
+ Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Hotkeys
+ Action Keyword and Commands
+ Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
+ Let's Start Flow Launcher
+ Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+
+
+
+ Back / Context Menu
+ Item Navigation
+ Open Context Menu
+ Open Containing Folder
+ Run as Admin / Open Folder in Default File Manager
+ Query History
+ Back to Result in Context Menu
+ Autocomplete
+ Open / Run Selected Item
+ Open Setting Window
+ Reload Plugin Data
+
+ Select first result
+ Select last result
+ Run current query again
+ Open result
+ Open result #{0}
+
+ Weather
+ Weather in Google Result
+ > ping 8.8.8.8
+ Shell Command
+ s Bluetooth
+ Bluetooth in Windows Settings
+ sn
+ Sticky Notes
+
+
+ File Size
+ Created
+ Last Modified
+
diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml
index 16bd5aeb8..e7ddc125f 100644
--- a/Flow.Launcher/Languages/sr.xaml
+++ b/Flow.Launcher/Languages/sr.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
Always Start Typing in English ModeTemporarily change your input method to English mode when activating Flow.Auto ažuriranje
+ Automatically check and update the app when availableIzaberiSakrij Flow Launcher pri podizanju sistemaFlow Launcher search window is hidden in the tray after starting up.
@@ -102,7 +123,20 @@
LowRegularSearch with Pinyin
- Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Always PreviewAlways open preview panel when Flow activates. Press {0} to toggle preview.Shadow effect is not allowed while current theme has blur effect enabled
@@ -131,6 +165,8 @@
OtvoriUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableSearch Plugin
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ No update available
+ All plugins are up to date
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.Tema
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxHTTP proksi
@@ -549,6 +615,11 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Ažuriraj datotekeOpis ažuriranja
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
SkipWelcome to Flow Launcher
diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml
index 032891900..5e5da7677 100644
--- a/Flow.Launcher/Languages/tr.xaml
+++ b/Flow.Launcher/Languages/tr.xaml
@@ -2,23 +2,43 @@
- Flow detected you have installed {0} plugins, which will require {1} to run. Would you like to download {1}?
+ Flow, {0} eklenti yüklediğinizi tespit etti, bu eklentilerin çalışması için {1} gerekir. {1} indirilsin mi?
{2}{2}
- Click no if it's already installed, and you will be prompted to select the folder that contains the {1} executable
+ Zaten yüklüyse hayır'a tıklayın ve {1} yürütülebilir dosyasının bulunduğu klasörü seçin
- Please select the {0} executable
+ Lütfen {0} dosyasını seçin
- Your selected {0} executable is invalid.
+ Seçtiğiniz {0} yürütülebilir dosyası geçersiz.
{2}{2}
- Click yes if you would like select the {0} executable again. Click no if you would like to download {1}
+ {0} yürütülebilir dosyasını tekrar seçmek istiyorsanız evet'e tıklayın. {1} dosyasını indirmek istiyorsanız hayır'a tıklayın
- Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom).
- Fail to Init Plugins
- Plugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+ {0} dosya yolu ayarlanamadı, lütfen Flow’un ayarlarından deneyin (en alta inerek).
+ Eklentiler başlatılamıyor
+ Eklentiler: {0} - yüklenemedi ve devre dışı bırakılacak, lütfen eklenti geliştiricisi ile iletişime geçin
+
+
+ Flow Launcher'ın taşınabilir modu devre dışı bırakmayı bitirmek için yeniden başlatılması gerekir, yeniden başlatmanın ardından taşınabilir veri profiliniz silinecek ve dolaşımdaki veri profiliniz saklanacaktır
+ Flow Launcher'ın taşınabilir modu etkinleştirmeyi tamamlamak için yeniden başlatılması gerekir, yeniden başlatmadan sonra dolaşım veri profiliniz silinecek ve taşınabilir veri profili saklanacaktır
+ Flow Launcher taşınabilir modu etkinleştirdiğinizi tespit etti, farklı bir konuma taşımak ister misiniz?
+ Flow Launcher taşınabilir modu devre dışı bıraktığınızı algıladı, ilgili kısayollar ve kaldırıcı girişi oluşturuldu
+ Flow Launcher, kullanıcı verilerinizin hem {0} hem de {1}'de bulunduğunu algıladı. {2}{2} Devam etmek için lütfen {1}'i silin. Hiçbir değişiklik olmadı.
+
+
+ Aşağıdaki eklentide hata oluştu ve yüklenemiyor:
+ Aşağıdaki eklentilerde hata oluştu ve yüklenemiyor:
+ Daha fazla bilgi için günlüklere bakın
+
+
+ Lütfen tekrar deneyin
+ Http Proxy verisi ayrıştırılamadı
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later."{0}" kısayolunu atama başarısız oldu. Kısayolu başka bir program kullanıyorsa kapatmayı deneyin veya kısayolu değiştirin.
- Failed to unregister hotkey "{0}". Please try again or see log for details
+ "{0}" kısayolu kaldırılamadı. Lütfen tekrar deneyin ya da ayrıntılar için log dosyasını kontrol edinFlow Launcher{0} başlatılamıyorGeçersiz Flow Launcher eklenti dosyası formatı
@@ -42,8 +62,8 @@
Oyun ModuKısayol tuşlarının kullanımını durdurun.Pencere Konumunu Sıfırla
- Reset search window position
- Type here to search
+ Arama penceresinin konumunu sıfırla
+ Aramak için buraya yazınAyarlar
@@ -51,12 +71,12 @@
Taşınabilir ModTüm ayarları ve kullanıcı verilerini tek bir klasörde saklayın (Çıkarılabilir sürücüler veya bulut hizmetleri ile kullanıldığında kullanışlıdır).Sistem ile Başlat
- 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
+ Daha hızlı bir başlatma deneyimi için başlangıç girişini yerine oturum açma görevini kullanın
+ Kaldırma işleminden sonra, bu görevi (Flow.Launcher Startup) Görev Zamanlayıcı üzerinden elle kaldırmanız gerekmektedirSistemle başlatma ayarı başarısız olduOdak Pencereden Ayrıldığında GizleGüncelleme bildirimlerini gösterme
- Search Window Location
+ Pencere KonumuSon Konumu HatırlaFare İmlecinin Bulunduğu MonitörAktif Pencerenin Bulunduğu Monitör
@@ -74,8 +94,8 @@
Son Sorguyu SaklaSon Sorguyu Sakla ve Tümünü SeçSorgu Kutusunu Temizle
- Preserve Last Action Keyword
- Select Last Action Keyword
+ Son İşlem Anahtar Kelimesini Koru
+ Son İşlem Anahtar Kelimesini SeçMaksimum Sonuç SayısıBunu CTRL + ve CTRL - kısayollarıyla da ayarlayabilirsiniz.Tam Ekran Modunda Kısayol Tuşunu Gözardı Et
@@ -91,6 +111,7 @@
İngilizce Klayve Düzeni KullanArama yaparken klayve düzenini geçici olarak İngilizce yap.Otomatik Güncelle
+ Uygulamanın güncellemelerini otomatik kontrol eder ve güncellerSeçBaşlangıçta Pencereyi GizleArama kutusu başlangıçtan sonra sistem tepsisinde gizlenir.
@@ -102,46 +123,63 @@
DüşükNormalPinyin
- Arama yapmak için Pinyin'in kullanılmasına izin ver. Pinyin, Çince'yi çevirmek için standart romanlaştırılmış yazım sistemidir.
+ Pinyin, Çince'yi çevirmek için kullanılan standart romanize yazım sistemidir. Bunu etkinleştirmenin arama sırasında bellek kullanımını önemli ölçüde artırabileceğini lütfen unutmayın.
+ Çift Pinyin kullanın
+ Arama yapmak için Tam Pinyin yerine Çift Pinyin kullanın.
+ Çift Pinyin Şeması
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
ÖnizlemeÖnizleme panelini her zaman aç. Önizlemeyi bu ayardan bağımsız {0} kısayolu ile açıp kapatabilirsiniz.Mevcut temada bulanıklık efekti etkinken gölgelendirme efektine izin verilmezArama Gecikmesi
- 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.
+ UI titreşimini ve sonuç yükünü azaltmak için yazma sırasında kısa bir gecikme eklenir. Yazma hızınız ortalama ise önerilir.
+ Girdi tamamlanmış sayılmadan önce beklenecek süreyi milisaniye (ms) olarak girin. Sadece Arama Gecikmesi açık olduğunda değiştirilebilir.Varsayılan Arama Gecikme Süresi
- Wait time before showing results after typing stops. Higher values wait longer. (ms)
- Information for Korean IME user
+ Yazmayı bıraktıktan sonra sonuçların görünmesi için geçecek süre. Daha yüksek değerler daha fazla bekleme anlamına gelir. (ms)
+ Korece IME kullanıcısı için bilgiler
- The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
+ Windows 11'de kullanılan Korece giriş yöntemi Flow Launcher'da bazı sorunlara neden olabilir.
- If you experience any problems, you may need to enable "Use previous version of Korean IME".
+ Herhangi bir sorunla karşılaşırsanız, "Korece IME'nin önceki sürümünü kullan" seçeneğini etkinleştirmeniz gerekebilir.
- Open Setting in Windows 11 and go to:
+ Windows 11'de Ayarlar'ı açın ve şuraya gidin:
- Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility,
+ Saat ve Dil > Dil ve Bölge > Korece > Dil Seçenekleri > Klavye - Microsoft IME > Uyumluluk,
- and enable "Use previous version of Microsoft IME".
+ ve "Microsoft IME'nin önceki sürümünü kullan" seçeneğini etkinleştirin.
- Open Language and Region System Settings
- Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility
+ Dil ve Bölge Sistem Ayarlarını Aç
+ Korece IME ayar konumunu açar. Korece > Dil Seçenekleri > Klavye - Microsoft IME > Uyumluluk seçeneğine gidinAç
- Use Previous Korean IME
- You can change the Previous Korean IME settings directly from here
+ Önceki Korece IME'sini Kullan
+ Önceki Korece IME ayarlarını doğrudan buradan değiştirebilirsiniz
+ Korece IME ayarı değiştirilemedi
+ Lütfen sistem kayıt defteri erişiminizi kontrol edin veya destekle iletişime geçin.Ana Sayfa
- 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.
- Show Search Window at Foremost
- Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.
- Restart after modifying plugin via Plugin Store
- Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store
- Show unknown source warning
- Show warning when installing plugins from unknown sources
+ Sorgu metni boş olduğunda ana sayfa sonuçlarını gösterin.
+ Geçmiş Sonuçlarını Ana Sayfada Göster
+ Ana Sayfada Gösterilen Maksimum Geçmiş Sonuçları
+ Bu sadece eklenti Ana Sayfa özelliğini destekliyorsa ve Ana Sayfa etkinleştirilmiş ise düzenlenebilir.
+ Arama Penceresini En Üstte Göster
+ Diğer programların 'Her Zaman Üstte' ayarını geçersiz kılar ve Flow’u en önde gösterir.
+ Eklenti Mağazası üzerinden eklenti değiştirdikten sonra uygulamayı yeniden başlatın
+ Eklenti Mağazası aracılığıyla eklenti yükledikten/kaldırdıktan/güncelleştirdikten sonra Flow Launcher'ı otomatik olarak yeniden başlatın
+ Bilinmeyen kaynak uyarısını göster
+ Bilinmeyen kaynaklardan eklenti yüklerken uyarı göster
+ Eklentileri otomatik güncelle
+ Eklenti güncellemelerini otomatik kontrol et ve eğer herhangi bir güncelleme varsa bildirEklenti Ara
@@ -158,10 +196,10 @@
Geçerli anahtar kelimeYeni anahtar kelimeAnahtar kelimeyi değiştir
- Plugin search delay time
- Change Plugin Search Delay Time
+ Eklenti arama gecikme süresi
+ Eklenti Arama Gecikme Süresini DeğiştirGelişmiş Ayarlar:
- Enabled
+ AktifÖncelikArama GecikmesiAna Sayfa
@@ -176,16 +214,16 @@
Sürümİnternet SitesiKaldır
- 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} modified already
- Please restart Flow before making any further changes
- Fail to install {0}
- Fail to uninstall {0}
- Unable to find plugin.json from the extracted zip file, or this path {0} does not exist
- A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin
+ Eklenti ayarları kaldırılamıyor
+ Eklentiler: {0} - Ayar dosyaları kaldırılamadı, lütfen elle silin
+ Eklenti ön belleği kaldırılamıyor
+ Eklentiler: {0} - Önbellek dosyaları kaldırılamadı, lütfen elle silin
+ {0} zaten değiştirilmiş
+ Lütfen başka değişiklikler yapmadan önce Flow'u yeniden başlatın
+ {0} yüklenemiyor
+ {0} kaldırılamıyor
+ plugin.json dosyası çıkarılan zip dosyasında bulunamadı veya {0} yolu mevcut değil
+ Bu eklentiyle aynı ID ve sürüme sahip bir eklenti zaten var, ya da mevcut sürüm daha yüksekEklenti Mağazası
@@ -201,28 +239,34 @@
Yeni SürümBu eklenti son 7 gün içerisinde güncellenmiş.Yeni Bir Güncelleme Mevcut
- Error installing plugin
- Error uninstalling plugin
- Error updating plugin
- Keep plugin settings
- Do you want to keep the settings of the plugin for the next usage?
- Plugin {0} successfully installed. Please restart Flow.
- Plugin {0} successfully uninstalled. Please restart Flow.
- Plugin {0} successfully updated. Please restart Flow.
- Plugin install
- {0} by {1} {2}{2}Would you like to install this plugin?
- Plugin uninstall
- {0} by {1} {2}{2}Would you like to uninstall this plugin?
- Plugin update
- {0} by {1} {2}{2}Would you like to update this plugin?
- Downloading plugin
- Automatically restart after installing/uninstalling/updating plugins in plugin store
- Zip file does not have a valid plugin.json configuration
- Installing from an unknown source
- This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window)
- Zip files
- Please select zip file
- Install plugin from local path
+ Eklenti yüklenirken bir hata oluştu
+ Eklenti kaldırılırken bir hata oluştu
+ Eklenti güncellenirken bir hata oluştu
+ Eklenti ayarlarını sakla
+ Eklentinin ayarlarını bir sonraki kullanım için saklamak istiyor musunuz?
+ {0} eklentisi başarıyla yüklendi. Lütfen Flow'u yeniden başlatın.
+ {0} eklentisi başarıyla kaldırıldı. Lütfen Flow'u yeniden başlatın.
+ {0} eklentisi başarıyla güncellendi. Lütfen Flow'u yeniden başlatın.
+ Eklenti yükleme
+ {0} - {1} tarafından geliştirildi {2}{2}Bu eklentiyi yüklemek ister misiniz?
+ Eklenti kaldırma
+ {0} - {1} tarafından geliştirildi {2}{2}Bu eklentiyi kaldırmak ister misiniz?
+ Eklenti güncellemesi
+ {0} - {1} tarafından geliştirildi {2}{2}Bu eklentiyi güncellemek ister misiniz?
+ Eklenti indiriliyor
+ Eklenti mağazasındaki eklentileri yükledikten/kaldırdıktan/güncelleştirdikten sonra otomatik olarak yeniden başlat
+ Zip dosyası geçerli bir plugin.json yapılandırmasına sahip değil
+ Bilinmeyen bir kaynaktan yükleniyor
+ Bu eklenti bilinmeyen bir kaynaktan geliyor ve potansiyel riskler içerebilir!{0}{0}Lütfen eklentinin nereden geldiğini bildiğinizden ve güvenli olduğundan emin olun.{0}{0}Yine de devam etmek istiyor musunuz?{0}{0}(Bu uyarıyı ayarlar penceresinin Genel bölümünden kapatabilirsiniz)
+ Zip dosyaları
+ Lütfen zip dosyasını seçin
+ Eklentiyi yerel yoldan yükle
+ Güncelleme mevcut değil
+ Bütün eklentiler güncel
+ Eklenti güncellemeleri mevcut
+ Eklentileri güncelle
+ Eklenti güncellemelerini kontrol et
+ Eklentiler başarıyla güncellendi. Lütfen Flow'u yeniden başlatın.Temalar
@@ -244,9 +288,9 @@
Arama Sonuçları Yazı TipiArama Sonuçları Yazı TipiSıfırla
- 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.
+ Önerilen yazı tipi ve boyut ayarlarına sıfırlayın.
+ Tema Boyutunu İçe Aktar
+ Tasarımcının belirlediği boyut değeri varsa, bu değer alınır ve uygulanır.KişiselleştirPencere ModuSaydamlık
@@ -274,20 +318,20 @@
SaatTarihArka Plan Türü
- The backdrop effect is not applied in the preview.
- Backdrop supported starting from Windows 11 build 22000 and above
+ Arka plan efekti önizlemede etkin değildir.
+ Arka plan efekti, Windows 11 build 22000 ve üzeri sürümlerde desteklenirHiçbiriAkrilikMikaMica Alt
- This theme supports two (light/dark) modes.
- This theme supports Blur Transparent Background.
- Show placeholder
- Display placeholder when query is empty
- Placeholder text
- Change placeholder text. Input empty will use: {0}
+ Bu tema iki (açık/koyu) modu destekler.
+ Bu tema Bulanık Şeffaf Arka Planı destekler.
+ Yer tutucuyu göster
+ Sorgu boş olduğunda yer tutucuyu görüntüle
+ Yer tutucu metin
+ Yer tutucu metnini değiştirin. Boş bırakılırsa şu kullanılacak: {0}Sabit Pencere Boyutu
- The window size is not adjustable by dragging.
+ Pencere boyutu sürüklenerek ayarlanamaz.Kısayol Tuşu
@@ -311,7 +355,7 @@
Bir Önceki Sorguya GeçSonraki Sorguya GeçBağlam Menüsünü Aç
- Open Native Context Menu
+ Yerel Bağlam Menüsünü AçAyarlar Penceresini AçDosya Yolunu KopyalaOyun Modunu Aç/Kapat
@@ -347,9 +391,31 @@
Segoe Fluent SimgeleriArama sonuçlarında mümkünse Segoe Fluent simgelerini kullan.Tuşa basın
- Show Result Badges
- For supported plugins, badges are displayed to help distinguish them more easily.
- Show Result Badges for Global Query Only
+ Sonuç Rozetlerini Göster
+ Desteklenen eklentilere, kolayca ayırt edilebilmeleri için rozet eklenir.
+ Yalnızca Global Sorgular için Sonuç Rozetlerini Göster
+ Yalnızca global sorgu sonuçları için rozetleri göster
+ Diyalog Atlama
+ Farklı Aç/Kaydet iletişim penceresinde geçerli dosya yöneticisinin yoluna hızlıca gitmek için kısayol girin.
+ Diyalog Atlama
+ Farklı Aç/Kaydet iletişim penceresi açıldığında, hızlı bir şekilde dosya yöneticisinin geçerli yoluna gidin.
+ Otomatik Olarak Diyalog Atlama
+ Farklı Aç/Kaydet iletişim penceresi görüntülendiğinde, otomatik olarak geçerli dosya yöneticisinin yoluna gidin. (Deneysel)
+ Diyalog Atlama Penceresini Göster
+ Dosya/klasör konumlarına hızlı erişim için aç/kaydet penceresi gösterildiğinde Diyalog Atlama arama penceresini görüntüle.
+ Diyalog Atlama Penceresi Konumu
+ Select position for the Dialog Jump search window
+ Farklı Aç/Kaydet iletişim penceresinin altında düzeltildi. Açıldığında görüntülenir ve pencere kapatılana kadar kalır
+ Varsayılan arama penceresi konumu. Arama penceresi kısayol tuşu tarafından tetiklendiğinde görüntülenir
+ Dialog Jump Result Navigation Behaviour
+ Farklı Aç/Kaydet iletişim penceresini seçilen sonuç yoluna yönlendirmek için davranış
+ Sol tık veya Enter tuşu
+ Sağ tık
+ Dialog Jump File Navigation Behaviour
+ Sonuç bir dosya yolu olduğunda Farklı Aç/Kaydet iletişim penceresinde gezinme davranışı
+ Dosya adı kutusuna tam yolu girin
+ Dosya adı kutusuna tam yolu girin ve açın
+ Dizini yol kutusuna girinVekil Sunucu
@@ -392,8 +458,8 @@
Tüm günlük kayıtlarını silmek istediğinize emin misiniz?Önbellek KlasörüÖnbelleği Temizle
- Are you sure you want to delete all caches?
- Failed to clear part of folders and files. Please see log file for more information
+ Tüm önbellekleri silmek istediğinizden emin misiniz?
+ Bazı klasör ve dosyalar silinemedi. Daha fazla bilgi için log dosyasına bakınKurulum SihirbazıKullanıcı Verisi DiziniKullanıcı ayarları ve yüklü eklentiler bu klasörde saklanır. Klasörün konumu taşınabilir moda bağlı olarak değişebilir.
@@ -402,27 +468,27 @@
Günlük DüzeyiHata ayıklamaBilgi
- Setting Window Font
+ Pencere Yazı Tipini Ayarla
- See more release notes on GitHub
+ GitHub'da daha fazla sürüm notlarını görSürüm notları alınamadı
- Please check your network connection or ensure GitHub is accessible
- Flow Launcher has been updated to {0}
+ Lütfen internet bağlantınızı kontrol edin veya GitHub'a erişiminizin olduğundan emin olun
+ Flow Launcher {0} sürümüne güncellendiSürüm notlarını görüntülemek için buraya tıklayınDosya Yöneticisi SeçenekleriDaha fazla bilgi
- 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 fields blank.
+ Lütfen kullandığınız dosya yöneticisinin dosya konumunu belirtin ve gerektiği şekilde argümanlar ekleyin. "%d", Arg for Folder alanı tarafından ve belirli dizinleri açan komutlar için kullanılan açılacak dizin yolunu temsil eder. "%f", Dosya için Arg alanı tarafından ve belirli dosyaları açan komutlar için kullanılan açılacak dosya yolunu temsil eder.
+ Örneğin, dosya yöneticisi c:\windows dizinini açmak için "totalcmd.exe /A c:\windows" gibi bir komut kullanıyorsa, Dosya Yöneticisi Yolu totalcmd.exe ve Arg Klasör için /A "%d" olacaktır. QTTabBar gibi bazı dosya yöneticileri sadece bir yol sağlanmasını gerektirebilir, bu durumda Dosya Yöneticisi Yolu olarak "%d" kullanın ve geri kalan alanları boş bırakın.Dosya YöneticisiProfil AdıDosya Yöneticisi YoluKlasör AçarkenDosya Açarken
- The file manager '{0}' could not be located at '{1}'. Would you like to continue?
- File Manager Path Error
+ '{0}' dosya yöneticisi '{1}' konumunda bulunamadı. Devam etmek ister misiniz?
+ Dosya Yöneticisi Yol Hatasıİnternet Tarayıcı Seçenekleri
@@ -447,33 +513,33 @@
Belirtilen eklenti bulunamadıYeni anahtar kelime boş olamazYeni anahtar kelime başka bir eklentiye atanmış durumda. Lütfen başka bir anahtar kelime seçin.
- This new Action Keyword is the same as old, please choose a different one
+ Bu yeni Anahtar Kelimesi eskisiyle aynı, lütfen farklı bir tane seçinBaşarılıBaşarıyla tamamlandıKopyalanamadı
- 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.
+ Eklentiyi başlatmak için kullanmak istediğiniz anahtar kelimelerini girin ve bunları bölmek için boşluk kullanın. Herhangi bir anahtar kelime belirtmek istemiyorsanız * kullanın, eklenti herhangi bir anahtar kelimesi olmadan tetiklenecektir.
- 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.
+ Arama Gecikme Süresi Ayarı
+ Eklenti için kullanmak istediğiniz arama gecikme süresini ms cinsinden girin. Herhangi bir şey belirtmek istemiyorsanız boş girin, eklenti varsayılan arama gecikme süresini kullanacaktır.Ana Sayfa
- Enable the plugin home page state if you like to show the plugin results when query is empty.
+ Sorgu boşken eklenti sonuçlarını göstermek istiyorsanız eklentinin ana sayfa durumunu etkinleştirin.Özel Sorgu KısayollarıFlow Launcher'ı açıp otomatik olarak girdiğiniz sorguyu aratması için bir kısayol atayın.ÖnizlemeKısayol tuşu kullanılamıyor, lütfen başka bir kombinasyon girin.
- Hotkey is invalid
+ Kısayol tuşu geçersizGüncelleKısayol AtanıyorKullanılamıyorBu kısayol "{0}" için ayrılmıştır, lütfen başka bir kısayol deneyin.Bu kısayol zaten "{0}" için kullanılıyor. Eğer "Üstüne Yaz"'ı seçerseniz, "{0}" sorgusu bu kısayol ile kullanılamayacak.Bu işleve atamak istediğiniz kısayol tuşlarına basın.
- Hotkey and action keyword are empty
+ Kısayol tuşu ve eylem anahtar kelimesi boşÖzel Kısaltmalar
@@ -482,7 +548,7 @@
Anahtar kelime zaten mevcut. Yeni bir kısaltma girin veya mevcut kısaltmayı düzenleyin.Kısaltma ve/veya sorgu eksik.
- Shortcut is invalid
+ Kısayol geçersizKaydet
@@ -510,18 +576,18 @@
Hata raporu başarıyla gönderildiHata raporu gönderimi başarısız olduFlow Launcher'da bir hata oluştu
- Please open new issue in
- 1. Upload log file: {0}
- 2. Copy below exception message
+ Lütfen yeni bir konu açın
+ 1. Log dosyasını buraya yükleyin: {0}
+ 2. Aşağıdaki istisna mesajını kopyalayınDosya Yöneticisi Hatası
- The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+ Belirtilen dosya yöneticisi bulunamadı. Lütfen Ayarlar > Genel bölümündeki Özel Dosya Yöneticisi ayarını kontrol edin.
HataKlasör açılırken bir hata oluştu. {0}
- An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window
+ URL tarayıcıda açılırken bir hata oluştu. Lütfen ayarlar penceresindeki Genel bölümden Varsayılan Web Tarayıcısı ayarını kontrol edinLütfen bekleyin...
@@ -547,6 +613,11 @@
Güncellenecek dosyalarGüncelleme açıklaması
+
+ Eklentileri güncelledikten sonra Flow Launcher'ı yeniden başlat
+ {0}: v{1}'den v{2}'ye güncelleme
+ Seçilen eklenti yok
+
AtlaFlow Launcher Sihirbazına Hoşgeldiniz
diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml
index c5dcd3e28..7e3673c99 100644
--- a/Flow.Launcher/Languages/uk-UA.xaml
+++ b/Flow.Launcher/Languages/uk-UA.xaml
@@ -16,6 +16,26 @@
Невдача ініціалізації плагінівПлагіни: {0} - не вдалося підвантажити і буде вимкнено, зверніться за допомогою до автора плагіна
+
+ Flow Launcher потрібно перезапустити, щоб завершити вимкнення портативного режиму. Після перезапуску ваш портативний профіль даних буде видалено, а профіль даних роумінгу збережено
+ Flow Launcher потрібно перезапустити, щоб завершити ввімкнення портативного режиму. Після перезапуску ваш профіль даних роумінгу буде видалено, а профіль портативних даних збережено
+ Flow Launcher виявив, що ви ввімкнули портативний режим. Чи хочете перемістити його в інше місце?
+ Flow Launcher виявив, що ви вимкнули портативний режим, відповідні ярлики та запис для видалення були створені
+ Flow Launcher виявив, що ваші дані користувача існують як в {0}, так і в {1}. {2}{2}Видаліть {1}, щоби продовжити. Зміни не відбулися.
+
+
+ Наступний плагін містить помилку і не може бути завантажений:
+ Наступні плагіни мають помилки і не можуть бути завантажені:
+ Для отримання додаткової інформації зверніться до журналів
+
+
+ Спробуйте ще раз
+ Неможливо проаналізувати Http Proxy
+
+
+ Не вдалося встановити середовище TypeScript. Спробуйте ще раз пізніше
+ Не вдалося встановити середовище Python. Спробуйте ще раз пізніше.
+
Не вдалося зареєструвати гарячу клавішу "{0}". Можливо, гаряча клавіша використовується іншою програмою. Змініть її на іншу гарячу клавішу або вийдіть з програми, де вона використовується.Не вдалося скасувати реєстрацію гарячої клавіші «{0}». Спробуйте ще раз або перегляньте журнал для отримання подробиць
@@ -79,10 +99,10 @@
Максимальна кількість результатівВи також можете швидко налаштувати цей параметр за допомогою клавіш CTRL+Плюс чи CTRL+Мінус.Ігнорувати гарячі клавіші в повноекранному режимі
- Вимкнути активацію Flow Launcher коли активовано повноекранний додаток (Рекомендується для ігор).
+ Вимкнути активацію Flow Launcher коли активовано повноекранний застосунок (Рекомендується для ігор).Стандартний Файловий МенеджерВиберіть файловий менеджер для використання під час відкриття теки.
- Браузер за замовчуванням
+ Типовий браузерНалаштування нової вкладки, нового вікна, приватного режиму.Шлях до PythonШлях до Node.js
@@ -91,6 +111,7 @@
Завжди починати введення тексту в англійському режиміТимчасово змінити спосіб введення на англійський при активації Flow.Автоматичне оновлення
+ Автоматично перевіряти та оновлювати застосунок, коли це можливоВибратиСховати Flow Launcher при запуску системиВікно пошуку Flow Launcher після запуску ховається в треї.
@@ -102,7 +123,20 @@
МалоЗвичайноВикористовувати піньїнь
- Дозволяє використовувати пінїнь для пошуку. Піньїнь - це стандартна система написання для перекладу китайської.
+ Піньїнь — це стандартна система латинізації для перекладу китайської мови. Зверніть увагу, що ввімкнення цієї функції може значно збільшити використання пам’яті під час пошуку.
+ Використовувати подвійний піньїнь
+ Для пошуку використовуйте подвійний піньїнь замість повного.
+ Подвійна схема піньїнь
+ Сяо Хе
+ Цзі Жань Ма
+ Вей Жуань
+ Чжі Нен АБС
+ Цзі Ґуан Пін Їнь
+ Пін Їнь Цзя Цзя
+ Сін Кон Цзянь Дао
+ Да Ню
+ Сяо Лан
+
Завжди переглядатиЗавжди відкривати панель попереднього перегляду при активації Flow. Натисніть {0}, щоб переключити попередній перегляд.Ефект тіні не дозволено, коли поточна тема має ефект розмиття
@@ -131,6 +165,8 @@
ВідкритиВикористовувати попередній корейський IMEВи можете змінити попередні налаштування корейського IME безпосередньо звідси.
+ Не вдалося змінити налаштування корейського IME
+ Перевірте доступ до системного реєстру або зверніться до служби підтримки.Головна сторінкаПоказувати результати на головній сторінці, коли текст запиту порожній.Показати результати історії на головній
@@ -142,6 +178,8 @@
Автоматично перезапускати Flow Launcher після встановлення / видалення / оновлення плагіну через Магазин плагінівПоказувати попередження про невідоме джерелоПоказувати попередження під час встановлення плагінів із невідомих джерел
+ Автооновлення плагінів
+ Автоматично перевіряти оновлення плагінів і повідомляти про наявність оновленьПлагін для пошуку
@@ -223,6 +261,12 @@
Zip-файлиВиберіть zip-файлВстановити плагін із локального шляху
+ Оновлень не знайдено
+ Всі плагіни оновлено
+ Доступні оновлення плагінів
+ Оновити плагіни
+ Перевірити оновлення плагінів
+ Плагіни успішно оновлено. Перезапустіть Flow.Тема
@@ -232,7 +276,7 @@
Привіт усімПровідникПошук файлів, папок і вмісту файлів
- Веб-пошук
+ ВебпошукПошук в Інтернеті за допомогою різних пошукових системПрограмаЗапуск програм від імені адміністратора або іншого користувача
@@ -250,12 +294,12 @@
ПідлаштуватиВіконний режимПрозорість
- Тема {0} не існує, повернення до теми за замовчуванням
- Не вдалось завантажити тему {0}, повернення до теми за замовчуванням
+ Тема {0} не існує, повернення до типової теми
+ Не вдалось завантажити тему {0}, повернення до типової темиТека з темоюВідкрити теку з темоюСхема кольорів
- За замовчуванням
+ Як у системіСвітлаТемнаЗвуковий ефект
@@ -323,7 +367,7 @@
Швидке регулювання ширини вікнаШвидке регулювання висоти вікнаВикористовуйте, коли плагінам потрібно перезавантажити та оновити наявні дані.
- Ви можете додати ще одну галавішу для цієї функції.
+ Ви можете додати ще одну гарячу клавішу для цієї функції.Задані гарячі клавіші для запитівКористувацькі скорочення запитівВбудовані скорочення
@@ -350,6 +394,28 @@
Показувати значки результатівДля підтримуваних плагінів показуються значки для легшого розрізнення.Показувати значки результатів тільки для глобального запиту
+ Показати значки тільки для результатів глобального запиту
+ Перейти до діалогу
+ Введіть ярлик для швидкого переходу у вікні діалогу «Відкрити/Зберегти як» до шляху поточного файлового менеджера.
+ Перейти до діалогу
+ Коли відкриється діалогове вікно «Відкрити/Зберегти як», швидко перейти до поточного шляху файлового менеджера.
+ Автоматично перейти до діалогу
+ Коли показується діалогове вікно «Відкрити/Зберегти як», автоматично перейти до шляху поточного файлового менеджера. (Експериментально)
+ Показати діалогове вікно переходу
+ Показати діалогове вікно «Перейти до вікна пошуку», коли показано діалогове вікно «Відкрити/Зберегти», щоби швидко перейти до розташування файлів/тек.
+ Позиція вікна переходу до діалогу
+ Виберіть положення для вікна пошуку «Перейти до діалогу»
+ Фіксоване під діалоговим вікном «Відкрити/Зберегти як». Показується при відкритті та залишається до закриття вікна
+ Типова позиція вікна пошуку. Показується при активації гарячою клавішею вікна пошуку
+ Навігація за результатами діалогового переходу
+ Дії для переходу до діалогового вікна «Відкрити/Зберегти як» у вибраному шляху до результату
+ Ліва кнопка миші або клавіша Enter
+ Права кнопка миші
+ Поведінка переходу між діалогами
+ Поведінка при навігації у вікні діалогу «Відкрити/Зберегти як», коли результатом є шлях до файлу
+ Введіть повний шлях у полі назви файлу
+ Введіть повний шлях у поле назви файлу та відкрийте його
+ Заповніть каталог у полі шляхуHTTP-проксі
@@ -369,7 +435,7 @@
Про Flow Launcher
- Веб-сайт
+ ВебсайтGitHubДокументаціяВерсія
@@ -425,8 +491,8 @@
Помилка шляху до файлового менеджера
- Веб-браузер за замовчуванням
- Налаштування за замовчуванням відповідають налаштуванню браузера за замовчуванням в операційній системі. Якщо вказано окремо, Flow використовує цей браузер.
+ Типовий веббраузер
+ Типові налаштування відповідають налаштуванню типового браузера в операційній системі. Якщо вказано окремо, Flow використовує цей браузер.БраузерНазва браузераШлях до браузера
@@ -500,7 +566,7 @@
ВерсіяЧас
- Будь ласка, розкажіть нам, як додаток вийшов із ладу, щоб ми могли це виправити
+ Розкажіть нам, як застосунок вийшов із ладу, щоб ми могли це виправитиНадіслати звітСкасуватиОсновні
@@ -511,7 +577,7 @@
ВідправляєтьсяЗвіт успішно відправленоНе вдалося відправити звіт
- Стався збій в додатку Flow Launcher
+ Стався збій в застосунку Flow LauncherСтворіть нову проблему в1. Завантажте файл журналу: {0}2. Скопіюйте нижче повідомлення про виняток
@@ -549,6 +615,11 @@
Оновити файлиОпис оновлення
+
+ Перезапустити Flow Launcher після оновлення плагінів
+ {0}: оновлено з v{1} до v{2}
+ Плагін не вибрано
+
ПропуститиЛаскаво просимо до Flow Launcher
@@ -569,7 +640,7 @@
Навігація елементамиВідкрити контекстне менюВідкрийте папку, що містить файл
- Запустити від імені адміністратора / Відкрити папку у файловому менеджері за замовчуванням
+ Запустити від імені адміністратора / Відкрити теку у типовому файловому менеджеріІсторія запитівПовернутися до результату в контекстному менюАвтодоповнення
diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml
index 2a8769863..1dd336e0e 100644
--- a/Flow.Launcher/Languages/vi.xaml
+++ b/Flow.Launcher/Languages/vi.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Không thể đăng ký phím nóng "{0}". Phím nóng có thể được sử dụng bởi một chương trình khác. Chuyển sang phím nóng khác hoặc thoát khỏi chương trình khác.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
Luôn bắt đầu nhập ở chế độ tiếng AnhTạm thời chuyển phương thức nhập sang tiếng Anh khi kích hoạt Flow.Cập nhật tự động
+ Automatically check and update the app when availableChọnẨn Flow Launcher khi khởi độngFlow Launcher sẽ ẩn trong khay hệ thống sau khi khởi động.
@@ -102,7 +123,20 @@
ThấpBình thườngHoạt động bính âm
- Cho phép bạn sử dụng Bính âm để tìm kiếm. Bính âm là hệ thống ký hiệu La Mã tiêu chuẩn để dịch văn bản tiếng Trung.
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
Luôn xem trướcLuôn mở bảng xem trước khi Flow kích hoạt. Nhấn {0} để chuyển đổi chế độ xem trước.Hiệu ứng đổ bóng không được phép nếu chủ đề hiện tại bật hiệu ứng làm mờ
@@ -131,6 +165,8 @@
MởUse Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availablePlugin tìm kiếm
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ Không có cập nhật
+ Tất cả các plugin đều được cập nhật
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.Giao Diện
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxProxy HTTP
@@ -555,6 +621,11 @@
Cập nhật tệpThông tin mô tả
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
Bỏ QuaChào mừng bạn đến với Trình khởi chạy luồng
diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml
index 0f5e1e165..5e57a9b65 100644
--- a/Flow.Launcher/Languages/zh-cn.xaml
+++ b/Flow.Launcher/Languages/zh-cn.xaml
@@ -16,6 +16,26 @@
无法初始化插件插件:{0} - 无法加载并将被禁用,请联系插件创建者寻求帮助
+
+ Flow Launcher 需要重启以完成禁用便携模式。重新启动后,您的便携数据配置文件将被删除而漫游数据配置文件将被保留
+ Flow Launcher 需要重启以完成启用便携模式。重新启动后,您的漫游数据配置文件将被删除而便携数据配置文件将被保留
+ Flow Launcher 检测到您启用了便携模式。您想要将其移动到别的位置吗?
+ Flow Launcher 检测到您已禁用便携模式。相关的快捷方式和卸载器条目已创建
+ Flow Launcher 检测到您的用户数据存在于 {0} 和 {1} 中。 {2}{2}请删除 {1} 以便继续。目前将不会做任何更改。
+
+
+ 下列插件出现错误无法加载:
+ 下列插件发现错误无法加载:
+ 请参阅日志以获取更多信息
+
+
+ 请重试
+ 无法解析 Http 代理
+
+
+ 无法安装 TypeScript 环境。请稍后再试
+ 无法安装 Python 环境。请稍后再试。
+
无法注册热键“{0}”。该热键可能正在被其他程序使用。更改为不同的热键,或退出其他程序。未能取消注册快捷键"{0}"。请重试或查看日志以获取详细信息
@@ -91,6 +111,7 @@
以英文模式开始输入激活 Flow 时暂时将输入法更改为英文模式。自动更新
+ 自动检查并更新应用程序选择系统启动时不显示主窗口Flow Launcher 启动后搜索窗口隐藏在托盘中。
@@ -102,7 +123,20 @@
低常规使用拼音搜索
- 允许使用拼音进行搜索。
+ 拼音是翻译中文的罗马化拼写的标准系统。请注意,启用此功能可以大大增加搜索时的内存使用量。
+ 使用双拼
+ 使用双拼而不是全拼进行搜索。
+ 双拼方案
+ 小鹤双拼
+ 自然码
+ 微软双拼
+ 智能ABC双拼
+ 紫光双拼
+ 拼音加加
+ 星空键道
+ 大牛双拼
+ 小浪双拼
+
始终打开预览Flow 启动时总是打开预览面板。按 {0} 以切换预览。当前主题已启用模糊效果,不允许启用阴影效果
@@ -131,6 +165,8 @@
打开使用以前的韩语输入法您可以直接从这里更改前韩语输入法设置
+ 更改韩语输入法设置失败
+ 请检查您的系统注册表访问权限或联系支持。首页当查询文本为空时显示主页结果。在主页中显示历史记录
@@ -142,6 +178,8 @@
通过插件商店安装/卸载/更新插件后自动重启 Flow Launcher显示未知来源警告安装来自未知来源的插件时显示警告
+ 自动更新插件
+ 自动检查插件更新并通知是否有任何可用更新搜索插件
@@ -223,6 +261,12 @@
Zip 文件请选择 zip 文件从本地路径安装插件
+ 无可用更新
+ 所有插件都是最新
+ 插件更新可用
+ 更新插件
+ 检查插件更新
+ 插件更新成功。请重新启动 Flow Launcher。主题
@@ -350,6 +394,28 @@
显示结果徽章对于支持的插件,将显示徽章以帮助更容易区分它们。仅在全局查询下显示结果徽章
+ 仅对全局查询结果显示徽章
+ 对话框跳转
+ 输入快捷键以快速导航打开或保存作为对话框窗口到当前文件管理器路径。
+ 对话框跳转
+ 当打开了打开或保存对话框窗口时,快速导航到文件管理器当前路径。
+ 自动跳转对话框
+ 当显示打开或保存对话框窗口时,自动导航到当前文件管理器的路径。(实验性)
+ 显示对话框跳转窗口
+ 当显示打开或保存对话框窗口以快速导航到文件或文件夹位置时,显示对话框跳转搜索窗口。
+ 对话框跳转窗口位置
+ 选择对话框跳转搜索窗口的位置
+ 固定在打开或保存为对话框窗口下。在打开时显示并保持直到窗口关闭
+ 默认搜索窗口位置。当被搜索窗口快捷键触发时显示
+ 对话框跳转文件导航行为
+ 当结果为文件路径时对打开或保存对话框窗口的导航行为
+ 左键单击或回车按键
+ 右键单击
+ 对话框跳转文件导航行为
+ 当结果为文件路径时对打开或保存对话框窗口的导航行为
+ 在文件名框中填写完整路径
+ 在文件名框中填写完整路径并打开
+ 在路径框中填写目录HTTP 代理
@@ -549,6 +615,11 @@
更新文件更新日志
+
+ 更新插件后重启 Flow Launcher
+ {0}: 更新从 v{1} 到 v{2}
+ 没有选择插件
+
跳过欢迎使用 Flow Launcher
diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml
index 959f75f97..08783cb43 100644
--- a/Flow.Launcher/Languages/zh-tw.xaml
+++ b/Flow.Launcher/Languages/zh-tw.xaml
@@ -16,6 +16,26 @@
Fail to Init PluginsPlugins: {0} - fail to load and would be disabled, please contact plugin creator for help
+
+ Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept
+ Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept
+ Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?
+ Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created
+ Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.
+
+
+ The following plugin has errored and cannot be loaded:
+ The following plugins have errored and cannot be loaded:
+ Please refer to the logs for more information
+
+
+ Please try again
+ Unable to parse Http Proxy
+
+
+ Failed to install TypeScript environment. Please try again later
+ Failed to install Python environment. Please try again later.
+
Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.Failed to unregister hotkey "{0}". Please try again or see log for details
@@ -91,6 +111,7 @@
一律以英文模式開始輸入啟動 Flow 時暫時將輸入法切換為英文模式。自動更新
+ Automatically check and update the app when available選擇啟動時不顯示主視窗Flow Launcher search window is hidden in the tray after starting up.
@@ -102,7 +123,20 @@
LowRegular拼音搜尋
- 允許使用拼音來搜尋。拼音是將中文轉換為羅馬字母拼寫的標準系統。
+ Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.
+ Use Double Pinyin
+ Use Double Pinyin instead of Full Pinyin to search.
+ Double Pinyin Schema
+ Xiao He
+ Zi Ran Ma
+ Wei Ruan
+ Zhi Neng ABC
+ Zi Guang Pin Yin
+ Pin Yin Jia Jia
+ Xing Kong Jian Dao
+ Da Niu
+ Xiao Lang
+
一律預覽當 Flow 啟動時,一律開啟預覽面板。按下 {0} 可切換預覽。Shadow effect is not allowed while current theme has blur effect enabled
@@ -131,6 +165,8 @@
開啟Use Previous Korean IMEYou can change the Previous Korean IME settings directly from here
+ Failed to change Korean IME setting
+ Please check your system registry access or contact support.Home PageShow home page results when query text is empty.Show History Results in Home Page
@@ -142,6 +178,8 @@
Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin StoreShow unknown source warningShow warning when installing plugins from unknown sources
+ Auto update plugins
+ Automatically check plugin updates and notify if there are any updates availableSearch Plugin
@@ -223,6 +261,12 @@
Zip filesPlease select zip fileInstall plugin from local path
+ 無可用更新
+ 所有插件均為最新版本
+ Plugin updates available
+ Update plugins
+ Check plugin updates
+ Plugins are successfully updated. Please restart Flow.主題
@@ -350,6 +394,28 @@
Show Result BadgesFor supported plugins, badges are displayed to help distinguish them more easily.Show Result Badges for Global Query Only
+ Show badges for global query results only
+ Dialog Jump
+ Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.
+ Dialog Jump
+ When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.
+ Dialog Jump Automatically
+ When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)
+ Show Dialog Jump Window
+ Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.
+ Dialog Jump Window Position
+ Select position for the Dialog Jump search window
+ Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed
+ Default search window position. Displayed when triggered by search window hotkey
+ Dialog Jump Result Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window to the selected result path
+ Left click or Enter key
+ Right click
+ Dialog Jump File Navigation Behaviour
+ Behaviour to navigate Open/Save As dialog window when the result is a file path
+ Fill full path in file name box
+ Fill full path in file name box and open
+ Fill directory in path boxHTTP 代理
@@ -549,6 +615,11 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
更新檔案更新日誌
+
+ Restart Flow Launcher after updating plugins
+ {0}: Update from v{1} to v{2}
+ No plugin selected
+
跳過歡迎使用 Flow Launcher
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ar.xaml
index 29b0d4ed1..cb9eca699 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ar.xaml
@@ -5,6 +5,9 @@
إشارات المتصفحابحث في إشارات المتصفح
+
+ Failed to set url in clipboard
+
بيانات الإشارات المرجعيةفتح الإشارات المرجعية في:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml
index 45f8d97da..382418336 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/cs.xaml
@@ -5,6 +5,9 @@
Záložky prohlížečeHledat záložky v prohlížeči
+
+ Failed to set url in clipboard
+
Data záložekOtevřít záložky v:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml
index 153b05d76..68a8b7a66 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/da.xaml
@@ -5,6 +5,9 @@
Browser BookmarksSearch your browser bookmarks
+
+ Failed to set url in clipboard
+
Bookmark DataOpen bookmarks in:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml
index 66e30855f..68bb92411 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml
@@ -5,6 +5,9 @@
Browser-LesezeichenIhre Browser-Lesezeichen durchsuchen
+
+ URL in Zwischenablage konnte nicht festgelegt werden
+
Lesezeichen-DatenLesezeichen öffnen in:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml
index 28524229b..859a0ea0e 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es-419.xaml
@@ -5,6 +5,9 @@
Marcadores del NavegadorBusca en los marcadores de tu navegador
+
+ Failed to set url in clipboard
+
Datos de MarcadoresAbrir marcadores en:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
index ba9efd7e0..e0beb7a78 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/es.xaml
@@ -5,6 +5,9 @@
Marcadores del navegadorBusca en los marcadores del navegador
+
+ No se ha podido establecer la url en el portapeles
+
Datos del marcadorAbrir marcadores en:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml
index 39546c102..de10d0f19 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/fr.xaml
@@ -5,6 +5,9 @@
Favoris du NavigateurRechercher dans les favoris de votre navigateur
+
+ Impossible de mettre l'url dans le presse-papiers
+
Données des favorisOuvrir les favoris dans :
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml
index 79490928d..90751bb6f 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/he.xaml
@@ -5,6 +5,9 @@
סימניות דפדפןחפש בסימניות הדפדפן שלך
+
+ Failed to set url in clipboard
+
נתוני סימניותפתח סימניות ב:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
index eb13bf852..32216f350 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/it.xaml
@@ -5,6 +5,9 @@
Segnalibri del BrowserCerca nei segnalibri del tuo browser
+
+ Failed to set url in clipboard
+
Dati del segnalibroApri preferiti in:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
index d08d67d98..aee660f22 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml
@@ -5,6 +5,9 @@
ブラウザブックマークブラウザのブックマークを検索します
+
+ Failed to set url in clipboard
+
Bookmark DataOpen bookmarks in:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
index bb7c9fc06..fd381d4ee 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml
@@ -5,6 +5,9 @@
브라우저 북마크브라우저의 북마크 검색
+
+ Failed to set url in clipboard
+
북마크 데이터Open bookmarks in:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml
index 1c53a49d2..e3650ed26 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nb.xaml
@@ -5,6 +5,9 @@
NettleserbokmerkerSøk i nettleserbokmerker
+
+ Failed to set url in clipboard
+
BokmerkedataÅpne bokmerker i:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml
index 407786cdd..c83c2ec78 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/nl.xaml
@@ -5,6 +5,9 @@
Browser BookmarksSearch your browser bookmarks
+
+ Failed to set url in clipboard
+
Bookmark DataOpen bookmarks in:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml
index 9f92d86b1..b63c2ffc5 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml
@@ -5,6 +5,9 @@
Zakładki przeglądarkiPrzeszukaj zakładki przeglądarki
+
+ Failed to set url in clipboard
+
Dane zakładekOtwórz zakładki w:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
index ce264bc5f..c6ec5eb4c 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
@@ -5,6 +5,9 @@
Favoritos do NavegadorPesquisar favoritos do seu navegador
+
+ Failed to set url in clipboard
+
Dados de FavoritosAbrir favoritos em:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
index 2818a0600..f2b3e93d1 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml
@@ -5,6 +5,9 @@
Marcadores do navegadorPesquisar nos marcadores do navegador
+
+ Falha ao definir o URL na área de transferência
+
Dados do marcadorAbrir marcadores em:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml
index bb8639d97..b147c083b 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ru.xaml
@@ -5,6 +5,9 @@
Закладки браузераПоиск закладок в браузере
+
+ Failed to set url in clipboard
+
Данные закладокОткрыть закладки в:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
index c7556e877..1d498a5fd 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sk.xaml
@@ -5,6 +5,9 @@
Záložky prehliadačaVyhľadáva záložky prehliadača
+
+ Nepodarilo sa nastaviť URL v schránke
+
Nastavenia pluginuOtvoriť záložky v:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr-Cyrl-RS.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..02b995517
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,33 @@
+
+
+
+
+ Browser Bookmarks
+ Search your browser bookmarks
+
+
+ Failed to set url in clipboard
+
+
+ Bookmark Data
+ Open bookmarks in:
+ New window
+ New tab
+ Set browser from path:
+ Choose
+ Copy url
+ Copy the bookmark's url to clipboard
+ Load Browser From:
+ Browser Name
+ Data Directory Path
+ Add
+ Edit
+ Delete
+ Browse
+ Others
+ Browser Engine
+ If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
+ For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Load favicons (can be time consuming during startup)
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml
index 84173e616..5a7a18714 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/sr.xaml
@@ -5,6 +5,9 @@
Browser BookmarksSearch your browser bookmarks
+
+ Failed to set url in clipboard
+
Bookmark DataOpen bookmarks in:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
index 8c4280f63..15cd4f250 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/tr.xaml
@@ -5,6 +5,9 @@
Yer İmleriTarayıcınızdaki yer işaretlerini arayın
+
+ Panoya url ayarlanamadı
+
Yer İmleri VerisiYer imlerini şurada aç:
@@ -25,6 +28,6 @@
Tarayıcı MotoruEğer Chrome, Firefox veya Edge kullanmıyor veya bu tarayıcıların taşınabilir sürümlerini kullanıyorsanız tarayıcı motorunu ve yer imlerinin saklandığı dizini elle girmeniz gerekir.Örneğin: Brave tarayıcısı Chromium tabanlıdır ve yer imleri varsayılan olarak "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData" klasöründe saklanır. Firefox tabanlı tarayıcılar için bu places.sqlite dosyasının bulunduğu kullanıcı verisi klasörüdür.
- Load favicons (can be time consuming during startup)
+ Site simgelerini yükle (başlangıç sırasında zaman alabilir)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
index 07ccc2ea4..a40370a9c 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
@@ -5,6 +5,9 @@
Закладки браузераПошук у закладках браузера
+
+ Не вдалося вставити Url-адресу в буфер обміну
+
Дані закладокВідкрити закладки в:
@@ -24,7 +27,7 @@
ІншіБраузерний рушійЯкщо ви не використовуєте Chrome, Firefox або Edge, або використовуєте їхні портативні версії, вам потрібно додати каталог даних закладок і вибрати правильний рушій браузера, щоб цей плагін працював.
- Наприклад: Рушій Brave - Chromium, і за замовчуванням розташування даних закладок: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Для браузера Firefox директорія закладок - це папка userdata, що містить файл places.sqlite.
+ Наприклад: рушій Brave — Chromium, і типово розташування даних закладок: «%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData». Для браузера Firefox директорія закладок — це тека userdata, що містить файл places.sqlite.Завантажити піктограми (може зайняти багато часу під час запуску)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml
index 662c87d49..f52a7fe7b 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml
@@ -5,6 +5,9 @@
Dấu trang trình duyệtTìm kiếm dấu trang trình duyệt của bạn
+
+ Failed to set url in clipboard
+
Dữ liệu đánh dấuMở dấu trang trong:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
index 934544367..778cd3992 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-cn.xaml
@@ -5,6 +5,9 @@
浏览器书签搜索您的浏览器书签
+
+ 无法复制 URL 到剪切板
+
书签数据在以下位置打开书签:
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml
index 7fa50a089..e8bc6bcb6 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/zh-tw.xaml
@@ -5,6 +5,9 @@
瀏覽器書籤搜尋你的瀏覽器書籤
+
+ Failed to set url in clipboard
+
書籤資料載入書籤至:
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml
index d38f136a6..759ba99de 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ar.xaml
@@ -1,4 +1,4 @@
-
+
آلة حاسبة
@@ -8,8 +8,9 @@
نسخ هذا الرقم إلى الحافظةفاصل عشريالفاصل العشري الذي سيتم استخدامه في الناتج.
- استخدام إعدادات النظام المحلية
+ استخدام الإعدادات المحلية للنظامفاصلة (,)نقطة (.)أقصى عدد من المنازل العشرية
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml
index 56b908031..f5dbe8e20 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/cs.xaml
@@ -1,4 +1,4 @@
-
+
Kalkulačka
@@ -12,4 +12,5 @@
Čárka (,)Tečka (.)Desetinná místa
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml
index c5690a3d5..2f2777aa1 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/da.xaml
@@ -1,8 +1,8 @@
-
+
Calculator
- Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Perform mathematical calculations (including hexadecimal values). Use ',' or '.' as thousand separator or decimal place.Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
@@ -12,4 +12,5 @@
Comma (,)Dot (.)Max. decimal places
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml
index 9b8654962..46f5efe23 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/de.xaml
@@ -1,4 +1,4 @@
-
+
Rechner
@@ -7,9 +7,10 @@
Ausdruck falsch oder unvollständig (Haben Sie einige Klammern vergessen?)Diese Zahl in die Zwischenablage kopierenDezimaltrennzeichen
- Das Dezimaltrennzeichen, das in der Ausgabe verwendet werden soll.
- Systemgebietsschema verwenden
+ Das Dezimaltrennzeichen, welches bei der Ausgabe verwendet werden soll.
+ Systemeinstellung nutzenKomma (,)Punkt (.)Max. Dezimalstellen
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml
index 6b69c06a4..dce29cba5 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es-419.xaml
@@ -1,4 +1,4 @@
-
+
Calculadora
@@ -12,4 +12,5 @@
Coma (,)Punto (.)Número máximo de decimales
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml
index 3dfdff680..7f1775e2e 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/es.xaml
@@ -1,15 +1,16 @@
-
+
Calculadora
- Permite hacer cálculos matemáticos. (Pruebe 5*3-2 en Flow Launcher)
+ Realiza cálculos matemáticos (incluyendo valores hexadecimales). Utilizar ',' o '.' como separador de miles o decimal.No es un número (NaN)Expresión incorrecta o incompleta (¿Ha olvidado algunos paréntesis?)Copiar este número al portapapelesSeparador decimal
- El separador decimal que se utilizará en la salida.
- Usar configuración regional del sistema
+ Separador decimal que se utilizará en la salida.
+ Utilizar configuración regional del sistemaComa (,)Punto (.)Número máximo de decimales
+ Ha fallado la copia, inténtelo más tarde
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml
index a86c020be..a6db34811 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/fr.xaml
@@ -1,15 +1,16 @@
-
+
Calculatrice
- Permet de faire des calculs mathématiques.(Essayez 5*3-2 dans Flow Launcher)
+ Effectuer des calculs mathématiques (y compris les valeurs hexadécimales). Utilisez ',' ou '.' comme séparateur de milliers ou décimaux.Pas un nombre (NaN)Expression incorrecte ou incomplète (avez-vous oublié certaines parenthèses ?)Copier ce chiffre dans le presse-papiers
- Séparateur décimal
- Le séparateur décimal à utiliser dans la sortie.
+ Séparateur de décimales
+ Le séparateur de décimale à utiliser dans la sortie.Utiliser les paramètres régionaux du systèmeVirgule (,)Point (.)Décimales max.
+ Échec de la copie, réessayer plus tard
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml
index 1d297381c..b053c8905 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/he.xaml
@@ -1,15 +1,16 @@
-
+
- מחשבון
+ מחשבומאפשר לבצע חישובים מתמטיים. (נסה 5*3-2 ב-Flow Launcher)לא מספר (NaN)הביטוי שגוי או לא שלם (האם שכחת סוגריים?)העתק מספר זה ללוחמפריד עשרוני
- מפריד עשרוני שישמש בתוצאה.
- השתמש בהגדרת מערכת
+ מפריד העשרוני שישמש בפלט.
+ השתמש בהגדרות מערכתפסיק (,)נקודה (.)מספר מקסימלי של מקומות עשרוניים
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
index 27bd75304..5b724e82e 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/it.xaml
@@ -1,4 +1,4 @@
-
+
Calcolatrice
@@ -12,4 +12,5 @@
Virgola (,)Punto (.)Max. cifre decimali
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
index 30bae550a..5677c7732 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml
@@ -1,4 +1,4 @@
-
+
電卓
@@ -12,4 +12,5 @@
Comma (,)Dot (.)Max. decimal places
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml
index 30e9b40a0..e4ca16d41 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ko.xaml
@@ -1,4 +1,4 @@
-
+
계산기
@@ -12,4 +12,5 @@
쉼표 (,)마침표 (.)최대 소수점 아래 자릿 수
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml
index be233767f..9ae31e976 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nb.xaml
@@ -1,4 +1,4 @@
-
+
Kalkulator
@@ -12,4 +12,5 @@
Komma (,)Prikk (.)Maks. desimaler
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml
index c5690a3d5..2f2777aa1 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/nl.xaml
@@ -1,8 +1,8 @@
-
+
Calculator
- Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Perform mathematical calculations (including hexadecimal values). Use ',' or '.' as thousand separator or decimal place.Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
@@ -12,4 +12,5 @@
Comma (,)Dot (.)Max. decimal places
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
index 75b52685a..e73298dca 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pl.xaml
@@ -1,4 +1,4 @@
-
+
Kalkulator
@@ -12,4 +12,5 @@
Przecinek (,)Kropka (.)Maks. liczba miejsc po przecinku
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml
index 9b6f3708a..73a60d42f 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-br.xaml
@@ -1,4 +1,4 @@
-
+
Calculadora
@@ -12,4 +12,5 @@
Vírgula (,)Ponto (.)Max. decimal places
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
index 7b48d6fe9..7ec52be8c 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml
@@ -1,15 +1,16 @@
-
+
Calculadora
- Permite a execução de cálculos matemáticos (experimente 5*3-2)
+ Execução de cálculos matemáticos (incluindo valores hexadecimais). Utilize ',' ou '.' como separador de milhares ou de casas decimais.Não é número (NN)Expressão errada ou incompleta (esqueceu-se de algum parêntese?)Copiar número para a área de transferênciaSeparador decimal
- O separador decimal para utilizar no resultado.
+ O separador decimal a ser usado no resultado.Utilizar definições do sistemaVírgula (,)Ponto (.)Número máximo de casas decimais
+ Falha ao copiar. Por favor tente mais tarde.
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml
index d1d03d604..43a7d44c7 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ru.xaml
@@ -1,4 +1,4 @@
-
+
Калькулятор
@@ -7,9 +7,10 @@
Выражение неправильное или неполное (Вы забыли скобки?)Скопировать этот номер в буфер обменаДесятичный разделитель
- Десятичный разделитель, который будет использоваться в результате.
- Использовать системный язык
+ The decimal separator to be used in the output.
+ Использовать системный форматЗапятая (,)Точка (.)Макс. число знаков после запятой
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml
index b1cf4a735..498b6eb50 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sk.xaml
@@ -1,8 +1,8 @@
-
+
Kalkulačka
- Spracúva matematické operácie. (Skúste 5*3-2 vo Flow Launcheri)
+ Vykonávanie matematických výpočtov (vrátane hexadecimálnych hodnôt). Ako oddeľovač tisícov alebo desatinného miesta použite ',' alebo '.'.Nie je číslo (NaN)Nesprávny alebo neúplný výraz (Nezabudli ste na zátvorky?)Kopírovať výsledok do schránky
@@ -12,4 +12,5 @@
Čiarka (,)Bodka (.)Desatinné miesta
+ Kopírovanie zlyhalo, skúste to neskôr
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr-Cyrl-RS.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..98e3aebb5
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,16 @@
+
+
+
+ Calculator
+ Perform mathematical calculations (including hexadecimal values). Use ',' or '.' as thousand separator or decimal place.
+ Not a number (NaN)
+ Expression wrong or incomplete (Did you forget some parentheses?)
+ Copy this number to the clipboard
+ Decimal separator
+ The decimal separator to be used in the output.
+ Use system locale
+ Comma (,)
+ Dot (.)
+ Max. decimal places
+ Copy failed, please try later
+
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml
index c5690a3d5..2f2777aa1 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/sr.xaml
@@ -1,8 +1,8 @@
-
+
Calculator
- Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
+ Perform mathematical calculations (including hexadecimal values). Use ',' or '.' as thousand separator or decimal place.Not a number (NaN)Expression wrong or incomplete (Did you forget some parentheses?)Copy this number to the clipboard
@@ -12,4 +12,5 @@
Comma (,)Dot (.)Max. decimal places
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
index f307c65e2..b41fc0656 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/tr.xaml
@@ -1,4 +1,4 @@
-
+
Hesap Makinesi
@@ -12,4 +12,5 @@
Virgül (,)Nokta (.)Maks. ondalık basamak
+ Kopyalama başarısız oldu, lütfen daha sonra deneyin
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
index 9f60f570a..14042dffd 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
@@ -1,8 +1,8 @@
-
+
Калькулятор
- Дозволяє виконувати математичні обчислення (спробуйте 5*3-2 у Flow Launcher)
+ Виконуйте математичні обчислення (включаючи шістнадцяткові значення). Використовуйте «,» або «.» як роздільник тисяч або десяткових знаків.Не є числом (NaN)Вираз неправильний або неповний (Ви забули якісь дужки?)Скопіюйте це число в буфер обміну
@@ -12,4 +12,5 @@
Кома (,)Крапка (.)Макс. кількість знаків після коми
+ Копіювання не вдалося, спробуйте пізніше
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml
index 688623b04..20717d1db 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml
@@ -1,4 +1,4 @@
-
+
Máy tính
@@ -12,4 +12,5 @@
Dấu phẩy (,)dấu chấm (.)Tối đa. chữ số thập phân
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
index 85159ed4f..445ed394f 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-cn.xaml
@@ -1,8 +1,8 @@
-
+
计算器
- 为 Flow Launcher 提供数学计算能力。(试着在 Flow Launcher 输入 5*3-2)
+ 执行数学计算(包括十六进制值)。使用 , 或 . 作为分隔符或小数点。请输入数字表达错误或不完整(您是否忘记了一些括号?)将结果复制到剪贴板
@@ -12,4 +12,5 @@
逗号(,)点(.)小数点后最大位数
+ 复制失败,请稍后再试
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
index d3d448e1c..7c8acf40b 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/zh-tw.xaml
@@ -1,4 +1,4 @@
-
+
計算機
@@ -12,4 +12,5 @@
逗號 (,)點 (.)小數點後最大位數
+ Copy failed, please try later
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
index ebdb0ff35..b2bf99515 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
@@ -5,6 +5,8 @@
يرجى إجراء تحديد أولاًPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?يرجى تحديد رابط المجلدهل أنت متأكد أنك تريد حذف {0}؟هل أنت متأكد أنك تريد حذف هذا الملف نهائيًا؟
@@ -128,6 +130,11 @@
عرض قائمة السياق في Windowsفتح بواسطةاختر برنامج لفتح العنصر
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} متبقي من {1}
@@ -141,19 +148,32 @@
تحذير: خدمة Everything غير قيد التشغيلخطأ أثناء استعلام Everythingالترتيب حسب
- الاسم
- المسار
- الحجم
- الامتداد
- نوع الاسم
- تاريخ الإنشاء
- تاريخ التعديل
- السمات
- اسم ملف قائمة الملفات
- عدد مرات التشغيل
- تاريخ التغيير الأخير
- تاريخ الوصول
- تاريخ التشغيل
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓تحذير: هذا ليس خيار ترتيب سريع، قد تكون عمليات البحث بطيئة
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
index 38f4f145e..0acdb5ca1 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
@@ -5,6 +5,8 @@
Nejprve vyberte položkuPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Vyberte odkaz na složkuOpravdu chcete odstranit {0}?Opravdu chcete trvale odstranit tento soubor?
@@ -128,6 +130,11 @@
Zobrazit kontextové menu WindowsOpen WithSelect a program to open with
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboardVolných {0} z {1}
@@ -141,19 +148,32 @@
Upozornění: Služba Everything není spuštěnaChyba při dotazování EverythingSeřadit podle
- Jméno
- Cesta
- Velikost
- Rozšíření
- Typ
- Datum vytvoření
- Datum změny
- Atributy
- Seznam názvů souborů
- Počet spuštění
- Poslední změna data
- Datum přístupu
- Datum spouštění
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Poznámka: Toto není možnost Fast Sort, vyhledávání může být pomalé
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
index 8c011814c..66816de93 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
@@ -5,6 +5,8 @@
Please make a selection firstPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -128,6 +130,11 @@
Show Windows Context MenuOpen WithSelect a program to open with
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} free of {1}
@@ -141,19 +148,32 @@
Warning: Everything service is not runningError while querying EverythingSort By
- Name
- Path
- Size
- Extension
- Type Name
- Date Created
- Date Modified
- Attributes
- File List FileName
- Run Count
- Date Recently Changed
- Date Accessed
- Date Run
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Warning: This is not a Fast Sort option, searches may be slow
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
index 1d8c3937a..8ddb958ad 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
@@ -5,6 +5,8 @@
Bitte treffen Sie zuerst eine AuswahlBitte wählen Sie einen Ordnerpfad aus.Bitte wählen Sie einen anderen Namen oder Ordnerpfad.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Bitte wählen Sie einen Ordner-Link ausSind Sie sicher, dass Sie {0} löschen wollen?Sind Sie sicher, dass Sie diese Datei dauerhaft löschen möchten?
@@ -128,6 +130,11 @@
Windows-Kontextmenü zeigenÖffnen mitEin Programm zum Öffnen auswählen
+ Löschen nicht möglich {0}
+ Datei nicht gefunden: {0}
+ Öffnen nicht möglich {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} frei von {1}
@@ -141,19 +148,32 @@
Warnung: Everything-Dienst wird nicht ausgeführtFehler bei Abfrage von EverythingSortieren nach
- Name
- Pfad
- Größe
- Extension
- Typname
- Erstellungsdatum
- Änderungsdatum
- Attribute
- Dateilistenname
- Ausführungszahl
- Datum kürzlich geändert
- Zugriffsdatum
- Ausführungsdatum
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Warnung: Dies ist keine Schnellsortieroption, Suchen können langsam sein
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
index ae541a745..f80a55965 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
@@ -5,6 +5,8 @@
Por favor, seleccione primeroPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -128,6 +130,11 @@
Show Windows Context MenuOpen WithSelect a program to open with
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} free of {1}
@@ -141,19 +148,32 @@
Advertencia: El servicio de Everything no se está ejecutandoError al consultar EverythingOrdenar por
- Name
- Ruta
- Size
- Extensión
- Tipo de nombre
- Fecha de creación
- Fecha de modificación
- Atributos
- Lista de archivos Nombre del Archivo
- Ejecutar cuenta
- Fecha de cambio reciente
- Fecha de acceso
- Fecha de ejecución
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Advertencia: No es una opción de orden rápido, las búsquedas pueden ser lentas
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
index 10ee4a9a4..474ba9a4c 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
@@ -5,6 +5,8 @@
Por favor haga una selección primeroPor favor, seleccione una ruta de carpeta.Por favor, elija un nombre o ruta de carpeta diferente.
+ ¿Está seguro de que desea eliminar este enlace de acceso rápido?
+ ¿Está seguro de que desea eliminar esta ruta excluida de la búsqueda de índices?Por favor, seleccione un enlace de carpeta¿Está seguro de que desea eliminar {0}?¿Está seguro de que desea eliminar permanentemente este archivo?
@@ -107,9 +109,9 @@
Abrir carpeta contenedoraAbre la ubicación que contiene al elemento actualAbrir con el editor:
- No se pudo abrir el archivo en {0} con el editor {1} en {2}
+ No se ha podido abrir el archivo en {0} con el editor {1} en {2}Abrir con Shell:
- No se pudo abrir la carpeta {0} con Shell {1} en {2}
+ No se ha podido abrir la carpeta {0} con Shell {1} en {2}Excluir la carpeta actual y sus subcarpetas del índice de búsquedaExcluido del índice de búsquedaAbrir opciones de indexación de Windows
@@ -128,6 +130,11 @@
Mostrar menú contextual de WindowsAbrir conSeleccione un programa para abrir con
+ No se pudo eliminar {0}
+ Archivo no encontrado: {0}
+ Fallo al abrir {0}
+ Fallo al establecer texto en el portapapeles
+ Fallo al establecer archivos/carpetas en el portapapeles{0} libre de {1}
@@ -141,19 +148,32 @@
Advertencia: El servicio de Everything no se está ejecutandoError al consultar EverythingOrdenar por
- Nombre
- Ruta
- Tamaño
- Extensión
- Tipo
- Fecha de creación
- Fecha de modificación
- Atributos
- Nombre de la lista de archivos
- Número de ejecuciones
- Fecha de cambios recientes
- Fecha de último acceso
- Fecha de ejecución
+ Nombre ↑
+ Nombre ↓
+ Ruta ↑
+ Ruta ↓
+ Tamaño ↑
+ Tamaño ↓
+ Extensión ↑
+ Extensión ↓
+ Tipo ↑
+ Tipo ↓
+ Fecha de creación ↑
+ Fecha de creación ↓
+ Fecha de modificación ↑
+ Fecha de modificación ↓
+ Atributos ↑
+ Atributos ↓
+ Nombre de la lista de archivos ↑
+ Nombre de la lista de archivos ↓
+ Número de ejecuciones ↑
+ Número de ejecuciones ↓
+ Fecha modificada recientemente ↑
+ Fecha modificada recientemente ↓
+ Fecha de último acceso ↑
+ Fecha de último acceso ↓
+ Fecha de ejecución ↑
+ Fecha de ejecución ↓↑↓Advertencia: Esta no es una opción de clasificación rápida, las búsquedas pueden ser lentas
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
index 8809004c7..096cd4a0d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
@@ -5,6 +5,8 @@
Veuillez d'abord effectuer une sélectionVeuillez sélectionner un chemin d'accès au dossier.Veuillez choisir un nom ou un chemin d'accès différent.
+ Êtes-vous sûr de vouloir supprimer ce lien d'accès rapide ?
+ Êtes-vous sûr de vouloir supprimer ce chemin de recherche d'index exclu ?Veuillez sélectionner un lien vers un dossierÊtes-vous sûr de vouloir supprimer {0} ?Êtes-vous sûr de vouloir supprimer définitivement ce fichier ?
@@ -128,6 +130,11 @@
Afficher le menu contextuel de WindowsOuvrir avecSélectionnez un programme à ouvrir avec
+ Échec de la suppression de {0}
+ Fichier introuvable : {0}
+ Échec de l'ouverture de {0}
+ Impossible de mettre le texte dans le presse-papiers
+ Impossible de définir les fichiers/dossiers dans le presse-papiers{0} libres sur {1}
@@ -141,19 +148,32 @@
Avertissement : Le service Everything n'est pas en cours d'exécutionErreur lors de l'interrogation de EverythingTrier par
- Nom
- Xhemin
- Taille
- Extension
- Nom du type
- Date de création
- Date de modification
- Attributs
- Fichiers Liste Nom du fichier
- Nombre d'exécutions
- Date récemment modifiée
- Date d'accès
- Date d'exécution
+ Nom ↑
+ Nom ↓
+ Chemin ↑
+ Chemin ↓
+ Taille ↑
+ Taille ↓
+ Extension ↑
+ Extension ↓
+ Nom du type ↑
+ Nom du type ↓
+ Date de création ↑
+ Date de création ↓
+ Date de modification ↑
+ Date de modification ↓
+ Attributs ↑
+ Attributs ↓
+ Nom de fichier de la liste de fichiers ↑
+ Nom de fichier de la liste de fichiers ↓
+ Nombre d'exécutions ↑
+ Nombre d'exécutions ↓
+ Date récemment modifié ↑
+ Date récemment modifié ↓
+ Date d'accès ↑
+ Date d'accès ↓
+ Date d'exécution ↑
+ Date d'exécution ↓↑↓Avertissement : Il ne s'agit pas d'une option de tri rapide, les recherches peuvent être lentes.
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml
index a18a15aad..a4e4445ae 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml
@@ -5,6 +5,8 @@
אנא בצע בחירה תחילהאנא בחר נתיב לתיקייה.אנא בחר שם או נתיב תיקייה אחר.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?אנא בחר קישור לתיקייההאם אתה בטוח שברצונך למחוק את {0}?האם אתה בטוח שברצונך למחוק קובץ זה לצמיתות?
@@ -128,6 +130,11 @@
הצג תפריט הקשר של Windowsפתח באמצעותבחר תוכנית לפתיחה
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} פנוי מתוך {1}
@@ -141,19 +148,32 @@
אזהרה: שירות Everything אינו פועלשגיאה במהלך שאילתה ל-Everythingמיין לפי
- שם
- נתיב
- גודל
- סיומת
- שם סוג
- תאריך יצירה
- תאריך שינוי
- מאפיינים
- מיון לפי שם קובץ ברשימה
- מספר הפעלות
- תאריך שינוי אחרון
- תאריך גישה
- תאריך הרצה
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓אזהרה: זוהי לא אפשרות מיון מהיר, החיפושים עשויים להיות איטיים
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
index 3afaf2f25..f3fa1e1e6 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
@@ -5,6 +5,8 @@
Effettua prima una selezionePlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Si prega di selezionare un collegamento alla cartellaSei sicuro di voler eliminare {0}?Sei sicuro di voler eliminare definitivamente questo file?
@@ -128,6 +130,11 @@
Mostra Menu Contestuale di WindowsApri ConSeleziona un programma con cui aprire
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} disponibili su {1}
@@ -141,19 +148,32 @@
Attenzione: Il servizio "Everything" non è in esecuzioneErrore nell'interrogazione di EverythingOrdina per
- Nome
- Percorso
- Dimensioni
- Estensione
- Tipo
- Data di creazione
- Data della modifica
- Attributi
- Nome File Lista
- Esegui Conteggio
- Data di recente della modifica
- Data di accesso
- Data di esecuzione
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Attenzione: Questa non è un'opzione di ordinamento rapido, le ricerche potrebbero essere lente
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
index 648efe642..d0b045175 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
@@ -5,6 +5,8 @@
Please make a selection firstPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -128,6 +130,11 @@
Windowsの右クリックメニューを表示アプリで開く開くためのプログラムを選択します
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} free of {1}
@@ -141,19 +148,32 @@
Warning: Everything service is not runningError while querying EverythingSort By
- 名前
- Path
- サイズ
- Extension
- Type Name
- Date Created
- Date Modified
- Attributes
- File List FileName
- Run Count
- Date Recently Changed
- Date Accessed
- Date Run
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Warning: This is not a Fast Sort option, searches may be slow
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
index cf4d8b8ad..3195ff6e5 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
@@ -5,6 +5,8 @@
항목을 먼저 선택하세요Please select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?폴더 링크를 선택하세요{0} - 삭제하시겠습니까?이 파일을 영구적으로 삭제하시겠습니까?
@@ -128,6 +130,11 @@
우클릭 메뉴 보기함께 열기이 항목을 열 프로그램을 선택
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} free of {1}
@@ -141,19 +148,32 @@
경고: Everything 서비스가 실행 중이 아닙니다Error while querying Everything정렬 기준
- Name
- Path
- 크기
- Extension
- Type Name
- Date Created
- Date Modified
- Attributes
- File List FileName
- Run Count
- Date Recently Changed
- Date Accessed
- Date Run
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Warning: This is not a Fast Sort option, searches may be slow
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
index 733136c36..5efdead0c 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
@@ -5,6 +5,8 @@
Vennligst gjør et valg førstPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Velg en mappekoblingEr du sikker på at du ønsker å slette {0}?Er du sikker på at du vil slette denne filen permanent?
@@ -128,6 +130,11 @@
Vis Windows-hurtigmenyÅpne medVelg et program for å åpne med
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} ledig av {1}
@@ -141,19 +148,32 @@
Advarsel: Everything-tjenesten kjører ikkeFeil under spørring av EverythingSorter etter
- Navn
- Sti
- Størrelse
- Utvidelse
- Typenavn
- Dato opprettet
- Dato endret
- Attributter
- Filliste Filnavn
- Antall kjøringer
- Dato nylig endret
- Dato for tilgang
- Dato for kjøring
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Advarsel: dette er ikke et hurtigsorteringsalternativ, søk kan være trege
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
index c4bfb639d..cc6d350c9 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
@@ -5,6 +5,8 @@
Please make a selection firstPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -128,6 +130,11 @@
Show Windows Context MenuOpen WithSelect a program to open with
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} free of {1}
@@ -141,19 +148,32 @@
Waarschuwing: Everything service is niet actiefFout bij het opvragen EverythingSorteer op
- Name
- Pad
- Size
- Uitbreiding
- Type naam
- Datum aangemaakt
- Datum gewijzigd
- Kenmerken
- Bestandslijst Bestandsnaam
- Aantal keer uitgevoerd
- Datum onlangs gewijzigd
- Datum laatst geopend
- Datum uitvoering
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Waarschuwing: Dit is geen snelle sorteeroptie, zoekopdrachten kunnen traag zijn
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
index ddf56ab37..c981c2832 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
@@ -5,6 +5,8 @@
Najpierw dokonaj wyboruWybierz ścieżkę folderu.Wybierz inną nazwę lub ścieżkę folderu.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Musisz wybrać któryś folder z listyCzy jesteś pewien że chcesz usunąć {0}?Jesteś pewny, że chcesz usunąć ten plik trwale?
@@ -128,6 +130,11 @@
Pokaż menu kontekstowe WindowsOtwórz za pomocąWybierz program do otwarcia
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} wolne z {1}
@@ -141,19 +148,32 @@
Everything Service nie jest uruchomionyWystąpił błąd podczas pobierania wyników z EverythingSortuj wg
- Nazwa
- Ścieżka
- Rozmiar
- Rozszerzenia
- Nazwa typu
- Data utworzenia
- Data modyfikacji
- Atrybuty
- Nazwa pliku na liście plików
- Liczba uruchomień
- Data ostatniej zmiany
- Data dostępu
- Data uruchomienia
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Uwaga: To nie jest opcja Szybkiego sortowania, wyszukiwania mogą być wolne
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
index d0a260290..fe4fa320a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
@@ -5,6 +5,8 @@
Please make a selection firstPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -128,6 +130,11 @@
Show Windows Context MenuOpen WithSelect a program to open with
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} free of {1}
@@ -141,19 +148,32 @@
Warning: Everything service is not runningError while querying EverythingSort By
- Nome
- Path
- Tamanho
- Extension
- Type Name
- Date Created
- Date Modified
- Attributes
- File List FileName
- Run Count
- Date Recently Changed
- Date Accessed
- Date Run
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Warning: This is not a Fast Sort option, searches may be slow
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
index 98a77d06a..d0651cc53 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
@@ -5,6 +5,8 @@
Tem que efetuar uma seleçãoSelecione o caminho da pasta.Por favor, escolha um nome ou caminho diferente.
+ Tem a certeza de que pretende eliminar esta ligação de acesso rápido?
+ Tem a certeza de que deseja eliminar este caminho do índice de pesquisas?Selecione a ligação para a pastaTem a certeza de que deseja eliminar {0}?Tem a certeza de que pretende eliminar permanentemente este ficheiro?
@@ -128,6 +130,11 @@
Mostrar menu de contexto do WindowsAbrir comSelecione o programa a utilizar
+ Falha ao eliminar {0}
+ Ficheiro não encontrado: {0}
+ Falha ao abrir {0}
+ Falha ao definir texto na área de transferência
+ Falha ao definir ficheiros/pasta na área de transferência{0} livre de {1} no total
@@ -141,19 +148,32 @@
Aviso: o serviço Everything não está em execuçãoErro ao consultar EverythingOrdenar por
- Nome
- Caminho
- Tamanho
- Extensão
- Nome do tipo
- Data de criação
- Data de modificação
- Atributos
- Por nome na lista de ficheiros
- Número de execuções
- Data alterada recentemente
- Data de acesso
- Data de execução
+ Nome ↑
+ Nome ↓
+ Caminho ↑
+ Caminho ↓
+ Tamanho ↑
+ Tamanho ↓
+ Extensão ↑
+ Extensão ↓
+ Tipo ↑
+ Tipo ↓
+ Data de criação ↑
+ Data de criação ↓
+ Data de modificação ↑
+ Data de modificação ↓
+ Atributos ↑
+ Atributos ↓
+ Nome de ficheiro na lista ↑
+ Nome de ficheiro na lista ↓
+ Número de execuções ↑
+ Número de execuções ↓
+ Alterado recentemente ↑
+ Alterado recentemente ↓
+ Data de acesso ↑
+ Data de acesso ↓
+ Data de execução ↑
+ Data de execução ↓↑↓Aviso: esta não é uma opção de ordenação rápida e as pesquisas podem ser demoradas
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
index 44a3a9b65..1644745ae 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
@@ -5,6 +5,8 @@
Сначала отметьте что-нибудьPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Пожалуйста, выберите ссылку на папкуВы уверены, что хотите удалить {0}?Вы действительно хотите безвозвратно удалить этот файл?
@@ -128,6 +130,11 @@
Show Windows Context MenuOpen WithSelect a program to open with
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} free of {1}
@@ -141,19 +148,32 @@
Warning: Everything service is not runningError while querying EverythingSort By
- Name
- Path
- Размер
- Extension
- Type Name
- Date Created
- Date Modified
- Attributes
- File List FileName
- Run Count
- Date Recently Changed
- Date Accessed
- Date Run
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Warning: This is not a Fast Sort option, searches may be slow
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
index 7c3f5deff..3ca738b69 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
@@ -5,6 +5,8 @@
Najprv vyberte položkuVyberte cestu k priečinku.Vyberte iný názov alebo cestu k priečinku.
+ Naozaj chcete odstrániť tento odkaz na rýchly prístup?
+ Naozaj chcete odstrániť vylúčenú adresu na tento vyhľadávací index?Vyberte odkaz na priečinokNaozaj chcete odstrániť {0}?Naozaj chcete natrvalo odstrániť tento súbor?
@@ -128,6 +130,11 @@
Zobraziť kontextovú ponuku WindowsuOtvoriť sVyberte program, ktorým chcete otvoriť súbor
+ Odstránenie {0} zlyhalo
+ Súbor sa nenašiel: {0}
+ Nepodarilo sa otvoriť {0}
+ Nepodarilo sa nastaviť text v schránke
+ Nepodarilo sa nastaviť súbory/priečinky v schránkeVoľných {0} z {1}
@@ -141,19 +148,32 @@
Upozornenie: Služba Everything nie je spustenáChyba pri dopytovaní EverythingZoradiť podľa
- Názov
- Cesta
- Veľkosť
- Prípona
- Typ
- Dátum vytvorenia
- Dátum úpravy
- Atribúty
- Zoznam názvov súborov
- Počet spustení
- Nedávno zmenený dátum
- Dátum prístupu
- Dátum spustenia
+ Názov ↑
+ Názov ↓
+ Cesta ↑
+ Cesta ↓
+ Veľkosť ↑
+ Veľkosť ↓
+ Prípona ↑
+ Prípona ↓
+ Typ ↑
+ Typ ↓
+ Dátum vytvorenia ↑
+ Dátum vytvorenia ↓
+ Dátum úpravy ↑
+ Dátum úpravy ↓
+ Atribúty ↑
+ Atribúty ↓
+ Názov súboru zoznamu súborov ↑
+ Názov súboru zoznamu súborov ↓
+ Počet spustení ↑
+ Počet spustení ↓
+ Dátum nedávnej zmeny ↑
+ Dátum nedávnej zmeny ↓
+ Dátum prístupu ↑
+ Dátum prístupu ↓
+ Dátum spustenia ↑
+ Dátum spustenia ↓↑↓Upozornenie: Toto nie je voľba Fast Sort, vyhľadávanie môže byť pomalé
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr-Cyrl-RS.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..19fe6dc64
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,210 @@
+
+
+
+
+ Please make a selection first
+ Please select a folder path.
+ Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?
+ Please select a folder link
+ Are you sure you want to delete {0}?
+ Are you sure you want to permanently delete this file?
+ Are you sure you want to permanently delete this file/folder?
+ Deletion successful
+ Successfully deleted {0}
+ Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
+ Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
+ The required service for Windows Index Search does not appear to be running
+ To fix this, start the Windows Search service. Select here to remove this warning
+ The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Explorer Alternative
+ Error occurred during search: {0}
+ Could not open folder
+ Could not open file
+
+
+ Delete
+ Edit
+ Add
+ General Setting
+ Customise Action Keywords
+ Customise Quick Access
+ Quick Access Links
+ Everything Setting
+ Preview Panel
+ Size
+ Date Created
+ Date Modified
+ File Age
+ Display File Info
+ Date and time format
+ Sort Option:
+ Everything Path:
+ Launch Hidden
+ Editor Path
+ Shell Path
+ Index Search Excluded Paths
+ Use search result's location as the working directory of the executable
+ Display more information like size and age in tooltips
+ Hit Enter to open folder in Default File Manager
+ Use Index Search For Path Search
+ Indexing Options
+ Search:
+ Path Search:
+ File Content Search:
+ Index Search:
+ Quick Access:
+ Current Action Keyword
+ Done
+ Enabled
+ When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Everything
+ Windows Index
+ Direct Enumeration
+ File Editor Path
+ Folder Editor Path
+ Enabled
+ Disabled
+
+ Content Search Engine
+ Directory Recursive Search Engine
+ Index Search Engine
+ Open Windows Index Option
+ Excluded File Types (comma seperated)
+ For example: exe,jpg,png
+ Maximum results
+ The maximum number of results requested from active search engine
+
+
+ Explorer
+ Find and manage files and folders via Windows Search or Everything
+
+
+ Ctrl + Enter to open the directory
+ Ctrl + Enter to open the containing folder
+ {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
+ Unknown
+ {0}{3}Space free: {1}{3}Total size: {2}
+
+
+ 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
+ Delete
+ Permanently delete current file
+ Permanently delete current folder
+ Name
+ Type
+ Path
+ File
+ Folder
+ Delete the selected
+ Run as different user
+ Run the selected using a different user account
+ Open containing folder
+ Open the location that contains current item
+ Open With Editor:
+ Failed to open file at {0} with Editor {1} at {2}
+ Open With Shell:
+ Failed to open folder {0} with Shell {1} at {2}
+ Exclude current and sub-directories from Index Search
+ Excluded from Index Search
+ Open Windows Indexing Options
+ Manage indexed files and folders
+ Failed to open Windows Indexing Options
+ Add to Quick Access
+ Add current item to Quick Access
+ Successfully Added
+ Successfully added to Quick Access
+ Successfully Removed
+ Successfully removed from Quick Access
+ Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
+ Remove from Quick Access
+ Remove from Quick Access
+ Remove current item from Quick Access
+ Show Windows Context Menu
+ Open With
+ Select a program to open with
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard
+
+
+ {0} free of {1}
+ Open in Default File Manager
+
+ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+
+
+
+ Failed to load Everything SDK
+ Warning: Everything service is not running
+ Error while querying Everything
+ Sort By
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓
+ ↑
+ ↓
+ Warning: This is not a Fast Sort option, searches may be slow
+
+ Search Full Path
+ Enable File/Folder Run Count
+
+ Click to launch or install Everything
+ Everything Installation
+ Installing Everything service. Please wait...
+ Successfully installed Everything service
+ Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
+ Click here to start it
+ Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
+ Do you want to enable content search for Everything?
+ It can be very slow without index (which is only supported in Everything v1.5+)
+
+ Unable to find Everything.exe
+ Failed to install Everything, please install it manually
+
+
+ Native Context Menu
+ 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/sr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
index 4df64e4d5..f8effbd7c 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
@@ -5,6 +5,8 @@
Please make a selection firstPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Please select a folder linkAre you sure you want to delete {0}?Are you sure you want to permanently delete this file?
@@ -128,6 +130,11 @@
Show Windows Context MenuOpen WithSelect a program to open with
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} free of {1}
@@ -141,19 +148,32 @@
Warning: Everything service is not runningError while querying EverythingSort By
- Name
- Path
- Size
- Extension
- Type Name
- Date Created
- Date Modified
- Attributes
- File List FileName
- Run Count
- Date Recently Changed
- Date Accessed
- Date Run
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Warning: This is not a Fast Sort option, searches may be slow
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
index ed327e1bc..f2240d47a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
@@ -2,21 +2,23 @@
- Please make a selection first
- Please select a folder path.
- Please choose a different name or folder path.
+ Lütfen önce bir seçim yapın
+ Lütfen bir klasör yolu seçin.
+ Lütfen farklı bir isim veya klasör yolu seçin.
+ Bu hızlı erişim bağlantısını silmek istediğinizden emin misiniz?
+ Are you sure you want to delete this index search excluded path?Lütfen bir klasör bağlantısı seçin{0} bağlantısını silmek istediğinize emin misiniz?Bu dosyayı kalıcı olarak silmek istediğinizden emin misiniz?Bu öğeyi kalıcı olarak silmek istediğinizden emin misiniz?
- Deletion successful
+ Silme işlemi başarılıBaşarıyla silindi: {0}
- Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
- Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
- The required service for Windows Index Search does not appear to be running
- To fix this, start the Windows Search service. Select here to remove this warning
- The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
- Explorer Alternative
+ Genel eylem anahtar sözcüğünü atamak, arama sırasında çok fazla sonuç getirebilir. Lütfen belirli bir eylem anahtar sözcüğü seçin
+ Hızlı Erişim etkinleştirildiğinde genel eylem anahtar sözcüğüne ayarlanamaz. Lütfen belirli bir eylem anahtar sözcüğü seçin
+ Windows Dizin Araması için gerekli hizmet çalışıyor gibi görünmüyor
+ Bunu düzeltmek için Windows Arama hizmetini başlatın. Bu uyarıyı kaldırmak için burayı seçin
+ Uyarı mesajı kapatıldı. Dosya ve klasörleri aramak için bir alternatif olarak Everything eklentisini yüklemek ister misiniz?{0}{0}Everything eklentisini yüklemek için 'Evet'i veya geri dönmek için 'Hayır'ı seçin
+ Explorer AlternatifiArama sırasında hata oluştu: {0}Klasör açılamadıDosya açılamadı
@@ -27,113 +29,118 @@
EkleGenel AyarlarAnahtar Kelimeler
- Customise Quick Access
- Quick Access Links
+ Hızlı Erişim'i Özelleştirin
+ Hızlı Erişim BağlantılarıEverything AyarlarıÖnizleme PaneliBoyutOluşturma TarihiDeğiştirme Tarihi
- File Age
+ Dosya YaşıDosya Özelliklerini GösterTarih ve saat biçimiSıralama Seçeneği:Everything Kurulumu:
- Launch Hidden
+ Gizli BaşlatMetin DüzenleyiciKomut İstemiHariç Tutulan DizinlerProgramın çalışma klasörü olarak sonuç klasörünü kullan
- Display more information like size and age in tooltips
- Hit Enter to open folder in Default File Manager
- Use Index Search For Path Search
- Indexing Options
+ Araç ipuçlarında boyut ve yaş gibi daha fazla bilgi göster
+ Klasörü varsayılan Dosya Yöneticisi'nde açmak için Enter tuşuna basın
+ Yol Araması İçin Dizin Aramasını Kullan
+ Dizin Oluşturma SeçenekleriAra:Yolu Ara:Dosya İçeriğini Ara:
- Index Search:
+ Dizin Araması:Hızlı Erişim:Geçerli Anahtar KelimeTamamEtkin
- When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Devre dışı bırakıldığında Flow bu arama seçeneğini yürütmez ve eylem anahtar sözcüğünü serbest bırakmak için ek olarak '*' değerine geri dönerEverythingWindows AramaDoğrudan SayımMetin DüzenleyiciKlasör Düzenleyici
- Enabled
- Disabled
+ Aktif
+ Devre dışıDosya İçeriği Arama Motoru
- Directory Recursive Search Engine
+ Dizin Yinelemeli Arama MotoruArama MotoruWindows Dizin Oluşturma Ayarları
- Excluded File Types (comma seperated)
- For example: exe,jpg,png
- Maximum results
- The maximum number of results requested from active search engine
+ Hariç Tutulan Dosya Türleri (virgülle ayrılmış)
+ Örneğin: exe,jpg,png
+ Maksimum sonuç
+ Etkin arama motorundan istenen maksimum sonuç sayısıDosya Gezgini
- Find and manage files and folders via Windows Search or Everything
+ Windows Arama veya Everything aracılığıyla dosya ve klasörleri bulun ve yönetinDizini açmak içi Ctrl + EnterDosya konumunu açmak için Ctrl + Enter
- {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3}
- Unknown
- {0}{3}Space free: {1}{3}Total size: {2}
+ {0}{4}Boyut: {1}{4}Oluşturulma tarihi: {2}{4}Değiştirildiği tarih: {3}
+ Bilinmeyen
+ {0}{3}Boş alan: {1}{3}Toplam boyut: {2}Yolu kopyalaMevcut dosya konumunu panoya kopyala
- Copy name
- Copy name of current item to clipboard
+ İsmi kopyala
+ Mevcut dosyanın adını panoya kopyalaKopyalaMevcut dosyayı panoya kopyalaMevcut klasörü panoya kopyalaSilMevcut dosyayı kalıcı olarak silMevcut klasörü kalıcı olarak sil
- Name
- Type
- Path
+ İsim
+ Tür
+ YolDosyaKlasörSeçileni silBaşka bir kullanıcı olarak çalıştır
- Run the selected using a different user account
+ Seçileni farklı bir kullanıcı hesabı kullanarak çalıştırDosya konumunu aç
- Open the location that contains current item
+ Geçerli öğeyi içeren konumu açMetin Düzenleyici ile Aç:
- Failed to open file at {0} with Editor {1} at {2}
+ {0} dosyası, {1} Düzenleyicisi ile {2} konumunda açılamadıKomut İstemi ile Aç:
- Failed to open folder {0} with Shell {1} at {2}
- Exclude current and sub-directories from Index Search
- Excluded from Index Search
+ {0} klasörü, {1} Kabuğu ile {2} konumunda açılamadı
+ Mevcut ve alt dizinleri Dizin Araması'ndan hariç tut
+ Dizin Araması'ndan hariç tutulduWindows Dizin Oluşturma Ayarları
- Manage indexed files and folders
+ Dizinlenmiş dosya ve klasörleri yönetWindows Dizin Oluşturma ayarlarını açma başarısız olduHızlı Erişime Sabitle
- Add current item to Quick Access
+ Geçerli öğeyi Hızlı Erişim'e ekleBaşarıyla Eklendi
- Successfully added to Quick Access
+ Hızlı Erişim'e başarıyla eklendiBaşarıyla Kaldırıldı
- Successfully removed from Quick Access
+ Hızlı Erişim'den başarıyla kaldırıldıAdd to Quick Access so it can be opened with Explorer's Search Activation action keywordHızlı Erişimden KaldırHızlı Erişimden Kaldır
- Remove current item from Quick Access
+ Geçerli öğeyi Hızlı Erişim'den kaldırWindows Bağlam Menüsünü AçBirlikte Aç
- Select a program to open with
+ Birlikte açmak için bir program seç
+ {0} silinemedi
+ Dosya bulunamadı: {0}
+ {0} açılamadı
+ Panodaki metin ayarlanamıyor
+ Panodaki dosyalar/klasörler ayarlanamıyor
- {0} free of {1}
+ {0} / {1} boşDosya Yöneticisinde Aç
- Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+ Bu dizinde arama yapmak için '>', dosya uzantılarını aramak için '*' veya her iki aramayı birleştirmek için '>*' kullanın.
@@ -141,25 +148,38 @@
Everything Servisi çalışmıyorSorgu Everything üzerinde çalıştırılırken hata oluştuŞuna Göre Sırala
- Name
- Yol
- Boyut
- Uzantı
- Tür
- Oluşturma Tarihi
- Değiştirme Tarihi
- Özellikler
- File List FileName
- Erişim Sayısı
- Date Recently Changed
- Erişim Tarihi
- Date Run
+ İsim ↑
+ İsim ↓
+ Yol ↑
+ Yol ↓
+ Boyut ↑
+ Boyut ↓
+ Uzantı ↑
+ Uzantı ↓
+ Tür Adı ↑
+ Tür Adı ↓
+ Oluşturma Tarihi ↑
+ Oluşturma Tarihi ↓
+ Değiştirme Tarihi ↑
+ Değiştirme Tarihi ↓
+ Özellikler ↑
+ Özellikler ↓
+ Dosya Listesi DosyaAdı ↑
+ Dosya Listesi DosyaAdı ↓
+ Çalıştırma Sayısı ↑
+ Çalıştırma Sayısı ↓
+ Son Değişiklik Tarihi ↑
+ Son Değişiklik Tarihi ↓
+ Erişim Tarihi ↑
+ Erişim Tarihi ↓
+ Çalıştırma Tarihi ↑
+ Çalıştırma Tarihi ↓↑↓
- Warning: This is not a Fast Sort option, searches may be slow
+ Uyarı: Bu, Hızlı Sıralama seçeneği değildir, aramalar yavaş olabilirTam Yolu Ara
- Enable File/Folder Run Count
+ Dosya/Klasör Çalıştırma Sayısını AçEverything'i yükle veya başlatEverything Kurulumu
@@ -167,16 +187,16 @@
Everything hizmeti başarıyla yüklendiEverything hizmetini otomatik olarak yükleme başarısız oldu. Lütfen https://www.voidtools.com adresinden elle yükleyin.Başlat
- Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
- Do you want to enable content search for Everything?
- It can be very slow without index (which is only supported in Everything v1.5+)
+ Herhangi bir Everything kurulumu bulunamadı, bir konum seçmek ister misiniz? {0}{0} Hayır'a tıkladığınızda, Everything otomatik olarak sizin için yüklenecektir
+ Everything için içerik aramasını açmak ister misiniz?
+ Dizin olmadan çok yavaş olabilir (yalnızca Everything v1.5+ sürümünde desteklenir)
- Unable to find Everything.exe
- Failed to install Everything, please install it manually
+ Everything.exe bulunamadı
+ Everything yüklenemedi, lütfen manuel olarak yükleyin
- Native Context Menu
- Display native context menu (experimental)
+ Yerel Bağlam Menüsünü Aç
+ Yerel bağlam menüsünü göster (deneysel)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').
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
index 38829112c..823c33193 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
@@ -5,6 +5,8 @@
Будь ласка, спочатку зробіть вибірВиберіть шлях до теки.Виберіть інше ім'я або шлях до теки.
+ Упевнені, що хочете видалити це посилання швидкого доступу?
+ Упевнені, що хочете видалити цей шлях, виключений з індексу пошуку?Будь ласка, оберіть посилання на текуВи впевнені, що хочете видалити {0}?Ви впевнені, що хочете назавжди видалити цей файл?
@@ -45,7 +47,7 @@
Виключені шляхи індексного пошукуВикористовувати розташування результату пошуку як робочу директорію виконуваного файлуПоказувати більше інформації, наприклад розмір і дату створення, у підказках
- Натисніть Enter, щоб відкрити папку у файловому менеджері за замовчуванням
+ Натисніть Enter, щоб відкрити теку у типовому файловому менеджеріВикористовуйте індексний пошук для пошуку шляхуПараметри індексаціїПошук:
@@ -56,7 +58,7 @@
Поточне ключове слово діїГотовоУвімкнено
- Якщо вимкнено, Flow не виконуватиме цю опцію пошуку і додатково повернеться до '*', щоб звільнити ключове слово дії
+ Якщо вимкнено, Flow не виконуватиме цей параметр пошуку і додатково повернеться до «*», щоб звільнити ключове слово діїEverythingІндекс WindowsПряме перерахування
@@ -116,22 +118,27 @@
Керування проіндексованими файлами та папкамиНе вдалося відкрити параметри індексування WindowsДодати до Швидкого доступу
- Додати поточний елемент до швидкого доступу
+ Додати поточний елемент до Швидкого доступуУспішно доданоУспішно додано до швидкого доступуУспішно вилученоУспішно видалено з швидкого доступу
- Додати до швидкого доступу, щоб його можна було відкрити за допомогою ключового слова дії "Активація пошуку" у Провіднику
+ Додати до Швидкого доступу, щоб його можна було відкрити за допомогою ключового слова дії «Активація пошуку» у ПровідникуВидалити зі швидкого доступуВидалити зі швидкого доступуВидалити поточний елемент зі швидкого доступуПоказати контекстне меню WindowsВідкрити за допомогоюВиберіть програму для відкриття
+ Не вдалося видалити {0}
+ Файл не знайдено: {0}
+ Не вдалося відкрити {0}
+ Не вдалося вставити текст у буфер обміну
+ Не вдалося вставити файли/теки в буфер обміну{0} не містить {1}
- Відкрити у файловому менеджері за замовчуванням
+ Відкрити у типовому файловому менеджері
Використовуйте '>' для пошуку в цьому каталозі, '*' для пошуку за розширеннями файлів або '>*' для поєднання обох варіантів пошуку.
@@ -141,19 +148,32 @@
Попередження: Служба Everything не запущенаПомилка при виконанні запиту EverythingСортувати за
- Назва
- Шлях
- Розмір
- Розширення
- Назва типу
- Дата створення
- Дата останньої зміни
- Атрибути
- Список файлів FileName
- Кількість запусків
- Дата нещодавно змінена
- Дата доступу
- Дата запуску
+ Назва ↑
+ Назва ↓
+ Шлях ↑
+ Шлях ↓
+ Розмір ↑
+ Розмір ↓
+ Розширення ↑
+ Розширення ↓
+ Тип назви ↑
+ Тип назви ↓
+ Дата створення ↑
+ Дата створення ↓
+ Дата зміни ↑
+ Дата зміни ↓
+ Атрибути ↑
+ Атрибути ↓
+ Список файлів FileName ↑
+ Список файлів FileName ↓
+ Кількість запусків ↑
+ Кількість запусків ↓
+ Нещодавно змінено ↑
+ Нещодавно змінено ↓
+ Дата доступу ↑
+ Дата доступу ↓
+ Дата запуску ↑
+ Дата запуску ↓↑↓Попередження: Це не швидке сортування, пошук може бути повільним
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml
index de6f9a6a4..7b64af3d8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml
@@ -5,6 +5,8 @@
Vui lòng lựa chọn trướcPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?Hãy chọn một thư mục.Bạn có chắc chắn muốn xóa {0} không?Bạn có chắc là muốn xóa vĩnh viễn các ảnh này?
@@ -128,6 +130,11 @@
Show Windows Context MenuMở bằngSelect a program to open with
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} phần {1}
@@ -141,19 +148,32 @@
Warning: Everything service is not runningError while querying EverythingSắp xếp theo
- Tên
- Đường dẫn
- Kích thước
- Mở rộng
- Loại tên
- Ngày Tạo
- ngày sửa đổi
- Thuộc tính
- File List FileName
- Số lần chạy
- Date Recently Changed
- Ngày truy cập
- Date Run
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Warning: This is not a Fast Sort option, searches may be slow
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
index 79d8fc66d..8ad979ac8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
@@ -5,6 +5,8 @@
请先进行选择请选择一个文件夹路径。请选择不同的名称或文件夹路径。
+ 您确定要删除此快速访问链接吗?
+ 您确定要删除此索引搜索排除路径吗?请选择一个文件夹链接您确定要删除 {0} 吗?您确定要永久删除此文件吗?
@@ -128,6 +130,11 @@
显示 Windows 上下文菜单打开方式选择要打开的程序
+ 无法删除 {0}
+ 未找到文件:{0}
+ 无法打开 {0}
+ 无法复制文本到剪切板
+ 无法复制文件/文件夹到剪切板 {0} 可用,共 {1}
@@ -141,19 +148,32 @@
警告:Everything 服务未运行Everything 插件发生了一个错误(回车拷贝具体错误信息)排序依据
- 名称
- 路径
- 大小
- 扩展名
- 类型名称
- 创建日期
- 修改日期
- 属性
- 文件列表名
- 运行次数
- 最近更改日期
- 访问日期
- 运行日期
+ 名称 ↑
+ 名称 ↓
+ 路径 ↑
+ 路径 ↓
+ 大小 ↑
+ 大小 ↓
+ 扩展名 ↑
+ 扩展名 ↓
+ 类型名称 ↑
+ 类型名称 ↓
+ 创建日期 ↑
+ 创建日期 ↓
+ 修改日期 ↑
+ 修改日期 ↓
+ 属性 ↑
+ 属性 ↓
+ 文件列表名 ↑
+ 文件列表名 ↓
+ 运行次数 ↑
+ 运行次数 ↓
+ 最近更改日期 ↑
+ 最近更改日期 ↓
+ 访问日期 ↑
+ 访问日期 ↓
+ 运行日期 ↑
+ 运行日期 ↓↑↓警告:这不是一个快速排序选项,搜索可能较慢。
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
index c4e22066d..39f260499 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
@@ -5,6 +5,8 @@
Please make a selection firstPlease select a folder path.Please choose a different name or folder path.
+ Are you sure you want to delete this quick access link?
+ Are you sure you want to delete this index search excluded path?請選擇一個資料夾你確認要刪除{0}嗎?Are you sure you want to permanently delete this file?
@@ -128,6 +130,11 @@
Show Windows Context MenuOpen WithSelect a program to open with
+ Fail to delete {0}
+ File not found: {0}
+ Fail to open {0}
+ Fail to set text in clipboard
+ Fail to set files/folders in clipboard{0} free of {1}
@@ -141,19 +148,32 @@
Everything Service 尚未啟動Everything 套件發生錯誤(Enter 複製具體錯誤訊息)排序依據
- 名稱
- 路徑
- 大小
- 擴展程序
- 類型
- 創建日期
- 修改日期
- 屬性
- File List FileName
- 執行次數
- 近期變更
- 存取日期
- Date Run
+ Name ↑
+ Name ↓
+ Path ↑
+ Path ↓
+ Size ↑
+ Size ↓
+ Extension ↑
+ Extension ↓
+ Type Name ↑
+ Type Name ↓
+ Date Created ↑
+ Date Created ↓
+ Date Modified ↑
+ Date Modified ↓
+ Attributes ↑
+ Attributes ↓
+ File List FileName ↑
+ File List FileName ↓
+ Run Count ↑
+ Run Count ↓
+ Date Recently Changed ↑
+ Date Recently Changed ↓
+ Date Accessed ↑
+ Date Accessed ↓
+ Date Run ↑
+ Date Run ↓↑↓Warning: This is not a Fast Sort option, searches may be slow
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/sr-Cyrl-RS.xaml b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..893948d3d
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,9 @@
+
+
+
+ Activate {0} plugin action keyword
+
+ Plugin Indicator
+ Provides plugins action words suggestions
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/tr.xaml
index f7f4d8d76..b2ffe60c2 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/tr.xaml
@@ -1,7 +1,7 @@
- Activate {0} plugin action keyword
+ {0} eklenti anahtar sözcüğünü etkinleştirEklenti GöstergesiEklenti eylemleri hakkında kelime önerileri sunar
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml
index c7ef77801..ea8b9e142 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml
@@ -43,15 +43,15 @@
Plug-in {0} erfolgreich aktualisiert. Bitte starten Sie Flow neu.{0} Plug-ins erfolgreich aktualisiert. Bitte starten Sie Flow neu.Plug-in {0} ist bereits modifiziert worden. Bitte starten Sie Flow neu, bevor Sie irgendwelche weitere Änderungen vornehmen.
- {0} modified already
- Please restart Flow before making any further changes
+ {0} bereits modifiziert
+ Bitte starten Sie Flow neu, bevor Sie irgendwelche weitere Änderungen vornehmen
- Invalid zip installer file
- Please check if there is a plugin.json in {0}
+ Ungültige Zip-Installer-Datei
+ Bitte überprüfen Sie, ob es eine plugin.json in {0} gibtPlug-ins-Manager
- Install, uninstall or update Flow Launcher plugins via the search window
+ Flow Launcher-Plug-ins via Suchfenster installieren, deinstallieren oder aktualisierenUnbekannter Autor
@@ -66,5 +66,5 @@
Warnung vor Installation aus unbekannter Quelle
- Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
+ Flow Launcher nach Installation/Deinstallation/Aktualisierung des Plug-ins via Plug-in-Manager automatisch neu starten
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml
index b6a3a6cbc..09a7c8c5e 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml
@@ -27,7 +27,7 @@
{0} por {1} {2}{2}¿Desea actualizar este complemento?Actualizar complementoEste complemento ya está instalado
- La descarga del manifiesto del complemento ha fallado
+ Ha fallado la descarga del manifiesto del complementoPor favor, compruebe que puede establecer conexión con github.com. Este error significa que es posible que no pueda instalar o actualizar complementos.Actualizar todos los complementos¿Desea actualizar todos los complementos?
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr-Cyrl-RS.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..1005a5677
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,70 @@
+
+
+
+
+ Downloading plugin
+ Successfully downloaded {0}
+ Error: Unable to download the plugin
+ {0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
+ {0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
+ Plugin Install
+ Installing Plugin
+ Download and install {0}
+ Plugin Uninstall
+ Keep plugin settings
+ Do you want to keep the settings of the plugin for the next usage?
+ Plugin {0} successfully installed. Restarting Flow, please wait...
+ Unable to find the plugin.json metadata file from the extracted zip file.
+ Error: A plugin which has the same or greater version with {0} already exists.
+ Error installing plugin
+ Error occurred while trying to install {0}
+ Error uninstalling plugin
+ No update available
+ All plugins are up to date
+ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
+ Plugin Update
+ This plugin is already installed
+ Plugin Manifest Download Failed
+ Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
+ Installing from an unknown source
+ You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+ {0} modified already
+ Please restart Flow before making any further changes
+
+ Invalid zip installer file
+ Please check if there is a plugin.json in {0}
+
+
+ Plugins Manager
+ Install, uninstall or update Flow Launcher plugins via the search window
+ Unknown Author
+
+
+ Open website
+ Visit the plugin's website
+ See source code
+ See the plugin's source code
+ Suggest an enhancement or submit an issue
+ Suggest an enhancement or submit an issue to the plugin developer
+ Go to Flow's plugins repository
+ Visit the PluginsManifest repository to see community-made plugin submissions
+
+
+ Install from unknown source warning
+ Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
+
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
index ed9aaf4b3..be2c4411f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
@@ -5,66 +5,66 @@
Eklenti indiriliyorSuccessfully downloadedHata: Eklenti indirilemiyor
- {0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
- {0} by {1} {2}{2}Would you like to uninstall this plugin?
- {0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
- {0} by {1} {2}{2}Would you like to install this plugin?
- Plugin Install
- Installing Plugin
- Download and install {0}
- Plugin Uninstall
- Keep plugin settings
- Do you want to keep the settings of the plugin for the next usage?
+ {0}, {1} tarafından geliştirildi {2}{3}Bu eklentiyi kaldırmak ister misiniz? Kaldırma işlemi tamamlandığında Flow kendiliğinden yeniden başlatılacak.
+ {0} - {1} tarafından geliştirildi {2}{2}Bu eklentiyi kaldırmak ister misiniz?
+ {0}, {1} tarafından geliştirildi {2}{3}Bu eklentiyi yüklemek ister misiniz? Yükleme işlemi tamamlandığında Flow kendiliğinden yeniden başlatılacak.
+ {0} - {1} tarafından geliştirildi {2}{2}Bu eklentiyi yüklemek ister misiniz?
+ Eklenti Yükleme
+ Eklenti Yükleniyor
+ {0} İndir ve yükle
+ Eklenti Kaldırma
+ Eklenti ayarlarını sakla
+ Eklentinin ayarlarını bir sonraki kullanım için saklamak istiyor musunuz?Plugin successfully installed. Restarting Flow, please wait...
- Unable to find the plugin.json metadata file from the extracted zip file.
- Error: A plugin which has the same or greater version with {0} already exists.
- Error installing plugin
- Error occurred while trying to install {0}
- Error uninstalling plugin
- No update available
+ Çıkarılan zip dosyasından plugin.json metadata dosyası bulunamıyor.
+ Hata: {0} ile aynı veya daha yüksek sürüme sahip bir eklenti zaten mevcut.
+ Eklenti yüklenirken bir hata oluştu
+ {0} yüklenmeye çalışılırken hata oluştu
+ Eklenti kaldırılırken bir hata oluştu
+ Güncelleme mevcut değilTüm eklentiler güncel
- {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
- {0} by {1} {2}{2}Would you like to update this plugin?
- Plugin Update
- This plugin is already installed
- Plugin Manifest Download Failed
- Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ {0}, {1} tarafından geliştirildi {2}{3}Bu eklentiyi güncellemek ister misiniz? Güncelleme tamamlandığında Flow kendiliğinden yeniden başlatılacak.
+ {0} - {1} tarafından geliştirildi {2}{2}Bu eklentiyi güncellemek ister misiniz?
+ Eklenti Güncellemesi
+ Bu eklenti zaten yüklü
+ Eklenti Manifestosu İndirme Başarısız Oldu
+ Lütfen github.com'a bağlanıp bağlanamadığınızı kontrol edin. Bu hata, eklentileri yükleyemeyeceğiniz veya güncelleyemeyeceğiniz anlamına gelir.Tüm eklentileri güncelle
- Would you like to update all plugins?
- Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
- Would you like to update {0} plugins?
- {0} plugins successfully updated. Restarting Flow, please wait...
- Plugin {0} successfully updated. Restarting Flow, please wait...
- Installing from an unknown source
- You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
+ Tüm eklentileri güncellemek ister misiniz?
+ {0} eklentiyi güncellemek ister misiniz? {1}Flow Launcher tüm eklentileri güncelledikten sonra yeniden başlayacaktır.
+ {0} eklentisini güncellemek ister misiniz?
+ {0} eklentileri başarıyla güncellendi. Flow yeniden başlatılıyor, lütfen bekleyin...
+ {0} eklentisi başarıyla güncellendi. Flow yeniden başlatılıyor, lütfen bekleyin...
+ Bilinmeyen bir kaynaktan yükleniyor
+ Bu eklentiyi bilinmeyen bir kaynaktan yüklüyorsunuz ve potansiyel riskler içerebilir!{0}{0}Lütfen bu eklentinin nereden geldiğini ve güvenli olduğunu anladığınızdan emin olun.{0}{0}Devam etmek ister misiniz?{0}{0}(Bu uyarıyı ayarlardan kapatabilirsiniz)
- Plugin {0} successfully installed. Please restart Flow.
- Plugin {0} successfully uninstalled. Please restart Flow.
- Plugin {0} successfully updated. Please restart Flow.
- {0} plugins successfully updated. Please restart Flow.
- Plugin {0} has already been modified. Please restart Flow before making any further changes.
- {0} modified already
- Please restart Flow before making any further changes
+ {0} eklentisi başarıyla yüklendi. Lütfen Flow'u yeniden başlatın.
+ {0} eklentisi başarıyla kaldırıldı. Lütfen Flow'u yeniden başlatın.
+ {0} eklentisi başarıyla güncellendi. Lütfen Flow'u yeniden başlatın.
+ {0} eklentileri başarıyla güncellendi. Lütfen Flow'u yeniden başlatın.
+ {0} eklentisi zaten değiştirilmiş. Lütfen daha fazla değişiklik yapmadan önce Flow'u yeniden başlatın.
+ {0} zaten değiştirilmiş
+ Lütfen başka değişiklikler yapmadan önce Flow'u yeniden başlatın
- Invalid zip installer file
- Please check if there is a plugin.json in {0}
+ Geçersiz zip yükleyici dosyası
+ Lütfen {0} içerisinde bir plugin.json olup olmadığını kontrol edin
- Plugins Manager
- Install, uninstall or update Flow Launcher plugins via the search window
+ Eklenti Yöneticisi
+ Arama penceresi aracılığıyla Flow Launcher eklentilerini yükleyin, kaldırın veya güncelleyinBilinmeyen Yazar
- Open website
- Visit the plugin's website
- See source code
- See the plugin's source code
- Suggest an enhancement or submit an issue
- Suggest an enhancement or submit an issue to the plugin developer
- Go to Flow's plugins repository
+ Web sitesini aç
+ Eklentinin web sitesini ziyaret edin
+ Kaynak kodunu görüntüle
+ Eklentinin kaynak kodunu görüntüle
+ Bir geliştirme öner veya bir sorun gönder
+ Eklenti geliştiricisine bir geliştirme önerin veya bir sorun gönderin
+ Flow'un eklenti deposuna gidinVisit the PluginsManifest repository to see community-made plugin submissions
- Install from unknown source warning
- Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager
+ Bilinmeyen kaynaktan yükleme uyarısı
+ Eklenti Yöneticisi aracılığıyla eklentiyi yükledikten/kaldırdıktan/güncelleştirdikten sonra Flow Launcher'ı otomatik olarak yeniden başlatın
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr-Cyrl-RS.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..0a7176d2c
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,14 @@
+
+
+
+ Process Killer
+ Kill running processes from Flow Launcher
+
+ kill all instances of "{0}"
+ kill {0} processes
+ kill all instances
+
+ Show title for processes with visible windows
+ Put processes with visible windows on the top
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml
index 0a7176d2c..c9a761d70 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml
@@ -1,14 +1,14 @@
- Process Killer
- Kill running processes from Flow Launcher
+ İşlem Sonlandırıcı
+ Flow Launcher'dan çalışan işlemleri sonlandırın
- kill all instances of "{0}"
- kill {0} processes
- kill all instances
+ "{0}" için tüm işlemleri sonlandır
+ {0} işlemini sonlandır
+ tüm işlemleri sonlandır
- Show title for processes with visible windows
- Put processes with visible windows on the top
+ Görünür pencereleri olan işlemler için başlığı göster
+ Görünür pencereleri olan işlemleri en üste yerleştir
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/sr-Cyrl-RS.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..fae1abedb
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,99 @@
+
+
+
+
+ Reset Default
+ Delete
+ Edit
+ Add
+ Name
+ Enable
+ Enabled
+ Disable
+ Status
+ Enabled
+ Disabled
+ Location
+ All Programs
+ File Type
+ Reindex
+ Indexing
+ Index Sources
+ Options
+ UWP Apps
+ When enabled, Flow will load UWP Applications
+ Start Menu
+ When enabled, Flow will load programs from the start menu
+ Registry
+ When enabled, Flow will load programs from the registry
+ PATH
+ When enabled, Flow will load programs from the PATH environment variable
+ Hide app path
+ For executable files such as UWP or lnk, hide the file path from being visible
+ Hide uninstallers
+ Hides programs with common uninstaller names, such as unins000.exe
+ Search in Program Description
+ Flow will search program's description
+ Hide duplicated apps
+ Hide duplicated Win32 programs that are already in the UWP list
+ Suffixes
+ Max Depth
+
+ Directory
+ Browse
+ File Suffixes:
+ Maximum Search Depth (-1 is unlimited):
+
+ 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
+ Edit directory and status of this program source.
+
+ Update
+ Program Plugin will only index files with selected suffixes and .url files with selected protocols.
+ Successfully updated file suffixes
+ File suffixes can't be empty
+ Protocols can't be empty
+
+ File Suffixes
+ URL Protocols
+ Steam Games
+ Epic Games
+ Http/Https
+ Custom URL Protocols
+ Custom File Suffixes
+
+ Insert file suffixes you want to index. Suffixes should be separated by ';'. (ex>bat;py)
+
+
+ Insert protocols of .url files you want to index. Protocols should be separated by ';', and should end with "://". (ex>ftp://;mailto://)
+
+
+ Run As Different User
+ Run As Administrator
+ Open containing folder
+ Hide
+ Open target folder
+
+ Program
+ Search programs in Flow Launcher
+
+ Invalid Path
+
+ Customized Explorer
+ Args
+ You can customize the explorer used for opening the container folder by inputing the Environmental Variable of the explorer you want to use. It will be useful to use CMD to test whether the Environmental Variable is available.
+ Enter the customized args you want to add for your customized explorer. %s for parent directory, %f for full path (which only works for win32). Check the explorer's website for details.
+
+
+ Success
+ Error
+ Successfully disabled this program from displaying in your query
+ This app is not intended to be run as administrator
+ Unable to run {0}
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
index e75dd0fc9..1316d3fd4 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml
@@ -8,34 +8,34 @@
EkleAdEtkin
- Enabled
- Disable
+ Etkin
+ Devre Dışı BırakDurum
- Enabled
- Disabled
+ Etkin
+ Devre dışıKonumTüm Programlar
- File Type
+ Dosya TipiYeniden İndeksleİndeksleniyor
- Index Sources
+ Kaynak DizinleriSeçeneklerUWP Uygulamaları
- When enabled, Flow will load UWP Applications
+ Etkinleştirildiğinde Flow, UWP Uygulamalarını yükleyecektirBaşlat Menüsü
- When enabled, Flow will load programs from the start menu
- Registry
- When enabled, Flow will load programs from the registry
+ Etkinleştirildiğinde Flow, programları başlat menüsünden yükleyecektir
+ Kayıt Defteri
+ Etkinleştirildiğinde Flow, programları kayıt defterinden yükleyecektirYOL
- When enabled, Flow will load programs from the PATH environment variable
+ Etkinleştirildiğinde Flow, programları PATH ortam değişkeninden yükleyecektirUygulama yolunu gizle
- For executable files such as UWP or lnk, hide the file path from being visible
- Hide uninstallers
- Hides programs with common uninstaller names, such as unins000.exe
- Search in Program Description
- Flow will search program's description
- Hide duplicated apps
- Hide duplicated Win32 programs that are already in the UWP list
+ UWP ya da lnk gibi dosyalar için dosya yolunu gösterme
+ Kaldırıcıları gizle
+ unins000.exe gibi yaygın kaldırıcı adlarına sahip programları gizler
+ Program Açıklamasında Ara
+ Flow, programların açıklamasında arama yapar
+ Yinelenen uygulamaları gizle
+ UWP listesinde zaten bulunan yinelenen Win32 programları gizlerUzantılarDerinlik
@@ -45,55 +45,55 @@
Maksimum Arama Derinliği (Limitsiz için -1):İş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.
+ Seçili program kaynaklarını silmek istediğinizden emin misiniz?
+ Lütfen sizin tarafınızdan eklenmemiş program kaynaklarını seçin
+ Lütfen sizin tarafınızdan eklenmiş program kaynaklarını seçin
+ Aynı konuma sahip başka bir program kaynağı zaten mevcut.
- Program Source
- Edit directory and status of this program source.
+ Program Kaynağı
+ Bu programın kaynağının dizinini ve durumunu düzenleyin.Güncelle
- Program Plugin will only index files with selected suffixes and .url files with selected protocols.
+ Program eklentisi yalnızca seçilen uzantılara sahip dosyaları ve belirli protokollere sahip .url dosyalarını dizine ekler.Dosya uzantıları başarıyla güncellendiDosya uzantıları boş olamaz
- Protocols can't be empty
+ Protokoller boş olamazİndekslenecek UzantılarURL Protokolleri
- Steam Games
+ Steam OyunlarıEpic GamesHttp/Https
- Custom URL Protocols
- Custom File Suffixes
+ Özel URL Protokolleri
+ Özel Dosya Sonekleri
Insert file suffixes you want to index. Suffixes should be separated by ';'. (ex>bat;py)
- Insert protocols of .url files you want to index. Protocols should be separated by ';', and should end with "://". (ex>ftp://;mailto://)
+ İndekslemek istediğiniz .url dosyalarının protokollerini girin. Protokoller ';' ile ayrılmalı ve "://" ile bitmelidir. (örn>ftp://;mailto://)
- Run As Different User
+ Başka Bir Kullanıcı Olarak ÇalıştırYönetici Olarak Çalıştırİçeren klasörü açGizle
- Open target folder
+ Hedef klasörü açProgramProgramları Flow Launcher'tan arayınGeçersiz Konum
- Customized Explorer
- Args
+ Özelleştirilmiş Gezgin
+ ParametrelerYou can customize the explorer used for opening the container folder by inputing the Environmental Variable of the explorer you want to use. It will be useful to use CMD to test whether the Environmental Variable is available.Enter the customized args you want to add for your customized explorer. %s for parent directory, %f for full path (which only works for win32). Check the explorer's website for details.Başarılı
- Error
- Successfully disabled this program from displaying in your query
- This app is not intended to be run as administrator
- Unable to run {0}
+ Hata
+ Bu programın sorgunuzda görüntülenmesi başarıyla devre dışı bırakıldı
+ Bu uygulama yönetici olarak çalıştırılmak için tasarlanmamıştır
+ {0} çalıştırılamıyor
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
index 29158b2ce..1f7c91244 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
@@ -2,7 +2,7 @@
- Скинути до значення за замовчуванням
+ Скинути до типового значенняВидалитиРедагуватиДодати
@@ -20,8 +20,8 @@
ІндексаціяДжерела індексуПараметри
- Додатки UWP
- Якщо увімкнено, Flow буде завантажувати UWP-додатки
+ UWP-застосунки
+ Якщо увімкнено, Flow буде завантажувати UWP-застосункиМеню ПускЯкщо увімкнено, Flow завантажуватиме програми зі стартового менюРеєстр
@@ -87,7 +87,7 @@
Кастомізований провідникАргументиВи можете налаштувати провідник, який використовується для відкриття теки контейнера, ввівши змінну середовища провідника, який ви хочете використовувати. Буде корисно використовувати CMD, аби перевірити, чи доступна змінна середовища.
- Введіть спеціальні аргументи, які ви хочете додати до вашого провідника. %s для батьківського каталогу, %f для повного шляху (працює лише для win32). Докладнішу інформацію можна знайти на веб-сайті провідника.
+ Введіть спеціальні аргументи, які ви хочете додати до вашого провідника. %s для батьківського каталогу, %f для повного шляху (працює лише для win32). Докладнішу інформацію можна знайти на вебсайті провідника.Успішно
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
index 39bd105a5..5bb385c31 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
@@ -15,4 +15,6 @@
التشغيل كمسؤولنسخ الأمرإظهار عدد أوامر الأكثر استخدامًا فقط:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
index dfe9e7d4f..fe5d30d7e 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
@@ -15,4 +15,6 @@
Spustit jako správceKopírovat příkazZobrazit pouze počet nejpoužívanějších příkazů:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
index 90eb49317..a013f3b5a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
@@ -15,4 +15,6 @@
Run As AdministratorCopy the commandOnly show number of most used commands:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
index dcfc82e0a..8e2078c70 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
@@ -15,4 +15,6 @@
Als Administrator ausführenKopieren des BefehlsNur Anzahl der am meisten verwendeten Befehle zeigen:
+ Befehl nicht gefunden: {0}
+ Fehler beim Ausführen des Befehls: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
index 3fc6b8ba4..7deafcc62 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
@@ -15,4 +15,6 @@
Ejecutar como administradorCopiar comandoSólo mostrar el número de comandos más usados:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
index a3f97eac4..d3fcb11f7 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
@@ -15,4 +15,6 @@
Ejecutar como administradorCopiar el comandoMostrar solo el siguiente número de comandos más usados:
+ Comando no encontrado: {0}
+ Error al ejecutar el comando: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
index 54118e0f3..de0741c6e 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
@@ -15,4 +15,6 @@
Exécuter en tant qu'administrateurCopier la commandeAfficher uniquement le nombre de commandes les plus utilisées :
+ Commande introuvable : {0}
+ Erreur lors de l'exécution de la commande : {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/he.xaml
index 1a8ebbb7f..d44e96df4 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/he.xaml
@@ -15,4 +15,6 @@
הפעל כמנהלהעתק את הפקודההצג רק את מספר הפקודות הנפוצות ביותר:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
index 506f20446..d4886323a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
@@ -15,4 +15,6 @@
Esegui Come AmministratoreCopia il comandoMostra solo il numero di comandi più usati:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
index 781227267..440d33697 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
@@ -15,4 +15,6 @@
管理者として実行Copy the commandOnly show number of most used commands:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
index b661e836b..8a69bea74 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
@@ -15,4 +15,6 @@
관리자 권한으로 실행명령어 복사가장 많이 사용된 명령 표시 수
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
index b00b78d6f..b86c82844 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
@@ -15,4 +15,6 @@
Kjør som administratorKopier kommandoenVis bare antall mest brukte kommandoer:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
index a429524ac..069026a22 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
@@ -15,4 +15,6 @@
Run As AdministratorCopy the commandOnly show number of most used commands:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
index 0ec1f92fb..bdc84917b 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
@@ -15,4 +15,6 @@
Uruchom jako administratorSkopiuj komendęPokaż tylko liczbę najczęściej używanych poleceń:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
index a2e65a741..c39c23b54 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
@@ -15,4 +15,6 @@
Run As AdministratorCopiar o comandoOnly show number of most used commands:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
index 66f7aec85..804a89611 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
@@ -15,4 +15,6 @@
Executar como administradorCopiar comandoMostrar este número dos comandos mais usados:
+ Comando não encontrado: {0}
+ Erro ao executar o comando: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
index d3975bd9e..99b525bbf 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
@@ -15,4 +15,6 @@
Run As AdministratorСкопировать командуПоказывать только самые используемые команды:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
index b1bf88a31..1af5a882b 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
@@ -15,4 +15,6 @@
Spustiť ako správcaKopírovať príkazZobraziť iba počet najpoužívanejších príkazov:
+ Príkaz sa nenašiel: {0}
+ Neporadilo sa spustiť príkaz: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr-Cyrl-RS.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..a013f3b5a
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,20 @@
+
+
+
+ Replace Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
+ Do not close Command Prompt after command execution
+ Always run as administrator
+ Use Windows Terminal
+ Run as different user
+ Shell
+ Allows to execute system commands from Flow Launcher
+ this command has been executed {0} times
+ execute command through command shell
+ Run As Administrator
+ Copy the command
+ Only show number of most used commands:
+ Command not found: {0}
+ Error running the command: {0}
+
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
index 90eb49317..a013f3b5a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
@@ -15,4 +15,6 @@
Run As AdministratorCopy the commandOnly show number of most used commands:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
index d421a84a4..6fc5724f6 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
@@ -2,17 +2,19 @@
Win+R kısayolunu kullan
- Close Command Prompt after pressing any key
- Press any key to close this window...
+ Herhangi bir tuşa bastıktan sonra Komut İstemi'ni kapatma
+ Bu pencereyi kapatmak için herhangi bir tuşa basın...Çalıştırma sona erdikten sonra komut istemini kapatma
- Always run as administrator
- Use Windows Terminal
- Run as different user
+ Her zaman yönetici olarak çalıştır
+ Windows Terminal Kullan
+ Başka bir kullanıcı olarak çalıştırKabuk
- Allows to execute system commands from Flow Launcher
- Bu komut {0} kez çalıştırıldı
- Komut isteminde çalıştır
+ Flow Launcher'dan sistem komutlarının yürütülmesine izin verir
+ bu komut {0} kez çalıştırıldı
+ komut isteminde çalıştırYönetici Olarak Çalıştır
- Copy the command
- Only show number of most used commands:
+ Komutu kopyala
+ Sadece en çok kullanılan komutların sayısını gösterir:
+ Komut bulunamadı: {0}
+ Komut çalıştırılırken hata oluştu: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
index d47474784..cdd81d5b9 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
@@ -15,4 +15,6 @@
Запустити від імені адміністратораСкопіювати командуПоказати лише кількість найчастіше використовуваних команд:
+ Команду не знайдено: {0}
+ Помилка запуску команди: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/vi.xaml
index d21412a14..86a7673b0 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/vi.xaml
@@ -15,4 +15,6 @@
Chạy với quyền quản trịSao chép lệnhChỉ hiển thị số lượng lệnh được sử dụng nhiều nhất:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
index 0362bf6fc..5a25b37d9 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
@@ -15,4 +15,6 @@
以管理员身份运行复制命令显示最常用的命令个数:
+ 找不到命令:{0}
+ 运行命令时出错:{0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
index 8936c0498..02eb35336 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
@@ -15,4 +15,6 @@
以系統管理員身分執行Copy the commandOnly show number of most used commands:
+ Command not found: {0}
+ Error running the command: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
index ccc50678e..ac45e013e 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
@@ -61,6 +61,8 @@
هل أنت متأكد أنك تريد إعادة تشغيل الكمبيوتر؟هل أنت متأكد أنك تريد إعادة تشغيل الكمبيوتر مع خيارات التمهيد المتقدمة؟هل أنت متأكد أنك تريد تسجيل الخروج؟
+ خطأ
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
index de35c9592..6af81c3a5 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
@@ -61,6 +61,8 @@
Opravdu chcete počítač restartovat?Opravdu chcete restartovat počítač s rozšířenými možnostmi spouštění?Opravdu se chcete odhlásit?
+ Chyba
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
index 91230e7e3..4a910b381 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
@@ -61,6 +61,8 @@
Are you sure you want to restart the computer?Are you sure you want to restart the computer with Advanced Boot Options?Are you sure you want to log off?
+ Error
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
index 794e949ad..469928a29 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
@@ -61,6 +61,8 @@
Sind Sie sicher, dass Sie den Computer neu starten wollen?Sind Sie sicher, dass Sie den Computer mit erweiterten Boot-Optionen neu starten wollen?Sind Sie sicher, dass Sie sich ausloggen wollen?
+ Fehler
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Befehls-Schlüsselwort-EinstellungBenutzerdefiniertes Befehls-Schlüsselwort
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
index ac4040dca..7fa6fdb7b 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
@@ -61,6 +61,8 @@
Are you sure you want to restart the computer?Are you sure you want to restart the computer with Advanced Boot Options?Are you sure you want to log off?
+ Error
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
index 5f3688ab8..0db2d60d5 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
@@ -61,6 +61,8 @@
¿Está seguro de que desea reiniciar el equipo?¿Está seguro de que desea reiniciar el equipo con opciones de arranque avanzadas?¿Está seguro de que desea cerrar la sesión?
+ Error
+ No se ha podido vaciar la papelera de reciclaje. Esto puede ocurrir si:{0}- Algunos elementos están actualmente en uso{0}- Algunos elementos no se pueden eliminar debido a permisos{0}Por favor, cierre cualquier aplicación que pueda estar utilizando estos archivos e inténtelo de nuevo.Configuración de la palabra clave de comandoPalabra clave de comando personalizada
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
index 5419bd8e2..3a15b69a4 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
@@ -61,6 +61,8 @@
Êtes-vous sûr de vouloir redémarrer l'ordinateur ?Êtes-vous sûr de vouloir redémarrer l'ordinateur avec les options de démarrage avancées ?Êtes-vous sûr de vouloir vous déconnecter ?
+ Erreur
+ Impossible de vider la corbeille. Cela peut se produire si :{0}- Certains éléments sont actuellement en cours d'utilisation{0}- Certains éléments ne peuvent pas être supprimés en raison des permissions{0}. Veuillez fermer toutes les applications qui pourraient utiliser ces fichiers et réessayer.Réglage du mot-clé de commandeMot-clé de commande personnalisé
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.xaml
index b02a89a0a..caf82072c 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.xaml
@@ -61,6 +61,8 @@
האם אתה בטוח שברצונך להפעיל מחדש את המחשב?האם אתה בטוח שברצונך להפעיל מחדש את המחשב עם אפשרויות אתחול מתקדמות?האם אתה בטוח שברצונך להתנתק?
+ שגיאה
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.הגדרת מילת מפתח לפקודהמילת מפתח מותאמת לפקודה
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
index be31e4e52..f1d11c156 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
@@ -61,6 +61,8 @@
Sei sicuro di voler riavviare il computer?Sei sicuro di voler riavviare il computer con le Opzioni di Avvio Avanzate?Sei sicuro di volerti disconettere?
+ Error
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
index 7d131d944..aa50169a8 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
@@ -61,6 +61,8 @@
本当にコンピューターを再起動しますか?高度な起動オプションでコンピューターを再起動しますか?本当にログオフしますか?
+ Error
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
index 873e71d44..909b4a40b 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
@@ -61,6 +61,8 @@
시스템을 재시작 하시겠습니까?고급 부팅 옵션으로 시스템을 다시 시작하시겠습니까?정말 로그아웃 하시겠습니까?
+ Error
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
index 072fd623d..4072a7454 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
@@ -61,6 +61,8 @@
Er du sikker på at du vil starte datamaskinen på nytt?Er du sikker på at du vil starte datamaskinen på nytt med avanserte oppstartsalternativer?Er du sikker på at du vil logge av?
+ Feil
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
index 9d1d54076..e24a4b6f7 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
@@ -61,6 +61,8 @@
Weet u zeker dat u de computer wilt herstarten?Weet u zeker dat u de computer wilt herstarten met geavanceerde opstartopties?Are you sure you want to log off?
+ Error
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
index 33cee56d8..8532d4a99 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
@@ -61,6 +61,8 @@
Czy na pewno chcesz zrestartować komputer?Czy na pewno chcesz ponownie uruchomić komputer z Zaawansowanymi opcjami rozruchu?Czy na pewno chcesz się wylogować?
+ Błąd
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
index a19ab39d6..fb0fde730 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
@@ -61,6 +61,8 @@
Are you sure you want to restart the computer?Are you sure you want to restart the computer with Advanced Boot Options?Are you sure you want to log off?
+ Error
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
index 9e0e39066..6021c96ff 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
@@ -61,6 +61,8 @@
Tem a certeza que deseja reiniciar o computador?Tem certeza de que deseja reiniciar o computador com as opções avançadas de arranque?Tem certeza de que deseja terminar a sessão?
+ Erro
+ Falha ao limpar a Reciclagem. Isto pode aparecer se: {0} - alguns itens estão a ser usados {0} - alguns itens não podem ser eliminados (permissões) {0}Experimente fechar quaisquer aplicações que possam estar a usar os ficheiros e tente novamente.Definição de palavra-chavePalavra-chave personalizada
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
index 796cda69d..69746e836 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
@@ -61,6 +61,8 @@
Are you sure you want to restart the computer?Are you sure you want to restart the computer with Advanced Boot Options?Are you sure you want to log off?
+ Ошибка
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
index 087ff9f05..f4823dc57 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
@@ -22,7 +22,7 @@
NastaveniaZnova načítať údaje pluginovSkontrolovať aktualizácie
- Otvoriť umiestnenie denníka
+ Otvoriť umiestnenie loguTipy pre Flow LauncherPoužívateľský priečinok Flow LauncheraPrepnúť herný režim
@@ -46,7 +46,7 @@
Hibernovať počítačUložiť všetky nastavenia Flow LauncheraAktualizovať všetky nové dáta pluginov
- Otvoriť umiestnenie denníka Flow Launchera
+ Otvoriť umiestnenie logu Flow LauncheraSkontrolovať aktualizácie Flow LauncheraV dokumentácii k aplikácii Flow Launcher nájdete ďalšiu pomoc a tipy na používanieOtvoriť umiestnenie, kde sú uložené nastavenia Flow Launchera
@@ -61,6 +61,8 @@
Naozaj chcete počítač reštartovať?Naozaj chcete počítač reštartovať s pokročilými možnosťami spúšťania?Naozaj sa chcete odhlásiť?
+ Chyba
+ Nepodarilo sa vyprázdniť kôš. Môže sa to stať, ak:{0}– Niektoré položky sa práve používajú{0}– Niektoré položky sa nedajú odstrániť pre nedostatočné oprávnenia{0}Prosím, ukončite každú aplikáciu, ktorá môže používať tieto súbory a skúste to znova.Nastavenia kľúčového slova príkazuVlastné kľúčové slovo príkazu
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr-Cyrl-RS.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..2d2c039c3
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,79 @@
+
+
+
+
+ Name
+ Description
+ Command
+
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Exit
+ Save Settings
+ Restart Flow Launcher
+ Settings
+ Reload Plugin Data
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+ Set the Flow Launcher Theme
+
+ Edit
+
+
+ Shutdown Computer
+ Restart Computer
+ Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
+ Log off
+ Lock this computer
+ Close Flow Launcher
+ Restart Flow Launcher
+ Tweak Flow Launcher's settings
+ Put computer to sleep
+ Empty recycle bin
+ Open recycle bin
+ Indexing Options
+ Hibernate computer
+ Save all Flow Launcher settings
+ Refreshes plugin data with new content
+ Open Flow Launcher's log location
+ Check for new Flow Launcher update
+ Visit Flow Launcher's documentation for more help and how to use tips
+ Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
+ Quickly change the Flow Launcher theme
+
+
+ Success
+ All Flow Launcher settings saved
+ Reloaded all applicable plugin data
+ Are you sure you want to shut the computer down?
+ Are you sure you want to restart the computer?
+ Are you sure you want to restart the computer with Advanced Boot Options?
+ Are you sure you want to log off?
+ Error
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.
+
+ Command Keyword Setting
+ Custom Command Keyword
+ Enter a keyword to search for command: {0}. This keyword is used to match your query.
+ Command Keyword
+ Reset
+ Confirm
+ Cancel
+ Please enter a non-empty command keyword
+
+ System Commands
+ Provides System related commands. e.g. shutdown, lock, settings etc.
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
index f5a2f1b30..6490848e6 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
@@ -61,6 +61,8 @@
Are you sure you want to restart the computer?Are you sure you want to restart the computer with Advanced Boot Options?Are you sure you want to log off?
+ Error
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
index 18f7f63f5..b8dcccbe2 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
@@ -2,38 +2,38 @@
- Name
+ AdAçıklamaKomut
- Shutdown
- Restart
- Restart With Advanced Boot Options
- Log Off/Sign Out
- Lock
- Sleep
- Hibernate
- Index Option
- Empty Recycle Bin
- Open Recycle Bin
- Çıkı
- Save Settings
+ Bilgisayarı Kapat
+ Yeniden Başlat
+ Gelişmiş Önyükleme Seçenekleri ile Yeniden Başlat
+ Oturumu Kapat
+ Kilitle
+ Uyku Moduna Geç
+ Hazırda Beklet
+ Dizin Seçeneği
+ Geri Dönüşüm Kutusunu Boşalt
+ Geri Dönüşüm Kutusunu Aç
+ Çıkış
+ Ayarları KaydetFlow Launcher'u Yeniden BaşlatAyarlar
- Reload Plugin Data
- Check For Update
- Open Log Location
- Flow Launcher Tips
- Flow Launcher UserData Folder
- Toggle Game Mode
- Set the Flow Launcher Theme
+ Eklenti Verisini Yenile
+ Güncellemeleri Denetle
+ Günlük Konumunu Aç
+ Flow Launcher İpuçları
+ Flow Launcher UserData Klasörü
+ Oyun Modunu Aç/Kapat
+ Flow Launcher Temasını AyarlaDüzenleBilgisayarı KapatYeniden Başlat
- Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
+ Gelişmiş Başlatma Seçenekleri ile bilgisayarı yeniden başlatın, Güvenli Mod ve Hata Ayıklama Modu da dahil olmak üzere diğer seçenekler içinOturumu KapatBilgisayarı KilitleFlow Launcher'u Kapat
@@ -41,35 +41,37 @@
Flow Launcher Ayarlarını AçBilgisayarı Uyku Moduna AlGeri Dönüşüm Kutusunu Boşalt
- Open recycle bin
- Indexing Options
+ Geri dönüşüm kutusunu aç
+ Dizin Oluşturma SeçenekleriBilgisayarı Askıya AlTüm Flow Launcher Ayarlarını KaydetEklentilerin verilerini Flow Launcher'un açılışından sonra yapılan değişiklikleri için günceller. Eklentilerin bu özelliği zaten eklemiş olması gerekir.
- Open Flow Launcher's log location
- Check for new Flow Launcher update
- Visit Flow Launcher's documentation for more help and how to use tips
- Open the location where Flow Launcher's settings are stored
- Toggle Game Mode
- Quickly change the Flow Launcher theme
+ Flow Launcher'ın günlük konumunu aç
+ Yeni Flow Launcher güncellemelerini kontrol et
+ Daha fazla yardım ve ipuçları için Flow Launcher'ın dokümantasyonunu ziyaret edin
+ Flow Launcher'ın ayarlarının depolandığı dosya konumunu açın
+ Oyun Modunu Aç/Kapat
+ Flow Launcher temasını hızlıca değiştirBaşarılıTüm Flow Launcher ayarları kaydedildi.
- Reloaded all applicable plugin data
+ Geçerli tüm eklenti verileri yeniden yüklendiBilgisayarı kapatmak istediğinize emin misiniz?Bilgisayarı yeniden başlatmak istediğinize emin misiniz?
- Are you sure you want to restart the computer with Advanced Boot Options?
- Are you sure you want to log off?
+ Gelişmiş Başlatma Seçenekleri ile bilgisayarı yeniden başlatmak istediğinizden emin misiniz?
+ Oturumu kapatmayı istediğinizden emin misiniz?
+ Hata
+ Geri dönüşüm kutusu boşaltılamadı. Bu durum şu durumlarda meydana gelebilir:{0}- Bazı öğeler şu anda kullanımda{0}- Bazı öğeler izinler nedeniyle silinemiyor{0}Lütfen bu dosyaları kullanıyor olabilecek tüm uygulamaları kapatın ve tekrar deneyin.
- Command Keyword Setting
- Custom Command Keyword
- Enter a keyword to search for command: {0}. This keyword is used to match your query.
- Command Keyword
+ Komut Anahtar Kelimesi Ayarı
+ Özel Komut Anahtar Kelimesi
+ Komut aramak için bir anahtar kelimesi girin: {0}. Bu anahtar kelime, sorgunuzu eşleştirmek için kullanılır.
+ Komut Anahtar KelimesiSıfırlaOnaylaİptal
- Please enter a non-empty command keyword
+ Lütfen boş olmayan bir komut anahtar kelimesini girinSistem KomutlarıSistem ile ilgili komutlara erişim sağlar. ör. shutdown, lock, settings vb.
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
index c82be249a..dd44f71fd 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
@@ -61,6 +61,8 @@
Ви впевнені, що хочете перезавантажити комп'ютер?Ви впевнені, що хочете перезавантажити комп'ютер за допомогою додаткових параметрів завантаження?Ви впевнені, що хочете вийти з системи?
+ Помилка
+ Не вдалося очистити кошик. Це може статися, якщо:{0}- Деякі елементи зараз використовуються{0}- Деякі елементи не можна видалити через обмеження доступу{0}Закрийте всі застосунки, які можуть використовувати ці файли, і спробуйте ще раз.Налаштування ключового слова командиВласне ключове слово команди
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/vi.xaml
index dae12c501..3f2e03100 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/vi.xaml
@@ -61,6 +61,8 @@
Bạn có chắc muốn khởi động lại cấp này?Bạn có chắc chắn muốn khởi động lại máy tính bằng Advanced Boot Options không?Are you sure you want to log off?
+ Lỗi
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom 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 d59b77145..90666a59b 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
@@ -61,6 +61,8 @@
您确定要重启吗?您确定要以高级启动选项重启吗?您确定要注销吗?
+ 错误
+ 清空回收站失败。 可能会发生这种情况:{0}- 某些项目目前正在使用。{0}- 某些项目由于权限而无法删除。{0}请关闭任何可能使用这些文件的应用程序,然后重试。命令关键词设置自定义命令关键词
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
index 573aefcbd..3ab9c8a44 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
@@ -61,6 +61,8 @@
Are you sure you want to restart the computer?Are you sure you want to restart the computer with Advanced Boot Options?Are you sure you want to log off?
+ Error
+ Failed to empty the recycle bin. This might happen if:{0}- Some items are currently in use{0}- Some items can't be deleted due to permissions{0}Please close any applications that might be using these files and try again.Command Keyword SettingCustom Command Keyword
diff --git a/Plugins/Flow.Launcher.Plugin.Url/Languages/sr-Cyrl-RS.xaml b/Plugins/Flow.Launcher.Plugin.Url/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..418731021
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Url/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,17 @@
+
+
+
+ Open search in:
+ New Window
+ New Tab
+
+ Open url:{0}
+ Can't open url:{0}
+
+ URL
+ Open the typed URL from Flow Launcher
+
+ Please set your browser path:
+ Choose
+ Application(*.exe)|*.exe|All files|*.*
+
diff --git a/Plugins/Flow.Launcher.Plugin.Url/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Url/Languages/tr.xaml
index b8ae6a93c..fc76ee12e 100644
--- a/Plugins/Flow.Launcher.Plugin.Url/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Url/Languages/tr.xaml
@@ -1,9 +1,9 @@
- Open search in:
- New Window
- New Tab
+ Aramayı şurada aç:
+ Yeni Pencere
+ Yeni SekmeURL'yi Aç: {0}URL Açılamıyor: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
index cefb5d1d1..edb44f8f4 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ar.xaml
@@ -11,6 +11,7 @@
تعديلإضافةمفعل
+ الوضع الخاصمفعلمُعطّلتأكيد
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
index ca98581c3..2e49f4965 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/cs.xaml
@@ -11,6 +11,7 @@
EditovatPřidatPovoleno
+ Soukromý režimPovolenoDeaktivovánPotvrdit
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
index b1113acb7..7bc145a68 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/da.xaml
@@ -11,6 +11,7 @@
RedigerTilføjEnabled
+ PrivattilstandEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
index 2a7dca596..41a798d44 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/de.xaml
@@ -11,6 +11,7 @@
BearbeitenHinzufügenAktiviert
+ Privater ModusAktiviertDeaktiviertBestätigen
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
index 3ce22bb78..f170a8d73 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es-419.xaml
@@ -11,6 +11,7 @@
EditarAñadirEnabled
+ Modo PrivadoEnabledDisabledConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
index 7f14b59c6..5c956d8f8 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
@@ -11,6 +11,7 @@
EditarAñadirActivado
+ Modo privadoActivadoDesactivadoConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
index f04cfb48a..3c9003ebf 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/fr.xaml
@@ -11,6 +11,7 @@
ModifierAjouterActivé
+ Mode privéActivéDésactivéConfirmer
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
index 78ee7ca7d..583f63bde 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/he.xaml
@@ -11,6 +11,7 @@
ערוהוסףמופעל
+ מצב פרטימופעלמושבתאישו
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
index db2a4dfeb..f250ecf3b 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml
@@ -11,6 +11,7 @@
ModificaAggiungiAbilitato
+ Modalità PrivataAbilitatoDisabilitatoConferma
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
index 4112f41ff..16c5fb3e9 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml
@@ -11,6 +11,7 @@
編集追加Enabled
+ Private ModeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
index c8f069ca7..9b8198779 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml
@@ -11,6 +11,7 @@
편집추가켬
+ 사생활 보호 모드켬Disabled확인
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
index 9f793c43f..93c48b545 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nb.xaml
@@ -11,6 +11,7 @@
RedigerLegg tilAktivert
+ Privat modusAktivertDeaktivertBekreft
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
index a18710324..25187d0b6 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/nl.xaml
@@ -11,6 +11,7 @@
BewerkenToevoegenEnabled
+ PrivémodusEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
index 05ee39777..bc32a1b7e 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml
@@ -11,6 +11,7 @@
EdytujDodajAktywny
+ Tryb prywatnyAktywnyWyłączonyPotwierdź
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
index 6f0d7fcc9..a581e91b2 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-br.xaml
@@ -11,6 +11,7 @@
EditarAdicionarEnabled
+ Private ModeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
index 1a2476a2c..22be076cb 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pt-pt.xaml
@@ -11,6 +11,7 @@
EditarAdicionarAtivo
+ Modo privadoAtivoInativoConfirmar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
index 1fd9aca96..67435b5b9 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml
@@ -11,6 +11,7 @@
РедактироватьДобавитьEnabled
+ Приватный режимEnabledОтключёнConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
index 1afcdb360..355ce984f 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sk.xaml
@@ -11,6 +11,7 @@
UpraviťPridaťPovolené
+ Privátny režimZapnutéVypnutéPotvrdiť
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr-Cyrl-RS.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr-Cyrl-RS.xaml
new file mode 100644
index 000000000..cf24862c7
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr-Cyrl-RS.xaml
@@ -0,0 +1,53 @@
+
+
+
+ Search Source Setting
+ Open search in:
+ New Window
+ New Tab
+ Set browser from path:
+ Choose
+ Delete
+ Edit
+ Add
+ Enabled
+ Private Mode
+ Enabled
+ Disabled
+ Confirm
+ Action Keyword
+ URL
+ Search
+ Use Search Query Autocomplete
+ Autocomplete Data from:
+ Please select a web search
+ Are you sure you want to delete {0}?
+ If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ https://www.netflix.com/search?q=Casino
+
+ Now copy this entire string and paste it in the URL field below.
+ Then replace casino with {q}.
+ Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+
+
+ Copy URL
+ Copy search URL to clipboard
+
+
+ Title
+ Status
+ Select Icon
+ Icon
+ Cancel
+ Invalid web search
+ Please enter a title
+ Please enter an action keyword
+ Please enter a URL
+ Action keyword already exists, please enter a different one
+ Success
+ Hint: You do not need to place custom images in this directory, if Flow's version is updated they will be lost. Flow will automatically copy any images outside of this directory across to WebSearch's custom image location.
+
+ Web Searches
+ Allows to perform web searches
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
index 06707b4af..695c88c30 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/sr.xaml
@@ -11,6 +11,7 @@
IzmeniDodajEnabled
+ Private ModeEnabledDisabledConfirm
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
index b37070d93..1a9fdbf03 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/tr.xaml
@@ -1,36 +1,37 @@
- Search Source Setting
- Open search in:
+ Arama Kaynağı Ayarı
+ Aramayı şurada aç:Yeni PencereYeni Sekme
- Set browser from path:
+ Dizin üzerinden tarayıcı seç:SeçSilDüzenleEkle
- Enabled
- Enabled
- Disabled
+ Etkin
+ Gizli Mod
+ Etkin
+ Devre dışıOnaylaAnahtar KelimeURLAra:
- Use Search Query Autocomplete
- Autocomplete Data from:
+ Arama Sorgusu Otomatik Doldurmayı Kullan
+ Otomatik Doldurma Verileri:Lütfen bir web araması seçin{0} bağlantısını silmek istediğinize emin misiniz?
- If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ Flow'a belirli bir web sitesi için arama eklemek istiyorsanız, önce söz konusu web sitesinin arama çubuğuna sahte bir metin dizesi girin ve aramayı başlatın. Şimdi tarayıcının adres çubuğunun içeriğini kopyalayın ve aşağıdaki URL alanına yapıştırın. Test dizenizi {q} ile değiştirin. Örneğin, Netflix'te casino araması yaparsanız, adres çubuğunda şunlar yazarhttps://www.netflix.com/search?q=Casino
- Now copy this entire string and paste it in the URL field below.
- Then replace casino with {q}.
- Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+ Şimdi bu dizenin tamamını kopyalayın ve aşağıdaki URL alanına yapıştırın.
+ Daha sonra casino yazısını {q} ile değiştirin.
+ Dolayısıyla, Netflix'te arama yapmak için genel formül https://www.netflix.com/search?q={q}
- Copy URL
- Copy search URL to clipboard
+ URL'yi kopyala
+ Arama URL'sini panoya kopyalaBaşlık
@@ -44,7 +45,7 @@
Lütfen bir URL girinizAnahtar kelime zaten mevcut. Lütfen yeni bir tane seçiniz.Başarılı
- Hint: You do not need to place custom images in this directory, if Flow's version is updated they will be lost. Flow will automatically copy any images outside of this directory across to WebSearch's custom image location.
+ İpucu: Bu dizine özel resimler yerleştirmenize gerek yoktur, Flow'un sürümü güncellenirse bunlar kaybolacaktır. Flow, bu dizinin dışındaki tüm görüntüleri otomatik olarak WebSearch'ün özel görüntü konumuna kopyalayacaktır.Web AramasıWeb üzerinde arama yapmanızı sağlar
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
index 51e1efc6e..72cfb23c2 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
@@ -11,6 +11,7 @@
РедагуватиДодатиУвімкнено
+ Приватний режимУвімкненоВимкненоПідтвердити
@@ -21,7 +22,7 @@
Автозаповнення даних з:Будь ласка, виберіть пошуковий запит в ІнтернетіВи впевнені, що хочете видалити {0}?
- Якщо ви хочете додати до Flow пошук певного веб-сайту, спочатку введіть фіктивний текстовий рядок у пошуковий рядок цього веб-сайту і розпочніть пошук. Тепер скопіюйте вміст адресного рядка браузера і вставте його в поле URL нижче. Замініть тестовий рядок на {q}. Наприклад, якщо ви шукаєте казино на сайті Netflix, його адресний рядок матиме такий вигляд
+ Якщо ви хочете додати до Flow пошук певного вебсайту, спочатку введіть фіктивний текстовий рядок у пошуковий рядок цього вебсайту і розпочніть пошук. Тепер скопіюйте вміст адресного рядка браузера і вставте його в поле URL нижче. Замініть тестовий рядок на {q}. Наприклад, якщо ви шукаєте казино на сайті Netflix, його адресний рядок матиме такий виглядhttps://www.netflix.com/search?q=Casino
Тепер скопіюйте весь цей рядок і вставте його в поле URL нижче.
@@ -38,7 +39,7 @@
Обрати значокІконкаСкасувати
- Неправильний веб-пошук
+ Неправильний вебпошукБудь ласка, введіть назвуБудь ласка, введіть ключове слово діїБудь ласка, введіть URL-адресу
@@ -46,7 +47,7 @@
УспішноПідказка: Вам не потрібно розміщувати власні зображення в цьому каталозі, якщо версія Flow оновиться, вони будуть втрачені. Flow автоматично копіює всі зображення з цього каталогу до спеціального каталогу WebSearch.
- Веб-пошук
- Дозволяє здійснювати веб-пошук
+ Вебпошук
+ Дозволяє здійснювати вебпошук
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
index 731275c5e..fb99024ec 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml
@@ -11,6 +11,7 @@
SửaThêmĐã bật
+ Chế độ riêng tưĐã bậtVô hiệu hóaXác nhận
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
index 7b8a72d6b..fff4a2c8d 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-cn.xaml
@@ -11,6 +11,7 @@
编辑添加启用
+ 隐身模式已启用已禁用确认
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
index 727b2f4a9..9ce6c88db 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/zh-tw.xaml
@@ -11,6 +11,7 @@
編輯新增已啟用
+ 無痕模式已啟用Disabled確定
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
index 5b0a57759..d87cd75cb 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.pt-PT.resx
@@ -1779,7 +1779,7 @@
Alterar definições padrão para multimédia e dispositivos
- Imprimir o cartão de referência de fala
+ Imprimir cartão de referência de falaCalibrar ecrã
@@ -2227,10 +2227,10 @@
Identificar e reparar problemas de rede
- Encontrar e corrigir problemas de rede e conexão
+ Encontrar e corrigir problemas de rede e ligações
- Reproduzir CDs ou outras mídias automaticamente
+ Reproduzir CDs ou outas unidades automaticamenteVer informações básicas sobre seu computador
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.sr-SP.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.sr-SP.resx
new file mode 100644
index 000000000..53715bf23
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.sr-SP.resx
@@ -0,0 +1,2514 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ About
+ Area System
+
+
+ access.cpl
+ File name, Should not translated
+
+
+ Accessibility Options
+ Area Control Panel (legacy settings)
+
+
+ Accessory apps
+ Area Privacy
+
+
+ Access work or school
+ Area UserAccounts
+
+
+ Account info
+ Area Privacy
+
+
+ Accounts
+ Area SurfaceHub
+
+
+ Action Center
+ Area Control Panel (legacy settings)
+
+
+ Activation
+ Area UpdateAndSecurity
+
+
+ Activity history
+ Area Privacy
+
+
+ Add Hardware
+ Area Control Panel (legacy settings)
+
+
+ Add/Remove Programs
+ Area Control Panel (legacy settings)
+
+
+ Add your phone
+ Area Phone
+
+
+ Administrative Tools
+ Area System
+
+
+ Advanced display settings
+ Area System, only available on devices that support advanced display options
+
+
+ Advanced graphics
+
+
+ Advertising ID
+ Area Privacy, Deprecated in Windows 10, version 1809 and later
+
+
+ Airplane mode
+ Area NetworkAndInternet
+
+
+ Alt+Tab
+ Means the key combination "Tabulator+Alt" on the keyboard
+
+
+ Alternative names
+
+
+ Animations
+
+
+ App color
+
+
+ App diagnostics
+ Area Privacy
+
+
+ App features
+ Area Apps
+
+
+ App
+ Short/modern name for application
+
+
+ Apps and Features
+ Area Apps
+
+
+ System settings
+ Type of the setting is a "Modern Windows settings". We use the same term as used in start menu search at the moment.
+
+
+ Apps for websites
+ Area Apps
+
+
+ App volume and device preferences
+ Area System, Added in Windows 10, version 1903
+
+
+ appwiz.cpl
+ File name, Should not translated
+
+
+ Area
+ Mean the settings area or settings category
+
+
+ Accounts
+
+
+ Administrative Tools
+ Area Control Panel (legacy settings)
+
+
+ Appearance and Personalization
+
+
+ Apps
+
+
+ Clock and Region
+
+
+ Control Panel
+
+
+ Cortana
+
+
+ Devices
+
+
+ Ease of access
+
+
+ Extras
+
+
+ Gaming
+
+
+ Hardware and Sound
+
+
+ Home page
+
+
+ Mixed reality
+
+
+ Network and Internet
+
+
+ Personalization
+
+
+ Phone
+
+
+ Privacy
+
+
+ Programs
+
+
+ SurfaceHub
+
+
+ System
+
+
+ System and Security
+
+
+ Time and language
+
+
+ Update and security
+
+
+ User accounts
+
+
+ Assigned access
+
+
+ Audio
+ Area EaseOfAccess
+
+
+ Audio alerts
+
+
+ Audio and speech
+ Area MixedReality, only available if the Mixed Reality Portal app is installed.
+
+
+ Automatic file downloads
+ Area Privacy
+
+
+ AutoPlay
+ Area Device
+
+
+ Background
+ Area Personalization
+
+
+ Background Apps
+ Area Privacy
+
+
+ Backup
+ Area UpdateAndSecurity
+
+
+ Backup and Restore
+ Area Control Panel (legacy settings)
+
+
+ Battery Saver
+ Area System, only available on devices that have a battery, such as a tablet
+
+
+ Battery Saver settings
+ Area System, only available on devices that have a battery, such as a tablet
+
+
+ Battery saver usage details
+
+
+ Battery use
+ Area System, only available on devices that have a battery, such as a tablet
+
+
+ Biometric Devices
+ Area Control Panel (legacy settings)
+
+
+ BitLocker Drive Encryption
+ Area Control Panel (legacy settings)
+
+
+ Blue light
+
+
+ Bluetooth
+ Area Device
+
+
+ Bluetooth devices
+ Area Control Panel (legacy settings)
+
+
+ Blue-yellow
+
+
+ Bopomofo IME
+ Area TimeAndLanguage
+
+
+ bpmf
+ Should not translated
+
+
+ Broadcasting
+ Area Gaming
+
+
+ Calendar
+ Area Privacy
+
+
+ Call history
+ Area Privacy
+
+
+ calling
+
+
+ Camera
+ Area Privacy
+
+
+ Cangjie IME
+ Area TimeAndLanguage
+
+
+ Caps Lock
+ Mean the "Caps Lock" key
+
+
+ Cellular and SIM
+ Area NetworkAndInternet
+
+
+ Choose which folders appear on Start
+ Area Personalization
+
+
+ Client service for NetWare
+ Area Control Panel (legacy settings)
+
+
+ Clipboard
+ Area System
+
+
+ Closed captions
+ Area EaseOfAccess
+
+
+ Color filters
+ Area EaseOfAccess
+
+
+ Color management
+ Area Control Panel (legacy settings)
+
+
+ Colors
+ Area Personalization
+
+
+ Command
+ The command to direct start a setting
+
+
+ Connected Devices
+ Area Device
+
+
+ Contacts
+ Area Privacy
+
+
+ Control Panel
+ Type of the setting is a "(legacy) Control Panel setting"
+
+
+ Copy command
+
+
+ Core Isolation
+ Means the protection of the system core
+
+
+ Cortana
+ Area Cortana
+
+
+ Cortana across my devices
+ Area Cortana
+
+
+ Cortana - Language
+ Area Cortana
+
+
+ Credential manager
+ Area Control Panel (legacy settings)
+
+
+ Crossdevice
+
+
+ Custom devices
+
+
+ Dark color
+
+
+ Dark mode
+
+
+ Data usage
+ Area NetworkAndInternet
+
+
+ Date and time
+ Area TimeAndLanguage
+
+
+ Default apps
+ Area Apps
+
+
+ Default camera
+ Area Device
+
+
+ Default location
+ Area Control Panel (legacy settings)
+
+
+ Default programs
+ Area Control Panel (legacy settings)
+
+
+ Default Save Locations
+ Area System
+
+
+ Delivery Optimization
+ Area UpdateAndSecurity
+
+
+ desk.cpl
+ File name, Should not translated
+
+
+ Desktop themes
+ Area Control Panel (legacy settings)
+
+
+ deuteranopia
+ Medical: Mean you don't can see red colors
+
+
+ Device manager
+ Area Control Panel (legacy settings)
+
+
+ Devices and printers
+ Area Control Panel (legacy settings)
+
+
+ DHCP
+ Should not translated
+
+
+ Dial-up
+ Area NetworkAndInternet
+
+
+ Direct access
+ Area NetworkAndInternet, only available if DirectAccess is enabled
+
+
+ Direct open your phone
+ Area EaseOfAccess
+
+
+ Display
+ Area EaseOfAccess
+
+
+ Display properties
+ Area Control Panel (legacy settings)
+
+
+ DNS
+ Should not translated
+
+
+ Documents
+ Area Privacy
+
+
+ Duplicating my display
+ Area System
+
+
+ During these hours
+ Area System
+
+
+ Ease of access center
+ Area Control Panel (legacy settings)
+
+
+ Edition
+ Means the "Windows Edition"
+
+
+ Email
+ Area Privacy
+
+
+ Email and app accounts
+ Area UserAccounts
+
+
+ Encryption
+ Area System
+
+
+ Environment
+ Area MixedReality, only available if the Mixed Reality Portal app is installed.
+
+
+ Ethernet
+ Area NetworkAndInternet
+
+
+ Exploit Protection
+
+
+ Extras
+ Area Extra, , only used for setting of 3rd-Party tools
+
+
+ Eye control
+ Area EaseOfAccess
+
+
+ Eye tracker
+ Area Privacy, requires eyetracker hardware
+
+
+ Family and other people
+ Area UserAccounts
+
+
+ Feedback and diagnostics
+ Area Privacy
+
+
+ File system
+ Area Privacy
+
+
+ FindFast
+ Area Control Panel (legacy settings)
+
+
+ findfast.cpl
+ File name, Should not translated
+
+
+ Find My Device
+ Area UpdateAndSecurity
+
+
+ Firewall
+
+
+ Focus assist - Quiet hours
+ Area System
+
+
+ Focus assist - Quiet moments
+ Area System
+
+
+ Folder options
+ Area Control Panel (legacy settings)
+
+
+ Fonts
+ Area EaseOfAccess
+
+
+ For developers
+ Area UpdateAndSecurity
+
+
+ Game bar
+ Area Gaming
+
+
+ Game controllers
+ Area Control Panel (legacy settings)
+
+
+ Game DVR
+ Area Gaming
+
+
+ Game Mode
+ Area Gaming
+
+
+ Gateway
+ Should not translated
+
+
+ General
+ Area Privacy
+
+
+ Get programs
+ Area Control Panel (legacy settings)
+
+
+ Getting started
+ Area Control Panel (legacy settings)
+
+
+ Glance
+ Area Personalization, Deprecated in Windows 10, version 1809 and later
+
+
+ Graphics settings
+ Area System
+
+
+ Grayscale
+
+
+ Green week
+ Mean you don't can see green colors
+
+
+ Headset display
+ Area MixedReality, only available if the Mixed Reality Portal app is installed.
+
+
+ High contrast
+ Area EaseOfAccess
+
+
+ Holographic audio
+
+
+ Holographic Environment
+
+
+ Holographic Headset
+
+
+ Holographic Management
+
+
+ Home group
+ Area Control Panel (legacy settings)
+
+
+ ID
+ MEans The "Windows Identifier"
+
+
+ Image
+
+
+ Indexing options
+ Area Control Panel (legacy settings)
+
+
+ inetcpl.cpl
+ File name, Should not translated
+
+
+ Infrared
+ Area Control Panel (legacy settings)
+
+
+ Inking and typing
+ Area Privacy
+
+
+ Internet options
+ Area Control Panel (legacy settings)
+
+
+ intl.cpl
+ File name, Should not translated
+
+
+ Inverted colors
+
+
+ IP
+ Should not translated
+
+
+ Isolated Browsing
+
+
+ Japan IME settings
+ Area TimeAndLanguage, available if the Microsoft Japan input method editor is installed
+
+
+ joy.cpl
+ File name, Should not translated
+
+
+ Joystick properties
+ Area Control Panel (legacy settings)
+
+
+ jpnime
+ Should not translated
+
+
+ Keyboard
+ Area EaseOfAccess
+
+
+ Keypad
+
+
+ Keys
+
+
+ Language
+ Area TimeAndLanguage
+
+
+ Light color
+
+
+ Light mode
+
+
+ Location
+ Area Privacy
+
+
+ Lock screen
+ Area Personalization
+
+
+ Magnifier
+ Area EaseOfAccess
+
+
+ Mail - Microsoft Exchange or Windows Messaging
+ Area Control Panel (legacy settings)
+
+
+ main.cpl
+ File name, Should not translated
+
+
+ Manage known networks
+ Area NetworkAndInternet
+
+
+ Manage optional features
+ Area Apps
+
+
+ Messaging
+ Area Privacy
+
+
+ Metered connection
+
+
+ Microphone
+ Area Privacy
+
+
+ Microsoft Mail Post Office
+ Area Control Panel (legacy settings)
+
+
+ mlcfg32.cpl
+ File name, Should not translated
+
+
+ mmsys.cpl
+ File name, Should not translated
+
+
+ Mobile devices
+
+
+ Mobile hotspot
+ Area NetworkAndInternet
+
+
+ modem.cpl
+ File name, Should not translated
+
+
+ Mono
+
+
+ More details
+ Area Cortana
+
+
+ Motion
+ Area Privacy
+
+
+ Mouse
+ Area EaseOfAccess
+
+
+ Mouse and touchpad
+ Area Device
+
+
+ Mouse, Fonts, Keyboard, and Printers properties
+ Area Control Panel (legacy settings)
+
+
+ Mouse pointer
+ Area EaseOfAccess
+
+
+ Multimedia properties
+ Area Control Panel (legacy settings)
+
+
+ Multitasking
+ Area System
+
+
+ Narrator
+ Area EaseOfAccess
+
+
+ Navigation bar
+ Area Personalization
+
+
+ netcpl.cpl
+ File name, Should not translated
+
+
+ netsetup.cpl
+ File name, Should not translated
+
+
+ Network
+ Area NetworkAndInternet
+
+
+ Network and sharing center
+ Area Control Panel (legacy settings)
+
+
+ Network connection
+ Area Control Panel (legacy settings)
+
+
+ Network properties
+ Area Control Panel (legacy settings)
+
+
+ Network Setup Wizard
+ Area Control Panel (legacy settings)
+
+
+ Network status
+ Area NetworkAndInternet
+
+
+ NFC
+ Area NetworkAndInternet
+
+
+ NFC Transactions
+ "NFC should not translated"
+
+
+ Night light
+
+
+ Night light settings
+ Area System
+
+
+ Note
+
+
+ Only available when you have connected a mobile device to your device.
+
+
+ Only available on devices that support advanced graphics options.
+
+
+ Only available on devices that have a battery, such as a tablet.
+
+
+ Deprecated in Windows 10, version 1809 (build 17763) and later.
+
+
+ Only available if Dial is paired.
+
+
+ Only available if DirectAccess is enabled.
+
+
+ Only available on devices that support advanced display options.
+
+
+ Only present if user is enrolled in WIP.
+
+
+ Requires eyetracker hardware.
+
+
+ Available if the Microsoft Japan input method editor is installed.
+
+
+ Available if the Microsoft Pinyin input method editor is installed.
+
+
+ Available if the Microsoft Wubi input method editor is installed.
+
+
+ Only available if the Mixed Reality Portal app is installed.
+
+
+ Only available on mobile and if the enterprise has deployed a provisioning package.
+
+
+ Added in Windows 10, version 1903 (build 18362).
+
+
+ Added in Windows 10, version 2004 (build 19041).
+
+
+ Only available if "settings apps" are installed, for example, by a 3rd party.
+
+
+ Only available if touchpad hardware is present.
+
+
+ Only available if the device has a Wi-Fi adapter.
+
+
+ Device must be Windows Anywhere-capable.
+
+
+ Only available if enterprise has deployed a provisioning package.
+
+
+ Notifications
+ Area Privacy
+
+
+ Notifications and actions
+ Area System
+
+
+ Num Lock
+ Mean the "Num Lock" key
+
+
+ nwc.cpl
+ File name, Should not translated
+
+
+ odbccp32.cpl
+ File name, Should not translated
+
+
+ ODBC Data Source Administrator (32-bit)
+ Area Control Panel (legacy settings)
+
+
+ ODBC Data Source Administrator (64-bit)
+ Area Control Panel (legacy settings)
+
+
+ Offline files
+ Area Control Panel (legacy settings)
+
+
+ Offline Maps
+ Area Apps
+
+
+ Offline Maps - Download maps
+ Area Apps
+
+
+ On-Screen
+
+
+ OS
+ Means the "Operating System"
+
+
+ Other devices
+ Area Privacy
+
+
+ Other options
+ Area EaseOfAccess
+
+
+ Other users
+
+
+ Parental controls
+ Area Control Panel (legacy settings)
+
+
+ Password
+
+
+ password.cpl
+ File name, Should not translated
+
+
+ Password properties
+ Area Control Panel (legacy settings)
+
+
+ Pen and input devices
+ Area Control Panel (legacy settings)
+
+
+ Pen and touch
+ Area Control Panel (legacy settings)
+
+
+ Pen and Windows Ink
+ Area Device
+
+
+ People Near Me
+ Area Control Panel (legacy settings)
+
+
+ Performance information and tools
+ Area Control Panel (legacy settings)
+
+
+ Permissions and history
+ Area Cortana
+
+
+ Personalization (category)
+ Area Personalization
+
+
+ Phone
+ Area Phone
+
+
+ Phone and modem
+ Area Control Panel (legacy settings)
+
+
+ Phone and modem - Options
+ Area Control Panel (legacy settings)
+
+
+ Phone calls
+ Area Privacy
+
+
+ Phone - Default apps
+ Area System
+
+
+ Picture
+
+
+ Pictures
+ Area Privacy
+
+
+ Pinyin IME settings
+ Area TimeAndLanguage, available if the Microsoft Pinyin input method editor is installed
+
+
+ Pinyin IME settings - domain lexicon
+ Area TimeAndLanguage
+
+
+ Pinyin IME settings - Key configuration
+ Area TimeAndLanguage
+
+
+ Pinyin IME settings - UDP
+ Area TimeAndLanguage
+
+
+ Playing a game full screen
+ Area Gaming
+
+
+ Plugin to search for Windows settings
+
+
+ Windows Settings
+
+
+ Power and sleep
+ Area System
+
+
+ powercfg.cpl
+ File name, Should not translated
+
+
+ Power options
+ Area Control Panel (legacy settings)
+
+
+ Presentation
+
+
+ Printers
+ Area Control Panel (legacy settings)
+
+
+ Printers and scanners
+ Area Device
+
+
+ Print screen
+ Mean the "Print screen" key
+
+
+ Problem reports and solutions
+ Area Control Panel (legacy settings)
+
+
+ Processor
+
+
+ Programs and features
+ Area Control Panel (legacy settings)
+
+
+ Projecting to this PC
+ Area System
+
+
+ protanopia
+ Medical: Mean you don't can see green colors
+
+
+ Provisioning
+ Area UserAccounts, only available if enterprise has deployed a provisioning package
+
+
+ Proximity
+ Area NetworkAndInternet
+
+
+ Proxy
+ Area NetworkAndInternet
+
+
+ Quickime
+ Area TimeAndLanguage
+
+
+ Quiet moments game
+
+
+ Radios
+ Area Privacy
+
+
+ RAM
+ Means the Read-Access-Memory (typical the used to inform about the size)
+
+
+ Recognition
+
+
+ Recovery
+ Area UpdateAndSecurity
+
+
+ Red eye
+ Mean red eye effect by over-the-night flights
+
+
+ Red-green
+ Mean the weakness you can't differ between red and green colors
+
+
+ Red week
+ Mean you don't can see red colors
+
+
+ Region
+ Area TimeAndLanguage
+
+
+ Regional language
+ Area TimeAndLanguage
+
+
+ Regional settings properties
+ Area Control Panel (legacy settings)
+
+
+ Region and language
+ Area Control Panel (legacy settings)
+
+
+ Region formatting
+
+
+ RemoteApp and desktop connections
+ Area Control Panel (legacy settings)
+
+
+ Remote Desktop
+ Area System
+
+
+ Scanners and cameras
+ Area Control Panel (legacy settings)
+
+
+ schedtasks
+ File name, Should not translated
+
+
+ Scheduled
+
+
+ Scheduled tasks
+ Area Control Panel (legacy settings)
+
+
+ Screen rotation
+ Area System
+
+
+ Scroll bars
+
+
+ Scroll Lock
+ Mean the "Scroll Lock" key
+
+
+ SDNS
+ Should not translated
+
+
+ Searching Windows
+ Area Cortana
+
+
+ SecureDNS
+ Should not translated
+
+
+ Security Center
+ Area Control Panel (legacy settings)
+
+
+ Security Processor
+
+
+ Session cleanup
+ Area SurfaceHub
+
+
+ Settings home page
+ Area Home, Overview-page for all areas of settings
+
+
+ Set up a kiosk
+ Area UserAccounts
+
+
+ Shared experiences
+ Area System
+
+
+ Shortcuts
+
+
+ wifi
+ dont translate this, is a short term to find entries
+
+
+ Sign-in options
+ Area UserAccounts
+
+
+ Sign-in options - Dynamic lock
+ Area UserAccounts
+
+
+ Size
+ Size for text and symbols
+
+
+ Sound
+ Area System
+
+
+ Speech
+ Area EaseOfAccess
+
+
+ Speech recognition
+ Area Control Panel (legacy settings)
+
+
+ Speech typing
+
+
+ Start
+ Area Personalization
+
+
+ Start places
+
+
+ Startup apps
+ Area Apps
+
+
+ sticpl.cpl
+ File name, Should not translated
+
+
+ Storage
+ Area System
+
+
+ Storage policies
+ Area System
+
+
+ Storage Sense
+ Area System
+
+
+ in
+ Example: Area "System" in System settings
+
+
+ Sync center
+ Area Control Panel (legacy settings)
+
+
+ Sync your settings
+ Area UserAccounts
+
+
+ sysdm.cpl
+ File name, Should not translated
+
+
+ System
+ Area Control Panel (legacy settings)
+
+
+ System properties and Add New Hardware wizard
+ Area Control Panel (legacy settings)
+
+
+ Tab
+ Means the key "Tabulator" on the keyboard
+
+
+ Tablet mode
+ Area System
+
+
+ Tablet PC settings
+ Area Control Panel (legacy settings)
+
+
+ Talk
+
+
+ Talk to Cortana
+ Area Cortana
+
+
+ Taskbar
+ Area Personalization
+
+
+ Taskbar color
+
+
+ Tasks
+ Area Privacy
+
+
+ Team Conferencing
+ Area SurfaceHub
+
+
+ Team device management
+ Area SurfaceHub
+
+
+ Text to speech
+ Area Control Panel (legacy settings)
+
+
+ Themes
+ Area Personalization
+
+
+ themes.cpl
+ File name, Should not translated
+
+
+ timedate.cpl
+ File name, Should not translated
+
+
+ Timeline
+
+
+ Touch
+
+
+ Touch feedback
+
+
+ Touchpad
+ Area Device
+
+
+ Transparency
+
+
+ tritanopia
+ Medical: Mean you don't can see yellow and blue colors
+
+
+ Troubleshoot
+ Area UpdateAndSecurity
+
+
+ TruePlay
+ Area Gaming
+
+
+ Typing
+ Area Device
+
+
+ Uninstall
+ Area MixedReality, only available if the Mixed Reality Portal app is installed.
+
+
+ USB
+ Area Device
+
+
+ User accounts
+ Area Control Panel (legacy settings)
+
+
+ Version
+ Means The "Windows Version"
+
+
+ Video playback
+ Area Apps
+
+
+ Videos
+ Area Privacy
+
+
+ Virtual Desktops
+
+
+ Virus
+ Means the virus in computers and software
+
+
+ Voice activation
+ Area Privacy
+
+
+ Volume
+
+
+ VPN
+ Area NetworkAndInternet
+
+
+ Wallpaper
+
+
+ Warmer color
+
+
+ Welcome center
+ Area Control Panel (legacy settings)
+
+
+ Welcome screen
+ Area SurfaceHub
+
+
+ wgpocpl.cpl
+ File name, Should not translated
+
+
+ Wheel
+ Area Device
+
+
+ Wi-Fi
+ Area NetworkAndInternet, only available if Wi-Fi calling is enabled
+
+
+ Wi-Fi Calling
+ Area NetworkAndInternet, only available if Wi-Fi calling is enabled
+
+
+ Wi-Fi settings
+ "Wi-Fi" should not translated
+
+
+ Window border
+
+
+ Windows Anytime Upgrade
+ Area Control Panel (legacy settings)
+
+
+ Windows Anywhere
+ Area UserAccounts, device must be Windows Anywhere-capable
+
+
+ Windows CardSpace
+ Area Control Panel (legacy settings)
+
+
+ Windows Defender
+ Area Control Panel (legacy settings)
+
+
+ Windows Firewall
+ Area Control Panel (legacy settings)
+
+
+ Windows Hello setup - Face
+ Area UserAccounts
+
+
+ Windows Hello setup - Fingerprint
+ Area UserAccounts
+
+
+ Windows Insider Program
+ Area UpdateAndSecurity
+
+
+ Windows Mobility Center
+ Area Control Panel (legacy settings)
+
+
+ Windows search
+ Area Cortana
+
+
+ Windows Security
+ Area UpdateAndSecurity
+
+
+ Windows Update
+ Area UpdateAndSecurity
+
+
+ Windows Update - Advanced options
+ Area UpdateAndSecurity
+
+
+ Windows Update - Check for updates
+ Area UpdateAndSecurity
+
+
+ Windows Update - Restart options
+ Area UpdateAndSecurity
+
+
+ Windows Update - View optional updates
+ Area UpdateAndSecurity
+
+
+ Windows Update - View update history
+ Area UpdateAndSecurity
+
+
+ Wireless
+
+
+ Workplace
+
+
+ Workplace provisioning
+ Area UserAccounts
+
+
+ Wubi IME settings
+ Area TimeAndLanguage, available if the Microsoft Wubi input method editor is installed
+
+
+ Wubi IME settings - UDP
+ Area TimeAndLanguage
+
+
+ Xbox Networking
+ Area Gaming
+
+
+ Your info
+ Area UserAccounts
+
+
+ Zoom
+ Mean zooming of things via a magnifier
+
+
+ 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
+
+
+ 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
+
+
+ See which processes start up automatically when you start Windows
+
+
+ Tell if an RSS feed is available on a website
+
+
+ Add clocks for different time zones
+
+
+ Add a Bluetooth device
+
+
+ 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
+
+
+ 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
+
+
+ Microsoft IME Register Word (Japanese)
+
+
+ Restore your files with File History
+
+
+ Turn On-Screen keyboard on or off
+
+
+ Block or allow third-party cookies
+
+
+ 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)
+
+
+ Preview, delete, show or hide fonts
+
+
+ Microsoft Quick Settings
+
+
+ View reliability history
+
+
+ Access RemoteApp and desktops
+
+
+ Set up ODBC data sources
+
+
+ Reset Security Policies
+
+
+ Block or allow pop-ups
+
+
+ Turn autocomplete in Internet Explorer on or off
+
+
+ Microsoft Pinyin SimpleFast Options
+
+
+ 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
+
+
+ Change cursor blink rate
+
+
+ Add or remove programs
+
+
+ Create a password reset disk
+
+
+ Configure advanced user profile properties
+
+
+ Start or stop using AutoPlay for all media and devices
+
+
+ Change Automatic Maintenance settings
+
+
+ Specify single- or double-click to open
+
+
+ Select users who can use remote desktop
+
+
+ Show which programs are installed on your computer
+
+
+ Allow remote access to your computer
+
+
+ View advanced system settings
+
+
+ How to install a program
+
+
+ Change how your keyboard works
+
+
+ Automatically adjust for daylight saving time
+
+
+ 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
+
+
+ Set up ODBC data sources (64-bit)
+
+
+ Configure proxy server
+
+
+ Change your homepage
+
+
+ Group similar windows on the taskbar
+
+
+ Change Windows SideShow settings
+
+
+ Use audio description for video
+
+
+ Change workgroup name
+
+
+ Find and fix printing problems
+
+
+ Change when the computer sleeps
+
+
+ Set up a virtual private network (VPN) connection
+
+
+ Accommodate learning abilities
+
+
+ Set up a dial-up connection
+
+
+ Set up a connection or network
+
+
+ How to change your Windows password
+
+
+ Make it easier to see the mouse pointer
+
+
+ Set up iSCSI initiator
+
+
+ Accommodate low vision
+
+
+ Manage offline files
+
+
+ Review your computer's status and resolve issues
+
+
+ Microsoft ChangJie Settings
+
+
+ Replace sounds with visual cues
+
+
+ Change temporary Internet file settings
+
+
+ Connect to the Internet
+
+
+ Find and fix audio playback problems
+
+
+ Change the mouse pointer display or speed
+
+
+ Back up your recovery key
+
+
+ Save backup copies of your files with File History
+
+
+ View current accessibility settings
+
+
+ Change tablet pen settings
+
+
+ Change how your mouse works
+
+
+ Show how much RAM is on this computer
+
+
+ Edit power plan
+
+
+ Adjust system volume
+
+
+ Defragment and optimise your drives
+
+
+ Set up ODBC data sources (32-bit)
+
+
+ Change Font Settings
+
+
+ Magnify portions of the screen using Magnifier
+
+
+ Change the file type associated with a file extension
+
+
+ View event logs
+
+
+ Manage Windows Credentials
+
+
+ Set up a microphone
+
+
+ Change how the mouse pointer looks
+
+
+ Change power-saving settings
+
+
+ Optimise for blindness
+
+
+
+
+
+
+ Turn Windows features on or off
+
+
+ Show which operating system your computer is running
+
+
+ View local services
+
+
+ Manage Work Folders
+
+
+ Encrypt your offline files
+
+
+ Train the computer to recognise your voice
+
+
+ Advanced printer setup
+
+
+ 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
+
+
+ Adjust the appearance and performance of Windows
+
+
+ Settings for Microsoft IME (Japanese)
+
+
+ Invite someone to connect to your PC and help you, or offer to help someone else
+
+
+ Run programs made for previous versions of Windows
+
+
+ Choose the order of how your screen rotates
+
+
+ Change how Windows searches
+
+
+ Set flicks to perform certain tasks
+
+
+ Change account type
+
+
+ Change screen saver
+
+
+ Change User Account Control settings
+
+
+ Turn on easy access keys
+
+
+ Identify and repair network problems
+
+
+ Find and fix networking and connection problems
+
+
+ Play CDs or other media automatically
+
+
+ View basic information about your computer
+
+
+ Choose how you open links
+
+
+ Allow Remote Assistance invitations to be sent from this computer
+
+
+ Task Manager
+
+
+ Turn flicks on or off
+
+
+ Add a language
+
+
+ View network status and tasks
+
+
+ Turn Magnifier on or off
+
+
+ See the name of this computer
+
+
+ View network connections
+
+
+ Perform recommended maintenance tasks automatically
+
+
+ Manage disk space used by your offline files
+
+
+ Turn High Contrast on or off
+
+
+ Change the way time is displayed
+
+
+ Change how web pages are displayed in tabs
+
+
+ Change the way dates and lists are displayed
+
+
+ Manage audio devices
+
+
+ Change security settings
+
+
+ Check security status
+
+
+ Delete cookies or temporary files
+
+
+ Specify which hand you write with
+
+
+ Change touch input settings
+
+
+ How to change the size of virtual memory
+
+
+ Hear text read aloud with Narrator
+
+
+ Set up USB game controllers
+
+
+ Show which domain your computer is on
+
+
+ View all problem reports
+
+
+ 16-Bit Application Support
+
+
+ Set up dialling rules
+
+
+ Enable or disable session cookies
+
+
+ Give administrative rights to a domain user
+
+
+ Choose when to turn off display
+
+
+ Move the pointer with the keypad using MouseKeys
+
+
+ Change Windows SideShow-compatible device settings
+
+
+ Adjust commonly used mobility settings
+
+
+ Change text-to-speech settings
+
+
+ Set the time and date
+
+
+ Change location settings
+
+
+ Change mouse settings
+
+
+ Manage Storage Spaces
+
+
+ Show or hide file extensions
+
+
+ Allow an app through Windows Firewall
+
+
+ Change system sounds
+
+
+ Adjust ClearType text
+
+
+ Turn screen saver on or off
+
+
+ Find and fix windows update problems
+
+
+ Change Bluetooth settings
+
+
+ Connect to a network
+
+
+ Change the search provider in Internet Explorer
+
+
+ Join a domain
+
+
+ Add a device
+
+
+ Find and fix problems with Windows Search
+
+
+ Choose a power plan
+
+
+ Change how the mouse pointer looks when it’s moving
+
+
+ Uninstall a program
+
+
+ Create and format hard disk partitions
+
+
+ Change date, time or number formats
+
+
+ Change PC wake-up settings
+
+
+ Manage network passwords
+
+
+ Change input methods
+
+
+ Manage advanced sharing settings
+
+
+ Change battery settings
+
+
+ Rename this computer
+
+
+ Lock or unlock the taskbar
+
+
+ Manage Web Credentials
+
+
+ Change the time zone
+
+
+ Start speech recognition
+
+
+ View installed updates
+
+
+ What's happened to the Quick Launch toolbar?
+
+
+ Change search options for files and folders
+
+
+ Adjust settings before giving a presentation
+
+
+ Scan a document or picture
+
+
+ Change the way measurements are displayed
+
+
+ Press key combinations one at a time
+
+
+ Restore data, files or computer from backup (Windows 7)
+
+
+ Set your default programs
+
+
+ Set up a broadband connection
+
+
+ Calibrate the screen for pen or touch input
+
+
+ Manage user certificates
+
+
+ Schedule tasks
+
+
+ Ignore repeated keystrokes using FilterKeys
+
+
+ Find and fix bluescreen problems
+
+
+ Hear a tone when keys are pressed
+
+
+ Delete browsing history
+
+
+ Change what the power buttons do
+
+
+ Create standard user account
+
+
+ Take speech tutorials
+
+
+ View system resource usage in Task Manager
+
+
+ Create an account
+
+
+ Get more features with a new edition of Windows
+
+
+ Control Panel
+
+
+ TaskLink
+
+
+ Unknown
+
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.tr-TR.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.tr-TR.resx
index 49c4b7839..5e83a783a 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.tr-TR.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.tr-TR.resx
@@ -254,7 +254,7 @@
Saat ve Bölge
- Control Panel
+ Denetim MasasıCortana
@@ -468,7 +468,7 @@
Area Privacy
- Control Panel
+ Denetim MasasıType of the setting is a "(legacy) Control Panel setting"
@@ -627,7 +627,7 @@
Area NetworkAndInternet
- Exploit Protection
+ Exploit KorumasıEk Özellikler
@@ -1206,7 +1206,7 @@
Windows ayarlarını aramak için eklenti
- Windows Settings
+ Windows AyarlarıGüç ve uyku
@@ -1450,7 +1450,7 @@
Area System
- in
+ içindeExample: Area "System" in System settings
@@ -1671,7 +1671,7 @@
Area UpdateAndSecurity
- Windows Mobility Center
+ Windows Mobilite MerkeziArea Control Panel (legacy settings)
@@ -1737,208 +1737,208 @@
Mean zooming of things via a magnifier
- Change device installation settings
+ Cihaz kurulum ayarlarını değiştir
- Turn off background images
+ Arka plan görsellerini kapat
- Navigation properties
+ Navigasyon özellikleriMedia streaming options
- Make a file type always open in a specific program
+ Bir dosya türünün her zaman belirli bir programda açılmasını sağla
- Change the Narrator’s voice
+ Anlatıcının sesini değiştir
- Find and fix keyboard problems
+ Klavye sorunlarını bul ve düzelt
- Use screen reader
+ Ekran okuyucu kullanShow which workgroup this computer is on
- Change mouse wheel settings
+ Fare tekerleği ayarlarını değiştir
- Manage computer certificates
+ Bilgisayar sertifikalarını yönet
- Find and fix problems
+ Sorunları bul ve düzeltChange settings for content received using Tap and send
- Change default settings for media or devices
+ Medya veya cihazlar için varsayılan ayarları değiştirPrint the speech reference card
- Calibrate display colour
+ Ekran rengini kalibre et
- Manage file encryption certificates
+ Dosya şifreleme sertifikalarını yönet
- View recent messages about your computer
+ Bilgisayarınızla ilgili son mesajları görüntüleyin
- Give other users access to this computer
+ Diğer kullanıcılara bu bilgisayara erişim izni ver
- Show hidden files and folders
+ Gizli dosya ve klasörleri göster
- Change Windows To Go start-up options
+ Windows To Go başlatma seçeneklerini değiştir
- See which processes start up automatically when you start Windows
+ Windows'u başlattığınızda hangi işlemlerin otomatik olarak başladığını görün
- Tell if an RSS feed is available on a website
+ Bir RSS beslemesinin bir web sitesinde mevcut olup olmadığını söyle
- Add clocks for different time zones
+ Farklı zaman dilimleri için saatler ekleyin
- Add a Bluetooth device
+ Bir Bluetooth cihazı ekle
- Customise the mouse buttons
+ Fare düğmelerini özelleştirSet tablet buttons to perform certain tasks
- View installed fonts
+ Yüklü yazı tiplerini görüntüleChange the way currency is displayed
- Edit group policy
+ Grup ilkesini düzenle
- Manage browser add-ons
+ Tarayıcı eklentilerini yönet
- Check processor speed
+ İşlemci hızını kontrol et
- Check firewall status
+ Güvenlik duvarı durumunu kontrol et
- Send or receive a file
+ Dosya gönder veya al
- Add or remove user accounts
+ Kullanıcı hesapları ekle veya kaldır
- Edit the system environment variables
+ Sistem ortam değişkenlerini düzenle
- Manage BitLocker
+ BitLocker'ı Yönet
- Auto-hide the taskbar
+ Görev çubuğunu otomatik gizle
- Change sound card settings
+ Ses kartı ayalarını değiştir
- Make changes to accounts
+ Hesaplarda değişiklik yap
- Edit local users and groups
+ Yerel kullanıcıları ve grupları düzenle
- View network computers and devices
+ Ağ bilgisayarlarını ve cihazlarını görüntüle
- Install a program from the network
+ İnternetten bir program yükle
- View scanners and cameras
+ Tarayıcıları ve kameraları görüntüle
- Microsoft IME Register Word (Japanese)
+ Microsoft IME Register Word (Japonca)
- Restore your files with File History
+ Dosya Geçmişi ile dosyalarınızı geri yükleyin
- Turn On-Screen keyboard on or off
+ Ekran klavyesini aç veya kapat
- Block or allow third-party cookies
+ Üçüncü taraf çerezlerini engelle veya izin ver
- Find and fix audio recording problems
+ Ses kayıt sorunlarını bul ve düzelt
- Create a recovery drive
+ Bir kurtarma sürücüsü oluştur
- Microsoft New Phonetic Settings
+ Microsoft Fonetik İçin Yeni Ayarlar
- Generate a system health report
+ Sistem sağlık raporu oluştur
- Fix problems with your computer
+ Bilgisayarla ilgili sorunları gider
- Back up and Restore (Windows 7)
+ Yedekleme ve Geri Yükleme (Windows 7)
- Preview, delete, show or hide fonts
+ Yazı tiplerini önizleme, silme, gösterme veya gizleme
- Microsoft Quick Settings
+ Microsoft Hızlı Ayarlar
- View reliability history
+ Güvenilirlik geçmişini görüntüleAccess RemoteApp and desktops
- Set up ODBC data sources
+ ODBC veri kaynaklarını ayarla
- Reset Security Policies
+ Güvenlik Politikalarını Sıfırla
- Block or allow pop-ups
+ Pop-up'ları engelle veya izin ver
- Turn autocomplete in Internet Explorer on or off
+ Internet Explorer'da otomatik doldurmayı aç veya kapat
- Microsoft Pinyin SimpleFast Options
+ Microsoft Pinyin SimpleFast SeçenekleriChange what closing the lid does
- Turn off unnecessary animations
+ Gereksiz animasyonları kapat
- Create a restore point
+ Geri yükleme noktası oluşturTurn off automatic window arrangement
- Troubleshooting History
+ Sorun Giderme GeçmişiDiagnose your computer's memory problems
@@ -1947,13 +1947,13 @@
View recommended actions to keep Windows running smoothly
- Change cursor blink rate
+ İmleç yanıp sönme hızını değiştir
- Add or remove programs
+ Program ekle veya kaldır
- Create a password reset disk
+ Parola sıfırlama diski oluşturConfigure advanced user profile properties
@@ -1974,16 +1974,16 @@
Show which programs are installed on your computer
- Allow remote access to your computer
+ Bilgisayarınıza uzaktan erişime izin ver
- View advanced system settings
+ Gelişmiş sistem ayarlarını görüntüle
- How to install a program
+ Bir program nasıl kurulur
- Change how your keyboard works
+ Klavyenin çalışma şeklini değiştirAutomatically adjust for daylight saving time
@@ -1992,124 +1992,124 @@
Change the order of Windows SideShow gadgets
- Check keyboard status
+ Klavye durumunu kontrol etControl the computer without the mouse or keyboard
- Change or remove a program
+ Bir programı değiştir veya kaldırChange multi-touch gesture settings
- Set up ODBC data sources (64-bit)
+ ODBC veri kaynaklarını ayarla (64-bit)
- Configure proxy server
+ Proxy sunucusunu yapılandır
- Change your homepage
+ Ana sayfayı değiştir
- Group similar windows on the taskbar
+ Görev çubuğunda benzer pencereleri gruplamaChange Windows SideShow settings
- Use audio description for video
+ Video için sesli açıklama kullan
- Change workgroup name
+ Çalışma grubu adını değiştir
- Find and fix printing problems
+ Yazıcı sorunlarını bul ve düzelt
- Change when the computer sleeps
+ Bilgisayarın uyku zamanını değiştir
- Set up a virtual private network (VPN) connection
+ Bir sanal özel ağ (VPN) bağlantısı kurAccommodate learning abilities
- Set up a dial-up connection
+ Bir çevirmeli bağlantı kur
- Set up a connection or network
+ Bir bağlantı veya ağ kur
- How to change your Windows password
+ Windows parolanızı nasıl değiştirirsiniz
- Make it easier to see the mouse pointer
+ Fare imlecini görmeyi kolaylaştırın
- Set up iSCSI initiator
+ iSCSI başlatıcıyı ayarlaAccommodate low vision
- Manage offline files
+ Çevrim dışı dosyaları yönetReview your computer's status and resolve issues
- Microsoft ChangJie Settings
+ Microsoft ChangJie AyarlarıReplace sounds with visual cues
- Change temporary Internet file settings
+ Geçici İnternet dosyası ayarlarını değiştir
- Connect to the Internet
+ İnternete bağlan
- Find and fix audio playback problems
+ Ses oynatma sorunlarını bul ve düzelt
- Change the mouse pointer display or speed
+ Fare imleci görüntüsünü veya hızını değiştir
- Back up your recovery key
+ Kurtarma anahtarınızı yedekleyinSave backup copies of your files with File History
- View current accessibility settings
+ Geçerli erişilebilirlik ayarlarını görüntüle
- Change tablet pen settings
+ Tablet kalemi ayarlarını değiştir
- Change how your mouse works
+ Farenin çalışma şeklini değiştir
- Show how much RAM is on this computer
+ Bu bilgisayarda ne kadar RAM olduğunu göster
- Edit power plan
+ Güç planını düzenle
- Adjust system volume
+ Sistem ses seviyesini ayarlaDefragment and optimise your drives
- Set up ODBC data sources (32-bit)
+ ODBC veri kaynaklarını ayarla (32-bit)
- Change Font Settings
+ Yazı Tipi Ayarlarını DeğiştirMagnify portions of the screen using Magnifier
@@ -2118,59 +2118,59 @@
Change the file type associated with a file extension
- View event logs
+ Olay günlüklerini görüntüleManage Windows Credentials
- Set up a microphone
+ Bir mikrofon ayarla
- Change how the mouse pointer looks
+ Fare işaretçisinin görünümünü değiştir
- Change power-saving settings
+ Güç tasarrufu ayarlarını değiştir
- Optimise for blindness
+ Körlük için optimize et
- Turn Windows features on or off
+ Windows özelliklerini aç veya kapat
- Show which operating system your computer is running
+ Bilgisayarınızın hangi işletim sistemini çalıştırdığını gösterin
- View local services
+ Yerel hizmetleri görüntüle
- Manage Work Folders
+ Çalışma Klasörlerini Yönet
- Encrypt your offline files
+ Çevrimdışı dosyalarınızı şifreleyin
- Train the computer to recognise your voice
+ Bilgisayarı sesinizi tanıması için eğitin
- Advanced printer setup
+ Gelişmiş yazıcı kurulumu
- Change default printer
+ Varsayılan yazıcıyı değiştir
- Edit environment variables for your account
+ Hesap için ortam değişkenlerini düzenle
- Optimise visual display
+ Görsel ekranı optimize et
- Change mouse click settings
+ Fare tıklama ayarlarını değiştirChange advanced colour management settings for displays, scanners and printers
@@ -2179,145 +2179,145 @@
Let Windows suggest Ease of Access settings
- Clear disk space by deleting unnecessary files
+ Gereksiz dosyaları silerek disk alanını temizle
- View devices and printers
+ Cihazları ve yazıcıları görüntüle
- Private Character Editor
+ Özel Karakter DüzenleyiciRecord steps to reproduce a problem
- Adjust the appearance and performance of Windows
+ Windows'un görünümünü ve performansını ayarla
- Settings for Microsoft IME (Japanese)
+ Microsoft IME için ayarlar (Japonca)
- Invite someone to connect to your PC and help you, or offer to help someone else
+ Bilgisayarınıza bağlanıp size yardım etmesi için birini davet edin veya başka birine yardım etmeyi teklif edin
- Run programs made for previous versions of Windows
+ Windows'un önceki sürümleri için hazırlanmış programları çalıştırma
- Choose the order of how your screen rotates
+ Ekranınızın dönme sırasını seçin
- Change how Windows searches
+ Windows'un arama şeklini değiştirSet flicks to perform certain tasks
- Change account type
+ Hesap türünü değiştir
- Change screen saver
+ Ekran koruyucuyu değiştir
- Change User Account Control settings
+ Kullanıcı Hesabı Denetimi ayarlarını değiştir
- Turn on easy access keys
+ Kolay erişim tuşlarını aç
- Identify and repair network problems
+ Ağ sorunlarını belirle ve onar
- Find and fix networking and connection problems
+ Ağ ve bağlantı sorunlarını bul ve düzelt
- Play CDs or other media automatically
+ CD'leri veya diğer medyaları otomatik olarak çal
- View basic information about your computer
+ Bilgisayarınız hakkında temel bilgileri görüntüleyin
- Choose how you open links
+ Bağlantıları nasıl açacağınızı seçinAllow Remote Assistance invitations to be sent from this computer
- Task Manager
+ Görev YöneticisiTurn flicks on or off
- Add a language
+ Bir dil ekleyin
- View network status and tasks
+ Ağ durumunu ve görevlerini görüntüleTurn Magnifier on or off
- See the name of this computer
+ Bu bilgisayarın adına bakın
- View network connections
+ Ağ bağlantılarını görüntüle
- Perform recommended maintenance tasks automatically
+ Önerilen bakım görevlerini otomatik olarak gerçekleştirin
- Manage disk space used by your offline files
+ Çevrimdışı dosyalarınız tarafından kullanılan disk alanını yönetin
- Turn High Contrast on or off
+ Yüksek Kontrast'ı aç veya kapat
- Change the way time is displayed
+ Saatin görüntülenme şeklini değiştirme
- Change how web pages are displayed in tabs
+ Web sayfalarının sekmelerde görüntülenme şeklini değiştirme
- Change the way dates and lists are displayed
+ Tarihlerin ve listelerin görüntülenme şeklini değiştirme
- Manage audio devices
+ Ses cihazlarını yönet
- Change security settings
+ Güvenlik ayarlarını değiştir
- Check security status
+ Güvenlik durumunu kontrol et
- Delete cookies or temporary files
+ Çerezleri veya geçici dosyaları sil
- Specify which hand you write with
+ Hangi elinizle yazdığınızı belirtin
- Change touch input settings
+ Dokunmatik giriş ayarlarını değiştir
- How to change the size of virtual memory
+ Sanal bellek boyutu nasıl değiştirilir
- Hear text read aloud with Narrator
+ Anlatıcı ile yüksek sesle okunan metni dinleyin
- Set up USB game controllers
+ USB oyun kumandalarını ayarla
- Show which domain your computer is on
+ Bilgisayarınızın hangi etki alanında olduğunu gösterme
- View all problem reports
+ Tüm sorun raporlarını görüntüle
- 16-Bit Application Support
+ 16-Bit Uygulama Desteği
- Set up dialling rules
+ Arama kurallarını ayarlaEnable or disable session cookies
@@ -2338,177 +2338,177 @@
Adjust commonly used mobility settings
- Change text-to-speech settings
+ Metinden sese ayarlarını değiştir
- Set the time and date
+ Saat ve tarihi ayarla
- Change location settings
+ Konum ayarlarını değiştir
- Change mouse settings
+ Fare ayarlarını değiştir
- Manage Storage Spaces
+ Depolama Alanlarını Yönet
- Show or hide file extensions
+ Dosya uzantılarını göster/gizle
- Allow an app through Windows Firewall
+ Windows Güvenlik Duvarı üzerinden bir uygulamaya izin ver
- Change system sounds
+ Sistem seslerini değiştirAdjust ClearType text
- Turn screen saver on or off
+ Ekran koruyucuyu aç/kapat
- Find and fix windows update problems
+ Windows güncelleme sorunlarını bul ve düzelt
- Change Bluetooth settings
+ Bluetooth ayarlarını değiştir
- Connect to a network
+ Bir ağa bağlan
- Change the search provider in Internet Explorer
+ Internet Explorer'da arama sağlayıcısını değiştir
- Join a domain
+ Bir etki alanına katılın
- Add a device
+ Bir cihaz ekle
- Find and fix problems with Windows Search
+ Windows Arama ile ilgili sorunları bul ve düzelt
- Choose a power plan
+ Bir güç planı seçChange how the mouse pointer looks when it’s moving
- Uninstall a program
+ Bir program kaldır
- Create and format hard disk partitions
+ Sabit disk bölümleri oluştur ve biçimlendir
- Change date, time or number formats
+ Tarih, saat veya sayı biçimlerini değiştir
- Change PC wake-up settings
+ PC uyandırma ayarlarını değiştir
- Manage network passwords
+ Ağ parolalarını yönet
- Change input methods
+ Giriş yöntemlerini değiştir
- Manage advanced sharing settings
+ Gelişmiş paylaşım ayarlarını yönet
- Change battery settings
+ Pil ayarlarını değiştir
- Rename this computer
+ Bilgisayarı yeniden adlandır
- Lock or unlock the taskbar
+ Görev çubuğunu kilitle/kilidi aç
- Manage Web Credentials
+ Web Kimlik Bilgilerini Yönet
- Change the time zone
+ Saat dilimini değiştir
- Start speech recognition
+ Konuşma tanımayı başlat
- View installed updates
+ Yüklü güncellemeleri görüntüle
- What's happened to the Quick Launch toolbar?
+ Hızlı Başlat araç çubuğuna ne oldu?
- Change search options for files and folders
+ Dosya ve klasörler için arama seçeneklerini değiştirAdjust settings before giving a presentation
- Scan a document or picture
+ Bir belgeyi veya resmi tara
- Change the way measurements are displayed
+ Ölçümlerin görüntülenme şeklini değiştirme
- Press key combinations one at a time
+ Tuş kombinasyonlarına teker teker basın
- Restore data, files or computer from backup (Windows 7)
+ Verileri, dosyaları veya bilgisayarı yedekten geri yükleme (Windows 7)
- Set your default programs
+ Varsayılan programlarınızı ayarlayın
- Set up a broadband connection
+ Geniş bant bağlantısı kurCalibrate the screen for pen or touch input
- Manage user certificates
+ Kullanıcı sertifikalarını yönet
- Schedule tasks
+ Görevleri planlaIgnore repeated keystrokes using FilterKeys
- Find and fix bluescreen problems
+ Mavi ekran sorunlarını bul ve düzelt
- Hear a tone when keys are pressed
+ Tuşlara basıldığında bir ses duy
- Delete browsing history
+ Tarama geçmişini sil
- Change what the power buttons do
+ Güç düğmelerinin ne yaptığını değiştir
- Create standard user account
+ Standart kullanıcı hesabı oluştur
- Take speech tutorials
+ Konuşma eğitimleri al
- View system resource usage in Task Manager
+ Görev Yöneticisi'nde sistem kaynağı kullanımını görüntüle
- Create an account
+ Bir hesap oluştur
- Get more features with a new edition of Windows
+ Windows'un yeni sürümüyle daha fazla özellik edinin
- Control Panel
+ Denetim MasasıTaskLink
- Unknown
+ Bilinmiyor
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.uk-UA.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.uk-UA.resx
index 9d801e0d4..c30e6dacc 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.uk-UA.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.uk-UA.resx
@@ -214,7 +214,7 @@
Short/modern name for application
- Додатки та функції
+ Застосунки та функціїArea Apps
@@ -222,7 +222,7 @@
Type of the setting is a "Modern Windows settings". We use the same term as used in start menu search at the moment.
- Додатки для веб-сайтів
+ Застосунки для вебсайтівArea Apps
@@ -248,7 +248,7 @@
Зовнішній вигляд та персоналізація
- Додатки
+ ЗастосункиЧас і регіон
@@ -515,23 +515,23 @@
Area TimeAndLanguage
- Програми за замовчуванням
+ Типові програмиArea Apps
- Камера за замовчуванням
+ Типова камераArea Device
- Розташування за замовчуванням
+ Типове розташуванняArea Control Panel (legacy settings)
- Програми за замовчуванням
+ Типові програмиArea Control Panel (legacy settings)
- Місця збереження за замовчуванням
+ Типові місця збереженняArea System
@@ -611,7 +611,7 @@
Area Privacy
- Облікові записи електронної пошти та додатків
+ Облікові записи пошти та застосунківArea UserAccounts
@@ -1028,7 +1028,7 @@
Доступно, якщо встановлено редактор методів введення Microsoft Wubi.
- Доступно лише якщо встановлено додаток Портал змішаної реальності.
+ Доступно лише якщо встановлено застосунок «Портал змішаної реальності».Доступно лише на мобільних пристроях або якщо на підприємстві розгорнуто пакет забезпечення.
@@ -1172,7 +1172,7 @@
Area Privacy
- Телефон - Програми за замовчуванням
+ Телефон: типові програмиArea System
@@ -1687,7 +1687,7 @@
Area UpdateAndSecurity
- Оновлення Windows - Додаткові параметри
+ Оновлення Windows: додаткові параметриArea UpdateAndSecurity
@@ -1699,7 +1699,7 @@
Area UpdateAndSecurity
- Оновлення Windows - Перегляд додаткових оновлень
+ Оновлення Windows: перегляд додаткових оновленьArea UpdateAndSecurity
@@ -1776,7 +1776,7 @@
Зміна налаштувань для вмісту, отриманого за допомогою функції "Доторкнутись і відправити"
- Зміна налаштувань за замовчуванням для носіїв або пристроїв
+ Зміна типових налаштувань для носіїв або пристроївРоздрукувати мовленнєву довідкову картку
@@ -1803,7 +1803,7 @@
Переглянути, які процеси запускаються автоматично під час запуску Windows
- Визначити, чи є на веб-сайті RSS-канал
+ Визначити, чи є на вебсайті RSS-каналДодати годинник для різних часових поясів
@@ -2161,7 +2161,7 @@
Розширене налаштування принтера
- Змінити принтер за замовчуванням
+ Змінити типовий принтерРедагування змінних середовища для вашого облікового запису
@@ -2275,7 +2275,7 @@
Змінити спосіб відображення часу
- Зміна способу відображення веб-сторінок у вкладках
+ Зміна способу відображення вебсторінок у вкладкахЗміна способу відображення дат і списків
@@ -2314,7 +2314,7 @@
Переглянути всі звіти про проблеми
- Підтримка 16-бітних додатків
+ Підтримка 16-бітних застосунківНалаштуйте правила набору
@@ -2425,7 +2425,7 @@
Блокування або розблокування панелі завдань
- Керування веб-обліковими даними
+ Керування вебобліковими данимиЗміна часового поясу
@@ -2458,7 +2458,7 @@
Відновлення даних, файлів або комп'ютера з резервної копії (Windows 7)
- Налаштування програм за замовчуванням
+ Налаштування типових програмНалаштування широкосмугового з'єднання
From d4a6ff0acfc73bae76010b5e98cb50369dd628da Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 31 Aug 2025 20:33:41 +1000
Subject: [PATCH 1713/1798] updated readme
---
README.md | 23 +++++++++++++++--------
1 file changed, 15 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index f3be5190c..7cba1027d 100644
--- a/README.md
+++ b/README.md
@@ -117,19 +117,24 @@ Or download the [early access version](https://github.com/Flow-Launcher/Prerelea
- Save file or folder locations for quick access.
-#### Drag & Drop
-
-
-
-- Drag a file/folder to File Explorer, or even Discord.
-- Copy/move behavior can be change via Ctrl or Shift, and the operation is displayed on the mouse cursor.
-
### Windows & Control Panel Settings
- Search for Windows & Control Panel settings.
+### Dialog Jump
+
+- Use Alt+G to quickly jump the Open/Save As dialog window path to the path of the active file manager.
+- Search a file/folder and quickly jump to its path in the Open/Save As dialog window.
+
+### Drag & Drop
+
+
+
+- Drag a file/folder to File Explorer, or even Discord.
+- Copy/move behavior can be change via Ctrl or Shift, and the operation is displayed on the mouse cursor.
+
### Priority
@@ -157,7 +162,7 @@ Or download the [early access version](https://github.com/Flow-Launcher/Prerelea
- There are various themes and you also can make your own.
-#### Date & Time Display In Search Window
+### Date & Time Display In Search Window
@@ -185,6 +190,7 @@ Or download the [early access version](https://github.com/Flow-Launcher/Prerelea