Merge branch 'dev' into last_history_show_result_icon

This commit is contained in:
Jeremy 2026-01-01 17:01:17 +11:00
commit 2e8bb357fc
113 changed files with 1147 additions and 755 deletions

View file

@ -10,7 +10,7 @@ jobs:
runs-on: windows-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: Setup .NET
uses: actions/setup-dotnet@v5
with:

View file

@ -20,7 +20,7 @@ jobs:
NUGET_CERT_REVOCATION_MODE: offline
BUILD_NUMBER: ${{ github.run_number }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: Set Flow.Launcher.csproj version
id: update
uses: vers-one/dotnet-project-version-updater@v1.7
@ -54,28 +54,28 @@ jobs:
shell: powershell
run: .\Scripts\post_build.ps1
- name: Upload Plugin Nupkg
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: Plugin nupkg
path: |
Output\Release\Flow.Launcher.Plugin.*.nupkg
compression-level: 0
- name: Upload Setup
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: Flow Installer
path: |
Output\Packages\Flow-Launcher-*.exe
compression-level: 0
- name: Upload Portable Version
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: Portable Version
path: |
Output\Packages\Flow-Launcher-Portable.zip
compression-level: 0
- name: Upload Full Nupkg
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: Full nupkg
path: |
@ -83,7 +83,7 @@ jobs:
compression-level: 0
- name: Upload Release Information
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: RELEASES
path: |

View file

@ -14,4 +14,4 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Assign PR to creator
uses: toshimaru/auto-author-assign@v2.1.1
uses: toshimaru/auto-author-assign@v3.0.1

View file

@ -11,7 +11,7 @@ jobs:
update-pr:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:

View file

@ -26,9 +26,11 @@ namespace Flow.Launcher.Core.ExternalPlugins
public static async Task<bool> UpdateManifestAsync(bool usePrimaryUrlOnly = false, CancellationToken token = default)
{
bool lockAcquired = false;
try
{
await manifestUpdateLock.WaitAsync(token).ConfigureAwait(false);
lockAcquired = true;
if (UserPlugins == null || usePrimaryUrlOnly || DateTime.Now.Subtract(lastFetchedAt) >= fetchTimeout)
{
@ -54,13 +56,18 @@ namespace Flow.Launcher.Core.ExternalPlugins
return true;
}
}
catch (OperationCanceledException)
{
// Ignored
}
catch (Exception e)
{
PublicApi.Instance.LogException(ClassName, "Http request failed", e);
}
finally
{
manifestUpdateLock.Release();
// Only release the lock if it was acquired
if (lockAcquired) manifestUpdateLock.Release();
}
return false;

View file

@ -100,11 +100,11 @@ namespace Flow.Launcher.Core.Plugin
RPC = new JsonRpc(handler, new JsonRPCPublicAPI(Context.API));
RPC.AddLocalRpcMethod("UpdateResults", new Action<string, JsonRPCQueryResponseModel>((rawQuery, response) =>
RPC.AddLocalRpcMethod("UpdateResults", new Action<string, JsonRPCQueryResponseModel>((trimmedQuery, response) =>
{
var results = ParseResults(response);
ResultsUpdated?.Invoke(this,
new ResultUpdatedEventArgs { Query = new Query() { RawQuery = rawQuery }, Results = results });
new ResultUpdatedEventArgs { Query = new Query() { TrimmedQuery = trimmedQuery }, Results = results });
}));
RPC.SynchronizationContext = null;
RPC.StartListening();

View file

@ -401,7 +401,7 @@ namespace Flow.Launcher.Core.Plugin
{
Title = Localize.pluginStillInitializing(metadata.Name),
SubTitle = Localize.pluginStillInitializingSubtitle(),
AutoCompleteText = query.RawQuery,
AutoCompleteText = query.TrimmedQuery,
IcoPath = metadata.IcoPath,
PluginDirectory = metadata.PluginDirectory,
ActionKeywordAssigned = query.ActionKeyword,
@ -443,7 +443,7 @@ namespace Flow.Launcher.Core.Plugin
{
Title = Localize.pluginFailedToRespond(metadata.Name),
SubTitle = Localize.pluginFailedToRespondSubtitle(),
AutoCompleteText = query.RawQuery,
AutoCompleteText = query.TrimmedQuery,
IcoPath = Constant.ErrorIcon,
PluginDirectory = metadata.PluginDirectory,
ActionKeywordAssigned = query.ActionKeyword,
@ -467,7 +467,7 @@ namespace Flow.Launcher.Core.Plugin
{
Title = Localize.pluginStillInitializing(metadata.Name),
SubTitle = Localize.pluginStillInitializingSubtitle(),
AutoCompleteText = query.RawQuery,
AutoCompleteText = query.TrimmedQuery,
IcoPath = metadata.IcoPath,
PluginDirectory = metadata.PluginDirectory,
ActionKeywordAssigned = query.ActionKeyword,

View file

@ -6,15 +6,16 @@ namespace Flow.Launcher.Core.Plugin
{
public static class QueryBuilder
{
public static Query Build(string text, Dictionary<string, PluginPair> nonGlobalPlugins)
public static Query Build(string originalQuery, string trimmedQuery, Dictionary<string, PluginPair> nonGlobalPlugins)
{
// home query
if (string.IsNullOrEmpty(text))
if (string.IsNullOrEmpty(trimmedQuery))
{
return new Query()
{
Search = string.Empty,
RawQuery = string.Empty,
OriginalQuery = string.Empty,
TrimmedQuery = string.Empty,
SearchTerms = Array.Empty<string>(),
ActionKeyword = string.Empty,
IsHomeQuery = true
@ -22,14 +23,13 @@ namespace Flow.Launcher.Core.Plugin
}
// replace multiple white spaces with one white space
var terms = text.Split(Query.TermSeparator, StringSplitOptions.RemoveEmptyEntries);
var terms = trimmedQuery.Split(Query.TermSeparator, StringSplitOptions.RemoveEmptyEntries);
if (terms.Length == 0)
{
// nothing was typed
return null;
}
var rawQuery = text;
string actionKeyword, search;
string possibleActionKeyword = terms[0];
string[] searchTerms;
@ -38,21 +38,22 @@ namespace Flow.Launcher.Core.Plugin
{
// use non global plugin for query
actionKeyword = possibleActionKeyword;
search = terms.Length > 1 ? rawQuery[(actionKeyword.Length + 1)..].TrimStart() : string.Empty;
search = terms.Length > 1 ? trimmedQuery[(actionKeyword.Length + 1)..].TrimStart() : string.Empty;
searchTerms = terms[1..];
}
else
{
// non action keyword
actionKeyword = string.Empty;
search = rawQuery.TrimStart();
search = trimmedQuery.TrimStart();
searchTerms = terms;
}
return new Query()
{
Search = search,
RawQuery = rawQuery,
OriginalQuery = originalQuery,
TrimmedQuery = trimmedQuery,
SearchTerms = searchTerms,
ActionKeyword = actionKeyword,
IsHomeQuery = false

View file

@ -496,6 +496,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
await _foregroundChangeLock.WaitAsync();
try
{
@ -647,6 +649,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
// If the dialog window is moved, update the Dialog Jump window position
var dialogWindowExist = false;
lock (_dialogWindowLock)
@ -672,6 +676,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
// If the dialog window is moved or resized, update the Dialog Jump window position
if (_dragMoveTimer != null)
{
@ -697,6 +703,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
// If the dialog window is destroyed, set _dialogWindowHandle to null
var dialogWindowExist = false;
lock (_dialogWindowLock)
@ -728,6 +736,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
// If the dialog window is hidden, set _dialogWindowHandle to null
var dialogWindowExist = false;
lock (_dialogWindowLock)
@ -759,6 +769,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
// If the dialog window is ended, set _dialogWindowHandle to null
var dialogWindowExist = false;
lock (_dialogWindowLock)

View file

@ -91,4 +91,6 @@ PBT_APMRESUMEAUTOMATIC
PBT_APMRESUMESUSPEND
PowerRegisterSuspendResumeNotification
PowerUnregisterSuspendResumeNotification
DeviceNotifyCallbackRoutine
DeviceNotifyCallbackRoutine
MonitorFromWindow

View file

@ -27,7 +27,7 @@ namespace Flow.Launcher.Infrastructure
{
switch (e.PropertyName)
{
case nameof (Settings.ShouldUsePinyin):
case nameof(Settings.ShouldUsePinyin):
if (_settings.ShouldUsePinyin)
{
Reload();
@ -52,7 +52,7 @@ namespace Flow.Launcher.Infrastructure
private void CreateDoublePinyinTableFromStream(Stream jsonStream)
{
var table = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, string>>>(jsonStream) ??
var table = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, string>>>(jsonStream) ??
throw new InvalidOperationException("Failed to deserialize double pinyin table: result is null");
var schemaKey = _settings.DoublePinyinSchema.ToString();
@ -128,12 +128,12 @@ namespace Flow.Launcher.Infrastructure
if (IsChineseCharacter(content[i]))
{
var translated = _settings.UseDoublePinyin ? ToDoublePinyin(resultList[i]) : resultList[i];
if (i > 0)
if (i > 0 && content[i - 1] != ' ')
{
resultBuilder.Append(' ');
}
map.AddNewIndex(resultBuilder.Length, translated.Length);
resultBuilder.Append(translated);
previousIsChinese = true;
@ -144,11 +144,14 @@ namespace Flow.Launcher.Infrastructure
if (previousIsChinese)
{
previousIsChinese = false;
resultBuilder.Append(' ');
if (content[i] != ' ')
{
resultBuilder.Append(' ');
}
}
map.AddNewIndex(resultBuilder.Length, resultList[i].Length);
resultBuilder.Append(resultList[i]);
map.AddNewIndex(resultBuilder.Length, 1);
resultBuilder.Append(content[i]);
}
}
@ -156,7 +159,7 @@ namespace Flow.Launcher.Infrastructure
var translation = resultBuilder.ToString();
var result = (translation, map);
return _pinyinCache[content] = result;
}
@ -185,8 +188,8 @@ namespace Flow.Launcher.Infrastructure
private string ToDoublePinyin(string fullPinyin)
{
return currentDoublePinyinTable.TryGetValue(fullPinyin, out var doublePinyinValue)
? doublePinyinValue
return currentDoublePinyinTable.TryGetValue(fullPinyin, out var doublePinyinValue)
? doublePinyinValue
: fullPinyin;
}
}

View file

@ -21,7 +21,7 @@ namespace Flow.Launcher.Infrastructure
public int MapToOriginalIndex(int translatedIndex)
{
var searchResult = _originalToTranslated.BinarySearch(translatedIndex);
return searchResult >= 0 ? searchResult : ~searchResult;
return searchResult >= 0 ? searchResult + 1 : ~searchResult;
}
public void EndConstruct()

View file

@ -481,6 +481,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
public bool LeaveCmdOpen { get; set; }
public bool HideWhenDeactivated { get; set; } = true;
public bool ShowTaskbarWhenInvoked { get; set; } = false;
private bool _showAtTopmost = false;
public bool ShowAtTopmost

View file

@ -1016,5 +1016,32 @@ namespace Flow.Launcher.Infrastructure
}
#endregion
#region Taskbar
public static unsafe void ShowTaskbar()
{
// Find the taskbar window
var taskbarHwnd = PInvoke.FindWindowEx(HWND.Null, HWND.Null, "Shell_TrayWnd", null);
if (taskbarHwnd == HWND.Null) return;
// Magic from https://github.com/Oliviaophia/SmartTaskbar
const uint TrayBarFlag = 0x05D1;
var mon = PInvoke.MonitorFromWindow(taskbarHwnd, Windows.Win32.Graphics.Gdi.MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST);
PInvoke.PostMessage(taskbarHwnd, TrayBarFlag, new WPARAM(1), new LPARAM((nint)mon.Value));
}
public static void HideTaskbar()
{
// Find the taskbar window
var taskbarHwnd = PInvoke.FindWindowEx(HWND.Null, HWND.Null, "Shell_TrayWnd", null);
if (taskbarHwnd == HWND.Null) return;
// Magic from https://github.com/Oliviaophia/SmartTaskbar
const uint TrayBarFlag = 0x05D1;
PInvoke.PostMessage(taskbarHwnd, TrayBarFlag, new WPARAM(0), IntPtr.Zero);
}
#endregion
}
}

View file

@ -1,4 +1,5 @@
using System.Text.Json.Serialization;
using System;
using System.Text.Json.Serialization;
namespace Flow.Launcher.Plugin
{
@ -8,11 +9,29 @@ namespace Flow.Launcher.Plugin
public class Query
{
/// <summary>
/// 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.
/// Original query, exactly how the user has typed into the search box.
/// We don't recommend using this property directly. You should always use Search property.
/// </summary>
public string RawQuery { get; internal init; }
public string OriginalQuery { get; internal init; }
/// <summary>
/// Raw query, this includes action keyword if it has.
/// It has handled built-in custom query hotkeys and built-in shortcuts, and it trims the whitespace.
/// We don't recommend using this property directly. You should always use Search property.
/// </summary>
[Obsolete("RawQuery is renamed to TrimmedQuery. This property will be removed. Update the code to use TrimmedQuery instead.")]
public string RawQuery {
get => TrimmedQuery;
internal init { TrimmedQuery = value; }
}
/// <summary>
/// Original query but with trimmed whitespace. Includes action keyword.
/// It has handled built-in custom query hotkeys and build-in shortcuts.
/// If you need the exact original query from the search box, use OriginalQuery property instead.
/// We don't recommend using this property directly. You should always use Search property.
/// </summary>
public string TrimmedQuery { get; internal init; }
/// <summary>
/// Determines whether the query was forced to execute again.
@ -28,7 +47,7 @@ namespace Flow.Launcher.Plugin
/// <summary>
/// Search part of a query.
/// This will not include action keyword if exclusive plugin gets it, otherwise it should be same as RawQuery.
/// This will not include action keyword if exclusive plugin gets it, otherwise it should be same as TrimmedQuery.
/// Since we allow user to switch a exclusive plugin to generic plugin,
/// so this property will always give you the "real" query part of the query
/// </summary>
@ -103,6 +122,6 @@ namespace Flow.Launcher.Plugin
}
/// <inheritdoc />
public override string ToString() => RawQuery;
public override string ToString() => TrimmedQuery;
}
}

View file

@ -16,9 +16,9 @@ namespace Flow.Launcher.Test
{">", new PluginPair {Metadata = new PluginMetadata {ActionKeywords = new List<string> {">"}}}}
};
Query q = QueryBuilder.Build("> ping google.com -n 20 -6", nonGlobalPlugins);
Query q = QueryBuilder.Build("> ping google.com -n 20 -6", "> ping google.com -n 20 -6", nonGlobalPlugins);
ClassicAssert.AreEqual("> ping google.com -n 20 -6", q.RawQuery);
ClassicAssert.AreEqual("> ping google.com -n 20 -6", q.TrimmedQuery);
ClassicAssert.AreEqual("ping google.com -n 20 -6", q.Search, "Search should not start with the ActionKeyword.");
ClassicAssert.AreEqual(">", q.ActionKeyword);
@ -39,10 +39,10 @@ namespace Flow.Launcher.Test
{">", new PluginPair {Metadata = new PluginMetadata {ActionKeywords = new List<string> {">"}, Disabled = true}}}
};
Query q = QueryBuilder.Build("> ping google.com -n 20 -6", nonGlobalPlugins);
Query q = QueryBuilder.Build("> ping google.com -n 20 -6", "> ping google.com -n 20 -6", nonGlobalPlugins);
ClassicAssert.AreEqual("> ping google.com -n 20 -6", q.Search);
ClassicAssert.AreEqual(q.Search, q.RawQuery, "RawQuery should be equal to Search.");
ClassicAssert.AreEqual(q.Search, q.TrimmedQuery, "TrimmedQuery should be equal to Search.");
ClassicAssert.AreEqual(6, q.SearchTerms.Length, "The length of SearchTerms should match.");
ClassicAssert.AreNotEqual(">", q.ActionKeyword, "ActionKeyword should not match that of a disabled plugin.");
ClassicAssert.AreEqual("ping google.com -n 20 -6", q.SecondToEndSearch, "SecondToEndSearch should be trimmed of multiple whitespace characters");
@ -51,7 +51,7 @@ namespace Flow.Launcher.Test
[Test]
public void GenericPluginQueryTest()
{
Query q = QueryBuilder.Build("file.txt file2 file3", new Dictionary<string, PluginPair>());
Query q = QueryBuilder.Build("file.txt file2 file3", "file.txt file2 file3", new Dictionary<string, PluginPair>());
ClassicAssert.AreEqual("file.txt file2 file3", q.Search);
ClassicAssert.AreEqual("", q.ActionKeyword);

View file

@ -22,19 +22,33 @@ namespace Flow.Launcher.Test
ClassicAssert.AreEqual(10, GetOriginalToTranslatedAt(mapping, 1));
}
[TestCase(0, 0)]
[TestCase(2, 1)]
[TestCase(3, 1)]
[TestCase(5, 2)]
[TestCase(6, 2)]
[TestCase(0, 0)] // "F" -> "F"
[TestCase(1, 1)] // "l" -> "l"
[TestCase(2, 2)] // "o" -> "o"
[TestCase(3, 3)] // "w" -> "w"
[TestCase(4, 4)] // " " -> " "
[TestCase(5, 5)] // "Y" (translated from "用") -> original index 5
[TestCase(6, 5)] // "o" (translated from "用") -> original index 5
[TestCase(7, 5)] // "n" (translated from "用") -> original index 5
[TestCase(8, 5)] // "g" (translated from "用") -> original index 5
[TestCase(10, 6)] // "H" (translated from "户") -> original index 6
[TestCase(11, 6)] // "u" (translated from "户") -> original index 6
public void MapToOriginalIndex_ShouldReturnExpectedIndex(int translatedIndex, int expectedOriginalIndex)
{
var mapping = new TranslationMapping();
// a测试
// a Ce Shi
mapping.AddNewIndex(0, 1);
mapping.AddNewIndex(2, 2);
mapping.AddNewIndex(5, 3);
// Test case :
// 0123456
// Flow 用户
// 012345678901
// Flow Yong Hu
mapping.AddNewIndex(0, 1); // F
mapping.AddNewIndex(1, 1); // l
mapping.AddNewIndex(2, 1); // o
mapping.AddNewIndex(3, 1); // w
mapping.AddNewIndex(4, 1); // ' '
mapping.AddNewIndex(5, 4); // 用 -> Yong
mapping.AddNewIndex(10, 2); // 户 -> Hu
var result = mapping.MapToOriginalIndex(translatedIndex);
ClassicAssert.AreEqual(expectedOriginalIndex, result);

View file

@ -138,7 +138,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="iNKORE.UI.WPF.Modern" Version="0.10.1" />
<PackageReference Include="iNKORE.UI.WPF.Modern" Version="0.10.2.1" />
<PackageReference Include="MdXaml" Version="1.27.0" />
<PackageReference Include="MdXaml.AnimatedGif" Version="1.27.0" />
<PackageReference Include="MdXaml.Html" Version="1.27.0" />

View file

@ -16,6 +16,15 @@ public static class ErrorReporting
var logger = LogManager.GetLogger(methodName);
logger.Fatal(ExceptionFormatter.FormatExcpetion(e));
if (silent) return;
// Workaround for issue https://github.com/Flow-Launcher/Flow.Launcher/issues/4016
// The crash occurs in PresentationFramework.dll, not necessarily when the Runner UI is visible, originating from this line:
// https://github.com/dotnet/wpf/blob/3439f20fb8c685af6d9247e8fd2978cac42e74ac/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Shell/WindowChromeWorker.cs#L1005
// Many bug reports because users see the "Error report UI" after the crash with System.Runtime.InteropServices.COMException 0xD0000701 or 0x80263001.
// However, displaying this "Error report UI" during WPF crashes, especially when DWM composition is changing, is not ideal; some users reported it hangs for up to a minute before the it appears.
// This change modifies the behavior to log the exception instead of showing the "Error report UI".
if (ExceptionHelper.IsRecoverableDwmCompositionException(e)) return;
var reportWindow = new ReportWindow(e);
reportWindow.Show();
}

View file

@ -0,0 +1,42 @@
// This is a direct copy of the file at https://github.com/microsoft/PowerToys/blob/main/src/modules/launcher/PowerLauncher/Helper/ExceptionHelper.cs and adapted for flow.
using System;
using System.Runtime.InteropServices;
namespace Flow.Launcher.Helper;
internal static class ExceptionHelper
{
private const string PresentationFrameworkExceptionSource = "PresentationFramework";
private const int DWM_E_COMPOSITIONDISABLED = unchecked((int)0x80263001);
// HRESULT for NT STATUS STATUS_MESSAGE_LOST (0xC0000701 | 0x10000000 == 0xD0000701)
private const int STATUS_MESSAGE_LOST_HR = unchecked((int)0xD0000701);
/// <summary>
/// Returns true if the exception is a recoverable DWM composition exception.
/// </summary>
internal static bool IsRecoverableDwmCompositionException(Exception exception)
{
if (exception is not COMException comException)
{
return false;
}
if (comException.HResult is DWM_E_COMPOSITIONDISABLED)
{
return true;
}
if (comException.HResult is STATUS_MESSAGE_LOST_HR && comException.Source == PresentationFrameworkExceptionSource)
{
return true;
}
// Check for common DWM composition changed patterns in the stack trace
var stackTrace = comException.StackTrace;
return !string.IsNullOrEmpty(stackTrace) &&
stackTrace.Contains("DwmCompositionChanged", StringComparison.OrdinalIgnoreCase);
}
}

View file

@ -143,6 +143,8 @@ internal static class HotKeyMapper
return;
App.API.ShowMainWindow();
// Make sure to go back to the query results page first since it can cause issues if current page is context menu
App.API.BackToQueryResults();
App.API.ChangeQuery(hotkey.ActionKeyword, true);
});
}

View file

@ -16,11 +16,11 @@ public static class ResultHelper
return await PopulateResultsAsync(item.PluginID, item.Query, item.Title, item.SubTitle, item.RecordKey);
}
public static async Task<Result?> PopulateResultsAsync(string pluginId, string rawQuery, string title, string subTitle, string recordKey)
public static async Task<Result?> PopulateResultsAsync(string pluginId, string trimmedQuery, string title, string subTitle, string recordKey)
{
var plugin = PluginManager.GetPluginForId(pluginId);
if (plugin == null) return null;
var query = QueryBuilder.Build(rawQuery, PluginManager.GetNonGlobalPlugins());
var query = QueryBuilder.Build(trimmedQuery, trimmedQuery, PluginManager.GetNonGlobalPlugins());
if (query == null) return null;
try
{

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">إعادة تعيين الموقع</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">الإعدادات</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">الأيقونات</system:String>
<system:String x:Key="about_activate_times">لقد قمت بتفعيل Flow Launcher {0} مرات</system:String>
<system:String x:Key="checkUpdates">التحقق من التحديثات</system:String>
<system:String x:Key="BecomeASponsor">كن راعيا</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">الإصدار الجديد {0} متاح، هل ترغب في إعادة تشغيل Flow Launcher لاستخدام التحديث</system:String>
<system:String x:Key="checkUpdatesFailed">فشل التحقق من التحديثات، يرجى التحقق من الاتصال وإعدادات البروكسي لـ api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Obnovit pozici</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Nastavení</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Ikony</system:String>
<system:String x:Key="about_activate_times">Flow Launcher byl aktivován {0} krát</system:String>
<system:String x:Key="checkUpdates">Zkontrolovat Aktualizace</system:String>
<system:String x:Key="BecomeASponsor">Staňte se sponzorem</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Je k dispozici nová verze {0}, chcete Flow Launcher restartovat, aby se mohl aktualizovat?</system:String>
<system:String x:Key="checkUpdatesFailed">Hledání aktualizací se nezdařilo, zkontrolujte prosím své internetové připojení a nastavení proxy serveru k api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Position Reset</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Indstillinger</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">Du har aktiveret Flow Launcher {0} gange</system:String>
<system:String x:Key="checkUpdates">Tjek for opdateringer</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Ny version {0} er tilgængelig, genstart venligst Flow Launcher</system:String>
<system:String x:Key="checkUpdatesFailed">Check updates failed, please check your connection and proxy settings to api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Zurücksetzen der Position</system:String>
<system:String x:Key="PositionResetToolTip">Position des Suchfensters zurücksetzen</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Zum Suchen hier tippen</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Einstellungen</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Ergebnisse der Homepage zeigen, wenn Abfragetext leer ist.</system:String>
<system:String x:Key="historyResultsForHomePage">Historie-Ergebnisse auf Homepage zeigen</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximal gezeigte Historie-Ergebnisse auf Homepage</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">Dies kann nur bearbeitet werden, wenn das Plug-in das Home-Feature unterstützt und die Homepage aktiviert ist.</system:String>
<system:String x:Key="showAtTopmost">Suchfenster an vorderster zeigen</system:String>
<system:String x:Key="showAtTopmostToolTip">Setzt die Einstellung 'Immer im Vordergrund' anderer Programme außer Kraft und zeigt Flow in der vordersten Position an.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">Sie haben Flow Launcher {0} mal aktiviert</system:String>
<system:String x:Key="checkUpdates">Nach Updates suchen</system:String>
<system:String x:Key="BecomeASponsor">Ein Sponsor werden</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Neue Version {0} ist verfügbar. Möchten Sie Flow Launcher neu starten, um das Update zu verwenden?</system:String>
<system:String x:Key="checkUpdatesFailed">Überprüfung der Updates fehlgeschlagen. Bitte überprüfen Sie Ihre Verbindungs- und Proxy-Einstellungen zu api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -81,6 +81,8 @@
<system:String x:Key="useLogonTaskForStartupTooltip">After uninstallation, you need to manually remove this task (Flow.Launcher Startup) via Task Scheduler</system:String>
<system:String x:Key="setAutoStartFailed">Error setting launch on startup</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Hide Flow Launcher when focus is lost</system:String>
<system:String x:Key="showTaskbarWhenOpened">Show taskbar when Flow Launcher is opened</system:String>
<system:String x:Key="showTaskbarWhenOpenedToolTip">Temporarily show the taskbar when Flow Launcher is opened, useful for auto-hidden taskbars.</system:String>
<system:String x:Key="dontPromptUpdateMsg">Do not show new version notifications</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String>
@ -449,7 +451,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">You have activated Flow Launcher {0} times</system:String>
<system:String x:Key="checkUpdates">Check for Updates</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">New version {0} is available, would you like to restart Flow Launcher to use the update?</system:String>
<system:String x:Key="checkUpdatesFailed">Check updates failed, please check your connection and proxy settings to api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Position Reset</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Ajustes</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">Has activado Flow Launcher {0} veces</system:String>
<system:String x:Key="checkUpdates">Buscar actualizaciones</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">La nueva versión {0} está disponible, ¿desea reiniciar Flow Launcher para usar la actualización?</system:String>
<system:String x:Key="checkUpdatesFailed">Falló la comprobación de actualizaciones, compruebe su conexión y configuración de proxy a api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Restablecer posición</system:String>
<system:String x:Key="PositionResetToolTip">Restablece la posición de la ventana de búsqueda</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Escribir aquí para buscar</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Este complemento aún se está inicializando...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Seleccione este resultado para volver a realizar la consulta</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: ¡No se ha recibido respuesta!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Seleccione este resultado para más información</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Configuración</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Muestra los resultados de la página de inicio cuando el texto de la consulta está vacío.</system:String>
<system:String x:Key="historyResultsForHomePage">Mostrar historial de resultados en la página de inicio</system:String>
<system:String x:Key="historyResultsCountForHomePage">Número máximo de resultados del historial en la página de inicio</system:String>
<system:String x:Key="historyStyle">Estilo del historial</system:String>
<system:String x:Key="historyStyleTooltip">Elija el tipo de historial que desea mostrar en el historial y la página de inicio</system:String>
<system:String x:Key="queryHistory">Historial de consultas</system:String>
<system:String x:Key="executedHistory">Historial de últimas aperturas</system:String>
<system:String x:Key="homeToggleBoxToolTip">Esto solo se puede editar si el complemento soporta la función de Inicio y la Página de Inicio está activada.</system:String>
<system:String x:Key="showAtTopmost">Mostrar ventana de búsqueda en primer plano</system:String>
<system:String x:Key="showAtTopmostToolTip">Anula el ajuste «Siempre arriba» de otros programas y muestra Flow en primer plano.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Iconos</system:String>
<system:String x:Key="about_activate_times">Ha activado Flow Launcher {0} veces</system:String>
<system:String x:Key="checkUpdates">Buscar actualizaciones</system:String>
<system:String x:Key="BecomeASponsor">Hágase Patrocinador</system:String>
<system:String x:Key="BecomeASponsor">Conviértase en Patrocinador</system:String>
<system:String x:Key="newVersionTips">La nueva versión {0} está disponible, ¿desea reiniciar Flow Launcher para actualizar?</system:String>
<system:String x:Key="checkUpdatesFailed">Ha fallado la comprobación de las actualizaciones, por favor, compruebe la configuración de su proxy y conexión a api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Réinitialiser la position</system:String>
<system:String x:Key="PositionResetToolTip">Réinitialiser la position de la fenêtre de recherche</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Tapez ici pour rechercher</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Ce plugin est toujours en cours d'initialisation...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Sélectionner ce résultat pour la requête</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Ne répond pas !</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Sélectionnez ce résultat pour plus d'informations</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Paramètres</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Afficher les résultats de la page d'accueil lorsque le texte de la requête est vide.</system:String>
<system:String x:Key="historyResultsForHomePage">Afficher les résultats de l'historique sur la page d'accueil</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum de résultats de l'historique affichés sur la page d'accueil</system:String>
<system:String x:Key="historyStyle">Style d'historique</system:String>
<system:String x:Key="historyStyleTooltip">Choisissez le type d'historique à afficher dans l'historique et la page d'accueil</system:String>
<system:String x:Key="queryHistory">Historique des requêtes</system:String>
<system:String x:Key="executedHistory">Historique des dernières ouvertures</system:String>
<system:String x:Key="homeToggleBoxToolTip">Ceci ne peut être édité que si le plugin prend en charge la fonction Accueil et que la page d'accueil est activée.</system:String>
<system:String x:Key="showAtTopmost">Afficher la fenêtre de recherche en premier plan</system:String>
<system:String x:Key="showAtTopmostToolTip">Outrepasse le paramètre 'toujours en premier plan' des autres programmes et affiche Flow Launcher en première position.</system:String>
@ -399,24 +407,24 @@
<system:String x:Key="showBadgesToolTip">Pour les plugins pris en charge, des badges sont affichés afin de les distinguer plus facilement.</system:String>
<system:String x:Key="showBadgesGlobalOnly">Afficher les badges de résultats pour la requête globale uniquement</system:String>
<system:String x:Key="showBadgesGlobalOnlyToolTip">Afficher les badges pour les résultats des requêtes globales uniquement</system:String>
<system:String x:Key="dialogJumpHotkey">Dialog Jump</system:String>
<system:String x:Key="dialogJumpHotkey">Saut de dialogue</system:String>
<system:String x:Key="dialogJumpHotkeyToolTip">Entrez le raccourci pour naviguer rapidement dans la fenêtre de dialogue Ouvrir/Enregistrer sous, vers le chemin du gestionnaire de fichiers actuel.</system:String>
<system:String x:Key="dialogJump">Dialog Jump</system:String>
<system:String x:Key="dialogJump">Saut de dialogue</system:String>
<system:String x:Key="dialogJumpToolTip">Lorsque la fenêtre de dialogue Ouvrir/Enregistrer sous s'ouvre, accédez rapidement au chemin d'accès actuel du gestionnaire de fichiers.</system:String>
<system:String x:Key="autoDialogJump">Dialog Jump Automatically</system:String>
<system:String x:Key="autoDialogJump">Saut de dialogue automatique</system:String>
<system:String x:Key="autoDialogJumpToolTip">Lorsque la fenêtre de dialogue Ouvrir/Enregistrer sous est affichée, naviguez automatiquement vers le chemin du gestionnaire de fichiers actuel. (Expérimental)</system:String>
<system:String x:Key="showDialogJumpWindow">Show Dialog Jump Window</system:String>
<system:String x:Key="showDialogJumpWindowToolTip">Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.</system:String>
<system:String x:Key="dialogJumpWindowPosition">Dialog Jump Window Position</system:String>
<system:String x:Key="dialogJumpWindowPositionToolTip">Select position for the Dialog Jump search window</system:String>
<system:String x:Key="DialogJumpWindowPositionUnderDialog">Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed</system:String>
<system:String x:Key="DialogJumpWindowPositionFollowDefault">Default search window position. Displayed when triggered by search window hotkey</system:String>
<system:String x:Key="dialogJumpResultBehaviour">Dialog Jump Result Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window to the selected result path</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Left click or Enter key</system:String>
<system:String x:Key="showDialogJumpWindow">Afficher la fenêtre de saut de dialogue</system:String>
<system:String x:Key="showDialogJumpWindowToolTip">Afficher la fenêtre de recherche de saut de dialogue lorsque la fenêtre de dialogue Ouvrir/Enregistrer sous est affichée pour naviguer rapidement vers les emplacements de fichier/dossier.</system:String>
<system:String x:Key="dialogJumpWindowPosition">Position de la fenêtre de saut de dialogue</system:String>
<system:String x:Key="dialogJumpWindowPositionToolTip">Sélectionnez la position pour la fenêtre de recherche de saut de dialogue</system:String>
<system:String x:Key="DialogJumpWindowPositionUnderDialog">Fixé sous la fenêtre de dialogue Ouvrir/Enregistrer sous. Affiché à l'ouverture et reste jusqu'à ce que la fenêtre soit fermée.</system:String>
<system:String x:Key="DialogJumpWindowPositionFollowDefault">Position de la fenêtre de recherche par défaut. Affiché lorsqu'il est déclenché par le raccourci clavier de la fenêtre de recherche</system:String>
<system:String x:Key="dialogJumpResultBehaviour">Comportement de navigation des résultats du saut de dialogue</system:String>
<system:String x:Key="dialogJumpResultBehaviourToolTip">Comportement pour naviguer dans la fenêtre de dialogue Ouvrir/Enregistrer sous vers le chemin de résultat sélectionné</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Clic gauche ou touche Entrée</system:String>
<system:String x:Key="DialogJumpResultBehaviourRightClick">Clique droit</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">Dialog Jump File Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpFileResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window when the result is a file path</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">Comportement de navigation des résultats du saut de dialogue</system:String>
<system:String x:Key="dialogJumpFileResultBehaviourToolTip">Comportement pour naviguer dans la fenêtre de dialogue Ouvrir/Enregistrer sous lorsque le résultat est un chemin de fichier</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPath">Remplir le chemin complet dans la zone de nom de fichier</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPathOpen">Remplir le chemin complet dans la zone de nom de fichier et ouvrir</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourDirectory">Remplir le répertoire dans la zone de chemin</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Icônes</system:String>
<system:String x:Key="about_activate_times">Vous avez utilisé Flow Launcher {0} fois</system:String>
<system:String x:Key="checkUpdates">Vérifier les mises à jour</system:String>
<system:String x:Key="BecomeASponsor">Devenir un Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Devenez un sponsor</system:String>
<system:String x:Key="newVersionTips">Nouvelle version {0} disponible, souhaitez-vous redémarrer Flow Launcher pour l'installer ?</system:String>
<system:String x:Key="checkUpdatesFailed">É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.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">איפוס מיקום</system:String>
<system:String x:Key="PositionResetToolTip">אפס את מיקום חלון החיפוש</system:String>
<system:String x:Key="queryTextBoxPlaceholder">הקלד כאן כדי לחפש</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">הגדרות</system:String>
@ -170,6 +174,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">ניתן לערוך זאת רק אם התוסף תומך בתכונת הבית ודף הבית מופעל.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">עוקף את הגדרת תמיד עליון של תוכנות אחרות, ומציג את Flow במיקום הגבוה ביותר.</system:String>
@ -445,7 +453,7 @@
<system:String x:Key="icons">סמלים</system:String>
<system:String x:Key="about_activate_times">הפעלת את Flow Launcher {0} פעמים</system:String>
<system:String x:Key="checkUpdates">בדוק עדכונים</system:String>
<system:String x:Key="BecomeASponsor">תן חסות</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">גרסה חדשה {0} זמינה, האם ברצונך להפעיל מחדש את Flow Launcher כדי להשתמש בעדכון?</system:String>
<system:String x:Key="checkUpdatesFailed">בדיקת העדכונים נכשלה, אנא בדוק את הגדרות החיבור ואת הגדרות ה-Proxy שלך לכתובת api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Ripristina Posizione</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Impostazioni</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Icone</system:String>
<system:String x:Key="about_activate_times">Hai usato Flow Launcher {0} volte</system:String>
<system:String x:Key="checkUpdates">Cerca aggiornamenti</system:String>
<system:String x:Key="BecomeASponsor">Diventa un sostenitore</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Una nuova versione {0} è disponibile, riavvia Flow Launcher per favore.</system:String>
<system:String x:Key="checkUpdatesFailed">Ricerca aggiornamenti fallita, per favore controlla la tua connessione e le eventuali impostazioni proxy per api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">位置のリセット</system:String>
<system:String x:Key="PositionResetToolTip">検索ウィンドウの位置をリセット</system:String>
<system:String x:Key="queryTextBoxPlaceholder">ここに入力して検索</system:String>
<system:String x:Key="pluginStillInitializing">{0}: このプラグインはまだ初期化中です…</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">この結果を選択して再検索する</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: 応答に失敗しました!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">詳細については、この結果を選択してください</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">設定</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">検索文字列が空の場合、ホームページの結果を表示します。</system:String>
<system:String x:Key="historyResultsForHomePage">クエリの履歴をホームページに表示</system:String>
<system:String x:Key="historyResultsCountForHomePage">ホームページに表示される最大の履歴の数</system:String>
<system:String x:Key="historyStyle">履歴のスタイル</system:String>
<system:String x:Key="historyStyleTooltip">履歴とホームページに表示する履歴の種類を選択します</system:String>
<system:String x:Key="queryHistory">クエリの履歴</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">これは、プラグインがホーム機能をサポートし、ホームページが有効な場合にのみ編集することができます。</system:String>
<system:String x:Key="showAtTopmost">検索ウィンドウを最前面に表示</system:String>
<system:String x:Key="showAtTopmostToolTip">他のプログラムの 'Always on Top' (最前面に表示)設定を上書きし、常に最前面のウィンドウで Flow を表示します。</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">창 위치 초기화</system:String>
<system:String x:Key="PositionResetToolTip">검색창 위치 초기화</system:String>
<system:String x:Key="queryTextBoxPlaceholder">검색어 입력</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">설정</system:String>
@ -162,6 +166,10 @@
<system:String x:Key="homePageToolTip">쿼리 입력창이 비어있을때, 홈페이지의 결과를 표시합니다.</system:String>
<system:String x:Key="historyResultsForHomePage">히스토리를 홈페이지에 표시</system:String>
<system:String x:Key="historyResultsCountForHomePage">홈페이지에 표시할 최대 히스토리 수</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -437,7 +445,7 @@
<system:String x:Key="icons">아이콘</system:String>
<system:String x:Key="about_activate_times">Flow Launcher를 {0}번 실행했습니다.</system:String>
<system:String x:Key="checkUpdates">업데이트 확인</system:String>
<system:String x:Key="BecomeASponsor">후원하기</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">새 버전({0})이 있습니다. Flow Launcher를 재시작하세요.</system:String>
<system:String x:Key="checkUpdatesFailed">업데이트 확인을 실패했습니다. api.github.com로의 연결 또는 프록시 설정을 확인해주세요.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Tilbakestilling av posisjon</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Innstillinger</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Ikoner</system:String>
<system:String x:Key="about_activate_times">Du har aktivert Flow Launcher {0} ganger</system:String>
<system:String x:Key="checkUpdates">Se etter oppdateringer</system:String>
<system:String x:Key="BecomeASponsor">Bli en sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Ny versjon {0} er tilgjengelig, vil du starte Flow Launcher på nytt for å bruke oppdateringen?</system:String>
<system:String x:Key="checkUpdatesFailed">Sjekk oppdateringer mislyktes, vennligst sjekk tilkoblingen og proxy-innstillingene til api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Positie resetten</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type om te zoeken</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Instellingen</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Pictogrammen</system:String>
<system:String x:Key="about_activate_times">U heeft Flow Launcher {0} keer opgestart</system:String>
<system:String x:Key="checkUpdates">Zoek naar Updates</system:String>
<system:String x:Key="BecomeASponsor">Sponsor worden</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Nieuwe versie {0} beschikbaar, start Flow Launcher opnieuw op</system:String>
<system:String x:Key="checkUpdatesFailed">Controleren op updates mislukt, controleer uw verbinding en proxy-instellingen voor api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="PositionReset">Resetowanie pozycji</system:String>
<system:String x:Key="PositionResetToolTip">Zresetuj pozycję okna wyszukiwania</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Wpisz tutaj, aby wyszukać</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Ustawienia</system:String>
@ -170,6 +174,10 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="homePageToolTip">Wyświetl wyniki strony głównej, gdy pole wyszukiwania jest puste.</system:String>
<system:String x:Key="historyResultsForHomePage">Pokaż wyniki historii na stronie głównej</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maksymalna liczba wyników historii wyświetlanych na stronie głównej</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">Można edytować tylko wtedy, gdy wtyczka obsługuje funkcję Strona główna i jest ona włączona.</system:String>
<system:String x:Key="showAtTopmost">Wyświetl okno wyszukiwania na wierzchu</system:String>
<system:String x:Key="showAtTopmostToolTip">Wyświetl okno wyszukiwania ponad innymi oknami</system:String>
@ -445,7 +453,7 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="icons">Ikony</system:String>
<system:String x:Key="about_activate_times">Uaktywniłeś Flow Launcher {0} razy</system:String>
<system:String x:Key="checkUpdates">Szukaj aktualizacji</system:String>
<system:String x:Key="BecomeASponsor">Zostań sponsorem</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Nowa wersja {0} jest dostępna, uruchom ponownie Flow Launcher</system:String>
<system:String x:Key="checkUpdatesFailed">Sprawdzenie aktualizacji nie powiodło się. Sprawdź swoje połączenie i ustawienia proxy dla api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Redefinição de Posição</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Configurações</system:String>
@ -90,7 +94,7 @@
<system:String x:Key="SearchWindowAlignCustom">Posição Personalizada</system:String>
<system:String x:Key="language">Idioma</system:String>
<system:String x:Key="lastQueryMode">Estilo da Última Consulta</system:String>
<system:String x:Key="lastQueryModeToolTip">Mostrar/ocultar resultados anteriores quando o Lançador de Fluxos é reativado.</system:String>
<system:String x:Key="lastQueryModeToolTip">Mostrar/ocultar resultados anteriores quando o Flow Launcher for reativado.</system:String>
<system:String x:Key="LastQueryPreserved">Preservar Última Consulta</system:String>
<system:String x:Key="LastQuerySelected">Selecionar última consulta</system:String>
<system:String x:Key="LastQueryEmpty">Limpar última consulta</system:String>
@ -138,7 +142,7 @@
<system:String x:Key="DoublePinyinSchemasXiaoLang">Xiao Lang</system:String>
<system:String x:Key="AlwaysPreview">Sempre Pré-visualizar</system:String>
<system:String x:Key="AlwaysPreviewToolTip">Sempre abrir o painel de pré-visualização quando o Flow é ativado. Pressione {0} para ativar ou desativar a pré-visualização.</system:String>
<system:String x:Key="AlwaysPreviewToolTip">Sempre abrir o painel de pré-visualização quando o Flow for ativado. Pressione {0} para alternar a pré-visualização.</system:String>
<system:String x:Key="shadowEffectNotAllowed">O efeito de sombra não é permitido enquanto o tema atual tem o efeito de desfoque ativado</system:String>
<system:String x:Key="searchDelay">Search Delay</system:String>
<system:String x:Key="searchDelayToolTip">Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average.</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Ícones</system:String>
<system:String x:Key="about_activate_times">Você ativou o Flow Launcher {0} vezes</system:String>
<system:String x:Key="checkUpdates">Procurar atualizações</system:String>
<system:String x:Key="BecomeASponsor">Torne-se um Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">A nova versão {0} está disponível, por favor reinicie o Flow Launcher.</system:String>
<system:String x:Key="checkUpdatesFailed">Falha ao procurar atualizações, confira sua conexão e configuração de proxy para api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Repor posição</system:String>
<system:String x:Key="PositionResetToolTip">Repor posição da janela de pesquisa</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Escreva aqui para pesquisar</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Este plugin está a ser iniciado...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Selecione este resultado para pesquisar novamente</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Falha na resposta!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Selecione este resultado para mais informação</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Definições</system:String>
@ -170,6 +174,10 @@
<system:String x:Key="homePageToolTip">Mostrar resultados da página inicial se o termo de pesquisa estiver vazio.</system:String>
<system:String x:Key="historyResultsForHomePage">Mostrar histórico na página inicial</system:String>
<system:String x:Key="historyResultsCountForHomePage">Máximo de resultados a mostrar na Página inicial</system:String>
<system:String x:Key="historyStyle">Estilo do histórico</system:String>
<system:String x:Key="historyStyleTooltip">Escolha o tipo de histórico a ser mostrado no Histórico e na Página inicial</system:String>
<system:String x:Key="queryHistory">Histórico de pesquisas</system:String>
<system:String x:Key="executedHistory">Último histórico aberto</system:String>
<system:String x:Key="homeToggleBoxToolTip">Esta opção apenas pode ser editada se o plugin tiver suporte a Página inicial e se estiver ativo.</system:String>
<system:String x:Key="showAtTopmost">Janela de pesquisa à frente</system:String>
<system:String x:Key="showAtTopmostToolTip">Sobrepõe a definição 'Sempre na frente' das outras aplicações e mostra Flow Launcher à frente de qualquer janela.</system:String>
@ -412,13 +420,13 @@
<system:String x:Key="DialogJumpWindowPositionFollowDefault">Default search window position. Displayed when triggered by search window hotkey</system:String>
<system:String x:Key="dialogJumpResultBehaviour">Dialog Jump Result Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window to the selected result path</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Left click or Enter key</system:String>
<system:String x:Key="DialogJumpResultBehaviourRightClick">Right click</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Clique esquerdo ou tecla Enter</system:String>
<system:String x:Key="DialogJumpResultBehaviourRightClick">Clique direito</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">Dialog Jump File Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpFileResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window when the result is a file path</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPath">Fill full path in file name box</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPathOpen">Fill full path in file name box and open</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourDirectory">Fill directory in path box</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPath">Preencher caminho total na caixa Nome do ficheiro</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPathOpen">Preencher caminho total na caixa Nome do ficheiro e abrir</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourDirectory">Preencher diretório na caixa Caminho</system:String>
<!-- Setting Proxy -->
<system:String x:Key="proxy">Proxy HTTP</system:String>
@ -445,7 +453,7 @@
<system:String x:Key="icons">Ícones</system:String>
<system:String x:Key="about_activate_times">Ativou o Flow Launcher {0} vezes</system:String>
<system:String x:Key="checkUpdates">Procurar atualizações</system:String>
<system:String x:Key="BecomeASponsor">Tornar-se patrocinador</system:String>
<system:String x:Key="BecomeASponsor">Torne-se um Patrocinador</system:String>
<system:String x:Key="newVersionTips">Está disponível a versão {0}. Gostaria de reiniciar Flow Launcher para atualizar a sua versão?</system:String>
<system:String x:Key="checkUpdatesFailed">Erro ao procurar atualizações. Verifique a sua ligação e as definições do proxy estabelecidas para api.github.com</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Сброс положения</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Настройки</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Значки</system:String>
<system:String x:Key="about_activate_times">Вы воспользовались Flow Launcher уже {0} раз</system:String>
<system:String x:Key="checkUpdates">Проверить наличие обновлений</system:String>
<system:String x:Key="BecomeASponsor">Стать спонсором</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Доступна новая версия {0}. Вы хотите перезапустить Flow Launcher, чтобы использовать обновление?</system:String>
<system:String x:Key="checkUpdatesFailed">Проверка обновлений не удалась, пожалуйста, проверьте настройки подключения и прокси-сервера к api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -65,6 +65,10 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="PositionReset">Resetovať pozíciu</system:String>
<system:String x:Key="PositionResetToolTip">Resetovať pozíciu vyhľadávacieho okna</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Zadajte text na vyhľadávanie</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Tento plugin sa stále inicializuje…</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Vyberte tento výsledok na opätovné vyhľadávanie</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Nepodarilo sa odpovedať!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Vyberte tento výsledok pre viac informácií</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Nastavenia</system:String>
@ -169,10 +173,14 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="KoreanImeSettingChangeFailTitle">Nepodarilo sa zmeniť nastavenie kórejského IME</system:String>
<system:String x:Key="KoreanImeSettingChangeFailSubTitle">Skontrolujte prístup do systémového registra alebo kontaktujte podporu.</system:String>
<system:String x:Key="homePage">Domovská stránka</system:String>
<system:String x:Key="homePageToolTip">Zobraziť výsledky Domovskej stránky, keď je text dopytu prázdny.</system:String>
<system:String x:Key="historyResultsForHomePage">Zobraziť výsledky histórie na Domovskej stránke</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximálny počet zobrazených výsledkov histórie na Domovskej stránke</system:String>
<system:String x:Key="homeToggleBoxToolTip">Úprava je možná len vtedy, ak plugin podporuje funkciu Domovská stránka a Domovská stránka je povolená.</system:String>
<system:String x:Key="homePageToolTip">Zobraziť výsledky domovskej stránky, keď je text dopytu prázdny.</system:String>
<system:String x:Key="historyResultsForHomePage">Zobraziť výsledky histórie na domovskej stránke</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximálny počet histórie výsledkov zobrazenej na domovskej stránke</system:String>
<system:String x:Key="historyStyle">Štýl histórie</system:String>
<system:String x:Key="historyStyleTooltip">Vyberte, ktorý typ histórie sa má zobraziť v histórii a na domovskej stránke</system:String>
<system:String x:Key="queryHistory">História dopytov</system:String>
<system:String x:Key="executedHistory">História naposledy otvorených</system:String>
<system:String x:Key="homeToggleBoxToolTip">Úprava je možná len vtedy, ak plugin podporuje funkciu domovská stránka a zároveň je povolená.</system:String>
<system:String x:Key="showAtTopmost">Zobraziť vyhľadávacie okno v popredí</system:String>
<system:String x:Key="showAtTopmostToolTip">Prepíše nastavenie &quot;Vždy na vrchu&quot; ostatných programov a zobrazí navrchu Flow.</system:String>
<system:String x:Key="autoRestartAfterChanging">Reštartovať po úprave pluginu cez Repozitár pluginov</system:String>
@ -535,7 +543,7 @@ Nevykonali sa žiadne zmeny.</system:String>
<!-- Search Delay Settings Dialog -->
<system:String x:Key="homeTitle">Domovská stránka</system:String>
<system:String x:Key="homeTips">Ak chcete zobrazovať výsledky pluginu, keď je dopyt prázdny, povoľte funkciu Domovská stránka.</system:String>
<system:String x:Key="homeTips">Ak chcete zobrazovať výsledky pluginu, keď je dopyt prázdny, povoľte funkciu domovská stránka.</system:String>
<!-- Custom Query Hotkey Dialog -->
<system:String x:Key="customeQueryHotkeyTitle">Klávesová skratka vlastného vyhľadávania</system:String>
@ -628,7 +636,7 @@ Ak pri zadávaní skratky pred ňu pridáte &quot;@&quot;, bude sa zhodovať s
<!-- Plugin Update Window -->
<system:String x:Key="restartAfterUpdating">Po aktualizácii pluginov reštartovať Flow Launcher</system:String>
<system:String x:Key="updatePluginCheckboxContent">{0}: Aktualizované z v{1} na v{2}</system:String>
<system:String x:Key="updatePluginCheckboxContent">{0}: Aktualizácia z v{1} na v{2}</system:String>
<system:String x:Key="updatePluginNoSelected">Nie je vybraný žiaden plugin</system:String>
<!-- Welcome Window -->

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Position Reset</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Settings</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">You have activated Flow Launcher {0} times</system:String>
<system:String x:Key="checkUpdates">Check for Updates</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">New version {0} is available, would you like to restart Flow Launcher to use the update?</system:String>
<system:String x:Key="checkUpdatesFailed">Check updates failed, please check your connection and proxy settings to api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Position Reset</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Podešavanja</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">Aktivirali ste Flow Launcher {0} puta</system:String>
<system:String x:Key="checkUpdates">Proveri ažuriranja</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Nove verzija {0} je dostupna, molim Vas ponovo pokrenite Flow Launcher.</system:String>
<system:String x:Key="checkUpdatesFailed">Neuspešna provera ažuriranja, molim Vas proverite vašu vezu i podešavanja za proksi prema api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Pencere Konumunu Sıfırla</system:String>
<system:String x:Key="PositionResetToolTip">Arama penceresinin konumunu sıfırla</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Aramak için buraya yazın</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Bu eklenti hala başlatılıyor...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Yeniden sorgulamak için bu sonucu seçin</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Yanıt veremedi!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Daha fazla bilgi için bu sonucu seçin</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Ayarlar</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Sorgu metni boş olduğunda ana sayfa sonuçlarını gösterin.</system:String>
<system:String x:Key="historyResultsForHomePage">Geçmiş Sonuçlarını Ana Sayfada Göster</system:String>
<system:String x:Key="historyResultsCountForHomePage">Ana Sayfada Gösterilen Maksimum Geçmiş Sonuçları</system:String>
<system:String x:Key="historyStyle">Geçmiş Stili</system:String>
<system:String x:Key="historyStyleTooltip">Geçmiş ve Ana Sayfada gösterilecek geçmiş türünü seçin</system:String>
<system:String x:Key="queryHistory">Sorgu geçmişi</system:String>
<system:String x:Key="executedHistory">Son açılan geçmiş</system:String>
<system:String x:Key="homeToggleBoxToolTip">Bu sadece eklenti Ana Sayfa özelliğini destekliyorsa ve Ana Sayfa etkinleştirilmiş ise düzenlenebilir.</system:String>
<system:String x:Key="showAtTopmost">Arama Penceresini En Üstte Göster</system:String>
<system:String x:Key="showAtTopmostToolTip">Diğer programların 'Her Zaman Üstte' ayarını geçersiz kılar ve Flowu en önde gösterir.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Kullanılan Simgeler</system:String>
<system:String x:Key="about_activate_times">Şu ana kadar Flow Launcher'ı {0} kez aktifleştirdiniz.</system:String>
<system:String x:Key="checkUpdates">Güncellemeleri Kontrol Et</system:String>
<system:String x:Key="BecomeASponsor">Sponsor Olun</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Uygulamanın yeni sürümü ({0}) mevcut, Lütfen Flow Launcher'ı yeniden başlatın.</system:String>
<system:String x:Key="checkUpdatesFailed">Güncelleme kontrolü başarısız oldu. Lütfen bağlantınız ve vekil sunucu ayarlarınızın api.github.com adresine ulaşabilir olduğunu kontrol edin.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Скидання позиції</system:String>
<system:String x:Key="PositionResetToolTip">Скинути положення вікна пошуку</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Напишіть тут, аби знайти</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Цей плагін все ще ініціалізується...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Виберіть цей результат, щоб повторити запит</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Не вдалося відповісти!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Виберіть цей результат, щоб отримати додаткову інформацію</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Налаштування</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Показувати результати на головній сторінці, коли текст запиту порожній.</system:String>
<system:String x:Key="historyResultsForHomePage">Показати результати історії на головній</system:String>
<system:String x:Key="historyResultsCountForHomePage">Максимальна кількість результатів історії, що показуються на головній</system:String>
<system:String x:Key="historyStyle">Стиль історії</system:String>
<system:String x:Key="historyStyleTooltip">Виберіть тип історії, який буде показуватися на сторінці «Історія» та «Головна».</system:String>
<system:String x:Key="queryHistory">Історія запитів</system:String>
<system:String x:Key="executedHistory">Остання відкрита історія</system:String>
<system:String x:Key="homeToggleBoxToolTip">Це можна редагувати тільки в тому випадку, якщо плагін підтримує функцію «Головна сторінка» і вона ввімкнена.</system:String>
<system:String x:Key="showAtTopmost">Показувати вікно пошуку на передньому плані</system:String>
<system:String x:Key="showAtTopmostToolTip">Перекриває налаштування «Завжди зверху» інших програм і виводить Flow на передній план.</system:String>
@ -214,8 +222,8 @@
<system:String x:Key="plugin_query_version">Версія</system:String>
<system:String x:Key="plugin_query_web">Сайт</system:String>
<system:String x:Key="plugin_uninstall">Видалити</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="plugin_default_search_delay_time">Час затримки пошуку: типово</system:String>
<system:String x:Key="plugin_search_delay_time">Час затримки пошуку: {0} мс</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Не вдалося видалити налаштування плагіну</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Плагіни: {0} — Не вдалося видалити файли налаштувань плагінів, видаліть їх вручну.</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Не вдалося видалити кеш плагіну</system:String>
@ -597,9 +605,9 @@
Вказаний файловий менеджер не знайдено. Перевірте налаштування вашого файлового менеджера в розділі Налаштування &gt; Загальні.
</system:String>
<system:String x:Key="errorTitle">Помилка</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="folderOpenError">Під час відкриття теки сталася помилка.</system:String>
<system:String x:Key="browserOpenError">Під час відкриття URL-адреси в браузері сталася помилка. Перевірте налаштування типового веббраузера у розділі «Загальні» вікна налаштувань.</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<system:String x:Key="fileNotFoundError">Файл або каталог не знайдено: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Будь ласка, зачекайте...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Đặt lại vị trí</system:String>
<system:String x:Key="PositionResetToolTip">Cài lại vị trí cửa sổ tìm kiếm</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Cài đặt</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">Biểu tượng</system:String>
<system:String x:Key="about_activate_times">Bạn đã kích hoạt Flow Launcher {0} lần</system:String>
<system:String x:Key="checkUpdates">Kiểm tra các bản cập nhật</system:String>
<system:String x:Key="BecomeASponsor">Trở thành nhà tài trợ</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Đã có phiên bản mới {0}, bạn có muốn khởi động lại Flow Launcher để sử dụng bản cập nhật không?</system:String>
<system:String x:Key="checkUpdatesFailed">Kiểm tra cập nhật không thành công. Vui lòng kiểm tra kết nối và cài đặt proxy của bạn tới api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">重置位置</system:String>
<system:String x:Key="PositionResetToolTip">重置搜索窗口位置</system:String>
<system:String x:Key="queryTextBoxPlaceholder">在此处输入以搜索</system:String>
<system:String x:Key="pluginStillInitializing">{0}:此插件仍在初始化...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">选择此结果以重试</system:String>
<system:String x:Key="pluginFailedToRespond">{0}:响应失败!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">选择此结果以获取更多信息</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">设置</system:String>
@ -123,7 +127,7 @@
<system:String x:Key="SearchPrecisionLow">低</system:String>
<system:String x:Key="SearchPrecisionRegular">常规</system:String>
<system:String x:Key="ShouldUsePinyin">使用拼音搜索</system:String>
<system:String x:Key="ShouldUsePinyinToolTip">拼音是翻译中文的罗马化拼写的标准系统。请注意,启用此功能可以大大增加搜索时的内存使用量。</system:String>
<system:String x:Key="ShouldUsePinyinToolTip">拼音是翻译中文的罗马化拼写的标准系统。请注意,启用此功能会大幅增加搜索时的内存使用量。</system:String>
<system:String x:Key="ShouldUseDoublePinyin">使用双拼</system:String>
<system:String x:Key="ShouldUseDoublePinyinToolTip">使用双拼而不是全拼进行搜索。</system:String>
<system:String x:Key="DoublePinyinSchema">双拼方案</system:String>
@ -141,7 +145,7 @@
<system:String x:Key="AlwaysPreviewToolTip">Flow 启动时总是打开预览面板。按 {0} 以切换预览。</system:String>
<system:String x:Key="shadowEffectNotAllowed">当前主题已启用模糊效果,不允许启用阴影效果</system:String>
<system:String x:Key="searchDelay">延迟搜索</system:String>
<system:String x:Key="searchDelayToolTip">在输入时添加一个短时间延迟以减少UI闪烁和加载结果的负载。建议您的输入速度是平均的。</system:String>
<system:String x:Key="searchDelayToolTip">在输入时添加一个短时间延迟以减少UI闪烁和加载结果的负载。如果您的打字速度处于中等水平,建议启用此功能。</system:String>
<system:String x:Key="searchDelayNumberBoxToolTip">输入等待时间(毫秒),直到输入被认为完成。这只能在启用搜索延迟时进行编辑。</system:String>
<system:String x:Key="searchDelayTime">默认搜索延迟时间</system:String>
<system:String x:Key="searchDelayTimeToolTip">在输入停止后显示结果之前等待时间。更高的数值等待更长时间(毫秒)</system:String>
@ -171,6 +175,10 @@
<system:String x:Key="homePageToolTip">当查询文本为空时显示主页结果。</system:String>
<system:String x:Key="historyResultsForHomePage">在主页中显示历史记录</system:String>
<system:String x:Key="historyResultsCountForHomePage">在主页显示的最大历史结果数</system:String>
<system:String x:Key="historyStyle">历史样式</system:String>
<system:String x:Key="historyStyleTooltip">选择要在历史和主页中显示的历史类型</system:String>
<system:String x:Key="queryHistory">查询历史</system:String>
<system:String x:Key="executedHistory">最近打开历史</system:String>
<system:String x:Key="homeToggleBoxToolTip">这只能在插件支持主页功能和主页启用时进行编辑。</system:String>
<system:String x:Key="showAtTopmost">将搜索窗口置于顶层</system:String>
<system:String x:Key="showAtTopmostToolTip">覆盖其他“总是在顶部”的程序窗口并在最顶层的位置显示 Flow Launcher 搜索窗口。</system:String>
@ -289,7 +297,7 @@
<system:String x:Key="ItemHeight">项目高度</system:String>
<system:String x:Key="queryBoxFont">查询框字体</system:String>
<system:String x:Key="resultItemFont">结果标题字体</system:String>
<system:String x:Key="resultSubItemFont">结果字幕字体</system:String>
<system:String x:Key="resultSubItemFont">结果副标题字体</system:String>
<system:String x:Key="resetCustomize">重置</system:String>
<system:String x:Key="resetCustomizeToolTip">重置为推荐字体和大小设置。</system:String>
<system:String x:Key="ImportThemeSize">导入主题尺寸</system:String>
@ -606,7 +614,7 @@
<!-- Update -->
<system:String x:Key="update_flowlauncher_update_check">检查新的更新</system:String>
<system:String x:Key="update_flowlauncher_already_on_latest">您已经拥有最新的 Flow Launcher 版本</system:String>
<system:String x:Key="update_flowlauncher_already_on_latest">您当前使用的 Flow Launcher 已是最新版本</system:String>
<system:String x:Key="update_flowlauncher_update_found">检查到更新</system:String>
<system:String x:Key="update_flowlauncher_updating">更新中...</system:String>
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">重設位置</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">設定</system:String>
@ -171,11 +175,15 @@
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
<system:String x:Key="autoRestartAfterChanging">Restart after modifying plugin via Plugin Store</system:String>
<system:String x:Key="autoRestartAfterChangingToolTip">Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store</system:String>
<system:String x:Key="autoRestartAfterChanging">在插件商店改動插件後重新啟動</system:String>
<system:String x:Key="autoRestartAfterChangingToolTip">在插件商店安裝/移除/更新插件後自動重新啟動Flow Launcher</system:String>
<system:String x:Key="showUnknownSourceWarning">Show unknown source warning</system:String>
<system:String x:Key="showUnknownSourceWarningToolTip">Show warning when installing plugins from unknown sources</system:String>
<system:String x:Key="autoUpdatePlugins">Auto update plugins</system:String>
@ -446,7 +454,7 @@
<system:String x:Key="icons">圖示</system:String>
<system:String x:Key="about_activate_times">您已經啟動了 Flow Launcher {0} 次</system:String>
<system:String x:Key="checkUpdates">檢查更新</system:String>
<system:String x:Key="BecomeASponsor">成為贊助者</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">發現有新版本 {0} 請重新啟動 Flow Launcher。</system:String>
<system:String x:Key="checkUpdatesFailed">檢查更新失敗,請檢查你對 api.github.com 的連線和代理設定。</system:String>
<system:String x:Key="downloadUpdatesFailed">

View file

@ -526,7 +526,7 @@
<TextBlock
x:Name="PreviewSubTitle"
Style="{DynamicResource PreviewItemSubTitleStyle}"
Text="{Binding Result.SubTitle}" />
Text="{Binding PreviewDescription}" />
</StackPanel>
</Grid>
</Border>

View file

@ -477,7 +477,7 @@ namespace Flow.Launcher
&& QueryTextBox.CaretIndex == QueryTextBox.Text.Length)
{
var queryWithoutActionKeyword =
QueryBuilder.Build(QueryTextBox.Text.Trim(), PluginManager.GetNonGlobalPlugins())?.Search;
QueryBuilder.Build(QueryTextBox.Text, QueryTextBox.Text.Trim(), PluginManager.GetNonGlobalPlugins())?.Search;
if (FilesFolders.IsLocationPathString(queryWithoutActionKeyword))
{

View file

@ -1,253 +0,0 @@
using iNKORE.UI.WPF.Modern.Controls;
using iNKORE.UI.WPF.Modern.Controls.Helpers;
using iNKORE.UI.WPF.Modern.Controls.Primitives;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace Flow.Launcher.Resources.Controls
{
// TODO: Use IsScrollAnimationEnabled property in future: https://github.com/iNKORE-NET/UI.WPF.Modern/pull/347
public class CustomScrollViewerEx : ScrollViewer
{
private double LastVerticalLocation = 0;
private double LastHorizontalLocation = 0;
public CustomScrollViewerEx()
{
Loaded += OnLoaded;
var valueSource = DependencyPropertyHelper.GetValueSource(this, AutoPanningMode.IsEnabledProperty).BaseValueSource;
if (valueSource == BaseValueSource.Default)
{
AutoPanningMode.SetIsEnabled(this, true);
}
}
#region Orientation
public static readonly DependencyProperty OrientationProperty =
DependencyProperty.Register(
nameof(Orientation),
typeof(Orientation),
typeof(CustomScrollViewerEx),
new PropertyMetadata(Orientation.Vertical));
public Orientation Orientation
{
get => (Orientation)GetValue(OrientationProperty);
set => SetValue(OrientationProperty, value);
}
#endregion
#region AutoHideScrollBars
public static readonly DependencyProperty AutoHideScrollBarsProperty =
ScrollViewerHelper.AutoHideScrollBarsProperty
.AddOwner(
typeof(CustomScrollViewerEx),
new PropertyMetadata(true, OnAutoHideScrollBarsChanged));
public bool AutoHideScrollBars
{
get => (bool)GetValue(AutoHideScrollBarsProperty);
set => SetValue(AutoHideScrollBarsProperty, value);
}
private static void OnAutoHideScrollBarsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is CustomScrollViewerEx sv)
{
sv.UpdateVisualState();
}
}
#endregion
private void OnLoaded(object sender, RoutedEventArgs e)
{
LastVerticalLocation = VerticalOffset;
LastHorizontalLocation = HorizontalOffset;
UpdateVisualState(false);
}
/// <inheritdoc/>
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
if (Style == null && ReadLocalValue(StyleProperty) == DependencyProperty.UnsetValue)
{
SetResourceReference(StyleProperty, typeof(ScrollViewer));
}
}
/// <inheritdoc/>
protected override void OnMouseWheel(MouseWheelEventArgs e)
{
var Direction = GetDirection();
ScrollViewerBehavior.SetIsAnimating(this, true);
if (Direction == Orientation.Vertical)
{
if (ScrollableHeight > 0)
{
e.Handled = true;
}
var WheelChange = e.Delta * (ViewportHeight / 1.5) / ActualHeight;
var newOffset = LastVerticalLocation - WheelChange;
if (newOffset < 0)
{
newOffset = 0;
}
if (newOffset > ScrollableHeight)
{
newOffset = ScrollableHeight;
}
if (newOffset == LastVerticalLocation)
{
return;
}
ScrollToVerticalOffset(LastVerticalLocation);
ScrollToValue(newOffset, Direction);
LastVerticalLocation = newOffset;
}
else
{
if (ScrollableWidth > 0)
{
e.Handled = true;
}
var WheelChange = e.Delta * (ViewportWidth / 1.5) / ActualWidth;
var newOffset = LastHorizontalLocation - WheelChange;
if (newOffset < 0)
{
newOffset = 0;
}
if (newOffset > ScrollableWidth)
{
newOffset = ScrollableWidth;
}
if (newOffset == LastHorizontalLocation)
{
return;
}
ScrollToHorizontalOffset(LastHorizontalLocation);
ScrollToValue(newOffset, Direction);
LastHorizontalLocation = newOffset;
}
}
/// <inheritdoc/>
protected override void OnScrollChanged(ScrollChangedEventArgs e)
{
base.OnScrollChanged(e);
if (!ScrollViewerBehavior.GetIsAnimating(this))
{
LastVerticalLocation = VerticalOffset;
LastHorizontalLocation = HorizontalOffset;
}
}
private Orientation GetDirection()
{
var isShiftDown = Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift);
if (Orientation == Orientation.Horizontal)
{
return isShiftDown ? Orientation.Vertical : Orientation.Horizontal;
}
else
{
return isShiftDown ? Orientation.Horizontal : Orientation.Vertical;
}
}
/// <summary>
/// Causes the <see cref="ScrollViewerEx"/> to load a new view into the viewport using the specified offsets and zoom factor.
/// </summary>
/// <param name="horizontalOffset">A value between 0 and <see cref="ScrollViewer.ScrollableWidth"/> that specifies the distance the content should be scrolled horizontally.</param>
/// <param name="verticalOffset">A value between 0 and <see cref="ScrollViewer.ScrollableHeight"/> that specifies the distance the content should be scrolled vertically.</param>
/// <param name="zoomFactor">A value between MinZoomFactor and MaxZoomFactor that specifies the required target ZoomFactor.</param>
/// <returns><see langword="true"/> if the view is changed; otherwise, <see langword="false"/>.</returns>
public bool ChangeView(double? horizontalOffset, double? verticalOffset, float? zoomFactor)
{
return ChangeView(horizontalOffset, verticalOffset, zoomFactor, false);
}
/// <summary>
/// Causes the <see cref="ScrollViewerEx"/> to load a new view into the viewport using the specified offsets and zoom factor, and optionally disables scrolling animation.
/// </summary>
/// <param name="horizontalOffset">A value between 0 and <see cref="ScrollViewer.ScrollableWidth"/> that specifies the distance the content should be scrolled horizontally.</param>
/// <param name="verticalOffset">A value between 0 and <see cref="ScrollViewer.ScrollableHeight"/> that specifies the distance the content should be scrolled vertically.</param>
/// <param name="zoomFactor">A value between MinZoomFactor and MaxZoomFactor that specifies the required target ZoomFactor.</param>
/// <param name="disableAnimation"><see langword="true"/> to disable zoom/pan animations while changing the view; otherwise, <see langword="false"/>. The default is false.</param>
/// <returns><see langword="true"/> if the view is changed; otherwise, <see langword="false"/>.</returns>
public bool ChangeView(double? horizontalOffset, double? verticalOffset, float? zoomFactor, bool disableAnimation)
{
if (disableAnimation)
{
if (horizontalOffset.HasValue)
{
ScrollToHorizontalOffset(horizontalOffset.Value);
}
if (verticalOffset.HasValue)
{
ScrollToVerticalOffset(verticalOffset.Value);
}
}
else
{
if (horizontalOffset.HasValue)
{
ScrollToHorizontalOffset(LastHorizontalLocation);
ScrollToValue(Math.Min(ScrollableWidth, horizontalOffset.Value), Orientation.Horizontal);
LastHorizontalLocation = horizontalOffset.Value;
}
if (verticalOffset.HasValue)
{
ScrollToVerticalOffset(LastVerticalLocation);
ScrollToValue(Math.Min(ScrollableHeight, verticalOffset.Value), Orientation.Vertical);
LastVerticalLocation = verticalOffset.Value;
}
}
return true;
}
private void ScrollToValue(double value, Orientation Direction)
{
if (Direction == Orientation.Vertical)
{
ScrollToVerticalOffset(value);
}
else
{
ScrollToHorizontalOffset(value);
}
ScrollViewerBehavior.SetIsAnimating(this, false);
}
private void UpdateVisualState(bool useTransitions = true)
{
var stateName = AutoHideScrollBars ? "NoIndicator" : "MouseIndicator";
VisualStateManager.GoToState(this, stateName, useTransitions);
}
}
}

View file

@ -1,5 +1,6 @@
using System;
using System.IO;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
@ -9,7 +10,7 @@ namespace Flow.Launcher
{
public partial class ResultListBox
{
protected object _lock = new object();
protected Lock _lock = new();
private Point _lastpos;
private ListBoxItem curItem = null;
public ResultListBox()
@ -88,12 +89,11 @@ namespace Flow.Launcher
}
}
private Point start;
private string path;
private string query;
private Point _start;
private string _path;
private string _trimmedQuery;
// this method is called by the UI thread, which is single threaded, so we can be sloppy with locking
private bool isDragging;
private bool _isDragging;
private void ResultList_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
@ -104,53 +104,55 @@ namespace Flow.Launcher
Result:
{
CopyText: { } copyText,
OriginQuery.RawQuery: { } rawQuery
OriginQuery.TrimmedQuery: { } trimmedQuery
}
}
}) return;
path = copyText;
query = rawQuery;
start = e.GetPosition(null);
isDragging = true;
_path = copyText;
_trimmedQuery = trimmedQuery;
_start = e.GetPosition(null);
_isDragging = true;
}
private void ResultList_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton != MouseButtonState.Pressed || !isDragging)
if (e.LeftButton != MouseButtonState.Pressed || !_isDragging)
{
start = default;
path = string.Empty;
query = string.Empty;
isDragging = false;
_start = default;
_path = string.Empty;
_trimmedQuery = string.Empty;
_isDragging = false;
return;
}
if (!File.Exists(path) && !Directory.Exists(path))
if (!File.Exists(_path) && !Directory.Exists(_path))
return;
Point mousePosition = e.GetPosition(null);
Vector diff = this.start - mousePosition;
Vector diff = _start - mousePosition;
if (Math.Abs(diff.X) < SystemParameters.MinimumHorizontalDragDistance
|| Math.Abs(diff.Y) < SystemParameters.MinimumVerticalDragDistance)
return;
isDragging = false;
_isDragging = false;
App.API.HideMainWindow();
var data = new DataObject(DataFormats.FileDrop, new[]
{
path
_path
});
// Reassigning query to a new variable because for some reason
// after DragDrop.DoDragDrop call, 'query' loses its content, i.e. becomes empty string
var rawQuery = query;
var trimmedQuery = _trimmedQuery;
var effect = DragDrop.DoDragDrop((DependencyObject)sender, data, DragDropEffects.Move | DragDropEffects.Copy);
if (effect == DragDropEffects.Move)
App.API.ChangeQuery(rawQuery, true);
App.API.ChangeQuery(trimmedQuery, true);
}
private void ResultListBox_OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
if (Mouse.DirectlyOver is not FrameworkElement { DataContext: ResultViewModel result })
@ -158,6 +160,7 @@ namespace Flow.Launcher
RightClickResultCommand?.Execute(result.Result);
}
private void ResultListBox_OnPreviewMouseUp(object sender, MouseButtonEventArgs e)
{
if (Mouse.DirectlyOver is not FrameworkElement { DataContext: ResultViewModel result })

View file

@ -72,6 +72,16 @@
OnContent="{DynamicResource enable}" />
</ui:SettingsCard>
<ui:SettingsCard
Margin="0 4 0 0"
Description="{DynamicResource showTaskbarWhenOpenedToolTip}"
Header="{DynamicResource showTaskbarWhenOpened}">
<ui:ToggleSwitch
IsOn="{Binding Settings.ShowTaskbarWhenInvoked}"
OffContent="{DynamicResource disable}"
OnContent="{DynamicResource enable}" />
</ui:SettingsCard>
<ui:SettingsCard
Margin="0 4 0 0"
Description="{DynamicResource hideNotifyIconToolTip}"

View file

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Serialization;
@ -47,7 +47,7 @@ namespace Flow.Launcher.Storage
public void Add(Result result)
{
if (string.IsNullOrEmpty(result.OriginQuery.RawQuery)) return;
if (string.IsNullOrEmpty(result.OriginQuery.TrimmedQuery)) return;
if (string.IsNullOrEmpty(result.PluginID)) return;
// Maintain the max history limit

View file

@ -113,7 +113,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.TrimmedQuery, out var value))
{
return false;
}
@ -124,7 +124,7 @@ namespace Flow.Launcher.Storage
internal void Remove(Result result)
{
records.Remove(result.OriginQuery.RawQuery, out _);
records.Remove(result.OriginQuery.TrimmedQuery, out _);
}
internal void AddOrUpdate(Result result)
@ -136,7 +136,7 @@ namespace Flow.Launcher.Storage
SubTitle = result.SubTitle,
RecordKey = result.RecordKey
};
records.AddOrUpdate(result.OriginQuery.RawQuery, record, (key, oldValue) => record);
records.AddOrUpdate(result.OriginQuery.TrimmedQuery, record, (key, oldValue) => record);
}
}
@ -154,7 +154,7 @@ namespace Flow.Launcher.Storage
// 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))
!records.TryGetValue(result.OriginQuery.TrimmedQuery, out var value))
{
return false;
}
@ -168,7 +168,7 @@ namespace Flow.Launcher.Storage
// 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))
!records.TryGetValue(result.OriginQuery.TrimmedQuery, out var value))
{
return -1;
}
@ -194,7 +194,7 @@ namespace Flow.Launcher.Storage
// 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))
!records.TryGetValue(result.OriginQuery.TrimmedQuery, out var value))
{
return;
}
@ -204,12 +204,12 @@ namespace Flow.Launcher.Storage
if (queue.IsEmpty)
{
// if the queue is empty, remove the queue from the dictionary
records.TryRemove(result.OriginQuery.RawQuery, out _);
records.TryRemove(result.OriginQuery.TrimmedQuery, out _);
}
else
{
// change the queue in the dictionary
records[result.OriginQuery.RawQuery] = queue;
records[result.OriginQuery.TrimmedQuery] = queue;
}
}
@ -229,19 +229,19 @@ namespace Flow.Launcher.Storage
SubTitle = result.SubTitle,
RecordKey = result.RecordKey
};
if (!records.TryGetValue(result.OriginQuery.RawQuery, out var value))
if (!records.TryGetValue(result.OriginQuery.TrimmedQuery, out var value))
{
// create a new queue if it does not exist
value = new ConcurrentQueue<Record>();
value.Enqueue(record);
records.TryAdd(result.OriginQuery.RawQuery, value);
records.TryAdd(result.OriginQuery.TrimmedQuery, value);
}
else
{
// add or update the record in the queue
var queue = new ConcurrentQueue<Record>(value.Where(r => !r.Equals(result))); // make sure we don't have duplicates
queue.Enqueue(record);
records[result.OriginQuery.RawQuery] = queue;
records[result.OriginQuery.TrimmedQuery] = queue;
}
}
}

View file

@ -252,12 +252,14 @@
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBox">
<cc:CustomScrollViewerEx
<ui:ScrollViewerEx
x:Name="ListBoxScrollViewer"
Focusable="False"
IsScrollAnimationEnabled="False"
RewriteWheelChange="True"
Template="{DynamicResource ScrollViewerControlTemplate}">
<cc:CustomScrollViewerEx.Style>
<Style TargetType="cc:CustomScrollViewerEx">
<ui:ScrollViewerEx.Style>
<Style TargetType="ui:ScrollViewerEx">
<Style.Triggers>
<Trigger Property="ComputedVerticalScrollBarVisibility" Value="Visible">
<Setter Property="Margin" Value="0 0 0 0" />
@ -269,9 +271,9 @@
</Trigger>
</Style.Triggers>
</Style>
</cc:CustomScrollViewerEx.Style>
</ui:ScrollViewerEx.Style>
<VirtualizingStackPanel IsItemsHost="True" />
</cc:CustomScrollViewerEx>
</ui:ScrollViewerEx>
</ControlTemplate>
</Setter.Value>
</Setter>

View file

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
@ -36,9 +36,10 @@ namespace Flow.Launcher.ViewModel
private static readonly string ClassName = nameof(MainViewModel);
private bool _isQueryRunning;
private Query _lastQuery;
private bool _previousIsHomeQuery;
private Query _progressQuery; // Used for QueryResultAsync
private Query _updateQuery; // Used for ResultsUpdated
private string _queryTextBeforeLeaveResults;
private string _ignoredQueryText; // Used to ignore query text change when switching between context menu and query results
@ -64,6 +65,8 @@ namespace Flow.Launcher.ViewModel
Priority = 0 // Priority is for calculating scores in UpdateResultView
};
private bool _taskbarShownByFlow = false;
#endregion
#region Constructor
@ -283,7 +286,7 @@ namespace Flow.Launcher.ViewModel
plugin.ResultsUpdated += (s, e) =>
{
if (e.Query.RawQuery != QueryText || e.Token.IsCancellationRequested)
if (_updateQuery == null || e.Query.OriginalQuery != _updateQuery.OriginalQuery || e.Token.IsCancellationRequested)
{
return;
}
@ -442,7 +445,7 @@ namespace Flow.Launcher.ViewModel
[RelayCommand]
private void Backspace(object index)
{
var query = QueryBuilder.Build(QueryText.Trim(), PluginManager.GetNonGlobalPlugins());
var query = QueryBuilder.Build(QueryText, QueryText.Trim(), PluginManager.GetNonGlobalPlugins());
// GetPreviousExistingDirectory does not require trailing '\', otherwise will return empty string
var path = FilesFolders.GetPreviousExistingDirectory((_) => true, query.Search.TrimEnd('\\'));
@ -1382,7 +1385,7 @@ namespace Flow.Launcher.ViewModel
return;
}
App.API.LogDebug(ClassName, $"Start query with ActionKeyword <{query.ActionKeyword}> and RawQuery <{query.RawQuery}>");
App.API.LogDebug(ClassName, $"Start query with ActionKeyword <{query.ActionKeyword}> and TrimmedQuery <{query.TrimmedQuery}>");
var currentIsHomeQuery = query.IsHomeQuery;
var currentIsDialogJump = _isDialogJump;
@ -1394,69 +1397,73 @@ namespace Flow.Launcher.ViewModel
return;
}
_updateSource?.Dispose();
var currentUpdateSource = new CancellationTokenSource();
_updateSource = currentUpdateSource;
var currentCancellationToken = _updateSource.Token;
_updateToken = currentCancellationToken;
ProgressBarVisibility = Visibility.Hidden;
_isQueryRunning = true;
// Switch to ThreadPool thread
await TaskScheduler.Default;
if (currentCancellationToken.IsCancellationRequested) return;
// Update the query's IsReQuery property to true if this is a re-query
query.IsReQuery = isReQuery;
ICollection<PluginPair> plugins = Array.Empty<PluginPair>();
if (currentIsHomeQuery)
try
{
if (Settings.ShowHomePage)
{
plugins = PluginManager.ValidPluginsForHomeQuery();
}
_updateSource?.Dispose();
PluginIconPath = null;
PluginIconSource = null;
SearchIconVisibility = Visibility.Visible;
}
else
{
plugins = PluginManager.ValidPluginsForQuery(query, currentIsDialogJump);
var currentUpdateSource = new CancellationTokenSource();
_updateSource = currentUpdateSource;
var currentCancellationToken = _updateSource.Token;
_updateToken = currentCancellationToken;
if (plugins.Count == 1)
{
PluginIconPath = plugins.Single().Metadata.IcoPath;
PluginIconSource = await App.API.LoadImageAsync(PluginIconPath);
SearchIconVisibility = Visibility.Hidden;
}
else
ProgressBarVisibility = Visibility.Hidden;
_progressQuery = query;
_updateQuery = query;
// Switch to ThreadPool thread
await TaskScheduler.Default;
if (currentCancellationToken.IsCancellationRequested) return;
// Update the query's IsReQuery property to true if this is a re-query
query.IsReQuery = isReQuery;
ICollection<PluginPair> plugins = Array.Empty<PluginPair>();
if (currentIsHomeQuery)
{
if (Settings.ShowHomePage)
{
plugins = PluginManager.ValidPluginsForHomeQuery();
}
PluginIconPath = null;
PluginIconSource = null;
SearchIconVisibility = Visibility.Visible;
}
}
else
{
plugins = PluginManager.ValidPluginsForQuery(query, currentIsDialogJump);
App.API.LogDebug(ClassName, $"Valid <{plugins.Count}> plugins: {string.Join(" ", plugins.Select(x => $"<{x.Metadata.Name}>"))}");
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))
{
// Wait 15 millisecond for query change in global query
// if query changes, return so that it won't be calculated
await Task.Delay(15, currentCancellationToken);
if (currentCancellationToken.IsCancellationRequested) return;
}*/
App.API.LogDebug(ClassName, $"Valid <{plugins.Count}> plugins: {string.Join(" ", plugins.Select(x => $"<{x.Metadata.Name}>"))}");
_ = Task.Delay(200, currentCancellationToken).ContinueWith(_ =>
// 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, currentCancellationToken);
if (currentCancellationToken.IsCancellationRequested) return;
}*/
_ = 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)
if (_progressQuery != null && _progressQuery.OriginalQuery == query.OriginalQuery)
{
ProgressBarVisibility = Visibility.Visible;
}
@ -1465,58 +1472,65 @@ namespace Flow.Launcher.ViewModel
TaskContinuationOptions.NotOnCanceled,
TaskScheduler.Default);
// plugins are ICollection, meaning LINQ will get the Count and preallocate Array
// plugins are ICollection, meaning LINQ will get the Count and preallocate Array
Task[] tasks;
if (currentIsHomeQuery)
{
if (ShouldClearExistingResultsForNonQuery(plugins))
Task[] tasks;
if (currentIsHomeQuery)
{
Results.Clear();
App.API.LogDebug(ClassName, $"Existing results are cleared for non-query");
if (ShouldClearExistingResultsForNonQuery(plugins))
{
// there are no update tasks and so we can directly return
ClearResults();
return;
}
tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch
{
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(currentCancellationToken);
}
}
else
{
tasks = plugins.Select(plugin => plugin.Metadata.Disabled switch
{
false => QueryTaskAsync(plugin, currentCancellationToken),
true => Task.CompletedTask
}).ToArray();
}
tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch
try
{
false => QueryTaskAsync(plugin, currentCancellationToken),
true => Task.CompletedTask
}).ToArray();
// Check the code, WhenAll will translate all type of IEnumerable or Collection to Array, so make an array at first
await Task.WhenAll(tasks);
}
catch (OperationCanceledException)
{
// nothing to do here
}
// Query history results for home page firstly so it will be put on top of the results
if (Settings.ShowHistoryResultsForHomePage)
if (currentCancellationToken.IsCancellationRequested) return;
// this should happen once after all queries are done so progress bar should continue
// until the end of all querying
_progressQuery = null;
if (!currentCancellationToken.IsCancellationRequested)
{
QueryHistoryTask(currentCancellationToken);
// update to hidden if this is still the current query
ProgressBarVisibility = Visibility.Hidden;
}
}
else
finally
{
tasks = plugins.Select(plugin => plugin.Metadata.Disabled switch
{
false => QueryTaskAsync(plugin, currentCancellationToken),
true => Task.CompletedTask
}).ToArray();
}
try
{
// Check the code, WhenAll will translate all type of IEnumerable or Collection to Array, so make an array at first
await Task.WhenAll(tasks);
}
catch (OperationCanceledException)
{
// nothing to do here
}
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 (!currentCancellationToken.IsCancellationRequested)
{
// update to hidden if this is still the current query
ProgressBarVisibility = Visibility.Hidden;
// this make sures progress query is null when this query is canceled
_progressQuery = null;
}
// Local function
@ -1616,7 +1630,7 @@ namespace Flow.Launcher.ViewModel
{
if (string.IsNullOrWhiteSpace(queryText))
{
return QueryBuilder.Build(string.Empty, PluginManager.GetNonGlobalPlugins());
return QueryBuilder.Build(string.Empty, string.Empty, PluginManager.GetNonGlobalPlugins());
}
var queryBuilder = new StringBuilder(queryText);
@ -1636,7 +1650,7 @@ namespace Flow.Launcher.ViewModel
// Applying builtin shortcuts
await BuildQueryAsync(builtInShortcuts, queryBuilder, queryBuilderTmp);
return QueryBuilder.Build(queryBuilder.ToString().Trim(), PluginManager.GetNonGlobalPlugins());
return QueryBuilder.Build(queryText, queryBuilder.ToString().Trim(), PluginManager.GetNonGlobalPlugins());
}
private async Task BuildQueryAsync(IEnumerable<BaseBuiltinShortcutModel> builtInShortcuts,
@ -2113,6 +2127,13 @@ namespace Flow.Launcher.ViewModel
{
Win32Helper.SwitchToEnglishKeyboardLayout(true);
}
// Show the taskbar if the setting is enabled
if (Settings.ShowTaskbarWhenInvoked && !_taskbarShownByFlow)
{
Win32Helper.ShowTaskbar();
_taskbarShownByFlow = true;
}
}
public async void Hide(bool reset = true)
@ -2181,6 +2202,13 @@ namespace Flow.Launcher.ViewModel
Win32Helper.RestorePreviousKeyboardLayout();
}
// Hide the taskbar if the setting is enabled
if (_taskbarShownByFlow)
{
Win32Helper.HideTaskbar();
_taskbarShownByFlow = false;
}
// Delay for a while to make sure clock will not flicker
await Task.Delay(50);

View file

@ -288,6 +288,8 @@ namespace Flow.Launcher.ViewModel
}
}
public string PreviewDescription => Result.Preview?.Description ?? Result.SubTitle;
public Result Result { get; }
public int ResultProgress
{

View file

@ -28,9 +28,9 @@
},
"iNKORE.UI.WPF.Modern": {
"type": "Direct",
"requested": "[0.10.1, )",
"resolved": "0.10.1",
"contentHash": "nRYmBosiL+42eUpLbHeqP7qJqtp5EpzuIMZTpvq4mFV33VB/JjkFg1y82gk50pjkXlAQWDvRyrfSAmPR5AM+3g==",
"requested": "[0.10.2.1, )",
"resolved": "0.10.2.1",
"contentHash": "nGwuuVul+TcLCTgPmaAZCc0fYFqUpCNZ8PiulVT3gZnsWt/AvxMZ0DSPpuyI/iRPc/NhFIg9lSIR7uaHWV0I/Q==",
"dependencies": {
"iNKORE.UI.WPF": "1.2.8"
}
@ -1619,7 +1619,7 @@
"FSharp.Core": "[9.0.303, )",
"Flow.Launcher.Infrastructure": "[1.0.0, )",
"Flow.Launcher.Localization": "[0.0.6, )",
"Flow.Launcher.Plugin": "[5.0.0, )",
"Flow.Launcher.Plugin": "[5.1.0, )",
"Meziantou.Framework.Win32.Jobs": "[3.4.5, )",
"Microsoft.IO.RecyclableMemoryStream": "[3.0.1, )",
"SemanticVersioning": "[3.0.0, )",
@ -1634,7 +1634,7 @@
"BitFaster.Caching": "[2.5.4, )",
"CommunityToolkit.Mvvm": "[8.4.0, )",
"Flow.Launcher.Localization": "[0.0.6, )",
"Flow.Launcher.Plugin": "[5.0.0, )",
"Flow.Launcher.Plugin": "[5.1.0, )",
"InputSimulator": "[1.0.4, )",
"MemoryPack": "[1.21.4, )",
"Microsoft.VisualStudio.Threading": "[17.14.15, )",

View file

@ -105,7 +105,7 @@
<ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageReference Include="Flow.Launcher.Localization" Version="0.0.6" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.10" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="10.0.1" />
<PackageReference Include="Svg.Skia" Version="3.2.1" />
<PackageReference Include="SkiaSharp" Version="3.119.1" />
</ItemGroup>

View file

@ -64,7 +64,7 @@
<ItemGroup>
<PackageReference Include="Flow.Launcher.Localization" Version="0.0.6" />
<PackageReference Include="Mages" Version="3.0.0" />
<PackageReference Include="Mages" Version="3.0.1" />
</ItemGroup>
</Project>

View file

@ -2,7 +2,7 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_calculator_plugin_name">计算器</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_plugin_description">进行数学计算,包括十六进制值和高级函数,如“最小(1,2,3)”、“sqrt(123)”和“cos123”等。</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_plugin_description">进行数学计算,包括十六进制值和高级函数,如“min(1,2,3)”、“sqrt(123)”和“cos(123)”等。</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_not_a_number">请输入数字</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_expression_not_complete">表达错误或不完整(您是否忘记了一些括号?)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_copy_number_to_clipboard">将结果复制到剪贴板</system:String>

View file

@ -2,16 +2,16 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_calculator_plugin_name">計算機</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_plugin_description">Perform mathematical calculations, including hex values and advanced functions such as 'min(1,2,3)', 'sqrt(123)' and 'cos(123)'.</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_plugin_description">執行數學計算,包括十六進位數值以及進階函數,例如 'min(1,2,3)'、'sqrt(123)' 和 'cos(123)'。</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_not_a_number">不是一個數 (NaN)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_expression_not_complete">Expression wrong or incomplete (Did you forget some parentheses?)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_expression_not_complete">表示式錯誤或不完整(你是否忘記了某些括號?)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_copy_number_to_clipboard">複製此數至剪貼簿</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_output_decimal_separator">小數點分隔符號</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_output_decimal_separator_help">The decimal separator to be used in the output.</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_output_decimal_separator_help">用於輸出的小數點分隔符。</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_decimal_separator_use_system_locale">使用系統區域設定</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_decimal_separator_comma">逗號 (,)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_decimal_separator_dot">點 (.)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_max_decimal_places">小數點後最大位數</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_failed_to_copy">Copy failed, please try later</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_show_error_message">Show error message when calculation fails</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_failed_to_copy">複製失敗,請稍後再試</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_show_error_message">計算失敗時顯示錯誤訊息</system:String>
</ResourceDictionary>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">بحث في محتوى الملفات:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">بحث مفهرس:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">وصول سريع:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">الكلمة المفتاحية الحالية للإجراء</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">تم</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">مفعّل</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Vyhledávání obsahu souborů:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Vyhledávání v indexu:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Rychlý přístup:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Aktuální aktivační příkaz</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Hotovo</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Povoleno</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Quick Access:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Current Action Keyword</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Færdig</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Enabled</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Suche nach Dateiinhalten:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index-Suche:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Schnellzugriff:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Aktuelles Aktions-Schlüsselwort</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Fertig</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Aktiviert</system:String>

View file

@ -58,6 +58,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Quick Access:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Current Action Keyword</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Done</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Enabled</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Quick Access:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Current Action Keyword</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Hecho</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Enabled</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Búsqueda de contenido de archivo:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Buscar índice:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Acceso rápido:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Palabra clave de acción actual</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Aceptar</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Activado</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Recherche de contenu de fichier :</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Recherche dans l'index :</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Accès rapide :</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Recherche de dossier :</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">Recherche de fichier :</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Mot-clé de l'action en cours</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Terminer</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Activé</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">חיפוש תוכן קובץ:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">חיפוש אינדקס:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">גישה מהירה:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">מילת פעולה נוכחית</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">בוצע</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">מופעל</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Ricerca Contenuto File:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Ricerca in Indice:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Accesso Rapido:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Parola Chiave Corrente</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Conferma</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Abilitato</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Quick Access:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Current Action Keyword</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">完了</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Enabled</system:String>
@ -70,9 +72,9 @@
<system:String x:Key="plugin_explorer_Content_Search_Engine">Content Search Engine</system:String>
<system:String x:Key="plugin_explorer_Directory_Recursive_Search_Engine">Directory Recursive Search Engine</system:String>
<system:String x:Key="plugin_explorer_Index_Search_Engine">Index Search Engine</system:String>
<system:String x:Key="plugin_explorer_Index_Search_Engine">インデックス検索エンジン</system:String>
<system:String x:Key="plugin_explorer_Open_Window_Index_Option">Windowsのインデックスオプションを開く</system:String>
<system:String x:Key="plugin_explorer_Excluded_File_Types">Excluded File Types (comma seperated)</system:String>
<system:String x:Key="plugin_explorer_Excluded_File_Types">除外されたファイルタイプ(カンマ区切りで入力)</system:String>
<system:String x:Key="plugin_explorer_Excluded_File_Types_Tooltip">例: exe,jpg,png</system:String>
<system:String x:Key="plugin_explorer_Maximum_Results">結果の最大表示件数</system:String>
<system:String x:Key="plugin_explorer_Maximum_Results_Tooltip">The maximum number of results requested from active search engine</system:String>
@ -163,8 +165,8 @@
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_created_descending">作成日時 ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_modified_ascending">更新日時 ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_modified_descending">更新日時 ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_attributes_ascending">Attributes ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_attributes_descending">Attributes ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_attributes_ascending">属性 ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_attributes_descending">属性 ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_file_list_filename_ascending">File List FileName ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_file_list_filename_descending">File List FileName ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_run_count_ascending">実行回数 ↑</system:String>
@ -187,7 +189,7 @@
<system:String x:Key="flowlauncher_plugin_everything_installing_subtitle">Everything サービスをインストールしています。お待ちください…</system:String>
<system:String x:Key="flowlauncher_plugin_everything_installationsuccess_subtitle">Everything サービスを正常にインストールしました</system:String>
<system:String x:Key="flowlauncher_plugin_everything_installationfailed_subtitle">Everything サービスを自動的にインストールできませんでした。https://www.voidtools.com から手動でインストールしてください</system:String>
<system:String x:Key="flowlauncher_plugin_everything_run_service">Click here to start it</system:String>
<system:String x:Key="flowlauncher_plugin_everything_run_service">ここをクリックして開始</system:String>
<system:String x:Key="flowlauncher_plugin_everything_installing_select">Everythingのインストールが見つかりませんでした。手動で場所を指定しますか{0}{0}「いいえ」をクリックすると、Everythingが自動的にインストールされます。</system:String>
<system:String x:Key="flowlauncher_plugin_everything_enable_content_search">Everything でのコンテンツ検索を有効にしますか?</system:String>
<system:String x:Key="flowlauncher_plugin_everything_enable_content_search_tips">インデックスなしでは非常に遅くなることがあります(Everything v1.5以降でのみサポートされています)</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">파일 내용 검색:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">색인 검색:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">빠른 접근:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">현재 액션 키워드</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">완료</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">켬</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Søk etter filinnhold:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Indekssøk:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Hurtigtilgang:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Nåværende nøkkelord for handling</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Utført</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Aktivert</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Quick Access:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Current Action Keyword</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Klaar</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Enabled</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Przeszukiwanie zawartości plików:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Wyszukiwanie indeksowe:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Szybki dostęp:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Bieżące słowo kluczowe akcji</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Zapisz</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Aktywny</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Quick Access:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Current Action Keyword</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Finalizado</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Enabled</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Pesquisa no conteúdo dos ficheiros:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Pesquisa no índice:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Acesso rápido:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Pesquisar pasta:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">Pesquisar ficheiro:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Palavra-chave atual</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">OK</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Ativo</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Quick Access:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Current Action Keyword</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Подтвердить</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Включено</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Vyhľadávanie obsahu súborov:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Vyhľadávanie v indexe:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Rýchly prístup:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Vyhľadávanie priečinkov:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">Vyhľadávanie súborov:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Aktuálny aktivačný príkaz</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Hotovo</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Povolené</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Quick Access:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Current Action Keyword</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Done</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Enabled</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Quick Access:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Current Action Keyword</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Gotovo</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Enabled</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Dosya İçeriğini Ara:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Dizin Araması:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Hızlı Erişim:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Geçerli Anahtar Kelime</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Tamam</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Etkin</system:String>

View file

@ -22,7 +22,7 @@
<system:String x:Key="plugin_explorer_directoryinfosearch_error">Виникла помилка під час пошуку: {0}</system:String>
<system:String x:Key="plugin_explorer_opendir_error">Не вдалося відкрити папку</system:String>
<system:String x:Key="plugin_explorer_openfile_error">Не вдалося відкрити файл</system:String>
<system:String x:Key="plugin_explorer_new_action_keyword_assigned">This new action keyword is already assigned to another plugin, please choose a different one</system:String>
<system:String x:Key="plugin_explorer_new_action_keyword_assigned">Нова команда активації вже призначена іншому плагіну, виберіть іншу</system:String>
<!-- Controls -->
<system:String x:Key="plugin_explorer_delete">Видалити</system:String>
@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Пошук вмісту файлу:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Індексний пошук:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Швидкий доступ:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Пошук теки:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">Пошук файлу:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Поточне ключове слово дії</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Готово</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Увімкнено</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">Tìm kiếm nội dung tệp:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Tìm kiếm chỉ mục:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">Truy cập nhanh</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Từ hành động hiện tại</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">Xong</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">Đã bật</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">文件内容搜索:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">索引搜索:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">快速访问:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">目录搜索:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">文件搜索:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">当前触发关键字</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">确认</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">已启用</system:String>

View file

@ -56,6 +56,8 @@
<system:String x:Key="plugin_explorer_actionkeywordview_filecontentsearch">File Content Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_indexsearch">Index Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_quickaccess">快速存取:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_foldersearch">Folder Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeywordview_filesearch">File Search:</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_current">Current Action Keyword</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_done">確</system:String>
<system:String x:Key="plugin_explorer_actionkeyword_enabled">已啟用</system:String>

View file

@ -48,11 +48,18 @@ namespace Flow.Launcher.Plugin.Explorer.Search.Everything
public static async ValueTask<bool> IsEverythingRunningAsync(CancellationToken token = default)
{
await _semaphore.WaitAsync(token);
try
{
await _semaphore.WaitAsync(token);
}
catch (OperationCanceledException)
{
return false;
}
try
{
EverythingApiDllImport.Everything_GetMajorVersion();
_ = EverythingApiDllImport.Everything_GetMajorVersion();
var result = EverythingApiDllImport.Everything_GetLastError() != StateCode.IPCError;
return result;
}
@ -77,8 +84,14 @@ namespace Flow.Launcher.Plugin.Explorer.Search.Everything
if (option.MaxCount < 0)
throw new ArgumentOutOfRangeException(nameof(option.MaxCount), option.MaxCount, "MaxCount must be greater than or equal to 0");
await _semaphore.WaitAsync(token);
try
{
await _semaphore.WaitAsync(token);
}
catch (OperationCanceledException)
{
yield break;
}
try
{
@ -120,8 +133,6 @@ namespace Flow.Launcher.Plugin.Explorer.Search.Everything
EverythingApiDllImport.Everything_SetRequestFlags(EVERYTHING_REQUEST_FULL_PATH_AND_FILE_NAME);
}
if (token.IsCancellationRequested) yield break;
if (!EverythingApiDllImport.Everything_QueryW(true))

View file

@ -1,13 +1,14 @@
using Flow.Launcher.Plugin.Explorer.Search.DirectoryInfo;
using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
using Flow.Launcher.Plugin.SharedCommands;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Flow.Launcher.Plugin.Explorer.Exceptions;
using Flow.Launcher.Plugin.Explorer.Search.DirectoryInfo;
using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
using Flow.Launcher.Plugin.SharedCommands;
using static Flow.Launcher.Plugin.Explorer.Settings;
using Path = System.IO.Path;
namespace Flow.Launcher.Plugin.Explorer.Search
@ -18,6 +19,14 @@ namespace Flow.Launcher.Plugin.Explorer.Search
internal Settings Settings;
private readonly Dictionary<ActionKeyword, ResultType[]> _allowedTypesByActionKeyword = new()
{
{ ActionKeyword.FileSearchActionKeyword, [ResultType.File] },
{ ActionKeyword.FolderSearchActionKeyword, [ResultType.Folder, ResultType.Volume] },
{ ActionKeyword.SearchActionKeyword, [ResultType.File, ResultType.Folder, ResultType.Volume] },
};
public SearchManager(Settings settings, PluginInitContext context)
{
Context = context;
@ -44,51 +53,71 @@ namespace Flow.Launcher.Plugin.Explorer.Search
}
}
/// <summary>
/// Results for the different types of searches as follows:
/// 1. Search, only include results from:
/// - Files
/// - Folders
/// - Quick Access Links
/// - Path navigation
/// 2. File Content Search, only include results from:
/// - File contents from index search engines i.e. Windows Index, Everything (may not be available due its beta version)
/// 3. Path Search, only include results from:
/// - Path navigation
/// 4. Quick Access Links, only include results from:
/// - Full list of Quick Access Links if query is empty
/// - Matched Quick Access Links if query is not empty
/// - Quick Access Links that are matched on path, e.g. query "window" for results that contain 'window' in the path (even if not in the title),
/// i.e. result with path c:\windows\system32
/// 5. Folder Search, only include results from:
/// - Folders
/// - Quick Access Links
/// 6. File Search, only include results from:
/// - Files
/// - Quick Access Links
/// </summary>
internal async Task<List<Result>> SearchAsync(Query query, CancellationToken token)
{
var results = new HashSet<Result>(PathEqualityComparator.Instance);
// This allows the user to type the below action keywords and see/search the list of quick folder links
if (ActionKeywordMatch(query, Settings.ActionKeyword.SearchActionKeyword)
|| ActionKeywordMatch(query, Settings.ActionKeyword.QuickAccessActionKeyword)
|| ActionKeywordMatch(query, Settings.ActionKeyword.PathSearchActionKeyword)
|| ActionKeywordMatch(query, Settings.ActionKeyword.IndexSearchActionKeyword)
|| ActionKeywordMatch(query, Settings.ActionKeyword.FileContentSearchActionKeyword))
{
if (string.IsNullOrEmpty(query.Search) && ActionKeywordMatch(query, Settings.ActionKeyword.QuickAccessActionKeyword))
return QuickAccess.AccessLinkListAll(query, Settings.QuickAccessLinks);
var keyword = query.ActionKeyword.Length == 0 ? Query.GlobalPluginWildcardSign : query.ActionKeyword;
var quickAccessLinks = QuickAccess.AccessLinkListMatched(query, Settings.QuickAccessLinks);
results.UnionWith(quickAccessLinks);
}
else
// No action keyword matched - plugin should not handle this query, return empty results.
var activeActionKeywords = Settings.GetActiveActionKeywords(keyword);
if (activeActionKeywords.Count == 0)
{
return new List<Result>();
return [.. results];
}
IAsyncEnumerable<SearchResult> searchResults;
var queryIsEmpty = string.IsNullOrEmpty(query.Search);
if (queryIsEmpty && activeActionKeywords.ContainsKey(ActionKeyword.QuickAccessActionKeyword))
{
return QuickAccess.AccessLinkListAll(query, Settings.QuickAccessLinks);
}
bool isPathSearch = query.Search.IsLocationPathString()
if (queryIsEmpty)
{
return [.. results];
}
var isPathSearch = query.Search.IsLocationPathString()
|| EnvironmentVariables.IsEnvironmentVariableSearch(query.Search)
|| EnvironmentVariables.HasEnvironmentVar(query.Search);
IAsyncEnumerable<SearchResult> searchResults;
string engineName;
switch (isPathSearch)
{
case true
when ActionKeywordMatch(query, Settings.ActionKeyword.PathSearchActionKeyword)
|| ActionKeywordMatch(query, Settings.ActionKeyword.SearchActionKeyword):
when CanUsePathSearchByActionKeywords(activeActionKeywords):
results.UnionWith(await PathSearchAsync(query, token).ConfigureAwait(false));
return results.ToList();
return [.. results];
case false
when ActionKeywordMatch(query, Settings.ActionKeyword.FileContentSearchActionKeyword):
// Intentionally require enabling of Everything's content search due to its slowness
when activeActionKeywords.ContainsKey(ActionKeyword.FileContentSearchActionKeyword):
if (Settings.ContentIndexProvider is EverythingSearchManager && !Settings.EnableEverythingContentSearch)
return EverythingContentSearchResult(query);
@ -96,29 +125,41 @@ namespace Flow.Launcher.Plugin.Explorer.Search
engineName = Enum.GetName(Settings.ContentSearchEngine);
break;
case false
when ActionKeywordMatch(query, Settings.ActionKeyword.IndexSearchActionKeyword)
|| ActionKeywordMatch(query, Settings.ActionKeyword.SearchActionKeyword):
case true or false
when activeActionKeywords.ContainsKey(ActionKeyword.QuickAccessActionKeyword):
return QuickAccess.AccessLinkListMatched(query, Settings.QuickAccessLinks);
case false
when CanUseIndexSearchByActionKeywords(activeActionKeywords):
searchResults = Settings.IndexProvider.SearchAsync(query.Search, token);
engineName = Enum.GetName(Settings.IndexSearchEngine);
break;
default:
return results.ToList();
return [.. results];
}
var actions = activeActionKeywords.Keys.ToList();
//Merge Quick Access Link results for non-path searches.
results.UnionWith(GetQuickAccessResultsFilteredByActionKeyword(query, actions));
try
{
await foreach (var search in searchResults.WithCancellation(token).ConfigureAwait(false))
if (search.Type == ResultType.File && IsExcludedFile(search)) {
{
if (search.Type == ResultType.File && IsExcludedFile(search))
continue;
} else {
results.Add(ResultManager.CreateResult(query, search));
}
if (IsResultTypeFilteredByActionKeyword(search.Type, actions))
continue;
results.Add(ResultManager.CreateResult(query, search));
}
}
catch (OperationCanceledException)
{
return new List<Result>();
return [.. results];
}
catch (EngineNotAvailableException)
{
@ -132,33 +173,13 @@ namespace Flow.Launcher.Plugin.Explorer.Search
results.RemoveWhere(r => Settings.IndexSearchExcludedSubdirectoryPaths.Any(
excludedPath => FilesFolders.PathContains(excludedPath.Path, r.SubTitle, allowEqual: true)));
return results.ToList();
}
private bool ActionKeywordMatch(Query query, Settings.ActionKeyword allowedActionKeyword)
{
var keyword = query.ActionKeyword.Length == 0 ? Query.GlobalPluginWildcardSign : query.ActionKeyword;
return allowedActionKeyword switch
{
Settings.ActionKeyword.SearchActionKeyword => Settings.SearchActionKeywordEnabled &&
keyword == Settings.SearchActionKeyword,
Settings.ActionKeyword.PathSearchActionKeyword => Settings.PathSearchKeywordEnabled &&
keyword == Settings.PathSearchActionKeyword,
Settings.ActionKeyword.FileContentSearchActionKeyword => Settings.FileContentSearchKeywordEnabled &&
keyword == Settings.FileContentSearchActionKeyword,
Settings.ActionKeyword.IndexSearchActionKeyword => Settings.IndexSearchKeywordEnabled &&
keyword == Settings.IndexSearchActionKeyword,
Settings.ActionKeyword.QuickAccessActionKeyword => Settings.QuickAccessKeywordEnabled &&
keyword == Settings.QuickAccessActionKeyword,
_ => throw new ArgumentOutOfRangeException(nameof(allowedActionKeyword), allowedActionKeyword, "actionKeyword out of range")
};
return [.. results];
}
private List<Result> EverythingContentSearchResult(Query query)
{
return new List<Result>()
{
return
[
new()
{
Title = Localize.flowlauncher_plugin_everything_enable_content_search(),
@ -167,11 +188,11 @@ namespace Flow.Launcher.Plugin.Explorer.Search
Action = c =>
{
Settings.EnableEverythingContentSearch = true;
Context.API.ChangeQuery(query.RawQuery, true);
Context.API.ChangeQuery(query.TrimmedQuery, true);
return false;
}
}
};
];
}
private async Task<List<Result>> PathSearchAsync(Query query, CancellationToken token = default)
@ -192,7 +213,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search
// Check that actual location exists, otherwise directory search will throw directory not found exception
if (!FilesFolders.ReturnPreviousDirectoryIfIncompleteString(path).LocationExists())
return results.ToList();
return [.. results];
var useIndexSearch = Settings.IndexSearchEngine is Settings.IndexSearchEngineOption.WindowsIndex
&& UseWindowsIndexForDirectorySearch(path);
@ -204,7 +225,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search
: ResultManager.CreateOpenCurrentFolderResult(retrievedDirectoryPath, query.ActionKeyword, useIndexSearch));
if (token.IsCancellationRequested)
return new List<Result>();
return [.. results];
IAsyncEnumerable<SearchResult> directoryResult;
@ -226,7 +247,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search
}
if (token.IsCancellationRequested)
return new List<Result>();
return [.. results];
try
{
@ -241,14 +262,14 @@ namespace Flow.Launcher.Plugin.Explorer.Search
}
return results.ToList();
return [.. results];
}
public bool IsFileContentSearch(string actionKeyword) => actionKeyword == Settings.FileContentSearchActionKeyword;
public static bool UseIndexSearch(string path)
{
if (Main.Settings.IndexSearchEngine is not Settings.IndexSearchEngineOption.WindowsIndex)
if (Main.Settings.IndexSearchEngine is not IndexSearchEngineOption.WindowsIndex)
return false;
// Check if the path is using windows index search
@ -270,10 +291,67 @@ namespace Flow.Launcher.Plugin.Explorer.Search
private bool IsExcludedFile(SearchResult result)
{
string[] excludedFileTypes = Settings.ExcludedFileTypes.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
string[] excludedFileTypes = Settings.ExcludedFileTypes.Split([','], StringSplitOptions.RemoveEmptyEntries);
string fileExtension = Path.GetExtension(result.FullPath).TrimStart('.');
return excludedFileTypes.Contains(fileExtension, StringComparer.OrdinalIgnoreCase);
}
private List<Result> GetQuickAccessResultsFilteredByActionKeyword(Query query, List<ActionKeyword> actions)
{
if (!Settings.QuickAccessKeywordEnabled)
return [];
var results = QuickAccess.AccessLinkListMatched(query, Settings.QuickAccessLinks);
if (results.Count == 0)
return [];
return results
.Where(r => r.ContextData is SearchResult result
&& !IsResultTypeFilteredByActionKeyword(result.Type, actions))
.ToList();
}
private bool IsResultTypeFilteredByActionKeyword(ResultType type, List<ActionKeyword> actions)
{
var actionsWithWhitelist = actions.Intersect(_allowedTypesByActionKeyword.Keys).ToList();
if (actionsWithWhitelist.Count == 0) return false;
// Check if ANY active keyword allows this type (union behavior)
foreach (var action in actionsWithWhitelist)
{
if (_allowedTypesByActionKeyword.TryGetValue(action, out var allowedTypes))
{
if (allowedTypes.Contains(type))
return false;
}
}
return true;
}
private bool CanUseIndexSearchByActionKeywords(Dictionary<ActionKeyword, string> actions)
{
var keysToUseIndexSearch = new[]
{
ActionKeyword.FileSearchActionKeyword, ActionKeyword.FolderSearchActionKeyword,
ActionKeyword.IndexSearchActionKeyword, ActionKeyword.SearchActionKeyword
};
return keysToUseIndexSearch.Any(actions.ContainsKey);
}
// Action keywords that supports patch search in results.
private bool CanUsePathSearchByActionKeywords(Dictionary<ActionKeyword, string> actions)
{
var keysThatSupportPathSearch = new[]
{
ActionKeyword.PathSearchActionKeyword,
ActionKeyword.SearchActionKeyword,
};
return keysThatSupportPathSearch.Any(actions.ContainsKey);
}
}
}

View file

@ -1,12 +1,13 @@
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;
using System;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Text.Json.Serialization;
using Flow.Launcher.Plugin.Explorer.Search;
using Flow.Launcher.Plugin.Explorer.Search.Everything;
using Flow.Launcher.Plugin.Explorer.Search.IProvider;
using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks;
using Flow.Launcher.Plugin.Explorer.Search.WindowsIndex;
namespace Flow.Launcher.Plugin.Explorer
{
@ -58,6 +59,15 @@ namespace Flow.Launcher.Plugin.Explorer
public bool QuickAccessKeywordEnabled { get; set; }
public string FolderSearchActionKeyword { get; set; } = Query.GlobalPluginWildcardSign;
public bool FolderSearchKeywordEnabled { get; set; }
public string FileSearchActionKeyword { get; set; } = Query.GlobalPluginWildcardSign;
public bool FileSearchKeywordEnabled { get; set; }
public bool WarnWindowsSearchServiceOff { get; set; } = true;
public bool ShowFileSizeInPreviewPanel { get; set; } = true;
@ -160,7 +170,9 @@ namespace Flow.Launcher.Plugin.Explorer
PathSearchActionKeyword,
FileContentSearchActionKeyword,
IndexSearchActionKeyword,
QuickAccessActionKeyword
QuickAccessActionKeyword,
FolderSearchActionKeyword,
FileSearchActionKeyword,
}
internal string GetActionKeyword(ActionKeyword actionKeyword) => actionKeyword switch
@ -170,6 +182,8 @@ namespace Flow.Launcher.Plugin.Explorer
ActionKeyword.FileContentSearchActionKeyword => FileContentSearchActionKeyword,
ActionKeyword.IndexSearchActionKeyword => IndexSearchActionKeyword,
ActionKeyword.QuickAccessActionKeyword => QuickAccessActionKeyword,
ActionKeyword.FolderSearchActionKeyword => FolderSearchActionKeyword,
ActionKeyword.FileSearchActionKeyword => FileSearchActionKeyword,
_ => throw new ArgumentOutOfRangeException(nameof(actionKeyword), actionKeyword, "ActionKeyWord property not found")
};
@ -180,6 +194,8 @@ namespace Flow.Launcher.Plugin.Explorer
ActionKeyword.FileContentSearchActionKeyword => FileContentSearchActionKeyword = keyword,
ActionKeyword.IndexSearchActionKeyword => IndexSearchActionKeyword = keyword,
ActionKeyword.QuickAccessActionKeyword => QuickAccessActionKeyword = keyword,
ActionKeyword.FolderSearchActionKeyword => FolderSearchActionKeyword = keyword,
ActionKeyword.FileSearchActionKeyword => FileSearchActionKeyword = keyword,
_ => throw new ArgumentOutOfRangeException(nameof(actionKeyword), actionKeyword, "ActionKeyWord property not found")
};
@ -190,6 +206,8 @@ namespace Flow.Launcher.Plugin.Explorer
ActionKeyword.IndexSearchActionKeyword => IndexSearchKeywordEnabled,
ActionKeyword.FileContentSearchActionKeyword => FileContentSearchKeywordEnabled,
ActionKeyword.QuickAccessActionKeyword => QuickAccessKeywordEnabled,
ActionKeyword.FolderSearchActionKeyword => FolderSearchKeywordEnabled,
ActionKeyword.FileSearchActionKeyword => FileSearchKeywordEnabled,
_ => throw new ArgumentOutOfRangeException(nameof(actionKeyword), actionKeyword, "ActionKeyword enabled status not defined")
};
@ -200,7 +218,27 @@ namespace Flow.Launcher.Plugin.Explorer
ActionKeyword.IndexSearchActionKeyword => IndexSearchKeywordEnabled = enable,
ActionKeyword.FileContentSearchActionKeyword => FileContentSearchKeywordEnabled = enable,
ActionKeyword.QuickAccessActionKeyword => QuickAccessKeywordEnabled = enable,
ActionKeyword.FolderSearchActionKeyword => FolderSearchKeywordEnabled = enable,
ActionKeyword.FileSearchActionKeyword => FileSearchKeywordEnabled = enable,
_ => throw new ArgumentOutOfRangeException(nameof(actionKeyword), actionKeyword, "ActionKeyword enabled status not defined")
};
// Returns a dictionary because some ActionKeywords may use wildcards (*),
// which means multiple ActionKeywords can be considered active at the same time.
// Using a dictionary ensures O(1) lookup time when checking which actions
// are enabled.
internal Dictionary<ActionKeyword, string> GetActiveActionKeywords(string actionKeywordStr)
{
var result = new Dictionary<ActionKeyword, string>();
if (string.IsNullOrEmpty(actionKeywordStr)) return null;
foreach (var action in Enum.GetValues<ActionKeyword>())
{
var keywordStr = GetActionKeyword(action);
if (string.IsNullOrEmpty(keywordStr)) continue;
var isEnabled = GetActionKeywordEnabled(action);
if (keywordStr == actionKeywordStr && isEnabled) result.Add(action, keywordStr);
}
return result;
}
}
}

View file

@ -279,7 +279,11 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
new(Settings.ActionKeyword.IndexSearchActionKeyword,
"plugin_explorer_actionkeywordview_indexsearch"),
new(Settings.ActionKeyword.QuickAccessActionKeyword,
"plugin_explorer_actionkeywordview_quickaccess")
"plugin_explorer_actionkeywordview_quickaccess"),
new(Settings.ActionKeyword.FolderSearchActionKeyword,
"plugin_explorer_actionkeywordview_foldersearch"),
new(Settings.ActionKeyword.FileSearchActionKeyword,
"plugin_explorer_actionkeywordview_filesearch")
};
}

View file

@ -31,7 +31,7 @@
<system:String x:Key="plugin_pluginsmanager_update_failed_subtitle">Please check if you can connect to github.com. This error means you may not be able to install or update plugins.</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_title">Update all plugins</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_subtitle">Would you like to update all plugins?</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_prompt">Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_prompt">你要更新{0}個插件?{1}Flow Launcher會在更新所有插件後重新啟動。</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_prompt_no_restart">Would you like to update {0} plugins?</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_success_restart">{0} plugins successfully updated. Restarting Flow, please wait...</system:String>
<system:String x:Key="plugin_pluginsmanager_update_success_restart">Plugin {0} successfully updated. Restarting Flow, please wait...</system:String>
@ -66,5 +66,5 @@
<!-- Settings menu items -->
<system:String x:Key="plugin_pluginsmanager_plugin_settings_unknown_source">Install from unknown source warning</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_settings_auto_restart">Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager</system:String>
<system:String x:Key="plugin_pluginsmanager_plugin_settings_auto_restart">以插件管理員安裝/移除/更新插件後自動重新啟動Flow Launcher</system:String>
</ResourceDictionary>

View file

@ -82,7 +82,7 @@
<system:String x:Key="flowlauncher_plugin_program_plugin_name">程式</system:String>
<system:String x:Key="flowlauncher_plugin_program_plugin_description">在 Flow Launcher 中搜尋程式</system:String>
<system:String x:Key="flowlauncher_plugin_program_invalid_path">Invalid Path</system:String>
<system:String x:Key="flowlauncher_plugin_program_invalid_path">無效的路徑</system:String>
<system:String x:Key="flowlauncher_plugin_program_customizedexplorer">Customized Explorer</system:String>
<system:String x:Key="flowlauncher_plugin_program_args">Args</system:String>

View file

@ -31,6 +31,8 @@ namespace Flow.Launcher.Plugin.Program
internal static PluginInitContext Context { get; private set; }
private static readonly Lock _lastIndexTimeLock = new();
private static readonly List<Result> emptyResults = [];
private static readonly MemoryCacheOptions cacheOptions = new() { SizeLimit = 1560 };
@ -82,8 +84,45 @@ namespace Flow.Launcher.Plugin.Program
{
var resultList = await Task.Run(async () =>
{
await _win32sLock.WaitAsync(token);
await _uwpsLock.WaitAsync(token);
// Preparing win32 programs
List<Win32> win32s;
bool win32LockAcquired = false;
try
{
await _win32sLock.WaitAsync(token);
win32LockAcquired = true;
win32s = [.. _win32s];
}
catch (OperationCanceledException)
{
return emptyResults;
}
finally
{
// Only release the lock if it was acquired
if (win32LockAcquired) _win32sLock.Release();
}
// Preparing UWP programs
List<UWPApp> uwps;
bool uwpsLockAcquired = false;
try
{
await _uwpsLock.WaitAsync(token);
uwpsLockAcquired = true;
uwps = [.. _uwps];
}
catch (OperationCanceledException)
{
return emptyResults;
}
finally
{
// Only release the lock if it was acquired
if (uwpsLockAcquired) _uwpsLock.Release();
}
// Start querying programs
try
{
// Collect all UWP Windows app directories
@ -94,8 +133,8 @@ namespace Flow.Launcher.Plugin.Program
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToArray() : null;
return _win32s.Cast<IProgram>()
.Concat(_uwps)
return win32s.Cast<IProgram>()
.Concat(uwps)
.AsParallel()
.WithCancellation(token)
.Where(HideUninstallersFilter)
@ -109,11 +148,6 @@ namespace Flow.Launcher.Plugin.Program
{
return emptyResults;
}
finally
{
_uwpsLock.Release();
_win32sLock.Release();
}
}, token);
resultList = resultList.Count != 0 ? resultList : emptyResults;
@ -275,7 +309,12 @@ namespace Flow.Launcher.Plugin.Program
var cacheEmpty = _win32sCount == 0 || _uwpsCount == 0;
if (cacheEmpty || _settings.LastIndexTime.AddHours(30) < DateTime.Now)
bool needReindex;
lock (_lastIndexTimeLock)
{
needReindex = _settings.LastIndexTime.AddHours(30) < DateTime.Now;
}
if (cacheEmpty || needReindex)
{
_ = Task.Run(async () =>
{
@ -295,7 +334,7 @@ namespace Flow.Launcher.Plugin.Program
}
}
public static async Task IndexWin32ProgramsAsync()
public static async Task IndexWin32ProgramsAsync(bool resetCache)
{
await _win32sLock.WaitAsync();
try
@ -306,9 +345,15 @@ namespace Flow.Launcher.Plugin.Program
{
_win32s.Add(win32);
}
ResetCache();
if (resetCache)
{
ResetCache();
}
await Context.API.SaveCacheBinaryStorageAsync<List<Win32>>(Win32CacheName, Context.CurrentPluginMetadata.PluginCacheDirectoryPath);
_settings.LastIndexTime = DateTime.Now;
lock (_lastIndexTimeLock)
{
_settings.LastIndexTime = DateTime.Now;
}
}
catch (Exception e)
{
@ -320,7 +365,7 @@ namespace Flow.Launcher.Plugin.Program
}
}
public static async Task IndexUwpProgramsAsync()
public static async Task IndexUwpProgramsAsync(bool resetCache)
{
await _uwpsLock.WaitAsync();
try
@ -331,9 +376,15 @@ namespace Flow.Launcher.Plugin.Program
{
_uwps.Add(uwp);
}
ResetCache();
if (resetCache)
{
ResetCache();
}
await Context.API.SaveCacheBinaryStorageAsync<List<UWPApp>>(UwpCacheName, Context.CurrentPluginMetadata.PluginCacheDirectoryPath);
_settings.LastIndexTime = DateTime.Now;
lock (_lastIndexTimeLock)
{
_settings.LastIndexTime = DateTime.Now;
}
}
catch (Exception e)
{
@ -349,12 +400,12 @@ namespace Flow.Launcher.Plugin.Program
{
var win32Task = Task.Run(async () =>
{
await Context.API.StopwatchLogInfoAsync(ClassName, "Win32Program index cost", IndexWin32ProgramsAsync);
await Context.API.StopwatchLogInfoAsync(ClassName, "Win32Program index cost", () => IndexWin32ProgramsAsync(resetCache: true));
});
var uwpTask = Task.Run(async () =>
{
await Context.API.StopwatchLogInfoAsync(ClassName, "UWPProgram index cost", IndexUwpProgramsAsync);
await Context.API.StopwatchLogInfoAsync(ClassName, "UWPProgram index cost", () => IndexUwpProgramsAsync(resetCache: true));
});
await Task.WhenAll(win32Task, uwpTask).ConfigureAwait(false);
@ -362,9 +413,21 @@ namespace Flow.Launcher.Plugin.Program
internal static void ResetCache()
{
var oldCache = cache;
cache = new MemoryCache(cacheOptions);
oldCache.Dispose();
var newCache = new MemoryCache(cacheOptions);
// Atomically swap and get the previous cache instance, avoids double-dispose/lost-assignment race
// where each caller receives a distinct prior instance to dispose.
var oldCache = Interlocked.Exchange(ref cache, newCache);
// Dispose the previous instance (if any)- each caller gets a unique prior instance from above
try
{
oldCache?.Dispose();
}
catch (Exception e)
{
Context.API.LogException(ClassName, "Failed to dispose old program cache", e);
}
}
public Control CreateSettingPanel()
@ -397,12 +460,26 @@ namespace Flow.Launcher.Plugin.Program
Title = Context.API.GetTranslation("flowlauncher_plugin_program_disable_program"),
Action = c =>
{
_ = DisableProgramAsync(program);
Context.API.ShowMsg(
Context.API.GetTranslation("flowlauncher_plugin_program_disable_dlgtitle_success"),
Context.API.GetTranslation(
"flowlauncher_plugin_program_disable_dlgtitle_success_message"));
Context.API.ReQuery();
_ = Task.Run(async () =>
{
try
{
var disabled = await DisableProgramAsync(program);
if (disabled)
{
ResetCache();
Context.API.ShowMsg(
Context.API.GetTranslation("flowlauncher_plugin_program_disable_dlgtitle_success"),
Context.API.GetTranslation(
"flowlauncher_plugin_program_disable_dlgtitle_success_message"));
}
Context.API.ReQuery();
}
catch (Exception e)
{
Context.API.LogException(ClassName, "Failed to disable program", e);
}
});
return false;
},
IcoPath = "Images/disable.png",
@ -413,52 +490,50 @@ namespace Flow.Launcher.Plugin.Program
return menuOptions;
}
private static async Task DisableProgramAsync(IProgram programToDelete)
private static async Task<bool> DisableProgramAsync(IProgram programToDelete)
{
if (_settings.DisabledProgramSources.Any(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier))
return;
{
return false;
}
await _uwpsLock.WaitAsync();
var reindexUwps = true;
try
{
reindexUwps = _uwps.Any(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier);
var program = _uwps.First(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier);
program.Enabled = false;
_settings.DisabledProgramSources.Add(new ProgramSource(program));
var program = _uwps.FirstOrDefault(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier);
if (program != null)
{
program.Enabled = false;
_settings.DisabledProgramSources.Add(new ProgramSource(program));
// Reindex UWP programs
_ = Task.Run(() => IndexUwpProgramsAsync(resetCache: false));
return true;
}
}
finally
{
_uwpsLock.Release();
}
// Reindex UWP programs
if (reindexUwps)
{
_ = Task.Run(IndexUwpProgramsAsync);
return;
}
await _win32sLock.WaitAsync();
var reindexWin32s = true;
try
{
reindexWin32s = _win32s.Any(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier);
var program = _win32s.First(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier);
program.Enabled = false;
_settings.DisabledProgramSources.Add(new ProgramSource(program));
var program = _win32s.FirstOrDefault(x => x.UniqueIdentifier == programToDelete.UniqueIdentifier);
if (program != null)
{
program.Enabled = false;
_settings.DisabledProgramSources.Add(new ProgramSource(program));
// Reindex Win32 programs
_ = Task.Run(() => IndexWin32ProgramsAsync(resetCache: false));
return true;
}
}
finally
{
_win32sLock.Release();
}
// Reindex Win32 programs
if (reindexWin32s)
{
_ = Task.Run(IndexWin32ProgramsAsync);
return;
}
return false;
}
public static void StartProcess(Func<ProcessStartInfo, Process> runProcess, ProcessStartInfo info)

View file

@ -290,7 +290,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
}
private static readonly Channel<byte> PackageChangeChannel = Channel.CreateBounded<byte>(1);
private static PackageCatalog? catalog;
private static PackageCatalog catalog;
public static async Task WatchPackageChangeAsync()
{
@ -317,7 +317,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
{
await Task.Delay(3000).ConfigureAwait(false);
PackageChangeChannel.Reader.TryRead(out _);
await Task.Run(Main.IndexUwpProgramsAsync);
await Main.IndexUwpProgramsAsync(resetCache: true).ConfigureAwait(false);
}
}
}

View file

@ -796,7 +796,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
{
}
await Task.Run(Main.IndexWin32ProgramsAsync);
await Main.IndexWin32ProgramsAsync(resetCache: true).ConfigureAwait(false);
}
}

View file

@ -13,7 +13,7 @@
<system:String x:Key="flowlauncher_plugin_cmd_cmd_has_been_executed_times">此指令已執行了 {0} 次</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_execute_through_shell">執行指令</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_run_as_administrator">以系統管理員身分執行</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_copy">Copy the command</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_copy">複製命令</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_history">Only show number of most used commands:</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_command_not_found">Command not found: {0}</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_error_running_command">Error running the command: {0}</system:String>

View file

@ -77,8 +77,8 @@
<system:String x:Key="flowlauncher_plugin_sys_plugin_description">Надає команди, пов'язані з системою, наприклад, вимкнення, блокування, налаштування тощо.</system:String>
<!-- Theme Selector -->
<system:String x:Key="flowlauncher_plugin_sys_type_isdark_hasblur">This theme supports two (light/dark) modes and Blur Transparent Background</system:String>
<system:String x:Key="flowlauncher_plugin_sys_type_isdark">This theme supports two (light/dark) modes</system:String>
<system:String x:Key="flowlauncher_plugin_sys_type_hasblur">This theme supports Blur Transparent Background</system:String>
<system:String x:Key="flowlauncher_plugin_sys_type_isdark_hasblur">Ця тема підтримує два режими (світлий / темний) та розмитий прозорий фон</system:String>
<system:String x:Key="flowlauncher_plugin_sys_type_isdark">Ця тема підтримує два (світлий / темний) режими</system:String>
<system:String x:Key="flowlauncher_plugin_sys_type_hasblur">Ця тема підтримує розмитий прозорий фон</system:String>
</ResourceDictionary>

Some files were not shown because too many files have changed in this diff Show more