From 67d1b896b1aaa90dd88a44e8a620694d05d1685e Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Wed, 31 Aug 2022 21:34:47 -0500
Subject: [PATCH 001/177] Implement JSONRPC V2 Draft
---
Flow.Launcher.Core/Plugin/ExecutablePlugin.cs | 2 +-
Flow.Launcher.Core/Plugin/JsonPRCModel.cs | 77 ++++----------
.../Plugin/JsonRPCModelContext.cs | 21 ++++
Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs | 46 ++++----
Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs | 100 ++++++++++++++++++
Flow.Launcher.Core/Plugin/PluginsLoader.cs | 24 +++--
Flow.Launcher.Core/Plugin/PythonPlugin.cs | 6 +-
Flow.Launcher.Core/Plugin/PythonPluginV2.cs | 63 +++++++++++
Flow.Launcher.Plugin/AllowedLanguage.cs | 34 +++---
Flow.Launcher.Plugin/Query.cs | 10 +-
.../Plugins/JsonRPCPluginTest.cs | 21 ++--
11 files changed, 276 insertions(+), 128 deletions(-)
create mode 100644 Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs
create mode 100644 Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
create mode 100644 Flow.Launcher.Core/Plugin/PythonPluginV2.cs
diff --git a/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs b/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
index 049d1c583..1023ca933 100644
--- a/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
+++ b/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
@@ -6,7 +6,7 @@ using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Plugin
{
- internal class ExecutablePlugin : JsonRPCPlugin
+ internal class ExecutablePlugin : JsonRpcPlugin
{
private readonly ProcessStartInfo _startInfo;
public override string SupportedLanguage { get; set; } = AllowedLanguage.Executable;
diff --git a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
index e937779a1..cc06c8a0b 100644
--- a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
+++ b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
@@ -21,67 +21,36 @@ using System.Text.Json;
namespace Flow.Launcher.Core.Plugin
{
- public class JsonRPCErrorModel
- {
- public int Code { get; set; }
+ public record JsonRPCRequestMessage(PluginMetadata PluginMetadata, IAsyncEnumerable Requests);
+ public record JsonRPCBase(int Id, JsonRPCErrorModel Error = default);
+ public record JsonRPCErrorModel(int Code, string Message, string Data);
- public string Message { get; set; }
+ public record JsonRPCResponseModel(int Id, JsonRPCErrorModel Error = default) : JsonRPCBase(Id, Error);
+ public record JsonRPCQueryResponseModel(int Id,
+ [property: JsonPropertyName("result")] List Result,
+ Dictionary SettingsChange = null,
+ string DebugMessage = "",
+ JsonRPCErrorModel Error = default) : JsonRPCResponseModel(Id, Error);
- public string Data { get; set; }
- }
+ public record JsonRPCRequestModel(int Id,
+ string Method,
+ object[] Parameters,
+ Dictionary Settings = default,
+ JsonRPCErrorModel Error = default) : JsonRPCBase(Id, Error);
- public class JsonRPCResponseModel
- {
- public string Result { get; set; }
-
- public JsonRPCErrorModel Error { get; set; }
- }
-
- public class JsonRPCQueryResponseModel : JsonRPCResponseModel
- {
- [JsonPropertyName("result")]
- public new List Result { get; set; }
-
- public Dictionary SettingsChange { get; set; }
-
- public string DebugMessage { get; set; }
- }
-
- public class JsonRPCRequestModel
- {
- public string Method { get; set; }
-
- public object[] Parameters { get; set; }
-
- public Dictionary Settings { get; set; }
-
- private static readonly JsonSerializerOptions options = new()
- {
- PropertyNamingPolicy = JsonNamingPolicy.CamelCase
- };
- public override string ToString()
- {
- return JsonSerializer.Serialize(this, options);
- }
- }
-
- ///
- /// Json RPC Request that Flow Launcher sent to client
- ///
- public class JsonRPCServerRequestModel : JsonRPCRequestModel
- {
-
- }
-
///
/// Json RPC Request(in query response) that client sent to Flow Launcher
///
- public class JsonRPCClientRequestModel : JsonRPCRequestModel
- {
- public bool DontHideAfterAction { get; set; }
- }
-
+ public record JsonRPCClientRequestModel(
+ int Id,
+ string Method,
+ object[] Parameters,
+ Dictionary Settings,
+ bool DontHideAfterAction = false,
+ JsonRPCErrorModel Error = default) : JsonRPCRequestModel(Id, Method, Parameters, Settings, Error);
+
+
///
/// Represent the json-rpc result item that client send to Flow Launcher
/// Typically, we will send back this request model to client after user select the result item
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs b/Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs
new file mode 100644
index 000000000..7309e740b
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs
@@ -0,0 +1,21 @@
+using System.Text.Json.Serialization;
+
+namespace Flow.Launcher.Core.Plugin
+{
+ // TODO: After Upgrading to .Net 7, adding Source Generating Context for IAsyncEnumerable JsonRPCMessage
+
+ [JsonSerializable(typeof(JsonRPCQueryResponseModel))]
+ public partial class JsonRPCQueryResponseModelContext : JsonSerializerContext
+ {
+ }
+
+ [JsonSerializable(typeof(JsonRPCRequestModel))]
+ public partial class JsonRPCRequestModelContext : JsonSerializerContext
+ {
+ }
+
+ [JsonSerializable(typeof(JsonRPCClientRequestModel))]
+ public partial class JsonRPCClientRequestModelContext : JsonSerializerContext
+ {
+ }
+}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
index e3efcd296..222ec5a24 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
@@ -29,10 +29,10 @@ namespace Flow.Launcher.Core.Plugin
/// Represent the plugin that using JsonPRC
/// every JsonRPC plugin should has its own plugin instance
///
- internal abstract class JsonRPCPlugin : IAsyncPlugin, IContextMenu, ISettingProvider, ISavable
+ internal abstract class JsonRpcPlugin : IAsyncPlugin, IContextMenu, ISettingProvider, ISavable
{
- protected PluginInitContext context;
- public const string JsonRPC = "JsonRPC";
+ protected PluginInitContext Context;
+ public const string JsonRpc = "JsonRPC";
///
/// The language this JsonRPCPlugin support
@@ -43,19 +43,16 @@ namespace Flow.Launcher.Core.Plugin
private static readonly RecyclableMemoryStreamManager BufferManager = new();
- private string SettingConfigurationPath => Path.Combine(context.CurrentPluginMetadata.PluginDirectory, "SettingsTemplate.yaml");
- private string SettingPath => Path.Combine(DataLocation.PluginSettingsDirectory, context.CurrentPluginMetadata.Name, "Settings.json");
+ private int RequestId { get; set; }
+
+ private string SettingConfigurationPath => Path.Combine(Context.CurrentPluginMetadata.PluginDirectory, "SettingsTemplate.yaml");
+ private string SettingPath => Path.Combine(DataLocation.PluginSettingsDirectory, Context.CurrentPluginMetadata.Name, "Settings.json");
public List LoadContextMenus(Result selectedResult)
{
- var request = new JsonRPCRequestModel
- {
- Method = "context_menu",
- Parameters = new[]
- {
- selectedResult.ContextData
- }
- };
+ var request = new JsonRPCRequestModel(RequestId++,
+ "context_menu",
+ new[] { selectedResult.ContextData });
var output = Request(request);
return DeserializedResult(output);
}
@@ -113,7 +110,7 @@ namespace Flow.Launcher.Core.Plugin
if (!string.IsNullOrEmpty(queryResponseModel.DebugMessage))
{
- context.API.ShowMsg(queryResponseModel.DebugMessage);
+ Context.API.ShowMsg(queryResponseModel.DebugMessage);
}
foreach (var result in queryResponseModel.Result)
@@ -281,7 +278,7 @@ namespace Flow.Launcher.Core.Plugin
{
case (0, 0):
const string errorMessage = "Empty JSON-RPC Response.";
- Log.Warn($"|{nameof(JsonRPCPlugin)}.{nameof(ExecuteAsync)}|{errorMessage}");
+ Log.Warn($"|{nameof(JsonRpcPlugin)}.{nameof(ExecuteAsync)}|{errorMessage}");
break;
case (_, not 0):
throw new InvalidDataException(Encoding.UTF8.GetString(errorBuffer.ToArray())); // The process has exited with an error message
@@ -295,20 +292,15 @@ namespace Flow.Launcher.Core.Plugin
public async Task> QueryAsync(Query query, CancellationToken token)
{
- var request = new JsonRPCRequestModel
- {
- Method = "query",
- Parameters = new object[]
- {
- query.Search
- },
- Settings = Settings
- };
+ var request = new JsonRPCRequestModel(RequestId++,
+ "query",
+ new object[]{ query.Search },
+ Settings);
var output = await RequestAsync(request, token);
return await DeserializedResultAsync(output);
}
- public async Task InitSettingAsync()
+ private async Task InitSettingAsync()
{
if (!File.Exists(SettingConfigurationPath))
return;
@@ -337,7 +329,7 @@ namespace Flow.Launcher.Core.Plugin
public virtual async Task InitAsync(PluginInitContext context)
{
- this.context = context;
+ this.Context = context;
await InitSettingAsync();
}
private static readonly Thickness settingControlMargin = new(10, 4, 10, 4);
@@ -483,7 +475,7 @@ namespace Flow.Launcher.Core.Plugin
{
if (Settings != null)
{
- Helper.ValidateDirectory(Path.Combine(DataLocation.PluginSettingsDirectory, context.CurrentPluginMetadata.Name));
+ Helper.ValidateDirectory(Path.Combine(DataLocation.PluginSettingsDirectory, Context.CurrentPluginMetadata.Name));
File.WriteAllText(SettingPath, JsonSerializer.Serialize(Settings, settingSerializeOption));
}
}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
new file mode 100644
index 000000000..0df090cd0
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
@@ -0,0 +1,100 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.IO;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Channels;
+using System.Threading.Tasks;
+using System.Windows.Controls;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.Core.Plugin
+{
+ public abstract class JsonRpcPluginV2 : IAsyncPlugin, IContextMenu, ISettingProvider, ISavable
+ {
+ public abstract string SupportedLanguage { get; set; }
+
+ public const string JsonRpc = "JsonRPC";
+ protected abstract Stream InputStream { get; set; }
+ protected abstract Stream OutputStream { get; set; }
+ protected abstract StreamReader ErrorStream { get; set; }
+
+ protected Channel InputMessageChannel { get; set; }
+
+ private (Task SendTask, Task ReceiveTask) MessageTask { get; set; }
+ private CancellationTokenSource MessageCancellationTokenSource { get; set; }
+
+ protected int RequestId;
+
+ private ConcurrentDictionary> RequestTaskDictionary { get; } = new();
+
+ // TODO: Switch to Async Task
+ private async void ReceiveMessageAsync(CancellationToken token)
+ {
+ var response =
+ JsonSerializer.DeserializeAsyncEnumerable(OutputStream, cancellationToken: token);
+
+ ArgumentNullException.ThrowIfNull(response);
+
+ await foreach (var message in response.WithCancellation(token))
+ {
+ if (!RequestTaskDictionary.TryGetValue(message.Id, out var task))
+ {
+ // Either Task is already handled or it is a invalid resopnse.
+ continue;
+ }
+ RequestTaskDictionary.Remove(message.Id, out _);
+ task.TrySetResult(message);
+ }
+ }
+
+ // TODO: Switch to Async Task
+ private async void SendMessageAsync(PluginMetadata metadata, CancellationToken token)
+ {
+ var fullMessage = new JsonRPCRequestMessage(metadata, InputMessageChannel.Reader.ReadAllAsync(token));
+ await JsonSerializer.SerializeAsync(InputStream, fullMessage, cancellationToken: token);
+ }
+
+ public async Task> QueryAsync(Query query, CancellationToken token)
+ {
+ int currentRequestId = Interlocked.Add(ref RequestId, 1);
+ var message = new JsonRPCRequestModel(currentRequestId, "query", new object[]
+ {
+ query
+ });
+ await InputMessageChannel.Writer.WriteAsync(message, token);
+ await Task.Delay(50);
+ await InputStream.FlushAsync();
+ var task = new TaskCompletionSource();
+ RequestTaskDictionary[currentRequestId] = task;
+ var result = await task.Task;
+ //TODO: Parse Result
+ return new List();
+ }
+ public virtual Task InitAsync(PluginInitContext context)
+ {
+ InputMessageChannel = Channel.CreateUnbounded();
+ MessageCancellationTokenSource = new CancellationTokenSource();
+ SendMessageAsync(context.CurrentPluginMetadata, MessageCancellationTokenSource.Token);
+ ReceiveMessageAsync(MessageCancellationTokenSource.Token);
+ // MessageTask =
+ // (SendMessageAsync(context.CurrentPluginMetadata, MessageCancellationTokenSource.Token),
+ // ReceiveMessageAsync(MessageCancellationTokenSource.Token));
+ return Task.CompletedTask;
+ }
+ public List LoadContextMenus(Result selectedResult)
+ {
+ throw new System.NotImplementedException();
+ }
+ public Control CreateSettingPanel()
+ {
+ // TODO: Implement CreateSettingPanel
+ return new Control();
+ }
+ public void Save()
+ {
+ // TODO: Save settings
+ }
+ }
+}
diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
index 752174263..d4dd4aa4f 100644
--- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs
+++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
@@ -83,7 +83,10 @@ namespace Flow.Launcher.Core.Plugin
return;
}
- plugins.Add(new PluginPair {Plugin = plugin, Metadata = metadata});
+ plugins.Add(new PluginPair
+ {
+ Plugin = plugin, Metadata = metadata
+ });
});
metadata.InitTime += milliseconds;
}
@@ -110,14 +113,14 @@ namespace Flow.Launcher.Core.Plugin
public static IEnumerable PythonPlugins(List source, PluginsSettings settings)
{
- if (!source.Any(o => o.Language.ToUpper() == AllowedLanguage.Python))
+ if (!source.Any(o => o.Language.ToUpper() is AllowedLanguage.Python or AllowedLanguage.PythonV2))
return new List();
if (!string.IsNullOrEmpty(settings.PythonDirectory) && FilesFolders.LocationExists(settings.PythonDirectory))
return SetPythonPathForPluginPairs(source, Path.Combine(settings.PythonDirectory, PythonExecutable));
var pythonPath = string.Empty;
-
+
if (MessageBox.Show("Flow detected you have installed Python plugins, which " +
"will need Python to run. Would you like to download Python? " +
Environment.NewLine + Environment.NewLine +
@@ -185,17 +188,22 @@ namespace Flow.Launcher.Core.Plugin
return SetPythonPathForPluginPairs(source, pythonPath);
}
- private static IEnumerable SetPythonPathForPluginPairs(List source, string pythonPath)
- => source
- .Where(o => o.Language.ToUpper() == AllowedLanguage.Python)
+ private static IEnumerable SetPythonPathForPluginPairs(IEnumerable source, string pythonPath)
+ => source
+ .Where(o => o.Language.ToUpper() is AllowedLanguage.Python or AllowedLanguage.PythonV2)
.Select(metadata => new PluginPair
{
- Plugin = new PythonPlugin(pythonPath),
+ Plugin = metadata.Language.ToUpper() switch
+ {
+ AllowedLanguage.Python => new PythonPlugin(pythonPath),
+ AllowedLanguage.PythonV2 => new PythonPluginV2(pythonPath),
+ _ => throw new ArgumentOutOfRangeException()
+ },
Metadata = metadata
})
.ToList();
- public static IEnumerable ExecutablePlugins(IEnumerable source)
+ public static IEnumerable ExecutablePlugins(IEnumerable source)
{
return source
.Where(o => o.Language.ToUpper() == AllowedLanguage.Executable)
diff --git a/Flow.Launcher.Core/Plugin/PythonPlugin.cs b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
index 8f7e5760a..62400db38 100644
--- a/Flow.Launcher.Core/Plugin/PythonPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
@@ -8,7 +8,7 @@ using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Plugin
{
- internal class PythonPlugin : JsonRPCPlugin
+ internal class PythonPlugin : JsonRpcPlugin
{
private readonly ProcessStartInfo _startInfo;
public override string SupportedLanguage { get; set; } = AllowedLanguage.Python;
@@ -25,7 +25,7 @@ namespace Flow.Launcher.Core.Plugin
};
// temp fix for issue #667
- var path = Path.Combine(Constant.ProgramDirectory, JsonRPC);
+ var path = Path.Combine(Constant.ProgramDirectory, JsonRpc);
_startInfo.EnvironmentVariables["PYTHONPATH"] = path;
_startInfo.EnvironmentVariables["FLOW_VERSION"] = Constant.Version;
@@ -47,7 +47,7 @@ namespace Flow.Launcher.Core.Plugin
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
{
_startInfo.ArgumentList[2] = rpcRequest.ToString();
- _startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
+ _startInfo.WorkingDirectory = Context.CurrentPluginMetadata.PluginDirectory;
// TODO: Async Action
return Execute(_startInfo);
}
diff --git a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
new file mode 100644
index 000000000..d5033e056
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.Core.Plugin
+{
+ public class PythonPluginV2 : JsonRpcPluginV2
+ {
+ private readonly ProcessStartInfo _startInfo;
+ private Process _process;
+ public override string SupportedLanguage { get; set; } = AllowedLanguage.Python;
+
+ protected override Stream InputStream { get; set; }
+ protected override Stream OutputStream { get; set; }
+ protected override StreamReader ErrorStream { get; set; }
+
+ public PythonPluginV2(string filename)
+ {
+ _startInfo = new ProcessStartInfo
+ {
+ FileName = filename,
+ UseShellExecute = false,
+ CreateNoWindow = true,
+ RedirectStandardOutput = true,
+ RedirectStandardError = true,
+ RedirectStandardInput = true
+ };
+
+ // temp fix for issue #667
+ var path = Path.Combine(Constant.ProgramDirectory, JsonRpc);
+ _startInfo.EnvironmentVariables["PYTHONPATH"] = path;
+
+ _startInfo.EnvironmentVariables["FLOW_VERSION"] = Constant.Version;
+ _startInfo.EnvironmentVariables["FLOW_PROGRAM_DIRECTORY"] = Constant.ProgramDirectory;
+ _startInfo.EnvironmentVariables["FLOW_APPLICATION_DIRECTORY"] = Constant.ApplicationDirectory;
+
+
+ //Add -B flag to tell python don't write .py[co] files. Because .pyc contains location infos which will prevent python portable
+ _startInfo.ArgumentList.Add("-B");
+ }
+
+
+ public override async Task InitAsync(PluginInitContext context)
+ {
+ _startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
+ _startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
+
+ _process = Process.Start(_startInfo);
+
+ ArgumentNullException.ThrowIfNull(_process);
+
+ InputStream = _process.StandardInput.BaseStream;
+ OutputStream = _process.StandardOutput.BaseStream;
+ ErrorStream = _process.StandardError;
+
+ await base.InitAsync(context);
+ }
+ }
+}
diff --git a/Flow.Launcher.Plugin/AllowedLanguage.cs b/Flow.Launcher.Plugin/AllowedLanguage.cs
index 94c645d27..395f5f37f 100644
--- a/Flow.Launcher.Plugin/AllowedLanguage.cs
+++ b/Flow.Launcher.Plugin/AllowedLanguage.cs
@@ -1,4 +1,6 @@
-namespace Flow.Launcher.Plugin
+using System;
+
+namespace Flow.Launcher.Plugin
{
///
/// Allowed plugin languages
@@ -8,34 +10,27 @@
///
/// Python
///
- public static string Python
- {
- get { return "PYTHON"; }
- }
+ public const string Python = "PYTHON";
+
+ ///
+ /// Python V2
+ ///
+ public const string PythonV2 = "PYTHON_V2";
///
/// C#
///
- public static string CSharp
- {
- get { return "CSHARP"; }
- }
+ public const string CSharp = "CSHARP";
///
/// F#
///
- public static string FSharp
- {
- get { return "FSHARP"; }
- }
+ public const string FSharp = "FSHARP";
///
/// Standard .exe
///
- public static string Executable
- {
- get { return "EXECUTABLE"; }
- }
+ public const string Executable = "EXECUTABLE";
///
/// Determines if this language is a .NET language
@@ -56,8 +51,9 @@
public static bool IsAllowed(string language)
{
return IsDotNet(language)
- || language.ToUpper() == Python.ToUpper()
- || language.ToUpper() == Executable.ToUpper();
+ || String.Equals(language, Python, StringComparison.CurrentCultureIgnoreCase)
+ || String.Equals(language, PythonV2, StringComparison.CurrentCultureIgnoreCase)
+ || String.Equals(language, Executable, StringComparison.CurrentCultureIgnoreCase);
}
}
}
diff --git a/Flow.Launcher.Plugin/Query.cs b/Flow.Launcher.Plugin/Query.cs
index 95547d273..0983e882e 100644
--- a/Flow.Launcher.Plugin/Query.cs
+++ b/Flow.Launcher.Plugin/Query.cs
@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json.Serialization;
namespace Flow.Launcher.Plugin
{
@@ -71,26 +72,31 @@ namespace Flow.Launcher.Plugin
public string ActionKeyword { get; init; }
+ [JsonIgnore]
///
/// Return first search split by space if it has
///
public string FirstSearch => SplitSearch(0);
-
+
+ [JsonIgnore]
private string _secondToEndSearch;
-
+
///
/// strings from second search (including) to last search
///
+ [JsonIgnore]
public string SecondToEndSearch => SearchTerms.Length > 1 ? (_secondToEndSearch ??= string.Join(' ', SearchTerms[1..])) : "";
///
/// Return second search split by space if it has
///
+ [JsonIgnore]
public string SecondSearch => SplitSearch(1);
///
/// Return third search split by space if it has
///
+ [JsonIgnore]
public string ThirdSearch => SplitSearch(2);
private string SplitSearch(int index)
diff --git a/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs b/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs
index fb91c6388..ffa601ecd 100644
--- a/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs
+++ b/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs
@@ -14,7 +14,7 @@ namespace Flow.Launcher.Test.Plugins
{
[TestFixture]
// ReSharper disable once InconsistentNaming
- internal class JsonRPCPluginTest : JsonRPCPlugin
+ internal class JsonRPCPluginTest : JsonRpcPlugin
{
public override string SupportedLanguage { get; set; } = AllowedLanguage.Executable;
@@ -56,21 +56,14 @@ namespace Flow.Launcher.Test.Plugins
public static List ResponseModelsSource = new()
{
- new()
+ new JsonRPCQueryResponseModel(0, new List()),
+ new JsonRPCQueryResponseModel(0, new List
{
- Result = new()
- },
- new()
- {
- Result = new()
+ new JsonRPCResult
{
- new JsonRPCResult
- {
- Title = "Test1",
- SubTitle = "Test2"
- }
+ Title = "Test1", SubTitle = "Test2"
}
- }
+ })
};
[TestCaseSource(typeof(JsonRPCPluginTest), nameof(ResponseModelsSource))]
@@ -97,4 +90,4 @@ namespace Flow.Launcher.Test.Plugins
}
}
-}
\ No newline at end of file
+}
From 094da0ef0a1295508d6ac5a5b4564ff5e0795a7a Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Wed, 31 Aug 2022 21:37:29 -0500
Subject: [PATCH 002/177] Rollback rename
---
Flow.Launcher.Core/Plugin/ExecutablePlugin.cs | 2 +-
Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs | 4 ++--
Flow.Launcher.Core/Plugin/PythonPlugin.cs | 2 +-
Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs | 2 +-
4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs b/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
index 1023ca933..049d1c583 100644
--- a/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
+++ b/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
@@ -6,7 +6,7 @@ using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Plugin
{
- internal class ExecutablePlugin : JsonRpcPlugin
+ internal class ExecutablePlugin : JsonRPCPlugin
{
private readonly ProcessStartInfo _startInfo;
public override string SupportedLanguage { get; set; } = AllowedLanguage.Executable;
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
index 222ec5a24..00931f380 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
@@ -29,7 +29,7 @@ namespace Flow.Launcher.Core.Plugin
/// Represent the plugin that using JsonPRC
/// every JsonRPC plugin should has its own plugin instance
///
- internal abstract class JsonRpcPlugin : IAsyncPlugin, IContextMenu, ISettingProvider, ISavable
+ internal abstract class JsonRPCPlugin : IAsyncPlugin, IContextMenu, ISettingProvider, ISavable
{
protected PluginInitContext Context;
public const string JsonRpc = "JsonRPC";
@@ -278,7 +278,7 @@ namespace Flow.Launcher.Core.Plugin
{
case (0, 0):
const string errorMessage = "Empty JSON-RPC Response.";
- Log.Warn($"|{nameof(JsonRpcPlugin)}.{nameof(ExecuteAsync)}|{errorMessage}");
+ Log.Warn($"|{nameof(JsonRPCPlugin)}.{nameof(ExecuteAsync)}|{errorMessage}");
break;
case (_, not 0):
throw new InvalidDataException(Encoding.UTF8.GetString(errorBuffer.ToArray())); // The process has exited with an error message
diff --git a/Flow.Launcher.Core/Plugin/PythonPlugin.cs b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
index 62400db38..3c7b89f9a 100644
--- a/Flow.Launcher.Core/Plugin/PythonPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
@@ -8,7 +8,7 @@ using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Plugin
{
- internal class PythonPlugin : JsonRpcPlugin
+ internal class PythonPlugin : JsonRPCPlugin
{
private readonly ProcessStartInfo _startInfo;
public override string SupportedLanguage { get; set; } = AllowedLanguage.Python;
diff --git a/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs b/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs
index ffa601ecd..216514722 100644
--- a/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs
+++ b/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs
@@ -14,7 +14,7 @@ namespace Flow.Launcher.Test.Plugins
{
[TestFixture]
// ReSharper disable once InconsistentNaming
- internal class JsonRPCPluginTest : JsonRpcPlugin
+ internal class JsonRPCPluginTest : JsonRPCPlugin
{
public override string SupportedLanguage { get; set; } = AllowedLanguage.Executable;
From 2fd13c08d852752de83e7bfc0252ea21886f6506 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Wed, 31 Aug 2022 21:38:10 -0500
Subject: [PATCH 003/177] Rollback rename
---
Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs | 2 +-
Flow.Launcher.Core/Plugin/PythonPlugin.cs | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
index 00931f380..e5098ab92 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
@@ -32,7 +32,7 @@ namespace Flow.Launcher.Core.Plugin
internal abstract class JsonRPCPlugin : IAsyncPlugin, IContextMenu, ISettingProvider, ISavable
{
protected PluginInitContext Context;
- public const string JsonRpc = "JsonRPC";
+ public const string JsonRPC = "JsonRPC";
///
/// The language this JsonRPCPlugin support
diff --git a/Flow.Launcher.Core/Plugin/PythonPlugin.cs b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
index 3c7b89f9a..0d97e36dd 100644
--- a/Flow.Launcher.Core/Plugin/PythonPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
@@ -25,7 +25,7 @@ namespace Flow.Launcher.Core.Plugin
};
// temp fix for issue #667
- var path = Path.Combine(Constant.ProgramDirectory, JsonRpc);
+ var path = Path.Combine(Constant.ProgramDirectory, JsonRPC);
_startInfo.EnvironmentVariables["PYTHONPATH"] = path;
_startInfo.EnvironmentVariables["FLOW_VERSION"] = Constant.Version;
From 16dcdf01fdaa1c49946e505a9a23f3d18777002d Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sun, 26 Mar 2023 01:12:21 -0500
Subject: [PATCH 004/177] load v2 plugins
---
.../Environments/AbstractPluginEnvironment.cs | 24 +++----------------
.../Environments/PythonV2Environment.cs | 13 ++++++++++
Flow.Launcher.Core/Plugin/PluginsLoader.cs | 3 +++
3 files changed, 19 insertions(+), 21 deletions(-)
create mode 100644 Flow.Launcher.Core/ExternalPlugins/Environments/PythonV2Environment.cs
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/AbstractPluginEnvironment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/AbstractPluginEnvironment.cs
index 9ebacc942..40eb1be3e 100644
--- a/Flow.Launcher.Core/ExternalPlugins/Environments/AbstractPluginEnvironment.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/AbstractPluginEnvironment.cs
@@ -41,18 +41,6 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
if (!PluginMetadataList.Any(o => o.Language.Equals(Language, StringComparison.OrdinalIgnoreCase)))
return new List();
- // TODO: Remove. This is backwards compatibility for 1.10.0 release- changed PythonEmbeded to Environments/Python
- if (Language.Equals(AllowedLanguage.Python, StringComparison.OrdinalIgnoreCase))
- {
- FilesFolders.RemoveFolderIfExists(Path.Combine(DataLocation.DataDirectory(), "PythonEmbeddable"));
-
- if (!string.IsNullOrEmpty(PluginSettings.PythonDirectory) && PluginSettings.PythonDirectory.StartsWith(Path.Combine(DataLocation.DataDirectory(), "PythonEmbeddable")))
- {
- InstallEnvironment();
- PluginSettings.PythonDirectory = string.Empty;
- }
- }
-
if (!string.IsNullOrEmpty(PluginsSettingsFilePath) && FilesFolders.FileExists(PluginsSettingsFilePath))
{
// Ensure latest only if user is using Flow's environment setup.
@@ -70,7 +58,7 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
string.Empty, MessageBoxButtons.YesNo) == DialogResult.No)
{
var msg = $"Please select the {EnvName} executable";
- var selectedFile = string.Empty;
+ string selectedFile;
selectedFile = GetFileFromDialog(msg, FileDialogFilter);
@@ -143,14 +131,8 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
};
var result = dlg.ShowDialog();
- if (result == DialogResult.OK)
- {
- return dlg.FileName;
- }
- else
- {
- return string.Empty;
- }
+ return result == DialogResult.OK ? dlg.FileName : string.Empty;
+
}
///
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/PythonV2Environment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/PythonV2Environment.cs
new file mode 100644
index 000000000..180893774
--- /dev/null
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/PythonV2Environment.cs
@@ -0,0 +1,13 @@
+using System.Collections.Generic;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.Core.ExternalPlugins.Environments
+{
+ internal class PythonV2Environment : PythonEnvironment
+ {
+ internal override string Language => AllowedLanguage.PythonV2;
+
+ internal PythonV2Environment(List pluginMetadataList, PluginsSettings pluginSettings) : base(pluginMetadataList, pluginSettings) { }
+ }
+}
diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
index e6329aba1..92e40fe66 100644
--- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs
+++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
@@ -19,9 +19,11 @@ namespace Flow.Launcher.Core.Plugin
var dotnetPlugins = DotNetPlugins(metadatas);
var pythonEnv = new PythonEnvironment(metadatas, settings);
+ var pythonV2Env = new PythonV2Environment(metadatas, settings);
var tsEnv = new TypeScriptEnvironment(metadatas, settings);
var jsEnv = new JavaScriptEnvironment(metadatas, settings);
var pythonPlugins = pythonEnv.Setup();
+ var pythonV2Plugins = pythonV2Env.Setup();
var tsPlugins = tsEnv.Setup();
var jsPlugins = jsEnv.Setup();
@@ -29,6 +31,7 @@ namespace Flow.Launcher.Core.Plugin
var plugins = dotnetPlugins
.Concat(pythonPlugins)
+ .Concat(pythonV2Plugins)
.Concat(tsPlugins)
.Concat(jsPlugins)
.Concat(executablePlugins)
From 683f6ebce4cb56276c6fe6350ec7963cb4252a24 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sun, 26 Mar 2023 02:24:31 -0500
Subject: [PATCH 005/177] refactor jsonrpc structure (extract setting to a
standalone file PortableSettings.cs)
---
Flow.Launcher.Core/Plugin/JsonPRCModel.cs | 6 +-
Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs | 462 +-----------------
.../Plugin/JsonRPCPluginBase.cs | 176 +++++++
Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs | 4 +-
Flow.Launcher.Core/Plugin/PortableSettings.cs | 402 +++++++++++++++
.../Storage/JsonStorage.cs | 105 +++-
6 files changed, 704 insertions(+), 451 deletions(-)
create mode 100644 Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
create mode 100644 Flow.Launcher.Core/Plugin/PortableSettings.cs
diff --git a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
index cc06c8a0b..477ee620d 100644
--- a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
+++ b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
@@ -28,14 +28,14 @@ namespace Flow.Launcher.Core.Plugin
public record JsonRPCResponseModel(int Id, JsonRPCErrorModel Error = default) : JsonRPCBase(Id, Error);
public record JsonRPCQueryResponseModel(int Id,
[property: JsonPropertyName("result")] List Result,
- Dictionary SettingsChange = null,
+ IReadOnlyDictionary SettingsChange = null,
string DebugMessage = "",
JsonRPCErrorModel Error = default) : JsonRPCResponseModel(Id, Error);
public record JsonRPCRequestModel(int Id,
string Method,
object[] Parameters,
- Dictionary Settings = default,
+ IReadOnlyDictionary Settings = default,
JsonRPCErrorModel Error = default) : JsonRPCBase(Id, Error);
@@ -46,7 +46,7 @@ namespace Flow.Launcher.Core.Plugin
int Id,
string Method,
object[] Parameters,
- Dictionary Settings,
+ IReadOnlyDictionary Settings,
bool DontHideAfterAction = false,
JsonRPCErrorModel Error = default) : JsonRPCRequestModel(Id, Method, Parameters, Settings, Error);
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
index d3fc90224..3a7fcb216 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
@@ -33,9 +33,8 @@ namespace Flow.Launcher.Core.Plugin
/// Represent the plugin that using JsonPRC
/// every JsonRPC plugin should has its own plugin instance
///
- internal abstract class JsonRPCPlugin : IAsyncPlugin, IContextMenu, ISettingProvider, ISavable
+ internal abstract class JsonRPCPlugin : JsonRPCPluginBase
{
- protected PluginInitContext Context;
public const string JsonRPC = "JsonRPC";
protected abstract Task RequestAsync(JsonRPCRequestModel rpcRequest, CancellationToken token = default);
@@ -48,7 +47,7 @@ namespace Flow.Launcher.Core.Plugin
private string SettingConfigurationPath => Path.Combine(Context.CurrentPluginMetadata.PluginDirectory, "SettingsTemplate.yaml");
private string SettingPath => Path.Combine(DataLocation.PluginSettingsDirectory, Context.CurrentPluginMetadata.Name, "Settings.json");
- public List LoadContextMenus(Result selectedResult)
+ public override List LoadContextMenus(Result selectedResult)
{
var request = new JsonRPCRequestModel(RequestId++,
"context_menu",
@@ -77,7 +76,6 @@ namespace Flow.Launcher.Core.Plugin
{
WriteIndented = true
};
- private Dictionary Settings { get; set; }
private readonly Dictionary _settingControls = new();
@@ -103,85 +101,42 @@ namespace Flow.Launcher.Core.Plugin
return ParseResults(queryResponseModel);
}
-
- private List ParseResults(JsonRPCQueryResponseModel queryResponseModel)
+ protected override async Task ExecuteResultAsync(JsonRPCResult result)
{
- if (queryResponseModel.Result == null) return null;
+ if (result.JsonRPCAction == null) return false;
- if (!string.IsNullOrEmpty(queryResponseModel.DebugMessage))
+ if (string.IsNullOrEmpty(result.JsonRPCAction.Method))
{
- Context.API.ShowMsg(queryResponseModel.DebugMessage);
+ return !result.JsonRPCAction.DontHideAfterAction;
}
- foreach (var result in queryResponseModel.Result)
+ if (result.JsonRPCAction.Method.StartsWith("Flow.Launcher."))
{
- result.AsyncAction = async c =>
+ ExecuteFlowLauncherAPI(result.JsonRPCAction.Method["Flow.Launcher.".Length..],
+ result.JsonRPCAction.Parameters);
+ }
+ else
+ {
+ await using var actionResponse = await RequestAsync(result.JsonRPCAction);
+
+ if (actionResponse.Length == 0)
{
- UpdateSettings(result.SettingsChange);
-
- if (result.JsonRPCAction == null) return false;
-
- if (string.IsNullOrEmpty(result.JsonRPCAction.Method))
- {
- return !result.JsonRPCAction.DontHideAfterAction;
- }
-
- if (result.JsonRPCAction.Method.StartsWith("Flow.Launcher."))
- {
- ExecuteFlowLauncherAPI(result.JsonRPCAction.Method["Flow.Launcher.".Length..],
- result.JsonRPCAction.Parameters);
- }
- else
- {
- await using var actionResponse = await RequestAsync(result.JsonRPCAction);
-
- if (actionResponse.Length == 0)
- {
- return !result.JsonRPCAction.DontHideAfterAction;
- }
-
- var jsonRpcRequestModel = await
- JsonSerializer.DeserializeAsync(actionResponse, options);
-
- if (jsonRpcRequestModel?.Method?.StartsWith("Flow.Launcher.") ?? false)
- {
- ExecuteFlowLauncherAPI(jsonRpcRequestModel.Method["Flow.Launcher.".Length..],
- jsonRpcRequestModel.Parameters);
- }
- }
-
return !result.JsonRPCAction.DontHideAfterAction;
- };
+ }
+
+ var jsonRpcRequestModel = await
+ JsonSerializer.DeserializeAsync(actionResponse, options);
+
+ if (jsonRpcRequestModel?.Method?.StartsWith("Flow.Launcher.") ?? false)
+ {
+ ExecuteFlowLauncherAPI(jsonRpcRequestModel.Method["Flow.Launcher.".Length..],
+ jsonRpcRequestModel.Parameters);
+ }
}
- var results = new List();
-
- results.AddRange(queryResponseModel.Result);
-
- UpdateSettings(queryResponseModel.SettingsChange);
-
- return results;
+ return !result.JsonRPCAction.DontHideAfterAction;
}
- private void ExecuteFlowLauncherAPI(string method, object[] parameters)
- {
- var parametersTypeArray = parameters.Select(param => param.GetType()).ToArray();
- var methodInfo = typeof(IPublicAPI).GetMethod(method, parametersTypeArray);
- if (methodInfo == null)
- {
- return;
- }
- try
- {
- methodInfo.Invoke(PluginManager.API, parameters);
- }
- catch (Exception)
- {
-#if (DEBUG)
- throw;
-#endif
- }
- }
///
/// Execute external program and return the output
@@ -297,373 +252,10 @@ namespace Flow.Launcher.Core.Plugin
}
- public async Task> QueryAsync(Query query, CancellationToken token)
+ protected override async Task> QueryRequestAsync(JsonRPCRequestModel request, CancellationToken token)
{
- var request = new JsonRPCRequestModel(RequestId++,
- "query",
- new object[]{ query.Search },
- Settings);
var output = await RequestAsync(request, token);
return await DeserializedResultAsync(output);
}
-
- private async Task InitSettingAsync()
- {
- if (!File.Exists(SettingConfigurationPath))
- return;
-
- if (File.Exists(SettingPath))
- {
- await using var fileStream = File.OpenRead(SettingPath);
- Settings = await JsonSerializer.DeserializeAsync>(fileStream, options);
- }
-
- var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
- _settingsTemplate = deserializer.Deserialize(await File.ReadAllTextAsync(SettingConfigurationPath));
-
- Settings ??= new Dictionary();
-
- foreach (var (type, attribute) in _settingsTemplate.Body)
- {
- if (type == "textBlock")
- continue;
- if (!Settings.ContainsKey(attribute.Name))
- {
- Settings[attribute.Name] = attribute.DefaultValue;
- }
- }
- }
-
- public virtual async Task InitAsync(PluginInitContext context)
- {
- this.Context = context;
- await InitSettingAsync();
- }
- private static readonly Thickness settingControlMargin = new(0, 9, 18, 9);
- private static readonly Thickness settingCheckboxMargin = new(0, 9, 9, 9);
- private static readonly Thickness settingPanelMargin = new(0, 0, 0, 0);
- private static readonly Thickness settingTextBlockMargin = new(70, 9, 18, 9);
- private static readonly Thickness settingLabelPanelMargin = new(70, 9, 18, 9);
- private static readonly Thickness settingLabelMargin = new(0, 0, 0, 0);
- private static readonly Thickness settingDescMargin = new(0, 2, 0, 0);
- private static readonly Thickness settingSepMargin = new(0, 0, 0, 2);
- private JsonRpcConfigurationModel _settingsTemplate;
-
- public Control CreateSettingPanel()
- {
- if (Settings == null)
- return new();
- var settingWindow = new UserControl();
- var mainPanel = new Grid
- {
- Margin = settingPanelMargin, VerticalAlignment = VerticalAlignment.Center
- };
- ColumnDefinition gridCol1 = new ColumnDefinition();
- ColumnDefinition gridCol2 = new ColumnDefinition();
-
- gridCol1.Width = new GridLength(70, GridUnitType.Star);
- gridCol2.Width = new GridLength(30, GridUnitType.Star);
- mainPanel.ColumnDefinitions.Add(gridCol1);
- mainPanel.ColumnDefinitions.Add(gridCol2);
- settingWindow.Content = mainPanel;
- int rowCount = 0;
- foreach (var (type, attribute) in _settingsTemplate.Body)
- {
- Separator sep = new Separator();
- sep.VerticalAlignment = VerticalAlignment.Top;
- sep.Margin = settingSepMargin;
- sep.SetResourceReference(Separator.BackgroundProperty, "Color03B"); /* for theme change */
- var panel = new StackPanel
- {
- Orientation = Orientation.Vertical,
- VerticalAlignment = VerticalAlignment.Center,
- Margin = settingLabelPanelMargin
- };
- RowDefinition gridRow = new RowDefinition();
- mainPanel.RowDefinitions.Add(gridRow);
- var name = new TextBlock()
- {
- Text = attribute.Label,
- VerticalAlignment = VerticalAlignment.Center,
- Margin = settingLabelMargin,
- TextWrapping = TextWrapping.WrapWithOverflow
- };
- var desc = new TextBlock()
- {
- Text = attribute.Description,
- FontSize = 12,
- VerticalAlignment = VerticalAlignment.Center,
- Margin = settingDescMargin,
- TextWrapping = TextWrapping.WrapWithOverflow
- };
- desc.SetResourceReference(TextBlock.ForegroundProperty, "Color04B");
-
- if (attribute.Description == null) /* if no description, hide */
- desc.Visibility = Visibility.Collapsed;
-
-
- if (type != "textBlock") /* if textBlock, hide desc */
- {
- panel.Children.Add(name);
- panel.Children.Add(desc);
- }
-
-
- Grid.SetColumn(panel, 0);
- Grid.SetRow(panel, rowCount);
-
- FrameworkElement contentControl;
-
- switch (type)
- {
- case "textBlock":
- {
- contentControl = new TextBlock
- {
- Text = attribute.Description.Replace("\\r\\n", "\r\n"),
- Margin = settingTextBlockMargin,
- Padding = new Thickness(0, 0, 0, 0),
- HorizontalAlignment = System.Windows.HorizontalAlignment.Left,
- TextAlignment = TextAlignment.Left,
- TextWrapping = TextWrapping.Wrap
- };
- Grid.SetColumn(contentControl, 0);
- Grid.SetColumnSpan(contentControl, 2);
- Grid.SetRow(contentControl, rowCount);
- if (rowCount != 0)
- mainPanel.Children.Add(sep);
- Grid.SetRow(sep, rowCount);
- Grid.SetColumn(sep, 0);
- Grid.SetColumnSpan(sep, 2);
- break;
- }
- case "input":
- {
- var textBox = new TextBox()
- {
- Text = Settings[attribute.Name] as string ?? string.Empty,
- Margin = settingControlMargin,
- HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
- ToolTip = attribute.Description
- };
- textBox.TextChanged += (_, _) =>
- {
- Settings[attribute.Name] = textBox.Text;
- };
- contentControl = textBox;
- Grid.SetColumn(contentControl, 1);
- Grid.SetRow(contentControl, rowCount);
- if (rowCount != 0)
- mainPanel.Children.Add(sep);
- Grid.SetRow(sep, rowCount);
- Grid.SetColumn(sep, 0);
- Grid.SetColumnSpan(sep, 2);
- break;
- }
- case "inputWithFileBtn":
- {
- var textBox = new TextBox()
- {
- Margin = new Thickness(10, 0, 0, 0),
- Text = Settings[attribute.Name] as string ?? string.Empty,
- HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
- ToolTip = attribute.Description
- };
- textBox.TextChanged += (_, _) =>
- {
- Settings[attribute.Name] = textBox.Text;
- };
- var Btn = new System.Windows.Controls.Button()
- {
- Margin = new Thickness(10, 0, 0, 0), Content = "Browse"
- };
- var dockPanel = new DockPanel()
- {
- Margin = settingControlMargin
- };
- DockPanel.SetDock(Btn, Dock.Right);
- dockPanel.Children.Add(Btn);
- dockPanel.Children.Add(textBox);
- contentControl = dockPanel;
- Grid.SetColumn(contentControl, 1);
- Grid.SetRow(contentControl, rowCount);
- if (rowCount != 0)
- mainPanel.Children.Add(sep);
- Grid.SetRow(sep, rowCount);
- Grid.SetColumn(sep, 0);
- Grid.SetColumnSpan(sep, 2);
- break;
- }
- case "textarea":
- {
- var textBox = new TextBox()
- {
- Height = 120,
- Margin = settingControlMargin,
- VerticalAlignment = VerticalAlignment.Center,
- TextWrapping = TextWrapping.WrapWithOverflow,
- AcceptsReturn = true,
- HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
- Text = Settings[attribute.Name] as string ?? string.Empty,
- ToolTip = attribute.Description
- };
- textBox.TextChanged += (sender, _) =>
- {
- Settings[attribute.Name] = ((TextBox)sender).Text;
- };
- contentControl = textBox;
- Grid.SetColumn(contentControl, 1);
- Grid.SetRow(contentControl, rowCount);
- if (rowCount != 0)
- mainPanel.Children.Add(sep);
- Grid.SetRow(sep, rowCount);
- Grid.SetColumn(sep, 0);
- Grid.SetColumnSpan(sep, 2);
- break;
- }
- case "passwordBox":
- {
- var passwordBox = new PasswordBox()
- {
- Margin = settingControlMargin,
- Password = Settings[attribute.Name] as string ?? string.Empty,
- PasswordChar = attribute.passwordChar == default ? '*' : attribute.passwordChar,
- HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
- ToolTip = attribute.Description
- };
- passwordBox.PasswordChanged += (sender, _) =>
- {
- Settings[attribute.Name] = ((PasswordBox)sender).Password;
- };
- contentControl = passwordBox;
- Grid.SetColumn(contentControl, 1);
- Grid.SetRow(contentControl, rowCount);
- if (rowCount != 0)
- mainPanel.Children.Add(sep);
- Grid.SetRow(sep, rowCount);
- Grid.SetColumn(sep, 0);
- Grid.SetColumnSpan(sep, 2);
- break;
- }
- case "dropdown":
- {
- var comboBox = new System.Windows.Controls.ComboBox()
- {
- ItemsSource = attribute.Options,
- SelectedItem = Settings[attribute.Name],
- Margin = settingControlMargin,
- HorizontalAlignment = System.Windows.HorizontalAlignment.Right,
- ToolTip = attribute.Description
- };
- comboBox.SelectionChanged += (sender, _) =>
- {
- Settings[attribute.Name] = (string)((System.Windows.Controls.ComboBox)sender).SelectedItem;
- };
- contentControl = comboBox;
- Grid.SetColumn(contentControl, 1);
- Grid.SetRow(contentControl, rowCount);
- if (rowCount != 0)
- mainPanel.Children.Add(sep);
- Grid.SetRow(sep, rowCount);
- Grid.SetColumn(sep, 0);
- Grid.SetColumnSpan(sep, 2);
- break;
- }
- case "checkbox":
- var checkBox = new CheckBox
- {
- IsChecked = Settings[attribute.Name] is bool isChecked ? isChecked : bool.Parse(attribute.DefaultValue),
- Margin = settingCheckboxMargin,
- HorizontalAlignment = System.Windows.HorizontalAlignment.Right,
- ToolTip = attribute.Description
- };
- checkBox.Click += (sender, _) =>
- {
- Settings[attribute.Name] = ((CheckBox)sender).IsChecked;
- };
- contentControl = checkBox;
- Grid.SetColumn(contentControl, 1);
- Grid.SetRow(contentControl, rowCount);
- if (rowCount != 0)
- mainPanel.Children.Add(sep);
- Grid.SetRow(sep, rowCount);
- Grid.SetColumn(sep, 0);
- Grid.SetColumnSpan(sep, 2);
- break;
- case "hyperlink":
- var hyperlink = new Hyperlink
- {
- ToolTip = attribute.Description, NavigateUri = attribute.url
- };
- var linkbtn = new System.Windows.Controls.Button
- {
- HorizontalAlignment = System.Windows.HorizontalAlignment.Right, Margin = settingControlMargin
- };
- linkbtn.Content = attribute.urlLabel;
-
- contentControl = linkbtn;
- Grid.SetColumn(contentControl, 1);
- Grid.SetRow(contentControl, rowCount);
- if (rowCount != 0)
- mainPanel.Children.Add(sep);
- Grid.SetRow(sep, rowCount);
- Grid.SetColumn(sep, 0);
- Grid.SetColumnSpan(sep, 2);
- break;
- default:
- continue;
- }
- if (type != "textBlock")
- _settingControls[attribute.Name] = contentControl;
- mainPanel.Children.Add(panel);
- mainPanel.Children.Add(contentControl);
- rowCount++;
-
- }
- return settingWindow;
- }
-
- public void Save()
- {
- if (Settings != null)
- {
- Helper.ValidateDirectory(Path.Combine(DataLocation.PluginSettingsDirectory, Context.CurrentPluginMetadata.Name));
- File.WriteAllText(SettingPath, JsonSerializer.Serialize(Settings, settingSerializeOption));
- }
- }
-
- public void UpdateSettings(Dictionary settings)
- {
- if (settings == null || settings.Count == 0)
- return;
-
- foreach (var (key, value) in settings)
- {
- if (Settings.ContainsKey(key))
- {
- Settings[key] = value;
- }
- if (_settingControls.ContainsKey(key))
- {
-
- switch (_settingControls[key])
- {
- case TextBox textBox:
- textBox.Dispatcher.Invoke(() => textBox.Text = value as string);
- break;
- case PasswordBox passwordBox:
- passwordBox.Dispatcher.Invoke(() => passwordBox.Password = value as string);
- break;
- case System.Windows.Controls.ComboBox comboBox:
- comboBox.Dispatcher.Invoke(() => comboBox.SelectedItem = value);
- break;
- case CheckBox checkBox:
- checkBox.Dispatcher.Invoke(() => checkBox.IsChecked = value is bool isChecked ? isChecked : bool.Parse(value as string));
- break;
- }
- }
- }
- }
}
-
}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
new file mode 100644
index 000000000..2ff076926
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
@@ -0,0 +1,176 @@
+using Flow.Launcher.Core.Resource;
+using Flow.Launcher.Infrastructure;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
+using Flow.Launcher.Infrastructure.Logger;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+using Microsoft.IO;
+using System.Windows;
+using System.Windows.Controls;
+using YamlDotNet.Serialization;
+using YamlDotNet.Serialization.NamingConventions;
+using CheckBox = System.Windows.Controls.CheckBox;
+using Control = System.Windows.Controls.Control;
+using Orientation = System.Windows.Controls.Orientation;
+using TextBox = System.Windows.Controls.TextBox;
+using UserControl = System.Windows.Controls.UserControl;
+using System.Windows.Documents;
+using static System.Windows.Forms.LinkLabel;
+using Droplex;
+using System.Windows.Forms;
+using Microsoft.VisualStudio.Threading;
+
+namespace Flow.Launcher.Core.Plugin
+{
+ ///
+ /// Represent the plugin that using JsonPRC
+ /// every JsonRPC plugin should has its own plugin instance
+ ///
+ internal abstract class JsonRPCPluginBase : IAsyncPlugin, IContextMenu, ISettingProvider, ISavable
+ {
+ protected PluginInitContext Context;
+ public const string JsonRPC = "JsonRPC";
+
+ private int RequestId { get; set; }
+
+ private string SettingConfigurationPath => Path.Combine(Context.CurrentPluginMetadata.PluginDirectory, "SettingsTemplate.yaml");
+
+ private string SettingPath => Path.Combine(DataLocation.PluginSettingsDirectory, Context.CurrentPluginMetadata.Name, "Settings.json");
+
+ public abstract List LoadContextMenus(Result selectedResult);
+
+ private static readonly JsonSerializerOptions options = new()
+ {
+ PropertyNameCaseInsensitive = true,
+#pragma warning disable SYSLIB0020
+ // IgnoreNullValues is obsolete, but the replacement JsonIgnoreCondition.WhenWritingNull still
+ // deserializes null, instead of ignoring it and leaving the default (empty list). We can change the behaviour
+ // to accept null and fallback to a default etc, or just keep IgnoreNullValues for now
+ // see: https://github.com/dotnet/runtime/issues/39152
+ IgnoreNullValues = true,
+#pragma warning restore SYSLIB0020 // Type or member is obsolete
+ Converters =
+ {
+ new JsonObjectConverter()
+ }
+ };
+
+ private static readonly JsonSerializerOptions settingSerializeOption = new()
+ {
+ WriteIndented = true
+ };
+
+ private readonly Dictionary _settingControls = new();
+
+ protected abstract Task ExecuteResultAsync(JsonRPCResult result);
+ protected abstract Task> QueryRequestAsync(JsonRPCRequestModel request, CancellationToken token);
+
+ protected PortableSettings Settings { get; set; }
+
+ protected List ParseResults(JsonRPCQueryResponseModel queryResponseModel)
+ {
+ if (queryResponseModel.Result == null) return null;
+
+ if (!string.IsNullOrEmpty(queryResponseModel.DebugMessage))
+ {
+ Context.API.ShowMsg(queryResponseModel.DebugMessage);
+ }
+
+ foreach (var result in queryResponseModel.Result)
+ {
+ result.AsyncAction = async c =>
+ {
+ Settings.UpdateSettings(result.SettingsChange);
+
+ return await ExecuteResultAsync(result);
+ };
+ }
+
+ var results = new List();
+
+ results.AddRange(queryResponseModel.Result);
+
+ Settings.UpdateSettings(queryResponseModel.SettingsChange);
+
+ return results;
+ }
+
+ protected void ExecuteFlowLauncherAPI(string method, object[] parameters)
+ {
+ var parametersTypeArray = parameters.Select(param => param.GetType()).ToArray();
+ var methodInfo = typeof(IPublicAPI).GetMethod(method, parametersTypeArray);
+
+ if (methodInfo == null)
+ {
+ return;
+ }
+
+ try
+ {
+ methodInfo.Invoke(Context.API, parameters);
+ }
+ catch (Exception)
+ {
+#if (DEBUG)
+ throw;
+#endif
+ }
+ }
+
+ public async Task> QueryAsync(Query query, CancellationToken token)
+ {
+ var request = new JsonRPCRequestModel(RequestId++,
+ "query",
+ new object[]
+ {
+ query.Search
+ },
+ Settings.Inner);
+
+ return await QueryRequestAsync(request, token);
+
+ }
+
+
+ private async Task InitSettingAsync()
+ {
+ if (!File.Exists(SettingConfigurationPath))
+ return;
+
+ var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
+ var configuration = deserializer.Deserialize(await File.ReadAllTextAsync(SettingConfigurationPath));
+
+ Settings ??= new PortableSettings
+ {
+ Configuration = configuration,
+ SettingPath = SettingPath,
+ API = Context.API
+ };
+
+ }
+
+ public virtual async Task InitAsync(PluginInitContext context)
+ {
+ this.Context = context;
+ await InitSettingAsync();
+ }
+
+ public void Save()
+ {
+ Settings.Save();
+ }
+ public Control CreateSettingPanel()
+ {
+ return Settings.CreateSettingPanel();
+ }
+ }
+
+}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
index 0df090cd0..3bef2f191 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
@@ -64,8 +64,8 @@ namespace Flow.Launcher.Core.Plugin
query
});
await InputMessageChannel.Writer.WriteAsync(message, token);
- await Task.Delay(50);
- await InputStream.FlushAsync();
+ await Task.Delay(50, token);
+ await InputStream.FlushAsync(token);
var task = new TaskCompletionSource();
RequestTaskDictionary[currentRequestId] = task;
var result = await task.Task;
diff --git a/Flow.Launcher.Core/Plugin/PortableSettings.cs b/Flow.Launcher.Core/Plugin/PortableSettings.cs
new file mode 100644
index 000000000..36d09c3f1
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/PortableSettings.cs
@@ -0,0 +1,402 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using Flow.Launcher.Infrastructure.Storage;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.Core.Plugin
+{
+ public class PortableSettings
+ {
+ public required JsonRpcConfigurationModel Configuration { get; init; }
+
+ public required string SettingPath { get; init; }
+ public Dictionary SettingControls { get; } = new();
+
+ public IReadOnlyDictionary Inner => Settings;
+ protected Dictionary Settings { get; set; }
+ public required IPublicAPI API { get; init; }
+
+ private JsonStorage> _storage;
+
+ // maybe move to resource?
+ private static readonly Thickness settingControlMargin = new(0, 9, 18, 9);
+ private static readonly Thickness settingCheckboxMargin = new(0, 9, 9, 9);
+ private static readonly Thickness settingPanelMargin = new(0, 0, 0, 0);
+ private static readonly Thickness settingTextBlockMargin = new(70, 9, 18, 9);
+ private static readonly Thickness settingLabelPanelMargin = new(70, 9, 18, 9);
+ private static readonly Thickness settingLabelMargin = new(0, 0, 0, 0);
+ private static readonly Thickness settingDescMargin = new(0, 2, 0, 0);
+ private static readonly Thickness settingSepMargin = new(0, 0, 0, 2);
+
+ public async Task InitializeAsync()
+ {
+ _storage = new JsonStorage>(SettingPath);
+ Settings = await _storage.LoadAsync();
+ }
+
+
+ public void UpdateSettings(IReadOnlyDictionary settings)
+ {
+ if (settings == null || settings.Count == 0)
+ return;
+
+ foreach (var (key, value) in settings)
+ {
+ if (Settings.ContainsKey(key))
+ {
+ Settings[key] = value;
+ }
+
+ if (SettingControls.TryGetValue(key, out var control))
+ {
+ switch (control)
+ {
+ case TextBox textBox:
+ textBox.Dispatcher.Invoke(() => textBox.Text = value as string ?? string.Empty);
+ break;
+ case PasswordBox passwordBox:
+ passwordBox.Dispatcher.Invoke(() => passwordBox.Password = value as string ?? string.Empty);
+ break;
+ case ComboBox comboBox:
+ comboBox.Dispatcher.Invoke(() => comboBox.SelectedItem = value);
+ break;
+ case CheckBox checkBox:
+ checkBox.Dispatcher.Invoke(() => checkBox.IsChecked = value is bool isChecked ? isChecked : bool.Parse(value as string ?? string.Empty));
+ break;
+ }
+ }
+ }
+ }
+
+ public async Task SaveAsync()
+ {
+ await _storage.SaveAsync();
+ }
+
+ public void Save()
+ {
+ _storage.Save();
+ }
+
+ public Control CreateSettingPanel()
+ {
+ if (Settings == null)
+ return new();
+
+ var settingWindow = new UserControl();
+ var mainPanel = new Grid
+ {
+ Margin = settingPanelMargin, VerticalAlignment = VerticalAlignment.Center
+ };
+
+ ColumnDefinition gridCol1 = new ColumnDefinition();
+ ColumnDefinition gridCol2 = new ColumnDefinition();
+
+ gridCol1.Width = new GridLength(70, GridUnitType.Star);
+ gridCol2.Width = new GridLength(30, GridUnitType.Star);
+ mainPanel.ColumnDefinitions.Add(gridCol1);
+ mainPanel.ColumnDefinitions.Add(gridCol2);
+ settingWindow.Content = mainPanel;
+ int rowCount = 0;
+
+ foreach (var (type, attribute) in Configuration.Body)
+ {
+ Separator sep = new Separator();
+ sep.VerticalAlignment = VerticalAlignment.Top;
+ sep.Margin = settingSepMargin;
+ sep.SetResourceReference(Separator.BackgroundProperty, "Color03B"); /* for theme change */
+ var panel = new StackPanel
+ {
+ Orientation = Orientation.Vertical,
+ VerticalAlignment = VerticalAlignment.Center,
+ Margin = settingLabelPanelMargin
+ };
+
+ RowDefinition gridRow = new RowDefinition();
+ mainPanel.RowDefinitions.Add(gridRow);
+ var name = new TextBlock()
+ {
+ Text = attribute.Label,
+ VerticalAlignment = VerticalAlignment.Center,
+ Margin = settingLabelMargin,
+ TextWrapping = TextWrapping.WrapWithOverflow
+ };
+
+ var desc = new TextBlock()
+ {
+ Text = attribute.Description,
+ FontSize = 12,
+ VerticalAlignment = VerticalAlignment.Center,
+ Margin = settingDescMargin,
+ TextWrapping = TextWrapping.WrapWithOverflow
+ };
+
+ desc.SetResourceReference(TextBlock.ForegroundProperty, "Color04B");
+
+ if (attribute.Description == null) /* if no description, hide */
+ desc.Visibility = Visibility.Collapsed;
+
+
+ if (type != "textBlock") /* if textBlock, hide desc */
+ {
+ panel.Children.Add(name);
+ panel.Children.Add(desc);
+ }
+
+
+ Grid.SetColumn(panel, 0);
+ Grid.SetRow(panel, rowCount);
+
+ FrameworkElement contentControl;
+
+ switch (type)
+ {
+ case "textBlock":
+ {
+ contentControl = new TextBlock
+ {
+ Text = attribute.Description.Replace("\\r\\n", "\r\n"),
+ Margin = settingTextBlockMargin,
+ Padding = new Thickness(0, 0, 0, 0),
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Left,
+ TextAlignment = TextAlignment.Left,
+ TextWrapping = TextWrapping.Wrap
+ };
+
+ Grid.SetColumn(contentControl, 0);
+ Grid.SetColumnSpan(contentControl, 2);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+
+ break;
+ }
+ case "input":
+ {
+ var textBox = new TextBox()
+ {
+ Text = Settings[attribute.Name] as string ?? string.Empty,
+ Margin = settingControlMargin,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
+ ToolTip = attribute.Description
+ };
+
+ textBox.TextChanged += (_, _) =>
+ {
+ Settings[attribute.Name] = textBox.Text;
+ };
+
+ contentControl = textBox;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+
+ break;
+ }
+ case "inputWithFileBtn":
+ {
+ var textBox = new TextBox()
+ {
+ Margin = new Thickness(10, 0, 0, 0),
+ Text = Settings[attribute.Name] as string ?? string.Empty,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
+ ToolTip = attribute.Description
+ };
+
+ textBox.TextChanged += (_, _) =>
+ {
+ Settings[attribute.Name] = textBox.Text;
+ };
+
+ var Btn = new System.Windows.Controls.Button()
+ {
+ Margin = new Thickness(10, 0, 0, 0), Content = "Browse"
+ };
+
+ var dockPanel = new DockPanel()
+ {
+ Margin = settingControlMargin
+ };
+
+ DockPanel.SetDock(Btn, Dock.Right);
+ dockPanel.Children.Add(Btn);
+ dockPanel.Children.Add(textBox);
+ contentControl = dockPanel;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+
+ break;
+ }
+ case "textarea":
+ {
+ var textBox = new TextBox()
+ {
+ Height = 120,
+ Margin = settingControlMargin,
+ VerticalAlignment = VerticalAlignment.Center,
+ TextWrapping = TextWrapping.WrapWithOverflow,
+ AcceptsReturn = true,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
+ Text = Settings[attribute.Name] as string ?? string.Empty,
+ ToolTip = attribute.Description
+ };
+
+ textBox.TextChanged += (sender, _) =>
+ {
+ Settings[attribute.Name] = ((TextBox)sender).Text;
+ };
+
+ contentControl = textBox;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+
+ break;
+ }
+ case "passwordBox":
+ {
+ var passwordBox = new PasswordBox()
+ {
+ Margin = settingControlMargin,
+ Password = Settings[attribute.Name] as string ?? string.Empty,
+ PasswordChar = attribute.passwordChar == default ? '*' : attribute.passwordChar,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
+ ToolTip = attribute.Description
+ };
+
+ passwordBox.PasswordChanged += (sender, _) =>
+ {
+ Settings[attribute.Name] = ((PasswordBox)sender).Password;
+ };
+
+ contentControl = passwordBox;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+
+ break;
+ }
+ case "dropdown":
+ {
+ var comboBox = new System.Windows.Controls.ComboBox()
+ {
+ ItemsSource = attribute.Options,
+ SelectedItem = Settings[attribute.Name],
+ Margin = settingControlMargin,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Right,
+ ToolTip = attribute.Description
+ };
+
+ comboBox.SelectionChanged += (sender, _) =>
+ {
+ Settings[attribute.Name] = (string)((System.Windows.Controls.ComboBox)sender).SelectedItem;
+ };
+
+ contentControl = comboBox;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+
+ break;
+ }
+ case "checkbox":
+ var checkBox = new CheckBox
+ {
+ IsChecked = Settings[attribute.Name] is bool isChecked ? isChecked : bool.Parse(attribute.DefaultValue),
+ Margin = settingCheckboxMargin,
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Right,
+ ToolTip = attribute.Description
+ };
+
+ checkBox.Click += (sender, _) =>
+ {
+ Settings[attribute.Name] = ((CheckBox)sender).IsChecked;
+ };
+
+ contentControl = checkBox;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+
+ break;
+ case "hyperlink":
+ var hyperlink = new Hyperlink
+ {
+ ToolTip = attribute.Description, NavigateUri = attribute.url
+ };
+
+ var linkbtn = new System.Windows.Controls.Button
+ {
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Right, Margin = settingControlMargin
+ };
+
+ linkbtn.Content = attribute.urlLabel;
+
+ contentControl = linkbtn;
+ Grid.SetColumn(contentControl, 1);
+ Grid.SetRow(contentControl, rowCount);
+ if (rowCount != 0)
+ mainPanel.Children.Add(sep);
+
+ Grid.SetRow(sep, rowCount);
+ Grid.SetColumn(sep, 0);
+ Grid.SetColumnSpan(sep, 2);
+
+ break;
+ default:
+ continue;
+ }
+
+ if (type != "textBlock")
+ SettingControls[attribute.Name] = contentControl;
+
+ mainPanel.Children.Add(panel);
+ mainPanel.Children.Add(contentControl);
+ rowCount++;
+
+ }
+
+ return settingWindow;
+ }
+
+
+ }
+}
diff --git a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
index 45456ddeb..7181ae225 100644
--- a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
@@ -3,6 +3,7 @@ using System;
using System.Globalization;
using System.IO;
using System.Text.Json;
+using System.Threading.Tasks;
using Flow.Launcher.Infrastructure.Logger;
namespace Flow.Launcher.Infrastructure.Storage
@@ -26,6 +27,82 @@ namespace Flow.Launcher.Infrastructure.Storage
protected string DirectoryPath { get; init; } = null!;
+ // Let the derived class to set the file path
+ protected JsonStorage()
+ {
+ }
+ public JsonStorage(string filePath)
+ {
+ FilePath = filePath;
+ }
+
+ public async Task LoadAsync()
+ {
+ if (Data != null)
+ return Data;
+
+ string? serialized = null;
+
+ if (File.Exists(FilePath))
+ {
+ serialized = await File.ReadAllTextAsync(FilePath);
+ }
+
+ if (!string.IsNullOrEmpty(serialized))
+ {
+ try
+ {
+ Data = JsonSerializer.Deserialize(serialized) ?? await LoadBackupOrDefaultAsync();
+ }
+ catch (JsonException)
+ {
+ Data = await LoadBackupOrDefaultAsync();
+ }
+ }
+ else
+ {
+ Data = await LoadBackupOrDefaultAsync();
+ }
+
+ return Data.NonNull();
+ }
+
+ private async ValueTask LoadBackupOrDefaultAsync()
+ {
+ var backup = await TryLoadBackupAsync();
+
+ return backup ?? LoadDefault();
+ }
+
+ private async ValueTask TryLoadBackupAsync()
+ {
+ if (!File.Exists(BackupFilePath))
+ return default;
+
+ try
+ {
+ await using var source = File.OpenRead(BackupFilePath);
+ var data = await JsonSerializer.DeserializeAsync(source) ?? default;
+
+ if (data != null)
+ RestoreBackup();
+
+ return data;
+ }
+ catch (JsonException)
+ {
+ return default;
+ }
+ }
+ private void RestoreBackup()
+ {
+ Log.Info($"|JsonStorage.Load|Failed to load settings.json, {BackupFilePath} restored successfully");
+
+ if (File.Exists(FilePath))
+ File.Replace(BackupFilePath, FilePath, null);
+ else
+ File.Move(BackupFilePath, FilePath);
+ }
public T Load()
{
@@ -75,18 +152,9 @@ namespace Flow.Launcher.Infrastructure.Storage
var data = JsonSerializer.Deserialize(File.ReadAllText(BackupFilePath));
if (data != null)
- {
- Log.Info($"|JsonStorage.Load|Failed to load settings.json, {BackupFilePath} restored successfully");
-
- if(File.Exists(FilePath))
- File.Replace(BackupFilePath, FilePath, null);
- else
- File.Move(BackupFilePath, FilePath);
+ RestoreBackup();
- return data;
- }
-
- return default;
+ return data;
}
catch (JsonException)
{
@@ -115,6 +183,20 @@ namespace Flow.Launcher.Infrastructure.Storage
File.WriteAllText(TempFilePath, serialized);
+ AtomicWriteSetting();
+ }
+ public async Task SaveAsync()
+ {
+ var tempOutput = File.OpenWrite(TempFilePath);
+ await JsonSerializer.SerializeAsync(tempOutput, Data,
+ new JsonSerializerOptions
+ {
+ WriteIndented = true
+ });
+ AtomicWriteSetting();
+ }
+ private void AtomicWriteSetting()
+ {
if (!File.Exists(FilePath))
{
File.Move(TempFilePath, FilePath);
@@ -124,5 +206,6 @@ namespace Flow.Launcher.Infrastructure.Storage
File.Replace(TempFilePath, FilePath, BackupFilePath);
}
}
+
}
}
From a3367abd7a735f3d3bc0a5c916eb5d8e43106827 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sun, 26 Mar 2023 14:04:06 -0500
Subject: [PATCH 006/177] fix some bug (v1 still broken)
---
.../Plugin/JsonRPCPluginBase.cs | 6 +++--
Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs | 27 ++++---------------
Flow.Launcher.Core/Plugin/PortableSettings.cs | 13 +++++++++
Flow.Launcher.Core/Plugin/PythonPlugin.cs | 3 ++-
Flow.Launcher.Core/Plugin/PythonPluginV2.cs | 13 +++++++--
.../Storage/JsonStorage.cs | 3 +++
6 files changed, 38 insertions(+), 27 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
index 2ff076926..c3790709d 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
@@ -47,7 +47,7 @@ namespace Flow.Launcher.Core.Plugin
public abstract List LoadContextMenus(Result selectedResult);
- private static readonly JsonSerializerOptions options = new()
+ protected static readonly JsonSerializerOptions options = new()
{
PropertyNameCaseInsensitive = true,
#pragma warning disable SYSLIB0020
@@ -155,6 +155,8 @@ namespace Flow.Launcher.Core.Plugin
API = Context.API
};
+ await Settings.InitializeAsync();
+
}
public virtual async Task InitAsync(PluginInitContext context)
@@ -165,7 +167,7 @@ namespace Flow.Launcher.Core.Plugin
public void Save()
{
- Settings.Save();
+ Settings?.Save();
}
public Control CreateSettingPanel()
{
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
index 3bef2f191..bc5d00ed4 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
@@ -11,7 +11,7 @@ using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Plugin
{
- public abstract class JsonRpcPluginV2 : IAsyncPlugin, IContextMenu, ISettingProvider, ISavable
+ internal abstract class JsonRpcPluginV2 : JsonRPCPluginBase
{
public abstract string SupportedLanguage { get; set; }
@@ -56,14 +56,10 @@ namespace Flow.Launcher.Core.Plugin
await JsonSerializer.SerializeAsync(InputStream, fullMessage, cancellationToken: token);
}
- public async Task> QueryAsync(Query query, CancellationToken token)
+ protected override async Task> QueryRequestAsync(JsonRPCRequestModel query, CancellationToken token)
{
int currentRequestId = Interlocked.Add(ref RequestId, 1);
- var message = new JsonRPCRequestModel(currentRequestId, "query", new object[]
- {
- query
- });
- await InputMessageChannel.Writer.WriteAsync(message, token);
+ await InputMessageChannel.Writer.WriteAsync(query, token);
await Task.Delay(50, token);
await InputStream.FlushAsync(token);
var task = new TaskCompletionSource();
@@ -72,8 +68,9 @@ namespace Flow.Launcher.Core.Plugin
//TODO: Parse Result
return new List();
}
- public virtual Task InitAsync(PluginInitContext context)
+ public override async Task InitAsync(PluginInitContext context)
{
+ await base.InitAsync(context);
InputMessageChannel = Channel.CreateUnbounded();
MessageCancellationTokenSource = new CancellationTokenSource();
SendMessageAsync(context.CurrentPluginMetadata, MessageCancellationTokenSource.Token);
@@ -81,20 +78,6 @@ namespace Flow.Launcher.Core.Plugin
// MessageTask =
// (SendMessageAsync(context.CurrentPluginMetadata, MessageCancellationTokenSource.Token),
// ReceiveMessageAsync(MessageCancellationTokenSource.Token));
- return Task.CompletedTask;
- }
- public List LoadContextMenus(Result selectedResult)
- {
- throw new System.NotImplementedException();
- }
- public Control CreateSettingPanel()
- {
- // TODO: Implement CreateSettingPanel
- return new Control();
- }
- public void Save()
- {
- // TODO: Save settings
}
}
}
diff --git a/Flow.Launcher.Core/Plugin/PortableSettings.cs b/Flow.Launcher.Core/Plugin/PortableSettings.cs
index 36d09c3f1..542460877 100644
--- a/Flow.Launcher.Core/Plugin/PortableSettings.cs
+++ b/Flow.Launcher.Core/Plugin/PortableSettings.cs
@@ -35,6 +35,19 @@ namespace Flow.Launcher.Core.Plugin
{
_storage = new JsonStorage>(SettingPath);
Settings = await _storage.LoadAsync();
+
+ foreach (var (type, attributes) in Configuration.Body)
+ {
+ if (attributes.Name == null)
+ {
+ continue;
+ }
+
+ if (!Settings.ContainsKey(attributes.Name))
+ {
+ Settings[attributes.Name] = attributes.DefaultValue;
+ }
+ }
}
diff --git a/Flow.Launcher.Core/Plugin/PythonPlugin.cs b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
index 96838a1d1..62f260867 100644
--- a/Flow.Launcher.Core/Plugin/PythonPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
@@ -1,6 +1,7 @@
using System;
using System.Diagnostics;
using System.IO;
+using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Flow.Launcher.Infrastructure;
@@ -38,7 +39,7 @@ namespace Flow.Launcher.Core.Plugin
protected override Task RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
{
- _startInfo.ArgumentList[2] = request.ToString();
+ _startInfo.ArgumentList[2] = JsonSerializer.Serialize(request);
return ExecuteAsync(_startInfo, token);
}
diff --git a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
index d5033e056..1e7a74a58 100644
--- a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Threading;
@@ -8,7 +9,7 @@ using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Plugin
{
- public class PythonPluginV2 : JsonRpcPluginV2
+ internal class PythonPluginV2 : JsonRpcPluginV2
{
private readonly ProcessStartInfo _startInfo;
private Process _process;
@@ -42,8 +43,16 @@ namespace Flow.Launcher.Core.Plugin
//Add -B flag to tell python don't write .py[co] files. Because .pyc contains location infos which will prevent python portable
_startInfo.ArgumentList.Add("-B");
}
-
+
+ public override List LoadContextMenus(Result selectedResult)
+ {
+ throw new NotImplementedException();
+ }
+ protected override Task ExecuteResultAsync(JsonRPCResult result)
+ {
+ throw new NotImplementedException();
+ }
public override async Task InitAsync(PluginInitContext context)
{
_startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
diff --git a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
index 7181ae225..642250627 100644
--- a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs
@@ -34,6 +34,9 @@ namespace Flow.Launcher.Infrastructure.Storage
public JsonStorage(string filePath)
{
FilePath = filePath;
+ DirectoryPath = Path.GetDirectoryName(filePath) ?? throw new ArgumentException("Invalid file path");
+
+ Helper.ValidateDirectory(DirectoryPath);
}
public async Task LoadAsync()
From b425aac159d7f6dd255b68b12e4754e8cb44a0d1 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sun, 26 Mar 2023 14:05:41 -0500
Subject: [PATCH 007/177] fix a little bit more
---
Flow.Launcher.Core/Plugin/PythonPlugin.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/PythonPlugin.cs b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
index 62f260867..4aea1ee29 100644
--- a/Flow.Launcher.Core/Plugin/PythonPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
@@ -47,7 +47,7 @@ namespace Flow.Launcher.Core.Plugin
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
{
// since this is not static, request strings will build up in ArgumentList if index is not specified
- _startInfo.ArgumentList[2] = rpcRequest.ToString();
+ _startInfo.ArgumentList[2] = JsonSerializer.Serialize(rpcRequest);
_startInfo.WorkingDirectory = Context.CurrentPluginMetadata.PluginDirectory;
// TODO: Async Action
return Execute(_startInfo);
From 1551567269bd4c2c2329aaa1460b380d5e891229 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sun, 26 Mar 2023 14:21:36 -0500
Subject: [PATCH 008/177] fix v1
---
Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs | 8 +++-----
Flow.Launcher.Core/Plugin/PythonPlugin.cs | 4 ++--
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
index c3790709d..e3386a52f 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
@@ -47,7 +47,7 @@ namespace Flow.Launcher.Core.Plugin
public abstract List LoadContextMenus(Result selectedResult);
- protected static readonly JsonSerializerOptions options = new()
+ protected static readonly JsonSerializerOptions DeserializeOption = new()
{
PropertyNameCaseInsensitive = true,
#pragma warning disable SYSLIB0020
@@ -63,13 +63,11 @@ namespace Flow.Launcher.Core.Plugin
}
};
- private static readonly JsonSerializerOptions settingSerializeOption = new()
+ protected static readonly JsonSerializerOptions RequestSerializeOption = new()
{
- WriteIndented = true
+ PropertyNameCaseInsensitive = true, PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
- private readonly Dictionary _settingControls = new();
-
protected abstract Task ExecuteResultAsync(JsonRPCResult result);
protected abstract Task> QueryRequestAsync(JsonRPCRequestModel request, CancellationToken token);
diff --git a/Flow.Launcher.Core/Plugin/PythonPlugin.cs b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
index 4aea1ee29..fbe5edc7c 100644
--- a/Flow.Launcher.Core/Plugin/PythonPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
@@ -39,7 +39,7 @@ namespace Flow.Launcher.Core.Plugin
protected override Task RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
{
- _startInfo.ArgumentList[2] = JsonSerializer.Serialize(request);
+ _startInfo.ArgumentList[2] = JsonSerializer.Serialize(request, RequestSerializeOption);
return ExecuteAsync(_startInfo, token);
}
@@ -47,7 +47,7 @@ namespace Flow.Launcher.Core.Plugin
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
{
// since this is not static, request strings will build up in ArgumentList if index is not specified
- _startInfo.ArgumentList[2] = JsonSerializer.Serialize(rpcRequest);
+ _startInfo.ArgumentList[2] = JsonSerializer.Serialize(rpcRequest, RequestSerializeOption);
_startInfo.WorkingDirectory = Context.CurrentPluginMetadata.PluginDirectory;
// TODO: Async Action
return Execute(_startInfo);
From e183920b8e32da7aaf865bd20dcd85b5562067d7 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Fri, 2 Jun 2023 23:05:09 +0800
Subject: [PATCH 009/177] implement v2
---
.../Environments/PythonV2Environment.cs | 10 +++
Flow.Launcher.Core/Flow.Launcher.Core.csproj | 5 ++
Flow.Launcher.Core/Plugin/JsonPRCModel.cs | 2 +-
Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs | 12 ++-
.../Plugin/JsonRPCPluginBase.cs | 17 +---
Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs | 89 +++++++++----------
.../JsonRPCV2Models/JsonRPCExecuteResponse.cs | 4 +
.../JsonRPCV2Models/JsonRPCQueryRequest.cs | 9 ++
Flow.Launcher.Core/Plugin/PythonPluginV2.cs | 33 ++++---
Flow.Launcher/Flow.Launcher.csproj | 2 +-
Flow.Launcher/Notification.cs | 12 +--
11 files changed, 109 insertions(+), 86 deletions(-)
create mode 100644 Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs
create mode 100644 Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCQueryRequest.cs
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/PythonV2Environment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/PythonV2Environment.cs
index 180893774..4d75e1b8f 100644
--- a/Flow.Launcher.Core/ExternalPlugins/Environments/PythonV2Environment.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/PythonV2Environment.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
@@ -8,6 +9,15 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
{
internal override string Language => AllowedLanguage.PythonV2;
+ internal override PluginPair CreatePluginPair(string filePath, PluginMetadata metadata)
+ {
+ return new PluginPair
+ {
+ Plugin = new PythonPluginV2(filePath),
+ Metadata = metadata
+ };
+ }
+
internal PythonV2Environment(List pluginMetadataList, PluginsSettings pluginSettings) : base(pluginMetadataList, pluginSettings) { }
}
}
diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
index 4077320bc..0188f7b46 100644
--- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj
+++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
@@ -57,11 +57,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
index 477ee620d..f4ea43894 100644
--- a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
+++ b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
@@ -28,7 +28,7 @@ namespace Flow.Launcher.Core.Plugin
public record JsonRPCResponseModel(int Id, JsonRPCErrorModel Error = default) : JsonRPCBase(Id, Error);
public record JsonRPCQueryResponseModel(int Id,
[property: JsonPropertyName("result")] List Result,
- IReadOnlyDictionary SettingsChange = null,
+ IReadOnlyDictionary SettingsChanges = null,
string DebugMessage = "",
JsonRPCErrorModel Error = default) : JsonRPCResponseModel(Id, Error);
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
index 3a7fcb216..cfe134549 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
@@ -251,10 +251,18 @@ namespace Flow.Launcher.Core.Plugin
return sourceBuffer;
}
-
- protected override async Task> QueryRequestAsync(JsonRPCRequestModel request, CancellationToken token)
+ public override async Task> QueryAsync(Query query, CancellationToken token)
{
+ var request = new JsonRPCRequestModel(RequestId++,
+ "query",
+ new object[]
+ {
+ query.Search
+ },
+ Settings.Inner);
+
var output = await RequestAsync(request, token);
+
return await DeserializedResultAsync(output);
}
}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
index e3386a52f..85b474157 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
@@ -69,7 +69,6 @@ namespace Flow.Launcher.Core.Plugin
};
protected abstract Task ExecuteResultAsync(JsonRPCResult result);
- protected abstract Task> QueryRequestAsync(JsonRPCRequestModel request, CancellationToken token);
protected PortableSettings Settings { get; set; }
@@ -96,7 +95,7 @@ namespace Flow.Launcher.Core.Plugin
results.AddRange(queryResponseModel.Result);
- Settings.UpdateSettings(queryResponseModel.SettingsChange);
+ Settings.UpdateSettings(queryResponseModel.SettingsChanges);
return results;
}
@@ -123,19 +122,7 @@ namespace Flow.Launcher.Core.Plugin
}
}
- public async Task> QueryAsync(Query query, CancellationToken token)
- {
- var request = new JsonRPCRequestModel(RequestId++,
- "query",
- new object[]
- {
- query.Search
- },
- Settings.Inner);
-
- return await QueryRequestAsync(request, token);
-
- }
+ public abstract Task> QueryAsync(Query query, CancellationToken token);
private async Task InitSettingAsync()
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
index bc5d00ed4..e1e79359d 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
@@ -7,77 +7,70 @@ using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks;
using System.Windows.Controls;
+using Flow.Launcher.Core.Plugin.JsonRPCV2Models;
using Flow.Launcher.Plugin;
+using StreamJsonRpc;
+
namespace Flow.Launcher.Core.Plugin
{
internal abstract class JsonRpcPluginV2 : JsonRPCPluginBase
{
public abstract string SupportedLanguage { get; set; }
-
+
public const string JsonRpc = "JsonRPC";
- protected abstract Stream InputStream { get; set; }
- protected abstract Stream OutputStream { get; set; }
- protected abstract StreamReader ErrorStream { get; set; }
- protected Channel InputMessageChannel { get; set; }
+ protected abstract JsonRpc Rpc { get; set; }
- private (Task SendTask, Task ReceiveTask) MessageTask { get; set; }
- private CancellationTokenSource MessageCancellationTokenSource { get; set; }
+ protected StreamReader ErrorStream { get; set; }
- protected int RequestId;
- private ConcurrentDictionary> RequestTaskDictionary { get; } = new();
-
- // TODO: Switch to Async Task
- private async void ReceiveMessageAsync(CancellationToken token)
+ protected override async Task ExecuteResultAsync(JsonRPCResult result)
{
- var response =
- JsonSerializer.DeserializeAsyncEnumerable(OutputStream, cancellationToken: token);
-
- ArgumentNullException.ThrowIfNull(response);
-
- await foreach (var message in response.WithCancellation(token))
+ try
{
- if (!RequestTaskDictionary.TryGetValue(message.Id, out var task))
- {
- // Either Task is already handled or it is a invalid resopnse.
- continue;
- }
- RequestTaskDictionary.Remove(message.Id, out _);
- task.TrySetResult(message);
+ var res = await Rpc.InvokeAsync(result.JsonRPCAction.Method, argument: result.JsonRPCAction.Parameters);
+
+ return res.Hide;
+ }
+ catch
+ {
+ return false;
}
}
- // TODO: Switch to Async Task
- private async void SendMessageAsync(PluginMetadata metadata, CancellationToken token)
+ public override async Task> QueryAsync(Query query, CancellationToken token)
{
- var fullMessage = new JsonRPCRequestMessage(metadata, InputMessageChannel.Reader.ReadAllAsync(token));
- await JsonSerializer.SerializeAsync(InputStream, fullMessage, cancellationToken: token);
+ try
+ {
+ var res = await Rpc.InvokeAsync("query", query);
+
+ var results = ParseResults(res);
+
+ return results;
+ }
+ catch
+ {
+ return new List();
+ }
}
- protected override async Task> QueryRequestAsync(JsonRPCRequestModel query, CancellationToken token)
- {
- int currentRequestId = Interlocked.Add(ref RequestId, 1);
- await InputMessageChannel.Writer.WriteAsync(query, token);
- await Task.Delay(50, token);
- await InputStream.FlushAsync(token);
- var task = new TaskCompletionSource();
- RequestTaskDictionary[currentRequestId] = task;
- var result = await task.Task;
- //TODO: Parse Result
- return new List();
- }
+
public override async Task InitAsync(PluginInitContext context)
{
await base.InitAsync(context);
- InputMessageChannel = Channel.CreateUnbounded();
- MessageCancellationTokenSource = new CancellationTokenSource();
- SendMessageAsync(context.CurrentPluginMetadata, MessageCancellationTokenSource.Token);
- ReceiveMessageAsync(MessageCancellationTokenSource.Token);
- // MessageTask =
- // (SendMessageAsync(context.CurrentPluginMetadata, MessageCancellationTokenSource.Token),
- // ReceiveMessageAsync(MessageCancellationTokenSource.Token));
+
+ _ = ReadErrorAsync();
+
+ async Task ReadErrorAsync()
+ {
+ var error = await ErrorStream.ReadToEndAsync();
+
+ if (!string.IsNullOrEmpty(error))
+ {
+ throw new Exception(error);
+ }
+ }
}
}
}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs
new file mode 100644
index 000000000..6a130f70f
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs
@@ -0,0 +1,4 @@
+namespace Flow.Launcher.Core.Plugin.JsonRPCV2Models
+{
+ public record JsonRPCExecuteResponse(bool Hide = true);
+}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCQueryRequest.cs b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCQueryRequest.cs
new file mode 100644
index 000000000..003724a23
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCQueryRequest.cs
@@ -0,0 +1,9 @@
+using System.Collections.Generic;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.Core.Plugin.JsonRPCV2Models
+{
+ public record JsonRPCQueryRequest(
+ List Results
+ );
+}
diff --git a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
index 1e7a74a58..c3b47a79c 100644
--- a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
@@ -2,10 +2,14 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
+using System.Text;
using System.Threading;
using System.Threading.Tasks;
+using System.Windows.Input;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Plugin;
+using Microsoft.VisualStudio.Threading;
+using StreamJsonRpc;
namespace Flow.Launcher.Core.Plugin
{
@@ -13,11 +17,11 @@ namespace Flow.Launcher.Core.Plugin
{
private readonly ProcessStartInfo _startInfo;
private Process _process;
+
public override string SupportedLanguage { get; set; } = AllowedLanguage.Python;
- protected override Stream InputStream { get; set; }
- protected override Stream OutputStream { get; set; }
- protected override StreamReader ErrorStream { get; set; }
+ protected override JsonRpc Rpc { get; set; }
+
public PythonPluginV2(string filename)
{
@@ -49,23 +53,26 @@ namespace Flow.Launcher.Core.Plugin
{
throw new NotImplementedException();
}
- protected override Task ExecuteResultAsync(JsonRPCResult result)
- {
- throw new NotImplementedException();
- }
+
public override async Task InitAsync(PluginInitContext context)
{
_startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
_process = Process.Start(_startInfo);
-
+
ArgumentNullException.ThrowIfNull(_process);
-
- InputStream = _process.StandardInput.BaseStream;
- OutputStream = _process.StandardOutput.BaseStream;
- ErrorStream = _process.StandardError;
-
+
+ var formatter = new JsonMessageFormatter();
+ var handler = new NewLineDelimitedMessageHandler(_process.StandardInput.BaseStream,
+ _process.StandardOutput.BaseStream,
+ formatter);
+
+ Rpc = new JsonRpc(handler, context.API);
+ Rpc.StartListening();
+
+ _ = _process.StandardError.ReadToEndAsync().ContinueWith(e => throw new Exception(e.Result));
+
await base.InitAsync(context);
}
}
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index 1143f7f72..b0e1391e3 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -90,7 +90,7 @@
-
+
all
diff --git a/Flow.Launcher/Notification.cs b/Flow.Launcher/Notification.cs
index 57c1e88f2..bc130c834 100644
--- a/Flow.Launcher/Notification.cs
+++ b/Flow.Launcher/Notification.cs
@@ -31,12 +31,12 @@ namespace Flow.Launcher
var Icon = !File.Exists(iconPath)
? Path.Combine(Constant.ProgramDirectory, "Images\\app.png")
: iconPath;
-
- new ToastContentBuilder()
- .AddText(title, hintMaxLines: 1)
- .AddText(subTitle)
- .AddAppLogoOverride(new Uri(Icon))
- .Show();
+
+ // new ToastContentBuilder()
+ // .AddText(title, hintMaxLines: 1)
+ // .AddText(subTitle)
+ // .AddAppLogoOverride(new Uri(Icon))
+ // .Show();
}
private static void LegacyShow(string title, string subTitle, string iconPath)
From 32bbf1eaf02f5b5bfe10c09340f51748ca110c94 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sun, 25 Jun 2023 00:43:21 +0800
Subject: [PATCH 010/177] Finally make JSONRPC Bidirection work
---
.../ExternalPlugins/PluginsManifest.cs | 2 +-
Flow.Launcher.Core/Flow.Launcher.Core.csproj | 4 -
.../Plugin/JsonRPCPluginBase.cs | 31 +-
Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs | 23 +-
.../JsonRPCV2Models/JsonRPCExecuteResponse.cs | 2 +-
.../JsonRPCV2Models/JsonRPCPublicAPI.cs | 326 ++++++++++++++++++
Flow.Launcher.Core/Plugin/PythonPluginV2.cs | 52 ++-
7 files changed, 397 insertions(+), 43 deletions(-)
create mode 100644 Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCPublicAPI.cs
diff --git a/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs b/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
index e3f0e2a2f..1e30895cc 100644
--- a/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
+++ b/Flow.Launcher.Core/ExternalPlugins/PluginsManifest.cs
@@ -12,7 +12,7 @@ namespace Flow.Launcher.Core.ExternalPlugins
{
public static class PluginsManifest
{
- private const string manifestFileUrl = "https://cdn.jsdelivr.net/gh/Flow-Launcher/Flow.Launcher.PluginsManifest@plugin_api_v2/plugins.json";
+ private const string manifestFileUrl = "https://jsdelivr.bobocdn.tk/gh/Flow-Launcher/Flow.Launcher.PluginsManifest@plugin_api_v2/plugins.json";
private static readonly SemaphoreSlim manifestUpdateLock = new(1);
diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
index 35a998896..133ed02e3 100644
--- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj
+++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
@@ -64,9 +64,5 @@
-
-
-
-
\ No newline at end of file
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
index 85b474157..18f787018 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
@@ -41,9 +41,11 @@ namespace Flow.Launcher.Core.Plugin
private int RequestId { get; set; }
- private string SettingConfigurationPath => Path.Combine(Context.CurrentPluginMetadata.PluginDirectory, "SettingsTemplate.yaml");
+ private string SettingConfigurationPath =>
+ Path.Combine(Context.CurrentPluginMetadata.PluginDirectory, "SettingsTemplate.yaml");
- private string SettingPath => Path.Combine(DataLocation.PluginSettingsDirectory, Context.CurrentPluginMetadata.Name, "Settings.json");
+ private string SettingPath => Path.Combine(DataLocation.PluginSettingsDirectory,
+ Context.CurrentPluginMetadata.Name, "Settings.json");
public abstract List LoadContextMenus(Result selectedResult);
@@ -57,10 +59,7 @@ namespace Flow.Launcher.Core.Plugin
// see: https://github.com/dotnet/runtime/issues/39152
IgnoreNullValues = true,
#pragma warning restore SYSLIB0020 // Type or member is obsolete
- Converters =
- {
- new JsonObjectConverter()
- }
+ Converters = { new JsonObjectConverter() }
};
protected static readonly JsonSerializerOptions RequestSerializeOption = new()
@@ -83,9 +82,9 @@ namespace Flow.Launcher.Core.Plugin
foreach (var result in queryResponseModel.Result)
{
- result.AsyncAction = async c =>
+ result.AsyncAction = async _ =>
{
- Settings.UpdateSettings(result.SettingsChange);
+ Settings?.UpdateSettings(result.SettingsChange);
return await ExecuteResultAsync(result);
};
@@ -95,7 +94,7 @@ namespace Flow.Launcher.Core.Plugin
results.AddRange(queryResponseModel.Result);
- Settings.UpdateSettings(queryResponseModel.SettingsChanges);
+ Settings?.UpdateSettings(queryResponseModel.SettingsChanges);
return results;
}
@@ -130,18 +129,18 @@ namespace Flow.Launcher.Core.Plugin
if (!File.Exists(SettingConfigurationPath))
return;
- var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
- var configuration = deserializer.Deserialize(await File.ReadAllTextAsync(SettingConfigurationPath));
+ var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance)
+ .Build();
+ var configuration =
+ deserializer.Deserialize(
+ await File.ReadAllTextAsync(SettingConfigurationPath));
Settings ??= new PortableSettings
{
- Configuration = configuration,
- SettingPath = SettingPath,
- API = Context.API
+ Configuration = configuration, SettingPath = SettingPath, API = Context.API
};
await Settings.InitializeAsync();
-
}
public virtual async Task InitAsync(PluginInitContext context)
@@ -154,10 +153,10 @@ namespace Flow.Launcher.Core.Plugin
{
Settings?.Save();
}
+
public Control CreateSettingPanel()
{
return Settings.CreateSettingPanel();
}
}
-
}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
index e1e79359d..df9be0d79 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
@@ -1,12 +1,8 @@
using System;
-using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
-using System.Text.Json;
using System.Threading;
-using System.Threading.Channels;
using System.Threading.Tasks;
-using System.Windows.Controls;
using Flow.Launcher.Core.Plugin.JsonRPCV2Models;
using Flow.Launcher.Plugin;
using StreamJsonRpc;
@@ -14,13 +10,13 @@ using StreamJsonRpc;
namespace Flow.Launcher.Core.Plugin
{
- internal abstract class JsonRpcPluginV2 : JsonRPCPluginBase
+ internal abstract class JsonRPCPluginV2 : JsonRPCPluginBase, IDisposable
{
public abstract string SupportedLanguage { get; set; }
public const string JsonRpc = "JsonRPC";
- protected abstract JsonRpc Rpc { get; set; }
+ protected abstract JsonRpc RPC { get; set; }
protected StreamReader ErrorStream { get; set; }
@@ -29,7 +25,8 @@ namespace Flow.Launcher.Core.Plugin
{
try
{
- var res = await Rpc.InvokeAsync(result.JsonRPCAction.Method, argument: result.JsonRPCAction.Parameters);
+ var res = await RPC.InvokeAsync(result.JsonRPCAction.Method,
+ argument: result.JsonRPCAction.Parameters);
return res.Hide;
}
@@ -43,7 +40,9 @@ namespace Flow.Launcher.Core.Plugin
{
try
{
- var res = await Rpc.InvokeAsync("query", query);
+ var res = await RPC.InvokeWithCancellationAsync("query",
+ new[] { query },
+ token);
var results = ParseResults(res);
@@ -51,7 +50,7 @@ namespace Flow.Launcher.Core.Plugin
}
catch
{
- return new List();
+ return new List();
}
}
@@ -72,5 +71,11 @@ namespace Flow.Launcher.Core.Plugin
}
}
}
+
+ public void Dispose()
+ {
+ RPC?.Dispose();
+ ErrorStream?.Dispose();
+ }
}
}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs
index 6a130f70f..632bb9501 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs
@@ -1,4 +1,4 @@
namespace Flow.Launcher.Core.Plugin.JsonRPCV2Models
{
- public record JsonRPCExecuteResponse(bool Hide = true);
+ public abstract record JsonRPCExecuteResponse(bool Hide = true);
}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCPublicAPI.cs b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCPublicAPI.cs
new file mode 100644
index 000000000..a65d5db22
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCPublicAPI.cs
@@ -0,0 +1,326 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics.CodeAnalysis;
+using System.IO;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
+using Flow.Launcher.Plugin;
+using Flow.Launcher.Plugin.SharedModels;
+
+namespace Flow.Launcher.Core.Plugin.JsonRPCV2Models
+{
+ public class JsonRPCPublicAPI
+ {
+ private IPublicAPI _api;
+
+ public JsonRPCPublicAPI(IPublicAPI api)
+ {
+ _api = api;
+ }
+
+ ///
+ /// Change Flow.Launcher query
+ ///
+ /// query text
+ ///
+ /// Force requery. By default, Flow Launcher will not fire query if your query is same with existing one.
+ /// Set this to to force Flow Launcher requerying
+ ///
+ public void ChangeQuery(string query, bool requery = false)
+ {
+ _api.ChangeQuery(query, requery);
+ }
+
+ ///
+ /// Restart Flow Launcher
+ ///
+ public void RestartApp()
+ {
+ _api.RestartApp();
+ }
+
+ ///
+ /// Run a shell command
+ ///
+ /// The command or program to run
+ /// the shell type to run, e.g. powershell.exe
+ /// Thrown when unable to find the file specified in the command
+ /// Thrown when error occurs during the execution of the command
+ public void ShellRun(string cmd, string filename = "cmd.exe")
+ {
+ _api.ShellRun(cmd, filename);
+ }
+
+ ///
+ /// Copies the passed in text and shows a message indicating whether the operation was completed successfully.
+ /// When directCopy is set to true and passed in text is the path to a file or directory,
+ /// the actual file/directory will be copied to clipboard. Otherwise the text itself will still be copied to clipboard.
+ ///
+ /// Text to save on clipboard
+ /// When true it will directly copy the file/folder from the path specified in text
+ /// Whether to show the default notification from this method after copy is done.
+ /// It will show file/folder/text is copied successfully.
+ /// Turn this off to show your own notification after copy is done.>
+ public void CopyToClipboard(string text, bool directCopy = false, bool showDefaultNotification = true)
+ {
+ _api.CopyToClipboard(text, directCopy, showDefaultNotification);
+ }
+
+ ///
+ /// Save everything, all of Flow Launcher and plugins' data and settings
+ ///
+ public void SaveAppAllSettings()
+ {
+ _api.SaveAppAllSettings();
+ }
+
+ ///
+ /// Save all Flow's plugins settings
+ ///
+ public void SavePluginSettings()
+ {
+ _api.SavePluginSettings();
+ }
+
+ ///
+ /// Reloads any Plugins that have the
+ /// IReloadable implemented. It refeshes
+ /// Plugin's in memory data with new content
+ /// added by user.
+ ///
+ public Task ReloadAllPluginDataAsync()
+ {
+ return _api.ReloadAllPluginData();
+ }
+
+ ///
+ /// Check for new Flow Launcher update
+ ///
+ public void CheckForNewUpdate()
+ {
+ _api.CheckForNewUpdate();
+ }
+
+ ///
+ /// Show the error message using Flow's standard error icon.
+ ///
+ /// Message title
+ /// Optional message subtitle
+ public void ShowMsgError(string title, string subTitle = "")
+ {
+ _api.ShowMsgError(title, subTitle);
+ }
+
+ ///
+ /// Show the MainWindow when hiding
+ ///
+ public void ShowMainWindow()
+ {
+ _api.ShowMainWindow();
+ }
+
+ ///
+ /// Hide MainWindow
+ ///
+ public void HideMainWindow()
+ {
+ _api.HideMainWindow();
+ }
+
+ ///
+ /// Representing whether the main window is visible
+ ///
+ ///
+ public bool IsMainWindowVisible()
+ {
+ return _api.IsMainWindowVisible();
+ }
+
+ ///
+ /// Show message box
+ ///
+ /// Message title
+ /// Message subtitle
+ /// Message icon path (relative path to your plugin folder)
+ public void ShowMsg(string title, string subTitle = "", string iconPath = "")
+ {
+ _api.ShowMsg(title, subTitle, iconPath);
+ }
+
+ ///
+ /// Show message box
+ ///
+ /// Message title
+ /// Message subtitle
+ /// Message icon path (relative path to your plugin folder)
+ /// when true will use main windows as the owner
+ public void ShowMsg(string title, string subTitle, string iconPath, bool useMainWindowAsOwner = true)
+ {
+ _api.ShowMsg(title, subTitle, iconPath, useMainWindowAsOwner);
+ }
+
+ ///
+ /// Open setting dialog
+ ///
+ public void OpenSettingDialog()
+ {
+ _api.OpenSettingDialog();
+ }
+
+ ///
+ /// Get translation of current language
+ /// You need to implement IPluginI18n if you want to support multiple languages for your plugin
+ ///
+ ///
+ ///
+ public string GetTranslation(string key)
+ {
+ return _api.GetTranslation(key);
+ }
+
+ ///
+ /// Get all loaded plugins
+ ///
+ ///
+ public List GetAllPlugins()
+ {
+ return _api.GetAllPlugins();
+ }
+
+
+ ///
+ /// Fuzzy Search the string with the given query. This is the core search mechanism Flow uses
+ ///
+ /// Query string
+ /// The string that will be compared against the query
+ /// Match results
+ public MatchResult FuzzySearch(string query, string stringToCompare)
+ {
+ return _api.FuzzySearch(query, stringToCompare);
+ }
+
+ ///
+ /// Http download the spefic url and return as string
+ ///
+ /// URL to call Http Get
+ /// Cancellation Token
+ /// Task to get string result
+ public Task HttpGetStringAsync(string url, CancellationToken token = default)
+ {
+ return _api.HttpGetStringAsync(url, token);
+ }
+
+ ///
+ /// Http download the spefic url and return as stream
+ ///
+ /// URL to call Http Get
+ /// Cancellation Token
+ /// Task to get stream result
+ public Task HttpGetStreamAsync(string url, CancellationToken token = default)
+ {
+ return _api.HttpGetStreamAsync(url, token);
+ }
+
+ ///
+ /// Download the specific url to a cretain file path
+ ///
+ /// URL to download file
+ /// path to save downloaded file
+ /// place to store file
+ /// Task showing the progress
+ public Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath,
+ CancellationToken token = default)
+ {
+ return _api.HttpDownloadAsync(url, filePath, token);
+ }
+
+ ///
+ /// Add ActionKeyword for specific plugin
+ ///
+ /// ID for plugin that needs to add action keyword
+ /// The actionkeyword that is supposed to be added
+ public void AddActionKeyword(string pluginId, string newActionKeyword)
+ {
+ _api.AddActionKeyword(pluginId, newActionKeyword);
+ }
+
+ ///
+ /// Remove ActionKeyword for specific plugin
+ ///
+ /// ID for plugin that needs to remove action keyword
+ /// The actionkeyword that is supposed to be removed
+ public void RemoveActionKeyword(string pluginId, string oldActionKeyword)
+ {
+ _api.RemoveActionKeyword(pluginId, oldActionKeyword);
+ }
+
+ ///
+ /// Check whether specific ActionKeyword is assigned to any of the plugin
+ ///
+ /// The actionkeyword for checking
+ /// True if the actionkeyword is already assigned, False otherwise
+ public bool ActionKeywordAssigned(string actionKeyword)
+ {
+ return _api.ActionKeywordAssigned(actionKeyword);
+ }
+
+ ///
+ /// Log debug message
+ /// Message will only be logged in Debug mode
+ ///
+ public void LogDebug(string className, string message, [CallerMemberName] string methodName = "")
+ {
+ _api.LogDebug(className, message, methodName);
+ }
+
+ ///
+ /// Log info message
+ ///
+ public void LogInfo(string className, string message, [CallerMemberName] string methodName = "")
+ {
+ _api.LogInfo(className, message, methodName);
+ }
+
+ ///
+ /// Log warning message
+ ///
+ public void LogWarn(string className, string message, [CallerMemberName] string methodName = "")
+ {
+ _api.LogWarn(className, message, methodName);
+ }
+
+
+ ///
+ /// Open directory in an explorer configured by user via Flow's Settings. The default is Windows Explorer
+ ///
+ /// Directory Path to open
+ /// Extra FileName Info
+ public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null)
+ {
+ _api.OpenDirectory(DirectoryPath, FileNameOrFilePath);
+ }
+
+
+ ///
+ /// Opens the URL with the given string.
+ /// The browser and mode used is based on what's configured in Flow's default browser settings.
+ /// Non-C# plugins should use this method.
+ ///
+ public void OpenUrl(string url, bool? inPrivate = null)
+ {
+ _api.OpenUrl(url, inPrivate);
+ }
+
+
+ ///
+ /// Opens the application URI with the given string, e.g. obsidian://search-query-example
+ /// Non-C# plugins should use this method
+ ///
+ public void OpenAppUri(string appUri)
+ {
+ _api.OpenAppUri(appUri);
+ }
+ }
+}
diff --git a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
index c3b47a79c..59bb0bd84 100644
--- a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
@@ -6,6 +6,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Input;
+using Flow.Launcher.Core.Plugin.JsonRPCV2Models;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Plugin;
using Microsoft.VisualStudio.Threading;
@@ -13,14 +14,14 @@ using StreamJsonRpc;
namespace Flow.Launcher.Core.Plugin
{
- internal class PythonPluginV2 : JsonRpcPluginV2
+ internal class PythonPluginV2 : JsonRPCPluginV2, IReloadable, IDisposable
{
private readonly ProcessStartInfo _startInfo;
private Process _process;
public override string SupportedLanguage { get; set; } = AllowedLanguage.Python;
- protected override JsonRpc Rpc { get; set; }
+ protected override JsonRpc RPC { get; set; }
public PythonPluginV2(string filename)
@@ -53,7 +54,7 @@ namespace Flow.Launcher.Core.Plugin
{
throw new NotImplementedException();
}
-
+
public override async Task InitAsync(PluginInitContext context)
{
_startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
@@ -63,17 +64,44 @@ namespace Flow.Launcher.Core.Plugin
ArgumentNullException.ThrowIfNull(_process);
- var formatter = new JsonMessageFormatter();
- var handler = new NewLineDelimitedMessageHandler(_process.StandardInput.BaseStream,
- _process.StandardOutput.BaseStream,
- formatter);
-
- Rpc = new JsonRpc(handler, context.API);
- Rpc.StartListening();
-
- _ = _process.StandardError.ReadToEndAsync().ContinueWith(e => throw new Exception(e.Result));
+ SetupJsonRPC(_process, context.API);
await base.InitAsync(context);
}
+
+ public void Dispose()
+ {
+ _process.Kill(true);
+ _process.Dispose();
+ base.Dispose();
+ }
+
+ public void ReloadData()
+ {
+ var oldProcess = _process;
+ _process = Process.Start(_startInfo);
+ ArgumentNullException.ThrowIfNull(_process);
+ SetupJsonRPC(_process, Context.API);
+ oldProcess.Kill(true);
+ oldProcess.Dispose();
+ }
+
+ private void SetupJsonRPC(Process process, IPublicAPI api)
+ {
+ var formatter = new JsonMessageFormatter();
+ var handler = new NewLineDelimitedMessageHandler(process.StandardInput.BaseStream,
+ process.StandardOutput.BaseStream,
+ formatter);
+
+ RPC = new JsonRpc(handler, new JsonRPCPublicAPI(api));
+ RPC.SynchronizationContext = null;
+ RPC.StartListening();
+
+ _ = process.StandardError.ReadToEndAsync().ContinueWith(e =>
+ {
+ if (e.Result.Length > 0)
+ throw new Exception(e.Result);
+ });
+ }
}
}
From cb6fb80e7089751c642ab82c48fb7d1c7a7940fd Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sun, 25 Jun 2023 12:21:45 +0800
Subject: [PATCH 011/177] Change abstract back to normal class for
JsonRPCExecuteResponse.cs; Cleanup unused classes
---
Flow.Launcher.Core/Plugin/JsonPRCModel.cs | 1 -
.../Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
index 41d961a6b..48606eea4 100644
--- a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
+++ b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
@@ -19,7 +19,6 @@ using System.Text.Json;
namespace Flow.Launcher.Core.Plugin
{
- public record JsonRPCRequestMessage(PluginMetadata PluginMetadata, IAsyncEnumerable Requests);
public record JsonRPCBase(int Id, JsonRPCErrorModel Error = default);
public record JsonRPCErrorModel(int Code, string Message, string Data);
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs
index 632bb9501..6a130f70f 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCExecuteResponse.cs
@@ -1,4 +1,4 @@
namespace Flow.Launcher.Core.Plugin.JsonRPCV2Models
{
- public abstract record JsonRPCExecuteResponse(bool Hide = true);
+ public record JsonRPCExecuteResponse(bool Hide = true);
}
From a9711565192788816ec540edc5d2e6db99f86ef2 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sun, 25 Jun 2023 12:43:47 +0800
Subject: [PATCH 012/177] Add Initialization Code
---
Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs | 6 ++++--
Flow.Launcher.Core/Plugin/PythonPluginV2.cs | 6 ------
2 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
index df9be0d79..ee7009f9a 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
@@ -40,7 +40,7 @@ namespace Flow.Launcher.Core.Plugin
{
try
{
- var res = await RPC.InvokeWithCancellationAsync("query",
+ var res = await RPC.InvokeWithCancellationAsync("query",
new[] { query },
token);
@@ -50,7 +50,7 @@ namespace Flow.Launcher.Core.Plugin
}
catch
{
- return new List();
+ return new List();
}
}
@@ -61,6 +61,8 @@ namespace Flow.Launcher.Core.Plugin
_ = ReadErrorAsync();
+ await RPC.InvokeAsync("initialize", context);
+
async Task ReadErrorAsync()
{
var error = await ErrorStream.ReadToEndAsync();
diff --git a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
index 59bb0bd84..7b8ea7c76 100644
--- a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
@@ -96,12 +96,6 @@ namespace Flow.Launcher.Core.Plugin
RPC = new JsonRpc(handler, new JsonRPCPublicAPI(api));
RPC.SynchronizationContext = null;
RPC.StartListening();
-
- _ = process.StandardError.ReadToEndAsync().ContinueWith(e =>
- {
- if (e.Result.Length > 0)
- throw new Exception(e.Result);
- });
}
}
}
From 83a61109d772ac3766e7a6c9d179a4b7bdb14386 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Mon, 3 Jul 2023 12:23:30 +0800
Subject: [PATCH 013/177] fix error stream issue
---
Flow.Launcher.Core/Plugin/PythonPluginV2.cs | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
index 7b8ea7c76..83dce2187 100644
--- a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
@@ -93,6 +93,8 @@ namespace Flow.Launcher.Core.Plugin
process.StandardOutput.BaseStream,
formatter);
+ ErrorStream = _process.StandardError;
+
RPC = new JsonRpc(handler, new JsonRPCPublicAPI(api));
RPC.SynchronizationContext = null;
RPC.StartListening();
From 0459d6e4fa67d8e7454893ff50826a17eefb7bdf Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Mon, 3 Jul 2023 12:58:44 +0800
Subject: [PATCH 014/177] fix v1 plugin issue - Settings NullReference -
ExecutablePlugin not working
---
Flow.Launcher.Core/Plugin/ExecutablePlugin.cs | 5 +++--
Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs | 2 +-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs b/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
index a7bbccfec..857122aa6 100644
--- a/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
+++ b/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
@@ -1,5 +1,6 @@
using System.Diagnostics;
using System.IO;
+using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
@@ -27,14 +28,14 @@ namespace Flow.Launcher.Core.Plugin
protected override Task RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
{
// since this is not static, request strings will build up in ArgumentList if index is not specified
- _startInfo.ArgumentList[0] = request.ToString();
+ _startInfo.ArgumentList[0] = JsonSerializer.Serialize(request, RequestSerializeOption);
return ExecuteAsync(_startInfo, token);
}
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
{
// since this is not static, request strings will build up in ArgumentList if index is not specified
- _startInfo.ArgumentList[0] = rpcRequest.ToString();
+ _startInfo.ArgumentList[0] = JsonSerializer.Serialize(rpcRequest, RequestSerializeOption);
return Execute(_startInfo);
}
}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
index a3f58b5b9..97c3c8981 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
@@ -256,7 +256,7 @@ namespace Flow.Launcher.Core.Plugin
{
query.Search
},
- Settings.Inner);
+ Settings?.Inner);
var output = await RequestAsync(request, token);
From e1deefc1d271128e605985571ce31a8d782ba79a Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Mon, 3 Jul 2023 16:19:27 +0800
Subject: [PATCH 015/177] Add UpdateResults Functionality
---
Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs | 41 +++++++++++++++++--
Flow.Launcher.Core/Plugin/PythonPluginV2.cs | 43 +++++++++-----------
2 files changed, 58 insertions(+), 26 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
index ee7009f9a..c6ef870c3 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
+using System.IO.Pipelines;
using System.Threading;
using System.Threading.Tasks;
using Flow.Launcher.Core.Plugin.JsonRPCV2Models;
@@ -10,16 +11,18 @@ using StreamJsonRpc;
namespace Flow.Launcher.Core.Plugin
{
- internal abstract class JsonRPCPluginV2 : JsonRPCPluginBase, IDisposable
+ internal abstract class JsonRPCPluginV2 : JsonRPCPluginBase, IAsyncDisposable, IAsyncReloadable, IResultUpdated
{
public abstract string SupportedLanguage { get; set; }
public const string JsonRpc = "JsonRPC";
- protected abstract JsonRpc RPC { get; set; }
+ protected abstract IDuplexPipe ClientPipe { get; set; }
protected StreamReader ErrorStream { get; set; }
+ private JsonRpc RPC { get; set; }
+
protected override async Task ExecuteResultAsync(JsonRPCResult result)
{
@@ -59,6 +62,8 @@ namespace Flow.Launcher.Core.Plugin
{
await base.InitAsync(context);
+ SetupJsonRPC();
+
_ = ReadErrorAsync();
await RPC.InvokeAsync("initialize", context);
@@ -74,10 +79,40 @@ namespace Flow.Launcher.Core.Plugin
}
}
- public void Dispose()
+ public event ResultUpdatedEventHandler ResultsUpdated;
+
+
+ private void SetupJsonRPC()
+ {
+ var formatter = new JsonMessageFormatter();
+ var handler = new NewLineDelimitedMessageHandler(ClientPipe,
+ formatter);
+
+ RPC = new JsonRpc(handler, new JsonRPCPublicAPI(Context.API));
+
+ RPC.AddLocalRpcMethod("UpdateResults", new Action((rawQuery, response) =>
+ {
+ var results = ParseResults(response);
+ ResultsUpdated?.Invoke(this, new ResultUpdatedEventArgs { Query = new Query()
+ {
+ RawQuery = rawQuery
+ }, Results = results });
+ }));
+ RPC.SynchronizationContext = null;
+ RPC.StartListening();
+ }
+
+ public virtual Task ReloadDataAsync()
+ {
+ SetupJsonRPC();
+ return Task.CompletedTask;
+ }
+
+ public virtual ValueTask DisposeAsync()
{
RPC?.Dispose();
ErrorStream?.Dispose();
+ return ValueTask.CompletedTask;
}
}
}
diff --git a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
index 83dce2187..98b55f896 100644
--- a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
+using System.IO.Pipelines;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -10,18 +11,19 @@ using Flow.Launcher.Core.Plugin.JsonRPCV2Models;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Plugin;
using Microsoft.VisualStudio.Threading;
+using Nerdbank.Streams;
using StreamJsonRpc;
namespace Flow.Launcher.Core.Plugin
{
- internal class PythonPluginV2 : JsonRPCPluginV2, IReloadable, IDisposable
+ internal class PythonPluginV2 : JsonRPCPluginV2
{
private readonly ProcessStartInfo _startInfo;
private Process _process;
public override string SupportedLanguage { get; set; } = AllowedLanguage.Python;
- protected override JsonRpc RPC { get; set; }
+ protected override IDuplexPipe ClientPipe { get; set; }
public PythonPluginV2(string filename)
@@ -61,43 +63,38 @@ namespace Flow.Launcher.Core.Plugin
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
_process = Process.Start(_startInfo);
-
ArgumentNullException.ThrowIfNull(_process);
-
- SetupJsonRPC(_process, context.API);
+
+ SetupPipe(_process);
await base.InitAsync(context);
}
- public void Dispose()
+ public override async ValueTask DisposeAsync()
{
_process.Kill(true);
+ await _process.WaitForExitAsync();
_process.Dispose();
- base.Dispose();
+ await base.DisposeAsync();
}
- public void ReloadData()
+ private void SetupPipe(Process process)
+ {
+ var (reader, writer) = (PipeReader.Create(process.StandardOutput.BaseStream),
+ PipeWriter.Create(process.StandardInput.BaseStream));
+ ClientPipe = new DuplexPipe(reader, writer);
+ }
+
+ public override async Task ReloadDataAsync()
{
var oldProcess = _process;
_process = Process.Start(_startInfo);
ArgumentNullException.ThrowIfNull(_process);
- SetupJsonRPC(_process, Context.API);
+ SetupPipe(_process);
+ await base.ReloadDataAsync();
oldProcess.Kill(true);
+ await oldProcess.WaitForExitAsync();
oldProcess.Dispose();
}
-
- private void SetupJsonRPC(Process process, IPublicAPI api)
- {
- var formatter = new JsonMessageFormatter();
- var handler = new NewLineDelimitedMessageHandler(process.StandardInput.BaseStream,
- process.StandardOutput.BaseStream,
- formatter);
-
- ErrorStream = _process.StandardError;
-
- RPC = new JsonRpc(handler, new JsonRPCPublicAPI(api));
- RPC.SynchronizationContext = null;
- RPC.StartListening();
- }
}
}
From c50d98c5e2dd1726c973b13917ef4e28308b49fb Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Mon, 3 Jul 2023 16:44:50 +0800
Subject: [PATCH 016/177] Abstract out ProcessStreamPluginV2.cs and add
ExecutablePluginV2.cs
---
.../Plugin/ExecutablePluginV2.cs | 26 +++++++
Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs | 7 ++
.../Plugin/ProcessStreamPluginV2.cs | 68 +++++++++++++++++++
Flow.Launcher.Core/Plugin/PythonPluginV2.cs | 66 ++----------------
4 files changed, 107 insertions(+), 60 deletions(-)
create mode 100644 Flow.Launcher.Core/Plugin/ExecutablePluginV2.cs
create mode 100644 Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs
diff --git a/Flow.Launcher.Core/Plugin/ExecutablePluginV2.cs b/Flow.Launcher.Core/Plugin/ExecutablePluginV2.cs
new file mode 100644
index 000000000..ee1b315c2
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/ExecutablePluginV2.cs
@@ -0,0 +1,26 @@
+using System.Diagnostics;
+using System.IO;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Flow.Launcher.Core.Plugin
+{
+ internal sealed class ExecutablePluginV2 : ProcessStreamPluginV2
+ {
+ protected override ProcessStartInfo StartInfo { get; set; }
+
+ public ExecutablePluginV2(string filename)
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ FileName = filename,
+ UseShellExecute = false,
+ CreateNoWindow = true,
+ RedirectStandardOutput = true,
+ RedirectStandardError = true
+ };
+ }
+
+ }
+}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
index c6ef870c3..60130843e 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
@@ -6,7 +6,9 @@ using System.Threading;
using System.Threading.Tasks;
using Flow.Launcher.Core.Plugin.JsonRPCV2Models;
using Flow.Launcher.Plugin;
+using Microsoft.VisualStudio.Threading;
using StreamJsonRpc;
+using IAsyncDisposable = System.IAsyncDisposable;
namespace Flow.Launcher.Core.Plugin
@@ -39,6 +41,11 @@ namespace Flow.Launcher.Core.Plugin
}
}
+ public override List LoadContextMenus(Result selectedResult)
+ {
+ throw new NotImplementedException();
+ }
+
public override async Task> QueryAsync(Query query, CancellationToken token)
{
try
diff --git a/Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs b/Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs
new file mode 100644
index 000000000..be35d481c
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO.Pipelines;
+using System.Threading.Tasks;
+using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Plugin;
+using Nerdbank.Streams;
+
+namespace Flow.Launcher.Core.Plugin
+{
+ internal abstract class ProcessStreamPluginV2 : JsonRPCPluginV2
+ {
+
+ public override string SupportedLanguage { get; set; }
+ protected override IDuplexPipe ClientPipe { get; set; }
+
+ protected abstract ProcessStartInfo StartInfo { get; set; }
+
+ public Process ClientProcess { get; set; }
+
+ public override async Task InitAsync(PluginInitContext context)
+ {
+ StartInfo.EnvironmentVariables["FLOW_VERSION"] = Constant.Version;
+ StartInfo.EnvironmentVariables["FLOW_PROGRAM_DIRECTORY"] = Constant.ProgramDirectory;
+ StartInfo.EnvironmentVariables["FLOW_APPLICATION_DIRECTORY"] = Constant.ApplicationDirectory;
+
+ StartInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
+ StartInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
+
+ ClientProcess = Process.Start(StartInfo);
+ ArgumentNullException.ThrowIfNull(ClientProcess);
+
+ SetupPipe(ClientProcess);
+
+ await base.InitAsync(context);
+ }
+
+ private void SetupPipe(Process process)
+ {
+ var (reader, writer) = (PipeReader.Create(process.StandardOutput.BaseStream),
+ PipeWriter.Create(process.StandardInput.BaseStream));
+ ClientPipe = new DuplexPipe(reader, writer);
+ }
+
+
+ public override async Task ReloadDataAsync()
+ {
+ var oldProcess = ClientProcess;
+ ClientProcess = Process.Start(StartInfo);
+ ArgumentNullException.ThrowIfNull(ClientProcess);
+ SetupPipe(ClientProcess);
+ await base.ReloadDataAsync();
+ oldProcess.Kill(true);
+ await oldProcess.WaitForExitAsync();
+ oldProcess.Dispose();
+ }
+
+
+ public override async ValueTask DisposeAsync()
+ {
+ ClientProcess.Kill(true);
+ await ClientProcess.WaitForExitAsync();
+ ClientProcess.Dispose();
+ await base.DisposeAsync();
+ }
+ }
+}
diff --git a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
index 98b55f896..09c1a069a 100644
--- a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
@@ -16,19 +16,16 @@ using StreamJsonRpc;
namespace Flow.Launcher.Core.Plugin
{
- internal class PythonPluginV2 : JsonRPCPluginV2
+ internal sealed class PythonPluginV2 : ProcessStreamPluginV2
{
- private readonly ProcessStartInfo _startInfo;
- private Process _process;
-
public override string SupportedLanguage { get; set; } = AllowedLanguage.Python;
protected override IDuplexPipe ClientPipe { get; set; }
-
-
+ protected override ProcessStartInfo StartInfo { get; set; }
+
public PythonPluginV2(string filename)
{
- _startInfo = new ProcessStartInfo
+ StartInfo = new ProcessStartInfo
{
FileName = filename,
UseShellExecute = false,
@@ -40,61 +37,10 @@ namespace Flow.Launcher.Core.Plugin
// temp fix for issue #667
var path = Path.Combine(Constant.ProgramDirectory, JsonRpc);
- _startInfo.EnvironmentVariables["PYTHONPATH"] = path;
-
- _startInfo.EnvironmentVariables["FLOW_VERSION"] = Constant.Version;
- _startInfo.EnvironmentVariables["FLOW_PROGRAM_DIRECTORY"] = Constant.ProgramDirectory;
- _startInfo.EnvironmentVariables["FLOW_APPLICATION_DIRECTORY"] = Constant.ApplicationDirectory;
-
+ StartInfo.EnvironmentVariables["PYTHONPATH"] = path;
//Add -B flag to tell python don't write .py[co] files. Because .pyc contains location infos which will prevent python portable
- _startInfo.ArgumentList.Add("-B");
- }
-
-
- public override List LoadContextMenus(Result selectedResult)
- {
- throw new NotImplementedException();
- }
-
- public override async Task InitAsync(PluginInitContext context)
- {
- _startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
- _startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
-
- _process = Process.Start(_startInfo);
- ArgumentNullException.ThrowIfNull(_process);
-
- SetupPipe(_process);
-
- await base.InitAsync(context);
- }
-
- public override async ValueTask DisposeAsync()
- {
- _process.Kill(true);
- await _process.WaitForExitAsync();
- _process.Dispose();
- await base.DisposeAsync();
- }
-
- private void SetupPipe(Process process)
- {
- var (reader, writer) = (PipeReader.Create(process.StandardOutput.BaseStream),
- PipeWriter.Create(process.StandardInput.BaseStream));
- ClientPipe = new DuplexPipe(reader, writer);
- }
-
- public override async Task ReloadDataAsync()
- {
- var oldProcess = _process;
- _process = Process.Start(_startInfo);
- ArgumentNullException.ThrowIfNull(_process);
- SetupPipe(_process);
- await base.ReloadDataAsync();
- oldProcess.Kill(true);
- await oldProcess.WaitForExitAsync();
- oldProcess.Dispose();
+ StartInfo.ArgumentList.Add("-B");
}
}
}
From 29aefee390e606b4eaad59708519d6b557431713 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Wed, 23 Aug 2023 08:37:43 +1000
Subject: [PATCH 017/177] remove irrelevant comment
---
Flow.Launcher.Core/Plugin/PythonPlugin.cs | 1 -
Flow.Launcher.Core/Plugin/PythonPluginV2.cs | 1 -
2 files changed, 2 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PythonPlugin.cs b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
index d5258565e..536e69b3d 100644
--- a/Flow.Launcher.Core/Plugin/PythonPlugin.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPlugin.cs
@@ -23,7 +23,6 @@ namespace Flow.Launcher.Core.Plugin
RedirectStandardError = true,
};
- // temp fix for issue #667
var path = Path.Combine(Constant.ProgramDirectory, JsonRPC);
_startInfo.EnvironmentVariables["PYTHONPATH"] = path;
diff --git a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
index 09c1a069a..842dc5cad 100644
--- a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
@@ -35,7 +35,6 @@ namespace Flow.Launcher.Core.Plugin
RedirectStandardInput = true
};
- // temp fix for issue #667
var path = Path.Combine(Constant.ProgramDirectory, JsonRpc);
StartInfo.EnvironmentVariables["PYTHONPATH"] = path;
From 20f23b01bb623c448cfa076a644d08d947f269c0 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Mon, 28 Aug 2023 18:57:12 +0800
Subject: [PATCH 018/177] update streamjsonrpc and use systemtextjsonformatter
---
Flow.Launcher.Core/Flow.Launcher.Core.csproj | 2 +-
Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
index 133ed02e3..f9e057b49 100644
--- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj
+++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
@@ -57,7 +57,7 @@
-
+
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
index 60130843e..305ba9b65 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
@@ -91,7 +91,7 @@ namespace Flow.Launcher.Core.Plugin
private void SetupJsonRPC()
{
- var formatter = new JsonMessageFormatter();
+ var formatter = new SystemTextJsonFormatter();
var handler = new NewLineDelimitedMessageHandler(ClientPipe,
formatter);
From 802457f7136205056396446ec5ce5b48a118a398 Mon Sep 17 00:00:00 2001
From: Marcin Badurowicz
Date: Sun, 10 Sep 2023 22:03:41 +0200
Subject: [PATCH 019/177] switch to different nuget
---
.../FirefoxBookmarkLoader.cs | 10 +++++-----
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 14 +++++++-------
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 022f28144..9bd3431cc 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -1,7 +1,7 @@
using Flow.Launcher.Plugin.BrowserBookmark.Models;
+using Microsoft.Data.Sqlite;
using System;
using System.Collections.Generic;
-using System.Data.SQLite;
using System.IO;
using System.Linq;
@@ -33,11 +33,11 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
// create the connection string and init the connection
string dbPath = string.Format(dbPathFormat, placesPath);
- using var dbConnection = new SQLiteConnection(dbPath);
+ using var dbConnection = new SqliteConnection(dbPath);
// Open connection to the database file and execute the query
dbConnection.Open();
- var reader = new SQLiteCommand(queryAllBookmarks, dbConnection).ExecuteReader();
-
+ var reader = new SqliteCommand(queryAllBookmarks, dbConnection).ExecuteReader();
+
// return results in List format
bookmarkList = reader.Select(
x => new Bookmark(x["title"] is DBNull ? string.Empty : x["title"].ToString(),
@@ -133,7 +133,7 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
public static class Extensions
{
- public static IEnumerable Select(this SQLiteDataReader reader, Func projection)
+ public static IEnumerable Select(this SqliteDataReader reader, Func projection)
{
while (reader.Read())
{
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 6cd155ecc..fc26ee77a 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -1,4 +1,4 @@
-
+
Library
@@ -55,15 +55,15 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
From bdc3bfc6b8b2181fb79925659632050935c8b767 Mon Sep 17 00:00:00 2001
From: Marcin Badurowicz
Date: Sun, 10 Sep 2023 23:23:30 +0200
Subject: [PATCH 020/177] remove unused properties from connection string
---
.../FirefoxBookmarkLoader.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 9bd3431cc..3d061e758 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -19,7 +19,7 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
ORDER BY moz_places.visit_count DESC
";
- private const string dbPathFormat = "Data Source ={0};Version=3;New=False;Compress=True;";
+ private const string dbPathFormat = "Data Source ={0}";
protected static List GetBookmarksFromPath(string placesPath)
{
From c33e8127eaf9606ae98fc285a23bf2e852fe01b3 Mon Sep 17 00:00:00 2001
From: Marcin Badurowicz
Date: Sun, 10 Sep 2023 23:40:08 +0200
Subject: [PATCH 021/177] remove dll copy step as it is automatically done when
dotnet build with rid
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index fc26ee77a..8ebf292aa 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -63,15 +63,4 @@
-
-
\ No newline at end of file
From 5c7141d4f887b8cfd73b12d2c67b88b58b7e2ffb Mon Sep 17 00:00:00 2001
From: Marcin Badurowicz
Date: Sun, 10 Sep 2023 23:44:10 +0200
Subject: [PATCH 022/177] set default rid to x64
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 1 +
1 file changed, 1 insertion(+)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 8ebf292aa..115d06a32 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -12,6 +12,7 @@
false
false
true
+ win-x64
From 63b2a07dd98f15d1127d2349e6172da7870f6ded Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Mon, 11 Sep 2023 09:12:41 -0500
Subject: [PATCH 023/177] load unmanaged dll from dependencyResolver as well
---
Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs | 13 ++++++++++++-
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 1 -
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs b/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs
index 1dd0683f0..87bf8e6e8 100644
--- a/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs
+++ b/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs
@@ -34,6 +34,17 @@ namespace Flow.Launcher.Core.Plugin
return existAssembly ?? (assemblyPath == null ? null : LoadFromAssemblyPath(assemblyPath));
}
+
+ protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
+ {
+ var path = dependencyResolver.ResolveUnmanagedDllToPath(unmanagedDllName);
+ if (!string.IsNullOrEmpty(path))
+ {
+ return LoadUnmanagedDllFromPath(path);
+ }
+
+ return IntPtr.Zero;
+ }
internal Type FromAssemblyGetTypeOfInterface(Assembly assembly, Type type)
{
@@ -41,4 +52,4 @@ namespace Flow.Launcher.Core.Plugin
return allTypes.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Any(t => t == type));
}
}
-}
\ No newline at end of file
+}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 115d06a32..8ebf292aa 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -12,7 +12,6 @@
false
false
true
- win-x64
From c67d0faeaf65e2b5c71dc787b03ac2b6d094a3aa Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Tue, 12 Sep 2023 08:23:34 +1000
Subject: [PATCH 024/177] remove obsolete comment
---
Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs b/Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs
index 7309e740b..b84801578 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs
@@ -2,7 +2,6 @@
namespace Flow.Launcher.Core.Plugin
{
- // TODO: After Upgrading to .Net 7, adding Source Generating Context for IAsyncEnumerable JsonRPCMessage
[JsonSerializable(typeof(JsonRPCQueryResponseModel))]
public partial class JsonRPCQueryResponseModelContext : JsonSerializerContext
From 0bc1fae19c2a425e3d1072ef9e918c67f3a9fabe Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Wed, 27 Sep 2023 10:41:44 +1000
Subject: [PATCH 025/177] update README early access link
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index ba0f763aa..f121f2b75 100644
--- a/README.md
+++ b/README.md
@@ -105,7 +105,7 @@ Dedicated to making your workflow flow more seamless. Search everything from app
> When installing for the first time Windows may raise an issue about security due to code not being signed, if you downloaded from this repo then you are good to continue the set up.
-And you can download early access version.
+And you can download early access version.
From 85115a24cd1f6f08491181edba4aefe4e9d3d67d Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Wed, 27 Sep 2023 20:26:51 +1000
Subject: [PATCH 026/177] fix publish plugins action
---
.github/workflows/default_plugins.yml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.github/workflows/default_plugins.yml b/.github/workflows/default_plugins.yml
index 99c62ae6e..8000c5456 100644
--- a/.github/workflows/default_plugins.yml
+++ b/.github/workflows/default_plugins.yml
@@ -2,7 +2,7 @@ name: Publish Default Plugins
on:
push:
- branches: ['master']
+ branches: ['dev']
paths: ['Plugins/**']
workflow_dispatch:
@@ -46,6 +46,7 @@ jobs:
- 'Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json'
windowssettings:
- 'Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json'
+ base: 'master'
- name: Get BrowserBookmark Version
if: steps.changes.outputs.browserbookmark == 'true'
From ee8b0702a79e1b990d0775ac429b62c543a6e83b Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Thu, 28 Sep 2023 11:18:17 +0800
Subject: [PATCH 027/177] Ignore .lnk target file extension
- To avoid query "ex" matching any ".exe" file
---
Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
index f3a26dca6..20f489c30 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
@@ -313,7 +313,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
if (!string.IsNullOrEmpty(target) && File.Exists(target))
{
program.LnkResolvedPath = Path.GetFullPath(target);
- program.ExecutableName = Path.GetFileName(target);
+ program.ExecutableName = Path.GetFileNameWithoutExtension(target);
var args = _helper.arguments;
if (!string.IsNullOrEmpty(args))
From 31131ea4a0379dfd8177c3605f1fab9460542928 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Thu, 28 Sep 2023 23:45:11 +0800
Subject: [PATCH 028/177] Remove download success notification
---
.../Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs | 7 -------
1 file changed, 7 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 683904ea0..6b6945d37 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -136,9 +136,6 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
await Http.DownloadAsync(plugin.UrlDownload, filePath).ConfigureAwait(false);
- Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_download_success"), plugin.Name));
-
Install(plugin, filePath);
}
catch (Exception e)
@@ -223,10 +220,6 @@ namespace Flow.Launcher.Plugin.PluginsManager
await Http.DownloadAsync(x.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
.ConfigureAwait(false);
- Context.API.ShowMsg(
- Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_download_success"), x.Name));
-
Install(x.PluginNewUserPlugin, downloadToFilePath);
Context.API.RestartApp();
From 1334798c6d420dc1a0676835b5b41779924dc5f6 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Fri, 29 Sep 2023 13:06:42 +0800
Subject: [PATCH 029/177] Add AutoRestartAfterChanging option
- Option and UI
- New prompts and notification messages
---
.../Languages/en.xaml | 11 ++-
.../PluginsManager.cs | 96 +++++++++++++++----
.../Settings.cs | 2 +
.../ViewModels/SettingsViewModel.cs | 6 ++
.../Views/PluginsManagerSettings.xaml | 12 +++
5 files changed, 107 insertions(+), 20 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
index 1f74a49a2..d08087ac2 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
@@ -8,7 +8,9 @@
Successfully downloaded {0}
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -21,15 +23,19 @@
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
+
+ Plugin {0} successfully installed. Please manually restart Flow.
+ Plugin {0} successfully uninstalled. Please manually restart Flow.
+ Plugin {0} successfully updated. Please manually restart Flow.
Plugins Manager
@@ -48,4 +54,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 6b6945d37..77fa3b981 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -117,9 +117,19 @@ namespace Flow.Launcher.Plugin.PluginsManager
return;
}
- var message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_prompt"),
- plugin.Name, plugin.Author,
- Environment.NewLine, Environment.NewLine);
+ string message;
+ if (Settings.AutoRestartAfterChanging)
+ {
+ message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_prompt"),
+ plugin.Name, plugin.Author,
+ Environment.NewLine, Environment.NewLine);
+ }
+ else
+ {
+ message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_prompt_no_restart"),
+ plugin.Name, plugin.Author,
+ Environment.NewLine);
+ }
if (MessageBox.Show(message, Context.API.GetTranslation("plugin_pluginsmanager_install_title"),
MessageBoxButton.YesNo) == MessageBoxResult.No)
@@ -140,6 +150,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
}
catch (Exception e)
{
+ // TODO use toast to optimize error prompt
if (e is HttpRequestException)
MessageBox.Show(Context.API.GetTranslation("plugin_pluginsmanager_download_error"),
Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"));
@@ -153,10 +164,19 @@ namespace Flow.Launcher.Plugin.PluginsManager
return;
}
- Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_installing_plugin"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_success_restart"), plugin.Name));
-
- Context.API.RestartApp();
+ if (Settings.AutoRestartAfterChanging)
+ {
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_installing_plugin"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_success_restart"),
+ plugin.Name));
+ Context.API.RestartApp();
+ }
+ else
+ {
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_installing_plugin"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_success_no_restart"),
+ plugin.Name));
+ }
}
internal async ValueTask> RequestUpdateAsync(string search, CancellationToken token, bool usePrimaryUrlOnly = false)
@@ -201,10 +221,20 @@ namespace Flow.Launcher.Plugin.PluginsManager
IcoPath = x.IcoPath,
Action = e =>
{
- string message = string.Format(
- Context.API.GetTranslation("plugin_pluginsmanager_update_prompt"),
- x.Name, x.Author,
- Environment.NewLine, Environment.NewLine);
+
+ string message;
+ if (Settings.AutoRestartAfterChanging)
+ {
+ message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_prompt"),
+ x.Name, x.Author,
+ Environment.NewLine, Environment.NewLine);
+ }
+ else
+ {
+ message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_prompt_no_restart"),
+ x.Name, x.Author,
+ Environment.NewLine);
+ }
if (MessageBox.Show(message,
Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
@@ -215,14 +245,26 @@ namespace Flow.Launcher.Plugin.PluginsManager
var downloadToFilePath = Path.Combine(DataLocation.PluginsDirectory,
$"{x.Name}-{x.NewVersion}.zip");
- Task.Run(async delegate
+ _ = Task.Run(async delegate
{
await Http.DownloadAsync(x.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
.ConfigureAwait(false);
Install(x.PluginNewUserPlugin, downloadToFilePath);
- Context.API.RestartApp();
+ if (Settings.AutoRestartAfterChanging)
+ {
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_restart"),
+ x.Name));
+ Context.API.RestartApp();
+ }
+ else
+ {
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_no_restart"),
+ x.Name));
+ }
}).ContinueWith(t =>
{
Log.Exception("PluginsManager", $"Update failed for {x.Name}",
@@ -454,10 +496,19 @@ namespace Flow.Launcher.Plugin.PluginsManager
IcoPath = x.Metadata.IcoPath,
Action = e =>
{
- string message = string.Format(
- Context.API.GetTranslation("plugin_pluginsmanager_uninstall_prompt"),
- x.Metadata.Name, x.Metadata.Author,
- Environment.NewLine, Environment.NewLine);
+ string message;
+ if (Settings.AutoRestartAfterChanging)
+ {
+ message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_prompt"),
+ x.Metadata.Name, x.Metadata.Author,
+ Environment.NewLine, Environment.NewLine);
+ }
+ else
+ {
+ message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_prompt_no_restart"),
+ x.Metadata.Name, x.Metadata.Author,
+ Environment.NewLine);
+ }
if (MessageBox.Show(message,
Context.API.GetTranslation("plugin_pluginsmanager_uninstall_title"),
@@ -465,7 +516,16 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
Application.Current.MainWindow.Hide();
Uninstall(x.Metadata);
- Context.API.RestartApp();
+ if (Settings.AutoRestartAfterChanging)
+ {
+ Context.API.RestartApp();
+ }
+ else
+ {
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_success_no_restart"),
+ x.Metadata.Name));
+ }
return true;
}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
index aa35f02b5..f23ff71f0 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
@@ -9,5 +9,7 @@
internal const string UpdateCommand = "update";
public bool WarnFromUnknownSource { get; set; } = true;
+
+ public bool AutoRestartAfterChanging { get; set; } = false;
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/ViewModels/SettingsViewModel.cs
index 672884f80..1c71507fc 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/ViewModels/SettingsViewModel.cs
@@ -17,5 +17,11 @@
get => Settings.WarnFromUnknownSource;
set => Settings.WarnFromUnknownSource = value;
}
+
+ public bool AutoRestartAfterChanging
+ {
+ get => Settings.AutoRestartAfterChanging;
+ set => Settings.AutoRestartAfterChanging = value;
+ }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Views/PluginsManagerSettings.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Views/PluginsManagerSettings.xaml
index a62a032f7..18be0d2ca 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Views/PluginsManagerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Views/PluginsManagerSettings.xaml
@@ -12,10 +12,22 @@
+
+
+
+
+
From 0c8729f7fb5edfed1dd2641c6d205013b81753e7 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 26 Sep 2023 20:16:20 +0800
Subject: [PATCH 030/177] Fix wrong doc
---
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index 474ad6f0a..e6d9126c6 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -107,7 +107,7 @@ namespace Flow.Launcher.Plugin
///
/// Message title
/// Message subtitle
- /// Message icon path (relative path to your plugin folder)
+ /// Full path to icon
void ShowMsg(string title, string subTitle = "", string iconPath = "");
///
@@ -115,7 +115,7 @@ namespace Flow.Launcher.Plugin
///
/// Message title
/// Message subtitle
- /// Message icon path (relative path to your plugin folder)
+ /// Full path to icon
/// when true will use main windows as the owner
void ShowMsg(string title, string subTitle, string iconPath, bool useMainWindowAsOwner = true);
From 07e77e7a416b05e554e750d4db76c71a29095a67 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 3 Oct 2023 13:55:47 +0800
Subject: [PATCH 031/177] Add Edge Workspaces support
---
.../ChromiumBookmarkLoader.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index c1efb5b5f..14b791c48 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -54,6 +54,7 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
switch (subElement.GetProperty("type").GetString())
{
case "folder":
+ case "workspace": // Edge Workspace
EnumerateFolderBookmark(subElement, bookmarks, source);
break;
default:
From 755c09e3d9833ce0e3f01ed21866fb0519b6b5bd Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Wed, 4 Oct 2023 02:59:18 +0800
Subject: [PATCH 032/177] Fix spell check extra dict missing error (#2379)
* Fix spell check extra dict missing error
* revert deleting dicts
* fix dup
---
.github/workflows/spelling.yml | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml
index df962a675..1866c8f7e 100644
--- a/.github/workflows/spelling.yml
+++ b/.github/workflows/spelling.yml
@@ -73,7 +73,7 @@ jobs:
steps:
- name: check-spelling
id: spelling
- uses: check-spelling/check-spelling@main
+ uses: check-spelling/check-spelling@v0.0.22
with:
suppress_push_for_open_pull_request: 1
checkout: true
@@ -89,12 +89,13 @@ jobs:
check_extra_dictionaries: ''
quit_without_error: true
extra_dictionaries:
- cspell:software-terms/src/software-terms.txt
+ cspell:software-terms/dict/softwareTerms.txt
cspell:win32/src/win32.txt
cspell:php/php.txt
cspell:filetypes/filetypes.txt
cspell:csharp/csharp.txt
cspell:dotnet/dotnet.txt
+ cspell:python/src/common/extra.txt
cspell:python/src/python/python-lib.txt
cspell:aws/aws.txt
cspell:companies/src/companies.txt
@@ -113,7 +114,7 @@ jobs:
# if: (success() || failure()) && needs.spelling.outputs.followup && github.event_name == 'push'
# steps:
# - name: comment
-# uses: check-spelling/check-spelling@main
+# uses: check-spelling/check-spelling@@v0.0.22
# with:
# checkout: true
# spell_check_this: check-spelling/spell-check-this@main
@@ -129,7 +130,7 @@ jobs:
if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request')
steps:
- name: comment
- uses: check-spelling/check-spelling@main
+ uses: check-spelling/check-spelling@v0.0.22
with:
checkout: true
spell_check_this: check-spelling/spell-check-this@main
@@ -153,7 +154,7 @@ jobs:
# cancel-in-progress: false
# steps:
# - name: apply spelling updates
- # uses: check-spelling/check-spelling@main
+ # uses: check-spelling/check-spelling@v0.0.22
# with:
# experimental_apply_changes_via_bot: 1
# checkout: true
From c59a01d36185ea6cdce9b2cc6d53da99afb53a18 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 9 Oct 2023 22:11:32 +0000
Subject: [PATCH 033/177] Bump SharpVectors from 1.8.1 to 1.8.2
Bumps [SharpVectors](https://github.com/ElinamLLC/SharpVectors) from 1.8.1 to 1.8.2.
- [Release notes](https://github.com/ElinamLLC/SharpVectors/releases)
- [Commits](https://github.com/ElinamLLC/SharpVectors/compare/v1.8.1...v1.8.2)
---
updated-dependencies:
- dependency-name: SharpVectors
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Flow.Launcher/Flow.Launcher.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index cc6290ab0..eaff7e473 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -95,7 +95,7 @@
-
+
From e56e9b146815f4817e655240be44271d9dee6993 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Tue, 10 Oct 2023 09:04:28 +0800
Subject: [PATCH 034/177] [ci skip] Fix missing dotnet and php dict
---
.github/workflows/spelling.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml
index 1866c8f7e..97d3cccb3 100644
--- a/.github/workflows/spelling.yml
+++ b/.github/workflows/spelling.yml
@@ -91,10 +91,10 @@ jobs:
extra_dictionaries:
cspell:software-terms/dict/softwareTerms.txt
cspell:win32/src/win32.txt
- cspell:php/php.txt
+ cspell:php/src/php.txt
cspell:filetypes/filetypes.txt
cspell:csharp/csharp.txt
- cspell:dotnet/dotnet.txt
+ cspell:dotnet/src/dotnet.txt
cspell:python/src/common/extra.txt
cspell:python/src/python/python-lib.txt
cspell:aws/aws.txt
From ab96629395fc960d42eccf2741458cf63520a503 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Mon, 16 Oct 2023 05:55:57 -0500
Subject: [PATCH 035/177] remove legacy CompileRemove
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 4 ----
1 file changed, 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 8ebf292aa..9701c2ee8 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -55,10 +55,6 @@
-
-
-
-
From cc2ae7c768516db1d113b0088b75aa105f863feb Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 30 Oct 2023 23:09:43 +0000
Subject: [PATCH 036/177] Bump Microsoft.Data.Sqlite from 7.0.10 to 7.0.13
Bumps [Microsoft.Data.Sqlite](https://github.com/dotnet/efcore) from 7.0.10 to 7.0.13.
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v7.0.10...v7.0.13)
---
updated-dependencies:
- dependency-name: Microsoft.Data.Sqlite
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 9701c2ee8..edaa3dd29 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -1,4 +1,4 @@
-
+
Library
@@ -56,7 +56,7 @@
-
+
\ No newline at end of file
From 0a72535795de88c76727c8e706c1fcfef5a729f7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 30 Oct 2023 23:09:53 +0000
Subject: [PATCH 037/177] Bump CommunityToolkit.Mvvm from 8.2.1 to 8.2.2
Bumps [CommunityToolkit.Mvvm](https://github.com/CommunityToolkit/dotnet) from 8.2.1 to 8.2.2.
- [Release notes](https://github.com/CommunityToolkit/dotnet/releases)
- [Commits](https://github.com/CommunityToolkit/dotnet/compare/v8.2.1...v8.2.2)
---
updated-dependencies:
- dependency-name: CommunityToolkit.Mvvm
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Flow.Launcher/Flow.Launcher.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index eaff7e473..e7b35e689 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -83,7 +83,7 @@
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
From 1c63cd9350db5f0eb7207267fbda59a53c24f89d Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Tue, 31 Oct 2023 08:43:10 -0500
Subject: [PATCH 038/177] remove duplicate comment summary
---
.../JsonRPCV2Models/JsonRPCPublicAPI.cs | 149 ------------------
1 file changed, 149 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCPublicAPI.cs b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCPublicAPI.cs
index a65d5db22..b8bfee591 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCPublicAPI.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCPublicAPI.cs
@@ -20,304 +20,155 @@ namespace Flow.Launcher.Core.Plugin.JsonRPCV2Models
_api = api;
}
- ///
- /// Change Flow.Launcher query
- ///
- /// query text
- ///
- /// Force requery. By default, Flow Launcher will not fire query if your query is same with existing one.
- /// Set this to to force Flow Launcher requerying
- ///
public void ChangeQuery(string query, bool requery = false)
{
_api.ChangeQuery(query, requery);
}
- ///
- /// Restart Flow Launcher
- ///
public void RestartApp()
{
_api.RestartApp();
}
- ///
- /// Run a shell command
- ///
- /// The command or program to run
- /// the shell type to run, e.g. powershell.exe
- /// Thrown when unable to find the file specified in the command
- /// Thrown when error occurs during the execution of the command
public void ShellRun(string cmd, string filename = "cmd.exe")
{
_api.ShellRun(cmd, filename);
}
- ///
- /// Copies the passed in text and shows a message indicating whether the operation was completed successfully.
- /// When directCopy is set to true and passed in text is the path to a file or directory,
- /// the actual file/directory will be copied to clipboard. Otherwise the text itself will still be copied to clipboard.
- ///
- /// Text to save on clipboard
- /// When true it will directly copy the file/folder from the path specified in text
- /// Whether to show the default notification from this method after copy is done.
- /// It will show file/folder/text is copied successfully.
- /// Turn this off to show your own notification after copy is done.>
public void CopyToClipboard(string text, bool directCopy = false, bool showDefaultNotification = true)
{
_api.CopyToClipboard(text, directCopy, showDefaultNotification);
}
- ///
- /// Save everything, all of Flow Launcher and plugins' data and settings
- ///
public void SaveAppAllSettings()
{
_api.SaveAppAllSettings();
}
- ///
- /// Save all Flow's plugins settings
- ///
public void SavePluginSettings()
{
_api.SavePluginSettings();
}
- ///
- /// Reloads any Plugins that have the
- /// IReloadable implemented. It refeshes
- /// Plugin's in memory data with new content
- /// added by user.
- ///
public Task ReloadAllPluginDataAsync()
{
return _api.ReloadAllPluginData();
}
- ///
- /// Check for new Flow Launcher update
- ///
public void CheckForNewUpdate()
{
_api.CheckForNewUpdate();
}
- ///
- /// Show the error message using Flow's standard error icon.
- ///
- /// Message title
- /// Optional message subtitle
public void ShowMsgError(string title, string subTitle = "")
{
_api.ShowMsgError(title, subTitle);
}
- ///
- /// Show the MainWindow when hiding
- ///
public void ShowMainWindow()
{
_api.ShowMainWindow();
}
- ///
- /// Hide MainWindow
- ///
public void HideMainWindow()
{
_api.HideMainWindow();
}
- ///
- /// Representing whether the main window is visible
- ///
- ///
public bool IsMainWindowVisible()
{
return _api.IsMainWindowVisible();
}
- ///
- /// Show message box
- ///
- /// Message title
- /// Message subtitle
- /// Message icon path (relative path to your plugin folder)
public void ShowMsg(string title, string subTitle = "", string iconPath = "")
{
_api.ShowMsg(title, subTitle, iconPath);
}
- ///
- /// Show message box
- ///
- /// Message title
- /// Message subtitle
- /// Message icon path (relative path to your plugin folder)
- /// when true will use main windows as the owner
public void ShowMsg(string title, string subTitle, string iconPath, bool useMainWindowAsOwner = true)
{
_api.ShowMsg(title, subTitle, iconPath, useMainWindowAsOwner);
}
- ///
- /// Open setting dialog
- ///
public void OpenSettingDialog()
{
_api.OpenSettingDialog();
}
- ///
- /// Get translation of current language
- /// You need to implement IPluginI18n if you want to support multiple languages for your plugin
- ///
- ///
- ///
public string GetTranslation(string key)
{
return _api.GetTranslation(key);
}
- ///
- /// Get all loaded plugins
- ///
- ///
public List GetAllPlugins()
{
return _api.GetAllPlugins();
}
- ///
- /// Fuzzy Search the string with the given query. This is the core search mechanism Flow uses
- ///
- /// Query string
- /// The string that will be compared against the query
- /// Match results
public MatchResult FuzzySearch(string query, string stringToCompare)
{
return _api.FuzzySearch(query, stringToCompare);
}
- ///
- /// Http download the spefic url and return as string
- ///
- /// URL to call Http Get
- /// Cancellation Token
- /// Task to get string result
public Task HttpGetStringAsync(string url, CancellationToken token = default)
{
return _api.HttpGetStringAsync(url, token);
}
- ///
- /// Http download the spefic url and return as stream
- ///
- /// URL to call Http Get
- /// Cancellation Token
- /// Task to get stream result
public Task HttpGetStreamAsync(string url, CancellationToken token = default)
{
return _api.HttpGetStreamAsync(url, token);
}
- ///
- /// Download the specific url to a cretain file path
- ///
- /// URL to download file
- /// path to save downloaded file
- /// place to store file
- /// Task showing the progress
public Task HttpDownloadAsync([NotNull] string url, [NotNull] string filePath,
CancellationToken token = default)
{
return _api.HttpDownloadAsync(url, filePath, token);
}
- ///
- /// Add ActionKeyword for specific plugin
- ///
- /// ID for plugin that needs to add action keyword
- /// The actionkeyword that is supposed to be added
public void AddActionKeyword(string pluginId, string newActionKeyword)
{
_api.AddActionKeyword(pluginId, newActionKeyword);
}
- ///
- /// Remove ActionKeyword for specific plugin
- ///
- /// ID for plugin that needs to remove action keyword
- /// The actionkeyword that is supposed to be removed
public void RemoveActionKeyword(string pluginId, string oldActionKeyword)
{
_api.RemoveActionKeyword(pluginId, oldActionKeyword);
}
- ///
- /// Check whether specific ActionKeyword is assigned to any of the plugin
- ///
- /// The actionkeyword for checking
- /// True if the actionkeyword is already assigned, False otherwise
public bool ActionKeywordAssigned(string actionKeyword)
{
return _api.ActionKeywordAssigned(actionKeyword);
}
- ///
- /// Log debug message
- /// Message will only be logged in Debug mode
- ///
public void LogDebug(string className, string message, [CallerMemberName] string methodName = "")
{
_api.LogDebug(className, message, methodName);
}
- ///
- /// Log info message
- ///
public void LogInfo(string className, string message, [CallerMemberName] string methodName = "")
{
_api.LogInfo(className, message, methodName);
}
- ///
- /// Log warning message
- ///
public void LogWarn(string className, string message, [CallerMemberName] string methodName = "")
{
_api.LogWarn(className, message, methodName);
}
-
- ///
- /// Open directory in an explorer configured by user via Flow's Settings. The default is Windows Explorer
- ///
- /// Directory Path to open
- /// Extra FileName Info
public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null)
{
_api.OpenDirectory(DirectoryPath, FileNameOrFilePath);
}
- ///
- /// Opens the URL with the given string.
- /// The browser and mode used is based on what's configured in Flow's default browser settings.
- /// Non-C# plugins should use this method.
- ///
public void OpenUrl(string url, bool? inPrivate = null)
{
_api.OpenUrl(url, inPrivate);
}
- ///
- /// Opens the application URI with the given string, e.g. obsidian://search-query-example
- /// Non-C# plugins should use this method
- ///
public void OpenAppUri(string appUri)
{
_api.OpenAppUri(appUri);
From f69a6db54f53e219c71b19f0dda274e24c85516d Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Tue, 31 Oct 2023 08:51:56 -0500
Subject: [PATCH 039/177] fix a negative width
---
Plugins/Flow.Launcher.Plugin.Sys/SysSettings.xaml.cs | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/SysSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Sys/SysSettings.xaml.cs
index b5f1531c3..feb30821a 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/SysSettings.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/SysSettings.xaml.cs
@@ -22,7 +22,12 @@ namespace Flow.Launcher.Plugin.Sys
var workingWidth = listView.ActualWidth - SystemParameters.VerticalScrollBarWidth; // take into account vertical scrollbar
var col1 = 0.3;
- var col2 = 0.7;
+ var col2 = 0.7;
+
+ if (workingWidth <= 0)
+ {
+ return;
+ }
gView.Columns[0].Width = workingWidth * col1;
gView.Columns[1].Width = workingWidth * col2;
From 4c5eae895b83c87ed56555765cc798d4624702a8 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 1 Nov 2023 17:35:00 +0100
Subject: [PATCH 040/177] Implement CloseShellAfterPress (no logic)
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 12 ++++++++++--
Plugins/Flow.Launcher.Plugin.Shell/Settings.cs | 2 ++
Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml | 6 ++++++
.../Flow.Launcher.Plugin.Shell/ShellSetting.xaml.cs | 12 ++++++++++++
6 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
index 3fa7c64fa..8aae3a5fd 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
@@ -2,6 +2,7 @@
Ersetzt Win+R
+ Schließe die Kommandozeilte nachdem eine Taste gedrückt wurde
Schließe die Kommandozeilte nicht nachdem der Befehl ausgeführt wurde
Immer als Administrator ausführen
Als anderer Benutzer ausführen
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
index 9a692cac3..88fa264d0 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
@@ -3,6 +3,7 @@
xmlns:system="clr-namespace:System;assembly=mscorlib">
Replace Win+R
+ Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
index 66917d594..b963302db 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -187,7 +187,7 @@ namespace Flow.Launcher.Plugin.Shell
return history.ToList();
}
- private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdministrator = false)
+ private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdministrator = false) //TODO: implement logic for CloseCMDAfterPress
{
command = command.Trim();
command = Environment.ExpandEnvironmentVariables(command);
@@ -203,7 +203,7 @@ namespace Flow.Launcher.Plugin.Shell
case Shell.Cmd:
{
info.FileName = "cmd.exe";
- info.Arguments = $"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command}";
+ info.Arguments = $"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command} {(_settings.CloseShellAfterPress ? "& pause" : "")}";
//// Use info.Arguments instead of info.ArgumentList to enable users better control over the arguments they are writing.
//// Previous code using ArgumentList, commands needed to be separated correctly:
@@ -233,6 +233,10 @@ namespace Flow.Launcher.Plugin.Shell
{
info.ArgumentList.Add("-Command");
info.ArgumentList.Add(command);
+ if (_settings.CloseShellAfterPress)
+ {
+ info.ArgumentList.Add("; pause");
+ }
}
break;
}
@@ -246,6 +250,10 @@ namespace Flow.Launcher.Plugin.Shell
}
info.ArgumentList.Add("-Command");
info.ArgumentList.Add(command);
+ if (_settings.CloseShellAfterPress)
+ {
+ info.ArgumentList.Add("; pause");
+ }
break;
}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Settings.cs b/Plugins/Flow.Launcher.Plugin.Shell/Settings.cs
index 47b46055c..6f47d5d17 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Settings.cs
@@ -7,6 +7,8 @@ namespace Flow.Launcher.Plugin.Shell
public Shell Shell { get; set; } = Shell.Cmd;
public bool ReplaceWinR { get; set; } = false;
+
+ public bool CloseShellAfterPress { get; set; } = false;
public bool LeaveShellOpen { get; set; }
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml b/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml
index 240bda953..960272f0f 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml
@@ -22,6 +22,12 @@
Margin="10,10,5,5"
HorizontalAlignment="Left"
Content="{DynamicResource flowlauncher_plugin_cmd_relace_winr}" />
+
+ {
+ _settings.CloseShellAfterPress = true;
+ };
+
+ CloseShellAfterPress.Unchecked += (o, e) =>
+ {
+ _settings.CloseShellAfterPress = false;
+ };
+
LeaveShellOpen.Checked += (o, e) =>
{
_settings.LeaveShellOpen = true;
From f5b1b4f830eb423be029f6024530f80808ad8940 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Fri, 3 Nov 2023 21:16:51 -0500
Subject: [PATCH 041/177] rename and add js/ts v2
---
.../Environments/JavaScriptV2Environment.cs | 14 ++++++
.../Environments/TypeScriptV2Environment.cs | 44 +++++++++++++++++++
.../Plugin/JsonRPCModelContext.cs | 20 ---------
.../Plugin/JsonRPCPluginBase.cs | 4 +-
...leSettings.cs => JsonRPCPluginSettings.cs} | 2 +-
Flow.Launcher.Core/Plugin/NodePlugin.cs | 8 ++--
Flow.Launcher.Core/Plugin/NodePluginV2.cs | 38 ++++++++++++++++
Flow.Launcher.Core/Plugin/PluginsLoader.cs | 40 ++++++++++++-----
.../Plugin/ProcessStreamPluginV2.cs | 2 +-
Flow.Launcher.Core/Plugin/PythonPluginV2.cs | 2 -
Flow.Launcher.Plugin/AllowedLanguage.cs | 33 +++++++++++---
11 files changed, 159 insertions(+), 48 deletions(-)
create mode 100644 Flow.Launcher.Core/ExternalPlugins/Environments/JavaScriptV2Environment.cs
create mode 100644 Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs
delete mode 100644 Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs
rename Flow.Launcher.Core/Plugin/{PortableSettings.cs => JsonRPCPluginSettings.cs} (99%)
create mode 100644 Flow.Launcher.Core/Plugin/NodePluginV2.cs
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/JavaScriptV2Environment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/JavaScriptV2Environment.cs
new file mode 100644
index 000000000..6c8c5aa57
--- /dev/null
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/JavaScriptV2Environment.cs
@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.Core.ExternalPlugins.Environments
+{
+
+ internal class JavaScriptV2Environment : TypeScriptV2Environment
+ {
+ internal override string Language => AllowedLanguage.JavaScriptV2;
+
+ internal JavaScriptV2Environment(List pluginMetadataList, PluginsSettings pluginSettings) : base(pluginMetadataList, pluginSettings) { }
+ }
+}
diff --git a/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs
new file mode 100644
index 000000000..11ed94d3f
--- /dev/null
+++ b/Flow.Launcher.Core/ExternalPlugins/Environments/TypeScriptV2Environment.cs
@@ -0,0 +1,44 @@
+using System.Collections.Generic;
+using Droplex;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin.SharedCommands;
+using Flow.Launcher.Plugin;
+using System.IO;
+using Flow.Launcher.Core.Plugin;
+
+namespace Flow.Launcher.Core.ExternalPlugins.Environments
+{
+ internal class TypeScriptV2Environment : AbstractPluginEnvironment
+ {
+ internal override string Language => AllowedLanguage.TypeScriptV2;
+
+ internal override string EnvName => DataLocation.NodeEnvironmentName;
+
+ internal override string EnvPath => Path.Combine(DataLocation.PluginEnvironmentsPath, EnvName);
+
+ internal override string InstallPath => Path.Combine(EnvPath, "Node-v16.18.0");
+ internal override string ExecutablePath => Path.Combine(InstallPath, "node-v16.18.0-win-x64\\node.exe");
+
+ internal override string PluginsSettingsFilePath { get => PluginSettings.NodeExecutablePath; set => PluginSettings.NodeExecutablePath = value; }
+
+ internal TypeScriptV2Environment(List pluginMetadataList, PluginsSettings pluginSettings) : base(pluginMetadataList, pluginSettings) { }
+
+ internal override void InstallEnvironment()
+ {
+ FilesFolders.RemoveFolderIfExists(InstallPath);
+
+ DroplexPackage.Drop(App.nodejs_16_18_0, InstallPath).Wait();
+
+ PluginsSettingsFilePath = ExecutablePath;
+ }
+
+ internal override PluginPair CreatePluginPair(string filePath, PluginMetadata metadata)
+ {
+ return new PluginPair
+ {
+ Plugin = new NodePluginV2(filePath),
+ Metadata = metadata
+ };
+ }
+ }
+}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs b/Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs
deleted file mode 100644
index b84801578..000000000
--- a/Flow.Launcher.Core/Plugin/JsonRPCModelContext.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System.Text.Json.Serialization;
-
-namespace Flow.Launcher.Core.Plugin
-{
-
- [JsonSerializable(typeof(JsonRPCQueryResponseModel))]
- public partial class JsonRPCQueryResponseModelContext : JsonSerializerContext
- {
- }
-
- [JsonSerializable(typeof(JsonRPCRequestModel))]
- public partial class JsonRPCRequestModelContext : JsonSerializerContext
- {
- }
-
- [JsonSerializable(typeof(JsonRPCClientRequestModel))]
- public partial class JsonRPCClientRequestModelContext : JsonSerializerContext
- {
- }
-}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
index 18f787018..330120c12 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
@@ -69,7 +69,7 @@ namespace Flow.Launcher.Core.Plugin
protected abstract Task ExecuteResultAsync(JsonRPCResult result);
- protected PortableSettings Settings { get; set; }
+ protected JsonRPCPluginSettings Settings { get; set; }
protected List ParseResults(JsonRPCQueryResponseModel queryResponseModel)
{
@@ -135,7 +135,7 @@ namespace Flow.Launcher.Core.Plugin
deserializer.Deserialize(
await File.ReadAllTextAsync(SettingConfigurationPath));
- Settings ??= new PortableSettings
+ Settings ??= new JsonRPCPluginSettings
{
Configuration = configuration, SettingPath = SettingPath, API = Context.API
};
diff --git a/Flow.Launcher.Core/Plugin/PortableSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
similarity index 99%
rename from Flow.Launcher.Core/Plugin/PortableSettings.cs
rename to Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index 542460877..b87623c56 100644
--- a/Flow.Launcher.Core/Plugin/PortableSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -8,7 +8,7 @@ using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Plugin
{
- public class PortableSettings
+ public class JsonRPCPluginSettings
{
public required JsonRpcConfigurationModel Configuration { get; init; }
diff --git a/Flow.Launcher.Core/Plugin/NodePlugin.cs b/Flow.Launcher.Core/Plugin/NodePlugin.cs
index 8ea5c4b78..40eb057cb 100644
--- a/Flow.Launcher.Core/Plugin/NodePlugin.cs
+++ b/Flow.Launcher.Core/Plugin/NodePlugin.cs
@@ -1,5 +1,6 @@
using System.Diagnostics;
using System.IO;
+using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Flow.Launcher.Plugin;
@@ -27,23 +28,22 @@ namespace Flow.Launcher.Core.Plugin
protected override Task RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
{
- _startInfo.ArgumentList[1] = request.ToString();
+ _startInfo.ArgumentList[1] = JsonSerializer.Serialize(request);
return ExecuteAsync(_startInfo, token);
}
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
{
// since this is not static, request strings will build up in ArgumentList if index is not specified
- _startInfo.ArgumentList[1] = rpcRequest.ToString();
+ _startInfo.ArgumentList[1] = JsonSerializer.Serialize(rpcRequest);
return Execute(_startInfo);
}
public override async Task InitAsync(PluginInitContext context)
{
_startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
- _startInfo.ArgumentList.Add(string.Empty);
- await base.InitAsync(context);
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
+ await base.InitAsync(context);
}
}
}
diff --git a/Flow.Launcher.Core/Plugin/NodePluginV2.cs b/Flow.Launcher.Core/Plugin/NodePluginV2.cs
new file mode 100644
index 000000000..6c95777f0
--- /dev/null
+++ b/Flow.Launcher.Core/Plugin/NodePluginV2.cs
@@ -0,0 +1,38 @@
+using System.Diagnostics;
+using System.IO;
+using System.IO.Pipelines;
+using System.Threading;
+using System.Threading.Tasks;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.Core.Plugin
+{
+ ///
+ /// Execution of JavaScript & TypeScript plugins
+ ///
+ internal class NodePluginV2 : ProcessStreamPluginV2
+ {
+ public NodePluginV2(string filename)
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ FileName = filename,
+ UseShellExecute = false,
+ CreateNoWindow = true,
+ RedirectStandardOutput = true,
+ RedirectStandardError = true
+ };
+ }
+
+ public override string SupportedLanguage { get; set; }
+ protected override ProcessStartInfo StartInfo { get; set; }
+
+ public override async Task InitAsync(PluginInitContext context)
+ {
+ StartInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
+ StartInfo.ArgumentList.Add(string.Empty);
+ StartInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
+ await base.InitAsync(context);
+ }
+ }
+}
diff --git a/Flow.Launcher.Core/Plugin/PluginsLoader.cs b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
index e6018d800..0f2e4f996 100644
--- a/Flow.Launcher.Core/Plugin/PluginsLoader.cs
+++ b/Flow.Launcher.Core/Plugin/PluginsLoader.cs
@@ -19,25 +19,33 @@ namespace Flow.Launcher.Core.Plugin
public static List Plugins(List metadatas, PluginsSettings settings)
{
var dotnetPlugins = DotNetPlugins(metadatas);
-
+
var pythonEnv = new PythonEnvironment(metadatas, settings);
var pythonV2Env = new PythonV2Environment(metadatas, settings);
var tsEnv = new TypeScriptEnvironment(metadatas, settings);
var jsEnv = new JavaScriptEnvironment(metadatas, settings);
+ var tsV2Env = new TypeScriptV2Environment(metadatas, settings);
+ var jsV2Env = new JavaScriptV2Environment(metadatas, settings);
var pythonPlugins = pythonEnv.Setup();
var pythonV2Plugins = pythonV2Env.Setup();
var tsPlugins = tsEnv.Setup();
var jsPlugins = jsEnv.Setup();
-
+ var tsV2Plugins = tsV2Env.Setup();
+ var jsV2Plugins = jsV2Env.Setup();
+
var executablePlugins = ExecutablePlugins(metadatas);
-
+ var executableV2Plugins = ExecutableV2Plugins(metadatas);
+
var plugins = dotnetPlugins
- .Concat(pythonPlugins)
- .Concat(pythonV2Plugins)
- .Concat(tsPlugins)
- .Concat(jsPlugins)
- .Concat(executablePlugins)
- .ToList();
+ .Concat(pythonPlugins)
+ .Concat(pythonV2Plugins)
+ .Concat(tsPlugins)
+ .Concat(jsPlugins)
+ .Concat(tsV2Plugins)
+ .Concat(jsV2Plugins)
+ .Concat(executablePlugins)
+ .Concat(executableV2Plugins)
+ .ToList();
return plugins;
}
@@ -96,7 +104,7 @@ namespace Flow.Launcher.Core.Plugin
return;
}
- plugins.Add(new PluginPair {Plugin = plugin, Metadata = metadata});
+ plugins.Add(new PluginPair { Plugin = plugin, Metadata = metadata });
});
metadata.InitTime += milliseconds;
}
@@ -121,7 +129,7 @@ namespace Flow.Launcher.Core.Plugin
return plugins;
}
- public static IEnumerable ExecutablePlugins(IEnumerable source)
+ public static IEnumerable ExecutablePlugins(IEnumerable source)
{
return source
.Where(o => o.Language.Equals(AllowedLanguage.Executable, StringComparison.OrdinalIgnoreCase))
@@ -130,5 +138,15 @@ namespace Flow.Launcher.Core.Plugin
Plugin = new ExecutablePlugin(metadata.ExecuteFilePath), Metadata = metadata
});
}
+
+ public static IEnumerable ExecutableV2Plugins(IEnumerable source)
+ {
+ return source
+ .Where(o => o.Language.Equals(AllowedLanguage.ExecutableV2, StringComparison.OrdinalIgnoreCase))
+ .Select(metadata => new PluginPair
+ {
+ Plugin = new ExecutablePluginV2(metadata.ExecuteFilePath), Metadata = metadata
+ });
+ }
}
}
diff --git a/Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs b/Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs
index be35d481c..24d06d975 100644
--- a/Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs
@@ -13,7 +13,7 @@ namespace Flow.Launcher.Core.Plugin
{
public override string SupportedLanguage { get; set; }
- protected override IDuplexPipe ClientPipe { get; set; }
+ protected sealed override IDuplexPipe ClientPipe { get; set; }
protected abstract ProcessStartInfo StartInfo { get; set; }
diff --git a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
index 842dc5cad..4a8d8d7de 100644
--- a/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/PythonPluginV2.cs
@@ -19,8 +19,6 @@ namespace Flow.Launcher.Core.Plugin
internal sealed class PythonPluginV2 : ProcessStreamPluginV2
{
public override string SupportedLanguage { get; set; } = AllowedLanguage.Python;
-
- protected override IDuplexPipe ClientPipe { get; set; }
protected override ProcessStartInfo StartInfo { get; set; }
public PythonPluginV2(string filename)
diff --git a/Flow.Launcher.Plugin/AllowedLanguage.cs b/Flow.Launcher.Plugin/AllowedLanguage.cs
index 96f90e093..619a94deb 100644
--- a/Flow.Launcher.Plugin/AllowedLanguage.cs
+++ b/Flow.Launcher.Plugin/AllowedLanguage.cs
@@ -11,7 +11,7 @@ namespace Flow.Launcher.Plugin
/// Python
///
public const string Python = "Python";
-
+
///
/// Python V2
///
@@ -32,16 +32,31 @@ namespace Flow.Launcher.Plugin
///
public const string Executable = "Executable";
+ ///
+ /// Standard .exe
+ ///
+ public const string ExecutableV2 = "Executable_V2";
+
///
/// TypeScript
///
public const string TypeScript = "TypeScript";
+ ///
+ /// TypeScript
+ ///
+ public const string TypeScriptV2 = "TypeScript_V2";
+
///
/// JavaScript
///
public const string JavaScript = "JavaScript";
+ ///
+ /// JavaScript
+ ///
+ public const string JavaScriptV2 = "JavaScript_V2";
+
///
/// Determines if this language is a .NET language
///
@@ -50,7 +65,7 @@ namespace Flow.Launcher.Plugin
public static bool IsDotNet(string language)
{
return language.Equals(CSharp, StringComparison.OrdinalIgnoreCase)
- || language.Equals(FSharp, StringComparison.OrdinalIgnoreCase);
+ || language.Equals(FSharp, StringComparison.OrdinalIgnoreCase);
}
///
@@ -61,11 +76,15 @@ namespace Flow.Launcher.Plugin
public static bool IsAllowed(string language)
{
return IsDotNet(language)
- || language.Equals(Python, StringComparison.OrdinalIgnoreCase)
- || language.Equals(PythonV2, StringComparison.OrdinalIgnoreCase)
- || language.Equals(Executable, StringComparison.OrdinalIgnoreCase)
- || language.Equals(TypeScript, StringComparison.OrdinalIgnoreCase)
- || language.Equals(JavaScript, StringComparison.OrdinalIgnoreCase);
+ || language.Equals(Python, StringComparison.OrdinalIgnoreCase)
+ || language.Equals(PythonV2, StringComparison.OrdinalIgnoreCase)
+ || language.Equals(Executable, StringComparison.OrdinalIgnoreCase)
+ || language.Equals(TypeScript, StringComparison.OrdinalIgnoreCase)
+ || language.Equals(JavaScript, StringComparison.OrdinalIgnoreCase)
+ || language.Equals(ExecutableV2, StringComparison.OrdinalIgnoreCase)
+ || language.Equals(TypeScriptV2, StringComparison.OrdinalIgnoreCase)
+ || language.Equals(JavaScriptV2, StringComparison.OrdinalIgnoreCase);
+ ;
}
}
}
From 06211a181e9e7d2760456c485b1a0c45cde20a11 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Sun, 5 Nov 2023 14:30:12 +0100
Subject: [PATCH 042/177] Add more language support for new shell option
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml | 1 +
21 files changed, 21 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
index 0ccfd8c9a..77fbcf8d4 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
@@ -2,6 +2,7 @@
Replace Win+R
+ Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
index 2c764d845..30d15ec76 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
@@ -2,6 +2,7 @@
Nahradit Win+R
+ Po stisknutí libovolné klávesy zavřít příkazový řádek
Po dokončení příkazu příkazový řádek nezavírejte
Vždy spustit jako správce
Spustit jako jiný uživatel
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
index 0ccfd8c9a..77fbcf8d4 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
@@ -2,6 +2,7 @@
Replace Win+R
+ Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
index 284a2a0e6..122198357 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
@@ -2,6 +2,7 @@
Reemplazar Win+R
+ Cerrar Símbolo del sistema después de pulsar cualquier tecla
No cerrar Símbolo del Sistema tras ejecutar el comando
Siempre ejecutar como administrador
Ejecutar como otro usuario
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
index 8bf1a2c11..ff01f30d6 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
@@ -2,6 +2,7 @@
Reemplazar Win+R
+ Cerrar Símbolo del sistema después de pulsar cualquier tecla
No cerrar el símbolo del sistema después de la ejecución del comando
Ejecutar siempre como administrador
Ejecutar como usuario diferente
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
index d08efb9b8..438f8cc8f 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
@@ -2,6 +2,7 @@
Remplacer Win+R
+ Fermer l'invite de commande après avoir appuyé sur n'importe quelle touche
Ne pas fermer l'invite de commandes après l'exécution de la commande
Toujours exécuter en tant qu'administrateur
Exécuter en tant qu'utilisateur différent
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
index de40b0c47..fa7df2c07 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
@@ -2,6 +2,7 @@
Sostituisci Win+R
+ Chiudere il prompt dei comandi dopo aver premuto qualsiasi tasto
Non chiudere il prompt dei comandi dopo l'esecuzione dei comandi
Esegui sempre come amministratore
Esegui come utente differente
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
index 0ccfd8c9a..77fbcf8d4 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
@@ -2,6 +2,7 @@
Replace Win+R
+ Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
index 014a46dfc..9531fe832 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
@@ -2,6 +2,7 @@
Win+R 단축키 대체
+ 아무 키나 누른 후 명령 프롬프트 닫기
명령 실행 후 명령 프롬프트를 닫지 않음
항상 관리자 권한으로 실행
다른 유저 권한으로 실행
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
index 0ccfd8c9a..77fbcf8d4 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
@@ -2,6 +2,7 @@
Replace Win+R
+ Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
index 0ccfd8c9a..77fbcf8d4 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
@@ -2,6 +2,7 @@
Replace Win+R
+ Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
index c851be93b..d83386d2d 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
@@ -2,6 +2,7 @@
Zastąp Win+R
+ Zamykanie wiersza polecenia po naciśnięciu dowolnego klawisza
Nie zamykaj wiersza poleceń po wykonaniu polecenia
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
index 6a0a3c8fd..ef0223dd9 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
@@ -2,6 +2,7 @@
Substituir Win+R
+ Fechar o Prompt de Comando após pressionar qualquer tecla
Não feche o Prompt de Comando após a execução do comando
Sempre executar como administrador
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
index 33d7f35a6..f91fcd888 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
@@ -2,6 +2,7 @@
Substituir Win+R
+ Fechar linha de comandos depois de pressionar qualquer tecla
Não fechar linha de comandos depois de executar o comando
Executar sempre como administrador
Executar com outro utilizador
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
index 0ccfd8c9a..77fbcf8d4 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
@@ -2,6 +2,7 @@
Replace Win+R
+ Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
index 0b76303df..76221a0ef 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
@@ -2,6 +2,7 @@
Nahradiť Win+R
+ Zatvoriť príkazový riadok po stlačení ľubovoľnej klávesy
Nezatvárať príkazový riadok po dokončení príkazu
Spustiť vždy ako správca
Spustiť ako iný používateľ
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
index 0ccfd8c9a..77fbcf8d4 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
@@ -2,6 +2,7 @@
Replace Win+R
+ Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
index c6433cef1..437e25f18 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
@@ -2,6 +2,7 @@
Win+R kısayolunu kullan
+ Herhangi bir tuşa basıldıktan sonra komut istemini kapat
Çalıştırma sona erdikten sonra komut istemini kapatma
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
index 0ccfd8c9a..77fbcf8d4 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
@@ -2,6 +2,7 @@
Replace Win+R
+ Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
index 916542c3a..07e8142d7 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
@@ -2,6 +2,7 @@
替换 Win+R
+ 按任意键后关闭命令窗口
执行后不关闭命令窗口
始终以管理员身份运行
以其他用户身份运行
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
index 7ddc58918..58e1a11f8 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
@@ -2,6 +2,7 @@
取代 Win+R
+ 按任意鍵後關閉命令提示字元視窗
執行後不關閉命令提示字元視窗
一律以系統管理員身分執行
Run as different user
From 8a9212099f84ce61da1a998c410ac960bac225ae Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 6 Nov 2023 22:29:01 +0000
Subject: [PATCH 043/177] Bump nunit from 3.13.3 to 3.14.0
Bumps [nunit](https://github.com/nunit/nunit) from 3.13.3 to 3.14.0.
- [Release notes](https://github.com/nunit/nunit/releases)
- [Changelog](https://github.com/nunit/nunit/blob/master/CHANGES.md)
- [Commits](https://github.com/nunit/nunit/compare/v3.13.3...v3.14.0)
---
updated-dependencies:
- dependency-name: nunit
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
Flow.Launcher.Test/Flow.Launcher.Test.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Test/Flow.Launcher.Test.csproj b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
index 3cd9e3df7..c662fdeff 100644
--- a/Flow.Launcher.Test/Flow.Launcher.Test.csproj
+++ b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
@@ -49,7 +49,7 @@
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
From 983a4c56871d6b4d0b78563d8816574981abea9a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 7 Nov 2023 21:22:47 +0000
Subject: [PATCH 044/177] Bump FSharp.Core from 7.0.400 to 7.0.401
Bumps [FSharp.Core](https://github.com/dotnet/fsharp) from 7.0.400 to 7.0.401.
- [Release notes](https://github.com/dotnet/fsharp/releases)
- [Changelog](https://github.com/dotnet/fsharp/blob/main/release-notes.md)
- [Commits](https://github.com/dotnet/fsharp/commits)
---
updated-dependencies:
- dependency-name: FSharp.Core
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Flow.Launcher.Core/Flow.Launcher.Core.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
index 42f233dad..312dfdd9e 100644
--- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj
+++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
@@ -54,7 +54,7 @@
-
+
From 72134e8f9a9ae08b1af3935cc6d345d29aa3c445 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Wed, 8 Nov 2023 21:51:48 +0800
Subject: [PATCH 045/177] Tweak notification text
Co-authored-by: Jeremy Wu
---
.../Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
index d08087ac2..1daa73261 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
@@ -33,9 +33,9 @@
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
- Plugin {0} successfully installed. Please manually restart Flow.
- Plugin {0} successfully uninstalled. Please manually restart Flow.
- Plugin {0} successfully updated. Please manually restart Flow.
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
Plugins Manager
From 0870c5a783ce6bb73e696085d2b15a8b425925a7 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Wed, 8 Nov 2023 22:20:19 +0800
Subject: [PATCH 046/177] Revert "Fix wrong doc"
This reverts commit 0c8729f7fb5edfed1dd2641c6d205013b81753e7.
---
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index e6d9126c6..474ad6f0a 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -107,7 +107,7 @@ namespace Flow.Launcher.Plugin
///
/// Message title
/// Message subtitle
- /// Full path to icon
+ /// Message icon path (relative path to your plugin folder)
void ShowMsg(string title, string subTitle = "", string iconPath = "");
///
@@ -115,7 +115,7 @@ namespace Flow.Launcher.Plugin
///
/// Message title
/// Message subtitle
- /// Full path to icon
+ /// Message icon path (relative path to your plugin folder)
/// when true will use main windows as the owner
void ShowMsg(string title, string subTitle, string iconPath, bool useMainWindowAsOwner = true);
From 7436aaa2bb1cc5c1bf72c7051db433ff8d5670db Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Thu, 9 Nov 2023 20:02:20 -0600
Subject: [PATCH 047/177] switch back to jsonmessageformatter
---
Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
index 305ba9b65..60130843e 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
@@ -91,7 +91,7 @@ namespace Flow.Launcher.Core.Plugin
private void SetupJsonRPC()
{
- var formatter = new SystemTextJsonFormatter();
+ var formatter = new JsonMessageFormatter();
var handler = new NewLineDelimitedMessageHandler(ClientPipe,
formatter);
From 08da4e34df6ada1c5559c9f4169ac6271877798b Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 00:06:02 +0800
Subject: [PATCH 048/177] Use toast to improve consistency
---
.../PluginsManager.cs | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 77fa3b981..5d18cf18f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -148,19 +148,19 @@ namespace Flow.Launcher.Plugin.PluginsManager
Install(plugin, filePath);
}
+ catch (HttpRequestException e)
+ {
+ Context.API.ShowMsgError(string.Format(Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"), plugin.Name),
+ Context.API.GetTranslation("plugin_pluginsmanager_download_error"));
+ Log.Exception("PluginsManager", "An error occurred while downloading plugin", e);
+ return;
+ }
catch (Exception e)
{
- // TODO use toast to optimize error prompt
- if (e is HttpRequestException)
- MessageBox.Show(Context.API.GetTranslation("plugin_pluginsmanager_download_error"),
- Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"));
-
Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
plugin.Name));
-
- Log.Exception("PluginsManager", "An error occurred while downloading plugin", e, "InstallOrUpdate");
-
+ Log.Exception("PluginsManager", "An error occurred while downloading plugin", e);
return;
}
From e7ffd573f0b6a9994e0e95d65f107356c7ccfec3 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 00:40:27 +0800
Subject: [PATCH 049/177] Move Install/Uninstall plugin logic to
Core.PluginManager
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 104 ++++++++++++++++++
.../PluginsManager.cs | 103 +++--------------
2 files changed, 120 insertions(+), 87 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index f8c9a3f17..9010f8a6f 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -11,6 +11,9 @@ using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using ISavable = Flow.Launcher.Plugin.ISavable;
+using Flow.Launcher.Plugin.SharedCommands;
+using Mono.Cecil;
+using System.Text.Json;
namespace Flow.Launcher.Core.Plugin
{
@@ -331,5 +334,106 @@ namespace Flow.Launcher.Core.Plugin
RemoveActionKeyword(id, oldActionKeyword);
}
}
+
+ private static string GetContainingFolderPathAfterUnzip(string unzippedParentFolderPath)
+ {
+ var unzippedFolderCount = Directory.GetDirectories(unzippedParentFolderPath).Length;
+ var unzippedFilesCount = Directory.GetFiles(unzippedParentFolderPath).Length;
+
+ // adjust path depending on how the plugin is zipped up
+ // the recommended should be to zip up the folder not the contents
+ if (unzippedFolderCount == 1 && unzippedFilesCount == 0)
+ // folder is zipped up, unzipped plugin directory structure: tempPath/unzippedParentPluginFolder/pluginFolderName/
+ return Directory.GetDirectories(unzippedParentFolderPath)[0];
+
+ if (unzippedFilesCount > 1)
+ // content is zipped up, unzipped plugin directory structure: tempPath/unzippedParentPluginFolder/
+ return unzippedParentFolderPath;
+
+ return string.Empty;
+ }
+
+ private static bool SameOrLesserPluginVersionExists(string metadataPath)
+ {
+ var newMetadata = JsonSerializer.Deserialize(File.ReadAllText(metadataPath));
+ return AllPlugins.Any(x => x.Metadata.ID == newMetadata.ID
+ && newMetadata.Version.CompareTo(x.Metadata.Version) <= 0);
+ }
+
+ public static void Install(UserPlugin plugin, string downloadedFilePath)
+ {
+ var tempFolderPath = Path.Combine(Path.GetTempPath(), "flowlauncher");
+ var tempFolderPluginPath = Path.Combine(tempFolderPath, "plugin");
+
+ if (Directory.Exists(tempFolderPath))
+ Directory.Delete(tempFolderPath, true);
+
+ Directory.CreateDirectory(tempFolderPath);
+
+ var zipFilePath = Path.Combine(tempFolderPath, Path.GetFileName(downloadedFilePath));
+
+ File.Copy(downloadedFilePath, zipFilePath);
+
+ File.Delete(downloadedFilePath);
+
+ System.IO.Compression.ZipFile.ExtractToDirectory(zipFilePath, tempFolderPluginPath);
+
+ var pluginFolderPath = GetContainingFolderPathAfterUnzip(tempFolderPluginPath);
+
+ var metadataJsonFilePath = string.Empty;
+ if (File.Exists(Path.Combine(pluginFolderPath, Constant.PluginMetadataFileName)))
+ metadataJsonFilePath = Path.Combine(pluginFolderPath, Constant.PluginMetadataFileName);
+
+ if (string.IsNullOrEmpty(metadataJsonFilePath) || string.IsNullOrEmpty(pluginFolderPath))
+ {
+ throw new FileNotFoundException($"Unable to find plugin.json from the extracted zip file, or this path {pluginFolderPath} does not exist");
+ }
+
+ if (SameOrLesserPluginVersionExists(metadataJsonFilePath))
+ {
+ throw new InvalidOperationException($"A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin {plugin.Name}");
+ }
+
+ var folderName = string.IsNullOrEmpty(plugin.Version) ? $"{plugin.Name}-{Guid.NewGuid()}" : $"{plugin.Name}-{plugin.Version}";
+
+ var defaultPluginIDs = new List
+ {
+ "0ECADE17459B49F587BF81DC3A125110", // BrowserBookmark
+ "CEA0FDFC6D3B4085823D60DC76F28855", // Calculator
+ "572be03c74c642baae319fc283e561a8", // Explorer
+ "6A122269676E40EB86EB543B945932B9", // PluginIndicator
+ "9f8f9b14-2518-4907-b211-35ab6290dee7", // PluginsManager
+ "b64d0a79-329a-48b0-b53f-d658318a1bf6", // ProcessKiller
+ "791FC278BA414111B8D1886DFE447410", // Program
+ "D409510CD0D2481F853690A07E6DC426", // Shell
+ "CEA08895D2544B019B2E9C5009600DF4", // Sys
+ "0308FD86DE0A4DEE8D62B9B535370992", // URL
+ "565B73353DBF4806919830B9202EE3BF", // WebSearch
+ "5043CETYU6A748679OPA02D27D99677A" // WindowsSettings
+ };
+
+ // Treat default plugin differently, it needs to be removable along with each flow release
+ var installDirectory = !defaultPluginIDs.Any(x => x == plugin.ID)
+ ? DataLocation.PluginsDirectory
+ : Constant.PreinstalledDirectory;
+
+ var newPluginPath = Path.Combine(installDirectory, folderName);
+
+ FilesFolders.CopyAll(pluginFolderPath, newPluginPath);
+
+ Directory.Delete(pluginFolderPath, true);
+ }
+
+ public static void Uninstall(PluginMetadata plugin, bool removeSettings = true)
+ {
+ if (removeSettings)
+ {
+ Settings.Plugins.Remove(plugin.ID);
+ AllPlugins.RemoveAll(p => p.Metadata.ID == plugin.ID);
+ }
+
+ // Marked for deletion. Will be deleted on next start up
+ using var _ = File.CreateText(Path.Combine(plugin.PluginDirectory, "NeedDelete.txt"));
+ }
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 5d18cf18f..20644a2b2 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -10,7 +10,6 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
-using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
@@ -151,19 +150,19 @@ namespace Flow.Launcher.Plugin.PluginsManager
catch (HttpRequestException e)
{
Context.API.ShowMsgError(string.Format(Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"), plugin.Name),
- Context.API.GetTranslation("plugin_pluginsmanager_download_error"));
+ Context.API.GetTranslation("plugin_pluginsmanager_download_error"));
Log.Exception("PluginsManager", "An error occurred while downloading plugin", e);
return;
}
catch (Exception e)
{
Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
- plugin.Name));
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
+ plugin.Name));
Log.Exception("PluginsManager", "An error occurred while downloading plugin", e);
return;
}
-
+
if (Settings.AutoRestartAfterChanging)
{
Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_installing_plugin"),
@@ -411,77 +410,22 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
if (!File.Exists(downloadedFilePath))
return;
-
- var tempFolderPath = Path.Combine(Path.GetTempPath(), "flowlauncher");
- var tempFolderPluginPath = Path.Combine(tempFolderPath, "plugin");
-
- if (Directory.Exists(tempFolderPath))
- Directory.Delete(tempFolderPath, true);
-
- Directory.CreateDirectory(tempFolderPath);
-
- var zipFilePath = Path.Combine(tempFolderPath, Path.GetFileName(downloadedFilePath));
-
- File.Copy(downloadedFilePath, zipFilePath);
-
- File.Delete(downloadedFilePath);
-
- Utilities.UnZip(zipFilePath, tempFolderPluginPath, true);
-
- var pluginFolderPath = Utilities.GetContainingFolderPathAfterUnzip(tempFolderPluginPath);
-
- var metadataJsonFilePath = string.Empty;
- if (File.Exists(Path.Combine(pluginFolderPath, Constant.PluginMetadataFileName)))
- metadataJsonFilePath = Path.Combine(pluginFolderPath, Constant.PluginMetadataFileName);
-
- if (string.IsNullOrEmpty(metadataJsonFilePath) || string.IsNullOrEmpty(pluginFolderPath))
+ try
{
+ PluginManager.Install(plugin, downloadedFilePath);
+ }
+ catch(FileNotFoundException e)
+ {
+ Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
MessageBox.Show(Context.API.GetTranslation("plugin_pluginsmanager_install_errormetadatafile"),
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"));
-
- throw new FileNotFoundException(
- string.Format("Unable to find plugin.json from the extracted zip file, or this path {0} does not exist", pluginFolderPath));
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"));
}
-
- if (SameOrLesserPluginVersionExists(metadataJsonFilePath))
+ catch(InvalidOperationException e)
{
+ Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
MessageBox.Show(string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_duplicate"), plugin.Name),
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"));
-
- throw new InvalidOperationException(
- string.Format("A plugin with the same ID and version already exists, " +
- "or the version is greater than this downloaded plugin {0}",
- plugin.Name));
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"));
}
-
- var folderName = string.IsNullOrEmpty(plugin.Version) ? $"{plugin.Name}-{Guid.NewGuid()}" : $"{plugin.Name}-{plugin.Version}";
-
- var defaultPluginIDs = new List
- {
- "0ECADE17459B49F587BF81DC3A125110", // BrowserBookmark
- "CEA0FDFC6D3B4085823D60DC76F28855", // Calculator
- "572be03c74c642baae319fc283e561a8", // Explorer
- "6A122269676E40EB86EB543B945932B9", // PluginIndicator
- "9f8f9b14-2518-4907-b211-35ab6290dee7", // PluginsManager
- "b64d0a79-329a-48b0-b53f-d658318a1bf6", // ProcessKiller
- "791FC278BA414111B8D1886DFE447410", // Program
- "D409510CD0D2481F853690A07E6DC426", // Shell
- "CEA08895D2544B019B2E9C5009600DF4", // Sys
- "0308FD86DE0A4DEE8D62B9B535370992", // URL
- "565B73353DBF4806919830B9202EE3BF", // WebSearch
- "5043CETYU6A748679OPA02D27D99677A" // WindowsSettings
- };
-
- // Treat default plugin differently, it needs to be removable along with each flow release
- var installDirectory = !defaultPluginIDs.Any(x => x == plugin.ID)
- ? DataLocation.PluginsDirectory
- : Constant.PreinstalledDirectory;
-
- var newPluginPath = Path.Combine(installDirectory, folderName);
-
- FilesFolders.CopyAll(pluginFolderPath, newPluginPath);
-
- Directory.Delete(pluginFolderPath, true);
}
internal List RequestUninstall(string search)
@@ -537,24 +481,9 @@ namespace Flow.Launcher.Plugin.PluginsManager
return Search(results, search);
}
- private void Uninstall(PluginMetadata plugin, bool removedSetting = true)
+ private static void Uninstall(PluginMetadata plugin, bool removeSettings = true)
{
- if (removedSetting)
- {
- PluginManager.Settings.Plugins.Remove(plugin.ID);
- PluginManager.AllPlugins.RemoveAll(p => p.Metadata.ID == plugin.ID);
- }
-
- // Marked for deletion. Will be deleted on next start up
- using var _ = File.CreateText(Path.Combine(plugin.PluginDirectory, "NeedDelete.txt"));
- }
-
- private bool SameOrLesserPluginVersionExists(string metadataPath)
- {
- var newMetadata = JsonSerializer.Deserialize(File.ReadAllText(metadataPath));
- return Context.API.GetAllPlugins()
- .Any(x => x.Metadata.ID == newMetadata.ID
- && newMetadata.Version.CompareTo(x.Metadata.Version) <= 0);
+ PluginManager.Uninstall(plugin, removeSettings);
}
}
}
From 5b2220b9dafda45af72a20ee7a12136b23fd3dee Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 00:47:18 +0800
Subject: [PATCH 050/177] Exclude installed plugins in pm install results
---
Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 20644a2b2..af68cc0a8 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -382,6 +382,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
var results =
PluginsManifest
.UserPlugins
+ .Where(x => !PluginExists(x.ID))
.Select(x =>
new Result
{
From 842451db69bba8b40449773a79a80ddda6418d5d Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 00:48:18 +0800
Subject: [PATCH 051/177] Show plugin icons in pm Install results
---
Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index af68cc0a8..7b5c09fa7 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -388,7 +388,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
Title = $"{x.Name} by {x.Author}",
SubTitle = x.Description,
- IcoPath = icoPath,
+ IcoPath = x.IcoPath,
Action = e =>
{
if (e.SpecialKeyState.CtrlPressed)
From 41721150f91437dc62e9cc4a13bb852f16ebd9e2 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 01:20:32 +0800
Subject: [PATCH 052/177] Add glyphs for pm context menu
---
Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs
index 580954f3c..17e9fe2bc 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/ContextMenu.cs
@@ -13,6 +13,10 @@ namespace Flow.Launcher.Plugin.PluginsManager
Context = context;
}
+ private readonly GlyphInfo sourcecodeGlyph = new("/Resources/#Segoe Fluent Icons","\uE943");
+ private readonly GlyphInfo issueGlyph = new("/Resources/#Segoe Fluent Icons", "\ued15");
+ private readonly GlyphInfo manifestGlyph = new("/Resources/#Segoe Fluent Icons", "\uea37");
+
public List LoadContextMenus(Result selectedResult)
{
if(selectedResult.ContextData is not UserPlugin pluginManifestInfo)
@@ -36,6 +40,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
Title = Context.API.GetTranslation("plugin_pluginsmanager_plugin_contextmenu_gotosourcecode_title"),
SubTitle = Context.API.GetTranslation("plugin_pluginsmanager_plugin_contextmenu_gotosourcecode_subtitle"),
IcoPath = "Images\\sourcecode.png",
+ Glyph = sourcecodeGlyph,
Action = _ =>
{
Context.API.OpenUrl(pluginManifestInfo.UrlSourceCode);
@@ -47,6 +52,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
Title = Context.API.GetTranslation("plugin_pluginsmanager_plugin_contextmenu_newissue_title"),
SubTitle = Context.API.GetTranslation("plugin_pluginsmanager_plugin_contextmenu_newissue_subtitle"),
IcoPath = "Images\\request.png",
+ Glyph = issueGlyph,
Action = _ =>
{
// standard UrlSourceCode format in PluginsManifest's plugins.json file: https://github.com/jjw24/Flow.Launcher.Plugin.Putty/tree/master
@@ -63,6 +69,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
Title = Context.API.GetTranslation("plugin_pluginsmanager_plugin_contextmenu_pluginsmanifest_title"),
SubTitle = Context.API.GetTranslation("plugin_pluginsmanager_plugin_contextmenu_pluginsmanifest_subtitle"),
IcoPath = "Images\\manifestsite.png",
+ Glyph = manifestGlyph,
Action = _ =>
{
Context.API.OpenUrl("https://github.com/Flow-Launcher/Flow.Launcher.PluginsManifest");
From 54e255c504ce62c058e9baa255e95d6b73d64599 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 01:28:34 +0800
Subject: [PATCH 053/177] Fix typo
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index 9010f8a6f..6720ee61a 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -12,7 +12,6 @@ using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using ISavable = Flow.Launcher.Plugin.ISavable;
using Flow.Launcher.Plugin.SharedCommands;
-using Mono.Cecil;
using System.Text.Json;
namespace Flow.Launcher.Core.Plugin
From bf598887dd942e2e684e2ff3144b9fc9e944d261 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 01:34:01 +0800
Subject: [PATCH 054/177] Make settings field private
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index 6720ee61a..ea8b79aa4 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -29,8 +29,7 @@ namespace Flow.Launcher.Core.Plugin
public static IPublicAPI API { private set; get; }
- // todo happlebao, this should not be public, the indicator function should be embeded
- public static PluginsSettings Settings;
+ private static PluginsSettings Settings;
private static List _metadatas;
///
From 9f39dfceee916cbb83e9c88675f083af3abc7406 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Wed, 8 Nov 2023 22:12:01 +0800
Subject: [PATCH 055/177] Use FuzzySearch to search access links
---
.../Search/QuickAccessLinks/QuickAccess.cs | 23 ++++++++-----------
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
index cdd2c93e6..85b595390 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs
@@ -13,20 +13,17 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks
if (string.IsNullOrEmpty(query.Search))
return new List();
- string search = query.Search.ToLower();
-
- var queriedAccessLinks =
- accessLinks
- .Where(x => x.Name.Contains(search, StringComparison.OrdinalIgnoreCase) || x.Path.Contains(search, StringComparison.OrdinalIgnoreCase))
+ return accessLinks
+ .Where(x => Main.Context.API.FuzzySearch(query.Search, x.Name).IsSearchPrecisionScoreMet() || Main.Context.API.FuzzySearch(query.Search, x.Path).IsSearchPrecisionScoreMet())
.OrderBy(x => x.Type)
- .ThenBy(x => x.Name);
-
- return queriedAccessLinks.Select(l => l.Type switch
- {
- ResultType.Folder => ResultManager.CreateFolderResult(l.Name, l.Path, l.Path, query, quickAccessResultScore),
- ResultType.File => ResultManager.CreateFileResult(l.Path, query, quickAccessResultScore),
- _ => throw new ArgumentOutOfRangeException()
- }).ToList();
+ .ThenBy(x => x.Name)
+ .Select(l => l.Type switch
+ {
+ ResultType.Folder => ResultManager.CreateFolderResult(l.Name, l.Path, l.Path, query, quickAccessResultScore),
+ ResultType.File => ResultManager.CreateFileResult(l.Path, query, quickAccessResultScore),
+ _ => throw new ArgumentOutOfRangeException()
+ })
+ .ToList();
}
internal static List AccessLinkListAll(Query query, IEnumerable accessLinks)
From b7a78362bf38124ccbc72ec0419f611e5c97b530 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 10:25:45 +0800
Subject: [PATCH 056/177] Throw exception when zip not found
---
Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 7b5c09fa7..97cfb67d1 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -267,7 +267,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
}).ContinueWith(t =>
{
Log.Exception("PluginsManager", $"Update failed for {x.Name}",
- t.Exception.InnerException, "RequestUpdate");
+ t.Exception.InnerException);
Context.API.ShowMsg(
Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
string.Format(
@@ -410,7 +410,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
private void Install(UserPlugin plugin, string downloadedFilePath)
{
if (!File.Exists(downloadedFilePath))
- return;
+ throw new FileNotFoundException($"Plugin {plugin.ID} zip file not found at {downloadedFilePath}", downloadedFilePath);
try
{
PluginManager.Install(plugin, downloadedFilePath);
From 69dad1be6c2bca648b54089f62047e78ecadc5e9 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 15:05:24 +0800
Subject: [PATCH 057/177] Check if plugin has been modified when
installing/updating/uninstalling
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 56 ++++++++++++++++++-
.../Languages/en.xaml | 4 +-
.../PluginsManager.cs | 36 ++++++++----
3 files changed, 81 insertions(+), 15 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index ea8b79aa4..64e097379 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -31,6 +31,7 @@ namespace Flow.Launcher.Core.Plugin
private static PluginsSettings Settings;
private static List _metadatas;
+ private static List _modifiedPlugins = new List();
///
/// Directories that will hold Flow Launcher plugin directory
@@ -358,8 +359,42 @@ namespace Flow.Launcher.Core.Plugin
&& newMetadata.Version.CompareTo(x.Metadata.Version) <= 0);
}
- public static void Install(UserPlugin plugin, string downloadedFilePath)
+ #region Public functions
+
+ public static bool PluginModified(string uuid)
{
+ return _modifiedPlugins.Contains(uuid);
+ }
+
+ public static void UpdatePlugin(PluginMetadata existingVersion, UserPlugin newVersion, string downloadedFilePath)
+ {
+ InstallPlugin(newVersion, downloadedFilePath, checkModified:false);
+ UninstallPlugin(existingVersion, removeSettings:false, checkModified:false);
+ _modifiedPlugins.Add(existingVersion.ID);
+ }
+
+ public static void InstallPlugin(UserPlugin plugin, string downloadedFilePath)
+ {
+ InstallPlugin(plugin, downloadedFilePath, true);
+ }
+
+ public static void UninstallPlugin(PluginMetadata plugin, bool removeSettings = true)
+ {
+ UninstallPlugin(plugin, removeSettings, true);
+ }
+
+ #endregion
+
+ #region Internal functions
+
+ internal static void InstallPlugin(UserPlugin plugin, string downloadedFilePath, bool checkModified)
+ {
+ if (checkModified && PluginModified(plugin.ID))
+ {
+ // Distinguish exception from installing same or less version
+ throw new ArgumentException($"Plugin {plugin.Name} {plugin.ID} has been modified.", nameof(plugin));
+ }
+
var tempFolderPath = Path.Combine(Path.GetTempPath(), "flowlauncher");
var tempFolderPluginPath = Path.Combine(tempFolderPath, "plugin");
@@ -420,10 +455,20 @@ namespace Flow.Launcher.Core.Plugin
FilesFolders.CopyAll(pluginFolderPath, newPluginPath);
Directory.Delete(pluginFolderPath, true);
+
+ if (checkModified)
+ {
+ _modifiedPlugins.Add(plugin.ID);
+ }
}
- public static void Uninstall(PluginMetadata plugin, bool removeSettings = true)
+ internal static void UninstallPlugin(PluginMetadata plugin, bool removeSettings, bool checkModified)
{
+ if (checkModified && PluginModified(plugin.ID))
+ {
+ throw new ArgumentException($"Plugin {plugin.Name} has been modified");
+ }
+
if (removeSettings)
{
Settings.Plugins.Remove(plugin.ID);
@@ -432,6 +477,13 @@ namespace Flow.Launcher.Core.Plugin
// Marked for deletion. Will be deleted on next start up
using var _ = File.CreateText(Path.Combine(plugin.PluginDirectory, "NeedDelete.txt"));
+
+ if (checkModified)
+ {
+ _modifiedPlugins.Add(plugin.ID);
+ }
}
+
+ #endregion
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
index 1daa73261..42a1ac9b8 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
@@ -20,6 +20,7 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
@@ -36,7 +37,8 @@
Plugin {0} successfully installed. Please restart Flow.
Plugin {0} successfully uninstalled. Please restart Flow.
Plugin {0} successfully updated. Please restart Flow.
-
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 97cfb67d1..6667c3d4d 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -239,8 +239,6 @@ namespace Flow.Launcher.Plugin.PluginsManager
Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
- Uninstall(x.PluginExistingMetadata, false);
-
var downloadToFilePath = Path.Combine(DataLocation.PluginsDirectory,
$"{x.Name}-{x.NewVersion}.zip");
@@ -249,7 +247,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
await Http.DownloadAsync(x.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
.ConfigureAwait(false);
- Install(x.PluginNewUserPlugin, downloadToFilePath);
+ PluginManager.UpdatePlugin(x.PluginExistingMetadata, x.PluginNewUserPlugin, downloadToFilePath);
if (Settings.AutoRestartAfterChanging)
{
@@ -413,19 +411,24 @@ namespace Flow.Launcher.Plugin.PluginsManager
throw new FileNotFoundException($"Plugin {plugin.ID} zip file not found at {downloadedFilePath}", downloadedFilePath);
try
{
- PluginManager.Install(plugin, downloadedFilePath);
+ PluginManager.InstallPlugin(plugin, downloadedFilePath);
}
- catch(FileNotFoundException e)
+ catch (FileNotFoundException e)
{
+ Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
+ Context.API.GetTranslation("plugin_pluginsmanager_install_errormetadatafile"));
Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
- MessageBox.Show(Context.API.GetTranslation("plugin_pluginsmanager_install_errormetadatafile"),
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"));
}
- catch(InvalidOperationException e)
+ catch (InvalidOperationException e)
{
+ Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_duplicate"), plugin.Name));
+ Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
+ }
+ catch (ArgumentException e) {
+ Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"), plugin.Name));
Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
- MessageBox.Show(string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_duplicate"), plugin.Name),
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"));
}
}
@@ -482,9 +485,18 @@ namespace Flow.Launcher.Plugin.PluginsManager
return Search(results, search);
}
- private static void Uninstall(PluginMetadata plugin, bool removeSettings = true)
+ private void Uninstall(PluginMetadata plugin)
{
- PluginManager.Uninstall(plugin, removeSettings);
+ try
+ {
+ PluginManager.UninstallPlugin(plugin, removeSettings:true);
+ }
+ catch (ArgumentException e)
+ {
+ Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
+ Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_error_title"),
+ Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"));
+ }
}
}
}
From 53eec760693b78b9d8954791fabc0a4d545c3579 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 15:17:24 +0800
Subject: [PATCH 058/177] Remove unused import
---
.../Flow.Launcher.Plugin.PluginsManager.csproj | 4 ----
1 file changed, 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj b/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj
index 51882a20e..92500ae6a 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj
@@ -36,8 +36,4 @@
PreserveNewest
-
-
-
-
\ No newline at end of file
From 50449de653d1fd5bec713eb3544b7a13823d73fc Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 15:29:55 +0800
Subject: [PATCH 059/177] Hide modified plugins in query results
---
Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 6667c3d4d..b04026804 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -188,6 +188,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
on existingPlugin.Metadata.ID equals pluginFromManifest.ID
where existingPlugin.Metadata.Version.CompareTo(pluginFromManifest.Version) <
0 // if current version precedes manifest version
+ && !PluginManager.PluginModified(existingPlugin.Metadata.ID)
select
new
{
@@ -317,6 +318,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
var plugin = new UserPlugin
{
+ // FIXME installing in store then install web ver
ID = "",
Name = name,
Version = string.Empty,
@@ -380,7 +382,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
var results =
PluginsManifest
.UserPlugins
- .Where(x => !PluginExists(x.ID))
+ .Where(x => !PluginExists(x.ID) && !PluginManager.PluginModified(x.ID))
.Select(x =>
new Result
{
From f6a4942a484704a74a5336036f25efe65f53feed Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 16:11:21 +0800
Subject: [PATCH 060/177] Refactor plugin zip logic
- Download zip to temp folder
- Unzip to unique folder
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 39 +++++++++----------
.../PluginsManager.cs | 5 ++-
2 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index 64e097379..47edc21c2 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -366,18 +366,28 @@ namespace Flow.Launcher.Core.Plugin
return _modifiedPlugins.Contains(uuid);
}
- public static void UpdatePlugin(PluginMetadata existingVersion, UserPlugin newVersion, string downloadedFilePath)
+
+ ///
+ /// Update a plugin to new version, from a zip file. Will Delete zip after updating.
+ ///
+ public static void UpdatePlugin(PluginMetadata existingVersion, UserPlugin newVersion, string zipFilePath)
{
- InstallPlugin(newVersion, downloadedFilePath, checkModified:false);
+ InstallPlugin(newVersion, zipFilePath, checkModified:false);
UninstallPlugin(existingVersion, removeSettings:false, checkModified:false);
_modifiedPlugins.Add(existingVersion.ID);
}
- public static void InstallPlugin(UserPlugin plugin, string downloadedFilePath)
+ ///
+ /// Install a plugin. Will Delete zip after updating.
+ ///
+ public static void InstallPlugin(UserPlugin plugin, string zipFilePath)
{
- InstallPlugin(plugin, downloadedFilePath, true);
+ InstallPlugin(plugin, zipFilePath, true);
}
+ ///
+ /// Uninstall a plugin.
+ ///
public static void UninstallPlugin(PluginMetadata plugin, bool removeSettings = true)
{
UninstallPlugin(plugin, removeSettings, true);
@@ -387,7 +397,7 @@ namespace Flow.Launcher.Core.Plugin
#region Internal functions
- internal static void InstallPlugin(UserPlugin plugin, string downloadedFilePath, bool checkModified)
+ internal static void InstallPlugin(UserPlugin plugin, string zipFilePath, bool checkModified)
{
if (checkModified && PluginModified(plugin.ID))
{
@@ -395,21 +405,10 @@ namespace Flow.Launcher.Core.Plugin
throw new ArgumentException($"Plugin {plugin.Name} {plugin.ID} has been modified.", nameof(plugin));
}
- var tempFolderPath = Path.Combine(Path.GetTempPath(), "flowlauncher");
- var tempFolderPluginPath = Path.Combine(tempFolderPath, "plugin");
-
- if (Directory.Exists(tempFolderPath))
- Directory.Delete(tempFolderPath, true);
-
- Directory.CreateDirectory(tempFolderPath);
-
- var zipFilePath = Path.Combine(tempFolderPath, Path.GetFileName(downloadedFilePath));
-
- File.Copy(downloadedFilePath, zipFilePath);
-
- File.Delete(downloadedFilePath);
-
+ // Unzip plugin files to temp folder
+ var tempFolderPluginPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
System.IO.Compression.ZipFile.ExtractToDirectory(zipFilePath, tempFolderPluginPath);
+ File.Delete(zipFilePath);
var pluginFolderPath = GetContainingFolderPathAfterUnzip(tempFolderPluginPath);
@@ -454,7 +453,7 @@ namespace Flow.Launcher.Core.Plugin
FilesFolders.CopyAll(pluginFolderPath, newPluginPath);
- Directory.Delete(pluginFolderPath, true);
+ Directory.Delete(tempFolderPluginPath, true);
if (checkModified)
{
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index b04026804..1206a4cf9 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -139,7 +139,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
? $"{plugin.Name}-{Guid.NewGuid()}.zip"
: $"{plugin.Name}-{plugin.Version}.zip";
- var filePath = Path.Combine(DataLocation.PluginsDirectory, downloadFilename);
+ var filePath = Path.Combine(Path.GetTempPath(), downloadFilename);
try
{
@@ -240,7 +240,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
- var downloadToFilePath = Path.Combine(DataLocation.PluginsDirectory,
+ var downloadToFilePath = Path.Combine(Path.GetTempPath(),
$"{x.Name}-{x.NewVersion}.zip");
_ = Task.Run(async delegate
@@ -414,6 +414,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
try
{
PluginManager.InstallPlugin(plugin, downloadedFilePath);
+ File.Delete(downloadedFilePath);
}
catch (FileNotFoundException e)
{
From af9c662892621b3be10d3be76fb1067a20cfd2e1 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 11 Nov 2023 16:21:36 +0800
Subject: [PATCH 061/177] Remove comment
---
Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs | 1 -
1 file changed, 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 1206a4cf9..3cfae97d5 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -318,7 +318,6 @@ namespace Flow.Launcher.Plugin.PluginsManager
var plugin = new UserPlugin
{
- // FIXME installing in store then install web ver
ID = "",
Name = name,
Version = string.Empty,
From 276c6eda6b0e1cd648278eeebcf53ac22540b9d5 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Sat, 11 Nov 2023 12:36:09 +0100
Subject: [PATCH 062/177] Fix overlapping layout
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml b/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml
index 960272f0f..2f02ef723 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml
@@ -15,6 +15,7 @@
+
CMD
@@ -50,7 +51,7 @@
Pwsh
RunCommand
-
+
Date: Sat, 11 Nov 2023 13:47:22 +0100
Subject: [PATCH 063/177] Disable conflicting options
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml.cs | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml.cs
index c89e481d7..24365f2aa 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/ShellSetting.xaml.cs
@@ -43,21 +43,27 @@ namespace Flow.Launcher.Plugin.Shell
CloseShellAfterPress.Checked += (o, e) =>
{
_settings.CloseShellAfterPress = true;
+ LeaveShellOpen.IsChecked = false;
+ LeaveShellOpen.IsEnabled = false;
};
CloseShellAfterPress.Unchecked += (o, e) =>
{
_settings.CloseShellAfterPress = false;
+ LeaveShellOpen.IsEnabled = true;
};
LeaveShellOpen.Checked += (o, e) =>
{
_settings.LeaveShellOpen = true;
+ CloseShellAfterPress.IsChecked = false;
+ CloseShellAfterPress.IsEnabled = false;
};
LeaveShellOpen.Unchecked += (o, e) =>
{
_settings.LeaveShellOpen = false;
+ CloseShellAfterPress.IsEnabled = true;
};
AlwaysRunAsAdministrator.Checked += (o, e) =>
From 83553244d73024b51b7a5bdc6aee40a0ca369ded Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sat, 11 Nov 2023 18:00:03 -0600
Subject: [PATCH 064/177] use memorypack instead of binaryformatter
---
.../Flow.Launcher.Infrastructure.csproj | 1 +
.../Image/ImageLoader.cs | 70 +-
.../Storage/BinaryStorage.cs | 83 +-
Flow.Launcher/App.xaml.cs | 13 +-
Plugins/Flow.Launcher.Plugin.Program/Main.cs | 35 +-
.../Programs/UWP.cs | 737 -----------------
.../Programs/UWPPackage.cs | 752 ++++++++++++++++++
.../Programs/Win32.cs | 46 +-
.../Views/ProgramSetting.xaml.cs | 35 +-
9 files changed, 899 insertions(+), 873 deletions(-)
delete mode 100644 Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs
create mode 100644 Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 2f5259039..b24f069c1 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -53,6 +53,7 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
+
diff --git a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
index 203c5646a..add6d4e92 100644
--- a/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
+++ b/Flow.Launcher.Infrastructure/Image/ImageLoader.cs
@@ -3,6 +3,7 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using System.Threading;
using System.Threading.Tasks;
using System.Windows.Media;
using System.Windows.Media.Imaging;
@@ -15,6 +16,7 @@ namespace Flow.Launcher.Infrastructure.Image
public static class ImageLoader
{
private static readonly ImageCache ImageCache = new();
+ private static SemaphoreSlim storageLock { get; } = new SemaphoreSlim(1, 1);
private static BinaryStorage> _storage;
private static readonly ConcurrentDictionary GuidToKey = new();
private static IImageHashGenerator _hashGenerator;
@@ -25,24 +27,18 @@ namespace Flow.Launcher.Infrastructure.Image
public const int FullIconSize = 256;
- private static readonly string[] ImageExtensions =
- {
- ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".ico"
- };
+ private static readonly string[] ImageExtensions = { ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".ico" };
- public static void Initialize()
+ public static async Task InitializeAsync()
{
_storage = new BinaryStorage>("Image");
_hashGenerator = new ImageHashGenerator();
- var usage = LoadStorageToConcurrentDictionary();
+ var usage = await LoadStorageToConcurrentDictionaryAsync();
ImageCache.Initialize(usage.ToDictionary(x => x.Key, x => x.Value));
- foreach (var icon in new[]
- {
- Constant.DefaultIcon, Constant.MissingImgIcon
- })
+ foreach (var icon in new[] { Constant.DefaultIcon, Constant.MissingImgIcon })
{
ImageSource img = new BitmapImage(new Uri(icon));
img.Freeze();
@@ -58,29 +54,41 @@ namespace Flow.Launcher.Infrastructure.Image
await LoadAsync(path, isFullImage);
}
});
- Log.Info($"|ImageLoader.Initialize|Number of preload images is <{ImageCache.CacheSize()}>, Images Number: {ImageCache.CacheSize()}, Unique Items {ImageCache.UniqueImagesInCache()}");
+ Log.Info(
+ $"|ImageLoader.Initialize|Number of preload images is <{ImageCache.CacheSize()}>, Images Number: {ImageCache.CacheSize()}, Unique Items {ImageCache.UniqueImagesInCache()}");
});
}
- public static void Save()
+ public static async Task Save()
{
- lock (_storage)
+ await storageLock.WaitAsync();
+
+ try
{
- _storage.Save(ImageCache.Data
+ _storage.SaveAsync(ImageCache.Data
.ToDictionary(
x => x.Key,
x => x.Value.usage));
}
+ finally
+ {
+ storageLock.Release();
+ }
}
- private static ConcurrentDictionary<(string, bool), int> LoadStorageToConcurrentDictionary()
+ private static async Task> LoadStorageToConcurrentDictionaryAsync()
{
- lock (_storage)
+ await storageLock.WaitAsync();
+ try
{
- var loaded = _storage.TryLoad(new Dictionary<(string, bool), int>());
+ var loaded = await _storage.TryLoadAsync(new Dictionary<(string, bool), int>());
return new ConcurrentDictionary<(string, bool), int>(loaded);
}
+ finally
+ {
+ storageLock.Release();
+ }
}
private class ImageResult
@@ -129,6 +137,7 @@ namespace Flow.Launcher.Infrastructure.Image
ImageCache[path, loadFullImage] = image;
return new ImageResult(image, ImageType.ImageFile);
}
+
if (path.StartsWith("data:", StringComparison.OrdinalIgnoreCase))
{
var imageSource = new BitmapImage(new Uri(path));
@@ -158,6 +167,7 @@ namespace Flow.Launcher.Infrastructure.Image
return imageResult;
}
+
private static async Task LoadRemoteImageAsync(bool loadFullImage, Uri uriResult)
{
// Download image from url
@@ -173,6 +183,7 @@ namespace Flow.Launcher.Infrastructure.Image
image.DecodePixelHeight = SmallIconSize;
image.DecodePixelWidth = SmallIconSize;
}
+
image.StreamSource = buffer;
image.EndInit();
image.StreamSource = null;
@@ -188,8 +199,8 @@ namespace Flow.Launcher.Infrastructure.Image
if (Directory.Exists(path))
{
/* Directories can also have thumbnails instead of shell icons.
- * Generating thumbnails for a bunch of folder results while scrolling
- * could have a big impact on performance and Flow.Launcher responsibility.
+ * Generating thumbnails for a bunch of folder results while scrolling
+ * could have a big impact on performance and Flow.Launcher responsibility.
* - Solution: just load the icon
*/
type = ImageType.Folder;
@@ -208,9 +219,9 @@ namespace Flow.Launcher.Infrastructure.Image
}
else
{
- /* Although the documentation for GetImage on MSDN indicates that
+ /* Although the documentation for GetImage on MSDN indicates that
* if a thumbnail is available it will return one, this has proved to not
- * be the case in many situations while testing.
+ * be the case in many situations while testing.
* - Solution: explicitly pass the ThumbnailOnly flag
*/
image = GetThumbnail(path, ThumbnailOptions.ThumbnailOnly);
@@ -236,7 +247,8 @@ namespace Flow.Launcher.Infrastructure.Image
return new ImageResult(image, type);
}
- private static BitmapSource GetThumbnail(string path, ThumbnailOptions option = ThumbnailOptions.ThumbnailOnly, int size = SmallIconSize)
+ private static BitmapSource GetThumbnail(string path, ThumbnailOptions option = ThumbnailOptions.ThumbnailOnly,
+ int size = SmallIconSize)
{
return WindowsThumbnailProvider.GetThumbnail(
path,
@@ -261,17 +273,19 @@ namespace Flow.Launcher.Infrastructure.Image
var img = imageResult.ImageSource;
if (imageResult.ImageType != ImageType.Error && imageResult.ImageType != ImageType.Cache)
- { // we need to get image hash
+ {
+ // we need to get image hash
string hash = EnableImageHash ? _hashGenerator.GetHashFromImage(img) : null;
if (hash != null)
{
-
if (GuidToKey.TryGetValue(hash, out string key))
- { // image already exists
+ {
+ // image already exists
img = ImageCache[key, loadFullImage] ?? img;
}
else
- { // new guid
+ {
+ // new guid
GuidToKey[hash] = path;
}
@@ -289,7 +303,7 @@ namespace Flow.Launcher.Infrastructure.Image
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
- image.UriSource = new Uri(path);
+ image.UriSource = new Uri(path);
image.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
image.EndInit();
@@ -314,8 +328,10 @@ namespace Flow.Launcher.Infrastructure.Image
resizedHeight.EndInit();
return resizedHeight;
}
+
return resizedWidth;
}
+
return image;
}
}
diff --git a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
index ea2d42773..a679643fd 100644
--- a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
+++ b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs
@@ -4,67 +4,65 @@ using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
+using System.Threading.Tasks;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
+using MemoryPack;
namespace Flow.Launcher.Infrastructure.Storage
{
-#pragma warning disable SYSLIB0011 // BinaryFormatter is obsolete.
///
/// Stroage object using binary data
/// Normally, it has better performance, but not readable
///
+ ///
+ /// It utilize MemoryPack, which means the object must be MemoryPackSerializable
+ /// https://github.com/Cysharp/MemoryPack
+ ///
public class BinaryStorage
{
+ const string DirectoryName = "Cache";
+
+ const string FileSuffix = ".cache";
+
public BinaryStorage(string filename)
{
- const string directoryName = "Cache";
- var directoryPath = Path.Combine(DataLocation.DataDirectory(), directoryName);
+ var directoryPath = Path.Combine(DataLocation.DataDirectory(), DirectoryName);
Helper.ValidateDirectory(directoryPath);
- const string fileSuffix = ".cache";
- FilePath = Path.Combine(directoryPath, $"{filename}{fileSuffix}");
+ FilePath = Path.Combine(directoryPath, $"{filename}{FileSuffix}");
}
public string FilePath { get; }
- public T TryLoad(T defaultData)
+ public async ValueTask TryLoadAsync(T defaultData)
{
if (File.Exists(FilePath))
{
if (new FileInfo(FilePath).Length == 0)
{
Log.Error($"|BinaryStorage.TryLoad|Zero length cache file <{FilePath}>");
- Save(defaultData);
+ await SaveAsync(defaultData);
return defaultData;
}
- using (var stream = new FileStream(FilePath, FileMode.Open))
- {
- var d = Deserialize(stream, defaultData);
- return d;
- }
+ await using var stream = new FileStream(FilePath, FileMode.Open);
+ var d = await DeserializeAsync(stream, defaultData);
+ return d;
}
else
{
Log.Info("|BinaryStorage.TryLoad|Cache file not exist, load default data");
- Save(defaultData);
+ await SaveAsync(defaultData);
return defaultData;
}
}
- private T Deserialize(FileStream stream, T defaultData)
+ private async ValueTask DeserializeAsync(Stream stream, T defaultData)
{
- //http://stackoverflow.com/questions/2120055/binaryformatter-deserialize-gives-serializationexception
- AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
- BinaryFormatter binaryFormatter = new BinaryFormatter
- {
- AssemblyFormat = FormatterAssemblyStyle.Simple
- };
-
try
{
- var t = ((T)binaryFormatter.Deserialize(stream)).NonNull();
+ var t = await MemoryPackSerializer.DeserializeAsync(stream);
return t;
}
catch (System.Exception e)
@@ -72,47 +70,12 @@ namespace Flow.Launcher.Infrastructure.Storage
Log.Exception($"|BinaryStorage.Deserialize|Deserialize error for file <{FilePath}>", e);
return defaultData;
}
- finally
- {
- AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve;
- }
}
- private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
+ public async ValueTask SaveAsync(T data)
{
- Assembly ayResult = null;
- string sShortAssemblyName = args.Name.Split(',')[0];
- Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
- foreach (Assembly ayAssembly in ayAssemblies)
- {
- if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0])
- {
- ayResult = ayAssembly;
- break;
- }
- }
- return ayResult;
- }
-
- public void Save(T data)
- {
- using (var stream = new FileStream(FilePath, FileMode.Create))
- {
- BinaryFormatter binaryFormatter = new BinaryFormatter
- {
- AssemblyFormat = FormatterAssemblyStyle.Simple
- };
-
- try
- {
- binaryFormatter.Serialize(stream, data);
- }
- catch (SerializationException e)
- {
- Log.Exception($"|BinaryStorage.Save|serialize error for file <{FilePath}>", e);
- }
- }
+ await using var stream = new FileStream(FilePath, FileMode.Create);
+ await MemoryPackSerializer.SerializeAsync(stream, data);
}
}
-#pragma warning restore SYSLIB0011
}
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 295dd3e7a..f4a17761f 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -52,12 +52,13 @@ namespace Flow.Launcher
{
_portable.PreStartCleanUpAfterPortabilityUpdate();
- Log.Info("|App.OnStartup|Begin Flow Launcher startup ----------------------------------------------------");
+ Log.Info(
+ "|App.OnStartup|Begin Flow Launcher startup ----------------------------------------------------");
Log.Info($"|App.OnStartup|Runtime info:{ErrorReporting.RuntimeInfo()}");
RegisterAppDomainExceptions();
RegisterDispatcherUnhandledException();
- ImageLoader.Initialize();
+ var imageLoadertask = ImageLoader.InitializeAsync();
_settingsVM = new SettingWindowViewModel(_updater, _portable);
_settings = _settingsVM.Settings;
@@ -78,6 +79,8 @@ namespace Flow.Launcher
Http.Proxy = _settings.Proxy;
await PluginManager.InitializePluginsAsync(API);
+ await imageLoadertask;
+
var window = new MainWindow(_settings, _mainVM);
Log.Info($"|App.OnStartup|Dependencies Info:{ErrorReporting.DependenciesInfo()}");
@@ -103,7 +106,8 @@ namespace Flow.Launcher
AutoUpdates();
API.SaveAppAllSettings();
- Log.Info("|App.OnStartup|End Flow Launcher startup ---------------------------------------------------- ");
+ Log.Info(
+ "|App.OnStartup|End Flow Launcher startup ---------------------------------------------------- ");
});
}
@@ -122,7 +126,8 @@ namespace Flow.Launcher
// but if it fails (permissions, etc) then don't keep retrying
// this also gives the user a visual indication in the Settings widget
_settings.StartFlowLauncherOnSystemStartup = false;
- Notification.Show(InternationalizationManager.Instance.GetTranslation("setAutoStartFailed"), e.Message);
+ Notification.Show(InternationalizationManager.Instance.GetTranslation("setAutoStartFailed"),
+ e.Message);
}
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Main.cs b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
index ac23534b1..c02573ed8 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Main.cs
@@ -15,24 +15,22 @@ using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch;
namespace Flow.Launcher.Plugin.Program
{
- public class Main : ISettingProvider, IAsyncPlugin, IPluginI18n, IContextMenu, ISavable, IAsyncReloadable, IDisposable
+ public class Main : ISettingProvider, IAsyncPlugin, IPluginI18n, IContextMenu, ISavable, IAsyncReloadable,
+ IDisposable
{
internal static Win32[] _win32s { get; set; }
- internal static UWP.Application[] _uwps { get; set; }
+ internal static UWPApp[] _uwps { get; set; }
internal static Settings _settings { get; set; }
internal static PluginInitContext Context { get; private set; }
private static BinaryStorage _win32Storage;
- private static BinaryStorage _uwpStorage;
+ private static BinaryStorage _uwpStorage;
private static readonly List emptyResults = new();
- private static readonly MemoryCacheOptions cacheOptions = new()
- {
- SizeLimit = 1560
- };
+ private static readonly MemoryCacheOptions cacheOptions = new() { SizeLimit = 1560 };
private static MemoryCache cache = new(cacheOptions);
static Main()
@@ -41,8 +39,8 @@ namespace Flow.Launcher.Plugin.Program
public void Save()
{
- _win32Storage.Save(_win32s);
- _uwpStorage.Save(_uwps);
+ _win32Storage.SaveAsync(_win32s);
+ _uwpStorage.SaveAsync(_uwps);
}
public async Task> QueryAsync(Query query, CancellationToken token)
@@ -76,12 +74,12 @@ namespace Flow.Launcher.Plugin.Program
_settings = context.API.LoadSettingJsonStorage();
- Stopwatch.Normal("|Flow.Launcher.Plugin.Program.Main|Preload programs cost", () =>
+ await Stopwatch.NormalAsync("|Flow.Launcher.Plugin.Program.Main|Preload programs cost", async () =>
{
_win32Storage = new BinaryStorage("Win32");
- _win32s = _win32Storage.TryLoad(Array.Empty());
- _uwpStorage = new BinaryStorage("UWP");
- _uwps = _uwpStorage.TryLoad(Array.Empty());
+ _win32s = await _win32Storage.TryLoadAsync(Array.Empty());
+ _uwpStorage = new BinaryStorage("UWP");
+ _uwps = await _uwpStorage.TryLoadAsync(Array.Empty());
});
Log.Info($"|Flow.Launcher.Plugin.Program.Main|Number of preload win32 programs <{_win32s.Length}>");
Log.Info($"|Flow.Launcher.Plugin.Program.Main|Number of preload uwps <{_uwps.Length}>");
@@ -104,7 +102,7 @@ namespace Flow.Launcher.Plugin.Program
static void WatchProgramUpdate()
{
Win32.WatchProgramUpdate(_settings);
- _ = UWP.WatchPackageChange();
+ _ = UWPPackage.WatchPackageChange();
}
}
@@ -113,16 +111,16 @@ namespace Flow.Launcher.Plugin.Program
var win32S = Win32.All(_settings);
_win32s = win32S;
ResetCache();
- _win32Storage.Save(_win32s);
+ _win32Storage.SaveAsync(_win32s);
_settings.LastIndexTime = DateTime.Now;
}
public static void IndexUwpPrograms()
{
- var applications = UWP.All(_settings);
+ var applications = UWPPackage.All(_settings);
_uwps = applications;
ResetCache();
- _uwpStorage.Save(_uwps);
+ _uwpStorage.SaveAsync(_uwps);
_settings.LastIndexTime = DateTime.Now;
}
@@ -228,7 +226,8 @@ namespace Flow.Launcher.Plugin.Program
catch (Exception)
{
var title = Context.API.GetTranslation("flowlauncher_plugin_program_disable_dlgtitle_error");
- var message = string.Format(Context.API.GetTranslation("flowlauncher_plugin_program_run_failed"), info.FileName);
+ var message = string.Format(Context.API.GetTranslation("flowlauncher_plugin_program_run_failed"),
+ info.FileName);
Context.API.ShowMsg(title, string.Format(message, info.FileName), string.Empty);
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs
deleted file mode 100644
index d5924ba28..000000000
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs
+++ /dev/null
@@ -1,737 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Security.Principal;
-using System.Threading.Tasks;
-using System.Windows.Media.Imaging;
-using Windows.ApplicationModel;
-using Windows.Management.Deployment;
-using Flow.Launcher.Infrastructure;
-using Flow.Launcher.Plugin.Program.Logger;
-using Flow.Launcher.Plugin.SharedModels;
-using System.Threading.Channels;
-using System.Xml;
-using Windows.ApplicationModel.Core;
-using System.Windows.Input;
-
-namespace Flow.Launcher.Plugin.Program.Programs
-{
- [Serializable]
- public class UWP
- {
- public string Name { get; }
- public string FullName { get; }
- public string FamilyName { get; }
- public string Location { get; set; }
-
- public Application[] Apps { get; set; } = Array.Empty();
-
-
- public UWP(Package package)
- {
- Location = package.InstalledLocation.Path;
- Name = package.Id.Name;
- FullName = package.Id.FullName;
- FamilyName = package.Id.FamilyName;
- }
-
- public void InitAppsInPackage(Package package)
- {
- var apps = new List();
- // WinRT
- var appListEntries = package.GetAppListEntries();
- foreach (var app in appListEntries)
- {
- try
- {
- var tmp = new Application(app, this);
- apps.Add(tmp);
- }
- catch (Exception e)
- {
- ProgramLogger.LogException($"|UWP|InitAppsInPackage|{Location}" +
- "|Unexpected exception occurs when trying to construct a Application from package"
- + $"{FullName} from location {Location}", e);
- }
- }
- Apps = apps.ToArray();
-
- try
- {
- var xmlDoc = GetManifestXml();
- if (xmlDoc == null)
- {
- return;
- }
-
- var xmlRoot = xmlDoc.DocumentElement;
- var packageVersion = GetPackageVersionFromManifest(xmlRoot);
- if (!smallLogoNameFromVersion.TryGetValue(packageVersion, out string logoName) ||
- !bigLogoNameFromVersion.TryGetValue(packageVersion, out string bigLogoName))
- {
- return;
- }
-
- var namespaceManager = new XmlNamespaceManager(xmlDoc.NameTable);
- namespaceManager.AddNamespace("d", "http://schemas.microsoft.com/appx/manifest/foundation/windows10"); // still need a name
- namespaceManager.AddNamespace("rescap", "http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities");
- namespaceManager.AddNamespace("uap10", "http://schemas.microsoft.com/appx/manifest/uap/windows10/10");
-
- var allowElevationNode = xmlRoot.SelectSingleNode("//rescap:Capability[@Name='allowElevation']", namespaceManager);
- bool packageCanElevate = allowElevationNode != null;
-
- var appsNode = xmlRoot.SelectSingleNode("d:Applications", namespaceManager);
- foreach (var app in Apps)
- {
- // According to https://learn.microsoft.com/windows/apps/desktop/modernize/grant-identity-to-nonpackaged-apps#create-a-package-manifest-for-the-sparse-package
- // and https://learn.microsoft.com/uwp/schemas/appxpackage/uapmanifestschema/element-application#attributes
- var id = app.UserModelId.Split('!')[1];
- var appNode = appsNode?.SelectSingleNode($"d:Application[@Id='{id}']", namespaceManager);
- if (appNode != null)
- {
- app.CanRunElevated = packageCanElevate || Application.IfAppCanRunElevated(appNode);
-
- // local name to fit all versions
- var visualElement = appNode.SelectSingleNode($"*[local-name()='VisualElements']", namespaceManager);
- var logoUri = visualElement?.Attributes[logoName]?.Value;
- app.LogoPath = app.LogoPathFromUri(logoUri, (64, 64));
- // use small logo or may have a big margin
- var previewUri = visualElement?.Attributes[logoName]?.Value;
- app.PreviewImagePath = app.LogoPathFromUri(previewUri, (256, 256));
- }
- }
- }
- catch (Exception e)
- {
- ProgramLogger.LogException($"|UWP|InitAppsInPackage|{Location}" +
- "|Unexpected exception occurs when trying to construct a Application from package"
- + $"{FullName} from location {Location}", e);
- }
- }
-
- private XmlDocument GetManifestXml()
- {
- var manifest = Path.Combine(Location, "AppxManifest.xml");
- try
- {
- var file = File.ReadAllText(manifest);
- var xmlDoc = new XmlDocument();
- xmlDoc.LoadXml(file);
- return xmlDoc;
- }
- catch (FileNotFoundException e)
- {
- ProgramLogger.LogException("UWP", "GetManifestXml", $"{Location}", "AppxManifest.xml not found.", e);
- return null;
- }
- catch (Exception e)
- {
- ProgramLogger.LogException("UWP", "GetManifestXml", $"{Location}", "An unexpected error occurred and unable to parse AppxManifest.xml", e);
- return null;
- }
- }
-
- private PackageVersion GetPackageVersionFromManifest(XmlNode xmlRoot)
- {
- if (xmlRoot != null)
- {
-
- var namespaces = xmlRoot.Attributes;
- foreach (XmlAttribute ns in namespaces)
- {
- if (versionFromNamespace.TryGetValue(ns.Value, out var packageVersion))
- {
- return packageVersion;
- }
- }
-
- ProgramLogger.LogException($"|UWP|GetPackageVersionFromManifest|{Location}" +
- "|Trying to get the package version of the UWP program, but an unknown UWP app-manifest version in package "
- + $"{FullName} from location {Location}", new FormatException());
- return PackageVersion.Unknown;
- }
- else
- {
- ProgramLogger.LogException($"|UWP|GetPackageVersionFromManifest|{Location}" +
- "|Can't parse AppManifest.xml of package "
- + $"{FullName} from location {Location}", new ArgumentNullException(nameof(xmlRoot)));
- return PackageVersion.Unknown;
- }
- }
-
- private static readonly Dictionary versionFromNamespace = new()
- {
- {
- "http://schemas.microsoft.com/appx/manifest/foundation/windows10", PackageVersion.Windows10
- },
- {
- "http://schemas.microsoft.com/appx/2013/manifest", PackageVersion.Windows81
- },
- {
- "http://schemas.microsoft.com/appx/2010/manifest", PackageVersion.Windows8
- },
- };
-
- private static readonly Dictionary smallLogoNameFromVersion = new()
- {
- {
- PackageVersion.Windows10, "Square44x44Logo"
- },
- {
- PackageVersion.Windows81, "Square30x30Logo"
- },
- {
- PackageVersion.Windows8, "SmallLogo"
- },
- };
-
- private static readonly Dictionary bigLogoNameFromVersion = new()
- {
- {
- PackageVersion.Windows10, "Square150x150Logo"
- },
- {
- PackageVersion.Windows81, "Square150x150Logo"
- },
- {
- PackageVersion.Windows8, "Logo"
- },
- };
-
- public static Application[] All(Settings settings)
- {
- var support = SupportUWP();
- if (support && settings.EnableUWP)
- {
- var applications = CurrentUserPackages().AsParallel().SelectMany(p =>
- {
- UWP u;
- try
- {
- u = new UWP(p);
- u.InitAppsInPackage(p);
- }
-#if !DEBUG
- catch (Exception e)
- {
- ProgramLogger.LogException($"|UWP|All|{p.InstalledLocation}|An unexpected error occurred and unable to convert Package to UWP for {p.Id.FullName}", e);
- return Array.Empty();
- }
-#endif
-#if DEBUG //make developer aware and implement handling
- catch
- {
- throw;
- }
-#endif
- return u.Apps;
- }).ToArray();
-
- var updatedListWithoutDisabledApps = applications
- .Where(t1 => !Main._settings.DisabledProgramSources
- .Any(x => x.UniqueIdentifier == t1.UniqueIdentifier));
-
- return updatedListWithoutDisabledApps.ToArray();
- }
- else
- {
- return Array.Empty();
- }
- }
-
- public static bool SupportUWP()
- {
- var windows10 = new Version(10, 0);
- var support = Environment.OSVersion.Version.Major >= windows10.Major;
- return support;
- }
-
- private static IEnumerable CurrentUserPackages()
- {
- var user = WindowsIdentity.GetCurrent().User;
-
- if (user != null)
- {
- var userId = user.Value;
- PackageManager packageManager;
- try
- {
- packageManager = new PackageManager();
- }
- catch
- {
- // Bug from https://github.com/microsoft/CsWinRT, using Microsoft.Windows.SDK.NET.Ref 10.0.19041.0.
- // Only happens on the first time, so a try catch can fix it.
- packageManager = new PackageManager();
- }
- var packages = packageManager.FindPackagesForUser(userId);
- packages = packages.Where(p =>
- {
- try
- {
- var f = p.IsFramework;
- var d = p.IsDevelopmentMode;
- var path = p.InstalledLocation.Path;
- return !f && !d && !string.IsNullOrEmpty(path);
- }
- catch (Exception e)
- {
- ProgramLogger.LogException("UWP", "CurrentUserPackages", $"{p.Id.FullName}", "An unexpected error occurred and "
- + $"unable to verify if package is valid", e);
- return false;
- }
- });
- return packages;
- }
- else
- {
- return Array.Empty();
- }
- }
-
- private static Channel PackageChangeChannel = Channel.CreateBounded(1);
-
- public static async Task WatchPackageChange()
- {
- if (Environment.OSVersion.Version.Major >= 10)
- {
- var catalog = PackageCatalog.OpenForCurrentUser();
- catalog.PackageInstalling += (_, args) =>
- {
- if (args.IsComplete)
- PackageChangeChannel.Writer.TryWrite(default);
- };
- catalog.PackageUninstalling += (_, args) =>
- {
- if (args.IsComplete)
- PackageChangeChannel.Writer.TryWrite(default);
- };
- catalog.PackageUpdating += (_, args) =>
- {
- if (args.IsComplete)
- PackageChangeChannel.Writer.TryWrite(default);
- };
-
- while (await PackageChangeChannel.Reader.WaitToReadAsync().ConfigureAwait(false))
- {
- await Task.Delay(3000).ConfigureAwait(false);
- PackageChangeChannel.Reader.TryRead(out _);
- await Task.Run(Main.IndexUwpPrograms);
- }
-
- }
- }
-
- public override string ToString()
- {
- return FamilyName;
- }
-
- public override bool Equals(object obj)
- {
- if (obj is UWP uwp)
- {
- return FamilyName.Equals(uwp.FamilyName);
- }
- else
- {
- return false;
- }
- }
-
- public override int GetHashCode()
- {
- return FamilyName.GetHashCode();
- }
-
- [Serializable]
- public class Application : IProgram
- {
- private string _uid = string.Empty;
- public string UniqueIdentifier { get => _uid; set => _uid = value == null ? string.Empty : value.ToLowerInvariant(); }
- public string DisplayName { get; set; } = string.Empty;
- public string Description { get; set; } = string.Empty;
- public string UserModelId { get; set; } = string.Empty;
- //public string BackgroundColor { get; set; } = string.Empty; // preserve for future use
- public string Name => DisplayName;
- public string Location { get; set; } = string.Empty;
-
- public bool Enabled { get; set; } = false;
- public bool CanRunElevated { get; set; } = false;
- public string LogoPath { get; set; } = string.Empty;
- public string PreviewImagePath { get; set; } = string.Empty;
-
- public Application(AppListEntry appListEntry, UWP package)
- {
- UserModelId = appListEntry.AppUserModelId;
- UniqueIdentifier = appListEntry.AppUserModelId;
- DisplayName = appListEntry.DisplayInfo.DisplayName;
- Description = appListEntry.DisplayInfo.Description;
- Location = package.Location;
- Enabled = true;
- }
-
- public Result Result(string query, IPublicAPI api)
- {
- string title;
- MatchResult matchResult;
-
- // We suppose Name won't be null
- if (!Main._settings.EnableDescription || string.IsNullOrWhiteSpace(Description) || Name.Equals(Description))
- {
- title = Name;
- matchResult = StringMatcher.FuzzySearch(query, Name);
- }
- else
- {
- title = $"{Name}: {Description}";
- var nameMatch = StringMatcher.FuzzySearch(query, Name);
- var descriptionMatch = StringMatcher.FuzzySearch(query, Description);
- if (descriptionMatch.Score > nameMatch.Score)
- {
- for (int i = 0; i < descriptionMatch.MatchData.Count; i++)
- {
- descriptionMatch.MatchData[i] += Name.Length + 2; // 2 is ": "
- }
- matchResult = descriptionMatch;
- }
- else
- {
- matchResult = nameMatch;
- }
- }
-
- if (!matchResult.IsSearchPrecisionScoreMet())
- return null;
-
- var result = new Result
- {
- Title = title,
- AutoCompleteText = Name,
- SubTitle = Main._settings.HideAppsPath ? string.Empty : Location,
- IcoPath = LogoPath,
- Preview = new Result.PreviewInfo
- {
- IsMedia = false,
- PreviewImagePath = PreviewImagePath,
- Description = Description
- },
- Score = matchResult.Score,
- TitleHighlightData = matchResult.MatchData,
- ContextData = this,
- Action = e =>
- {
- // Ctrl + Enter to open containing folder
- bool openFolder = e.SpecialKeyState.ToModifierKeys() == ModifierKeys.Control;
- if (openFolder)
- {
- Main.Context.API.OpenDirectory(Location);
- return true;
- }
-
- // Ctrl + Shift + Enter to run elevated
- bool elevated = e.SpecialKeyState.ToModifierKeys() == (ModifierKeys.Control | ModifierKeys.Shift);
-
- bool shouldRunElevated = elevated && CanRunElevated;
- _ = Task.Run(() => Launch(shouldRunElevated)).ConfigureAwait(false);
- if (elevated && !shouldRunElevated)
- {
- var title = api.GetTranslation("flowlauncher_plugin_program_disable_dlgtitle_error");
- var message = api.GetTranslation("flowlauncher_plugin_program_run_as_administrator_not_supported_message");
- api.ShowMsg(title, message, string.Empty);
- }
-
- return true;
- }
- };
-
-
- return result;
- }
-
- public List ContextMenus(IPublicAPI api)
- {
- var contextMenus = new List
- {
- new Result
- {
- Title = api.GetTranslation("flowlauncher_plugin_program_open_containing_folder"),
- Action = _ =>
- {
- Main.Context.API.OpenDirectory(Location);
-
- return true;
- },
- IcoPath = "Images/folder.png",
- Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\xe838"),
- }
- };
-
- if (CanRunElevated)
- {
- contextMenus.Add(new Result
- {
- Title = api.GetTranslation("flowlauncher_plugin_program_run_as_administrator"),
- Action = _ =>
- {
- Task.Run(() => Launch(true)).ConfigureAwait(false);
- return true;
- },
- IcoPath = "Images/cmd.png",
- Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\xe7ef")
- });
- }
-
- return contextMenus;
- }
-
- private void Launch(bool elevated = false)
- {
- string command = "shell:AppsFolder\\" + UserModelId;
- command = Environment.ExpandEnvironmentVariables(command.Trim());
-
- var info = new ProcessStartInfo(command)
- {
- UseShellExecute = true,
- Verb = elevated ? "runas" : ""
- };
-
- Main.StartProcess(Process.Start, info);
- }
-
- internal static bool IfAppCanRunElevated(XmlNode appNode)
- {
- // According to https://learn.microsoft.com/windows/apps/desktop/modernize/grant-identity-to-nonpackaged-apps#create-a-package-manifest-for-the-sparse-package
- // and https://learn.microsoft.com/uwp/schemas/appxpackage/uapmanifestschema/element-application#attributes
-
- return appNode?.Attributes["EntryPoint"]?.Value == "Windows.FullTrustApplication" ||
- appNode?.Attributes["uap10:TrustLevel"]?.Value == "mediumIL";
- }
-
- internal string LogoPathFromUri(string uri, (int, int) desiredSize)
- {
- // all https://msdn.microsoft.com/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets
- // windows 10 https://msdn.microsoft.com/en-us/library/windows/apps/dn934817.aspx
- // windows 8.1 https://msdn.microsoft.com/en-us/library/windows/apps/hh965372.aspx#target_size
- // windows 8 https://msdn.microsoft.com/en-us/library/windows/apps/br211475.aspx
-
- if (string.IsNullOrWhiteSpace(uri))
- {
- ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
- $"|{UserModelId} 's logo uri is null or empty: {Location}", new ArgumentException("uri"));
- return string.Empty;
- }
-
- string path = Path.Combine(Location, uri);
-
- var pxCount = desiredSize.Item1 * desiredSize.Item2;
- var logoPath = TryToFindLogo(uri, path, pxCount);
- if (logoPath == string.Empty)
- {
- var tmp = Path.Combine(Location, "Assets", uri);
- if (!path.Equals(tmp, StringComparison.OrdinalIgnoreCase))
- {
- // TODO: Don't know why, just keep it at the moment
- // Maybe on older version of Windows 10?
- // for C:\Windows\MiracastView etc
- return TryToFindLogo(uri, tmp, pxCount);
- }
- }
- return logoPath;
-
- string TryToFindLogo(string uri, string path, int px)
- {
- var extension = Path.GetExtension(path);
- if (extension != null)
- {
- //if (File.Exists(path))
- //{
- // return path; // shortcut, avoid enumerating files
- //}
-
- var logoNamePrefix = Path.GetFileNameWithoutExtension(uri); // e.g Square44x44
- var logoDir = Path.GetDirectoryName(path); // e.g ..\..\Assets
- if (String.IsNullOrEmpty(logoNamePrefix) || !Directory.Exists(logoDir))
- {
- // Known issue: Edge always triggers it since logo is not at uri
- ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
- $"|{UserModelId} can't find logo uri for {uri} in package location (logo name or directory not found): {Location}", new FileNotFoundException());
- return string.Empty;
- }
-
- var logos = Directory.EnumerateFiles(logoDir, $"{logoNamePrefix}*{extension}");
-
- // Currently we don't care which one to choose
- // Just ignore all qualifiers
- // select like logo.[xxx_yyy].png
- // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast
-
- // todo select from file name like pt run
- var selected = logos.FirstOrDefault();
- var closest = selected;
- int min = int.MaxValue;
- foreach (var logo in logos)
- {
-
- var imageStream = File.OpenRead(logo);
- var decoder = BitmapDecoder.Create(imageStream, BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.None);
- var height = decoder.Frames[0].PixelHeight;
- var width = decoder.Frames[0].PixelWidth;
- int pixelCountDiff = Math.Abs(height * width - px);
- if (pixelCountDiff < min)
- {
- // try to find the closest to desired size
- closest = logo;
- if (pixelCountDiff == 0)
- break; // found
- min = pixelCountDiff;
- }
- }
-
- selected = closest;
- if (!string.IsNullOrEmpty(selected))
- {
- return selected;
- }
- else
- {
- ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
- $"|{UserModelId} can't find logo uri for {uri} in package location (can't find specified logo): {Location}", new FileNotFoundException());
- return string.Empty;
- }
- }
- else
- {
- ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
- $"|Unable to find extension from {uri} for {UserModelId} " +
- $"in package location {Location}", new FileNotFoundException());
- return string.Empty;
- }
- }
- }
-
-
- #region logo legacy
- // preserve for potential future use
-
- //public ImageSource Logo()
- //{
- // var logo = ImageFromPath(LogoPath);
- // var plated = PlatedImage(logo); // TODO: maybe get plated directly from app package?
-
- // // todo magic! temp fix for cross thread object
- // plated.Freeze();
- // return plated;
- //}
- //private BitmapImage ImageFromPath(string path)
- //{
- // if (File.Exists(path))
- // {
- // var image = new BitmapImage();
- // image.BeginInit();
- // image.UriSource = new Uri(path);
- // image.CacheOption = BitmapCacheOption.OnLoad;
- // image.EndInit();
- // image.Freeze();
- // return image;
- // }
- // else
- // {
- // ProgramLogger.LogException($"|UWP|ImageFromPath|{(string.IsNullOrEmpty(path) ? "Not Available" : path)}" +
- // $"|Unable to get logo for {UserModelId} from {path} and" +
- // $" located in {Location}", new FileNotFoundException());
- // return new BitmapImage(new Uri(Constant.MissingImgIcon));
- // }
- //}
-
- //private ImageSource PlatedImage(BitmapImage image)
- //{
- // if (!string.IsNullOrEmpty(BackgroundColor) && BackgroundColor != "transparent")
- // {
- // var width = image.Width;
- // var height = image.Height;
- // var x = 0;
- // var y = 0;
-
- // var group = new DrawingGroup();
-
- // var converted = ColorConverter.ConvertFromString(BackgroundColor);
- // if (converted != null)
- // {
- // var color = (Color)converted;
- // var brush = new SolidColorBrush(color);
- // var pen = new Pen(brush, 1);
- // var backgroundArea = new Rect(0, 0, width, width);
- // var rectangle = new RectangleGeometry(backgroundArea);
- // var rectDrawing = new GeometryDrawing(brush, pen, rectangle);
- // group.Children.Add(rectDrawing);
-
- // var imageArea = new Rect(x, y, image.Width, image.Height);
- // var imageDrawing = new ImageDrawing(image, imageArea);
- // group.Children.Add(imageDrawing);
-
- // // http://stackoverflow.com/questions/6676072/get-system-drawing-bitmap-of-a-wpf-area-using-visualbrush
- // var visual = new DrawingVisual();
- // var context = visual.RenderOpen();
- // context.DrawDrawing(group);
- // context.Close();
- // const int dpiScale100 = 96;
- // var bitmap = new RenderTargetBitmap(
- // Convert.ToInt32(width), Convert.ToInt32(height),
- // dpiScale100, dpiScale100,
- // PixelFormats.Pbgra32
- // );
- // bitmap.Render(visual);
- // return bitmap;
- // }
- // else
- // {
- // ProgramLogger.LogException($"|UWP|PlatedImage|{Location}" +
- // $"|Unable to convert background string {BackgroundColor} " +
- // $"to color for {Location}", new InvalidOperationException());
-
- // return new BitmapImage(new Uri(Constant.MissingImgIcon));
- // }
- // }
- // else
- // {
- // // todo use windows theme as background
- // return image;
- // }
- //}
-
- #endregion
- public override string ToString()
- {
- return $"{DisplayName}: {Description}";
- }
-
- public override bool Equals(object obj)
- {
- if (obj is Application other)
- {
- return UniqueIdentifier == other.UniqueIdentifier;
- }
- else
- {
- return false;
- }
- }
-
- public override int GetHashCode()
- {
- return UniqueIdentifier.GetHashCode();
- }
- }
-
- public enum PackageVersion
- {
- Windows10,
- Windows81,
- Windows8,
- Unknown
- }
- }
-}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
new file mode 100644
index 000000000..3fb22b39d
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
@@ -0,0 +1,752 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Security.Principal;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+using Windows.ApplicationModel;
+using Windows.Management.Deployment;
+using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Plugin.Program.Logger;
+using Flow.Launcher.Plugin.SharedModels;
+using System.Threading.Channels;
+using System.Xml;
+using Windows.ApplicationModel.Core;
+using System.Windows.Input;
+using MemoryPack;
+
+namespace Flow.Launcher.Plugin.Program.Programs
+{
+ [MemoryPackable]
+ public partial class UWPPackage
+ {
+ public string Name { get; }
+ public string FullName { get; }
+ public string FamilyName { get; }
+ public string Location { get; set; }
+
+ public UWPApp[] Apps { get; set; } = Array.Empty();
+
+
+ ///
+ /// For serialization
+ ///
+ [MemoryPackConstructor]
+ private UWPPackage()
+ {
+ }
+
+ public UWPPackage(Package package)
+ {
+ Location = package.InstalledLocation.Path;
+ Name = package.Id.Name;
+ FullName = package.Id.FullName;
+ FamilyName = package.Id.FamilyName;
+ }
+
+ public void InitAppsInPackage(Package package)
+ {
+ var apps = new List();
+ // WinRT
+ var appListEntries = package.GetAppListEntries();
+ foreach (var app in appListEntries)
+ {
+ try
+ {
+ var tmp = new UWPApp(app, this);
+ apps.Add(tmp);
+ }
+ catch (Exception e)
+ {
+ ProgramLogger.LogException($"|UWP|InitAppsInPackage|{Location}" +
+ "|Unexpected exception occurs when trying to construct a Application from package"
+ + $"{FullName} from location {Location}", e);
+ }
+ }
+
+ Apps = apps.ToArray();
+
+ try
+ {
+ var xmlDoc = GetManifestXml();
+ if (xmlDoc == null)
+ {
+ return;
+ }
+
+ var xmlRoot = xmlDoc.DocumentElement;
+ var packageVersion = GetPackageVersionFromManifest(xmlRoot);
+ if (!smallLogoNameFromVersion.TryGetValue(packageVersion, out string logoName) ||
+ !bigLogoNameFromVersion.TryGetValue(packageVersion, out string bigLogoName))
+ {
+ return;
+ }
+
+ var namespaceManager = new XmlNamespaceManager(xmlDoc.NameTable);
+ namespaceManager.AddNamespace("d",
+ "http://schemas.microsoft.com/appx/manifest/foundation/windows10"); // still need a name
+ namespaceManager.AddNamespace("rescap",
+ "http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities");
+ namespaceManager.AddNamespace("uap10", "http://schemas.microsoft.com/appx/manifest/uap/windows10/10");
+
+ var allowElevationNode =
+ xmlRoot.SelectSingleNode("//rescap:Capability[@Name='allowElevation']", namespaceManager);
+ bool packageCanElevate = allowElevationNode != null;
+
+ var appsNode = xmlRoot.SelectSingleNode("d:Applications", namespaceManager);
+ foreach (var app in Apps)
+ {
+ // According to https://learn.microsoft.com/windows/apps/desktop/modernize/grant-identity-to-nonpackaged-apps#create-a-package-manifest-for-the-sparse-package
+ // and https://learn.microsoft.com/uwp/schemas/appxpackage/uapmanifestschema/element-application#attributes
+ var id = app.UserModelId.Split('!')[1];
+ var appNode = appsNode?.SelectSingleNode($"d:Application[@Id='{id}']", namespaceManager);
+ if (appNode != null)
+ {
+ app.CanRunElevated = packageCanElevate || UWPApp.IfAppCanRunElevated(appNode);
+
+ // local name to fit all versions
+ var visualElement =
+ appNode.SelectSingleNode($"*[local-name()='VisualElements']", namespaceManager);
+ var logoUri = visualElement?.Attributes[logoName]?.Value;
+ app.LogoPath = app.LogoPathFromUri(logoUri, (64, 64));
+ // use small logo or may have a big margin
+ var previewUri = visualElement?.Attributes[logoName]?.Value;
+ app.PreviewImagePath = app.LogoPathFromUri(previewUri, (256, 256));
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ ProgramLogger.LogException($"|UWP|InitAppsInPackage|{Location}" +
+ "|Unexpected exception occurs when trying to construct a Application from package"
+ + $"{FullName} from location {Location}", e);
+ }
+ }
+
+ private XmlDocument GetManifestXml()
+ {
+ var manifest = Path.Combine(Location, "AppxManifest.xml");
+ try
+ {
+ var file = File.ReadAllText(manifest);
+ var xmlDoc = new XmlDocument();
+ xmlDoc.LoadXml(file);
+ return xmlDoc;
+ }
+ catch (FileNotFoundException e)
+ {
+ ProgramLogger.LogException("UWP", "GetManifestXml", $"{Location}", "AppxManifest.xml not found.", e);
+ return null;
+ }
+ catch (Exception e)
+ {
+ ProgramLogger.LogException("UWP", "GetManifestXml", $"{Location}",
+ "An unexpected error occurred and unable to parse AppxManifest.xml", e);
+ return null;
+ }
+ }
+
+ private PackageVersion GetPackageVersionFromManifest(XmlNode xmlRoot)
+ {
+ if (xmlRoot != null)
+ {
+ var namespaces = xmlRoot.Attributes;
+ foreach (XmlAttribute ns in namespaces)
+ {
+ if (versionFromNamespace.TryGetValue(ns.Value, out var packageVersion))
+ {
+ return packageVersion;
+ }
+ }
+
+ ProgramLogger.LogException($"|UWP|GetPackageVersionFromManifest|{Location}" +
+ "|Trying to get the package version of the UWP program, but an unknown UWP app-manifest version in package "
+ + $"{FullName} from location {Location}", new FormatException());
+ return PackageVersion.Unknown;
+ }
+ else
+ {
+ ProgramLogger.LogException($"|UWP|GetPackageVersionFromManifest|{Location}" +
+ "|Can't parse AppManifest.xml of package "
+ + $"{FullName} from location {Location}",
+ new ArgumentNullException(nameof(xmlRoot)));
+ return PackageVersion.Unknown;
+ }
+ }
+
+ private static readonly Dictionary versionFromNamespace = new()
+ {
+ { "http://schemas.microsoft.com/appx/manifest/foundation/windows10", PackageVersion.Windows10 },
+ { "http://schemas.microsoft.com/appx/2013/manifest", PackageVersion.Windows81 },
+ { "http://schemas.microsoft.com/appx/2010/manifest", PackageVersion.Windows8 },
+ };
+
+ private static readonly Dictionary smallLogoNameFromVersion = new()
+ {
+ { PackageVersion.Windows10, "Square44x44Logo" },
+ { PackageVersion.Windows81, "Square30x30Logo" },
+ { PackageVersion.Windows8, "SmallLogo" },
+ };
+
+ private static readonly Dictionary bigLogoNameFromVersion = new()
+ {
+ { PackageVersion.Windows10, "Square150x150Logo" },
+ { PackageVersion.Windows81, "Square150x150Logo" },
+ { PackageVersion.Windows8, "Logo" },
+ };
+
+ public static UWPApp[] All(Settings settings)
+ {
+ var support = SupportUWP();
+ if (support && settings.EnableUWP)
+ {
+ var applications = CurrentUserPackages().AsParallel().SelectMany(p =>
+ {
+ UWPPackage u;
+ try
+ {
+ u = new UWPPackage(p);
+ u.InitAppsInPackage(p);
+ }
+#if !DEBUG
+ catch (Exception e)
+ {
+ ProgramLogger.LogException($"|UWP|All|{p.InstalledLocation}|An unexpected error occurred and unable to convert Package to UWP for {p.Id.FullName}", e);
+ return Array.Empty();
+ }
+#endif
+#if DEBUG //make developer aware and implement handling
+ catch
+ {
+ throw;
+ }
+#endif
+ return u.Apps;
+ }).ToArray();
+
+ var updatedListWithoutDisabledApps = applications
+ .Where(t1 => !Main._settings.DisabledProgramSources
+ .Any(x => x.UniqueIdentifier == t1.UniqueIdentifier));
+
+ return updatedListWithoutDisabledApps.ToArray();
+ }
+ else
+ {
+ return Array.Empty();
+ }
+ }
+
+ public static bool SupportUWP()
+ {
+ var windows10 = new Version(10, 0);
+ var support = Environment.OSVersion.Version.Major >= windows10.Major;
+ return support;
+ }
+
+ private static IEnumerable CurrentUserPackages()
+ {
+ var user = WindowsIdentity.GetCurrent().User;
+
+ if (user != null)
+ {
+ var userId = user.Value;
+ PackageManager packageManager;
+ try
+ {
+ packageManager = new PackageManager();
+ }
+ catch
+ {
+ // Bug from https://github.com/microsoft/CsWinRT, using Microsoft.Windows.SDK.NET.Ref 10.0.19041.0.
+ // Only happens on the first time, so a try catch can fix it.
+ packageManager = new PackageManager();
+ }
+
+ var packages = packageManager.FindPackagesForUser(userId);
+ packages = packages.Where(p =>
+ {
+ try
+ {
+ var f = p.IsFramework;
+ var d = p.IsDevelopmentMode;
+ var path = p.InstalledLocation.Path;
+ return !f && !d && !string.IsNullOrEmpty(path);
+ }
+ catch (Exception e)
+ {
+ ProgramLogger.LogException("UWP", "CurrentUserPackages", $"{p.Id.FullName}",
+ "An unexpected error occurred and "
+ + $"unable to verify if package is valid", e);
+ return false;
+ }
+ });
+ return packages;
+ }
+ else
+ {
+ return Array.Empty();
+ }
+ }
+
+ private static Channel PackageChangeChannel = Channel.CreateBounded(1);
+
+ public static async Task WatchPackageChange()
+ {
+ if (Environment.OSVersion.Version.Major >= 10)
+ {
+ var catalog = PackageCatalog.OpenForCurrentUser();
+ catalog.PackageInstalling += (_, args) =>
+ {
+ if (args.IsComplete)
+ PackageChangeChannel.Writer.TryWrite(default);
+ };
+ catalog.PackageUninstalling += (_, args) =>
+ {
+ if (args.IsComplete)
+ PackageChangeChannel.Writer.TryWrite(default);
+ };
+ catalog.PackageUpdating += (_, args) =>
+ {
+ if (args.IsComplete)
+ PackageChangeChannel.Writer.TryWrite(default);
+ };
+
+ while (await PackageChangeChannel.Reader.WaitToReadAsync().ConfigureAwait(false))
+ {
+ await Task.Delay(3000).ConfigureAwait(false);
+ PackageChangeChannel.Reader.TryRead(out _);
+ await Task.Run(Main.IndexUwpPrograms);
+ }
+ }
+ }
+
+ public override string ToString()
+ {
+ return FamilyName;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (obj is UWPPackage uwp)
+ {
+ return FamilyName.Equals(uwp.FamilyName);
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public override int GetHashCode()
+ {
+ return FamilyName.GetHashCode();
+ }
+
+
+ public enum PackageVersion
+ {
+ Windows10,
+ Windows81,
+ Windows8,
+ Unknown
+ }
+ }
+
+ [MemoryPackable]
+ public partial class UWPApp : IProgram
+ {
+ private string _uid = string.Empty;
+
+ public string UniqueIdentifier
+ {
+ get => _uid;
+ set => _uid = value == null ? string.Empty : value.ToLowerInvariant();
+ }
+
+ public string DisplayName { get; set; } = string.Empty;
+ public string Description { get; set; } = string.Empty;
+
+ public string UserModelId { get; set; } = string.Empty;
+
+ //public string BackgroundColor { get; set; } = string.Empty; // preserve for future use
+ public string Name => DisplayName;
+ public string Location { get; set; } = string.Empty;
+
+ public bool Enabled { get; set; } = false;
+ public bool CanRunElevated { get; set; } = false;
+ public string LogoPath { get; set; } = string.Empty;
+ public string PreviewImagePath { get; set; } = string.Empty;
+
+ [MemoryPackConstructor]
+ private UWPApp()
+ {
+ }
+
+ public UWPApp(AppListEntry appListEntry, UWPPackage package)
+ {
+ UserModelId = appListEntry.AppUserModelId;
+ UniqueIdentifier = appListEntry.AppUserModelId;
+ DisplayName = appListEntry.DisplayInfo.DisplayName;
+ Description = appListEntry.DisplayInfo.Description;
+ Location = package.Location;
+ Enabled = true;
+ }
+
+ public Result Result(string query, IPublicAPI api)
+ {
+ string title;
+ MatchResult matchResult;
+
+ // We suppose Name won't be null
+ if (!Main._settings.EnableDescription || string.IsNullOrWhiteSpace(Description) || Name.Equals(Description))
+ {
+ title = Name;
+ matchResult = StringMatcher.FuzzySearch(query, Name);
+ }
+ else
+ {
+ title = $"{Name}: {Description}";
+ var nameMatch = StringMatcher.FuzzySearch(query, Name);
+ var descriptionMatch = StringMatcher.FuzzySearch(query, Description);
+ if (descriptionMatch.Score > nameMatch.Score)
+ {
+ for (int i = 0; i < descriptionMatch.MatchData.Count; i++)
+ {
+ descriptionMatch.MatchData[i] += Name.Length + 2; // 2 is ": "
+ }
+
+ matchResult = descriptionMatch;
+ }
+ else
+ {
+ matchResult = nameMatch;
+ }
+ }
+
+ if (!matchResult.IsSearchPrecisionScoreMet())
+ return null;
+
+ var result = new Result
+ {
+ Title = title,
+ AutoCompleteText = Name,
+ SubTitle = Main._settings.HideAppsPath ? string.Empty : Location,
+ IcoPath = LogoPath,
+ Preview = new Result.PreviewInfo
+ {
+ IsMedia = false, PreviewImagePath = PreviewImagePath, Description = Description
+ },
+ Score = matchResult.Score,
+ TitleHighlightData = matchResult.MatchData,
+ ContextData = this,
+ Action = e =>
+ {
+ // Ctrl + Enter to open containing folder
+ bool openFolder = e.SpecialKeyState.ToModifierKeys() == ModifierKeys.Control;
+ if (openFolder)
+ {
+ Main.Context.API.OpenDirectory(Location);
+ return true;
+ }
+
+ // Ctrl + Shift + Enter to run elevated
+ bool elevated = e.SpecialKeyState.ToModifierKeys() == (ModifierKeys.Control | ModifierKeys.Shift);
+
+ bool shouldRunElevated = elevated && CanRunElevated;
+ _ = Task.Run(() => Launch(shouldRunElevated)).ConfigureAwait(false);
+ if (elevated && !shouldRunElevated)
+ {
+ var title = api.GetTranslation("flowlauncher_plugin_program_disable_dlgtitle_error");
+ var message =
+ api.GetTranslation(
+ "flowlauncher_plugin_program_run_as_administrator_not_supported_message");
+ api.ShowMsg(title, message, string.Empty);
+ }
+
+ return true;
+ }
+ };
+
+
+ return result;
+ }
+
+ public List ContextMenus(IPublicAPI api)
+ {
+ var contextMenus = new List
+ {
+ new Result
+ {
+ Title = api.GetTranslation("flowlauncher_plugin_program_open_containing_folder"),
+ Action = _ =>
+ {
+ Main.Context.API.OpenDirectory(Location);
+
+ return true;
+ },
+ IcoPath = "Images/folder.png",
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\xe838"),
+ }
+ };
+
+ if (CanRunElevated)
+ {
+ contextMenus.Add(new Result
+ {
+ Title = api.GetTranslation("flowlauncher_plugin_program_run_as_administrator"),
+ Action = _ =>
+ {
+ Task.Run(() => Launch(true)).ConfigureAwait(false);
+ return true;
+ },
+ IcoPath = "Images/cmd.png",
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\xe7ef")
+ });
+ }
+
+ return contextMenus;
+ }
+
+ private void Launch(bool elevated = false)
+ {
+ string command = "shell:AppsFolder\\" + UserModelId;
+ command = Environment.ExpandEnvironmentVariables(command.Trim());
+
+ var info = new ProcessStartInfo(command) { UseShellExecute = true, Verb = elevated ? "runas" : "" };
+
+ Main.StartProcess(Process.Start, info);
+ }
+
+ internal static bool IfAppCanRunElevated(XmlNode appNode)
+ {
+ // According to https://learn.microsoft.com/windows/apps/desktop/modernize/grant-identity-to-nonpackaged-apps#create-a-package-manifest-for-the-sparse-package
+ // and https://learn.microsoft.com/uwp/schemas/appxpackage/uapmanifestschema/element-application#attributes
+
+ return appNode?.Attributes["EntryPoint"]?.Value == "Windows.FullTrustApplication" ||
+ appNode?.Attributes["uap10:TrustLevel"]?.Value == "mediumIL";
+ }
+
+ internal string LogoPathFromUri(string uri, (int, int) desiredSize)
+ {
+ // all https://msdn.microsoft.com/windows/uwp/controls-and-patterns/tiles-and-notifications-app-assets
+ // windows 10 https://msdn.microsoft.com/en-us/library/windows/apps/dn934817.aspx
+ // windows 8.1 https://msdn.microsoft.com/en-us/library/windows/apps/hh965372.aspx#target_size
+ // windows 8 https://msdn.microsoft.com/en-us/library/windows/apps/br211475.aspx
+
+ if (string.IsNullOrWhiteSpace(uri))
+ {
+ ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
+ $"|{UserModelId} 's logo uri is null or empty: {Location}",
+ new ArgumentException("uri"));
+ return string.Empty;
+ }
+
+ string path = Path.Combine(Location, uri);
+
+ var pxCount = desiredSize.Item1 * desiredSize.Item2;
+ var logoPath = TryToFindLogo(uri, path, pxCount);
+ if (logoPath == string.Empty)
+ {
+ var tmp = Path.Combine(Location, "Assets", uri);
+ if (!path.Equals(tmp, StringComparison.OrdinalIgnoreCase))
+ {
+ // TODO: Don't know why, just keep it at the moment
+ // Maybe on older version of Windows 10?
+ // for C:\Windows\MiracastView etc
+ return TryToFindLogo(uri, tmp, pxCount);
+ }
+ }
+
+ return logoPath;
+
+ string TryToFindLogo(string uri, string path, int px)
+ {
+ var extension = Path.GetExtension(path);
+ if (extension != null)
+ {
+ //if (File.Exists(path))
+ //{
+ // return path; // shortcut, avoid enumerating files
+ //}
+
+ var logoNamePrefix = Path.GetFileNameWithoutExtension(uri); // e.g Square44x44
+ var logoDir = Path.GetDirectoryName(path); // e.g ..\..\Assets
+ if (String.IsNullOrEmpty(logoNamePrefix) || !Directory.Exists(logoDir))
+ {
+ // Known issue: Edge always triggers it since logo is not at uri
+ ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
+ $"|{UserModelId} can't find logo uri for {uri} in package location (logo name or directory not found): {Location}",
+ new FileNotFoundException());
+ return string.Empty;
+ }
+
+ var logos = Directory.EnumerateFiles(logoDir, $"{logoNamePrefix}*{extension}");
+
+ // Currently we don't care which one to choose
+ // Just ignore all qualifiers
+ // select like logo.[xxx_yyy].png
+ // https://learn.microsoft.com/en-us/windows/uwp/app-resources/tailor-resources-lang-scale-contrast
+
+ // todo select from file name like pt run
+ var selected = logos.FirstOrDefault();
+ var closest = selected;
+ int min = int.MaxValue;
+ foreach (var logo in logos)
+ {
+ var imageStream = File.OpenRead(logo);
+ var decoder = BitmapDecoder.Create(imageStream, BitmapCreateOptions.IgnoreColorProfile,
+ BitmapCacheOption.None);
+ var height = decoder.Frames[0].PixelHeight;
+ var width = decoder.Frames[0].PixelWidth;
+ int pixelCountDiff = Math.Abs(height * width - px);
+ if (pixelCountDiff < min)
+ {
+ // try to find the closest to desired size
+ closest = logo;
+ if (pixelCountDiff == 0)
+ break; // found
+ min = pixelCountDiff;
+ }
+ }
+
+ selected = closest;
+ if (!string.IsNullOrEmpty(selected))
+ {
+ return selected;
+ }
+ else
+ {
+ ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
+ $"|{UserModelId} can't find logo uri for {uri} in package location (can't find specified logo): {Location}",
+ new FileNotFoundException());
+ return string.Empty;
+ }
+ }
+ else
+ {
+ ProgramLogger.LogException($"|UWP|LogoPathFromUri|{Location}" +
+ $"|Unable to find extension from {uri} for {UserModelId} " +
+ $"in package location {Location}", new FileNotFoundException());
+ return string.Empty;
+ }
+ }
+ }
+
+
+ #region logo legacy
+
+ // preserve for potential future use
+
+ //public ImageSource Logo()
+ //{
+ // var logo = ImageFromPath(LogoPath);
+ // var plated = PlatedImage(logo); // TODO: maybe get plated directly from app package?
+
+ // // todo magic! temp fix for cross thread object
+ // plated.Freeze();
+ // return plated;
+ //}
+ //private BitmapImage ImageFromPath(string path)
+ //{
+ // if (File.Exists(path))
+ // {
+ // var image = new BitmapImage();
+ // image.BeginInit();
+ // image.UriSource = new Uri(path);
+ // image.CacheOption = BitmapCacheOption.OnLoad;
+ // image.EndInit();
+ // image.Freeze();
+ // return image;
+ // }
+ // else
+ // {
+ // ProgramLogger.LogException($"|UWP|ImageFromPath|{(string.IsNullOrEmpty(path) ? "Not Available" : path)}" +
+ // $"|Unable to get logo for {UserModelId} from {path} and" +
+ // $" located in {Location}", new FileNotFoundException());
+ // return new BitmapImage(new Uri(Constant.MissingImgIcon));
+ // }
+ //}
+
+ //private ImageSource PlatedImage(BitmapImage image)
+ //{
+ // if (!string.IsNullOrEmpty(BackgroundColor) && BackgroundColor != "transparent")
+ // {
+ // var width = image.Width;
+ // var height = image.Height;
+ // var x = 0;
+ // var y = 0;
+
+ // var group = new DrawingGroup();
+
+ // var converted = ColorConverter.ConvertFromString(BackgroundColor);
+ // if (converted != null)
+ // {
+ // var color = (Color)converted;
+ // var brush = new SolidColorBrush(color);
+ // var pen = new Pen(brush, 1);
+ // var backgroundArea = new Rect(0, 0, width, width);
+ // var rectangle = new RectangleGeometry(backgroundArea);
+ // var rectDrawing = new GeometryDrawing(brush, pen, rectangle);
+ // group.Children.Add(rectDrawing);
+
+ // var imageArea = new Rect(x, y, image.Width, image.Height);
+ // var imageDrawing = new ImageDrawing(image, imageArea);
+ // group.Children.Add(imageDrawing);
+
+ // // http://stackoverflow.com/questions/6676072/get-system-drawing-bitmap-of-a-wpf-area-using-visualbrush
+ // var visual = new DrawingVisual();
+ // var context = visual.RenderOpen();
+ // context.DrawDrawing(group);
+ // context.Close();
+ // const int dpiScale100 = 96;
+ // var bitmap = new RenderTargetBitmap(
+ // Convert.ToInt32(width), Convert.ToInt32(height),
+ // dpiScale100, dpiScale100,
+ // PixelFormats.Pbgra32
+ // );
+ // bitmap.Render(visual);
+ // return bitmap;
+ // }
+ // else
+ // {
+ // ProgramLogger.LogException($"|UWP|PlatedImage|{Location}" +
+ // $"|Unable to convert background string {BackgroundColor} " +
+ // $"to color for {Location}", new InvalidOperationException());
+
+ // return new BitmapImage(new Uri(Constant.MissingImgIcon));
+ // }
+ // }
+ // else
+ // {
+ // // todo use windows theme as background
+ // return image;
+ // }
+ //}
+
+ #endregion
+
+ public override string ToString()
+ {
+ return $"{DisplayName}: {Description}";
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (obj is UWPApp other)
+ {
+ return UniqueIdentifier == other.UniqueIdentifier;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public override int GetHashCode()
+ {
+ return UniqueIdentifier.GetHashCode();
+ }
+ }
+}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
index 20f489c30..7d08d3670 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
@@ -16,14 +16,21 @@ using System.Threading.Channels;
using Flow.Launcher.Plugin.Program.Views.Models;
using IniParser;
using System.Windows.Input;
+using MemoryPack;
namespace Flow.Launcher.Plugin.Program.Programs
{
- [Serializable]
- public class Win32 : IProgram, IEquatable
+ [MemoryPackable]
+ public partial class Win32 : IProgram, IEquatable
{
public string Name { get; set; }
- public string UniqueIdentifier { get => _uid; set => _uid = value == null ? string.Empty : value.ToLowerInvariant(); } // For path comparison
+
+ public string UniqueIdentifier
+ {
+ get => _uid;
+ set => _uid = value == null ? string.Empty : value.ToLowerInvariant();
+ } // For path comparison
+
public string IcoPath { get; set; }
///
@@ -96,7 +103,8 @@ namespace Flow.Launcher.Plugin.Program.Programs
bool useLocalizedName = !string.IsNullOrEmpty(LocalizedName) && !Name.Equals(LocalizedName);
string resultName = useLocalizedName ? LocalizedName : Name;
- if (!Main._settings.EnableDescription || string.IsNullOrWhiteSpace(Description) || resultName.Equals(Description))
+ if (!Main._settings.EnableDescription || string.IsNullOrWhiteSpace(Description) ||
+ resultName.Equals(Description))
{
title = resultName;
matchResult = StringMatcher.FuzzySearch(query, resultName);
@@ -113,6 +121,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
{
descriptionMatch.MatchData[i] += resultName.Length + 2; // 2 is ": "
}
+
matchResult = descriptionMatch;
}
else
@@ -129,10 +138,12 @@ namespace Flow.Launcher.Plugin.Program.Programs
{
candidates.Add(ExecutableName);
}
+
if (useLocalizedName)
{
candidates.Add(Name);
}
+
matchResult = Match(query, candidates);
if (matchResult == null)
{
@@ -209,9 +220,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
{
var info = new ProcessStartInfo
{
- FileName = FullPath,
- WorkingDirectory = ParentDirectory,
- UseShellExecute = true
+ FileName = FullPath, WorkingDirectory = ParentDirectory, UseShellExecute = true
};
Task.Run(() => Main.StartProcess(ShellCommand.RunAsDifferentUser, info));
@@ -424,7 +433,8 @@ namespace Flow.Launcher.Plugin.Program.Programs
}
}
- private static IEnumerable EnumerateProgramsInDir(string directory, string[] suffixes, bool recursive = true)
+ private static IEnumerable EnumerateProgramsInDir(string directory, string[] suffixes,
+ bool recursive = true)
{
if (!Directory.Exists(directory))
return Enumerable.Empty();
@@ -448,7 +458,8 @@ namespace Flow.Launcher.Plugin.Program.Programs
}
}
- private static IEnumerable UnregisteredPrograms(List directories, string[] suffixes, string[] protocols)
+ private static IEnumerable UnregisteredPrograms(List directories, string[] suffixes,
+ string[] protocols)
{
// Disabled custom sources are not in DisabledProgramSources
var paths = directories.AsParallel()
@@ -466,14 +477,15 @@ namespace Flow.Launcher.Plugin.Program.Programs
.Distinct();
var startupPaths = GetStartupPaths();
-
+
var programs = ExceptDisabledSource(allPrograms)
.Where(x => !startupPaths.Any(startup => FilesFolders.PathContains(startup, x)))
.Select(x => GetProgramFromPath(x, protocols));
return programs;
}
- private static IEnumerable PATHPrograms(string[] suffixes, string[] protocols, List commonParents)
+ private static IEnumerable PATHPrograms(string[] suffixes, string[] protocols,
+ List commonParents)
{
var pathEnv = Environment.GetEnvironmentVariable("Path");
if (String.IsNullOrEmpty(pathEnv))
@@ -515,7 +527,8 @@ namespace Flow.Launcher.Plugin.Program.Programs
toFilter = toFilter.Distinct().Where(p => suffixes.Contains(Extension(p)));
var programs = ExceptDisabledSource(toFilter)
- .Select(x => GetProgramFromPath(x, protocols)).Where(x => x.Valid).ToList(); // ToList due to disposing issue
+ .Select(x => GetProgramFromPath(x, protocols)).Where(x => x.Valid)
+ .ToList(); // ToList due to disposing issue
return programs;
}
@@ -616,7 +629,10 @@ namespace Flow.Launcher.Plugin.Program.Programs
.SelectMany(g =>
{
// is shortcut and in start menu
- var startMenu = g.Where(g => g.LnkResolvedPath != null && startMenuPaths.Any(x => FilesFolders.PathContains(x, g.FullPath))).ToList();
+ var startMenu = g.Where(g =>
+ g.LnkResolvedPath != null &&
+ startMenuPaths.Any(x => FilesFolders.PathContains(x, g.FullPath)))
+ .ToList();
if (startMenu.Any())
return startMenu.Take(1);
@@ -756,6 +772,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
while (reader.TryRead(out _))
{
}
+
await Task.Run(Main.IndexWin32Programs);
}
}
@@ -766,6 +783,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
{
throw new ArgumentException("Path Not Exist");
}
+
var watcher = new FileSystemWatcher(directory);
watcher.Created += static (_, _) => indexQueue.Writer.TryWrite(default);
@@ -804,8 +822,10 @@ namespace Flow.Launcher.Plugin.Program.Programs
parents.Remove(source);
}
}
+
result.AddRange(parents.Select(x => x.Location));
}
+
return result.DistinctBy(x => x.ToLowerInvariant()).ToList();
}
}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
index 156f33ebc..9879993fe 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml.cs
@@ -87,9 +87,9 @@ namespace Flow.Launcher.Plugin.Program.Views
}
}
- public bool ShowUWPCheckbox => UWP.SupportUWP();
+ public bool ShowUWPCheckbox => UWPPackage.SupportUWP();
- public ProgramSetting(PluginInitContext context, Settings settings, Win32[] win32s, UWP.Application[] uwps)
+ public ProgramSetting(PluginInitContext context, Settings settings, Win32[] win32s, UWPApp[] uwps)
{
this.context = context;
_settings = settings;
@@ -149,9 +149,9 @@ namespace Flow.Launcher.Plugin.Program.Views
private void DeleteProgramSources(List itemsToDelete)
{
itemsToDelete.ForEach(t1 => _settings.ProgramSources
- .Remove(_settings.ProgramSources
- .Where(x => x.UniqueIdentifier == t1.UniqueIdentifier)
- .FirstOrDefault()));
+ .Remove(_settings.ProgramSources
+ .Where(x => x.UniqueIdentifier == t1.UniqueIdentifier)
+ .FirstOrDefault()));
itemsToDelete.ForEach(x => ProgramSettingDisplayList.Remove(x));
ReIndexing();
@@ -182,16 +182,20 @@ namespace Flow.Launcher.Plugin.Program.Views
{
if (selectedProgramSource.Enabled)
{
- ProgramSettingDisplay.SetProgramSourcesStatus(new List { selectedProgramSource }, true); // sync status in win32, uwp and disabled
+ ProgramSettingDisplay.SetProgramSourcesStatus(new List { selectedProgramSource },
+ true); // sync status in win32, uwp and disabled
ProgramSettingDisplay.RemoveDisabledFromSettings();
}
else
{
- ProgramSettingDisplay.SetProgramSourcesStatus(new List { selectedProgramSource }, false);
+ ProgramSettingDisplay.SetProgramSourcesStatus(new List { selectedProgramSource },
+ false);
ProgramSettingDisplay.StoreDisabledInSettings();
}
+
ReIndexing();
}
+
programSourceView.SelectedIndex = selectedIndex;
}
}
@@ -233,7 +237,8 @@ namespace Flow.Launcher.Plugin.Program.Views
foreach (string directory in directories)
{
if (Directory.Exists(directory)
- && !ProgramSettingDisplayList.Any(x => x.UniqueIdentifier.Equals(directory, System.StringComparison.OrdinalIgnoreCase)))
+ && !ProgramSettingDisplayList.Any(x =>
+ x.UniqueIdentifier.Equals(directory, System.StringComparison.OrdinalIgnoreCase)))
{
var source = new ProgramSource(directory);
@@ -262,8 +267,8 @@ namespace Flow.Launcher.Plugin.Program.Views
private void btnProgramSourceStatus_OnClick(object sender, RoutedEventArgs e)
{
var selectedItems = programSourceView
- .SelectedItems.Cast()
- .ToList();
+ .SelectedItems.Cast()
+ .ToList();
if (selectedItems.Count == 0)
{
@@ -274,7 +279,8 @@ namespace Flow.Launcher.Plugin.Program.Views
if (IsAllItemsUserAdded(selectedItems))
{
- var msg = string.Format(context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source"));
+ var msg = string.Format(
+ context.API.GetTranslation("flowlauncher_plugin_program_delete_program_source"));
if (MessageBox.Show(msg, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
{
@@ -364,8 +370,8 @@ namespace Flow.Launcher.Plugin.Program.Views
private void programSourceView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var selectedItems = programSourceView
- .SelectedItems.Cast()
- .ToList();
+ .SelectedItems.Cast()
+ .ToList();
if (IsAllItemsUserAdded(selectedItems))
{
@@ -400,7 +406,8 @@ namespace Flow.Launcher.Plugin.Program.Views
ListView listView = sender as ListView;
GridView gView = listView.View as GridView;
- var workingWidth = listView.ActualWidth - SystemParameters.VerticalScrollBarWidth; // take into account vertical scrollbar
+ var workingWidth =
+ listView.ActualWidth - SystemParameters.VerticalScrollBarWidth; // take into account vertical scrollbar
var col1 = 0.25;
var col2 = 0.15;
var col3 = 0.60;
From c18ae41e56f5b38ca4d702e58fa691e29ad7743d Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sun, 12 Nov 2023 11:42:13 +0800
Subject: [PATCH 065/177] Delete existing zip before downloading
---
.../PluginsManager.cs | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 3cfae97d5..00f77f872 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -143,6 +143,11 @@ namespace Flow.Launcher.Plugin.PluginsManager
try
{
+ if (File.Exists(filePath))
+ {
+ File.Delete(filePath);
+ }
+
await Http.DownloadAsync(plugin.UrlDownload, filePath).ConfigureAwait(false);
Install(plugin, filePath);
@@ -245,6 +250,11 @@ namespace Flow.Launcher.Plugin.PluginsManager
_ = Task.Run(async delegate
{
+ if (File.Exists(downloadToFilePath))
+ {
+ File.Delete(downloadToFilePath);
+ }
+
await Http.DownloadAsync(x.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
.ConfigureAwait(false);
From 439eebf6cb9f53c12caddc3a2348eaae6aac1402 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sun, 12 Nov 2023 12:34:38 +0800
Subject: [PATCH 066/177] Version bump 3.1.4
---
Plugins/Flow.Launcher.Plugin.Explorer/plugin.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json b/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json
index 7dfa1656c..53d4049e6 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json
@@ -10,7 +10,7 @@
"Name": "Explorer",
"Description": "Find and manage files and folders via Windows Search or Everything",
"Author": "Jeremy Wu",
- "Version": "3.1.3",
+ "Version": "3.1.4",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Explorer.dll",
From 6eecc614a8713f3f472d48e682e0afb97c13b6c8 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 13 Nov 2023 22:04:20 +0000
Subject: [PATCH 067/177] Bump JetBrains.Annotations from 2023.2.0 to 2023.3.0
Bumps [JetBrains.Annotations](https://github.com/JetBrains/JetBrains.Annotations) from 2023.2.0 to 2023.3.0.
- [Commits](https://github.com/JetBrains/JetBrains.Annotations/compare/v2023.2.0...2023.3)
---
updated-dependencies:
- dependency-name: JetBrains.Annotations
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index 1f28f5d32..76233c3a4 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -67,7 +67,7 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
From 7961ca14375effa978719b779861d324934df5fb Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 13 Nov 2023 22:04:26 +0000
Subject: [PATCH 068/177] Bump VirtualizingWrapPanel from 1.5.7 to 1.5.8
Bumps [VirtualizingWrapPanel](https://github.com/sbaeumlisberger/VirtualizingWrapPanel) from 1.5.7 to 1.5.8.
- [Release notes](https://github.com/sbaeumlisberger/VirtualizingWrapPanel/releases)
- [Commits](https://github.com/sbaeumlisberger/VirtualizingWrapPanel/compare/v1.5.7...v1.5.8)
---
updated-dependencies:
- dependency-name: VirtualizingWrapPanel
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Flow.Launcher/Flow.Launcher.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj
index e7b35e689..53c1bafc7 100644
--- a/Flow.Launcher/Flow.Launcher.csproj
+++ b/Flow.Launcher/Flow.Launcher.csproj
@@ -96,7 +96,7 @@
-
+
From 3ec27edf75fc70fecc9d8d2865fc0f5c9579f557 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sat, 18 Nov 2023 14:22:54 -0600
Subject: [PATCH 069/177] Use ConcurrentDictionary for JsonRPC Settings
---
Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index b87623c56..fd73a44cd 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
@@ -16,10 +17,10 @@ namespace Flow.Launcher.Core.Plugin
public Dictionary SettingControls { get; } = new();
public IReadOnlyDictionary Inner => Settings;
- protected Dictionary Settings { get; set; }
+ protected ConcurrentDictionary Settings { get; set; }
public required IPublicAPI API { get; init; }
- private JsonStorage> _storage;
+ private JsonStorage> _storage;
// maybe move to resource?
private static readonly Thickness settingControlMargin = new(0, 9, 18, 9);
@@ -33,7 +34,7 @@ namespace Flow.Launcher.Core.Plugin
public async Task InitializeAsync()
{
- _storage = new JsonStorage>(SettingPath);
+ _storage = new JsonStorage>(SettingPath);
Settings = await _storage.LoadAsync();
foreach (var (type, attributes) in Configuration.Body)
From 1cafae827889ac0520cd16e06512d447e3bcf604 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Sat, 18 Nov 2023 18:43:17 -0500
Subject: [PATCH 070/177] Allow nullable for Configuration
---
Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index b87623c56..1b14597a4 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -10,7 +10,7 @@ namespace Flow.Launcher.Core.Plugin
{
public class JsonRPCPluginSettings
{
- public required JsonRpcConfigurationModel Configuration { get; init; }
+ public required JsonRpcConfigurationModel? Configuration { get; init; }
public required string SettingPath { get; init; }
public Dictionary SettingControls { get; } = new();
From 93100c0330b19d4861d6bb466f7468b8405866b6 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Sat, 18 Nov 2023 18:43:42 -0500
Subject: [PATCH 071/177] Remove missing template file short circuit logic
---
Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs | 2 --
1 file changed, 2 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
index 330120c12..197932f04 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
@@ -126,8 +126,6 @@ namespace Flow.Launcher.Core.Plugin
private async Task InitSettingAsync()
{
- if (!File.Exists(SettingConfigurationPath))
- return;
var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance)
.Build();
From b67e815022416cc30b8aae926ef9216a08eecfa7 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Sat, 18 Nov 2023 18:44:01 -0500
Subject: [PATCH 072/177] Load template file only if exists
---
Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
index 197932f04..c6b56c81d 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
@@ -126,12 +126,15 @@ namespace Flow.Launcher.Core.Plugin
private async Task InitSettingAsync()
{
+ JsonRpcConfigurationModel configuration = null;
+ if (File.Exists(SettingConfigurationPath))
+ {
+ var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
+ configuration =
+ deserializer.Deserialize(
+ await File.ReadAllTextAsync(SettingConfigurationPath));
+ }
- var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance)
- .Build();
- var configuration =
- deserializer.Deserialize(
- await File.ReadAllTextAsync(SettingConfigurationPath));
Settings ??= new JsonRPCPluginSettings
{
From 388688e89c26d74490ac377e17f41a2b7765241e Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Sat, 18 Nov 2023 18:44:27 -0500
Subject: [PATCH 073/177] Short circuit template UI process if doesn't exist
---
Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index 1b14597a4..e26f5e7a7 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -36,6 +36,11 @@ namespace Flow.Launcher.Core.Plugin
_storage = new JsonStorage>(SettingPath);
Settings = await _storage.LoadAsync();
+ if (Settings != null)
+ {
+ return;
+ }
+
foreach (var (type, attributes) in Configuration.Body)
{
if (attributes.Name == null)
From ba9aba2bff27a94810496be498271d244bf1538c Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Sat, 18 Nov 2023 18:45:16 -0500
Subject: [PATCH 074/177] Allow new setting keys to be instantiated
---
Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index e26f5e7a7..842a91919 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -63,10 +63,7 @@ namespace Flow.Launcher.Core.Plugin
foreach (var (key, value) in settings)
{
- if (Settings.ContainsKey(key))
- {
- Settings[key] = value;
- }
+ Settings[key] = value;
if (SettingControls.TryGetValue(key, out var control))
{
From 5c90946a6ee99df8973096fdba3d8d69b7b3617b Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Sat, 18 Nov 2023 18:45:24 -0500
Subject: [PATCH 075/177] Save to file on update
---
Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index 842a91919..06d9f8dec 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -83,6 +83,7 @@ namespace Flow.Launcher.Core.Plugin
break;
}
}
+ Save();
}
}
From ab7685e9ea9bf58a4f1bf3c519ca7cebd1ca1880 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Sat, 18 Nov 2023 21:45:06 -0500
Subject: [PATCH 076/177] Show a result error instead of popping up dialog
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index f8c9a3f17..31ded2baf 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -210,7 +210,18 @@ namespace Flow.Launcher.Core.Plugin
}
catch (Exception e)
{
- throw new FlowPluginException(metadata, e);
+ Result r = new()
+ {
+ Title = $"{metadata.Name}: {e.GetType().Name}",
+ SubTitle = "ERROR: There was an error loading this plugin!",
+ IcoPath = "Images\\app_error.png",
+ PluginDirectory = metadata.PluginDirectory,
+ ActionKeywordAssigned = query.ActionKeyword,
+ PluginID = metadata.ID,
+ OriginQuery = query,
+ Action = _ => { throw new FlowPluginException(metadata, e);}
+ };
+ results.Add(r);
}
return results;
}
From a86e7bcaa9ed3e9a0b456bea6708f0e8b24e1442 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Sat, 18 Nov 2023 23:15:39 -0500
Subject: [PATCH 077/177] Remove save function from loop
---
Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index 06d9f8dec..43215bdd5 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -83,8 +83,8 @@ namespace Flow.Launcher.Core.Plugin
break;
}
}
- Save();
}
+ Save();
}
public async Task SaveAsync()
From 798d30ea27aa24da41e569da4b4d21bd76e36a3d Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sun, 19 Nov 2023 17:04:29 +0800
Subject: [PATCH 078/177] Ignore modifier key when using key + number to launch
result
- close #2191
- close #2425
---
Flow.Launcher/ViewModel/MainViewModel.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index c832c258d..7dcd2f4d2 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -285,7 +285,8 @@ namespace Flow.Launcher.ViewModel
}
var hideWindow = await result.ExecuteAsync(new ActionContext
{
- SpecialKeyState = GlobalHotkey.CheckModifiers()
+ // not null means pressing modifier key + number, should ignore the modifier key
+ SpecialKeyState = index is not null ? new SpecialKeyState() : GlobalHotkey.CheckModifiers()
})
.ConfigureAwait(false);
From b63c4eb2bfea0e80d1d0ac7e21f2e16e558a1686 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Sun, 19 Nov 2023 09:11:27 -0500
Subject: [PATCH 079/177] Revert SettingsChanges to SettingsChange for
backwards compatibility
---
Flow.Launcher.Core/Plugin/JsonPRCModel.cs | 2 +-
Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
index 48606eea4..5b2a9f6cb 100644
--- a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
+++ b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs
@@ -25,7 +25,7 @@ namespace Flow.Launcher.Core.Plugin
public record JsonRPCResponseModel(int Id, JsonRPCErrorModel Error = default) : JsonRPCBase(Id, Error);
public record JsonRPCQueryResponseModel(int Id,
[property: JsonPropertyName("result")] List Result,
- IReadOnlyDictionary SettingsChanges = null,
+ IReadOnlyDictionary SettingsChange = null,
string DebugMessage = "",
JsonRPCErrorModel Error = default) : JsonRPCResponseModel(Id, Error);
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
index 330120c12..b0075c8f0 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginBase.cs
@@ -94,7 +94,7 @@ namespace Flow.Launcher.Core.Plugin
results.AddRange(queryResponseModel.Result);
- Settings?.UpdateSettings(queryResponseModel.SettingsChanges);
+ Settings?.UpdateSettings(queryResponseModel.SettingsChange);
return results;
}
From 57b78b5797850c04317f2b6e313ded170a5bc16a Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Sun, 19 Nov 2023 17:07:29 +0100
Subject: [PATCH 080/177] Fix merge
Signed-off-by: Florian Grabmeier
---
.../Languages/en.xaml | 2 ++
.../PluginsManager.cs | 17 +++++++++++++++++
2 files changed, 19 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
index 42a1ac9b8..cc2360edf 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
@@ -30,6 +30,8 @@
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update All Plugins
+ Would you like to update all plugins?
Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 00f77f872..03802ff9e 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -296,6 +296,23 @@ namespace Flow.Launcher.Plugin.PluginsManager
}
});
+ if (resultsForUpdate.Count() > 1)
+ {
+ var updateAllResult = new Result
+ {
+ Title = Context.API.GetTranslation("plugin_pluginsmanager_update_all_title"),
+ SubTitle = Context.API.GetTranslation("plugin_pluginsmanager_update_all_subtitle"),
+ IcoPath = icoPath,
+ Action = e =>
+ {
+ // TODO: logic here
+ return true;
+ },
+ ContextData = new UserPlugin()
+ };
+ results = results.Prepend(updateAllResult);
+ }
+
return Search(results, search);
}
From 6625e911829a42c0d4115ef6a8c5db2dad8438df Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Mon, 20 Nov 2023 23:20:59 +0800
Subject: [PATCH 081/177] Use default SpecialKeyState
---
Flow.Launcher.Plugin/ActionContext.cs | 7 +++++++
Flow.Launcher/ViewModel/MainViewModel.cs | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher.Plugin/ActionContext.cs b/Flow.Launcher.Plugin/ActionContext.cs
index d6ba4894e..e31c8e31d 100644
--- a/Flow.Launcher.Plugin/ActionContext.cs
+++ b/Flow.Launcher.Plugin/ActionContext.cs
@@ -50,5 +50,12 @@ namespace Flow.Launcher.Plugin
(AltPressed ? ModifierKeys.Alt : ModifierKeys.None) |
(WinPressed ? ModifierKeys.Windows : ModifierKeys.None);
}
+
+ public static readonly SpecialKeyState Default = new () {
+ CtrlPressed = false,
+ ShiftPressed = false,
+ AltPressed = false,
+ WinPressed = false
+ };
}
}
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 7dcd2f4d2..61bf0c4dc 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -286,7 +286,7 @@ namespace Flow.Launcher.ViewModel
var hideWindow = await result.ExecuteAsync(new ActionContext
{
// not null means pressing modifier key + number, should ignore the modifier key
- SpecialKeyState = index is not null ? new SpecialKeyState() : GlobalHotkey.CheckModifiers()
+ SpecialKeyState = index is not null ? SpecialKeyState.Default : GlobalHotkey.CheckModifiers()
})
.ConfigureAwait(false);
From bf1e451351529ae4a65598faa0da6a9f376f4de7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 20 Nov 2023 22:19:24 +0000
Subject: [PATCH 082/177] Bump System.Drawing.Common from 7.0.0 to 8.0.0
Bumps [System.Drawing.Common](https://github.com/dotnet/winforms) from 7.0.0 to 8.0.0.
- [Release notes](https://github.com/dotnet/winforms/releases)
- [Changelog](https://github.com/dotnet/winforms/blob/main/docs/release-activity.md)
- [Commits](https://github.com/dotnet/winforms/commits/v8.0.0)
---
updated-dependencies:
- dependency-name: System.Drawing.Common
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.../Flow.Launcher.Infrastructure.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 2f5259039..8124a95de 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -58,7 +58,7 @@
-
+
From 6a302c928a3c15d5a97d00e69569413db7650f94 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 20 Nov 2023 22:19:33 +0000
Subject: [PATCH 083/177] Bump Microsoft.NET.Test.Sdk from 17.7.2 to 17.8.0
Bumps [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 17.7.2 to 17.8.0.
- [Release notes](https://github.com/microsoft/vstest/releases)
- [Changelog](https://github.com/microsoft/vstest/blob/main/docs/releases.md)
- [Commits](https://github.com/microsoft/vstest/compare/v17.7.2...v17.8.0)
---
updated-dependencies:
- dependency-name: Microsoft.NET.Test.Sdk
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
Flow.Launcher.Test/Flow.Launcher.Test.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Test/Flow.Launcher.Test.csproj b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
index c662fdeff..29414baa6 100644
--- a/Flow.Launcher.Test/Flow.Launcher.Test.csproj
+++ b/Flow.Launcher.Test/Flow.Launcher.Test.csproj
@@ -54,7 +54,7 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
\ No newline at end of file
From a04bcce91e3dfbbfb98de891a118f0e1375c2a75 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 20 Nov 2023 22:19:39 +0000
Subject: [PATCH 084/177] Bump Microsoft.Data.Sqlite from 7.0.13 to 8.0.0
Bumps [Microsoft.Data.Sqlite](https://github.com/dotnet/efcore) from 7.0.13 to 8.0.0.
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v7.0.13...v8.0.0)
---
updated-dependencies:
- dependency-name: Microsoft.Data.Sqlite
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index edaa3dd29..4ce8584fc 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -56,7 +56,7 @@
-
+
\ No newline at end of file
From cb59b6b2645753847ed2e91d8dd6044455bf8b0f Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 22 Nov 2023 14:25:17 +0100
Subject: [PATCH 085/177] Implemet basic update all logic
Signed-off-by: Florian Grabmeier
---
.../PluginsManager.cs | 77 +++++++++++++++++--
1 file changed, 71 insertions(+), 6 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 03802ff9e..159950ac2 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -7,6 +7,7 @@ using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin.SharedCommands;
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
@@ -167,7 +168,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
Log.Exception("PluginsManager", "An error occurred while downloading plugin", e);
return;
}
-
+
if (Settings.AutoRestartAfterChanging)
{
Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_installing_plugin"),
@@ -292,7 +293,8 @@ namespace Flow.Launcher.Plugin.PluginsManager
ContextData =
new UserPlugin
{
- Website = x.PluginNewUserPlugin.Website, UrlSourceCode = x.PluginNewUserPlugin.UrlSourceCode
+ Website = x.PluginNewUserPlugin.Website,
+ UrlSourceCode = x.PluginNewUserPlugin.UrlSourceCode
}
});
@@ -305,8 +307,70 @@ namespace Flow.Launcher.Plugin.PluginsManager
IcoPath = icoPath,
Action = e =>
{
- // TODO: logic here
- return true;
+ string message;
+ //TODO: display all plugins to be updated in the message
+ if (/*Settings.AutoRestartAfterChanging*/ false) // TODO: remove false
+ {
+ message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_subtitle"), "FlowLauncher will restart after updating all plugins.",
+ Environment.NewLine, Environment.NewLine);
+ }
+ else
+ {
+ message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_subtitle"),
+ Environment.NewLine);
+ }
+ if (MessageBox.Show(message,
+ Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ {
+ Debug.Print("Looping through plugins to update");
+ foreach (var plugin in resultsForUpdate)
+ {
+ Debug.Print($"Updating {plugin.Name}");
+ var downloadToFilePath = Path.Combine(Path.GetTempPath(),
+ $"{plugin.Name}-{plugin.NewVersion}.zip");
+
+ _ = Task.Run(async delegate
+ {
+ if (File.Exists(downloadToFilePath))
+ {
+ File.Delete(downloadToFilePath);
+ }
+
+ await Http.DownloadAsync(plugin.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
+ .ConfigureAwait(false);
+
+ PluginManager.UpdatePlugin(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, downloadToFilePath);
+
+ //TODO: fix
+ // if (Settings.AutoRestartAfterChanging)
+ // {
+ // Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ // string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_restart"),
+ // x.Name));
+ // Context.API.RestartApp();
+ // }
+ // else
+ // {
+ // Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ // string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_no_restart"),
+ // x.Name));
+ // }
+ }).ContinueWith(t =>
+ {
+ Log.Exception("PluginsManager", $"Update failed for {plugin.Name}",
+ t.Exception.InnerException);
+ Context.API.ShowMsg(
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
+ string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
+ plugin.Name));
+ }, TaskContinuationOptions.OnlyOnFaulted);
+ }
+ Debug.Print("Finished updating all plugins");
+ return true; // User confirmed to update all plugins
+ }
+ return false; //user cancelled
},
ContextData = new UserPlugin()
};
@@ -454,7 +518,8 @@ namespace Flow.Launcher.Plugin.PluginsManager
string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_duplicate"), plugin.Name));
Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
}
- catch (ArgumentException e) {
+ catch (ArgumentException e)
+ {
Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"), plugin.Name));
Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
@@ -518,7 +583,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
try
{
- PluginManager.UninstallPlugin(plugin, removeSettings:true);
+ PluginManager.UninstallPlugin(plugin, removeSettings: true);
}
catch (ArgumentException e)
{
From 8180c1cd40ea5410a3a3b6f5df8ddf34dc690470 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 22 Nov 2023 14:49:43 +0100
Subject: [PATCH 086/177] Display correct messages
Signed-off-by: Florian Grabmeier
---
.../Languages/en.xaml | 2 +-
.../PluginsManager.cs | 46 +++++++++----------
2 files changed, 22 insertions(+), 26 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
index cc2360edf..99daa40f3 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
@@ -30,7 +30,7 @@
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
- Update All Plugins
+ Update all plugins
Would you like to update all plugins?
Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 159950ac2..57f252e4c 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -308,25 +308,21 @@ namespace Flow.Launcher.Plugin.PluginsManager
Action = e =>
{
string message;
- //TODO: display all plugins to be updated in the message
- if (/*Settings.AutoRestartAfterChanging*/ false) // TODO: remove false
+ if (Settings.AutoRestartAfterChanging)
{
- message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_subtitle"), "FlowLauncher will restart after updating all plugins.",
- Environment.NewLine, Environment.NewLine);
+ message = "Would you like to update all plugins?\nFlowLauncher will restart after updating all plugins.\n";
}
else
{
- message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_subtitle"),
- Environment.NewLine);
+ message = "Would you like to update all plugins?\nFlowLauncher will restart after updating all plugins.\n";
}
+
if (MessageBox.Show(message,
Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
- Debug.Print("Looping through plugins to update");
foreach (var plugin in resultsForUpdate)
{
- Debug.Print($"Updating {plugin.Name}");
var downloadToFilePath = Path.Combine(Path.GetTempPath(),
$"{plugin.Name}-{plugin.NewVersion}.zip");
@@ -342,20 +338,6 @@ namespace Flow.Launcher.Plugin.PluginsManager
PluginManager.UpdatePlugin(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, downloadToFilePath);
- //TODO: fix
- // if (Settings.AutoRestartAfterChanging)
- // {
- // Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- // string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_restart"),
- // x.Name));
- // Context.API.RestartApp();
- // }
- // else
- // {
- // Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- // string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_no_restart"),
- // x.Name));
- // }
}).ContinueWith(t =>
{
Log.Exception("PluginsManager", $"Update failed for {plugin.Name}",
@@ -367,10 +349,24 @@ namespace Flow.Launcher.Plugin.PluginsManager
plugin.Name));
}, TaskContinuationOptions.OnlyOnFaulted);
}
- Debug.Print("Finished updating all plugins");
- return true; // User confirmed to update all plugins
+
+ if (Settings.AutoRestartAfterChanging)
+ {
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_restart"),
+ "all"));
+ Context.API.RestartApp();
+ }
+ else
+ {
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_no_restart"),
+ "all"));
+ }
+
+ return true;
}
- return false; //user cancelled
+ return false;
},
ContextData = new UserPlugin()
};
From a3b9a4f9d01e64c5deb6b9425d07d58426fe86c5 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 22 Nov 2023 14:55:53 +0100
Subject: [PATCH 087/177] Run updates in parallel
Signed-off-by: Florian Grabmeier
---
.../PluginsManager.cs | 41 +++++++++----------
1 file changed, 20 insertions(+), 21 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 57f252e4c..e57530270 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -321,34 +321,33 @@ namespace Flow.Launcher.Plugin.PluginsManager
Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
- foreach (var plugin in resultsForUpdate)
+ Parallel.ForEach(resultsForUpdate, plugin =>
{
- var downloadToFilePath = Path.Combine(Path.GetTempPath(),
- $"{plugin.Name}-{plugin.NewVersion}.zip");
+ var downloadToFilePath = Path.Combine(Path.GetTempPath(), $"{plugin.Name}-{plugin.NewVersion}.zip");
_ = Task.Run(async delegate
+ {
+ if (File.Exists(downloadToFilePath))
{
- if (File.Exists(downloadToFilePath))
- {
- File.Delete(downloadToFilePath);
- }
+ File.Delete(downloadToFilePath);
+ }
- await Http.DownloadAsync(plugin.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
- .ConfigureAwait(false);
+ await Http.DownloadAsync(plugin.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
+ .ConfigureAwait(false);
- PluginManager.UpdatePlugin(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, downloadToFilePath);
+ PluginManager.UpdatePlugin(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, downloadToFilePath);
- }).ContinueWith(t =>
- {
- Log.Exception("PluginsManager", $"Update failed for {plugin.Name}",
- t.Exception.InnerException);
- Context.API.ShowMsg(
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
- string.Format(
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
- plugin.Name));
- }, TaskContinuationOptions.OnlyOnFaulted);
- }
+ }).ContinueWith(t =>
+ {
+ Log.Exception("PluginsManager", $"Update failed for {plugin.Name}",
+ t.Exception.InnerException);
+ Context.API.ShowMsg(
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
+ string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
+ plugin.Name));
+ }, TaskContinuationOptions.OnlyOnFaulted);
+ });
if (Settings.AutoRestartAfterChanging)
{
From 4ed1c3c442e724b17551ad3ad3095cd21d7cd599 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Thu, 23 Nov 2023 08:53:47 +0100
Subject: [PATCH 088/177] Update prompts
Signed-off-by: Florian Grabmeier
---
.../Languages/en.xaml | 4 ++++
.../PluginsManager.cs | 14 ++++++++------
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
index 99daa40f3..004d81e8b 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
@@ -32,6 +32,9 @@
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
Update all plugins
Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}FlowLauncher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
@@ -39,6 +42,7 @@
Plugin {0} successfully installed. Please restart Flow.
Plugin {0} successfully uninstalled. Please restart Flow.
Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
Plugin {0} has already been modified. Please restart Flow before making any further changes.
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index e57530270..88ad8ed32 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -310,11 +310,13 @@ namespace Flow.Launcher.Plugin.PluginsManager
string message;
if (Settings.AutoRestartAfterChanging)
{
- message = "Would you like to update all plugins?\nFlowLauncher will restart after updating all plugins.\n";
+ message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_prompt"),
+ resultsForUpdate.Count(), Environment.NewLine);
}
else
{
- message = "Would you like to update all plugins?\nFlowLauncher will restart after updating all plugins.\n";
+ message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_prompt_no_restart"),
+ resultsForUpdate.Count());
}
if (MessageBox.Show(message,
@@ -352,15 +354,15 @@ namespace Flow.Launcher.Plugin.PluginsManager
if (Settings.AutoRestartAfterChanging)
{
Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_restart"),
- "all"));
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_success_restart"),
+ resultsForUpdate.Count()));
Context.API.RestartApp();
}
else
{
Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_no_restart"),
- "all"));
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_success_no_restart"),
+ resultsForUpdate.Count()));
}
return true;
From 6e385a3d7c622e438afd0747a690b11e634ab739 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 25 Nov 2023 01:20:43 +0800
Subject: [PATCH 089/177] Revert "Bump System.Drawing.Common from 7.0.0 to
8.0.0"
---
.../Flow.Launcher.Infrastructure.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
index 8124a95de..2f5259039 100644
--- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
+++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
@@ -58,7 +58,7 @@
-
+
From a84e509aabbb726c81bf547d0ea48d35df933caa Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Fri, 24 Nov 2023 13:15:17 -0500
Subject: [PATCH 090/177] Use proper error icon constant
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index 31ded2baf..a297de63e 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -214,7 +214,7 @@ namespace Flow.Launcher.Core.Plugin
{
Title = $"{metadata.Name}: {e.GetType().Name}",
SubTitle = "ERROR: There was an error loading this plugin!",
- IcoPath = "Images\\app_error.png",
+ IcoPath = Flow.Launcher.Infrastructure.Constant.ErrorIcon,
PluginDirectory = metadata.PluginDirectory,
ActionKeywordAssigned = query.ActionKeyword,
PluginID = metadata.ID,
From 0e226d7a5b60f61b5bc68d6c72647bd1050334f1 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Fri, 24 Nov 2023 13:15:29 -0500
Subject: [PATCH 091/177] Reword title and subtitle
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index a297de63e..7454b5a94 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -212,8 +212,8 @@ namespace Flow.Launcher.Core.Plugin
{
Result r = new()
{
- Title = $"{metadata.Name}: {e.GetType().Name}",
- SubTitle = "ERROR: There was an error loading this plugin!",
+ Title = $"{metadata.Name}: Failed to respond!",
+ SubTitle = "Select this result for more info",
IcoPath = Flow.Launcher.Infrastructure.Constant.ErrorIcon,
PluginDirectory = metadata.PluginDirectory,
ActionKeywordAssigned = query.ActionKeyword,
From f684883d7250996dd8656e40b711697d875ad4d8 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Fri, 24 Nov 2023 13:15:58 -0500
Subject: [PATCH 092/177] Insure result is never in front of relevant results
---
Flow.Launcher.Core/Plugin/PluginManager.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs
index 7454b5a94..eec906807 100644
--- a/Flow.Launcher.Core/Plugin/PluginManager.cs
+++ b/Flow.Launcher.Core/Plugin/PluginManager.cs
@@ -219,7 +219,8 @@ namespace Flow.Launcher.Core.Plugin
ActionKeywordAssigned = query.ActionKeyword,
PluginID = metadata.ID,
OriginQuery = query,
- Action = _ => { throw new FlowPluginException(metadata, e);}
+ Action = _ => { throw new FlowPluginException(metadata, e);},
+ Score = -100
};
results.Add(r);
}
From fd9e8a59e116a8eb53dc1126066287c8cd803be7 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sat, 25 Nov 2023 23:57:05 -0600
Subject: [PATCH 093/177] fix build
---
Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
index 3fb22b39d..654897cc5 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
@@ -214,7 +214,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
catch (Exception e)
{
ProgramLogger.LogException($"|UWP|All|{p.InstalledLocation}|An unexpected error occurred and unable to convert Package to UWP for {p.Id.FullName}", e);
- return Array.Empty();
+ return Array.Empty();
}
#endif
#if DEBUG //make developer aware and implement handling
From 44fb863f075a4227b3d4b026340ab9d90040b270 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sun, 26 Nov 2023 09:33:34 -0600
Subject: [PATCH 094/177] minor fix jsonrpc errorstream and expect.txt
---
.github/actions/spelling/expect.txt | 4 ----
Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs | 4 +++-
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
index d0fee9559..f2be7fb3b 100644
--- a/.github/actions/spelling/expect.txt
+++ b/.github/actions/spelling/expect.txt
@@ -1,7 +1,6 @@
crowdin
DWM
workflows
-Wpf
wpf
actionkeyword
stackoverflow
@@ -20,9 +19,7 @@ Prioritise
Segoe
Google
Customise
-UWP
uwp
-Uwp
Bokmal
Bokm
uninstallation
@@ -61,7 +58,6 @@ popup
ptr
pluginindicator
TobiasSekan
-Img
img
resx
bak
diff --git a/Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs b/Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs
index 24d06d975..a476f06e9 100644
--- a/Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/ProcessStreamPluginV2.cs
@@ -17,7 +17,7 @@ namespace Flow.Launcher.Core.Plugin
protected abstract ProcessStartInfo StartInfo { get; set; }
- public Process ClientProcess { get; set; }
+ protected Process ClientProcess { get; set; }
public override async Task InitAsync(PluginInitContext context)
{
@@ -33,6 +33,8 @@ namespace Flow.Launcher.Core.Plugin
SetupPipe(ClientProcess);
+ ErrorStream = ClientProcess.StandardError;
+
await base.InitAsync(context);
}
From 1bd16cccaf67ceeafb6bf76febfd2348a2e0fcd4 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sun, 26 Nov 2023 09:37:43 -0600
Subject: [PATCH 095/177] remove duplicate expect
---
.github/actions/spelling/expect.txt | 2 --
1 file changed, 2 deletions(-)
diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
index f2be7fb3b..0d4dde36b 100644
--- a/.github/actions/spelling/expect.txt
+++ b/.github/actions/spelling/expect.txt
@@ -74,7 +74,6 @@ WCA_ACCENT_POLICY
HGlobal
dopusrt
firefox
-Firefox
msedge
svgc
ime
@@ -83,7 +82,6 @@ txb
btn
otf
searchplugin
-Noresult
wpftk
mkv
flac
From c8753b29ec4f8001b1743fdb960bef4105dcf526 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Mon, 27 Nov 2023 21:50:23 +0800
Subject: [PATCH 096/177] Set default value of `AutoRestartAfterChanging` to
`true`
---
Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
index f23ff71f0..811bec50c 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Settings.cs
@@ -10,6 +10,6 @@
public bool WarnFromUnknownSource { get; set; } = true;
- public bool AutoRestartAfterChanging { get; set; } = false;
+ public bool AutoRestartAfterChanging { get; set; } = true;
}
}
From 44af8e59f9b319c345cbc09f9bd900a8df52011a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 27 Nov 2023 23:00:55 +0000
Subject: [PATCH 097/177] Bump System.Data.OleDb from 7.0.0 to 8.0.0
Bumps [System.Data.OleDb](https://github.com/dotnet/runtime) from 7.0.0 to 8.0.0.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v7.0.0...v8.0.0)
---
updated-dependencies:
- dependency-name: System.Data.OleDb
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.../Flow.Launcher.Plugin.Explorer.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
index 1c0bdaad7..6d1497327 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj
@@ -45,7 +45,7 @@
-
+
From 86b81f16e46089cb1976d1bc05712b9201225765 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 4 Dec 2023 22:58:51 +0000
Subject: [PATCH 098/177] Bump actions/setup-dotnet from 3 to 4
Bumps [actions/setup-dotnet](https://github.com/actions/setup-dotnet) from 3 to 4.
- [Release notes](https://github.com/actions/setup-dotnet/releases)
- [Commits](https://github.com/actions/setup-dotnet/compare/v3...v4)
---
updated-dependencies:
- dependency-name: actions/setup-dotnet
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/default_plugins.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/default_plugins.yml b/.github/workflows/default_plugins.yml
index 8000c5456..a2283defe 100644
--- a/.github/workflows/default_plugins.yml
+++ b/.github/workflows/default_plugins.yml
@@ -13,7 +13,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Setup .NET
- uses: actions/setup-dotnet@v3
+ uses: actions/setup-dotnet@v4
with:
dotnet-version: 7.0.x
From 7a603f5504b22edd4b959a7b81fef5ff47afc692 Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Wed, 6 Dec 2023 22:42:24 +0800
Subject: [PATCH 099/177] Fix spell check
- fix crash
- fix missing dict
---
.github/actions/spelling/expect.txt | 4 +++-
.github/actions/spelling/patterns.txt | 3 +++
.github/workflows/spelling.yml | 7 +++----
3 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
index 0d4dde36b..8e29be550 100644
--- a/.github/actions/spelling/expect.txt
+++ b/.github/actions/spelling/expect.txt
@@ -102,4 +102,6 @@ Preinstalled
errormetadatafile
noresult
pluginsmanager
-alreadyexists
\ No newline at end of file
+alreadyexists
+JsonRPC
+JsonRPCV2
diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt
index 903714aef..f29f57ad5 100644
--- a/.github/actions/spelling/patterns.txt
+++ b/.github/actions/spelling/patterns.txt
@@ -118,3 +118,6 @@
# UWP
[Uu][Ww][Pp]
+
+# version suffix v#
+(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_]))
diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml
index 97d3cccb3..7aaa9296a 100644
--- a/.github/workflows/spelling.yml
+++ b/.github/workflows/spelling.yml
@@ -73,7 +73,7 @@ jobs:
steps:
- name: check-spelling
id: spelling
- uses: check-spelling/check-spelling@v0.0.22
+ uses: check-spelling/check-spelling@prerelease
with:
suppress_push_for_open_pull_request: 1
checkout: true
@@ -91,10 +91,9 @@ jobs:
extra_dictionaries:
cspell:software-terms/dict/softwareTerms.txt
cspell:win32/src/win32.txt
- cspell:php/src/php.txt
cspell:filetypes/filetypes.txt
cspell:csharp/csharp.txt
- cspell:dotnet/src/dotnet.txt
+ cspell:dotnet/dict/dotnet.txt
cspell:python/src/common/extra.txt
cspell:python/src/python/python-lib.txt
cspell:aws/aws.txt
@@ -130,7 +129,7 @@ jobs:
if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request')
steps:
- name: comment
- uses: check-spelling/check-spelling@v0.0.22
+ uses: check-spelling/check-spelling@prerelease
with:
checkout: true
spell_check_this: check-spelling/spell-check-this@main
From a9e1cdffd51a2041953f11f6a279ab5bef437152 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 7 Dec 2023 22:15:29 +0000
Subject: [PATCH 100/177] Bump actions/stale from 8 to 9
Bumps [actions/stale](https://github.com/actions/stale) from 8 to 9.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v8...v9)
---
updated-dependencies:
- dependency-name: actions/stale
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/stale.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index caac10c93..dd3fb2fca 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -13,7 +13,7 @@ jobs:
issues: write
pull-requests: write
steps:
- - uses: actions/stale@v8
+ - uses: actions/stale@v9
with:
stale-issue-message: 'This issue is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
days-before-stale: 45
From bdc9d02f93021c0aaf107638d1d4a2ddbb76650d Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Sun, 10 Dec 2023 02:26:43 -0600
Subject: [PATCH 101/177] update StreamJsonRPC, use System.Text.Json and apply
serialization Option to the formatter; fix empty setting still trigger
setting initialization
---
Flow.Launcher.Core/Flow.Launcher.Core.csproj | 2 +-
.../Plugin/JsonRPCPluginSettings.cs | 52 +++++++++----------
Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs | 8 ++-
3 files changed, 28 insertions(+), 34 deletions(-)
diff --git a/Flow.Launcher.Core/Flow.Launcher.Core.csproj b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
index 312dfdd9e..5cd09d407 100644
--- a/Flow.Launcher.Core/Flow.Launcher.Core.csproj
+++ b/Flow.Launcher.Core/Flow.Launcher.Core.csproj
@@ -57,7 +57,7 @@
-
+
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
index 3ffac1343..3848af6a4 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginSettings.cs
@@ -15,11 +15,11 @@ namespace Flow.Launcher.Core.Plugin
public required string SettingPath { get; init; }
public Dictionary SettingControls { get; } = new();
-
+
public IReadOnlyDictionary Inner => Settings;
protected ConcurrentDictionary Settings { get; set; }
public required IPublicAPI API { get; init; }
-
+
private JsonStorage> _storage;
// maybe move to resource?
@@ -37,18 +37,18 @@ namespace Flow.Launcher.Core.Plugin
_storage = new JsonStorage>(SettingPath);
Settings = await _storage.LoadAsync();
- if (Settings != null)
+ if (Settings != null || Configuration == null)
{
return;
}
- foreach (var (type, attributes) in Configuration.Body)
+ foreach (var (type, attributes) in Configuration.Body)
{
if (attributes.Name == null)
{
continue;
}
-
+
if (!Settings.ContainsKey(attributes.Name))
{
Settings[attributes.Name] = attributes.DefaultValue;
@@ -56,7 +56,7 @@ namespace Flow.Launcher.Core.Plugin
}
}
-
+
public void UpdateSettings(IReadOnlyDictionary settings)
{
if (settings == null || settings.Count == 0)
@@ -80,34 +80,35 @@ namespace Flow.Launcher.Core.Plugin
comboBox.Dispatcher.Invoke(() => comboBox.SelectedItem = value);
break;
case CheckBox checkBox:
- checkBox.Dispatcher.Invoke(() => checkBox.IsChecked = value is bool isChecked ? isChecked : bool.Parse(value as string ?? string.Empty));
+ checkBox.Dispatcher.Invoke(() =>
+ checkBox.IsChecked = value is bool isChecked
+ ? isChecked
+ : bool.Parse(value as string ?? string.Empty));
break;
}
}
}
+
Save();
}
-
+
public async Task SaveAsync()
{
await _storage.SaveAsync();
}
-
+
public void Save()
{
_storage.Save();
}
-
+
public Control CreateSettingPanel()
{
- if (Settings == null)
+ if (Settings == null || Settings.Count == 0)
return new();
var settingWindow = new UserControl();
- var mainPanel = new Grid
- {
- Margin = settingPanelMargin, VerticalAlignment = VerticalAlignment.Center
- };
+ var mainPanel = new Grid { Margin = settingPanelMargin, VerticalAlignment = VerticalAlignment.Center };
ColumnDefinition gridCol1 = new ColumnDefinition();
ColumnDefinition gridCol2 = new ColumnDefinition();
@@ -242,10 +243,7 @@ namespace Flow.Launcher.Core.Plugin
Margin = new Thickness(10, 0, 0, 0), Content = "Browse"
};
- var dockPanel = new DockPanel()
- {
- Margin = settingControlMargin
- };
+ var dockPanel = new DockPanel() { Margin = settingControlMargin };
DockPanel.SetDock(Btn, Dock.Right);
dockPanel.Children.Add(Btn);
@@ -352,7 +350,10 @@ namespace Flow.Launcher.Core.Plugin
case "checkbox":
var checkBox = new CheckBox
{
- IsChecked = Settings[attribute.Name] is bool isChecked ? isChecked : bool.Parse(attribute.DefaultValue),
+ IsChecked =
+ Settings[attribute.Name] is bool isChecked
+ ? isChecked
+ : bool.Parse(attribute.DefaultValue),
Margin = settingCheckboxMargin,
HorizontalAlignment = System.Windows.HorizontalAlignment.Right,
ToolTip = attribute.Description
@@ -375,14 +376,12 @@ namespace Flow.Launcher.Core.Plugin
break;
case "hyperlink":
- var hyperlink = new Hyperlink
- {
- ToolTip = attribute.Description, NavigateUri = attribute.url
- };
+ var hyperlink = new Hyperlink { ToolTip = attribute.Description, NavigateUri = attribute.url };
var linkbtn = new System.Windows.Controls.Button
{
- HorizontalAlignment = System.Windows.HorizontalAlignment.Right, Margin = settingControlMargin
+ HorizontalAlignment = System.Windows.HorizontalAlignment.Right,
+ Margin = settingControlMargin
};
linkbtn.Content = attribute.urlLabel;
@@ -408,12 +407,9 @@ namespace Flow.Launcher.Core.Plugin
mainPanel.Children.Add(panel);
mainPanel.Children.Add(contentControl);
rowCount++;
-
}
return settingWindow;
}
-
-
}
}
diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
index 60130843e..390da072b 100644
--- a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
+++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs
@@ -91,7 +91,7 @@ namespace Flow.Launcher.Core.Plugin
private void SetupJsonRPC()
{
- var formatter = new JsonMessageFormatter();
+ var formatter = new SystemTextJsonFormatter { JsonSerializerOptions = RequestSerializeOption };
var handler = new NewLineDelimitedMessageHandler(ClientPipe,
formatter);
@@ -100,10 +100,8 @@ namespace Flow.Launcher.Core.Plugin
RPC.AddLocalRpcMethod("UpdateResults", new Action((rawQuery, response) =>
{
var results = ParseResults(response);
- ResultsUpdated?.Invoke(this, new ResultUpdatedEventArgs { Query = new Query()
- {
- RawQuery = rawQuery
- }, Results = results });
+ ResultsUpdated?.Invoke(this,
+ new ResultUpdatedEventArgs { Query = new Query() { RawQuery = rawQuery }, Results = results });
}));
RPC.SynchronizationContext = null;
RPC.StartListening();
From 651711711d19bcef33fa593272474e364262b4cc Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 13 Dec 2023 18:35:34 +0100
Subject: [PATCH 102/177] Implement pause/exit logic
Signed-off-by: Florian Grabmeier
---
.../Flow.Launcher.Plugin.Shell/Languages/en.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 16 ++++------------
2 files changed, 5 insertions(+), 12 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
index 88fa264d0..52aaf3c27 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/en.xaml
@@ -4,6 +4,7 @@
Replace Win+R
Close Command Prompt after pressing any key
+ Press any key to close this window...
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
index b963302db..f3c34d41d 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -187,7 +187,7 @@ namespace Flow.Launcher.Plugin.Shell
return history.ToList();
}
- private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdministrator = false) //TODO: implement logic for CloseCMDAfterPress
+ private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdministrator = false)
{
command = command.Trim();
command = Environment.ExpandEnvironmentVariables(command);
@@ -203,7 +203,7 @@ namespace Flow.Launcher.Plugin.Shell
case Shell.Cmd:
{
info.FileName = "cmd.exe";
- info.Arguments = $"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command} {(_settings.CloseShellAfterPress ? "& pause" : "")}";
+ info.Arguments = $"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command} {(_settings.CloseShellAfterPress ? $"&& echo {context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")} && pause > nul /c" : "")}";
//// Use info.Arguments instead of info.ArgumentList to enable users better control over the arguments they are writing.
//// Previous code using ArgumentList, commands needed to be separated correctly:
@@ -232,11 +232,7 @@ namespace Flow.Launcher.Plugin.Shell
else
{
info.ArgumentList.Add("-Command");
- info.ArgumentList.Add(command);
- if (_settings.CloseShellAfterPress)
- {
- info.ArgumentList.Add("; pause");
- }
+ info.ArgumentList.Add($"{command}; {(_settings.CloseShellAfterPress ? $"Write-Host '{context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'; [System.Console]::ReadKey(); exit" : "")}");
}
break;
}
@@ -249,11 +245,7 @@ namespace Flow.Launcher.Plugin.Shell
info.ArgumentList.Add("-NoExit");
}
info.ArgumentList.Add("-Command");
- info.ArgumentList.Add(command);
- if (_settings.CloseShellAfterPress)
- {
- info.ArgumentList.Add("; pause");
- }
+ info.ArgumentList.Add($"{command}; {(_settings.CloseShellAfterPress ? $"Write-Host '{context.API.GetTranslation("flowlauncher_plugin_cmd_press_any_key_to_close")}'; [System.Console]::ReadKey(); exit" : "")}");
break;
}
From 5169a16458ad8a7f9feab74e885354659ea82095 Mon Sep 17 00:00:00 2001
From: flox_x <93255373+flooxo@users.noreply.github.com>
Date: Fri, 15 Dec 2023 17:57:04 +0100
Subject: [PATCH 103/177] Apply suggestions from code review
Typo
Co-authored-by: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
---
Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
index 004d81e8b..a89d9df21 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml
@@ -32,7 +32,7 @@
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
Update all plugins
Would you like to update all plugins?
- Would you like to update {0} plugins?{1}FlowLauncher will restart after updating all plugins.
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
Would you like to update {0} plugins?
{0} plugins successfully updated. Restarting Flow, please wait...
Plugin {0} successfully updated. Restarting Flow, please wait...
From 35d006bfdac1e686dd4299bede723220cd686ddd Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Mon, 18 Dec 2023 13:02:28 +0800
Subject: [PATCH 104/177] Add "Sign Out" as an alias for "Log Off"
Closes #2214
---
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 43f293f74..b457a7a4d 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -148,7 +148,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Log Off",
+ Title = "Log Off/Sign Out",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_log_off"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe77b"),
IcoPath = "Images\\logoff.png",
From c2ff04f0adea82902decfa08d437c15a070191ab Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Mon, 18 Dec 2023 00:30:18 -0600
Subject: [PATCH 105/177] add a safety check for getproperty
---
.../ChromiumBookmarkLoader.cs | 44 ++++++++++++-------
1 file changed, 28 insertions(+), 16 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
index 14b791c48..1e4f3f9ac 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs
@@ -2,12 +2,14 @@
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
+using Flow.Launcher.Infrastructure.Logger;
namespace Flow.Launcher.Plugin.BrowserBookmark
{
public abstract class ChromiumBookmarkLoader : IBookmarkLoader
{
public abstract List GetBookmarks();
+
protected List LoadBookmarks(string browserDataPath, string name)
{
var bookmarks = new List();
@@ -19,53 +21,63 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
var bookmarkPath = Path.Combine(profile, "Bookmarks");
if (!File.Exists(bookmarkPath))
continue;
-
+
Main.RegisterBookmarkFile(bookmarkPath);
var source = name + (Path.GetFileName(profile) == "Default" ? "" : $" ({Path.GetFileName(profile)})");
bookmarks.AddRange(LoadBookmarksFromFile(bookmarkPath, source));
}
+
return bookmarks;
}
protected List LoadBookmarksFromFile(string path, string source)
{
if (!File.Exists(path))
- return new();
+ return new List();
var bookmarks = new List();
using var jsonDocument = JsonDocument.Parse(File.ReadAllText(path));
if (!jsonDocument.RootElement.TryGetProperty("roots", out var rootElement))
- return new();
+ return new List();
foreach (var folder in rootElement.EnumerateObject())
{
if (folder.Value.ValueKind == JsonValueKind.Object)
EnumerateFolderBookmark(folder.Value, bookmarks, source);
}
+
return bookmarks;
}
- private void EnumerateFolderBookmark(JsonElement folderElement, List bookmarks, string source)
+ private void EnumerateFolderBookmark(JsonElement folderElement, ICollection bookmarks,
+ string source)
{
if (!folderElement.TryGetProperty("children", out var childrenElement))
return;
foreach (var subElement in childrenElement.EnumerateArray())
{
- switch (subElement.GetProperty("type").GetString())
+ if (subElement.TryGetProperty("type", out var type))
{
- case "folder":
- case "workspace": // Edge Workspace
- EnumerateFolderBookmark(subElement, bookmarks, source);
- break;
- default:
- bookmarks.Add(new Bookmark(
- subElement.GetProperty("name").GetString(),
- subElement.GetProperty("url").GetString(),
- source));
- break;
+ switch (type.GetString())
+ {
+ case "folder":
+ case "workspace": // Edge Workspace
+ EnumerateFolderBookmark(subElement, bookmarks, source);
+ break;
+ default:
+ bookmarks.Add(new Bookmark(
+ subElement.GetProperty("name").GetString(),
+ subElement.GetProperty("url").GetString(),
+ source));
+ break;
+ }
+ }
+ else
+ {
+ Log.Error(
+ $"ChromiumBookmarkLoader: EnumerateFolderBookmark: type property not found for {subElement.GetString()}");
}
}
-
}
}
}
From 2107402ba8f830fa49722f32230028431b436bc4 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Tue, 26 Dec 2023 09:46:34 -0500
Subject: [PATCH 106/177] Override clipboard paste event
---
Flow.Launcher/MainWindow.xaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml
index 88e95aa69..b65fbc7bb 100644
--- a/Flow.Launcher/MainWindow.xaml
+++ b/Flow.Launcher/MainWindow.xaml
@@ -221,6 +221,7 @@
Visibility="Visible">
+
From db6e54160f96377113074c5ad6d5a6ca93deee63 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Tue, 26 Dec 2023 09:46:46 -0500
Subject: [PATCH 107/177] Handle clipboard paste event if text
---
Flow.Launcher/MainWindow.xaml.cs | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 3a914d488..461a64436 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -71,6 +71,15 @@ namespace Flow.Launcher
App.API.CopyToClipboard(QueryTextBox.SelectedText, showDefaultNotification: false);
}
}
+
+ private void OnPaste(object sender, ExecutedRoutedEventArgs e)
+ {
+ if (System.Windows.Clipboard.ContainsText())
+ {
+ _viewModel.QueryText = System.Windows.Clipboard.GetText().Replace("\n", String.Empty).Replace("\r", String.Empty);
+ e.Handled = true;
+ }
+ }
private async void OnClosing(object sender, CancelEventArgs e)
{
From e8d4afbf317b12bd7aba97f49da671e25b7d45fd Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Tue, 26 Dec 2023 09:59:01 -0500
Subject: [PATCH 108/177] Use ChangeQueryText func
---
Flow.Launcher/MainWindow.xaml.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 461a64436..7d1a68125 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -76,7 +76,7 @@ namespace Flow.Launcher
{
if (System.Windows.Clipboard.ContainsText())
{
- _viewModel.QueryText = System.Windows.Clipboard.GetText().Replace("\n", String.Empty).Replace("\r", String.Empty);
+ _viewModel.ChangeQueryText(System.Windows.Clipboard.GetText().Replace("\n", String.Empty).Replace("\r", String.Empty));
e.Handled = true;
}
}
From 0d9f345199ed59a127d3bd2c3c85a1c5ce03ca36 Mon Sep 17 00:00:00 2001
From: NoPlagiarism <37241775+NoPlagiarism@users.noreply.github.com>
Date: Wed, 27 Dec 2023 14:54:29 +0500
Subject: [PATCH 109/177] README: Add links to community plugins
---
README.md | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index f121f2b75..1b415b0a2 100644
--- a/README.md
+++ b/README.md
@@ -222,28 +222,27 @@ And you can download
-### SpotifyPremium
+### [SpotifyPremium](https://github.com/fow5040/Flow.Launcher.Plugin.SpotifyPremium)
-
-### Steam Search
+### [Steam Search](https://github.com/Garulf/Steam-Search)
-### Clipboard History
+### [Clipboard History](https://github.com/liberize/Flow.Launcher.Plugin.ClipboardHistory)
-### Home Assistant Commander
+### [Home Assistant Commander](https://github.com/Garulf/HA-Commander)
-### Colors
+### [Colors](https://github.com/Flow-Launcher/Flow.Launcher.Plugin.Color)
-### GitHub
+### [GitHub](https://github.com/JohnTheGr8/Flow.Plugin.Github)
-### Window Walker
+### [Window Walker](https://github.com/taooceros/Flow.Plugin.WindowWalker)
......and more!
From f4887fa9c669e5dfa22a686c38e131cb8eb01f3a Mon Sep 17 00:00:00 2001
From: NoPlagiarism <37241775+NoPlagiarism@users.noreply.github.com>
Date: Wed, 27 Dec 2023 15:05:00 +0500
Subject: [PATCH 110/177] Spelling: Add Softpedia to expected
---
.github/actions/spelling/expect.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
index 8e29be550..2d6fdb7f0 100644
--- a/.github/actions/spelling/expect.txt
+++ b/.github/actions/spelling/expect.txt
@@ -105,3 +105,4 @@ pluginsmanager
alreadyexists
JsonRPC
JsonRPCV2
+Softpedia
From d0f25036cac1531a9a706fba9138ca53a6539930 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 27 Dec 2023 18:44:20 +0100
Subject: [PATCH 111/177] Remove translations
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml | 1 -
Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml | 1 -
22 files changed, 22 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
index 77fbcf8d4..0ccfd8c9a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
@@ -2,7 +2,6 @@
Replace Win+R
- Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
index 30d15ec76..2c764d845 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
@@ -2,7 +2,6 @@
Nahradit Win+R
- Po stisknutí libovolné klávesy zavřít příkazový řádek
Po dokončení příkazu příkazový řádek nezavírejte
Vždy spustit jako správce
Spustit jako jiný uživatel
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
index 77fbcf8d4..0ccfd8c9a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
@@ -2,7 +2,6 @@
Replace Win+R
- Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
index 8aae3a5fd..3fa7c64fa 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
@@ -2,7 +2,6 @@
Ersetzt Win+R
- Schließe die Kommandozeilte nachdem eine Taste gedrückt wurde
Schließe die Kommandozeilte nicht nachdem der Befehl ausgeführt wurde
Immer als Administrator ausführen
Als anderer Benutzer ausführen
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
index 122198357..284a2a0e6 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
@@ -2,7 +2,6 @@
Reemplazar Win+R
- Cerrar Símbolo del sistema después de pulsar cualquier tecla
No cerrar Símbolo del Sistema tras ejecutar el comando
Siempre ejecutar como administrador
Ejecutar como otro usuario
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
index ff01f30d6..8bf1a2c11 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
@@ -2,7 +2,6 @@
Reemplazar Win+R
- Cerrar Símbolo del sistema después de pulsar cualquier tecla
No cerrar el símbolo del sistema después de la ejecución del comando
Ejecutar siempre como administrador
Ejecutar como usuario diferente
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
index 438f8cc8f..d08efb9b8 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
@@ -2,7 +2,6 @@
Remplacer Win+R
- Fermer l'invite de commande après avoir appuyé sur n'importe quelle touche
Ne pas fermer l'invite de commandes après l'exécution de la commande
Toujours exécuter en tant qu'administrateur
Exécuter en tant qu'utilisateur différent
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
index fa7df2c07..de40b0c47 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
@@ -2,7 +2,6 @@
Sostituisci Win+R
- Chiudere il prompt dei comandi dopo aver premuto qualsiasi tasto
Non chiudere il prompt dei comandi dopo l'esecuzione dei comandi
Esegui sempre come amministratore
Esegui come utente differente
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
index 77fbcf8d4..0ccfd8c9a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
@@ -2,7 +2,6 @@
Replace Win+R
- Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
index 9531fe832..014a46dfc 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
@@ -2,7 +2,6 @@
Win+R 단축키 대체
- 아무 키나 누른 후 명령 프롬프트 닫기
명령 실행 후 명령 프롬프트를 닫지 않음
항상 관리자 권한으로 실행
다른 유저 권한으로 실행
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
index 77fbcf8d4..0ccfd8c9a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
@@ -2,7 +2,6 @@
Replace Win+R
- Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
index 77fbcf8d4..0ccfd8c9a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
@@ -2,7 +2,6 @@
Replace Win+R
- Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
index d83386d2d..c851be93b 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
@@ -2,7 +2,6 @@
Zastąp Win+R
- Zamykanie wiersza polecenia po naciśnięciu dowolnego klawisza
Nie zamykaj wiersza poleceń po wykonaniu polecenia
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
index ef0223dd9..6a0a3c8fd 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
@@ -2,7 +2,6 @@
Substituir Win+R
- Fechar o Prompt de Comando após pressionar qualquer tecla
Não feche o Prompt de Comando após a execução do comando
Sempre executar como administrador
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
index f91fcd888..33d7f35a6 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
@@ -2,7 +2,6 @@
Substituir Win+R
- Fechar linha de comandos depois de pressionar qualquer tecla
Não fechar linha de comandos depois de executar o comando
Executar sempre como administrador
Executar com outro utilizador
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
index 77fbcf8d4..0ccfd8c9a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
@@ -2,7 +2,6 @@
Replace Win+R
- Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
index 76221a0ef..0b76303df 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
@@ -2,7 +2,6 @@
Nahradiť Win+R
- Zatvoriť príkazový riadok po stlačení ľubovoľnej klávesy
Nezatvárať príkazový riadok po dokončení príkazu
Spustiť vždy ako správca
Spustiť ako iný používateľ
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
index 77fbcf8d4..0ccfd8c9a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
@@ -2,7 +2,6 @@
Replace Win+R
- Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
index 437e25f18..c6433cef1 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
@@ -2,7 +2,6 @@
Win+R kısayolunu kullan
- Herhangi bir tuşa basıldıktan sonra komut istemini kapat
Çalıştırma sona erdikten sonra komut istemini kapatma
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
index 77fbcf8d4..0ccfd8c9a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
@@ -2,7 +2,6 @@
Replace Win+R
- Close Command Prompt after pressing any key
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
index 07e8142d7..916542c3a 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
@@ -2,7 +2,6 @@
替换 Win+R
- 按任意键后关闭命令窗口
执行后不关闭命令窗口
始终以管理员身份运行
以其他用户身份运行
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
index 58e1a11f8..7ddc58918 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
@@ -2,7 +2,6 @@
取代 Win+R
- 按任意鍵後關閉命令提示字元視窗
執行後不關閉命令提示字元視窗
一律以系統管理員身分執行
Run as different user
From dcaa74dbe5ae30f1ce99fa5ddb51ce67072efcb3 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Fri, 29 Dec 2023 11:17:46 +0100
Subject: [PATCH 112/177] Fix reduce nesting
Signed-off-by: Florian Grabmeier
---
.../PluginsManager.cs | 91 ++++++++++---------
1 file changed, 46 insertions(+), 45 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index 88ad8ed32..fd5cbbe98 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -321,53 +321,54 @@ namespace Flow.Launcher.Plugin.PluginsManager
if (MessageBox.Show(message,
Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ MessageBoxButton.YesNo) == MessageBoxResult.No)
{
- Parallel.ForEach(resultsForUpdate, plugin =>
- {
- var downloadToFilePath = Path.Combine(Path.GetTempPath(), $"{plugin.Name}-{plugin.NewVersion}.zip");
-
- _ = Task.Run(async delegate
- {
- if (File.Exists(downloadToFilePath))
- {
- File.Delete(downloadToFilePath);
- }
-
- await Http.DownloadAsync(plugin.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
- .ConfigureAwait(false);
-
- PluginManager.UpdatePlugin(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, downloadToFilePath);
-
- }).ContinueWith(t =>
- {
- Log.Exception("PluginsManager", $"Update failed for {plugin.Name}",
- t.Exception.InnerException);
- Context.API.ShowMsg(
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
- string.Format(
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
- plugin.Name));
- }, TaskContinuationOptions.OnlyOnFaulted);
- });
-
- if (Settings.AutoRestartAfterChanging)
- {
- Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_success_restart"),
- resultsForUpdate.Count()));
- Context.API.RestartApp();
- }
- else
- {
- Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_success_no_restart"),
- resultsForUpdate.Count()));
- }
-
- return true;
+ return false;
}
- return false;
+
+ Parallel.ForEach(resultsForUpdate, plugin =>
+ {
+ var downloadToFilePath = Path.Combine(Path.GetTempPath(), $"{plugin.Name}-{plugin.NewVersion}.zip");
+
+ _ = Task.Run(async delegate
+ {
+ if (File.Exists(downloadToFilePath))
+ {
+ File.Delete(downloadToFilePath);
+ }
+
+ await Http.DownloadAsync(plugin.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
+ .ConfigureAwait(false);
+
+ PluginManager.UpdatePlugin(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, downloadToFilePath);
+
+ }).ContinueWith(t =>
+ {
+ Log.Exception("PluginsManager", $"Update failed for {plugin.Name}",
+ t.Exception.InnerException);
+ Context.API.ShowMsg(
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
+ string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
+ plugin.Name));
+ }, TaskContinuationOptions.OnlyOnFaulted);
+ });
+
+ if (Settings.AutoRestartAfterChanging)
+ {
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_success_restart"),
+ resultsForUpdate.Count()));
+ Context.API.RestartApp();
+ }
+ else
+ {
+ Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_success_no_restart"),
+ resultsForUpdate.Count()));
+ }
+
+ return true;
},
ContextData = new UserPlugin()
};
From 2b8e46611f3259313423fb660418969773e8126e Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 3 Jan 2024 09:52:12 +0100
Subject: [PATCH 113/177] Add translation keys for sys commands
Signed-off-by: Florian Grabmeier
---
.../Languages/en.xaml | 21 ++++++++++
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 38 +++++++++----------
2 files changed, 40 insertions(+), 19 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
index a9aae930a..7399a55e7 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
@@ -7,6 +7,27 @@
Command
Description
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Exit
+ Save Settings
+ Restart Flow Launcher"
+ Settings
+ Reload Plugin Data
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+
+
Shutdown Computer
Restart Computer
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 43f293f74..293fe5869 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -89,7 +89,7 @@ namespace Flow.Launcher.Plugin.Sys
{
new Result
{
- Title = "Shutdown",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_shutdown_computer_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_shutdown_computer"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe7e8"),
IcoPath = "Images\\shutdown.png",
@@ -109,7 +109,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Restart",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe777"),
IcoPath = "Images\\restart.png",
@@ -129,7 +129,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Restart With Advanced Boot Options",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_advanced_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart_advanced"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xecc5"),
IcoPath = "Images\\restart_advanced.png",
@@ -148,7 +148,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Log Off",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_log_off_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_log_off"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe77b"),
IcoPath = "Images\\logoff.png",
@@ -167,7 +167,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Lock",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_lock_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_lock"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe72e"),
IcoPath = "Images\\lock.png",
@@ -179,7 +179,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Sleep",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_sleep_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_sleep"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xec46"),
IcoPath = "Images\\sleep.png",
@@ -187,7 +187,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Hibernate",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_hibernate_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_hibernate"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe945"),
IcoPath = "Images\\hibernate.png",
@@ -204,7 +204,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Index Option",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_explorer_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_indexoption"),
IcoPath = "Images\\indexoption.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe773"),
@@ -219,7 +219,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Empty Recycle Bin",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_emptyrecyclebin_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_emptyrecyclebin"),
IcoPath = "Images\\recyclebin.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe74d"),
@@ -242,7 +242,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Open Recycle Bin",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin"),
IcoPath = "Images\\openrecyclebin.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe74d"),
@@ -257,7 +257,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Exit",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_exit_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_exit"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -268,7 +268,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Save Settings",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_save_all_settings_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_save_all_settings"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -281,7 +281,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Restart Flow Launcher",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -292,7 +292,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Settings",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_setting_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_setting"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -303,7 +303,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Reload Plugin Data",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_reload_plugin_data_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_reload_plugin_data"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -323,7 +323,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Check For Update",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_check_for_update_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_check_for_update"),
IcoPath = "Images\\checkupdate.png",
Action = c =>
@@ -335,7 +335,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Open Log Location",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_log_location_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_log_location"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -347,7 +347,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Flow Launcher Tips",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_docs_tips_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_docs_tips"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -358,7 +358,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = "Flow Launcher UserData Folder",
+ Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_userdata_location_cmd"),
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_userdata_location"),
IcoPath = "Images\\app.png",
Action = c =>
From 570b2029e625e7edd7bcfa4648e106bbb08d45e6 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 3 Jan 2024 10:05:39 +0100
Subject: [PATCH 114/177] Update wrong key translation
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
index 7399a55e7..446290347 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
@@ -10,7 +10,7 @@
Shutdown
Restart
Restart With Advanced Boot Options
- Log Off
+ Log Off/Sign Out
Lock
Sleep
Hibernate
From 26c35a84b1569724c27ff38da9bc4086ec861953 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 3 Jan 2024 09:29:56 +0100
Subject: [PATCH 115/177] Fix use async
Signed-off-by: Florian Grabmeier
---
.../PluginsManager.cs | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index fd5cbbe98..cd77e6daf 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -305,7 +305,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
Title = Context.API.GetTranslation("plugin_pluginsmanager_update_all_title"),
SubTitle = Context.API.GetTranslation("plugin_pluginsmanager_update_all_subtitle"),
IcoPath = icoPath,
- Action = e =>
+ AsyncAction = async e =>
{
string message;
if (Settings.AutoRestartAfterChanging)
@@ -326,11 +326,11 @@ namespace Flow.Launcher.Plugin.PluginsManager
return false;
}
- Parallel.ForEach(resultsForUpdate, plugin =>
+ await Task.WhenAll(resultsForUpdate.Select(async plugin =>
{
var downloadToFilePath = Path.Combine(Path.GetTempPath(), $"{plugin.Name}-{plugin.NewVersion}.zip");
- _ = Task.Run(async delegate
+ try
{
if (File.Exists(downloadToFilePath))
{
@@ -341,18 +341,17 @@ namespace Flow.Launcher.Plugin.PluginsManager
.ConfigureAwait(false);
PluginManager.UpdatePlugin(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, downloadToFilePath);
-
- }).ContinueWith(t =>
+ }
+ catch (Exception ex)
{
- Log.Exception("PluginsManager", $"Update failed for {plugin.Name}",
- t.Exception.InnerException);
+ Log.Exception("PluginsManager", $"Update failed for {plugin.Name}", ex.InnerException);
Context.API.ShowMsg(
Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
string.Format(
Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
plugin.Name));
- }, TaskContinuationOptions.OnlyOnFaulted);
- });
+ }
+ }));
if (Settings.AutoRestartAfterChanging)
{
From c3cf3d9e7e9dd17c71a8fcbb4e3c4abf9223689e Mon Sep 17 00:00:00 2001
From: NoPlagiarism <37241775+NoPlagiarism@users.noreply.github.com>
Date: Thu, 11 Jan 2024 15:27:35 +0500
Subject: [PATCH 116/177] [Calculator] Allow more functions to be used
---
Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 1 +
1 file changed, 1 insertion(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index e2aa5860c..684de33d8 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -19,6 +19,7 @@ namespace Flow.Launcher.Plugin.Caculator
@"sin|cos|tan|arcsin|arccos|arctan|" +
@"eigval|eigvec|eig|sum|polar|plot|round|sort|real|zeta|" +
@"bin2dec|hex2dec|oct2dec|" +
+ @"factorial|sign|isprime|isinfty|" +
@"==|~=|&&|\|\||" +
@"[ei]|[0-9]|[\+\-\*\/\^\., ""]|[\(\)\|\!\[\]]" +
@")+$", RegexOptions.Compiled);
From 19dc86a23b5a8535b731e5381c6ed103d7b21fab Mon Sep 17 00:00:00 2001
From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
Date: Sat, 13 Jan 2024 12:05:11 +0800
Subject: [PATCH 117/177] [ci skip] Update system commands in README
Fix #1819
---
README.md | 42 +++++++++++++++++++++---------------------
1 file changed, 21 insertions(+), 21 deletions(-)
diff --git a/README.md b/README.md
index 1b415b0a2..2d748aab8 100644
--- a/README.md
+++ b/README.md
@@ -286,27 +286,27 @@ And you can download New Game Mode status
+ public void SetGameMode(bool value);
+
+ ///
+ /// Representing Game Mode status
+ ///
+ ///
+ public bool IsGameModeOn();
}
}
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index def54e04b..36309a22a 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -294,6 +294,22 @@ namespace Flow.Launcher
OpenUri(appUri);
}
+ public void ToggleGameMode()
+ {
+ _mainVM.ToggleGameMode();
+ }
+
+ public void SetGameMode(bool value)
+ {
+ _mainVM.GameModeStatus = value;
+ }
+
+ public bool IsGameModeOn()
+ {
+ return _mainVM.GameModeStatus;
+ }
+
+
private readonly List> _globalKeyboardHandlers = new();
public void RegisterGlobalKeyboardCallback(Func callback) => _globalKeyboardHandlers.Add(callback);
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
index 9ada8533b..2357454d0 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Success
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
index 7ac077c77..1505f6e65 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
@@ -24,6 +24,7 @@
Zkontrolovat aktualizace Flow Launcheru
Další nápovědu a tipy k jeho používání najdete v dokumentaci ke službě Flow Launcher
Otevře místo, kde jsou uložena nastavení Flow Launcher
+ Toggle Game Mode
Úspěšné
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
index 129f40bae..d726432d6 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Fortsæt
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
index 052166e28..e33dc7bdb 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Erfolgreich
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
index a9aae930a..a5a6035bc 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
@@ -26,8 +26,9 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
-
+
Success
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
index 9ada8533b..2357454d0 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Success
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
index 1005e4b8f..2d32da003 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
@@ -24,6 +24,7 @@
Busca actualizaciones de Flow Launcher
Accede a la documentación de Flow Launcher para más ayuda y consejos de uso
Abre la ubicación donde se almacena la configuración de Flow Launcher
+ Toggle Game Mode
Correcto
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
index cfd2fb832..62e66c64b 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
@@ -24,6 +24,7 @@
Vérifier de nouvelles mises à jour Flow Launcher
Consultez la documentation de Flow Launcher pour plus d'aide et comment utiliser les conseils.
Ouvrez l'emplacement où les paramètres de Flow Launcher sont stockés
+ Toggle Game Mode
Ajouté avec succès
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
index 3451f4aa6..5691201a8 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
@@ -24,6 +24,7 @@
Controlla il nuovo aggiornamento di Flow Launcher
Visita la documentazione di Flow Launcher per maggiori informazioni e suggerimenti su come usarlo
Apri la posizione in cui vengono memorizzate le impostazioni di Flow Launcher
+ Toggle Game Mode
Successo
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
index 169135a69..66c6c3bed 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
成功しまし
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
index dab69b706..35951a583 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
@@ -24,6 +24,7 @@
Flow Launcher 새 업데이트 확인
Flow Launcher의 도움말 및 사용안내
Flow Launcher의 설정이 저장된 위치 열기
+ Toggle Game Mode
성공
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
index 9ada8533b..2357454d0 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Success
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
index 05e33adef..85c04371c 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Succesvol
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
index f8e857d1c..d01d780ae 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Sukces
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
index a78a71c56..0bc352d80 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Sucesso
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
index e53fd601d..f76c1f178 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
@@ -24,6 +24,7 @@
Procurar por novas versões do Flow Launcher
Aceda à documentação para mais informações e dicas de utilização
Abrir localização onde as definições do Flow Launcher estão guardadas
+ Toggle Game Mode
Sucesso
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
index 233754f80..3092c6299 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Успешно
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
index 516b792c5..dcad0ccee 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
@@ -24,6 +24,7 @@
Skontrolovať aktualizácie Flow Launchera
V dokumentácii k aplikácii Flow Launcher nájdete ďalšiu pomoc a tipy na používanie
Otvoriť umiestnenie, kde sú uložené nastavenia Flow Launchera
+ Toggle Game Mode
Úspešné
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
index 561811679..e8ba99c9a 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Uspešno
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
index 3d847d7fa..c66601dba 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Başarılı
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
index cf5a3bed4..ac73513f4 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
Успішно
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
index e9bf86065..cba1e5fbe 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
@@ -24,6 +24,7 @@
检查新的 Flow Launcher 更新
访问 Flow Launcher 的文档以获取更多帮助以及使用技巧
打开Flow Launcher 设置文件夹
+ Toggle Game Mode
成功
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
index 09b099bdc..cc469f808 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
@@ -24,6 +24,7 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
+ Toggle Game Mode
成
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index b457a7a4d..750ab476c 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -366,6 +366,18 @@ namespace Flow.Launcher.Plugin.Sys
context.API.OpenDirectory(DataLocation.DataDirectory());
return true;
}
+ },
+ new Result
+ {
+ Title = "Toggle Game Mode",
+ SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_toggle_game_mode"),
+ IcoPath = "Images\\app.png",
+ Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\ue7fc"),
+ Action = c =>
+ {
+ context.API.ToggleGameMode();
+ return true;
+ }
}
});
diff --git a/README.md b/README.md
index 1b415b0a2..2f28495c3 100644
--- a/README.md
+++ b/README.md
@@ -206,6 +206,7 @@ And you can download
@@ -307,6 +308,7 @@ And you can download
-
## 🎅 New Features🤶
+
### Preview Panel
+
- Use the F1 key to open/hide the preview panel.
@@ -34,6 +35,7 @@ Dedicated to making your workflow flow more seamless. Search everything from app
- This feature is currently in its early stages.
### Everything Plugin Merged Into Explorer
+
- Switch easily between Everything and Windows Search to take advantage of both search engines (remember to remove existing Everything plugin).
@@ -46,6 +48,7 @@ Dedicated to making your workflow flow more seamless. Search everything from app
- Display the date and time when the search window is triggered.
### Drag & Drop
+
- Drag an item to Discord or computer location.
@@ -59,24 +62,28 @@ Dedicated to making your workflow flow more seamless. Search everything from app
- New shortcut functionality to set additional action keywords or search terms.
### Improved Program Plugin
+
- PATH is now indexed
- Support for .url files, flow can now search installed steam/epic games.
- Improved UWP indexing.
### Improved Memory Usage
+
- Fixed a memory leak and reduced overall memory usage.
### Improved Plugin / Plugin Store
+
- Search plugins in the Plugin Store and existing plugin tab.
- Categorised sections in Plugin Store to easily see new and updated plugins.
### Improved Non-C# Plugin's Panel Design
+
- The design has been adjusted to align to the overall look and feel of flow.
- Simplified the information displayed on buttons
-🚂Full Changelogs
+🚂[Full Changelogs](https://github.com/Flow-Launcher/Flow.Launcher/releases)
@@ -105,7 +112,7 @@ Dedicated to making your workflow flow more seamless. Search everything from app
> When installing for the first time Windows may raise an issue about security due to code not being signed, if you downloaded from this repo then you are good to continue the set up.
-And you can download early access version.
+And you can download [early access version](https://github.com/Flow-Launcher/Prereleases/releases).
@@ -115,12 +122,10 @@ And you can download
-
- Search for apps, files or file contents.
-
- Support search using environment variable paths.
### Web Searches & URLs
@@ -129,8 +134,6 @@ And you can download
-
-
### Browser Bookmarks
@@ -140,7 +143,7 @@ And you can download
- Provides system related commands. shutdown, lock, settings, etc.
-- System command list
+- [System command list](#system-command-list)
### Calculator
@@ -152,7 +155,6 @@ And you can download
-
- Run batch and PowerShell commands as Administrator or a different user.
- Ctrl+Enter to Run as Administrator.
@@ -168,7 +170,6 @@ And you can download
@@ -224,16 +225,19 @@ And you can download
### [Steam Search](https://github.com/Garulf/Steam-Search)
+
-
### [Clipboard History](https://github.com/liberize/Flow.Launcher.Plugin.ClipboardHistory)
+
### [Home Assistant Commander](https://github.com/Garulf/HA-Commander)
+
### [Colors](https://github.com/Flow-Launcher/Flow.Launcher.Plugin.Color)
@@ -241,49 +245,48 @@ And you can download
### [GitHub](https://github.com/JohnTheGr8/Flow.Plugin.Github)
+
### [Window Walker](https://github.com/taooceros/Flow.Plugin.WindowWalker)
+
-......and more!
+......and [more!](https://flowlauncher.com/docs/#/plugins)
### 🛒 Plugin Store
-
- You can view the full plugin list or quickly install a plugin via the Plugin Store menu inside Settings
- or type `pm` `install`/`uninstall`/`update` + the plugin name in the search window,
-
## ⌨️ Hotkeys
-| Hotkey | Description |
-| ------------------------------------------------------------ | -------------------------------------------- |
-| Alt+ Space | Open search window (default and configurable)|
-| Enter | Execute |
-| Ctrl+Shift+Enter | Run as admin |
-| ↑↓ | Scroll up & down |
-| ←→ | Back to result / Open Context Menu |
-| Ctrl +O , Shift +Enter | Open Context Menu |
-| Tab | Autocomplete |
-| F1 | Toggle Preview Panel (default and configurable)|
-| Esc | Back to results / hide search window |
-| Ctrl +C | Copy the actual folder / file |
-| Ctrl +I | Open flow's settings |
-| Ctrl +R | Run the current query again (refresh results)|
-| F5 | Reload all plugin data |
-| Ctrl + F12 | Toggle Game Mode when in search window |
-| Ctrl + +,- | Quickly change maximum results shown |
-| Ctrl + [,] | Quickly change search window width |
-| Ctrl + H | Open search history |
-| Ctrl + Backspace | Back to previous directory |
-
+| Hotkey | Description |
+| ------------------------------------------------------------------ | ---------------------------------------------- |
+| Alt+ Space | Open search window (default and configurable) |
+| Enter | Execute |
+| Ctrl+Shift+Enter | Run as admin |
+| ↑↓ | Scroll up & down |
+| ←→ | Back to result / Open Context Menu |
+| Ctrl +O , Shift +Enter | Open Context Menu |
+| Tab | Autocomplete |
+| F1 | Toggle Preview Panel (default and configurable)|
+| Esc | Back to results / hide search window |
+| Ctrl +C | Copy the actual folder / file |
+| Ctrl +I | Open flow's settings |
+| Ctrl +R | Run the current query again (refresh results) |
+| F5 | Reload all plugin data |
+| Ctrl + F12 | Toggle Game Mode when in search window |
+| Ctrl + +,- | Quickly change maximum results shown |
+| Ctrl + [,] | Quickly change search window width |
+| Ctrl + H | Open search history |
+| Ctrl + Backspace | Back to previous directory |
## System Command List
@@ -320,7 +323,7 @@ And you can download
-
+
@@ -336,16 +339,15 @@ And you can download
-
-
### Mentions
-- Why I Chose to Support Flow-Launcher - Appwrite
-- Softpedia Editor's Pick
+
+- [Why I Chose to Support Flow-Launcher](https://dev.to/appwrite/appwrite-loves-open-source-why-i-chose-to-support-flow-launcher-54pj) - Appwrite
+- [Softpedia Editor's Pick](https://www.softpedia.com/get/System/Launchers-Shutdown-Tools/Flow-Launcher.shtml)
@@ -377,7 +379,7 @@ Get in touch if you like to join the Flow-Launcher Team and help build this grea
- Install Visual Studio 2022
-- Install .Net 7 SDK
+- Install .Net 7 SDK
- via Visual Studio installer
- via winget `winget install Microsoft.DotNet.SDK.7`
- Manually from [here](https://dotnet.microsoft.com/en-us/download/dotnet/7.0)
From 224dab70a96b75c9de81a47a12b921bced2cb2e3 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Mon, 15 Jan 2024 16:16:07 +0100
Subject: [PATCH 120/177] Add dynamic title
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 90 ++++++++++++++++++------
1 file changed, 67 insertions(+), 23 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 293fe5869..37ea6b7ea 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -2,11 +2,13 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
+using System.Linq;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Interop;
using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin.SharedCommands;
using Application = System.Windows.Application;
@@ -19,6 +21,7 @@ namespace Flow.Launcher.Plugin.Sys
public class Main : IPlugin, ISettingProvider, IPluginI18n
{
private PluginInitContext context;
+ private Dictionary KeywordTitleMappings = new Dictionary();
#region DllImport
@@ -59,6 +62,8 @@ namespace Flow.Launcher.Plugin.Sys
var results = new List();
foreach (var c in commands)
{
+ c.Title = GetDynamicTitle(query, c);
+
var titleMatch = StringMatcher.FuzzySearch(query.Search, c.Title);
var subTitleMatch = StringMatcher.FuzzySearch(query.Search, c.SubTitle);
@@ -77,9 +82,48 @@ namespace Flow.Launcher.Plugin.Sys
return results;
}
+ private string GetDynamicTitle(Query query, Result result)
+ {
+ var pair = KeywordTitleMappings
+ .Where(kvp => kvp.Key == result.Title && kvp.Key != kvp.Value)
+ .FirstOrDefault();
+
+ if (pair.Equals(default))
+ {
+ Log.Error($"Dynamic Title not found for: {result.Title}");
+ return "Title Not Found";
+ }
+
+ var englishTitleMatch = StringMatcher.FuzzySearch(query.Search, pair.Key);
+ var translatedTitleMatch = StringMatcher.FuzzySearch(query.Search, pair.Value);
+
+ return englishTitleMatch.Score >= translatedTitleMatch.Score ? pair.Key : pair.Value;
+ }
+
public void Init(PluginInitContext context)
{
this.context = context;
+ KeywordTitleMappings = new Dictionary{
+ {"Shutdown", context.API.GetTranslation("flowlauncher_plugin_sys_shutdown_computer_cmd")},
+ {"Restart", context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer_cmd")},
+ {"Restart With Advanced Boot Options", context.API.GetTranslation("flowlauncher_plugin_sys_restart_advanced_cmd")},
+ {"Log Off/Sign Out", context.API.GetTranslation("flowlauncher_plugin_sys_log_off_cmd")},
+ {"Lock", context.API.GetTranslation("flowlauncher_plugin_sys_lock_cmd")},
+ {"Sleep", context.API.GetTranslation("flowlauncher_plugin_sys_sleep_cmd")},
+ {"Hibernate", context.API.GetTranslation("flowlauncher_plugin_sys_hibernate_cmd")},
+ {"Index Option", context.API.GetTranslation("flowlauncher_plugin_sys_indexoption_cmd")},
+ {"Empty Recycle Bin", context.API.GetTranslation("flowlauncher_plugin_sys_emptyrecyclebin_cmd")},
+ {"Open Recycle Bin", context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin_cmd")},
+ {"Exit", context.API.GetTranslation("flowlauncher_plugin_sys_exit_cmd")},
+ {"Save Settings", context.API.GetTranslation("flowlauncher_plugin_sys_save_all_settings_cmd")},
+ {"Restart Flow Launcher", context.API.GetTranslation("flowlauncher_plugin_sys_restart_cmd")},
+ {"Settings", context.API.GetTranslation("flowlauncher_plugin_sys_setting_cmd")},
+ {"Reload Plugin Data", context.API.GetTranslation("flowlauncher_plugin_sys_reload_plugin_data_cmd")},
+ {"Check For Update", context.API.GetTranslation("flowlauncher_plugin_sys_check_for_update_cmd")},
+ {"Open Log Location", context.API.GetTranslation("flowlauncher_plugin_sys_open_log_location_cmd")},
+ {"Flow Launcher Tips", context.API.GetTranslation("flowlauncher_plugin_sys_open_docs_tips_cmd")},
+ {"Flow Launcher UserData Folder", context.API.GetTranslation("flowlauncher_plugin_sys_open_userdata_location_cmd")}
+ };
}
private List Commands()
@@ -89,7 +133,7 @@ namespace Flow.Launcher.Plugin.Sys
{
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_shutdown_computer_cmd"),
+ Title = "Shutdown",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_shutdown_computer"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe7e8"),
IcoPath = "Images\\shutdown.png",
@@ -109,7 +153,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer_cmd"),
+ Title = "Restart",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe777"),
IcoPath = "Images\\restart.png",
@@ -129,7 +173,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_advanced_cmd"),
+ Title = "Restart With Advanced Boot Options",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart_advanced"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xecc5"),
IcoPath = "Images\\restart_advanced.png",
@@ -139,7 +183,7 @@ namespace Flow.Launcher.Plugin.Sys
context.API.GetTranslation("flowlauncher_plugin_sys_dlgtext_restart_computer_advanced"),
context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer"),
MessageBoxButton.YesNo, MessageBoxImage.Warning);
-
+
if (result == MessageBoxResult.Yes)
Process.Start("shutdown", "/r /o /t 0");
@@ -148,7 +192,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_log_off_cmd"),
+ Title = "Log Off/Sign Out",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_log_off"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe77b"),
IcoPath = "Images\\logoff.png",
@@ -158,7 +202,7 @@ namespace Flow.Launcher.Plugin.Sys
context.API.GetTranslation("flowlauncher_plugin_sys_dlgtext_logoff_computer"),
context.API.GetTranslation("flowlauncher_plugin_sys_log_off"),
MessageBoxButton.YesNo, MessageBoxImage.Warning);
-
+
if (result == MessageBoxResult.Yes)
ExitWindowsEx(EWX_LOGOFF, 0);
@@ -167,7 +211,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_lock_cmd"),
+ Title = "Lock",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_lock"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe72e"),
IcoPath = "Images\\lock.png",
@@ -179,7 +223,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_sleep_cmd"),
+ Title = "Sleep",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_sleep"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xec46"),
IcoPath = "Images\\sleep.png",
@@ -187,7 +231,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_hibernate_cmd"),
+ Title = "Hibernate",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_hibernate"),
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe945"),
IcoPath = "Images\\hibernate.png",
@@ -198,13 +242,13 @@ namespace Flow.Launcher.Plugin.Sys
info.UseShellExecute = true;
ShellCommand.Execute(info);
-
+
return true;
}
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_explorer_cmd"),
+ Title = "Index Option",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_indexoption"),
IcoPath = "Images\\indexoption.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe773"),
@@ -219,7 +263,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_emptyrecyclebin_cmd"),
+ Title = "Empty Recycle Bin",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_emptyrecyclebin"),
IcoPath = "Images\\recyclebin.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe74d"),
@@ -242,7 +286,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin_cmd"),
+ Title = "Open Recycle Bin",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin"),
IcoPath = "Images\\openrecyclebin.png",
Glyph = new GlyphInfo (FontFamily:"/Resources/#Segoe Fluent Icons", Glyph:"\xe74d"),
@@ -257,7 +301,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_exit_cmd"),
+ Title = "Exit",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_exit"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -268,7 +312,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_save_all_settings_cmd"),
+ Title = "Save Settings",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_save_all_settings"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -281,7 +325,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_restart_cmd"),
+ Title = "Restart Flow Launcher",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_restart"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -292,7 +336,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_setting_cmd"),
+ Title = "Settings",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_setting"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -303,7 +347,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_reload_plugin_data_cmd"),
+ Title = "Reload Plugin Data",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_reload_plugin_data"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -317,13 +361,13 @@ namespace Flow.Launcher.Plugin.Sys
context.API.GetTranslation(
"flowlauncher_plugin_sys_dlgtext_all_applicableplugins_reloaded")),
System.Threading.Tasks.TaskScheduler.Current);
-
+
return true;
}
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_check_for_update_cmd"),
+ Title = "Check For Update",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_check_for_update"),
IcoPath = "Images\\checkupdate.png",
Action = c =>
@@ -335,7 +379,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_log_location_cmd"),
+ Title = "Open Log Location",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_log_location"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -347,7 +391,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_docs_tips_cmd"),
+ Title = "Flow Launcher Tips",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_docs_tips"),
IcoPath = "Images\\app.png",
Action = c =>
@@ -358,7 +402,7 @@ namespace Flow.Launcher.Plugin.Sys
},
new Result
{
- Title = context.API.GetTranslation("flowlauncher_plugin_sys_open_userdata_location_cmd"),
+ Title = "Flow Launcher UserData Folder",
SubTitle = context.API.GetTranslation("flowlauncher_plugin_sys_open_userdata_location"),
IcoPath = "Images\\app.png",
Action = c =>
From c80a638b65e9632fe8778d646e40923dd908b199 Mon Sep 17 00:00:00 2001
From: Hongtao Zhang
Date: Mon, 15 Jan 2024 16:49:46 -0600
Subject: [PATCH 121/177] fix multiple enumeration and revert logic for single
update
---
.../PluginsManager.cs | 235 ++++++++++--------
1 file changed, 133 insertions(+), 102 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
index cd77e6daf..8cd58ac52 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs
@@ -60,7 +60,8 @@ namespace Flow.Launcher.Plugin.PluginsManager
AutoCompleteText = $"{Context.CurrentPluginMetadata.ActionKeyword} {Settings.InstallCommand} ",
Action = _ =>
{
- Context.API.ChangeQuery($"{Context.CurrentPluginMetadata.ActionKeyword} {Settings.InstallCommand} ");
+ Context.API.ChangeQuery(
+ $"{Context.CurrentPluginMetadata.ActionKeyword} {Settings.InstallCommand} ");
return false;
}
},
@@ -71,7 +72,8 @@ namespace Flow.Launcher.Plugin.PluginsManager
AutoCompleteText = $"{Context.CurrentPluginMetadata.ActionKeyword} {Settings.UninstallCommand} ",
Action = _ =>
{
- Context.API.ChangeQuery($"{Context.CurrentPluginMetadata.ActionKeyword} {Settings.UninstallCommand} ");
+ Context.API.ChangeQuery(
+ $"{Context.CurrentPluginMetadata.ActionKeyword} {Settings.UninstallCommand} ");
return false;
}
},
@@ -82,7 +84,8 @@ namespace Flow.Launcher.Plugin.PluginsManager
AutoCompleteText = $"{Context.CurrentPluginMetadata.ActionKeyword} {Settings.UpdateCommand} ",
Action = _ =>
{
- Context.API.ChangeQuery($"{Context.CurrentPluginMetadata.ActionKeyword} {Settings.UpdateCommand} ");
+ Context.API.ChangeQuery(
+ $"{Context.CurrentPluginMetadata.ActionKeyword} {Settings.UpdateCommand} ");
return false;
}
}
@@ -121,14 +124,14 @@ namespace Flow.Launcher.Plugin.PluginsManager
if (Settings.AutoRestartAfterChanging)
{
message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_prompt"),
- plugin.Name, plugin.Author,
- Environment.NewLine, Environment.NewLine);
+ plugin.Name, plugin.Author,
+ Environment.NewLine, Environment.NewLine);
}
else
{
message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_prompt_no_restart"),
- plugin.Name, plugin.Author,
- Environment.NewLine);
+ plugin.Name, plugin.Author,
+ Environment.NewLine);
}
if (MessageBox.Show(message, Context.API.GetTranslation("plugin_pluginsmanager_install_title"),
@@ -155,16 +158,17 @@ namespace Flow.Launcher.Plugin.PluginsManager
}
catch (HttpRequestException e)
{
- Context.API.ShowMsgError(string.Format(Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"), plugin.Name),
- Context.API.GetTranslation("plugin_pluginsmanager_download_error"));
+ Context.API.ShowMsgError(
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_downloading_plugin"), plugin.Name),
+ Context.API.GetTranslation("plugin_pluginsmanager_download_error"));
Log.Exception("PluginsManager", "An error occurred while downloading plugin", e);
return;
}
catch (Exception e)
{
Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
- plugin.Name));
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
+ plugin.Name));
Log.Exception("PluginsManager", "An error occurred while downloading plugin", e);
return;
}
@@ -172,27 +176,29 @@ namespace Flow.Launcher.Plugin.PluginsManager
if (Settings.AutoRestartAfterChanging)
{
Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_installing_plugin"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_success_restart"),
- plugin.Name));
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_success_restart"),
+ plugin.Name));
Context.API.RestartApp();
}
else
{
Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_installing_plugin"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_success_no_restart"),
- plugin.Name));
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_success_no_restart"),
+ plugin.Name));
}
}
- internal async ValueTask> RequestUpdateAsync(string search, CancellationToken token, bool usePrimaryUrlOnly = false)
+ internal async ValueTask> RequestUpdateAsync(string search, CancellationToken token,
+ bool usePrimaryUrlOnly = false)
{
await PluginsManifest.UpdateManifestAsync(token, usePrimaryUrlOnly);
- var resultsForUpdate =
+ var resultsForUpdate = (
from existingPlugin in Context.API.GetAllPlugins()
join pluginFromManifest in PluginsManifest.UserPlugins
on existingPlugin.Metadata.ID equals pluginFromManifest.ID
- where existingPlugin.Metadata.Version.CompareTo(pluginFromManifest.Version) <
+ where String.Compare(existingPlugin.Metadata.Version, pluginFromManifest.Version,
+ StringComparison.InvariantCulture) <
0 // if current version precedes manifest version
&& !PluginManager.PluginModified(existingPlugin.Metadata.ID)
select
@@ -205,7 +211,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
existingPlugin.Metadata.IcoPath,
PluginExistingMetadata = existingPlugin.Metadata,
PluginNewUserPlugin = pluginFromManifest
- };
+ }).ToList();
if (!resultsForUpdate.Any())
return new List
@@ -227,68 +233,77 @@ namespace Flow.Launcher.Plugin.PluginsManager
IcoPath = x.IcoPath,
Action = e =>
{
-
string message;
if (Settings.AutoRestartAfterChanging)
{
- message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_prompt"),
- x.Name, x.Author,
- Environment.NewLine, Environment.NewLine);
+ message = string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_update_prompt"),
+ x.Name, x.Author,
+ Environment.NewLine, Environment.NewLine);
}
else
{
- message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_prompt_no_restart"),
- x.Name, x.Author,
- Environment.NewLine);
+ message = string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_update_prompt_no_restart"),
+ x.Name, x.Author,
+ Environment.NewLine);
}
if (MessageBox.Show(message,
Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- MessageBoxButton.YesNo) == MessageBoxResult.Yes)
+ MessageBoxButton.YesNo) != MessageBoxResult.Yes)
{
- var downloadToFilePath = Path.Combine(Path.GetTempPath(),
- $"{x.Name}-{x.NewVersion}.zip");
-
- _ = Task.Run(async delegate
- {
- if (File.Exists(downloadToFilePath))
- {
- File.Delete(downloadToFilePath);
- }
-
- await Http.DownloadAsync(x.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
- .ConfigureAwait(false);
-
- PluginManager.UpdatePlugin(x.PluginExistingMetadata, x.PluginNewUserPlugin, downloadToFilePath);
-
- if (Settings.AutoRestartAfterChanging)
- {
- Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_restart"),
- x.Name));
- Context.API.RestartApp();
- }
- else
- {
- Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_success_no_restart"),
- x.Name));
- }
- }).ContinueWith(t =>
- {
- Log.Exception("PluginsManager", $"Update failed for {x.Name}",
- t.Exception.InnerException);
- Context.API.ShowMsg(
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
- string.Format(
- Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
- x.Name));
- }, TaskContinuationOptions.OnlyOnFaulted);
-
- return true;
+ return false;
}
- return false;
+ var downloadToFilePath = Path.Combine(Path.GetTempPath(),
+ $"{x.Name}-{x.NewVersion}.zip");
+
+ _ = Task.Run(async delegate
+ {
+ if (File.Exists(downloadToFilePath))
+ {
+ File.Delete(downloadToFilePath);
+ }
+
+ await Http.DownloadAsync(x.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
+ .ConfigureAwait(false);
+
+ PluginManager.UpdatePlugin(x.PluginExistingMetadata, x.PluginNewUserPlugin,
+ downloadToFilePath);
+
+ if (Settings.AutoRestartAfterChanging)
+ {
+ Context.API.ShowMsg(
+ Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ string.Format(
+ Context.API.GetTranslation(
+ "plugin_pluginsmanager_update_success_restart"),
+ x.Name));
+ Context.API.RestartApp();
+ }
+ else
+ {
+ Context.API.ShowMsg(
+ Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ string.Format(
+ Context.API.GetTranslation(
+ "plugin_pluginsmanager_update_success_no_restart"),
+ x.Name));
+ }
+ }).ContinueWith(t =>
+ {
+ Log.Exception("PluginsManager", $"Update failed for {x.Name}",
+ t.Exception.InnerException);
+ Context.API.ShowMsg(
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
+ string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_install_error_subtitle"),
+ x.Name));
+ }, TaskContinuationOptions.OnlyOnFaulted);
+
+ return true;
+
},
ContextData =
new UserPlugin
@@ -298,6 +313,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
}
});
+ // Update all result
if (resultsForUpdate.Count() > 1)
{
var updateAllResult = new Result
@@ -310,25 +326,28 @@ namespace Flow.Launcher.Plugin.PluginsManager
string message;
if (Settings.AutoRestartAfterChanging)
{
- message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_prompt"),
- resultsForUpdate.Count(), Environment.NewLine);
+ message = string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_update_all_prompt"),
+ resultsForUpdate.Count(), Environment.NewLine);
}
else
{
- message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_prompt_no_restart"),
- resultsForUpdate.Count());
+ message = string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_update_all_prompt_no_restart"),
+ resultsForUpdate.Count());
}
if (MessageBox.Show(message,
- Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- MessageBoxButton.YesNo) == MessageBoxResult.No)
+ Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
+ MessageBoxButton.YesNo) == MessageBoxResult.No)
{
return false;
}
await Task.WhenAll(resultsForUpdate.Select(async plugin =>
{
- var downloadToFilePath = Path.Combine(Path.GetTempPath(), $"{plugin.Name}-{plugin.NewVersion}.zip");
+ var downloadToFilePath = Path.Combine(Path.GetTempPath(),
+ $"{plugin.Name}-{plugin.NewVersion}.zip");
try
{
@@ -340,7 +359,8 @@ namespace Flow.Launcher.Plugin.PluginsManager
await Http.DownloadAsync(plugin.PluginNewUserPlugin.UrlDownload, downloadToFilePath)
.ConfigureAwait(false);
- PluginManager.UpdatePlugin(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, downloadToFilePath);
+ PluginManager.UpdatePlugin(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin,
+ downloadToFilePath);
}
catch (Exception ex)
{
@@ -356,15 +376,17 @@ namespace Flow.Launcher.Plugin.PluginsManager
if (Settings.AutoRestartAfterChanging)
{
Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_success_restart"),
- resultsForUpdate.Count()));
+ string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_update_all_success_restart"),
+ resultsForUpdate.Count()));
Context.API.RestartApp();
}
else
{
Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_update_all_success_no_restart"),
- resultsForUpdate.Count()));
+ string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_update_all_success_no_restart"),
+ resultsForUpdate.Count()));
}
return true;
@@ -429,9 +451,11 @@ namespace Flow.Launcher.Plugin.PluginsManager
if (Settings.WarnFromUnknownSource)
{
if (!InstallSourceKnown(plugin.UrlDownload)
- && MessageBox.Show(string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_unknown_source_warning"),
+ && MessageBox.Show(string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_install_unknown_source_warning"),
Environment.NewLine),
- Context.API.GetTranslation("plugin_pluginsmanager_install_unknown_source_warning_title"),
+ Context.API.GetTranslation(
+ "plugin_pluginsmanager_install_unknown_source_warning_title"),
MessageBoxButton.YesNo) == MessageBoxResult.No)
return false;
}
@@ -443,10 +467,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
}
};
- return new List
- {
- result
- };
+ return new List { result };
}
private bool InstallSourceKnown(string url)
@@ -455,10 +476,12 @@ namespace Flow.Launcher.Plugin.PluginsManager
var acceptedSource = "https://github.com";
var constructedUrlPart = string.Format("{0}/{1}/", acceptedSource, author);
- return url.StartsWith(acceptedSource) && Context.API.GetAllPlugins().Any(x => x.Metadata.Website.StartsWith(constructedUrlPart));
+ return url.StartsWith(acceptedSource) &&
+ Context.API.GetAllPlugins().Any(x => x.Metadata.Website.StartsWith(constructedUrlPart));
}
- internal async ValueTask> RequestInstallOrUpdate(string search, CancellationToken token, bool usePrimaryUrlOnly = false)
+ internal async ValueTask> RequestInstallOrUpdate(string search, CancellationToken token,
+ bool usePrimaryUrlOnly = false)
{
await PluginsManifest.UpdateManifestAsync(token, usePrimaryUrlOnly);
@@ -497,7 +520,8 @@ namespace Flow.Launcher.Plugin.PluginsManager
private void Install(UserPlugin plugin, string downloadedFilePath)
{
if (!File.Exists(downloadedFilePath))
- throw new FileNotFoundException($"Plugin {plugin.ID} zip file not found at {downloadedFilePath}", downloadedFilePath);
+ throw new FileNotFoundException($"Plugin {plugin.ID} zip file not found at {downloadedFilePath}",
+ downloadedFilePath);
try
{
PluginManager.InstallPlugin(plugin, downloadedFilePath);
@@ -506,19 +530,21 @@ namespace Flow.Launcher.Plugin.PluginsManager
catch (FileNotFoundException e)
{
Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
- Context.API.GetTranslation("plugin_pluginsmanager_install_errormetadatafile"));
+ Context.API.GetTranslation("plugin_pluginsmanager_install_errormetadatafile"));
Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
}
catch (InvalidOperationException e)
{
Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_duplicate"), plugin.Name));
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_install_error_duplicate"),
+ plugin.Name));
Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
}
catch (ArgumentException e)
{
Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"), plugin.Name));
+ string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"),
+ plugin.Name));
Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
}
}
@@ -538,15 +564,17 @@ namespace Flow.Launcher.Plugin.PluginsManager
string message;
if (Settings.AutoRestartAfterChanging)
{
- message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_prompt"),
- x.Metadata.Name, x.Metadata.Author,
- Environment.NewLine, Environment.NewLine);
+ message = string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_uninstall_prompt"),
+ x.Metadata.Name, x.Metadata.Author,
+ Environment.NewLine, Environment.NewLine);
}
else
{
- message = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_prompt_no_restart"),
- x.Metadata.Name, x.Metadata.Author,
- Environment.NewLine);
+ message = string.Format(
+ Context.API.GetTranslation("plugin_pluginsmanager_uninstall_prompt_no_restart"),
+ x.Metadata.Name, x.Metadata.Author,
+ Environment.NewLine);
}
if (MessageBox.Show(message,
@@ -561,9 +589,12 @@ namespace Flow.Launcher.Plugin.PluginsManager
}
else
{
- Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_title"),
- string.Format(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_success_no_restart"),
- x.Metadata.Name));
+ Context.API.ShowMsg(
+ Context.API.GetTranslation("plugin_pluginsmanager_uninstall_title"),
+ string.Format(
+ Context.API.GetTranslation(
+ "plugin_pluginsmanager_uninstall_success_no_restart"),
+ x.Metadata.Name));
}
return true;
@@ -586,7 +617,7 @@ namespace Flow.Launcher.Plugin.PluginsManager
{
Log.Exception("Flow.Launcher.Plugin.PluginsManager", e.Message, e);
Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_error_title"),
- Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"));
+ Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"));
}
}
}
From ea5a85d16e6b504857aefe59951fcd836457cc51 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 16 Jan 2024 02:29:00 +0000
Subject: [PATCH 122/177] Bump Microsoft.Data.Sqlite from 8.0.0 to 8.0.1
(#2487)
---
.../Flow.Launcher.Plugin.BrowserBookmark.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 4ce8584fc..2ee832b81 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -56,7 +56,7 @@
-
+
\ No newline at end of file
From 0af311f80c780daae0c1eeee745011c4d38538c3 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Tue, 16 Jan 2024 21:03:57 +0100
Subject: [PATCH 123/177] Update dictionary value
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 43 ++++++++++++------------
1 file changed, 22 insertions(+), 21 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 725fd492c..5e171abed 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -94,35 +94,36 @@ namespace Flow.Launcher.Plugin.Sys
return "Title Not Found";
}
+ var translatedTitle = context.API.GetTranslation(pair.Value);
var englishTitleMatch = StringMatcher.FuzzySearch(query.Search, pair.Key);
- var translatedTitleMatch = StringMatcher.FuzzySearch(query.Search, pair.Value);
+ var translatedTitleMatch = StringMatcher.FuzzySearch(query.Search, translatedTitle);
- return englishTitleMatch.Score >= translatedTitleMatch.Score ? pair.Key : pair.Value;
+ return englishTitleMatch.Score >= translatedTitleMatch.Score ? pair.Key : translatedTitle;
}
public void Init(PluginInitContext context)
{
this.context = context;
KeywordTitleMappings = new Dictionary{
- {"Shutdown", context.API.GetTranslation("flowlauncher_plugin_sys_shutdown_computer_cmd")},
- {"Restart", context.API.GetTranslation("flowlauncher_plugin_sys_restart_computer_cmd")},
- {"Restart With Advanced Boot Options", context.API.GetTranslation("flowlauncher_plugin_sys_restart_advanced_cmd")},
- {"Log Off/Sign Out", context.API.GetTranslation("flowlauncher_plugin_sys_log_off_cmd")},
- {"Lock", context.API.GetTranslation("flowlauncher_plugin_sys_lock_cmd")},
- {"Sleep", context.API.GetTranslation("flowlauncher_plugin_sys_sleep_cmd")},
- {"Hibernate", context.API.GetTranslation("flowlauncher_plugin_sys_hibernate_cmd")},
- {"Index Option", context.API.GetTranslation("flowlauncher_plugin_sys_indexoption_cmd")},
- {"Empty Recycle Bin", context.API.GetTranslation("flowlauncher_plugin_sys_emptyrecyclebin_cmd")},
- {"Open Recycle Bin", context.API.GetTranslation("flowlauncher_plugin_sys_openrecyclebin_cmd")},
- {"Exit", context.API.GetTranslation("flowlauncher_plugin_sys_exit_cmd")},
- {"Save Settings", context.API.GetTranslation("flowlauncher_plugin_sys_save_all_settings_cmd")},
- {"Restart Flow Launcher", context.API.GetTranslation("flowlauncher_plugin_sys_restart_cmd")},
- {"Settings", context.API.GetTranslation("flowlauncher_plugin_sys_setting_cmd")},
- {"Reload Plugin Data", context.API.GetTranslation("flowlauncher_plugin_sys_reload_plugin_data_cmd")},
- {"Check For Update", context.API.GetTranslation("flowlauncher_plugin_sys_check_for_update_cmd")},
- {"Open Log Location", context.API.GetTranslation("flowlauncher_plugin_sys_open_log_location_cmd")},
- {"Flow Launcher Tips", context.API.GetTranslation("flowlauncher_plugin_sys_open_docs_tips_cmd")},
- {"Flow Launcher UserData Folder", context.API.GetTranslation("flowlauncher_plugin_sys_open_userdata_location_cmd")}
+ {"Shutdown", "flowlauncher_plugin_sys_shutdown_computer_cmd"},
+ {"Restart", "flowlauncher_plugin_sys_restart_computer_cmd"},
+ {"Restart With Advanced Boot Options", "flowlauncher_plugin_sys_restart_advanced_cmd"},
+ {"Log Off/Sign Out", "flowlauncher_plugin_sys_log_off_cmd"},
+ {"Lock", "flowlauncher_plugin_sys_lock_cmd"},
+ {"Sleep", "flowlauncher_plugin_sys_sleep_cmd"},
+ {"Hibernate", "flowlauncher_plugin_sys_hibernate_cmd"},
+ {"Index Option", "flowlauncher_plugin_sys_indexoption_cmd"},
+ {"Empty Recycle Bin", "flowlauncher_plugin_sys_emptyrecyclebin_cmd"},
+ {"Open Recycle Bin", "flowlauncher_plugin_sys_openrecyclebin_cmd"},
+ {"Exit", "flowlauncher_plugin_sys_exit_cmd"},
+ {"Save Settings", "flowlauncher_plugin_sys_save_all_settings_cmd"},
+ {"Restart Flow Launcher", "flowlauncher_plugin_sys_restart_cmd"},
+ {"Settings", "flowlauncher_plugin_sys_setting_cmd"},
+ {"Reload Plugin Data", "flowlauncher_plugin_sys_reload_plugin_data_cmd"},
+ {"Check For Update", "flowlauncher_plugin_sys_check_for_update_cmd"},
+ {"Open Log Location", "flowlauncher_plugin_sys_open_log_location_cmd"},
+ {"Flow Launcher Tips", "flowlauncher_plugin_sys_open_docs_tips_cmd"},
+ {"Flow Launcher UserData Folder", "flowlauncher_plugin_sys_open_userdata_location_cmd"}
};
}
From b2b9f7caa57c546510fedeb413f3889c60466879 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Tue, 16 Jan 2024 21:04:47 +0100
Subject: [PATCH 124/177] Add toggle game mode command
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml | 1 +
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
index 3d43fc619..282a0e809 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/en.xaml
@@ -26,6 +26,7 @@
Open Log Location
Flow Launcher Tips
Flow Launcher UserData Folder
+ Toggle Game Mode
Shutdown Computer
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 5e171abed..f532d82ba 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -123,7 +123,8 @@ namespace Flow.Launcher.Plugin.Sys
{"Check For Update", "flowlauncher_plugin_sys_check_for_update_cmd"},
{"Open Log Location", "flowlauncher_plugin_sys_open_log_location_cmd"},
{"Flow Launcher Tips", "flowlauncher_plugin_sys_open_docs_tips_cmd"},
- {"Flow Launcher UserData Folder", "flowlauncher_plugin_sys_open_userdata_location_cmd"}
+ {"Flow Launcher UserData Folder", "flowlauncher_plugin_sys_open_userdata_location_cmd"},
+ {"Toggle Game Mode", "flowlauncher_plugin_sys_toggle_game_mode_cmd"}
};
}
From 1327250a6fc29375965c903dd576309586215323 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Tue, 16 Jan 2024 22:55:25 +0100
Subject: [PATCH 125/177] Add "Open With" option to file context menu
Signed-off-by: Florian Grabmeier
---
.../ContextMenu.cs | 20 +++++++++++++++++++
.../Languages/en.xaml | 4 +++-
2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
index b4924a0fc..96a4af09c 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
@@ -52,6 +52,11 @@ namespace Flow.Launcher.Plugin.Explorer
}
}
+ if (record.Type == ResultType.File)
+ {
+ contextMenus.Add(CreateOpenWithMenu(record));
+ }
+
contextMenus.Add(CreateOpenContainingFolderResult(record));
if (record.WindowsIndexed)
@@ -434,6 +439,21 @@ namespace Flow.Launcher.Plugin.Explorer
};
}
+ private Result CreateOpenWithMenu(SearchResult record)
+ {
+ return new Result
+ {
+ Title = Context.API.GetTranslation("plugin_explorer_openwith"),
+ SubTitle = Context.API.GetTranslation("plugin_explorer_openwith_subtitle"),
+ Action = _ =>
+ {
+ Process.Start("rundll32.exe", $"{Path.Combine(Environment.SystemDirectory, "shell32.dll")},OpenAs_RunDLL {record.FullPath}");
+ return true;
+ },
+ IcoPath = Constants.ShowContextMenuImagePath
+ };
+ }
+
private void LogException(string message, Exception e)
{
Log.Exception($"|Flow.Launcher.Plugin.Folder.ContextMenu|{message}", e);
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index d5352ef1e..f2491d928 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -102,7 +102,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
From 8898a09aac613c89d726060c10bd77471be98655 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Tue, 16 Jan 2024 22:59:46 +0100
Subject: [PATCH 126/177] Add Glyph for open with
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
index 96a4af09c..4e0596a44 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
@@ -52,13 +52,13 @@ namespace Flow.Launcher.Plugin.Explorer
}
}
+ contextMenus.Add(CreateOpenContainingFolderResult(record));
+
if (record.Type == ResultType.File)
{
contextMenus.Add(CreateOpenWithMenu(record));
}
- contextMenus.Add(CreateOpenContainingFolderResult(record));
-
if (record.WindowsIndexed)
{
contextMenus.Add(CreateOpenWindowsIndexingOptions());
@@ -450,7 +450,8 @@ namespace Flow.Launcher.Plugin.Explorer
Process.Start("rundll32.exe", $"{Path.Combine(Environment.SystemDirectory, "shell32.dll")},OpenAs_RunDLL {record.FullPath}");
return true;
},
- IcoPath = Constants.ShowContextMenuImagePath
+ IcoPath = Constants.ShowContextMenuImagePath,
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue700"),
};
}
From 1d578790b57985fe133eb1abb6593fb42c13146c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 16 Jan 2024 20:58:54 -0600
Subject: [PATCH 127/177] Bump Mages from 2.0.1 to 2.0.2 (#2471)
Bumps [Mages](https://github.com/FlorianRappl/Mages) from 2.0.1 to 2.0.2.
- [Release notes](https://github.com/FlorianRappl/Mages/releases)
- [Changelog](https://github.com/FlorianRappl/Mages/blob/devel/CHANGELOG.md)
- [Commits](https://github.com/FlorianRappl/Mages/compare/v2.0.1...v2.0.2)
---
updated-dependencies:
- dependency-name: Mages
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
.../Flow.Launcher.Plugin.Calculator.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
index db731fb2c..415f852f4 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj
@@ -62,7 +62,7 @@
-
+
\ No newline at end of file
From e14e7d09590cbf03d84802d0f39eca180836f9de Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Wed, 17 Jan 2024 10:56:10 +0100
Subject: [PATCH 128/177] Update Glyph
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
index 4e0596a44..2297e5f96 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
@@ -451,7 +451,7 @@ namespace Flow.Launcher.Plugin.Explorer
return true;
},
IcoPath = Constants.ShowContextMenuImagePath,
- Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue700"),
+ Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue7ac"),
};
}
From 1020320412595d895ab0961080192d55479936dd Mon Sep 17 00:00:00 2001
From: NoPlagiarism <37241775+NoPlagiarism@users.noreply.github.com>
Date: Thu, 18 Jan 2024 01:13:38 +0500
Subject: [PATCH 129/177] [Calculator] Add comparison operators & remainder
---
Plugins/Flow.Launcher.Plugin.Calculator/Main.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
index 684de33d8..338b5bcbe 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs
@@ -20,8 +20,8 @@ namespace Flow.Launcher.Plugin.Caculator
@"eigval|eigvec|eig|sum|polar|plot|round|sort|real|zeta|" +
@"bin2dec|hex2dec|oct2dec|" +
@"factorial|sign|isprime|isinfty|" +
- @"==|~=|&&|\|\||" +
- @"[ei]|[0-9]|[\+\-\*\/\^\., ""]|[\(\)\|\!\[\]]" +
+ @"==|~=|&&|\|\||(?:\<|\>)=?|" +
+ @"[ei]|[0-9]|[\+\%\-\*\/\^\., ""]|[\(\)\|\!\[\]]" +
@")+$", RegexOptions.Compiled);
private static readonly Regex RegBrackets = new Regex(@"[\(\)\[\]]", RegexOptions.Compiled);
private static Engine MagesEngine;
From 81bfd752942be38e37a891a792bb053d0a52fb77 Mon Sep 17 00:00:00 2001
From: NoPlagiarism <37241775+NoPlagiarism@users.noreply.github.com>
Date: Thu, 18 Jan 2024 04:59:26 +0500
Subject: [PATCH 130/177] [Explorer] Fix ignoring reserved keywords (#2492)
---
.../Search/WindowsIndex/WindowsIndex.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/WindowsIndex.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/WindowsIndex.cs
index 66230937c..de565f9bd 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/WindowsIndex.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/WindowsIndex.cs
@@ -16,7 +16,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex
{
// Reserved keywords in oleDB
- private static Regex _reservedPatternMatcher = new(@"^[`\@\@\#\#\*\^,\&\&\/\\\$\%_;\[\]]+$", RegexOptions.Compiled);
+ private static Regex _reservedPatternMatcher = new(@"[`\@\@\#\#\*\^,\&\&\/\\\$\%_;\[\]]+", RegexOptions.Compiled);
private static async IAsyncEnumerable ExecuteWindowsIndexSearchAsync(string indexQueryString, string connectionString, [EnumeratorCancellation] CancellationToken token)
{
From 04e551d8bf5157f3764c1f40ccd4e98fd89c3161 Mon Sep 17 00:00:00 2001
From: Florian Grabmeier
Date: Thu, 18 Jan 2024 08:53:48 +0100
Subject: [PATCH 131/177] Replace TryGetValue
Signed-off-by: Florian Grabmeier
---
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index f532d82ba..53f08301f 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -84,21 +84,23 @@ namespace Flow.Launcher.Plugin.Sys
private string GetDynamicTitle(Query query, Result result)
{
- var pair = KeywordTitleMappings
- .Where(kvp => kvp.Key == result.Title && kvp.Key != kvp.Value)
- .FirstOrDefault();
-
- if (pair.Equals(default))
+ if (!KeywordTitleMappings.TryGetValue(result.Title, out var translationKey))
{
Log.Error($"Dynamic Title not found for: {result.Title}");
return "Title Not Found";
}
- var translatedTitle = context.API.GetTranslation(pair.Value);
- var englishTitleMatch = StringMatcher.FuzzySearch(query.Search, pair.Key);
+ var translatedTitle = context.API.GetTranslation(translationKey);
+
+ if (result.Title == translatedTitle)
+ {
+ return result.Title;
+ }
+
+ var englishTitleMatch = StringMatcher.FuzzySearch(query.Search, result.Title);
var translatedTitleMatch = StringMatcher.FuzzySearch(query.Search, translatedTitle);
- return englishTitleMatch.Score >= translatedTitleMatch.Score ? pair.Key : translatedTitle;
+ return englishTitleMatch.Score >= translatedTitleMatch.Score ? result.Title : translatedTitle;
}
public void Init(PluginInitContext context)
From 82a8d56206a70bf370a5ba61e3393e5d3e231d35 Mon Sep 17 00:00:00 2001
From: flox_x <93255373+flooxo@users.noreply.github.com>
Date: Sun, 21 Jan 2024 15:30:23 +0100
Subject: [PATCH 132/177] Update log message
Co-authored-by: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
---
Plugins/Flow.Launcher.Plugin.Sys/Main.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index 53f08301f..1ec07915d 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -86,7 +86,7 @@ namespace Flow.Launcher.Plugin.Sys
{
if (!KeywordTitleMappings.TryGetValue(result.Title, out var translationKey))
{
- Log.Error($"Dynamic Title not found for: {result.Title}");
+ Log.Error("Flow.Launcher.Plugin.Sys.Main", $"Dynamic Title not found for: {result.Title}");
return "Title Not Found";
}
From 852b990efdf902918cc428134e090c297739f25c Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Mon, 22 Jan 2024 08:04:08 -0500
Subject: [PATCH 133/177] Use environmental variables and increase number of
days until marked stale
---
.github/workflows/stale.yml | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index dd3fb2fca..004e9327f 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -6,6 +6,11 @@ on:
schedule:
- cron: '30 1 * * *'
+env:
+ days-before-stale: 60
+ days-before-close: 7
+ exempt-issue-labels: 'keep-fresh'
+
jobs:
stale:
runs-on: ubuntu-latest
@@ -16,11 +21,11 @@ jobs:
- uses: actions/stale@v9
with:
stale-issue-message: 'This issue is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
- days-before-stale: 45
- days-before-close: 7
+ days-before-stale: ${{ env.days-before-stale }}
+ days-before-close: ${{ env.days-before-close }}
days-before-pr-close: -1
exempt-all-milestones: true
close-issue-message: 'This issue was closed because it has been stale for 7 days with no activity. If you feel this issue still needs attention please feel free to reopen.'
stale-pr-label: 'no-pr-activity'
- exempt-issue-labels: 'keep-fresh'
+ exempt-issue-labels: ${{ env.exempt-issue-labels }}
exempt-pr-labels: 'keep-fresh,awaiting-approval,work-in-progress'
From 3280b06ec94ec5fa0f49f40e5c65200693ef34ed Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Mon, 22 Jan 2024 08:04:22 -0500
Subject: [PATCH 134/177] Add help message to stale message
---
.github/workflows/stale.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index 004e9327f..719f2556e 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -20,7 +20,7 @@ jobs:
steps:
- uses: actions/stale@v9
with:
- stale-issue-message: 'This issue is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
+ stale-issue-message: 'This issue is stale because it has been open ${{ env.days-before-stale }} days with no activity. Remove stale label or comment or this will be closed in ${{ env.days-before-stale }} days.\n\nAlternatively this issue can be kept open by adding one of the following labels:\n${{ env.exempt-issue-labels }}'
days-before-stale: ${{ env.days-before-stale }}
days-before-close: ${{ env.days-before-close }}
days-before-pr-close: -1
From acebf04c4ca2be56c25499f5ed8a5b5760d96896 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Tue, 23 Jan 2024 17:04:38 +1100
Subject: [PATCH 135/177] New Crowdin updates (#2494)
* New translations en.xaml (French)
[ci skip]
* New translations en.xaml (German)
[ci skip]
* New translations en.xaml (Italian)
[ci skip]
* New translations en.xaml (Dutch)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (Chinese Simplified)
[ci skip]
* New translations en.xaml (Portuguese, Brazilian)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (Portuguese, Brazilian)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (German)
[ci skip]
* New translations en.xaml (Italian)
[ci skip]
* New translations en.xaml (Polish)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (Italian)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (French)
[ci skip]
* New translations en.xaml (Arabic)
[ci skip]
* New translations en.xaml (Czech)
[ci skip]
* New translations en.xaml (Danish)
[ci skip]
* New translations en.xaml (German)
[ci skip]
* New translations en.xaml (Italian)
[ci skip]
* New translations en.xaml (Japanese)
[ci skip]
* New translations en.xaml (Korean)
[ci skip]
* New translations en.xaml (Dutch)
[ci skip]
* New translations en.xaml (Polish)
[ci skip]
* New translations en.xaml (Portuguese)
[ci skip]
* New translations en.xaml (Russian)
[ci skip]
* New translations en.xaml (Slovak)
[ci skip]
* New translations en.xaml (Turkish)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (Chinese Simplified)
[ci skip]
* New translations en.xaml (Chinese Traditional)
[ci skip]
* New translations en.xaml (Portuguese, Brazilian)
[ci skip]
* New translations en.xaml (Norwegian Bokmal)
[ci skip]
* New translations en.xaml (Serbian (Latin))
[ci skip]
* New translations en.xaml (Spanish (Modern))
[ci skip]
* New translations en.xaml (Spanish, Latin America)
[ci skip]
* New translations en.xaml (German)
[ci skip]
* New translations en.xaml (Italian)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (German)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (Italian)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (French)
[ci skip]
* New translations en.xaml (Arabic)
[ci skip]
* New translations en.xaml (Czech)
[ci skip]
* New translations en.xaml (Danish)
[ci skip]
* New translations en.xaml (German)
[ci skip]
* New translations en.xaml (Italian)
[ci skip]
* New translations en.xaml (Japanese)
[ci skip]
* New translations en.xaml (Korean)
[ci skip]
* New translations en.xaml (Dutch)
[ci skip]
* New translations en.xaml (Polish)
[ci skip]
* New translations en.xaml (Portuguese)
[ci skip]
* New translations en.xaml (Russian)
[ci skip]
* New translations en.xaml (Slovak)
[ci skip]
* New translations en.xaml (Turkish)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (Chinese Simplified)
[ci skip]
* New translations en.xaml (Chinese Traditional)
[ci skip]
* New translations en.xaml (Portuguese, Brazilian)
[ci skip]
* New translations en.xaml (Norwegian Bokmal)
[ci skip]
* New translations en.xaml (Serbian (Latin))
[ci skip]
* New translations en.xaml (Spanish (Modern))
[ci skip]
* New translations en.xaml (Spanish, Latin America)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations en.xaml (Ukrainian)
[ci skip]
* New translations resources.resx (French)
[ci skip]
* New translations resources.resx (Ukrainian)
[ci skip]
---
Flow.Launcher/Languages/de.xaml | 50 +-
Flow.Launcher/Languages/fr.xaml | 8 +-
Flow.Launcher/Languages/it.xaml | 152 +-
Flow.Launcher/Languages/nl.xaml | 2 +-
Flow.Launcher/Languages/pt-br.xaml | 102 +-
Flow.Launcher/Languages/uk-UA.xaml | 318 ++---
Flow.Launcher/Languages/zh-cn.xaml | 4 +-
.../Languages/pt-br.xaml | 10 +-
.../Languages/uk-UA.xaml | 36 +-
.../Languages/uk-UA.xaml | 22 +-
.../Languages/ar.xaml | 4 +-
.../Languages/cs.xaml | 4 +-
.../Languages/da.xaml | 4 +-
.../Languages/de.xaml | 46 +-
.../Languages/es-419.xaml | 4 +-
.../Languages/es.xaml | 4 +-
.../Languages/fr.xaml | 4 +-
.../Languages/it.xaml | 92 +-
.../Languages/ja.xaml | 4 +-
.../Languages/ko.xaml | 4 +-
.../Languages/nb.xaml | 4 +-
.../Languages/nl.xaml | 4 +-
.../Languages/pl.xaml | 8 +-
.../Languages/pt-br.xaml | 4 +-
.../Languages/pt-pt.xaml | 4 +-
.../Languages/ru.xaml | 4 +-
.../Languages/sk.xaml | 4 +-
.../Languages/sr.xaml | 4 +-
.../Languages/tr.xaml | 4 +-
.../Languages/uk-UA.xaml | 228 +--
.../Languages/zh-cn.xaml | 4 +-
.../Languages/zh-tw.xaml | 4 +-
.../Languages/it.xaml | 2 +-
.../Languages/uk-UA.xaml | 6 +-
.../Languages/ar.xaml | 21 +-
.../Languages/cs.xaml | 21 +-
.../Languages/da.xaml | 21 +-
.../Languages/de.xaml | 25 +-
.../Languages/es-419.xaml | 21 +-
.../Languages/es.xaml | 21 +-
.../Languages/fr.xaml | 89 +-
.../Languages/it.xaml | 21 +-
.../Languages/ja.xaml | 21 +-
.../Languages/ko.xaml | 21 +-
.../Languages/nb.xaml | 21 +-
.../Languages/nl.xaml | 21 +-
.../Languages/pl.xaml | 21 +-
.../Languages/pt-br.xaml | 21 +-
.../Languages/pt-pt.xaml | 21 +-
.../Languages/ru.xaml | 21 +-
.../Languages/sk.xaml | 21 +-
.../Languages/sr.xaml | 21 +-
.../Languages/tr.xaml | 21 +-
.../Languages/uk-UA.xaml | 89 +-
.../Languages/zh-cn.xaml | 23 +-
.../Languages/zh-tw.xaml | 21 +-
.../Languages/de.xaml | 2 +-
.../Languages/it.xaml | 8 +-
.../Languages/uk-UA.xaml | 10 +-
.../Languages/de.xaml | 12 +-
.../Languages/uk-UA.xaml | 126 +-
.../Languages/ar.xaml | 2 +
.../Languages/cs.xaml | 2 +
.../Languages/da.xaml | 2 +
.../Languages/de.xaml | 2 +
.../Languages/es-419.xaml | 2 +
.../Languages/es.xaml | 2 +
.../Languages/fr.xaml | 2 +
.../Languages/it.xaml | 4 +-
.../Languages/ja.xaml | 2 +
.../Languages/ko.xaml | 2 +
.../Languages/nb.xaml | 2 +
.../Languages/nl.xaml | 2 +
.../Languages/pl.xaml | 2 +
.../Languages/pt-br.xaml | 2 +
.../Languages/pt-pt.xaml | 2 +
.../Languages/ru.xaml | 2 +
.../Languages/sk.xaml | 2 +
.../Languages/sr.xaml | 2 +
.../Languages/tr.xaml | 2 +
.../Languages/uk-UA.xaml | 22 +-
.../Languages/zh-cn.xaml | 2 +
.../Languages/zh-tw.xaml | 2 +
.../Languages/ar.xaml | 2 +-
.../Languages/cs.xaml | 2 +-
.../Languages/da.xaml | 2 +-
.../Languages/de.xaml | 6 +-
.../Languages/es-419.xaml | 2 +-
.../Languages/es.xaml | 4 +-
.../Languages/fr.xaml | 4 +-
.../Languages/it.xaml | 4 +-
.../Languages/ja.xaml | 2 +-
.../Languages/ko.xaml | 2 +-
.../Languages/nb.xaml | 2 +-
.../Languages/nl.xaml | 2 +-
.../Languages/pl.xaml | 2 +-
.../Languages/pt-br.xaml | 2 +-
.../Languages/pt-pt.xaml | 4 +-
.../Languages/ru.xaml | 2 +-
.../Languages/sk.xaml | 4 +-
.../Languages/sr.xaml | 2 +-
.../Languages/tr.xaml | 2 +-
.../Languages/uk-UA.xaml | 60 +-
.../Languages/zh-cn.xaml | 2 +-
.../Languages/zh-tw.xaml | 2 +-
.../Languages/uk-UA.xaml | 18 +-
.../Languages/uk-UA.xaml | 64 +-
.../Properties/Resources.fr-FR.resx | 114 +-
.../Properties/Resources.uk-UA.resx | 1270 ++++++++---------
109 files changed, 1993 insertions(+), 1575 deletions(-)
diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml
index 217404da0..a360140d6 100644
--- a/Flow.Launcher/Languages/de.xaml
+++ b/Flow.Launcher/Languages/de.xaml
@@ -113,7 +113,7 @@
Erweiterungen laden
New Release
Recently Updated
- Plugins
+ Erweiterungen
Installed
Aktualisieren
Installieren
@@ -173,13 +173,13 @@
Preview Hotkey
Enter shortcut to show/hide preview in search window.
Öffnen Sie die Ergebnismodifikatoren
- Select a modifier key to open selected result via keyboard.
+ Wählen Sie eine Modifikatortaste, um das ausgewählte Ergebnis über die Tastatur zu öffnen.
Hotkey anzeigen
- Show result selection hotkey with results.
+ Hotkey für die Ergebnisauswahl mit Ergebnissen anzeigen.
Benutzerdefinierte Abfrage Tastenkombination
Custom Query Shortcut
Built-in Shortcut
- Query
+ Abfrage
Shortcut
Expansion
Beschreibung
@@ -191,12 +191,12 @@
Are you sure you want to delete shortcut: {0} with expansion {1}?
Get text from clipboard.
Get path from active explorer.
- Query window shadow effect
- Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
- Window Width Size
+ Schatteneffekt im Abfragefenster
+ Der Schatteneffekt beansprucht die GPU stark. Nicht empfohlen, wenn die Leistung deines Computers begrenzt ist.
+ Fenstergröße Breite
You can also quickly adjust this by using Ctrl+[ and Ctrl+].
- Use Segoe Fluent Icons
- Use Segoe Fluent Icons for query results where supported
+ Segoe Fluent Icons verwenden
+ Segoe Fluent Icons für Abfrageergebnisse verwenden, sofern unterstützt
Press Key
@@ -226,15 +226,15 @@
Nach Aktuallisierungen Suchen
Become A Sponsor
Eine neue Version ({0}) ist vorhanden. Bitte starten Sie Flow Launcher neu.
- Check updates failed, please check your connection and proxy settings to api.github.com.
+ Überprüfung der Updates fehlgeschlagen. Bitte überprüfen Sie Ihre Verbindungs- und Proxy-Einstellungen zu api.github.com.
- Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
- or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
+ Das Herunterladen von Updates ist fehlgeschlagen. Bitte überprüfen Sie Ihre Verbindungs- und Proxy-Einstellungen zu github-cloud.s3.amazonaws.com,
+ oder gehen Sie zu https://github.com/Flow-Launcher/Flow.Launcher/releases, um Updates manuell herunterzuladen.
Versionshinweise
- Usage Tips
- DevTools
- Setting Folder
+ Verwendungshinweise
+ Entwicklerwerkzeuge
+ Einstellungsordner
Protokoll-Verzeichnis
Protokolldateien leeren
Sind Sie sicher, dass Sie alle Protokolle löschen möchten?
@@ -246,13 +246,13 @@
"%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
Datei-Manager
Profilname
- File Manager Path
+ Dateimanager-Pfad
Argumente für Ordner
Argumente für Datei
Standard-Webbrowser
- The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ Die Standardeinstellung verwendet die Browser-Standardeinstellung des Betriebssystems. Falls angegeben, verwendet Flow diesen Browser.
Browser
Browser-Name
Browserpfad
@@ -262,8 +262,8 @@
Priorität ändern
- Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
- Please provide an valid integer for Priority!
+ Je höher die Zahl, desto höher wird das Ergebnis gewertet. Versuchen Sie es mit einer 5. Sollen die Ergebnisse tiefer sein als diejenigen anderer Plugins, verwenden Sie eine negative Zahl
+ Bitte eine gültige Ganzzahl angeben für die Priorität!
Altes Aktionsschlüsselwort
@@ -274,7 +274,7 @@
Neues Aktionsschlüsselwort darf nicht leer sein
Aktionsschlüsselwort ist schon bei einem anderen Plugin in verwendung. Bitte stellen Sie ein anderes Aktionsschlüsselwort ein.
Erfolgreich
- Completed successfully
+ Erfolgreich abgeschlossen
Benutzen Sie * wenn Sie ein Aktionsschlüsselwort definieren wollen.
@@ -347,10 +347,10 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
Tastenkombination
- Action Keyword and Commands
+ Aktions-Schlüsselwort und Befehle
Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
- Let's Start Flow Launcher
- Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+ Starte Flow-Launcher
+ Fertig. Genießen Sie Flow Launcher. Die Tastenkombination nicht vergessen, um Flow Launcher zu starten :)
@@ -372,7 +372,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Shell-Befehl
s Bluetooth
Bluetooth in Windows-Einstellungen
- sn
- Sticky Notes
+ nt
+ Notizen
diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml
index 144f0e6fa..c33cefbfb 100644
--- a/Flow.Launcher/Languages/fr.xaml
+++ b/Flow.Launcher/Languages/fr.xaml
@@ -1,7 +1,7 @@
- Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.
+ Échec lors de l'enregistrement du raccourci : {0}
Flow Launcher
Impossible de lancer {0}
Le format de fichier n'est pas un plugin Flow Launcher valide
@@ -28,7 +28,7 @@
Rétablir la position de la fenêtre de recherche
- Paramètres - Flow Launcher
+ Paramètres
Général
Mode Portable
Stocker tous les paramètres et données utilisateur dans un seul dossier (Pratique en cas d'utilisation de disques amovibles ou de services cloud).
@@ -287,9 +287,9 @@
Raccourci de requête personnalisée
Entrez un raccourci qui s'étend automatiquement à la requête spécifiée.
- A shortcut is expanded when it exactly matches the query.
+ Un raccourci est développé lorsqu'il correspond exactement à la requête.
-If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query.
+Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celui-ci correspond à n'importe quelle position dans la requête. Les raccourcis intégrés correspondent à n'importe quelle position dans une requête.
Le raccourci existe déjà, veuillez entrer un nouveau raccourci ou modifier le raccourci existant.
Raccourci et/ou son expansion est vide.
diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml
index 5c970f301..2b5157962 100644
--- a/Flow.Launcher/Languages/it.xaml
+++ b/Flow.Launcher/Languages/it.xaml
@@ -1,7 +1,7 @@
- Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.
+ Registrazione del tasto di scelta rapida "{0}" non riuscita. Il tasto di scelta rapida potrebbe essere in uso da un altro programma. Passa a un altro tasto di scelta rapida o esci da un altro programma.
Flow Launcher
Avvio fallito {0}
Formato file plugin non valido
@@ -17,15 +17,15 @@
Copia
Taglia
Incolla
- Undo
- Select All
+ Annulla
+ Seleziona Tutto
File
Cartella
Testo
Modalità gioco
Sospendere l'uso dei tasti di scelta rapida.
- Position Reset
- Reset search window position
+ Ripristina Posizione
+ Ripristina posizione finestra di ricerca
Impostazioni
@@ -33,21 +33,21 @@
Modalità portatile
Memorizzare tutte le impostazioni e i dati dell'utente in un'unica cartella (utile se utilizzato con unità rimovibili o servizi cloud).
Avvia Wow all'avvio di Windows
- Error setting launch on startup
+ Errore nell'impostazione del lancio all'avvio
Nascondi Flow Launcher quando perde il focus
Non mostrare le notifiche per una nuova versione
- Search Window Position
- Remember Last Position
- Monitor with Mouse Cursor
- Monitor with Focused Window
- Primary Monitor
- Custom Monitor
- Search Window Position on Monitor
- Center
- Center Top
- Left Top
- Right Top
- Custom Position
+ Posizione Finestra Di Ricerca
+ Ricorda L'Ultima Posizione
+ Monitora con il cursore del mouse
+ Monitora con la finestra in primo piano
+ Monitor Principale
+ Monitor Personalizzato
+ Posizione della finestra di ricerca sul monitor
+ Centro
+ Centrato in alto
+ Sinistra in alto
+ Destra in alto
+ Posizione personalizzata
Lingua
Comportamento ultima ricerca
Mostra/nasconde i risultati precedenti quando Flow Launcher viene riattivato.
@@ -55,37 +55,37 @@
Seleziona ultima ricerca
Cancella ultima ricerca
Numero massimo di risultati mostrati
- You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ È anche possibile regolarlo rapidamente utilizzando CTRL+Più e CTRL+Meno.
Ignora i tasti di scelta rapida in applicazione a schermo pieno
Disattivare l'attivazione di Flow Launcher quando è attiva un'applicazione a schermo intero (consigliato per i giochi).
Gestore File predefinito
Selezionare il Gestore file da usare all'apertura della cartella.
Browser predefinito
Impostazione per Nuova scheda, Nuova finestra, Modalità privata.
- Python Path
- Node.js Path
- Please select the Node.js executable
- Please select pythonw.exe
- Always Start Typing in English Mode
- Temporarily change your input method to English mode when activating Flow.
+ Percorso di Python
+ Percorso di Node.js
+ Seleziona l'eseguibile di Node.js
+ Selezionare pythonw.exe
+ Inizia sempre a digitare in modalità inglese
+ Cambiare temporaneamente il metodo di input in modalità inglese quando si attiva Flow.
Aggiornamento automatico
Seleziona
Nascondi Flow Launcher all'avvio
Nascondi Icona nell'Area di Notifica
- When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Quando l'icona è nascosta dal menu delle icone nascoste, il menu Impostazioni può essere aperto facendo clic con il tasto destro del mouse sulla finestra di ricerca.
Precisione di ricerca delle query
Modifica il punteggio minimo richiesto per i risultati.
Dovrebbe usare il Pinyin
Consente di utilizzare il Pinyin per la ricerca. Il Pinyin è il sistema standard di ortografia romanizzata per la traduzione del cinese.
- Always Preview
- Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Mostra Sempre Anteprima
+ Apri sempre il pannello di anteprima quando Flow si attiva. Premi {0} per attivare l'anteprima.
L'effetto ombra non è consentito mentre il tema corrente ha un effetto di sfocatura abilitato
- Search Plugin
- Ctrl+F to search plugins
- No results found
- Please try a different search.
+ Plugin di ricerca
+ Ctrl+F per cercare plugin
+ Nessun risultato trovato
+ Prova una ricerca diversa.
Plugin
Plugin
Cerca altri plugins
@@ -99,7 +99,7 @@
Priorità Attuale
Nuova Priorità
Priorità
- Change Plugin Results Priority
+ Priorità Dei Risultati Dei Plugin
Cartella Plugin
da
Tempo di avvio:
@@ -111,35 +111,35 @@
Negozio dei Plugin
- New Release
- Recently Updated
+ Nuova Versione
+ Aggiornati di recente
Plugin
- Installed
+ Installati
Aggiorna
Installa
Disinstalla
Aggiorna
- Plugin already installed
- New Version
- This plugin has been updated within the last 7 days
- New Update is Available
+ Plugin già installato
+ Nuova versione
+ Questo plugin è stato aggiornato negli ultimi 7 giorni
+ Nuovo aggiornamento disponibile
Tema
- Appearance
+ Aspetto
Sfoglia per altri temi
Come creare un tema
Ciao
Esplora Risorse
- Search for files, folders and file contents
+ Cerca i file, le cartelle e il contenuto dei file
WebSearch
- Search the web with different search engine support
- Program
- Launch programs as admin or a different user
+ Cerca sul web con diversi motori di ricerca supportati
+ Programma
+ Avvia programmi come amministratore o un altro utente
ProcessKiller
- Terminate unwanted processes
+ Termina i processi indesiderati
Font campo di ricerca
Font campo risultati
Modalità finestra
@@ -156,22 +156,22 @@
Riproduce un piccolo suono all'apertura della finestra di ricerca
Animazione
Usa l'animazione nell'interfaccia utente
- Animation Speed
- The speed of the UI animation
- Slow
- Medium
- Fast
- Custom
- Clock
- Date
+ Velocità di animazione
+ La velocità dell'animazione dell'interfaccia utente
+ Lento
+ Medio
+ Veloce
+ Personalizzato
+ Orologio
+ Data
Tasti scelta rapida
Tasti scelta rapida
Tasto scelta rapida Flow Launcher
Immettere la scorciatoia per mostrare/nascondere Flow Launcher.
- Preview Hotkey
- Enter shortcut to show/hide preview in search window.
+ Anteprima Scorciatoia
+ Inserisci la scorciatoia per mostrare/nascondere l'anteprima nella finestra di ricerca.
Apri modificatori di risultato
Seleziona un tasto modificatore per aprire il risultato selezionato via tastiera.
Mostra tasto di scelta rapida
@@ -180,24 +180,24 @@
Custom Query Shortcut
Built-in Shortcut
Ricerca
- Shortcut
- Expansion
+ Scorciatoia
+ Espansione
Descrizione
Cancella
Modifica
Aggiungi
Selezionare un oggetto
Volete cancellare il tasto di scelta rapida per il plugin {0}?
- Are you sure you want to delete shortcut: {0} with expansion {1}?
- Get text from clipboard.
- Get path from active explorer.
+ Sei sicuro di voler eliminare la scorciatoia: {0} con espansione {1}?
+ Ottieni testo dagli appunti.
+ Ottieni il percorso dall'esplora risorse attivo.
Effetto ombra della finestra di ricerca
L'effetto ombra utilizzerà in maniera sostanziale la GPU. Non consigliato se le performance del tuo computer sono limitate.
Dimensione larghezza della finestra
- You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ È anche possibile regolarlo rapidamente utilizzando CTRL+[ e CTRL+].
Usa Icone Segoe Fluent
Usa Icone Segoe Fluent per risultati di ricerca dove supportate
- Press Key
+ Premi tasto
Proxy HTTP
@@ -221,10 +221,10 @@
GitHub
Documentazione
Versione
- Icons
+ Icone
Hai usato Flow Launcher {0} volte
Cerca aggiornamenti
- Become A Sponsor
+ Diventa un sostenitore
Una nuova versione {0} è disponibile, riavvia Flow Launcher per favore.
Ricerca aggiornamenti fallita, per favore controlla la tua connessione e le eventuali impostazioni proxy per api.github.com.
@@ -236,8 +236,8 @@
Strumenti per sviluppatori
Cartella delle impostazioni
Cartella dei Log
- Clear Logs
- Are you sure you want to delete all logs?
+ Cancella i log
+ Sei sicuro di voler cancellare tutti i log?
Wizard
@@ -279,21 +279,21 @@
Tasti scelta rapida per ricerche personalizzate
- Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Premere un tasto di scelta rapida personalizzato per aprire Flow Launcher e inserire automaticamente la query specificata.
Anteprima
Tasto di scelta rapida non disponibile, per favore scegli un nuovo tasto di scelta rapida
Tasto di scelta rapida plugin non valido
Aggiorna
- Custom Query Shortcut
- Enter a shortcut that automatically expands to the specified query.
- A shortcut is expanded when it exactly matches the query.
+ Scorciatoia per ricerca personalizzata
+ Inserisci una scorciatoia che si espande automaticamente alla query specificata.
+ Una scorciatoia viene espansa quando corrisponde esattamente alla query.
-If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query.
+Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde a qualsiasi posizione nella query. Le scorciatoie integrate corrispondono a qualsiasi posizione in una query.
- Shortcut already exists, please enter a new Shortcut or edit the existing one.
- Shortcut and/or its expansion is empty.
+ La scorciatoia esiste già, inserisci una nuova scorciatoia o modifica quella esistente.
+ La scorciatoia e/o la sua espansione sono vuote.
Tasto di scelta rapida non disponibile
@@ -358,7 +358,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Navigazione tra le voci
Apri il menu di scelta rapida
Apri cartella superiore
- Run as Admin / Open Folder in Default File Manager
+ Esegui come Admin / Apri cartella in File Manager predefinito
Cronologia Query
Torna al risultato nel menu contestuale
Autocompleta
@@ -371,7 +371,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
> ping 8.8.8.8
Comando Della shell
s Bluetooth
- Bluetooth in Windows Settings
+ Bluetooth in Impostazioni Windows
sn
Sticky Notes
diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml
index 16b1b01ad..3a2ba44c1 100644
--- a/Flow.Launcher/Languages/nl.xaml
+++ b/Flow.Launcher/Languages/nl.xaml
@@ -92,7 +92,7 @@
Aan
Disable
Actie sneltoets instelling
- Action terfwoorden
+ Actie sneltoets
Huidige actie sneltoets
Nieuw actie sneltoets
Wijzig actie-sneltoets
diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml
index fda79522b..23a669536 100644
--- a/Flow.Launcher/Languages/pt-br.xaml
+++ b/Flow.Launcher/Languages/pt-br.xaml
@@ -1,7 +1,7 @@
- Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.
+ Falha em registrar a tecla de atalho "{0}". A combinação pode estar em uso por outro programa. Mude para uma tecla de atalho diferente, ou encerre o outro programa.
Flow Launcher
Não foi possível iniciar {0}
Formato de plugin Flow Launcher inválido
@@ -158,20 +158,20 @@
Utilizar Animação na Interface
Velocidade de Animação
Altere a velocidade da animação da interface
- Slow
- Medium
- Fast
- Custom
- Clock
- Date
+ Lento
+ Médio
+ Rápido
+ Personalizado
+ Relógio
+ Data
Atalho
Atalho
Atalho do Flow Launcher
Digite o atalho para exibir/ocultar o Flow Launcher.
- Preview Hotkey
- Enter shortcut to show/hide preview in search window.
+ Atalho de pré-visualização
+ Digite o atalho para exibir/ocultar a pré-visualização na janela de pesquisa.
Modificadores de resultado aberto
Selecione uma tecla modificadora para abrir o resultar selecionado pelo teclado.
Mostrar tecla de atalho
@@ -181,23 +181,23 @@
Built-in Shortcut
Consulta
Atalho
- Expansion
+ Expansão
Descrição
Apagar
Editar
Adicionar
Por favor selecione um item
Tem cereza de que deseja deletar o atalho {0} do plugin?
- Are you sure you want to delete shortcut: {0} with expansion {1}?
- Get text from clipboard.
- Get path from active explorer.
+ Tem certeza que deseja excluir o atalho: {0} com expansão {1}?
+ Exibe o texto da área de transferência.
+ Exibe o caminho do explorador ativo.
Efeito de sombra da janela de consulta
- Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
+ O efeito de sombra tem um uso substancial da GPU. Não recomendado se o desempenho do seu computador é limitado.
Largura da janela
- You can also quickly adjust this by using Ctrl+[ and Ctrl+].
+ Você também pode ajustar isso rapidamente usando Ctrl+[ e Ctrl+].
Usar Segoe Fluent Icons
Usar Segoe Fluent Icons para resultados da consulta quando suportado
- Press Key
+ Apertar Tecla
Proxy HTTP
@@ -224,7 +224,7 @@
Ícones
Você ativou o Flow Launcher {0} vezes
Procurar atualizações
- Become A Sponsor
+ Torne-se um Sponsor
A nova versão {0} está disponível, por favor reinicie o Flow Launcher.
Falha ao procurar atualizações, confira sua conexão e configuração de proxy para api.github.com.
@@ -234,36 +234,36 @@
Notas de Versão:
Dicas de Uso
Ferramentas de Desenvolvedor
- Setting Folder
- Log Folder
- Clear Logs
- Are you sure you want to delete all logs?
+ Pasta de configuração
+ Pasta de Registro
+ Limpar Registros
+ Tem certeza que quer excluir todos os registros?
Assistente
- Select File Manager
- Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
- "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
+ Selecione o Gerenciador de Arquivos
+ Por favor, especifique a localização do arquivo do gerenciador de arquivos que você está usando e adicione argumentos se necessário. Os argumentos padrões são "%d", e um caminho é digitado naquela localização. Por exemplo, se um comando é necessário tal qual "totalcmd.exe /A c:\windows", o argumento é /A "%d".
+ "%f" é um argumento que representa o caminho do arquivo. É utilizado para enfatizar o nome da pasta/arquivo ao abrir uma localização de arquivo específica em um gerenciador de arquivo de terceiros. Esse argumento só está disponível no item "Arg para Arquivo". Se o gerenciador de arquivos não tem essa função, você pode usar "%d".
Gerenciador de Arquivos
- Profile Name
- File Manager Path
- Arg For Folder
- Arg For File
+ Nome do Perfil
+ Caminho do Gerenciador de Arquivos
+ Arg para Pasta
+ Arg para Arquivo
Navegador da Web Padrão
- The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
+ A configuração padrão segue a configuração do navegador padrão do sistema. Caso seja especificado separadamente, Flow usa o navegador definido pelo usuário.
Navegador
Nome do Navegador
- Browser Path
+ Caminho do Navegador
Nova Janela
Nova Aba
- Private Mode
+ Modo Privado
Alterar Prioridade
- Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
- Please provide an valid integer for Priority!
+ Quanto maior o número, maior o resultado será classificado. Tente configurá-lo para 5. Se você quer que os resultados sejam menores do que qualquer outro plugin, coloque um número negativo
+ Por favor, forneça um inteiro válido em Prioridade!
Antiga palavra-chave da ação
@@ -279,21 +279,21 @@
Atalho de Consulta Personalizada
- Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Aperte uma tecla de atalho personalizada para abrir o Flow Launcher e insira a pesquisa especificada automaticamente.
Prévia
Atalho indisponível, escolha outro
Atalho de plugin inválido
Atualizar
- Custom Query Shortcut
- Enter a shortcut that automatically expands to the specified query.
+ Atalho Personalidado de Pesquisa
+ Introduza um atalho que expanda automaticamente para a pesquisa especificada.
A shortcut is expanded when it exactly matches the query.
If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query.
- Shortcut already exists, please enter a new Shortcut or edit the existing one.
- Shortcut and/or its expansion is empty.
+ O atalho já existe, por favor, digite um novo atalho ou edite o existente.
+ Atalho e/ou sua expansão está vazia.
Atalho indisponível
@@ -326,13 +326,13 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Flow Launcher was not able to move your user profile data to the new update version.
Please manually move your profile data folder from {0} to {1}
- New Update
+ Nova Atualização
A nova versão {0} do Flow Launcher agora está disponível
Ocorreu um erro ao tentar instalar atualizações do progama
Atualizar
Cancelar
Falha ao Atualizar
- Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ Verifique sua conexão e tente atualizar as configurações de proxy para github-cloud.s3.amazonaws.com.
Essa atualização reiniciará o Flow Launcher
Os seguintes arquivos serão atualizados
Atualizar arquivos
@@ -341,15 +341,15 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Pular
Bem-vindo ao Flow Launcher
- Hello, this is the first time you are running Flow Launcher!
- Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
- Search and run all files and applications on your PC
- Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
- Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
+ Olá, está é a primeira vez que você executa o Flow Launcher!
+ Antes de começar, este assistente ajudará a configurar o Flow Launcher. Você pode pular essa etapa se quiser. Por favor, escolha um idioma
+ Pesquise e execute todos os arquivos e programas no seu PC
+ Pesquise tudo de programas, arquivos, favoritos, YouTube, Twitter e mais. Tudo isso do conforto do seu teclado sem precisar tocar o mouse.
+ Flow Launcher se inicia com a tecla de atalho abaixo, vá em frente e experimente agora. Para mudar, clique na barra e digite o atalho desejado no teclado.
Teclas de Atalho
- Action Keyword and Commands
+ Palavras-Chave de Ação e Comandos
Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
- Let's Start Flow Launcher
+ Vamos iniciar o Flow Launcher
Finalizado. Aproveite o Flow Launcher. Não esqueça o atalho para iniciar :)
@@ -357,10 +357,10 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Voltar / Menu de Contexto
Item de Navegação
Abrir Menu de Contexto
- Open Containing Folder
- Run as Admin / Open Folder in Default File Manager
+ Abrir a pasta correspondente
+ Executar como administrador / Abrir pasta no gerenciador de arquivos padrão
Histórico de Pesquisas
- Back to Result in Context Menu
+ Voltar ao resultado no menu de contexto
Autocompletar
Abrir / Executar Item Selecionado
Abrir Janela de Configurações
@@ -371,7 +371,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
> ping 8.8.8.8
Comando de Console
s Bluetooth
- Bluetooth in Windows Settings
+ Bluetooth nas Configurações do Windows
sn
Notas Autoadesivas
diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml
index 4cb323c67..2adbf5d2f 100644
--- a/Flow.Launcher/Languages/uk-UA.xaml
+++ b/Flow.Launcher/Languages/uk-UA.xaml
@@ -1,7 +1,7 @@
- Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program.
+ Не вдалося зареєструвати гарячу клавішу "{0}". Можливо, гаряча клавіша використовується іншою програмою. Змініть її на іншу гарячу клавішу або вийдіть з програми, де вона використовується.
Flow Launcher
Не вдалося запустити {0}
Невірний формат файлу плагіна Flow Launcher
@@ -17,15 +17,15 @@
Копіювати
Вирізати
Вставити
- Undo
- Select All
+ Скасувати
+ Обрати все
Файл
Тека
Текст
Режим гри
Призупинити використання гарячих клавіш.
- Position Reset
- Reset search window position
+ Скидання позиції
+ Скинути положення вікна пошуку
Налаштування
@@ -33,21 +33,21 @@
Портативний режим
Зберігати всі налаштування і дані користувача в одній теці (буде корисно при видаленні дисків або хмарних сервісах).
Запускати Flow Launcher при запуску системи
- Error setting launch on startup
+ Помилка запуску налаштування під час запуску
Сховати Flow Launcher, якщо втрачено фокус
Не повідомляти про доступні нові версії
- Search Window Position
- Remember Last Position
- Monitor with Mouse Cursor
- Monitor with Focused Window
- Primary Monitor
- Custom Monitor
- Search Window Position on Monitor
- Center
- Center Top
- Left Top
- Right Top
- Custom Position
+ Положення вікна пошуку
+ Пам'ятати останню позицію
+ Монітор з курсором миші
+ Монітор зі сфокусованим вікном
+ Основний монітор
+ Власний монітор
+ Положення вікна пошуку на моніторі
+ Центр
+ Вгорі по центру
+ Зліва вгорі
+ Праворуч вгорі
+ Власна позиція
Мова
Останній стиль запиту
Показати/приховати попередні результати коли реактивований Flow Launcher знову.
@@ -55,42 +55,42 @@
Вибрати останній запит
Очистити останній запит
Максимальна кількість результатів
- You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.
+ Ви також можете швидко налаштувати цей параметр за допомогою клавіш CTRL+Плюс чи CTRL+Мінус.
Ігнорувати гарячі клавіші в повноекранному режимі
Вимкнути активацію Flow Launcher коли активовано повноекранний додаток (Рекомендується для ігор).
Стандартний Файловий Менеджер
Виберіть файловий менеджер для використання під час відкриття теки.
Браузер за замовчуванням
Налаштування нової вкладки, нового вікна, приватного режиму.
- Python Path
- Node.js Path
- Please select the Node.js executable
- Please select pythonw.exe
- Always Start Typing in English Mode
- Temporarily change your input method to English mode when activating Flow.
+ Шлях до Python
+ Шлях до Node.js
+ Виберіть виконуваний файл Node.js
+ Виберіть pythonw.exe
+ Завжди починати введення тексту в англійському режимі
+ Тимчасово змінити спосіб введення на англійський при активації Flow.
Автоматичне оновлення
Вибрати
Сховати Flow Launcher при запуску системи
Приховати значок в системному лотку
- When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.
+ Коли піктограму приховано з трею, меню налаштувань можна відкрити, клацнувши правою кнопкою миші у вікні пошуку.
Точність пошуку запитів
Змінює мінімальний бал збігів, необхідних для результатів.
Використовувати піньїнь
Дозволяє використовувати пінїнь для пошуку. Піньїнь - це стандартна система написання для перекладу китайської.
- Always Preview
- Always open preview panel when Flow activates. Press {0} to toggle preview.
+ Завжди переглядати
+ Завжди відкривати панель попереднього перегляду при активації Flow. Натисніть {0}, щоб переключити попередній перегляд.
Ефект тіні не дозволено, коли поточна тема має ефект розмиття
- Search Plugin
- Ctrl+F to search plugins
- No results found
- Please try a different search.
- Plugin
+ Плагін для пошуку
+ Ctrl+F для пошуку плагінів
+ Результатів не знайдено
+ Будь ласка, спробуйте інший запит.
+ Плагін
Плагіни
Знайти більше плагінів
Увімкнено
- Відключити
+ Вимкнено
Встановлення гарячих клавіш
Ключове слово
Поточна гаряча клавіша
@@ -99,47 +99,47 @@
Поточний пріоритет
Новий пріоритет
Пріоритет
- Change Plugin Results Priority
+ Змінити пріоритет результатів плагіна
Директорія плагінів
за
Ініціалізація:
Запит:
Версія
Сайт
- Uninstall
+ Видалити
Магазин плагінів
- New Release
- Recently Updated
+ Новий реліз
+ Нещодавно оновлено
Плагіни
- Installed
+ Встановлено
Оновити
- Install
- Uninstall
+ Встановити
+ Видалити
Оновити
- Plugin already installed
- New Version
- This plugin has been updated within the last 7 days
- New Update is Available
+ Плагін вже встановлено
+ Нова версія
+ Цей плагін було оновлено протягом останніх 7 днів
+ Доступне нове оновлення
Тема
- Appearance
+ Зовнішній вигляд
Знайти більше тем
Як створити тему
Привіт усім
- Explorer
- Search for files, folders and file contents
- WebSearch
- Search the web with different search engine support
- Program
- Launch programs as admin or a different user
- ProcessKiller
- Terminate unwanted processes
+ Провідник
+ Пошук файлів, папок і вмісту файлів
+ Веб-пошук
+ Пошук в Інтернеті за допомогою різних пошукових систем
+ Програма
+ Запуск програм від імені адміністратора або іншого користувача
+ Процес-кілер
+ Припинення небажаних процесів
Шрифт запитів
Шрифт результатів
Віконний режим
@@ -156,51 +156,51 @@
Відтворювати невеликий звук при відкритті вікна пошуку
Анімація
Використовувати анімацію в інтерфейсі
- Animation Speed
- The speed of the UI animation
- Slow
- Medium
- Fast
- Custom
- Clock
- Date
+ Швидкість анімації
+ Швидкість анімації інтерфейсу
+ Повільна
+ Середня
+ Швидка
+ Користувацька
+ Годинник
+ Дата
Гаряча клавіша
Гаряча клавіша
Гаряча клавіша Flow Launcher
- Введіть ярлик для відображення/приховання потокового запуску.
- Preview Hotkey
- Enter shortcut to show/hide preview in search window.
+ Введіть скорочення, щоб показати/приховати Flow Launcher.
+ Гаряча клавіша попереднього перегляду
+ Введіть скорочення, щоб показати/приховати попередній перегляд у вікні пошуку.
Відкрити ключ зміни результатів
Виберіть ключ модифікатора для відкриття вибраних результатів за допомогою клавіатури.
Показати гарячу клавішу
- Show result selection hotkey with results.
+ Показати гарячу клавішу вибору результату з результатами.
Задані гарячі клавіші для запитів
- Custom Query Shortcut
- Built-in Shortcut
- Query
- Shortcut
- Expansion
- Description
+ Користувацькі скорочення запитів
+ Вбудовані скорочення
+ Запит
+ Скорочення
+ Розширення
+ Опис
Видалити
Редагувати
Додати
Спочатку виберіть елемент
Ви впевнені, що хочете видалити гарячу клавішу ({0}) плагіну?
- Are you sure you want to delete shortcut: {0} with expansion {1}?
- Get text from clipboard.
- Get path from active explorer.
+ Ви впевнені, що хочете видалити скорочення: {0} з розширенням {1}?
+ Отримати текст з буфера обміну.
+ Отримати шлях з активного провідника.
Ефект тіні вікна запиту
- Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.
- Window Width Size
- You can also quickly adjust this by using Ctrl+[ and Ctrl+].
- Use Segoe Fluent Icons
- Use Segoe Fluent Icons for query results where supported
- Press Key
+ Тіньовий ефект суттєво навантажує графічний процесор. Не рекомендується, якщо потужність вашого комп'ютера є обмеженою.
+ Розмір ширини вікна
+ Ви також можете швидко налаштувати цей параметр за допомогою комбінації клавіш Ctrl+[ та Ctrl+].
+ Використання іконок Segoe Fluent
+ Використання іконок Segoe Fluent Icons для результатів запитів, де це підтримується
+ Натисніть клавішу
- HTTP Proxy
+ HTTP-проксі
Включити HTTP Proxy
Сервер HTTP
Порт
@@ -217,53 +217,53 @@
Про Flow Launcher
- Website
+ Веб-сайт
GitHub
- Docs
+ Документація
Версія
- Icons
+ Іконки
Ви скористалися Flow Launcher вже {0} разів
Перевірити наявність оновлень
- Become A Sponsor
+ Стати спонсором
Доступна нова версія {0}, будь ласка, перезавантажте Flow Launcher
- Check updates failed, please check your connection and proxy settings to api.github.com.
+ Перевірити оновлення не вдалося, будь ласка, перевірте ваше з'єднання та налаштування проксі-сервера до api.github.com.
- Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com,
- or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually.
+ Не вдалося завантажити оновлення, будь ласка, перевірте ваше з'єднання та налаштування проксі-сервера до github-cloud.s3.amazonaws.com,
+ або перейдіть на https://github.com/Flow-Launcher/Flow.Launcher/releases, аби завантажити оновлення власноруч.
Примітки до поточного релізу:
- Usage Tips
+ Поради щодо використання
DevTools
- Setting Folder
- Log Folder
- Clear Logs
- Are you sure you want to delete all logs?
- Wizard
+ Тека налаштувань
+ Тека журналу
+ Очистити журнали
+ Ви впевнені, що хочете видалити всі журнали?
+ Чаклун
- Select File Manager
- Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are "%d", and a path is entered at that location. For example, If a command is required such as "totalcmd.exe /A c:\windows", argument is /A "%d".
- "%f" is an argument that represent the file path. It is used to emphasize the file/folder name when opening a specific file location in 3rd party file manager. This argument is only available in the "Arg for File" item. If the file manager does not have that function, you can use "%d".
- File Manager
- Profile Name
- File Manager Path
- Arg For Folder
- Arg For File
+ Виберіть файловий менеджер
+ Будь ласка, вкажіть розташування файлу у файловому менеджері, який ви використовуєте, і додайте аргументи, якщо це необхідно. За замовчуванням аргументами є "%d", і шлях вводиться у вказаному місці. Наприклад, якщо потрібно виконати команду типу "totalcmd.exe /A c:\windows", аргументом буде /A "%d".
+ "%f" - це аргумент, який представляє шлях до файлу. Він використовується для виділення імені файлу/теки при відкритті певного місця розташування файлу у сторонньому файловому менеджері. Цей аргумент доступний лише у пункті "Аргумент для файлу". Якщо файловий менеджер не має такої функції, ви можете використовувати "%d".
+ Файловий менеджер
+ Ім'я профілю
+ Шлях до файлового менеджера
+ Аргумент для папки
+ Аргумент для файлу
Веб-браузер за замовчуванням
- The default setting follows the OS default browser setting. If specified separately, flow uses that browser.
- Browser
- Browser Name
- Browser Path
- New Window
- New Tab
- Private Mode
+ Налаштування за замовчуванням відповідають налаштуванню браузера за замовчуванням в операційній системі. Якщо вказано окремо, Flow використовує цей браузер.
+ Браузер
+ Назва браузера
+ Шлях до браузера
+ Нове вікно
+ Нова вкладка
+ Приватний режим
- Change Priority
- Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number
- Please provide an valid integer for Priority!
+ Змінити пріоритет
+ Чим більше число, тим вище буде розташований результат. Спробуйте встановити значення 5. Якщо ви хочете, щоб результати показувалися нижче, ніж у будь-якого іншого плагіна, введіть від'ємне число
+ Будь ласка, вкажіть дійсне ціле число для Пріоритету!
Поточна гаряча клавіша
@@ -274,26 +274,26 @@
Нова гаряча клавіша не може бути порожньою
Нова гаряча клавіша вже використовується іншим плагіном. Будь ласка, вкажіть нову
Успішно
- Completed successfully
+ Успішно завершено
Введіть гарячу клавішу, яку ви хочете використовувати для запуску плагіна. Використовуйте * у разі, якщо ви не хочете ставити конкретну гарячу клавішу.
Задані гарячі клавіші для запитів
- Press a custom hotkey to open Flow Launcher and input the specified query automatically.
+ Натисніть спеціальну гарячу клавішу, щоб відкрити Flow Launcher і автоматично ввести вказаний запит.
Переглянути
Гаряча клавіша недоступна. Будь ласка, вкажіть нову
Недійсна гаряча клавіша плагіна
Оновити
- Custom Query Shortcut
- Enter a shortcut that automatically expands to the specified query.
- A shortcut is expanded when it exactly matches the query.
+ Власне скорочення запиту
+ Введіть скорочення, яке автоматично розгорнеться до вказаного запиту.
+ Скорочення розгортається, коли воно точно відповідає запиту.
-If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query.
+Якщо ви додасте префікс '@' під час введення скорочення, воно буде відповідати будь-якій позиції в запиті. Вбудовані скорочення відповідають будь-якій позиції в запиті.
- Shortcut already exists, please enter a new Shortcut or edit the existing one.
- Shortcut and/or its expansion is empty.
+ Скорочення вже існує, будь ласка, введіть нове або відредагуйте існуюче.
+ Скорочення та/або його розширення є порожнім.
Гаряча клавіша недоступна
@@ -315,64 +315,64 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Стався збій в додатку Flow Launcher
- Please wait...
+ Будь ласка, зачекайте...
- Checking for new update
- You already have the latest Flow Launcher version
- Update found
- Updating...
+ Перевірка наявності оновлень
+ Ви вже маєте останню версію Flow Launcher
+ Оновлення знайдено
+ Оновлюємо...
- Flow Launcher was not able to move your user profile data to the new update version.
- Please manually move your profile data folder from {0} to {1}
+ Flow Launcher не зміг перенести дані вашого профілю користувача до нової актуальної версії.
+ Будь ласка, перемістіть теку з даними вашого профілю власноруч з {0} до {1}
- New Update
+ Нова версія
Доступна нова версія Flow Launcher {0}
Сталася помилка під час спроби встановити оновлення
Оновити
Скасувати
- Update Failed
- Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.
+ Не вдалося оновити
+ Перевірте з'єднання та спробуйте оновити налаштування проксі до github-cloud.s3.amazonaws.com.
Це оновлення перезавантажить Flow Launcher
Ці файли будуть оновлені
Оновити файли
Опис оновлення
- Skip
- Welcome to Flow Launcher
- Hello, this is the first time you are running Flow Launcher!
- Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language
- Search and run all files and applications on your PC
- Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.
- Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard.
- Hotkeys
- Action Keyword and Commands
- Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher.
- Let's Start Flow Launcher
- Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)
+ Пропустити
+ Ласкаво просимо до Flow Launcher
+ Вітаємо, ви вперше запускаєте Flow Launcher!
+ Перед початком роботи цей помічник допоможе налаштувати Flow Launcher. Ви можете пропустити цей крок, якщо бажаєте. Виберіть мову
+ Пошук та запуск усіх файлів і програм на вашому комп'ютері
+ Шукайте все: програми, файли, закладки, YouTube, Twitter тощо. І все це за допомогою клавіатури, навіть не торкаючись миші.
+ Flow Launcher запускається за допомогою наведеної нижче гарячої клавіші, спробуйте натиснути її зараз. Щоб її змінити, клацніть на ввід і натисніть потрібну гарячу клавішу на клавіатурі.
+ Гаряча клавіша
+ Ключове слово дії та команди
+ Шукайте в Інтернеті, запускайте програми або виконуйте різноманітні функції за допомогою плагінів Flow Launcher. Деякі функції починаються з ключового слова дії, але за потреби їх можна використовувати і без нього. Спробуйте наведені нижче запити у Flow Launcher.
+ Давайте запустимо Flow Launcher
+ Готово. Насолоджуйтесь Flow Launcher. Не забудьте гарячу клавішу для запуску :)
- Back / Context Menu
- Item Navigation
- Open Context Menu
- Open Containing Folder
- Run as Admin / Open Folder in Default File Manager
- Query History
- Back to Result in Context Menu
- Autocomplete
- Open / Run Selected Item
- Open Setting Window
- Reload Plugin Data
+ Назад / Контекстне меню
+ Навігація елементами
+ Відкрити контекстне меню
+ Відкрийте папку, що містить файл
+ Запустити від імені адміністратора / Відкрити папку у файловому менеджері за замовчуванням
+ Історія запитів
+ Повернутися до результату в контекстному меню
+ Автодоповнення
+ Відкрити / запустити вибраний елемент
+ Відкрити вікно налаштувань
+ Перезавантажити дані плагінів
- Weather
- Weather in Google Result
+ Погода
+ Погода в результатах Google
> ping 8.8.8.8
- Shell Command
+ Команда Shell
s Bluetooth
- Bluetooth in Windows Settings
+ Bluetooth у налаштуваннях Windows
sn
- Sticky Notes
+ Липкі нотатки
diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml
index 92ed8bfea..f3d2609b1 100644
--- a/Flow.Launcher/Languages/zh-cn.xaml
+++ b/Flow.Launcher/Languages/zh-cn.xaml
@@ -288,9 +288,9 @@
自定义查询捷径
输入一个捷径,它将自动展开为一个查询。
- A shortcut is expanded when it exactly matches the query.
+ 捷径仅在完全匹配查询时展开。
-If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query.
+如果您在输入捷径时添加一个“@”前缀,它将匹配查询中的任意位置。 内置捷径同样匹配查询中的任意位置。
捷径已存在,请输入一个新的或者编辑已有的。
捷径及其展开均不能为空。
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
index 18fed7cd7..d8bb949fd 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-br.xaml
@@ -6,7 +6,7 @@
Pesquisar favoritos do seu navegador
- Dados de Favorito
+ Dados de Favoritos
Abrir favoritos em:
Nova janela
Nova aba
@@ -21,8 +21,8 @@
Editar
Apagar
Navegar
- Others
- Browser Engine
- If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
- For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Outros
+ Motor do Navegador
+ Se você não estiver usando o Chrome, Firefox ou Edge, ou se estiver usando suas versões portáteis, você precisa adicionar o diretório de dados dos favoritos e selecionar a ferramenta de busca correta para fazer este plugin funcionar.
+ Por exemplo: O motor do Brave é o Chromium; e seu diretório padrão de favoritos é "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para o motor do Firefox, o diretório de favoritos é a pasta do usuário que contém o arquivo "places.sqlite".
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
index a55b9de1b..93b20366e 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml
@@ -2,27 +2,27 @@
- Browser Bookmarks
- Search your browser bookmarks
+ Закладки браузера
+ Пошук у закладках браузера
- Bookmark Data
- Open bookmarks in:
- New window
- New tab
- Set browser from path:
- Choose
- Copy url
- Copy the bookmark's url to clipboard
- Load Browser From:
- Browser Name
- Data Directory Path
+ Дані закладок
+ Відкрити закладки в:
+ Нове вікно
+ Нова вкладка
+ Встановити браузер за шляхом:
+ Обрати
+ Скопіювати URL-адресу
+ Скопіюйте URL-адресу закладки в буфер обміну
+ Завантажити браузер з:
+ Назва браузера
+ Шлях до каталогу з даними
Додати
Редагувати
Видалити
- Browse
- Others
- Browser Engine
- If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work.
- For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file.
+ Перегляд
+ Інші
+ Браузерний рушій
+ Якщо ви не використовуєте Chrome, Firefox або Edge, або використовуєте їхні портативні версії, вам потрібно додати каталог даних закладок і вибрати правильний рушій браузера, щоб цей плагін працював.
+ Наприклад: Рушій Brave - Chromium, і за замовчуванням розташування даних закладок: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Для браузера Firefox директорія закладок - це папка userdata, що містить файл places.sqlite.
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
index 15598118c..014755929 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/uk-UA.xaml
@@ -1,15 +1,15 @@
- Calculator
- Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher)
- Not a number (NaN)
- Expression wrong or incomplete (Did you forget some parentheses?)
- Copy this number to the clipboard
- Decimal separator
- The decimal separator to be used in the output.
- Use system locale
- Comma (,)
- Dot (.)
- Max. decimal places
+ Калькулятор
+ Дозволяє виконувати математичні обчислення (спробуйте 5*3-2 у Flow Launcher)
+ Не є числом (NaN)
+ Вираз неправильний або неповний (Ви забули якісь дужки?)
+ Скопіюйте це число в буфер обміну
+ Десятковий роздільник
+ Десятковий роздільник, який буде використовуватися у виведенні.
+ Використовувати системну локаль
+ Кома (,)
+ Крапка (.)
+ Макс. кількість знаків після коми
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
index 52aed4b9a..ad83e6e05 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
index 1ab9da4b7..83334b9b1 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml
@@ -100,7 +100,9 @@
Odstranit z Rychlého přístupu
Odstranit aktuální položku z rychlého přístupu
Zobrazit kontextové menu Windows
-
+ Open With
+ Select a program to open with
+
Volných {0} z {1}
Otevřít ve výchozím správci souborů
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
index ba2152e61..9dfbb94a1 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
index dc97980fd..1bae42c77 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml
@@ -2,18 +2,18 @@
- Please make a selection first
+ Zuerst eine Auswahl treffen
Bitte wähle eine Ordnerverknüpfung
Bist du sicher {0} zu löschen?
Sind Sie sicher, dass Sie diese Datei dauerhaft löschen möchten?
Are you sure you want to permanently delete this file/folder?
- Deletion successful
+ Löschen erfolgreich
Successfully deleted {0}
- Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
- Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
- The required service for Windows Index Search does not appear to be running
- To fix this, start the Windows Search service. Select here to remove this warning
- The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
+ Die Zuweisung des globalen Aktions-Schlüsselwortes könnte zu viele Ergebnisse bei der Suche hervorrufen. Bitte wählen Sie ein spezielles Aktionswort
+ Schnellzugriff kann nicht auf das globale Aktionswort gesetzt werden, wenn aktiviert. Bitte wählen Sie ein spezielles Aktionswort
+ Der benötigte Dienst für Windows Indexsuche scheint nicht ausgeführt zu werden
+ Um dies zu beheben, starten Sie den Windows-Suchdienst. Klicken Sie hier, um diese Warnung zu entfernen
+ Die Warnmeldung wurde ausgeschaltet. Möchten Sie als Alternative für die Suche nach Dateien und Ordnern das Plugin Everything installieren?{0}{0}Wählen Sie 'Ja', um das Plugin Everything zu installieren, oder 'Nein', um zurückzukehren
Explorer Alternative
Error occurred during search: {0}
Could not open folder
@@ -24,28 +24,28 @@
Bearbeiten
Hinzufügen
General Setting
- Customise Action Keywords
- Quick Access Links
+ Aktions-Schlüsselwörter ändern
+ Schnellzugriff-Links
Everything Setting
Sort Option:
Everything Path:
Launch Hidden
Editor pad
Shell Path
- Index Search Excluded Paths
+ Indexsuche ausgeschlossen Pfade
Verwenden Suchergebnis Standort als ausführbare Arbeitsverzeichnis
Hit Enter to open folder in Default File Manager
Use Index Search For Path Search
- Indexing Options
+ Indexierungsoptionen
Suche:
Pfad-Suche:
Suche nach Dateiinhalten:
Index-Suche:
Schnellzugriff:
- Current Action Keyword
+ Aktuelles Aktions-Schlüsselwort
Fertig
Aktiviert
- When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Wenn diese Funktion deaktiviert ist, führt Flow diese Suchoption nicht aus und kehrt zusätzlich zu '*' zurück, um das Aktionsschlüsselwort freizugeben
Everything
Windows Index
Direct Enumeration
@@ -78,18 +78,18 @@
Ausgewählte löschen
Als anderer Benutzer ausführen
Ausgewählte mit einem anderen Benutzerkonto ausführen
- Open containing folder
+ Enthaltenden Ordner öffnen
Open the location that contains current item
- Open With Editor:
+ Öffnen mit Editor:
Failed to open file at {0} with Editor {1} at {2}
Open With Shell:
Failed to open folder {0} with Shell {1} at {2}
- Exclude current and sub-directories from Index Search
- Excluded from Index Search
- Open Windows Indexing Options
- Manage indexed files and folders
- Failed to open Windows Indexing Options
- Add to Quick Access
+ Aktuelles und Unterverzeichnisse von der Indexsuche ausschließen
+ Von der Indexsuche ausgeschlossen
+ Windows Indexoptionen öffnen
+ Indexierte Dateien und Ordner verwalten
+ Fehler beim Öffnen der Windows-Indexierungsoptionen
+ Zu Schnellzugriff hinzufügen
Add current item to Quick Access
Successfully Added
Successfully added to Quick Access
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Öffnen mit
+ Programm zum Öffnen auswählen
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
index ff1773c71..2d23b315e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
index 51b3e831b..1b124ade8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
@@ -100,7 +100,9 @@
Eliminar del acceso rápido
Elimina elemento actual del acceso rápido
Mostrar menú contextual de Windows
-
+ Abrir con
+ Seleccione un programa para abrir con
+
{0} libre de {1}
Abrir en administrador de archivos predeterminado
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
index e4e1f9cb2..adad69af4 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml
@@ -100,7 +100,9 @@
Supprimer de l'accès rapide
Supprimer l'élément de l'accès rapide
Afficher le menu contextuel de Windows
-
+ Ouvrir avec
+ Sélectionnez un programme à ouvrir avec
+
{0} libres sur {1}
Ouvrir dans le gestionnaire de fichiers par défaut
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
index 79143d27d..f69f15868 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml
@@ -5,37 +5,37 @@
Effettua prima una selezione
Si prega di selezionare un collegamento alla cartella
Sei sicuro di voler eliminare {0}?
- Are you sure you want to permanently delete this file?
- Are you sure you want to permanently delete this file/folder?
+ Sei sicuro di voler eliminare definitivamente questo file?
+ Sei sicuro di voler eliminare definitivamente questo/a file/cartella?
Eliminato con successo
- Successfully deleted {0}
+ {0} eliminato correttamente
L'assegnazione della parola chiave globale potrebbe portare a troppi risultati durante la ricerca. Scegli una parola chiave specifica per l'azione
L'accesso rapido non può essere impostato sulla parola chiave globale quando abilitata. Si prega di scegliere una parola chiave specifica
Il servizio richiesto per Windows Index Search non sembra essere in esecuzione
Per risolvere il problema, avvia il servizio Ricerca Windows. Seleziona qui per rimuovere questo avviso
Il messaggio di avviso è stato spento. In alternativa per la ricerca di file e cartelle, vuoi installare il plugin Everything?{0}{0} Seleziona 'Sì' per installare il plugin Everything, o 'No' per tornare
Alternativa all'Esplora Risorse
- Error occurred during search: {0}
- Could not open folder
- Could not open file
+ Errore durante la ricerca: {0}
+ Impossibile aprire la cartella
+ Impossibile aprire il file
Cancella
Modifica
Aggiungi
- General Setting
+ Impostazione Generale
Personalizza Parola Chiave
Collegamenti ad Accesso Rapido
- Everything Setting
- Sort Option:
- Everything Path:
- Launch Hidden
+ Impostazioni di Everything
+ Opzioni di ordinamento:
+ Percorso di Everything:
+ Avvia nascosto
Tasto di accesso rapido alla finestra
- Shell Path
+ Percorso Shell
Percorsi Esclusi dall'Indice di Ricerca
Utilizza il percorso ottenuto dalla ricerca come cartella di lavoro
- Hit Enter to open folder in Default File Manager
- Use Index Search For Path Search
+ Premi Invio per aprire la cartella nel gestore file predefinito
+ Usa Indice di Ricerca per la Ricerca Percorso
Opzioni di Indicizzazione
Cerca:
Ricerca Percorso:
@@ -47,50 +47,50 @@
Abilitato
Quando disabilitato Flow non eseguirà questa opzione di ricerca, e ripristinerà a "*" per liberare la parola chiave
Tutto
- Windows Index
- Direct Enumeration
+ Indice Di Windows
+ Enumerazione Diretta
Percorso dell'editor di file
Percorso dell'editor delle cartelle
- Content Search Engine
- Directory Recursive Search Engine
- Index Search Engine
- Open Windows Index Option
+ Motore di Ricerca dei Contenuti
+ Motore di Ricerca Ricorsivo sulle Catelle
+ Indice del Motore di Ricerca
+ Apri Opzioni di Indicizzazione di Windows
Esplora Risorse
- Find and manage files and folders via Windows Search or Everything
+ Trova e gestisci file e cartelle tramite Ricerca di Windows o Everything
- Ctrl + Enter to open the directory
- Ctrl + Enter to open the containing folder
+ Ctrl + Invio per aprire la cartella
+ Ctrl + Invio per aprire la cartella che lo contiene
Copia percorso
- Copy path of current item to clipboard
+ Copia negli appunti il percorso dell'elemento corrente
Copia
- Copy current file to clipboard
- Copy current folder to clipboard
+ Copia file corrente negli appunti
+ Copia cartella corrente negli appunti
Cancella
- Permanently delete current file
- Permanently delete current folder
+ Elimina permanentemente il file corrente
+ Elimina definitivamente la cartella corrente
Percorso:
Elimina il selezionato
Esegui come utente differente
Esegui la selezione utilizzando un altro account utente
Apri percorso file
- Open the location that contains current item
+ Apri la posizione che contiene l'elemento corrente
Apri nell'Editor:
- Failed to open file at {0} with Editor {1} at {2}
- Open With Shell:
- Failed to open folder {0} with Shell {1} at {2}
+ Apertura del file in {0} con l'editor {1} in {2} non riuscita
+ Apri Con Shell:
+ Apertura della cartella {0} con Shell {1} in {2} non riuscita
Escludi cartelle e sottocartelle dall'Indice di Ricerca
Escludi dall'Indice di Ricerca
Apri Opzioni di Indicizzazione di Windows
Gestisci file e cartelle indicizzati
Impossibile aprire le Opzioni di Indicizzazione di Windows
Aggiungi ad Accesso Rapido
- Add current item to Quick Access
+ Aggiungi elemento corrente all'Accesso Rapido
Aggiunto con successo
Aggiunto con successo ad Accesso Rapido
Rimosso con Successo
@@ -98,20 +98,22 @@
Aggiungi ad Accesso Rapido in modo che possa essere aperto con la parola chiave di ricerca dell'Esplora Risorse
Rimuovi da Accesso Rapido
Rimuovi da Accesso Rapido
- Remove current item from Quick Access
- Show Windows Context Menu
-
+ Rimuovi elemento corrente dall'Accesso Rapido
+ Mostra Menu Contestuale di Windows
+ Open With
+ Select a program to open with
+
- {0} free of {1}
- Open in Default File Manager
- Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+ {0} disponibili su {1}
+ Aprire con il Gestore File Predefinito
+ Usa '>' per cercare in questa directory, '*' per cercare estensioni file o '>*' per combinare entrambe le ricerche.
- Failed to load Everything SDK
+ Impossibile caricare l'SDK di Everything
Attenzione: Il servizio "Everything" non è in esecuzione
Errore nell'interrogazione di Everything
Ordina per
- Name
+ Nome
Percorso
Dimensioni
Estensione
@@ -128,16 +130,16 @@
↓
Attenzione: Questa non è un'opzione di ordinamento rapido, le ricerche potrebbero essere lente
- Search Full Path
+ Cerca Percorso Completo
- Click to launch or install Everything
+ Clicca per avviare o installare Everything
Installazione di Everything
Installazione di everything. Si prega di attendere...
Everything è stato installato con successo
Impossibile installare automaticamente il servizio Everything. Si prega di installarlo manualmente da https://www.voidtools.com
Premi per avviare
Impossibile trovare l'installazione di Everything, vuoi inserire manualmente un percorso? {0} {0} Premi no per installare automaticamente Everything
- Do you want to enable content search for Everything?
- It can be very slow without index (which is only supported in Everything v1.5+)
+ Vuoi abilitare la ricerca di contenuti per Everything?
+ Può essere molto lento senza indice (che è supportato solo in Everything v1.5+)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
index bb831b003..d582424ed 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
index 627338473..37a096f09 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml
@@ -100,7 +100,9 @@
빠른 접근에서 제거
이 항목을 빠른 접근에서 제거
우클릭 메뉴 보기
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
index 0fe4db467..a5fd6c0c4 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
index 3649a2308..a7a993b37 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
index d42f1067e..13d9cf731 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml
@@ -2,10 +2,10 @@
- Please make a selection first
+ Pierw dokonaj wyboru
Musisz wybrać któryś folder z listy
Czy jesteś pewien że chcesz usunąć {0}?
- Are you sure you want to permanently delete this file?
+ Jesteś pewny, że chcesz usunąć ten plik trwale?
Are you sure you want to permanently delete this file/folder?
Deletion successful
Successfully deleted {0}
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
index 4b8865b84..8e5761345 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
index b3d772498..193ae0dd9 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml
@@ -100,7 +100,9 @@
Remover do acesso rápido
Remover item do Acesso rápido
Mostrar menu de contexto do Windows
-
+ Abrir com
+ Selecione o programa a utilizar
+
{0} livre de {1} no total
Abrir no gestor de ficheiros padrão
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
index 73bd620e9..efb08c3f1 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
index 47aa83ffd..e926735b8 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml
@@ -100,7 +100,9 @@
Odstráni z Rýchleho prístupu
Odstrániť aktuálnu položku z Rýchleho prístupu
Zobraziť kontextovú ponuku Windowsu
-
+ Otvoriť s
+ Vyberte program, ktorým chcete otvoriť súbor
+
Voľných {0} z {1}
Otvoriť v predvolenom správcovi súborov
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
index 38aa39f94..2b6f087af 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
index b91297563..2c90a7720 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml
@@ -100,7 +100,9 @@
Remove from Quick Access
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
index 6d5ca1bb4..791fbf7be 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
@@ -2,142 +2,144 @@
- Please make a selection first
- Please select a folder link
- Are you sure you want to delete {0}?
- Are you sure you want to permanently delete this file?
- Are you sure you want to permanently delete this file/folder?
- Deletion successful
- Successfully deleted {0}
- Assigning the global action keyword could bring up too many results during search. Please choose a specific action keyword
- Quick Access can not be set to the global action keyword when enabled. Please choose a specific action keyword
- The required service for Windows Index Search does not appear to be running
- To fix this, start the Windows Search service. Select here to remove this warning
- The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return
- Explorer Alternative
- Error occurred during search: {0}
- Could not open folder
- Could not open file
+ Будь ласка, спочатку зробіть вибір
+ Будь ласка, оберіть посилання на теку
+ Ви впевнені, що хочете видалити {0}?
+ Ви впевнені, що хочете назавжди видалити цей файл?
+ Ви впевнені, що хочете назавжди видалити цей файл/теку?
+ Видалення виконано успішно
+ Успішно видалено {0}
+ Використання глобального ключового слова дії може призвести до надмірної кількості результатів під час пошуку. Будь ласка, виберіть конкретне ключове слово дії
+ Швидкий доступ не може бути встановлений на глобальне ключове слово дії, коли він увімкнений. Будь ласка, виберіть конкретне ключове слово дії
+ Здається, не запущено потрібну службу для індексного пошуку Windows
+ Щоб виправити це, запустіть службу пошуку Windows. Натисніть тут, щоб прибрати це попередження
+ Попередження вимкнено. Як альтернативу для пошуку файлів і папок, чи бажаєте ви встановити плагін Everything? {0}{0}Виберіть "Так", щоб встановити плагін Everything, або "Ні", щоб повернутися
+ Альтернативний провідник
+ Виникла помилка під час пошуку: {0}
+ Не вдалося відкрити папку
+ Не вдалося відкрити файл
Видалити
Редагувати
Додати
- General Setting
- Customise Action Keywords
- Quick Access Links
- Everything Setting
- Sort Option:
- Everything Path:
- Launch Hidden
- Editor Path
- Shell Path
- Index Search Excluded Paths
- Use search result's location as the working directory of the executable
- Hit Enter to open folder in Default File Manager
- Use Index Search For Path Search
- Indexing Options
- Search:
- Path Search:
- File Content Search:
- Index Search:
- Quick Access:
- Current Action Keyword
+ Загальні налаштування
+ Налаштувати ключові слова дії
+ Посилання швидкого доступу
+ Налаштування Everything
+ Варіант сортування:
+ Шлях до Everything:
+ Запустити приховано
+ Шлях до редактора
+ Шлях до оболонки Shell
+ Виключені шляхи індексного пошуку
+ Використовувати розташування результату пошуку як робочу директорію виконуваного файлу
+ Натисніть Enter, щоб відкрити папку у файловому менеджері за замовчуванням
+ Використовуйте індексний пошук для пошуку шляху
+ Параметри індексації
+ Пошук:
+ Пошук шляху:
+ Пошук вмісту файлу:
+ Індексний пошук:
+ Швидкий доступ:
+ Поточне ключове слово дії
Готово
- Enabled
- When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword
+ Увімкнено
+ Якщо вимкнено, Flow не виконуватиме цю опцію пошуку і додатково повернеться до '*', щоб звільнити ключове слово дії
Everything
- Windows Index
- Direct Enumeration
+ Індекс Windows
+ Пряме перерахування
Шлях редактора файлів
Шлях редактора папок
- Content Search Engine
- Directory Recursive Search Engine
- Index Search Engine
- Open Windows Index Option
+ Пошукова система контенту
+ Рекурсивна пошукова система за каталогом
+ Пошукова система індексів
+ Відкрити параметри індексування Windows
- Explorer
- Find and manage files and folders via Windows Search or Everything
+ Провідник
+ Пошук і керування файлами та папками за допомогою програми "Пошук" або "Everything"
- Ctrl + Enter to open the directory
- Ctrl + Enter to open the containing folder
+ Ctrl + Enter, щоб відкрити каталог
+ Ctrl + Enter, щоб відкрити відповідну папку
- Copy path
- Copy path of current item to clipboard
- Copy
- Copy current file to clipboard
- Copy current folder to clipboard
+ Копіювати шлях
+ Копіювати шлях до поточного елемента в буфер обміну
+ Копіювати
+ Копіювання поточного файлу в буфер обміну
+ Копіювати поточну папку в буфер обміну
Видалити
- Permanently delete current file
- Permanently delete current folder
- Path:
- Delete the selected
- Run as different user
- Run the selected using a different user account
- Open containing folder
- Open the location that contains current item
- Open With Editor:
- Failed to open file at {0} with Editor {1} at {2}
- Open With Shell:
- Failed to open folder {0} with Shell {1} at {2}
- Exclude current and sub-directories from Index Search
- Excluded from Index Search
- Open Windows Indexing Options
- Manage indexed files and folders
- Failed to open Windows Indexing Options
- Add to Quick Access
- Add current item to Quick Access
- Successfully Added
- Successfully added to Quick Access
- Successfully Removed
- Successfully removed from Quick Access
- Add to Quick Access so it can be opened with Explorer's Search Activation action keyword
- Remove from Quick Access
- Remove from Quick Access
- Remove current item from Quick Access
- Show Windows Context Menu
-
+ Безповоротно видалити поточний файл
+ Назавжди видалити поточну папку
+ Шлях:
+ Видалити вибране
+ Запустити від імені іншого користувача
+ Запустити вибране під обліковим записом іншого користувача
+ Відкрити папку
+ Відкрийте місце, яке містить поточний елемент
+ Відкрити за допомогою редактора:
+ Не вдалося відкрити файл за адресою {0} за допомогою редактора {1} на {2}
+ Відкрий за допомогою Shell:
+ Не вдалося відкрити папку {0} за допомогою Shell {1} за адресою {2}
+ Виключити поточні та вкладені каталоги з індексного пошуку
+ Виключено з індексного пошуку
+ Відкрити параметри індексування Windows
+ Керування проіндексованими файлами та папками
+ Не вдалося відкрити параметри індексування Windows
+ Додати до Швидкого доступу
+ Додати поточний елемент до швидкого доступу
+ Успішно додано
+ Успішно додано до швидкого доступу
+ Успішно вилучено
+ Успішно видалено з швидкого доступу
+ Додати до швидкого доступу, щоб його можна було відкрити за допомогою ключового слова дії "Активація пошуку" у Провіднику
+ Видалити зі швидкого доступу
+ Видалити зі швидкого доступу
+ Видалити поточний елемент зі швидкого доступу
+ Показати контекстне меню Windows
+ Open With
+ Select a program to open with
+
- {0} free of {1}
- Open in Default File Manager
- Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches.
+ {0} не містить {1}
+ Відкрити у файловому менеджері за замовчуванням
+ Використовуйте '>' для пошуку в цьому каталозі, '*' для пошуку за розширеннями файлів або '>*' для поєднання обох варіантів пошуку.
- Failed to load Everything SDK
- Warning: Everything service is not running
- Error while querying Everything
- Sort By
- Name
- Path
- Size
- Extension
- Type Name
- Date Created
- Date Modified
- Attributes
- File List FileName
- Run Count
- Date Recently Changed
- Date Accessed
- Date Run
+ Не вдалося завантажити Everything SDK
+ Попередження: Служба Everything не запущена
+ Помилка при виконанні запиту Everything
+ Сортувати за
+ Назва
+ Шлях
+ Розмір
+ Розширення
+ Назва типу
+ Дата створення
+ Дата останньої зміни
+ Атрибути
+ Список файлів FileName
+ Кількість запусків
+ Дата нещодавно змінена
+ Дата доступу
+ Дата запуску
↑
↓
- Warning: This is not a Fast Sort option, searches may be slow
+ Попередження: Це не швидке сортування, пошук може бути повільним
- Search Full Path
+ Шукати повний шлях
- Click to launch or install Everything
- Everything Installation
- Installing Everything service. Please wait...
- Successfully installed Everything service
- Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com
- Click here to start it
- Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you
- Do you want to enable content search for Everything?
- It can be very slow without index (which is only supported in Everything v1.5+)
+ Натисніть, щоб запустити або встановити Everything
+ Встановлення програми Everything
+ Встановлення служби Everything. Будь ласка, зачекайте...
+ Успішно встановлено сервіс Everything
+ Не вдалося автоматично встановити службу Everything. Будь ласка, встановіть її вручну з https://www.voidtools.com
+ Натисніть тут, щоб розпочати
+ Не вдалося знайти інсталяцію Everything, бажаєте вручну вибрати розташування? {0}{0}Натисніть "ні", і Everything буде автоматично інстальовано для вас
+ Бажаєте увімкнути пошук контенту для Everything?
+ Без індексу (який підтримується лише у версії Everything v1.5+) воно може працювати дуже повільно
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
index 15dc9cea4..2899c77c6 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml
@@ -100,7 +100,9 @@
从快速访问中删除
从快速访问中移除当前结果
显示 Windows 上下文菜单
-
+ Open With
+ Select a program to open with
+
{0} 可用,共 {1}
在默认文件管理器中打开
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
index 8f63eb659..d60f1f09d 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml
@@ -100,7 +100,9 @@
從快速訪問中移除
Remove current item from Quick Access
Show Windows Context Menu
-
+ Open With
+ Select a program to open with
+
{0} free of {1}
Open in Default File Manager
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/it.xaml
index 9590cdf33..6cea2bb55 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/it.xaml
@@ -1,7 +1,7 @@
- Activate {0} plugin action keyword
+ Attiva la parola chiave del plugin {0}
Indicatore Plugin
Fornisce suggerimenti sulle parole d'azione dei plugin
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/uk-UA.xaml
index 893948d3d..e5398e6e0 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/uk-UA.xaml
@@ -1,9 +1,9 @@
- Activate {0} plugin action keyword
+ Активувати {0} ключове слово дії плагіна
- Plugin Indicator
- Provides plugins action words suggestions
+ Індикатор плагіну
+ Надає плагінам пропозиції щодо слів дії
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml
index 2f31b62cd..ca5d964ab 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml
@@ -6,7 +6,9 @@
Successfully downloaded {0}
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml
index e2303c925..1351e69cb 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml
@@ -6,7 +6,9 @@
Úspěšně staženo {0}
Chyba: Nepodařilo se stáhnout plugin
{0} z {1} {2}{3}Chcete odinstalovat tento plugin? Flow se po odinstalování automaticky restartuje.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} z {1} {2}{3}Chcete nainstalovat tento plugin? Po instalaci se Flow automaticky restartuje.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Instalovat plugin
Instaluje se plugin
Stáhnout a nainstalovat {0}
@@ -16,19 +18,31 @@
Chyba: Zásuvný modul se stejnou nebo vyšší verzí než {0} již existuje.
Chyba instalace pluginu
Došlo k chybě při pokusu o instalaci {0}
+ Error uninstalling plugin
Nejsou dostupné žádné aktualizace
Všechny pluginy jsou aktuální
{0} z {1} {2}{3}Chcete tento zásuvný modul aktualizovat? Flow se po aktualizaci automaticky restartuje.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Aktualizace Pluginu
Aktualizace tohoto pluginu je k dispozici, chcete ji zobrazit?
Tento plugin je již nainstalován
Stahování manifestu pluginu se nezdařilo
Zkontrolujte, zda se můžete připojit k webu github.com. Tato chyba pravděpodobně znamená, že nemůžete instalovat nebo aktualizovat zásuvné moduly.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Instalace z neznámého zdroje
Tento plugin instalujete z neznámého zdroje a může obsahovat potenciální rizika!{0}{0}Ujistěte se, že víte, odkud tento plugin pochází a že je bezpečný.{0}{0}Chcete pokračovat?{0}{0}(Toto varování můžete vypnout v nastavení)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Správce pluginů
Správa instalace, odinstalace nebo aktualizace pluginů Flow Launcheru
@@ -46,4 +60,5 @@
Upozornění na instalaci z neznámého zdroje
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml
index e1aa21eca..f224af73f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml
@@ -6,7 +6,9 @@
Successfully downloaded
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml
index e1aa21eca..642c0d6a1 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml
@@ -6,7 +6,9 @@
Successfully downloaded
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -37,8 +51,8 @@
Open website
Visit the plugin's website
- See source code
- See the plugin's source code
+ Quellcode anzeigen
+ Quellcode des Plugins ansehen
Suggest an enhancement or submit an issue
Suggest an enhancement or submit an issue to the plugin developer
Go to Flow's plugins repository
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml
index e1aa21eca..f224af73f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml
@@ -6,7 +6,9 @@
Successfully downloaded
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml
index 7f37d2765..e3fa09615 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml
@@ -6,7 +6,9 @@
{0} se ha descargado correctamente
Error: No se puede descargar el complemento
{0} por {1} {2}{3}¿Desea desinstalar este complemento? Después de la desinstalación Flow se reiniciará automáticamente.
+ {0} por {1} {2}{2}¿Desea desinstalar este complemento?
{0} por {1} {2}{3}¿Desea instalar este complemento? Después de la instalación Flow se reiniciará automáticamente.
+ {0} por {1} {2}{2}¿Desea instalar este complemento?
Instalar complemento
Instalando complemento
Descargar e instalar {0}
@@ -16,19 +18,31 @@
Error: Ya existe un complemento que tiene la misma o mayor versión con {0}.
Error al instalar el complemento
Se ha producido un error al intentar instalar {0}
+ Error al desinstalar el complemento
No hay actualizaciones disponibles
Todos los complementos están actualizados
{0} por {1} {2}{3}¿Desea actualizar este complemento? Después de la actualización Flow se reiniciará automáticamente.
+ {0} por {1} {2}{2}¿Desea actualizar este complemento?
Actualizar complemento
Este complemento tiene una actualización, ¿desea verla?
Este complemento ya está instalado
La descarga del manifiesto del complemento ha fallado
Por favor, compruebe que puede establecer conexión con github.com. Este error significa que es posible que no pueda instalar o actualizar complementos.
+ Actualizar todos los complementos
+ ¿Desea actualizar todos los complementos?
+ ¿Desea actualizar {0} complementos?{1}Flow Launcher se reiniciará después de actualizar todos los complementos.
+ ¿Desea actualizar {0} complementos?
+ {0} complementos se han actualizado correctamente. Reiniciando Flow, por favor espere...
+ Complemento {0} actualizado correctamente. Reiniciando Flow, por favor espere...
Instalando desde una fuente desconocida
¡Está instalando este complemento desde una fuente desconocida y puede contener riesgos potenciales!{0}{0}Por favor, asegúrese de saber de dónde procede este complemento y de que es seguro.{0}{0}¿Aún así desea continuar?{0}{0}(Puede desactivar esta advertencia en la configuración)
-
-
-
+
+ Complemento {0} instalado correctamente. Por favor, reinicie Flow.
+ Complemento {0} desinstalado correctamente. Por favor, reinicie Flow.
+ Complemento {0} actualizado correctamente. Por favor, reinicie Flow.
+ {0} complementos se han actualizado correctamente. Por favor, reinicie Flow.
+ El complemento {0} ya ha sido modificado. Por favor, reinicie Flow antes de realizar más cambios.
+
Administrador de complementos
Administración de instalación, desinstalación o actualización de los complementos de Flow Launcher
@@ -46,4 +60,5 @@
Aviso de instalación desde fuentes desconocidas
+ Reiniciar automáticamente Flow Launcher después de instalar/desinstalar/actualizar complementos
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml
index e1aa21eca..c36e4c39c 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml
@@ -2,48 +2,63 @@
- Downloading plugin
+ Téléchargement du plugin
Successfully downloaded
- Error: Unable to download the plugin
- {0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
- {0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
- Plugin Install
- Installing Plugin
- Download and install {0}
- Plugin Uninstall
+ Erreur : Impossible de télécharger le plugin
+ {0} par {1} {2}{3}Voulez-vous désinstaller ce plugin ? Après la désinstallation Flow redémarrera automatiquement.
+ {0} par {1} {2}{2}Voulez-vous désinstaller ce plugin ?
+ {0} par {1} {2}{3}Voulez-vous installer ce plugin ? Après l'installation Flow redémarrera automatiquement.
+ {0} par {1} {2}{2}Voulez-vous installer ce plugin ?
+ Installation du plugin
+ Installation du plugin
+ Télécharger et installer {0}
+ Désinstallation du plugin
Plugin successfully installed. Restarting Flow, please wait...
- Unable to find the plugin.json metadata file from the extracted zip file.
- Error: A plugin which has the same or greater version with {0} already exists.
- Error installing plugin
- Error occurred while trying to install {0}
- No update available
- All plugins are up to date
- {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
- Plugin Update
- This plugin has an update, would you like to see it?
- This plugin is already installed
- Plugin Manifest Download Failed
- Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
- Installing from an unknown source
- You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+ Impossible de trouver le fichier de métadonnées plugin.json à partir du fichier zip extrait.
+ Erreur : Un plugin ayant une version identique ou supérieure à {0} existe déjà.
+ Erreur lors de l'installation du plugin
+ Une erreur s'est produite lors de l'installation de {0}
+ Erreur lors de la désinstallation du plugin
+ Aucune mise à jour disponible
+ Tous les plugins sont à jour
+ {0} par {1} {2}{3}Voulez-vous mettre à jour ce plugin ? Après la mise à jour Flow redémarrera automatiquement.
+ {0} par {1} {2}{2}Voulez-vous mettre à jour ce plugin ?
+ Mise à jour du Plugin
+ Ce plugin a une mise à jour, voulez-vous le voir ?
+ Ce plugin est déjà installé
+ Échec du téléchargement du Plugin Manifest
+ Veuillez vérifier si vous pouvez vous connecter à github.com. Cette erreur signifie que vous ne serez pas en mesure d'installer ou de mettre à jour des plugins.
+ Mettre à jour tous les plugins
+ Voulez-vous mettre à jour tous les plugins ?
+ Voulez-vous mettre à jour {0} plugins ?{1}Flow Launcher redémarrera après la mise à jour de tous les plugins.
+ Voulez-vous mettre à jour {0} plugins ?
+ {0} plugins mis à jour avec succès. Redémarrage de Flow, veuillez patienter...
+ Plugin {0} mis à jour avec succès. Redémarrage de Flow, veuillez patienter...
+ Installation depuis une source inconnue
+ Vous installez ce plugin à partir d'une source inconnue et il peut contenir des risques !{0}{0}Veuillez vous assurer que vous comprenez d'où provient ce plugin et qu'il est sûr.{0}{0}Voulez-vous continuer ?{0}{0}(Vous pouvez désactiver cet avertissement via les paramètres)
+
+ Plugin {0} installé avec succès. Veuillez redémarrer Flow.
+ Plugin {0} désinstallé avec succès. Veuillez redémarrer Flow.
+ Plugin {0} mis à jour avec succès. Veuillez redémarrer Flow.
+ {0} plugins mis à jour avec succès. Veuillez redémarrer Flow.
+ Le plugin {0} a déjà été modifié. Veuillez redémarrer Flow avant de faire d'autres modifications.
+
- Plugins Manager
- Management of installing, uninstalling or updating Flow Launcher plugins
- Unknown Author
+ Gestionnaire de plugins
+ Gestion de l'installation, de la désinstallation ou de la mise à jour des plugins Flow Launcher
+ Auteur inconnu
- Open website
- Visit the plugin's website
- See source code
- See the plugin's source code
- Suggest an enhancement or submit an issue
- Suggest an enhancement or submit an issue to the plugin developer
- Go to Flow's plugins repository
- Visit the PluginsManifest repository to see community-made plugin submissions
+ Ouvrir le site web
+ Visitez le site web du plugin
+ Voir le code source
+ Voir le code source du plugin
+ Suggérer une amélioration ou soumettre un problème
+ Suggérer une amélioration ou soumettre un problème au développeur du plugin
+ Aller au dépôt de plugins Flow
+ Visitez le dépôt de PluginsManifest pour voir les soumissions de plugin créées par la communauté
- Install from unknown source warning
+ Avertissement d'installation à partir d'une source inconnue
+ Redémarrer automatiquement Flow Launcher après l'installation/désinstallation/mise à jour des plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml
index ec7285142..e2ae667c1 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml
@@ -6,7 +6,9 @@
Download completato
Errore: non è possibile scaricare il plugin
{0} da {1} {2}{3}Vuoi disinstallare questo plugin? Dopo la disinstallazione, Flow si riavvierà automaticamente.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} da {1} {2}{3}Vuoi installare questo plugin? Dopo l'installazione, Flow si riavvierà automaticamente.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Installazione del plugin
Installazione del Plugin
Scarica e installa {0}
@@ -16,19 +18,31 @@
Errore: esiste già un plugin che ha la stessa o maggiore versione con {0}.
Errore durante l'installazione del plugin
Errore durante il tentativo di installare {0}
+ Error uninstalling plugin
Nessun aggiornamento disponibile
Tutti i plugin sono aggiornati
{0} da {1} {2}{3}Vuoi aggiornare questo plugin? Dopo l'aggiornamento, Flow si riavvierà automaticamente.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Aggiornamento del plugin
Questo plugin ha un aggiornamento, vuoi vederlo?
Questo plugin è già stato installato
Download del manifesto del plugin fallito
Controlla se puoi connetterti a github.com. Questo errore significa che potresti non essere in grado di installare o aggiornare i plugin.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installazione da una fonte sconosciuta
Stai installando questo plugin da una fonte sconosciuta e potrebbe contenere potenziali rischi!{0}{0}Si prega di assicurarsi di capire la provenienza di questo plugin e se sia sicuro.{0}{0}Vuoi comunque continuare?{0}{0}(Puoi disattivare questo avviso dalle impostazioni)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Gestore dei plugin
Gestione dell'installazione, disinstallazione o aggiornamento dei plugin di Flow Launcher
@@ -46,4 +60,5 @@
Avviso di installazione da sorgenti sconosciute
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml
index e1aa21eca..f224af73f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml
@@ -6,7 +6,9 @@
Successfully downloaded
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml
index 7fb07a6db..d95a5d6a5 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml
@@ -6,7 +6,9 @@
다운로드 성공
오류: 플러그인을 받을 수 없습니다
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
플러그인 설치
Installing Plugin
다운로드 및 설치 {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
사용 가능한 업데이트가 없습니다
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
플러그인 업데이트
This plugin has an update, would you like to see it?
이미 설치된 플러그인입니다
플러그인 목록 다운로드 실패
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
플러그인 관리자
플러그인의 설치/삭제/업데이트를 관리하는 플러그인
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml
index e1aa21eca..f224af73f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml
@@ -6,7 +6,9 @@
Successfully downloaded
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml
index e1aa21eca..f224af73f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml
@@ -6,7 +6,9 @@
Successfully downloaded
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml
index e1aa21eca..f224af73f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml
@@ -6,7 +6,9 @@
Successfully downloaded
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml
index 442079498..949607f42 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml
@@ -6,7 +6,9 @@
Successfully downloaded
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
Este plugin já está instalado
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml
index c7f3f2e9e..7d94d6b33 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml
@@ -6,7 +6,9 @@
Descarregado com sucesso {0}
Não foi possível descarregar o plugin
{0} de {1} {2}{3}Tem a certeza de que pretende desinstalar este plugin? Após a desinstalação, Flow Launcher será reiniciado.
+ {0} de {1} {2}{2}Gostaria de desinstalar este plugin?
{0} de {1} {2}{3}Tem a certeza de que pretende instalar este plugin? Após a instalação, Flow Launcher será reiniciado.
+ {0} de {1} {2}{2}Gostaria de instalar este plugin?
Instalador de plugins
Instalando plugin...
Descarregar e instalar {0}
@@ -16,19 +18,31 @@
Erro: já está instalado um plugin com uma versão igual ou superior a {0}.
Erro ao instalar o plugin
Ocorreu um erro ao tentar instalar {0}
+ Erro ao desinstalar o plugin
Não existem atualizações
Todos os plugins estão instalados
{0} de {1} {2}{3}Tem a certeza de que pretende atualizar este plugin? Após a atualização, Flow Launcher será reiniciado.
+ {0} de {1} {2}{2}Gostaria de atualizar este plugin?
Atualização de plugin
Existe uma atualização para este plugin. Deseja ver?
Este plugin já está instalado
Erro ao descarregar o manifesto do plugin
Verifique se consegue estabelecer ligação a github.com. Este erro significa que pode não ser possível instalar ou atualizar os plugins.
+ Atualizar todos os plugins
+ Gostaria de atualizar todos os plugins?
+ Gostaria de atualizar {0} plugins ?{1}Flow Launcher será reiniciado após a atualização.
+ Gostaria de atualizar {0} plugins?
+ {0} plugins atualizados com sucesso. Estamos a reiniciar Flow Launcher...
+ Plugin {0} atualizado com sucesso. Estamos a reiniciar Flow Launcher, aguarde...
Instalar a partir de fontes desconhecidas
Está a instalar este plugin a partir de uma fonte desconhecida o que pode ser perigoso!{0}{0}Certifique-se de que este plugin é seguro.{0}{0}Ainda assim, pretende continuar com a instalação?{0}{0}(Pode desativar este aviso nas definições da aplicação)
-
-
-
+
+ Plugin {0} instalado com sucesso. Por favor, reinicie o Flow Launcher.
+ Plugin {0} desinstalado com sucesso. Por favor, reinicie o Flow Launcher.
+ Plugin {0} atualizado com sucesso. Por favor, reinicie o Flow Launcher.
+ {0} plugins atualizados com sucesso. Deve reiniciar Flow Launcher.
+ O plugin {0} foi modificado. Por favor, reinicie o Flow Launcher antes de fazer mais alterações.
+
Gestor de plugins
Módulo para instalar, desinstalar e atualizar os plugins do Flow Launcher
@@ -46,4 +60,5 @@
Aviso ao instalar de fontes desconhecidas
+ Reiniciar automaticamente após instalar/desinstalar/atualizar plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml
index e1aa21eca..f224af73f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml
@@ -6,7 +6,9 @@
Successfully downloaded
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml
index ea43b3c62..016842da9 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml
@@ -6,7 +6,9 @@
Úspešne stiahnuté {0}
Chyba: Nepodarilo sa stiahnuť plugin
{0} od {1} {2}{3}Chcete odinštalovať tento plugin? Po odinštalovaní sa Flow automaticky reštartuje.
+ {0} od {1} {2}{2}Chcete odinštalovať tento plugin?
{0} od {1} {2}{3}Chcete nainštalovať tento plugin? Po nainštalovaní sa Flow automaticky reštartuje.
+ {0} od {1} {2}{2}Chcete nainštalovať tento plugin?
Inštalovať plugin
Inštaluje sa plugin
Stiahnuť a nainštalovať {0}
@@ -16,19 +18,31 @@
Chyba: Plugin s rovnakou alebo vyššou verziou ako {0} už existuje.
Chyba inštalácie pluginu
Nastala chyba počas inštalácie pluginu {0}
+ Chyba odinštalácie pluginu
Nie je k dispozícii žiadna aktualizácia
Všetky pluginy sú aktuálne
{0} od {1} {2}{3}Chcete aktualizovať tento plugin? Po aktualizácii sa Flow automaticky reštartuje.
+ {0} od {1} {2}{2}Chcete aktualizovať tento plugin?
Aktualizácia pluginu
Aktualizácia pre tento plugin je k dispozícii, chcete ju zobraziť?
Tento plugin je už nainštalovaný
Stiahnutie manifestu pluginu zlyhalo
Skontrolujte, či sa môžete pripojiť ku github.com. Táto chyba znamená, že pravdepodobne nemôžete pluginy inštalovať alebo aktualizovať.
+ Aktualizovať všetky pluginy
+ Chcete aktualizovať všetky pluginy?
+ Chcete aktualizovať pluginy ({0})?{1}Po aktualizácii všetkých pluginov sa Flow Launcher reštartuje.
+ Chcete aktualizovať pluginy ({0})?
+ Pluginy úspešne aktualizované ({0}). Flow sa reštartuje, čakajte…
+ Plugin {0} bol úspešne aktualizovaný. Reštartuje sa Flow, čakajte, prosím...
Inštalácia z neznámeho zdroja
Tento plugin inštalujete z neznámeho zdroja a môže obsahovať potenciálne riziká!{0}{0}Uistite sa, že rozumiete, odkiaľ tento plugin pochádza, a že je bezpečný.{0}{0}Chcete pokračovať?{0}{0}(Toto upozornenie môžete vypnúť v nastaveniach)
-
-
-
+
+ Plugin {0} bol úspešne nainštalovaný. Prosím, reštartuje Flow.
+ Plugin {0} bol úspešne odinštalovaný. Prosím, reštartuje Flow.
+ Plugin {0} bol úspešne aktualizovaný. Prosím, reštartuje Flow.
+ Pluginy úspešne aktualizované ({0}). Reštartuje Flow.
+ Plugin {0} už bol upravený. Prosím, reštartuje Flow pred ďalšími zmenami.
+
Správca pluginov
Správa inštalácie, odinštalácie alebo aktualizácie pluginov programu Flow Launcher
@@ -46,4 +60,5 @@
Upozornenie na inštaláciu z neznámeho zdroja
+ Automaticky reštartovať Flow Launcher po inštalácií/odinštalácii/aktualizáciu pluginov
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml
index e1aa21eca..f224af73f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml
@@ -6,7 +6,9 @@
Successfully downloaded
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
index e1aa21eca..f224af73f 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml
@@ -6,7 +6,9 @@
Successfully downloaded
Error: Unable to download the plugin
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
Plugin Install
Installing Plugin
Download and install {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
Error installing plugin
Error occurred while trying to install {0}
+ Error uninstalling plugin
No update available
All plugins are up to date
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
Plugin Update
This plugin has an update, would you like to see it?
This plugin is already installed
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
Plugins Manager
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml
index e1aa21eca..eaa54936a 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml
@@ -2,48 +2,63 @@
- Downloading plugin
+ Завантаження плагіну
Successfully downloaded
- Error: Unable to download the plugin
- {0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
- {0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
- Plugin Install
- Installing Plugin
- Download and install {0}
- Plugin Uninstall
+ Помилка: Не вдалося завантажити плагін
+ {0} від {1} {2}{3}Бажаєте видалити цей плагін? Після видалення Flow автоматично перезапуститься.
+ {0} від {1} {2}{2}Бажаєте видалити цей плагін?
+ {0} від {1} {2}{3}Бажаєте встановити цей плагін? Після встановлення Flow автоматично перезапуститься.
+ {0} від {1} {2}{2}Бажаєте встановити цей плагін?
+ Встановлення плагіна
+ Встановлення плагіна
+ Завантажити та встановити {0}
+ Видалення плагіна
Plugin successfully installed. Restarting Flow, please wait...
- Unable to find the plugin.json metadata file from the extracted zip file.
- Error: A plugin which has the same or greater version with {0} already exists.
- Error installing plugin
- Error occurred while trying to install {0}
- No update available
- All plugins are up to date
- {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
- Plugin Update
- This plugin has an update, would you like to see it?
- This plugin is already installed
- Plugin Manifest Download Failed
- Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
- Installing from an unknown source
- You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+ Не вдалося знайти файл метаданих plugin.json у розпакованому zip-архіві.
+ Помилка: Плагін, який має ідентичну або новішу версію з {0}, вже існує.
+ Помилка під час встановлення плагіна
+ Виникла помилка при спробі встановити {0}
+ Помилка видалення плагіну
+ Оновлень не знайдено
+ Всі плагіни оновлено
+ {0} від {1} {2}{3}Бажаєте оновити цей плагін? Після оновлення Flow буде автоматично перезапущено.
+ {0} від {1} {2}{2}Бажаєте оновити цей плагін?
+ Оновлення плагіна
+ Цей плагін має оновлення, бажаєте його переглянути?
+ Цей плагін вже встановлено
+ Не вдалося завантажити маніфест плагіна
+ Будь ласка, перевірте, чи можете ви підключитися до github.com. Ця помилка означає, що ви не можете встановлювати або оновлювати плагіни.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Плагін {0} успішно оновлено. Перезапускаємо Flow, будь ласка, зачекайте...
+ Встановлення з невідомого джерела
+ Ви встановлюєте цей плагін з невідомого джерела, тому він може бути потенційно небезпечним!{0}{0}Переконайтеся, що ви розумієте, звідки цей плагін, і що він є безпечним.{0}{0}Бажаєте продовжити?{0}{0}(Ви можете вимкнути це попередження через налаштування)
+
+ Плагін {0} успішно встановлено. Будь ласка, перезапустіть Flow.
+ Плагін {0} успішно видалено. Будь ласка, перезапустіть Flow.
+ Плагін {0} успішно оновлено. Будь ласка, перезапустіть Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Плагін {0} вже було змінено. Будь ласка, перезапустіть Flow, перш ніж вносити будь-які подальші зміни.
+
- Plugins Manager
- Management of installing, uninstalling or updating Flow Launcher plugins
- Unknown Author
+ Менеджер плагінів
+ Керування встановленням, видаленням або оновленням плагінів Flow Launcher
+ Невідомий автор
- Open website
- Visit the plugin's website
- See source code
- See the plugin's source code
- Suggest an enhancement or submit an issue
- Suggest an enhancement or submit an issue to the plugin developer
- Go to Flow's plugins repository
- Visit the PluginsManifest repository to see community-made plugin submissions
+ Відкрити сайт
+ Відвідати веб-сайт плагіна
+ Переглянути вихідний код
+ Переглянути вихідний код плагіну
+ Запропонувати покращення або надіслати повідомлення про проблему
+ Запропонувати покращення або повідомити про проблему розробнику плагіна
+ Перейти до репозиторію плагінів Flow
+ Відвідати репозиторій PluginsManifest, щоб переглянути подані спільнотою плагіни
- Install from unknown source warning
+ Попередження про встановлення з невідомого джерела
+ Автоматичний перезапуск Flow Launcher після встановлення/видалення/оновлення плагінів
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml
index 58d3fdf1f..be73c37f4 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml
@@ -3,10 +3,12 @@
正在下载插件...
- 下载完成
+ 成功下载 {0}
错误:无法下载该插件
{0} by {1} {2}{3} 您要卸载此插件吗? 卸载后,Flow Launcher 将自动重启。
+ {0} 作者: {1} {2}{2}您想要卸载这个插件吗?
{0} by {1} {2}{3} 您要安装此插件吗? 安装后,Flow Launcher 将自动重启
+ {0} 作者: {1} {2}{2}您想要安装这个插件吗?
插件安装
正在安装插件
下载与安装 {0}
@@ -16,19 +18,31 @@
错误:具有相同或更高版本的 {0} 的插件已经存在。
安装插件时出错
尝试安装 {0} 时发生错误
+ 卸载插件时出错
无可用更新
所有插件都是最新的
{0} by {1} {2}{3}您要更新此插件吗? 更新后,Flow Launcher 将自动重启。
+ {0} 作者: {1} {2}{2}您想要更新这个插件吗?
插件更新
该插件有更新,您想看看吗?
此插件已安装
插件列表下载失败
请检查您是否可以连接到 github.com。这个错误意味着您可能无法安装或更新插件。
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ 插件{0}更新成功。正在重新启动 Flow Launcher,请稍候...
从未知源安装
您正在从未知源安装此插件,它可能包含潜在风险!{0}{0}请确保您了解来源以及安全性。{0}{0}您想要继续吗?{0}{0}(您可以通过设置关闭此警告)
-
-
-
+
+ 成功安装插件{0}。请重新启动 Flow Launcher。
+ 成功卸载插件{0}。请重新启动 Flow Launcher。
+ 成功更新插件{0}。请重新启动 Flow Launcher。
+ {0} plugins successfully updated. Please restart Flow.
+ 插件 {0} 已被修改。请在进行任何进一步更改之前重新启动Flow。
+
插件管理
安装,卸载或更新 Flow Launcher 插件
@@ -46,4 +60,5 @@
未知源安装警告
+ 安装/卸载/更新插件后自动重启 Flow Launcher
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml
index 8ed16fe90..3505c4a7d 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml
@@ -6,7 +6,9 @@
下載完成
錯誤:無法下載擴充功能
{0} by {1} {2}{3}Would you like to uninstall this plugin? After the uninstallation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to uninstall this plugin?
{0} by {1} {2}{3}Would you like to install this plugin? After the installation Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to install this plugin?
安裝擴充功能
Installing Plugin
下載並安裝 {0}
@@ -16,19 +18,31 @@
Error: A plugin which has the same or greater version with {0} already exists.
安裝擴充功能時發生錯誤
嘗試安裝 {0} 時發生錯誤
+ Error uninstalling plugin
無可用更新
所有插件均為最新版本
{0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart.
+ {0} by {1} {2}{2}Would you like to update this plugin?
擴充功能更新
This plugin has an update, would you like to see it?
已安裝此擴充功能
Plugin Manifest Download Failed
Please check if you can connect to github.com. This error means you may not be able to install or update plugins.
+ Update all plugins
+ Would you like to update all plugins?
+ Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
+ Would you like to update {0} plugins?
+ {0} plugins successfully updated. Restarting Flow, please wait...
+ Plugin {0} successfully updated. Restarting Flow, please wait...
Installing from an unknown source
You are installing this plugin from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning via settings)
-
-
-
+
+ Plugin {0} successfully installed. Please restart Flow.
+ Plugin {0} successfully uninstalled. Please restart Flow.
+ Plugin {0} successfully updated. Please restart Flow.
+ {0} plugins successfully updated. Please restart Flow.
+ Plugin {0} has already been modified. Please restart Flow before making any further changes.
+
擴充功能管理
Management of installing, uninstalling or updating Flow Launcher plugins
@@ -46,4 +60,5 @@
Install from unknown source warning
+ Automatically restart Flow Launcher after installing/uninstalling/updating plugins
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml
index c4cc85463..c27892d51 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml
@@ -1,7 +1,7 @@
- Process Killer
+ Prozesskiller
Kill running processes from Flow Launcher
kill all instances of "{0}"
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml
index c4cc85463..1ea52e741 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml
@@ -2,10 +2,10 @@
Process Killer
- Kill running processes from Flow Launcher
+ Termina i processi in esecuzione da Flow Launcher
- kill all instances of "{0}"
- kill {0} processes
- kill all instances
+ termina tutte le istanze di "{0}"
+ termina {0} processi
+ termina tutte le istanze
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml
index c4cc85463..e23f43875 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml
@@ -1,11 +1,11 @@
- Process Killer
- Kill running processes from Flow Launcher
+ Вбивця процесів
+ Завершення запущених процесів через Flow Launcher
- kill all instances of "{0}"
- kill {0} processes
- kill all instances
+ вбити всі екземпляри "{0}"
+ вбити {0} процесів
+ вбити всі екземпляри
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml
index bf844188e..5ab3eb9ec 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml
@@ -9,12 +9,12 @@
Name
Aktivieren
Aktiviert
- Disable
+ Deaktivieren
Status
Aktiviert
Disabled
Speicherort
- All Programs
+ Alle Programme
File Type
erneut Indexieren
Indexieren
@@ -28,7 +28,7 @@
When enabled, Flow will load programs from the registry
PATH
When enabled, Flow will load programs from the PATH environment variable
- Hide app path
+ App-Pfad verstecken
For executable files such as UWP or lnk, hide the file path from being visible
Search in Program Description
Flow will search program's description
@@ -69,16 +69,16 @@
Run As Different User
Als Administrator ausführen
- Open containing folder
+ Enthaltenden Ordner öffnen
Disable this program from displaying
Programm
Suche Programme mit Flow Launcher
- Invalid Path
+ Ungültiger Pfad
Customized Explorer
- Args
+ Argumente
You can customized the explorer used for opening the container folder by inputing the Environmental Variable of the explorer you want to use. It will be useful to use CMD to test whether the Environmental Variable is available.
Enter the customized args you want to add for your customized explorer. %s for parent directory, %f for full path (which only works for win32). Check the explorer's website for details.
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
index 83062ce6e..f4a9926e8 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml
@@ -2,91 +2,91 @@
- Reset Default
+ Скинути до значення за замовчуванням
Видалити
Редагувати
Додати
- Name
- Enable
- Enabled
- Disable
- Status
- Enabled
- Disabled
- Location
- All Programs
- File Type
- Reindex
- Indexing
- Index Sources
- Options
- UWP Apps
- When enabled, Flow will load UWP Applications
- Start Menu
- When enabled, Flow will load programs from the start menu
- Registry
- When enabled, Flow will load programs from the registry
+ Назва
+ Увімкнути
+ Увімкнено
+ Вимкнути
+ Статус
+ Увімкнено
+ Вимкнено
+ Місцезнаходження
+ Всі програми
+ Тип файлу
+ Переіндексувати
+ Індексація
+ Джерела індексу
+ Параметри
+ Додатки UWP
+ Якщо увімкнено, Flow буде завантажувати UWP-додатки
+ Меню Пуск
+ Якщо увімкнено, Flow завантажуватиме програми зі стартового меню
+ Реєстр
+ Якщо увімкнено, Flow буде завантажувати програми з реєстру
PATH
- When enabled, Flow will load programs from the PATH environment variable
- Hide app path
- For executable files such as UWP or lnk, hide the file path from being visible
- Search in Program Description
- Flow will search program's description
- Suffixes
- Max Depth
+ Якщо увімкнено, Flow буде завантажувати програми зі змінної середовища PATH
+ Приховати шлях до програми
+ Для виконуваних файлів, таких як UWP або lnk, приховати шлях до файлу, щоб його не було видно
+ Пошук в описі програми
+ Flow буде шукати опис програми
+ Суфікси
+ Максимальна глибина
- Directory
- Browse
- File Suffixes:
- Maximum Search Depth (-1 is unlimited):
+ Каталог
+ Перегляд
+ Суфікси файлів:
+ Максимальна глибина пошуку (-1 - необмежена):
- Please select a program source
- Are you sure you want to delete the selected program sources?
- Another program source with the same location already exists.
+ Будь ласка, виберіть джерело програми
+ Ви впевнені, що хочете видалити вибрані джерела програм?
+ Інше програмне джерело з тим самим розташуванням вже існує.
- Program Source
- Edit directory and status of this program source.
+ Вихідний код програми
+ Редагування каталогу і статусу вихідного коду програми.
Оновити
- Program Plugin will only index files with selected suffixes and .url files with selected protocols.
- Successfully updated file suffixes
- File suffixes can't be empty
- Protocols can't be empty
+ Плагін проіндексує лише файли з вибраними суфіксами та .url-файли з вибраними протоколами.
+ Успішно оновлено суфікси файлів
+ Суфікси файлів не можуть бути порожніми
+ Протоколи не можуть бути порожніми
- File Suffixes
- URL Protocols
- Steam Games
+ Суфікси файлів
+ Протоколи URL-адрес
+ Ігри в Steam
Epic Games
Http/Https
- Custom URL Protocols
- Custom File Suffixes
+ Користувацькі протоколи URL-адрес
+ Користувацькі суфікси файлів
- Insert file suffixes you want to index. Suffixes should be separated by ';'. (ex>bat;py)
+ Вставте суфікси файлів, які потрібно проіндексувати. Суфікси слід розділяти символом ';'. (ex>bat;py)a
- Insert protocols of .url files you want to index. Protocols should be separated by ';', and should end with "://". (ex>ftp://;mailto://)
+ Вставте протоколи .url файлів, які потрібно проіндексувати. Протоколи слід розділяти символом ';' і закінчувати "://". (ex>ftp://; mailto://)
- Run As Different User
- Run As Administrator
- Open containing folder
- Disable this program from displaying
+ Запустити від імені іншого користувача
+ Запустити від імені адміністратора
+ Відкрити папку
+ Вимкнути відображення цієї програми
- Program
- Search programs in Flow Launcher
+ Програма
+ Пошук програм у Flow Launcher
- Invalid Path
+ Неправильний шлях
- Customized Explorer
- Args
- You can customized the explorer used for opening the container folder by inputing the Environmental Variable of the explorer you want to use. It will be useful to use CMD to test whether the Environmental Variable is available.
- Enter the customized args you want to add for your customized explorer. %s for parent directory, %f for full path (which only works for win32). Check the explorer's website for details.
+ Кастомізований провідник
+ Аргументи
+ Ви можете налаштувати провідник, який використовується для відкриття теки контейнера, ввівши змінну середовища провідника, який ви хочете використовувати. Буде корисно скористатися командою CMD для перевірки доступності змінної середовища.
+ Введіть спеціальні аргументи, які ви хочете додати до вашого провідника. %s для батьківського каталогу, %f для повного шляху (працює лише для win32). Докладнішу інформацію можна знайти на веб-сайті провідника.
Успішно
- Error
- Successfully disabled this program from displaying in your query
- This app is not intended to be run as administrator
- Unable to run {0}
+ Помилка
+ Успішно вимкнено відображення цієї програми у вашому запиті
+ Ця програма не призначена для запуску від імені адміністратора
+ Неможливо запустити {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
index 0ccfd8c9a..b7d02c558 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ar.xaml
@@ -2,6 +2,8 @@
Replace Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
index 2c764d845..de45c754c 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/cs.xaml
@@ -2,6 +2,8 @@
Nahradit Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Po dokončení příkazu příkazový řádek nezavírejte
Vždy spustit jako správce
Spustit jako jiný uživatel
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
index 0ccfd8c9a..b7d02c558 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/da.xaml
@@ -2,6 +2,8 @@
Replace Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
index 3fa7c64fa..bd3043d82 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/de.xaml
@@ -2,6 +2,8 @@
Ersetzt Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Schließe die Kommandozeilte nicht nachdem der Befehl ausgeführt wurde
Immer als Administrator ausführen
Als anderer Benutzer ausführen
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
index 284a2a0e6..5ee2c43b4 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es-419.xaml
@@ -2,6 +2,8 @@
Reemplazar Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
No cerrar Símbolo del Sistema tras ejecutar el comando
Siempre ejecutar como administrador
Ejecutar como otro usuario
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
index 8bf1a2c11..b43d75690 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/es.xaml
@@ -2,6 +2,8 @@
Reemplazar Win+R
+ Cerrar Símbolo del sistema después de pulsar cualquier tecla
+ Pulsar cualquier tecla para cerrar esta ventana...
No cerrar el símbolo del sistema después de la ejecución del comando
Ejecutar siempre como administrador
Ejecutar como usuario diferente
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
index d08efb9b8..379f3eda3 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/fr.xaml
@@ -2,6 +2,8 @@
Remplacer Win+R
+ Fermer l'invite de commande après avoir appuyé sur n'importe quelle touche
+ Appuyez sur n'importe quelle touche pour fermer cette fenêtre...
Ne pas fermer l'invite de commandes après l'exécution de la commande
Toujours exécuter en tant qu'administrateur
Exécuter en tant qu'utilisateur différent
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
index de40b0c47..ee473d80e 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml
@@ -2,11 +2,13 @@
Sostituisci Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Non chiudere il prompt dei comandi dopo l'esecuzione dei comandi
Esegui sempre come amministratore
Esegui come utente differente
Terminale
- Allows to execute system commands from Flow Launcher
+ Consente di eseguire comandi di sistema da Flow Launcher
questo comando è stato eseguito {0} volte
esegui il comando attraverso riga di comando
Esegui Come Amministratore
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
index 0ccfd8c9a..b7d02c558 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml
@@ -2,6 +2,8 @@
Replace Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
index 014a46dfc..3faaca429 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ko.xaml
@@ -2,6 +2,8 @@
Win+R 단축키 대체
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
명령 실행 후 명령 프롬프트를 닫지 않음
항상 관리자 권한으로 실행
다른 유저 권한으로 실행
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
index 0ccfd8c9a..b7d02c558 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nb.xaml
@@ -2,6 +2,8 @@
Replace Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
index 0ccfd8c9a..b7d02c558 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/nl.xaml
@@ -2,6 +2,8 @@
Replace Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
index c851be93b..592ff17b7 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pl.xaml
@@ -2,6 +2,8 @@
Zastąp Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Nie zamykaj wiersza poleceń po wykonaniu polecenia
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
index 6a0a3c8fd..729e33ddf 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-br.xaml
@@ -2,6 +2,8 @@
Substituir Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Não feche o Prompt de Comando após a execução do comando
Sempre executar como administrador
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
index 33d7f35a6..cf4665cce 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/pt-pt.xaml
@@ -2,6 +2,8 @@
Substituir Win+R
+ Fechar linha de comandos ao premir qualquer tecla
+ Prima uma tecla para fechar esta janela...
Não fechar linha de comandos depois de executar o comando
Executar sempre como administrador
Executar com outro utilizador
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
index 0ccfd8c9a..b7d02c558 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml
@@ -2,6 +2,8 @@
Replace Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
index 0b76303df..49f5dd796 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sk.xaml
@@ -2,6 +2,8 @@
Nahradiť Win+R
+ Zatvoriť príkazový riadok po stlačení ľubovoľného klávesu
+ Toto okno zatvoríte stlačením ľubovoľného klávesu…
Nezatvárať príkazový riadok po dokončení príkazu
Spustiť vždy ako správca
Spustiť ako iný používateľ
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
index 0ccfd8c9a..b7d02c558 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/sr.xaml
@@ -2,6 +2,8 @@
Replace Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Do not close Command Prompt after command execution
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
index c6433cef1..7dd1c5b36 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/tr.xaml
@@ -2,6 +2,8 @@
Win+R kısayolunu kullan
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
Çalıştırma sona erdikten sonra komut istemini kapatma
Always run as administrator
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
index 0ccfd8c9a..783fc4d25 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
@@ -1,15 +1,17 @@
- Replace Win+R
- Do not close Command Prompt after command execution
- Always run as administrator
- Run as different user
+ Заміна Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
+ Не закривати командний рядок після виконання команди
+ Завжди запускати від імені адміністратора
+ Запустити від імені іншого користувача
Shell
- Allows to execute system commands from Flow Launcher
- this command has been executed {0} times
- execute command through command shell
- Run As Administrator
- Copy the command
- Only show number of most used commands:
+ Дозволяє виконувати системні команди з Flow Launcher
+ цю команду було виконано {0} разів
+ виконати команду через командну оболонку
+ Запустити від імені адміністратора
+ Скопіювати команду
+ Показати лише кількість найчастіше використовуваних команд:
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
index 916542c3a..318903f07 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-cn.xaml
@@ -2,6 +2,8 @@
替换 Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
执行后不关闭命令窗口
始终以管理员身份运行
以其他用户身份运行
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
index 7ddc58918..21a330e3f 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/zh-tw.xaml
@@ -2,6 +2,8 @@
取代 Win+R
+ Close Command Prompt after pressing any key
+ Press any key to close this window...
執行後不關閉命令提示字元視窗
一律以系統管理員身分執行
Run as different user
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
index 2357454d0..f3b5775b5 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
Success
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
index 1505f6e65..40d3496fe 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
@@ -26,7 +26,7 @@
Otevře místo, kde jsou uložena nastavení Flow Launcher
Toggle Game Mode
-
+
Úspěšné
Uložení všech nastavení Flow Launcheru
Aktualizace všech dat pluginů
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
index d726432d6..5f9d8dc35 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
Fortsæt
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
index e33dc7bdb..6d33776eb 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
@@ -16,7 +16,7 @@
Computer in Schlafmodus versetzen
Papierkorb leeren
Open recycle bin
- Indexing Options
+ Indexierungsoptionen
Hibernate computer
Save all Flow Launcher settings
Refreshes plugin data with new content
@@ -24,9 +24,9 @@
Check for new Flow Launcher update
Visit Flow Launcher's documentation for more help and how to use tips
Open the location where Flow Launcher's settings are stored
- Toggle Game Mode
+ Gott Modus
-
+
Erfolgreich
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
index 2357454d0..f3b5775b5 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
Success
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
index 2d32da003..5689ac41e 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
@@ -24,9 +24,9 @@
Busca actualizaciones de Flow Launcher
Accede a la documentación de Flow Launcher para más ayuda y consejos de uso
Abre la ubicación donde se almacena la configuración de Flow Launcher
- Toggle Game Mode
+ Cambiar a Modo Juego
-
+
Correcto
Toda la configuración de Flow Launcher ha sido guardada
Se recargaron todos los datos del complemento
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
index 62e66c64b..ee25fcf88 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
@@ -24,9 +24,9 @@
Vérifier de nouvelles mises à jour Flow Launcher
Consultez la documentation de Flow Launcher pour plus d'aide et comment utiliser les conseils.
Ouvrez l'emplacement où les paramètres de Flow Launcher sont stockés
- Toggle Game Mode
+ Basculer le mode de jeu
-
+
Ajouté avec succès
Tous les paramètres Flow Launcher ont été sauvés
Toutes les données du plugin applicables ont été rechargés
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
index 5691201a8..bb4293aa2 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
@@ -24,9 +24,9 @@
Controlla il nuovo aggiornamento di Flow Launcher
Visita la documentazione di Flow Launcher per maggiori informazioni e suggerimenti su come usarlo
Apri la posizione in cui vengono memorizzate le impostazioni di Flow Launcher
- Toggle Game Mode
+ Attiva/Disattiva Modalità Di Gioco
-
+
Successo
Tutte le impostazioni di Flow Launcher sono state salvate
Ricaricato tutti i dati del plugin applicabili
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
index 66c6c3bed..e2e107004 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
成功しまし
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
index 35951a583..ecfc113e3 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
@@ -26,7 +26,7 @@
Flow Launcher의 설정이 저장된 위치 열기
Toggle Game Mode
-
+
성공
모든 Flow Launcher 설정을 저장했습니다
적용 가능한 모든 플러그인 데이터를 다시 로드했습니다
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
index 2357454d0..f3b5775b5 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
Success
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
index 85c04371c..438c2a9de 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
Succesvol
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
index d01d780ae..776f4a46c 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
Sukces
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
index 0bc352d80..1057bebac 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
Sucesso
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
index f76c1f178..6499e3ec2 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
@@ -24,9 +24,9 @@
Procurar por novas versões do Flow Launcher
Aceda à documentação para mais informações e dicas de utilização
Abrir localização onde as definições do Flow Launcher estão guardadas
- Toggle Game Mode
+ Comutar modo de jogo
-
+
Sucesso
Definições guardadas com sucesso
Recarregar todos os dados aplicáveis ao plugin
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
index 3092c6299..b3ea0688e 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
Успешно
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
index dcad0ccee..1fd0e1949 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
@@ -24,9 +24,9 @@
Skontrolovať aktualizácie Flow Launchera
V dokumentácii k aplikácii Flow Launcher nájdete ďalšiu pomoc a tipy na používanie
Otvoriť umiestnenie, kde sú uložené nastavenia Flow Launchera
- Toggle Game Mode
+ Prepnúť herný režim
-
+
Úspešné
Všetky nastavenia Flow Launchera uložené
Všetky dáta pluginov aktualizované
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
index e8ba99c9a..e5bdd0dc0 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
Uspešno
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
index c66601dba..6cb5026aa 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
Başarılı
Tüm Flow Launcher ayarları kaydedildi.
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
index ac73513f4..aebddd427 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
@@ -2,40 +2,40 @@
- Command
- Description
+ Команда
+ Опис
- Shutdown Computer
- Restart Computer
- Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
- Log off
- Lock this computer
- Close Flow Launcher
- Restart Flow Launcher
- Tweak Flow Launcher's settings
- Put computer to sleep
- Empty recycle bin
- Open recycle bin
- Indexing Options
- Hibernate computer
- Save all Flow Launcher settings
- Refreshes plugin data with new content
- Open Flow Launcher's log location
- Check for new Flow Launcher update
- Visit Flow Launcher's documentation for more help and how to use tips
- Open the location where Flow Launcher's settings are stored
+ Вимкнути комп'ютер
+ Перезавантажити комп'ютер
+ Перезавантажте комп'ютер за допомогою Розширених параметрів завантаження для безпечного чи налагоджувального режимів, а також інших опцій
+ Вийти з системи
+ Заблокувати комп'ютер
+ Закрити Flow Launcher
+ Перезапустити Flow Launcher
+ Налаштування Flow Launcher
+ Переведення комп'ютера в режим сну
+ Очистити кошик
+ Відкрити кошик
+ Параметри індексації
+ Переведення комп'ютера в режим гібернації
+ Зберегти всі налаштування Flow Launcher
+ Оновлює дані плагіна новим вмістом
+ Відкрити розташування журналу Flow Launcher
+ Перевірити наявність оновлень Flow Launcher
+ Перегляньте документацію Flow Launcher для отримання додаткової допомоги та підказок щодо використання порад
+ Відкрити каталог, де зберігаються налаштування Flow Launcher
Toggle Game Mode
-
+
Успішно
- All Flow Launcher settings saved
- Reloaded all applicable plugin data
- Are you sure you want to shut the computer down?
- Are you sure you want to restart the computer?
- Are you sure you want to restart the computer with Advanced Boot Options?
- Are you sure you want to log off?
+ Усі налаштування Flow Launcher збережено
+ Перезавантажено всі відповідні дані плагіна
+ Ви впевнені, що хочете вимкнути комп'ютер?
+ Ви впевнені, що хочете перезавантажити комп'ютер?
+ Ви впевнені, що хочете перезавантажити комп'ютер за допомогою додаткових параметрів завантаження?
+ Ви впевнені, що хочете вийти з системи?
- System Commands
- Provides System related commands. e.g. shutdown, lock, settings etc.
+ Системні команди
+ Надає команди, пов'язані з системою, наприклад, вимкнення, блокування, налаштування тощо.
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
index cba1e5fbe..9c9653997 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
@@ -26,7 +26,7 @@
打开Flow Launcher 设置文件夹
Toggle Game Mode
-
+
成功
所有 Flow Launcher 设置已保存
重新加载了所有插件数据
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
index cc469f808..5fad62881 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
@@ -26,7 +26,7 @@
Open the location where Flow Launcher's settings are stored
Toggle Game Mode
-
+
成
All Flow Launcher settings saved
Reloaded all applicable plugin data
diff --git a/Plugins/Flow.Launcher.Plugin.Url/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Url/Languages/uk-UA.xaml
index 418731021..45f29423a 100644
--- a/Plugins/Flow.Launcher.Plugin.Url/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Url/Languages/uk-UA.xaml
@@ -1,17 +1,17 @@
- Open search in:
- New Window
- New Tab
+ Запустити пошук:
+ Нове вікно
+ Нова вкладка
- Open url:{0}
- Can't open url:{0}
+ Відкрити URL:{0}
+ Не вдається відкрити URL:{0}
URL
- Open the typed URL from Flow Launcher
+ Відкрити набрану URL-адресу з Flow Launcher
- Please set your browser path:
- Choose
- Application(*.exe)|*.exe|All files|*.*
+ Будь ласка, встановіть шлях до вашого браузера:
+ Обрати
+ Application(*.exe)|*.exe|Усі файли|*.*
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
index 091102a0a..87419023b 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml
@@ -1,51 +1,51 @@
- Search Source Setting
- Open search in:
- New Window
- New Tab
- Set browser from path:
- Choose
+ Налаштування джерела пошуку
+ Запустити пошук:
+ Нове вікно
+ Нова вкладка
+ Встановити браузер за шляхом:
+ Обрати
Видалити
Редагувати
Додати
- Enabled
- Enabled
- Disabled
- Confirm
- Action Keyword
+ Увімкнено
+ Увімкнено
+ Вимкнено
+ Підтвердити
+ Ключове слово дії
URL
- Search
- Use Search Query Autocomplete:
- Autocomplete Data from:
- Please select a web search
- Are you sure you want to delete {0}?
- If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads
+ Пошук
+ Використовувати автозаповнення пошукового запиту:
+ Автозаповнення даних з:
+ Будь ласка, виберіть пошуковий запит в Інтернеті
+ Ви впевнені, що хочете видалити {0}?
+ Якщо ви хочете додати до Flow пошук певного веб-сайту, спочатку введіть фіктивний текстовий рядок у пошуковий рядок цього веб-сайту і розпочніть пошук. Тепер скопіюйте вміст адресного рядка браузера і вставте його в поле URL нижче. Замініть тестовий рядок на {q}. Наприклад, якщо ви шукаєте казино на сайті Netflix, його адресний рядок матиме такий вигляд
https://www.netflix.com/search?q=Casino
- Now copy this entire string and paste it in the URL field below.
- Then replace casino with {q}.
- Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q}
+ Тепер скопіюйте весь цей рядок і вставте його в поле URL нижче.
+ Потім замініть casino на {q}.
+ Таким чином, загальна формула для пошуку на Netflix має вигляд https://www.netflix.com/search?q={q}
- Title
- Status
- Select Icon
- Icon
+ Назва
+ Статус
+ Обрати значок
+ Іконка
Скасувати
- Invalid web search
- Please enter a title
- Please enter an action keyword
- Please enter a URL
- Action keyword already exists, please enter a different one
+ Неправильний веб-пошук
+ Будь ласка, введіть назву
+ Будь ласка, введіть ключове слово дії
+ Будь ласка, введіть URL-адресу
+ Ключове слово дії вже існує, будь ласка, введіть інше
Успішно
- Hint: You do not need to place custom images in this directory, if Flow's version is updated they will be lost. Flow will automatically copy any images outside of this directory across to WebSearch's custom image location.
+ Підказка: Вам не потрібно розміщувати власні зображення в цьому каталозі, якщо версія Flow оновиться, вони будуть втрачені. Flow автоматично копіює всі зображення з цього каталогу до спеціального каталогу WebSearch.
- Web Searches
- Allows to perform web searches
+ Веб-пошук
+ Дозволяє здійснювати веб-пошук
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.fr-FR.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.fr-FR.resx
index 89cb40ace..da2763d25 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.fr-FR.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.fr-FR.resx
@@ -1737,136 +1737,136 @@
Mean zooming of things via a magnifier
- Change device installation settings
+ Modifier les paramètres d'installation de l'appareil
- Turn off background images
+ Désactiver les images d'arrière-plan
- Navigation properties
+ Propriétés de navigation
- Media streaming options
+ Options de diffusion des médias
- Make a file type always open in a specific program
+ Faire en sorte qu'un type de fichier s'ouvre toujours dans un programme spécifique
- Change the Narrator’s voice
+ Changer la voix du Narrateur
- Find and fix keyboard problems
+ Trouver et résoudre les problèmes liés au clavier
- Use screen reader
+ Utiliser le lecteur d'écran
- Show which workgroup this computer is on
+ Afficher le groupe de travail sur lequel cet ordinateur est allumé
- Change mouse wheel settings
+ Modifier les paramètres de la molette de la souris
- Manage computer certificates
+ Gérer les certificats de l'ordinateur
- Find and fix problems
+ Trouver et résoudre les problèmes
- Change settings for content received using Tap and send
+ Modifier les paramètres pour le contenu reçu en utilisant Tap and send
- Change default settings for media or devices
+ Modifier les paramètres par défaut pour les médias ou appareils
- Print the speech reference card
+ Imprimer la carte de référence vocale
- Calibrate display colour
+ Calibrer la couleur de l'affichage
- Manage file encryption certificates
+ Gérer les certificats de chiffrement de fichiers
- View recent messages about your computer
+ Voir les messages récents à propos de votre ordinateur
- Give other users access to this computer
+ Donner accès à cet ordinateur aux autres utilisateurs
- Show hidden files and folders
+ Afficher les fichiers et dossiers cachés
- Change Windows To Go start-up options
+ Modifier les options de démarrage de Windows To Go
- See which processes start up automatically when you start Windows
+ Voir quels processus démarrent automatiquement lorsque vous démarrez Windows
- Tell if an RSS feed is available on a website
+ Indiquer si un flux RSS est disponible sur un site web
- Add clocks for different time zones
+ Ajouter des horloges pour différents fuseaux horaires
- Add a Bluetooth device
+ Ajouter un appareil Bluetooth
- Customise the mouse buttons
+ Personnaliser les boutons de la souris
- Set tablet buttons to perform certain tasks
+ Définir les boutons de tablette pour effectuer certaines tâches
- View installed fonts
+ Afficher les polices installées
- Change the way currency is displayed
+ Changer la façon dont la devise est affichée
- Edit group policy
+ Modifier la politique de groupe
- Manage browser add-ons
+ Gérer les modules complémentaires du navigateur
- Check processor speed
+ Vérifier la vitesse du processeur
- Check firewall status
+ Vérifier le statut du pare-feu
- Send or receive a file
+ Envoyer ou recevoir un fichier
- Add or remove user accounts
+ Ajouter ou supprimer des comptes utilisateur
- Edit the system environment variables
+ Modifier les variables d'environnement système
- Manage BitLocker
+ Gérer BitLocker
- Auto-hide the taskbar
+ Masquer automatiquement la barre des tâches
- Change sound card settings
+ Modifier les paramètres de la carte son
- Make changes to accounts
+ Apporter des modifications aux comptes
- Edit local users and groups
+ Modifier les utilisateurs et les groupes locaux
- View network computers and devices
+ Afficher les ordinateurs et périphériques réseau
- Install a program from the network
+ Installer un programme depuis le réseau
- View scanners and cameras
+ Voir les scanners et caméras
Microsoft IME Register Word (Japanese)
@@ -1899,10 +1899,10 @@
Back up and Restore (Windows 7)
- Preview, delete, show or hide fonts
+ Aperçu, supprimer, afficher ou masquer les polices
- Microsoft Quick Settings
+ Paramètres rapides Microsoft
View reliability history
@@ -1932,7 +1932,7 @@
Turn off unnecessary animations
- Create a restore point
+ Créer un point de restauration
Turn off automatic window arrangement
@@ -1950,10 +1950,10 @@
Change cursor blink rate
- Add or remove programs
+ Ajouter ou supprimer des programmes
- Create a password reset disk
+ Créer un disque de réinitialisation de mot de passe
Configure advanced user profile properties
@@ -1983,13 +1983,13 @@
How to install a program
- Change how your keyboard works
+ Modifier le fonctionnement de votre clavier
- Automatically adjust for daylight saving time
+ Ajustement automatique à l'heure d'été
- Change the order of Windows SideShow gadgets
+ Modifier l'ordre des gadgets Windows SideShow
Check keyboard status
@@ -2464,10 +2464,10 @@
Set up a broadband connection
- Calibrate the screen for pen or touch input
+ Calibrer l'écran pour le stylet ou la touche d'entrée
- Manage user certificates
+ Gérer les certificats utilisateur
Schedule tasks
@@ -2497,10 +2497,10 @@
View system resource usage in Task Manager
- Create an account
+ Créer un compte
- Get more features with a new edition of Windows
+ Obtenez plus de fonctionnalités avec une nouvelle édition de Windows
Panneau de configuration
@@ -2509,6 +2509,6 @@
TaskLink
- Unknown
+ Inconnu
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.uk-UA.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.uk-UA.resx
index 3b598e40c..9d801e0d4 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.uk-UA.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.uk-UA.resx
@@ -126,66 +126,66 @@
File name, Should not translated
- Accessibility Options
+ Параметри доступності
Area Control Panel (legacy settings)
- Accessory apps
+ Додаткові програми
Area Privacy
- Access work or school
+ Доступ до роботи або навчання
Area UserAccounts
- Account info
+ Інформація про обліковий запис
Area Privacy
- Accounts
+ Облікові записи
Area SurfaceHub
- Action Center
+ Центр дій
Area Control Panel (legacy settings)
- Activation
+ Активація
Area UpdateAndSecurity
- Activity history
+ Історія активності
Area Privacy
- Add Hardware
+ Додати обладнання
Area Control Panel (legacy settings)
- Add/Remove Programs
+ Додавання/видалення програм
Area Control Panel (legacy settings)
- Add your phone
+ Додайте свій телефон
Area Phone
- Administrative Tools
+ Адміністративні інструменти
Area System
- Advanced display settings
+ Розширені налаштування дисплея
Area System, only available on devices that support advanced display options
- Advanced graphics
+ Розширена графіка
- Advertising ID
+ Рекламний ідентифікатор
Area Privacy, Deprecated in Windows 10, version 1809 and later
- Airplane mode
+ Режим польоту
Area NetworkAndInternet
@@ -193,40 +193,40 @@
Means the key combination "Tabulator+Alt" on the keyboard
- Alternative names
+ Альтернативні назви
- Animations
+ Анімації
- App color
+ Колір програми
- App diagnostics
+ Діагностика програми
Area Privacy
- App features
+ Можливості програми
Area Apps
- App
+ Застосунок
Short/modern name for application
- Apps and Features
+ Додатки та функції
Area Apps
- System settings
+ Налаштування системи
Type of the setting is a "Modern Windows settings". We use the same term as used in start menu search at the moment.
- Apps for websites
+ Додатки для веб-сайтів
Area Apps
- App volume and device preferences
+ Гучність програми та налаштування пристрою
Area System, Added in Windows 10, version 1903
@@ -234,159 +234,159 @@
File name, Should not translated
- Area
+ Область
Mean the settings area or settings category
- Accounts
+ Облікові записи
- Administrative Tools
+ Адміністративні інструменти
Area Control Panel (legacy settings)
- Appearance and Personalization
+ Зовнішній вигляд та персоналізація
- Apps
+ Додатки
- Clock and Region
+ Час і регіон
- Control Panel
+ Панель управління
- Cortana
+ Кортана
- Devices
+ Пристрої
- Ease of access
+ Легкість доступу
- Extras
+ Доповнення
- Gaming
+ Ігри
- Hardware and Sound
+ Апаратне забезпечення та звук
- Home page
+ Головна сторінка
- Mixed reality
+ Змішана реальність
- Network and Internet
+ Мережа та Інтернет
- Personalization
+ Персоналізація
- Phone
+ Телефон
- Privacy
+ Конфіденційність
- Programs
+ Програми
SurfaceHub
- System
+ Система
- System and Security
+ Система та безпека
- Time and language
+ Час і мова
- Update and security
+ Оновлення та безпека
- User accounts
+ Облікові записи користувачів
- Assigned access
+ Призначений доступ
- Audio
+ Аудіо
Area EaseOfAccess
- Audio alerts
+ Звукові сповіщення
- Audio and speech
+ Аудіо та мовлення
Area MixedReality, only available if the Mixed Reality Portal app is installed.
- Automatic file downloads
+ Автоматичне завантаження файлів
Area Privacy
- AutoPlay
+ Автовідтворення
Area Device
- Background
+ Тло
Area Personalization
- Background Apps
+ Фонові програми
Area Privacy
- Backup
+ Резервне копіювання
Area UpdateAndSecurity
- Backup and Restore
+ Резервне копіювання та відновлення
Area Control Panel (legacy settings)
- Battery Saver
+ Економія заряду батареї
Area System, only available on devices that have a battery, such as a tablet
- Battery Saver settings
+ Налаштування енергозбереження
Area System, only available on devices that have a battery, such as a tablet
- Battery saver usage details
+ Детальна інформація про використання економії заряду акумулятора
- Battery use
+ Використання батареї
Area System, only available on devices that have a battery, such as a tablet
- Biometric Devices
+ Біометричні пристрої
Area Control Panel (legacy settings)
- BitLocker Drive Encryption
+ Шифрування диска BitLocker
Area Control Panel (legacy settings)
- Blue light
+ Синє світло
Bluetooth
Area Device
- Bluetooth devices
+ Пристрої Bluetooth
Area Control Panel (legacy settings)
- Blue-yellow
+ Синьо-жовтий
Bopomofo IME
@@ -397,22 +397,22 @@
Should not translated
- Broadcasting
+ Трансляція
Area Gaming
- Calendar
+ Календар
Area Privacy
- Call history
+ Історія дзвінків
Area Privacy
- calling
+ виклик
- Camera
+ Камера
Area Privacy
@@ -424,118 +424,118 @@
Mean the "Caps Lock" key
- Cellular and SIM
+ Стільниковий зв'язок та SIM-карта
Area NetworkAndInternet
- Choose which folders appear on Start
+ Виберіть, які папки відображатимуться на панелі Пуск
Area Personalization
- Client service for NetWare
+ Обслуговування клієнтів для NetWare
Area Control Panel (legacy settings)
- Clipboard
+ Буфер обміну
Area System
- Closed captions
+ Субтитри
Area EaseOfAccess
- Color filters
+ Кольорові фільтри
Area EaseOfAccess
- Color management
+ Керування кольором
Area Control Panel (legacy settings)
- Colors
+ Кольори
Area Personalization
- Command
+ Команда
The command to direct start a setting
- Connected Devices
+ Підключені пристрої
Area Device
- Contacts
+ Контакти
Area Privacy
- Control Panel
+ Панель управління
Type of the setting is a "(legacy) Control Panel setting"
- Copy command
+ Скопіювати команду
- Core Isolation
+ Ізоляція ядра
Means the protection of the system core
- Cortana
+ Кортана
Area Cortana
- Cortana across my devices
+ Кортана на всіх моїх пристроях
Area Cortana
- Cortana - Language
+ Кортана - Мова
Area Cortana
- Credential manager
+ Менеджер облікових даних
Area Control Panel (legacy settings)
- Crossdevice
+ Кроспристрійний
- Custom devices
+ Спеціальні пристрої
- Dark color
+ Темний колір
- Dark mode
+ Темний режим
- Data usage
+ Використання даних
Area NetworkAndInternet
- Date and time
+ Дата і час
Area TimeAndLanguage
- Default apps
+ Програми за замовчуванням
Area Apps
- Default camera
+ Камера за замовчуванням
Area Device
- Default location
+ Розташування за замовчуванням
Area Control Panel (legacy settings)
- Default programs
+ Програми за замовчуванням
Area Control Panel (legacy settings)
- Default Save Locations
+ Місця збереження за замовчуванням
Area System
- Delivery Optimization
+ Оптимізація доставки
Area UpdateAndSecurity
@@ -543,19 +543,19 @@
File name, Should not translated
- Desktop themes
+ Теми для робочого столу
Area Control Panel (legacy settings)
- deuteranopia
+ дейтеранопія
Medical: Mean you don't can see red colors
- Device manager
+ Диспетчер пристроїв
Area Control Panel (legacy settings)
- Devices and printers
+ Пристрої та принтери
Area Control Panel (legacy settings)
@@ -563,63 +563,63 @@
Should not translated
- Dial-up
+ Комутований зв'язок
Area NetworkAndInternet
- Direct access
+ Прямий доступ
Area NetworkAndInternet, only available if DirectAccess is enabled
- Direct open your phone
+ Пряме відкриття телефону
Area EaseOfAccess
- Display
+ Відображення
Area EaseOfAccess
- Display properties
+ Властивості відображення
Area Control Panel (legacy settings)
- DNS
+ ДНС
Should not translated
- Documents
+ Документи
Area Privacy
- Duplicating my display
+ Дублювання мого дисплею
Area System
- During these hours
+ Протягом цих годин
Area System
- Ease of access center
+ Центр легкого доступу
Area Control Panel (legacy settings)
- Edition
+ Видання
Means the "Windows Edition"
- Email
+ Електронна пошта
Area Privacy
- Email and app accounts
+ Облікові записи електронної пошти та додатків
Area UserAccounts
- Encryption
+ Шифрування
Area System
- Environment
+ Середовище
Area MixedReality, only available if the Mixed Reality Portal app is installed.
@@ -627,30 +627,30 @@
Area NetworkAndInternet
- Exploit Protection
+ Захист від експлойтів
- Extras
+ Доповнення
Area Extra, , only used for setting of 3rd-Party tools
- Eye control
+ Зоровий контроль
Area EaseOfAccess
- Eye tracker
+ Відстежувач очей
Area Privacy, requires eyetracker hardware
- Family and other people
+ Сім'я та інші люди
Area UserAccounts
- Feedback and diagnostics
+ Зворотній зв'язок та діагностика
Area Privacy
- File system
+ Файлова система
Area Privacy
@@ -662,42 +662,42 @@
File name, Should not translated
- Find My Device
+ Знайти мій пристрій
Area UpdateAndSecurity
- Firewall
+ Брандмауер
- Focus assist - Quiet hours
+ Допомога з фокусуванням - Тихі години
Area System
- Focus assist - Quiet moments
+ Допомога з фокусуванням - Тихі моменти
Area System
- Folder options
+ Параметри папки
Area Control Panel (legacy settings)
- Fonts
+ Шрифти
Area EaseOfAccess
- For developers
+ Для розробників
Area UpdateAndSecurity
- Game bar
+ Ігрова панель
Area Gaming
- Game controllers
+ Ігрові контролери
Area Control Panel (legacy settings)
- Game DVR
+ Ігровий DVR
Area Gaming
@@ -705,7 +705,7 @@
Area Gaming
- Gateway
+ Шлюз
Should not translated
@@ -713,61 +713,61 @@
Area Privacy
- Get programs
+ Отримати програми
Area Control Panel (legacy settings)
- Getting started
+ Початок роботи
Area Control Panel (legacy settings)
- Glance
+ Погляд
Area Personalization, Deprecated in Windows 10, version 1809 and later
- Graphics settings
+ Графічні налаштування
Area System
- Grayscale
+ Відтінки сірого
- Green week
+ Зелений тиждень
Mean you don't can see green colors
- Headset display
+ Відображення гарнітури
Area MixedReality, only available if the Mixed Reality Portal app is installed.
- High contrast
+ Високий контраст
Area EaseOfAccess
- Holographic audio
+ Голографічний звук
- Holographic Environment
+ Голографічне середовище
- Holographic Headset
+ Голографічна гарнітура
- Holographic Management
+ Голографічне управління
- Home group
+ Домашня група
Area Control Panel (legacy settings)
- ID
+ Ідентифікатор
MEans The "Windows Identifier"
- Image
+ Зображення
- Indexing options
+ Параметри індексації
Area Control Panel (legacy settings)
@@ -775,15 +775,15 @@
File name, Should not translated
- Infrared
+ Інфрачервоне випромінювання
Area Control Panel (legacy settings)
- Inking and typing
+ Малювання та друк
Area Privacy
- Internet options
+ Параметри Інтернету
Area Control Panel (legacy settings)
@@ -791,17 +791,17 @@
File name, Should not translated
- Inverted colors
+ Інвертовані кольори
- IP
+ IP-адреса
Should not translated
- Isolated Browsing
+ Ізольований перегляд
- Japan IME settings
+ Налаштування IME в Японії
Area TimeAndLanguage, available if the Microsoft Japan input method editor is installed
@@ -809,7 +809,7 @@
File name, Should not translated
- Joystick properties
+ Властивості джойстика
Area Control Panel (legacy settings)
@@ -817,39 +817,39 @@
Should not translated
- Keyboard
+ Клавіатура
Area EaseOfAccess
- Keypad
+ Клавіатура
- Keys
+ Клавіші
Мова
Area TimeAndLanguage
- Light color
+ Світлий колір
- Light mode
+ Легкий режим
- Location
+ Місцезнаходження
Area Privacy
- Lock screen
+ Екран блокування
Area Personalization
- Magnifier
+ Лупа
Area EaseOfAccess
- Mail - Microsoft Exchange or Windows Messaging
+ Пошта - Microsoft Exchange або Windows Messaging
Area Control Panel (legacy settings)
@@ -857,26 +857,26 @@
File name, Should not translated
- Manage known networks
+ Керування відомими мережами
Area NetworkAndInternet
- Manage optional features
+ Керування додатковими функціями
Area Apps
- Messaging
+ Обмін повідомленнями
Area Privacy
- Metered connection
+ Дозоване підключення
- Microphone
+ Мікрофон
Area Privacy
- Microsoft Mail Post Office
+ Поштова служба Microsoft Mail
Area Control Panel (legacy settings)
@@ -888,10 +888,10 @@
File name, Should not translated
- Mobile devices
+ Мобільні пристрої
- Mobile hotspot
+ Мобільна точка доступу
Area NetworkAndInternet
@@ -899,46 +899,46 @@
File name, Should not translated
- Mono
+ Моно
- More details
+ Детальніше
Area Cortana
- Motion
+ Рух
Area Privacy
- Mouse
+ Миша
Area EaseOfAccess
- Mouse and touchpad
+ Миша та тачпад
Area Device
- Mouse, Fonts, Keyboard, and Printers properties
+ Властивості миші, шрифтів, клавіатури та принтерів
Area Control Panel (legacy settings)
- Mouse pointer
+ Вказівник миші
Area EaseOfAccess
- Multimedia properties
+ Властивості мультимедіа
Area Control Panel (legacy settings)
- Multitasking
+ Багатозадачність
Area System
- Narrator
+ Диктор
Area EaseOfAccess
- Navigation bar
+ Панель навігації
Area Personalization
@@ -950,27 +950,27 @@
File name, Should not translated
- Network
+ Мережа
Area NetworkAndInternet
- Network and sharing center
+ Мережа та центр обміну даними
Area Control Panel (legacy settings)
- Network connection
+ Підключення до мережі
Area Control Panel (legacy settings)
- Network properties
+ Властивості мережі
Area Control Panel (legacy settings)
- Network Setup Wizard
+ Майстер налаштування мережі
Area Control Panel (legacy settings)
- Network status
+ Стан мережі
Area NetworkAndInternet
@@ -978,88 +978,88 @@
Area NetworkAndInternet
- NFC Transactions
+ NFC-транзакції
"NFC should not translated"
- Night light
+ Нічник
- Night light settings
+ Налаштування нічника
Area System
- Note
+ Примітка
- Only available when you have connected a mobile device to your device.
+ Доступно лише після підключення мобільного пристрою до вашого пристрою.
- Only available on devices that support advanced graphics options.
+ Доступно лише на пристроях, що підтримують розширені графічні опції.
- Only available on devices that have a battery, such as a tablet.
+ Доступно лише на пристроях з акумулятором, таких як планшет.
- Deprecated in Windows 10, version 1809 (build 17763) and later.
+ Застаріла у Windows 10, версії 1809 (збірка 17763) та пізніших версіях.
- Only available if Dial is paired.
+ Доступно, якщо циферблат під'єднано.
- Only available if DirectAccess is enabled.
+ Доступно, якщо увімкнено DirectAccess.
- Only available on devices that support advanced display options.
+ Доступно лише на пристроях, які підтримують розширені параметри відображення.
- Only present if user is enrolled in WIP.
+ Присутній лише якщо користувач зареєстрований у WIP.
- Requires eyetracker hardware.
+ Вимагає обладнання для відстеження очей.
- Available if the Microsoft Japan input method editor is installed.
+ Доступно, якщо встановлено редактор методів введення Microsoft Japan.
- Available if the Microsoft Pinyin input method editor is installed.
+ Доступно, якщо встановлено редактор способів введення Microsoft Pinyin.
- Available if the Microsoft Wubi input method editor is installed.
+ Доступно, якщо встановлено редактор методів введення Microsoft Wubi.
- Only available if the Mixed Reality Portal app is installed.
+ Доступно лише якщо встановлено додаток Портал змішаної реальності.
- Only available on mobile and if the enterprise has deployed a provisioning package.
+ Доступно лише на мобільних пристроях або якщо на підприємстві розгорнуто пакет забезпечення.
- Added in Windows 10, version 1903 (build 18362).
+ Додано у Windows 10, версія 1903 (збірка 18362).
- Added in Windows 10, version 2004 (build 19041).
+ Додано у Windows 10, версія 2004 (збірка 19041).
- Only available if "settings apps" are installed, for example, by a 3rd party.
+ Доступно, якщо "програми налаштувань" встановлені, наприклад, третьою стороною.
- Only available if touchpad hardware is present.
+ Доступно лише за наявності апаратного забезпечення тачпада.
- Only available if the device has a Wi-Fi adapter.
+ Доступно лише за наявності на пристрої адаптера Wi-Fi.
- Device must be Windows Anywhere-capable.
+ Пристрій повинен підтримувати Windows Anywhere.
- Only available if enterprise has deployed a provisioning package.
+ Доступно, якщо на підприємстві розгорнуто пакет забезпечення.
- Notifications
+ Сповіщення
Area Privacy
- Notifications and actions
+ Сповіщення та дії
Area System
@@ -1075,45 +1075,45 @@
File name, Should not translated
- ODBC Data Source Administrator (32-bit)
+ Адміністратор джерел даних ODBC (32-розрядний)
Area Control Panel (legacy settings)
- ODBC Data Source Administrator (64-bit)
+ Адміністратор джерел даних ODBC (64-розрядний)
Area Control Panel (legacy settings)
- Offline files
+ Офлайн файли
Area Control Panel (legacy settings)
- Offline Maps
+ Офлайн карти
Area Apps
- Offline Maps - Download maps
+ Офлайн карти - Завантажити карти
Area Apps
- On-Screen
+ Екранний
- OS
+ ОС
Means the "Operating System"
- Other devices
+ Інші пристрої
Area Privacy
- Other options
+ Інші параметри
Area EaseOfAccess
- Other users
+ Інші користувачі
- Parental controls
+ Батьківський контроль
Area Control Panel (legacy settings)
@@ -1124,92 +1124,92 @@
File name, Should not translated
- Password properties
+ Параметри паролів
Area Control Panel (legacy settings)
- Pen and input devices
+ Ручка та пристрої введення
Area Control Panel (legacy settings)
- Pen and touch
+ Ручка та сенсорний дотик
Area Control Panel (legacy settings)
- Pen and Windows Ink
+ Ручка та чорнило для Windows
Area Device
- People Near Me
+ Люди поруч зі мною
Area Control Panel (legacy settings)
- Performance information and tools
+ Інформація про ефективність та інструменти
Area Control Panel (legacy settings)
- Permissions and history
+ Дозволи та історія
Area Cortana
- Personalization (category)
+ Персоналізація (категорія)
Area Personalization
- Phone
+ Телефон
Area Phone
- Phone and modem
+ Телефон і модем
Area Control Panel (legacy settings)
- Phone and modem - Options
+ Телефон і модем - Опції
Area Control Panel (legacy settings)
- Phone calls
+ Телефонні дзвінки
Area Privacy
- Phone - Default apps
+ Телефон - Програми за замовчуванням
Area System
- Picture
+ Зображення
- Pictures
+ Картинки
Area Privacy
- Pinyin IME settings
+ Налаштування піньїнь IME
Area TimeAndLanguage, available if the Microsoft Pinyin input method editor is installed
- Pinyin IME settings - domain lexicon
+ Налаштування IME піньїнь - лексика домену
Area TimeAndLanguage
- Pinyin IME settings - Key configuration
+ Налаштування піньїнь IME - Конфігурація ключів
Area TimeAndLanguage
- Pinyin IME settings - UDP
+ Налаштування піньїнь IME - UDP
Area TimeAndLanguage
- Playing a game full screen
+ Відтворення гри на весь екран
Area Gaming
- Plugin to search for Windows settings
+ Плагін для пошуку налаштувань Windows
- Windows Settings
+ Налаштування Windows
- Power and sleep
+ Живлення та сон
Area System
@@ -1217,118 +1217,118 @@
File name, Should not translated
- Power options
+ Параметри живлення
Area Control Panel (legacy settings)
- Presentation
+ Подання
- Printers
+ Принтери
Area Control Panel (legacy settings)
- Printers and scanners
+ Принтери та сканери
Area Device
- Print screen
+ Print Screen
Mean the "Print screen" key
- Problem reports and solutions
+ Звіти про проблеми та їх вирішення
Area Control Panel (legacy settings)
- Processor
+ Процесор
- Programs and features
+ Програми та функції
Area Control Panel (legacy settings)
- Projecting to this PC
+ Проектування на цей ПК
Area System
- protanopia
+ протанопія
Medical: Mean you don't can see green colors
- Provisioning
+ Забезпечення
Area UserAccounts, only available if enterprise has deployed a provisioning package
- Proximity
+ Близькість
Area NetworkAndInternet
- Proxy
+ Проксі
Area NetworkAndInternet
- Quickime
+ Швидкий час
Area TimeAndLanguage
- Quiet moments game
+ Тихі моменти
- Radios
+ Радіо
Area Privacy
- RAM
+ ОЗП
Means the Read-Access-Memory (typical the used to inform about the size)
- Recognition
+ Розпізнавання
- Recovery
+ Відновлення
Area UpdateAndSecurity
- Red eye
+ Червоне око
Mean red eye effect by over-the-night flights
- Red-green
+ Червоно-зелений
Mean the weakness you can't differ between red and green colors
- Red week
+ Червоний тиждень
Mean you don't can see red colors
- Region
+ Регіон
Area TimeAndLanguage
- Regional language
+ Регіональна мова
Area TimeAndLanguage
- Regional settings properties
+ Властивості регіональних налаштувань
Area Control Panel (legacy settings)
- Region and language
+ Регіон та мова
Area Control Panel (legacy settings)
- Region formatting
+ Форматування регіону
- RemoteApp and desktop connections
+ Підключення RemoteApp і робочого столу
Area Control Panel (legacy settings)
- Remote Desktop
+ Віддалений робочий стіл
Area System
- Scanners and cameras
+ Сканери та камери
Area Control Panel (legacy settings)
@@ -1336,18 +1336,18 @@
File name, Should not translated
- Scheduled
+ Заплановано
- Scheduled tasks
+ Заплановані завдання
Area Control Panel (legacy settings)
- Screen rotation
+ Обертання екрану
Area System
- Scroll bars
+ Смуги прокрутки
Scroll Lock
@@ -1358,7 +1358,7 @@
Should not translated
- Searching Windows
+ Пошук у Windows
Area Cortana
@@ -1366,71 +1366,71 @@
Should not translated
- Security Center
+ Центр безпеки
Area Control Panel (legacy settings)
- Security Processor
+ Процесор безпеки
- Session cleanup
+ Очищення сесії
Area SurfaceHub
- Settings home page
+ Головна сторінка налаштувань
Area Home, Overview-page for all areas of settings
- Set up a kiosk
+ Встановіть кіоск
Area UserAccounts
- Shared experiences
+ Спільний досвід
Area System
- Shortcuts
+ Скорочення
wifi
dont translate this, is a short term to find entries
- Sign-in options
+ Параметри входу
Area UserAccounts
- Sign-in options - Dynamic lock
+ Параметри входу - Динамічне блокування
Area UserAccounts
- Size
+ Розмір
Size for text and symbols
- Sound
+ Звук
Area System
- Speech
+ Мовлення
Area EaseOfAccess
- Speech recognition
+ Розпізнавання мови
Area Control Panel (legacy settings)
- Speech typing
+ Набір тексту з голосу
- Start
+ Пуск
Area Personalization
- Start places
+ Місця старту
- Startup apps
+ Початкові програми
Area Apps
@@ -1438,11 +1438,11 @@
File name, Should not translated
- Storage
+ Сховище
Area System
- Storage policies
+ Політики зберігання
Area System
@@ -1450,15 +1450,15 @@
Area System
- in
+ в
Example: Area "System" in System settings
- Sync center
+ Центр синхронізації
Area Control Panel (legacy settings)
- Sync your settings
+ Синхронізація налаштувань
Area UserAccounts
@@ -1466,57 +1466,57 @@
File name, Should not translated
- System
+ Система
Area Control Panel (legacy settings)
- System properties and Add New Hardware wizard
+ Властивості системи та майстер додавання нового обладнання
Area Control Panel (legacy settings)
- Tab
+ Вкладка
Means the key "Tabulator" on the keyboard
- Tablet mode
+ Режим планшета
Area System
- Tablet PC settings
+ Налаштування планшетного ПК
Area Control Panel (legacy settings)
- Talk
+ Розмова
- Talk to Cortana
+ Розмовляйте з Кортаною
Area Cortana
- Taskbar
+ Панель завдань
Area Personalization
- Taskbar color
+ Колір панелі завдань
- Tasks
+ Задачі
Area Privacy
- Team Conferencing
+ Командні конференції
Area SurfaceHub
- Team device management
+ Керування командними пристроями
Area SurfaceHub
- Text to speech
+ Перетворення тексту у мовлення
Area Control Panel (legacy settings)
- Themes
+ Теми
Area Personalization
@@ -1528,27 +1528,27 @@
File name, Should not translated
- Timeline
+ Хронологія
- Touch
+ Дотик
- Touch feedback
+ Зворотний зв'язок на дотик
- Touchpad
+ Тачпад
Area Device
- Transparency
+ Прозорість
- tritanopia
+ тританопія
Medical: Mean you don't can see yellow and blue colors
- Troubleshoot
+ Усунення несправностей
Area UpdateAndSecurity
@@ -1556,11 +1556,11 @@
Area Gaming
- Typing
+ Набір тексту
Area Device
- Uninstall
+ Видалити
Area MixedReality, only available if the Mixed Reality Portal app is installed.
@@ -1568,7 +1568,7 @@
Area Device
- User accounts
+ Облікові записи користувачів
Area Control Panel (legacy settings)
@@ -1576,43 +1576,43 @@
Means The "Windows Version"
- Video playback
+ Відтворення відео
Area Apps
- Videos
+ Відео
Area Privacy
- Virtual Desktops
+ Віртуальні робочі столи
- Virus
+ Вірус
Means the virus in computers and software
- Voice activation
+ Голосова активація
Area Privacy
- Volume
+ Гучність
VPN
Area NetworkAndInternet
- Wallpaper
+ Шпалери
- Warmer color
+ Тепліший колір
- Welcome center
+ Інформаційний центр
Area Control Panel (legacy settings)
- Welcome screen
+ Екран привітання
Area SurfaceHub
@@ -1620,7 +1620,7 @@
File name, Should not translated
- Wheel
+ Колесо
Area Device
@@ -1628,18 +1628,18 @@
Area NetworkAndInternet, only available if Wi-Fi calling is enabled
- Wi-Fi Calling
+ Дзвінки через Wi-Fi
Area NetworkAndInternet, only available if Wi-Fi calling is enabled
- Wi-Fi settings
+ Налаштування Wi-Fi
"Wi-Fi" should not translated
- Window border
+ Рамка вікна
- Windows Anytime Upgrade
+ Оновлення Windows у будь-який час
Area Control Panel (legacy settings)
@@ -1651,864 +1651,864 @@
Area Control Panel (legacy settings)
- Windows Defender
+ Захисник Windows
Area Control Panel (legacy settings)
- Windows Firewall
+ Брандмауер Windows
Area Control Panel (legacy settings)
- Windows Hello setup - Face
+ Налаштування Windows Hello - Обличчя
Area UserAccounts
- Windows Hello setup - Fingerprint
+ Налаштування Windows Hello - Відбиток пальця
Area UserAccounts
- Windows Insider Program
+ Програма для інсайдерів Windows
Area UpdateAndSecurity
- Windows Mobility Center
+ Центр мобільності Windows
Area Control Panel (legacy settings)
- Windows search
+ Пошук у Windows
Area Cortana
- Windows Security
+ Безпека Windows
Area UpdateAndSecurity
- Windows Update
+ Оновлення Windows
Area UpdateAndSecurity
- Windows Update - Advanced options
+ Оновлення Windows - Додаткові параметри
Area UpdateAndSecurity
- Windows Update - Check for updates
+ Оновлення Windows - перевірка наявності оновлень
Area UpdateAndSecurity
- Windows Update - Restart options
+ Оновлення Windows - Параметри перезапуску
Area UpdateAndSecurity
- Windows Update - View optional updates
+ Оновлення Windows - Перегляд додаткових оновлень
Area UpdateAndSecurity
- Windows Update - View update history
+ Оновлення Windows - Перегляд журналу оновлень
Area UpdateAndSecurity
- Wireless
+ Бездротовий
- Workplace
+ Робоче місце
- Workplace provisioning
+ Забезпечення робочого місця
Area UserAccounts
- Wubi IME settings
+ Налаштування Wubi IME
Area TimeAndLanguage, available if the Microsoft Wubi input method editor is installed
- Wubi IME settings - UDP
+ Налаштування Wubi IME - UDP
Area TimeAndLanguage
- Xbox Networking
+ Мережа Xbox Networking
Area Gaming
- Your info
+ Ваша інформація
Area UserAccounts
- Zoom
+ Збільшити
Mean zooming of things via a magnifier
- Change device installation settings
+ Зміна налаштувань встановлення пристрою
- Turn off background images
+ Вимкнути фонові зображення
- Navigation properties
+ Властивості навігації
- Media streaming options
+ Параметри потокової передачі медіа
- Make a file type always open in a specific program
+ Завжди відкривати файл певного типу у визначеній програмі
- Change the Narrator’s voice
+ Змінити голос диктора
- Find and fix keyboard problems
+ Пошук та усунення проблем з клавіатурою
- Use screen reader
+ Використовуйте програму для читання з екрана
- Show which workgroup this computer is on
+ Показати, в якій робочій групі знаходиться цей комп'ютер
- Change mouse wheel settings
+ Зміна налаштувань коліщатка миші
- Manage computer certificates
+ Керування комп'ютерними сертифікатами
- Find and fix problems
+ Пошук та усунення проблем
- Change settings for content received using Tap and send
+ Зміна налаштувань для вмісту, отриманого за допомогою функції "Доторкнутись і відправити"
- Change default settings for media or devices
+ Зміна налаштувань за замовчуванням для носіїв або пристроїв
- Print the speech reference card
+ Роздрукувати мовленнєву довідкову картку
- Calibrate display colour
+ Відкалібрувати колір дисплея
- Manage file encryption certificates
+ Керування сертифікатами шифрування файлів
- View recent messages about your computer
+ Перегляд останніх повідомлень про комп'ютер
- Give other users access to this computer
+ Надати іншим користувачам доступ до цього комп'ютера
- Show hidden files and folders
+ Показувати приховані файли та папки
- Change Windows To Go start-up options
+ Зміна параметрів запуску Windows To Go
- See which processes start up automatically when you start Windows
+ Переглянути, які процеси запускаються автоматично під час запуску Windows
- Tell if an RSS feed is available on a website
+ Визначити, чи є на веб-сайті RSS-канал
- Add clocks for different time zones
+ Додати годинник для різних часових поясів
- Add a Bluetooth device
+ Додати пристрій Bluetooth
- Customise the mouse buttons
+ Налаштування кнопок миші
- Set tablet buttons to perform certain tasks
+ Налаштування кнопок планшета на виконання певних завдань
- View installed fonts
+ Переглянути встановлені шрифти
- Change the way currency is displayed
+ Змінити спосіб відображення валюти
- Edit group policy
+ Редагування групової політики
- Manage browser add-ons
+ Керування доповненнями браузера
- Check processor speed
+ Перевірити швидкість процесора
- Check firewall status
+ Перевірити стан брандмауера
- Send or receive a file
+ Надіслати або отримати файл
- Add or remove user accounts
+ Додавання або видалення облікових записів користувачів
- Edit the system environment variables
+ Редагування змінних системного середовища
- Manage BitLocker
+ Керування BitLocker
- Auto-hide the taskbar
+ Автоматичне приховування панелі завдань
- Change sound card settings
+ Зміна налаштувань звукової карти
- Make changes to accounts
+ Внесення змін до облікових записів
- Edit local users and groups
+ Редагування локальних користувачів і груп
- View network computers and devices
+ Перегляд мережевих комп'ютерів і пристроїв
- Install a program from the network
+ Встановлення програми з мережі
- View scanners and cameras
+ Перегляд сканерів та камер
- Microsoft IME Register Word (Japanese)
+ Microsoft IME Register Word (японська)
- Restore your files with File History
+ Відновлення файлів за допомогою Історії файлів
- Turn On-Screen keyboard on or off
+ Увімкнення або вимкнення екранної клавіатури
- Block or allow third-party cookies
+ Блокувати або дозволяти сторонні файли cookie
- Find and fix audio recording problems
+ Пошук та усунення проблем із записом звуку
- Create a recovery drive
+ Створення диска відновлення
- Microsoft New Phonetic Settings
+ Нові фонетичні параметри Microsoft
- Generate a system health report
+ Створення звіту про стан системи
- Fix problems with your computer
+ Вирішення проблем з комп'ютером
- Back up and Restore (Windows 7)
+ Резервне копіювання та відновлення (Windows 7)
- Preview, delete, show or hide fonts
+ Попередній перегляд, видалення, показ або приховування шрифтів
- Microsoft Quick Settings
+ Швидкі налаштування Microsoft
- View reliability history
+ Переглянути історію надійності
- Access RemoteApp and desktops
+ Доступ до RemoteApp і робочих столів
- Set up ODBC data sources
+ Налаштування джерел даних ODBC
- Reset Security Policies
+ Скидання політик безпеки
- Block or allow pop-ups
+ Блокувати або дозволяти спливаючі вікна
- Turn autocomplete in Internet Explorer on or off
+ Увімкнення або вимкнення автозаповнення в Internet Explorer
- Microsoft Pinyin SimpleFast Options
+ Параметри Microsoft Pinyin SimpleFast
- Change what closing the lid does
+ Зміна ефекту від закриття корпусу
- Turn off unnecessary animations
+ Вимкнути непотрібні анімації
- Create a restore point
+ Створення точки відновлення
- Turn off automatic window arrangement
+ Вимкнення автоматичного розташування вікон
- Troubleshooting History
+ Історія усунення несправностей
- Diagnose your computer's memory problems
+ Діагностика проблем з пам'яттю комп'ютера
- View recommended actions to keep Windows running smoothly
+ Переглянути рекомендовані дії для забезпечення безперебійної роботи Windows
- Change cursor blink rate
+ Змінити частоту блимання курсору
- Add or remove programs
+ Додавання або видалення програм
- Create a password reset disk
+ Створення диска для скидання пароля
- Configure advanced user profile properties
+ Налаштування розширених властивостей профілю користувача
- Start or stop using AutoPlay for all media and devices
+ Увімкнути або вимкнути автоматичне відтворення для всіх медіа та пристроїв
- Change Automatic Maintenance settings
+ Змінити налаштування автоматичного обслуговування
- Specify single- or double-click to open
+ Вкажіть одинарний або подвійний клік для відкриття
- Select users who can use remote desktop
+ Вибір користувачів, які можуть використовувати віддалений робочий стіл
- Show which programs are installed on your computer
+ Показати, які програми встановлені на вашому комп'ютері
- Allow remote access to your computer
+ Дозволити віддалений доступ до комп'ютера
- View advanced system settings
+ Перегляд розширених налаштувань системи
- How to install a program
+ Як встановити програму
- Change how your keyboard works
+ Змінити роботу клавіатури
- Automatically adjust for daylight saving time
+ Автоматичне переведення на літній час
- Change the order of Windows SideShow gadgets
+ Зміна порядку розташування гаджетів Windows SideShow
- Check keyboard status
+ Перевірити стан клавіатури
- Control the computer without the mouse or keyboard
+ Керування комп'ютером без миші або клавіатури
- Change or remove a program
+ Змінити або видалити програму
- Change multi-touch gesture settings
+ Зміна налаштувань жестів мультидотику
- Set up ODBC data sources (64-bit)
+ Налаштування джерел даних ODBC (64-біт)
- Configure proxy server
+ Налаштування проксі-сервера
- Change your homepage
+ Змінити домашню сторінку
- Group similar windows on the taskbar
+ Групувати схожі вікна на панелі завдань
- Change Windows SideShow settings
+ Зміна налаштувань Windows SideShow
- Use audio description for video
+ Використання аудіодискрипції для відео
- Change workgroup name
+ Змінити назву робочої групи
- Find and fix printing problems
+ Пошук і усунення проблем із друком
- Change when the computer sleeps
+ Змінити коли комп'ютер перебуває в режимі сну
- Set up a virtual private network (VPN) connection
+ Налаштування підключення до віртуальної приватної мережі (VPN)
- Accommodate learning abilities
+ Враховувати здібності до навчання
- Set up a dial-up connection
+ Налаштування комутованого з'єднання
- Set up a connection or network
+ Налаштування з'єднання або мережі
- How to change your Windows password
+ Як змінити пароль до Windows
- Make it easier to see the mouse pointer
+ Полегшити видимість вказівника миші
- Set up iSCSI initiator
+ Налаштування ініціатора iSCSI
- Accommodate low vision
+ Пристосовано для людей зі слабким зором
- Manage offline files
+ Керування офлайн-файлами
- Review your computer's status and resolve issues
+ Перегляд стану комп'ютера та вирішення проблем
- Microsoft ChangJie Settings
+ Налаштування Microsoft ChangJie
- Replace sounds with visual cues
+ Замінити звуки візуальними підказками
- Change temporary Internet file settings
+ Зміна налаштувань тимчасового інтернет-файлу
- Connect to the Internet
+ Підключення до Інтернету
- Find and fix audio playback problems
+ Пошук та усунення проблем із відтворенням аудіо
- Change the mouse pointer display or speed
+ Змінити відображення або швидкість вказівника миші
- Back up your recovery key
+ Створення резервної копії ключа відновлення
- Save backup copies of your files with File History
+ Збереження резервних копій файлів за допомогою Історії файлів
- View current accessibility settings
+ Перегляд поточних налаштувань доступності
- Change tablet pen settings
+ Зміна налаштувань пера планшета
- Change how your mouse works
+ Змінити роботу миші
- Show how much RAM is on this computer
+ Показати обсяг оперативної пам'яті на цьому комп'ютері
- Edit power plan
+ Редагування плану енергоспоживання
- Adjust system volume
+ Регулювання гучності системи
- Defragment and optimise your drives
+ Дефрагментація та оптимізація дисків
- Set up ODBC data sources (32-bit)
+ Налаштування джерел даних ODBC (32-біт)
- Change Font Settings
+ Зміна параметрів шрифту
- Magnify portions of the screen using Magnifier
+ Збільшити частину екрана за допомогою лупи
- Change the file type associated with a file extension
+ Зміна типу файлу, пов'язаного з розширенням файлу
- View event logs
+ Перегляд журналів подій
- Manage Windows Credentials
+ Керування обліковими даними Windows
- Set up a microphone
+ Налаштування мікрофона
- Change how the mouse pointer looks
+ Змінити вигляд вказівника миші
- Change power-saving settings
+ Зміна налаштувань енергозбереження
- Optimise for blindness
+ Оптимізація для незрячих
- Turn Windows features on or off
+ Увімкнення чи вимкнення функцій Windows
- Show which operating system your computer is running
+ Показати, яка операційна система працює на вашому комп'ютері
- View local services
+ Перегляд локальних послуг
- Manage Work Folders
+ Керування робочими папками
- Encrypt your offline files
+ Шифрування офлайн-файлів
- Train the computer to recognise your voice
+ Навчити комп'ютер розпізнавати ваш голос
- Advanced printer setup
+ Розширене налаштування принтера
- Change default printer
+ Змінити принтер за замовчуванням
- Edit environment variables for your account
+ Редагування змінних середовища для вашого облікового запису
- Optimise visual display
+ Оптимізація візуального відображення
- Change mouse click settings
+ Змінити налаштування клацання мишею
- Change advanced colour management settings for displays, scanners and printers
+ Зміна розширених параметрів керування кольором для дисплеїв, сканерів і принтерів
- Let Windows suggest Ease of Access settings
+ Дозволити Windows пропонувати налаштування Ease of Access
- Clear disk space by deleting unnecessary files
+ Звільнити місце на диску, видаливши непотрібні файли
- View devices and printers
+ Перегляд пристроїв і принтерів
- Private Character Editor
+ Приватний редактор символів
- Record steps to reproduce a problem
+ Записати кроки для відтворення проблеми
- Adjust the appearance and performance of Windows
+ Налаштування зовнішнього вигляду та продуктивності Windows
- Settings for Microsoft IME (Japanese)
+ Налаштування для Microsoft IME (японська)
- Invite someone to connect to your PC and help you, or offer to help someone else
+ Запросіть когось підключитися до вашого комп'ютера і допомогти вам, або запропонуйте допомогти комусь іншому
- Run programs made for previous versions of Windows
+ Запуск програм, створених для попередніх версій Windows
- Choose the order of how your screen rotates
+ Виберіть порядок обертання екрана
- Change how Windows searches
+ Зміна способу пошуку в Windows
- Set flicks to perform certain tasks
+ Налаштувати кліки на виконання певних завдань
- Change account type
+ Змінити тип облікового запису
- Change screen saver
+ Змінити режим заощадження екрана
- Change User Account Control settings
+ Зміна налаштувань контролю облікових записів користувачів
- Turn on easy access keys
+ Увімкнути клавіші швидкого доступу
- Identify and repair network problems
+ Виявлення та усунення мережевих проблем
- Find and fix networking and connection problems
+ Пошук та усунення проблем з мережею та з'єднанням
- Play CDs or other media automatically
+ Автоматичне відтворення компакт-дисків та інших носіїв
- View basic information about your computer
+ Перегляд основних відомостей про ваш комп'ютер
- Choose how you open links
+ Виберіть спосіб відкриття посилань
- Allow Remote Assistance invitations to be sent from this computer
+ Дозволити надсилання запрошень до віддаленої допомоги з цього комп'ютера
- Task Manager
+ Диспетчер завдань
- Turn flicks on or off
+ Увімкнення або вимкнення фліків
- Add a language
+ Додати мову
- View network status and tasks
+ Перегляд стану мережі та завдань
- Turn Magnifier on or off
+ Увімкнути або вимкнути лупу
- See the name of this computer
+ Подивитися ім'я цього комп'ютера
- View network connections
+ Перегляд мережевих підключень
- Perform recommended maintenance tasks automatically
+ Автоматичне виконання рекомендованих завдань з технічного обслуговування
- Manage disk space used by your offline files
+ Керування дисковим простором, що використовується офлайн-файлами
- Turn High Contrast on or off
+ Увімкнути або вимкнути високу контрастність
- Change the way time is displayed
+ Змінити спосіб відображення часу
- Change how web pages are displayed in tabs
+ Зміна способу відображення веб-сторінок у вкладках
- Change the way dates and lists are displayed
+ Зміна способу відображення дат і списків
- Manage audio devices
+ Керування аудіопристроями
- Change security settings
+ Зміна налаштувань безпеки
- Check security status
+ Перевірити стан безпеки
- Delete cookies or temporary files
+ Видалення файлів cookie або тимчасових файлів
- Specify which hand you write with
+ Вкажіть, якою рукою ви пишете
- Change touch input settings
+ Зміна налаштувань сенсорного введення
- How to change the size of virtual memory
+ Як змінити розмір віртуальної пам'яті
- Hear text read aloud with Narrator
+ Послухайте текст, прочитаний вголос диктором
- Set up USB game controllers
+ Налаштування ігрових контролерів USB
- Show which domain your computer is on
+ Показати, в якому домені знаходиться ваш комп'ютер
- View all problem reports
+ Переглянути всі звіти про проблеми
- 16-Bit Application Support
+ Підтримка 16-бітних додатків
- Set up dialling rules
+ Налаштуйте правила набору
- Enable or disable session cookies
+ Увімкнути або вимкнути сесійні файли cookie
- Give administrative rights to a domain user
+ Надання адміністративних прав користувачеві домену
- Choose when to turn off display
+ Виберіть, коли вимкнути дисплей
- Move the pointer with the keypad using MouseKeys
+ Переміщення вказівника за допомогою клавіатури через MouseKeys
- Change Windows SideShow-compatible device settings
+ Зміна налаштувань пристрою, сумісного з Windows SideShow
- Adjust commonly used mobility settings
+ Налаштування часто використовуваних параметрів мобільності
- Change text-to-speech settings
+ Зміна налаштувань перетворення тексту в мовлення
- Set the time and date
+ Встановлення часу та дати
- Change location settings
+ Змінити налаштування місцезнаходження
- Change mouse settings
+ Зміна налаштувань миші
- Manage Storage Spaces
+ Керування простором для зберігання
- Show or hide file extensions
+ Показати або приховати розширення файлів
- Allow an app through Windows Firewall
+ Дозволити програму через брандмауер Windows
- Change system sounds
+ Змінити системні звуки
- Adjust ClearType text
+ Налаштування тексту ClearType
- Turn screen saver on or off
+ Увімкнення або вимкнення режиму енергозбереження
- Find and fix windows update problems
+ Знайти та виправити проблеми з оновленням Windows
- Change Bluetooth settings
+ Змінити налаштування Bluetooth
- Connect to a network
+ Підключення до мережі
- Change the search provider in Internet Explorer
+ Зміна пошукового провайдера в Internet Explorer
- Join a domain
+ Приєднатися до домену
- Add a device
+ Додати пристрій
- Find and fix problems with Windows Search
+ Виявлення та усунення проблем із пошуком Windows
- Choose a power plan
+ Оберіть план живлення
- Change how the mouse pointer looks when it’s moving
+ Змінити вигляд вказівника миші під час руху
- Uninstall a program
+ Видалення програми
- Create and format hard disk partitions
+ Створення та форматування розділів жорсткого диска
- Change date, time or number formats
+ Зміна форматів дати, часу або чисел
- Change PC wake-up settings
+ Зміна налаштувань пробудження комп'ютера
- Manage network passwords
+ Керування мережевими паролями
- Change input methods
+ Змінити методи введення
- Manage advanced sharing settings
+ Керування розширеними налаштуваннями спільного доступу
- Change battery settings
+ Зміна налаштувань акумулятора
- Rename this computer
+ Перейменувати цей комп'ютер
- Lock or unlock the taskbar
+ Блокування або розблокування панелі завдань
- Manage Web Credentials
+ Керування веб-обліковими даними
- Change the time zone
+ Зміна часового поясу
- Start speech recognition
+ Запустити розпізнавання мови
- View installed updates
+ Перегляд встановлених оновлень
- What's happened to the Quick Launch toolbar?
+ Що сталося з панеллю швидкого запуску?
- Change search options for files and folders
+ Зміна параметрів пошуку файлів і папок
- Adjust settings before giving a presentation
+ Налаштування параметрів перед проведенням презентації
- Scan a document or picture
+ Сканувати документ або зображення
- Change the way measurements are displayed
+ Змінити спосіб відображення вимірювань
- Press key combinations one at a time
+ Натискайте комбінації клавіш по черзі
- Restore data, files or computer from backup (Windows 7)
+ Відновлення даних, файлів або комп'ютера з резервної копії (Windows 7)
- Set your default programs
+ Налаштування програм за замовчуванням
- Set up a broadband connection
+ Налаштування широкосмугового з'єднання
- Calibrate the screen for pen or touch input
+ Калібрування екрана для введення пером або сенсорного керування
- Manage user certificates
+ Керування сертифікатами користувачів
- Schedule tasks
+ Планування завдань
- Ignore repeated keystrokes using FilterKeys
+ Ігнорувати повторні натискання клавіш за допомогою FilterKeys
- Find and fix bluescreen problems
+ Пошук та усунення проблем із синім екраном
- Hear a tone when keys are pressed
+ Чути тон під час натискання клавіш
- Delete browsing history
+ Видалити історію переглядів
- Change what the power buttons do
+ Змінити призначення кнопок увімкнення
- Create standard user account
+ Створення стандартного облікового запису користувача
- Take speech tutorials
+ Візьміть уроки мовлення
- View system resource usage in Task Manager
+ Перегляд використання системних ресурсів у диспетчері завдань
- Create an account
+ Створити обліковий запис
- Get more features with a new edition of Windows
+ Отримайте більше можливостей у новій версії Windows
- Control Panel
+ Панель керування
TaskLink
- Unknown
+ Невідомо
\ No newline at end of file
From 93ce99f8d95aebe04923534d7675a57b38224e45 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Tue, 23 Jan 2024 19:51:25 -0500
Subject: [PATCH 136/177] Avoid re-building context result is unchanged
---
Flow.Launcher/ViewModel/MainViewModel.cs | 33 +++++++++++++++++++++---
1 file changed, 30 insertions(+), 3 deletions(-)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 61bf0c4dc..676791790 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -34,6 +34,8 @@ namespace Flow.Launcher.ViewModel
private bool _isQueryRunning;
private Query _lastQuery;
+ private Result lastContextMenuResult = new Result();
+ private List lastContextMenuResults = new List();
private string _queryTextBeforeLeaveResults;
private readonly FlowLauncherJsonStorage _historyItemsStorage;
@@ -650,9 +652,34 @@ namespace Flow.Launcher.ViewModel
if (selected != null) // SelectedItem returns null if selection is empty.
{
- var results = PluginManager.GetContextMenusForPlugin(selected);
- results.Add(ContextMenuTopMost(selected));
- results.Add(ContextMenuPluginInfo(selected.PluginID));
+ List results;
+ if (selected == lastContextMenuResult)
+ {
+ // Use copy to keep the original results unchanged
+ results = lastContextMenuResults.ConvertAll(result => new Result
+ {
+ Title = result.Title,
+ SubTitle = result.SubTitle,
+ IcoPath = result.IcoPath,
+ PluginDirectory = result.PluginDirectory,
+ Action = result.Action,
+ ContextData = result.ContextData,
+ Glyph = result.Glyph,
+ OriginQuery = result.OriginQuery,
+ Score = result.Score,
+ AsyncAction = result.AsyncAction,
+ });
+ }
+ else
+ {
+ results = PluginManager.GetContextMenusForPlugin(selected);
+ lastContextMenuResults = results;
+ lastContextMenuResult = selected;
+ results.Add(ContextMenuTopMost(selected));
+ results.Add(ContextMenuPluginInfo(selected.PluginID));
+ }
+
+
if (!string.IsNullOrEmpty(query))
{
From b25c160aefba88f76c8bd57adfa86b522c079d6d Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Tue, 23 Jan 2024 19:51:57 -0500
Subject: [PATCH 137/177] Clear cached context menu when hidden
---
Flow.Launcher/ViewModel/MainViewModel.cs | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 676791790..c4b13abb0 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -1052,6 +1052,8 @@ namespace Flow.Launcher.ViewModel
{
// Trick for no delay
MainWindowOpacity = 0;
+ lastContextMenuResult = new Result();
+ lastContextMenuResults = new List();
if (!SelectedIsFromQueryResults())
{
From 95e7f4867d8cb918becdb106be4564fb964682d3 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:21 +1100
Subject: [PATCH 138/177] New translations en.xaml (French) [ci skip]
---
.../Languages/fr.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
index ee25fcf88..802144812 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
@@ -5,6 +5,28 @@
Commande
Description
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Quitter
+ Save Settings
+ Restart Flow Launcher"
+ Paramètres
+ Recharger les Données des Plugins
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Basculer le mode de jeu
+
+
Éteindre l'ordinateur
Redémarrer l'ordinateur
Redémarrer l'ordinateur avec les options de démarrage avancées
From d645de5047c59974949cbd69245f271dfda04a84 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:22 +1100
Subject: [PATCH 139/177] New translations en.xaml (Arabic) [ci skip]
---
.../Languages/ar.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
index f3b5775b5..41e005894 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ar.xaml
@@ -5,6 +5,28 @@
Command
Description
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Exit
+ Save Settings
+ Restart Flow Launcher"
+ Settings
+ Reload Plugin Data
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Shutdown Computer
Restart Computer
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From dfcdbeb550614576217805f06fd00ba3c2d2547b Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:23 +1100
Subject: [PATCH 140/177] New translations en.xaml (Czech) [ci skip]
---
.../Languages/cs.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
index 40d3496fe..3e053b39f 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/cs.xaml
@@ -5,6 +5,28 @@
Příkaz
Popis
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Ukončit
+ Save Settings
+ Restart Flow Launcher"
+ Nastavení
+ Znovu načíst data pluginů
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Vypnout počítač
Restartovat počítač
Restartování počítače s pokročilými možnostmi spouštění v nouzovém režimu a režimu ladění a dalšími možnostmi
From e9f342abb67f6327151b27f45b87bc6bfbc528ae Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:24 +1100
Subject: [PATCH 141/177] New translations en.xaml (Danish) [ci skip]
---
.../Languages/da.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
index 5f9d8dc35..8c5e4d0ff 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/da.xaml
@@ -5,6 +5,28 @@
Command
Description
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Afslut
+ Save Settings
+ Restart Flow Launcher"
+ Indstillinger
+ Reload Plugin Data
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Shutdown Computer
Restart Computer
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From aa359d3c27d5fbe84f43208a11a9a09931d5153f Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:25 +1100
Subject: [PATCH 142/177] New translations en.xaml (German) [ci skip]
---
.../Languages/de.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
index 6d33776eb..c929a1b16 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/de.xaml
@@ -5,6 +5,28 @@
Befehl
Beschreibung
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Schließen
+ Save Settings
+ Restart Flow Launcher"
+ Einstellungen
+ Plugin-Daten neu laden
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Gott Modus
+
+
Computer herunterfahren
Computer neu starten
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From 840b2659377867e6c9c455970fda78871377b422 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:26 +1100
Subject: [PATCH 143/177] New translations en.xaml (Italian) [ci skip]
---
.../Languages/it.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
index bb4293aa2..a70994188 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml
@@ -5,6 +5,28 @@
Comando
Descrizione
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Esci
+ Save Settings
+ Restart Flow Launcher"
+ Impostazioni
+ Ricarica i dati del plugin
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Attiva/Disattiva Modalità Di Gioco
+
+
Spegni il computer
Riavvia il Computer
Riavvia il computer con le Opzioni di Avvio Avanzato per le Modalità di debug e Provvisoria, così come altre opzioni
From ec02481f8bf7a1104f6b630bcf9eee7e9a8a66bf Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:27 +1100
Subject: [PATCH 144/177] New translations en.xaml (Japanese) [ci skip]
---
.../Languages/ja.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
index e2e107004..9080cf314 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml
@@ -5,6 +5,28 @@
コマンド
説明
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ 終
+ Save Settings
+ Restart Flow Launcher"
+ 設
+ プラグインデータのリロード
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
コンピュータをシャットダウンする
コンピュータを再起動する
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From ed1187617f2673d600d6ddf9c4b26cc3a31ec858 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:27 +1100
Subject: [PATCH 145/177] New translations en.xaml (Korean) [ci skip]
---
.../Languages/ko.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
index ecfc113e3..5389cbb38 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml
@@ -5,6 +5,28 @@
명령어
설명
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ 종료
+ Save Settings
+ Restart Flow Launcher"
+ 설정
+ 플러그인 데이터 새로고
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
시스템 종료
시스템 재시작
안전 및 디버깅 모드에 대한 고급 부팅 옵션과 기타 옵션을 사용하여 시스템을 다시 시작
From ad4943a846e6b35e82fe96f26c6dd35b6f62fab2 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:28 +1100
Subject: [PATCH 146/177] New translations en.xaml (Dutch) [ci skip]
---
.../Languages/nl.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
index 438c2a9de..ca798f9d7 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nl.xaml
@@ -5,6 +5,28 @@
Command
Description
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Afsluiten
+ Save Settings
+ Restart Flow Launcher"
+ Instellingen
+ Reload Plugin Data
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Shutdown Computer
Restart Computer
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From 810865d1b626d045d2da3b49fe74e87038ca0ff9 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:29 +1100
Subject: [PATCH 147/177] New translations en.xaml (Polish) [ci skip]
---
.../Languages/pl.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
index 776f4a46c..4549f193e 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml
@@ -5,6 +5,28 @@
Komenda
Opis
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Wyjdź
+ Save Settings
+ Restart Flow Launcher"
+ Ustawienia
+ Reload Plugin Data
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Wyłącz komputer
Uruchom ponownie komputer
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From 5dec2c8c031424bf1da235b4c45540b24362524d Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:30 +1100
Subject: [PATCH 148/177] New translations en.xaml (Portuguese) [ci skip]
---
.../Languages/pt-pt.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
index 6499e3ec2..87ecd6f75 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
@@ -5,6 +5,28 @@
Comando
Descrição
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Sair
+ Save Settings
+ Restart Flow Launcher"
+ Definições
+ Recarregar dados do plugin
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Comutar modo de jogo
+
+
Desligar computador
Reiniciar computador
Reinicia o computador com as opções avançadas de arranque para os modos de segurança e de depuração
From 4615bd6988052397065c875dfc19b0eb490cd77c Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:31 +1100
Subject: [PATCH 149/177] New translations en.xaml (Russian) [ci skip]
---
.../Languages/ru.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
index b3ea0688e..927ccb0b6 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ru.xaml
@@ -5,6 +5,28 @@
Command
Description
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Выйти
+ Save Settings
+ Restart Flow Launcher"
+ Настройки
+ Перезагрузить данные плагинов
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Shutdown Computer
Restart Computer
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From 0f8eabc6fa543344c68f1aac4f42035cb81cc3c8 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:32 +1100
Subject: [PATCH 150/177] New translations en.xaml (Slovak) [ci skip]
---
.../Languages/sk.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
index 1fd0e1949..076078da8 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
@@ -5,6 +5,28 @@
Príkaz
Popis
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Ukončiť
+ Save Settings
+ Restart Flow Launcher"
+ Nastavenia
+ Znova načítať údaje pluginov
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Prepnúť herný režim
+
+
Vypnúť počítač
Reštartovať počítač
Reštartovať počítač s rozšírenými možnosťami spúšťania pre núdzový režim a režim ladenia, ako aj s ďalšími možnosťami
From 7194210d27226ae2054dc5d132aa7667ad8184d9 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:33 +1100
Subject: [PATCH 151/177] New translations en.xaml (Turkish) [ci skip]
---
.../Languages/tr.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
index 6cb5026aa..9670d8297 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/tr.xaml
@@ -5,6 +5,28 @@
Komut
Açıklama
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Çıkı
+ Save Settings
+ Restart Flow Launcher"
+ Ayarlar
+ Reload Plugin Data
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Bilgisayarı Kapat
Yeniden Başlat
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From dd018745e6902150691081949f73d7b60f68cf1e Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:33 +1100
Subject: [PATCH 152/177] New translations en.xaml (Ukrainian) [ci skip]
---
.../Languages/uk-UA.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
index aebddd427..cea8f7470 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
@@ -5,6 +5,28 @@
Команда
Опис
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Вийти
+ Save Settings
+ Restart Flow Launcher"
+ Налаштування
+ Перезавантажити дані плагінів
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Вимкнути комп'ютер
Перезавантажити комп'ютер
Перезавантажте комп'ютер за допомогою Розширених параметрів завантаження для безпечного чи налагоджувального режимів, а також інших опцій
From c717a0e7aa82bbaacc16305ec09cd9c385a3b183 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:34 +1100
Subject: [PATCH 153/177] New translations en.xaml (Chinese Simplified) [ci
skip]
---
.../Languages/zh-cn.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
index 9c9653997..be84d0e7f 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-cn.xaml
@@ -5,6 +5,28 @@
命令
描述
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ 退出
+ Save Settings
+ Restart Flow Launcher"
+ 设置
+ 重新加载插件数据
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
关闭电脑
重启这台电脑
以高级启动选项重启计算机,用于安全和调试模式以及其他选项
From 13aae906c6527f4cbc32c6b8c8e9d6547e34e890 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:35 +1100
Subject: [PATCH 154/177] New translations en.xaml (Chinese Traditional) [ci
skip]
---
.../Languages/zh-tw.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
index 5fad62881..62bf8f012 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/zh-tw.xaml
@@ -5,6 +5,28 @@
命令
描述
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ 結束
+ Save Settings
+ Restart Flow Launcher"
+ 設定
+ 重新載入插件資料
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
電腦關機
電腦重新啟動
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From e84ec8bdd94d65b49d819354388f8eaf9031fa51 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:36 +1100
Subject: [PATCH 155/177] New translations en.xaml (Portuguese, Brazilian) [ci
skip]
---
.../Languages/pt-br.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
index 1057bebac..b80ddf621 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-br.xaml
@@ -5,6 +5,28 @@
Comando
Descrição
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Sair
+ Save Settings
+ Restart Flow Launcher"
+ Configurações
+ Recarregar Dados de Plugin
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Desligar o Computador
Reiniciar o Computador
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From f3d62092beb22461036a470857fddf964685224c Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:37 +1100
Subject: [PATCH 156/177] New translations en.xaml (Norwegian Bokmal) [ci skip]
---
.../Languages/nb.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
index f3b5775b5..41e005894 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/nb.xaml
@@ -5,6 +5,28 @@
Command
Description
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Exit
+ Save Settings
+ Restart Flow Launcher"
+ Settings
+ Reload Plugin Data
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Shutdown Computer
Restart Computer
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From d861cbfd8222f9db66216a04427da19b31db2e93 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:38 +1100
Subject: [PATCH 157/177] New translations en.xaml (Serbian (Latin)) [ci skip]
---
.../Languages/sr.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
index e5bdd0dc0..fa6b54b81 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sr.xaml
@@ -5,6 +5,28 @@
Command
Description
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Izlaz
+ Save Settings
+ Restart Flow Launcher"
+ Podešavanja
+ Reload Plugin Data
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Shutdown Computer
Restart Computer
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From f0178dca6ab065b7bac4d21edc23093455382edc Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:39 +1100
Subject: [PATCH 158/177] New translations en.xaml (Spanish (Modern)) [ci skip]
---
.../Languages/es.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
index 5689ac41e..ccc98d2c9 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
@@ -5,6 +5,28 @@
Comando
Descripción
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Salir
+ Save Settings
+ Restart Flow Launcher"
+ Configuración
+ Recargar datos del complemento
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Cambiar a Modo Juego
+
+
Apaga el equipo
Reinicia el equipo
Reinicia el equipo con opciones avanzadas de arranque para el modo seguro y de depuración, entre otras opciones
From 07818d38ffb242c8f36ba352da9f5bde87741f4c Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 16:08:39 +1100
Subject: [PATCH 159/177] New translations en.xaml (Spanish, Latin America) [ci
skip]
---
.../Languages/es-419.xaml | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
index f3b5775b5..05a5458e1 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es-419.xaml
@@ -5,6 +5,28 @@
Command
Description
+ Shutdown
+ Restart
+ Restart With Advanced Boot Options
+ Log Off/Sign Out
+ Lock
+ Sleep
+ Hibernate
+ Index Option
+ Empty Recycle Bin
+ Open Recycle Bin
+ Salir
+ Save Settings
+ Restart Flow Launcher"
+ Ajustes
+ Reload Plugin Data
+ Check For Update
+ Open Log Location
+ Flow Launcher Tips
+ Flow Launcher UserData Folder
+ Toggle Game Mode
+
+
Shutdown Computer
Restart Computer
Restart the computer with Advanced Boot Options for Safe and Debugging modes, as well as other options
From d4ab5bfc3e8139b75e7f8ef2b17ab41c2d961839 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 18:53:40 +1100
Subject: [PATCH 160/177] New translations en.xaml (Slovak) [ci skip]
---
.../Languages/sk.xaml | 32 +++++++++----------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
index 076078da8..82d8c2fe4 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/sk.xaml
@@ -5,25 +5,25 @@
Príkaz
Popis
- Shutdown
- Restart
- Restart With Advanced Boot Options
- Log Off/Sign Out
- Lock
- Sleep
- Hibernate
- Index Option
- Empty Recycle Bin
- Open Recycle Bin
+ Vypnúť
+ Reštartovať
+ Reštartovať s rozšírenými možnosťami spustenia
+ Odhlásiť sa
+ Zamknúť
+ Uspať
+ Hibernovať
+ Možnosti indexovania
+ Vyprázdniť kôš
+ Otvoriť kôš
Ukončiť
- Save Settings
- Restart Flow Launcher"
+ Uložiť nastavenia
+ Reštartovať Flow Launcher"
Nastavenia
Znova načítať údaje pluginov
- Check For Update
- Open Log Location
- Flow Launcher Tips
- Flow Launcher UserData Folder
+ Skontrolovať aktualizácie
+ Otvoriť umiestnenie denníka
+ Tipy pre Flow Launcher
+ Používateľský priečinok Flow Launchera
Prepnúť herný režim
From 7c48202afa9919ae7b74016636baa24e780ca632 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 20:34:01 +1100
Subject: [PATCH 161/177] New translations en.xaml (Spanish (Modern)) [ci skip]
---
Flow.Launcher/Languages/es.xaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml
index 0ca8b6905..bcfef1f04 100644
--- a/Flow.Launcher/Languages/es.xaml
+++ b/Flow.Launcher/Languages/es.xaml
@@ -188,7 +188,7 @@
Añadir
Por favor, seleccione un elemento
¿Está seguro que desea eliminar el atajo de teclado de consulta personalizada {0}?
- ¿Está seguro que desea eliminar el acceso directo: {0} con la expansión {1}?
+ ¿Está seguro de que desea eliminar el acceso directo: {0} con la expansión {1}?
Obtiene el texto del portapapeles.
Obtiene la ruta del explorador activo.
Efecto de sombra de la ventana de consultas
@@ -237,7 +237,7 @@
Carpeta de configuración
Carpeta de registros
Eliminar registros
- ¿Está seguro que desea eliminar todos los registros?
+ ¿Está seguro de que desea eliminar todos los registros?
Asistente
From c65cb3d38f7e3caff8ac05f0ea0bf59b123416d4 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 20:34:02 +1100
Subject: [PATCH 162/177] New translations en.xaml (Spanish (Modern)) [ci skip]
---
Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
index 1b124ade8..ad5d7c31a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml
@@ -4,7 +4,7 @@
Por favor haga una selección primero
Por favor, seleccione un enlace de carpeta
- ¿Está seguro que desea eliminar {0}?
+ ¿Está seguro de que desea eliminar {0}?
¿Está seguro que desea eliminar permanentemente este archivo?
¿Está seguro de que desea eliminar permanentemente este/esta archivo/carpeta?
Eliminación correcta
From c79ef16a2bb9afc392fcef7977ed017a921ce91f Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 20:34:02 +1100
Subject: [PATCH 163/177] New translations en.xaml (Spanish (Modern)) [ci skip]
---
.../Languages/es.xaml | 40 +++++++++----------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
index ccc98d2c9..8f821f930 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
@@ -5,25 +5,25 @@
Comando
Descripción
- Shutdown
- Restart
- Restart With Advanced Boot Options
- Log Off/Sign Out
- Lock
- Sleep
- Hibernate
- Index Option
- Empty Recycle Bin
- Open Recycle Bin
+ Apagar
+ Reiniciar
+ Reiniciar con opciones de arranque avanzadas
+ Cerrar sesión/Desconectar
+ Bloquear
+ Suspender
+ Hibernar
+ Opciones de indexación
+ Vaciar papelera de reciclaje
+ Abrir papelera de reciclaje
Salir
- Save Settings
- Restart Flow Launcher"
+ Guardar configuración
+ Reiniciar Flow Launcher"
Configuración
Recargar datos del complemento
- Check For Update
- Open Log Location
- Flow Launcher Tips
- Flow Launcher UserData Folder
+ Buscar actualizaciones
+ Abrir ubicación de registro
+ Consejos Flow Launcher
+ Carpeta UserData de Flow Launcher
Cambiar a Modo Juego
@@ -52,10 +52,10 @@
Correcto
Toda la configuración de Flow Launcher ha sido guardada
Se recargaron todos los datos del complemento
- ¿Está seguro que desea apagar el equipo?
- ¿Está seguro que desea reiniciar el equipo?
- ¿Está seguro que desea reiniciar el equipo con opciones de arranque avanzadas?
- ¿Está seguro que desea cerrar la sesión?
+ ¿Está seguro de que desea apagar el equipo?
+ ¿Está seguro de que desea reiniciar el equipo?
+ ¿Está seguro de que desea reiniciar el equipo con opciones de arranque avanzadas?
+ ¿Está seguro de que desea cerrar la sesión?
Comandos del sistema
Proporciona comandos relacionados con el sistema. Por ejemplo, apagar, bloquear, configurar, etc.
From ece91a36392aec89a09ce7f09d2148d7e6fa4b6c Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 20:34:03 +1100
Subject: [PATCH 164/177] New translations en.xaml (Spanish (Modern)) [ci skip]
---
Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
index fefbfaaee..86e62f0e5 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/es.xaml
@@ -20,7 +20,7 @@
Usar autocompletado en consultas de búsqueda:
Autocompletar datos desde:
Por favor, seleccione una búsqueda web
- ¿Está seguro que desea eliminar {0}?
+ ¿Está seguro de que desea eliminar {0}?
Si desea añadir una búsqueda de un sitio web concreto a Flow, introduzca primero una cadena de texto ficticia en la barra de búsqueda de ese sitio web, y ejecute la búsqueda. Ahora copie el contenido de la barra de direcciones del navegador y péguelo en el campo de la URL abajo indicado. Sustituya su cadena de prueba por {q}. Por ejemplo, si busca Casino en Netflix, su barra de direcciones debe decir
https://www.netflix.com/search?q=Casino
From e4485bc4f790884db27398a00df0f16b2f98ee23 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 21:59:47 +1100
Subject: [PATCH 165/177] New translations en.xaml (French) [ci skip]
---
.../Languages/fr.xaml | 34 +++++++++----------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
index 802144812..6aea47df8 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/fr.xaml
@@ -5,25 +5,25 @@
Commande
Description
- Shutdown
- Restart
- Restart With Advanced Boot Options
- Log Off/Sign Out
- Lock
- Sleep
- Hibernate
- Index Option
- Empty Recycle Bin
- Open Recycle Bin
+ Arrêter
+ Redémarrer
+ Redémarrer avec les options de démarrage avancées
+ Se déconnecter
+ Verrouiller
+ Mettre en veille
+ Veille prolongée
+ Options d'indexation
+ Vider la corbeille
+ Ouvrir la corbeille
Quitter
- Save Settings
- Restart Flow Launcher"
+ Sauvegarder les paramètres
+ Redémarrer Flow Launcher
Paramètres
- Recharger les Données des Plugins
- Check For Update
- Open Log Location
- Flow Launcher Tips
- Flow Launcher UserData Folder
+ Recharger les données des plugins
+ Vérifier les mises à jour
+ Ouvrir l'emplacement des logs
+ Astuces pour Flow Launcher
+ Dossier des données utilisateur de Flow Launcher
Basculer le mode de jeu
From f0f75f10c0821509d0285586f01c8e3865430c61 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 28 Jan 2024 21:59:47 +1100
Subject: [PATCH 166/177] New translations en.xaml (Spanish (Modern)) [ci skip]
---
Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
index 8f821f930..f95e44dcf 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/es.xaml
@@ -8,7 +8,7 @@
Apagar
Reiniciar
Reiniciar con opciones de arranque avanzadas
- Cerrar sesión/Desconectar
+ Cerrar sesión/Apagar
Bloquear
Suspender
Hibernar
@@ -30,7 +30,7 @@
Apaga el equipo
Reinicia el equipo
Reinicia el equipo con opciones avanzadas de arranque para el modo seguro y de depuración, entre otras opciones
- Cierra la sesión
+ Cerrar sesión
Bloquea el equipo
Cierra Flow Launcher
Reinicia Flow Launcher
From 730a647418756c1e8329c1c22ece26087574e529 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Mon, 29 Jan 2024 07:36:30 +1100
Subject: [PATCH 167/177] New translations en.xaml (Portuguese) [ci skip]
---
.../Languages/pt-pt.xaml | 32 +++++++++----------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
index 87ecd6f75..4d7609bcb 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pt-pt.xaml
@@ -5,25 +5,25 @@
Comando
Descrição
- Shutdown
- Restart
- Restart With Advanced Boot Options
- Log Off/Sign Out
- Lock
- Sleep
- Hibernate
- Index Option
- Empty Recycle Bin
- Open Recycle Bin
+ Desligar
+ Reiniciar
+ Reiniciar com opções avançadas de arranque
+ Terminar sessão
+ Bloquear
+ Suspender
+ Hibernar
+ Opções de indexação
+ Esvaziar reciclagem
+ Abrir reciclagem
Sair
- Save Settings
- Restart Flow Launcher"
+ Guardar definições
+ Reiniciar Flow Launcher
Definições
Recarregar dados do plugin
- Check For Update
- Open Log Location
- Flow Launcher Tips
- Flow Launcher UserData Folder
+ Procurar atualizações
+ Abrir localização de registo
+ Dicas Flow Launcher
+ Pasta de dados do utilizador Flow Launcher
Comutar modo de jogo
From 18d1c5f56f4448511c1e374bd0adf70ed1ac1df5 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 1 Feb 2024 01:41:09 +1100
Subject: [PATCH 168/177] New translations en.xaml (Ukrainian) [ci skip]
---
Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
index 791fbf7be..9909bf9c5 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml
@@ -100,8 +100,8 @@
Видалити зі швидкого доступу
Видалити поточний елемент зі швидкого доступу
Показати контекстне меню Windows
- Open With
- Select a program to open with
+ Відкрити за допомогою
+ Виберіть програму для відкриття
{0} не містить {1}
From c16ef8219fe473846178db469844f9a75f8d9b1a Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 1 Feb 2024 01:41:10 +1100
Subject: [PATCH 169/177] New translations en.xaml (Ukrainian) [ci skip]
---
.../Languages/uk-UA.xaml | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml
index eaa54936a..b4d60f5b6 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml
@@ -28,11 +28,11 @@
Цей плагін вже встановлено
Не вдалося завантажити маніфест плагіна
Будь ласка, перевірте, чи можете ви підключитися до github.com. Ця помилка означає, що ви не можете встановлювати або оновлювати плагіни.
- Update all plugins
- Would you like to update all plugins?
- Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.
- Would you like to update {0} plugins?
- {0} plugins successfully updated. Restarting Flow, please wait...
+ Оновити всі плагіни
+ Ви хочете оновити всі плагіни?
+ Бажаєте оновити плагіни {0}?{1}Flow Launcher перезапуститься після оновлення всіх плагінів.
+ Бажаєте оновити плагіни {0}?
+ {0} плагіни успішно оновлено. Перезапуск Flow, будь ласка, зачекайте...
Плагін {0} успішно оновлено. Перезапускаємо Flow, будь ласка, зачекайте...
Встановлення з невідомого джерела
Ви встановлюєте цей плагін з невідомого джерела, тому він може бути потенційно небезпечним!{0}{0}Переконайтеся, що ви розумієте, звідки цей плагін, і що він є безпечним.{0}{0}Бажаєте продовжити?{0}{0}(Ви можете вимкнути це попередження через налаштування)
@@ -40,7 +40,7 @@
Плагін {0} успішно встановлено. Будь ласка, перезапустіть Flow.
Плагін {0} успішно видалено. Будь ласка, перезапустіть Flow.
Плагін {0} успішно оновлено. Будь ласка, перезапустіть Flow.
- {0} plugins successfully updated. Please restart Flow.
+ {0} плагіни успішно оновлено. Будь ласка, перезапустіть Flow.
Плагін {0} вже було змінено. Будь ласка, перезапустіть Flow, перш ніж вносити будь-які подальші зміни.
From 0036e243c561ec808809454df2266b301290ede1 Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 1 Feb 2024 01:41:11 +1100
Subject: [PATCH 170/177] New translations en.xaml (Ukrainian) [ci skip]
---
Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
index 783fc4d25..9f51bbcd9 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml
@@ -2,8 +2,8 @@
Заміна Win+R
- Close Command Prompt after pressing any key
- Press any key to close this window...
+ Закривати командний рядок після натискання будь-якої клавіші
+ Натисніть будь-яку клавішу, щоб закрити це вікно...
Не закривати командний рядок після виконання команди
Завжди запускати від імені адміністратора
Запустити від імені іншого користувача
From 86ff8db76eb133846febfa90cfdf9d22c6a17acf Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 1 Feb 2024 01:41:12 +1100
Subject: [PATCH 171/177] New translations en.xaml (Ukrainian) [ci skip]
---
.../Languages/uk-UA.xaml | 36 +++++++++----------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
index cea8f7470..526144b43 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml
@@ -5,26 +5,26 @@
Команда
Опис
- Shutdown
- Restart
- Restart With Advanced Boot Options
- Log Off/Sign Out
- Lock
- Sleep
- Hibernate
- Index Option
- Empty Recycle Bin
- Open Recycle Bin
+ Вимкнути
+ Перезавантажити
+ Перезавантажити з розширеними параметрами завантаження
+ Вийти з системи/облікового запису
+ Заблокувати
+ Режим сну
+ Режим глибокого сну
+ Опція індексу
+ Очистити кошик
+ Відкрити кошик
Вийти
- Save Settings
- Restart Flow Launcher"
+ Зберегти налаштування
+ Перезапустити Flow Launcher"
Налаштування
Перезавантажити дані плагінів
- Check For Update
- Open Log Location
- Flow Launcher Tips
- Flow Launcher UserData Folder
- Toggle Game Mode
+ Перевірити наявність оновлень
+ Відкрити розташування журналу
+ Поради щодо Flow Launcher
+ Тека UserData Flow Launcher
+ Перемкнути режим гри
Вимкнути комп'ютер
@@ -46,7 +46,7 @@
Перевірити наявність оновлень Flow Launcher
Перегляньте документацію Flow Launcher для отримання додаткової допомоги та підказок щодо використання порад
Відкрити каталог, де зберігаються налаштування Flow Launcher
- Toggle Game Mode
+ Перемкнути режим гри
Успішно
From cb1e4a8975e601fca097955a9ebbc90ed17873fe Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Thu, 1 Feb 2024 01:41:14 +1100
Subject: [PATCH 172/177] New translations resources.resx (French) [ci skip]
---
.../Properties/Resources.fr-FR.resx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.fr-FR.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.fr-FR.resx
index da2763d25..49644f5a3 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.fr-FR.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.fr-FR.resx
@@ -1929,16 +1929,16 @@
Change what closing the lid does
- Turn off unnecessary animations
+ Désactiver les animations non nécessaires
Créer un point de restauration
- Turn off automatic window arrangement
+ Désactiver l'agencement automatique des fenêtres
- Troubleshooting History
+ Historique de dépannage
Diagnose your computer's memory problems
From c2e920c36fa402ddba670ecd11f182745fc90fb0 Mon Sep 17 00:00:00 2001
From: Garulf <535299+Garulf@users.noreply.github.com>
Date: Sat, 3 Feb 2024 12:38:28 -0500
Subject: [PATCH 173/177] Remove redundant wording
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index bc072c537..d563f019e 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@
-Dedicated to making your workflow flow more seamless. Search everything from applications, files, bookmarks, YouTube, Twitter and more. Flow will continue to evolve, designed to be open and built with the community at heart.
+Dedicated to making your work flow more seamless. Search everything from applications, files, bookmarks, YouTube, Twitter and more. Flow will continue to evolve, designed to be open and built with the community at heart.
Remember to star it, flow will love you more :)
From e7f91761f397196234027f99d10b278f770b69ec Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Sun, 4 Feb 2024 13:21:46 +1100
Subject: [PATCH 174/177] bump flow version
---
appveyor.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/appveyor.yml b/appveyor.yml
index d8c5d7964..195ab1bc1 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,4 @@
-version: '1.16.2.{build}'
+version: '1.17.0.{build}'
init:
- ps: |
From 45ba16da59434a131ca4f47021581de02cbf77d3 Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Sun, 4 Feb 2024 13:24:43 +1100
Subject: [PATCH 175/177] bump flow API version
---
Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
index 76233c3a4..cc89afbc2 100644
--- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
+++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj
@@ -14,10 +14,10 @@
- 4.1.1
- 4.1.1
- 4.1.1
- 4.1.1
+ 4.2.0
+ 4.2.0
+ 4.2.0
+ 4.2.0
Flow.Launcher.Plugin
Flow-Launcher
MIT
From cd684be0bfeca6cf257f160e5b208a553e1bc7ea Mon Sep 17 00:00:00 2001
From: Jeremy
Date: Sun, 4 Feb 2024 13:57:04 +1100
Subject: [PATCH 176/177] bump version for plugins
---
Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json | 2 +-
Plugins/Flow.Launcher.Plugin.Calculator/plugin.json | 2 +-
Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json | 2 +-
Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json | 2 +-
Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json | 2 +-
Plugins/Flow.Launcher.Plugin.Program/plugin.json | 2 +-
Plugins/Flow.Launcher.Plugin.Shell/plugin.json | 2 +-
Plugins/Flow.Launcher.Plugin.Sys/plugin.json | 2 +-
Plugins/Flow.Launcher.Plugin.Url/plugin.json | 2 +-
Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json | 2 +-
Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json | 2 +-
11 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
index d6dca1b88..0778b7ae5 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
@@ -4,7 +4,7 @@
"Name": "Browser Bookmarks",
"Description": "Search your browser bookmarks",
"Author": "qianlifeng, Ioannis G.",
- "Version": "3.1.4",
+ "Version": "3.1.5",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.BrowserBookmark.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
index 2bba6341c..a77475460 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
@@ -4,7 +4,7 @@
"Name": "Calculator",
"Description": "Provide mathematical calculations.(Try 5*3-2 in Flow Launcher)",
"Author": "cxfksword",
- "Version": "3.0.3",
+ "Version": "3.1.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Caculator.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json
index 98aac405a..d682ee7c8 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json
@@ -4,7 +4,7 @@
"Name": "Plugin Indicator",
"Description": "Provides plugin action keyword suggestions",
"Author": "qianlifeng",
- "Version": "3.0.2",
+ "Version": "3.0.3",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.PluginIndicator.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
index e0d4fed81..4e475f171 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
@@ -6,7 +6,7 @@
"Name": "Plugins Manager",
"Description": "Management of installing, uninstalling or updating Flow Launcher plugins",
"Author": "Jeremy Wu",
- "Version": "3.0.5",
+ "Version": "3.1.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.PluginsManager.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json b/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json
index 5a74d8ebb..c1760d1cd 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json
@@ -4,7 +4,7 @@
"Name":"Process Killer",
"Description":"Kill running processes from Flow",
"Author":"Flow-Launcher",
- "Version":"3.0.3",
+ "Version":"3.0.4",
"Language":"csharp",
"Website":"https://github.com/Flow-Launcher/Flow.Launcher.Plugin.ProcessKiller",
"IcoPath":"Images\\app.png",
diff --git a/Plugins/Flow.Launcher.Plugin.Program/plugin.json b/Plugins/Flow.Launcher.Plugin.Program/plugin.json
index e1d76659b..7f6b5f938 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Program/plugin.json
@@ -4,7 +4,7 @@
"Name": "Program",
"Description": "Search programs in Flow.Launcher",
"Author": "qianlifeng",
- "Version": "3.1.3",
+ "Version": "3.2.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Program.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
index 18c90351b..6c2b2a184 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
@@ -4,7 +4,7 @@
"Name": "Shell",
"Description": "Provide executing commands from Flow Launcher",
"Author": "qianlifeng",
- "Version": "3.1.1",
+ "Version": "3.2.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Shell.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/plugin.json b/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
index a893c0ea2..0da3aaca7 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
@@ -4,7 +4,7 @@
"Name": "System Commands",
"Description": "Provide System related commands. e.g. shutdown,lock, setting etc.",
"Author": "qianlifeng",
- "Version": "3.0.3",
+ "Version": "3.1.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Sys.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Url/plugin.json b/Plugins/Flow.Launcher.Plugin.Url/plugin.json
index da1a0bfd5..79a96171c 100644
--- a/Plugins/Flow.Launcher.Plugin.Url/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Url/plugin.json
@@ -4,7 +4,7 @@
"Name": "URL",
"Description": "Open the typed URL from Flow Launcher",
"Author": "qianlifeng",
- "Version": "3.0.3",
+ "Version": "3.0.4",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Url.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json b/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json
index 1d24556da..0efa9c10f 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json
@@ -26,7 +26,7 @@
"Name": "Web Searches",
"Description": "Provide the web search ability",
"Author": "qianlifeng",
- "Version": "3.0.5",
+ "Version": "3.0.6",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.WebSearch.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json b/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json
index 630116ae0..5e82a43c0 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json
@@ -4,7 +4,7 @@
"Description": "Search settings inside Control Panel and Settings App",
"Name": "Windows Settings",
"Author": "TobiasSekan",
- "Version": "4.0.5",
+ "Version": "4.0.6",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.WindowsSettings.dll",
From fa9fe1ccd1039a66dd85a382b6848bdac338bc4e Mon Sep 17 00:00:00 2001
From: Jeremy Wu
Date: Sun, 4 Feb 2024 14:17:31 +1100
Subject: [PATCH 177/177] add sponsor to readme
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index d563f019e..9ebbe246c 100644
--- a/README.md
+++ b/README.md
@@ -342,6 +342,7 @@ And you can download [early access version](https://github.com/Flow-Launcher/Pre
+