Merge branch 'refs/heads/dev' into net8

# Conflicts:
#	Flow.Launcher.Core/Flow.Launcher.Core.csproj
#	Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj
This commit is contained in:
Hongtao Zhang 2024-05-24 13:03:11 -05:00
commit 4da4f0c18d
327 changed files with 13836 additions and 9118 deletions

View file

@ -58,7 +58,7 @@ dotnet_style_prefer_conditional_expression_over_return = true:silent
############################### ###############################
# Style Definitions # Style Definitions
dotnet_naming_style.pascal_case_style.capitalization = pascal_case dotnet_naming_style.pascal_case_style.capitalization = pascal_case
# Use PascalCase for constant fields # Use PascalCase for constant fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
@ -134,7 +134,7 @@ csharp_preserve_single_line_statements = true
csharp_preserve_single_line_blocks = true csharp_preserve_single_line_blocks = true
csharp_using_directive_placement = outside_namespace:silent csharp_using_directive_placement = outside_namespace:silent
csharp_prefer_simple_using_statement = true:suggestion csharp_prefer_simple_using_statement = true:suggestion
csharp_style_namespace_declarations = block_scoped:silent csharp_style_namespace_declarations = file_scoped:silent
csharp_style_prefer_method_group_conversion = true:silent csharp_style_prefer_method_group_conversion = true:silent
csharp_style_expression_bodied_lambdas = true:silent csharp_style_expression_bodied_lambdas = true:silent
csharp_style_expression_bodied_local_functions = false:silent csharp_style_expression_bodied_local_functions = false:silent

View file

@ -3,3 +3,6 @@ https
ssh ssh
ubuntu ubuntu
runcount runcount
Firefox
Português
Português (Brasil)

View file

@ -74,6 +74,7 @@ WCA_ACCENT_POLICY
HGlobal HGlobal
dopusrt dopusrt
firefox firefox
Firefox
msedge msedge
svgc svgc
ime ime
@ -97,6 +98,7 @@ Português
Português (Brasil) Português (Brasil)
Italiano Italiano
Slovenský Slovenský
Tiếng Việt
Droplex Droplex
Preinstalled Preinstalled
errormetadatafile errormetadatafile
@ -106,3 +108,4 @@ alreadyexists
JsonRPC JsonRPC
JsonRPCV2 JsonRPCV2
Softpedia Softpedia
img

View file

@ -18,7 +18,7 @@ jobs:
dotnet-version: 7.0.x dotnet-version: 7.0.x
- name: Determine New Plugin Updates - name: Determine New Plugin Updates
uses: dorny/paths-filter@v2 uses: dorny/paths-filter@v3
id: changes id: changes
with: with:
filters: | filters: |
@ -65,7 +65,7 @@ jobs:
- name: Publish BrowserBookmark - name: Publish BrowserBookmark
if: steps.changes.outputs.browserbookmark == 'true' if: steps.changes.outputs.browserbookmark == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.BrowserBookmark" repository: "Flow-Launcher/Flow.Launcher.Plugin.BrowserBookmark"
files: "Flow.Launcher.Plugin.BrowserBookmark.zip" files: "Flow.Launcher.Plugin.BrowserBookmark.zip"
@ -92,7 +92,7 @@ jobs:
- name: Publish Calculator - name: Publish Calculator
if: steps.changes.outputs.calculator == 'true' if: steps.changes.outputs.calculator == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Calculator" repository: "Flow-Launcher/Flow.Launcher.Plugin.Calculator"
files: "Flow.Launcher.Plugin.Calculator.zip" files: "Flow.Launcher.Plugin.Calculator.zip"
@ -119,7 +119,7 @@ jobs:
- name: Publish Explorer - name: Publish Explorer
if: steps.changes.outputs.explorer == 'true' if: steps.changes.outputs.explorer == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Explorer" repository: "Flow-Launcher/Flow.Launcher.Plugin.Explorer"
files: "Flow.Launcher.Plugin.Explorer.zip" files: "Flow.Launcher.Plugin.Explorer.zip"
@ -146,7 +146,7 @@ jobs:
- name: Publish PluginIndicator - name: Publish PluginIndicator
if: steps.changes.outputs.pluginindicator == 'true' if: steps.changes.outputs.pluginindicator == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.PluginIndicator" repository: "Flow-Launcher/Flow.Launcher.Plugin.PluginIndicator"
files: "Flow.Launcher.Plugin.PluginIndicator.zip" files: "Flow.Launcher.Plugin.PluginIndicator.zip"
@ -173,7 +173,7 @@ jobs:
- name: Publish PluginsManager - name: Publish PluginsManager
if: steps.changes.outputs.pluginsmanager == 'true' if: steps.changes.outputs.pluginsmanager == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.PluginsManager" repository: "Flow-Launcher/Flow.Launcher.Plugin.PluginsManager"
files: "Flow.Launcher.Plugin.PluginsManager.zip" files: "Flow.Launcher.Plugin.PluginsManager.zip"
@ -200,7 +200,7 @@ jobs:
- name: Publish ProcessKiller - name: Publish ProcessKiller
if: steps.changes.outputs.processkiller == 'true' if: steps.changes.outputs.processkiller == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.ProcessKiller" repository: "Flow-Launcher/Flow.Launcher.Plugin.ProcessKiller"
files: "Flow.Launcher.Plugin.ProcessKiller.zip" files: "Flow.Launcher.Plugin.ProcessKiller.zip"
@ -227,7 +227,7 @@ jobs:
- name: Publish Program - name: Publish Program
if: steps.changes.outputs.program == 'true' if: steps.changes.outputs.program == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Program" repository: "Flow-Launcher/Flow.Launcher.Plugin.Program"
files: "Flow.Launcher.Plugin.Program.zip" files: "Flow.Launcher.Plugin.Program.zip"
@ -254,7 +254,7 @@ jobs:
- name: Publish Shell - name: Publish Shell
if: steps.changes.outputs.shell == 'true' if: steps.changes.outputs.shell == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Shell" repository: "Flow-Launcher/Flow.Launcher.Plugin.Shell"
files: "Flow.Launcher.Plugin.Shell.zip" files: "Flow.Launcher.Plugin.Shell.zip"
@ -281,7 +281,7 @@ jobs:
- name: Publish Sys - name: Publish Sys
if: steps.changes.outputs.sys == 'true' if: steps.changes.outputs.sys == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Sys" repository: "Flow-Launcher/Flow.Launcher.Plugin.Sys"
files: "Flow.Launcher.Plugin.Sys.zip" files: "Flow.Launcher.Plugin.Sys.zip"
@ -308,7 +308,7 @@ jobs:
- name: Publish Url - name: Publish Url
if: steps.changes.outputs.url == 'true' if: steps.changes.outputs.url == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.Url" repository: "Flow-Launcher/Flow.Launcher.Plugin.Url"
files: "Flow.Launcher.Plugin.Url.zip" files: "Flow.Launcher.Plugin.Url.zip"
@ -335,7 +335,7 @@ jobs:
- name: Publish WebSearch - name: Publish WebSearch
if: steps.changes.outputs.websearch == 'true' if: steps.changes.outputs.websearch == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.WebSearch" repository: "Flow-Launcher/Flow.Launcher.Plugin.WebSearch"
files: "Flow.Launcher.Plugin.WebSearch.zip" files: "Flow.Launcher.Plugin.WebSearch.zip"
@ -362,7 +362,7 @@ jobs:
- name: Publish WindowsSettings - name: Publish WindowsSettings
if: steps.changes.outputs.windowssettings == 'true' if: steps.changes.outputs.windowssettings == 'true'
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v2
with: with:
repository: "Flow-Launcher/Flow.Launcher.Plugin.WindowsSettings" repository: "Flow-Launcher/Flow.Launcher.Plugin.WindowsSettings"
files: "Flow.Launcher.Plugin.WindowsSettings.zip" files: "Flow.Launcher.Plugin.WindowsSettings.zip"

View file

@ -6,6 +6,11 @@ on:
schedule: schedule:
- cron: '30 1 * * *' - cron: '30 1 * * *'
env:
days-before-stale: 60
days-before-close: 7
exempt-issue-labels: 'keep-fresh'
jobs: jobs:
stale: stale:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@ -15,12 +20,12 @@ jobs:
steps: steps:
- uses: actions/stale@v9 - uses: actions/stale@v9
with: 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: 45 days-before-stale: ${{ env.days-before-stale }}
days-before-close: 7 days-before-close: ${{ env.days-before-close }}
days-before-pr-close: -1 days-before-pr-close: -1
exempt-all-milestones: true 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.' 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' 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' exempt-pr-labels: 'keep-fresh,awaiting-approval,work-in-progress'

View file

@ -5,6 +5,8 @@ using System.Collections.Generic;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -16,6 +18,11 @@ namespace Flow.Launcher.Core.ExternalPlugins
private List<UserPlugin> plugins = new(); private List<UserPlugin> plugins = new();
private static JsonSerializerOptions PluginStoreItemSerializationOption = new JsonSerializerOptions()
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault
};
/// <summary> /// <summary>
/// Fetch and deserialize the contents of a plugins.json file found at <see cref="ManifestFileUrl"/>. /// Fetch and deserialize the contents of a plugins.json file found at <see cref="ManifestFileUrl"/>.
/// We use conditional http requests to keep repeat requests fast. /// We use conditional http requests to keep repeat requests fast.
@ -32,12 +39,15 @@ namespace Flow.Launcher.Core.ExternalPlugins
request.Headers.Add("If-None-Match", latestEtag); request.Headers.Add("If-None-Match", latestEtag);
using var response = await Http.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, token).ConfigureAwait(false); using var response = await Http.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, token)
.ConfigureAwait(false);
if (response.StatusCode == HttpStatusCode.OK) if (response.StatusCode == HttpStatusCode.OK)
{ {
this.plugins = await response.Content.ReadFromJsonAsync<List<UserPlugin>>(cancellationToken: token).ConfigureAwait(false); this.plugins = await response.Content
this.latestEtag = response.Headers.ETag.Tag; .ReadFromJsonAsync<List<UserPlugin>>(PluginStoreItemSerializationOption, cancellationToken: token)
.ConfigureAwait(false);
this.latestEtag = response.Headers.ETag?.Tag;
Log.Info(nameof(CommunityPluginSource), $"Loaded {this.plugins.Count} plugins from {ManifestFileUrl}"); Log.Info(nameof(CommunityPluginSource), $"Loaded {this.plugins.Count} plugins from {ManifestFileUrl}");
return this.plugins; return this.plugins;
@ -49,7 +59,8 @@ namespace Flow.Launcher.Core.ExternalPlugins
} }
else else
{ {
Log.Warn(nameof(CommunityPluginSource), $"Failed to load resource {ManifestFileUrl} with response {response.StatusCode}"); Log.Warn(nameof(CommunityPluginSource),
$"Failed to load resource {ManifestFileUrl} with response {response.StatusCode}");
throw new Exception($"Failed to load resource {ManifestFileUrl} with response {response.StatusCode}"); throw new Exception($"Failed to load resource {ManifestFileUrl} with response {response.StatusCode}");
} }
} }

View file

@ -1,4 +1,4 @@
using System; using System;
namespace Flow.Launcher.Core.ExternalPlugins namespace Flow.Launcher.Core.ExternalPlugins
{ {
@ -13,9 +13,11 @@ namespace Flow.Launcher.Core.ExternalPlugins
public string Website { get; set; } public string Website { get; set; }
public string UrlDownload { get; set; } public string UrlDownload { get; set; }
public string UrlSourceCode { get; set; } public string UrlSourceCode { get; set; }
public string LocalInstallPath { get; set; }
public string IcoPath { get; set; } public string IcoPath { get; set; }
public DateTime LatestReleaseDate { get; set; } public DateTime? LatestReleaseDate { get; set; }
public DateTime DateAdded { get; set; } public DateTime? DateAdded { get; set; }
public bool IsFromLocalInstallPath => !string.IsNullOrEmpty(LocalInstallPath);
} }
} }

View file

@ -56,8 +56,11 @@
<PackageReference Include="Droplex" Version="1.7.0" /> <PackageReference Include="Droplex" Version="1.7.0" />
<PackageReference Include="FSharp.Core" Version="8.0.100" /> <PackageReference Include="FSharp.Core" Version="8.0.100" />
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="2.3.2" /> <PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="2.3.2" />
<PackageReference Include="FSharp.Core" Version="7.0.401" />
<PackageReference Include="Meziantou.Framework.Win32.Jobs" Version="3.2.1" />
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.0" />
<PackageReference Include="squirrel.windows" Version="1.5.2" NoWarn="NU1701" /> <PackageReference Include="squirrel.windows" Version="1.5.2" NoWarn="NU1701" />
<PackageReference Include="StreamJsonRpc" Version="2.17.8" /> <PackageReference Include="StreamJsonRpc" Version="2.17.11" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -12,15 +12,9 @@ namespace Flow.Launcher.Core.Plugin
public ExecutablePluginV2(string filename) public ExecutablePluginV2(string filename)
{ {
StartInfo = new ProcessStartInfo StartInfo = new ProcessStartInfo { FileName = filename };
{
FileName = filename,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true
};
} }
protected override MessageHandlerType MessageHandler { get; } = MessageHandlerType.NewLineDelimited;
} }
} }

View file

@ -37,7 +37,7 @@ namespace Flow.Launcher.Core.Plugin
_storage = new JsonStorage<ConcurrentDictionary<string, object>>(SettingPath); _storage = new JsonStorage<ConcurrentDictionary<string, object>>(SettingPath);
Settings = await _storage.LoadAsync(); Settings = await _storage.LoadAsync();
if (Settings != null || Configuration == null) if (Configuration == null)
{ {
return; return;
} }

View file

@ -15,8 +15,6 @@ namespace Flow.Launcher.Core.Plugin
{ {
internal abstract class JsonRPCPluginV2 : JsonRPCPluginBase, IAsyncDisposable, IAsyncReloadable, IResultUpdated internal abstract class JsonRPCPluginV2 : JsonRPCPluginBase, IAsyncDisposable, IAsyncReloadable, IResultUpdated
{ {
public abstract string SupportedLanguage { get; set; }
public const string JsonRpc = "JsonRPC"; public const string JsonRpc = "JsonRPC";
protected abstract IDuplexPipe ClientPipe { get; set; } protected abstract IDuplexPipe ClientPipe { get; set; }
@ -41,9 +39,23 @@ namespace Flow.Launcher.Core.Plugin
} }
} }
private JoinableTaskFactory JTF { get; } = new JoinableTaskFactory(new JoinableTaskContext());
public override List<Result> LoadContextMenus(Result selectedResult) public override List<Result> LoadContextMenus(Result selectedResult)
{ {
throw new NotImplementedException(); try
{
var res = JTF.Run(() => RPC.InvokeWithCancellationAsync<JsonRPCQueryResponseModel>("context_menu",
new object[] { selectedResult.ContextData }));
var results = ParseResults(res);
return results;
}
catch
{
return new List<Result>();
}
} }
public override async Task<List<Result>> QueryAsync(Query query, CancellationToken token) public override async Task<List<Result>> QueryAsync(Query query, CancellationToken token)
@ -51,7 +63,7 @@ namespace Flow.Launcher.Core.Plugin
try try
{ {
var res = await RPC.InvokeWithCancellationAsync<JsonRPCQueryResponseModel>("query", var res = await RPC.InvokeWithCancellationAsync<JsonRPCQueryResponseModel>("query",
new[] { query }, new object[] { query, Settings.Inner },
token); token);
var results = ParseResults(res); var results = ParseResults(res);
@ -88,12 +100,26 @@ namespace Flow.Launcher.Core.Plugin
public event ResultUpdatedEventHandler ResultsUpdated; public event ResultUpdatedEventHandler ResultsUpdated;
protected enum MessageHandlerType
{
HeaderDelimited,
LengthHeaderDelimited,
NewLineDelimited
}
protected abstract MessageHandlerType MessageHandler { get; }
private void SetupJsonRPC() private void SetupJsonRPC()
{ {
var formatter = new SystemTextJsonFormatter { JsonSerializerOptions = RequestSerializeOption }; var formatter = new SystemTextJsonFormatter { JsonSerializerOptions = RequestSerializeOption };
var handler = new NewLineDelimitedMessageHandler(ClientPipe, IJsonRpcMessageHandler handler = MessageHandler switch
formatter); {
MessageHandlerType.HeaderDelimited => new HeaderDelimitedMessageHandler(ClientPipe, formatter),
MessageHandlerType.LengthHeaderDelimited => new LengthHeaderMessageHandler(ClientPipe, formatter),
MessageHandlerType.NewLineDelimited => new NewLineDelimitedMessageHandler(ClientPipe, formatter),
_ => throw new ArgumentOutOfRangeException()
};
RPC = new JsonRpc(handler, new JsonRPCPublicAPI(Context.API)); RPC = new JsonRpc(handler, new JsonRPCPublicAPI(Context.API));

View file

@ -28,20 +28,21 @@ namespace Flow.Launcher.Core.Plugin
protected override Task<Stream> RequestAsync(JsonRPCRequestModel request, CancellationToken token = default) protected override Task<Stream> RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
{ {
_startInfo.ArgumentList[1] = JsonSerializer.Serialize(request); _startInfo.ArgumentList[1] = JsonSerializer.Serialize(request, RequestSerializeOption);
return ExecuteAsync(_startInfo, token); return ExecuteAsync(_startInfo, token);
} }
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default) 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 // since this is not static, request strings will build up in ArgumentList if index is not specified
_startInfo.ArgumentList[1] = JsonSerializer.Serialize(rpcRequest); _startInfo.ArgumentList[1] = JsonSerializer.Serialize(rpcRequest, RequestSerializeOption);
return Execute(_startInfo); return Execute(_startInfo);
} }
public override async Task InitAsync(PluginInitContext context) public override async Task InitAsync(PluginInitContext context)
{ {
_startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath); _startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
_startInfo.ArgumentList.Add(string.Empty);
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory; _startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
await base.InitAsync(context); await base.InitAsync(context);
} }

View file

@ -10,29 +10,21 @@ namespace Flow.Launcher.Core.Plugin
/// <summary> /// <summary>
/// Execution of JavaScript & TypeScript plugins /// Execution of JavaScript & TypeScript plugins
/// </summary> /// </summary>
internal class NodePluginV2 : ProcessStreamPluginV2 internal sealed class NodePluginV2 : ProcessStreamPluginV2
{ {
public NodePluginV2(string filename) public NodePluginV2(string filename)
{ {
StartInfo = new ProcessStartInfo StartInfo = new ProcessStartInfo { FileName = filename, };
{
FileName = filename,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true
};
} }
public override string SupportedLanguage { get; set; }
protected override ProcessStartInfo StartInfo { get; set; } protected override ProcessStartInfo StartInfo { get; set; }
public override async Task InitAsync(PluginInitContext context) public override async Task InitAsync(PluginInitContext context)
{ {
StartInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath); StartInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
StartInfo.ArgumentList.Add(string.Empty);
StartInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
await base.InitAsync(context); await base.InitAsync(context);
} }
protected override MessageHandlerType MessageHandler { get; } = MessageHandlerType.HeaderDelimited;
} }
} }

View file

@ -380,7 +380,8 @@ namespace Flow.Launcher.Core.Plugin
/// <summary> /// <summary>
/// Update a plugin to new version, from a zip file. Will Delete zip after updating. /// Update a plugin to new version, from a zip file. By default will remove the zip file if update is via url,
/// unless it's a local path installation
/// </summary> /// </summary>
public static void UpdatePlugin(PluginMetadata existingVersion, UserPlugin newVersion, string zipFilePath) public static void UpdatePlugin(PluginMetadata existingVersion, UserPlugin newVersion, string zipFilePath)
{ {
@ -390,11 +391,11 @@ namespace Flow.Launcher.Core.Plugin
} }
/// <summary> /// <summary>
/// Install a plugin. Will Delete zip after updating. /// Install a plugin. By default will remove the zip file if installation is from url, unless it's a local path installation
/// </summary> /// </summary>
public static void InstallPlugin(UserPlugin plugin, string zipFilePath) public static void InstallPlugin(UserPlugin plugin, string zipFilePath)
{ {
InstallPlugin(plugin, zipFilePath, true); InstallPlugin(plugin, zipFilePath, checkModified: true);
} }
/// <summary> /// <summary>
@ -420,7 +421,9 @@ namespace Flow.Launcher.Core.Plugin
// Unzip plugin files to temp folder // Unzip plugin files to temp folder
var tempFolderPluginPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); var tempFolderPluginPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
System.IO.Compression.ZipFile.ExtractToDirectory(zipFilePath, tempFolderPluginPath); System.IO.Compression.ZipFile.ExtractToDirectory(zipFilePath, tempFolderPluginPath);
File.Delete(zipFilePath);
if(!plugin.IsFromLocalInstallPath)
File.Delete(zipFilePath);
var pluginFolderPath = GetContainingFolderPathAfterUnzip(tempFolderPluginPath); var pluginFolderPath = GetContainingFolderPathAfterUnzip(tempFolderPluginPath);

View file

@ -1,23 +1,38 @@
using System; #nullable enable
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO.Pipelines; using System.IO.Pipelines;
using System.Threading.Tasks; using System.Threading.Tasks;
using Flow.Launcher.Infrastructure; using Flow.Launcher.Infrastructure;
using Flow.Launcher.Plugin; using Flow.Launcher.Plugin;
using Meziantou.Framework.Win32;
using Microsoft.VisualBasic.ApplicationServices;
using Nerdbank.Streams; using Nerdbank.Streams;
namespace Flow.Launcher.Core.Plugin namespace Flow.Launcher.Core.Plugin
{ {
internal abstract class ProcessStreamPluginV2 : JsonRPCPluginV2 internal abstract class ProcessStreamPluginV2 : JsonRPCPluginV2
{ {
private static JobObject _jobObject = new JobObject();
public override string SupportedLanguage { get; set; } static ProcessStreamPluginV2()
protected sealed override IDuplexPipe ClientPipe { get; set; } {
_jobObject.SetLimits(new JobObjectLimits()
{
Flags = JobObjectLimitFlags.KillOnJobClose | JobObjectLimitFlags.DieOnUnhandledException |
JobObjectLimitFlags.SilentBreakawayOk
});
_jobObject.AssignProcess(Process.GetCurrentProcess());
}
protected sealed override IDuplexPipe ClientPipe { get; set; } = null!;
protected abstract ProcessStartInfo StartInfo { get; set; } protected abstract ProcessStartInfo StartInfo { get; set; }
protected Process ClientProcess { get; set; } protected Process ClientProcess { get; set; } = null!;
public override async Task InitAsync(PluginInitContext context) public override async Task InitAsync(PluginInitContext context)
{ {
@ -25,11 +40,17 @@ namespace Flow.Launcher.Core.Plugin
StartInfo.EnvironmentVariables["FLOW_PROGRAM_DIRECTORY"] = Constant.ProgramDirectory; StartInfo.EnvironmentVariables["FLOW_PROGRAM_DIRECTORY"] = Constant.ProgramDirectory;
StartInfo.EnvironmentVariables["FLOW_APPLICATION_DIRECTORY"] = Constant.ApplicationDirectory; StartInfo.EnvironmentVariables["FLOW_APPLICATION_DIRECTORY"] = Constant.ApplicationDirectory;
StartInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath); StartInfo.RedirectStandardError = true;
StartInfo.RedirectStandardInput = true;
StartInfo.RedirectStandardOutput = true;
StartInfo.CreateNoWindow = true;
StartInfo.UseShellExecute = false;
StartInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory; StartInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
ClientProcess = Process.Start(StartInfo); var process = Process.Start(StartInfo);
ArgumentNullException.ThrowIfNull(ClientProcess); ArgumentNullException.ThrowIfNull(process);
ClientProcess = process;
_jobObject.AssignProcess(ClientProcess);
SetupPipe(ClientProcess); SetupPipe(ClientProcess);
@ -37,15 +58,15 @@ namespace Flow.Launcher.Core.Plugin
await base.InitAsync(context); await base.InitAsync(context);
} }
private void SetupPipe(Process process) private void SetupPipe(Process process)
{ {
var (reader, writer) = (PipeReader.Create(process.StandardOutput.BaseStream), var (reader, writer) = (PipeReader.Create(process.StandardOutput.BaseStream),
PipeWriter.Create(process.StandardInput.BaseStream)); PipeWriter.Create(process.StandardInput.BaseStream));
ClientPipe = new DuplexPipe(reader, writer); ClientPipe = new DuplexPipe(reader, writer);
} }
public override async Task ReloadDataAsync() public override async Task ReloadDataAsync()
{ {
var oldProcess = ClientProcess; var oldProcess = ClientProcess;
@ -57,8 +78,8 @@ namespace Flow.Launcher.Core.Plugin
await oldProcess.WaitForExitAsync(); await oldProcess.WaitForExitAsync();
oldProcess.Dispose(); oldProcess.Dispose();
} }
public override async ValueTask DisposeAsync() public override async ValueTask DisposeAsync()
{ {
ClientProcess.Kill(true); ClientProcess.Kill(true);

View file

@ -18,20 +18,11 @@ namespace Flow.Launcher.Core.Plugin
{ {
internal sealed class PythonPluginV2 : ProcessStreamPluginV2 internal sealed class PythonPluginV2 : ProcessStreamPluginV2
{ {
public override string SupportedLanguage { get; set; } = AllowedLanguage.Python;
protected override ProcessStartInfo StartInfo { get; set; } protected override ProcessStartInfo StartInfo { get; set; }
public PythonPluginV2(string filename) public PythonPluginV2(string filename)
{ {
StartInfo = new ProcessStartInfo StartInfo = new ProcessStartInfo { FileName = filename, };
{
FileName = filename,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true
};
var path = Path.Combine(Constant.ProgramDirectory, JsonRpc); var path = Path.Combine(Constant.ProgramDirectory, JsonRpc);
StartInfo.EnvironmentVariables["PYTHONPATH"] = path; StartInfo.EnvironmentVariables["PYTHONPATH"] = path;
@ -39,5 +30,13 @@ 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 //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"); StartInfo.ArgumentList.Add("-B");
} }
public override async Task InitAsync(PluginInitContext context)
{
StartInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
await base.InitAsync(context);
}
protected override MessageHandlerType MessageHandler { get; } = MessageHandlerType.NewLineDelimited;
} }
} }

View file

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace Flow.Launcher.Core.Resource namespace Flow.Launcher.Core.Resource
{ {
@ -27,6 +27,8 @@ namespace Flow.Launcher.Core.Resource
public static Language Turkish = new Language("tr", "Türkçe"); public static Language Turkish = new Language("tr", "Türkçe");
public static Language Czech = new Language("cs", "čeština"); public static Language Czech = new Language("cs", "čeština");
public static Language Arabic = new Language("ar", "اللغة العربية"); public static Language Arabic = new Language("ar", "اللغة العربية");
public static Language Vietnamese = new Language("vi-vn", "Tiếng Việt");
public static List<Language> GetAvailableLanguages() public static List<Language> GetAvailableLanguages()
{ {
@ -54,7 +56,8 @@ namespace Flow.Launcher.Core.Resource
Slovak, Slovak,
Turkish, Turkish,
Czech, Czech,
Arabic Arabic,
Vietnamese
}; };
return languages; return languages;
} }

View file

@ -7,6 +7,7 @@ namespace Flow.Launcher.Infrastructure
public static class Constant public static class Constant
{ {
public const string FlowLauncher = "Flow.Launcher"; public const string FlowLauncher = "Flow.Launcher";
public const string FlowLauncherFullName = "Flow Launcher";
public const string Plugins = "Plugins"; public const string Plugins = "Plugins";
public const string PluginMetadataFileName = "plugin.json"; public const string PluginMetadataFileName = "plugin.json";

View file

@ -49,17 +49,20 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Ben.Demystifier" Version="0.4.1" /> <PackageReference Include="Ben.Demystifier" Version="0.4.1" />
<PackageReference Include="FastCache.Cached" Version="1.8.2" />
<PackageReference Include="Fody" Version="6.5.5"> <PackageReference Include="Fody" Version="6.5.5">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="MemoryPack" Version="1.10.0" />
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="17.8.14" />
<PackageReference Include="NLog" Version="4.7.10" /> <PackageReference Include="NLog" Version="4.7.10" />
<PackageReference Include="NLog.Schema" Version="4.7.10" /> <PackageReference Include="NLog.Schema" Version="4.7.10" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.13.0" /> <PackageReference Include="NLog.Web.AspNetCore" Version="4.13.0" />
<PackageReference Include="PropertyChanged.Fody" Version="3.4.0" /> <PackageReference Include="PropertyChanged.Fody" Version="3.4.0" />
<PackageReference Include="System.Drawing.Common" Version="8.0.0" /> <PackageReference Include="System.Drawing.Common" Version="8.0.0" />
<PackageReference Include="FastCache.Cached" Version="1.8.2" />
<PackageReference Include="MemoryPack" Version="1.21.1" />
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="17.7.30" />
<PackageReference Include="System.Drawing.Common" Version="8.0.0" />
<!--ToolGood.Words.Pinyin v3.0.2.6 results in high memory usage when search with pinyin is enabled--> <!--ToolGood.Words.Pinyin v3.0.2.6 results in high memory usage when search with pinyin is enabled-->
<!--Bumping to it or higher needs to test and ensure this is no longer a problem--> <!--Bumping to it or higher needs to test and ensure this is no longer a problem-->
<PackageReference Include="ToolGood.Words.Pinyin" Version="3.0.1.4" /> <PackageReference Include="ToolGood.Words.Pinyin" Version="3.0.1.4" />

View file

@ -6,7 +6,7 @@ using System.Windows.Input;
namespace Flow.Launcher.Infrastructure.Hotkey namespace Flow.Launcher.Infrastructure.Hotkey
{ {
public class HotkeyModel public record struct HotkeyModel
{ {
public bool Alt { get; set; } public bool Alt { get; set; }
public bool Shift { get; set; } public bool Shift { get; set; }
@ -17,8 +17,7 @@ namespace Flow.Launcher.Infrastructure.Hotkey
private static readonly Dictionary<Key, string> specialSymbolDictionary = new Dictionary<Key, string> private static readonly Dictionary<Key, string> specialSymbolDictionary = new Dictionary<Key, string>
{ {
{Key.Space, "Space"}, { Key.Space, "Space" }, { Key.Oem3, "~" }
{Key.Oem3, "~"}
}; };
public ModifierKeys ModifierKeys public ModifierKeys ModifierKeys
@ -30,18 +29,22 @@ namespace Flow.Launcher.Infrastructure.Hotkey
{ {
modifierKeys |= ModifierKeys.Alt; modifierKeys |= ModifierKeys.Alt;
} }
if (Shift) if (Shift)
{ {
modifierKeys |= ModifierKeys.Shift; modifierKeys |= ModifierKeys.Shift;
} }
if (Win) if (Win)
{ {
modifierKeys |= ModifierKeys.Windows; modifierKeys |= ModifierKeys.Windows;
} }
if (Ctrl) if (Ctrl)
{ {
modifierKeys |= ModifierKeys.Control; modifierKeys |= ModifierKeys.Control;
} }
return modifierKeys; return modifierKeys;
} }
} }
@ -66,31 +69,37 @@ namespace Flow.Launcher.Infrastructure.Hotkey
{ {
return; return;
} }
List<string> keys = hotkeyString.Replace(" ", "").Split('+').ToList(); List<string> keys = hotkeyString.Replace(" ", "").Split('+').ToList();
if (keys.Contains("Alt")) if (keys.Contains("Alt"))
{ {
Alt = true; Alt = true;
keys.Remove("Alt"); keys.Remove("Alt");
} }
if (keys.Contains("Shift")) if (keys.Contains("Shift"))
{ {
Shift = true; Shift = true;
keys.Remove("Shift"); keys.Remove("Shift");
} }
if (keys.Contains("Win")) if (keys.Contains("Win"))
{ {
Win = true; Win = true;
keys.Remove("Win"); keys.Remove("Win");
} }
if (keys.Contains("Ctrl")) if (keys.Contains("Ctrl"))
{ {
Ctrl = true; Ctrl = true;
keys.Remove("Ctrl"); keys.Remove("Ctrl");
} }
if (keys.Count == 1) if (keys.Count == 1)
{ {
string charKey = keys[0]; string charKey = keys[0];
KeyValuePair<Key, string>? specialSymbolPair = specialSymbolDictionary.FirstOrDefault(pair => pair.Value == charKey); KeyValuePair<Key, string>? specialSymbolPair =
specialSymbolDictionary.FirstOrDefault(pair => pair.Value == charKey);
if (specialSymbolPair.Value.Value != null) if (specialSymbolPair.Value.Value != null)
{ {
CharKey = specialSymbolPair.Value.Key; CharKey = specialSymbolPair.Value.Key;
@ -103,7 +112,6 @@ namespace Flow.Launcher.Infrastructure.Hotkey
} }
catch (ArgumentException) catch (ArgumentException)
{ {
} }
} }
} }
@ -111,33 +119,39 @@ namespace Flow.Launcher.Infrastructure.Hotkey
public override string ToString() public override string ToString()
{ {
List<string> keys = new List<string>(); return string.Join(" + ", EnumerateDisplayKeys());
if (Ctrl) }
public IEnumerable<string> EnumerateDisplayKeys()
{
if (Ctrl && CharKey is not (Key.LeftCtrl or Key.RightCtrl))
{ {
keys.Add("Ctrl"); yield return "Ctrl";
} }
if (Alt)
if (Alt && CharKey is not (Key.LeftAlt or Key.RightAlt))
{ {
keys.Add("Alt"); yield return "Alt";
} }
if (Shift)
if (Shift && CharKey is not (Key.LeftShift or Key.RightShift))
{ {
keys.Add("Shift"); yield return "Shift";
} }
if (Win)
if (Win && CharKey is not (Key.LWin or Key.RWin))
{ {
keys.Add("Win"); yield return "Win";
} }
if (CharKey != Key.None) if (CharKey != Key.None)
{ {
keys.Add(specialSymbolDictionary.ContainsKey(CharKey) yield return specialSymbolDictionary.TryGetValue(CharKey, out var value)
? specialSymbolDictionary[CharKey] ? value
: CharKey.ToString()); : CharKey.ToString();
} }
return string.Join(" + ", keys);
} }
/// <summary> /// <summary>
/// Validate hotkey /// Validate hotkey
/// </summary> /// </summary>
@ -164,11 +178,13 @@ namespace Flow.Launcher.Infrastructure.Hotkey
{ {
KeyGesture keyGesture = new KeyGesture(CharKey, ModifierKeys); KeyGesture keyGesture = new KeyGesture(CharKey, ModifierKeys);
} }
catch (System.Exception e) when (e is NotSupportedException || e is InvalidEnumArgumentException) catch (System.Exception e) when
(e is NotSupportedException || e is InvalidEnumArgumentException)
{ {
return false; return false;
} }
} }
if (ModifierKeys == ModifierKeys.None) if (ModifierKeys == ModifierKeys.None)
{ {
return !IsPrintableCharacter(CharKey); return !IsPrintableCharacter(CharKey);
@ -206,18 +222,6 @@ namespace Flow.Launcher.Infrastructure.Hotkey
key == Key.Decimal; key == Key.Decimal;
} }
public override bool Equals(object obj)
{
if (obj is HotkeyModel other)
{
return ModifierKeys == other.ModifierKeys && CharKey == other.CharKey;
}
else
{
return false;
}
}
public override int GetHashCode() public override int GetHashCode()
{ {
return HashCode.Combine(ModifierKeys, CharKey); return HashCode.Combine(ModifierKeys, CharKey);

View file

@ -0,0 +1,17 @@
using System.Collections.Generic;
namespace Flow.Launcher.Infrastructure.Hotkey;
/// <summary>
/// Interface that you should implement in your settings class to be able to pass it to
/// <c>Flow.Launcher.HotkeyControlDialog</c>. It allows the dialog to display the hotkeys that have already been
/// registered, and optionally provide a way to unregister them.
/// </summary>
public interface IHotkeySettings
{
/// <summary>
/// A list of hotkeys that have already been registered. The dialog will display these hotkeys and provide a way to
/// unregister them.
/// </summary>
public List<RegisteredHotkeyData> RegisteredHotkeys { get; }
}

View file

@ -0,0 +1,119 @@
using System;
namespace Flow.Launcher.Infrastructure.Hotkey;
#nullable enable
/// <summary>
/// Represents a hotkey that has been registered. Used in <c>Flow.Launcher.HotkeyControlDialog</c> via
/// <see cref="UserSettings"/> and <see cref="IHotkeySettings"/> to display errors if user tries to register a hotkey
/// that has already been registered, and optionally provides a way to unregister the hotkey.
/// </summary>
public record RegisteredHotkeyData
{
/// <summary>
/// <see cref="HotkeyModel"/> representation of this hotkey.
/// </summary>
public HotkeyModel Hotkey { get; }
/// <summary>
/// String key in the localization dictionary that represents this hotkey. For example, <c>ReloadPluginHotkey</c>,
/// which represents the string "Reload Plugins Data" in <c>en.xaml</c>
/// </summary>
public string DescriptionResourceKey { get; }
/// <summary>
/// Array of values that will replace <c>{0}</c>, <c>{1}</c>, <c>{2}</c>, etc. in the localized string found via
/// <see cref="DescriptionResourceKey"/>.
/// </summary>
public object?[] DescriptionFormatVariables { get; } = Array.Empty<object?>();
/// <summary>
/// An action that, when called, will unregister this hotkey. If it's <c>null</c>, it's assumed that
/// this hotkey can't be unregistered, and the "Overwrite" option will not appear in the hotkey dialog.
/// </summary>
public Action? RemoveHotkey { get; }
/// <summary>
/// Creates an instance of <c>RegisteredHotkeyData</c>. Assumes that the key specified in
/// <c>descriptionResourceKey</c> doesn't need any arguments for <c>string.Format</c>. If it does,
/// use one of the other constructors.
/// </summary>
/// <param name="hotkey">
/// The hotkey this class will represent.
/// Example values: <c>F1</c>, <c>Ctrl+Shift+Enter</c>
/// </param>
/// <param name="descriptionResourceKey">
/// The key in the localization dictionary that represents this hotkey. For example, <c>ReloadPluginHotkey</c>,
/// which represents the string "Reload Plugins Data" in <c>en.xaml</c>
/// </param>
/// <param name="removeHotkey">
/// An action that, when called, will unregister this hotkey. If it's <c>null</c>, it's assumed that this hotkey
/// can't be unregistered, and the "Overwrite" option will not appear in the hotkey dialog.
/// </param>
public RegisteredHotkeyData(string hotkey, string descriptionResourceKey, Action? removeHotkey = null)
{
Hotkey = new HotkeyModel(hotkey);
DescriptionResourceKey = descriptionResourceKey;
RemoveHotkey = removeHotkey;
}
/// <summary>
/// Creates an instance of <c>RegisteredHotkeyData</c>. Assumes that the key specified in
/// <c>descriptionResourceKey</c> needs exactly one argument for <c>string.Format</c>.
/// </summary>
/// <param name="hotkey">
/// The hotkey this class will represent.
/// Example values: <c>F1</c>, <c>Ctrl+Shift+Enter</c>
/// </param>
/// <param name="descriptionResourceKey">
/// The key in the localization dictionary that represents this hotkey. For example, <c>ReloadPluginHotkey</c>,
/// which represents the string "Reload Plugins Data" in <c>en.xaml</c>
/// </param>
/// <param name="descriptionFormatVariable">
/// The value that will replace <c>{0}</c> in the localized string found via <c>description</c>.
/// </param>
/// <param name="removeHotkey">
/// An action that, when called, will unregister this hotkey. If it's <c>null</c>, it's assumed that this hotkey
/// can't be unregistered, and the "Overwrite" option will not appear in the hotkey dialog.
/// </param>
public RegisteredHotkeyData(
string hotkey, string descriptionResourceKey, object? descriptionFormatVariable, Action? removeHotkey = null
)
{
Hotkey = new HotkeyModel(hotkey);
DescriptionResourceKey = descriptionResourceKey;
DescriptionFormatVariables = new[] { descriptionFormatVariable };
RemoveHotkey = removeHotkey;
}
/// <summary>
/// Creates an instance of <c>RegisteredHotkeyData</c>. Assumes that the key specified in
/// <paramref name="descriptionResourceKey"/> needs multiple arguments for <c>string.Format</c>.
/// </summary>
/// <param name="hotkey">
/// The hotkey this class will represent.
/// Example values: <c>F1</c>, <c>Ctrl+Shift+Enter</c>
/// </param>
/// <param name="descriptionResourceKey">
/// The key in the localization dictionary that represents this hotkey. For example, <c>ReloadPluginHotkey</c>,
/// which represents the string "Reload Plugins Data" in <c>en.xaml</c>
/// </param>
/// <param name="descriptionFormatVariables">
/// Array of values that will replace <c>{0}</c>, <c>{1}</c>, <c>{2}</c>, etc.
/// in the localized string found via <c>description</c>.
/// </param>
/// <param name="removeHotkey">
/// An action that, when called, will unregister this hotkey. If it's <c>null</c>, it's assumed that this hotkey
/// can't be unregistered, and the "Overwrite" option will not appear in the hotkey dialog.
/// </param>
public RegisteredHotkeyData(
string hotkey, string descriptionResourceKey, object?[] descriptionFormatVariables, Action? removeHotkey = null
)
{
Hotkey = new HotkeyModel(hotkey);
DescriptionResourceKey = descriptionResourceKey;
DescriptionFormatVariables = descriptionFormatVariables;
RemoveHotkey = removeHotkey;
}
}

View file

@ -4,13 +4,13 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Windows.Media; using System.Windows.Media;
using FastCache;
using FastCache.Services;
namespace Flow.Launcher.Infrastructure.Image namespace Flow.Launcher.Infrastructure.Image
{ {
[Serializable]
public class ImageUsage public class ImageUsage
{ {
public int usage; public int usage;
public ImageSource imageSource; public ImageSource imageSource;
@ -23,16 +23,13 @@ namespace Flow.Launcher.Infrastructure.Image
public class ImageCache public class ImageCache
{ {
private const int MaxCached = 50; private const int MaxCached = 150;
public ConcurrentDictionary<(string, bool), ImageUsage> Data { get; } = new();
private const int permissibleFactor = 2;
private SemaphoreSlim semaphore = new(1, 1);
public void Initialize(Dictionary<(string, bool), int> usage) public void Initialize(Dictionary<(string, bool), int> usage)
{ {
foreach (var key in usage.Keys) foreach (var key in usage.Keys)
{ {
Data[key] = new ImageUsage(usage[key], null); Cached<ImageUsage>.Save(key, new ImageUsage(usage[key], null), TimeSpan.MaxValue, MaxCached);
} }
} }
@ -40,70 +37,48 @@ namespace Flow.Launcher.Infrastructure.Image
{ {
get get
{ {
if (!Data.TryGetValue((path, isFullImage), out var value)) if (!Cached<ImageUsage>.TryGet((path, isFullImage), out var value))
{ {
return null; return null;
} }
value.usage++;
return value.imageSource;
value.Value.usage++;
return value.Value.imageSource;
} }
set set
{ {
Data.AddOrUpdate( if (Cached<ImageUsage>.TryGet((path, isFullImage), out var cached))
(path, isFullImage),
new ImageUsage(0, value),
(k, v) =>
{
v.imageSource = value;
v.usage++;
return v;
}
);
SliceExtra();
async void SliceExtra()
{ {
// To prevent the dictionary from drastically increasing in size by caching images, the dictionary size is not allowed to grow more than the permissibleFactor * maxCached size cached.Value.imageSource = value;
// This is done so that we don't constantly perform this resizing operation and also maintain the image cache size at the same time cached.Value.usage++;
if (Data.Count > permissibleFactor * MaxCached)
{
await semaphore.WaitAsync().ConfigureAwait(false);
// To delete the images from the data dictionary based on the resizing of the Usage Dictionary
// Double Check to avoid concurrent remove
if (Data.Count > permissibleFactor * MaxCached)
foreach (var key in Data.OrderBy(x => x.Value.usage).Take(Data.Count - MaxCached).Select(x => x.Key))
Data.TryRemove(key, out _);
semaphore.Release();
}
} }
Cached<ImageUsage>.Save((path, isFullImage), new ImageUsage(0, value), TimeSpan.MaxValue,
MaxCached);
} }
} }
public bool ContainsKey(string key, bool isFullImage) public bool ContainsKey(string key, bool isFullImage)
{ {
return key is not null && Data.ContainsKey((key, isFullImage)) && Data[(key, isFullImage)].imageSource != null; return Cached<ImageUsage>.TryGet((key, isFullImage), out _);
} }
public bool TryGetValue(string key, bool isFullImage, out ImageSource image) public bool TryGetValue(string key, bool isFullImage, out ImageSource image)
{ {
if (key is not null) if (Cached<ImageUsage>.TryGet((key, isFullImage), out var value))
{ {
bool hasKey = Data.TryGetValue((key, isFullImage), out var imageUsage); image = value.Value.imageSource;
image = hasKey ? imageUsage.imageSource : null; value.Value.usage++;
return hasKey; return image != null;
}
else
{
image = null;
return false;
} }
image = null;
return false;
} }
public int CacheSize() public int CacheSize()
{ {
return Data.Count; return CacheManager.TotalCount<(string, bool), ImageUsage>();
} }
/// <summary> /// <summary>
@ -111,7 +86,14 @@ namespace Flow.Launcher.Infrastructure.Image
/// </summary> /// </summary>
public int UniqueImagesInCache() public int UniqueImagesInCache()
{ {
return Data.Values.Select(x => x.imageSource).Distinct().Count(); return CacheManager.EnumerateEntries<(string, bool), ImageUsage>().Select(x => x.Value.imageSource)
.Distinct()
.Count();
}
public IEnumerable<Cached<(string, bool), ImageUsage>> EnumerateEntries()
{
return CacheManager.EnumerateEntries<(string, bool), ImageUsage>();
} }
} }
} }

View file

@ -49,7 +49,7 @@ namespace Flow.Launcher.Infrastructure.Image
{ {
await Stopwatch.NormalAsync("|ImageLoader.Initialize|Preload images cost", async () => await Stopwatch.NormalAsync("|ImageLoader.Initialize|Preload images cost", async () =>
{ {
foreach (var ((path, isFullImage), _) in ImageCache.Data) foreach (var ((path, isFullImage), _) in usage)
{ {
await LoadAsync(path, isFullImage); await LoadAsync(path, isFullImage);
} }
@ -65,7 +65,7 @@ namespace Flow.Launcher.Infrastructure.Image
try try
{ {
_storage.SaveAsync(ImageCache.Data await _storage.SaveAsync(ImageCache.EnumerateEntries()
.ToDictionary( .ToDictionary(
x => x.Key, x => x.Key,
x => x.Value.usage)); x => x.Value.usage));
@ -125,9 +125,12 @@ namespace Flow.Launcher.Infrastructure.Image
return new ImageResult(MissingImage, ImageType.Error); return new ImageResult(MissingImage, ImageType.Error);
} }
if (ImageCache.ContainsKey(path, loadFullImage)) // extra scope for use of same variable name
{ {
return new ImageResult(ImageCache[path, loadFullImage], ImageType.Cache); if (ImageCache.TryGetValue(path, loadFullImage, out var imageSource))
{
return new ImageResult(imageSource, ImageType.Cache);
}
} }
if (Uri.TryCreate(path, UriKind.RelativeOrAbsolute, out var uriResult) if (Uri.TryCreate(path, UriKind.RelativeOrAbsolute, out var uriResult)

View file

@ -4,13 +4,14 @@ using System.Collections.ObjectModel;
using System.Drawing; using System.Drawing;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using System.Windows; using System.Windows;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Plugin; using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedModels; using Flow.Launcher.Plugin.SharedModels;
using Flow.Launcher.ViewModel; using Flow.Launcher.ViewModel;
namespace Flow.Launcher.Infrastructure.UserSettings namespace Flow.Launcher.Infrastructure.UserSettings
{ {
public class Settings : BaseModel public class Settings : BaseModel, IHotkeySettings
{ {
private string language = "en"; private string language = "en";
private string _theme = Constant.DefaultTheme; private string _theme = Constant.DefaultTheme;
@ -20,6 +21,18 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool ShowOpenResultHotkey { get; set; } = true; public bool ShowOpenResultHotkey { get; set; } = true;
public double WindowSize { get; set; } = 580; public double WindowSize { get; set; } = 580;
public string PreviewHotkey { get; set; } = $"F1"; public string PreviewHotkey { get; set; } = $"F1";
public string AutoCompleteHotkey { get; set; } = $"{KeyConstant.Ctrl} + Tab";
public string AutoCompleteHotkey2 { get; set; } = $"";
public string SelectNextItemHotkey { get; set; } = $"Tab";
public string SelectNextItemHotkey2 { get; set; } = $"";
public string SelectPrevItemHotkey { get; set; } = $"Shift + Tab";
public string SelectPrevItemHotkey2 { get; set; } = $"";
public string SelectNextPageHotkey { get; set; } = $"PageUp";
public string SelectPrevPageHotkey { get; set; } = $"PageDown";
public string OpenContextMenuHotkey { get; set; } = $"Ctrl+O";
public string SettingWindowHotkey { get; set; } = $"Ctrl+I";
public string CycleHistoryUpHotkey { get; set; } = $"{KeyConstant.Alt} + Up";
public string CycleHistoryDownHotkey { get; set; } = $"{KeyConstant.Alt} + Down";
public string Language public string Language
{ {
@ -54,6 +67,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public bool UseGlyphIcons { get; set; } = true; public bool UseGlyphIcons { get; set; } = true;
public bool UseAnimation { get; set; } = true; public bool UseAnimation { get; set; } = true;
public bool UseSound { get; set; } = true; public bool UseSound { get; set; } = true;
public double SoundVolume { get; set; } = 50;
public bool UseClock { get; set; } = true; public bool UseClock { get; set; } = true;
public bool UseDate { get; set; } = false; public bool UseDate { get; set; } = false;
public string TimeFormat { get; set; } = "hh:mm tt"; public string TimeFormat { get; set; } = "hh:mm tt";
@ -195,17 +210,17 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public double WindowLeft { get; set; } public double WindowLeft { get; set; }
public double WindowTop { get; set; } public double WindowTop { get; set; }
/// <summary> /// <summary>
/// Custom left position on selected monitor /// Custom left position on selected monitor
/// </summary> /// </summary>
public double CustomWindowLeft { get; set; } = 0; public double CustomWindowLeft { get; set; } = 0;
/// <summary> /// <summary>
/// Custom top position on selected monitor /// Custom top position on selected monitor
/// </summary> /// </summary>
public double CustomWindowTop { get; set; } = 0; public double CustomWindowTop { get; set; } = 0;
public int MaxResultsToShow { get; set; } = 5; public int MaxResultsToShow { get; set; } = 5;
public int ActivateTimes { get; set; } public int ActivateTimes { get; set; }
@ -217,7 +232,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
[JsonIgnore] [JsonIgnore]
public ObservableCollection<BuiltinShortcutModel> BuiltinShortcuts { get; set; } = new() public ObservableCollection<BuiltinShortcutModel> BuiltinShortcuts { get; set; } = new()
{ {
new BuiltinShortcutModel("{clipboard}", "shortcut_clipboard_description", Clipboard.GetText), new BuiltinShortcutModel("{clipboard}", "shortcut_clipboard_description", Clipboard.GetText),
new BuiltinShortcutModel("{active_explorer_path}", "shortcut_active_explorer_path", FileExplorerHelper.GetActiveExplorerPath) new BuiltinShortcutModel("{active_explorer_path}", "shortcut_active_explorer_path", FileExplorerHelper.GetActiveExplorerPath)
}; };
@ -241,7 +256,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
[JsonConverter(typeof(JsonStringEnumConverter))] [JsonConverter(typeof(JsonStringEnumConverter))]
public SearchWindowScreens SearchWindowScreen { get; set; } = SearchWindowScreens.Cursor; public SearchWindowScreens SearchWindowScreen { get; set; } = SearchWindowScreens.Cursor;
[JsonConverter(typeof(JsonStringEnumConverter))] [JsonConverter(typeof(JsonStringEnumConverter))]
public SearchWindowAligns SearchWindowAlign { get; set; } = SearchWindowAligns.Center; public SearchWindowAligns SearchWindowAlign { get; set; } = SearchWindowAligns.Center;
@ -258,9 +273,99 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public AnimationSpeeds AnimationSpeed { get; set; } = AnimationSpeeds.Medium; public AnimationSpeeds AnimationSpeed { get; set; } = AnimationSpeeds.Medium;
public int CustomAnimationLength { get; set; } = 360; public int CustomAnimationLength { get; set; } = 360;
[JsonIgnore]
public bool WMPInstalled { get; set; } = true;
// This needs to be loaded last by staying at the bottom // This needs to be loaded last by staying at the bottom
public PluginsSettings PluginSettings { get; set; } = new PluginsSettings(); public PluginsSettings PluginSettings { get; set; } = new PluginsSettings();
[JsonIgnore]
public List<RegisteredHotkeyData> RegisteredHotkeys
{
get
{
var list = FixedHotkeys();
// Customizeable hotkeys
if(!string.IsNullOrEmpty(Hotkey))
list.Add(new(Hotkey, "flowlauncherHotkey", () => Hotkey = ""));
if(!string.IsNullOrEmpty(PreviewHotkey))
list.Add(new(PreviewHotkey, "previewHotkey", () => PreviewHotkey = ""));
if(!string.IsNullOrEmpty(AutoCompleteHotkey))
list.Add(new(AutoCompleteHotkey, "autoCompleteHotkey", () => AutoCompleteHotkey = ""));
if(!string.IsNullOrEmpty(AutoCompleteHotkey2))
list.Add(new(AutoCompleteHotkey2, "autoCompleteHotkey", () => AutoCompleteHotkey2 = ""));
if(!string.IsNullOrEmpty(SelectNextItemHotkey))
list.Add(new(SelectNextItemHotkey, "SelectNextItemHotkey", () => SelectNextItemHotkey = ""));
if(!string.IsNullOrEmpty(SelectNextItemHotkey2))
list.Add(new(SelectNextItemHotkey2, "SelectNextItemHotkey", () => SelectNextItemHotkey2 = ""));
if(!string.IsNullOrEmpty(SelectPrevItemHotkey))
list.Add(new(SelectPrevItemHotkey, "SelectPrevItemHotkey", () => SelectPrevItemHotkey = ""));
if(!string.IsNullOrEmpty(SelectPrevItemHotkey2))
list.Add(new(SelectPrevItemHotkey2, "SelectPrevItemHotkey", () => SelectPrevItemHotkey2 = ""));
if(!string.IsNullOrEmpty(SettingWindowHotkey))
list.Add(new(SettingWindowHotkey, "SettingWindowHotkey", () => SettingWindowHotkey = ""));
if(!string.IsNullOrEmpty(OpenContextMenuHotkey))
list.Add(new(OpenContextMenuHotkey, "OpenContextMenuHotkey", () => OpenContextMenuHotkey = ""));
if(!string.IsNullOrEmpty(SelectNextPageHotkey))
list.Add(new(SelectNextPageHotkey, "SelectNextPageHotkey", () => SelectNextPageHotkey = ""));
if(!string.IsNullOrEmpty(SelectPrevPageHotkey))
list.Add(new(SelectPrevPageHotkey, "SelectPrevPageHotkey", () => SelectPrevPageHotkey = ""));
if (!string.IsNullOrEmpty(CycleHistoryUpHotkey))
list.Add(new(CycleHistoryUpHotkey, "CycleHistoryUpHotkey", () => CycleHistoryUpHotkey = ""));
if (!string.IsNullOrEmpty(CycleHistoryDownHotkey))
list.Add(new(CycleHistoryDownHotkey, "CycleHistoryDownHotkey", () => CycleHistoryDownHotkey = ""));
// Custom Query Hotkeys
foreach (var customPluginHotkey in CustomPluginHotkeys)
{
if (!string.IsNullOrEmpty(customPluginHotkey.Hotkey))
list.Add(new(customPluginHotkey.Hotkey, "customQueryHotkey", () => customPluginHotkey.Hotkey = ""));
}
return list;
}
}
private List<RegisteredHotkeyData> FixedHotkeys()
{
return new List<RegisteredHotkeyData>
{
new("Up", "HotkeyLeftRightDesc"),
new("Down", "HotkeyLeftRightDesc"),
new("Left", "HotkeyUpDownDesc"),
new("Right", "HotkeyUpDownDesc"),
new("Escape", "HotkeyESCDesc"),
new("F5", "ReloadPluginHotkey"),
new("Alt+Home", "HotkeySelectFirstResult"),
new("Alt+End", "HotkeySelectLastResult"),
new("Ctrl+R", "HotkeyRequery"),
new("Ctrl+H", "ToggleHistoryHotkey"),
new("Ctrl+OemCloseBrackets", "QuickWidthHotkey"),
new("Ctrl+OemOpenBrackets", "QuickWidthHotkey"),
new("Ctrl+OemPlus", "QuickHeightHotkey"),
new("Ctrl+OemMinus", "QuickHeightHotkey"),
new("Ctrl+Shift+Enter", "HotkeyCtrlShiftEnterDesc"),
new("Shift+Enter", "OpenContextMenuHotkey"),
new("Enter", "HotkeyRunDesc"),
new("Ctrl+Enter", "OpenContainFolderHotkey"),
new("Alt+Enter", "HotkeyOpenResult"),
new("Ctrl+F12", "ToggleGameModeHotkey"),
new("Ctrl+Shift+C", "CopyFilePathHotkey"),
new($"{OpenResultModifiers}+D1", "HotkeyOpenResultN", 1),
new($"{OpenResultModifiers}+D2", "HotkeyOpenResultN", 2),
new($"{OpenResultModifiers}+D3", "HotkeyOpenResultN", 3),
new($"{OpenResultModifiers}+D4", "HotkeyOpenResultN", 4),
new($"{OpenResultModifiers}+D5", "HotkeyOpenResultN", 5),
new($"{OpenResultModifiers}+D6", "HotkeyOpenResultN", 6),
new($"{OpenResultModifiers}+D7", "HotkeyOpenResultN", 7),
new($"{OpenResultModifiers}+D8", "HotkeyOpenResultN", 8),
new($"{OpenResultModifiers}+D9", "HotkeyOpenResultN", 9),
new($"{OpenResultModifiers}+D0", "HotkeyOpenResultN", 10)
};
}
} }
public enum LastQueryMode public enum LastQueryMode
@ -276,7 +381,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
Light, Light,
Dark Dark
} }
public enum SearchWindowScreens public enum SearchWindowScreens
{ {
RememberLastLaunchLocation, RememberLastLaunchLocation,
@ -285,7 +390,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
Primary, Primary,
Custom Custom
} }
public enum SearchWindowAligns public enum SearchWindowAligns
{ {
Center, Center,

View file

@ -14,10 +14,10 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<Version>4.1.1</Version> <Version>4.3.0</Version>
<PackageVersion>4.1.1</PackageVersion> <PackageVersion>4.3.0</PackageVersion>
<AssemblyVersion>4.1.1</AssemblyVersion> <AssemblyVersion>4.3.0</AssemblyVersion>
<FileVersion>4.1.1</FileVersion> <FileVersion>4.3.0</FileVersion>
<PackageId>Flow.Launcher.Plugin</PackageId> <PackageId>Flow.Launcher.Plugin</PackageId>
<Authors>Flow-Launcher</Authors> <Authors>Flow-Launcher</Authors>
<PackageLicenseExpression>MIT</PackageLicenseExpression> <PackageLicenseExpression>MIT</PackageLicenseExpression>

View file

@ -291,5 +291,12 @@ namespace Flow.Launcher.Plugin
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public bool IsGameModeOn(); public bool IsGameModeOn();
/// <summary>
/// Reloads the query.
/// This method should run
/// </summary>
/// <param name="reselect">Choose the first result after reload if true; keep the last selected result if false. Default is true.</param>
public void ReQuery(bool reselect = true);
} }
} }

View file

@ -183,6 +183,31 @@ namespace Flow.Launcher.Plugin
return Title + SubTitle + Score; return Title + SubTitle + Score;
} }
/// <summary>
/// Clones the current result
/// </summary>
public Result Clone()
{
return new Result
{
Title = Title,
SubTitle = SubTitle,
ActionKeywordAssigned = ActionKeywordAssigned,
CopyText = CopyText,
AutoCompleteText = AutoCompleteText,
IcoPath = IcoPath,
RoundedIcon = RoundedIcon,
Icon = Icon,
Glyph = Glyph,
Action = Action,
AsyncAction = AsyncAction,
Score = Score,
TitleHighlightData = TitleHighlightData,
OriginQuery = OriginQuery,
PluginDirectory = PluginDirectory
};
}
/// <summary> /// <summary>
/// Additional data associated with this result /// Additional data associated with this result
/// </summary> /// </summary>

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq;
#pragma warning disable IDE0005 #pragma warning disable IDE0005
using System.Windows; using System.Windows;
#pragma warning restore IDE0005 #pragma warning restore IDE0005
@ -200,6 +201,24 @@ namespace Flow.Launcher.Plugin.SharedCommands
} }
} }
///<summary>
/// This checks whether a given string is a zip file path.
/// By default does not check if the zip file actually exist on disk, can do so by
/// setting checkFileExists = true.
///</summary>
public static bool IsZipFilePath(string querySearchString, bool checkFileExists = false)
{
if (IsLocationPathString(querySearchString) && querySearchString.Split('.').Last() == "zip")
{
if (checkFileExists)
return FileExists(querySearchString);
return true;
}
return false;
}
///<summary> ///<summary>
/// This checks whether a given string is a directory path or network location string. /// This checks whether a given string is a directory path or network location string.
/// It does not check if location actually exists. /// It does not check if location actually exists.

View file

@ -54,7 +54,7 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -191,11 +191,15 @@ namespace Flow.Launcher.Test.Plugins
[TestCase(@"\c:\", false)] [TestCase(@"\c:\", false)]
[TestCase(@"cc:\", false)] [TestCase(@"cc:\", false)]
[TestCase(@"\\\SomeNetworkLocation\", false)] [TestCase(@"\\\SomeNetworkLocation\", false)]
[TestCase(@"\\SomeNetworkLocation\", true)]
[TestCase("RandomFile", false)] [TestCase("RandomFile", false)]
[TestCase(@"c:\>*", true)] [TestCase(@"c:\>*", true)]
[TestCase(@"c:\>", true)] [TestCase(@"c:\>", true)]
[TestCase(@"c:\SomeLocation\SomeOtherLocation\>", true)] [TestCase(@"c:\SomeLocation\SomeOtherLocation\>", true)]
[TestCase(@"c:\SomeLocation\SomeOtherLocation", true)] [TestCase(@"c:\SomeLocation\SomeOtherLocation", true)]
[TestCase(@"c:\SomeLocation\SomeOtherLocation\SomeFile.exe", true)]
[TestCase(@"\\SomeNetworkLocation\SomeFile.exe", true)]
public void WhenGivenQuerySearchString_ThenShouldIndicateIfIsLocationPathString(string querySearchString, bool expectedResult) public void WhenGivenQuerySearchString_ThenShouldIndicateIfIsLocationPathString(string querySearchString, bool expectedResult)
{ {
// When, Given // When, Given

View file

@ -54,6 +54,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
Scripts\post_build.ps1 = Scripts\post_build.ps1 Scripts\post_build.ps1 = Scripts\post_build.ps1
README.md = README.md README.md = README.md
SolutionAssemblyInfo.cs = SolutionAssemblyInfo.cs SolutionAssemblyInfo.cs = SolutionAssemblyInfo.cs
Settings.XamlStyler = Settings.XamlStyler
EndProjectSection EndProjectSection
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Shell", "Plugins\Flow.Launcher.Plugin.Shell\Flow.Launcher.Plugin.Shell.csproj", "{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Shell", "Plugins\Flow.Launcher.Plugin.Shell\Flow.Launcher.Plugin.Shell.csproj", "{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}"

View file

@ -24,6 +24,7 @@
</ui:ThemeResources> </ui:ThemeResources>
<ui:XamlControlsResources /> <ui:XamlControlsResources />
<ResourceDictionary Source="pack://application:,,,/Resources/CustomControlTemplate.xaml" /> <ResourceDictionary Source="pack://application:,,,/Resources/CustomControlTemplate.xaml" />
<ResourceDictionary Source="pack://application:,,,/Resources/SettingWindowStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Themes/Win11System.xaml" /> <ResourceDictionary Source="pack://application:,,,/Themes/Win11System.xaml" />
<ResourceDictionary Source="pack://application:,,,/Languages/en.xaml" /> <ResourceDictionary Source="pack://application:,,,/Languages/en.xaml" />
</ResourceDictionary.MergedDictionaries> </ResourceDictionary.MergedDictionaries>

View file

@ -62,6 +62,7 @@ namespace Flow.Launcher
_settingsVM = new SettingWindowViewModel(_updater, _portable); _settingsVM = new SettingWindowViewModel(_updater, _portable);
_settings = _settingsVM.Settings; _settings = _settingsVM.Settings;
_settings.WMPInstalled = WindowsMediaPlayerHelper.IsWindowsMediaPlayerInstalled();
AbstractPluginEnvironment.PreStartPluginExecutablePathUpdate(_settings); AbstractPluginEnvironment.PreStartPluginExecutablePathUpdate(_settings);

View file

@ -3,53 +3,38 @@ using System.Globalization;
using System.Windows.Data; using System.Windows.Data;
using System.Windows.Input; using System.Windows.Input;
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
{
internal class BoolToIMEConversionModeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool v)
{
if (v)
{
return ImeConversionModeValues.Alphanumeric;
}
else
{
return ImeConversionModeValues.DoNotCare;
}
}
return ImeConversionModeValues.DoNotCare;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) internal class BoolToIMEConversionModeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value switch
{ {
throw new NotImplementedException(); true => ImeConversionModeValues.Alphanumeric,
} _ => ImeConversionModeValues.DoNotCare
};
} }
internal class BoolToIMEStateConverter : IValueConverter public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{ {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) throw new NotImplementedException();
{ }
if (value is bool v) }
{
if (v) internal class BoolToIMEStateConverter : IValueConverter
{ {
return InputMethodState.Off; public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
} {
else return value switch
{ {
return InputMethodState.DoNotCare; true => InputMethodState.Off,
} _ => InputMethodState.DoNotCare
} };
return InputMethodState.DoNotCare; }
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
{ throw new NotImplementedException();
throw new NotImplementedException();
}
} }
} }

View file

@ -2,70 +2,39 @@
using System.Windows; using System.Windows;
using System.Windows.Data; using System.Windows.Data;
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
public class BoolToVisibilityConverter : IValueConverter
{ {
public class BoolToVisibilityConverter : IValueConverter public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
{ {
public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture) return (value, parameter) switch
{ {
if (parameter != null) (true, not null) => Visibility.Collapsed,
{ (_, not null) => Visibility.Visible,
if (value is true)
{
return Visibility.Collapsed;
}
else (true, null) => Visibility.Visible,
{ (_, null) => Visibility.Collapsed
return Visibility.Visible; };
}
}
else {
if (value is true)
{
return Visibility.Visible;
}
else {
return Visibility.Collapsed;
}
}
}
public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
} }
public class SplitterConverter : IValueConverter public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
/* Prevents the dragging part of the preview area from working when preview is turned off. */ }
{
public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture) public class SplitterConverter : IValueConverter
{ /* Prevents the dragging part of the preview area from working when preview is turned off. */
if (parameter != null) {
{ public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
if (value is true) {
{ return (value, parameter) switch
return 0; {
} (true, not null) => 0,
(_, not null) => 5,
else
{ (true, null) => 5,
return 5; (_, null) => 0
} };
} }
else
{ public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
if (value is true)
{
return 5;
}
else
{
return 0;
}
}
}
public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
}
} }

View file

@ -7,46 +7,41 @@ using System.Windows.Shapes;
// For Clipping inside listbox item // For Clipping inside listbox item
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
public class BorderClipConverter : IMultiValueConverter
{ {
public class BorderClipConverter : IMultiValueConverter public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{ {
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) if (values is not [double width, double height, CornerRadius radius])
{ {
if (values.Length == 3 && values[0] is double && values[1] is double && values[2] is CornerRadius)
{
var width = (double)values[0];
var height = (double)values[1];
Path myPath = new Path();
if (width < Double.Epsilon || height < Double.Epsilon)
{
return Geometry.Empty;
}
var radius = (CornerRadius)values[2];
var radiusHeight = radius.TopLeft;
// Drawing Round box for bottom round, and rect for top area of listbox.
var corner = new RectangleGeometry(new Rect(0, 0, width, height), radius.TopLeft, radius.TopLeft);
var box = new RectangleGeometry(new Rect(0, 0, width, radiusHeight), 0, 0);
GeometryGroup myGeometryGroup = new GeometryGroup();
myGeometryGroup.Children.Add(corner);
myGeometryGroup.Children.Add(box);
CombinedGeometry c1 = new CombinedGeometry(GeometryCombineMode.Union, corner, box);
myPath.Data = c1;
myPath.Data.Freeze();
return myPath.Data;
}
return DependencyProperty.UnsetValue; return DependencyProperty.UnsetValue;
} }
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) Path myPath = new Path();
if (width < Double.Epsilon || height < Double.Epsilon)
{ {
throw new NotSupportedException(); return Geometry.Empty;
} }
var radiusHeight = radius.TopLeft;
// Drawing Round box for bottom round, and rect for top area of listbox.
var corner = new RectangleGeometry(new Rect(0, 0, width, height), radius.TopLeft, radius.TopLeft);
var box = new RectangleGeometry(new Rect(0, 0, width, radiusHeight), 0, 0);
GeometryGroup myGeometryGroup = new GeometryGroup();
myGeometryGroup.Children.Add(corner);
myGeometryGroup.Children.Add(box);
CombinedGeometry c1 = new CombinedGeometry(GeometryCombineMode.Union, corner, box);
myPath.Data = c1;
myPath.Data.Freeze();
return myPath.Data;
} }
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
} }

View file

@ -2,18 +2,17 @@
using System.Globalization; using System.Globalization;
using System.Windows.Data; using System.Windows.Data;
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
{
public class DateTimeFormatToNowConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) public class DateTimeFormatToNowConverter : IValueConverter
{ {
return value is not string format ? null : DateTime.Now.ToString(format);
} public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
{ return value is not string format ? null : DateTime.Now.ToString(format);
throw new NotImplementedException(); }
} public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
} }
} }

View file

@ -3,23 +3,22 @@ using System.Globalization;
using System.Windows; using System.Windows;
using System.Windows.Data; using System.Windows.Data;
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
public class DiameterToCenterPointConverter : IValueConverter
{ {
public class DiameterToCenterPointConverter : IValueConverter public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{ {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) if (value is double d)
{ {
if (value is double d) return new Point(d / 2, d / 2);
{
return new Point(d / 2, d / 2);
}
return new Point(0, 0);
} }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) return new Point(0, 0);
{ }
throw new NotSupportedException();
} public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
} }
} }

View file

@ -1,53 +1,48 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Data; using System.Windows.Data;
using System.Windows.Documents; using System.Windows.Documents;
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
public class HighlightTextConverter : IMultiValueConverter
{ {
public class HighlightTextConverter : IMultiValueConverter public object Convert(object[] value, Type targetType, object parameter, CultureInfo cultureInfo)
{ {
public object Convert(object[] value, Type targetType, object parameter, CultureInfo cultureInfo) if (value.Length < 2)
return new Run(string.Empty);
if (value[0] is not string text)
return new Run(string.Empty);
if (value[1] is not List<int> { Count: > 0 } highlightData)
// No highlight data, just return the text
return new Run(text);
var highlightStyle = (Style)Application.Current.FindResource("HighlightStyle");
var textBlock = new Span();
for (var i = 0; i < text.Length; i++)
{ {
var text = value[0] as string; var currentCharacter = text.Substring(i, 1);
var highlightData = value[1] as List<int>; var run = new Run(currentCharacter)
var textBlock = new Span();
if (highlightData == null || !highlightData.Any())
{ {
// No highlight data, just return the text Style = ShouldHighlight(highlightData, i) ? highlightStyle : null
return new Run(text); };
} textBlock.Inlines.Add(run);
for (var i = 0; i < text.Length; i++)
{
var currentCharacter = text.Substring(i, 1);
if (this.ShouldHighlight(highlightData, i))
{
textBlock.Inlines.Add(new Run(currentCharacter) { Style = (Style)Application.Current.FindResource("HighlightStyle") });
}
else
{
textBlock.Inlines.Add(new Run(currentCharacter));
}
}
return textBlock;
} }
return textBlock;
}
public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture) public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
{ {
return new[] { DependencyProperty.UnsetValue, DependencyProperty.UnsetValue }; return new[] { DependencyProperty.UnsetValue, DependencyProperty.UnsetValue };
} }
private bool ShouldHighlight(List<int> highlightData, int index) private bool ShouldHighlight(List<int> highlightData, int index)
{ {
return highlightData.Contains(index); return highlightData.Contains(index);
}
} }
} }

View file

@ -2,25 +2,19 @@
using System.Globalization; using System.Globalization;
using System.Windows.Data; using System.Windows.Data;
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
{
public class IconRadiusConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length != 2)
throw new ArgumentException("IconRadiusConverter must have 2 parameters");
return values[1] switch public class IconRadiusConverter : IMultiValueConverter
{ {
true => (double)values[0] / 2, public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
false => (double)values[0], {
_ => throw new ArgumentException("The second argument should be boolean", nameof(values)) if (values is not [double size, bool isIconCircular])
}; throw new ArgumentException("IconRadiusConverter must have 2 parameters: [double, bool]");
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) return isIconCircular ? size / 2 : size;
{ }
throw new NotSupportedException(); public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
} {
throw new NotSupportedException();
} }
} }

View file

@ -4,24 +4,23 @@ using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Data; using System.Windows.Data;
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
[ValueConversion(typeof(bool), typeof(Visibility))]
public class OpenResultHotkeyVisibilityConverter : IValueConverter
{ {
[ValueConversion(typeof(bool), typeof(Visibility))] private const int MaxVisibleHotkeys = 10;
public class OpenResultHotkeyVisibilityConverter : IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{ {
private const int MaxVisibleHotkeys = 10; var number = int.MaxValue;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) if (value is ListBoxItem listBoxItem
{ && ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
var number = int.MaxValue; number = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
if (value is ListBoxItem listBoxItem return number <= MaxVisibleHotkeys ? Visibility.Visible : Visibility.Collapsed;
&& ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
number = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
return number <= MaxVisibleHotkeys ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException();
} }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new InvalidOperationException();
} }

View file

@ -1,23 +1,24 @@
using System;
using System.Globalization; using System.Globalization;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Data; using System.Windows.Data;
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
{
public class OrdinalConverter : IValueConverter
{
public object Convert(object value, System.Type targetType, object parameter, CultureInfo culture)
{
if (value is ListBoxItem listBoxItem
&& ItemsControl.ItemsControlFromItemContainer(listBoxItem) is ListBox listBox)
{
var res = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
return res == 10 ? 0 : res; // 10th item => HOTKEY+0
}
public class OrdinalConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is not ListBoxItem listBoxItem
|| ItemsControl.ItemsControlFromItemContainer(listBoxItem) is not ListBox listBox)
{
return 0; return 0;
} }
public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException(); var res = listBox.ItemContainerGenerator.IndexFromContainer(listBoxItem) + 1;
return res == 10 ? 0 : res; // 10th item => HOTKEY+0
} }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new InvalidOperationException();
} }

View file

@ -6,74 +6,62 @@ using System.Windows.Media;
using Flow.Launcher.Infrastructure.Logger; using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.ViewModel; using Flow.Launcher.ViewModel;
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
public class QuerySuggestionBoxConverter : IMultiValueConverter
{ {
public class QuerySuggestionBoxConverter : IMultiValueConverter public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{ {
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) // values[0] is TextBox: The textbox displaying the autocomplete suggestion
// values[1] is ResultViewModel: Currently selected item in the list
// values[2] is string: Query text
if (
values.Length != 3 ||
values[0] is not TextBox queryTextBox ||
values[1] is null ||
values[2] is not string queryText ||
string.IsNullOrEmpty(queryText)
)
return string.Empty;
if (values[1] is not ResultViewModel selectedItem)
return Binding.DoNothing;
try
{ {
if (values.Length != 3) var selectedResult = selectedItem.Result;
{ var selectedResultActionKeyword = string.IsNullOrEmpty(selectedResult.ActionKeywordAssigned) ? "" : selectedResult.ActionKeywordAssigned + " ";
return string.Empty; var selectedResultPossibleSuggestion = selectedResultActionKeyword + selectedResult.Title;
}
var QueryTextBox = values[0] as TextBox;
var queryText = (string)values[2]; if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase))
if (string.IsNullOrEmpty(queryText))
return string.Empty; return string.Empty;
// second prop is the current selected item result
var val = values[1]; // For AutocompleteQueryCommand.
if (val == null) // When user typed lower case and result title is uppercase, we still want to display suggestion
{ selectedItem.QuerySuggestionText = queryText + selectedResultPossibleSuggestion.Substring(queryText.Length);
// Check if Text will be larger than our QueryTextBox
Typeface typeface = new Typeface(queryTextBox.FontFamily, queryTextBox.FontStyle, queryTextBox.FontWeight, queryTextBox.FontStretch);
// TODO: Obsolete warning?
var ft = new FormattedText(queryTextBox.Text, CultureInfo.DefaultThreadCurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, queryTextBox.FontSize, Brushes.Black);
var offset = queryTextBox.Padding.Right;
if (ft.Width + offset > queryTextBox.ActualWidth || queryTextBox.HorizontalOffset != 0)
return string.Empty; return string.Empty;
}
if (!(val is ResultViewModel))
{
return System.Windows.Data.Binding.DoNothing;
}
try return selectedItem.QuerySuggestionText;
{
var selectedItem = (ResultViewModel)val;
var selectedResult = selectedItem.Result;
var selectedResultActionKeyword = string.IsNullOrEmpty(selectedResult.ActionKeywordAssigned) ? "" : selectedResult.ActionKeywordAssigned + " ";
var selectedResultPossibleSuggestion = selectedResultActionKeyword + selectedResult.Title;
if (!selectedResultPossibleSuggestion.StartsWith(queryText, StringComparison.CurrentCultureIgnoreCase))
return string.Empty;
// For AutocompleteQueryCommand.
// When user typed lower case and result title is uppercase, we still want to display suggestion
selectedItem.QuerySuggestionText = queryText + selectedResultPossibleSuggestion.Substring(queryText.Length);
// Check if Text will be larger then our QueryTextBox
System.Windows.Media.Typeface typeface = new Typeface(QueryTextBox.FontFamily, QueryTextBox.FontStyle, QueryTextBox.FontWeight, QueryTextBox.FontStretch);
// TODO: Obsolete warning?
System.Windows.Media.FormattedText ft = new FormattedText(QueryTextBox.Text, System.Globalization.CultureInfo.DefaultThreadCurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, QueryTextBox.FontSize, Brushes.Black);
var offset = QueryTextBox.Padding.Right;
if ((ft.Width + offset) > QueryTextBox.ActualWidth || QueryTextBox.HorizontalOffset != 0)
{
return string.Empty;
};
return selectedItem.QuerySuggestionText;
}
catch (Exception e)
{
Log.Exception(nameof(QuerySuggestionBoxConverter), "fail to convert text for suggestion box", e);
return string.Empty;
}
} }
catch (Exception e)
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{ {
throw new NotImplementedException(); Log.Exception(nameof(QuerySuggestionBoxConverter), "fail to convert text for suggestion box", e);
return string.Empty;
} }
} }
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
} }

View file

@ -3,30 +3,27 @@ using System.Globalization;
using System.Windows.Data; using System.Windows.Data;
using System.Windows.Input; using System.Windows.Input;
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
{
class StringToKeyBindingConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var mode = parameter as string;
var hotkeyStr = value as string;
var converter = new KeyGestureConverter();
var key = (KeyGesture)converter.ConvertFromString(hotkeyStr);
if (mode == "key")
{
return key.Key;
}
else if (mode == "modifiers")
{
return key.Modifiers;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) class StringToKeyBindingConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (parameter is not string mode || value is not string hotkeyStr)
return null;
var converter = new KeyGestureConverter();
var key = (KeyGesture)converter.ConvertFromString(hotkeyStr);
return mode switch
{ {
throw new NotImplementedException(); "key" => key?.Key,
} "modifiers" => key?.Modifiers,
_ => null
};
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
} }
} }

View file

@ -4,29 +4,27 @@ using System.Windows.Data;
using Flow.Launcher.Core.Resource; using Flow.Launcher.Core.Resource;
using Flow.Launcher.ViewModel; using Flow.Launcher.ViewModel;
namespace Flow.Launcher.Converters namespace Flow.Launcher.Converters;
{
public class TextConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var ID = value.ToString();
switch(ID)
{
case PluginStoreItemViewModel.NewRelease:
return InternationalizationManager.Instance.GetTranslation("pluginStore_NewRelease");
case PluginStoreItemViewModel.RecentlyUpdated:
return InternationalizationManager.Instance.GetTranslation("pluginStore_RecentlyUpdated");
case PluginStoreItemViewModel.None:
return InternationalizationManager.Instance.GetTranslation("pluginStore_None");
case PluginStoreItemViewModel.Installed:
return InternationalizationManager.Instance.GetTranslation("pluginStore_Installed");
default:
return ID;
}
}
public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture) => throw new System.InvalidOperationException(); public class TextConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var id = value?.ToString();
var translationKey = id switch
{
PluginStoreItemViewModel.NewRelease => "pluginStore_NewRelease",
PluginStoreItemViewModel.RecentlyUpdated => "pluginStore_RecentlyUpdated",
PluginStoreItemViewModel.None => "pluginStore_None",
PluginStoreItemViewModel.Installed => "pluginStore_Installed",
_ => null
};
if (translationKey is null)
return id;
return InternationalizationManager.Instance.GetTranslation(translationKey);
} }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new InvalidOperationException();
} }

View file

@ -2,10 +2,12 @@
x:Class="Flow.Launcher.CustomQueryHotkeySetting" x:Class="Flow.Launcher.CustomQueryHotkeySetting"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:flowlauncher="clr-namespace:Flow.Launcher" xmlns:flowlauncher="clr-namespace:Flow.Launcher"
Title="{DynamicResource customeQueryHotkeyTitle}" Title="{DynamicResource customeQueryHotkeyTitle}"
Width="530" Width="530"
Background="{DynamicResource PopuBGColor}" Background="{DynamicResource PopuBGColor}"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Foreground="{DynamicResource PopupTextColor}" Foreground="{DynamicResource PopupTextColor}"
Icon="Images\app.png" Icon="Images\app.png"
MouseDown="window_MouseDown" MouseDown="window_MouseDown"
@ -60,94 +62,76 @@
</Grid> </Grid>
</StackPanel> </StackPanel>
<StackPanel Margin="26,0,26,0"> <StackPanel Margin="26,0,26,0">
<StackPanel Grid.Row="0" Margin="0,0,0,12"> <TextBlock
<TextBlock Margin="0,0,0,12"
Grid.Column="0" FontSize="20"
Margin="0,0,0,0" FontWeight="SemiBold"
FontSize="20" Text="{DynamicResource customeQueryHotkeyTitle}"
FontWeight="SemiBold" TextAlignment="Left" />
Text="{DynamicResource customeQueryHotkeyTitle}" <TextBlock
TextAlignment="Left" /> FontSize="14"
</StackPanel> Text="{DynamicResource customeQueryHotkeyTips}"
<StackPanel> TextAlignment="Left"
<TextBlock TextWrapping="WrapWithOverflow" />
FontSize="14" <Image
Text="{DynamicResource customeQueryHotkeyTips}" Width="478"
TextAlignment="Left" Margin="0,20,0,0"
TextWrapping="WrapWithOverflow" /> Source="/Images/illustration_01.png" />
<Image
Width="478"
Margin="0,20,0,0"
Source="/Images/illustration_01.png" />
</StackPanel>
<StackPanel Margin="0,20,0,0" Orientation="Horizontal"> <Grid Width="478" Margin="0,20,0,0">
<Grid Width="478"> <Grid.RowDefinitions>
<Grid.RowDefinitions> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> </Grid.RowDefinitions>
</Grid.RowDefinitions> <Grid.ColumnDefinitions>
<Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock
Grid.Row="0" <TextBlock
Grid.Column="0" Grid.Row="0"
Margin="10" Grid.Column="0"
HorizontalAlignment="Left" Margin="10"
VerticalAlignment="Center" HorizontalAlignment="Left"
FontSize="14" VerticalAlignment="Center"
Text="{DynamicResource hotkey}" /> FontSize="14"
<StackPanel Text="{DynamicResource hotkey}" />
Grid.Row="0" <flowlauncher:HotkeyControl
Grid.Column="1" x:Name="HotkeyControl"
Orientation="Horizontal"> Grid.Row="0"
<flowlauncher:HotkeyControl Grid.Column="1"
x:Name="ctlHotkey" Grid.ColumnSpan="2"
Grid.Column="1" Margin="10,0,10,0"
Width="200" HorizontalAlignment="Left"
Height="36" VerticalAlignment="Center"
Margin="10,0,10,0" HorizontalContentAlignment="Left"
HorizontalAlignment="Left" HotkeySettings="{Binding Settings}"
VerticalAlignment="Center" DefaultHotkey="" />
HorizontalContentAlignment="Left" /> <TextBlock
<TextBlock Grid.Row="1"
Grid.Row="1" Grid.Column="0"
Grid.Column="0" Margin="10"
Margin="10" HorizontalAlignment="Left"
HorizontalAlignment="Left" VerticalAlignment="Center"
VerticalAlignment="Center" FontSize="14"
FontSize="14" Text="{DynamicResource customQuery}" />
Text="{DynamicResource actionKeyword}" /> <TextBox
</StackPanel> x:Name="tbAction"
<TextBlock Grid.Row="1"
Grid.Row="1" Grid.Column="1"
Grid.Column="0" Margin="10"
Margin="10" HorizontalAlignment="Stretch"
HorizontalAlignment="Left" VerticalAlignment="Center" />
VerticalAlignment="Center" <Button
FontSize="14" x:Name="btnTestActionKeyword"
Text="{DynamicResource customQuery}" /> Grid.Row="1"
<DockPanel Grid.Column="2"
Grid.Row="1" Margin="0,0,10,0"
Grid.Column="1" Padding="10,5,10,5"
LastChildFill="True"> Click="BtnTestActionKeyword_OnClick"
<Button Content="{DynamicResource preview}" />
x:Name="btnTestActionKeyword" </Grid>
Margin="0,0,10,0"
Padding="10,5,10,5"
Click="BtnTestActionKeyword_OnClick"
Content="{DynamicResource preview}"
DockPanel.Dock="Right" />
<TextBox
x:Name="tbAction"
Margin="10"
HorizontalAlignment="Stretch"
VerticalAlignment="Center" />
</DockPanel>
</Grid>
</StackPanel>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
<Border <Border
@ -174,4 +158,4 @@
</StackPanel> </StackPanel>
</Border> </Border>
</Grid> </Grid>
</Window> </Window>

View file

@ -6,6 +6,7 @@ using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Controls; using System.Windows.Controls;
using Flow.Launcher.ViewModel;
namespace Flow.Launcher namespace Flow.Launcher
{ {
@ -14,13 +15,13 @@ namespace Flow.Launcher
private SettingWindow _settingWidow; private SettingWindow _settingWidow;
private bool update; private bool update;
private CustomPluginHotkey updateCustomHotkey; private CustomPluginHotkey updateCustomHotkey;
private Settings _settings; public Settings Settings { get; }
public CustomQueryHotkeySetting(SettingWindow settingWidow, Settings settings) public CustomQueryHotkeySetting(SettingWindow settingWidow, Settings settings)
{ {
_settingWidow = settingWidow; _settingWidow = settingWidow;
Settings = settings;
InitializeComponent(); InitializeComponent();
_settings = settings;
} }
private void BtnCancel_OnClick(object sender, RoutedEventArgs e) private void BtnCancel_OnClick(object sender, RoutedEventArgs e)
@ -32,36 +33,21 @@ namespace Flow.Launcher
{ {
if (!update) if (!update)
{ {
if (!ctlHotkey.CurrentHotkeyAvailable) Settings.CustomPluginHotkeys ??= new ObservableCollection<CustomPluginHotkey>();
{
MessageBox.Show(InternationalizationManager.Instance.GetTranslation("hotkeyIsNotUnavailable"));
return;
}
if (_settings.CustomPluginHotkeys == null)
{
_settings.CustomPluginHotkeys = new ObservableCollection<CustomPluginHotkey>();
}
var pluginHotkey = new CustomPluginHotkey var pluginHotkey = new CustomPluginHotkey
{ {
Hotkey = ctlHotkey.CurrentHotkey.ToString(), Hotkey = HotkeyControl.CurrentHotkey.ToString(), ActionKeyword = tbAction.Text
ActionKeyword = tbAction.Text
}; };
_settings.CustomPluginHotkeys.Add(pluginHotkey); Settings.CustomPluginHotkeys.Add(pluginHotkey);
HotKeyMapper.SetCustomQueryHotkey(pluginHotkey); HotKeyMapper.SetCustomQueryHotkey(pluginHotkey);
} }
else else
{ {
if (updateCustomHotkey.Hotkey != ctlHotkey.CurrentHotkey.ToString() && !ctlHotkey.CurrentHotkeyAvailable)
{
MessageBox.Show(InternationalizationManager.Instance.GetTranslation("hotkeyIsNotUnavailable"));
return;
}
var oldHotkey = updateCustomHotkey.Hotkey; var oldHotkey = updateCustomHotkey.Hotkey;
updateCustomHotkey.ActionKeyword = tbAction.Text; updateCustomHotkey.ActionKeyword = tbAction.Text;
updateCustomHotkey.Hotkey = ctlHotkey.CurrentHotkey.ToString(); updateCustomHotkey.Hotkey = HotkeyControl.CurrentHotkey.ToString();
//remove origin hotkey //remove origin hotkey
HotKeyMapper.RemoveHotkey(oldHotkey); HotKeyMapper.RemoveHotkey(oldHotkey);
HotKeyMapper.SetCustomQueryHotkey(updateCustomHotkey); HotKeyMapper.SetCustomQueryHotkey(updateCustomHotkey);
@ -70,9 +56,11 @@ namespace Flow.Launcher
Close(); Close();
} }
public void UpdateItem(CustomPluginHotkey item) public void UpdateItem(CustomPluginHotkey item)
{ {
updateCustomHotkey = _settings.CustomPluginHotkeys.FirstOrDefault(o => o.ActionKeyword == item.ActionKeyword && o.Hotkey == item.Hotkey); updateCustomHotkey = Settings.CustomPluginHotkeys.FirstOrDefault(o =>
o.ActionKeyword == item.ActionKeyword && o.Hotkey == item.Hotkey);
if (updateCustomHotkey == null) if (updateCustomHotkey == null)
{ {
MessageBox.Show(InternationalizationManager.Instance.GetTranslation("invalidPluginHotkey")); MessageBox.Show(InternationalizationManager.Instance.GetTranslation("invalidPluginHotkey"));
@ -81,7 +69,7 @@ namespace Flow.Launcher
} }
tbAction.Text = updateCustomHotkey.ActionKeyword; tbAction.Text = updateCustomHotkey.ActionKeyword;
_ = ctlHotkey.SetHotkeyAsync(updateCustomHotkey.Hotkey, false); HotkeyControl.SetHotkey(updateCustomHotkey.Hotkey, false);
update = true; update = true;
lblAdd.Text = InternationalizationManager.Instance.GetTranslation("update"); lblAdd.Text = InternationalizationManager.Instance.GetTranslation("update");
} }
@ -101,12 +89,10 @@ namespace Flow.Launcher
private void window_MouseDown(object sender, MouseButtonEventArgs e) /* for close hotkey popup */ private void window_MouseDown(object sender, MouseButtonEventArgs e) /* for close hotkey popup */
{ {
TextBox textBox = Keyboard.FocusedElement as TextBox; if (Keyboard.FocusedElement is not TextBox textBox) return;
if (textBox != null)
{ TraversalRequest tRequest = new TraversalRequest(FocusNavigationDirection.Next);
TraversalRequest tRequest = new TraversalRequest(FocusNavigationDirection.Next); textBox.MoveFocus(tRequest);
textBox.MoveFocus(tRequest);
}
} }
} }
} }

View file

@ -8,7 +8,6 @@ namespace Flow.Launcher
{ {
public partial class CustomShortcutSetting : Window public partial class CustomShortcutSetting : Window
{ {
private SettingWindowViewModel viewModel;
public string Key { get; set; } = String.Empty; public string Key { get; set; } = String.Empty;
public string Value { get; set; } = String.Empty; public string Value { get; set; } = String.Empty;
private string originalKey { get; init; } = null; private string originalKey { get; init; } = null;
@ -17,13 +16,11 @@ namespace Flow.Launcher
public CustomShortcutSetting(SettingWindowViewModel vm) public CustomShortcutSetting(SettingWindowViewModel vm)
{ {
viewModel = vm;
InitializeComponent(); InitializeComponent();
} }
public CustomShortcutSetting(string key, string value, SettingWindowViewModel vm) public CustomShortcutSetting(string key, string value)
{ {
viewModel = vm;
Key = key; Key = key;
Value = value; Value = value;
originalKey = key; originalKey = key;
@ -46,8 +43,7 @@ namespace Flow.Launcher
return; return;
} }
// Check if key is modified or adding a new one // Check if key is modified or adding a new one
if (((update && originalKey != Key) || !update) if ((update && originalKey != Key) || !update)
&& viewModel.ShortcutExists(Key))
{ {
MessageBox.Show(InternationalizationManager.Instance.GetTranslation("duplicateShortcut")); MessageBox.Show(InternationalizationManager.Instance.GetTranslation("duplicateShortcut"));
return; return;

View file

@ -3,57 +3,56 @@ using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Logger; using Flow.Launcher.Infrastructure.Logger;
using Microsoft.Win32; using Microsoft.Win32;
namespace Flow.Launcher.Helper namespace Flow.Launcher.Helper;
public class AutoStartup
{ {
public class AutoStartup private const string StartupPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
public static bool IsEnabled
{ {
private const string StartupPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"; get
public static bool IsEnabled
{
get
{
try
{
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
var path = key?.GetValue(Constant.FlowLauncher) as string;
return path == Constant.ExecutablePath;
}
catch (Exception e)
{
Log.Error("AutoStartup", $"Ignoring non-critical registry error (querying if enabled): {e}");
}
return false;
}
}
public static void Disable()
{ {
try try
{ {
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true); using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
key?.DeleteValue(Constant.FlowLauncher, false); var path = key?.GetValue(Constant.FlowLauncher) as string;
return path == Constant.ExecutablePath;
} }
catch (Exception e) catch (Exception e)
{ {
Log.Error("AutoStartup", $"Failed to disable auto-startup: {e}"); Log.Error("AutoStartup", $"Ignoring non-critical registry error (querying if enabled): {e}");
throw;
} }
}
internal static void Enable() return false;
}
}
public static void Disable()
{
try
{ {
try using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
{ key?.DeleteValue(Constant.FlowLauncher, false);
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true); }
key?.SetValue(Constant.FlowLauncher, $"\"{Constant.ExecutablePath}\""); catch (Exception e)
} {
catch (Exception e) Log.Error("AutoStartup", $"Failed to disable auto-startup: {e}");
{ throw;
Log.Error("AutoStartup", $"Failed to enable auto-startup: {e}"); }
throw; }
}
internal static void Enable()
{
try
{
using var key = Registry.CurrentUser.OpenSubKey(StartupPath, true);
key?.SetValue(Constant.FlowLauncher, $"\"{Constant.ExecutablePath}\"");
}
catch (Exception e)
{
Log.Error("AutoStartup", $"Failed to enable auto-startup: {e}");
throw;
} }
} }
} }

View file

@ -4,70 +4,69 @@ using System.Runtime.InteropServices;
using System.Windows; using System.Windows;
using System.Windows.Interop; using System.Windows.Interop;
namespace Flow.Launcher.Helper namespace Flow.Launcher.Helper;
public class DwmDropShadow
{ {
public class DwmDropShadow
[DllImport("dwmapi.dll", PreserveSig = true)]
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
[DllImport("dwmapi.dll")]
private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins pMarInset);
/// <summary>
/// Drops a standard shadow to a WPF Window, even if the window isborderless. Only works with DWM (Vista and Seven).
/// This method is much more efficient than setting AllowsTransparency to true and using the DropShadow effect,
/// as AllowsTransparency involves a huge permormance issue (hardware acceleration is turned off for all the window).
/// </summary>
/// <param name="window">Window to which the shadow will be applied</param>
public static void DropShadowToWindow(Window window)
{ {
if (!DropShadow(window))
[DllImport("dwmapi.dll", PreserveSig = true)]
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
[DllImport("dwmapi.dll")]
private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins pMarInset);
/// <summary>
/// Drops a standard shadow to a WPF Window, even if the window isborderless. Only works with DWM (Vista and Seven).
/// This method is much more efficient than setting AllowsTransparency to true and using the DropShadow effect,
/// as AllowsTransparency involves a huge permormance issue (hardware acceleration is turned off for all the window).
/// </summary>
/// <param name="window">Window to which the shadow will be applied</param>
public static void DropShadowToWindow(Window window)
{ {
if (!DropShadow(window)) window.SourceInitialized += window_SourceInitialized;
{
window.SourceInitialized += window_SourceInitialized;
}
} }
}
private static void window_SourceInitialized(object sender, EventArgs e) //fixed typo private static void window_SourceInitialized(object sender, EventArgs e) //fixed typo
{
Window window = (Window)sender;
DropShadow(window);
window.SourceInitialized -= window_SourceInitialized;
}
/// <summary>
/// The actual method that makes API calls to drop the shadow to the window
/// </summary>
/// <param name="window">Window to which the shadow will be applied</param>
/// <returns>True if the method succeeded, false if not</returns>
private static bool DropShadow(Window window)
{
try
{ {
Window window = (Window)sender; WindowInteropHelper helper = new WindowInteropHelper(window);
int val = 2;
int ret1 = DwmSetWindowAttribute(helper.Handle, 2, ref val, 4);
DropShadow(window); if (ret1 == 0)
window.SourceInitialized -= window_SourceInitialized;
}
/// <summary>
/// The actual method that makes API calls to drop the shadow to the window
/// </summary>
/// <param name="window">Window to which the shadow will be applied</param>
/// <returns>True if the method succeeded, false if not</returns>
private static bool DropShadow(Window window)
{
try
{ {
WindowInteropHelper helper = new WindowInteropHelper(window); Margins m = new Margins { Bottom = 0, Left = 0, Right = 0, Top = 0 };
int val = 2; int ret2 = DwmExtendFrameIntoClientArea(helper.Handle, ref m);
int ret1 = DwmSetWindowAttribute(helper.Handle, 2, ref val, 4); return ret2 == 0;
if (ret1 == 0)
{
Margins m = new Margins { Bottom = 0, Left = 0, Right = 0, Top = 0 };
int ret2 = DwmExtendFrameIntoClientArea(helper.Handle, ref m);
return ret2 == 0;
}
else
{
return false;
}
} }
catch (Exception) else
{ {
// Probably dwmapi.dll not found (incompatible OS)
return false; return false;
} }
} }
catch (Exception)
{
// Probably dwmapi.dll not found (incompatible OS)
return false;
}
} }
}
}

View file

@ -2,68 +2,67 @@
using System.IO; using System.IO;
using System.Net; using System.Net;
namespace Flow.Launcher.Helper namespace Flow.Launcher.Helper;
public class DataWebRequestFactory : IWebRequestCreate
{ {
public class DataWebRequestFactory : IWebRequestCreate class DataWebRequest : WebRequest
{ {
class DataWebRequest : WebRequest private readonly Uri _uri;
public DataWebRequest(Uri uri)
{ {
private readonly Uri m_uri; _uri = uri;
public DataWebRequest(Uri uri)
{
m_uri = uri;
}
public override WebResponse GetResponse()
{
return new DataWebResponse(m_uri);
}
} }
class DataWebResponse : WebResponse public override WebResponse GetResponse()
{ {
private readonly string m_contentType; return new DataWebResponse(_uri);
private readonly byte[] m_data;
public DataWebResponse(Uri uri)
{
string uriString = uri.AbsoluteUri;
int commaIndex = uriString.IndexOf(',');
var headers = uriString.Substring(0, commaIndex).Split(';');
m_contentType = headers[0];
string dataString = uriString.Substring(commaIndex + 1);
m_data = Convert.FromBase64String(dataString);
}
public override string ContentType
{
get { return m_contentType; }
set
{
throw new NotSupportedException();
}
}
public override long ContentLength
{
get { return m_data.Length; }
set
{
throw new NotSupportedException();
}
}
public override Stream GetResponseStream()
{
return new MemoryStream(m_data);
}
}
public WebRequest Create(Uri uri)
{
return new DataWebRequest(uri);
} }
} }
class DataWebResponse : WebResponse
{
private readonly string _contentType;
private readonly byte[] _data;
public DataWebResponse(Uri uri)
{
string uriString = uri.AbsoluteUri;
int commaIndex = uriString.IndexOf(',');
var headers = uriString.Substring(0, commaIndex).Split(';');
_contentType = headers[0];
string dataString = uriString.Substring(commaIndex + 1);
_data = Convert.FromBase64String(dataString);
}
public override string ContentType
{
get { return _contentType; }
set
{
throw new NotSupportedException();
}
}
public override long ContentLength
{
get { return _data.Length; }
set
{
throw new NotSupportedException();
}
}
public override Stream GetResponseStream()
{
return new MemoryStream(_data);
}
}
public WebRequest Create(Uri uri)
{
return new DataWebRequest(uri);
}
} }

View file

@ -4,45 +4,52 @@ using NLog;
using Flow.Launcher.Infrastructure; using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.Exception; using Flow.Launcher.Infrastructure.Exception;
namespace Flow.Launcher.Helper namespace Flow.Launcher.Helper;
public static class ErrorReporting
{ {
public static class ErrorReporting private static void Report(Exception e)
{ {
private static void Report(Exception e) var logger = LogManager.GetLogger("UnHandledException");
{ logger.Fatal(ExceptionFormatter.FormatExcpetion(e));
var logger = LogManager.GetLogger("UnHandledException"); var reportWindow = new ReportWindow(e);
logger.Fatal(ExceptionFormatter.FormatExcpetion(e)); reportWindow.Show();
var reportWindow = new ReportWindow(e); }
reportWindow.Show();
}
public static void UnhandledExceptionHandle(object sender, UnhandledExceptionEventArgs e) public static void UnhandledExceptionHandle(object sender, UnhandledExceptionEventArgs e)
{ {
//handle non-ui thread exceptions //handle non-ui thread exceptions
Report((Exception)e.ExceptionObject); Report((Exception)e.ExceptionObject);
} }
public static void DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) public static void DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{ {
//handle ui thread exceptions //handle ui thread exceptions
Report(e.Exception); Report(e.Exception);
//prevent application exist, so the user can copy prompted error info //prevent application exist, so the user can copy prompted error info
e.Handled = true; e.Handled = true;
} }
public static string RuntimeInfo()
{
var info = $"\nFlow Launcher version: {Constant.Version}" +
$"\nOS Version: {ExceptionFormatter.GetWindowsFullVersionFromRegistry()}" +
$"\nIntPtr Length: {IntPtr.Size}" +
$"\nx64: {Environment.Is64BitOperatingSystem}";
return info;
}
public static string DependenciesInfo() public static string RuntimeInfo()
{ {
var info = $"\nPython Path: {Constant.PythonPath}\nNode Path: {Constant.NodePath}"; var info =
return info; $"""
}
Flow Launcher version: {Constant.Version}
OS Version: {ExceptionFormatter.GetWindowsFullVersionFromRegistry()}
IntPtr Length: {IntPtr.Size}
x64: {Environment.Is64BitOperatingSystem}
""";
return info;
}
public static string DependenciesInfo()
{
var info = $"""
Python Path: {Constant.PythonPath}
Node Path: {Constant.NodePath}
""";
return info;
} }
} }

View file

@ -7,97 +7,96 @@ using Flow.Launcher.Core.Resource;
using System.Windows; using System.Windows;
using Flow.Launcher.ViewModel; using Flow.Launcher.ViewModel;
namespace Flow.Launcher.Helper namespace Flow.Launcher.Helper;
internal static class HotKeyMapper
{ {
internal static class HotKeyMapper private static Settings _settings;
private static MainViewModel _mainViewModel;
internal static void Initialize(MainViewModel mainVM)
{ {
private static Settings settings; _mainViewModel = mainVM;
private static MainViewModel mainViewModel; _settings = _mainViewModel.Settings;
internal static void Initialize(MainViewModel mainVM) SetHotkey(_settings.Hotkey, OnToggleHotkey);
LoadCustomPluginHotkey();
}
internal static void OnToggleHotkey(object sender, HotkeyEventArgs args)
{
if (!_mainViewModel.ShouldIgnoreHotkeys())
_mainViewModel.ToggleFlowLauncher();
}
private static void SetHotkey(string hotkeyStr, EventHandler<HotkeyEventArgs> action)
{
var hotkey = new HotkeyModel(hotkeyStr);
SetHotkey(hotkey, action);
}
internal static void SetHotkey(HotkeyModel hotkey, EventHandler<HotkeyEventArgs> action)
{
string hotkeyStr = hotkey.ToString();
try
{ {
mainViewModel = mainVM; HotkeyManager.Current.AddOrReplace(hotkeyStr, hotkey.CharKey, hotkey.ModifierKeys, action);
settings = mainViewModel.Settings;
SetHotkey(settings.Hotkey, OnToggleHotkey);
LoadCustomPluginHotkey();
} }
catch (Exception)
internal static void OnToggleHotkey(object sender, HotkeyEventArgs args)
{ {
if (!mainViewModel.ShouldIgnoreHotkeys()) string errorMsg = string.Format(InternationalizationManager.Instance.GetTranslation("registerHotkeyFailed"), hotkeyStr);
mainViewModel.ToggleFlowLauncher(); string errorMsgTitle = InternationalizationManager.Instance.GetTranslation("MessageBoxTitle");
} MessageBox.Show(errorMsg,errorMsgTitle);
private static void SetHotkey(string hotkeyStr, EventHandler<HotkeyEventArgs> action)
{
var hotkey = new HotkeyModel(hotkeyStr);
SetHotkey(hotkey, action);
}
internal static void SetHotkey(HotkeyModel hotkey, EventHandler<HotkeyEventArgs> action)
{
string hotkeyStr = hotkey.ToString();
try
{
HotkeyManager.Current.AddOrReplace(hotkeyStr, hotkey.CharKey, hotkey.ModifierKeys, action);
}
catch (Exception)
{
string errorMsg = string.Format(InternationalizationManager.Instance.GetTranslation("registerHotkeyFailed"), hotkeyStr);
string errorMsgTitle = InternationalizationManager.Instance.GetTranslation("MessageBoxTitle");
MessageBox.Show(errorMsg,errorMsgTitle);
}
}
internal static void RemoveHotkey(string hotkeyStr)
{
if (!string.IsNullOrEmpty(hotkeyStr))
{
HotkeyManager.Current.Remove(hotkeyStr);
}
}
internal static void LoadCustomPluginHotkey()
{
if (settings.CustomPluginHotkeys == null)
return;
foreach (CustomPluginHotkey hotkey in settings.CustomPluginHotkeys)
{
SetCustomQueryHotkey(hotkey);
}
}
internal static void SetCustomQueryHotkey(CustomPluginHotkey hotkey)
{
SetHotkey(hotkey.Hotkey, (s, e) =>
{
if (mainViewModel.ShouldIgnoreHotkeys())
return;
mainViewModel.Show();
mainViewModel.ChangeQueryText(hotkey.ActionKeyword, true);
});
}
internal static bool CheckAvailability(HotkeyModel currentHotkey)
{
try
{
HotkeyManager.Current.AddOrReplace("HotkeyAvailabilityTest", currentHotkey.CharKey, currentHotkey.ModifierKeys, (sender, e) => { });
return true;
}
catch
{
}
finally
{
HotkeyManager.Current.Remove("HotkeyAvailabilityTest");
}
return false;
} }
} }
internal static void RemoveHotkey(string hotkeyStr)
{
if (!string.IsNullOrEmpty(hotkeyStr))
{
HotkeyManager.Current.Remove(hotkeyStr);
}
}
internal static void LoadCustomPluginHotkey()
{
if (_settings.CustomPluginHotkeys == null)
return;
foreach (CustomPluginHotkey hotkey in _settings.CustomPluginHotkeys)
{
SetCustomQueryHotkey(hotkey);
}
}
internal static void SetCustomQueryHotkey(CustomPluginHotkey hotkey)
{
SetHotkey(hotkey.Hotkey, (s, e) =>
{
if (_mainViewModel.ShouldIgnoreHotkeys())
return;
_mainViewModel.Show();
_mainViewModel.ChangeQueryText(hotkey.ActionKeyword, true);
});
}
internal static bool CheckAvailability(HotkeyModel currentHotkey)
{
try
{
HotkeyManager.Current.AddOrReplace("HotkeyAvailabilityTest", currentHotkey.CharKey, currentHotkey.ModifierKeys, (sender, e) => { });
return true;
}
catch
{
}
finally
{
HotkeyManager.Current.Remove("HotkeyAvailabilityTest");
}
return false;
}
} }

View file

@ -2,27 +2,26 @@
using System.Linq; using System.Linq;
using System.Windows; using System.Windows;
namespace Flow.Launcher.Helper namespace Flow.Launcher.Helper;
{
public static class SingletonWindowOpener
{
public static T Open<T>(params object[] args) where T : Window
{
var window = Application.Current.Windows.OfType<Window>().FirstOrDefault(x => x.GetType() == typeof(T))
?? (T)Activator.CreateInstance(typeof(T), args);
// Fix UI bug
// Add `window.WindowState = WindowState.Normal`
// If only use `window.Show()`, Settings-window doesn't show when minimized in taskbar
// Not sure why this works tho
// Probably because, when `.Show()` fails, `window.WindowState == Minimized` (not `Normal`)
// https://stackoverflow.com/a/59719760/4230390
window.WindowState = WindowState.Normal;
window.Show();
window.Focus();
return (T)window; public static class SingletonWindowOpener
} {
public static T Open<T>(params object[] args) where T : Window
{
var window = Application.Current.Windows.OfType<Window>().FirstOrDefault(x => x.GetType() == typeof(T))
?? (T)Activator.CreateInstance(typeof(T), args);
// Fix UI bug
// Add `window.WindowState = WindowState.Normal`
// If only use `window.Show()`, Settings-window doesn't show when minimized in taskbar
// Not sure why this works tho
// Probably because, when `.Show()` fails, `window.WindowState == Minimized` (not `Normal`)
// https://stackoverflow.com/a/59719760/4230390
window.WindowState = WindowState.Normal;
window.Show();
window.Focus();
return (T)window;
} }
} }

View file

@ -1,24 +1,23 @@
using System; using System;
namespace Flow.Launcher.Helper namespace Flow.Launcher.Helper;
{
public static class SyntaxSugars
{
public static TResult CallOrRescueDefault<TResult>(Func<TResult> callback)
{
return CallOrRescueDefault(callback, default(TResult));
}
public static TResult CallOrRescueDefault<TResult>(Func<TResult> callback, TResult def) public static class SyntaxSugars
{
public static TResult CallOrRescueDefault<TResult>(Func<TResult> callback)
{
return CallOrRescueDefault(callback, default(TResult));
}
public static TResult CallOrRescueDefault<TResult>(Func<TResult> callback, TResult def)
{
try
{ {
try return callback();
{ }
return callback(); catch
} {
catch return def;
{
return def;
}
} }
} }
} }

View file

@ -5,44 +5,43 @@ using System.Text;
using System.Windows.Media; using System.Windows.Media;
using Microsoft.Win32; using Microsoft.Win32;
namespace Flow.Launcher.Helper namespace Flow.Launcher.Helper;
public static class WallpaperPathRetrieval
{ {
public static class WallpaperPathRetrieval [DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern Int32 SystemParametersInfo(UInt32 action,
Int32 uParam, StringBuilder vParam, UInt32 winIni);
private static readonly UInt32 SPI_GETDESKWALLPAPER = 0x73;
private static int MAX_PATH = 260;
public static string GetWallpaperPath()
{ {
[DllImport("user32.dll", CharSet = CharSet.Unicode)] var wallpaper = new StringBuilder(MAX_PATH);
private static extern Int32 SystemParametersInfo(UInt32 action, SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, wallpaper, 0);
Int32 uParam, StringBuilder vParam, UInt32 winIni);
private static readonly UInt32 SPI_GETDESKWALLPAPER = 0x73;
private static int MAX_PATH = 260;
public static string GetWallpaperPath() var str = wallpaper.ToString();
if (string.IsNullOrEmpty(str))
return null;
return str;
}
public static Color GetWallpaperColor()
{
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Colors", true);
var result = key?.GetValue("Background", null);
if (result is string strResult)
{ {
var wallpaper = new StringBuilder(MAX_PATH); try
SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, wallpaper, 0); {
var parts = strResult.Trim().Split(new[] {' '}, 3).Select(byte.Parse).ToList();
var str = wallpaper.ToString(); return Color.FromRgb(parts[0], parts[1], parts[2]);
if (string.IsNullOrEmpty(str)) }
return null; catch
return str;
}
public static Color GetWallpaperColor()
{
RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Colors", true);
var result = key.GetValue(@"Background", null);
if (result != null && result is string)
{ {
try
{
var parts = result.ToString().Trim().Split(new[] {' '}, 3).Select(byte.Parse).ToList();
return Color.FromRgb(parts[0], parts[1], parts[2]);
}
catch
{
}
} }
return Colors.Transparent;
} }
return Colors.Transparent;
} }
} }

View file

@ -8,156 +8,152 @@ using System.Windows.Interop;
using System.Windows.Media; using System.Windows.Media;
using Point = System.Windows.Point; using Point = System.Windows.Point;
namespace Flow.Launcher.Helper namespace Flow.Launcher.Helper;
public class WindowsInteropHelper
{ {
public class WindowsInteropHelper private const int GWL_STYLE = -16; //WPF's Message code for Title Bar's Style
private const int WS_SYSMENU = 0x80000; //WPF's Message code for System Menu
private static IntPtr _hwnd_shell;
private static IntPtr _hwnd_desktop;
//Accessors for shell and desktop handlers
//Will set the variables once and then will return them
private static IntPtr HWND_SHELL
{ {
private const int GWL_STYLE = -16; //WPF's Message code for Title Bar's Style get
private const int WS_SYSMENU = 0x80000; //WPF's Message code for System Menu
private static IntPtr _hwnd_shell;
private static IntPtr _hwnd_desktop;
//Accessors for shell and desktop handlers
//Will set the variables once and then will return them
private static IntPtr HWND_SHELL
{ {
get return _hwnd_shell != IntPtr.Zero ? _hwnd_shell : _hwnd_shell = GetShellWindow();
{
return _hwnd_shell != IntPtr.Zero ? _hwnd_shell : _hwnd_shell = GetShellWindow();
}
} }
private static IntPtr HWND_DESKTOP }
private static IntPtr HWND_DESKTOP
{
get
{ {
get return _hwnd_desktop != IntPtr.Zero ? _hwnd_desktop : _hwnd_desktop = GetDesktopWindow();
{
return _hwnd_desktop != IntPtr.Zero ? _hwnd_desktop : _hwnd_desktop = GetDesktopWindow();
}
} }
}
[DllImport("user32.dll", SetLastError = true)] [DllImport("user32.dll", SetLastError = true)]
internal static extern int GetWindowLong(IntPtr hWnd, int nIndex); internal static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")] [DllImport("user32.dll")]
internal static extern IntPtr GetForegroundWindow(); internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")] [DllImport("user32.dll")]
internal static extern IntPtr GetDesktopWindow(); internal static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")] [DllImport("user32.dll")]
internal static extern IntPtr GetShellWindow(); internal static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll", SetLastError = true)] [DllImport("user32.dll")]
internal static extern int GetWindowRect(IntPtr hwnd, out RECT rc); internal static extern IntPtr GetShellWindow();
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] [DllImport("user32.dll", SetLastError = true)]
internal static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); internal static extern int GetWindowRect(IntPtr hwnd, out RECT rc);
[DllImport("user32.DLL")] [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); internal static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
[DllImport("user32.DLL")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
const string WINDOW_CLASS_CONSOLE = "ConsoleWindowClass"; const string WINDOW_CLASS_CONSOLE = "ConsoleWindowClass";
const string WINDOW_CLASS_WINTAB = "Flip3D"; const string WINDOW_CLASS_WINTAB = "Flip3D";
const string WINDOW_CLASS_PROGMAN = "Progman"; const string WINDOW_CLASS_PROGMAN = "Progman";
const string WINDOW_CLASS_WORKERW = "WorkerW"; const string WINDOW_CLASS_WORKERW = "WorkerW";
public static bool IsWindowFullscreen() public static bool IsWindowFullscreen()
{
//get current active window
IntPtr hWnd = GetForegroundWindow();
if (hWnd.Equals(IntPtr.Zero))
{ {
//get current active window
IntPtr hWnd = GetForegroundWindow();
if (!hWnd.Equals(IntPtr.Zero))
{
//if current active window is NOT desktop or shell
if (!(hWnd.Equals(HWND_DESKTOP) || hWnd.Equals(HWND_SHELL)))
{
StringBuilder sb = new StringBuilder(256);
GetClassName(hWnd, sb, sb.Capacity);
string windowClass = sb.ToString();
//for Win+Tab (Flip3D)
if (windowClass == WINDOW_CLASS_WINTAB)
{
return false;
}
RECT appBounds;
GetWindowRect(hWnd, out appBounds);
//for console (ConsoleWindowClass), we have to check for negative dimensions
if (windowClass == WINDOW_CLASS_CONSOLE)
{
return appBounds.Top < 0 && appBounds.Bottom < 0;
}
//for desktop (Progman or WorkerW, depends on the system), we have to check
if (windowClass == WINDOW_CLASS_PROGMAN || windowClass == WINDOW_CLASS_WORKERW)
{
IntPtr hWndDesktop = FindWindowEx(hWnd, IntPtr.Zero, "SHELLDLL_DefView", null);
hWndDesktop = FindWindowEx(hWndDesktop, IntPtr.Zero, "SysListView32", "FolderView");
if (!hWndDesktop.Equals(IntPtr.Zero))
{
return false;
}
}
Rectangle screenBounds = Screen.FromHandle(hWnd).Bounds;
if ((appBounds.Bottom - appBounds.Top) == screenBounds.Height && (appBounds.Right - appBounds.Left) == screenBounds.Width)
{
return true;
}
}
}
return false; return false;
} }
/// <summary> //if current active window is desktop or shell, exit early
/// disable windows toolbar's control box if (hWnd.Equals(HWND_DESKTOP) || hWnd.Equals(HWND_SHELL))
/// this will also disable system menu with Alt+Space hotkey
/// </summary>
public static void DisableControlBox(Window win)
{ {
var hwnd = new WindowInteropHelper(win).Handle; return false;
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
} }
/// <summary> StringBuilder sb = new StringBuilder(256);
/// Transforms pixels to Device Independent Pixels used by WPF GetClassName(hWnd, sb, sb.Capacity);
/// </summary> string windowClass = sb.ToString();
/// <param name="visual">current window, required to get presentation source</param>
/// <param name="unitX">horizontal position in pixels</param> //for Win+Tab (Flip3D)
/// <param name="unitY">vertical position in pixels</param> if (windowClass == WINDOW_CLASS_WINTAB)
/// <returns>point containing device independent pixels</returns>
public static Point TransformPixelsToDIP(Visual visual, double unitX, double unitY)
{ {
Matrix matrix; return false;
var source = PresentationSource.FromVisual(visual); }
if (source != null)
RECT appBounds;
GetWindowRect(hWnd, out appBounds);
//for console (ConsoleWindowClass), we have to check for negative dimensions
if (windowClass == WINDOW_CLASS_CONSOLE)
{
return appBounds.Top < 0 && appBounds.Bottom < 0;
}
//for desktop (Progman or WorkerW, depends on the system), we have to check
if (windowClass is WINDOW_CLASS_PROGMAN or WINDOW_CLASS_WORKERW)
{
IntPtr hWndDesktop = FindWindowEx(hWnd, IntPtr.Zero, "SHELLDLL_DefView", null);
hWndDesktop = FindWindowEx(hWndDesktop, IntPtr.Zero, "SysListView32", "FolderView");
if (!hWndDesktop.Equals(IntPtr.Zero))
{ {
matrix = source.CompositionTarget.TransformFromDevice; return false;
} }
else
{
using (var src = new HwndSource(new HwndSourceParameters()))
{
matrix = src.CompositionTarget.TransformFromDevice;
}
}
return new Point((int)(matrix.M11 * unitX), (int)(matrix.M22 * unitY));
} }
Rectangle screenBounds = Screen.FromHandle(hWnd).Bounds;
return (appBounds.Bottom - appBounds.Top) == screenBounds.Height && (appBounds.Right - appBounds.Left) == screenBounds.Width;
}
[StructLayout(LayoutKind.Sequential)] /// <summary>
public struct RECT /// disable windows toolbar's control box
/// this will also disable system menu with Alt+Space hotkey
/// </summary>
public static void DisableControlBox(Window win)
{
var hwnd = new WindowInteropHelper(win).Handle;
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
}
/// <summary>
/// Transforms pixels to Device Independent Pixels used by WPF
/// </summary>
/// <param name="visual">current window, required to get presentation source</param>
/// <param name="unitX">horizontal position in pixels</param>
/// <param name="unitY">vertical position in pixels</param>
/// <returns>point containing device independent pixels</returns>
public static Point TransformPixelsToDIP(Visual visual, double unitX, double unitY)
{
Matrix matrix;
var source = PresentationSource.FromVisual(visual);
if (source is not null)
{ {
public int Left; matrix = source.CompositionTarget.TransformFromDevice;
public int Top;
public int Right;
public int Bottom;
} }
else
{
using var src = new HwndSource(new HwndSourceParameters());
matrix = src.CompositionTarget.TransformFromDevice;
}
return new Point((int)(matrix.M11 * unitX), (int)(matrix.M22 * unitY));
}
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
} }
} }

View file

@ -0,0 +1,11 @@
using Microsoft.Win32;
namespace Flow.Launcher.Helper;
internal static class WindowsMediaPlayerHelper
{
internal static bool IsWindowsMediaPlayerInstalled()
{
using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\MediaPlayer");
return key.GetValue("Installation Directory") != null;
}
}

View file

@ -3,54 +3,75 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:input="clr-namespace:System.Windows.Input;assembly=PresentationCore"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Height="24"
d:DesignHeight="300"
d:DesignWidth="300"
mc:Ignorable="d"> mc:Ignorable="d">
<Grid> <Button
<Grid.ColumnDefinitions> Width="Auto"
<ColumnDefinition Width="200" /> FontSize="13"
</Grid.ColumnDefinitions> FontWeight="Bold"
<Popup Foreground="{DynamicResource Color01B}"
x:Name="popup" Click="GetNewHotkey">
AllowDrop="True" <Button.Template>
AllowsTransparency="True" <ControlTemplate TargetType="Button">
IsOpen="{Binding IsKeyboardFocused, ElementName=tbHotkey, Mode=OneWay}" <Border
Placement="Top" x:Name="ButtonBorder"
PlacementTarget="{Binding ElementName=tbHotkey}" Padding="5,0,5,0"
PopupAnimation="Fade" Background="{DynamicResource ButtonBackgroundColor}"
StaysOpen="True" BorderBrush="{DynamicResource ButtonInsideBorder}"
VerticalOffset="-5"> BorderThickness="1"
<Border CornerRadius="5">
Width="140" <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
Height="30" </Border>
Background="{DynamicResource Color01B}" <ControlTemplate.Triggers>
BorderBrush="{DynamicResource Color21B}" <MultiTrigger>
BorderThickness="1" <MultiTrigger.Conditions>
CornerRadius="4"> <Condition Property="IsMouseOver" Value="True" />
<TextBlock <Condition Property="IsPressed" Value="True" />
x:Name="tbMsg" </MultiTrigger.Conditions>
Margin="0,0,0,0" <Setter TargetName="ButtonBorder" Property="Background"
HorizontalAlignment="Center" Value="{DynamicResource ButtonMousePressed}" />
VerticalAlignment="Center" <Setter TargetName="ButtonBorder" Property="BorderBrush"
FontSize="13" Value="{DynamicResource ButtonMousePressedInsideBorder}" />
FontWeight="SemiBold" </MultiTrigger>
Foreground="{DynamicResource Color05B}" <MultiTrigger>
Text="{DynamicResource flowlauncherPressHotkey}" <MultiTrigger.Conditions>
Visibility="Visible" /> <Condition Property="IsMouseOver" Value="True" />
</Border> </MultiTrigger.Conditions>
</Popup> <Setter TargetName="ButtonBorder" Property="Background"
Value="{DynamicResource ButtonMouseOver}" />
<TextBox </MultiTrigger>
x:Name="tbHotkey" <MultiTrigger>
Margin="0,0,18,0" <MultiTrigger.Conditions>
VerticalContentAlignment="Center" <Condition Property="IsPressed" Value="True" />
input:InputMethod.IsInputMethodEnabled="False" </MultiTrigger.Conditions>
GotFocus="tbHotkey_GotFocus" <Setter TargetName="ButtonBorder" Property="Background"
LostFocus="tbHotkey_LostFocus" Value="{DynamicResource ButtonMousePressed}" />
PreviewKeyDown="TbHotkey_OnPreviewKeyDown" <Setter TargetName="ButtonBorder" Property="BorderBrush"
TabIndex="100" /> Value="{DynamicResource CustomContextHover}" />
</Grid> </MultiTrigger>
</UserControl> </ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
<Button.Content>
<ItemsControl x:Name="HotkeyList">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border
Margin="2,5,2,5"
Padding="10,5,10,5"
Background="{DynamicResource AccentButtonBackground}"
BorderThickness="1"
CornerRadius="5">
<TextBlock Text="{Binding}" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Button.Content>
</Button>
</UserControl>

View file

@ -1,141 +1,204 @@
using System; #nullable enable
using System.Collections.ObjectModel;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media;
using Flow.Launcher.Core.Resource; using Flow.Launcher.Core.Resource;
using Flow.Launcher.Helper; using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure.Hotkey; using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Plugin;
using System.Threading;
namespace Flow.Launcher namespace Flow.Launcher
{ {
public partial class HotkeyControl : UserControl public partial class HotkeyControl
{ {
public HotkeyModel CurrentHotkey { get; private set; } public IHotkeySettings HotkeySettings {
public bool CurrentHotkeyAvailable { get; private set; } get { return (IHotkeySettings)GetValue(HotkeySettingsProperty); }
set { SetValue(HotkeySettingsProperty, value); }
}
public event EventHandler HotkeyChanged; public static readonly DependencyProperty HotkeySettingsProperty = DependencyProperty.Register(
nameof(HotkeySettings),
typeof(IHotkeySettings),
typeof(HotkeyControl),
new PropertyMetadata()
);
public string WindowTitle {
get { return (string)GetValue(WindowTitleProperty); }
set { SetValue(WindowTitleProperty, value); }
}
public static readonly DependencyProperty WindowTitleProperty = DependencyProperty.Register(
nameof(WindowTitle),
typeof(string),
typeof(HotkeyControl),
new PropertyMetadata(string.Empty)
);
/// <summary> /// <summary>
/// Designed for Preview Hotkey and KeyGesture. /// Designed for Preview Hotkey and KeyGesture.
/// </summary> /// </summary>
public bool ValidateKeyGesture { get; set; } = false; public static readonly DependencyProperty ValidateKeyGestureProperty = DependencyProperty.Register(
nameof(ValidateKeyGesture),
typeof(bool),
typeof(HotkeyControl),
new PropertyMetadata(default(bool))
);
protected virtual void OnHotkeyChanged() => HotkeyChanged?.Invoke(this, EventArgs.Empty); public bool ValidateKeyGesture
public HotkeyControl()
{ {
InitializeComponent(); get { return (bool)GetValue(ValidateKeyGestureProperty); }
set { SetValue(ValidateKeyGestureProperty, value); }
} }
private CancellationTokenSource hotkeyUpdateSource; public static readonly DependencyProperty DefaultHotkeyProperty = DependencyProperty.Register(
nameof(DefaultHotkey),
typeof(string),
typeof(HotkeyControl),
new PropertyMetadata(default(string))
);
private void TbHotkey_OnPreviewKeyDown(object sender, KeyEventArgs e) public string DefaultHotkey
{ {
hotkeyUpdateSource?.Cancel(); get { return (string)GetValue(DefaultHotkeyProperty); }
hotkeyUpdateSource?.Dispose(); set { SetValue(DefaultHotkeyProperty, value); }
hotkeyUpdateSource = new(); }
var token = hotkeyUpdateSource.Token;
e.Handled = true;
//when alt is pressed, the real key should be e.SystemKey private static void OnHotkeyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
Key key = e.Key == Key.System ? e.SystemKey : e.Key; {
if (d is not HotkeyControl hotkeyControl)
SpecialKeyState specialKeyState = GlobalHotkey.CheckModifiers();
var hotkeyModel = new HotkeyModel(
specialKeyState.AltPressed,
specialKeyState.ShiftPressed,
specialKeyState.WinPressed,
specialKeyState.CtrlPressed,
key);
if (hotkeyModel.Equals(CurrentHotkey))
{ {
return; return;
} }
_ = Dispatcher.InvokeAsync(async () => hotkeyControl.SetKeysToDisplay(new HotkeyModel(hotkeyControl.Hotkey));
{ hotkeyControl.CurrentHotkey = new HotkeyModel(hotkeyControl.Hotkey);
await Task.Delay(500, token);
if (!token.IsCancellationRequested)
await SetHotkeyAsync(hotkeyModel);
});
} }
public async Task SetHotkeyAsync(HotkeyModel keyModel, bool triggerValidate = true)
{
tbHotkey.Text = keyModel.ToString();
tbHotkey.Select(tbHotkey.Text.Length, 0);
public static readonly DependencyProperty ChangeHotkeyProperty = DependencyProperty.Register(
nameof(ChangeHotkey),
typeof(ICommand),
typeof(HotkeyControl),
new PropertyMetadata(default(ICommand))
);
public ICommand? ChangeHotkey
{
get { return (ICommand)GetValue(ChangeHotkeyProperty); }
set { SetValue(ChangeHotkeyProperty, value); }
}
public static readonly DependencyProperty HotkeyProperty = DependencyProperty.Register(
nameof(Hotkey),
typeof(string),
typeof(HotkeyControl),
new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnHotkeyChanged)
);
public string Hotkey
{
get { return (string)GetValue(HotkeyProperty); }
set { SetValue(HotkeyProperty, value); }
}
public HotkeyControl()
{
InitializeComponent();
HotkeyList.ItemsSource = KeysToDisplay;
SetKeysToDisplay(CurrentHotkey);
}
private static bool CheckHotkeyAvailability(HotkeyModel hotkey, bool validateKeyGesture) =>
hotkey.Validate(validateKeyGesture) && HotKeyMapper.CheckAvailability(hotkey);
public string EmptyHotkey => InternationalizationManager.Instance.GetTranslation("none");
public ObservableCollection<string> KeysToDisplay { get; set; } = new();
public HotkeyModel CurrentHotkey { get; private set; } = new(false, false, false, false, Key.None);
public void GetNewHotkey(object sender, RoutedEventArgs e)
{
OpenHotkeyDialog();
}
private async Task OpenHotkeyDialog()
{
if (!string.IsNullOrEmpty(Hotkey))
{
HotKeyMapper.RemoveHotkey(Hotkey);
}
var dialog = new HotkeyControlDialog(Hotkey, DefaultHotkey, HotkeySettings, WindowTitle);
await dialog.ShowAsync();
switch (dialog.ResultType)
{
case HotkeyControlDialog.EResultType.Cancel:
SetHotkey(Hotkey);
return;
case HotkeyControlDialog.EResultType.Save:
SetHotkey(dialog.ResultValue);
break;
case HotkeyControlDialog.EResultType.Delete:
Delete();
break;
}
}
private void SetHotkey(HotkeyModel keyModel, bool triggerValidate = true)
{
if (triggerValidate) if (triggerValidate)
{ {
bool hotkeyAvailable = CheckHotkeyAvailability(keyModel, ValidateKeyGesture); bool hotkeyAvailable = CheckHotkeyAvailability(keyModel, ValidateKeyGesture);
CurrentHotkeyAvailable = hotkeyAvailable;
SetMessage(hotkeyAvailable);
OnHotkeyChanged();
var token = hotkeyUpdateSource.Token; if (!hotkeyAvailable)
await Task.Delay(500, token);
if (token.IsCancellationRequested)
return;
if (CurrentHotkeyAvailable)
{ {
CurrentHotkey = keyModel; return;
// To trigger LostFocus
FocusManager.SetFocusedElement(FocusManager.GetFocusScope(this), null);
Keyboard.ClearFocus();
} }
Hotkey = keyModel.ToString();
SetKeysToDisplay(CurrentHotkey);
ChangeHotkey?.Execute(keyModel);
} }
else else
{ {
CurrentHotkey = keyModel; Hotkey = keyModel.ToString();
ChangeHotkey?.Execute(keyModel);
} }
} }
public Task SetHotkeyAsync(string keyStr, bool triggerValidate = true) public void Delete()
{ {
return SetHotkeyAsync(new HotkeyModel(keyStr), triggerValidate); if (!string.IsNullOrEmpty(Hotkey))
HotKeyMapper.RemoveHotkey(Hotkey);
Hotkey = "";
SetKeysToDisplay(new HotkeyModel(false, false, false, false, Key.None));
} }
private static bool CheckHotkeyAvailability(HotkeyModel hotkey, bool validateKeyGesture) => hotkey.Validate(validateKeyGesture) && HotKeyMapper.CheckAvailability(hotkey); private void SetKeysToDisplay(HotkeyModel? hotkey)
public new bool IsFocused => tbHotkey.IsFocused;
private void tbHotkey_LostFocus(object sender, RoutedEventArgs e)
{ {
tbHotkey.Text = CurrentHotkey?.ToString() ?? ""; KeysToDisplay.Clear();
tbHotkey.Select(tbHotkey.Text.Length, 0);
}
private void tbHotkey_GotFocus(object sender, RoutedEventArgs e) if (hotkey == null || hotkey == default(HotkeyModel))
{
ResetMessage();
}
private void ResetMessage()
{
tbMsg.Text = InternationalizationManager.Instance.GetTranslation("flowlauncherPressHotkey");
tbMsg.SetResourceReference(TextBox.ForegroundProperty, "Color05B");
}
private void SetMessage(bool hotkeyAvailable)
{
if (!hotkeyAvailable)
{ {
tbMsg.Foreground = new SolidColorBrush(Colors.Red); KeysToDisplay.Add(EmptyHotkey);
tbMsg.Text = InternationalizationManager.Instance.GetTranslation("hotkeyUnavailable"); return;
} }
else
foreach (var key in hotkey.Value.EnumerateDisplayKeys()!)
{ {
tbMsg.Foreground = new SolidColorBrush(Colors.Green); KeysToDisplay.Add(key);
tbMsg.Text = InternationalizationManager.Instance.GetTranslation("success");
} }
tbMsg.Visibility = Visibility.Visible; }
public void SetHotkey(string? keyStr, bool triggerValidate = true)
{
SetHotkey(new HotkeyModel(keyStr), triggerValidate);
} }
} }
} }

View file

@ -0,0 +1,169 @@
<ui:ContentDialog
x:Class="Flow.Launcher.HotkeyControlDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="http://schemas.modernwpf.com/2019"
Background="{DynamicResource PopuBGColor}"
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
BorderThickness="0,1,0,0"
CornerRadius="8"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Foreground="{DynamicResource PopupTextColor}"
PreviewKeyDown="OnPreviewKeyDown"
Style="{DynamicResource ContentDialog}">
<ui:ContentDialog.Resources>
<Thickness x:Key="ContentDialogPadding">0</Thickness>
<Thickness x:Key="ContentDialogTitleMargin">0</Thickness>
</ui:ContentDialog.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="100" />
<RowDefinition Height="80" />
</Grid.RowDefinitions>
<!-- Window title and the keys in the hotkey -->
<Grid Grid.Row="0" Margin="26,12,26,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel>
<TextBlock
Margin="0,0,0,0"
FontSize="20"
FontWeight="SemiBold"
Text="{Binding WindowTitle}"
TextAlignment="Left" />
<TextBlock FontSize="14" Text="{DynamicResource hotkeyRegGuide}" />
</StackPanel>
<Border
Grid.Row="1"
Width="450"
Height="100"
Margin="0,100,0,0"
Padding="26,12,26,0">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<ItemsControl ItemsSource="{Binding KeysToDisplay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border
MinWidth="50"
MinHeight="50"
Margin="5,0,5,0"
Padding="8"
Background="{DynamicResource AccentButtonBackground}"
CornerRadius="6">
<TextBlock
Margin="5,0,5,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="18"
FontWeight="Bold"
Foreground="{DynamicResource Color01B}"
Text="{Binding}" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Border>
</Grid>
<!-- Warning message for when something went wrong with the new hotkey. -->
<Border Grid.Row="1">
<Border
x:Name="Alert"
Width="420"
Padding="0, 10"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Background="{DynamicResource InfoBarWarningBG}"
BorderBrush="{DynamicResource InfoBarBD}"
BorderThickness="1"
CornerRadius="5"
Visibility="Collapsed">
<Grid VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ui:FontIcon
Grid.Column="0"
Margin="20,0,14,0"
VerticalAlignment="Center"
FontSize="15"
Foreground="{DynamicResource InfoBarWarningIcon}"
Glyph="&#xf167;" />
<TextBlock
Grid.Column="1"
x:Name="tbMsg"
Margin="0,0,0,2"
Padding="0,0,8,0"
HorizontalAlignment="Left"
FontSize="13"
FontWeight="SemiBold"
TextWrapping="Wrap"
Foreground="{DynamicResource Color05B}" />
</Grid>
</Border>
</Border>
<!-- Action buttons at the bottom of the dialog -->
<Border
Grid.Row="2"
Background="{DynamicResource PopupButtonAreaBGColor}"
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
BorderThickness="0,1,0,0"
CornerRadius="0 0 8 8">
<StackPanel
Margin="10"
HorizontalAlignment="Center"
Orientation="Horizontal">
<Button
x:Name="OverwriteBtn"
Height="30"
MinWidth="100"
Margin="0,0,4,0"
Click="Overwrite"
Content="{DynamicResource commonOverwrite}"
Visibility="Collapsed"
Style="{StaticResource AccentButtonStyle}" />
<Button
x:Name="SaveBtn"
Height="30"
MinWidth="100"
Margin="0,0,4,0"
Click="Save"
Content="{DynamicResource commonSave}"
Style="{StaticResource AccentButtonStyle}" />
<Button
Height="30"
MinWidth="100"
Margin="4,0,4,0"
Click="Reset"
Content="{DynamicResource commonReset}" />
<Button
Height="30"
MinWidth="100"
Margin="4,0,4,0"
Click="Delete"
Content="{DynamicResource commonDelete}" />
<Button
Height="30"
MinWidth="100"
Margin="4,0,0,0"
Click="Cancel"
Content="{DynamicResource commonCancel}" />
</StackPanel>
</Border>
</Grid>
</ui:ContentDialog>

View file

@ -0,0 +1,179 @@
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using Flow.Launcher.Core.Resource;
using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Plugin;
using ModernWpf.Controls;
namespace Flow.Launcher;
#nullable enable
public partial class HotkeyControlDialog : ContentDialog
{
private IHotkeySettings _hotkeySettings;
private Action? _overwriteOtherHotkey;
private string DefaultHotkey { get; }
public string WindowTitle { get; }
public HotkeyModel CurrentHotkey { get; private set; }
public ObservableCollection<string> KeysToDisplay { get; } = new();
public enum EResultType
{
Cancel,
Save,
Delete
}
public EResultType ResultType { get; private set; } = EResultType.Cancel;
public string ResultValue { get; private set; } = string.Empty;
public static string EmptyHotkey => InternationalizationManager.Instance.GetTranslation("none");
public HotkeyControlDialog(string hotkey, string defaultHotkey, IHotkeySettings hotkeySettings, string windowTitle = "")
{
WindowTitle = windowTitle switch
{
"" or null => InternationalizationManager.Instance.GetTranslation("hotkeyRegTitle"),
_ => windowTitle
};
DefaultHotkey = defaultHotkey;
CurrentHotkey = new HotkeyModel(hotkey);
_hotkeySettings = hotkeySettings;
SetKeysToDisplay(CurrentHotkey);
InitializeComponent();
}
private void Reset(object sender, RoutedEventArgs routedEventArgs)
{
SetKeysToDisplay(new HotkeyModel(DefaultHotkey));
}
private void Delete(object sender, RoutedEventArgs routedEventArgs)
{
KeysToDisplay.Clear();
KeysToDisplay.Add(EmptyHotkey);
}
private void Cancel(object sender, RoutedEventArgs routedEventArgs)
{
ResultType = EResultType.Cancel;
Hide();
}
private void Save(object sender, RoutedEventArgs routedEventArgs)
{
if (KeysToDisplay.Count == 1 && KeysToDisplay[0] == EmptyHotkey)
{
ResultType = EResultType.Delete;
Hide();
return;
}
ResultType = EResultType.Save;
ResultValue = string.Join("+", KeysToDisplay);
Hide();
}
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
//when alt is pressed, the real key should be e.SystemKey
Key key = e.Key == Key.System ? e.SystemKey : e.Key;
SpecialKeyState specialKeyState = GlobalHotkey.CheckModifiers();
var hotkeyModel = new HotkeyModel(
specialKeyState.AltPressed,
specialKeyState.ShiftPressed,
specialKeyState.WinPressed,
specialKeyState.CtrlPressed,
key);
CurrentHotkey = hotkeyModel;
SetKeysToDisplay(CurrentHotkey);
}
private void SetKeysToDisplay(HotkeyModel? hotkey)
{
_overwriteOtherHotkey = null;
KeysToDisplay.Clear();
if (hotkey == null || hotkey == default(HotkeyModel))
{
KeysToDisplay.Add(EmptyHotkey);
return;
}
foreach (var key in hotkey.Value.EnumerateDisplayKeys()!)
{
KeysToDisplay.Add(key);
}
if (tbMsg == null)
return;
if (_hotkeySettings.RegisteredHotkeys.FirstOrDefault(v => v.Hotkey == hotkey) is { } registeredHotkeyData)
{
var description = string.Format(
InternationalizationManager.Instance.GetTranslation(registeredHotkeyData.DescriptionResourceKey),
registeredHotkeyData.DescriptionFormatVariables
);
Alert.Visibility = Visibility.Visible;
if (registeredHotkeyData.RemoveHotkey is not null)
{
tbMsg.Text = string.Format(
InternationalizationManager.Instance.GetTranslation("hotkeyUnavailableEditable"),
description
);
SaveBtn.IsEnabled = false;
SaveBtn.Visibility = Visibility.Collapsed;
OverwriteBtn.IsEnabled = true;
OverwriteBtn.Visibility = Visibility.Visible;
_overwriteOtherHotkey = registeredHotkeyData.RemoveHotkey;
}
else
{
tbMsg.Text = string.Format(
InternationalizationManager.Instance.GetTranslation("hotkeyUnavailableUneditable"),
description
);
SaveBtn.IsEnabled = false;
SaveBtn.Visibility = Visibility.Visible;
OverwriteBtn.IsEnabled = false;
OverwriteBtn.Visibility = Visibility.Collapsed;
}
return;
}
OverwriteBtn.IsEnabled = false;
OverwriteBtn.Visibility = Visibility.Collapsed;
if (!CheckHotkeyAvailability(hotkey.Value, true))
{
tbMsg.Text = InternationalizationManager.Instance.GetTranslation("hotkeyUnavailable");
Alert.Visibility = Visibility.Visible;
SaveBtn.IsEnabled = false;
SaveBtn.Visibility = Visibility.Visible;
}
else
{
Alert.Visibility = Visibility.Collapsed;
SaveBtn.IsEnabled = true;
SaveBtn.Visibility = Visibility.Visible;
}
}
private static bool CheckHotkeyAvailability(HotkeyModel hotkey, bool validateKeyGesture) =>
hotkey.Validate(validateKeyGesture) && HotKeyMapper.CheckAvailability(hotkey);
private void Overwrite(object sender, RoutedEventArgs e)
{
_overwriteOtherHotkey?.Invoke();
Save(sender, e);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 763 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Dark</system:String> <system:String x:Key="ColorSchemeDark">Dark</system:String>
<system:String x:Key="SoundEffect">Sound Effect</system:String> <system:String x:Key="SoundEffect">Sound Effect</system:String>
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String> <system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animation</system:String> <system:String x:Key="Animation">Animation</system:String>
<system:String x:Key="AnimationTip">Use Animation in UI</system:String> <system:String x:Key="AnimationTip">Use Animation in UI</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Tmavý</system:String> <system:String x:Key="ColorSchemeDark">Tmavý</system:String>
<system:String x:Key="SoundEffect">Zvukový efekt</system:String> <system:String x:Key="SoundEffect">Zvukový efekt</system:String>
<system:String x:Key="SoundEffectTip">Přehrát krátký zvuk při otevření okna vyhledávání</system:String> <system:String x:Key="SoundEffectTip">Přehrát krátký zvuk při otevření okna vyhledávání</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animace</system:String> <system:String x:Key="Animation">Animace</system:String>
<system:String x:Key="AnimationTip">Použít animaci v UI</system:String> <system:String x:Key="AnimationTip">Použít animaci v UI</system:String>
<system:String x:Key="AnimationSpeed">Rychlost animace</system:String> <system:String x:Key="AnimationSpeed">Rychlost animace</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Dark</system:String> <system:String x:Key="ColorSchemeDark">Dark</system:String>
<system:String x:Key="SoundEffect">Sound Effect</system:String> <system:String x:Key="SoundEffect">Sound Effect</system:String>
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String> <system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animation</system:String> <system:String x:Key="Animation">Animation</system:String>
<system:String x:Key="AnimationTip">Use Animation in UI</system:String> <system:String x:Key="AnimationTip">Use Animation in UI</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>

View file

@ -113,7 +113,7 @@
<system:String x:Key="pluginStore">Erweiterungen laden</system:String> <system:String x:Key="pluginStore">Erweiterungen laden</system:String>
<system:String x:Key="pluginStore_NewRelease">New Release</system:String> <system:String x:Key="pluginStore_NewRelease">New Release</system:String>
<system:String x:Key="pluginStore_RecentlyUpdated">Recently Updated</system:String> <system:String x:Key="pluginStore_RecentlyUpdated">Recently Updated</system:String>
<system:String x:Key="pluginStore_None">Plugins</system:String> <system:String x:Key="pluginStore_None">Erweiterungen</system:String>
<system:String x:Key="pluginStore_Installed">Installed</system:String> <system:String x:Key="pluginStore_Installed">Installed</system:String>
<system:String x:Key="refresh">Aktualisieren</system:String> <system:String x:Key="refresh">Aktualisieren</system:String>
<system:String x:Key="installbtn">Installieren</system:String> <system:String x:Key="installbtn">Installieren</system:String>
@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Dunkel</system:String> <system:String x:Key="ColorSchemeDark">Dunkel</system:String>
<system:String x:Key="SoundEffect">Soundeffekt</system:String> <system:String x:Key="SoundEffect">Soundeffekt</system:String>
<system:String x:Key="SoundEffectTip">Ton abspielen, wenn das Suchfenster geöffnet wird</system:String> <system:String x:Key="SoundEffectTip">Ton abspielen, wenn das Suchfenster geöffnet wird</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animation</system:String> <system:String x:Key="Animation">Animation</system:String>
<system:String x:Key="AnimationTip">Animationen in der Oberfläche verwenden</system:String> <system:String x:Key="AnimationTip">Animationen in der Oberfläche verwenden</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>
@ -173,13 +175,13 @@
<system:String x:Key="previewHotkey">Preview Hotkey</system:String> <system:String x:Key="previewHotkey">Preview Hotkey</system:String>
<system:String x:Key="previewHotkeyToolTip">Enter shortcut to show/hide preview in search window.</system:String> <system:String x:Key="previewHotkeyToolTip">Enter shortcut to show/hide preview in search window.</system:String>
<system:String x:Key="openResultModifiers">Öffnen Sie die Ergebnismodifikatoren</system:String> <system:String x:Key="openResultModifiers">Öffnen Sie die Ergebnismodifikatoren</system:String>
<system:String x:Key="openResultModifiersToolTip">Select a modifier key to open selected result via keyboard.</system:String> <system:String x:Key="openResultModifiersToolTip">Wählen Sie eine Modifikatortaste, um das ausgewählte Ergebnis über die Tastatur zu öffnen.</system:String>
<system:String x:Key="showOpenResultHotkey">Hotkey anzeigen</system:String> <system:String x:Key="showOpenResultHotkey">Hotkey anzeigen</system:String>
<system:String x:Key="showOpenResultHotkeyToolTip">Show result selection hotkey with results.</system:String> <system:String x:Key="showOpenResultHotkeyToolTip">Hotkey für die Ergebnisauswahl mit Ergebnissen anzeigen.</system:String>
<system:String x:Key="customQueryHotkey">Benutzerdefinierte Abfrage Tastenkombination</system:String> <system:String x:Key="customQueryHotkey">Benutzerdefinierte Abfrage Tastenkombination</system:String>
<system:String x:Key="customQueryShortcut">Custom Query Shortcut</system:String> <system:String x:Key="customQueryShortcut">Custom Query Shortcut</system:String>
<system:String x:Key="builtinShortcuts">Built-in Shortcut</system:String> <system:String x:Key="builtinShortcuts">Built-in Shortcut</system:String>
<system:String x:Key="customQuery">Query</system:String> <system:String x:Key="customQuery">Abfrage</system:String>
<system:String x:Key="customShortcut">Shortcut</system:String> <system:String x:Key="customShortcut">Shortcut</system:String>
<system:String x:Key="customShortcutExpansion">Expansion</system:String> <system:String x:Key="customShortcutExpansion">Expansion</system:String>
<system:String x:Key="builtinShortcutDescription">Beschreibung</system:String> <system:String x:Key="builtinShortcutDescription">Beschreibung</system:String>
@ -191,12 +193,12 @@
<system:String x:Key="deleteCustomShortcutWarning">Are you sure you want to delete shortcut: {0} with expansion {1}?</system:String> <system:String x:Key="deleteCustomShortcutWarning">Are you sure you want to delete shortcut: {0} with expansion {1}?</system:String>
<system:String x:Key="shortcut_clipboard_description">Get text from clipboard.</system:String> <system:String x:Key="shortcut_clipboard_description">Get text from clipboard.</system:String>
<system:String x:Key="shortcut_active_explorer_path">Get path from active explorer.</system:String> <system:String x:Key="shortcut_active_explorer_path">Get path from active explorer.</system:String>
<system:String x:Key="queryWindowShadowEffect">Query window shadow effect</system:String> <system:String x:Key="queryWindowShadowEffect">Schatteneffekt im Abfragefenster</system:String>
<system:String x:Key="shadowEffectCPUUsage">Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.</system:String> <system:String x:Key="shadowEffectCPUUsage">Der Schatteneffekt beansprucht die GPU stark. Nicht empfohlen, wenn die Leistung deines Computers begrenzt ist.</system:String>
<system:String x:Key="windowWidthSize">Window Width Size</system:String> <system:String x:Key="windowWidthSize">Fenstergröße Breite</system:String>
<system:String x:Key="windowWidthSizeToolTip">You can also quickly adjust this by using Ctrl+[ and Ctrl+].</system:String> <system:String x:Key="windowWidthSizeToolTip">You can also quickly adjust this by using Ctrl+[ and Ctrl+].</system:String>
<system:String x:Key="useGlyphUI">Use Segoe Fluent Icons</system:String> <system:String x:Key="useGlyphUI">Segoe Fluent Icons verwenden</system:String>
<system:String x:Key="useGlyphUIEffect">Use Segoe Fluent Icons for query results where supported</system:String> <system:String x:Key="useGlyphUIEffect">Segoe Fluent Icons für Abfrageergebnisse verwenden, sofern unterstützt</system:String>
<system:String x:Key="flowlauncherPressHotkey">Press Key</system:String> <system:String x:Key="flowlauncherPressHotkey">Press Key</system:String>
<!-- Setting Proxy --> <!-- Setting Proxy -->
@ -226,15 +228,15 @@
<system:String x:Key="checkUpdates">Nach Aktuallisierungen Suchen</system:String> <system:String x:Key="checkUpdates">Nach Aktuallisierungen Suchen</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String> <system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="newVersionTips">Eine neue Version ({0}) ist vorhanden. Bitte starten Sie Flow Launcher neu.</system:String> <system:String x:Key="newVersionTips">Eine neue Version ({0}) ist vorhanden. Bitte starten Sie Flow Launcher neu.</system:String>
<system:String x:Key="checkUpdatesFailed">Check updates failed, please check your connection and proxy settings to api.github.com.</system:String> <system:String x:Key="checkUpdatesFailed">Überprüfung der Updates fehlgeschlagen. Bitte überprüfen Sie Ihre Verbindungs- und Proxy-Einstellungen zu api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed"> <system:String x:Key="downloadUpdatesFailed">
Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com, Das Herunterladen von Updates ist fehlgeschlagen. Bitte überprüfen Sie Ihre Verbindungs- und Proxy-Einstellungen zu github-cloud.s3.amazonaws.com,
or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually. oder gehen Sie zu https://github.com/Flow-Launcher/Flow.Launcher/releases, um Updates manuell herunterzuladen.
</system:String> </system:String>
<system:String x:Key="releaseNotes">Versionshinweise</system:String> <system:String x:Key="releaseNotes">Versionshinweise</system:String>
<system:String x:Key="documentation">Usage Tips</system:String> <system:String x:Key="documentation">Verwendungshinweise</system:String>
<system:String x:Key="devtool">DevTools</system:String> <system:String x:Key="devtool">Entwicklerwerkzeuge</system:String>
<system:String x:Key="settingfolder">Setting Folder</system:String> <system:String x:Key="settingfolder">Einstellungsordner</system:String>
<system:String x:Key="logfolder">Protokoll-Verzeichnis</system:String> <system:String x:Key="logfolder">Protokoll-Verzeichnis</system:String>
<system:String x:Key="clearlogfolder">Protokolldateien leeren</system:String> <system:String x:Key="clearlogfolder">Protokolldateien leeren</system:String>
<system:String x:Key="clearlogfolderMessage">Sind Sie sicher, dass Sie alle Protokolle löschen möchten?</system:String> <system:String x:Key="clearlogfolderMessage">Sind Sie sicher, dass Sie alle Protokolle löschen möchten?</system:String>
@ -246,13 +248,13 @@
<system:String x:Key="fileManager_tips2">&quot;%f&quot; 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 &quot;Arg for File&quot; item. If the file manager does not have that function, you can use &quot;%d&quot;.</system:String> <system:String x:Key="fileManager_tips2">&quot;%f&quot; 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 &quot;Arg for File&quot; item. If the file manager does not have that function, you can use &quot;%d&quot;.</system:String>
<system:String x:Key="fileManager_name">Datei-Manager</system:String> <system:String x:Key="fileManager_name">Datei-Manager</system:String>
<system:String x:Key="fileManager_profile_name">Profilname</system:String> <system:String x:Key="fileManager_profile_name">Profilname</system:String>
<system:String x:Key="fileManager_path">File Manager Path</system:String> <system:String x:Key="fileManager_path">Dateimanager-Pfad</system:String>
<system:String x:Key="fileManager_directory_arg">Argumente für Ordner</system:String> <system:String x:Key="fileManager_directory_arg">Argumente für Ordner</system:String>
<system:String x:Key="fileManager_file_arg">Argumente für Datei</system:String> <system:String x:Key="fileManager_file_arg">Argumente für Datei</system:String>
<!-- DefaultBrowser Setting Dialog --> <!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Standard-Webbrowser</system:String> <system:String x:Key="defaultBrowserTitle">Standard-Webbrowser</system:String>
<system:String x:Key="defaultBrowser_tips">The default setting follows the OS default browser setting. If specified separately, flow uses that browser.</system:String> <system:String x:Key="defaultBrowser_tips">Die Standardeinstellung verwendet die Browser-Standardeinstellung des Betriebssystems. Falls angegeben, verwendet Flow diesen Browser.</system:String>
<system:String x:Key="defaultBrowser_name">Browser</system:String> <system:String x:Key="defaultBrowser_name">Browser</system:String>
<system:String x:Key="defaultBrowser_profile_name">Browser-Name</system:String> <system:String x:Key="defaultBrowser_profile_name">Browser-Name</system:String>
<system:String x:Key="defaultBrowser_path">Browserpfad</system:String> <system:String x:Key="defaultBrowser_path">Browserpfad</system:String>
@ -262,8 +264,8 @@
<!-- Priority Setting Dialog --> <!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Priorität ändern</system:String> <system:String x:Key="changePriorityWindow">Priorität ändern</system:String>
<system:String x:Key="priority_tips">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</system:String> <system:String x:Key="priority_tips">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</system:String>
<system:String x:Key="invalidPriority">Please provide an valid integer for Priority!</system:String> <system:String x:Key="invalidPriority">Bitte eine gültige Ganzzahl angeben für die Priorität!</system:String>
<!-- Action Keyword Setting Dialog --> <!-- Action Keyword Setting Dialog -->
<system:String x:Key="oldActionKeywords">Altes Aktionsschlüsselwort</system:String> <system:String x:Key="oldActionKeywords">Altes Aktionsschlüsselwort</system:String>
@ -274,7 +276,7 @@
<system:String x:Key="newActionKeywordsCannotBeEmpty">Neues Aktionsschlüsselwort darf nicht leer sein</system:String> <system:String x:Key="newActionKeywordsCannotBeEmpty">Neues Aktionsschlüsselwort darf nicht leer sein</system:String>
<system:String x:Key="newActionKeywordsHasBeenAssigned">Aktionsschlüsselwort ist schon bei einem anderen Plugin in verwendung. Bitte stellen Sie ein anderes Aktionsschlüsselwort ein.</system:String> <system:String x:Key="newActionKeywordsHasBeenAssigned">Aktionsschlüsselwort ist schon bei einem anderen Plugin in verwendung. Bitte stellen Sie ein anderes Aktionsschlüsselwort ein.</system:String>
<system:String x:Key="success">Erfolgreich</system:String> <system:String x:Key="success">Erfolgreich</system:String>
<system:String x:Key="completedSuccessfully">Completed successfully</system:String> <system:String x:Key="completedSuccessfully">Erfolgreich abgeschlossen</system:String>
<system:String x:Key="actionkeyword_tips">Benutzen Sie * wenn Sie ein Aktionsschlüsselwort definieren wollen.</system:String> <system:String x:Key="actionkeyword_tips">Benutzen Sie * wenn Sie ein Aktionsschlüsselwort definieren wollen.</system:String>
<!-- Custom Query Hotkey Dialog --> <!-- Custom Query Hotkey Dialog -->
@ -347,10 +349,10 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
<system:String x:Key="Welcome_Page2_Text01">Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.</system:String> <system:String x:Key="Welcome_Page2_Text01">Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.</system:String>
<system:String x:Key="Welcome_Page2_Text02">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.</system:String> <system:String x:Key="Welcome_Page2_Text02">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.</system:String>
<system:String x:Key="Welcome_Page3_Title">Tastenkombination</system:String> <system:String x:Key="Welcome_Page3_Title">Tastenkombination</system:String>
<system:String x:Key="Welcome_Page4_Title">Action Keyword and Commands</system:String> <system:String x:Key="Welcome_Page4_Title">Aktions-Schlüsselwort und Befehle</system:String>
<system:String x:Key="Welcome_Page4_Text01">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.</system:String> <system:String x:Key="Welcome_Page4_Text01">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.</system:String>
<system:String x:Key="Welcome_Page5_Title">Let's Start Flow Launcher</system:String> <system:String x:Key="Welcome_Page5_Title">Starte Flow-Launcher</system:String>
<system:String x:Key="Welcome_Page5_Text01">Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)</system:String> <system:String x:Key="Welcome_Page5_Text01">Fertig. Genießen Sie Flow Launcher. Die Tastenkombination nicht vergessen, um Flow Launcher zu starten :)</system:String>
<!-- General Guide & Hotkey --> <!-- General Guide & Hotkey -->
@ -372,7 +374,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
<system:String x:Key="RecommendShellDesc">Shell-Befehl</system:String> <system:String x:Key="RecommendShellDesc">Shell-Befehl</system:String>
<system:String x:Key="RecommendBluetooth">s Bluetooth</system:String> <system:String x:Key="RecommendBluetooth">s Bluetooth</system:String>
<system:String x:Key="RecommendBluetoothDesc">Bluetooth in Windows-Einstellungen</system:String> <system:String x:Key="RecommendBluetoothDesc">Bluetooth in Windows-Einstellungen</system:String>
<system:String x:Key="RecommendAcronyms">sn</system:String> <system:String x:Key="RecommendAcronyms">nt</system:String>
<system:String x:Key="RecommendAcronymsDesc">Sticky Notes</system:String> <system:String x:Key="RecommendAcronymsDesc">Notizen</system:String>
</ResourceDictionary> </ResourceDictionary>

View file

@ -156,6 +156,9 @@
<system:String x:Key="ColorSchemeDark">Dark</system:String> <system:String x:Key="ColorSchemeDark">Dark</system:String>
<system:String x:Key="SoundEffect">Sound Effect</system:String> <system:String x:Key="SoundEffect">Sound Effect</system:String>
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String> <system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="SoundEffectWarning">Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume.</system:String>
<system:String x:Key="Animation">Animation</system:String> <system:String x:Key="Animation">Animation</system:String>
<system:String x:Key="AnimationTip">Use Animation in UI</system:String> <system:String x:Key="AnimationTip">Use Animation in UI</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>
@ -170,14 +173,37 @@
<!-- Setting Hotkey --> <!-- Setting Hotkey -->
<system:String x:Key="hotkey">Hotkey</system:String> <system:String x:Key="hotkey">Hotkey</system:String>
<system:String x:Key="hotkeys">Hotkeys</system:String> <system:String x:Key="hotkeys">Hotkeys</system:String>
<system:String x:Key="flowlauncherHotkey">Flow Launcher Hotkey</system:String> <system:String x:Key="flowlauncherHotkey">Open Flow Launcher</system:String>
<system:String x:Key="flowlauncherHotkeyToolTip">Enter shortcut to show/hide Flow Launcher.</system:String> <system:String x:Key="flowlauncherHotkeyToolTip">Enter shortcut to show/hide Flow Launcher.</system:String>
<system:String x:Key="previewHotkey">Preview Hotkey</system:String> <system:String x:Key="previewHotkey">Toggle Preview</system:String>
<system:String x:Key="previewHotkeyToolTip">Enter shortcut to show/hide preview in search window.</system:String> <system:String x:Key="previewHotkeyToolTip">Enter shortcut to show/hide preview in search window.</system:String>
<system:String x:Key="hotkeyPresets">Hotkey Presets</system:String>
<system:String x:Key="hotkeyPresetsToolTip">List of currently registered hotkeys</system:String>
<system:String x:Key="openResultModifiers">Open Result Modifier Key</system:String> <system:String x:Key="openResultModifiers">Open Result Modifier Key</system:String>
<system:String x:Key="openResultModifiersToolTip">Select a modifier key to open selected result via keyboard.</system:String> <system:String x:Key="openResultModifiersToolTip">Select a modifier key to open selected result via keyboard.</system:String>
<system:String x:Key="showOpenResultHotkey">Show Hotkey</system:String> <system:String x:Key="showOpenResultHotkey">Show Hotkey</system:String>
<system:String x:Key="showOpenResultHotkeyToolTip">Show result selection hotkey with results.</system:String> <system:String x:Key="showOpenResultHotkeyToolTip">Show result selection hotkey with results.</system:String>
<system:String x:Key="autoCompleteHotkey">Auto Complete</system:String>
<system:String x:Key="autoCompleteHotkeyToolTip">Runs autocomplete for the selected items.</system:String>
<system:String x:Key="SelectNextItemHotkey">Select Next Item</system:String>
<system:String x:Key="SelectPrevItemHotkey">Select Previous Item</system:String>
<system:String x:Key="SelectNextPageHotkey">Next Page</system:String>
<system:String x:Key="SelectPrevPageHotkey">Previous Page</system:String>
<system:String x:Key="CycleHistoryUpHotkey">Cycle Previous Query</system:String>
<system:String x:Key="CycleHistoryDownHotkey">Cycle Next Query</system:String>
<system:String x:Key="OpenContextMenuHotkey">Open Context Menu</system:String>
<system:String x:Key="SettingWindowHotkey">Open Setting Window</system:String>
<system:String x:Key="CopyFilePathHotkey">Copy File Path</system:String>
<system:String x:Key="ToggleGameModeHotkey">Toggle Game Mode</system:String>
<system:String x:Key="ToggleHistoryHotkey">Toggle History</system:String>
<system:String x:Key="OpenContainFolderHotkey">Open Containing Folder</system:String>
<system:String x:Key="RunAsAdminHotkey">Run As Admin</system:String>
<system:String x:Key="RequeryHotkey">Refresh Search Results</system:String>
<system:String x:Key="ReloadPluginHotkey">Reload Plugins Data</system:String>
<system:String x:Key="QuickWidthHotkey">Quick Adjust Window Width</system:String>
<system:String x:Key="QuickHeightHotkey">Quick Adjust Window Height</system:String>
<system:String x:Key="ReloadPluginHotkeyToolTip">Use when require plugins to reload and update their existing data.</system:String>
<system:String x:Key="AdditionalHotkeyToolTip">You can add one more hotkey for this function.</system:String>
<system:String x:Key="customQueryHotkey">Custom Query Hotkeys</system:String> <system:String x:Key="customQueryHotkey">Custom Query Hotkeys</system:String>
<system:String x:Key="customQueryShortcut">Custom Query Shortcuts</system:String> <system:String x:Key="customQueryShortcut">Custom Query Shortcuts</system:String>
<system:String x:Key="builtinShortcuts">Built-in Shortcuts</system:String> <system:String x:Key="builtinShortcuts">Built-in Shortcuts</system:String>
@ -188,6 +214,7 @@
<system:String x:Key="delete">Delete</system:String> <system:String x:Key="delete">Delete</system:String>
<system:String x:Key="edit">Edit</system:String> <system:String x:Key="edit">Edit</system:String>
<system:String x:Key="add">Add</system:String> <system:String x:Key="add">Add</system:String>
<system:String x:Key="none">None</system:String>
<system:String x:Key="pleaseSelectAnItem">Please select an item</system:String> <system:String x:Key="pleaseSelectAnItem">Please select an item</system:String>
<system:String x:Key="deleteCustomHotkeyWarning">Are you sure you want to delete {0} plugin hotkey?</system:String> <system:String x:Key="deleteCustomHotkeyWarning">Are you sure you want to delete {0} plugin hotkey?</system:String>
<system:String x:Key="deleteCustomShortcutWarning">Are you sure you want to delete shortcut: {0} with expansion {1}?</system:String> <system:String x:Key="deleteCustomShortcutWarning">Are you sure you want to delete shortcut: {0} with expansion {1}?</system:String>
@ -286,6 +313,11 @@
<system:String x:Key="hotkeyIsNotUnavailable">Hotkey is unavailable, please select a new hotkey</system:String> <system:String x:Key="hotkeyIsNotUnavailable">Hotkey is unavailable, please select a new hotkey</system:String>
<system:String x:Key="invalidPluginHotkey">Invalid plugin hotkey</system:String> <system:String x:Key="invalidPluginHotkey">Invalid plugin hotkey</system:String>
<system:String x:Key="update">Update</system:String> <system:String x:Key="update">Update</system:String>
<system:String x:Key="hotkeyRegTitle">Binding Hotkey</system:String>
<system:String x:Key="hotkeyUnavailable">Current hotkey is unavailable.</system:String>
<system:String x:Key="hotkeyUnavailableUneditable">This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey.</system:String>
<system:String x:Key="hotkeyUnavailableEditable">This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}".</system:String>
<system:String x:Key="hotkeyRegGuide">Press the keys you want to use for this function.</system:String>
<!-- Custom Query Shortcut Dialog --> <!-- Custom Query Shortcut Dialog -->
<system:String x:Key="customeQueryShortcutTitle">Custom Query Shortcut</system:String> <system:String x:Key="customeQueryShortcutTitle">Custom Query Shortcut</system:String>
@ -295,8 +327,12 @@
<system:String x:Key="duplicateShortcut">Shortcut already exists, please enter a new Shortcut or edit the existing one.</system:String> <system:String x:Key="duplicateShortcut">Shortcut already exists, please enter a new Shortcut or edit the existing one.</system:String>
<system:String x:Key="emptyShortcut">Shortcut and/or its expansion is empty.</system:String> <system:String x:Key="emptyShortcut">Shortcut and/or its expansion is empty.</system:String>
<!-- Hotkey Control --> <!-- Common Action -->
<system:String x:Key="hotkeyUnavailable">Hotkey Unavailable</system:String> <system:String x:Key="commonSave">Save</system:String>
<system:String x:Key="commonOverwrite">Overwrite</system:String>
<system:String x:Key="commonCancel">Cancel</system:String>
<system:String x:Key="commonReset">Reset</system:String>
<system:String x:Key="commonDelete">Delete</system:String>
<!-- Crash Reporter --> <!-- Crash Reporter -->
<system:String x:Key="reportWindow_version">Version</system:String> <system:String x:Key="reportWindow_version">Version</system:String>
@ -366,6 +402,12 @@
<system:String x:Key="HotkeyCtrlIDesc">Open Setting Window</system:String> <system:String x:Key="HotkeyCtrlIDesc">Open Setting Window</system:String>
<system:String x:Key="HotkeyF5Desc">Reload Plugin Data</system:String> <system:String x:Key="HotkeyF5Desc">Reload Plugin Data</system:String>
<system:String x:Key="HotkeySelectFirstResult">Select first result</system:String>
<system:String x:Key="HotkeySelectLastResult">Select last result</system:String>
<system:String x:Key="HotkeyRequery">Run current query again</system:String>
<system:String x:Key="HotkeyOpenResult">Open result</system:String>
<system:String x:Key="HotkeyOpenResultN">Open result #{0}</system:String>
<system:String x:Key="RecommendWeather">Weather</system:String> <system:String x:Key="RecommendWeather">Weather</system:String>
<system:String x:Key="RecommendWeatherDesc">Weather in Google Result</system:String> <system:String x:Key="RecommendWeatherDesc">Weather in Google Result</system:String>
<system:String x:Key="RecommendShell">&gt; ping 8.8.8.8</system:String> <system:String x:Key="RecommendShell">&gt; ping 8.8.8.8</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Oscuro</system:String> <system:String x:Key="ColorSchemeDark">Oscuro</system:String>
<system:String x:Key="SoundEffect">Efectos de Sonido</system:String> <system:String x:Key="SoundEffect">Efectos de Sonido</system:String>
<system:String x:Key="SoundEffectTip">Reproducir un sonido al abrir la ventana de búsqueda</system:String> <system:String x:Key="SoundEffectTip">Reproducir un sonido al abrir la ventana de búsqueda</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animación</system:String> <system:String x:Key="Animation">Animación</system:String>
<system:String x:Key="AnimationTip">Usar Animación en la Interfaz</system:String> <system:String x:Key="AnimationTip">Usar Animación en la Interfaz</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>

View file

@ -55,7 +55,7 @@
<system:String x:Key="LastQuerySelected">Seleccionar la última consulta</system:String> <system:String x:Key="LastQuerySelected">Seleccionar la última consulta</system:String>
<system:String x:Key="LastQueryEmpty">Limpiar la última consulta</system:String> <system:String x:Key="LastQueryEmpty">Limpiar la última consulta</system:String>
<system:String x:Key="maxShowResults">Número máximo de resultados mostrados</system:String> <system:String x:Key="maxShowResults">Número máximo de resultados mostrados</system:String>
<system:String x:Key="maxShowResultsToolTip">También puede ajustarlo rápidamente usando CTRL+Más y CTRL+Menos.</system:String> <system:String x:Key="maxShowResultsToolTip">También puede ajustarse rápidamente usando Ctrl+Más y Ctrl+Menos.</system:String>
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignorar atajos de teclado en modo pantalla completa</system:String> <system:String x:Key="ignoreHotkeysOnFullscreen">Ignorar atajos de teclado en modo pantalla completa</system:String>
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">No permite activar Flow Launcher con aplicaciones a pantalla completa (Recomendado para juegos).</system:String> <system:String x:Key="ignoreHotkeysOnFullscreenToolTip">No permite activar Flow Launcher con aplicaciones a pantalla completa (Recomendado para juegos).</system:String>
<system:String x:Key="defaultFileManager">Administrador de archivos predeterminado</system:String> <system:String x:Key="defaultFileManager">Administrador de archivos predeterminado</system:String>
@ -73,13 +73,13 @@
<system:String x:Key="hideOnStartup">Ocultar Flow Launcher al inicio</system:String> <system:String x:Key="hideOnStartup">Ocultar Flow Launcher al inicio</system:String>
<system:String x:Key="hideNotifyIcon">Ocultar icono en la bandeja del sistema</system:String> <system:String x:Key="hideNotifyIcon">Ocultar icono en la bandeja del sistema</system:String>
<system:String x:Key="hideNotifyIconToolTip">Cuando el icono está oculto en la bandeja del sistema, se puede abrir el menú de configuración haciendo clic con el botón derecho en la ventana de búsqueda.</system:String> <system:String x:Key="hideNotifyIconToolTip">Cuando el icono está oculto en la bandeja del sistema, se puede abrir el menú de configuración haciendo clic con el botón derecho en la ventana de búsqueda.</system:String>
<system:String x:Key="querySearchPrecision">Precisión en la búsqueda de consultas</system:String> <system:String x:Key="querySearchPrecision">Precisión de búsqueda en consultas</system:String>
<system:String x:Key="querySearchPrecisionToolTip">Cambia la puntuación mínima requerida para la coincidencia de los resultados.</system:String> <system:String x:Key="querySearchPrecisionToolTip">Cambia la puntuación mínima requerida para la coincidencia de los resultados.</system:String>
<system:String x:Key="ShouldUsePinyin">Buscar con Pinyin</system:String> <system:String x:Key="ShouldUsePinyin">Buscar con Pinyin</system:String>
<system:String x:Key="ShouldUsePinyinToolTip">Permite utilizar Pinyin para la búsqueda. Pinyin es el sistema estándar de ortografía romanizado para traducir chino.</system:String> <system:String x:Key="ShouldUsePinyinToolTip">Permite utilizar Pinyin para la búsqueda. Pinyin es el sistema estándar de ortografía romanizado para traducir chino.</system:String>
<system:String x:Key="AlwaysPreview">Mostrar siempre vista previa</system:String> <system:String x:Key="AlwaysPreview">Mostrar siempre vista previa</system:String>
<system:String x:Key="AlwaysPreviewToolTip">Muestra siempre el panel de vista previa al iniciar Flow. Pulse {0} para mostrar/ocultar la vista previa.</system:String> <system:String x:Key="AlwaysPreviewToolTip">Muestra siempre el panel de vista previa al iniciar Flow. Pulse {0} para mostrar/ocultar la vista previa.</system:String>
<system:String x:Key="shadowEffectNotAllowed">El efecto de sombra no está permitido mientras el tema actual tenga el efecto de desenfoque activado</system:String> <system:String x:Key="shadowEffectNotAllowed">El efecto de sombra no está permitido si el tema actual tiene activado el efecto de desenfoque</system:String>
<!-- Setting Plugin --> <!-- Setting Plugin -->
<system:String x:Key="searchplugin">Buscar complemento</system:String> <system:String x:Key="searchplugin">Buscar complemento</system:String>
@ -154,8 +154,10 @@
<system:String x:Key="ColorSchemeDark">Oscuro</system:String> <system:String x:Key="ColorSchemeDark">Oscuro</system:String>
<system:String x:Key="SoundEffect">Efecto de sonido</system:String> <system:String x:Key="SoundEffect">Efecto de sonido</system:String>
<system:String x:Key="SoundEffectTip">Reproduce un pequeño sonido cuando se abre el cuadro de búsqueda</system:String> <system:String x:Key="SoundEffectTip">Reproduce un pequeño sonido cuando se abre el cuadro de búsqueda</system:String>
<system:String x:Key="SoundEffectVolume">Volumen del efecto de sonido</system:String>
<system:String x:Key="SoundEffectVolumeTip">Ajusta el volumen del efecto de sonido</system:String>
<system:String x:Key="Animation">Animación</system:String> <system:String x:Key="Animation">Animación</system:String>
<system:String x:Key="AnimationTip">Usar animación en la Interfaz de Usuario</system:String> <system:String x:Key="AnimationTip">Usa animación en la Interfaz de Usuario</system:String>
<system:String x:Key="AnimationSpeed">Velocidad de animación</system:String> <system:String x:Key="AnimationSpeed">Velocidad de animación</system:String>
<system:String x:Key="AnimationSpeedTip">Velocidad de animación de la interfaz de usuario</system:String> <system:String x:Key="AnimationSpeedTip">Velocidad de animación de la interfaz de usuario</system:String>
<system:String x:Key="AnimationSpeedSlow">Lenta</system:String> <system:String x:Key="AnimationSpeedSlow">Lenta</system:String>
@ -170,7 +172,7 @@
<system:String x:Key="hotkeys">Atajos de teclado</system:String> <system:String x:Key="hotkeys">Atajos de teclado</system:String>
<system:String x:Key="flowlauncherHotkey">Atajo de teclado de Flow Launcher</system:String> <system:String x:Key="flowlauncherHotkey">Atajo de teclado de Flow Launcher</system:String>
<system:String x:Key="flowlauncherHotkeyToolTip">Introduzca el atajo de teclado para mostrar/ocultar Flow Launcher.</system:String> <system:String x:Key="flowlauncherHotkeyToolTip">Introduzca el atajo de teclado para mostrar/ocultar Flow Launcher.</system:String>
<system:String x:Key="previewHotkey">Atajo de teclado para vista previa</system:String> <system:String x:Key="previewHotkey">Acceso directo para vista previa</system:String>
<system:String x:Key="previewHotkeyToolTip">Introduzca el acceso directo para mostrar/ocultar la vista previa en la ventana de búsqueda.</system:String> <system:String x:Key="previewHotkeyToolTip">Introduzca el acceso directo para mostrar/ocultar la vista previa en la ventana de búsqueda.</system:String>
<system:String x:Key="openResultModifiers">Tecla modificadora para abrir resultado</system:String> <system:String x:Key="openResultModifiers">Tecla modificadora para abrir resultado</system:String>
<system:String x:Key="openResultModifiersToolTip">Seleccione una tecla modificadora para abrir el resultado seleccionado con el teclado.</system:String> <system:String x:Key="openResultModifiersToolTip">Seleccione una tecla modificadora para abrir el resultado seleccionado con el teclado.</system:String>
@ -188,13 +190,13 @@
<system:String x:Key="add">Añadir</system:String> <system:String x:Key="add">Añadir</system:String>
<system:String x:Key="pleaseSelectAnItem">Por favor, seleccione un elemento</system:String> <system:String x:Key="pleaseSelectAnItem">Por favor, seleccione un elemento</system:String>
<system:String x:Key="deleteCustomHotkeyWarning">¿Está seguro que desea eliminar el atajo de teclado de consulta personalizada {0}?</system:String> <system:String x:Key="deleteCustomHotkeyWarning">¿Está seguro que desea eliminar el atajo de teclado de consulta personalizada {0}?</system:String>
<system:String x:Key="deleteCustomShortcutWarning">¿Está seguro que desea eliminar el acceso directo: {0} con la expansión {1}?</system:String> <system:String x:Key="deleteCustomShortcutWarning">¿Está seguro de que desea eliminar el acceso directo: {0} con la expansión {1}?</system:String>
<system:String x:Key="shortcut_clipboard_description">Obtiene el texto del portapapeles.</system:String> <system:String x:Key="shortcut_clipboard_description">Obtiene el texto del portapapeles.</system:String>
<system:String x:Key="shortcut_active_explorer_path">Obtiene la ruta del explorador activo.</system:String> <system:String x:Key="shortcut_active_explorer_path">Obtiene la ruta del explorador activo.</system:String>
<system:String x:Key="queryWindowShadowEffect">Efecto de sombra de la ventana de consultas</system:String> <system:String x:Key="queryWindowShadowEffect">Efecto de sombra de la ventana de consultas</system:String>
<system:String x:Key="shadowEffectCPUUsage">El efecto de sombra hace un uso sustancial de la GPU. No se recomienda para ordenadores de rendimiento limitado.</system:String> <system:String x:Key="shadowEffectCPUUsage">El efecto de sombra hace un uso sustancial de la GPU. No se recomienda para ordenadores de rendimiento limitado.</system:String>
<system:String x:Key="windowWidthSize">Tamaño del ancho de la ventana</system:String> <system:String x:Key="windowWidthSize">Tamaño del ancho de la ventana</system:String>
<system:String x:Key="windowWidthSizeToolTip">También puede ajustarlo rápidamente usando Ctrl+[y Ctrl+].</system:String> <system:String x:Key="windowWidthSizeToolTip">También puede ajustarse rápidamente usando Ctrl+[ y Ctrl+].</system:String>
<system:String x:Key="useGlyphUI">Usar iconos Segoe Fluent</system:String> <system:String x:Key="useGlyphUI">Usar iconos Segoe Fluent</system:String>
<system:String x:Key="useGlyphUIEffect">Usa iconos Segoe Fluent para los resultados de la consulta cuando sean compatibles</system:String> <system:String x:Key="useGlyphUIEffect">Usa iconos Segoe Fluent para los resultados de la consulta cuando sean compatibles</system:String>
<system:String x:Key="flowlauncherPressHotkey">Pulsar Tecla</system:String> <system:String x:Key="flowlauncherPressHotkey">Pulsar Tecla</system:String>
@ -237,7 +239,7 @@
<system:String x:Key="settingfolder">Carpeta de configuración</system:String> <system:String x:Key="settingfolder">Carpeta de configuración</system:String>
<system:String x:Key="logfolder">Carpeta de registros</system:String> <system:String x:Key="logfolder">Carpeta de registros</system:String>
<system:String x:Key="clearlogfolder">Eliminar registros</system:String> <system:String x:Key="clearlogfolder">Eliminar registros</system:String>
<system:String x:Key="clearlogfolderMessage">¿Está seguro que desea eliminar todos los registros?</system:String> <system:String x:Key="clearlogfolderMessage">¿Está seguro de que desea eliminar todos los registros?</system:String>
<system:String x:Key="welcomewindow">Asistente</system:String> <system:String x:Key="welcomewindow">Asistente</system:String>
<!-- FileManager Setting Dialog --> <!-- FileManager Setting Dialog -->
@ -296,7 +298,7 @@ Si añade un prefijo &quot;@&quot; al introducir un acceso directo, éste coinci
<system:String x:Key="emptyShortcut">El acceso directo y/o su expansión están vacíos.</system:String> <system:String x:Key="emptyShortcut">El acceso directo y/o su expansión están vacíos.</system:String>
<!-- Hotkey Control --> <!-- Hotkey Control -->
<system:String x:Key="hotkeyUnavailable">Atajo de teclado no disponible</system:String> <system:String x:Key="hotkeyUnavailable">No disponible</system:String>
<!-- Crash Reporter --> <!-- Crash Reporter -->
<system:String x:Key="reportWindow_version">Versión</system:String> <system:String x:Key="reportWindow_version">Versión</system:String>

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib"> <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- MainWindow --> <!-- MainWindow -->
<system:String x:Key="registerHotkeyFailed">Failed to register hotkey &quot;{0}&quot;. The hotkey may be in use by another program. Change to a different hotkey, or exit another program.</system:String> <system:String x:Key="registerHotkeyFailed">Échec lors de l'enregistrement du raccourci : {0}</system:String>
<system:String x:Key="MessageBoxTitle">Flow Launcher</system:String> <system:String x:Key="MessageBoxTitle">Flow Launcher</system:String>
<system:String x:Key="couldnotStartCmd">Impossible de lancer {0}</system:String> <system:String x:Key="couldnotStartCmd">Impossible de lancer {0}</system:String>
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Le format de fichier n'est pas un plugin Flow Launcher valide</system:String> <system:String x:Key="invalidFlowLauncherPluginFileFormat">Le format de fichier n'est pas un plugin Flow Launcher valide</system:String>
@ -28,7 +28,7 @@
<system:String x:Key="PositionResetToolTip">Rétablir la position de la fenêtre de recherche</system:String> <system:String x:Key="PositionResetToolTip">Rétablir la position de la fenêtre de recherche</system:String>
<!-- Setting General --> <!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Paramètres - Flow Launcher</system:String> <system:String x:Key="flowlauncher_settings">Paramètres</system:String>
<system:String x:Key="general">Général</system:String> <system:String x:Key="general">Général</system:String>
<system:String x:Key="portableMode">Mode Portable</system:String> <system:String x:Key="portableMode">Mode Portable</system:String>
<system:String x:Key="portableModeToolTIp">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).</system:String> <system:String x:Key="portableModeToolTIp">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).</system:String>
@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Sombre</system:String> <system:String x:Key="ColorSchemeDark">Sombre</system:String>
<system:String x:Key="SoundEffect">Effet Sonore</system:String> <system:String x:Key="SoundEffect">Effet Sonore</system:String>
<system:String x:Key="SoundEffectTip">Jouer un petit son lorsque la fenêtre de recherche s'ouvre</system:String> <system:String x:Key="SoundEffectTip">Jouer un petit son lorsque la fenêtre de recherche s'ouvre</system:String>
<system:String x:Key="SoundEffectVolume">Volume de l'effet sonore</system:String>
<system:String x:Key="SoundEffectVolumeTip">Ajuster le volume de l'effet sonore</system:String>
<system:String x:Key="Animation">Animation</system:String> <system:String x:Key="Animation">Animation</system:String>
<system:String x:Key="AnimationTip">Utiliser l'animation dans l'interface</system:String> <system:String x:Key="AnimationTip">Utiliser l'animation dans l'interface</system:String>
<system:String x:Key="AnimationSpeed">Vitesse d'animation</system:String> <system:String x:Key="AnimationSpeed">Vitesse d'animation</system:String>
@ -287,9 +289,9 @@
<!-- Custom Query Shortcut Dialog --> <!-- Custom Query Shortcut Dialog -->
<system:String x:Key="customeQueryShortcutTitle">Raccourci de requête personnalisée</system:String> <system:String x:Key="customeQueryShortcutTitle">Raccourci de requête personnalisée</system:String>
<system:String x:Key="customeQueryShortcutTips">Entrez un raccourci qui s'étend automatiquement à la requête spécifiée.</system:String> <system:String x:Key="customeQueryShortcutTips">Entrez un raccourci qui s'étend automatiquement à la requête spécifiée.</system:String>
<system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">A shortcut is expanded when it exactly matches the query. <system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">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 &quot;@&quot; 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.
</system:String> </system:String>
<system:String x:Key="duplicateShortcut">Le raccourci existe déjà, veuillez entrer un nouveau raccourci ou modifier le raccourci existant.</system:String> <system:String x:Key="duplicateShortcut">Le raccourci existe déjà, veuillez entrer un nouveau raccourci ou modifier le raccourci existant.</system:String>
<system:String x:Key="emptyShortcut">Raccourci et/ou son expansion est vide.</system:String> <system:String x:Key="emptyShortcut">Raccourci et/ou son expansion est vide.</system:String>

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib"> <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- MainWindow --> <!-- MainWindow -->
<system:String x:Key="registerHotkeyFailed">Failed to register hotkey &quot;{0}&quot;. The hotkey may be in use by another program. Change to a different hotkey, or exit another program.</system:String> <system:String x:Key="registerHotkeyFailed">Registrazione del tasto di scelta rapida &quot;{0}&quot; 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.</system:String>
<system:String x:Key="MessageBoxTitle">Flow Launcher</system:String> <system:String x:Key="MessageBoxTitle">Flow Launcher</system:String>
<system:String x:Key="couldnotStartCmd">Avvio fallito {0}</system:String> <system:String x:Key="couldnotStartCmd">Avvio fallito {0}</system:String>
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Formato file plugin non valido</system:String> <system:String x:Key="invalidFlowLauncherPluginFileFormat">Formato file plugin non valido</system:String>
@ -17,15 +17,15 @@
<system:String x:Key="copy">Copia</system:String> <system:String x:Key="copy">Copia</system:String>
<system:String x:Key="cut">Taglia</system:String> <system:String x:Key="cut">Taglia</system:String>
<system:String x:Key="paste">Incolla</system:String> <system:String x:Key="paste">Incolla</system:String>
<system:String x:Key="undo">Undo</system:String> <system:String x:Key="undo">Annulla</system:String>
<system:String x:Key="selectAll">Select All</system:String> <system:String x:Key="selectAll">Seleziona Tutto</system:String>
<system:String x:Key="fileTitle">File</system:String> <system:String x:Key="fileTitle">File</system:String>
<system:String x:Key="folderTitle">Cartella</system:String> <system:String x:Key="folderTitle">Cartella</system:String>
<system:String x:Key="textTitle">Testo</system:String> <system:String x:Key="textTitle">Testo</system:String>
<system:String x:Key="GameMode">Modalità gioco</system:String> <system:String x:Key="GameMode">Modalità gioco</system:String>
<system:String x:Key="GameModeToolTip">Sospendere l'uso dei tasti di scelta rapida.</system:String> <system:String x:Key="GameModeToolTip">Sospendere l'uso dei tasti di scelta rapida.</system:String>
<system:String x:Key="PositionReset">Position Reset</system:String> <system:String x:Key="PositionReset">Ripristina Posizione</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String> <system:String x:Key="PositionResetToolTip">Ripristina posizione finestra di ricerca</system:String>
<!-- Setting General --> <!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Impostazioni</system:String> <system:String x:Key="flowlauncher_settings">Impostazioni</system:String>
@ -33,21 +33,21 @@
<system:String x:Key="portableMode">Modalità portatile</system:String> <system:String x:Key="portableMode">Modalità portatile</system:String>
<system:String x:Key="portableModeToolTIp">Memorizzare tutte le impostazioni e i dati dell'utente in un'unica cartella (utile se utilizzato con unità rimovibili o servizi cloud).</system:String> <system:String x:Key="portableModeToolTIp">Memorizzare tutte le impostazioni e i dati dell'utente in un'unica cartella (utile se utilizzato con unità rimovibili o servizi cloud).</system:String>
<system:String x:Key="startFlowLauncherOnSystemStartup">Avvia Wow all'avvio di Windows</system:String> <system:String x:Key="startFlowLauncherOnSystemStartup">Avvia Wow all'avvio di Windows</system:String>
<system:String x:Key="setAutoStartFailed">Error setting launch on startup</system:String> <system:String x:Key="setAutoStartFailed">Errore nell'impostazione del lancio all'avvio</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Nascondi Flow Launcher quando perde il focus</system:String> <system:String x:Key="hideFlowLauncherWhenLoseFocus">Nascondi Flow Launcher quando perde il focus</system:String>
<system:String x:Key="dontPromptUpdateMsg">Non mostrare le notifiche per una nuova versione</system:String> <system:String x:Key="dontPromptUpdateMsg">Non mostrare le notifiche per una nuova versione</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Position</system:String> <system:String x:Key="SearchWindowPosition">Posizione Finestra Di Ricerca</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String> <system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Ricorda L'Ultima Posizione</system:String>
<system:String x:Key="SearchWindowScreenCursor">Monitor with Mouse Cursor</system:String> <system:String x:Key="SearchWindowScreenCursor">Monitora con il cursore del mouse</system:String>
<system:String x:Key="SearchWindowScreenFocus">Monitor with Focused Window</system:String> <system:String x:Key="SearchWindowScreenFocus">Monitora con la finestra in primo piano</system:String>
<system:String x:Key="SearchWindowScreenPrimary">Primary Monitor</system:String> <system:String x:Key="SearchWindowScreenPrimary">Monitor Principale</system:String>
<system:String x:Key="SearchWindowScreenCustom">Custom Monitor</system:String> <system:String x:Key="SearchWindowScreenCustom">Monitor Personalizzato</system:String>
<system:String x:Key="SearchWindowAlign">Search Window Position on Monitor</system:String> <system:String x:Key="SearchWindowAlign">Posizione della finestra di ricerca sul monitor</system:String>
<system:String x:Key="SearchWindowAlignCenter">Center</system:String> <system:String x:Key="SearchWindowAlignCenter">Centro</system:String>
<system:String x:Key="SearchWindowAlignCenterTop">Center Top</system:String> <system:String x:Key="SearchWindowAlignCenterTop">Centrato in alto</system:String>
<system:String x:Key="SearchWindowAlignLeftTop">Left Top</system:String> <system:String x:Key="SearchWindowAlignLeftTop">Sinistra in alto</system:String>
<system:String x:Key="SearchWindowAlignRightTop">Right Top</system:String> <system:String x:Key="SearchWindowAlignRightTop">Destra in alto</system:String>
<system:String x:Key="SearchWindowAlignCustom">Custom Position</system:String> <system:String x:Key="SearchWindowAlignCustom">Posizione personalizzata</system:String>
<system:String x:Key="language">Lingua</system:String> <system:String x:Key="language">Lingua</system:String>
<system:String x:Key="lastQueryMode">Comportamento ultima ricerca</system:String> <system:String x:Key="lastQueryMode">Comportamento ultima ricerca</system:String>
<system:String x:Key="lastQueryModeToolTip">Mostra/nasconde i risultati precedenti quando Flow Launcher viene riattivato.</system:String> <system:String x:Key="lastQueryModeToolTip">Mostra/nasconde i risultati precedenti quando Flow Launcher viene riattivato.</system:String>
@ -55,37 +55,37 @@
<system:String x:Key="LastQuerySelected">Seleziona ultima ricerca</system:String> <system:String x:Key="LastQuerySelected">Seleziona ultima ricerca</system:String>
<system:String x:Key="LastQueryEmpty">Cancella ultima ricerca</system:String> <system:String x:Key="LastQueryEmpty">Cancella ultima ricerca</system:String>
<system:String x:Key="maxShowResults">Numero massimo di risultati mostrati</system:String> <system:String x:Key="maxShowResults">Numero massimo di risultati mostrati</system:String>
<system:String x:Key="maxShowResultsToolTip">You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.</system:String> <system:String x:Key="maxShowResultsToolTip">È anche possibile regolarlo rapidamente utilizzando CTRL+Più e CTRL+Meno.</system:String>
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignora i tasti di scelta rapida in applicazione a schermo pieno</system:String> <system:String x:Key="ignoreHotkeysOnFullscreen">Ignora i tasti di scelta rapida in applicazione a schermo pieno</system:String>
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Disattivare l'attivazione di Flow Launcher quando è attiva un'applicazione a schermo intero (consigliato per i giochi).</system:String> <system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Disattivare l'attivazione di Flow Launcher quando è attiva un'applicazione a schermo intero (consigliato per i giochi).</system:String>
<system:String x:Key="defaultFileManager">Gestore File predefinito</system:String> <system:String x:Key="defaultFileManager">Gestore File predefinito</system:String>
<system:String x:Key="defaultFileManagerToolTip">Selezionare il Gestore file da usare all'apertura della cartella.</system:String> <system:String x:Key="defaultFileManagerToolTip">Selezionare il Gestore file da usare all'apertura della cartella.</system:String>
<system:String x:Key="defaultBrowser">Browser predefinito</system:String> <system:String x:Key="defaultBrowser">Browser predefinito</system:String>
<system:String x:Key="defaultBrowserToolTip">Impostazione per Nuova scheda, Nuova finestra, Modalità privata.</system:String> <system:String x:Key="defaultBrowserToolTip">Impostazione per Nuova scheda, Nuova finestra, Modalità privata.</system:String>
<system:String x:Key="pythonFilePath">Python Path</system:String> <system:String x:Key="pythonFilePath">Percorso di Python</system:String>
<system:String x:Key="nodeFilePath">Node.js Path</system:String> <system:String x:Key="nodeFilePath">Percorso di Node.js</system:String>
<system:String x:Key="selectNodeExecutable">Please select the Node.js executable</system:String> <system:String x:Key="selectNodeExecutable">Seleziona l'eseguibile di Node.js</system:String>
<system:String x:Key="selectPythonExecutable">Please select pythonw.exe</system:String> <system:String x:Key="selectPythonExecutable">Selezionare pythonw.exe</system:String>
<system:String x:Key="typingStartEn">Always Start Typing in English Mode</system:String> <system:String x:Key="typingStartEn">Inizia sempre a digitare in modalità inglese</system:String>
<system:String x:Key="typingStartEnTooltip">Temporarily change your input method to English mode when activating Flow.</system:String> <system:String x:Key="typingStartEnTooltip">Cambiare temporaneamente il metodo di input in modalità inglese quando si attiva Flow.</system:String>
<system:String x:Key="autoUpdates">Aggiornamento automatico</system:String> <system:String x:Key="autoUpdates">Aggiornamento automatico</system:String>
<system:String x:Key="select">Seleziona</system:String> <system:String x:Key="select">Seleziona</system:String>
<system:String x:Key="hideOnStartup">Nascondi Flow Launcher all'avvio</system:String> <system:String x:Key="hideOnStartup">Nascondi Flow Launcher all'avvio</system:String>
<system:String x:Key="hideNotifyIcon">Nascondi Icona nell'Area di Notifica</system:String> <system:String x:Key="hideNotifyIcon">Nascondi Icona nell'Area di Notifica</system:String>
<system:String x:Key="hideNotifyIconToolTip">When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.</system:String> <system:String x:Key="hideNotifyIconToolTip">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.</system:String>
<system:String x:Key="querySearchPrecision">Precisione di ricerca delle query</system:String> <system:String x:Key="querySearchPrecision">Precisione di ricerca delle query</system:String>
<system:String x:Key="querySearchPrecisionToolTip">Modifica il punteggio minimo richiesto per i risultati.</system:String> <system:String x:Key="querySearchPrecisionToolTip">Modifica il punteggio minimo richiesto per i risultati.</system:String>
<system:String x:Key="ShouldUsePinyin">Dovrebbe usare il Pinyin</system:String> <system:String x:Key="ShouldUsePinyin">Dovrebbe usare il Pinyin</system:String>
<system:String x:Key="ShouldUsePinyinToolTip">Consente di utilizzare il Pinyin per la ricerca. Il Pinyin è il sistema standard di ortografia romanizzata per la traduzione del cinese.</system:String> <system:String x:Key="ShouldUsePinyinToolTip">Consente di utilizzare il Pinyin per la ricerca. Il Pinyin è il sistema standard di ortografia romanizzata per la traduzione del cinese.</system:String>
<system:String x:Key="AlwaysPreview">Always Preview</system:String> <system:String x:Key="AlwaysPreview">Mostra Sempre Anteprima</system:String>
<system:String x:Key="AlwaysPreviewToolTip">Always open preview panel when Flow activates. Press {0} to toggle preview.</system:String> <system:String x:Key="AlwaysPreviewToolTip">Apri sempre il pannello di anteprima quando Flow si attiva. Premi {0} per attivare l'anteprima.</system:String>
<system:String x:Key="shadowEffectNotAllowed">L'effetto ombra non è consentito mentre il tema corrente ha un effetto di sfocatura abilitato</system:String> <system:String x:Key="shadowEffectNotAllowed">L'effetto ombra non è consentito mentre il tema corrente ha un effetto di sfocatura abilitato</system:String>
<!-- Setting Plugin --> <!-- Setting Plugin -->
<system:String x:Key="searchplugin">Search Plugin</system:String> <system:String x:Key="searchplugin">Plugin di ricerca</system:String>
<system:String x:Key="searchpluginToolTip">Ctrl+F to search plugins</system:String> <system:String x:Key="searchpluginToolTip">Ctrl+F per cercare plugin</system:String>
<system:String x:Key="searchplugin_Noresult_Title">No results found</system:String> <system:String x:Key="searchplugin_Noresult_Title">Nessun risultato trovato</system:String>
<system:String x:Key="searchplugin_Noresult_Subtitle">Please try a different search.</system:String> <system:String x:Key="searchplugin_Noresult_Subtitle">Prova una ricerca diversa.</system:String>
<system:String x:Key="plugin">Plugin</system:String> <system:String x:Key="plugin">Plugin</system:String>
<system:String x:Key="plugins">Plugin</system:String> <system:String x:Key="plugins">Plugin</system:String>
<system:String x:Key="browserMorePlugins">Cerca altri plugins</system:String> <system:String x:Key="browserMorePlugins">Cerca altri plugins</system:String>
@ -99,7 +99,7 @@
<system:String x:Key="currentPriority">Priorità Attuale</system:String> <system:String x:Key="currentPriority">Priorità Attuale</system:String>
<system:String x:Key="newPriority">Nuova Priorità</system:String> <system:String x:Key="newPriority">Nuova Priorità</system:String>
<system:String x:Key="priority">Priorità</system:String> <system:String x:Key="priority">Priorità</system:String>
<system:String x:Key="priorityToolTip">Change Plugin Results Priority</system:String> <system:String x:Key="priorityToolTip">Priorità Dei Risultati Dei Plugin</system:String>
<system:String x:Key="pluginDirectory">Cartella Plugin</system:String> <system:String x:Key="pluginDirectory">Cartella Plugin</system:String>
<system:String x:Key="author">da</system:String> <system:String x:Key="author">da</system:String>
<system:String x:Key="plugin_init_time">Tempo di avvio:</system:String> <system:String x:Key="plugin_init_time">Tempo di avvio:</system:String>
@ -111,35 +111,35 @@
<!-- Setting Plugin Store --> <!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Negozio dei Plugin</system:String> <system:String x:Key="pluginStore">Negozio dei Plugin</system:String>
<system:String x:Key="pluginStore_NewRelease">New Release</system:String> <system:String x:Key="pluginStore_NewRelease">Nuova Versione</system:String>
<system:String x:Key="pluginStore_RecentlyUpdated">Recently Updated</system:String> <system:String x:Key="pluginStore_RecentlyUpdated">Aggiornati di recente</system:String>
<system:String x:Key="pluginStore_None">Plugin</system:String> <system:String x:Key="pluginStore_None">Plugin</system:String>
<system:String x:Key="pluginStore_Installed">Installed</system:String> <system:String x:Key="pluginStore_Installed">Installati</system:String>
<system:String x:Key="refresh">Aggiorna</system:String> <system:String x:Key="refresh">Aggiorna</system:String>
<system:String x:Key="installbtn">Installa</system:String> <system:String x:Key="installbtn">Installa</system:String>
<system:String x:Key="uninstallbtn">Disinstalla</system:String> <system:String x:Key="uninstallbtn">Disinstalla</system:String>
<system:String x:Key="updatebtn">Aggiorna</system:String> <system:String x:Key="updatebtn">Aggiorna</system:String>
<system:String x:Key="LabelInstalledToolTip">Plugin already installed</system:String> <system:String x:Key="LabelInstalledToolTip">Plugin già installato</system:String>
<system:String x:Key="LabelNew">New Version</system:String> <system:String x:Key="LabelNew">Nuova versione</system:String>
<system:String x:Key="LabelNewToolTip">This plugin has been updated within the last 7 days</system:String> <system:String x:Key="LabelNewToolTip">Questo plugin è stato aggiornato negli ultimi 7 giorni</system:String>
<system:String x:Key="LabelUpdateToolTip">New Update is Available</system:String> <system:String x:Key="LabelUpdateToolTip">Nuovo aggiornamento disponibile</system:String>
<!-- Setting Theme --> <!-- Setting Theme -->
<system:String x:Key="theme">Tema</system:String> <system:String x:Key="theme">Tema</system:String>
<system:String x:Key="appearance">Appearance</system:String> <system:String x:Key="appearance">Aspetto</system:String>
<system:String x:Key="browserMoreThemes">Sfoglia per altri temi</system:String> <system:String x:Key="browserMoreThemes">Sfoglia per altri temi</system:String>
<system:String x:Key="howToCreateTheme">Come creare un tema</system:String> <system:String x:Key="howToCreateTheme">Come creare un tema</system:String>
<system:String x:Key="hiThere">Ciao</system:String> <system:String x:Key="hiThere">Ciao</system:String>
<system:String x:Key="SampleTitleExplorer">Esplora Risorse</system:String> <system:String x:Key="SampleTitleExplorer">Esplora Risorse</system:String>
<system:String x:Key="SampleSubTitleExplorer">Search for files, folders and file contents</system:String> <system:String x:Key="SampleSubTitleExplorer">Cerca i file, le cartelle e il contenuto dei file</system:String>
<system:String x:Key="SampleTitleWebSearch">WebSearch</system:String> <system:String x:Key="SampleTitleWebSearch">WebSearch</system:String>
<system:String x:Key="SampleSubTitleWebSearch">Search the web with different search engine support</system:String> <system:String x:Key="SampleSubTitleWebSearch">Cerca sul web con diversi motori di ricerca supportati</system:String>
<system:String x:Key="SampleTitleProgram">Program</system:String> <system:String x:Key="SampleTitleProgram">Programma</system:String>
<system:String x:Key="SampleSubTitleProgram">Launch programs as admin or a different user</system:String> <system:String x:Key="SampleSubTitleProgram">Avvia programmi come amministratore o un altro utente</system:String>
<system:String x:Key="SampleTitleProcessKiller">ProcessKiller</system:String> <system:String x:Key="SampleTitleProcessKiller">ProcessKiller</system:String>
<system:String x:Key="SampleSubTitleProcessKiller">Terminate unwanted processes</system:String> <system:String x:Key="SampleSubTitleProcessKiller">Termina i processi indesiderati</system:String>
<system:String x:Key="queryBoxFont">Font campo di ricerca</system:String> <system:String x:Key="queryBoxFont">Font campo di ricerca</system:String>
<system:String x:Key="resultItemFont">Font campo risultati</system:String> <system:String x:Key="resultItemFont">Font campo risultati</system:String>
<system:String x:Key="windowMode">Modalità finestra</system:String> <system:String x:Key="windowMode">Modalità finestra</system:String>
@ -154,24 +154,26 @@
<system:String x:Key="ColorSchemeDark">Scuro</system:String> <system:String x:Key="ColorSchemeDark">Scuro</system:String>
<system:String x:Key="SoundEffect">Effetto sonoro</system:String> <system:String x:Key="SoundEffect">Effetto sonoro</system:String>
<system:String x:Key="SoundEffectTip">Riproduce un piccolo suono all'apertura della finestra di ricerca</system:String> <system:String x:Key="SoundEffectTip">Riproduce un piccolo suono all'apertura della finestra di ricerca</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animazione</system:String> <system:String x:Key="Animation">Animazione</system:String>
<system:String x:Key="AnimationTip">Usa l'animazione nell'interfaccia utente</system:String> <system:String x:Key="AnimationTip">Usa l'animazione nell'interfaccia utente</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Velocità di animazione</system:String>
<system:String x:Key="AnimationSpeedTip">The speed of the UI animation</system:String> <system:String x:Key="AnimationSpeedTip">La velocità dell'animazione dell'interfaccia utente</system:String>
<system:String x:Key="AnimationSpeedSlow">Slow</system:String> <system:String x:Key="AnimationSpeedSlow">Lento</system:String>
<system:String x:Key="AnimationSpeedMedium">Medium</system:String> <system:String x:Key="AnimationSpeedMedium">Medio</system:String>
<system:String x:Key="AnimationSpeedFast">Fast</system:String> <system:String x:Key="AnimationSpeedFast">Veloce</system:String>
<system:String x:Key="AnimationSpeedCustom">Custom</system:String> <system:String x:Key="AnimationSpeedCustom">Personalizzato</system:String>
<system:String x:Key="Clock">Clock</system:String> <system:String x:Key="Clock">Orologio</system:String>
<system:String x:Key="Date">Date</system:String> <system:String x:Key="Date">Data</system:String>
<!-- Setting Hotkey --> <!-- Setting Hotkey -->
<system:String x:Key="hotkey">Tasti scelta rapida</system:String> <system:String x:Key="hotkey">Tasti scelta rapida</system:String>
<system:String x:Key="hotkeys">Tasti scelta rapida</system:String> <system:String x:Key="hotkeys">Tasti scelta rapida</system:String>
<system:String x:Key="flowlauncherHotkey">Tasto scelta rapida Flow Launcher</system:String> <system:String x:Key="flowlauncherHotkey">Tasto scelta rapida Flow Launcher</system:String>
<system:String x:Key="flowlauncherHotkeyToolTip">Immettere la scorciatoia per mostrare/nascondere Flow Launcher.</system:String> <system:String x:Key="flowlauncherHotkeyToolTip">Immettere la scorciatoia per mostrare/nascondere Flow Launcher.</system:String>
<system:String x:Key="previewHotkey">Preview Hotkey</system:String> <system:String x:Key="previewHotkey">Anteprima Scorciatoia</system:String>
<system:String x:Key="previewHotkeyToolTip">Enter shortcut to show/hide preview in search window.</system:String> <system:String x:Key="previewHotkeyToolTip">Inserisci la scorciatoia per mostrare/nascondere l'anteprima nella finestra di ricerca.</system:String>
<system:String x:Key="openResultModifiers">Apri modificatori di risultato</system:String> <system:String x:Key="openResultModifiers">Apri modificatori di risultato</system:String>
<system:String x:Key="openResultModifiersToolTip">Seleziona un tasto modificatore per aprire il risultato selezionato via tastiera.</system:String> <system:String x:Key="openResultModifiersToolTip">Seleziona un tasto modificatore per aprire il risultato selezionato via tastiera.</system:String>
<system:String x:Key="showOpenResultHotkey">Mostra tasto di scelta rapida</system:String> <system:String x:Key="showOpenResultHotkey">Mostra tasto di scelta rapida</system:String>
@ -180,24 +182,24 @@
<system:String x:Key="customQueryShortcut">Custom Query Shortcut</system:String> <system:String x:Key="customQueryShortcut">Custom Query Shortcut</system:String>
<system:String x:Key="builtinShortcuts">Built-in Shortcut</system:String> <system:String x:Key="builtinShortcuts">Built-in Shortcut</system:String>
<system:String x:Key="customQuery">Ricerca</system:String> <system:String x:Key="customQuery">Ricerca</system:String>
<system:String x:Key="customShortcut">Shortcut</system:String> <system:String x:Key="customShortcut">Scorciatoia</system:String>
<system:String x:Key="customShortcutExpansion">Expansion</system:String> <system:String x:Key="customShortcutExpansion">Espansione</system:String>
<system:String x:Key="builtinShortcutDescription">Descrizione</system:String> <system:String x:Key="builtinShortcutDescription">Descrizione</system:String>
<system:String x:Key="delete">Cancella</system:String> <system:String x:Key="delete">Cancella</system:String>
<system:String x:Key="edit">Modifica</system:String> <system:String x:Key="edit">Modifica</system:String>
<system:String x:Key="add">Aggiungi</system:String> <system:String x:Key="add">Aggiungi</system:String>
<system:String x:Key="pleaseSelectAnItem">Selezionare un oggetto</system:String> <system:String x:Key="pleaseSelectAnItem">Selezionare un oggetto</system:String>
<system:String x:Key="deleteCustomHotkeyWarning">Volete cancellare il tasto di scelta rapida per il plugin {0}?</system:String> <system:String x:Key="deleteCustomHotkeyWarning">Volete cancellare il tasto di scelta rapida per il plugin {0}?</system:String>
<system:String x:Key="deleteCustomShortcutWarning">Are you sure you want to delete shortcut: {0} with expansion {1}?</system:String> <system:String x:Key="deleteCustomShortcutWarning">Sei sicuro di voler eliminare la scorciatoia: {0} con espansione {1}?</system:String>
<system:String x:Key="shortcut_clipboard_description">Get text from clipboard.</system:String> <system:String x:Key="shortcut_clipboard_description">Ottieni testo dagli appunti.</system:String>
<system:String x:Key="shortcut_active_explorer_path">Get path from active explorer.</system:String> <system:String x:Key="shortcut_active_explorer_path">Ottieni il percorso dall'esplora risorse attivo.</system:String>
<system:String x:Key="queryWindowShadowEffect">Effetto ombra della finestra di ricerca</system:String> <system:String x:Key="queryWindowShadowEffect">Effetto ombra della finestra di ricerca</system:String>
<system:String x:Key="shadowEffectCPUUsage">L'effetto ombra utilizzerà in maniera sostanziale la GPU. Non consigliato se le performance del tuo computer sono limitate.</system:String> <system:String x:Key="shadowEffectCPUUsage">L'effetto ombra utilizzerà in maniera sostanziale la GPU. Non consigliato se le performance del tuo computer sono limitate.</system:String>
<system:String x:Key="windowWidthSize">Dimensione larghezza della finestra</system:String> <system:String x:Key="windowWidthSize">Dimensione larghezza della finestra</system:String>
<system:String x:Key="windowWidthSizeToolTip">You can also quickly adjust this by using Ctrl+[ and Ctrl+].</system:String> <system:String x:Key="windowWidthSizeToolTip">È anche possibile regolarlo rapidamente utilizzando CTRL+[ e CTRL+].</system:String>
<system:String x:Key="useGlyphUI">Usa Icone Segoe Fluent</system:String> <system:String x:Key="useGlyphUI">Usa Icone Segoe Fluent</system:String>
<system:String x:Key="useGlyphUIEffect">Usa Icone Segoe Fluent per risultati di ricerca dove supportate</system:String> <system:String x:Key="useGlyphUIEffect">Usa Icone Segoe Fluent per risultati di ricerca dove supportate</system:String>
<system:String x:Key="flowlauncherPressHotkey">Press Key</system:String> <system:String x:Key="flowlauncherPressHotkey">Premi tasto</system:String>
<!-- Setting Proxy --> <!-- Setting Proxy -->
<system:String x:Key="proxy">Proxy HTTP</system:String> <system:String x:Key="proxy">Proxy HTTP</system:String>
@ -221,10 +223,10 @@
<system:String x:Key="github">GitHub</system:String> <system:String x:Key="github">GitHub</system:String>
<system:String x:Key="docs">Documentazione</system:String> <system:String x:Key="docs">Documentazione</system:String>
<system:String x:Key="version">Versione</system:String> <system:String x:Key="version">Versione</system:String>
<system:String x:Key="icons">Icons</system:String> <system:String x:Key="icons">Icone</system:String>
<system:String x:Key="about_activate_times">Hai usato Flow Launcher {0} volte</system:String> <system:String x:Key="about_activate_times">Hai usato Flow Launcher {0} volte</system:String>
<system:String x:Key="checkUpdates">Cerca aggiornamenti</system:String> <system:String x:Key="checkUpdates">Cerca aggiornamenti</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String> <system:String x:Key="BecomeASponsor">Diventa un sostenitore</system:String>
<system:String x:Key="newVersionTips">Una nuova versione {0} è disponibile, riavvia Flow Launcher per favore.</system:String> <system:String x:Key="newVersionTips">Una nuova versione {0} è disponibile, riavvia Flow Launcher per favore.</system:String>
<system:String x:Key="checkUpdatesFailed">Ricerca aggiornamenti fallita, per favore controlla la tua connessione e le eventuali impostazioni proxy per api.github.com.</system:String> <system:String x:Key="checkUpdatesFailed">Ricerca aggiornamenti fallita, per favore controlla la tua connessione e le eventuali impostazioni proxy per api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed"> <system:String x:Key="downloadUpdatesFailed">
@ -236,8 +238,8 @@
<system:String x:Key="devtool">Strumenti per sviluppatori</system:String> <system:String x:Key="devtool">Strumenti per sviluppatori</system:String>
<system:String x:Key="settingfolder">Cartella delle impostazioni</system:String> <system:String x:Key="settingfolder">Cartella delle impostazioni</system:String>
<system:String x:Key="logfolder">Cartella dei Log</system:String> <system:String x:Key="logfolder">Cartella dei Log</system:String>
<system:String x:Key="clearlogfolder">Clear Logs</system:String> <system:String x:Key="clearlogfolder">Cancella i log</system:String>
<system:String x:Key="clearlogfolderMessage">Are you sure you want to delete all logs?</system:String> <system:String x:Key="clearlogfolderMessage">Sei sicuro di voler cancellare tutti i log?</system:String>
<system:String x:Key="welcomewindow">Wizard</system:String> <system:String x:Key="welcomewindow">Wizard</system:String>
<!-- FileManager Setting Dialog --> <!-- FileManager Setting Dialog -->
@ -279,21 +281,21 @@
<!-- Custom Query Hotkey Dialog --> <!-- Custom Query Hotkey Dialog -->
<system:String x:Key="customeQueryHotkeyTitle">Tasti scelta rapida per ricerche personalizzate</system:String> <system:String x:Key="customeQueryHotkeyTitle">Tasti scelta rapida per ricerche personalizzate</system:String>
<system:String x:Key="customeQueryHotkeyTips">Press a custom hotkey to open Flow Launcher and input the specified query automatically.</system:String> <system:String x:Key="customeQueryHotkeyTips">Premere un tasto di scelta rapida personalizzato per aprire Flow Launcher e inserire automaticamente la query specificata.</system:String>
<system:String x:Key="preview">Anteprima</system:String> <system:String x:Key="preview">Anteprima</system:String>
<system:String x:Key="hotkeyIsNotUnavailable">Tasto di scelta rapida non disponibile, per favore scegli un nuovo tasto di scelta rapida</system:String> <system:String x:Key="hotkeyIsNotUnavailable">Tasto di scelta rapida non disponibile, per favore scegli un nuovo tasto di scelta rapida</system:String>
<system:String x:Key="invalidPluginHotkey">Tasto di scelta rapida plugin non valido</system:String> <system:String x:Key="invalidPluginHotkey">Tasto di scelta rapida plugin non valido</system:String>
<system:String x:Key="update">Aggiorna</system:String> <system:String x:Key="update">Aggiorna</system:String>
<!-- Custom Query Shortcut Dialog --> <!-- Custom Query Shortcut Dialog -->
<system:String x:Key="customeQueryShortcutTitle">Custom Query Shortcut</system:String> <system:String x:Key="customeQueryShortcutTitle">Scorciatoia per ricerca personalizzata</system:String>
<system:String x:Key="customeQueryShortcutTips">Enter a shortcut that automatically expands to the specified query.</system:String> <system:String x:Key="customeQueryShortcutTips">Inserisci una scorciatoia che si espande automaticamente alla query specificata.</system:String>
<system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">A shortcut is expanded when it exactly matches the query. <system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">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.
</system:String> </system:String>
<system:String x:Key="duplicateShortcut">Shortcut already exists, please enter a new Shortcut or edit the existing one.</system:String> <system:String x:Key="duplicateShortcut">La scorciatoia esiste già, inserisci una nuova scorciatoia o modifica quella esistente.</system:String>
<system:String x:Key="emptyShortcut">Shortcut and/or its expansion is empty.</system:String> <system:String x:Key="emptyShortcut">La scorciatoia e/o la sua espansione sono vuote.</system:String>
<!-- Hotkey Control --> <!-- Hotkey Control -->
<system:String x:Key="hotkeyUnavailable">Tasto di scelta rapida non disponibile</system:String> <system:String x:Key="hotkeyUnavailable">Tasto di scelta rapida non disponibile</system:String>
@ -358,7 +360,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
<system:String x:Key="HotkeyLeftRightDesc">Navigazione tra le voci</system:String> <system:String x:Key="HotkeyLeftRightDesc">Navigazione tra le voci</system:String>
<system:String x:Key="HotkeyShiftEnterDesc">Apri il menu di scelta rapida</system:String> <system:String x:Key="HotkeyShiftEnterDesc">Apri il menu di scelta rapida</system:String>
<system:String x:Key="HotkeyCtrlEnterDesc">Apri cartella superiore</system:String> <system:String x:Key="HotkeyCtrlEnterDesc">Apri cartella superiore</system:String>
<system:String x:Key="HotkeyCtrlShiftEnterDesc">Run as Admin / Open Folder in Default File Manager</system:String> <system:String x:Key="HotkeyCtrlShiftEnterDesc">Esegui come Admin / Apri cartella in File Manager predefinito</system:String>
<system:String x:Key="HotkeyCtrlHDesc">Cronologia Query</system:String> <system:String x:Key="HotkeyCtrlHDesc">Cronologia Query</system:String>
<system:String x:Key="HotkeyESCDesc">Torna al risultato nel menu contestuale</system:String> <system:String x:Key="HotkeyESCDesc">Torna al risultato nel menu contestuale</system:String>
<system:String x:Key="HotkeyTabDesc">Autocompleta</system:String> <system:String x:Key="HotkeyTabDesc">Autocompleta</system:String>
@ -371,7 +373,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
<system:String x:Key="RecommendShell">&gt; ping 8.8.8.8</system:String> <system:String x:Key="RecommendShell">&gt; ping 8.8.8.8</system:String>
<system:String x:Key="RecommendShellDesc">Comando Della shell</system:String> <system:String x:Key="RecommendShellDesc">Comando Della shell</system:String>
<system:String x:Key="RecommendBluetooth">s Bluetooth</system:String> <system:String x:Key="RecommendBluetooth">s Bluetooth</system:String>
<system:String x:Key="RecommendBluetoothDesc">Bluetooth in Windows Settings</system:String> <system:String x:Key="RecommendBluetoothDesc">Bluetooth in Impostazioni Windows</system:String>
<system:String x:Key="RecommendAcronyms">sn</system:String> <system:String x:Key="RecommendAcronyms">sn</system:String>
<system:String x:Key="RecommendAcronymsDesc">Sticky Notes</system:String> <system:String x:Key="RecommendAcronymsDesc">Sticky Notes</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Dark</system:String> <system:String x:Key="ColorSchemeDark">Dark</system:String>
<system:String x:Key="SoundEffect">Sound Effect</system:String> <system:String x:Key="SoundEffect">Sound Effect</system:String>
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String> <system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animation</system:String> <system:String x:Key="Animation">Animation</system:String>
<system:String x:Key="AnimationTip">Use Animation in UI</system:String> <system:String x:Key="AnimationTip">Use Animation in UI</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">어둡게</system:String> <system:String x:Key="ColorSchemeDark">어둡게</system:String>
<system:String x:Key="SoundEffect">소리 효과</system:String> <system:String x:Key="SoundEffect">소리 효과</system:String>
<system:String x:Key="SoundEffectTip">검색창을 열 때 작은 소리를 재생합니다.</system:String> <system:String x:Key="SoundEffectTip">검색창을 열 때 작은 소리를 재생합니다.</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">애니메이션</system:String> <system:String x:Key="Animation">애니메이션</system:String>
<system:String x:Key="AnimationTip">일부 UI에 애니메이션을 사용합니다.</system:String> <system:String x:Key="AnimationTip">일부 UI에 애니메이션을 사용합니다.</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Dark</system:String> <system:String x:Key="ColorSchemeDark">Dark</system:String>
<system:String x:Key="SoundEffect">Sound Effect</system:String> <system:String x:Key="SoundEffect">Sound Effect</system:String>
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String> <system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animation</system:String> <system:String x:Key="Animation">Animation</system:String>
<system:String x:Key="AnimationTip">Use Animation in UI</system:String> <system:String x:Key="AnimationTip">Use Animation in UI</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>

View file

@ -92,7 +92,7 @@
<system:String x:Key="enable">Aan</system:String> <system:String x:Key="enable">Aan</system:String>
<system:String x:Key="disable">Disable</system:String> <system:String x:Key="disable">Disable</system:String>
<system:String x:Key="actionKeywordsTitle">Actie sneltoets instelling</system:String> <system:String x:Key="actionKeywordsTitle">Actie sneltoets instelling</system:String>
<system:String x:Key="actionKeywords">Action terfwoorden</system:String> <system:String x:Key="actionKeywords">Actie sneltoets</system:String>
<system:String x:Key="currentActionKeywords">Huidige actie sneltoets</system:String> <system:String x:Key="currentActionKeywords">Huidige actie sneltoets</system:String>
<system:String x:Key="newActionKeyword">Nieuw actie sneltoets</system:String> <system:String x:Key="newActionKeyword">Nieuw actie sneltoets</system:String>
<system:String x:Key="actionKeywordsTooltip">Wijzig actie-sneltoets</system:String> <system:String x:Key="actionKeywordsTooltip">Wijzig actie-sneltoets</system:String>
@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Donker</system:String> <system:String x:Key="ColorSchemeDark">Donker</system:String>
<system:String x:Key="SoundEffect">Geluidseffect</system:String> <system:String x:Key="SoundEffect">Geluidseffect</system:String>
<system:String x:Key="SoundEffectTip">Een klein geluid afspelen wanneer het zoekvenster wordt geopend</system:String> <system:String x:Key="SoundEffectTip">Een klein geluid afspelen wanneer het zoekvenster wordt geopend</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animatie</system:String> <system:String x:Key="Animation">Animatie</system:String>
<system:String x:Key="AnimationTip">Animatie gebruiken in UI</system:String> <system:String x:Key="AnimationTip">Animatie gebruiken in UI</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>
@ -182,7 +184,7 @@
<system:String x:Key="customQuery">Query</system:String> <system:String x:Key="customQuery">Query</system:String>
<system:String x:Key="customShortcut">Shortcut</system:String> <system:String x:Key="customShortcut">Shortcut</system:String>
<system:String x:Key="customShortcutExpansion">Expansion</system:String> <system:String x:Key="customShortcutExpansion">Expansion</system:String>
<system:String x:Key="builtinShortcutDescription">Description</system:String> <system:String x:Key="builtinShortcutDescription">Beschrijving</system:String>
<system:String x:Key="delete">Verwijder</system:String> <system:String x:Key="delete">Verwijder</system:String>
<system:String x:Key="edit">Bewerken</system:String> <system:String x:Key="edit">Bewerken</system:String>
<system:String x:Key="add">Toevoegen</system:String> <system:String x:Key="add">Toevoegen</system:String>

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib"> <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- MainWindow --> <!-- MainWindow -->
<system:String x:Key="registerHotkeyFailed">Failed to register hotkey &quot;{0}&quot;. The hotkey may be in use by another program. Change to a different hotkey, or exit another program.</system:String> <system:String x:Key="registerHotkeyFailed">Nie udało się zarejestrować skrótu klawiszowego &quot;{0}&quot;. Klucz skrótu może być używany przez inny program. Zmień skrót klawiszowy lub wyjdź z innego programu.</system:String>
<system:String x:Key="MessageBoxTitle">Flow Launcher</system:String> <system:String x:Key="MessageBoxTitle">Flow Launcher</system:String>
<system:String x:Key="couldnotStartCmd">Nie udało się uruchomić: {0}</system:String> <system:String x:Key="couldnotStartCmd">Nie udało się uruchomić: {0}</system:String>
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Niepoprawny format pliku wtyczki</system:String> <system:String x:Key="invalidFlowLauncherPluginFileFormat">Niepoprawny format pliku wtyczki</system:String>
@ -21,11 +21,11 @@
<system:String x:Key="selectAll">Zaznacz wszystko</system:String> <system:String x:Key="selectAll">Zaznacz wszystko</system:String>
<system:String x:Key="fileTitle">Plik</system:String> <system:String x:Key="fileTitle">Plik</system:String>
<system:String x:Key="folderTitle">Folder</system:String> <system:String x:Key="folderTitle">Folder</system:String>
<system:String x:Key="textTitle">Text</system:String> <system:String x:Key="textTitle">Tekst</system:String>
<system:String x:Key="GameMode">Tryb grania</system:String> <system:String x:Key="GameMode">Tryb grania</system:String>
<system:String x:Key="GameModeToolTip">Wstrzymaj używanie skrótów.</system:String> <system:String x:Key="GameModeToolTip">Wstrzymaj używanie skrótów.</system:String>
<system:String x:Key="PositionReset">Position Reset</system:String> <system:String x:Key="PositionReset">Resetowanie pozycji</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String> <system:String x:Key="PositionResetToolTip">Zresetuj pozycję okna wyszukiwania</system:String>
<!-- Setting General --> <!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Ustawienia</system:String> <system:String x:Key="flowlauncher_settings">Ustawienia</system:String>
@ -33,29 +33,29 @@
<system:String x:Key="portableMode">Tryb przenośny</system:String> <system:String x:Key="portableMode">Tryb przenośny</system:String>
<system:String x:Key="portableModeToolTIp">Przechowuj wszystkie ustawienia i dane użytkownika w jednym folderze (Przydatne, gdy używane na dyskach wymiennych lub usługach chmurowych).</system:String> <system:String x:Key="portableModeToolTIp">Przechowuj wszystkie ustawienia i dane użytkownika w jednym folderze (Przydatne, gdy używane na dyskach wymiennych lub usługach chmurowych).</system:String>
<system:String x:Key="startFlowLauncherOnSystemStartup">Uruchamiaj Flow Launcher przy starcie systemu</system:String> <system:String x:Key="startFlowLauncherOnSystemStartup">Uruchamiaj Flow Launcher przy starcie systemu</system:String>
<system:String x:Key="setAutoStartFailed">Error setting launch on startup</system:String> <system:String x:Key="setAutoStartFailed">Błąd uruchamiania ustawień przy starcie</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Ukryj okno Flow Launcher kiedy przestanie ono być aktywne</system:String> <system:String x:Key="hideFlowLauncherWhenLoseFocus">Ukryj okno Flow Launcher kiedy przestanie ono być aktywne</system:String>
<system:String x:Key="dontPromptUpdateMsg">Nie pokazuj powiadomienia o nowej wersji</system:String> <system:String x:Key="dontPromptUpdateMsg">Nie pokazuj powiadomienia o nowej wersji</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Position</system:String> <system:String x:Key="SearchWindowPosition">Pozycja Okna Wyszukiwania</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String> <system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Zapamiętaj Ostatnią Pozycję</system:String>
<system:String x:Key="SearchWindowScreenCursor">Monitor with Mouse Cursor</system:String> <system:String x:Key="SearchWindowScreenCursor">Monitoruj kursorem myszy</system:String>
<system:String x:Key="SearchWindowScreenFocus">Monitor with Focused Window</system:String> <system:String x:Key="SearchWindowScreenFocus">Monitor z Dostosowanym Oknem</system:String>
<system:String x:Key="SearchWindowScreenPrimary">Primary Monitor</system:String> <system:String x:Key="SearchWindowScreenPrimary">Monitor główny</system:String>
<system:String x:Key="SearchWindowScreenCustom">Custom Monitor</system:String> <system:String x:Key="SearchWindowScreenCustom">Monitor Niestandardowy </system:String>
<system:String x:Key="SearchWindowAlign">Search Window Position on Monitor</system:String> <system:String x:Key="SearchWindowAlign">Pozycja Okna Wyszukiwania na Monitorze</system:String>
<system:String x:Key="SearchWindowAlignCenter">Center</system:String> <system:String x:Key="SearchWindowAlignCenter">Wyśrodkowane</system:String>
<system:String x:Key="SearchWindowAlignCenterTop">Center Top</system:String> <system:String x:Key="SearchWindowAlignCenterTop">Środek Góra</system:String>
<system:String x:Key="SearchWindowAlignLeftTop">Left Top</system:String> <system:String x:Key="SearchWindowAlignLeftTop">Lewa Góra</system:String>
<system:String x:Key="SearchWindowAlignRightTop">Right Top</system:String> <system:String x:Key="SearchWindowAlignRightTop">Prawa Góra</system:String>
<system:String x:Key="SearchWindowAlignCustom">Custom Position</system:String> <system:String x:Key="SearchWindowAlignCustom">Pozycja niestandardowa</system:String>
<system:String x:Key="language">Język</system:String> <system:String x:Key="language">Język</system:String>
<system:String x:Key="lastQueryMode">Last Query Style</system:String> <system:String x:Key="lastQueryMode">Styl ostatniego zapytania</system:String>
<system:String x:Key="lastQueryModeToolTip">Show/Hide previous results when Flow Launcher is reactivated.</system:String> <system:String x:Key="lastQueryModeToolTip">Pokaż/Ukryj poprzednie wyniki, gdy Flow Launcher jest ponownie aktywowany.</system:String>
<system:String x:Key="LastQueryPreserved">Preserve Last Query</system:String> <system:String x:Key="LastQueryPreserved">Zachowaj ostatnie zapytanie</system:String>
<system:String x:Key="LastQuerySelected">Select last Query</system:String> <system:String x:Key="LastQuerySelected">Wybierz ostatnie zapytanie</system:String>
<system:String x:Key="LastQueryEmpty">Empty last Query</system:String> <system:String x:Key="LastQueryEmpty">Puste ostatnie zapytanie</system:String>
<system:String x:Key="maxShowResults">Maksymalna liczba wyników</system:String> <system:String x:Key="maxShowResults">Maksymalna liczba wyników</system:String>
<system:String x:Key="maxShowResultsToolTip">You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.</system:String> <system:String x:Key="maxShowResultsToolTip">Możesz to również szybko dostosować używając CTRL+Plus i CTRL+Minus.</system:String>
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignoruj skróty klawiszowe w trybie pełnego ekranu</system:String> <system:String x:Key="ignoreHotkeysOnFullscreen">Ignoruj skróty klawiszowe w trybie pełnego ekranu</system:String>
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Wyłącz aktywowanie Flow Launcher, gdy uruchomiona jest aplikacja pełnoekranowa (Zalecane dla gier).</system:String> <system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Wyłącz aktywowanie Flow Launcher, gdy uruchomiona jest aplikacja pełnoekranowa (Zalecane dla gier).</system:String>
<system:String x:Key="defaultFileManager">Domyślny menedżer plików</system:String> <system:String x:Key="defaultFileManager">Domyślny menedżer plików</system:String>
@ -63,45 +63,45 @@
<system:String x:Key="defaultBrowser">Domyślna przeglądarka</system:String> <system:String x:Key="defaultBrowser">Domyślna przeglądarka</system:String>
<system:String x:Key="defaultBrowserToolTip">Ustawienie dla nowej karty, nowego okna i trybu prywatnego.</system:String> <system:String x:Key="defaultBrowserToolTip">Ustawienie dla nowej karty, nowego okna i trybu prywatnego.</system:String>
<system:String x:Key="pythonFilePath">Python Path</system:String> <system:String x:Key="pythonFilePath">Python Path</system:String>
<system:String x:Key="nodeFilePath">Node.js Path</system:String> <system:String x:Key="nodeFilePath">Ścieżka Node.js</system:String>
<system:String x:Key="selectNodeExecutable">Please select the Node.js executable</system:String> <system:String x:Key="selectNodeExecutable">Wybierz plik wykonywalny Node.js</system:String>
<system:String x:Key="selectPythonExecutable">Please select pythonw.exe</system:String> <system:String x:Key="selectPythonExecutable">Wybierz pythonw.exe</system:String>
<system:String x:Key="typingStartEn">Always Start Typing in English Mode</system:String> <system:String x:Key="typingStartEn">Zawsze rozpoczynaj wpisywanie w trybie angielskim</system:String>
<system:String x:Key="typingStartEnTooltip">Temporarily change your input method to English mode when activating Flow.</system:String> <system:String x:Key="typingStartEnTooltip">Tymczasowo zmień metodę wprowadzania na tryb angielski podczas aktywacji Flow.</system:String>
<system:String x:Key="autoUpdates">Automatyczne aktualizacje</system:String> <system:String x:Key="autoUpdates">Automatyczne aktualizacje</system:String>
<system:String x:Key="select">Wybierz</system:String> <system:String x:Key="select">Wybierz</system:String>
<system:String x:Key="hideOnStartup">Uruchamiaj Flow Launcher zminimalizowany</system:String> <system:String x:Key="hideOnStartup">Uruchamiaj Flow Launcher zminimalizowany</system:String>
<system:String x:Key="hideNotifyIcon">Ukryj ikonę zasobnika</system:String> <system:String x:Key="hideNotifyIcon">Ukryj ikonę zasobnika</system:String>
<system:String x:Key="hideNotifyIconToolTip">When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.</system:String> <system:String x:Key="hideNotifyIconToolTip">Gdy ikona jest ukryta w zasobniku, menu Ustawienia można otworzyć, klikając prawym przyciskiem myszy okno wyszukiwania.</system:String>
<system:String x:Key="querySearchPrecision">Query Search Precision</system:String> <system:String x:Key="querySearchPrecision">Precyzja wyszukiwania zapytań</system:String>
<system:String x:Key="querySearchPrecisionToolTip">Changes minimum match score required for results.</system:String> <system:String x:Key="querySearchPrecisionToolTip">Zmienia minimalny wynik dopasowania wymagany do uzyskania wyników.</system:String>
<system:String x:Key="ShouldUsePinyin">Search with Pinyin</system:String> <system:String x:Key="ShouldUsePinyin">Szukaj z Pinyin</system:String>
<system:String x:Key="ShouldUsePinyinToolTip">Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese.</system:String> <system:String x:Key="ShouldUsePinyinToolTip">Umożliwia wyszukiwanie przy użyciu Pinyin. Pinyin to standardowy system pisowni zromanizowanej służący do tłumaczenia języka chińskiego.</system:String>
<system:String x:Key="AlwaysPreview">Always Preview</system:String> <system:String x:Key="AlwaysPreview">Zawsze Podgląd</system:String>
<system:String x:Key="AlwaysPreviewToolTip">Always open preview panel when Flow activates. Press {0} to toggle preview.</system:String> <system:String x:Key="AlwaysPreviewToolTip">Zawsze otwieraj panel podglądu, gdy aktywowany jest Flow. Naciśnij {0}, aby przełączyć podgląd.</system:String>
<system:String x:Key="shadowEffectNotAllowed">Shadow effect is not allowed while current theme has blur effect enabled</system:String> <system:String x:Key="shadowEffectNotAllowed">Efekt cienia jest niedozwolony, gdy bieżący motyw ma włączony efekt rozmycia</system:String>
<!-- Setting Plugin --> <!-- Setting Plugin -->
<system:String x:Key="searchplugin">Szukaj wtyczek</system:String> <system:String x:Key="searchplugin">Szukaj wtyczek</system:String>
<system:String x:Key="searchpluginToolTip">Ctrl+F aby wyszukać wtyczki</system:String> <system:String x:Key="searchpluginToolTip">Ctrl+F aby wyszukać wtyczki</system:String>
<system:String x:Key="searchplugin_Noresult_Title">No results found</system:String> <system:String x:Key="searchplugin_Noresult_Title">Nie znaleziono wyników</system:String>
<system:String x:Key="searchplugin_Noresult_Subtitle">Please try a different search.</system:String> <system:String x:Key="searchplugin_Noresult_Subtitle">Spróbuj użyć innego wyszukiwania.</system:String>
<system:String x:Key="plugin">Plugin</system:String> <system:String x:Key="plugin">Wtyczka</system:String>
<system:String x:Key="plugins">Wtyczki</system:String> <system:String x:Key="plugins">Wtyczki</system:String>
<system:String x:Key="browserMorePlugins">Znajdź więcej wtyczek</system:String> <system:String x:Key="browserMorePlugins">Znajdź więcej wtyczek</system:String>
<system:String x:Key="enable">On</system:String> <system:String x:Key="enable">Włącz</system:String>
<system:String x:Key="disable">Wyłącz</system:String> <system:String x:Key="disable">Wyłącz</system:String>
<system:String x:Key="actionKeywordsTitle">Action keyword Setting</system:String> <system:String x:Key="actionKeywordsTitle">Ustawienie akcji słowa kluczowego</system:String>
<system:String x:Key="actionKeywords">Wyzwalacze</system:String> <system:String x:Key="actionKeywords">Wyzwalacze</system:String>
<system:String x:Key="currentActionKeywords">Current action keyword</system:String> <system:String x:Key="currentActionKeywords">Bieżące słowo kluczowe akcji</system:String>
<system:String x:Key="newActionKeyword">New action keyword</system:String> <system:String x:Key="newActionKeyword">Nowe słowo kluczowe akcji</system:String>
<system:String x:Key="actionKeywordsTooltip">Change Action Keywords</system:String> <system:String x:Key="actionKeywordsTooltip">Zmień słowa kluczowe akcji</system:String>
<system:String x:Key="currentPriority">Current Priority</system:String> <system:String x:Key="currentPriority">Obecny Priorytet</system:String>
<system:String x:Key="newPriority">New Priority</system:String> <system:String x:Key="newPriority">Nowy Priorytet</system:String>
<system:String x:Key="priority">Priority</system:String> <system:String x:Key="priority">Priorytet</system:String>
<system:String x:Key="priorityToolTip">Change Plugin Results Priority</system:String> <system:String x:Key="priorityToolTip">Zmień priorytet wyników wtyczki</system:String>
<system:String x:Key="pluginDirectory">Folder wtyczki</system:String> <system:String x:Key="pluginDirectory">Folder wtyczki</system:String>
<system:String x:Key="author">by</system:String> <system:String x:Key="author">wg</system:String>
<system:String x:Key="plugin_init_time">Czas ładowania:</system:String> <system:String x:Key="plugin_init_time">Czas ładowania:</system:String>
<system:String x:Key="plugin_query_time">Czas zapytania:</system:String> <system:String x:Key="plugin_query_time">Czas zapytania:</system:String>
<system:String x:Key="plugin_query_version">Wersja</system:String> <system:String x:Key="plugin_query_version">Wersja</system:String>
@ -111,67 +111,69 @@
<!-- Setting Plugin Store --> <!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Sklep z wtyczkami</system:String> <system:String x:Key="pluginStore">Sklep z wtyczkami</system:String>
<system:String x:Key="pluginStore_NewRelease">New Release</system:String> <system:String x:Key="pluginStore_NewRelease">Nowe wydanie</system:String>
<system:String x:Key="pluginStore_RecentlyUpdated">Recently Updated</system:String> <system:String x:Key="pluginStore_RecentlyUpdated">Ostatnio zaktualizowano</system:String>
<system:String x:Key="pluginStore_None">Wtyczki</system:String> <system:String x:Key="pluginStore_None">Wtyczki</system:String>
<system:String x:Key="pluginStore_Installed">Installed</system:String> <system:String x:Key="pluginStore_Installed">Zainstalowany</system:String>
<system:String x:Key="refresh">Refresh</system:String> <system:String x:Key="refresh">Odśwież</system:String>
<system:String x:Key="installbtn">Install</system:String> <system:String x:Key="installbtn">Instalacja</system:String>
<system:String x:Key="uninstallbtn">Odinstalowywanie</system:String> <system:String x:Key="uninstallbtn">Odinstalowywanie</system:String>
<system:String x:Key="updatebtn">Aktualizuj</system:String> <system:String x:Key="updatebtn">Aktualizuj</system:String>
<system:String x:Key="LabelInstalledToolTip">Plugin already installed</system:String> <system:String x:Key="LabelInstalledToolTip">Plugin już jest zainstalowany</system:String>
<system:String x:Key="LabelNew">New Version</system:String> <system:String x:Key="LabelNew">Nowa wersja</system:String>
<system:String x:Key="LabelNewToolTip">This plugin has been updated within the last 7 days</system:String> <system:String x:Key="LabelNewToolTip">Ta wtyczka została zaktualizowana w ciągu ostatnich 7 dni</system:String>
<system:String x:Key="LabelUpdateToolTip">New Update is Available</system:String> <system:String x:Key="LabelUpdateToolTip">Dostępna jest nowa aktualizacja</system:String>
<!-- Setting Theme --> <!-- Setting Theme -->
<system:String x:Key="theme">Skórka</system:String> <system:String x:Key="theme">Skórka</system:String>
<system:String x:Key="appearance">Appearance</system:String> <system:String x:Key="appearance">Wygląd</system:String>
<system:String x:Key="browserMoreThemes">Znajdź więcej skórek</system:String> <system:String x:Key="browserMoreThemes">Znajdź więcej skórek</system:String>
<system:String x:Key="howToCreateTheme">How to create a theme</system:String> <system:String x:Key="howToCreateTheme">Jak utworzyć motyw</system:String>
<system:String x:Key="hiThere">Hi There</system:String> <system:String x:Key="hiThere">Cześć,</system:String>
<system:String x:Key="SampleTitleExplorer">Explorer</system:String> <system:String x:Key="SampleTitleExplorer">Explorer</system:String>
<system:String x:Key="SampleSubTitleExplorer">Search for files, folders and file contents</system:String> <system:String x:Key="SampleSubTitleExplorer">Wyszukiwanie plików, folderów i zawartości plików</system:String>
<system:String x:Key="SampleTitleWebSearch">WebSearch</system:String> <system:String x:Key="SampleTitleWebSearch">Wyszukiwarka internetowa</system:String>
<system:String x:Key="SampleSubTitleWebSearch">Search the web with different search engine support</system:String> <system:String x:Key="SampleSubTitleWebSearch">Wyszukiwanie w Internecie z obsługą różnych wyszukiwarek</system:String>
<system:String x:Key="SampleTitleProgram">Programy</system:String> <system:String x:Key="SampleTitleProgram">Programy</system:String>
<system:String x:Key="SampleSubTitleProgram">Launch programs as admin or a different user</system:String> <system:String x:Key="SampleSubTitleProgram">Uruchamiaj programy jako administrator lub inny użytkownik</system:String>
<system:String x:Key="SampleTitleProcessKiller">ProcessKiller</system:String> <system:String x:Key="SampleTitleProcessKiller">ZabijProces</system:String>
<system:String x:Key="SampleSubTitleProcessKiller">Terminate unwanted processes</system:String> <system:String x:Key="SampleSubTitleProcessKiller">Zakończ niechciane procesy</system:String>
<system:String x:Key="queryBoxFont">Czcionka okna zapytania</system:String> <system:String x:Key="queryBoxFont">Czcionka okna zapytania</system:String>
<system:String x:Key="resultItemFont">Czcionka okna wyników</system:String> <system:String x:Key="resultItemFont">Czcionka okna wyników</system:String>
<system:String x:Key="windowMode">Tryb w oknie</system:String> <system:String x:Key="windowMode">Tryb w oknie</system:String>
<system:String x:Key="opacity">Przeźroczystość</system:String> <system:String x:Key="opacity">Przeźroczystość</system:String>
<system:String x:Key="theme_load_failure_path_not_exists">Theme {0} not exists, fallback to default theme</system:String> <system:String x:Key="theme_load_failure_path_not_exists">Motyw {0} nie istnieje, powróć do domyślnego motywu</system:String>
<system:String x:Key="theme_load_failure_parse_error">Fail to load theme {0}, fallback to default theme</system:String> <system:String x:Key="theme_load_failure_parse_error">Nie można załadować motywu {0}, wróć do motywu domyślnego</system:String>
<system:String x:Key="ThemeFolder">Theme Folder</system:String> <system:String x:Key="ThemeFolder">Folder Motywu</system:String>
<system:String x:Key="OpenThemeFolder">Open Theme Folder</system:String> <system:String x:Key="OpenThemeFolder">Otwórz folder motywu</system:String>
<system:String x:Key="ColorScheme">Color Scheme</system:String> <system:String x:Key="ColorScheme">Schemat kolorów</system:String>
<system:String x:Key="ColorSchemeSystem">System Default</system:String> <system:String x:Key="ColorSchemeSystem">Domyślne ustawienie systemowe</system:String>
<system:String x:Key="ColorSchemeLight">Light</system:String> <system:String x:Key="ColorSchemeLight">Jasny</system:String>
<system:String x:Key="ColorSchemeDark">Dark</system:String> <system:String x:Key="ColorSchemeDark">Ciemny</system:String>
<system:String x:Key="SoundEffect">Sound Effect</system:String> <system:String x:Key="SoundEffect">Efekty dźwiękowe</system:String>
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String> <system:String x:Key="SoundEffectTip">Odtwarzaj krótki dźwięk po otwarciu okna wyszukiwania</system:String>
<system:String x:Key="Animation">Animation</system:String> <system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="AnimationTip">Use Animation in UI</system:String> <system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="Animation">Animacja</system:String>
<system:String x:Key="AnimationSpeedTip">The speed of the UI animation</system:String> <system:String x:Key="AnimationTip">Użyj animacji w interfejsie użytkownika</system:String>
<system:String x:Key="AnimationSpeedSlow">Slow</system:String> <system:String x:Key="AnimationSpeed">Szybkość animacji</system:String>
<system:String x:Key="AnimationSpeedMedium">Medium</system:String> <system:String x:Key="AnimationSpeedTip">Szybkość animacji interfejsu użytkownika</system:String>
<system:String x:Key="AnimationSpeedFast">Fast</system:String> <system:String x:Key="AnimationSpeedSlow">Wolna</system:String>
<system:String x:Key="AnimationSpeedCustom">Custom</system:String> <system:String x:Key="AnimationSpeedMedium">Średnia</system:String>
<system:String x:Key="Clock">Clock</system:String> <system:String x:Key="AnimationSpeedFast">Szybka</system:String>
<system:String x:Key="Date">Date</system:String> <system:String x:Key="AnimationSpeedCustom">Niestandardowa</system:String>
<system:String x:Key="Clock">Zegar</system:String>
<system:String x:Key="Date">Data</system:String>
<!-- Setting Hotkey --> <!-- Setting Hotkey -->
<system:String x:Key="hotkey">Skrót klawiszowy</system:String> <system:String x:Key="hotkey">Skrót klawiszowy</system:String>
<system:String x:Key="hotkeys">Skrót klawiszowy</system:String> <system:String x:Key="hotkeys">Skrót klawiszowy</system:String>
<system:String x:Key="flowlauncherHotkey">Skrót klawiszowy Flow Launcher</system:String> <system:String x:Key="flowlauncherHotkey">Skrót klawiszowy Flow Launcher</system:String>
<system:String x:Key="flowlauncherHotkeyToolTip">Enter shortcut to show/hide Flow Launcher.</system:String> <system:String x:Key="flowlauncherHotkeyToolTip">Wprowadź skrót, aby pokazać/ukryć Flow Launcher.</system:String>
<system:String x:Key="previewHotkey">Preview Hotkey</system:String> <system:String x:Key="previewHotkey">Podgląd skrótu</system:String>
<system:String x:Key="previewHotkeyToolTip">Enter shortcut to show/hide preview in search window.</system:String> <system:String x:Key="previewHotkeyToolTip">Wprowadź skrót, aby pokazać/ukryć podgląd w oknie wyszukiwania.</system:String>
<system:String x:Key="openResultModifiers">Modyfikatory klawiszów otwierających wyniki</system:String> <system:String x:Key="openResultModifiers">Modyfikatory klawiszów otwierających wyniki</system:String>
<system:String x:Key="openResultModifiersToolTip">Select a modifier key to open selected result via keyboard.</system:String> <system:String x:Key="openResultModifiersToolTip">Select a modifier key to open selected result via keyboard.</system:String>
<system:String x:Key="showOpenResultHotkey">Pokaż skrót klawiszowy</system:String> <system:String x:Key="showOpenResultHotkey">Pokaż skrót klawiszowy</system:String>
@ -243,27 +245,27 @@
<!-- FileManager Setting Dialog --> <!-- FileManager Setting Dialog -->
<system:String x:Key="fileManagerWindow">Select File Manager</system:String> <system:String x:Key="fileManagerWindow">Select File Manager</system:String>
<system:String x:Key="fileManager_tips">Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are &quot;%d&quot;, and a path is entered at that location. For example, If a command is required such as &quot;totalcmd.exe /A c:\windows&quot;, argument is /A &quot;%d&quot;.</system:String> <system:String x:Key="fileManager_tips">Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are &quot;%d&quot;, and a path is entered at that location. For example, If a command is required such as &quot;totalcmd.exe /A c:\windows&quot;, argument is /A &quot;%d&quot;.</system:String>
<system:String x:Key="fileManager_tips2">&quot;%f&quot; 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 &quot;Arg for File&quot; item. If the file manager does not have that function, you can use &quot;%d&quot;.</system:String> <system:String x:Key="fileManager_tips2">&quot;%f&quot; jest argumentem reprezentującym ścieżkę do pliku. Służy do podkreślenia nazwy pliku/folderu podczas otwierania określonej lokalizacji pliku w menedżerze plików innych firm. Ten argument jest dostępny tylko w pozycji &quot;Arg dla pliku&quot;. Jeśli menedżer plików nie ma tej funkcji, możesz użyć &quot;%d&quot;.</system:String>
<system:String x:Key="fileManager_name">File Manager</system:String> <system:String x:Key="fileManager_name">Menadżer plików</system:String>
<system:String x:Key="fileManager_profile_name">Profile Name</system:String> <system:String x:Key="fileManager_profile_name">Nazwa profilu</system:String>
<system:String x:Key="fileManager_path">File Manager Path</system:String> <system:String x:Key="fileManager_path">Ścieżka menedżera plików</system:String>
<system:String x:Key="fileManager_directory_arg">Arg For Folder</system:String> <system:String x:Key="fileManager_directory_arg">Arg dla folderu</system:String>
<system:String x:Key="fileManager_file_arg">Arg For File</system:String> <system:String x:Key="fileManager_file_arg">Arg dla pliku</system:String>
<!-- DefaultBrowser Setting Dialog --> <!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Domyślna przeglądarka</system:String> <system:String x:Key="defaultBrowserTitle">Domyślna przeglądarka</system:String>
<system:String x:Key="defaultBrowser_tips">The default setting follows the OS default browser setting. If specified separately, flow uses that browser.</system:String> <system:String x:Key="defaultBrowser_tips">Ustawienie domyślne jest zgodne z domyślnym ustawieniem przeglądarki systemu operacyjnego. Jeśli określono to oddzielnie, flow korzysta z tej przeglądarki.</system:String>
<system:String x:Key="defaultBrowser_name">Browser</system:String> <system:String x:Key="defaultBrowser_name">Przeglądarka</system:String>
<system:String x:Key="defaultBrowser_profile_name">Browser Name</system:String> <system:String x:Key="defaultBrowser_profile_name">Nazwa przeglądarki</system:String>
<system:String x:Key="defaultBrowser_path">Browser Path</system:String> <system:String x:Key="defaultBrowser_path">Ścieżka przeglądarki</system:String>
<system:String x:Key="defaultBrowser_newWindow">New Window</system:String> <system:String x:Key="defaultBrowser_newWindow">Nowe okno</system:String>
<system:String x:Key="defaultBrowser_newTab">New Tab</system:String> <system:String x:Key="defaultBrowser_newTab">Nowa zakładka</system:String>
<system:String x:Key="defaultBrowser_parameter">Private Mode</system:String> <system:String x:Key="defaultBrowser_parameter">Tryb prywatny</system:String>
<!-- Priority Setting Dialog --> <!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Change Priority</system:String> <system:String x:Key="changePriorityWindow">Zmień priorytet</system:String>
<system:String x:Key="priority_tips">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</system:String> <system:String x:Key="priority_tips">Im większa liczba, tym wyższa pozycja w rankingu. Spróbuj ustawić go jako 5. Jeśli chcesz, aby wyniki były niższe niż w przypadku jakiejkolwiek innej wtyczki, podaj liczbę ujemną</system:String>
<system:String x:Key="invalidPriority">Please provide an valid integer for Priority!</system:String> <system:String x:Key="invalidPriority">Podaj prawidłową liczbę całkowitą dla priorytetu!</system:String>
<!-- Action Keyword Setting Dialog --> <!-- Action Keyword Setting Dialog -->
<system:String x:Key="oldActionKeywords">Stary wyzwalacz</system:String> <system:String x:Key="oldActionKeywords">Stary wyzwalacz</system:String>
@ -274,26 +276,26 @@
<system:String x:Key="newActionKeywordsCannotBeEmpty">Nowy wyzwalacz nie może być pusty</system:String> <system:String x:Key="newActionKeywordsCannotBeEmpty">Nowy wyzwalacz nie może być pusty</system:String>
<system:String x:Key="newActionKeywordsHasBeenAssigned">Ten wyzwalacz został już przypisany do innej wtyczki, musisz podać inny wyzwalacz.</system:String> <system:String x:Key="newActionKeywordsHasBeenAssigned">Ten wyzwalacz został już przypisany do innej wtyczki, musisz podać inny wyzwalacz.</system:String>
<system:String x:Key="success">Sukces</system:String> <system:String x:Key="success">Sukces</system:String>
<system:String x:Key="completedSuccessfully">Completed successfully</system:String> <system:String x:Key="completedSuccessfully">Zakończono pomyślnie</system:String>
<system:String x:Key="actionkeyword_tips">Użyj * jeżeli nie chcesz podawać wyzwalacza</system:String> <system:String x:Key="actionkeyword_tips">Użyj * jeżeli nie chcesz podawać wyzwalacza</system:String>
<!-- Custom Query Hotkey Dialog --> <!-- Custom Query Hotkey Dialog -->
<system:String x:Key="customeQueryHotkeyTitle">Skrót klawiszowy niestandardowych zapyta</system:String> <system:String x:Key="customeQueryHotkeyTitle">Skrót klawiszowy niestandardowych zapyta</system:String>
<system:String x:Key="customeQueryHotkeyTips">Press a custom hotkey to open Flow Launcher and input the specified query automatically.</system:String> <system:String x:Key="customeQueryHotkeyTips">Naciśnij niestandardowy klawisz skrótu, aby otworzyć Flow Launcher i automatycznie wprowadzić określone zapytanie.</system:String>
<system:String x:Key="preview">Podgląd</system:String> <system:String x:Key="preview">Podgląd</system:String>
<system:String x:Key="hotkeyIsNotUnavailable">Skrót klawiszowy jest niedostępny, musisz podać inny skrót klawiszowy</system:String> <system:String x:Key="hotkeyIsNotUnavailable">Skrót klawiszowy jest niedostępny, musisz podać inny skrót klawiszowy</system:String>
<system:String x:Key="invalidPluginHotkey">Niepoprawny skrót klawiszowy</system:String> <system:String x:Key="invalidPluginHotkey">Niepoprawny skrót klawiszowy</system:String>
<system:String x:Key="update">Aktualizuj</system:String> <system:String x:Key="update">Aktualizuj</system:String>
<!-- Custom Query Shortcut Dialog --> <!-- Custom Query Shortcut Dialog -->
<system:String x:Key="customeQueryShortcutTitle">Custom Query Shortcut</system:String> <system:String x:Key="customeQueryShortcutTitle">Niestandardowy skrót zapytania</system:String>
<system:String x:Key="customeQueryShortcutTips">Enter a shortcut that automatically expands to the specified query.</system:String> <system:String x:Key="customeQueryShortcutTips">Wprowadź skrót, który automatycznie rozszerzy się do określonego zapytania.</system:String>
<system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">A shortcut is expanded when it exactly matches the query. <system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">Skrót jest rozwijany, gdy dokładnie pasuje do zapytania.
If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query. Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do dowolnej pozycji w zapytaniu. Wbudowane skróty pasują do każdej pozycji w zapytaniu.
</system:String> </system:String>
<system:String x:Key="duplicateShortcut">Shortcut already exists, please enter a new Shortcut or edit the existing one.</system:String> <system:String x:Key="duplicateShortcut">Skrót już istnieje, wprowadź nowy skrót lub edytuj istniejący.</system:String>
<system:String x:Key="emptyShortcut">Shortcut and/or its expansion is empty.</system:String> <system:String x:Key="emptyShortcut">Skrót i/lub jego rozwinięcie jest puste.</system:String>
<!-- Hotkey Control --> <!-- Hotkey Control -->
<system:String x:Key="hotkeyUnavailable">Niepoprawny skrót klawiszowy</system:String> <system:String x:Key="hotkeyUnavailable">Niepoprawny skrót klawiszowy</system:String>
@ -315,51 +317,51 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
<system:String x:Key="reportWindow_flowlauncher_got_an_error">W programie Flow Launcher wystąpił błąd</system:String> <system:String x:Key="reportWindow_flowlauncher_got_an_error">W programie Flow Launcher wystąpił błąd</system:String>
<!-- General Notice --> <!-- General Notice -->
<system:String x:Key="pleaseWait">Please wait...</system:String> <system:String x:Key="pleaseWait">Proszę czekać...</system:String>
<!-- Update --> <!-- Update -->
<system:String x:Key="update_flowlauncher_update_check">Checking for new update</system:String> <system:String x:Key="update_flowlauncher_update_check">Sprawdzanie nowej aktualizacji</system:String>
<system:String x:Key="update_flowlauncher_already_on_latest">You already have the latest Flow Launcher version</system:String> <system:String x:Key="update_flowlauncher_already_on_latest">Masz już najnowszą wersję Flow Launcher</system:String>
<system:String x:Key="update_flowlauncher_update_found">Update found</system:String> <system:String x:Key="update_flowlauncher_update_found">Znaleziono aktualizację</system:String>
<system:String x:Key="update_flowlauncher_updating">Updating...</system:String> <system:String x:Key="update_flowlauncher_updating">Aktualizacja...</system:String>
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data"> <system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">
Flow Launcher was not able to move your user profile data to the new update version. Flow Launcher nie był w stanie przenieść danych profilu użytkownika do nowej wersji aktualizacji.
Please manually move your profile data folder from {0} to {1} Ręcznie przenieś folder danych profilu z {0} do {1}
</system:String> </system:String>
<system:String x:Key="update_flowlauncher_new_update">New Update</system:String> <system:String x:Key="update_flowlauncher_new_update">Nowa aktualizacja</system:String>
<system:String x:Key="update_flowlauncher_update_new_version_available">Nowa wersja Flow Launcher {0} jest dostępna</system:String> <system:String x:Key="update_flowlauncher_update_new_version_available">Nowa wersja Flow Launcher {0} jest dostępna</system:String>
<system:String x:Key="update_flowlauncher_update_error">Wystąpił błąd podczas instalowania aktualizacji programu</system:String> <system:String x:Key="update_flowlauncher_update_error">Wystąpił błąd podczas instalowania aktualizacji programu</system:String>
<system:String x:Key="update_flowlauncher_update">Aktualizuj</system:String> <system:String x:Key="update_flowlauncher_update">Aktualizuj</system:String>
<system:String x:Key="update_flowlauncher_update_cancel">Anuluj</system:String> <system:String x:Key="update_flowlauncher_update_cancel">Anuluj</system:String>
<system:String x:Key="update_flowlauncher_fail">Update Failed</system:String> <system:String x:Key="update_flowlauncher_fail">Aktualizacja nie powiodła się</system:String>
<system:String x:Key="update_flowlauncher_check_connection">Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.</system:String> <system:String x:Key="update_flowlauncher_check_connection">Sprawdź połączenie i spróbuj zaktualizować ustawienia proxy do github-cloud.s3.amazonaws.com.</system:String>
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">Aby dokończyć proces aktualizacji Flow Launcher musi zostać zresetowany</system:String> <system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">Aby dokończyć proces aktualizacji Flow Launcher musi zostać zresetowany</system:String>
<system:String x:Key="update_flowlauncher_update_update_files">Następujące pliki zostaną zaktualizowane</system:String> <system:String x:Key="update_flowlauncher_update_update_files">Następujące pliki zostaną zaktualizowane</system:String>
<system:String x:Key="update_flowlauncher_update_files">Aktualizuj pliki</system:String> <system:String x:Key="update_flowlauncher_update_files">Aktualizuj pliki</system:String>
<system:String x:Key="update_flowlauncher_update_update_description">Opis aktualizacji</system:String> <system:String x:Key="update_flowlauncher_update_update_description">Opis aktualizacji</system:String>
<!-- Welcome Window --> <!-- Welcome Window -->
<system:String x:Key="Skip">Skip</system:String> <system:String x:Key="Skip">Pomiń</system:String>
<system:String x:Key="Welcome_Page1_Title">Welcome to Flow Launcher</system:String> <system:String x:Key="Welcome_Page1_Title">Witamy w Flow Launcher</system:String>
<system:String x:Key="Welcome_Page1_Text01">Hello, this is the first time you are running Flow Launcher!</system:String> <system:String x:Key="Welcome_Page1_Text01">Witaj, po raz pierwszy uruchamiasz Flow Launcher!</system:String>
<system:String x:Key="Welcome_Page1_Text02">Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language</system:String> <system:String x:Key="Welcome_Page1_Text02">Przed rozpoczęciem ten kreator pomoże skonfigurować Flow Launcher. Jeśli chcesz, możesz to pominąć. Proszę wybierz język</system:String>
<system:String x:Key="Welcome_Page2_Title">Search and run all files and applications on your PC</system:String> <system:String x:Key="Welcome_Page2_Title">Wyszukiwanie i uruchamianie wszystkich plików i aplikacji na PC</system:String>
<system:String x:Key="Welcome_Page2_Text01">Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.</system:String> <system:String x:Key="Welcome_Page2_Text01">Przeszukuj wszystko, od aplikacji, plików, zakładek, YouTube, X i nie tylko. Wszystko to z komfortowej klawiatury, bez konieczności dotykania myszy.</system:String>
<system:String x:Key="Welcome_Page2_Text02">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.</system:String> <system:String x:Key="Welcome_Page2_Text02">Flow Launcher uruchamia się za pomocą poniższego skrótu klawiszowego, śmiało i wypróbuj go teraz. Aby to zmienić, kliknij dane wejściowe i naciśnij żądany klawisz skrótu na klawiaturze.</system:String>
<system:String x:Key="Welcome_Page3_Title">Hotkeys</system:String> <system:String x:Key="Welcome_Page3_Title">Skróty klawiszowe</system:String>
<system:String x:Key="Welcome_Page4_Title">Action Keyword and Commands</system:String> <system:String x:Key="Welcome_Page4_Title">Słowo kluczowe akcji i polecenia</system:String>
<system:String x:Key="Welcome_Page4_Text01">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.</system:String> <system:String x:Key="Welcome_Page4_Text01">Przeszukuj sieć, uruchamiaj aplikacje lub uruchamiaj różne funkcje za pomocą wtyczek Flow Launcher. Niektóre funkcje zaczynają się od słowa kluczowego akcji, a w razie potrzeby można ich używać bez słów kluczowych akcji. Wypróbuj poniższe zapytania w Flow Launcher.</system:String>
<system:String x:Key="Welcome_Page5_Title">Let's Start Flow Launcher</system:String> <system:String x:Key="Welcome_Page5_Title">Uruchom Flow Launcher</system:String>
<system:String x:Key="Welcome_Page5_Text01">Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)</system:String> <system:String x:Key="Welcome_Page5_Text01">Zakończono. Ciesz się Flow Launcher. Nie zapomnij o klawiszu skrótu, aby rozpocząć :)</system:String>
<!-- General Guide & Hotkey --> <!-- General Guide & Hotkey -->
<system:String x:Key="HotkeyUpDownDesc">Back / Context Menu</system:String> <system:String x:Key="HotkeyUpDownDesc">Powrót / Menu kontekstowe</system:String>
<system:String x:Key="HotkeyLeftRightDesc">Item Navigation</system:String> <system:String x:Key="HotkeyLeftRightDesc">Nawigacja pozycji</system:String>
<system:String x:Key="HotkeyShiftEnterDesc">Open Context Menu</system:String> <system:String x:Key="HotkeyShiftEnterDesc">Otwórz menu kontekstowe</system:String>
<system:String x:Key="HotkeyCtrlEnterDesc">Open Containing Folder</system:String> <system:String x:Key="HotkeyCtrlEnterDesc">Otwórz folder zawierający</system:String>
<system:String x:Key="HotkeyCtrlShiftEnterDesc">Run as Admin / Open Folder in Default File Manager</system:String> <system:String x:Key="HotkeyCtrlShiftEnterDesc">Uruchom jako administrator / Otwórz folder w domyślnym menedżerze plików</system:String>
<system:String x:Key="HotkeyCtrlHDesc">Query History</system:String> <system:String x:Key="HotkeyCtrlHDesc">Historia zapytań</system:String>
<system:String x:Key="HotkeyESCDesc">Back to Result in Context Menu</system:String> <system:String x:Key="HotkeyESCDesc">Back to Result in Context Menu</system:String>
<system:String x:Key="HotkeyTabDesc">Autocomplete</system:String> <system:String x:Key="HotkeyTabDesc">Autocomplete</system:String>
<system:String x:Key="HotkeyRunDesc">Open / Run Selected Item</system:String> <system:String x:Key="HotkeyRunDesc">Open / Run Selected Item</system:String>

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib"> <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- MainWindow --> <!-- MainWindow -->
<system:String x:Key="registerHotkeyFailed">Failed to register hotkey &quot;{0}&quot;. The hotkey may be in use by another program. Change to a different hotkey, or exit another program.</system:String> <system:String x:Key="registerHotkeyFailed">Falha em registrar a tecla de atalho &quot;{0}&quot;. A combinação pode estar em uso por outro programa. Mude para uma tecla de atalho diferente, ou encerre o outro programa.</system:String>
<system:String x:Key="MessageBoxTitle">Flow Launcher</system:String> <system:String x:Key="MessageBoxTitle">Flow Launcher</system:String>
<system:String x:Key="couldnotStartCmd">Não foi possível iniciar {0}</system:String> <system:String x:Key="couldnotStartCmd">Não foi possível iniciar {0}</system:String>
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Formato de plugin Flow Launcher inválido</system:String> <system:String x:Key="invalidFlowLauncherPluginFileFormat">Formato de plugin Flow Launcher inválido</system:String>
@ -154,24 +154,26 @@
<system:String x:Key="ColorSchemeDark">Escuro</system:String> <system:String x:Key="ColorSchemeDark">Escuro</system:String>
<system:String x:Key="SoundEffect">Efeito Sonoro</system:String> <system:String x:Key="SoundEffect">Efeito Sonoro</system:String>
<system:String x:Key="SoundEffectTip">Reproduzir um pequeno som ao abrir a janela de pesquisa</system:String> <system:String x:Key="SoundEffectTip">Reproduzir um pequeno som ao abrir a janela de pesquisa</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animação</system:String> <system:String x:Key="Animation">Animação</system:String>
<system:String x:Key="AnimationTip">Utilizar Animação na Interface</system:String> <system:String x:Key="AnimationTip">Utilizar Animação na Interface</system:String>
<system:String x:Key="AnimationSpeed">Velocidade de Animação</system:String> <system:String x:Key="AnimationSpeed">Velocidade de Animação</system:String>
<system:String x:Key="AnimationSpeedTip">Altere a velocidade da animação da interface</system:String> <system:String x:Key="AnimationSpeedTip">Altere a velocidade da animação da interface</system:String>
<system:String x:Key="AnimationSpeedSlow">Slow</system:String> <system:String x:Key="AnimationSpeedSlow">Lento</system:String>
<system:String x:Key="AnimationSpeedMedium">Medium</system:String> <system:String x:Key="AnimationSpeedMedium">Médio</system:String>
<system:String x:Key="AnimationSpeedFast">Fast</system:String> <system:String x:Key="AnimationSpeedFast">Rápido</system:String>
<system:String x:Key="AnimationSpeedCustom">Custom</system:String> <system:String x:Key="AnimationSpeedCustom">Personalizado</system:String>
<system:String x:Key="Clock">Clock</system:String> <system:String x:Key="Clock">Relógio</system:String>
<system:String x:Key="Date">Date</system:String> <system:String x:Key="Date">Data</system:String>
<!-- Setting Hotkey --> <!-- Setting Hotkey -->
<system:String x:Key="hotkey">Atalho</system:String> <system:String x:Key="hotkey">Atalho</system:String>
<system:String x:Key="hotkeys">Atalho</system:String> <system:String x:Key="hotkeys">Atalho</system:String>
<system:String x:Key="flowlauncherHotkey">Atalho do Flow Launcher</system:String> <system:String x:Key="flowlauncherHotkey">Atalho do Flow Launcher</system:String>
<system:String x:Key="flowlauncherHotkeyToolTip">Digite o atalho para exibir/ocultar o Flow Launcher.</system:String> <system:String x:Key="flowlauncherHotkeyToolTip">Digite o atalho para exibir/ocultar o Flow Launcher.</system:String>
<system:String x:Key="previewHotkey">Preview Hotkey</system:String> <system:String x:Key="previewHotkey">Atalho de pré-visualização</system:String>
<system:String x:Key="previewHotkeyToolTip">Enter shortcut to show/hide preview in search window.</system:String> <system:String x:Key="previewHotkeyToolTip">Digite o atalho para exibir/ocultar a pré-visualização na janela de pesquisa.</system:String>
<system:String x:Key="openResultModifiers">Modificadores de resultado aberto</system:String> <system:String x:Key="openResultModifiers">Modificadores de resultado aberto</system:String>
<system:String x:Key="openResultModifiersToolTip">Selecione uma tecla modificadora para abrir o resultar selecionado pelo teclado.</system:String> <system:String x:Key="openResultModifiersToolTip">Selecione uma tecla modificadora para abrir o resultar selecionado pelo teclado.</system:String>
<system:String x:Key="showOpenResultHotkey">Mostrar tecla de atalho</system:String> <system:String x:Key="showOpenResultHotkey">Mostrar tecla de atalho</system:String>
@ -181,23 +183,23 @@
<system:String x:Key="builtinShortcuts">Built-in Shortcut</system:String> <system:String x:Key="builtinShortcuts">Built-in Shortcut</system:String>
<system:String x:Key="customQuery">Consulta</system:String> <system:String x:Key="customQuery">Consulta</system:String>
<system:String x:Key="customShortcut">Atalho</system:String> <system:String x:Key="customShortcut">Atalho</system:String>
<system:String x:Key="customShortcutExpansion">Expansion</system:String> <system:String x:Key="customShortcutExpansion">Expansão</system:String>
<system:String x:Key="builtinShortcutDescription">Descrição</system:String> <system:String x:Key="builtinShortcutDescription">Descrição</system:String>
<system:String x:Key="delete">Apagar</system:String> <system:String x:Key="delete">Apagar</system:String>
<system:String x:Key="edit">Editar</system:String> <system:String x:Key="edit">Editar</system:String>
<system:String x:Key="add">Adicionar</system:String> <system:String x:Key="add">Adicionar</system:String>
<system:String x:Key="pleaseSelectAnItem">Por favor selecione um item</system:String> <system:String x:Key="pleaseSelectAnItem">Por favor selecione um item</system:String>
<system:String x:Key="deleteCustomHotkeyWarning">Tem cereza de que deseja deletar o atalho {0} do plugin?</system:String> <system:String x:Key="deleteCustomHotkeyWarning">Tem cereza de que deseja deletar o atalho {0} do plugin?</system:String>
<system:String x:Key="deleteCustomShortcutWarning">Are you sure you want to delete shortcut: {0} with expansion {1}?</system:String> <system:String x:Key="deleteCustomShortcutWarning">Tem certeza que deseja excluir o atalho: {0} com expansão {1}?</system:String>
<system:String x:Key="shortcut_clipboard_description">Get text from clipboard.</system:String> <system:String x:Key="shortcut_clipboard_description">Exibe o texto da área de transferência.</system:String>
<system:String x:Key="shortcut_active_explorer_path">Get path from active explorer.</system:String> <system:String x:Key="shortcut_active_explorer_path">Exibe o caminho do explorador ativo.</system:String>
<system:String x:Key="queryWindowShadowEffect">Efeito de sombra da janela de consulta</system:String> <system:String x:Key="queryWindowShadowEffect">Efeito de sombra da janela de consulta</system:String>
<system:String x:Key="shadowEffectCPUUsage">Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.</system:String> <system:String x:Key="shadowEffectCPUUsage">O efeito de sombra tem um uso substancial da GPU. Não recomendado se o desempenho do seu computador é limitado.</system:String>
<system:String x:Key="windowWidthSize">Largura da janela</system:String> <system:String x:Key="windowWidthSize">Largura da janela</system:String>
<system:String x:Key="windowWidthSizeToolTip">You can also quickly adjust this by using Ctrl+[ and Ctrl+].</system:String> <system:String x:Key="windowWidthSizeToolTip">Você também pode ajustar isso rapidamente usando Ctrl+[ e Ctrl+].</system:String>
<system:String x:Key="useGlyphUI">Usar Segoe Fluent Icons</system:String> <system:String x:Key="useGlyphUI">Usar Segoe Fluent Icons</system:String>
<system:String x:Key="useGlyphUIEffect">Usar Segoe Fluent Icons para resultados da consulta quando suportado</system:String> <system:String x:Key="useGlyphUIEffect">Usar Segoe Fluent Icons para resultados da consulta quando suportado</system:String>
<system:String x:Key="flowlauncherPressHotkey">Press Key</system:String> <system:String x:Key="flowlauncherPressHotkey">Apertar Tecla</system:String>
<!-- Setting Proxy --> <!-- Setting Proxy -->
<system:String x:Key="proxy">Proxy HTTP</system:String> <system:String x:Key="proxy">Proxy HTTP</system:String>
@ -224,7 +226,7 @@
<system:String x:Key="icons">Ícones</system:String> <system:String x:Key="icons">Ícones</system:String>
<system:String x:Key="about_activate_times">Você ativou o Flow Launcher {0} vezes</system:String> <system:String x:Key="about_activate_times">Você ativou o Flow Launcher {0} vezes</system:String>
<system:String x:Key="checkUpdates">Procurar atualizações</system:String> <system:String x:Key="checkUpdates">Procurar atualizações</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String> <system:String x:Key="BecomeASponsor">Torne-se um Sponsor</system:String>
<system:String x:Key="newVersionTips">A nova versão {0} está disponível, por favor reinicie o Flow Launcher.</system:String> <system:String x:Key="newVersionTips">A nova versão {0} está disponível, por favor reinicie o Flow Launcher.</system:String>
<system:String x:Key="checkUpdatesFailed">Falha ao procurar atualizações, confira sua conexão e configuração de proxy para api.github.com.</system:String> <system:String x:Key="checkUpdatesFailed">Falha ao procurar atualizações, confira sua conexão e configuração de proxy para api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed"> <system:String x:Key="downloadUpdatesFailed">
@ -234,36 +236,36 @@
<system:String x:Key="releaseNotes">Notas de Versão:</system:String> <system:String x:Key="releaseNotes">Notas de Versão:</system:String>
<system:String x:Key="documentation">Dicas de Uso</system:String> <system:String x:Key="documentation">Dicas de Uso</system:String>
<system:String x:Key="devtool">Ferramentas de Desenvolvedor</system:String> <system:String x:Key="devtool">Ferramentas de Desenvolvedor</system:String>
<system:String x:Key="settingfolder">Setting Folder</system:String> <system:String x:Key="settingfolder">Pasta de configuração</system:String>
<system:String x:Key="logfolder">Log Folder</system:String> <system:String x:Key="logfolder">Pasta de Registro</system:String>
<system:String x:Key="clearlogfolder">Clear Logs</system:String> <system:String x:Key="clearlogfolder">Limpar Registros</system:String>
<system:String x:Key="clearlogfolderMessage">Are you sure you want to delete all logs?</system:String> <system:String x:Key="clearlogfolderMessage">Tem certeza que quer excluir todos os registros?</system:String>
<system:String x:Key="welcomewindow">Assistente</system:String> <system:String x:Key="welcomewindow">Assistente</system:String>
<!-- FileManager Setting Dialog --> <!-- FileManager Setting Dialog -->
<system:String x:Key="fileManagerWindow">Select File Manager</system:String> <system:String x:Key="fileManagerWindow">Selecione o Gerenciador de Arquivos</system:String>
<system:String x:Key="fileManager_tips">Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are &quot;%d&quot;, and a path is entered at that location. For example, If a command is required such as &quot;totalcmd.exe /A c:\windows&quot;, argument is /A &quot;%d&quot;.</system:String> <system:String x:Key="fileManager_tips">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 &quot;%d&quot;, e um caminho é digitado naquela localização. Por exemplo, se um comando é necessário tal qual &quot;totalcmd.exe /A c:\windows&quot;, o argumento é /A &quot;%d&quot;.</system:String>
<system:String x:Key="fileManager_tips2">&quot;%f&quot; 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 &quot;Arg for File&quot; item. If the file manager does not have that function, you can use &quot;%d&quot;.</system:String> <system:String x:Key="fileManager_tips2">&quot;%f&quot; é 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 &quot;Arg para Arquivo&quot;. Se o gerenciador de arquivos não tem essa função, você pode usar &quot;%d&quot;.</system:String>
<system:String x:Key="fileManager_name">Gerenciador de Arquivos</system:String> <system:String x:Key="fileManager_name">Gerenciador de Arquivos</system:String>
<system:String x:Key="fileManager_profile_name">Profile Name</system:String> <system:String x:Key="fileManager_profile_name">Nome do Perfil</system:String>
<system:String x:Key="fileManager_path">File Manager Path</system:String> <system:String x:Key="fileManager_path">Caminho do Gerenciador de Arquivos</system:String>
<system:String x:Key="fileManager_directory_arg">Arg For Folder</system:String> <system:String x:Key="fileManager_directory_arg">Arg para Pasta</system:String>
<system:String x:Key="fileManager_file_arg">Arg For File</system:String> <system:String x:Key="fileManager_file_arg">Arg para Arquivo</system:String>
<!-- DefaultBrowser Setting Dialog --> <!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Navegador da Web Padrão</system:String> <system:String x:Key="defaultBrowserTitle">Navegador da Web Padrão</system:String>
<system:String x:Key="defaultBrowser_tips">The default setting follows the OS default browser setting. If specified separately, flow uses that browser.</system:String> <system:String x:Key="defaultBrowser_tips">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.</system:String>
<system:String x:Key="defaultBrowser_name">Navegador</system:String> <system:String x:Key="defaultBrowser_name">Navegador</system:String>
<system:String x:Key="defaultBrowser_profile_name">Nome do Navegador</system:String> <system:String x:Key="defaultBrowser_profile_name">Nome do Navegador</system:String>
<system:String x:Key="defaultBrowser_path">Browser Path</system:String> <system:String x:Key="defaultBrowser_path">Caminho do Navegador</system:String>
<system:String x:Key="defaultBrowser_newWindow">Nova Janela</system:String> <system:String x:Key="defaultBrowser_newWindow">Nova Janela</system:String>
<system:String x:Key="defaultBrowser_newTab">Nova Aba</system:String> <system:String x:Key="defaultBrowser_newTab">Nova Aba</system:String>
<system:String x:Key="defaultBrowser_parameter">Private Mode</system:String> <system:String x:Key="defaultBrowser_parameter">Modo Privado</system:String>
<!-- Priority Setting Dialog --> <!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Alterar Prioridade</system:String> <system:String x:Key="changePriorityWindow">Alterar Prioridade</system:String>
<system:String x:Key="priority_tips">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</system:String> <system:String x:Key="priority_tips">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</system:String>
<system:String x:Key="invalidPriority">Please provide an valid integer for Priority!</system:String> <system:String x:Key="invalidPriority">Por favor, forneça um inteiro válido em Prioridade!</system:String>
<!-- Action Keyword Setting Dialog --> <!-- Action Keyword Setting Dialog -->
<system:String x:Key="oldActionKeywords">Antiga palavra-chave da ação</system:String> <system:String x:Key="oldActionKeywords">Antiga palavra-chave da ação</system:String>
@ -279,21 +281,21 @@
<!-- Custom Query Hotkey Dialog --> <!-- Custom Query Hotkey Dialog -->
<system:String x:Key="customeQueryHotkeyTitle">Atalho de Consulta Personalizada</system:String> <system:String x:Key="customeQueryHotkeyTitle">Atalho de Consulta Personalizada</system:String>
<system:String x:Key="customeQueryHotkeyTips">Press a custom hotkey to open Flow Launcher and input the specified query automatically.</system:String> <system:String x:Key="customeQueryHotkeyTips">Aperte uma tecla de atalho personalizada para abrir o Flow Launcher e insira a pesquisa especificada automaticamente.</system:String>
<system:String x:Key="preview">Prévia</system:String> <system:String x:Key="preview">Prévia</system:String>
<system:String x:Key="hotkeyIsNotUnavailable">Atalho indisponível, escolha outro</system:String> <system:String x:Key="hotkeyIsNotUnavailable">Atalho indisponível, escolha outro</system:String>
<system:String x:Key="invalidPluginHotkey">Atalho de plugin inválido</system:String> <system:String x:Key="invalidPluginHotkey">Atalho de plugin inválido</system:String>
<system:String x:Key="update">Atualizar</system:String> <system:String x:Key="update">Atualizar</system:String>
<!-- Custom Query Shortcut Dialog --> <!-- Custom Query Shortcut Dialog -->
<system:String x:Key="customeQueryShortcutTitle">Custom Query Shortcut</system:String> <system:String x:Key="customeQueryShortcutTitle">Atalho Personalidado de Pesquisa</system:String>
<system:String x:Key="customeQueryShortcutTips">Enter a shortcut that automatically expands to the specified query.</system:String> <system:String x:Key="customeQueryShortcutTips">Introduza um atalho que expanda automaticamente para a pesquisa especificada.</system:String>
<system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">A shortcut is expanded when it exactly matches the query. <system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">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. If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query.
</system:String> </system:String>
<system:String x:Key="duplicateShortcut">Shortcut already exists, please enter a new Shortcut or edit the existing one.</system:String> <system:String x:Key="duplicateShortcut">O atalho já existe, por favor, digite um novo atalho ou edite o existente.</system:String>
<system:String x:Key="emptyShortcut">Shortcut and/or its expansion is empty.</system:String> <system:String x:Key="emptyShortcut">Atalho e/ou sua expansão está vazia.</system:String>
<!-- Hotkey Control --> <!-- Hotkey Control -->
<system:String x:Key="hotkeyUnavailable">Atalho indisponível</system:String> <system:String x:Key="hotkeyUnavailable">Atalho indisponível</system:String>
@ -326,13 +328,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. 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} Please manually move your profile data folder from {0} to {1}
</system:String> </system:String>
<system:String x:Key="update_flowlauncher_new_update">New Update</system:String> <system:String x:Key="update_flowlauncher_new_update">Nova Atualização</system:String>
<system:String x:Key="update_flowlauncher_update_new_version_available">A nova versão {0} do Flow Launcher agora está disponível</system:String> <system:String x:Key="update_flowlauncher_update_new_version_available">A nova versão {0} do Flow Launcher agora está disponível</system:String>
<system:String x:Key="update_flowlauncher_update_error">Ocorreu um erro ao tentar instalar atualizações do progama</system:String> <system:String x:Key="update_flowlauncher_update_error">Ocorreu um erro ao tentar instalar atualizações do progama</system:String>
<system:String x:Key="update_flowlauncher_update">Atualizar</system:String> <system:String x:Key="update_flowlauncher_update">Atualizar</system:String>
<system:String x:Key="update_flowlauncher_update_cancel">Cancelar</system:String> <system:String x:Key="update_flowlauncher_update_cancel">Cancelar</system:String>
<system:String x:Key="update_flowlauncher_fail">Falha ao Atualizar</system:String> <system:String x:Key="update_flowlauncher_fail">Falha ao Atualizar</system:String>
<system:String x:Key="update_flowlauncher_check_connection">Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.</system:String> <system:String x:Key="update_flowlauncher_check_connection">Verifique sua conexão e tente atualizar as configurações de proxy para github-cloud.s3.amazonaws.com.</system:String>
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">Essa atualização reiniciará o Flow Launcher</system:String> <system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">Essa atualização reiniciará o Flow Launcher</system:String>
<system:String x:Key="update_flowlauncher_update_update_files">Os seguintes arquivos serão atualizados</system:String> <system:String x:Key="update_flowlauncher_update_update_files">Os seguintes arquivos serão atualizados</system:String>
<system:String x:Key="update_flowlauncher_update_files">Atualizar arquivos</system:String> <system:String x:Key="update_flowlauncher_update_files">Atualizar arquivos</system:String>
@ -341,15 +343,15 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
<!-- Welcome Window --> <!-- Welcome Window -->
<system:String x:Key="Skip">Pular</system:String> <system:String x:Key="Skip">Pular</system:String>
<system:String x:Key="Welcome_Page1_Title">Bem-vindo ao Flow Launcher</system:String> <system:String x:Key="Welcome_Page1_Title">Bem-vindo ao Flow Launcher</system:String>
<system:String x:Key="Welcome_Page1_Text01">Hello, this is the first time you are running Flow Launcher!</system:String> <system:String x:Key="Welcome_Page1_Text01">Olá, está é a primeira vez que você executa o Flow Launcher!</system:String>
<system:String x:Key="Welcome_Page1_Text02">Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language</system:String> <system:String x:Key="Welcome_Page1_Text02">Antes de começar, este assistente ajudará a configurar o Flow Launcher. Você pode pular essa etapa se quiser. Por favor, escolha um idioma</system:String>
<system:String x:Key="Welcome_Page2_Title">Search and run all files and applications on your PC</system:String> <system:String x:Key="Welcome_Page2_Title">Pesquise e execute todos os arquivos e programas no seu PC</system:String>
<system:String x:Key="Welcome_Page2_Text01">Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.</system:String> <system:String x:Key="Welcome_Page2_Text01">Pesquise tudo de programas, arquivos, favoritos, YouTube, Twitter e mais. Tudo isso do conforto do seu teclado sem precisar tocar o mouse.</system:String>
<system:String x:Key="Welcome_Page2_Text02">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.</system:String> <system:String x:Key="Welcome_Page2_Text02">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.</system:String>
<system:String x:Key="Welcome_Page3_Title">Teclas de Atalho</system:String> <system:String x:Key="Welcome_Page3_Title">Teclas de Atalho</system:String>
<system:String x:Key="Welcome_Page4_Title">Action Keyword and Commands</system:String> <system:String x:Key="Welcome_Page4_Title">Palavras-Chave de Ação e Comandos</system:String>
<system:String x:Key="Welcome_Page4_Text01">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.</system:String> <system:String x:Key="Welcome_Page4_Text01">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.</system:String>
<system:String x:Key="Welcome_Page5_Title">Let's Start Flow Launcher</system:String> <system:String x:Key="Welcome_Page5_Title">Vamos iniciar o Flow Launcher</system:String>
<system:String x:Key="Welcome_Page5_Text01">Finalizado. Aproveite o Flow Launcher. Não esqueça o atalho para iniciar :)</system:String> <system:String x:Key="Welcome_Page5_Text01">Finalizado. Aproveite o Flow Launcher. Não esqueça o atalho para iniciar :)</system:String>
<!-- General Guide & Hotkey --> <!-- General Guide & Hotkey -->
@ -357,10 +359,10 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
<system:String x:Key="HotkeyUpDownDesc">Voltar / Menu de Contexto</system:String> <system:String x:Key="HotkeyUpDownDesc">Voltar / Menu de Contexto</system:String>
<system:String x:Key="HotkeyLeftRightDesc">Item de Navegação</system:String> <system:String x:Key="HotkeyLeftRightDesc">Item de Navegação</system:String>
<system:String x:Key="HotkeyShiftEnterDesc">Abrir Menu de Contexto</system:String> <system:String x:Key="HotkeyShiftEnterDesc">Abrir Menu de Contexto</system:String>
<system:String x:Key="HotkeyCtrlEnterDesc">Open Containing Folder</system:String> <system:String x:Key="HotkeyCtrlEnterDesc">Abrir a pasta correspondente</system:String>
<system:String x:Key="HotkeyCtrlShiftEnterDesc">Run as Admin / Open Folder in Default File Manager</system:String> <system:String x:Key="HotkeyCtrlShiftEnterDesc">Executar como administrador / Abrir pasta no gerenciador de arquivos padrão</system:String>
<system:String x:Key="HotkeyCtrlHDesc">Histórico de Pesquisas</system:String> <system:String x:Key="HotkeyCtrlHDesc">Histórico de Pesquisas</system:String>
<system:String x:Key="HotkeyESCDesc">Back to Result in Context Menu</system:String> <system:String x:Key="HotkeyESCDesc">Voltar ao resultado no menu de contexto</system:String>
<system:String x:Key="HotkeyTabDesc">Autocompletar</system:String> <system:String x:Key="HotkeyTabDesc">Autocompletar</system:String>
<system:String x:Key="HotkeyRunDesc">Abrir / Executar Item Selecionado</system:String> <system:String x:Key="HotkeyRunDesc">Abrir / Executar Item Selecionado</system:String>
<system:String x:Key="HotkeyCtrlIDesc">Abrir Janela de Configurações</system:String> <system:String x:Key="HotkeyCtrlIDesc">Abrir Janela de Configurações</system:String>
@ -371,7 +373,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
<system:String x:Key="RecommendShell">&gt; ping 8.8.8.8</system:String> <system:String x:Key="RecommendShell">&gt; ping 8.8.8.8</system:String>
<system:String x:Key="RecommendShellDesc">Comando de Console</system:String> <system:String x:Key="RecommendShellDesc">Comando de Console</system:String>
<system:String x:Key="RecommendBluetooth">s Bluetooth</system:String> <system:String x:Key="RecommendBluetooth">s Bluetooth</system:String>
<system:String x:Key="RecommendBluetoothDesc">Bluetooth in Windows Settings</system:String> <system:String x:Key="RecommendBluetoothDesc">Bluetooth nas Configurações do Windows</system:String>
<system:String x:Key="RecommendAcronyms">sn</system:String> <system:String x:Key="RecommendAcronyms">sn</system:String>
<system:String x:Key="RecommendAcronymsDesc">Notas Autoadesivas</system:String> <system:String x:Key="RecommendAcronymsDesc">Notas Autoadesivas</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Escuro</system:String> <system:String x:Key="ColorSchemeDark">Escuro</system:String>
<system:String x:Key="SoundEffect">Efeitos sonoros</system:String> <system:String x:Key="SoundEffect">Efeitos sonoros</system:String>
<system:String x:Key="SoundEffectTip">Reproduzir um som ao abrir a janela de pesquisa</system:String> <system:String x:Key="SoundEffectTip">Reproduzir um som ao abrir a janela de pesquisa</system:String>
<system:String x:Key="SoundEffectVolume">Volume dos efeitos sonoros</system:String>
<system:String x:Key="SoundEffectVolumeTip">Ajustar volume dos efeitos sonoros</system:String>
<system:String x:Key="Animation">Animação</system:String> <system:String x:Key="Animation">Animação</system:String>
<system:String x:Key="AnimationTip">Utilizar animações na aplicação</system:String> <system:String x:Key="AnimationTip">Utilizar animações na aplicação</system:String>
<system:String x:Key="AnimationSpeed">Velocidade da animação</system:String> <system:String x:Key="AnimationSpeed">Velocidade da animação</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Тёмная</system:String> <system:String x:Key="ColorSchemeDark">Тёмная</system:String>
<system:String x:Key="SoundEffect">Звуковой эффект</system:String> <system:String x:Key="SoundEffect">Звуковой эффект</system:String>
<system:String x:Key="SoundEffectTip">Воспроизведение небольшого звука при открытии окна поиска</system:String> <system:String x:Key="SoundEffectTip">Воспроизведение небольшого звука при открытии окна поиска</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Анимация</system:String> <system:String x:Key="Animation">Анимация</system:String>
<system:String x:Key="AnimationTip">Использование анимации в меню</system:String> <system:String x:Key="AnimationTip">Использование анимации в меню</system:String>
<system:String x:Key="AnimationSpeed">Скорость анимации</system:String> <system:String x:Key="AnimationSpeed">Скорость анимации</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Tmavá</system:String> <system:String x:Key="ColorSchemeDark">Tmavá</system:String>
<system:String x:Key="SoundEffect">Zvukový efekt</system:String> <system:String x:Key="SoundEffect">Zvukový efekt</system:String>
<system:String x:Key="SoundEffectTip">Po otvorení okna vyhľadávania prehrať krátky zvuk</system:String> <system:String x:Key="SoundEffectTip">Po otvorení okna vyhľadávania prehrať krátky zvuk</system:String>
<system:String x:Key="SoundEffectVolume">Hlasitosť zvukového efektu</system:String>
<system:String x:Key="SoundEffectVolumeTip">Upraviť hlasitosť zvukového efektu</system:String>
<system:String x:Key="Animation">Animácia</system:String> <system:String x:Key="Animation">Animácia</system:String>
<system:String x:Key="AnimationTip">Animovať používateľské rozhranie</system:String> <system:String x:Key="AnimationTip">Animovať používateľské rozhranie</system:String>
<system:String x:Key="AnimationSpeed">Rýchlosť animácie</system:String> <system:String x:Key="AnimationSpeed">Rýchlosť animácie</system:String>
@ -171,7 +173,7 @@
<system:String x:Key="flowlauncherHotkey">Klávesová skratka pre Flow Launcher</system:String> <system:String x:Key="flowlauncherHotkey">Klávesová skratka pre Flow Launcher</system:String>
<system:String x:Key="flowlauncherHotkeyToolTip">Zadajte skratku na zobrazenie/skrytie Flow Launchera.</system:String> <system:String x:Key="flowlauncherHotkeyToolTip">Zadajte skratku na zobrazenie/skrytie Flow Launchera.</system:String>
<system:String x:Key="previewHotkey">Klávesová skratka pre náhľad</system:String> <system:String x:Key="previewHotkey">Klávesová skratka pre náhľad</system:String>
<system:String x:Key="previewHotkeyToolTip">Zadajte klávesovú skratku pre zobrazenie/skytie náhľadu vo vyhľadávacom okne.</system:String> <system:String x:Key="previewHotkeyToolTip">Zadajte klávesovú skratku pre zobrazenie/skrytie náhľadu vo vyhľadávacom okne.</system:String>
<system:String x:Key="openResultModifiers">Modifikačný kláves na otvorenie výsledkov</system:String> <system:String x:Key="openResultModifiers">Modifikačný kláves na otvorenie výsledkov</system:String>
<system:String x:Key="openResultModifiersToolTip">Vyberte modifikačný kláves na otvorenie vybraného výsledku pomocou klávesnice.</system:String> <system:String x:Key="openResultModifiersToolTip">Vyberte modifikačný kláves na otvorenie vybraného výsledku pomocou klávesnice.</system:String>
<system:String x:Key="showOpenResultHotkey">Zobraziť klávesovú skratku</system:String> <system:String x:Key="showOpenResultHotkey">Zobraziť klávesovú skratku</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Dark</system:String> <system:String x:Key="ColorSchemeDark">Dark</system:String>
<system:String x:Key="SoundEffect">Sound Effect</system:String> <system:String x:Key="SoundEffect">Sound Effect</system:String>
<system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String> <system:String x:Key="SoundEffectTip">Play a small sound when the search window opens</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animation</system:String> <system:String x:Key="Animation">Animation</system:String>
<system:String x:Key="AnimationTip">Use Animation in UI</system:String> <system:String x:Key="AnimationTip">Use Animation in UI</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">Koyu</system:String> <system:String x:Key="ColorSchemeDark">Koyu</system:String>
<system:String x:Key="SoundEffect">Ses Efekti</system:String> <system:String x:Key="SoundEffect">Ses Efekti</system:String>
<system:String x:Key="SoundEffectTip">Arama penceresi açıldığında küçük bir ses oynat</system:String> <system:String x:Key="SoundEffectTip">Arama penceresi açıldığında küçük bir ses oynat</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">Animasyon</system:String> <system:String x:Key="Animation">Animasyon</system:String>
<system:String x:Key="AnimationTip">Arayüzde Animasyon Kullan</system:String> <system:String x:Key="AnimationTip">Arayüzde Animasyon Kullan</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib"> <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- MainWindow --> <!-- MainWindow -->
<system:String x:Key="registerHotkeyFailed">Failed to register hotkey &quot;{0}&quot;. The hotkey may be in use by another program. Change to a different hotkey, or exit another program.</system:String> <system:String x:Key="registerHotkeyFailed">Не вдалося зареєструвати гарячу клавішу &quot;{0}&quot;. Можливо, гаряча клавіша використовується іншою програмою. Змініть її на іншу гарячу клавішу або вийдіть з програми, де вона використовується.</system:String>
<system:String x:Key="MessageBoxTitle">Flow Launcher</system:String> <system:String x:Key="MessageBoxTitle">Flow Launcher</system:String>
<system:String x:Key="couldnotStartCmd">Не вдалося запустити {0}</system:String> <system:String x:Key="couldnotStartCmd">Не вдалося запустити {0}</system:String>
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Невірний формат файлу плагіна Flow Launcher</system:String> <system:String x:Key="invalidFlowLauncherPluginFileFormat">Невірний формат файлу плагіна Flow Launcher</system:String>
@ -17,15 +17,15 @@
<system:String x:Key="copy">Копіювати</system:String> <system:String x:Key="copy">Копіювати</system:String>
<system:String x:Key="cut">Вирізати</system:String> <system:String x:Key="cut">Вирізати</system:String>
<system:String x:Key="paste">Вставити</system:String> <system:String x:Key="paste">Вставити</system:String>
<system:String x:Key="undo">Undo</system:String> <system:String x:Key="undo">Скасувати</system:String>
<system:String x:Key="selectAll">Select All</system:String> <system:String x:Key="selectAll">Обрати все</system:String>
<system:String x:Key="fileTitle">Файл</system:String> <system:String x:Key="fileTitle">Файл</system:String>
<system:String x:Key="folderTitle">Тека</system:String> <system:String x:Key="folderTitle">Тека</system:String>
<system:String x:Key="textTitle">Текст</system:String> <system:String x:Key="textTitle">Текст</system:String>
<system:String x:Key="GameMode">Режим гри</system:String> <system:String x:Key="GameMode">Режим гри</system:String>
<system:String x:Key="GameModeToolTip">Призупинити використання гарячих клавіш.</system:String> <system:String x:Key="GameModeToolTip">Призупинити використання гарячих клавіш.</system:String>
<system:String x:Key="PositionReset">Position Reset</system:String> <system:String x:Key="PositionReset">Скидання позиції</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String> <system:String x:Key="PositionResetToolTip">Скинути положення вікна пошуку</system:String>
<!-- Setting General --> <!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Налаштування</system:String> <system:String x:Key="flowlauncher_settings">Налаштування</system:String>
@ -33,21 +33,21 @@
<system:String x:Key="portableMode">Портативний режим</system:String> <system:String x:Key="portableMode">Портативний режим</system:String>
<system:String x:Key="portableModeToolTIp">Зберігати всі налаштування і дані користувача в одній теці (буде корисно при видаленні дисків або хмарних сервісах).</system:String> <system:String x:Key="portableModeToolTIp">Зберігати всі налаштування і дані користувача в одній теці (буде корисно при видаленні дисків або хмарних сервісах).</system:String>
<system:String x:Key="startFlowLauncherOnSystemStartup">Запускати Flow Launcher при запуску системи</system:String> <system:String x:Key="startFlowLauncherOnSystemStartup">Запускати Flow Launcher при запуску системи</system:String>
<system:String x:Key="setAutoStartFailed">Error setting launch on startup</system:String> <system:String x:Key="setAutoStartFailed">Помилка запуску налаштування під час запуску</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Сховати Flow Launcher, якщо втрачено фокус</system:String> <system:String x:Key="hideFlowLauncherWhenLoseFocus">Сховати Flow Launcher, якщо втрачено фокус</system:String>
<system:String x:Key="dontPromptUpdateMsg">Не повідомляти про доступні нові версії</system:String> <system:String x:Key="dontPromptUpdateMsg">Не повідомляти про доступні нові версії</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Position</system:String> <system:String x:Key="SearchWindowPosition">Положення вікна пошуку</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String> <system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Пам'ятати останню позицію</system:String>
<system:String x:Key="SearchWindowScreenCursor">Monitor with Mouse Cursor</system:String> <system:String x:Key="SearchWindowScreenCursor">Монітор з курсором миші</system:String>
<system:String x:Key="SearchWindowScreenFocus">Monitor with Focused Window</system:String> <system:String x:Key="SearchWindowScreenFocus">Монітор зі сфокусованим вікном</system:String>
<system:String x:Key="SearchWindowScreenPrimary">Primary Monitor</system:String> <system:String x:Key="SearchWindowScreenPrimary">Основний монітор</system:String>
<system:String x:Key="SearchWindowScreenCustom">Custom Monitor</system:String> <system:String x:Key="SearchWindowScreenCustom">Власний монітор</system:String>
<system:String x:Key="SearchWindowAlign">Search Window Position on Monitor</system:String> <system:String x:Key="SearchWindowAlign">Положення вікна пошуку на моніторі</system:String>
<system:String x:Key="SearchWindowAlignCenter">Center</system:String> <system:String x:Key="SearchWindowAlignCenter">Центр</system:String>
<system:String x:Key="SearchWindowAlignCenterTop">Center Top</system:String> <system:String x:Key="SearchWindowAlignCenterTop">Вгорі по центру</system:String>
<system:String x:Key="SearchWindowAlignLeftTop">Left Top</system:String> <system:String x:Key="SearchWindowAlignLeftTop">Зліва вгорі</system:String>
<system:String x:Key="SearchWindowAlignRightTop">Right Top</system:String> <system:String x:Key="SearchWindowAlignRightTop">Праворуч вгорі</system:String>
<system:String x:Key="SearchWindowAlignCustom">Custom Position</system:String> <system:String x:Key="SearchWindowAlignCustom">Власна позиція</system:String>
<system:String x:Key="language">Мова</system:String> <system:String x:Key="language">Мова</system:String>
<system:String x:Key="lastQueryMode">Останній стиль запиту</system:String> <system:String x:Key="lastQueryMode">Останній стиль запиту</system:String>
<system:String x:Key="lastQueryModeToolTip">Показати/приховати попередні результати коли реактивований Flow Launcher знову.</system:String> <system:String x:Key="lastQueryModeToolTip">Показати/приховати попередні результати коли реактивований Flow Launcher знову.</system:String>
@ -55,42 +55,42 @@
<system:String x:Key="LastQuerySelected">Вибрати останній запит</system:String> <system:String x:Key="LastQuerySelected">Вибрати останній запит</system:String>
<system:String x:Key="LastQueryEmpty">Очистити останній запит</system:String> <system:String x:Key="LastQueryEmpty">Очистити останній запит</system:String>
<system:String x:Key="maxShowResults">Максимальна кількість результатів</system:String> <system:String x:Key="maxShowResults">Максимальна кількість результатів</system:String>
<system:String x:Key="maxShowResultsToolTip">You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.</system:String> <system:String x:Key="maxShowResultsToolTip">Ви також можете швидко налаштувати цей параметр за допомогою клавіш CTRL+Плюс чи CTRL+Мінус.</system:String>
<system:String x:Key="ignoreHotkeysOnFullscreen">Ігнорувати гарячі клавіші в повноекранному режимі</system:String> <system:String x:Key="ignoreHotkeysOnFullscreen">Ігнорувати гарячі клавіші в повноекранному режимі</system:String>
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Вимкнути активацію Flow Launcher коли активовано повноекранний додаток (Рекомендується для ігор).</system:String> <system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Вимкнути активацію Flow Launcher коли активовано повноекранний додаток (Рекомендується для ігор).</system:String>
<system:String x:Key="defaultFileManager">Стандартний Файловий Менеджер</system:String> <system:String x:Key="defaultFileManager">Стандартний Файловий Менеджер</system:String>
<system:String x:Key="defaultFileManagerToolTip">Виберіть файловий менеджер для використання під час відкриття теки.</system:String> <system:String x:Key="defaultFileManagerToolTip">Виберіть файловий менеджер для використання під час відкриття теки.</system:String>
<system:String x:Key="defaultBrowser">Браузер за замовчуванням</system:String> <system:String x:Key="defaultBrowser">Браузер за замовчуванням</system:String>
<system:String x:Key="defaultBrowserToolTip">Налаштування нової вкладки, нового вікна, приватного режиму.</system:String> <system:String x:Key="defaultBrowserToolTip">Налаштування нової вкладки, нового вікна, приватного режиму.</system:String>
<system:String x:Key="pythonFilePath">Python Path</system:String> <system:String x:Key="pythonFilePath">Шлях до Python</system:String>
<system:String x:Key="nodeFilePath">Node.js Path</system:String> <system:String x:Key="nodeFilePath">Шлях до Node.js</system:String>
<system:String x:Key="selectNodeExecutable">Please select the Node.js executable</system:String> <system:String x:Key="selectNodeExecutable">Виберіть виконуваний файл Node.js</system:String>
<system:String x:Key="selectPythonExecutable">Please select pythonw.exe</system:String> <system:String x:Key="selectPythonExecutable">Виберіть pythonw.exe</system:String>
<system:String x:Key="typingStartEn">Always Start Typing in English Mode</system:String> <system:String x:Key="typingStartEn">Завжди починати введення тексту в англійському режимі</system:String>
<system:String x:Key="typingStartEnTooltip">Temporarily change your input method to English mode when activating Flow.</system:String> <system:String x:Key="typingStartEnTooltip">Тимчасово змінити спосіб введення на англійський при активації Flow.</system:String>
<system:String x:Key="autoUpdates">Автоматичне оновлення</system:String> <system:String x:Key="autoUpdates">Автоматичне оновлення</system:String>
<system:String x:Key="select">Вибрати</system:String> <system:String x:Key="select">Вибрати</system:String>
<system:String x:Key="hideOnStartup">Сховати Flow Launcher при запуску системи</system:String> <system:String x:Key="hideOnStartup">Сховати Flow Launcher при запуску системи</system:String>
<system:String x:Key="hideNotifyIcon">Приховати значок в системному лотку</system:String> <system:String x:Key="hideNotifyIcon">Приховати значок в системному лотку</system:String>
<system:String x:Key="hideNotifyIconToolTip">When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window.</system:String> <system:String x:Key="hideNotifyIconToolTip">Коли піктограму приховано з трею, меню налаштувань можна відкрити, клацнувши правою кнопкою миші у вікні пошуку.</system:String>
<system:String x:Key="querySearchPrecision">Точність пошуку запитів</system:String> <system:String x:Key="querySearchPrecision">Точність пошуку запитів</system:String>
<system:String x:Key="querySearchPrecisionToolTip">Змінює мінімальний бал збігів, необхідних для результатів.</system:String> <system:String x:Key="querySearchPrecisionToolTip">Змінює мінімальний бал збігів, необхідних для результатів.</system:String>
<system:String x:Key="ShouldUsePinyin">Використовувати піньїнь</system:String> <system:String x:Key="ShouldUsePinyin">Використовувати піньїнь</system:String>
<system:String x:Key="ShouldUsePinyinToolTip">Дозволяє використовувати пінїнь для пошуку. Піньїнь - це стандартна система написання для перекладу китайської.</system:String> <system:String x:Key="ShouldUsePinyinToolTip">Дозволяє використовувати пінїнь для пошуку. Піньїнь - це стандартна система написання для перекладу китайської.</system:String>
<system:String x:Key="AlwaysPreview">Always Preview</system:String> <system:String x:Key="AlwaysPreview">Завжди переглядати</system:String>
<system:String x:Key="AlwaysPreviewToolTip">Always open preview panel when Flow activates. Press {0} to toggle preview.</system:String> <system:String x:Key="AlwaysPreviewToolTip">Завжди відкривати панель попереднього перегляду при активації Flow. Натисніть {0}, щоб переключити попередній перегляд.</system:String>
<system:String x:Key="shadowEffectNotAllowed">Ефект тіні не дозволено, коли поточна тема має ефект розмиття</system:String> <system:String x:Key="shadowEffectNotAllowed">Ефект тіні не дозволено, коли поточна тема має ефект розмиття</system:String>
<!-- Setting Plugin --> <!-- Setting Plugin -->
<system:String x:Key="searchplugin">Search Plugin</system:String> <system:String x:Key="searchplugin">Плагін для пошуку</system:String>
<system:String x:Key="searchpluginToolTip">Ctrl+F to search plugins</system:String> <system:String x:Key="searchpluginToolTip">Ctrl+F для пошуку плагінів</system:String>
<system:String x:Key="searchplugin_Noresult_Title">No results found</system:String> <system:String x:Key="searchplugin_Noresult_Title">Результатів не знайдено</system:String>
<system:String x:Key="searchplugin_Noresult_Subtitle">Please try a different search.</system:String> <system:String x:Key="searchplugin_Noresult_Subtitle">Будь ласка, спробуйте інший запит.</system:String>
<system:String x:Key="plugin">Plugin</system:String> <system:String x:Key="plugin">Плагін</system:String>
<system:String x:Key="plugins">Плагіни</system:String> <system:String x:Key="plugins">Плагіни</system:String>
<system:String x:Key="browserMorePlugins">Знайти більше плагінів</system:String> <system:String x:Key="browserMorePlugins">Знайти більше плагінів</system:String>
<system:String x:Key="enable">Увімкнено</system:String> <system:String x:Key="enable">Увімкнено</system:String>
<system:String x:Key="disable">Відключити</system:String> <system:String x:Key="disable">Вимкнено</system:String>
<system:String x:Key="actionKeywordsTitle">Встановлення гарячих клавіш</system:String> <system:String x:Key="actionKeywordsTitle">Встановлення гарячих клавіш</system:String>
<system:String x:Key="actionKeywords">Ключове слово</system:String> <system:String x:Key="actionKeywords">Ключове слово</system:String>
<system:String x:Key="currentActionKeywords">Поточна гаряча клавіша</system:String> <system:String x:Key="currentActionKeywords">Поточна гаряча клавіша</system:String>
@ -99,47 +99,47 @@
<system:String x:Key="currentPriority">Поточний пріоритет</system:String> <system:String x:Key="currentPriority">Поточний пріоритет</system:String>
<system:String x:Key="newPriority">Новий пріоритет</system:String> <system:String x:Key="newPriority">Новий пріоритет</system:String>
<system:String x:Key="priority">Пріоритет</system:String> <system:String x:Key="priority">Пріоритет</system:String>
<system:String x:Key="priorityToolTip">Change Plugin Results Priority</system:String> <system:String x:Key="priorityToolTip">Змінити пріоритет результатів плагіна</system:String>
<system:String x:Key="pluginDirectory">Директорія плагінів</system:String> <system:String x:Key="pluginDirectory">Директорія плагінів</system:String>
<system:String x:Key="author">за</system:String> <system:String x:Key="author">за</system:String>
<system:String x:Key="plugin_init_time">Ініціалізація:</system:String> <system:String x:Key="plugin_init_time">Ініціалізація:</system:String>
<system:String x:Key="plugin_query_time">Запит:</system:String> <system:String x:Key="plugin_query_time">Запит:</system:String>
<system:String x:Key="plugin_query_version">Версія</system:String> <system:String x:Key="plugin_query_version">Версія</system:String>
<system:String x:Key="plugin_query_web">Сайт</system:String> <system:String x:Key="plugin_query_web">Сайт</system:String>
<system:String x:Key="plugin_uninstall">Uninstall</system:String> <system:String x:Key="plugin_uninstall">Видалити</system:String>
<!-- Setting Plugin Store --> <!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Магазин плагінів</system:String> <system:String x:Key="pluginStore">Магазин плагінів</system:String>
<system:String x:Key="pluginStore_NewRelease">New Release</system:String> <system:String x:Key="pluginStore_NewRelease">Новий реліз</system:String>
<system:String x:Key="pluginStore_RecentlyUpdated">Recently Updated</system:String> <system:String x:Key="pluginStore_RecentlyUpdated">Нещодавно оновлено</system:String>
<system:String x:Key="pluginStore_None">Плагіни</system:String> <system:String x:Key="pluginStore_None">Плагіни</system:String>
<system:String x:Key="pluginStore_Installed">Installed</system:String> <system:String x:Key="pluginStore_Installed">Встановлено</system:String>
<system:String x:Key="refresh">Оновити</system:String> <system:String x:Key="refresh">Оновити</system:String>
<system:String x:Key="installbtn">Install</system:String> <system:String x:Key="installbtn">Встановити</system:String>
<system:String x:Key="uninstallbtn">Uninstall</system:String> <system:String x:Key="uninstallbtn">Видалити</system:String>
<system:String x:Key="updatebtn">Оновити</system:String> <system:String x:Key="updatebtn">Оновити</system:String>
<system:String x:Key="LabelInstalledToolTip">Plugin already installed</system:String> <system:String x:Key="LabelInstalledToolTip">Плагін вже встановлено</system:String>
<system:String x:Key="LabelNew">New Version</system:String> <system:String x:Key="LabelNew">Нова версія</system:String>
<system:String x:Key="LabelNewToolTip">This plugin has been updated within the last 7 days</system:String> <system:String x:Key="LabelNewToolTip">Цей плагін було оновлено протягом останніх 7 днів</system:String>
<system:String x:Key="LabelUpdateToolTip">New Update is Available</system:String> <system:String x:Key="LabelUpdateToolTip">Доступне нове оновлення</system:String>
<!-- Setting Theme --> <!-- Setting Theme -->
<system:String x:Key="theme">Тема</system:String> <system:String x:Key="theme">Тема</system:String>
<system:String x:Key="appearance">Appearance</system:String> <system:String x:Key="appearance">Зовнішній вигляд</system:String>
<system:String x:Key="browserMoreThemes">Знайти більше тем</system:String> <system:String x:Key="browserMoreThemes">Знайти більше тем</system:String>
<system:String x:Key="howToCreateTheme">Як створити тему</system:String> <system:String x:Key="howToCreateTheme">Як створити тему</system:String>
<system:String x:Key="hiThere">Привіт усім</system:String> <system:String x:Key="hiThere">Привіт усім</system:String>
<system:String x:Key="SampleTitleExplorer">Explorer</system:String> <system:String x:Key="SampleTitleExplorer">Провідник</system:String>
<system:String x:Key="SampleSubTitleExplorer">Search for files, folders and file contents</system:String> <system:String x:Key="SampleSubTitleExplorer">Пошук файлів, папок і вмісту файлів</system:String>
<system:String x:Key="SampleTitleWebSearch">WebSearch</system:String> <system:String x:Key="SampleTitleWebSearch">Веб-пошук</system:String>
<system:String x:Key="SampleSubTitleWebSearch">Search the web with different search engine support</system:String> <system:String x:Key="SampleSubTitleWebSearch">Пошук в Інтернеті за допомогою різних пошукових систем</system:String>
<system:String x:Key="SampleTitleProgram">Program</system:String> <system:String x:Key="SampleTitleProgram">Програма</system:String>
<system:String x:Key="SampleSubTitleProgram">Launch programs as admin or a different user</system:String> <system:String x:Key="SampleSubTitleProgram">Запуск програм від імені адміністратора або іншого користувача</system:String>
<system:String x:Key="SampleTitleProcessKiller">ProcessKiller</system:String> <system:String x:Key="SampleTitleProcessKiller">Процес-кілер</system:String>
<system:String x:Key="SampleSubTitleProcessKiller">Terminate unwanted processes</system:String> <system:String x:Key="SampleSubTitleProcessKiller">Припинення небажаних процесів</system:String>
<system:String x:Key="queryBoxFont">Шрифт запитів</system:String> <system:String x:Key="queryBoxFont">Шрифт запитів</system:String>
<system:String x:Key="resultItemFont">Шрифт результатів</system:String> <system:String x:Key="resultItemFont">Шрифт результатів</system:String>
<system:String x:Key="windowMode">Віконний режим</system:String> <system:String x:Key="windowMode">Віконний режим</system:String>
@ -154,53 +154,55 @@
<system:String x:Key="ColorSchemeDark">Темна</system:String> <system:String x:Key="ColorSchemeDark">Темна</system:String>
<system:String x:Key="SoundEffect">Звуковий ефект</system:String> <system:String x:Key="SoundEffect">Звуковий ефект</system:String>
<system:String x:Key="SoundEffectTip">Відтворювати невеликий звук при відкритті вікна пошуку</system:String> <system:String x:Key="SoundEffectTip">Відтворювати невеликий звук при відкритті вікна пошуку</system:String>
<system:String x:Key="SoundEffectVolume">Гучність звукового ефекту</system:String>
<system:String x:Key="SoundEffectVolumeTip">Налаштуйте гучність звукового ефекту</system:String>
<system:String x:Key="Animation">Анімація</system:String> <system:String x:Key="Animation">Анімація</system:String>
<system:String x:Key="AnimationTip">Використовувати анімацію в інтерфейсі</system:String> <system:String x:Key="AnimationTip">Використовувати анімацію в інтерфейсі</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Швидкість анімації</system:String>
<system:String x:Key="AnimationSpeedTip">The speed of the UI animation</system:String> <system:String x:Key="AnimationSpeedTip">Швидкість анімації інтерфейсу</system:String>
<system:String x:Key="AnimationSpeedSlow">Slow</system:String> <system:String x:Key="AnimationSpeedSlow">Повільна</system:String>
<system:String x:Key="AnimationSpeedMedium">Medium</system:String> <system:String x:Key="AnimationSpeedMedium">Середня</system:String>
<system:String x:Key="AnimationSpeedFast">Fast</system:String> <system:String x:Key="AnimationSpeedFast">Швидка</system:String>
<system:String x:Key="AnimationSpeedCustom">Custom</system:String> <system:String x:Key="AnimationSpeedCustom">Користувацька</system:String>
<system:String x:Key="Clock">Clock</system:String> <system:String x:Key="Clock">Годинник</system:String>
<system:String x:Key="Date">Date</system:String> <system:String x:Key="Date">Дата</system:String>
<!-- Setting Hotkey --> <!-- Setting Hotkey -->
<system:String x:Key="hotkey">Гаряча клавіша</system:String> <system:String x:Key="hotkey">Гаряча клавіша</system:String>
<system:String x:Key="hotkeys">Гаряча клавіша</system:String> <system:String x:Key="hotkeys">Гаряча клавіша</system:String>
<system:String x:Key="flowlauncherHotkey">Гаряча клавіша Flow Launcher</system:String> <system:String x:Key="flowlauncherHotkey">Гаряча клавіша Flow Launcher</system:String>
<system:String x:Key="flowlauncherHotkeyToolTip">Введіть ярлик для відображення/приховання потокового запуску.</system:String> <system:String x:Key="flowlauncherHotkeyToolTip">Введіть скорочення, щоб показати/приховати Flow Launcher.</system:String>
<system:String x:Key="previewHotkey">Preview Hotkey</system:String> <system:String x:Key="previewHotkey">Гаряча клавіша попереднього перегляду</system:String>
<system:String x:Key="previewHotkeyToolTip">Enter shortcut to show/hide preview in search window.</system:String> <system:String x:Key="previewHotkeyToolTip">Введіть скорочення, щоб показати/приховати попередній перегляд у вікні пошуку.</system:String>
<system:String x:Key="openResultModifiers">Відкрити ключ зміни результатів</system:String> <system:String x:Key="openResultModifiers">Відкрити ключ зміни результатів</system:String>
<system:String x:Key="openResultModifiersToolTip">Виберіть ключ модифікатора для відкриття вибраних результатів за допомогою клавіатури.</system:String> <system:String x:Key="openResultModifiersToolTip">Виберіть ключ модифікатора для відкриття вибраних результатів за допомогою клавіатури.</system:String>
<system:String x:Key="showOpenResultHotkey">Показати гарячу клавішу</system:String> <system:String x:Key="showOpenResultHotkey">Показати гарячу клавішу</system:String>
<system:String x:Key="showOpenResultHotkeyToolTip">Show result selection hotkey with results.</system:String> <system:String x:Key="showOpenResultHotkeyToolTip">Показати гарячу клавішу вибору результату з результатами.</system:String>
<system:String x:Key="customQueryHotkey">Задані гарячі клавіші для запитів</system:String> <system:String x:Key="customQueryHotkey">Задані гарячі клавіші для запитів</system:String>
<system:String x:Key="customQueryShortcut">Custom Query Shortcut</system:String> <system:String x:Key="customQueryShortcut">Користувацькі скорочення запитів</system:String>
<system:String x:Key="builtinShortcuts">Built-in Shortcut</system:String> <system:String x:Key="builtinShortcuts">Вбудовані скорочення</system:String>
<system:String x:Key="customQuery">Query</system:String> <system:String x:Key="customQuery">Запит</system:String>
<system:String x:Key="customShortcut">Shortcut</system:String> <system:String x:Key="customShortcut">Скорочення</system:String>
<system:String x:Key="customShortcutExpansion">Expansion</system:String> <system:String x:Key="customShortcutExpansion">Розширення</system:String>
<system:String x:Key="builtinShortcutDescription">Description</system:String> <system:String x:Key="builtinShortcutDescription">Опис</system:String>
<system:String x:Key="delete">Видалити</system:String> <system:String x:Key="delete">Видалити</system:String>
<system:String x:Key="edit">Редагувати</system:String> <system:String x:Key="edit">Редагувати</system:String>
<system:String x:Key="add">Додати</system:String> <system:String x:Key="add">Додати</system:String>
<system:String x:Key="pleaseSelectAnItem">Спочатку виберіть елемент</system:String> <system:String x:Key="pleaseSelectAnItem">Спочатку виберіть елемент</system:String>
<system:String x:Key="deleteCustomHotkeyWarning">Ви впевнені, що хочете видалити гарячу клавішу ({0}) плагіну?</system:String> <system:String x:Key="deleteCustomHotkeyWarning">Ви впевнені, що хочете видалити гарячу клавішу ({0}) плагіну?</system:String>
<system:String x:Key="deleteCustomShortcutWarning">Are you sure you want to delete shortcut: {0} with expansion {1}?</system:String> <system:String x:Key="deleteCustomShortcutWarning">Ви впевнені, що хочете видалити скорочення: {0} з розширенням {1}?</system:String>
<system:String x:Key="shortcut_clipboard_description">Get text from clipboard.</system:String> <system:String x:Key="shortcut_clipboard_description">Отримати текст з буфера обміну.</system:String>
<system:String x:Key="shortcut_active_explorer_path">Get path from active explorer.</system:String> <system:String x:Key="shortcut_active_explorer_path">Отримати шлях з активного провідника.</system:String>
<system:String x:Key="queryWindowShadowEffect">Ефект тіні вікна запиту</system:String> <system:String x:Key="queryWindowShadowEffect">Ефект тіні вікна запиту</system:String>
<system:String x:Key="shadowEffectCPUUsage">Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.</system:String> <system:String x:Key="shadowEffectCPUUsage">Тіньовий ефект суттєво навантажує графічний процесор. Не рекомендується, якщо потужність вашого комп'ютера є обмеженою.</system:String>
<system:String x:Key="windowWidthSize">Window Width Size</system:String> <system:String x:Key="windowWidthSize">Розмір ширини вікна</system:String>
<system:String x:Key="windowWidthSizeToolTip">You can also quickly adjust this by using Ctrl+[ and Ctrl+].</system:String> <system:String x:Key="windowWidthSizeToolTip">Ви також можете швидко налаштувати цей параметр за допомогою комбінації клавіш Ctrl+[ та Ctrl+].</system:String>
<system:String x:Key="useGlyphUI">Use Segoe Fluent Icons</system:String> <system:String x:Key="useGlyphUI">Використання іконок Segoe Fluent</system:String>
<system:String x:Key="useGlyphUIEffect">Use Segoe Fluent Icons for query results where supported</system:String> <system:String x:Key="useGlyphUIEffect">Використання іконок Segoe Fluent Icons для результатів запитів, де це підтримується</system:String>
<system:String x:Key="flowlauncherPressHotkey">Press Key</system:String> <system:String x:Key="flowlauncherPressHotkey">Натисніть клавішу</system:String>
<!-- Setting Proxy --> <!-- Setting Proxy -->
<system:String x:Key="proxy">HTTP Proxy</system:String> <system:String x:Key="proxy">HTTP-проксі</system:String>
<system:String x:Key="enableProxy">Включити HTTP Proxy</system:String> <system:String x:Key="enableProxy">Включити HTTP Proxy</system:String>
<system:String x:Key="server">Сервер HTTP</system:String> <system:String x:Key="server">Сервер HTTP</system:String>
<system:String x:Key="port">Порт</system:String> <system:String x:Key="port">Порт</system:String>
@ -217,53 +219,53 @@
<!-- Setting About --> <!-- Setting About -->
<system:String x:Key="about">Про Flow Launcher</system:String> <system:String x:Key="about">Про Flow Launcher</system:String>
<system:String x:Key="website">Website</system:String> <system:String x:Key="website">Веб-сайт</system:String>
<system:String x:Key="github">GitHub</system:String> <system:String x:Key="github">GitHub</system:String>
<system:String x:Key="docs">Docs</system:String> <system:String x:Key="docs">Документація</system:String>
<system:String x:Key="version">Версія</system:String> <system:String x:Key="version">Версія</system:String>
<system:String x:Key="icons">Icons</system:String> <system:String x:Key="icons">Іконки</system:String>
<system:String x:Key="about_activate_times">Ви скористалися Flow Launcher вже {0} разів</system:String> <system:String x:Key="about_activate_times">Ви скористалися Flow Launcher вже {0} разів</system:String>
<system:String x:Key="checkUpdates">Перевірити наявність оновлень</system:String> <system:String x:Key="checkUpdates">Перевірити наявність оновлень</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String> <system:String x:Key="BecomeASponsor">Стати спонсором</system:String>
<system:String x:Key="newVersionTips">Доступна нова версія {0}, будь ласка, перезавантажте Flow Launcher</system:String> <system:String x:Key="newVersionTips">Доступна нова версія {0}, будь ласка, перезавантажте Flow Launcher</system:String>
<system:String x:Key="checkUpdatesFailed">Check updates failed, please check your connection and proxy settings to api.github.com.</system:String> <system:String x:Key="checkUpdatesFailed">Перевірити оновлення не вдалося, будь ласка, перевірте ваше з'єднання та налаштування проксі-сервера до api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed"> <system:String x:Key="downloadUpdatesFailed">
Download updates failed, please check your connection and proxy settings to github-cloud.s3.amazonaws.com, Не вдалося завантажити оновлення, будь ласка, перевірте ваше з'єднання та налаштування проксі-сервера до github-cloud.s3.amazonaws.com,
or go to https://github.com/Flow-Launcher/Flow.Launcher/releases to download updates manually. або перейдіть на https://github.com/Flow-Launcher/Flow.Launcher/releases, аби завантажити оновлення власноруч.
</system:String> </system:String>
<system:String x:Key="releaseNotes">Примітки до поточного релізу:</system:String> <system:String x:Key="releaseNotes">Примітки до поточного релізу:</system:String>
<system:String x:Key="documentation">Usage Tips</system:String> <system:String x:Key="documentation">Поради щодо використання</system:String>
<system:String x:Key="devtool">DevTools</system:String> <system:String x:Key="devtool">DevTools</system:String>
<system:String x:Key="settingfolder">Setting Folder</system:String> <system:String x:Key="settingfolder">Тека налаштувань</system:String>
<system:String x:Key="logfolder">Log Folder</system:String> <system:String x:Key="logfolder">Тека журналу</system:String>
<system:String x:Key="clearlogfolder">Clear Logs</system:String> <system:String x:Key="clearlogfolder">Очистити журнали</system:String>
<system:String x:Key="clearlogfolderMessage">Are you sure you want to delete all logs?</system:String> <system:String x:Key="clearlogfolderMessage">Ви впевнені, що хочете видалити всі журнали?</system:String>
<system:String x:Key="welcomewindow">Wizard</system:String> <system:String x:Key="welcomewindow">Чаклун</system:String>
<!-- FileManager Setting Dialog --> <!-- FileManager Setting Dialog -->
<system:String x:Key="fileManagerWindow">Select File Manager</system:String> <system:String x:Key="fileManagerWindow">Виберіть файловий менеджер</system:String>
<system:String x:Key="fileManager_tips">Please specify the file location of the file manager you using and add arguments if necessary. The default arguments are &quot;%d&quot;, and a path is entered at that location. For example, If a command is required such as &quot;totalcmd.exe /A c:\windows&quot;, argument is /A &quot;%d&quot;.</system:String> <system:String x:Key="fileManager_tips">Будь ласка, вкажіть розташування файлу у файловому менеджері, який ви використовуєте, і додайте аргументи, якщо це необхідно. За замовчуванням аргументами є &quot;%d&quot;, і шлях вводиться у вказаному місці. Наприклад, якщо потрібно виконати команду типу &quot;totalcmd.exe /A c:\windows&quot;, аргументом буде /A &quot;%d&quot;.</system:String>
<system:String x:Key="fileManager_tips2">&quot;%f&quot; 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 &quot;Arg for File&quot; item. If the file manager does not have that function, you can use &quot;%d&quot;.</system:String> <system:String x:Key="fileManager_tips2">&quot;%f&quot; - це аргумент, який представляє шлях до файлу. Він використовується для виділення імені файлу/теки при відкритті певного місця розташування файлу у сторонньому файловому менеджері. Цей аргумент доступний лише у пункті &quot;Аргумент для файлу&quot;. Якщо файловий менеджер не має такої функції, ви можете використовувати &quot;%d&quot;.</system:String>
<system:String x:Key="fileManager_name">File Manager</system:String> <system:String x:Key="fileManager_name">Файловий менеджер</system:String>
<system:String x:Key="fileManager_profile_name">Profile Name</system:String> <system:String x:Key="fileManager_profile_name">Ім'я профілю</system:String>
<system:String x:Key="fileManager_path">File Manager Path</system:String> <system:String x:Key="fileManager_path">Шлях до файлового менеджера</system:String>
<system:String x:Key="fileManager_directory_arg">Arg For Folder</system:String> <system:String x:Key="fileManager_directory_arg">Аргумент для папки</system:String>
<system:String x:Key="fileManager_file_arg">Arg For File</system:String> <system:String x:Key="fileManager_file_arg">Аргумент для файлу</system:String>
<!-- DefaultBrowser Setting Dialog --> <!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Веб-браузер за замовчуванням</system:String> <system:String x:Key="defaultBrowserTitle">Веб-браузер за замовчуванням</system:String>
<system:String x:Key="defaultBrowser_tips">The default setting follows the OS default browser setting. If specified separately, flow uses that browser.</system:String> <system:String x:Key="defaultBrowser_tips">Налаштування за замовчуванням відповідають налаштуванню браузера за замовчуванням в операційній системі. Якщо вказано окремо, Flow використовує цей браузер.</system:String>
<system:String x:Key="defaultBrowser_name">Browser</system:String> <system:String x:Key="defaultBrowser_name">Браузер</system:String>
<system:String x:Key="defaultBrowser_profile_name">Browser Name</system:String> <system:String x:Key="defaultBrowser_profile_name">Назва браузера</system:String>
<system:String x:Key="defaultBrowser_path">Browser Path</system:String> <system:String x:Key="defaultBrowser_path">Шлях до браузера</system:String>
<system:String x:Key="defaultBrowser_newWindow">New Window</system:String> <system:String x:Key="defaultBrowser_newWindow">Нове вікно</system:String>
<system:String x:Key="defaultBrowser_newTab">New Tab</system:String> <system:String x:Key="defaultBrowser_newTab">Нова вкладка</system:String>
<system:String x:Key="defaultBrowser_parameter">Private Mode</system:String> <system:String x:Key="defaultBrowser_parameter">Приватний режим</system:String>
<!-- Priority Setting Dialog --> <!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Change Priority</system:String> <system:String x:Key="changePriorityWindow">Змінити пріоритет</system:String>
<system:String x:Key="priority_tips">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</system:String> <system:String x:Key="priority_tips">Чим більше число, тим вище буде розташований результат. Спробуйте встановити значення 5. Якщо ви хочете, щоб результати показувалися нижче, ніж у будь-якого іншого плагіна, введіть від'ємне число</system:String>
<system:String x:Key="invalidPriority">Please provide an valid integer for Priority!</system:String> <system:String x:Key="invalidPriority">Будь ласка, вкажіть дійсне ціле число для Пріоритету!</system:String>
<!-- Action Keyword Setting Dialog --> <!-- Action Keyword Setting Dialog -->
<system:String x:Key="oldActionKeywords">Поточна гаряча клавіша</system:String> <system:String x:Key="oldActionKeywords">Поточна гаряча клавіша</system:String>
@ -274,26 +276,26 @@
<system:String x:Key="newActionKeywordsCannotBeEmpty">Нова гаряча клавіша не може бути порожньою</system:String> <system:String x:Key="newActionKeywordsCannotBeEmpty">Нова гаряча клавіша не може бути порожньою</system:String>
<system:String x:Key="newActionKeywordsHasBeenAssigned">Нова гаряча клавіша вже використовується іншим плагіном. Будь ласка, вкажіть нову</system:String> <system:String x:Key="newActionKeywordsHasBeenAssigned">Нова гаряча клавіша вже використовується іншим плагіном. Будь ласка, вкажіть нову</system:String>
<system:String x:Key="success">Успішно</system:String> <system:String x:Key="success">Успішно</system:String>
<system:String x:Key="completedSuccessfully">Completed successfully</system:String> <system:String x:Key="completedSuccessfully">Успішно завершено</system:String>
<system:String x:Key="actionkeyword_tips">Введіть гарячу клавішу, яку ви хочете використовувати для запуску плагіна. Використовуйте * у разі, якщо ви не хочете ставити конкретну гарячу клавішу.</system:String> <system:String x:Key="actionkeyword_tips">Введіть гарячу клавішу, яку ви хочете використовувати для запуску плагіна. Використовуйте * у разі, якщо ви не хочете ставити конкретну гарячу клавішу.</system:String>
<!-- Custom Query Hotkey Dialog --> <!-- Custom Query Hotkey Dialog -->
<system:String x:Key="customeQueryHotkeyTitle">Задані гарячі клавіші для запитів</system:String> <system:String x:Key="customeQueryHotkeyTitle">Задані гарячі клавіші для запитів</system:String>
<system:String x:Key="customeQueryHotkeyTips">Press a custom hotkey to open Flow Launcher and input the specified query automatically.</system:String> <system:String x:Key="customeQueryHotkeyTips">Натисніть спеціальну гарячу клавішу, щоб відкрити Flow Launcher і автоматично ввести вказаний запит.</system:String>
<system:String x:Key="preview">Переглянути</system:String> <system:String x:Key="preview">Переглянути</system:String>
<system:String x:Key="hotkeyIsNotUnavailable">Гаряча клавіша недоступна. Будь ласка, вкажіть нову</system:String> <system:String x:Key="hotkeyIsNotUnavailable">Гаряча клавіша недоступна. Будь ласка, вкажіть нову</system:String>
<system:String x:Key="invalidPluginHotkey">Недійсна гаряча клавіша плагіна</system:String> <system:String x:Key="invalidPluginHotkey">Недійсна гаряча клавіша плагіна</system:String>
<system:String x:Key="update">Оновити</system:String> <system:String x:Key="update">Оновити</system:String>
<!-- Custom Query Shortcut Dialog --> <!-- Custom Query Shortcut Dialog -->
<system:String x:Key="customeQueryShortcutTitle">Custom Query Shortcut</system:String> <system:String x:Key="customeQueryShortcutTitle">Власне скорочення запиту</system:String>
<system:String x:Key="customeQueryShortcutTips">Enter a shortcut that automatically expands to the specified query.</system:String> <system:String x:Key="customeQueryShortcutTips">Введіть скорочення, яке автоматично розгорнеться до вказаного запиту.</system:String>
<system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">A shortcut is expanded when it exactly matches the query. <system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">Скорочення розгортається, коли воно точно відповідає запиту.
If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query. Якщо ви додасте префікс '@' під час введення скорочення, воно буде відповідати будь-якій позиції в запиті. Вбудовані скорочення відповідають будь-якій позиції в запиті.
</system:String> </system:String>
<system:String x:Key="duplicateShortcut">Shortcut already exists, please enter a new Shortcut or edit the existing one.</system:String> <system:String x:Key="duplicateShortcut">Скорочення вже існує, будь ласка, введіть нове або відредагуйте існуюче.</system:String>
<system:String x:Key="emptyShortcut">Shortcut and/or its expansion is empty.</system:String> <system:String x:Key="emptyShortcut">Скорочення та/або його розширення є порожнім.</system:String>
<!-- Hotkey Control --> <!-- Hotkey Control -->
<system:String x:Key="hotkeyUnavailable">Гаряча клавіша недоступна</system:String> <system:String x:Key="hotkeyUnavailable">Гаряча клавіша недоступна</system:String>
@ -315,64 +317,64 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Стався збій в додатку Flow Launcher</system:String> <system:String x:Key="reportWindow_flowlauncher_got_an_error">Стався збій в додатку Flow Launcher</system:String>
<!-- General Notice --> <!-- General Notice -->
<system:String x:Key="pleaseWait">Please wait...</system:String> <system:String x:Key="pleaseWait">Будь ласка, зачекайте...</system:String>
<!-- Update --> <!-- Update -->
<system:String x:Key="update_flowlauncher_update_check">Checking for new update</system:String> <system:String x:Key="update_flowlauncher_update_check">Перевірка наявності оновлень</system:String>
<system:String x:Key="update_flowlauncher_already_on_latest">You already have the latest Flow Launcher version</system:String> <system:String x:Key="update_flowlauncher_already_on_latest">Ви вже маєте останню версію Flow Launcher</system:String>
<system:String x:Key="update_flowlauncher_update_found">Update found</system:String> <system:String x:Key="update_flowlauncher_update_found">Оновлення знайдено</system:String>
<system:String x:Key="update_flowlauncher_updating">Updating...</system:String> <system:String x:Key="update_flowlauncher_updating">Оновлюємо...</system:String>
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data"> <system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">
Flow Launcher was not able to move your user profile data to the new update version. Flow Launcher не зміг перенести дані вашого профілю користувача до нової актуальної версії.
Please manually move your profile data folder from {0} to {1} Будь ласка, перемістіть теку з даними вашого профілю власноруч з {0} до {1}
</system:String> </system:String>
<system:String x:Key="update_flowlauncher_new_update">New Update</system:String> <system:String x:Key="update_flowlauncher_new_update">Нова версія</system:String>
<system:String x:Key="update_flowlauncher_update_new_version_available">Доступна нова версія Flow Launcher {0}</system:String> <system:String x:Key="update_flowlauncher_update_new_version_available">Доступна нова версія Flow Launcher {0}</system:String>
<system:String x:Key="update_flowlauncher_update_error">Сталася помилка під час спроби встановити оновлення</system:String> <system:String x:Key="update_flowlauncher_update_error">Сталася помилка під час спроби встановити оновлення</system:String>
<system:String x:Key="update_flowlauncher_update">Оновити</system:String> <system:String x:Key="update_flowlauncher_update">Оновити</system:String>
<system:String x:Key="update_flowlauncher_update_cancel">Скасувати</system:String> <system:String x:Key="update_flowlauncher_update_cancel">Скасувати</system:String>
<system:String x:Key="update_flowlauncher_fail">Update Failed</system:String> <system:String x:Key="update_flowlauncher_fail">Не вдалося оновити</system:String>
<system:String x:Key="update_flowlauncher_check_connection">Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.</system:String> <system:String x:Key="update_flowlauncher_check_connection">Перевірте з'єднання та спробуйте оновити налаштування проксі до github-cloud.s3.amazonaws.com.</system:String>
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">Це оновлення перезавантажить Flow Launcher</system:String> <system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">Це оновлення перезавантажить Flow Launcher</system:String>
<system:String x:Key="update_flowlauncher_update_update_files">Ці файли будуть оновлені</system:String> <system:String x:Key="update_flowlauncher_update_update_files">Ці файли будуть оновлені</system:String>
<system:String x:Key="update_flowlauncher_update_files">Оновити файли</system:String> <system:String x:Key="update_flowlauncher_update_files">Оновити файли</system:String>
<system:String x:Key="update_flowlauncher_update_update_description">Опис оновлення</system:String> <system:String x:Key="update_flowlauncher_update_update_description">Опис оновлення</system:String>
<!-- Welcome Window --> <!-- Welcome Window -->
<system:String x:Key="Skip">Skip</system:String> <system:String x:Key="Skip">Пропустити</system:String>
<system:String x:Key="Welcome_Page1_Title">Welcome to Flow Launcher</system:String> <system:String x:Key="Welcome_Page1_Title">Ласкаво просимо до Flow Launcher</system:String>
<system:String x:Key="Welcome_Page1_Text01">Hello, this is the first time you are running Flow Launcher!</system:String> <system:String x:Key="Welcome_Page1_Text01">Вітаємо, ви вперше запускаєте Flow Launcher!</system:String>
<system:String x:Key="Welcome_Page1_Text02">Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language</system:String> <system:String x:Key="Welcome_Page1_Text02">Перед початком роботи цей помічник допоможе налаштувати Flow Launcher. Ви можете пропустити цей крок, якщо бажаєте. Виберіть мову</system:String>
<system:String x:Key="Welcome_Page2_Title">Search and run all files and applications on your PC</system:String> <system:String x:Key="Welcome_Page2_Title">Пошук та запуск усіх файлів і програм на вашому комп'ютері</system:String>
<system:String x:Key="Welcome_Page2_Text01">Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse.</system:String> <system:String x:Key="Welcome_Page2_Text01">Шукайте все: програми, файли, закладки, YouTube, Twitter тощо. І все це за допомогою клавіатури, навіть не торкаючись миші.</system:String>
<system:String x:Key="Welcome_Page2_Text02">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.</system:String> <system:String x:Key="Welcome_Page2_Text02">Flow Launcher запускається за допомогою наведеної нижче гарячої клавіші, спробуйте натиснути її зараз. Щоб її змінити, клацніть на ввід і натисніть потрібну гарячу клавішу на клавіатурі.</system:String>
<system:String x:Key="Welcome_Page3_Title">Hotkeys</system:String> <system:String x:Key="Welcome_Page3_Title">Гаряча клавіша</system:String>
<system:String x:Key="Welcome_Page4_Title">Action Keyword and Commands</system:String> <system:String x:Key="Welcome_Page4_Title">Ключове слово дії та команди</system:String>
<system:String x:Key="Welcome_Page4_Text01">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.</system:String> <system:String x:Key="Welcome_Page4_Text01">Шукайте в Інтернеті, запускайте програми або виконуйте різноманітні функції за допомогою плагінів Flow Launcher. Деякі функції починаються з ключового слова дії, але за потреби їх можна використовувати і без нього. Спробуйте наведені нижче запити у Flow Launcher.</system:String>
<system:String x:Key="Welcome_Page5_Title">Let's Start Flow Launcher</system:String> <system:String x:Key="Welcome_Page5_Title">Давайте запустимо Flow Launcher</system:String>
<system:String x:Key="Welcome_Page5_Text01">Finished. Enjoy Flow Launcher. Don't forget the hotkey to start :)</system:String> <system:String x:Key="Welcome_Page5_Text01">Готово. Насолоджуйтесь Flow Launcher. Не забудьте гарячу клавішу для запуску :)</system:String>
<!-- General Guide & Hotkey --> <!-- General Guide & Hotkey -->
<system:String x:Key="HotkeyUpDownDesc">Back / Context Menu</system:String> <system:String x:Key="HotkeyUpDownDesc">Назад / Контекстне меню</system:String>
<system:String x:Key="HotkeyLeftRightDesc">Item Navigation</system:String> <system:String x:Key="HotkeyLeftRightDesc">Навігація елементами</system:String>
<system:String x:Key="HotkeyShiftEnterDesc">Open Context Menu</system:String> <system:String x:Key="HotkeyShiftEnterDesc">Відкрити контекстне меню</system:String>
<system:String x:Key="HotkeyCtrlEnterDesc">Open Containing Folder</system:String> <system:String x:Key="HotkeyCtrlEnterDesc">Відкрийте папку, що містить файл</system:String>
<system:String x:Key="HotkeyCtrlShiftEnterDesc">Run as Admin / Open Folder in Default File Manager</system:String> <system:String x:Key="HotkeyCtrlShiftEnterDesc">Запустити від імені адміністратора / Відкрити папку у файловому менеджері за замовчуванням</system:String>
<system:String x:Key="HotkeyCtrlHDesc">Query History</system:String> <system:String x:Key="HotkeyCtrlHDesc">Історія запитів</system:String>
<system:String x:Key="HotkeyESCDesc">Back to Result in Context Menu</system:String> <system:String x:Key="HotkeyESCDesc">Повернутися до результату в контекстному меню</system:String>
<system:String x:Key="HotkeyTabDesc">Autocomplete</system:String> <system:String x:Key="HotkeyTabDesc">Автодоповнення</system:String>
<system:String x:Key="HotkeyRunDesc">Open / Run Selected Item</system:String> <system:String x:Key="HotkeyRunDesc">Відкрити / запустити вибраний елемент</system:String>
<system:String x:Key="HotkeyCtrlIDesc">Open Setting Window</system:String> <system:String x:Key="HotkeyCtrlIDesc">Відкрити вікно налаштувань</system:String>
<system:String x:Key="HotkeyF5Desc">Reload Plugin Data</system:String> <system:String x:Key="HotkeyF5Desc">Перезавантажити дані плагінів</system:String>
<system:String x:Key="RecommendWeather">Weather</system:String> <system:String x:Key="RecommendWeather">Погода</system:String>
<system:String x:Key="RecommendWeatherDesc">Weather in Google Result</system:String> <system:String x:Key="RecommendWeatherDesc">Погода в результатах Google</system:String>
<system:String x:Key="RecommendShell">&gt; ping 8.8.8.8</system:String> <system:String x:Key="RecommendShell">&gt; ping 8.8.8.8</system:String>
<system:String x:Key="RecommendShellDesc">Shell Command</system:String> <system:String x:Key="RecommendShellDesc">Команда Shell</system:String>
<system:String x:Key="RecommendBluetooth">s Bluetooth</system:String> <system:String x:Key="RecommendBluetooth">s Bluetooth</system:String>
<system:String x:Key="RecommendBluetoothDesc">Bluetooth in Windows Settings</system:String> <system:String x:Key="RecommendBluetoothDesc">Bluetooth у налаштуваннях Windows</system:String>
<system:String x:Key="RecommendAcronyms">sn</system:String> <system:String x:Key="RecommendAcronyms">sn</system:String>
<system:String x:Key="RecommendAcronymsDesc">Sticky Notes</system:String> <system:String x:Key="RecommendAcronymsDesc">Липкі нотатки</system:String>
</ResourceDictionary> </ResourceDictionary>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">深色</system:String> <system:String x:Key="ColorSchemeDark">深色</system:String>
<system:String x:Key="SoundEffect">音效</system:String> <system:String x:Key="SoundEffect">音效</system:String>
<system:String x:Key="SoundEffectTip">启用激活音效</system:String> <system:String x:Key="SoundEffectTip">启用激活音效</system:String>
<system:String x:Key="SoundEffectVolume">音效音量</system:String>
<system:String x:Key="SoundEffectVolumeTip">调整音效音量</system:String>
<system:String x:Key="Animation">动画</system:String> <system:String x:Key="Animation">动画</system:String>
<system:String x:Key="AnimationTip">启用动画</system:String> <system:String x:Key="AnimationTip">启用动画</system:String>
<system:String x:Key="AnimationSpeed">动画速度</system:String> <system:String x:Key="AnimationSpeed">动画速度</system:String>
@ -288,9 +290,9 @@
<!-- Custom Query Shortcut Dialog --> <!-- Custom Query Shortcut Dialog -->
<system:String x:Key="customeQueryShortcutTitle">自定义查询捷径</system:String> <system:String x:Key="customeQueryShortcutTitle">自定义查询捷径</system:String>
<system:String x:Key="customeQueryShortcutTips">输入一个捷径,它将自动展开为一个查询。</system:String> <system:String x:Key="customeQueryShortcutTips">输入一个捷径,它将自动展开为一个查询。</system:String>
<system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">A shortcut is expanded when it exactly matches the query. <system:String x:Key="customeQueryShortcutGuide" xml:space="preserve">捷径仅在完全匹配查询时展开。
If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query. 如果您在输入捷径时添加一个“@”前缀,它将匹配查询中的任意位置。 内置捷径同样匹配查询中的任意位置。
</system:String> </system:String>
<system:String x:Key="duplicateShortcut">捷径已存在,请输入一个新的或者编辑已有的。</system:String> <system:String x:Key="duplicateShortcut">捷径已存在,请输入一个新的或者编辑已有的。</system:String>
<system:String x:Key="emptyShortcut">捷径及其展开均不能为空。</system:String> <system:String x:Key="emptyShortcut">捷径及其展开均不能为空。</system:String>

View file

@ -154,6 +154,8 @@
<system:String x:Key="ColorSchemeDark">暗色系</system:String> <system:String x:Key="ColorSchemeDark">暗色系</system:String>
<system:String x:Key="SoundEffect">音效</system:String> <system:String x:Key="SoundEffect">音效</system:String>
<system:String x:Key="SoundEffectTip">搜尋窗口打開時播放音效</system:String> <system:String x:Key="SoundEffectTip">搜尋窗口打開時播放音效</system:String>
<system:String x:Key="SoundEffectVolume">Sound Effect Volume</system:String>
<system:String x:Key="SoundEffectVolumeTip">Adjust the volume of the sound effect</system:String>
<system:String x:Key="Animation">動畫</system:String> <system:String x:Key="Animation">動畫</system:String>
<system:String x:Key="AnimationTip">使用介面動畫</system:String> <system:String x:Key="AnimationTip">使用介面動畫</system:String>
<system:String x:Key="AnimationSpeed">Animation Speed</system:String> <system:String x:Key="AnimationSpeed">Animation Speed</system:String>

View file

@ -25,6 +25,7 @@
LocationChanged="OnLocationChanged" LocationChanged="OnLocationChanged"
Opacity="{Binding MainWindowOpacity, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Opacity="{Binding MainWindowOpacity, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
PreviewKeyDown="OnKeyDown" PreviewKeyDown="OnKeyDown"
PreviewKeyUp="OnKeyUp"
ResizeMode="NoResize" ResizeMode="NoResize"
ShowInTaskbar="False" ShowInTaskbar="False"
SizeToContent="Height" SizeToContent="Height"
@ -46,47 +47,14 @@
<Window.InputBindings> <Window.InputBindings>
<KeyBinding Key="Escape" Command="{Binding EscCommand}" /> <KeyBinding Key="Escape" Command="{Binding EscCommand}" />
<KeyBinding Key="F5" Command="{Binding ReloadPluginDataCommand}" /> <KeyBinding Key="F5" Command="{Binding ReloadPluginDataCommand}" />
<KeyBinding Key="Tab" Command="{Binding AutocompleteQueryCommand}" />
<KeyBinding
Key="Tab"
Command="{Binding AutocompleteQueryCommand}"
Modifiers="Shift" />
<KeyBinding
Key="I"
Command="{Binding OpenSettingCommand}"
Modifiers="Ctrl" />
<KeyBinding
Key="N"
Command="{Binding SelectNextItemCommand}"
Modifiers="Ctrl" />
<KeyBinding
Key="J"
Command="{Binding SelectNextItemCommand}"
Modifiers="Ctrl" />
<KeyBinding
Key="D"
Command="{Binding SelectNextPageCommand}"
Modifiers="Ctrl" />
<KeyBinding
Key="P"
Command="{Binding SelectPrevItemCommand}"
Modifiers="Ctrl" />
<KeyBinding
Key="K"
Command="{Binding SelectPrevItemCommand}"
Modifiers="Ctrl" />
<KeyBinding
Key="U"
Command="{Binding SelectPrevPageCommand}"
Modifiers="Ctrl" />
<KeyBinding <KeyBinding
Key="Home" Key="Home"
Command="{Binding SelectFirstResultCommand}" Command="{Binding SelectFirstResultCommand}"
Modifiers="Alt" /> Modifiers="Alt" />
<KeyBinding <KeyBinding
Key="O" Key="End"
Command="{Binding LoadContextMenuCommand}" Command="{Binding SelectLastResultCommand}"
Modifiers="Ctrl" /> Modifiers="Alt" />
<KeyBinding <KeyBinding
Key="R" Key="R"
Command="{Binding ReQueryCommand}" Command="{Binding ReQueryCommand}"
@ -111,10 +79,6 @@
Key="OemMinus" Key="OemMinus"
Command="{Binding DecreaseMaxResultCommand}" Command="{Binding DecreaseMaxResultCommand}"
Modifiers="Control" /> Modifiers="Control" />
<KeyBinding
Key="H"
Command="{Binding LoadHistoryCommand}"
Modifiers="Ctrl" />
<KeyBinding <KeyBinding
Key="Enter" Key="Enter"
Command="{Binding OpenResultCommand}" Command="{Binding OpenResultCommand}"
@ -186,10 +150,62 @@
Key="F12" Key="F12"
Command="{Binding ToggleGameModeCommand}" Command="{Binding ToggleGameModeCommand}"
Modifiers="Ctrl" /> Modifiers="Ctrl" />
<KeyBinding
Key="C"
Command="{Binding CopyAlternativeCommand}"
Modifiers="Ctrl+Shift" />
<KeyBinding <KeyBinding
Key="{Binding PreviewHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}" Key="{Binding PreviewHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding TogglePreviewCommand}" Command="{Binding TogglePreviewCommand}"
Modifiers="{Binding PreviewHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" /> Modifiers="{Binding PreviewHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding AutoCompleteHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding AutocompleteQueryCommand}"
Modifiers="{Binding AutoCompleteHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding AutoCompleteHotkey2, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding AutocompleteQueryCommand}"
Modifiers="{Binding AutoCompleteHotkey2, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding SelectNextItemHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding SelectNextItemCommand}"
Modifiers="{Binding SelectNextItemHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding SelectPrevItemHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding SelectPrevItemCommand}"
Modifiers="{Binding SelectPrevItemHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding SelectNextItemHotkey2, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding SelectNextItemCommand}"
Modifiers="{Binding SelectNextItemHotkey2, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding SelectPrevItemHotkey2, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding SelectPrevItemCommand}"
Modifiers="{Binding SelectPrevItemHotkey2, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding SettingWindowHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding OpenSettingCommand}"
Modifiers="{Binding SettingWindowHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding OpenContextMenuHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding LoadContextMenuCommand}"
Modifiers="{Binding OpenContextMenuHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding SelectNextPageHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding SelectNextPageCommand}"
Modifiers="{Binding SelectNextPageHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding SelectPrevPageHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding SelectPrevPageCommand}"
Modifiers="{Binding SelectPrevPageHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding CycleHistoryUpHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding ReverseHistoryCommand}"
Modifiers="{Binding CycleHistoryUpHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
<KeyBinding
Key="{Binding CycleHistoryDownHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}"
Command="{Binding ForwardHistoryCommand}"
Modifiers="{Binding CycleHistoryDownHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" />
</Window.InputBindings> </Window.InputBindings>
<Grid> <Grid>
<Border MouseDown="OnMouseDown" Style="{DynamicResource WindowBorderStyle}"> <Border MouseDown="OnMouseDown" Style="{DynamicResource WindowBorderStyle}">
@ -212,6 +228,7 @@
<TextBox <TextBox
x:Name="QueryTextBox" x:Name="QueryTextBox"
AllowDrop="True" AllowDrop="True"
AutomationProperties.Name="{Binding Results.SelectedItem.Result.Title}"
InputMethod.PreferredImeConversionMode="{Binding StartWithEnglishMode, Converter={StaticResource BoolToIMEConversionModeConverter}}" InputMethod.PreferredImeConversionMode="{Binding StartWithEnglishMode, Converter={StaticResource BoolToIMEConversionModeConverter}}"
InputMethod.PreferredImeState="{Binding StartWithEnglishMode, Converter={StaticResource BoolToIMEStateConverter}}" InputMethod.PreferredImeState="{Binding StartWithEnglishMode, Converter={StaticResource BoolToIMEStateConverter}}"
PreviewDragOver="OnPreviewDragOver" PreviewDragOver="OnPreviewDragOver"
@ -221,7 +238,6 @@
Visibility="Visible"> Visibility="Visible">
<TextBox.CommandBindings> <TextBox.CommandBindings>
<CommandBinding Command="ApplicationCommands.Copy" Executed="OnCopy" /> <CommandBinding Command="ApplicationCommands.Copy" Executed="OnCopy" />
<CommandBinding Command="ApplicationCommands.Paste" Executed="OnPaste" />
</TextBox.CommandBindings> </TextBox.CommandBindings>
<TextBox.ContextMenu> <TextBox.ContextMenu>
<ContextMenu MinWidth="160"> <ContextMenu MinWidth="160">

View file

@ -12,7 +12,6 @@ using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.ViewModel; using Flow.Launcher.ViewModel;
using Screen = System.Windows.Forms.Screen; using Screen = System.Windows.Forms.Screen;
using ContextMenuStrip = System.Windows.Forms.ContextMenuStrip;
using DragEventArgs = System.Windows.DragEventArgs; using DragEventArgs = System.Windows.DragEventArgs;
using KeyEventArgs = System.Windows.Input.KeyEventArgs; using KeyEventArgs = System.Windows.Input.KeyEventArgs;
using NotifyIcon = System.Windows.Forms.NotifyIcon; using NotifyIcon = System.Windows.Forms.NotifyIcon;
@ -24,7 +23,10 @@ using System.Windows.Data;
using ModernWpf.Controls; using ModernWpf.Controls;
using Key = System.Windows.Input.Key; using Key = System.Windows.Input.Key;
using System.Media; using System.Media;
using static Flow.Launcher.ViewModel.SettingWindowViewModel; using DataObject = System.Windows.DataObject;
using System.Windows.Media;
using System.Windows.Interop;
using System.Runtime.InteropServices;
namespace Flow.Launcher namespace Flow.Launcher
{ {
@ -32,14 +34,20 @@ namespace Flow.Launcher
{ {
#region Private Fields #region Private Fields
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr SetForegroundWindow(IntPtr hwnd);
private readonly Storyboard _progressBarStoryboard = new Storyboard(); private readonly Storyboard _progressBarStoryboard = new Storyboard();
private bool isProgressBarStoryboardPaused; private bool isProgressBarStoryboardPaused;
private Settings _settings; private Settings _settings;
private NotifyIcon _notifyIcon; private NotifyIcon _notifyIcon;
private ContextMenu contextMenu; private ContextMenu contextMenu = new ContextMenu();
private MainViewModel _viewModel; private MainViewModel _viewModel;
private bool _animating; private bool _animating;
SoundPlayer animationSound = new SoundPlayer(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav"); private bool isArrowKeyPressed = false;
private MediaPlayer animationSoundWMP;
private SoundPlayer animationSoundWPF;
#endregion #endregion
@ -50,7 +58,11 @@ namespace Flow.Launcher
_settings = settings; _settings = settings;
InitializeComponent(); InitializeComponent();
InitializePosition(); InitializePosition();
InitSoundEffects();
DataObject.AddPastingHandler(QueryTextBox, OnPaste);
} }
public MainWindow() public MainWindow()
@ -72,12 +84,16 @@ namespace Flow.Launcher
} }
} }
private void OnPaste(object sender, ExecutedRoutedEventArgs e) private void OnPaste(object sender, DataObjectPastingEventArgs e)
{ {
if (System.Windows.Clipboard.ContainsText()) var isText = e.SourceDataObject.GetDataPresent(System.Windows.DataFormats.UnicodeText, true);
if (isText)
{ {
_viewModel.ChangeQueryText(System.Windows.Clipboard.GetText().Replace("\n", String.Empty).Replace("\r", String.Empty)); var text = e.SourceDataObject.GetData(System.Windows.DataFormats.UnicodeText) as string;
e.Handled = true; text = text.Replace(Environment.NewLine, " ");
DataObject data = new DataObject();
data.SetData(System.Windows.DataFormats.UnicodeText, text);
e.DataObject = data;
} }
} }
@ -94,9 +110,11 @@ namespace Flow.Launcher
private void OnInitialized(object sender, EventArgs e) private void OnInitialized(object sender, EventArgs e)
{ {
} }
private void OnLoaded(object sender, RoutedEventArgs _) private void OnLoaded(object sender, RoutedEventArgs _)
{ {
// MouseEventHandler
PreviewMouseMove += MainPreviewMouseMove;
CheckFirstLaunch(); CheckFirstLaunch();
HideStartup(); HideStartup();
// show notify icon when flowlauncher is hidden // show notify icon when flowlauncher is hidden
@ -122,7 +140,7 @@ namespace Flow.Launcher
{ {
if (_settings.UseSound) if (_settings.UseSound)
{ {
animationSound.Play(); SoundPlay();
} }
UpdatePosition(); UpdatePosition();
PreviewReset(); PreviewReset();
@ -258,12 +276,11 @@ namespace Flow.Launcher
{ {
_notifyIcon = new NotifyIcon _notifyIcon = new NotifyIcon
{ {
Text = Infrastructure.Constant.FlowLauncher, Text = Infrastructure.Constant.FlowLauncherFullName,
Icon = Properties.Resources.app, Icon = Properties.Resources.app,
Visible = !_settings.HideNotifyIcon Visible = !_settings.HideNotifyIcon
}; };
contextMenu = new ContextMenu();
var openIcon = new FontIcon var openIcon = new FontIcon
{ {
@ -271,7 +288,8 @@ namespace Flow.Launcher
}; };
var open = new MenuItem var open = new MenuItem
{ {
Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + " (" + _settings.Hotkey + ")", Icon = openIcon Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + " (" + _settings.Hotkey + ")",
Icon = openIcon
}; };
var gamemodeIcon = new FontIcon var gamemodeIcon = new FontIcon
{ {
@ -279,7 +297,8 @@ namespace Flow.Launcher
}; };
var gamemode = new MenuItem var gamemode = new MenuItem
{ {
Header = InternationalizationManager.Instance.GetTranslation("GameMode"), Icon = gamemodeIcon Header = InternationalizationManager.Instance.GetTranslation("GameMode"),
Icon = gamemodeIcon
}; };
var positionresetIcon = new FontIcon var positionresetIcon = new FontIcon
{ {
@ -287,7 +306,8 @@ namespace Flow.Launcher
}; };
var positionreset = new MenuItem var positionreset = new MenuItem
{ {
Header = InternationalizationManager.Instance.GetTranslation("PositionReset"), Icon = positionresetIcon Header = InternationalizationManager.Instance.GetTranslation("PositionReset"),
Icon = positionresetIcon
}; };
var settingsIcon = new FontIcon var settingsIcon = new FontIcon
{ {
@ -295,7 +315,8 @@ namespace Flow.Launcher
}; };
var settings = new MenuItem var settings = new MenuItem
{ {
Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings"), Icon = settingsIcon Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings"),
Icon = settingsIcon
}; };
var exitIcon = new FontIcon var exitIcon = new FontIcon
{ {
@ -303,7 +324,8 @@ namespace Flow.Launcher
}; };
var exit = new MenuItem var exit = new MenuItem
{ {
Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit"), Icon = exitIcon Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit"),
Icon = exitIcon
}; };
open.Click += (o, e) => _viewModel.ToggleFlowLauncher(); open.Click += (o, e) => _viewModel.ToggleFlowLauncher();
@ -321,7 +343,6 @@ namespace Flow.Launcher
contextMenu.Items.Add(settings); contextMenu.Items.Add(settings);
contextMenu.Items.Add(exit); contextMenu.Items.Add(exit);
_notifyIcon.ContextMenuStrip = new ContextMenuStrip(); // it need for close the context menu. if not, context menu can't close.
_notifyIcon.MouseClick += (o, e) => _notifyIcon.MouseClick += (o, e) =>
{ {
switch (e.Button) switch (e.Button)
@ -329,9 +350,15 @@ namespace Flow.Launcher
case MouseButtons.Left: case MouseButtons.Left:
_viewModel.ToggleFlowLauncher(); _viewModel.ToggleFlowLauncher();
break; break;
case MouseButtons.Right: case MouseButtons.Right:
contextMenu.IsOpen = true; contextMenu.IsOpen = true;
// Get context menu handle and bring it to the foreground
if (PresentationSource.FromVisual(contextMenu) is HwndSource hwndSource)
{
_ = SetForegroundWindow(hwndSource.Handle);
}
contextMenu.Focus();
break; break;
} }
}; };
@ -380,6 +407,7 @@ namespace Flow.Launcher
if (_animating) if (_animating)
return; return;
isArrowKeyPressed = true;
_animating = true; _animating = true;
UpdatePosition(); UpdatePosition();
@ -468,6 +496,7 @@ namespace Flow.Launcher
windowsb.Completed += (_, _) => _animating = false; windowsb.Completed += (_, _) => _animating = false;
_settings.WindowLeft = Left; _settings.WindowLeft = Left;
_settings.WindowTop = Top; _settings.WindowTop = Top;
isArrowKeyPressed = false;
if (QueryTextBox.Text.Length == 0) if (QueryTextBox.Text.Length == 0)
{ {
@ -477,6 +506,33 @@ namespace Flow.Launcher
windowsb.Begin(FlowMainWindow); windowsb.Begin(FlowMainWindow);
} }
private void InitSoundEffects()
{
if (_settings.WMPInstalled)
{
animationSoundWMP = new MediaPlayer();
animationSoundWMP.Open(new Uri(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav"));
}
else
{
animationSoundWPF = new SoundPlayer(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav");
}
}
private void SoundPlay()
{
if (_settings.WMPInstalled)
{
animationSoundWMP.Position = TimeSpan.Zero;
animationSoundWMP.Volume = _settings.SoundVolume / 100.0;
animationSoundWMP.Play();
}
else
{
animationSoundWPF.Play();
}
}
private void OnMouseDown(object sender, MouseButtonEventArgs e) private void OnMouseDown(object sender, MouseButtonEventArgs e)
{ {
if (e.ChangedButton == MouseButton.Left) DragMove(); if (e.ChangedButton == MouseButton.Left) DragMove();
@ -618,10 +674,12 @@ namespace Flow.Launcher
switch (e.Key) switch (e.Key)
{ {
case Key.Down: case Key.Down:
isArrowKeyPressed = true;
_viewModel.SelectNextItemCommand.Execute(null); _viewModel.SelectNextItemCommand.Execute(null);
e.Handled = true; e.Handled = true;
break; break;
case Key.Up: case Key.Up:
isArrowKeyPressed = true;
_viewModel.SelectPrevItemCommand.Execute(null); _viewModel.SelectPrevItemCommand.Execute(null);
e.Handled = true; e.Handled = true;
break; break;
@ -672,7 +730,21 @@ namespace Flow.Launcher
} }
} }
private void OnKeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Up || e.Key == Key.Down)
{
isArrowKeyPressed = false;
}
}
private void MainPreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
if (isArrowKeyPressed)
{
e.Handled = true; // Ignore Mouse Hover when press Arrowkeys
}
}
public void PreviewReset() public void PreviewReset()
{ {
_viewModel.ResetPreview(); _viewModel.ResetPreview();

View file

@ -315,6 +315,8 @@ namespace Flow.Launcher
public void RegisterGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback) => _globalKeyboardHandlers.Add(callback); public void RegisterGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback) => _globalKeyboardHandlers.Add(callback);
public void RemoveGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback) => _globalKeyboardHandlers.Remove(callback); public void RemoveGlobalKeyboardCallback(Func<int, int, SpecialKeyState, bool> callback) => _globalKeyboardHandlers.Remove(callback);
public void ReQuery(bool reselect = true) => _mainVM.ReQuery(reselect);
#endregion #endregion
#region Private Methods #region Private Methods

View file

@ -0,0 +1,139 @@
<UserControl
x:Class="Flow.Launcher.Resources.Controls.Card"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Flow.Launcher.Resources.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:ui="http://schemas.modernwpf.com/2019"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
<UserControl.Template>
<ControlTemplate TargetType="UserControl">
<Border x:Name="BD" HorizontalAlignment="Stretch">
<Border.Style>
<Style TargetType="{x:Type Border}">
<Setter Property="Background" Value="{DynamicResource Color00B}" />
<Setter Property="BorderBrush" Value="{DynamicResource Color03B}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="5" />
<Setter Property="MinHeight" Value="68" />
<Setter Property="Padding" Value="0,15,0,15" />
<Setter Property="Margin" Value="0,4,0,0" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding Type, RelativeSource={RelativeSource AncestorType=local:Card}}" Value="Inside">
<Setter Property="BorderThickness" Value="0,1,0,0" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Margin" Value="0,0,0,0" />
<Setter Property="Background" Value="Transparent" />
</DataTrigger>
<DataTrigger Binding="{Binding Type, RelativeSource={RelativeSource AncestorType=local:Card}}" Value="InsideFit">
<Setter Property="BorderThickness" Value="0,1,0,0" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Margin" Value="0,0,0,0" />
<Setter Property="Padding" Value="38,0,26,0" />
<Setter Property="Background" Value="Transparent" />
</DataTrigger>
<DataTrigger Binding="{Binding (local:CardGroup.Position), RelativeSource={RelativeSource AncestorType=local:Card}}" Value="First">
<Setter Property="Margin" Value="0" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0" />
</DataTrigger>
<DataTrigger Binding="{Binding (local:CardGroup.Position), RelativeSource={RelativeSource AncestorType=local:Card}}" Value="Middle">
<Setter Property="Margin" Value="0" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0 1 0 0" />
</DataTrigger>
<DataTrigger Binding="{Binding (local:CardGroup.Position), RelativeSource={RelativeSource AncestorType=local:Card}}" Value="Last">
<Setter Property="Margin" Value="0" />
<Setter Property="CornerRadius" Value="0" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0 1 0 0" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="auto"
MinWidth="20"
MaxWidth="60" />
<ColumnDefinition Width="8*" />
<ColumnDefinition Width="Auto" MinWidth="30" />
</Grid.ColumnDefinitions>
<ContentControl
Grid.Row="0"
Grid.Column="2"
Margin="0,0,16,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Content="{TemplateBinding Content}" />
<StackPanel>
<StackPanel.Style>
<Style TargetType="{x:Type StackPanel}">
<Setter Property="Grid.Column" Value="1" />
<Setter Property="Width" Value="Auto" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Left" />
</Style>
</StackPanel.Style>
<TextBlock x:Name="ItemTitle" Text="{Binding Title, RelativeSource={RelativeSource AncestorType=local:Card}}">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="{DynamicResource Color05B}" />
<Setter Property="Margin" Value="0,0,0,0" />
<Setter Property="TextWrapping" Value="Wrap" />
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock x:Name="SubTitle" Text="{Binding Sub, RelativeSource={RelativeSource AncestorType=local:Card}}">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=SubTitle, Path=Text}" Value="{x:Static sys:String.Empty}">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
<Setter Property="Foreground" Value="{DynamicResource Color04B}" />
<Setter Property="FontSize" Value="12" />
<Setter Property="Margin" Value="0,0,0,0" />
<Setter Property="Padding" Value="0,0,24,0" />
<Setter Property="TextWrapping" Value="WrapWithOverflow" />
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
<TextBlock x:Name="ItemIcon" Text="{Binding Icon, RelativeSource={RelativeSource AncestorType=local:Card}}">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ItemIcon, Path=Text}" Value="{x:Static sys:String.Empty}">
<Setter Property="Margin" Value="24,0,0,0" />
</DataTrigger>
</Style.Triggers>
<Setter Property="Grid.Column" Value="0" />
<Setter Property="Margin" Value="24,0,16,0" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="FontSize" Value="20" />
<Setter Property="FontFamily" Value="/Resources/#Segoe Fluent Icons" />
<Setter Property="Foreground" Value="{DynamicResource Color05B}" />
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</Border>
</ControlTemplate>
</UserControl.Template>
</UserControl>

View file

@ -0,0 +1,64 @@
using System.Windows;
using UserControl = System.Windows.Controls.UserControl;
namespace Flow.Launcher.Resources.Controls
{
public partial class Card : UserControl
{
public enum CardType
{
Default,
Inside,
InsideFit
}
public Card()
{
InitializeComponent();
}
public string Title
{
get { return (string)GetValue(TitleProperty); }
set { SetValue(TitleProperty, value); }
}
public static readonly DependencyProperty TitleProperty =
DependencyProperty.Register(nameof(Title), typeof(string), typeof(Card), new PropertyMetadata(string.Empty));
public string Sub
{
get { return (string)GetValue(SubProperty); }
set { SetValue(SubProperty, value); }
}
public static readonly DependencyProperty SubProperty =
DependencyProperty.Register(nameof(Sub), typeof(string), typeof(Card), new PropertyMetadata(string.Empty));
public string Icon
{
get { return (string)GetValue(IconProperty); }
set { SetValue(IconProperty, value); }
}
public static readonly DependencyProperty IconProperty =
DependencyProperty.Register(nameof(Icon), typeof(string), typeof(Card), new PropertyMetadata(string.Empty));
/// <summary>
/// Gets or sets additional content for the UserControl
/// </summary>
public object AdditionalContent
{
get { return (object)GetValue(AdditionalContentProperty); }
set { SetValue(AdditionalContentProperty, value); }
}
public static readonly DependencyProperty AdditionalContentProperty =
DependencyProperty.Register(nameof(AdditionalContent), typeof(object), typeof(Card),
new PropertyMetadata(null));
public CardType Type
{
get { return (CardType)GetValue(TypeProperty); }
set { SetValue(TypeProperty, value); }
}
public static readonly DependencyProperty TypeProperty =
DependencyProperty.Register(nameof(Type), typeof(CardType), typeof(Card),
new PropertyMetadata(CardType.Default));
}
}

View file

@ -0,0 +1,32 @@
<UserControl x:Class="Flow.Launcher.Resources.Controls.CardGroup"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:cc="clr-namespace:Flow.Launcher.Resources.Controls"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance cc:CardGroup}"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<Style TargetType="cc:Card" x:Key="FirstStyle">
<Setter Property="cc:CardGroup.Position" Value="First" />
</Style>
<Style TargetType="cc:Card" x:Key="MiddleStyle">
<Setter Property="cc:CardGroup.Position" Value="Middle" />
</Style>
<Style TargetType="cc:Card" x:Key="LastStyle">
<Setter Property="cc:CardGroup.Position" Value="Last" />
</Style>
<cc:CardGroupCardStyleSelector
x:Key="CardStyleSelector"
FirstStyle="{StaticResource FirstStyle}"
MiddleStyle="{StaticResource MiddleStyle}"
LastStyle="{StaticResource LastStyle}" />
</UserControl.Resources>
<Border Background="{DynamicResource Color00B}" BorderBrush="{DynamicResource Color03B}" BorderThickness="1"
CornerRadius="5">
<ItemsControl ItemsSource="{Binding Content, RelativeSource={RelativeSource AncestorType=cc:CardGroup}}"
ItemContainerStyleSelector="{StaticResource CardStyleSelector}" />
</Border>
</UserControl>

View file

@ -0,0 +1,47 @@
using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
namespace Flow.Launcher.Resources.Controls;
public partial class CardGroup : UserControl
{
public enum CardGroupPosition
{
NotInGroup,
First,
Middle,
Last
}
public new ObservableCollection<Card> Content
{
get { return (ObservableCollection<Card>)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
public static new readonly DependencyProperty ContentProperty =
DependencyProperty.Register(nameof(Content), typeof(ObservableCollection<Card>), typeof(CardGroup));
public static readonly DependencyProperty PositionProperty = DependencyProperty.RegisterAttached(
"Position", typeof(CardGroupPosition), typeof(CardGroup),
new FrameworkPropertyMetadata(CardGroupPosition.NotInGroup, FrameworkPropertyMetadataOptions.AffectsRender)
);
public static void SetPosition(UIElement element, CardGroupPosition value)
{
element.SetValue(PositionProperty, value);
}
public static CardGroupPosition GetPosition(UIElement element)
{
return (CardGroupPosition)element.GetValue(PositionProperty);
}
public CardGroup()
{
InitializeComponent();
Content = new ObservableCollection<Card>();
}
}

View file

@ -0,0 +1,21 @@
using System.Windows;
using System.Windows.Controls;
namespace Flow.Launcher.Resources.Controls;
public class CardGroupCardStyleSelector : StyleSelector
{
public Style FirstStyle { get; set; }
public Style MiddleStyle { get; set; }
public Style LastStyle { get; set; }
public override Style SelectStyle(object item, DependencyObject container)
{
var itemsControl = ItemsControl.ItemsControlFromItemContainer(container);
var index = itemsControl.ItemContainerGenerator.IndexFromContainer(container);
if (index == 0) return FirstStyle;
if (index == itemsControl.Items.Count - 1) return LastStyle;
return MiddleStyle;
}
}

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