diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index 177c00fa2..5b3419041 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -99,3 +99,7 @@ pluginsmanager alreadyexists Softpedia img +Reloadable +metadatas +WMP +VSTHRD diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt index 5ef8859fc..f308ec599 100644 --- a/.github/actions/spelling/patterns.txt +++ b/.github/actions/spelling/patterns.txt @@ -133,3 +133,4 @@ \bPortuguês (Brasil)\b \bčeština\b \bPortuguês\b +\bIoc\b diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index ccea511b3..be523bfe8 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,11 +1,12 @@ from os import getenv +from typing import Optional import requests def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: str = "all") -> list[dict]: """ - Fetches pull requests from a GitHub repository that match a given milestone and label. + Fetches pull requests from a GitHub repository that match a given label and state. Args: token (str): GitHub token. @@ -23,39 +24,10 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st "Accept": "application/vnd.github.v3+json", } - milestone_id = None - milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" - params = {"state": "open"} - - try: - response = requests.get(milestone_url, headers=headers, params=params) - response.raise_for_status() - milestones = response.json() - - if len(milestones) > 2: - print("More than two milestones found, unable to determine the milestone required.") - exit(1) - - # milestones.pop() - for ms in milestones: - if ms["title"] != "Future": - milestone_id = ms["number"] - print(f"Gathering PRs with milestone {ms['title']}...") - break - - if not milestone_id: - print(f"No suitable milestone found in repository '{owner}/{repo}'.") - exit(1) - - except requests.exceptions.RequestException as e: - print(f"Error fetching milestones: {e}") - exit(1) - - # This endpoint allows filtering by milestone and label. A PR in GH's perspective is a type of issue. + # This endpoint allows filtering by label(and milestone). A PR in GH's perspective is a type of issue. prs_url = f"https://api.github.com/repos/{owner}/{repo}/issues" params = { "state": state, - "milestone": milestone_id, "labels": label, "per_page": 100, } @@ -83,7 +55,9 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st return all_prs -def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[dict]: +def get_prs( + pull_request_items: list[dict], label: str = "", state: str = "all", milestone_title: Optional[str] = None +) -> list[dict]: """ Returns a list of pull requests after applying the label and state filters. @@ -91,6 +65,8 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") pull_request_items (list[dict]): List of PR items. label (str): The label name. Filter is not applied when empty string. state (str): State of PR, e.g. open, closed, all + milestone_title (Optional[str]): The milestone title to filter by. This is the milestone number you created + in GitHub, e.g. '1.20.0'. If None, no milestone filtering is applied. Returns: list: A list of dictionaries, where each dictionary represents a pull request. @@ -99,22 +75,32 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") pr_list = [] count = 0 for pr in pull_request_items: - if state in [pr["state"], "all"] and (not label or [item for item in pr["labels"] if item["name"] == label]): - pr_list.append(pr) - count += 1 + if state not in [pr["state"], "all"]: + continue - print(f"Found {count} PRs with {label if label else 'no filter on'} label and state as {state}") + if label and not [item for item in pr["labels"] if item["name"] == label]: + continue + + if milestone_title: + if pr["milestone"] is None or pr["milestone"]["title"] != milestone_title: + continue + + pr_list.append(pr) + count += 1 + + print( + f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {milestone_title if milestone_title else "any"}" + ) return pr_list -def get_prs_assignees(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[str]: + +def get_prs_assignees(pull_request_items: list[dict]) -> list[str]: """ - Returns a list of pull request assignees after applying the label and state filters, excludes jjw24. + Returns a list of pull request assignees, excludes jjw24. Args: - pull_request_items (list[dict]): List of PR items. - label (str): The label name. Filter is not applied when empty string. - state (str): State of PR, e.g. open, closed, all + pull_request_items (list[dict]): List of PR items to get the assignees from. Returns: list: A list of strs, where each string is an assignee name. List is not distinct, so can contain @@ -123,13 +109,13 @@ def get_prs_assignees(pull_request_items: list[dict], label: str = "", state: st """ assignee_list = [] for pr in pull_request_items: - if state in [pr["state"], "all"] and (not label or [item for item in pr["labels"] if item["name"] == label]): - [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24" ] + [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24"] - print(f"Found {len(assignee_list)} assignees with {label if label else 'no filter on'} label and state as {state}") + print(f"Found {len(assignee_list)} assignees") return assignee_list + def get_pr_descriptions(pull_request_items: list[dict]) -> str: """ Returns the concatenated string of pr title and number in the format of @@ -207,15 +193,16 @@ if __name__ == "__main__": print(f"Fetching {state} PRs for {repository_owner}/{repository_name} ...") - pull_requests = get_github_prs(github_token, repository_owner, repository_name) + # First, get all PRs to find the release PR and determine the milestone + all_pull_requests = get_github_prs(github_token, repository_owner, repository_name) - if not pull_requests: - print("No matching pull requests found") + if not all_pull_requests: + print("No pull requests found") exit(1) - print(f"\nFound total of {len(pull_requests)} pull requests") + print(f"\nFound total of {len(all_pull_requests)} pull requests") - release_pr = get_prs(pull_requests, "release", "open") + release_pr = get_prs(all_pull_requests, "release", "open") if len(release_pr) != 1: print(f"Unable to find the exact release PR. Returned result: {release_pr}") @@ -223,14 +210,25 @@ if __name__ == "__main__": print(f"Found release PR: {release_pr[0]['title']}") - enhancement_prs = get_prs(pull_requests, "enhancement", "closed") - bug_fix_prs = get_prs(pull_requests, "bug", "closed") + release_milestone_title = release_pr[0].get("milestone", {}).get("title", None) + + if not release_milestone_title: + print("Release PR does not have a milestone assigned.") + exit(1) + + print(f"Using milestone number: {release_milestone_title}") + + enhancement_prs = get_prs(all_pull_requests, "enhancement", "closed", release_milestone_title) + bug_fix_prs = get_prs(all_pull_requests, "bug", "closed", release_milestone_title) + + if len(enhancement_prs) == 0 and len(bug_fix_prs) == 0: + print(f"No PRs with {release_milestone_title} milestone were found") description_content = "# Release notes\n" description_content += f"## Features\n{get_pr_descriptions(enhancement_prs)}" if enhancement_prs else "" description_content += f"## Bug fixes\n{get_pr_descriptions(bug_fix_prs)}" if bug_fix_prs else "" - assignees = list(set(get_prs_assignees(pull_requests, "enhancement", "closed") + get_prs_assignees(pull_requests, "bug", "closed"))) + assignees = list(set(get_prs_assignees(enhancement_prs) + get_prs_assignees(bug_fix_prs))) assignees.sort(key=str.lower) description_content += f"### Authors:\n{', '.join(assignees)}" diff --git a/Flow.Launcher.Core/Plugin/PluginInstaller.cs b/Flow.Launcher.Core/Plugin/PluginInstaller.cs new file mode 100644 index 000000000..33963c01a --- /dev/null +++ b/Flow.Launcher.Core/Plugin/PluginInstaller.cs @@ -0,0 +1,353 @@ +using System; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using CommunityToolkit.Mvvm.DependencyInjection; +using Flow.Launcher.Infrastructure.UserSettings; +using Flow.Launcher.Plugin; + +namespace Flow.Launcher.Core.Plugin; + +/// +/// Class for installing, updating, and uninstalling plugins. +/// +public static class PluginInstaller +{ + private static readonly string ClassName = nameof(PluginInstaller); + + private static readonly Settings Settings = Ioc.Default.GetRequiredService(); + + // We should not initialize API in static constructor because it will create another API instance + private static IPublicAPI api = null; + private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService(); + + /// + /// Installs a plugin and restarts the application if required by settings. Prompts user for confirmation and handles download if needed. + /// + /// The plugin to install. + /// A Task representing the asynchronous install operation. + public static async Task InstallPluginAndCheckRestartAsync(UserPlugin newPlugin) + { + if (API.PluginModified(newPlugin.ID)) + { + API.ShowMsgError(string.Format(API.GetTranslation("pluginModifiedAlreadyTitle"), newPlugin.Name), + API.GetTranslation("pluginModifiedAlreadyMessage")); + return; + } + + if (API.ShowMsgBox( + string.Format( + API.GetTranslation("InstallPromptSubtitle"), + newPlugin.Name, newPlugin.Author, Environment.NewLine), + API.GetTranslation("InstallPromptTitle"), + button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return; + + try + { + // at minimum should provide a name, but handle plugin that is not downloaded from plugins manifest and is a url download + var downloadFilename = string.IsNullOrEmpty(newPlugin.Version) + ? $"{newPlugin.Name}-{Guid.NewGuid()}.zip" + : $"{newPlugin.Name}-{newPlugin.Version}.zip"; + + var filePath = Path.Combine(Path.GetTempPath(), downloadFilename); + + using var cts = new CancellationTokenSource(); + + if (!newPlugin.IsFromLocalInstallPath) + { + await DownloadFileAsync( + $"{API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}", + newPlugin.UrlDownload, filePath, cts); + } + else + { + filePath = newPlugin.LocalInstallPath; + } + + // check if user cancelled download before installing plugin + if (cts.IsCancellationRequested) + { + return; + } + + if (!File.Exists(filePath)) + { + throw new FileNotFoundException($"Plugin {newPlugin.ID} zip file not found at {filePath}", filePath); + } + + if (!API.InstallPlugin(newPlugin, filePath)) + { + return; + } + + if (!newPlugin.IsFromLocalInstallPath) + { + File.Delete(filePath); + } + } + catch (Exception e) + { + API.LogException(ClassName, "Failed to install plugin", e); + API.ShowMsgError(API.GetTranslation("ErrorInstallingPlugin")); + return; // do not restart on failure + } + + if (Settings.AutoRestartAfterChanging) + { + API.RestartApp(); + } + else + { + API.ShowMsg( + API.GetTranslation("installbtn"), + string.Format( + API.GetTranslation( + "InstallSuccessNoRestart"), + newPlugin.Name)); + } + } + + /// + /// Installs a plugin from a local zip file and restarts the application if required by settings. Validates the zip and prompts user for confirmation. + /// + /// The path to the plugin zip file. + /// A Task representing the asynchronous install operation. + public static async Task InstallPluginAndCheckRestartAsync(string filePath) + { + UserPlugin plugin; + try + { + using ZipArchive archive = ZipFile.OpenRead(filePath); + var pluginJsonEntry = archive.Entries.FirstOrDefault(x => x.Name == "plugin.json") ?? + throw new FileNotFoundException("The zip file does not contain a plugin.json file."); + + using Stream stream = pluginJsonEntry.Open(); + plugin = JsonSerializer.Deserialize(stream); + plugin.IcoPath = "Images\\zipfolder.png"; + plugin.LocalInstallPath = filePath; + } + catch (Exception e) + { + API.LogException(ClassName, "Failed to validate zip file", e); + API.ShowMsgError(API.GetTranslation("ZipFileNotHavePluginJson")); + return; + } + + if (API.PluginModified(plugin.ID)) + { + API.ShowMsgError(string.Format(API.GetTranslation("pluginModifiedAlreadyTitle"), plugin.Name), + API.GetTranslation("pluginModifiedAlreadyMessage")); + return; + } + + if (Settings.ShowUnknownSourceWarning) + { + if (!InstallSourceKnown(plugin.Website) + && API.ShowMsgBox(string.Format( + API.GetTranslation("InstallFromUnknownSourceSubtitle"), Environment.NewLine), + API.GetTranslation("InstallFromUnknownSourceTitle"), + MessageBoxButton.YesNo) == MessageBoxResult.No) + return; + } + + await InstallPluginAndCheckRestartAsync(plugin); + } + + /// + /// Uninstalls a plugin and restarts the application if required by settings. Prompts user for confirmation and whether to keep plugin settings. + /// + /// The plugin metadata to uninstall. + /// A Task representing the asynchronous uninstall operation. + public static async Task UninstallPluginAndCheckRestartAsync(PluginMetadata oldPlugin) + { + if (API.PluginModified(oldPlugin.ID)) + { + API.ShowMsgError(string.Format(API.GetTranslation("pluginModifiedAlreadyTitle"), oldPlugin.Name), + API.GetTranslation("pluginModifiedAlreadyMessage")); + return; + } + + if (API.ShowMsgBox( + string.Format( + API.GetTranslation("UninstallPromptSubtitle"), + oldPlugin.Name, oldPlugin.Author, Environment.NewLine), + API.GetTranslation("UninstallPromptTitle"), + button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return; + + var removePluginSettings = API.ShowMsgBox( + API.GetTranslation("KeepPluginSettingsSubtitle"), + API.GetTranslation("KeepPluginSettingsTitle"), + button: MessageBoxButton.YesNo) == MessageBoxResult.No; + + try + { + if (!await API.UninstallPluginAsync(oldPlugin, removePluginSettings)) + { + return; + } + } + catch (Exception e) + { + API.LogException(ClassName, "Failed to uninstall plugin", e); + API.ShowMsgError(API.GetTranslation("ErrorUninstallingPlugin")); + return; // don not restart on failure + } + + if (Settings.AutoRestartAfterChanging) + { + API.RestartApp(); + } + else + { + API.ShowMsg( + API.GetTranslation("uninstallbtn"), + string.Format( + API.GetTranslation( + "UninstallSuccessNoRestart"), + oldPlugin.Name)); + } + } + + /// + /// Updates a plugin to a new version and restarts the application if required by settings. Prompts user for confirmation and handles download if needed. + /// + /// The new plugin version to install. + /// The existing plugin metadata to update. + /// A Task representing the asynchronous update operation. + public static async Task UpdatePluginAndCheckRestartAsync(UserPlugin newPlugin, PluginMetadata oldPlugin) + { + if (API.ShowMsgBox( + string.Format( + API.GetTranslation("UpdatePromptSubtitle"), + oldPlugin.Name, oldPlugin.Author, Environment.NewLine), + API.GetTranslation("UpdatePromptTitle"), + button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return; + + try + { + var filePath = Path.Combine(Path.GetTempPath(), $"{newPlugin.Name}-{newPlugin.Version}.zip"); + + using var cts = new CancellationTokenSource(); + + if (!newPlugin.IsFromLocalInstallPath) + { + await DownloadFileAsync( + $"{API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}", + newPlugin.UrlDownload, filePath, cts); + } + else + { + filePath = newPlugin.LocalInstallPath; + } + + // check if user cancelled download before installing plugin + if (cts.IsCancellationRequested) + { + return; + } + + if (!await API.UpdatePluginAsync(oldPlugin, newPlugin, filePath)) + { + return; + } + } + catch (Exception e) + { + API.LogException(ClassName, "Failed to update plugin", e); + API.ShowMsgError(API.GetTranslation("ErrorUpdatingPlugin")); + return; // do not restart on failure + } + + if (Settings.AutoRestartAfterChanging) + { + API.RestartApp(); + } + else + { + API.ShowMsg( + API.GetTranslation("updatebtn"), + string.Format( + API.GetTranslation( + "UpdateSuccessNoRestart"), + newPlugin.Name)); + } + } + + /// + /// Downloads a file from a URL to a local path, optionally showing a progress box and handling cancellation. + /// + /// The title for the progress box. + /// The URL to download from. + /// The local file path to save to. + /// Cancellation token source for cancelling the download. + /// Whether to delete the file if it already exists. + /// Whether to show a progress box during download. + /// A Task representing the asynchronous download operation. + private static async Task DownloadFileAsync(string progressBoxTitle, string downloadUrl, string filePath, CancellationTokenSource cts, bool deleteFile = true, bool showProgress = true) + { + if (deleteFile && File.Exists(filePath)) + File.Delete(filePath); + + if (showProgress) + { + var exceptionHappened = false; + await API.ShowProgressBoxAsync(progressBoxTitle, + async (reportProgress) => + { + if (reportProgress == null) + { + // when reportProgress is null, it means there is exception with the progress box + // so we record it with exceptionHappened and return so that progress box will close instantly + exceptionHappened = true; + return; + } + else + { + await API.HttpDownloadAsync(downloadUrl, filePath, reportProgress, cts.Token).ConfigureAwait(false); + } + }, cts.Cancel); + + // if exception happened while downloading and user does not cancel downloading, + // we need to redownload the plugin + if (exceptionHappened && (!cts.IsCancellationRequested)) + await API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false); + } + else + { + await API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false); + } + } + + /// + /// Determines if the plugin install source is a known/approved source (e.g., GitHub and matches an existing plugin author). + /// + /// The URL to check. + /// True if the source is known, otherwise false. + private static bool InstallSourceKnown(string url) + { + if (string.IsNullOrEmpty(url)) + return false; + + var pieces = url.Split('/'); + + if (pieces.Length < 4) + return false; + + var author = pieces[3]; + var acceptedHost = "github.com"; + var acceptedSource = "https://github.com"; + var constructedUrlPart = string.Format("{0}/{1}/", acceptedSource, author); + + if (!Uri.TryCreate(url, UriKind.Absolute, out var uri) || uri.Host != acceptedHost) + return false; + + return API.GetAllPlugins().Any(x => + !string.IsNullOrEmpty(x.Metadata.Website) && + x.Metadata.Website.StartsWith(constructedUrlPart) + ); + } +} diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 9b525f331..d88f2f050 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -18,15 +18,12 @@ using ISavable = Flow.Launcher.Plugin.ISavable; namespace Flow.Launcher.Core.Plugin { /// - /// The entry for managing Flow Launcher plugins + /// Class for co-ordinating and managing all plugin lifecycle. /// public static class PluginManager { private static readonly string ClassName = nameof(PluginManager); - private static IEnumerable _contextMenuPlugins; - private static IEnumerable _homePlugins; - public static List AllPlugins { get; private set; } public static readonly HashSet GlobalPlugins = new(); public static readonly Dictionary NonGlobalPlugins = new(); @@ -36,8 +33,12 @@ namespace Flow.Launcher.Core.Plugin private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService(); private static PluginsSettings Settings; - private static List _metadatas; - private static readonly List _modifiedPlugins = new(); + private static readonly ConcurrentBag ModifiedPlugins = new(); + + private static IEnumerable _contextMenuPlugins; + private static IEnumerable _homePlugins; + private static IEnumerable _resultUpdatePlugin; + private static IEnumerable _translationPlugins; /// /// Directories that will hold Flow Launcher plugin directory @@ -173,12 +174,18 @@ namespace Flow.Launcher.Core.Plugin /// public static void LoadPlugins(PluginsSettings settings) { - _metadatas = PluginConfig.Parse(Directories); + var metadatas = PluginConfig.Parse(Directories); Settings = settings; - Settings.UpdatePluginSettings(_metadatas); - AllPlugins = PluginsLoader.Plugins(_metadatas, Settings); + Settings.UpdatePluginSettings(metadatas); + AllPlugins = PluginsLoader.Plugins(metadatas, Settings); // Since dotnet plugins need to get assembly name first, we should update plugin directory after loading plugins - UpdatePluginDirectory(_metadatas); + UpdatePluginDirectory(metadatas); + + // Initialize plugin enumerable after all plugins are initialized + _contextMenuPlugins = GetPluginsForInterface(); + _homePlugins = GetPluginsForInterface(); + _resultUpdatePlugin = GetPluginsForInterface(); + _translationPlugins = GetPluginsForInterface(); } private static void UpdatePluginDirectory(List metadatas) @@ -248,9 +255,6 @@ namespace Flow.Launcher.Core.Plugin await Task.WhenAll(InitTasks); - _contextMenuPlugins = GetPluginsForInterface(); - _homePlugins = GetPluginsForInterface(); - foreach (var plugin in AllPlugins) { // set distinct on each plugin's action keywords helps only firing global(*) and action keywords once where a plugin @@ -290,7 +294,14 @@ namespace Flow.Launcher.Core.Plugin return Array.Empty(); if (!NonGlobalPlugins.TryGetValue(query.ActionKeyword, out var plugin)) - return GlobalPlugins; + { + return GlobalPlugins.Where(p => !PluginModified(p.Metadata.ID)).ToList(); + } + + if (API.PluginModified(plugin.Metadata.ID)) + { + return Array.Empty(); + } return new List { @@ -300,7 +311,7 @@ namespace Flow.Launcher.Core.Plugin public static ICollection ValidPluginsForHomeQuery() { - return _homePlugins.ToList(); + return _homePlugins.Where(p => !PluginModified(p.Metadata.ID)).ToList(); } public static async Task> QueryForPluginAsync(PluginPair pair, Query query, CancellationToken token) @@ -402,16 +413,26 @@ namespace Flow.Launcher.Core.Plugin return AllPlugins.FirstOrDefault(o => o.Metadata.ID == id); } - public static IEnumerable GetPluginsForInterface() where T : IFeatures + private static IEnumerable GetPluginsForInterface() where T : IFeatures { // Handle scenario where this is called before all plugins are instantiated, e.g. language change on startup return AllPlugins?.Where(p => p.Plugin is T) ?? Array.Empty(); } + public static IList GetResultUpdatePlugin() + { + return _resultUpdatePlugin.Where(p => !PluginModified(p.Metadata.ID)).ToList(); + } + + public static IList GetTranslationPlugins() + { + return _translationPlugins.Where(p => !PluginModified(p.Metadata.ID)).ToList(); + } + public static List GetContextMenusForPlugin(Result result) { var results = new List(); - var pluginPair = _contextMenuPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID); + var pluginPair = _contextMenuPlugins.Where(p => !PluginModified(p.Metadata.ID)).FirstOrDefault(o => o.Metadata.ID == result.PluginID); if (pluginPair != null) { var plugin = (IContextMenu)pluginPair.Plugin; @@ -439,7 +460,7 @@ namespace Flow.Launcher.Core.Plugin public static bool IsHomePlugin(string id) { - return _homePlugins.Any(p => p.Metadata.ID == id); + return _homePlugins.Where(p => !PluginModified(p.Metadata.ID)).Any(p => p.Metadata.ID == id); } public static bool ActionKeywordRegistered(string actionKeyword) @@ -529,44 +550,62 @@ namespace Flow.Launcher.Core.Plugin private static bool SameOrLesserPluginVersionExists(string metadataPath) { var newMetadata = JsonSerializer.Deserialize(File.ReadAllText(metadataPath)); + + if (!Version.TryParse(newMetadata.Version, out var newVersion)) + return true; // If version is not valid, we assume it is lesser than any existing version + return AllPlugins.Any(x => x.Metadata.ID == newMetadata.ID - && newMetadata.Version.CompareTo(x.Metadata.Version) <= 0); + && Version.TryParse(x.Metadata.Version, out var version) + && newVersion <= version); } #region Public functions public static bool PluginModified(string id) { - return _modifiedPlugins.Contains(id); + return ModifiedPlugins.Contains(id); } - public static async Task UpdatePluginAsync(PluginMetadata existingVersion, UserPlugin newVersion, string zipFilePath) + public static async Task UpdatePluginAsync(PluginMetadata existingVersion, UserPlugin newVersion, string zipFilePath) { - InstallPlugin(newVersion, zipFilePath, checkModified:false); - await UninstallPluginAsync(existingVersion, removePluginFromSettings:false, removePluginSettings:false, checkModified: false); - _modifiedPlugins.Add(existingVersion.ID); + if (PluginModified(existingVersion.ID)) + { + API.ShowMsgError(string.Format(API.GetTranslation("pluginModifiedAlreadyTitle"), existingVersion.Name), + API.GetTranslation("pluginModifiedAlreadyMessage")); + return false; + } + + var installSuccess = InstallPlugin(newVersion, zipFilePath, checkModified: false); + if (!installSuccess) return false; + + var uninstallSuccess = await UninstallPluginAsync(existingVersion, removePluginFromSettings: false, removePluginSettings: false, checkModified: false); + if (!uninstallSuccess) return false; + + ModifiedPlugins.Add(existingVersion.ID); + return true; } - public static void InstallPlugin(UserPlugin plugin, string zipFilePath) + public static bool InstallPlugin(UserPlugin plugin, string zipFilePath) { - InstallPlugin(plugin, zipFilePath, checkModified: true); + return InstallPlugin(plugin, zipFilePath, checkModified: true); } - public static async Task UninstallPluginAsync(PluginMetadata plugin, bool removePluginFromSettings = true, bool removePluginSettings = false) + public static async Task UninstallPluginAsync(PluginMetadata plugin, bool removePluginSettings = false) { - await UninstallPluginAsync(plugin, removePluginFromSettings, removePluginSettings, true); + return await UninstallPluginAsync(plugin, removePluginFromSettings: true, removePluginSettings: removePluginSettings, checkModified: true); } #endregion #region Internal functions - internal static void InstallPlugin(UserPlugin plugin, string zipFilePath, bool checkModified) + internal static bool InstallPlugin(UserPlugin plugin, string zipFilePath, bool checkModified) { if (checkModified && PluginModified(plugin.ID)) { - // Distinguish exception from installing same or less version - throw new ArgumentException($"Plugin {plugin.Name} {plugin.ID} has been modified.", nameof(plugin)); + API.ShowMsgError(string.Format(API.GetTranslation("pluginModifiedAlreadyTitle"), plugin.Name), + API.GetTranslation("pluginModifiedAlreadyMessage")); + return false; } // Unzip plugin files to temp folder @@ -584,12 +623,16 @@ namespace Flow.Launcher.Core.Plugin if (string.IsNullOrEmpty(metadataJsonFilePath) || string.IsNullOrEmpty(pluginFolderPath)) { - throw new FileNotFoundException($"Unable to find plugin.json from the extracted zip file, or this path {pluginFolderPath} does not exist"); + API.ShowMsgError(string.Format(API.GetTranslation("failedToInstallPluginTitle"), plugin.Name), + string.Format(API.GetTranslation("fileNotFoundMessage"), pluginFolderPath)); + return false; } if (SameOrLesserPluginVersionExists(metadataJsonFilePath)) { - throw new InvalidOperationException($"A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin {plugin.Name}"); + API.ShowMsgError(string.Format(API.GetTranslation("failedToInstallPluginTitle"), plugin.Name), + API.GetTranslation("pluginExistAlreadyMessage")); + return false; } var folderName = string.IsNullOrEmpty(plugin.Version) ? $"{plugin.Name}-{Guid.NewGuid()}" : $"{plugin.Name}-{plugin.Version}"; @@ -631,15 +674,19 @@ namespace Flow.Launcher.Core.Plugin if (checkModified) { - _modifiedPlugins.Add(plugin.ID); + ModifiedPlugins.Add(plugin.ID); } + + return true; } - internal static async Task UninstallPluginAsync(PluginMetadata plugin, bool removePluginFromSettings, bool removePluginSettings, bool checkModified) + internal static async Task UninstallPluginAsync(PluginMetadata plugin, bool removePluginFromSettings, bool removePluginSettings, bool checkModified) { if (checkModified && PluginModified(plugin.ID)) { - throw new ArgumentException($"Plugin {plugin.Name} has been modified"); + API.ShowMsgError(string.Format(API.GetTranslation("pluginModifiedAlreadyTitle"), plugin.Name), + API.GetTranslation("pluginModifiedAlreadyMessage")); + return false; } if (removePluginSettings || removePluginFromSettings) @@ -693,6 +740,12 @@ namespace Flow.Launcher.Core.Plugin } Settings.RemovePluginSettings(plugin.ID); AllPlugins.RemoveAll(p => p.Metadata.ID == plugin.ID); + GlobalPlugins.RemoveWhere(p => p.Metadata.ID == plugin.ID); + var keysToRemove = NonGlobalPlugins.Where(p => p.Value.Metadata.ID == plugin.ID).Select(p => p.Key).ToList(); + foreach (var key in keysToRemove) + { + NonGlobalPlugins.Remove(key); + } } // Marked for deletion. Will be deleted on next start up @@ -700,8 +753,10 @@ namespace Flow.Launcher.Core.Plugin if (checkModified) { - _modifiedPlugins.Add(plugin.ID); + ModifiedPlugins.Add(plugin.ID); } + + return true; } #endregion diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs index 24edc5ed8..7b7d6eef6 100644 --- a/Flow.Launcher.Core/Resource/Internationalization.cs +++ b/Flow.Launcher.Core/Resource/Internationalization.cs @@ -74,7 +74,7 @@ namespace Flow.Launcher.Core.Resource private void AddPluginLanguageDirectories() { - foreach (var plugin in PluginManager.GetPluginsForInterface()) + foreach (var plugin in PluginManager.GetTranslationPlugins()) { var location = Assembly.GetAssembly(plugin.Plugin.GetType()).Location; var dir = Path.GetDirectoryName(location); @@ -278,7 +278,8 @@ namespace Flow.Launcher.Core.Resource private void UpdatePluginMetadataTranslations() { - foreach (var p in PluginManager.GetPluginsForInterface()) + // Update plugin metadata name & description + foreach (var p in PluginManager.GetTranslationPlugins()) { if (p.Plugin is not IPluginI18n pluginI18N) return; try diff --git a/Flow.Launcher.Infrastructure/IAlphabet.cs b/Flow.Launcher.Infrastructure/IAlphabet.cs new file mode 100644 index 000000000..d13eeb414 --- /dev/null +++ b/Flow.Launcher.Infrastructure/IAlphabet.cs @@ -0,0 +1,22 @@ +namespace Flow.Launcher.Infrastructure +{ + /// + /// Translate a language to English letters using a given rule. + /// + public interface IAlphabet + { + /// + /// Translate a string to English letters, using a given rule. + /// + /// String to translate. + /// + public (string translation, TranslationMapping map) Translate(string stringToTranslate); + + /// + /// Determine if a string should be translated to English letter with this Alphabet. + /// + /// String to translate. + /// + public bool ShouldTranslate(string stringToTranslate); + } +} diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 8eaa757be..b5344c7e9 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -1,209 +1,148 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; -using System.Linq; +using System.Collections.ObjectModel; +using System.IO; using System.Text; -using JetBrains.Annotations; +using System.Text.Json; +using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.Infrastructure.UserSettings; using ToolGood.Words.Pinyin; -using CommunityToolkit.Mvvm.DependencyInjection; +using Flow.Launcher.Infrastructure.Logger; namespace Flow.Launcher.Infrastructure { - public class TranslationMapping - { - private bool constructed; - - private List originalIndexs = new List(); - private List translatedIndexs = new List(); - private int translatedLength = 0; - - public string key { get; private set; } - - public void setKey(string key) - { - this.key = key; - } - - public void AddNewIndex(int originalIndex, int translatedIndex, int length) - { - if (constructed) - throw new InvalidOperationException("Mapping shouldn't be changed after constructed"); - - originalIndexs.Add(originalIndex); - translatedIndexs.Add(translatedIndex); - translatedIndexs.Add(translatedIndex + length); - translatedLength += length - 1; - } - - public int MapToOriginalIndex(int translatedIndex) - { - if (translatedIndex > translatedIndexs.Last()) - return translatedIndex - translatedLength - 1; - - int lowerBound = 0; - int upperBound = originalIndexs.Count - 1; - - int count = 0; - - // Corner case handle - if (translatedIndex < translatedIndexs[0]) - return translatedIndex; - if (translatedIndex > translatedIndexs.Last()) - { - int indexDef = 0; - for (int k = 0; k < originalIndexs.Count; k++) - { - indexDef += translatedIndexs[k * 2 + 1] - translatedIndexs[k * 2]; - } - - return translatedIndex - indexDef - 1; - } - - // Binary Search with Range - for (int i = originalIndexs.Count / 2;; count++) - { - if (translatedIndex < translatedIndexs[i * 2]) - { - // move to lower middle - upperBound = i; - i = (i + lowerBound) / 2; - } - else if (translatedIndex > translatedIndexs[i * 2 + 1] - 1) - { - lowerBound = i; - // move to upper middle - // due to floor of integer division, move one up on corner case - i = (i + upperBound + 1) / 2; - } - else - return originalIndexs[i]; - - if (upperBound - lowerBound <= 1 && - translatedIndex > translatedIndexs[lowerBound * 2 + 1] && - translatedIndex < translatedIndexs[upperBound * 2]) - { - int indexDef = 0; - - for (int j = 0; j < upperBound; j++) - { - indexDef += translatedIndexs[j * 2 + 1] - translatedIndexs[j * 2]; - } - - return translatedIndex - indexDef - 1; - } - } - } - - public void endConstruct() - { - if (constructed) - throw new InvalidOperationException("Mapping has already been constructed"); - constructed = true; - } - } - - /// - /// Translate a language to English letters using a given rule. - /// - public interface IAlphabet - { - /// - /// Translate a string to English letters, using a given rule. - /// - /// String to translate. - /// - public (string translation, TranslationMapping map) Translate(string stringToTranslate); - - /// - /// Determine if a string can be translated to English letter with this Alphabet. - /// - /// String to translate. - /// - public bool CanBeTranslated(string stringToTranslate); - } - public class PinyinAlphabet : IAlphabet { private ConcurrentDictionary _pinyinCache = - new ConcurrentDictionary(); + new(); - private Settings _settings; + private readonly Settings _settings; + + private ReadOnlyDictionary currentDoublePinyinTable; public PinyinAlphabet() { - Initialize(Ioc.Default.GetRequiredService()); + _settings = Ioc.Default.GetRequiredService(); + LoadDoublePinyinTable(); + + _settings.PropertyChanged += (sender, e) => + { + if (e.PropertyName == nameof(Settings.UseDoublePinyin) || + e.PropertyName == nameof(Settings.DoublePinyinSchema)) + { + Reload(); + } + }; } - private void Initialize([NotNull] Settings settings) + public void Reload() { - _settings = settings ?? throw new ArgumentNullException(nameof(settings)); + LoadDoublePinyinTable(); + _pinyinCache.Clear(); } - public bool CanBeTranslated(string stringToTranslate) + private void CreateDoublePinyinTableFromStream(Stream jsonStream) { - return WordsHelper.HasChinese(stringToTranslate); + Dictionary> table = JsonSerializer.Deserialize>>(jsonStream); + string schemaKey = _settings.DoublePinyinSchema.ToString(); // Convert enum to string + if (!table.TryGetValue(schemaKey, out var value)) + { + throw new ArgumentException("DoublePinyinSchema is invalid or double pinyin table is broken."); + } + currentDoublePinyinTable = new ReadOnlyDictionary(value); + } + + private void LoadDoublePinyinTable() + { + if (_settings.UseDoublePinyin) + { + var tablePath = Path.Join(AppContext.BaseDirectory, "Resources", "double_pinyin.json"); + try + { + using var fs = File.OpenRead(tablePath); + CreateDoublePinyinTableFromStream(fs); + } + catch (System.Exception e) + { + Log.Exception(nameof(PinyinAlphabet), "Failed to load double pinyin table from file: " + tablePath, e); + currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary()); + } + } + else + { + currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary()); + } + } + + public bool ShouldTranslate(string stringToTranslate) + { + // If a string has Chinese characters, we don't need to translate it to pinyin. + return _settings.ShouldUsePinyin && !WordsHelper.HasChinese(stringToTranslate); } public (string translation, TranslationMapping map) Translate(string content) { - if (_settings.ShouldUsePinyin) - { - if (!_pinyinCache.ContainsKey(content)) - { - return BuildCacheFromContent(content); - } - else - { - return _pinyinCache[content]; - } - } - return (content, null); + if (!_settings.ShouldUsePinyin || !WordsHelper.HasChinese(content)) + return (content, null); + + return _pinyinCache.TryGetValue(content, out var value) + ? value + : BuildCacheFromContent(content); } private (string translation, TranslationMapping map) BuildCacheFromContent(string content) { - if (WordsHelper.HasChinese(content)) + var resultList = WordsHelper.GetPinyinList(content); + + var resultBuilder = new StringBuilder(); + var map = new TranslationMapping(); + + var previousIsChinese = false; + + for (var i = 0; i < resultList.Length; i++) { - var resultList = WordsHelper.GetPinyinList(content); - - StringBuilder resultBuilder = new StringBuilder(); - TranslationMapping map = new TranslationMapping(); - - bool pre = false; - - for (int i = 0; i < resultList.Length; i++) + if (content[i] >= 0x3400 && content[i] <= 0x9FD5) { - if (content[i] >= 0x3400 && content[i] <= 0x9FD5) + string translated = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i]; + if (i > 0) { - map.AddNewIndex(i, resultBuilder.Length, resultList[i].Length + 1); resultBuilder.Append(' '); - resultBuilder.Append(resultList[i]); - pre = true; - } - else - { - if (pre) - { - pre = false; - resultBuilder.Append(' '); - } - - resultBuilder.Append(resultList[i]); } + map.AddNewIndex(resultBuilder.Length, translated.Length); + resultBuilder.Append(translated); + previousIsChinese = true; + } + else + { + if (previousIsChinese) + { + previousIsChinese = false; + resultBuilder.Append(' '); + } + map.AddNewIndex(resultBuilder.Length, resultList[i].Length); + resultBuilder.Append(resultList[i]); } - - map.endConstruct(); - - var key = resultBuilder.ToString(); - map.setKey(key); - - return _pinyinCache[content] = (key, map); - } - else - { - return (content, null); } + + map.endConstruct(); + + var key = resultBuilder.ToString(); + + return _pinyinCache[content] = (key, map); } + + #region Double Pinyin + + private string ToDoublePin(string fullPinyin) + { + if (currentDoublePinyinTable.TryGetValue(fullPinyin, out var doublePinyinValue)) + { + return doublePinyinValue; + } + return fullPinyin; + } + + #endregion } } diff --git a/Flow.Launcher.Infrastructure/StringMatcher.cs b/Flow.Launcher.Infrastructure/StringMatcher.cs index e85c5d6f4..2882cb8f0 100644 --- a/Flow.Launcher.Infrastructure/StringMatcher.cs +++ b/Flow.Launcher.Infrastructure/StringMatcher.cs @@ -68,7 +68,7 @@ namespace Flow.Launcher.Infrastructure query = query.Trim(); TranslationMapping translationMapping = null; - if (_alphabet is not null && !_alphabet.CanBeTranslated(query)) + if (_alphabet is not null && _alphabet.ShouldTranslate(query)) { // We assume that if a query can be translated (containing characters of a language, like Chinese) // it actually means user doesn't want it to be translated to English letters. @@ -228,7 +228,7 @@ namespace Flow.Launcher.Infrastructure return new MatchResult(false, UserSettingSearchPrecision); } - private bool IsAcronym(string stringToCompare, int compareStringIndex) + private static bool IsAcronym(string stringToCompare, int compareStringIndex) { if (IsAcronymChar(stringToCompare, compareStringIndex) || IsAcronymNumber(stringToCompare, compareStringIndex)) return true; @@ -237,7 +237,7 @@ namespace Flow.Launcher.Infrastructure } // When counting acronyms, treat a set of numbers as one acronym ie. Visual 2019 as 2 acronyms instead of 5 - private bool IsAcronymCount(string stringToCompare, int compareStringIndex) + private static bool IsAcronymCount(string stringToCompare, int compareStringIndex) { if (IsAcronymChar(stringToCompare, compareStringIndex)) return true; diff --git a/Flow.Launcher.Infrastructure/TranslationMapping.cs b/Flow.Launcher.Infrastructure/TranslationMapping.cs new file mode 100644 index 000000000..5b02ae666 --- /dev/null +++ b/Flow.Launcher.Infrastructure/TranslationMapping.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; + +namespace Flow.Launcher.Infrastructure +{ + public class TranslationMapping + { + private bool constructed; + + // Assuming one original item maps to multi translated items + // list[i] is the last translated index + 1 of original index i + private readonly List originalToTranslated = new(); + + public void AddNewIndex(int translatedIndex, int length) + { + if (constructed) + throw new InvalidOperationException("Mapping shouldn't be changed after constructed"); + + originalToTranslated.Add(translatedIndex + length); + } + + public int MapToOriginalIndex(int translatedIndex) + { + int loc = originalToTranslated.BinarySearch(translatedIndex); + return loc >= 0 ? loc : ~loc; + } + + public void endConstruct() + { + if (constructed) + throw new InvalidOperationException("Mapping has already been constructed"); + constructed = true; + } + } +} diff --git a/Flow.Launcher.Infrastructure/UserSettings/PluginHotkey.cs b/Flow.Launcher.Infrastructure/UserSettings/PluginHotkey.cs index 9dc395aca..0c5c38028 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/PluginHotkey.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/PluginHotkey.cs @@ -1,4 +1,5 @@ -using Flow.Launcher.Plugin; +using System; +using Flow.Launcher.Plugin; namespace Flow.Launcher.Infrastructure.UserSettings { @@ -6,5 +7,26 @@ namespace Flow.Launcher.Infrastructure.UserSettings { public string Hotkey { get; set; } public string ActionKeyword { get; set; } + + public CustomPluginHotkey(string hotkey, string actionKeyword) + { + Hotkey = hotkey; + ActionKeyword = actionKeyword; + } + + public override bool Equals(object other) + { + if (other is CustomPluginHotkey otherHotkey) + { + return Hotkey == otherHotkey.Hotkey && ActionKeyword == otherHotkey.ActionKeyword; + } + + return false; + } + + public override int GetHashCode() + { + return HashCode.Combine(Hotkey, ActionKeyword); + } } } diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 2dbdf0bf8..6b10d693d 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -40,9 +40,37 @@ namespace Flow.Launcher.Infrastructure.UserSettings } public string Hotkey { get; set; } = $"{KeyConstant.Alt} + {KeyConstant.Space}"; - public string OpenResultModifiers { get; set; } = KeyConstant.Alt; + + private string _openResultModifiers = KeyConstant.Alt; + public string OpenResultModifiers + { + get => _openResultModifiers; + set + { + if (_openResultModifiers != value) + { + _openResultModifiers = value; + OnPropertyChanged(); + } + } + } + public string ColorScheme { get; set; } = "System"; - public bool ShowOpenResultHotkey { get; set; } = true; + + private bool _showOpenResultHotkey = true; + public bool ShowOpenResultHotkey + { + get => _showOpenResultHotkey; + set + { + if (_showOpenResultHotkey != value) + { + _showOpenResultHotkey = value; + OnPropertyChanged(); + } + } + } + public double WindowSize { get; set; } = 580; public string PreviewHotkey { get; set; } = $"F1"; public string AutoCompleteHotkey { get; set; } = $"{KeyConstant.Ctrl} + Tab"; @@ -87,7 +115,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings } } public bool UseDropShadowEffect { get; set; } = true; - public BackdropTypes BackdropType{ get; set; } = BackdropTypes.None; + public BackdropTypes BackdropType { get; set; } = BackdropTypes.None; public string ReleaseNotesVersion { get; set; } = string.Empty; /* Appearance Settings. It should be separated from the setting later.*/ @@ -200,9 +228,12 @@ namespace Flow.Launcher.Infrastructure.UserSettings } } } - + public int MaxHistoryResultsToShowForHomePage { get; set; } = 5; + public bool AutoRestartAfterChanging { get; set; } = false; + public bool ShowUnknownSourceWarning { get; set; } = true; + public int CustomExplorerIndex { get; set; } = 0; [JsonIgnore] @@ -299,6 +330,36 @@ namespace Flow.Launcher.Infrastructure.UserSettings /// public bool ShouldUsePinyin { get; set; } = false; + private bool _useDoublePinyin = false; + public bool UseDoublePinyin + { + get => _useDoublePinyin; + set + { + if (_useDoublePinyin != value) + { + _useDoublePinyin = value; + OnPropertyChanged(); + } + } + } + + private DoublePinyinSchemas _doublePinyinSchema = DoublePinyinSchemas.XiaoHe; + + [JsonInclude, JsonConverter(typeof(JsonStringEnumConverter))] + public DoublePinyinSchemas DoublePinyinSchema + { + get => _doublePinyinSchema; + set + { + if (_doublePinyinSchema != value) + { + _doublePinyinSchema = value; + OnPropertyChanged(); + } + } + } + public bool AlwaysPreview { get; set; } = false; public bool AlwaysStartEn { get; set; } = false; @@ -461,7 +522,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings if (!string.IsNullOrEmpty(SettingWindowHotkey)) list.Add(new(SettingWindowHotkey, "SettingWindowHotkey", () => SettingWindowHotkey = "")); if (!string.IsNullOrEmpty(OpenHistoryHotkey)) - list.Add(new(OpenHistoryHotkey, "OpenHistoryHotkey", () => OpenHistoryHotkey = "")); + list.Add(new(OpenHistoryHotkey, "OpenHistoryHotkey", () => OpenHistoryHotkey = "")); if (!string.IsNullOrEmpty(OpenContextMenuHotkey)) list.Add(new(OpenContextMenuHotkey, "OpenContextMenuHotkey", () => OpenContextMenuHotkey = "")); if (!string.IsNullOrEmpty(SelectNextPageHotkey)) @@ -567,9 +628,22 @@ namespace Flow.Launcher.Infrastructure.UserSettings public enum BackdropTypes { - None, + None, Acrylic, Mica, MicaAlt } + + public enum DoublePinyinSchemas + { + XiaoHe, + ZiRanMa, + WeiRuan, + ZhiNengABC, + ZiGuangPinYin, + PinYinJiaJia, + XingKongJianDao, + DaNiu, + XiaoLang + } } diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs index 86e7b7c97..32ed31137 100644 --- a/Flow.Launcher.Infrastructure/Win32Helper.cs +++ b/Flow.Launcher.Infrastructure/Win32Helper.cs @@ -791,5 +791,41 @@ namespace Flow.Launcher.Infrastructure } #endregion + + #region Win32 Dark Mode + + /* + * Inspired by https://github.com/ysc3839/win32-darkmode + */ + + [DllImport("uxtheme.dll", EntryPoint = "#135", SetLastError = true)] + private static extern int SetPreferredAppMode(int appMode); + + public static void EnableWin32DarkMode(string colorScheme) + { + try + { + // Undocumented API from Windows 10 1809 + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && + Environment.OSVersion.Version.Build >= 17763) + { + var flag = colorScheme switch + { + Constant.Light => 3, // ForceLight + Constant.Dark => 2, // ForceDark + Constant.System => 1, // AllowDark + _ => 0 // Default + }; + _ = SetPreferredAppMode(flag); + } + + } + catch + { + // Ignore errors on unsupported OS + } + } + + #endregion } } diff --git a/Flow.Launcher.Plugin/EventHandler.cs b/Flow.Launcher.Plugin/EventHandler.cs index 893b0ba80..47ab24757 100644 --- a/Flow.Launcher.Plugin/EventHandler.cs +++ b/Flow.Launcher.Plugin/EventHandler.cs @@ -39,7 +39,14 @@ namespace Flow.Launcher.Plugin /// /// public delegate void VisibilityChangedEventHandler(object sender, VisibilityChangedEventArgs args); - + + /// + /// A delegate for when the actual application theme is changed + /// + /// + /// + public delegate void ActualApplicationThemeChangedEventHandler(object sender, ActualApplicationThemeChangedEventArgs args); + /// /// The event args for /// @@ -77,4 +84,15 @@ namespace Flow.Launcher.Plugin /// public Query Query { get; set; } } + + /// + /// The event args for + /// + public class ActualApplicationThemeChangedEventArgs : EventArgs + { + /// + /// if the application has changed actual theme + /// + public bool IsDark { get; init; } + } } diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj index 4a49e9589..1831bf46f 100644 --- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj +++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj @@ -14,10 +14,10 @@ - 4.6.0 - 4.6.0 - 4.6.0 - 4.6.0 + 4.7.0 + 4.7.0 + 4.7.0 + 4.7.0 Flow.Launcher.Plugin Flow-Launcher MIT @@ -27,6 +27,7 @@ true true Readme.md + true diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs index f47ee5e11..cfa813d3f 100644 --- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs +++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs @@ -23,8 +23,8 @@ namespace Flow.Launcher.Plugin /// /// query text /// - /// Force requery. By default, Flow Launcher will not fire query if your query is same with existing one. - /// Set this to to force Flow Launcher requerying + /// Force requery. By default, Flow Launcher will not fire query if your query is same with existing one. + /// Set this to to force Flow Launcher re-querying /// void ChangeQuery(string query, bool requery = false); @@ -49,7 +49,7 @@ namespace Flow.Launcher.Plugin /// /// Text to save on clipboard /// When true it will directly copy the file/folder from the path specified in text - /// Whether to show the default notification from this method after copy is done. + /// Whether to show the default notification from this method after copy is done. /// It will show file/folder/text is copied successfully. /// Turn this off to show your own notification after copy is done.> public void CopyToClipboard(string text, bool directCopy = false, bool showDefaultNotification = true); @@ -65,7 +65,7 @@ namespace Flow.Launcher.Plugin void SavePluginSettings(); /// - /// Reloads any Plugins that have the + /// Reloads any Plugins that have the /// IReloadable implemented. It refeshes /// Plugin's in memory data with new content /// added by user. @@ -97,7 +97,7 @@ namespace Flow.Launcher.Plugin /// Show the MainWindow when hiding /// void ShowMainWindow(); - + /// /// Focus the query text box in the main window /// @@ -115,7 +115,7 @@ namespace Flow.Launcher.Plugin bool IsMainWindowVisible(); /// - /// Invoked when the visibility of the main window has changed. Currently, the plugin will continue to be subscribed even if it is turned off. + /// Invoked when the visibility of the main window has changed. Currently, the plugin will continue to be subscribed even if it is turned off. /// event VisibilityChangedEventHandler VisibilityChanged; @@ -171,7 +171,7 @@ namespace Flow.Launcher.Plugin string GetTranslation(string key); /// - /// Get all loaded plugins + /// Get all loaded plugins /// /// List GetAllPlugins(); @@ -229,7 +229,7 @@ namespace Flow.Launcher.Plugin MatchResult FuzzySearch(string query, string stringToCompare); /// - /// Http download the spefic url and return as string + /// Http download the specific url and return as string /// /// URL to call Http Get /// Cancellation Token @@ -237,7 +237,7 @@ namespace Flow.Launcher.Plugin Task HttpGetStringAsync(string url, CancellationToken token = default); /// - /// Http download the spefic url and return as stream + /// Http download the specific url and return as stream /// /// URL to call Http Get /// Cancellation Token @@ -305,8 +305,8 @@ namespace Flow.Launcher.Plugin void LogError(string className, string message, [CallerMemberName] string methodName = ""); /// - /// Log an Exception. Will throw if in debug mode so developer will be aware, - /// otherwise logs the eror message. This is the primary logging method used for Flow + /// Log an Exception. Will throw if in debug mode so developer will be aware, + /// otherwise logs the eror message. This is the primary logging method used for Flow /// void LogException(string className, string message, Exception e, [CallerMemberName] string methodName = ""); @@ -393,7 +393,7 @@ namespace Flow.Launcher.Plugin /// /// Reloads the query. - /// When current results are from context menu or history, it will go back to query results before requerying. + /// When current results are from context menu or history, it will go back to query results before re-querying. /// /// Choose the first result after reload if true; keep the last selected result if false. Default is true. public void ReQuery(bool reselect = true); @@ -547,8 +547,10 @@ namespace Flow.Launcher.Plugin /// /// Path to the zip file containing the plugin. It will be unzipped to the temporary directory, removed and installed. /// - /// - public Task UpdatePluginAsync(PluginMetadata pluginMetadata, UserPlugin plugin, string zipFilePath); + /// + /// True if the plugin is updated successfully, false otherwise. + /// + public Task UpdatePluginAsync(PluginMetadata pluginMetadata, UserPlugin plugin, string zipFilePath); /// /// Install a plugin. By default will remove the zip file if installation is from url, @@ -558,7 +560,10 @@ namespace Flow.Launcher.Plugin /// /// Path to the zip file containing the plugin. It will be unzipped to the temporary directory, removed and installed. /// - public void InstallPlugin(UserPlugin plugin, string zipFilePath); + /// + /// True if the plugin is installed successfully, false otherwise. + /// + public bool InstallPlugin(UserPlugin plugin, string zipFilePath); /// /// Uninstall a plugin @@ -567,8 +572,10 @@ namespace Flow.Launcher.Plugin /// /// Plugin has their own settings. If this is set to true, the plugin settings will be removed. /// - /// - public Task UninstallPluginAsync(PluginMetadata pluginMetadata, bool removePluginSettings = false); + /// + /// True if the plugin is updated successfully, false otherwise. + /// + public Task UninstallPluginAsync(PluginMetadata pluginMetadata, bool removePluginSettings = false); /// /// Log debug message of the time taken to execute a method @@ -595,5 +602,16 @@ namespace Flow.Launcher.Plugin /// /// The time taken to execute the method in milliseconds public Task StopwatchLogInfoAsync(string className, string message, Func action, [CallerMemberName] string methodName = ""); + + /// + /// Representing whether the application is using a dark theme + /// + /// + bool IsApplicationDarkTheme(); + + /// + /// Invoked when the actual theme of the application has changed. Currently, the plugin will continue to be subscribed even if it is turned off. + /// + event ActualApplicationThemeChangedEventHandler ActualApplicationThemeChanged; } } diff --git a/Flow.Launcher.Test/TranslationMappingTest.cs b/Flow.Launcher.Test/TranslationMappingTest.cs new file mode 100644 index 000000000..10d765f5a --- /dev/null +++ b/Flow.Launcher.Test/TranslationMappingTest.cs @@ -0,0 +1,56 @@ +using Flow.Launcher.Infrastructure; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace Flow.Launcher.Test +{ + [TestFixture] + public class TranslationMappingTest + { + [Test] + public void AddNewIndex_ShouldAddTranslatedIndexPlusLength() + { + var mapping = new TranslationMapping(); + mapping.AddNewIndex(5, 3); + mapping.AddNewIndex(8, 2); + + // 5+3=8, 8+2=10 + ClassicAssert.AreEqual(2, GetOriginalToTranslatedCount(mapping)); + ClassicAssert.AreEqual(8, GetOriginalToTranslatedAt(mapping, 0)); + ClassicAssert.AreEqual(10, GetOriginalToTranslatedAt(mapping, 1)); + } + + [TestCase(0, 0)] + [TestCase(2, 1)] + [TestCase(3, 1)] + [TestCase(5, 2)] + [TestCase(6, 2)] + public void MapToOriginalIndex_ShouldReturnExpectedIndex(int translatedIndex, int expectedOriginalIndex) + { + var mapping = new TranslationMapping(); + // a测试 + // a Ce Shi + mapping.AddNewIndex(0, 1); + mapping.AddNewIndex(2, 2); + mapping.AddNewIndex(5, 3); + + + var result = mapping.MapToOriginalIndex(translatedIndex); + ClassicAssert.AreEqual(expectedOriginalIndex, result); + } + + private int GetOriginalToTranslatedCount(TranslationMapping mapping) + { + var field = typeof(TranslationMapping).GetField("originalToTranslated", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + var list = (System.Collections.Generic.List)field.GetValue(mapping); + return list.Count; + } + + private int GetOriginalToTranslatedAt(TranslationMapping mapping, int index) + { + var field = typeof(TranslationMapping).GetField("originalToTranslated", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + var list = (System.Collections.Generic.List)field.GetValue(mapping); + return list[index]; + } + } +} diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs index 5df1f88ae..7b82748fc 100644 --- a/Flow.Launcher/App.xaml.cs +++ b/Flow.Launcher/App.xaml.cs @@ -188,6 +188,9 @@ namespace Flow.Launcher Notification.Install(); + // Enable Win32 dark mode if the system is in dark mode before creating all windows + Win32Helper.EnableWin32DarkMode(_settings.ColorScheme); + Ioc.Default.GetRequiredService().PreStartCleanUpAfterPortabilityUpdate(); API.LogInfo(ClassName, "Begin Flow Launcher startup ----------------------------------------------------"); @@ -208,6 +211,9 @@ namespace Flow.Launcher Http.Proxy = _settings.Proxy; + // Initialize plugin manifest before initializing plugins so that they can use the manifest instantly + await API.UpdatePluginManifestAsync(); + await PluginManager.InitializePluginsAsync(); // Change language after all plugins are initialized because we need to update plugin title based on their api diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml b/Flow.Launcher/CustomQueryHotkeySetting.xaml index 0171e6d79..db99b704a 100644 --- a/Flow.Launcher/CustomQueryHotkeySetting.xaml +++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml @@ -119,7 +119,8 @@ Grid.Column="1" Margin="10" HorizontalAlignment="Stretch" - VerticalAlignment="Center" /> + VerticalAlignment="Center" + Text="{Binding ActionKeyword}" /> diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs index 77febde9d..2ee08bf85 100644 --- a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs +++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs @@ -1,73 +1,52 @@ -using System.Collections.ObjectModel; -using System.Linq; -using System.Windows; -using System.Windows.Input; +using System.Windows; using System.Windows.Controls; -using Flow.Launcher.Helper; +using System.Windows.Input; using Flow.Launcher.Infrastructure.UserSettings; namespace Flow.Launcher { public partial class CustomQueryHotkeySetting : Window { - private readonly Settings _settings; + public string Hotkey { get; set; } = string.Empty; + public string ActionKeyword { get; set; } = string.Empty; - private bool update; - private CustomPluginHotkey updateCustomHotkey; + private readonly bool update; + private readonly CustomPluginHotkey originalCustomHotkey; - public CustomQueryHotkeySetting(Settings settings) + public CustomQueryHotkeySetting() { - _settings = settings; InitializeComponent(); + tbAdd.Visibility = Visibility.Visible; + } + + public CustomQueryHotkeySetting(CustomPluginHotkey hotkey) + { + originalCustomHotkey = hotkey; + update = true; + ActionKeyword = originalCustomHotkey.ActionKeyword; + InitializeComponent(); + tbUpdate.Visibility = Visibility.Visible; + HotkeyControl.SetHotkey(originalCustomHotkey.Hotkey, false); } private void BtnCancel_OnClick(object sender, RoutedEventArgs e) { + DialogResult = false; Close(); } private void btnAdd_OnClick(object sender, RoutedEventArgs e) { - if (!update) + Hotkey = HotkeyControl.CurrentHotkey.ToString(); + + if (string.IsNullOrEmpty(Hotkey) && string.IsNullOrEmpty(ActionKeyword)) { - _settings.CustomPluginHotkeys ??= new ObservableCollection(); - - var pluginHotkey = new CustomPluginHotkey - { - Hotkey = HotkeyControl.CurrentHotkey.ToString(), ActionKeyword = tbAction.Text - }; - _settings.CustomPluginHotkeys.Add(pluginHotkey); - - HotKeyMapper.SetCustomQueryHotkey(pluginHotkey); - } - else - { - var oldHotkey = updateCustomHotkey.Hotkey; - updateCustomHotkey.ActionKeyword = tbAction.Text; - updateCustomHotkey.Hotkey = HotkeyControl.CurrentHotkey.ToString(); - //remove origin hotkey - HotKeyMapper.RemoveHotkey(oldHotkey); - HotKeyMapper.SetCustomQueryHotkey(updateCustomHotkey); - } - - Close(); - } - - public void UpdateItem(CustomPluginHotkey item) - { - updateCustomHotkey = _settings.CustomPluginHotkeys.FirstOrDefault(o => - o.ActionKeyword == item.ActionKeyword && o.Hotkey == item.Hotkey); - if (updateCustomHotkey == null) - { - App.API.ShowMsgBox(App.API.GetTranslation("invalidPluginHotkey")); - Close(); + App.API.ShowMsgBox(App.API.GetTranslation("emptyPluginHotkey")); return; } - tbAction.Text = updateCustomHotkey.ActionKeyword; - HotkeyControl.SetHotkey(updateCustomHotkey.Hotkey, false); - update = true; - lblAdd.Text = App.API.GetTranslation("update"); + DialogResult = !update || originalCustomHotkey.Hotkey != Hotkey || originalCustomHotkey.ActionKeyword != ActionKeyword; + Close(); } private void BtnTestActionKeyword_OnClick(object sender, RoutedEventArgs e) @@ -79,6 +58,7 @@ namespace Flow.Launcher private void cmdEsc_OnPress(object sender, ExecutedRoutedEventArgs e) { + DialogResult = false; Close(); } diff --git a/Flow.Launcher/CustomShortcutSetting.xaml.cs b/Flow.Launcher/CustomShortcutSetting.xaml.cs index e180f6570..f4644a267 100644 --- a/Flow.Launcher/CustomShortcutSetting.xaml.cs +++ b/Flow.Launcher/CustomShortcutSetting.xaml.cs @@ -43,12 +43,14 @@ namespace Flow.Launcher App.API.ShowMsgBox(App.API.GetTranslation("emptyShortcut")); return; } + // Check if key is modified or adding a new one if (((update && originalKey != Key) || !update) && _hotkeyVm.DoesShortcutExist(Key)) { App.API.ShowMsgBox(App.API.GetTranslation("duplicateShortcut")); return; } + DialogResult = !update || originalKey != Key || originalValue != Value; Close(); } diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj index d75d15a21..37e1f6bcf 100644 --- a/Flow.Launcher/Flow.Launcher.csproj +++ b/Flow.Launcher/Flow.Launcher.csproj @@ -127,6 +127,9 @@ PreserveNewest + + PreserveNewest + diff --git a/Flow.Launcher/Languages/ar.xaml b/Flow.Launcher/Languages/ar.xaml index b0d4b6818..80fde6441 100644 --- a/Flow.Launcher/Languages/ar.xaml +++ b/Flow.Launcher/Languages/ar.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} تعذر تعيين مسار الملف التنفيذي لـ {0}، يرجى المحاولة من إعدادات Flow (قم بالتمرير إلى الأسفل). فشل في تهيئة الإضافات @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources البحث عن إضافة @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin متجر الإضافات @@ -191,6 +201,28 @@ إصدار جديد تم تحديث هذه الإضافة في آخر 7 أيام يتوفر تحديث جديد + خطأ في تثبيت الإضاف + خطأ في إلغاء تثبيت الإضافة + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + تم تثبيت الإضافة {0} بنجاح. يرجى إعادة تشغيل Flow. + تم إلغاء تثبيت الإضافة {0} بنجاح. يرجى إعادة تشغيل Flow. + تم تحديث الإضافة {0} بنجاح. يرجى إعادة تشغيل Flow. + Plugin install + {0} بواسطة {1} {2}{2}هل ترغب في تثبيت هذه الإضافة؟ + Plugin uninstall + {0} بواسطة {1} {2}{2}هل ترغب في إلغاء تثبيت هذه الإضافة؟ + Plugin update + {0} بواسطة {1} {2}{2}هل ترغب في تحديث هذه الإضافة؟ + تحميل الإضاف + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + التثبيت من مصدر غير معرو + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path السمة @@ -383,7 +415,7 @@ اختر مدير الملفات Learn more يرجى تحديد موقع ملف مدير الملفات الذي تستخدمه وإضافة الحجج حسب الحاجة. يمثل "%d" مسار الدليل المفتوح، ويستخدمه الحقل "الحجة للمجلد" للأوامر التي تفتح أدلة محددة. يمثل "%f" مسار الملف المفتوح، ويستخدمه الحقل "الحجة للملف" للأوامر التي تفتح ملفات محددة. - على سبيل المثال، إذا كان مدير الملفات يستخدم أمرًا مثل "totalcmd.exe /A c:\windows" لفتح دليل c:\windows، فإن مسار مدير الملفات سيكون totalcmd.exe، وحجة المجلد ستكون /A "%d". قد تحتاج بعض مديري الملفات مثل QTTabBar فقط إلى توفير مسار، في هذه الحالة استخدم "%d" كمسار مدير الملفات واترك باقي الحقول فارغة. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. مدير الملفات اسم الملف الشخصي مسار مدير الملفات @@ -434,13 +466,14 @@ اضغط على مفتاح اختصار مخصص لفتح Flow Launcher وإدخال الاستعلام المحدد تلقائيًا. معاينة مفتاح الاختصار غير متاح، يرجى اختيار مفتاح اختصار جديد - مفتاح اختصار غير صالح للإضافة + Hotkey is invalid تحديث ربط مفتاح الاختصار مفتاح الاختصار الحالي غير متاح. تم حجز هذا المفتاح لـ "{0}" ولا يمكن استخدامه. يرجى اختيار مفتاح اختصار آخر. يتم استخدام هذا المفتاح بالفعل من قبل "{0}". إذا ضغطت على "استبدال"، سيتم إزالته من "{0}". اضغط على المفاتيح التي تريد استخدامها لهذه الوظيفة. + Hotkey and action keyword are empty اختصار الاستعلام المخصص @@ -451,6 +484,7 @@ الاختصار موجود بالفعل، يرجى إدخال اختصار جديد أو تعديل الموجود. الاختصار و/أو توسيعه فارغ. + Shortcut is invalid حفظ diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml index 254298f80..aa13f2203 100644 --- a/Flow.Launcher/Languages/cs.xaml +++ b/Flow.Launcher/Languages/cs.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Vyhledat plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Obchod s pluginy @@ -191,6 +201,28 @@ Nová verze Tento plugin byl aktualizován během posledních 7 dní Nová aktualizace je k dispozici + Chyba instalace pluginu + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Stahování pluginu + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Instalace z neznámého zdroje + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Motiv @@ -383,7 +415,7 @@ Vybrat správce souborů Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Správce souborů Jméno profilu Cesta k správci souborů @@ -434,13 +466,14 @@ Stisknutím vlastní klávesové zkratky otevřete nástroj Flow Launcher a automaticky zadejte dotaz. Náhled Klávesová zkratka je nedostupná, zadejte prosím novou zkratku - Neplatná klávesová zkratka pluginu + Hotkey is invalid Aktualizovat Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Vlastní klávesová zkratka pro zadávání dotazů @@ -451,6 +484,7 @@ Pokud před zkratku při zadávání přidáte znak "@", bude odpovíd Zkratka již existuje, zadejte novou zkratku nebo upravte stávající. Zkratka a/nebo její plné znění je prázdné. + Shortcut is invalid Uložit diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml index 567532865..d734b4356 100644 --- a/Flow.Launcher/Languages/da.xaml +++ b/Flow.Launcher/Languages/da.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Search Plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Plugin-butik @@ -191,6 +201,28 @@ New Version This plugin has been updated within the last 7 days New Update is Available + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Tema @@ -383,7 +415,7 @@ Select File Manager Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Filhåndtering Profilnavn Sti til filhåndtering @@ -434,13 +466,14 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. Vis Genvejstast er utilgængelig, vælg venligst en ny genvejstast - Ugyldig plugin genvejstast + Hotkey is invalid Opdater Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Custom Query Shortcut @@ -451,6 +484,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid Gem diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml index 940881129..ca2a1bd0b 100644 --- a/Flow.Launcher/Languages/de.xaml +++ b/Flow.Launcher/Languages/de.xaml @@ -10,11 +10,11 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Der Pfad zur ausführbaren Datei {0} kann nicht festgelegt werden. Bitte versuchen Sie es in den Einstellungen von Flow (scrollen Sie nach unten). Plug-ins können nicht initialisiert werden - Plug-ins: {0} - nicht geladen werden und wird deaktiviert, bitte kontaktieren Sie den Ersteller des Plug-ins für Hilfe + Plug-ins: {0} - können nicht geladen werden und wird deaktiviert, bitte kontaktieren Sie den Ersteller des Plug-ins für Hilfe Hotkey "{0}" konnte nicht registriert werden. Der Hotkey ist möglicherweise von einem anderen Programm in Verwendung. Wechseln Sie zu einem anderen Hotkey oder beenden Sie das andere Programm. @@ -41,7 +41,7 @@ Text Spielmodus Aussetzen der Verwendung von Hotkeys. - Position zurücksetzen + Zurücksetzen der Position Position des Suchfensters zurücksetzen Zum Suchen hier tippen @@ -56,7 +56,7 @@ Fehler bei Einstellungsstart beim Start Flow Launcher ausblenden, wenn Fokus verloren geht Versionsbenachrichtigungen nicht zeigen - Search Window Location + Ort des Suchfensters Letzte Position merken Monitor mit Mauscursor Monitor mit fokussiertem Fenster @@ -65,8 +65,8 @@ Position des Suchfensters auf Monitor Zentriert Oben zentriert - Links oben - Rechts oben + Oben links + Oben rechts Benutzerdefinierte Position Sprache Letzter Abfragestil @@ -106,38 +106,42 @@ Immer Vorschau Vorschau-Panel immer öffnen, wenn Flow aktiviert ist. Drücken Sie {0}, um Vorschau umzuschalten. Schatteneffekt ist nicht erlaubt, während das aktuelle Theme den Unschärfe-Effekt aktiviert hat - Search Delay - Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. - Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. - Default Search Delay Time - Wait time before showing results after typing stops. Higher values wait longer. (ms) - Information for Korean IME user + Suchverzögerung + Fügt eine kurze Verzögerung beim Tippen hinzu, um das Flackern der Benutzeroberfläche und die Ergebnislast zu verringern. Empfohlen, wenn Ihre Tippgeschwindigkeit durchschnittlich ist. + Geben Sie die Wartezeit (in ms) ein, bis die Eingabe als abgeschlossen gilt. Dies kann nur bearbeitet werden, wenn die Suchverzögerung aktiviert ist. + Suchverzögerungszeit per Default + Wartezeit, bevor die Ergebnisse nach Tippstopps angezeigt werden. Bei höheren Werten wird länger gewartet. (ms) + Informationen für koreanischen IME-Benutzer - The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + Die in Windows 11 verwendete koreanische Eingabemethode kann einige Probleme im Flow Launcher verursachen. - If you experience any problems, you may need to enable "Use previous version of Korean IME". + Wenn Sie irgendwelche Probleme haben, müssen Sie unter Umständen "Vorherige Version der koreanischen IME" aktivieren. - Open Setting in Windows 11 and go to: + Öffnen Sie die Einstellung in Windows 11 und gehen Sie zu: - Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + Time & Language > Language & Region > Koreanisch > Sprachoptionen > Tastatur - Microsoft IME > Kompatibilität, - and enable "Use previous version of Microsoft IME". + und aktivieren Sie "Vorherige Version von Microsoft IME". Sprach- und Regionen-Systemeinstellungen öffnen - Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Öffnet den Ort für koreanische IME-Einstellung. Gehen Sie zu Koreanisch > Sprachoptionen > Tastatur - Microsoft IME > Kompatibilität Öffnen Vorherige koreanische IME verwenden - You can change the Previous Korean IME settings directly from here + Sie können die Einstellungen des vorherigen koreanischen IME direkt von hier aus ändern Homepage - Show home page results when query text is empty. - Show History Results in Home Page - Maximum History Results Shown in Home Page - This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Ergebnisse der Homepage zeigen, wenn Abfragetext leer ist. + Historie-Ergebnisse auf Homepage zeigen + Maximal gezeigte Historie-Ergebnisse auf Homepage + Dies kann nur bearbeitet werden, wenn das Plug-in das Home-Feature unterstützt und die Homepage aktiviert ist. + Suchfenster an vorderster zeigen + Setzt die Einstellung 'Immer im Vordergrund' anderer Programme außer Kraft und zeigt Flow in der vordersten Position an. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Plug-in suchen @@ -154,12 +158,12 @@ Aktuelles Action-Schlüsselwort Neues Aktions-Schlüsselwort Aktions-Schlüsselwörter ändern - Plugin search delay time - Change Plugin Search Delay Time + Suchverzögerungszeit für Plug-in + Suchverzögerungszeit für Plug-in ändern Erweiterte Einstellungen Aktiviert Priorität - Search Delay + Suchverzögerung Homepage Aktuelle Priorität Neue Priorität @@ -174,8 +178,14 @@ Deinstallieren Plug-in-Einstellungen können nicht entfernt werden Plug-ins: {0} - Plug-in-Einstellungsdateien können nicht entfernt werden, bitte entfernen Sie diese manuell - Fail to remove plugin cache - Plugins: {0} - Fail to remove plugin cache files, please remove them manually + Plug-in-Cache kann nicht entfernt werden + Plug-ins: {0} - Plug-in-Cache-Dateien können nicht entfernt werden, bitte entfernen Sie diese manuell + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Plug-in-Store @@ -191,6 +201,28 @@ Neue Version Dieses Plug-in ist innerhalb der letzten 7 Tage aktualisiert worden Neues Update ist verfügbar + Fehler bei Installation des Plug-ins + Fehler bei Deinstallation des Plug-ins + Error updating plugin + Plug-in-Einstellungen beibehalten + Möchten Sie die Einstellungen des Plug-ins für die nächste Nutzung beibehalten? + Plug-in {0} erfolgreich installiert. Bitte starten Sie Flow neu. + Plug-in {0} erfolgreich deinstalliert. Bitte starten Sie Flow neu. + Plug-in {0} erfolgreich aktualisiert. Bitte starten Sie Flow neu. + Plugin install + {0} von {1} {2}{2}Möchten Sie dieses Plug-in installieren? + Plugin uninstall + {0} von {1} {2}{2}Möchten Sie dieses Plug-in deinstallieren? + Plugin update + {0} von {1} {2}{2}Möchten Sie dieses Plugin aktualisieren? + Plug-in wird heruntergeladen + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installation aus unbekannter Quelle + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Theme @@ -212,9 +244,9 @@ Schriftart des Ergebnistitels Schriftart des Ergebnis-Untertitels Zurücksetzen - Reset to the recommended font and size settings. - Import Theme Size - If a size value intended by the theme designer is available, it will be retrieved and applied. + Auf die empfohlenen Schriftart- und Größeneinstellungen zurücksetzen. + Theme-Größe importieren + Wenn ein vom Theme-Designer vorgesehener Größenwert verfügbar ist, wird dieser abgerufen und angewendet. Individuell anpassen Fenstermodus Opazität @@ -242,8 +274,8 @@ Uhr Datum Backdrop-Typ - The backdrop effect is not applied in the preview. - Backdrop supported starting from Windows 11 build 22000 and above + Der Backdrop-Effekt wird in der Vorschau nicht angewendet. + Backdrop wird ab Windows 11 Build 22000 und darüber unterstützt Keine Acrylic Mica @@ -251,11 +283,11 @@ Dieses Theme unterstützt zwei Modi (hell/dunkel). Dieses Theme unterstützt Unschärfe und transparenten Hintergrund. Platzhalter zeigen - Display placeholder when query is empty + Platzhalter anzeigen, wenn Abfrage leer ist Platzhaltertext - Change placeholder text. Input empty will use: {0} + Platzhaltertext ändern. Eingabe leer wird verwendet: {0} Festgelegte Fenstergröße - The window size is not adjustable by dragging. + Die Fenstergröße ist durch Ziehen nicht anpassbar. Hotkey @@ -316,8 +348,8 @@ Segoe Fluent-Icons für Abfrageergebnisse verwenden, wo unterstützt Taste drücken Ergebnis-Badges zeigen - For supported plugins, badges are displayed to help distinguish them more easily. - Show Result Badges for Global Query Only + Für unterstützte Plug-ins werden Badges zur besseren Unterscheidung angezeigt. + Ergebnis-Badges nur für globale Abfrage zeigen HTTP-Proxy @@ -360,41 +392,41 @@ Sind Sie sicher, dass Sie alle Logs löschen wollen? Cache-Ordner Cache leeren - Are you sure you want to delete all caches? - Failed to clear part of folders and files. Please see log file for more information + Sind Sie sicher, dass Sie alle Caches löschen wollen? + Ein Teil der Ordner und Dateien konnte nicht gelöscht werden. Weitere Informationen entnehmen Sie bitte der Logdatei Assistent Speicherort für Benutzerdaten Benutzereinstellungen und installierte Plug-ins werden im Ordner für Benutzerdaten gespeichert. Dieser Speicherort kann variieren, je nachdem, ob sich das Programm im portablen Modus befindet oder nicht. Ordner öffnen - Advanced + Erweitert Log-Ebene Debug Info - Setting Window Font + Einstellung der Fensterschriftart - See more release notes on GitHub - Failed to fetch release notes - Please check your network connection or ensure GitHub is accessible - Flow Launcher has been updated to {0} - Click here to view the release notes + Weitere Versionshinweise finden Sie auf GitHub + Versionshinweise konnten nicht abgerufen werden + Bitte überprüfen Sie Ihre Netzwerkverbindung oder stellen Sie sicher, dass GitHub erreichbar ist + Flow Launcher ist aktualisiert worden auf {0} + Klicken Sie hier, um die Versionshinweise anzusehen Dateimanager auswählen Mehr erfahren Bitte geben Sie den Dateiort des von Ihnen verwendeten Dateimanagers an und fügen Sie bei Bedarf Argumente hinzu. Das „%d“ repräsentiert den dafür zu öffnenden Verzeichnispfad, der vom Feld Arg for Folder und für Befehle zum Öffnen bestimmter Verzeichnisse verwendet wird. Das „%f“ repräsentiert den dafür zu öffnenden Dateipfad, der vom Feld Arg for File und für Befehle zum Öffnen bestimmter Dateien verwendet wird. - Zum Beispiel, wenn der Dateimanager einen Befehl wie „totalcmd.exe /A c:\windows“ verwendet, um das Verzeichnis c:\windows zu öffnen, lautet der Dateimanager-Pfad „totalcmd.exe“ und der Arg for Folder „/A %d“. Bestimmte Dateimanager wie QTTabBar kann nur die Angabe eines Pfades erfordern, in diesem Fall verwenden Sie „%d“ als den Dateimanager-Pfad und lassen den Rest der Felder blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Dateimanager Profilname Dateimanager-Pfad Arg For Folder Arg For File - The file manager '{0}' could not be located at '{1}'. Would you like to continue? - File Manager Path Error + Der Dateimanager '{0}' konnte nicht unter '{1}' gefunden werden. Möchten Sie fortfahren? + Pfadfehler bei Dateimanager Webbrowser per Default - Die Defaulteinstellung folgt der Default-Browsereinstellung des Betriebssystems. Wenn separat angegeben, verwendet Flow diesen Browser. + Die Defaulteinstellung folgt der Default-Browsereinstellung des Betriebssystems (OS). Wenn separat spezifiziert, verwendet Flow diesen Browser. Browser Browser-Name Browser-Pfad @@ -412,45 +444,47 @@ Neues Aktions-Schlüsselwort Abbrechen Fertig - Das angegebene Plug-in kann nicht gefunden werden + Das spezifizierte Plug-in kann nicht gefunden werden Neues Aktions-Schlüsselwort darf nicht leer sein Dieses neue Aktions-Schlüsselwort ist bereits einem anderen Plug-in zugewiesen, bitte wählen Sie ein anderes Dieses neue Aktions-Schlüsselwort ist dasselbe wie das alte, bitte wählen Sie ein anderes Erfolg Erfolgreich abgeschlossen - Failed to copy + Kopieren nicht möglich Geben Sie die Aktions-Schlüsselwörter ein, die Sie zum Starten des Plug-ins verwenden möchten, und trennen Sie sie durch Leerzeichen voneinander ab. Verwenden Sie *, wenn Sie keine spezifizieren möchten, und das Plug-in wird ohne jegliche Aktions-Schlüsselwörter ausgelöst. - Search Delay Time Setting - Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + Einstellung der Suchverzögerungszeit + Geben Sie die Suchverzögerungszeit in ms ein, die Sie für das Plug-in verwenden möchten. Eingabe leer, wenn Sie keine Angaben machen wollen, und das Plug-in wird die Default-Suchverzögerungszeit verwenden. Homepage - Enable the plugin home page state if you like to show the plugin results when query is empty. + Aktivieren Sie den Zustand der Plug-in-Homepage, wenn Sie die Plug-in-Ergebnisse anzeigen möchten, wenn Abfrage leer ist. Benutzerdefinierter Abfrage-Hotkey - Drücken Sie einen benutzerdefinierten Hotkey, um Flow Launcher zu öffnen und die angegebene Abfrage automatisch einzugeben. + Drücken Sie einen benutzerdefinierten Hotkey, um Flow Launcher zu öffnen und die spezifizierte Abfrage automatisch einzugeben. Vorschau Hotkey ist nicht verfügbar, bitte wählen Sie einen neuen Hotkey aus - Plug-in-Hotkey ungültig + Hotkey is invalid Aktualisieren Bindung Hotkey Aktueller Hotkey ist nicht verfügbar. Dieser Hotkey ist für "{0}" reserviert und kann nicht verwendet werden. Bitte wählen Sie einen anderen Hotkey. Dieser Hotkey ist bereits in Verwendung von "{0}". Wenn Sie "Überschreiben" drücken, wird dieser aus "{0}" entfernt. Drücken Sie die Tasten, die Sie für diese Funktion verwenden möchten. + Hotkey and action keyword are empty Benutzerdefinierter Abfrage-Shortcut - Geben Sie einen Shortcut ein, der sich automatisch auf die angegebene Abfrage erweitert. + Geben Sie einen Shortcut ein, der sich automatisch auf die spezifizierte Abfrage erweitert. Ein Shortcut wird erweitert, wenn dieser genau mit der Abfrage übereinstimmt. Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt dieser mit jeder beliebigen Position in der Abfrage überein. Integrierte Shortcuts stimmen mit jeder Position in einer Abfrage überein. Shortcut ist bereits vorhanden, bitte geben Sie einen neuen Shortcut ein oder bearbeiten Sie den vorhandenen. Shortcut und/oder dessen Erweiterung ist leer. + Shortcut is invalid Speichern @@ -483,13 +517,13 @@ Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt die 2. Kopieren Sie die Ausnahmemeldung unterhalb - File Manager Error + Fehler bei Dateimanager - The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + Der spezifizierte Dateimanager konnte nicht gefunden werden. Bitte überprüfen Sie die Einstellung des benutzerdefinierten Dateimanagers unter Einstellungen > Allgemein. Fehler - An error occurred while opening the folder. {0} - An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window + Beim Öffnen des Ordners ist ein Fehler aufgetreten. {0} + Beim Öffnen der URL im Browser ist ein Fehler aufgetreten. Bitte überprüfen Sie die Konfiguration Ihres Default-Webbrowsers im Abschnitt „Allgemein“ des Einstellungsfensters Bitte warten Sie ... diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index bd4cbd282..2fca06605 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -12,7 +12,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -105,6 +105,19 @@ Regular Search with Pinyin Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese. + Use Double Pinyin + Allows using Double Pinyin to search. Double Pinyin is a variation of Pinyin that uses two characters. + Double Pinyin Schema + Xiao He + Zi Ran Ma + Wei Ruan + Zhi Neng ABC + Zi Guang Pin Yin + Pin Yin Jia Jia + Xing Kong Jian Dao + Da Niu + Xiao Lang + Always Preview Always open preview panel when Flow activates. Press {0} to toggle preview. Shadow effect is not allowed while current theme has blur effect enabled @@ -133,6 +146,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Search Plugin @@ -171,6 +188,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Plugin Store @@ -186,6 +209,28 @@ New Version This plugin has been updated within the last 7 days New Update is Available + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Theme @@ -378,7 +423,7 @@ Select File Manager Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. File Manager Profile Name File Manager Path @@ -429,13 +474,14 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. Preview Hotkey is unavailable, please select a new hotkey - Invalid plugin hotkey + Hotkey is invalid Update Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Custom Query Shortcut @@ -444,6 +490,7 @@ Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid Save diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml index 40fa76c3d..814cea882 100644 --- a/Flow.Launcher/Languages/es-419.xaml +++ b/Flow.Launcher/Languages/es-419.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Search Plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Tienda de Plugins @@ -191,6 +201,28 @@ New Version This plugin has been updated within the last 7 days New Update is Available + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Tema @@ -383,7 +415,7 @@ Seleccionar Gestor de Archivos Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Gestor de Archivos Nombre de Perfil Ruta del Gestor de Archivos @@ -434,13 +466,14 @@ Presione la tecla de acceso personalizada para insertar automáticamente la consulta especificada. Vista previa Tecla no disponible, por favor seleccione una nueva tecla de acceso directo - Tecla de acceso directo al plugin inválida + Hotkey is invalid Actualizar Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Custom Query Shortcut @@ -451,6 +484,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid Guardar diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml index 1a8b22303..c65773212 100644 --- a/Flow.Launcher/Languages/es.xaml +++ b/Flow.Launcher/Languages/es.xaml @@ -8,7 +8,7 @@ Por favor, seleccione el ejecutable {0} - El ejecutable {0} seleccionado no es válido. + El ejecutable seleccionado {0} no es válido. {2}{2} Pulsar Sí, si desea seleccionar de nuevo el ejecutable {0}. Pulsar No, si desea descargar {1} @@ -136,8 +136,12 @@ Mostrar historial de resultados en la página de inicio Número máximo de resultados del historial en la página de inicio Esto solo se puede editar si el complemento soporta la función de Inicio y la Página de Inicio está activada. - Show Search Window at Topmost - Show search window above other windows + Mostrar ventana de búsqueda en primer plano + Anula el ajuste «Siempre arriba» de otros programas y muestra Flow en primer plano. + Reiniciar después de modificar el complemento a través de la Tienda de complementos + Reiniciar Flow Launcher automáticamente después de instalar/desinstalar/actualizar el complemento a través de la Tienda de complementos + Mostrar advertencia de fuente desconocida + Mostrar advertencia al instalar complementos desde fuentes desconocidas Buscar complemento @@ -176,6 +180,12 @@ Complementos: {0} - Fallo al eliminar los archivos de configuración del complemento, por favor elimínelos manualmente Fallo al eliminar la caché del complemento Complementos: {0} - Fallo al eliminar los archivos de caché del complemento, por favor elimínelos manualmente + {0} ya está modificado + Reiniciar Flow antes de realizar más cambios + No se pudo instalar {0} + No se pudo desinstalar {0} + No se puede encontrar plugin.json en el archivo zip extraído, o esta ruta {0} no existe + Ya existe un complemento con el mismo ID y versión, o la versión es superior a la de este complemento descargado Tienda complementos @@ -191,6 +201,28 @@ Nueva versión Este complemento ha sido actualizado en los últimos 7 días Nueva actualización disponible + Error al instalar el complemento + Error al desinstalar el complemento + Error al actualizar el complemento + Mantener la configuración del complemento + ¿Desea mantener la configuración del complemento para el próximo uso? + Complemento {0} instalado correctamente. Por favor, reinicie Flow. + Complemento {0} desinstalado correctamente. Por favor, reinicie Flow. + Complemento {0} actualizado correctamente. Por favor, reinicie Flow. + Instalar complemento + {0} por {1} {2}{2}¿Desea instalar este complemento? + Desinstalar complemento + {0} por {1} {2}{2}¿Desea desinstalar este complemento? + Actualizar complemento + {0} por {1} {2}{2}¿Desea actualizar este complemento? + Descargando complemento + Reiniciar automáticamente después de instalar/desinstalar/actualizar complementos en la Tienda de complementos + El archivo Zip no tiene una configuración de plugin.json válida + Instalando desde una fuente desconocida + ¡Este complemento es de una fuente desconocida y puede contener riesgos potenciales!{0}{0}Asegúrese de entender de dónde proviene este complemento y que es seguro.{0}{0}¿Desea continuar aún?{0}{0}(Puede desactivar esta advertencia en la sección general de la ventana de configuración) + Archivos Zip + Por favor, seleccione archivo zip + Instalar complemento desde la ruta local Tema @@ -368,7 +400,7 @@ Abrir carpeta Avanzado Nivel de registro - Depurar + Depuración Información Configuración de fuente de la ventana @@ -404,7 +436,7 @@ Cambiar la prioridad - Cuanto mayor sea el número, más arriba se situará el resultado. Inténtelo con 5. Si desea que los resultados se situén más abajo que los de cualquier otro complemento, utilice un número negativo + Cuanto mayor sea el número, más arriba se situará el resultado. Probar con 5. Si se desea que los resultados se sitúen más abajo que los de cualquier otro complemento, utilizar un número negativo ¡Por favor, proporcione un número entero válido para la prioridad! @@ -419,7 +451,7 @@ Correcto Finalizado correctamente No se pudo copiar - Introduzca las palabras clave de acción que desea utilizar para iniciar el complemento y utilice espacios en blanco para separarlas. Utilice * si no desea especificar ninguna, para que el complemento se inicie sin ninguna palabra clave de acción. + Introducir las palabras claves de acción que se desean utilizar para iniciar el complemento, utilizando espacios en blanco para separarlas. Utilizar * si no se desea especificar ninguna, para que el complemento se inicie sin ninguna palabra clave de acción. Ajuste del tiempo de retardo de búsqueda @@ -427,20 +459,21 @@ Página de inicio - Activar el estado de la página de inicio del complemento si se desea mostrar los resultados del complemento cuando la consulta está vacía. + Activar el estado página de inicio del complemento si se desea mostrar los resultados del complemento cuando la consulta esté vacía. Atajo de teclado de consulta personalizada Pulse el atajo de teclado personalizado para abrir Flow Launcher y realizar automáticamente la consulta especificada. Vista previa El atajo de teclado no está disponible, por favor seleccione uno nuevo - Atajo de teclado de complemento no válido + La tecla de acceso rápido no es válida Actualizar Atajo de teclado vinculado El atajo de teclado actual no está disponible. Este atajo de teclado está reservado para "{0}" y no se puede utilizar. Por favor, elija otro atajo de teclado. Este atajo de teclado ya está siendo utilizado por "{0}". Si pulsa «Sobrescribir», se eliminará de "{0}". Pulsar las teclas que se deseen utilizar para esta función. + La tecla de acceso rápido y la palabra clave de acción están vacías Acceso directo de consulta personalizada @@ -451,6 +484,7 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci El acceso directo ya existe, por favor introduzca uno nuevo o edite el existente. El acceso directo y/o su expansión están vacíos. + El acceso directo no es válido Guardar diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml index e70e75a26..52013a7db 100644 --- a/Flow.Launcher/Languages/fr.xaml +++ b/Flow.Launcher/Languages/fr.xaml @@ -8,9 +8,9 @@ Veuillez sélectionner l'exécutable {0} - L'exécutable {0} que vous avez sélectionné est invalide. + L'exécutable {0} que vous avez sélectionné n'est pas valide. {2}{2} - Cliquez sur oui si vous souhaitez sélectionner l'exécutable {0} à nouveau. Cliquez sur non si vous souhaitez télécharger {1}. + Cliquez sur oui si vous souhaitez sélectionner à nouveau l'exécutable {0}. Cliquez sur non si vous souhaitez télécharger {1} Impossible de définir {0} comme chemin d'accès vers l'exécutable. Veuillez essayer à partir des paramètres de Flow (défiler vers le bas). Échec de l'initialisation des plugins @@ -137,7 +137,11 @@ Maximum de résultats de l'historique affichés sur la page d'accueil Ceci ne peut être édité que si le plugin prend en charge la fonction Accueil et que la page d'accueil est activée. Afficher la fenêtre de recherche en premier plan - Afficher la fenêtre de recherche au-dessus des autres fenêtres + Outrepasse le paramètre 'toujours en premier plan' des autres programmes et affiche Flow Launcher en première position. + Redémarrer après modification du plugin via le magasin des plugins + Redémarrez automatiquement Flow Launcher après l'installation / désinstallation / mise à jour du plugin via le magasin des plugins + Afficher l'avertissement de source inconnue + Afficher un avertissement lors de l'installation de plugins à partir de sources inconnues Rechercher des plugins @@ -176,6 +180,12 @@ Plugins : {0} - Échec de la suppression des fichiers de configuration des plugins, veuillez les supprimer manuellement Échec de la suppression du cache du plugin Plugins : {0} - Échec de la suppression des fichiers cache des plugins, veuillez les supprimer manuellement + {0} est déjà modifié + Veuillez redémarrer Flow avant d'apporter d'autres modifications + Échec de l'installation de {0} + Échec de la désinstallation de {0} + Impossible de trouver le fichier plugin.json dans le fichier zip extrait, ou ce chemin {0} n'existe pas + Un plugin avec le même ID et la même version existe déjà, ou la version est supérieure à ce plugin téléchargé Magasin des Plugins @@ -191,6 +201,28 @@ Nouvelle version Cette extension a été mis à jour au cours des 7 derniers jours Une nouvelle mise à jour est disponible + Erreur lors de l'installation du plugin + Erreur lors de la désinstallation du plugin + Erreur de mise à jour du plugin + Garder les paramètres du plugin + Souhaitez-vous conserver les paramètres du plugin pour la prochaine utilisation ? + Plugin {0} installé avec succès. Veuillez redémarrer Flow. + Plugin {0} désinstallé avec succès. Veuillez redémarrer Flow. + Plugin {0} mis à jour avec succès. Veuillez redémarrer Flow. + Installation du plugin + {0} par {1} {2}{2}Voulez-vous installer ce plugin ? + Désinstallation du plugin + {0} par {1} {2}{2}Voulez-vous désinstaller ce plugin ? + Mise à jour du plugin + {0} par {1} {2}{2}Voulez-vous mettre à jour ce plugin ? + Téléchargement du plugin + Redémarrer automatiquement après l'installation / désinstallation / mise à jour des plugins dans le magasin des plugins + Le fichier zip n'a pas de configuration plugin.json valide + Installation depuis une source inconnue + Ce plugin provient d'une source inconnue et il peut contenir des risques !{0}{0}Veuillez vous assurer de comprendre d'où vient ce plugin et qu'il est sûr. {0} {0} Souhaitez-vous continuer ? {0} {0} (vous pouvez désactiver cet avertissement dans la section général des paramètres) + Fichiers zip + Veuillez sélectionner un fichier zip + Installer le plugin depuis le chemin local Thèmes @@ -382,7 +414,7 @@ Sélectionner le gestionnaire de fichiers En savoir plus Veuillez spécifier l'emplacement du fichier de l'explorateur de fichiers que vous utilisez et ajouter des arguments si nécessaire. Le "%d" représente le chemin du répertoire à ouvrir, utilisé par le champ Arg for Folder et pour les commandes ouvrant des répertoires spécifiques. Le "%f" représente le chemin du fichier à ouvrir, utilisé par le champ Arg for File et pour les commandes ouvrant des fichiers spécifiques. - Par exemple, si l'explorateur de fichiers utilise une commande telle que "totalcmd.exe /A c:\windows" pour ouvrir le répertoire c:\windows, le chemin de l'explorateur de fichiers sera totalcmd.exe et l'argument Arg For Folder sera /A "%d"". Certains explorateurs de fichiers comme QTTabBar peuvent simplement nécessiter qu'un chemin soit fourni, dans ce cas, utilisez "%d" comme chemin de l'explorateur de fichiers et laissez le reste des fichiers vides. + Par exemple, si le gestionnaire de fichiers utilise une commande telle que "totalcmd.exe /A c:\windows" pour ouvrir le répertoire c:\windows, le chemin du gestionnaire de fichiers sera totalcmd.exe, et le chemin du dossier sera /A "%d". Certains gestionnaires de fichiers, comme QTTabBar, peuvent se contenter d'un simple chemin d'accès. Dans ce cas, utilisez "%d" comme chemin d'accès au gestionnaire de fichiers et laissez le reste des champs vides. Gestionnaire de fichiers Nom du profil Chemin du gestionnaire de fichiers @@ -433,13 +465,14 @@ Appuyez sur le raccourci personnalisé pour insérer automatiquement la requête spécifiée. Prévisualiser Raccourci indisponible. Veuillez en choisir un autre. - Raccourci invalide + La touche de raccourci n'est pas valide Actualiser Raccourci de liaison Le raccourci clavier actuel n'est pas disponible. Ce raccourci est réservé à "{0}" et ne peut pas être utilisé. Veuillez choisir un autre raccourci clavier. Ce raccourci est déjà utilisé par "{0}". Si vous appuyez sur "Écraser", il sera supprimé de "{0}". Appuyez sur les touches que vous voulez utiliser pour cette fonction. + Les touches de raccourci et les mots-clés d'action sont vides Raccourci de requête personnalisée @@ -450,6 +483,7 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu Le raccourci existe déjà, veuillez entrer un nouveau raccourci ou modifier le raccourci existant. Raccourci et/ou son expansion est vide. + Le raccourci n'est pas valide Sauvegarder diff --git a/Flow.Launcher/Languages/he.xaml b/Flow.Launcher/Languages/he.xaml index 23f4b7541..b72125214 100644 --- a/Flow.Launcher/Languages/he.xaml +++ b/Flow.Launcher/Languages/he.xaml @@ -8,9 +8,9 @@ אנא בחר את קובץ ההפעלה {0} - קובץ ההפעלה {0} שבחרת אינו חוקי. + Your selected {0} executable is invalid. {2}{2} - לחץ על כן אם ברצונך, בחר את {0} ההפעלה הקודמת. לחץ על לא אם ברצונך להוריד את {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} לא ניתן להגדיר נתיב הפעלה {0}, אנא נסה שוב בהגדרות Flow (גלול עד למטה). נכשל בהפעלת תוספים @@ -135,8 +135,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page ניתן לערוך זאת רק אם התוסף תומך בתכונת הבית ודף הבית מופעל. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + עוקף את הגדרת תמיד עליון של תוכנות אחרות, ומציג את Flow במיקום הגבוה ביותר. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources חפש תוסף @@ -175,6 +179,12 @@ תוספים: {0} - נכשל בהסרת קבצי הגדרות התוסף, יש להסירם ידנית נכשל בהסרת מטמון התוסף תוספים: {0} - נכשל בהסרת קובצי מטמון התוסף, אנא הסר אותם ידנית + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin חנות תוספים @@ -190,6 +200,28 @@ גרסה חדשה תוסף זה עודכן במהלך 7 הימים האחרונים עדכון חדש זמין + שגיאה בהתקנת תוסף + שגיאה בהסרת תוסף + Error updating plugin + שמור הגדרות תוסף + האם ברצונך לשמור את הגדרות התוסף לשימוש הבא? + התוסף {0} הותקן בהצלחה. נא הפעל מחדש את Flow. + התוסף {0} הוסר בהצלחה. נא הפעל מחדש את Flow. + התוסף {0} עודכן בהצלחה. נא הפעל מחדש את Flow. + Plugin install + {0} מאת {1} {2}{2}האם ברצונך להתקין תוסף זה? + Plugin uninstall + {0} מאת {1} {2}{2}האם ברצונך להסיר תוסף זה? + Plugin update + {0} מאת {1} {2}{2}האם ברצונך לעדכן תוסף זה? + מוריד תוסף + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + מתקין ממקור לא מוכ + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path ערכת נושא @@ -382,7 +414,7 @@ בחר מנהל קבצים למד עוד אנא ציין את מיקום הקובץ של מנהל הקבצים שבו אתה משתמש והוסף ארגומנטים כנדרש. "%d" מייצג את נתיב התיקייה שיש לפתוח, ומשמש בשדה ארגומנט לתיקייה ובפקודות לפתיחת תיקיות מסוימות. "%f" מייצג את נתיב הקובץ שיש לפתוח, ומשמש בשדה ארגומנט לקובץ ובפקודות לפתיחת קבצים מסוימים. - לדוגמה, אם מנהל הקבצים משתמש בפקודה כגון "totalcmd.exe /A c:\windows" כדי לפתוח את התיקייה c:\windows, נתיב מנהל הקבצים יהיה totalcmd.exe, והארגומנט לתיקייה יהיה /A "%d". מנהלי קבצים מסוימים, כגון QTTabBar, עשויים לדרוש רק ציון נתיב, במקרה כזה השתמש ב-"%d" כנתיב מנהל הקבצים והשאר את שאר השדות ריקים. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. מנהל קבצים שם פרופיל נתיב מנהל קבצים @@ -433,13 +465,14 @@ הקש על מקש קיצור מותאם אישית כדי לפתוח את Flow Launcher ולהזין את השאילתה שצוינה באופן אוטומטי. תצוגה מקדימה מקש הקיצור אינו זמין, אנא בחר מקש קיצור חדש - מקש קיצור לא חוקי לתוסף + Hotkey is invalid עדכון שיוך מקש קיצור מקש הקיצור הנוכחי אינו זמין. מקש קיצור זה שמור עבור "{0}" ואינו ניתן לשימוש. אנא בחר מקש קיצור אחר. מקש קיצור זה כבר נמצא בשימוש על ידי "{0}". אם תלחץ על "החלף", הוא יוסר מ-"{0}". הקש על המקשים שברצונך להשתמש בהם עבור פעולה זו. + Hotkey and action keyword are empty קיצור דרך לשאילתה מותאמת אישית @@ -450,6 +483,7 @@ קיצור דרך כבר קיים, אנא הזן קיצור דרך חדש או ערוך את הקיים. קיצור הדרך ו/או ההרחבה שלו ריקים. + Shortcut is invalid שמור diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml index f41d960f1..83867d00e 100644 --- a/Flow.Launcher/Languages/it.xaml +++ b/Flow.Launcher/Languages/it.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Plugin di ricerca @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Negozio dei Plugin @@ -191,6 +201,28 @@ Nuova versione Questo plugin è stato aggiornato negli ultimi 7 giorni Nuovo aggiornamento disponibile + Errore durante l'installazione del plugin + Errore durante la disinstallazione del plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Il plugin {0} installato con successo. Riavviare Flow. + Il plugin {0} disinstallato con successo. Riavviare Flow. + Il plugin {0} aggiornato con successo. Riavviare Flow. + Plugin install + {0} di {1} {2}{2}Vuoi installare questo plugin? + Plugin uninstall + {0} di {1} {2}{2}Vuoi disinstallare questo plugin? + Plugin update + {0} di {1} {2}{2}Vuoi aggiornare questo plugin? + Download del plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installazione da una fonte sconosciuta + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Tema @@ -383,7 +415,7 @@ Seleziona Gestore File Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Gestore File Nome Profilo Percorso Gestore File @@ -434,13 +466,14 @@ Premere un tasto di scelta rapida personalizzato per aprire Flow Launcher e inserire automaticamente la query specificata. Anteprima Tasto di scelta rapida non disponibile, per favore scegli un nuovo tasto di scelta rapida - Tasto di scelta rapida plugin non valido + Hotkey is invalid Aggiorna Registrare Scorciatoie Scorciatoia corrente non disponibile. Questa scorciatoia è riservata per "{0}" e non può essere utilizzata. Si prega di scegliere un'altra scorciatoia. Questa scorciatoia è già in uso da "{0}". Premendo "Sovrascrivi", verrà rimossa da "{0}". Premi i tasti che vuoi usare per questa funzione. + Hotkey and action keyword are empty Scorciatoia per ricerca personalizzata @@ -451,6 +484,7 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde La scorciatoia esiste già, inserisci una nuova scorciatoia o modifica quella esistente. La scorciatoia e/o la sua espansione sono vuote. + Shortcut is invalid Salva diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml index 6c1b364f3..22451ed27 100644 --- a/Flow.Launcher/Languages/ja.xaml +++ b/Flow.Launcher/Languages/ja.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -93,7 +93,7 @@ 自動更新 選択 起動時にFlow Launcherを隠す - Flow Launcher search window is hidden in the tray after starting up. + 起動後、Flow Launcher の検索ウィンドウは非表示になり、トレイに格納されます。 トレイアイコンを隠す トレイアイコンが非表示になっているときは、検索ウィンドウを右クリックすることで設定メニューを開くことができます。 クエリ検索精度 @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Search Plugin @@ -176,11 +180,17 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin プラグインストア New Release - Recently Updated + 最近の更新 プラグイン Installed 更新 @@ -191,6 +201,28 @@ New Version This plugin has been updated within the last 7 days 新しいアップデートが利用可能です + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path テーマ @@ -262,8 +294,8 @@ ホットキー Flow Launcherを開く Flow Launcher の表示/非表示を切り替えるショートカットを入力してください。 - Toggle Preview - Enter shortcut to show/hide preview in search window. + プレビューの切り替え + 検索ウィンドウでプレビューの表示/非表示を切り替えるショートカットを入力してください。 Hotkey Presets List of currently registered hotkeys 結果修飾子を開く @@ -272,8 +304,8 @@ Show result selection hotkey with results. 自動補完 選択された項目に対して自動補完を実行します。 - Select Next Item - Select Previous Item + 次の項目を選択 + 前の項目を選択 Next Page Previous Page Cycle Previous Query @@ -291,13 +323,13 @@ Quick Adjust Window Width Quick Adjust Window Height Use when require plugins to reload and update their existing data. - You can add one more hotkey for this function. + この機能のホットキーはもう一つ追加できます。 カスタムクエリ ホットキー Custom Query Shortcut - Built-in Shortcut + 組み込みショートカット Query - Shortcut - Expansion + ショートカット + 展開 説明 削除 編集 @@ -305,9 +337,9 @@ None 項目選択してください {0} プラグインのホットキーを本当に削除しますか? - Are you sure you want to delete shortcut: {0} with expansion {1}? + 本当にこのショートカットを削除しますか?: {0} を {1} に展開 Get text from clipboard. - Get path from active explorer. + アクティブなエクスプローラーからパスを取得します。 Query window shadow effect Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited. Window Width Size @@ -363,8 +395,8 @@ Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information Wizard - User Data Location - User settings and installed plugins are saved in the user data folder. This location may vary depending on whether it's in portable mode or not. + ユーザーデータの場所 + ユーザー設定とインストールされているプラグインは、ユーザーデータフォルダに保存されます。この場所は、ポータブルモードかどうかによって異なる場合があります。 Open Folder Advanced Log Level @@ -383,7 +415,7 @@ デフォルトのファイルマネージャー Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. File Manager Profile Name File Manager Path @@ -434,23 +466,25 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. プレビュー ホットキーは使用できません。新しいホットキーを選択してください - プラグインホットキーは無効です + Hotkey is invalid 更新 Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty - Custom Query Shortcut - Enter a shortcut that automatically expands to the specified query. - A shortcut is expanded when it exactly matches the query. + カスタムクエリショートカット + 指定したクエリに自動的に展開するショートカットを入力してください。 + クエリに正確に一致すると、ショートカットが展開されます。 -If you add an '@' prefix while inputting a shortcut, it matches any position in the query. Builtin shortcuts match any position in a query. +ショートカットの入力で「@」プレフィクスをつけた場合、クエリのどこにあってもマッチするようになります。組み込みのショートカットはクエリのどこにあってもマッチします。 - Shortcut already exists, please enter a new Shortcut or edit the existing one. - Shortcut and/or its expansion is empty. + ショートカットが既に存在します。新しいショートカットを入力するか、既存のショートカットを編集してください。 + ショートカット、展開の少なくとも一方が空です。 + Shortcut is invalid 保存 diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml index 1b1eaf4fa..b0c13d2e6 100644 --- a/Flow.Launcher/Languages/ko.xaml +++ b/Flow.Launcher/Languages/ko.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -127,8 +127,12 @@ 히스토리를 홈페이지에 표시 홈페이지에 표시할 최대 히스토리 수 This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources 플러그인 검색 @@ -167,6 +171,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin 플러그인 스토어 @@ -182,6 +192,28 @@ 새 버전 이 플러그인은 최근 7일 사이 업데이트 되었습니다 새 업데이트 설치 가능 + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + 플러그인 다운로드 중 + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path 테마 @@ -374,7 +406,7 @@ 파일관리자 선택 더 알아보기 사용 중인 파일 관리자의 파일 위치를 지정하고, 필요한 경우 인수를 추가하세요. "%d"는 열고자 하는 디렉터리 경로를 나타내며, 폴더용 인수 필드 및 특정 디렉터리를 여는 명령어에서 사용됩니다. "%f"는 열고자 하는 파일 경로를 나타내며, 파일용 인수 필드 및 특정 파일을 여는 명령어에서 사용됩니다. - 예를 들어, 파일 관리자가 totalcmd.exe /A c:\windows와 같은 명령어로 c:\windows 디렉터리를 연다면, 파일 관리자 경로는 totalcmd.exe가 되고, 폴더용 인수는 /A "%d"가 됩니다. QTTabBar와 같은 일부 파일 관리자는 경로만 전달하면 되는 경우가 있으므로, 이 경우에는 파일 관리자 경로에 "%d"를 입력하고 나머지 필드는 비워두세요. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. 파일관리자 프로필 이름 파일관리자 경로 @@ -425,13 +457,14 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. 미리보기 단축키를 사용할 수 없습니다. 다른 단축키를 입력하세요. - 플러그인 단축키가 유효하지 않습니다. + Hotkey is invalid 업데이트 Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". 이 기능에 사용할 키를 눌러주세요. + Hotkey and action keyword are empty 사용자 지정 쿼리 단축어 @@ -442,6 +475,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid 저장 diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml index 07dc84c36..c3879e203 100644 --- a/Flow.Launcher/Languages/nb.xaml +++ b/Flow.Launcher/Languages/nb.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Kan ikke angi {0} kjørbar bane, prøv fra Flows innstillinger (bla ned til bunnen). Mislykkes i å initialisere programtillegg @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Søk etter programtillegg @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Programtillegg butikk @@ -191,6 +201,28 @@ Ny versjon Dette programtillegget er oppdatert i løpet av de siste 7 dagene Ny oppdatering er tilgjengelig + Feil ved installering av programtillegg + Feil ved avinstallering av programtillegg + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Programtillegg {0} installert. Vennligst start Flow på nytt. + Programtillegg {0} avinstallert. Vennligst start Flow på nytt. + Programtillegg {0} oppdatert. Vennligst restart Flow. + Plugin install + {0} av {1} {2}{2}Vil du installere dette programtillegget? + Plugin uninstall + {0} av {1} {2}{2}Vil du avinstallere dette programtillegget? + Plugin update + {0} av {1} {2}{2}Vil du oppdatere dette programtillegget? + Laster ned programtillegg + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installerer fra en ukjent kilde + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Drakt @@ -383,7 +415,7 @@ Velg filbehandler Learn more Vennligst spesifiser filplasseringen til filbehandleren du bruker, og legg til argumenter etter behov. "%d" representerer katalogbanen som skal åpnes for, brukt av Arg for mappe-feltet og for kommandoer som åpner spesifikke kataloger. "%f" representerer filbanen som skal åpnes for, brukt av Arg for fil-feltet og for kommandoer som åpner spesifikke filer. - For eksempel, hvis filbehandleren bruker en kommando som "totalcmd.exe /A c:windows" for å åpne c:windows-katalogen, vil filbehandlingsbanen bli totalcmd.exe, og Arg For Folder vil være /A "%d". Enkelte filbehandlere som QTTabBar kan bare kreve at en bane oppgis, i dette tilfellet bruker du "%d" som filbehandlingsbane og lar resten av feltene stå tomme. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Filbehandler Profilnavn Filbehandler sti @@ -434,13 +466,14 @@ Trykk på en egendefinert hurtigtast for å åpne Flow Launcher og skrive inn den angitte spørringen automatisk. Forhåndsvis Hurtigtast er utilgjengelig, vennligst velg en ny hurtigtast - Ugyldig hurtigtast for programtillegg + Hotkey is invalid Oppdater Binding av hurtigtast Nåværende hurtigtast er utilgjengelig. Denne hurtigtasten er reservert for "{0}" og kan ikke brukes. Velg en annen hurtigtast. Denne hurtigtasten er allerede i bruk av "{0}". Hvis du trykker "Overskriv" vil den bli fjernet fra "{0}". Trykk på tastene du vil bruke for denne funksjonen. + Hotkey and action keyword are empty Snarvei for egendefinert spørring @@ -451,6 +484,7 @@ Hvis du legger til et @-prefiks mens du legger inn en snarvei, samsvarer det med Snarveien eksisterer allerede, skriv inn en ny snarvei eller rediger den eksisterende. Snarvei og/eller utvidelsen er tom. + Shortcut is invalid Lagre diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml index c74c95010..96a7e43dd 100644 --- a/Flow.Launcher/Languages/nl.xaml +++ b/Flow.Launcher/Languages/nl.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Plug-ins zoeken @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Plugin Winkel @@ -191,6 +201,28 @@ Nieuwe Versie Deze plug-in is in de laatste 7 dagen bijgewerkt Nieuwe update beschikbaar + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Thema @@ -383,7 +415,7 @@ Bestandsbeheerder selecteren Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Bestandsbeheerder Profielnaam Bestandsbeheerder pad @@ -434,13 +466,14 @@ Druk op een aangepaste sneltoets om Flow Launcher te openen en de opgegeven query automatisch in te voeren. Voorbeeld Sneltoets is niet beschikbaar, selecteer een nieuwe sneltoets - Ongeldige plugin sneltoets + Hotkey is invalid Bijwerken Sneltoets koppelen Huidige sneltoets is niet beschikbaar. Deze sneltoets is gereserveerd voor "{0}" en kan niet worden gebruikt. Kies een andere sneltoets. Deze sneltoets is al in gebruik door "{0}". Als u op "Overschrijven" klikt, zal deze verwijderd worden uit "{0}". Druk op de toetsen die u wilt gebruiken voor deze functie. + Hotkey and action keyword are empty Aangepaste Query Snelkoppeling @@ -451,6 +484,7 @@ Als u een '@' voorvoegsel toevoegt tijdens het invoeren van een snelkoppeling, m Snelkoppeling bestaat al, vul een nieuwe snelkoppeling in of pas de bestaande aan. Snelkoppeling en/of uitbreiding is leeg. + Shortcut is invalid Opslaan diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml index e9ac041f8..ff3c548ad 100644 --- a/Flow.Launcher/Languages/pl.xaml +++ b/Flow.Launcher/Languages/pl.xaml @@ -8,9 +8,9 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Wybierz plik wykonywalny {0} - Wybrany plik wykonywalny {0} jest nieprawidłowy. + Your selected {0} executable is invalid. {2}{2} - Kliknij Tak, jeśli chcesz ponownie wybrać plik wykonywalny {0}. Kliknij Nie, jeśli chcesz pobrać {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Nie można ustawić ścieżki do pliku wykonywalnego {0}. Spróbuj ponownie w ustawieniach Flow (przewiń na sam dół). Nie udało się zainicjować wtyczek @@ -24,8 +24,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Niepoprawny format pliku wtyczki Ustaw jako najwyższy wynik dla tego zapytania Usuń ten najwyższy wynik dla tego zapytania - Wyszukaj: {0} - Ostatni czas wykonywania: {0} + Wykonaj zapytanie: {0} + Czas ostatniego wykonania: {0} Otwórz Ustawienia O programie @@ -59,7 +59,7 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Pozycja okna wyszukiwania Zapamiętaj Ostatnią Pozycję Monitoruj kursorem myszy - Monitor z Dostosowanym Oknem + Monitor z aktywnym oknem Monitor główny Monitor Niestandardowy Pozycja okna wyszukiwania na monitorze @@ -111,33 +111,36 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Wprowadź czas oczekiwania (w ms), po którym wprowadzanie zostanie uznane za zakończone. Edycja jest możliwa tylko, gdy włączone jest Opóźnienie wyszukiwania. Domyślne opóźnienie wyszukiwania Opóźnienie (ms) przed pokazaniem wyników po zakończeniu pisania. Wyższe wartości oznaczają dłuższe oczekiwanie. - Information for Korean IME user + Informacje dla koreańskich użytkowników IME - The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + Metoda wprowadzania koreańskiego używana w Windows 11 może powodować pewne problemy w Flow Launcher. - If you experience any problems, you may need to enable "Use previous version of Korean IME". + Jeśli napotkasz jakiekolwiek problemy, może być konieczne włączenie opcji „Użyj poprzedniej wersji koreańskiego IME”. + Otwórz Ustawienia w Windows 11 i przejdź do: - Open Setting in Windows 11 and go to: + Czas i język > Język i region > Koreański > Opcje języka > Klawiatura – Microsoft IME > Zgodność, - Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, - - and enable "Use previous version of Microsoft IME". + a następnie włącz opcję „Użyj poprzedniej wersji Microsoft IME”. - Open Language and Region System Settings - Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Otwórz ustawienia systemowe języka i regionu + Otwiera lokalizację ustawień koreańskiego edytora IME. Przejdź do: Język koreański > Opcje języka > Klawiatura – Microsoft IME > Zgodność. Otwórz - Use Previous Korean IME - You can change the Previous Korean IME settings directly from here - Home Page - Show home page results when query text is empty. - Show History Results in Home Page - Maximum History Results Shown in Home Page - This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Użyj poprzedniego koreańskiego IME + Możesz bezpośrednio zmienić ustawienia poprzedniego koreańskiego IME tutaj + Strona główna + Wyświetl wyniki strony głównej, gdy pole wyszukiwania jest puste. + Pokaż wyniki historii na stronie głównej + Maksymalna liczba wyników historii wyświetlanych na stronie głównej + Można edytować tylko wtedy, gdy wtyczka obsługuje funkcję Strona główna i jest ona włączona. + Wyświetl okno wyszukiwania na wierzchu + Wyświetl okno wyszukiwania ponad innymi oknami + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Szukaj wtyczek @@ -160,7 +163,7 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Aktywny Priorytet Opóźnienie wyszukiwania - Home Page + Strona główna Obecny Priorytet Nowy Priorytet Priorytet @@ -176,6 +179,12 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Wtyczki: {0} – nie udało się usunąć plików ustawień wtyczek, usuń je ręcznie Nie udało się usunąć cache wtyczki Wtyczki: {0} - Nie udało się usunąć plików cache wtyczki, usuń je ręcznie + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Sklep z wtyczkami @@ -184,23 +193,45 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Wtyczki Zainstalowany Odśwież - Instalacja - Odinstalowywanie + Zainstaluj + Odinstaluj Aktualizuj - Plugin już jest zainstalowany + Ta wtyczka jest już zainstalowana Nowa wersja Ta wtyczka została zaktualizowana w ciągu ostatnich 7 dni - Dostępna jest nowa aktualizacja + Aktualizacja jest dostępna + Błąd podczas instalacji wtyczki + Błąd podczas odinstalowywania wtyczki + Error updating plugin + Zachowaj ustawienia wtyczki + Czy chcesz zachować ustawienia wtyczki do następnego użycia? + Wtyczka {0} została pomyślnie zainstalowana. Proszę ponownie uruchomić Flow. + Wtyczka {0} została pomyślnie odinstalowana. Proszę ponownie uruchomić Flow. + Wtyczka {0} została pomyślnie zaktualizowana. Proszę ponownie uruchomić Flow. + Plugin install + {0} autorstwa {1} {2}{2}Czy chcesz zainstalować tę wtyczkę? + Plugin uninstall + {0} autorstwa {1} {2}{2}Czy chcesz odinstalować tę wtyczkę? + Plugin update + {0} autorstwa {1} {2}{2}Czy chcesz zaktualizować tę wtyczkę? + Pobieranie wtyczki + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Instalowanie z nieznanego źródła + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path - Skórka + Motyw Wygląd - Znajdź więcej skórek + Znajdź więcej motywów Jak utworzyć motyw Cześć, Explorer Wyszukiwanie plików, folderów i zawartości plików - Wyszukiwarka internetowa + Szukaj w sieci Wyszukiwanie w Internecie z obsługą różnych wyszukiwarek Programy Uruchamiaj programy jako administrator lub inny użytkownik @@ -223,7 +254,7 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Folder motywów Otwórz folder motywów Schemat kolorów - Domyślne ustawienie systemowe + Domyślny systemowy Jasny Ciemny Efekty dźwiękowe @@ -241,10 +272,10 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Niestandardowa Zegar Data - Typ tła + Efekt tła Efekt tła nie jest stosowany w podglądzie. Efekt tła obsługiwany od Windows 11 kompilacja 22000 i nowszych - Brak + Żaden Akryl Mika Mica Alt @@ -358,7 +389,7 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Folder dziennika Wyczyść logi Czy na pewno chcesz usunąć wszystkie logi? - Cache Folder + Folder pamięci podręcznej Wyczyść pamięć podręczną Czy na pewno chcesz usunąć wszystkie pamięci podręczne? Nie udało się wyczyścić części folderów i plików. Więcej informacji w pliku dziennika @@ -366,31 +397,31 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Lokalizacja danych użytkownika Ustawienia użytkownika i zainstalowane wtyczki są zapisywane w folderze danych użytkownika. Ta lokalizacja może się różnić w zależności od tego, czy aplikacja jest w trybie przenośnym, czy nie. Otwórz folder - Advanced + Zaawansowane Poziom logowania Debug Info Ustawienia czcionki okna - See more release notes on GitHub - Failed to fetch release notes - Please check your network connection or ensure GitHub is accessible - Flow Launcher has been updated to {0} - Click here to view the release notes + Zobacz więcej informacji o wydaniach na GitHub + Nie udało się pobrać informacji o wydaniach + Sprawdź swoje połączenie z siecią lub upewnij się, że GitHub jest dostępny + Flow Launcher został zaktualizowany do wersji {0} + Kliknij tutaj, aby zobaczyć informacje o wydaniu Wybierz menedżer plików - Learn more + Więcej informacji Proszę określić lokalizację pliku menedżera plików, którego używasz i dodać argumenty według potrzeb. Symbol "%d" reprezentuje ścieżkę katalogu do otwarcia, używaną w polu Arg dla Folderu oraz dla poleceń otwierających konkretne katalogi. Symbol "%f" reprezentuje ścieżkę pliku do otwarcia, używaną w polu Arg dla Pliku oraz dla poleceń otwierających konkretne pliki. - Na przykład, jeśli menedżer plików używa polecenia takiego jak „totalcmd.exe /A c:\windows" do otwarcia katalogu c:\windows, Ścieżka Menedżera Plików będzie totalcmd.exe, a Argument dla Folderu będzie /A "%d". Niektóre menedżery plików, takie jak QTTabBar, mogą wymagać jedynie podania ścieżki; w takim przypadku użyj "%d" jako Ścieżki Menedżera Plików, a pozostałe pola pozostaw puste. - Menadżer plików + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. + Menedżer plików Nazwa profilu Ścieżka menedżera plików Arg dla folderu Arg dla pliku - The file manager '{0}' could not be located at '{1}'. Would you like to continue? - File Manager Path Error + Menedżer plików „{0}” nie został znaleziony w lokalizacji „{1}”. Czy chcesz kontynuować? + Błąd ścieżki do menedżera plików Domyślna przeglądarka @@ -418,7 +449,7 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Nowe słowo kluczowe akcji jest takie samo jak poprzednie. Wybierz inne Sukces Zakończono pomyślnie - Failed to copy + Nie udało się skopiować Wpisz słowa kluczowe uruchamiające wtyczkę (oddzielone spacją). Wpisz *, aby uruchamiać wtyczkę bez słów kluczowych. @@ -426,21 +457,22 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Podaj czas opóźnienia wyszukiwania (w ms) dla wtyczki. Pozostaw puste, aby użyć wartości domyślnej. - Home Page - Enable the plugin home page state if you like to show the plugin results when query is empty. + Strona główna + Włącz stan strony głównej wtyczki, jeśli chcesz wyświetlać wyniki wtyczki, gdy pole wyszukiwania jest puste. Skrót klawiszowy niestandardowych zapyta Naciśnij niestandardowy klawisz skrótu, aby otworzyć Flow Launcher i automatycznie wprowadzić określone zapytanie. Podgląd Skrót klawiszowy jest niedostępny, musisz podać inny skrót klawiszowy - Niepoprawny skrót klawiszowy + Hotkey is invalid Aktualizuj Przypisywanie skrótów Bieżący skrót klawiszowy jest niedostępny. Ten skrót klawiszowy jest zarezerwowany dla "{0}" i nie może być użyty. Proszę wybrać inny skrót. Ten skrót klawiszowy jest już używany przez "{0}". Jeśli naciśniesz "Nadpisz", zostanie on usunięty z "{0}". Naciśnij klawisze, których chcesz użyć dla tej funkcji. + Hotkey and action keyword are empty Niestandardowy skrót zapytania @@ -451,6 +483,7 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d Skrót już istnieje, wprowadź nowy skrót lub edytuj istniejący. Skrót i/lub jego rozwinięcie jest puste. + Shortcut is invalid Zapisz @@ -483,13 +516,13 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d 2. Skopiuj poniższą wiadomość wyjątku - File Manager Error + Błąd menedżera plików - The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + Nie można znaleźć określonego menedżera plików. Sprawdź ustawienie Niestandardowy menedżer plików w Ustawienia > Ogólne. Błąd - An error occurred while opening the folder. {0} - An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window + Wystąpił błąd podczas otwierania folderu. {0} + Wystąpił błąd podczas otwierania adresu URL w przeglądarce. Sprawdź konfigurację domyślnej przeglądarki internetowej w sekcji Ogólne okna ustawień Proszę czekać... diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml index 3e83c1924..fcdb14590 100644 --- a/Flow.Launcher/Languages/pt-br.xaml +++ b/Flow.Launcher/Languages/pt-br.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Buscar Plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Loja de Plugins @@ -191,6 +201,28 @@ Nova Versão Este plugin foi atualizado nos últimos 7 dias Nova Atualização Disponível + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Tema @@ -383,7 +415,7 @@ Selecione o Gerenciador de Arquivos Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Gerenciador de Arquivos Nome do Perfil Caminho do Gerenciador de Arquivos @@ -434,13 +466,14 @@ Aperte uma tecla de atalho personalizada para abrir o Flow Launcher e insira a pesquisa especificada automaticamente. Prévia Atalho indisponível, escolha outro - Atalho de plugin inválido + Hotkey is invalid Atualizar Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Atalho Personalidado de Pesquisa @@ -451,6 +484,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in O atalho já existe, por favor, digite um novo atalho ou edite o existente. Atalho e/ou sua expansão está vazia. + Shortcut is invalid Salvar diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml index 1bb97f764..5d64d429f 100644 --- a/Flow.Launcher/Languages/pt-pt.xaml +++ b/Flow.Launcher/Languages/pt-pt.xaml @@ -8,9 +8,9 @@ Por favor, selecione o executável {0} - O executável {0} é inválido. + Your selected {0} executable is invalid. {2}{2} - Clique Sim se quiser escolher o novo executável {0}. Clique Não se quiser descarregar {1}. + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Não foi possível definir o caminho do executável {0}. Experimente definir o caminho nas definições (desloque até ao fundo). Falha ao iniciar os plugins @@ -135,8 +135,12 @@ Mostrar histórico na página inicial Máximo de resultados a mostrar na Página inicial Esta opção apenas pode ser editada se o plugin tiver suporte a Página inicial e se estiver ativo. - Janela de pesquisa por cima - Mostrar caixa de pesquisa por cima das outras janelas + Janela de pesquisa à frente + Sobrepõe a definição 'Sempre na frente' das outras aplicações e mostra Flow Launcher à frente de qualquer janela. + Reiniciar após modificar o plugin via Loja de plugins + Reiniciar Flow Launcher após instalar/desinstalar/atualizar um plugin via Loja de plugins + Mostrar aviso de origem desconhecida + Mostrar aviso ao instalar plugins de origens desconhecidas Pesquisar plugins @@ -175,6 +179,12 @@ Plugin: {0} - Falha ao remover o ficheiro de definições do plugin. Experimente remover manualmente. Falha ao limpar a cache do plugin Plugin: {0} - Falha ao remover os ficheiros em cache do plugin. Experimente remover manualmente. + {0} já modificado + Reinicie Flow Launcher antes de fazer mais alterações + Falha ao instalar {0} + Falha ao desinstalar {0} + Não foi possível encontrar plugin.json no ficheiro zip ou, então, o caminho {0} não existe. + Já existe um plugin com a mesma ID e versão ou, então, a versão instalada é superior à do plugin descarregado. Loja de plugins @@ -190,6 +200,28 @@ Nova versão Este plugin foi atualizado nos últimos 7 dias Atualização disponível + Erro ao instalar o plugin + Erro ao desinstalar o plugin + Erro ao atualizar o plugin + Manter definições + Deseja manter as definições do plugin para o caso de o voltar a instalar? + Plugin {0} instalado com sucesso. Por favor, reinicie o Flow Launcher. + Plugin {0} desinstalado com sucesso. Por favor, reinicie o Flow Launcher. + Plugin {0} atualizado com sucesso. Por favor, reinicie o Flow Launcher. + Instalador de plugins + {0} de {1} {2}{2}Gostaria de instalar este plugin? + Desinstalador de plugins + {0} de {1} {2}{2}Gostaria de desinstalar este plugin? + Atualização de plugins + {0} de {1} {2}{2}Gostaria de atualizar este plugin? + Descarregar plugin + Reiniciar automaticamente após instalar/desinstalar/atualizar plugins via Loja de plugins + O ficheiro zip não possui uma configuração "plugin.json" válida + Instalar a partir de fontes desconhecidas + Este plugin provém de uma origem desconhecida e pode apresentar riscos!{0}{0}Certifique-se de que a origem é fiável e que o plugin é seguro.{0}{0}Deseja, ainda assim, continuar?{0}{0}Pode desativar este aviso na secção Geral das definições. + Ficheiros Zip + Selecione o ficheiro Zip + Instalar plugin de um caminho local Tema @@ -381,7 +413,7 @@ Selecione o gestor de ficheiros Saber mais Por favor, especifique a localização do executável do seu gestor de ficheiros e adicione os argumentos necessários. "%d" representa o caminho do diretório a abrir, usado pelo argumento do campo Pasta e para comandos que abrem diretórios específicos. "%f" representa o caminho do ficheiro a abrir, usado pelo argumento do campo Ficheiro e para comandos que abrem ficheiros específicos. - Por exemplo, se o gestor de ficheiros utilizar o comando "totalcmd.exe /A c:\windows" para abrir o diretório c:\windows , o caminho para o gestor de ficheiros será totalcmd. exe e os argumentos para a Pasta serão /A "%d". Alguns gestores de ficheiros, como QTTabBar podem apenas exigir que especifique o caminho. Para estes, deve utilizar "%d" como caminho para o gestor de ficheiros e deixar o resto dos campos em branco. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Gestor de ficheiros Nome do perfil Caminho do gestor de ficheiros @@ -432,13 +464,14 @@ Prima uma tecla de atalho personalizada para abrir Flow Launcher e escrever automaticamente a pesquisa. Antevisão Tecla de atalho indisponível, por favor escolha outra - Tecla de atalho inválida + Hotkey is invalid Atualizar Associar tecla de atalho A tecla de atalho atual não está disponível. Esta tecla de atalho está reservada para "{0}" e não pode ser usada. Por favor, escolha outra. Esta tecla de atalho está a ser utilizada por "{0}". Se escolher "Substituir", será removida de "{0}". Prima as teclas que pretende utilizar para esta função. + Hotkey and action keyword are empty Atalho de consulta personalizada @@ -449,6 +482,7 @@ Se adicionar o prefixo '@' durante a introdução do atalho, será utilizada qua Este atallho já existe. Por favor escolha outro ou edite o existente. O atalho e/ou a expansão não estão preenchidos. + Shortcut is invalid Guardar diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml index d52afae1f..aa4505580 100644 --- a/Flow.Launcher/Languages/ru.xaml +++ b/Flow.Launcher/Languages/ru.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Поиск плагина @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Магазин плагинов @@ -191,6 +201,28 @@ Новая версия Этот плагин был обновлён за последние 7 дней Доступно новое обновление + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Тема @@ -383,7 +415,7 @@ Выбор менеджера файлов Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Файловый менеджер Имя профиля Путь к файловому менеджеру @@ -434,13 +466,14 @@ Нажмите свою горячую клавишу, чтобы открыть Flow Launcher и автоматически ввести заданный запрос. Предпросмотр Горячая клавиша недоступна. Пожалуйста, задайте новую - Недействительная горячая клавиша плагина + Hotkey is invalid Обновить Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Ярлык пользовательского запроса @@ -451,6 +484,7 @@ Ярлык уже существует, пожалуйста, введите новый ярлык или измените существующий. Ярлык и/или его расширение пусты. + Shortcut is invalid Сохранить diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml index 7aa6ecc65..f7a2ce05a 100644 --- a/Flow.Launcher/Languages/sk.xaml +++ b/Flow.Launcher/Languages/sk.xaml @@ -136,8 +136,12 @@ Zobraziť výsledky histórie na Domovskej stránke Maximálny počet zobrazených výsledkov histórie na Domovskej stránke Úprava je možná len vtedy, ak plugin podporuje funkciu Domovská stránka a Domovská stránka je povolená. - Zobraziť vyhľadávacie okno navrchu - Zobraziť okno vyhľadávania nad ostatnými oknami + Zobraziť vyhľadávacie okno v popredí + Prepíše nastavenie "Vždy na vrchu" ostatných programov a zobrazí navrchu Flow. + Reštartovať po úprave pluginu cez Repozitár pluginov + Automaticky reštartovať Flow Launcher po inštalácii/odinštalácii/aktualizáciu pluginu cez Repozitár pluginov + Zobraziť upozornenie na neznámy zdroj + Zobraziť upozornenie pri inštalácii z neznámych zdrojov Vyhľadať plugin @@ -176,6 +180,12 @@ Pluginy: {0} – Nepodarilo sa odstrániť súbory s nastaveniami pluginu, odstráňte ich manuálne Nepodarilo sa odstrániť vyrovnávaciu pamäť pluginu Pluginy: {0} – Nepodarilo sa odstrániť vyrovnávaciu pamäť pluginu, odstráňte ju manuálne + Plugin {0} už bol upravený + Pred vykonaním ďalších zmien reštartujte Flow Launcher + Nepodarilo sa nainštalovať {0} + Nepodarilo sa odinštalovať {0} + Súbor plugin.json sa nenašiel v rozbalenom zip súbore, alebo táto cesta {0} neexistuje + Plugin s rovnakým ID už existuje, alebo ide o vyššiu verziu ako stiahnutý plugin Repozitár pluginov @@ -191,6 +201,28 @@ Nová verzia Tento plugin bol aktualizovaný za posledných 7 dní K dispozícii je nová aktualizácia + Chyba inštalácie pluginu + Chyba odinštalácie pluginu + Chyba aktualizácie pluginu + Ponechať nastavenia pluginu + Chcete zachovať nastavenia pluginu na ďalšie použitie? + Plugin {0} bol úspešne nainštalovaný. Prosím, reštartuje Flow. + Plugin {0} bol úspešne odinštalovaný. Prosím, reštartuje Flow. + Plugin {0} bol úspešne aktualizovaný. Prosím, reštartuje Flow. + Inštalácia pluginu + {0} od {1} {2}{2}Chcete nainštalovať tento plugin? + Odinštalácia pluginu + {0} od {1} {2}{2}Chcete odinštalovať tento plugin? + Aktualizácia pluginu + {0} od {1} {2}{2}Chcete aktualizovať tento plugin? + Sťahovanie pluginu + Automaticky reštartovať po inštalácii/odinštalácii/aktualizáciu pluginov cez Repozitár pluginov + V zipe sa nenachádza platná konfigurácia plugin.json + Inštalácia z neznámeho zdroja + Tento plugin pochádza z neznámeho zdroja a môže predstavovať potenciálne riziká!{0}{0}Uistite sa, že viete, odkiaľ tento plugin pochádza, a že je bezpečný.{0}{0}Stále chcete pokračovať?{0}{0}(Toto upozornenie môžete vypnúť sekcii Všeobecné v nastaveniach) + Zip súbory + Vyberte zip súbor + Inštalovať plugin z miestneho úložiska Motív @@ -434,13 +466,14 @@ Stlačením vlastnej klávesovej skratky otvoríte Flow Launcher a automaticky vložíte zadaný dotaz. Náhľad Klávesová skratka je nedostupná, prosím, zadajte novú skratku - Neplatná klávesová skratka pluginu + Klávesová skratka je neplatná Aktualizovať Priradenie klávesovej skratky Aktuálna klávesová skratka nie je k dispozícii. Táto skratka je rezervovaná pre "{0}" a nemôže byť použitá. Prosím, vyberte inú skratku. Táto skratka sa používa pre "{0}". Ak stlačíte "Prepísať", odstráni sa pre "{0}". Stlačte kláves, ktorý chcete nastaviť pre túto funkciu. + Klávesová skratka a aktivačný príkaz sú prázdne Klávesová skratka vlastného dopytu @@ -451,6 +484,7 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s Skratka už existuje, zadajte novú skratku alebo upravte existujúcu. Skratka a/alebo jej celé znenie je prázdne. + Skratka je neplatná Uložiť diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml index ae7aa7af2..16bd5aeb8 100644 --- a/Flow.Launcher/Languages/sr.xaml +++ b/Flow.Launcher/Languages/sr.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Search Plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Plugin Store @@ -191,6 +201,28 @@ New Version This plugin has been updated within the last 7 days New Update is Available + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Tema @@ -383,7 +415,7 @@ Select File Manager Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. File Manager Profile Name File Manager Path @@ -434,13 +466,14 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. Pregled Prečica je nedustupna, molim Vas izaberite drugu prečicu - Nepravlna prečica za plugin + Hotkey is invalid Ažuriraj Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Custom Query Shortcut @@ -451,6 +484,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid Sačuvaj diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml index 5c118be01..032891900 100644 --- a/Flow.Launcher/Languages/tr.xaml +++ b/Flow.Launcher/Languages/tr.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Eklenti Ara @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Eklenti Mağazası @@ -191,6 +201,28 @@ Yeni Sürüm Bu eklenti son 7 gün içerisinde güncellenmiş. Yeni Bir Güncelleme Mevcut + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Temalar @@ -383,7 +415,7 @@ Dosya Yöneticisi Seçenekleri Daha fazla bilgi Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Dosya Yöneticisi Profil Adı Dosya Yöneticisi Yolu @@ -434,13 +466,14 @@ Flow Launcher'ı açıp otomatik olarak girdiğiniz sorguyu aratması için bir kısayol atayın. Önizleme Kısayol tuşu kullanılamıyor, lütfen başka bir kombinasyon girin. - Geçersiz eklenti kısayol tuşu + Hotkey is invalid Güncelle Kısayol Atanıyor Kullanılamıyor Bu kısayol "{0}" için ayrılmıştır, lütfen başka bir kısayol deneyin. Bu kısayol zaten "{0}" için kullanılıyor. Eğer "Üstüne Yaz"'ı seçerseniz, "{0}" sorgusu bu kısayol ile kullanılamayacak. Bu işleve atamak istediğiniz kısayol tuşlarına basın. + Hotkey and action keyword are empty Özel Kısaltmalar @@ -449,6 +482,7 @@ Anahtar kelime zaten mevcut. Yeni bir kısaltma girin veya mevcut kısaltmayı düzenleyin. Kısaltma ve/veya sorgu eksik. + Shortcut is invalid Kaydet diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml index a8ee67653..c5dcd3e28 100644 --- a/Flow.Launcher/Languages/uk-UA.xaml +++ b/Flow.Launcher/Languages/uk-UA.xaml @@ -8,9 +8,9 @@ Будласка оберіть виконуваник {0} - Your selected {0} executable is invalid. + Ви вибрали невірний виконуваний файл {0}. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Щоб знову вибрати виконуваний файл {0}, натисніть «Так». Натисніть «Ні», щоб завантажити {1} Не вдається встановити шлях до виконуваника {0}, будласка спробуйте в налаштуваннях Flow (прокрутіть вниз до кінця). Невдача ініціалізації плагінів @@ -18,7 +18,7 @@ Не вдалося зареєструвати гарячу клавішу "{0}". Можливо, гаряча клавіша використовується іншою програмою. Змініть її на іншу гарячу клавішу або вийдіть з програми, де вона використовується. - Failed to unregister hotkey "{0}". Please try again or see log for details + Не вдалося скасувати реєстрацію гарячої клавіші «{0}». Спробуйте ще раз або перегляньте журнал для отримання подробиць Flow Launcher Не вдалося запустити {0} Невірний формат файлу плагіна Flow Launcher @@ -42,8 +42,8 @@ Режим гри Призупинити використання гарячих клавіш. Скидання позиції - Reset search window position - Type here to search + Скинути положення вікна пошуку + Напишіть тут, аби знайти Налаштування @@ -51,12 +51,12 @@ Портативний режим Зберігати всі налаштування і дані користувача в одній теці (буде корисно при видаленні дисків або хмарних сервісах). Запускати Flow Launcher при запуску системи - Use logon task instead of startup entry for faster startup experience - After uninstallation, you need to manually remove this task (Flow.Launcher Startup) via Task Scheduler + Для швидшого запуску використовуйте завдання при вході в систему, а не після запуску + Після видалення, вам необхідно вручну видалити це завдання (Flow.Launcher Startup) через планувальник завдань Помилка запуску налаштування під час запуску Сховати Flow Launcher, якщо втрачено фокус Не повідомляти про доступні нові версії - Search Window Location + Розташування вікна пошуку Пам'ятати останню позицію Монітор з курсором миші Монітор зі сфокусованим вікном @@ -74,8 +74,8 @@ Зберегти останній запит Вибрати останній запит Очистити останній запит - Preserve Last Action Keyword - Select Last Action Keyword + Зберігати останнє ключове слово дії + Вибрати ключове слово останньої дії Максимальна кількість результатів Ви також можете швидко налаштувати цей параметр за допомогою клавіш CTRL+Плюс чи CTRL+Мінус. Ігнорувати гарячі клавіші в повноекранному режимі @@ -106,38 +106,42 @@ Завжди переглядати Завжди відкривати панель попереднього перегляду при активації Flow. Натисніть {0}, щоб переключити попередній перегляд. Ефект тіні не дозволено, коли поточна тема має ефект розмиття - Search Delay - Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. - Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. - Default Search Delay Time - Wait time before showing results after typing stops. Higher values wait longer. (ms) - Information for Korean IME user + Затримка пошуку + Додає невелику затримку під час набору тексту, щоб зменшити мерехтіння інтерфейсу та навантаження на результати. Рекомендується, якщо у вас середня швидкість друкування. + Введіть час очікування (в мілісекундах) до завершення введення. Цей параметр можна редагувати лише в разі ввімкнення функції «Затримка пошуку». + Типовий час затримки пошуку + Час очікування перед відображенням результатів після завершення введення тексту. Чим вище значення, тим довше очікування. (мс) + Інформація для користувачів корейської IME - The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + Корейський метод введення, який використовується у Windows 11, може спричинити деякі проблеми в Flow Launcher. - If you experience any problems, you may need to enable "Use previous version of Korean IME". + Якщо у вас виникли проблеми, можливо, вам доведеться ввімкнути параметр «Використовувати попередню версію корейського IME». - Open Setting in Windows 11 and go to: + Відкрийте налаштування у Windows 11 і перейдіть до: - Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + Час і мова > Мова і регіон > Корейська > Параметри мови > Клавіатура - Microsoft IME > Сумісність, - and enable "Use previous version of Microsoft IME". + та увімкніть параметр «Використовувати попередню версію Microsoft IME». - Open Language and Region System Settings - Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Відкрити налаштування системи мови та регіону + Відкриває вікно налаштувань корейського IME. Перейдіть до Корейської > Параметри мови > Клавіатура - Microsoft IME > Сумісність Відкрити - Use Previous Korean IME - You can change the Previous Korean IME settings directly from here - Home Page - Show home page results when query text is empty. - Show History Results in Home Page - Maximum History Results Shown in Home Page - This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Використовувати попередній корейський IME + Ви можете змінити попередні налаштування корейського IME безпосередньо звідси. + Головна сторінка + Показувати результати на головній сторінці, коли текст запиту порожній. + Показати результати історії на головній + Максимальна кількість результатів історії, що показуються на головній + Це можна редагувати тільки в тому випадку, якщо плагін підтримує функцію «Головна сторінка» і вона ввімкнена. + Показувати вікно пошуку на передньому плані + Перекриває налаштування «Завжди зверху» інших програм і виводить Flow на передній план. + Перезапустіть після модифікації плагіну через Магазин плагінів + Автоматично перезапускати Flow Launcher після встановлення / видалення / оновлення плагіну через Магазин плагінів + Показувати попередження про невідоме джерело + Показувати попередження під час встановлення плагінів із невідомих джерел Плагін для пошуку @@ -154,13 +158,13 @@ Поточна гаряча клавіша Нова гаряча клавіша Змінити гарячі клавіши - Plugin search delay time - Change Plugin Search Delay Time - Advanced Settings: + Час затримки пошуку плагіну + Змінити час затримки пошуку плагінів + Додаткові налаштування: Увімкнено Пріоритет - Search Delay - Home Page + Затримка пошуку + Головна сторінка Поточний пріоритет Новий пріоритет Пріоритет @@ -172,10 +176,16 @@ Версія Сайт Видалити - Fail to remove plugin settings - Plugins: {0} - Fail to remove plugin settings files, please remove them manually - Fail to remove plugin cache - Plugins: {0} - Fail to remove plugin cache files, please remove them manually + Не вдалося видалити налаштування плагіну + Плагіни: {0} — Не вдалося видалити файли налаштувань плагінів, видаліть їх вручну. + Не вдалося видалити кеш плагіну + Плагіни: {0} — Не вдалося видалити файли кешу плагінів, видаліть їх вручну + {0} вже змінено + Перезапустіть Flow перед тим, як вносити будь-які подальші зміни. + Не вдалося встановити {0} + Не вдалося видалити {0} + Не вдалося знайти файл plugin.json у розпакованому zip-файлі або цей шлях {0} не існує. + Вже існує плагін з таким самим ідентифікатором та версією, або версія цього плагіну вища за версію завантаженого. Магазин плагінів @@ -191,6 +201,28 @@ Нова версія Цей плагін було оновлено протягом останніх 7 днів Доступне нове оновлення + Помилка під час встановлення плагіна + Помилка видалення плагіну + Помилка під час оновлення плагіну + Зберегти налаштування плагіну + Ви хочете зберегти налаштування плагіну для наступного використання? + Плагін {0} успішно встановлено. Будь ласка, перезапустіть Flow. + Плагін {0} успішно видалено. Будь ласка, перезапустіть Flow. + Плагін {0} успішно оновлено. Будь ласка, перезапустіть Flow. + Встановлення плагіна + {0} від {1} {2}{2}Бажаєте встановити цей плагін? + Видалення плагіну + {0} від {1} {2}{2}Бажаєте видалити цей плагін? + Оновлення плагіну + {0} від {1} {2}{2}Бажаєте оновити цей плагін? + Завантаження плагіну + Автоматично перезапускати після встановлення / видалення / оновлення плагінів у магазині плагінів + Zip-файл не має дійсної конфігурації plugin.json. + Встановлення з невідомого джерела + Цей плагін походить із невідомого джерела та може містити потенційні ризики!{0}{0}Переконайтеся, що ви знаєте, звідки походить він походить, і що він є безпечним.{0}{0}Ви все одно хочете продовжити?{0}{0}(Ви можете вимкнути це попередження в загальному розділі вікна налаштувань) + Zip-файли + Виберіть zip-файл + Встановити плагін із локального шляху Тема @@ -212,9 +244,9 @@ Шрифт заголовка результату Шрифт підзаголовка результату Скинути - Reset to the recommended font and size settings. - Import Theme Size - If a size value intended by the theme designer is available, it will be retrieved and applied. + Скинути до рекомендованих налаштувань шрифту та розміру. + Імпортувати розмір теми + Якщо значення розміру, передбачене дизайнером теми, доступне, воно буде отримане та застосоване. Підлаштувати Віконний режим Прозорість @@ -241,21 +273,21 @@ Користувацька Годинник Дата - Backdrop Type - The backdrop effect is not applied in the preview. - Backdrop supported starting from Windows 11 build 22000 and above + Тип тла + Ефект тла не застосовується у передпоказі. + Тло підтримується починаючи з Windows 11 версії 22000 і вище Нема - Acrylic - Mica - Mica Alt - This theme supports two (light/dark) modes. + Акрил + Слюда + Слюда (альтернатива) + Ця тема підтримує два (світлу/темну) режими. Ця тема підтримує розмитий прозорий фон. - Show placeholder - Display placeholder when query is empty - Placeholder text - Change placeholder text. Input empty will use: {0} - Fixed Window Size - The window size is not adjustable by dragging. + Показати заповнювач + Показувати заповнювач, коли запит порожній + Текст заповнювача + Змінення тексту заповнювача. Ввід буде використовувати: {0} + Фіксований розмір вікна + Розмір вікна не можна регулювати шляхом перетягування. Гаряча клавіша @@ -315,9 +347,9 @@ Використання іконок Segoe Fluent Використання іконок Segoe Fluent Icons для результатів запитів, де це підтримується Натисніть клавішу - Show Result Badges - For supported plugins, badges are displayed to help distinguish them more easily. - Show Result Badges for Global Query Only + Показувати значки результатів + Для підтримуваних плагінів показуються значки для легшого розрізнення. + Показувати значки результатів тільки для глобального запиту HTTP-проксі @@ -358,39 +390,39 @@ Тека журналу Очистити журнали Ви впевнені, що хочете видалити всі журнали? - Cache Folder - Clear Caches - Are you sure you want to delete all caches? - Failed to clear part of folders and files. Please see log file for more information + Кеш теки + Очистити кеш + Дійсно хочете видалити весь кеш? + Не вдалося очистити частину тек і файлів. Перегляньте файл журналу для отримання додаткової інформації Чаклун Розташування даних користувача Налаштування користувача та встановлені плагіни зберігаються у теці даних користувача. Це місце може змінюватися залежно від того, чи перебуває програма в портативному режимі, чи ні. Відкрити теку - Advanced - Log Level - Debug - Info - Setting Window Font + Розширені + Рівень журналювання + Налагодження + Інформація + Встановлення шрифту вікна - See more release notes on GitHub - Failed to fetch release notes - Please check your network connection or ensure GitHub is accessible - Flow Launcher has been updated to {0} - Click here to view the release notes + Дізнатися більше про версію на GitHub + Не вдалося отримати примітки до випуску + Перевірте своє мережеве з'єднання або переконайтеся, що GitHub є доступним + Flow Launcher було оновлено до {0} + Натисніть тут, щоби переглянути примітки до випуску Виберіть файловий менеджер - Learn more - Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + Докладніше + Вкажіть розташування файлу у файловому менеджері, який ви використовуєте, та додайте необхідні аргументи. «%d» позначає шлях до каталогу, який потрібно відкрити, і використовується в полі «Аргумент для теки» та для команд, що відкривають певні каталоги. «%f» позначає шлях до файлу, який потрібно відкрити, і використовується в полі «Аргумент для файлу» та для команд, що відкривають певні файли. + Наприклад, якщо файловий менеджер використовує таку команду, як «totalcmd.exe /A c:\windows» для відкриття каталогу c:\windows, шлях файлового менеджера буде totalcmd.exe, а аргумент для теки — /A «%d». Деякі файлові менеджери, такі як QTTabBar, можуть вимагати лише вказати шлях, у цьому випадку використовуйте «%d» як шлях файлового менеджера і залиште решту полів порожніми. Файловий менеджер Ім'я профілю Шлях до файлового менеджера Аргумент для папки Аргумент для файлу - The file manager '{0}' could not be located at '{1}'. Would you like to continue? - File Manager Path Error + Не вдалося знайти файловий менеджер «{0}» за адресою «{1}». Чи бажаєте продовжити? + Помилка шляху до файлового менеджера Веб-браузер за замовчуванням @@ -415,32 +447,33 @@ Не вдалося знайти вказаний плагін Нова гаряча клавіша не може бути порожньою Нова гаряча клавіша вже використовується іншим плагіном. Будь ласка, вкажіть нову - This new Action Keyword is the same as old, please choose a different one + Це нове ключове слово дії є таким самим, як і старе, виберіть інше. Успішно Успішно завершено - Failed to copy - Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. + Не вдалося скопіювати + Введіть ключові слова дій, які ви хочете використовувати для запуску плагіну, й розділіть їх пробілами. Якщо ви не хочете вказувати жодних ключових слів, використовуйте *, і плагін буде запускатися без них. - Search Delay Time Setting - Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + Налаштування часу затримки пошуку + Введіть час затримки пошуку в мілісекундах, який ви хочете використовувати для плагіну. Якщо ви не хочете вказувати час затримки, залиште поле порожнім, і плагін буде використовувати типовий час затримки пошуку. - Home Page - Enable the plugin home page state if you like to show the plugin results when query is empty. + Головна сторінка + Увімкніть стан головної сторінки плагіну, якщо ви хочете показувати його результати, коли запит порожній. Задані гарячі клавіші для запитів Натисніть спеціальну гарячу клавішу, щоб відкрити Flow Launcher і автоматично ввести вказаний запит. Переглянути Гаряча клавіша недоступна. Будь ласка, вкажіть нову - Недійсна гаряча клавіша плагіна + Гаряча клавіша недійсна Оновити Прив'язка галавіші Поточна галавіша недоступна. Ця галавіша зарезервована для «{0}» і не може бути використана. Будласка, виберіть іншу галавішу. Ця галавіша вже використовується «{0}». Якщо ви натиснете «Перезаписати», її буде вилучено з «{0}». Натисніть клавіші, які ви хочете використовувати для цієї функції. + Гаряча клавіша та ключове слово дії порожні Власне скорочення запиту @@ -451,6 +484,7 @@ Скорочення вже існує, будь ласка, введіть нове або відредагуйте існуюче. Скорочення та/або його розширення є порожнім. + Комбінація клавіш недійсна. Зберегти @@ -478,18 +512,18 @@ Звіт успішно відправлено Не вдалося відправити звіт Стався збій в додатку Flow Launcher - Please open new issue in - 1. Upload log file: {0} - 2. Copy below exception message + Створіть нову проблему в + 1. Завантажте файл журналу: {0} + 2. Скопіюйте нижче повідомлення про виняток - File Manager Error + Помилка файлового менеджера - The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + Вказаний файловий менеджер не знайдено. Перевірте налаштування вашого файлового менеджера в розділі Налаштування > Загальні. Помилка - An error occurred while opening the folder. {0} - An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window + Під час відкриття теки сталася помилка. {0} + Під час відкриття URL-адреси в браузері сталася помилка. Перевірте налаштування типового веббраузера у розділі «Загальні» вікна налаштувань. Будь ласка, зачекайте... diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml index a2875f3c0..2a8769863 100644 --- a/Flow.Launcher/Languages/vi.xaml +++ b/Flow.Launcher/Languages/vi.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Plugin tìm kiếm @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Tải tiện ích mở rộng @@ -191,6 +201,28 @@ Phiên bản mới Plugin này đã được cập nhật trong vòng 7 ngày qua Đã có bản cập nhật mới + Lỗi cài đặt plugin + Lỗi cài đặt plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Plugin đang được tải + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Cài đặt từ một nguồn không xác định + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Giao Diện @@ -385,7 +417,7 @@ Chọn trình quản lý tệp Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Trình quản lý ngày tháng Tên hồ sơ Đường dẫn quản lý tệp @@ -436,13 +468,14 @@ Nhấn phím nóng tùy chỉnh để mở Flow Launcher và tự động nhập truy vấn được chỉ định. Xem trước Tổ hợp phím không khả dụng, vui lòng chọn tổ hợp phím khác - Tổ hợp phím plugin không hợp lệ + Hotkey is invalid Cập nhật Binding Hotkey Phím nóng hiện tại không có sẵn. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Phím tắt truy vấn tùy chỉnh @@ -455,6 +488,7 @@ Phím tắt đã tồn tại, vui lòng nhập Phím tắt mới hoặc chỉnh sửa phím tắt hiện có. Phím tắt và/hoặc phần mở rộng của nó trống. + Shortcut is invalid Lưu diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml index 698eee1e3..0f5e1e165 100644 --- a/Flow.Launcher/Languages/zh-cn.xaml +++ b/Flow.Launcher/Languages/zh-cn.xaml @@ -136,8 +136,12 @@ 在主页中显示历史记录 在主页显示的最大历史结果数 这只能在插件支持主页功能和主页启用时进行编辑。 - Show Search Window at Topmost - Show search window above other windows + 将搜索窗口置于顶层 + 覆盖其他“总是在顶部”的程序窗口并在最顶层的位置显示 Flow Launcher 搜索窗口。 + 通过插件商店修改插件后重启 + 通过插件商店安装/卸载/更新插件后自动重启 Flow Launcher + 显示未知来源警告 + 安装来自未知来源的插件时显示警告 搜索插件 @@ -176,6 +180,12 @@ 插件:{0} - 移除插件设置文件失败,请手动删除 移除插件缓存失败 插件:{0} - 移除插件设置文件失败,请手动删除 + {0} 已修改 + 请在进行任何进一步更改之前重新启动 Flow + 安装 {0} 失败 + 卸载 {0} 失败 + 无法从提取的zip文件中找到plugin.json,或者此路径 {0} 不存在 + 已存在相同ID和版本的插件,或者存在版本大于此下载的插件 插件商店 @@ -191,6 +201,28 @@ 新版本 此插件在过去7天内有更新 有可用的更新 + 安装插件时出错 + 卸载插件时出错 + 更新插件时出错 + 保留插件设置 + 你想要保留插件设置以便下一次的使用吗? + 成功安装插件{0}。请重新启动 Flow Launcher。 + 成功卸载插件{0}。请重新启动 Flow Launcher。 + 成功更新插件{0}。请重新启动 Flow Launcher。 + 插件安装 + {0} 作者: {1} {2}{2}您想要安装这个插件吗? + 插件卸载 + {0} 作者: {1} {2}{2}您想要卸载这个插件吗? + 插件更新 + {0} 作者: {1} {2}{2}您想要更新这个插件吗? + 下载插件 + 插件商店安装/卸载/更新插件后自动重启 + Zip 文件没有有效的 plugin.json 配置 + 从未知源安装 + 您正在从未知源安装此插件,它可能包含潜在风险!{0}{0}请确保您了解来源以及安全性。{0}{0}您想要继续吗?{0}{0}(您可以通过设置关闭此警告) + Zip 文件 + 请选择 zip 文件 + 从本地路径安装插件 主题 @@ -434,13 +466,14 @@ 输入一个自定义的快捷键来打开 Flow Launcher 并自动输入指定的查询。 预览 热键不可用,请选择一个新的热键 - 插件热键不合法 + 热键无效 更新 绑定热键 当前热键不可用。 此热键为“{0}”保留,无法使用。请选择其他热键。 此热键已被“{0}”使用。如果按“覆盖”,则会将其从“{0}”中删除。 按下您想要用于此功能的键。 + 热键和操作关键字为空 自定义查询捷径 @@ -451,6 +484,7 @@ 捷径已存在,请输入一个新的或者编辑已有的。 捷径及其展开均不能为空。 + 快捷键无效 保存 diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml index 0f6ad3f5b..959f75f97 100644 --- a/Flow.Launcher/Languages/zh-tw.xaml +++ b/Flow.Launcher/Languages/zh-tw.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -136,8 +136,12 @@ Show History Results in Home Page Maximum History Results Shown in Home Page This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Topmost - Show search window above other windows + Show Search Window at Foremost + Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Search Plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin 插件商店 @@ -191,6 +201,28 @@ New Version This plugin has been updated within the last 7 days New Update is Available + 安裝插件時發生錯誤 + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + 正在下載擴充功能 + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path 主題 @@ -383,7 +415,7 @@ 選擇檔案管理器 Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. 檔案管理器 檔案名稱 檔案管理器路徑 @@ -434,13 +466,14 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. 預覽 快捷鍵不存在,請設定一個新的快捷鍵 - 擴充功能熱鍵無法使用 + Hotkey is invalid 更新 Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Custom Query Shortcut @@ -451,6 +484,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid 儲存 diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index f4d7ad8eb..0c8fb4d02 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -20,6 +20,7 @@ using Flow.Launcher.Infrastructure; using Flow.Launcher.Infrastructure.Hotkey; using Flow.Launcher.Infrastructure.Image; using Flow.Launcher.Infrastructure.UserSettings; +using Flow.Launcher.Plugin; using Flow.Launcher.Plugin.SharedCommands; using Flow.Launcher.ViewModel; using Microsoft.Win32; @@ -43,6 +44,9 @@ namespace Flow.Launcher #region Private Fields + // Class Name + private static readonly string ClassName = nameof(MainWindow); + // Dependency Injection private readonly Settings _settings; private readonly Theme _theme; @@ -91,8 +95,8 @@ namespace Flow.Launcher InitSoundEffects(); DataObject.AddPastingHandler(QueryTextBox, QueryTextBox_OnPaste); - ModernWpf.ThemeManager.Current.ActualApplicationThemeChanged += ThemeManager_ActualApplicationThemeChanged; SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; + _viewModel.ActualApplicationThemeChanged += ViewModel_ActualApplicationThemeChanged; } #endregion @@ -101,7 +105,7 @@ namespace Flow.Launcher #pragma warning disable VSTHRD100 // Avoid async void methods - private void ThemeManager_ActualApplicationThemeChanged(ModernWpf.ThemeManager sender, object args) + private void ViewModel_ActualApplicationThemeChanged(object sender, ActualApplicationThemeChangedEventArgs args) { _ = _theme.RefreshFrameAsync(); } @@ -283,6 +287,10 @@ namespace Flow.Launcher break; case nameof(Settings.Language): UpdateNotifyIconText(); + if (_settings.ShowHomePage && _viewModel.QueryResultsSelected() && string.IsNullOrEmpty(_viewModel.QueryText)) + { + _viewModel.QueryResults(); + } break; case nameof(Settings.Hotkey): UpdateNotifyIconText(); @@ -1251,14 +1259,21 @@ namespace Flow.Launcher private void QueryTextBox_OnPaste(object sender, DataObjectPastingEventArgs e) { - var isText = e.SourceDataObject.GetDataPresent(DataFormats.UnicodeText, true); - if (isText) + try { - var text = e.SourceDataObject.GetData(DataFormats.UnicodeText) as string; - text = text.Replace(Environment.NewLine, " "); - DataObject data = new DataObject(); - data.SetData(DataFormats.UnicodeText, text); - e.DataObject = data; + var isText = e.SourceDataObject.GetDataPresent(DataFormats.UnicodeText, true); + if (isText) + { + var text = e.SourceDataObject.GetData(DataFormats.UnicodeText) as string; + text = text.Replace(Environment.NewLine, " "); + DataObject data = new DataObject(); + data.SetData(DataFormats.UnicodeText, text); + e.DataObject = data; + } + } + catch (Exception ex) + { + App.API.LogException(ClassName, "Failed to paste text", ex); } } @@ -1351,7 +1366,7 @@ namespace Flow.Launcher _notifyIcon?.Dispose(); animationSoundWMP?.Close(); animationSoundWPF?.Dispose(); - ModernWpf.ThemeManager.Current.ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged; + _viewModel.ActualApplicationThemeChanged -= ViewModel_ActualApplicationThemeChanged; SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged; } diff --git a/Flow.Launcher/ProgressBoxEx.xaml.cs b/Flow.Launcher/ProgressBoxEx.xaml.cs index 840c8bade..119463348 100644 --- a/Flow.Launcher/ProgressBoxEx.xaml.cs +++ b/Flow.Launcher/ProgressBoxEx.xaml.cs @@ -19,32 +19,32 @@ namespace Flow.Launcher public static async Task ShowAsync(string caption, Func, Task> reportProgressAsync, Action cancelProgress = null) { - ProgressBoxEx prgBox = null; + ProgressBoxEx progressBox = null; try { if (!Application.Current.Dispatcher.CheckAccess()) { await Application.Current.Dispatcher.InvokeAsync(() => { - prgBox = new ProgressBoxEx(cancelProgress) + progressBox = new ProgressBoxEx(cancelProgress) { Title = caption }; - prgBox.TitleTextBlock.Text = caption; - prgBox.Show(); + progressBox.TitleTextBlock.Text = caption; + progressBox.Show(); }); } else { - prgBox = new ProgressBoxEx(cancelProgress) + progressBox = new ProgressBoxEx(cancelProgress) { Title = caption }; - prgBox.TitleTextBlock.Text = caption; - prgBox.Show(); + progressBox.TitleTextBlock.Text = caption; + progressBox.Show(); } - await reportProgressAsync(prgBox.ReportProgress).ConfigureAwait(false); + await reportProgressAsync(progressBox.ReportProgress).ConfigureAwait(false); } catch (Exception e) { @@ -58,12 +58,12 @@ namespace Flow.Launcher { await Application.Current.Dispatcher.InvokeAsync(() => { - prgBox?.Close(); + progressBox?.Close(); }); } else { - prgBox?.Close(); + progressBox?.Close(); } } } diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 6e82032ff..d865a087b 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -14,23 +14,24 @@ using System.Windows; using System.Windows.Media; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.Core; +using Flow.Launcher.Core.ExternalPlugins; using Flow.Launcher.Core.Plugin; using Flow.Launcher.Core.Resource; -using Flow.Launcher.Core.ExternalPlugins; using Flow.Launcher.Core.Storage; using Flow.Launcher.Helper; using Flow.Launcher.Infrastructure; -using Flow.Launcher.Infrastructure.Http; using Flow.Launcher.Infrastructure.Hotkey; +using Flow.Launcher.Infrastructure.Http; using Flow.Launcher.Infrastructure.Image; using Flow.Launcher.Infrastructure.Logger; using Flow.Launcher.Infrastructure.Storage; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin; -using Flow.Launcher.Plugin.SharedModels; using Flow.Launcher.Plugin.SharedCommands; +using Flow.Launcher.Plugin.SharedModels; using Flow.Launcher.ViewModel; using JetBrains.Annotations; +using ModernWpf; using Squirrel; using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch; @@ -566,13 +567,13 @@ namespace Flow.Launcher public bool PluginModified(string id) => PluginManager.PluginModified(id); - public Task UpdatePluginAsync(PluginMetadata pluginMetadata, UserPlugin plugin, string zipFilePath) => + public Task UpdatePluginAsync(PluginMetadata pluginMetadata, UserPlugin plugin, string zipFilePath) => PluginManager.UpdatePluginAsync(pluginMetadata, plugin, zipFilePath); - public void InstallPlugin(UserPlugin plugin, string zipFilePath) => + public bool InstallPlugin(UserPlugin plugin, string zipFilePath) => PluginManager.InstallPlugin(plugin, zipFilePath); - public Task UninstallPluginAsync(PluginMetadata pluginMetadata, bool removePluginSettings = false) => + public Task UninstallPluginAsync(PluginMetadata pluginMetadata, bool removePluginSettings = false) => PluginManager.UninstallPluginAsync(pluginMetadata, removePluginSettings); public long StopwatchLogDebug(string className, string message, Action action, [CallerMemberName] string methodName = "") => @@ -587,6 +588,17 @@ namespace Flow.Launcher public Task StopwatchLogInfoAsync(string className, string message, Func action, [CallerMemberName] string methodName = "") => Stopwatch.InfoAsync(className, message, action, methodName); + public bool IsApplicationDarkTheme() + { + return ThemeManager.Current.ActualApplicationTheme == ApplicationTheme.Dark; + } + + public event ActualApplicationThemeChangedEventHandler ActualApplicationThemeChanged + { + add => _mainVM.ActualApplicationThemeChanged += value; + remove => _mainVM.ActualApplicationThemeChanged -= value; + } + #endregion #region Private Methods diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs index 59646f35a..ce7a3e084 100644 --- a/Flow.Launcher/ReleaseNotesWindow.xaml.cs +++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs @@ -189,31 +189,46 @@ namespace Flow.Launcher var releases = JsonSerializer.Deserialize>(releaseNotesJSON); // Get the latest releases - var latestReleases = releases.OrderByDescending(release => release.PublishedDate).Take(3); + var latestReleases = releases.OrderByDescending(release => release.PublishedDate).Take(3).ToList(); // Build the release notes in Markdown format var releaseNotesHtmlBuilder = new StringBuilder(string.Empty); - foreach (var release in latestReleases) + + for (int i = 0; i < latestReleases.Count; i++) { + var release = latestReleases[i]; releaseNotesHtmlBuilder.AppendLine("# " + release.Name); // Because MdXaml.Html package cannot correctly render images without units, // We need to manually add unit for images // E.g. Replace with var notes = ImageUnitRegex().Replace(release.ReleaseNotes, m => - { - var prefix = m.Groups[1].Value; - var widthValue = m.Groups[2].Value; - var quote = m.Groups[3].Value; - var suffix = m.Groups[4].Value; - // Only replace if width is number like 500 without units like 500px - if (IsNumber(widthValue)) - return $"{prefix}{widthValue}px{quote}{suffix}"; - return m.Value; - }); + { + var prefix = m.Groups[1].Value; + var widthValue = m.Groups[2].Value; + var quote = m.Groups[3].Value; + var suffix = m.Groups[4].Value; + // Only replace if width is number like 500 without units like 500px + if (IsNumber(widthValue)) + return $"{prefix}{widthValue}px{quote}{suffix}"; + return m.Value; + }); releaseNotesHtmlBuilder.AppendLine(notes); releaseNotesHtmlBuilder.AppendLine(); + + // Add separator if it is not last release note + if (i < latestReleases.Count - 1) + { + releaseNotesHtmlBuilder.Append("
"); + releaseNotesHtmlBuilder.Append("\n\n"); + + releaseNotesHtmlBuilder.AppendLine("---"); + + releaseNotesHtmlBuilder.Append("\n\n"); + releaseNotesHtmlBuilder.Append("
"); + releaseNotesHtmlBuilder.Append("\n\n"); + } } return releaseNotesHtmlBuilder.ToString(); diff --git a/Flow.Launcher/Resources/Controls/Card.xaml b/Flow.Launcher/Resources/Controls/Card.xaml index 33c1299a9..e3c5f8194 100644 --- a/Flow.Launcher/Resources/Controls/Card.xaml +++ b/Flow.Launcher/Resources/Controls/Card.xaml @@ -38,21 +38,21 @@ - + - + - + diff --git a/Flow.Launcher/Resources/Controls/Card.xaml.cs b/Flow.Launcher/Resources/Controls/Card.xaml.cs index c8f788aca..6a70dded2 100644 --- a/Flow.Launcher/Resources/Controls/Card.xaml.cs +++ b/Flow.Launcher/Resources/Controls/Card.xaml.cs @@ -9,7 +9,10 @@ namespace Flow.Launcher.Resources.Controls { Default, Inside, - InsideFit + InsideFit, + First, + Middle, + Last } public Card() diff --git a/Flow.Launcher/Resources/double_pinyin.json b/Flow.Launcher/Resources/double_pinyin.json new file mode 100644 index 000000000..83972038f --- /dev/null +++ b/Flow.Launcher/Resources/double_pinyin.json @@ -0,0 +1 @@ +{"XiaoHe":{"Lv":"lv","Lve":"lt","Lue":"lt","Nv":"nv","Nve":"nt","Nue":"nt","A":"aa","O":"oo","E":"ee","Ai":"ai","Ei":"ei","Ao":"ao","Ou":"ou","An":"an","En":"en","Ang":"ah","Eng":"eg","Er":"er","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yc","You":"yz","Yan":"yj","Yin":"yb","Yang":"yh","Ying":"yk","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wd","Wei":"ww","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"yt","Yuan":"yr","Yun":"yy","Yong":"ys","Ba":"ba","Bai":"bd","Ban":"bj","Bang":"bh","Bao":"bc","Bei":"bw","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bm","Biang":"bl","Biao":"bn","Bie":"bp","Bin":"bb","Bing":"bk","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cd","Can":"cj","Cang":"ch","Cao":"cc","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ia","Chai":"id","Chan":"ij","Chang":"ih","Chao":"ic","Che":"ie","Chen":"if","Cheng":"ig","Chi":"ii","Chong":"is","Chou":"iz","Chu":"iu","Chua":"ix","Chuai":"ik","Chuan":"ir","Chuang":"il","Chui":"iv","Chun":"iy","Chuo":"io","Ci":"ci","Cong":"cs","Cou":"cz","Cu":"cu","Cuan":"cr","Cui":"cv","Cun":"cy","Cuo":"co","Da":"da","Dai":"dd","Dan":"dj","Dang":"dh","Dao":"dc","De":"de","Dei":"dw","Den":"df","Deng":"dg","Di":"di","Dia":"dx","Dian":"dm","Diao":"dn","Die":"dp","Ding":"dk","Diu":"dq","Dong":"ds","Dou":"dz","Du":"du","Duan":"dr","Dui":"dv","Dun":"dy","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fw","Fen":"ff","Feng":"fg","Fiao":"fn","Fo":"fo","Fou":"fz","Fu":"fu","Ga":"ga","Gai":"gd","Gan":"gj","Gang":"gh","Gao":"gc","Ge":"ge","Gei":"gw","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gz","Gu":"gu","Gua":"gx","Guai":"gk","Guan":"gr","Guang":"gl","Gui":"gv","Gun":"gy","Guo":"go","Ha":"ha","Hai":"hd","Han":"hj","Hang":"hh","Hao":"hc","He":"he","Hei":"hw","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hz","Hu":"hu","Hua":"hx","Huai":"hk","Huan":"hr","Huang":"hl","Hui":"hv","Hun":"hy","Huo":"ho","Ji":"ji","Jia":"jx","Jian":"jm","Jiang":"jl","Jiao":"jn","Jie":"jp","Jin":"jb","Jing":"jk","Jiong":"js","Jiu":"jq","Ju":"ju","Juan":"jr","Jue":"jt","Jun":"jy","Ka":"ka","Kai":"kd","Kan":"kj","Kang":"kh","Kao":"kc","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kz","Ku":"ku","Kua":"kx","Kuai":"kk","Kuan":"kr","Kuang":"kl","Kui":"kv","Kun":"ky","Kuo":"ko","La":"la","Lai":"ld","Lan":"lj","Lang":"lh","Lao":"lc","Le":"le","Lei":"lw","Leng":"lg","Li":"li","Lia":"lx","Lian":"lm","Liang":"ll","Liao":"ln","Lie":"lp","Lin":"lb","Ling":"lk","Liu":"lq","Lo":"lo","Long":"ls","Lou":"lz","Lu":"lu","Luan":"lr","Lun":"ly","Luo":"lo","Ma":"ma","Mai":"md","Man":"mj","Mang":"mh","Mao":"mc","Me":"me","Mei":"mw","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mm","Miao":"mn","Mie":"mp","Min":"mb","Ming":"mk","Miu":"mq","Mo":"mo","Mou":"mz","Mu":"mu","Na":"na","Nai":"nd","Nan":"nj","Nang":"nh","Nao":"nc","Ne":"ne","Nei":"nw","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nm","Niang":"nl","Niao":"nn","Nie":"np","Nin":"nb","Ning":"nk","Niu":"nq","Nong":"ns","Nou":"nz","Nu":"nu","Nuan":"nr","Nun":"ny","Nuo":"no","Pa":"pa","Pai":"pd","Pan":"pj","Pang":"ph","Pao":"pc","Pei":"pw","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pm","Piao":"pn","Pie":"pp","Pin":"pb","Ping":"pk","Po":"po","Pou":"pz","Pu":"pu","Qi":"qi","Qia":"qx","Qian":"qm","Qiang":"ql","Qiao":"qn","Qie":"qp","Qin":"qb","Qing":"qk","Qiong":"qs","Qiu":"qq","Qu":"qu","Quan":"qr","Que":"qt","Qun":"qy","Ran":"rj","Rang":"rh","Rao":"rc","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rz","Ru":"ru","Rua":"rx","Ruan":"rr","Rui":"rv","Run":"ry","Ruo":"ro","Sa":"sa","Sai":"sd","San":"sj","Sang":"sh","Sao":"sc","Se":"se","Sen":"sf","Seng":"sg","Sha":"ua","Shai":"ud","Shan":"uj","Shang":"uh","Shao":"uc","She":"ue","Shei":"uw","Shen":"uf","Sheng":"ug","Shi":"ui","Shou":"uz","Shu":"uu","Shua":"ux","Shuai":"uk","Shuan":"ur","Shuang":"ul","Shui":"uv","Shun":"uy","Shuo":"uo","Si":"si","Song":"ss","Sou":"sz","Su":"su","Suan":"sr","Sui":"sv","Sun":"sy","Suo":"so","Ta":"ta","Tai":"td","Tan":"tj","Tang":"th","Tao":"tc","Te":"te","Tei":"tw","Teng":"tg","Ti":"ti","Tian":"tm","Tiao":"tn","Tie":"tp","Ting":"tk","Tong":"ts","Tou":"tz","Tu":"tu","Tuan":"tr","Tui":"tv","Tun":"ty","Tuo":"to","Xi":"xi","Xia":"xx","Xian":"xm","Xiang":"xl","Xiao":"xn","Xie":"xp","Xin":"xb","Xing":"xk","Xiong":"xs","Xiu":"xq","Xu":"xu","Xuan":"xr","Xue":"xt","Xun":"xy","Za":"za","Zai":"zd","Zan":"zj","Zang":"zh","Zao":"zc","Ze":"ze","Zei":"zw","Zen":"zf","Zeng":"zg","Zha":"va","Zhai":"vd","Zhan":"vj","Zhang":"vh","Zhao":"vc","Zhe":"ve","Zhen":"vf","Zheng":"vg","Zhi":"vi","Zhong":"vs","Zhou":"vz","Zhu":"vu","Zhua":"vx","Zhuai":"vk","Zhuan":"vr","Zhuang":"vl","Zhui":"vv","Zhun":"vy","Zhuo":"vo","Zi":"zi","Zong":"zs","Zou":"zz","Zu":"zu","Zuan":"zr","Zui":"zv","Zun":"zy","Zuo":"zo"},"ZiRanMa":{"Lv":"lv","Lve":"lt","Lue":"lt","Nv":"nv","Nve":"nt","Nue":"nt","A":"aa","O":"oo","E":"ee","Ai":"ai","Ei":"ei","Ao":"ao","Ou":"ou","An":"an","En":"en","Ang":"ah","Eng":"eg","Er":"er","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yk","You":"yb","Yan":"yj","Yin":"yn","Yang":"yh","Ying":"yy","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wl","Wei":"wz","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"yt","Yuan":"yr","Yun":"yp","Yong":"ys","Ba":"ba","Bai":"bl","Ban":"bj","Bang":"bh","Bao":"bk","Bei":"bz","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bm","Biang":"bd","Biao":"bc","Bie":"bx","Bin":"bn","Bing":"by","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cl","Can":"cj","Cang":"ch","Cao":"ck","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ia","Chai":"il","Chan":"ij","Chang":"ih","Chao":"ik","Che":"ie","Chen":"if","Cheng":"ig","Chi":"ii","Chong":"is","Chou":"ib","Chu":"iu","Chua":"iw","Chuai":"iy","Chuan":"ir","Chuang":"id","Chui":"iv","Chun":"ip","Chuo":"io","Ci":"ci","Cong":"cs","Cou":"cb","Cu":"cu","Cuan":"cr","Cui":"cv","Cun":"cp","Cuo":"co","Da":"da","Dai":"dl","Dan":"dj","Dang":"dh","Dao":"dk","De":"de","Dei":"dz","Den":"df","Deng":"dg","Di":"di","Dia":"dw","Dian":"dm","Diao":"dc","Die":"dx","Ding":"dy","Diu":"dq","Dong":"ds","Dou":"db","Du":"du","Duan":"dr","Dui":"dv","Dun":"dp","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fz","Fen":"ff","Feng":"fg","Fiao":"fc","Fo":"fo","Fou":"fb","Fu":"fu","Ga":"ga","Gai":"gl","Gan":"gj","Gang":"gh","Gao":"gk","Ge":"ge","Gei":"gz","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gb","Gu":"gu","Gua":"gw","Guai":"gy","Guan":"gr","Guang":"gd","Gui":"gv","Gun":"gp","Guo":"go","Ha":"ha","Hai":"hl","Han":"hj","Hang":"hh","Hao":"hk","He":"he","Hei":"hz","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hb","Hu":"hu","Hua":"hw","Huai":"hy","Huan":"hr","Huang":"hd","Hui":"hv","Hun":"hp","Huo":"ho","Ji":"ji","Jia":"jw","Jian":"jm","Jiang":"jd","Jiao":"jc","Jie":"jx","Jin":"jn","Jing":"jy","Jiong":"js","Jiu":"jq","Ju":"ju","Juan":"jr","Jue":"jt","Jun":"jp","Ka":"ka","Kai":"kl","Kan":"kj","Kang":"kh","Kao":"kk","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kb","Ku":"ku","Kua":"kw","Kuai":"ky","Kuan":"kr","Kuang":"kd","Kui":"kv","Kun":"kp","Kuo":"ko","La":"la","Lai":"ll","Lan":"lj","Lang":"lh","Lao":"lk","Le":"le","Lei":"lz","Leng":"lg","Li":"li","Lia":"lw","Lian":"lm","Liang":"ld","Liao":"lc","Lie":"lx","Lin":"ln","Ling":"ly","Liu":"lq","Lo":"lo","Long":"ls","Lou":"lb","Lu":"lu","Luan":"lr","Lun":"lp","Luo":"lo","Ma":"ma","Mai":"ml","Man":"mj","Mang":"mh","Mao":"mk","Me":"me","Mei":"mz","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mm","Miao":"mc","Mie":"mx","Min":"mn","Ming":"my","Miu":"mq","Mo":"mo","Mou":"mb","Mu":"mu","Na":"na","Nai":"nl","Nan":"nj","Nang":"nh","Nao":"nk","Ne":"ne","Nei":"nz","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nm","Niang":"nd","Niao":"nc","Nie":"nx","Nin":"nn","Ning":"ny","Niu":"nq","Nong":"ns","Nou":"nb","Nu":"nu","Nuan":"nr","Nun":"np","Nuo":"no","Pa":"pa","Pai":"pl","Pan":"pj","Pang":"ph","Pao":"pk","Pei":"pz","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pm","Piao":"pc","Pie":"px","Pin":"pn","Ping":"py","Po":"po","Pou":"pb","Pu":"pu","Qi":"qi","Qia":"qw","Qian":"qm","Qiang":"qd","Qiao":"qc","Qie":"qx","Qin":"qn","Qing":"qy","Qiong":"qs","Qiu":"qq","Qu":"qu","Quan":"qr","Que":"qt","Qun":"qp","Ran":"rj","Rang":"rh","Rao":"rk","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rb","Ru":"ru","Rua":"rw","Ruan":"rr","Rui":"rv","Run":"rp","Ruo":"ro","Sa":"sa","Sai":"sl","San":"sj","Sang":"sh","Sao":"sk","Se":"se","Sen":"sf","Seng":"sg","Sha":"ua","Shai":"ul","Shan":"uj","Shang":"uh","Shao":"uk","She":"ue","Shei":"uz","Shen":"uf","Sheng":"ug","Shi":"ui","Shou":"ub","Shu":"uu","Shua":"uw","Shuai":"uy","Shuan":"ur","Shuang":"ud","Shui":"uv","Shun":"up","Shuo":"uo","Si":"si","Song":"ss","Sou":"sb","Su":"su","Suan":"sr","Sui":"sv","Sun":"sp","Suo":"so","Ta":"ta","Tai":"tl","Tan":"tj","Tang":"th","Tao":"tk","Te":"te","Tei":"tz","Teng":"tg","Ti":"ti","Tian":"tm","Tiao":"tc","Tie":"tx","Ting":"ty","Tong":"ts","Tou":"tb","Tu":"tu","Tuan":"tr","Tui":"tv","Tun":"tp","Tuo":"to","Xi":"xi","Xia":"xw","Xian":"xm","Xiang":"xd","Xiao":"xc","Xie":"xx","Xin":"xn","Xing":"xy","Xiong":"xs","Xiu":"xq","Xu":"xu","Xuan":"xr","Xue":"xt","Xun":"xp","Za":"za","Zai":"zl","Zan":"zj","Zang":"zh","Zao":"zk","Ze":"ze","Zei":"zz","Zen":"zf","Zeng":"zg","Zha":"va","Zhai":"vl","Zhan":"vj","Zhang":"vh","Zhao":"vk","Zhe":"ve","Zhen":"vf","Zheng":"vg","Zhi":"vi","Zhong":"vs","Zhou":"vb","Zhu":"vu","Zhua":"vw","Zhuai":"vy","Zhuan":"vr","Zhuang":"vd","Zhui":"vv","Zhun":"vp","Zhuo":"vo","Zi":"zi","Zong":"zs","Zou":"zb","Zu":"zu","Zuan":"zr","Zui":"zv","Zun":"zp","Zuo":"zo"},"WeiRuan":{"Lv":"ly","Lve":"lt","Lue":"lt","Nv":"ny","Nve":"nt","Nue":"nt","A":"oa","O":"oo","E":"oe","Ai":"ol","Ei":"oz","Ao":"ok","Ou":"ob","An":"oj","En":"of","Ang":"oh","Eng":"og","Er":"or","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yk","You":"yb","Yan":"yj","Yin":"yn","Yang":"yh","Ying":"y;","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wl","Wei":"wz","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"yt","Yuan":"yr","Yun":"yp","Yong":"ys","Ba":"ba","Bai":"bl","Ban":"bj","Bang":"bh","Bao":"bk","Bei":"bz","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bm","Biang":"bd","Biao":"bc","Bie":"bx","Bin":"bn","Bing":"b;","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cl","Can":"cj","Cang":"ch","Cao":"ck","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ia","Chai":"il","Chan":"ij","Chang":"ih","Chao":"ik","Che":"ie","Chen":"if","Cheng":"ig","Chi":"ii","Chong":"is","Chou":"ib","Chu":"iu","Chua":"iw","Chuai":"iy","Chuan":"ir","Chuang":"id","Chui":"iv","Chun":"ip","Chuo":"io","Ci":"ci","Cong":"cs","Cou":"cb","Cu":"cu","Cuan":"cr","Cui":"cv","Cun":"cp","Cuo":"co","Da":"da","Dai":"dl","Dan":"dj","Dang":"dh","Dao":"dk","De":"de","Dei":"dz","Den":"df","Deng":"dg","Di":"di","Dia":"dw","Dian":"dm","Diao":"dc","Die":"dx","Ding":"d;","Diu":"dq","Dong":"ds","Dou":"db","Du":"du","Duan":"dr","Dui":"dv","Dun":"dp","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fz","Fen":"ff","Feng":"fg","Fiao":"fc","Fo":"fo","Fou":"fb","Fu":"fu","Ga":"ga","Gai":"gl","Gan":"gj","Gang":"gh","Gao":"gk","Ge":"ge","Gei":"gz","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gb","Gu":"gu","Gua":"gw","Guai":"gy","Guan":"gr","Guang":"gd","Gui":"gv","Gun":"gp","Guo":"go","Ha":"ha","Hai":"hl","Han":"hj","Hang":"hh","Hao":"hk","He":"he","Hei":"hz","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hb","Hu":"hu","Hua":"hw","Huai":"hy","Huan":"hr","Huang":"hd","Hui":"hv","Hun":"hp","Huo":"ho","Ji":"ji","Jia":"jw","Jian":"jm","Jiang":"jd","Jiao":"jc","Jie":"jx","Jin":"jn","Jing":"j;","Jiong":"js","Jiu":"jq","Ju":"ju","Juan":"jr","Jue":"jt","Jun":"jp","Ka":"ka","Kai":"kl","Kan":"kj","Kang":"kh","Kao":"kk","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kb","Ku":"ku","Kua":"kw","Kuai":"ky","Kuan":"kr","Kuang":"kd","Kui":"kv","Kun":"kp","Kuo":"ko","La":"la","Lai":"ll","Lan":"lj","Lang":"lh","Lao":"lk","Le":"le","Lei":"lz","Leng":"lg","Li":"li","Lia":"lw","Lian":"lm","Liang":"ld","Liao":"lc","Lie":"lx","Lin":"ln","Ling":"l;","Liu":"lq","Lo":"lo","Long":"ls","Lou":"lb","Lu":"lu","Luan":"lr","Lun":"lp","Luo":"lo","Ma":"ma","Mai":"ml","Man":"mj","Mang":"mh","Mao":"mk","Me":"me","Mei":"mz","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mm","Miao":"mc","Mie":"mx","Min":"mn","Ming":"m;","Miu":"mq","Mo":"mo","Mou":"mb","Mu":"mu","Na":"na","Nai":"nl","Nan":"nj","Nang":"nh","Nao":"nk","Ne":"ne","Nei":"nz","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nm","Niang":"nd","Niao":"nc","Nie":"nx","Nin":"nn","Ning":"n;","Niu":"nq","Nong":"ns","Nou":"nb","Nu":"nu","Nuan":"nr","Nun":"np","Nuo":"no","Pa":"pa","Pai":"pl","Pan":"pj","Pang":"ph","Pao":"pk","Pei":"pz","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pm","Piao":"pc","Pie":"px","Pin":"pn","Ping":"p;","Po":"po","Pou":"pb","Pu":"pu","Qi":"qi","Qia":"qw","Qian":"qm","Qiang":"qd","Qiao":"qc","Qie":"qx","Qin":"qn","Qing":"q;","Qiong":"qs","Qiu":"qq","Qu":"qu","Quan":"qr","Que":"qt","Qun":"qp","Ran":"rj","Rang":"rh","Rao":"rk","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rb","Ru":"ru","Rua":"rw","Ruan":"rr","Rui":"rv","Run":"rp","Ruo":"ro","Sa":"sa","Sai":"sl","San":"sj","Sang":"sh","Sao":"sk","Se":"se","Sen":"sf","Seng":"sg","Sha":"ua","Shai":"ul","Shan":"uj","Shang":"uh","Shao":"uk","She":"ue","Shei":"uz","Shen":"uf","Sheng":"ug","Shi":"ui","Shou":"ub","Shu":"uu","Shua":"uw","Shuai":"uy","Shuan":"ur","Shuang":"ud","Shui":"uv","Shun":"up","Shuo":"uo","Si":"si","Song":"ss","Sou":"sb","Su":"su","Suan":"sr","Sui":"sv","Sun":"sp","Suo":"so","Ta":"ta","Tai":"tl","Tan":"tj","Tang":"th","Tao":"tk","Te":"te","Tei":"tz","Teng":"tg","Ti":"ti","Tian":"tm","Tiao":"tc","Tie":"tx","Ting":"t;","Tong":"ts","Tou":"tb","Tu":"tu","Tuan":"tr","Tui":"tv","Tun":"tp","Tuo":"to","Xi":"xi","Xia":"xw","Xian":"xm","Xiang":"xd","Xiao":"xc","Xie":"xx","Xin":"xn","Xing":"x;","Xiong":"xs","Xiu":"xq","Xu":"xu","Xuan":"xr","Xue":"xt","Xun":"xp","Za":"za","Zai":"zl","Zan":"zj","Zang":"zh","Zao":"zk","Ze":"ze","Zei":"zz","Zen":"zf","Zeng":"zg","Zha":"va","Zhai":"vl","Zhan":"vj","Zhang":"vh","Zhao":"vk","Zhe":"ve","Zhen":"vf","Zheng":"vg","Zhi":"vi","Zhong":"vs","Zhou":"vb","Zhu":"vu","Zhua":"vw","Zhuai":"vy","Zhuan":"vr","Zhuang":"vd","Zhui":"vv","Zhun":"vp","Zhuo":"vo","Zi":"zi","Zong":"zs","Zou":"zb","Zu":"zu","Zuan":"zr","Zui":"zv","Zun":"zp","Zuo":"zo"},"ZhiNengABC":{"Lv":"lv","Lve":"lm","Lue":"lm","Nv":"nv","Nve":"nm","Nue":"nm","A":"oa","O":"oo","E":"oe","Ai":"ol","Ei":"oq","Ao":"ok","Ou":"ob","An":"oj","En":"of","Ang":"oh","Eng":"og","Er":"or","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yk","You":"yb","Yan":"yj","Yin":"yc","Yang":"yh","Ying":"yy","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wl","Wei":"wq","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"ym","Yuan":"yp","Yun":"yn","Yong":"ys","Ba":"ba","Bai":"bl","Ban":"bj","Bang":"bh","Bao":"bk","Bei":"bq","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bw","Biang":"bt","Biao":"bz","Bie":"bx","Bin":"bc","Bing":"by","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cl","Can":"cj","Cang":"ch","Cao":"ck","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ea","Chai":"el","Chan":"ej","Chang":"eh","Chao":"ek","Che":"ee","Chen":"ef","Cheng":"eg","Chi":"ei","Chong":"es","Chou":"eb","Chu":"eu","Chua":"ed","Chuai":"ec","Chuan":"ep","Chuang":"et","Chui":"em","Chun":"en","Chuo":"eo","Ci":"ci","Cong":"cs","Cou":"cb","Cu":"cu","Cuan":"cp","Cui":"cm","Cun":"cn","Cuo":"co","Da":"da","Dai":"dl","Dan":"dj","Dang":"dh","Dao":"dk","De":"de","Dei":"dq","Den":"df","Deng":"dg","Di":"di","Dia":"dd","Dian":"dw","Diao":"dz","Die":"dx","Ding":"dy","Diu":"dr","Dong":"ds","Dou":"db","Du":"du","Duan":"dp","Dui":"dm","Dun":"dn","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fq","Fen":"ff","Feng":"fg","Fiao":"fz","Fo":"fo","Fou":"fb","Fu":"fu","Ga":"ga","Gai":"gl","Gan":"gj","Gang":"gh","Gao":"gk","Ge":"ge","Gei":"gq","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gb","Gu":"gu","Gua":"gd","Guai":"gc","Guan":"gp","Guang":"gt","Gui":"gm","Gun":"gn","Guo":"go","Ha":"ha","Hai":"hl","Han":"hj","Hang":"hh","Hao":"hk","He":"he","Hei":"hq","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hb","Hu":"hu","Hua":"hd","Huai":"hc","Huan":"hp","Huang":"ht","Hui":"hm","Hun":"hn","Huo":"ho","Ji":"ji","Jia":"jd","Jian":"jw","Jiang":"jt","Jiao":"jz","Jie":"jx","Jin":"jc","Jing":"jy","Jiong":"js","Jiu":"jr","Ju":"ju","Juan":"jp","Jue":"jm","Jun":"jn","Ka":"ka","Kai":"kl","Kan":"kj","Kang":"kh","Kao":"kk","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kb","Ku":"ku","Kua":"kd","Kuai":"kc","Kuan":"kp","Kuang":"kt","Kui":"km","Kun":"kn","Kuo":"ko","La":"la","Lai":"ll","Lan":"lj","Lang":"lh","Lao":"lk","Le":"le","Lei":"lq","Leng":"lg","Li":"li","Lia":"ld","Lian":"lw","Liang":"lt","Liao":"lz","Lie":"lx","Lin":"lc","Ling":"ly","Liu":"lr","Lo":"lo","Long":"ls","Lou":"lb","Lu":"lu","Luan":"lp","Lun":"ln","Luo":"lo","Ma":"ma","Mai":"ml","Man":"mj","Mang":"mh","Mao":"mk","Me":"me","Mei":"mq","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mw","Miao":"mz","Mie":"mx","Min":"mc","Ming":"my","Miu":"mr","Mo":"mo","Mou":"mb","Mu":"mu","Na":"na","Nai":"nl","Nan":"nj","Nang":"nh","Nao":"nk","Ne":"ne","Nei":"nq","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nw","Niang":"nt","Niao":"nz","Nie":"nx","Nin":"nc","Ning":"ny","Niu":"nr","Nong":"ns","Nou":"nb","Nu":"nu","Nuan":"np","Nun":"nn","Nuo":"no","Pa":"pa","Pai":"pl","Pan":"pj","Pang":"ph","Pao":"pk","Pei":"pq","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pw","Piao":"pz","Pie":"px","Pin":"pc","Ping":"py","Po":"po","Pou":"pb","Pu":"pu","Qi":"qi","Qia":"qd","Qian":"qw","Qiang":"qt","Qiao":"qz","Qie":"qx","Qin":"qc","Qing":"qy","Qiong":"qs","Qiu":"qr","Qu":"qu","Quan":"qp","Que":"qm","Qun":"qn","Ran":"rj","Rang":"rh","Rao":"rk","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rb","Ru":"ru","Rua":"rd","Ruan":"rp","Rui":"rm","Run":"rn","Ruo":"ro","Sa":"sa","Sai":"sl","San":"sj","Sang":"sh","Sao":"sk","Se":"se","Sen":"sf","Seng":"sg","Sha":"va","Shai":"vl","Shan":"vj","Shang":"vh","Shao":"vk","She":"ve","Shei":"vq","Shen":"vf","Sheng":"vg","Shi":"vi","Shou":"vb","Shu":"vu","Shua":"vd","Shuai":"vc","Shuan":"vp","Shuang":"vt","Shui":"vm","Shun":"vn","Shuo":"vo","Si":"si","Song":"ss","Sou":"sb","Su":"su","Suan":"sp","Sui":"sm","Sun":"sn","Suo":"so","Ta":"ta","Tai":"tl","Tan":"tj","Tang":"th","Tao":"tk","Te":"te","Tei":"tq","Teng":"tg","Ti":"ti","Tian":"tw","Tiao":"tz","Tie":"tx","Ting":"ty","Tong":"ts","Tou":"tb","Tu":"tu","Tuan":"tp","Tui":"tm","Tun":"tn","Tuo":"to","Xi":"xi","Xia":"xd","Xian":"xw","Xiang":"xt","Xiao":"xz","Xie":"xx","Xin":"xc","Xing":"xy","Xiong":"xs","Xiu":"xr","Xu":"xu","Xuan":"xp","Xue":"xm","Xun":"xn","Za":"za","Zai":"zl","Zan":"zj","Zang":"zh","Zao":"zk","Ze":"ze","Zei":"zq","Zen":"zf","Zeng":"zg","Zha":"aa","Zhai":"al","Zhan":"aj","Zhang":"ah","Zhao":"ak","Zhe":"ae","Zhen":"af","Zheng":"ag","Zhi":"ai","Zhong":"as","Zhou":"ab","Zhu":"au","Zhua":"ad","Zhuai":"ac","Zhuan":"ap","Zhuang":"at","Zhui":"am","Zhun":"an","Zhuo":"ao","Zi":"zi","Zong":"zs","Zou":"zb","Zu":"zu","Zuan":"zp","Zui":"zm","Zun":"zn","Zuo":"zo"},"ZiGuangPinYin":{"Lv":"lv","Lve":"ln","Lue":"ln","Nv":"nv","Nve":"nn","Nue":"nn","A":"oa","O":"oo","E":"oe","Ai":"op","Ei":"ok","Ao":"oq","Ou":"oz","An":"or","En":"ow","Ang":"os","Eng":"ot","Er":"oj","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yq","You":"yz","Yan":"yr","Yin":"yy","Yang":"ys","Ying":"yc","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wp","Wei":"wk","Wan":"wr","Wen":"ww","Wang":"ws","Weng":"wt","Yu":"yu","Yue":"yn","Yuan":"yl","Yun":"ym","Yong":"yh","Ba":"ba","Bai":"bp","Ban":"br","Bang":"bs","Bao":"bq","Bei":"bk","Ben":"bw","Beng":"bt","Bi":"bi","Bian":"bf","Biang":"bg","Biao":"bb","Bie":"bd","Bin":"by","Bing":"bc","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cp","Can":"cr","Cang":"cs","Cao":"cq","Ce":"ce","Cen":"cw","Ceng":"ct","Cha":"aa","Chai":"ap","Chan":"ar","Chang":"as","Chao":"aq","Che":"ae","Chen":"aw","Cheng":"at","Chi":"ai","Chong":"ah","Chou":"az","Chu":"au","Chua":"ax","Chuai":"ay","Chuan":"al","Chuang":"ag","Chui":"an","Chun":"am","Chuo":"ao","Ci":"ci","Cong":"ch","Cou":"cz","Cu":"cu","Cuan":"cl","Cui":"cn","Cun":"cm","Cuo":"co","Da":"da","Dai":"dp","Dan":"dr","Dang":"ds","Dao":"dq","De":"de","Dei":"dk","Den":"dw","Deng":"dt","Di":"di","Dia":"dx","Dian":"df","Diao":"db","Die":"dd","Ding":"dc","Diu":"dj","Dong":"dh","Dou":"dz","Du":"du","Duan":"dl","Dui":"dn","Dun":"dm","Duo":"do","Fa":"fa","Fan":"fr","Fang":"fs","Fei":"fk","Fen":"fw","Feng":"ft","Fiao":"fb","Fo":"fo","Fou":"fz","Fu":"fu","Ga":"ga","Gai":"gp","Gan":"gr","Gang":"gs","Gao":"gq","Ge":"ge","Gei":"gk","Gen":"gw","Geng":"gt","Gong":"gh","Gou":"gz","Gu":"gu","Gua":"gx","Guai":"gy","Guan":"gl","Guang":"gg","Gui":"gn","Gun":"gm","Guo":"go","Ha":"ha","Hai":"hp","Han":"hr","Hang":"hs","Hao":"hq","He":"he","Hei":"hk","Hen":"hw","Heng":"ht","Hong":"hh","Hou":"hz","Hu":"hu","Hua":"hx","Huai":"hy","Huan":"hl","Huang":"hg","Hui":"hn","Hun":"hm","Huo":"ho","Ji":"ji","Jia":"jx","Jian":"jf","Jiang":"jg","Jiao":"jb","Jie":"jd","Jin":"jy","Jing":"jc","Jiong":"jh","Jiu":"jj","Ju":"ju","Juan":"jl","Jue":"jn","Jun":"jm","Ka":"ka","Kai":"kp","Kan":"kr","Kang":"ks","Kao":"kq","Ke":"ke","Ken":"kw","Keng":"kt","Kong":"kh","Kou":"kz","Ku":"ku","Kua":"kx","Kuai":"ky","Kuan":"kl","Kuang":"kg","Kui":"kn","Kun":"km","Kuo":"ko","La":"la","Lai":"lp","Lan":"lr","Lang":"ls","Lao":"lq","Le":"le","Lei":"lk","Leng":"lt","Li":"li","Lia":"lx","Lian":"lf","Liang":"lg","Liao":"lb","Lie":"ld","Lin":"ly","Ling":"lc","Liu":"lj","Lo":"lo","Long":"lh","Lou":"lz","Lu":"lu","Luan":"ll","Lun":"lm","Luo":"lo","Ma":"ma","Mai":"mp","Man":"mr","Mang":"ms","Mao":"mq","Me":"me","Mei":"mk","Men":"mw","Meng":"mt","Mi":"mi","Mian":"mf","Miao":"mb","Mie":"md","Min":"my","Ming":"mc","Miu":"mj","Mo":"mo","Mou":"mz","Mu":"mu","Na":"na","Nai":"np","Nan":"nr","Nang":"ns","Nao":"nq","Ne":"ne","Nei":"nk","Nen":"nw","Neng":"nt","Ni":"ni","Nian":"nf","Niang":"ng","Niao":"nb","Nie":"nd","Nin":"ny","Ning":"nc","Niu":"nj","Nong":"nh","Nou":"nz","Nu":"nu","Nuan":"nl","Nun":"nm","Nuo":"no","Pa":"pa","Pai":"pp","Pan":"pr","Pang":"ps","Pao":"pq","Pei":"pk","Pen":"pw","Peng":"pt","Pi":"pi","Pian":"pf","Piao":"pb","Pie":"pd","Pin":"py","Ping":"pc","Po":"po","Pou":"pz","Pu":"pu","Qi":"qi","Qia":"qx","Qian":"qf","Qiang":"qg","Qiao":"qb","Qie":"qd","Qin":"qy","Qing":"qc","Qiong":"qh","Qiu":"qj","Qu":"qu","Quan":"ql","Que":"qn","Qun":"qm","Ran":"rr","Rang":"rs","Rao":"rq","Re":"re","Ren":"rw","Reng":"rt","Ri":"ri","Rong":"rh","Rou":"rz","Ru":"ru","Rua":"rx","Ruan":"rl","Rui":"rn","Run":"rm","Ruo":"ro","Sa":"sa","Sai":"sp","San":"sr","Sang":"ss","Sao":"sq","Se":"se","Sen":"sw","Seng":"st","Sha":"ia","Shai":"ip","Shan":"ir","Shang":"is","Shao":"iq","She":"ie","Shei":"ik","Shen":"iw","Sheng":"it","Shi":"ii","Shou":"iz","Shu":"iu","Shua":"ix","Shuai":"iy","Shuan":"il","Shuang":"ig","Shui":"in","Shun":"im","Shuo":"io","Si":"si","Song":"sh","Sou":"sz","Su":"su","Suan":"sl","Sui":"sn","Sun":"sm","Suo":"so","Ta":"ta","Tai":"tp","Tan":"tr","Tang":"ts","Tao":"tq","Te":"te","Tei":"tk","Teng":"tt","Ti":"ti","Tian":"tf","Tiao":"tb","Tie":"td","Ting":"tc","Tong":"th","Tou":"tz","Tu":"tu","Tuan":"tl","Tui":"tn","Tun":"tm","Tuo":"to","Xi":"xi","Xia":"xx","Xian":"xf","Xiang":"xg","Xiao":"xb","Xie":"xd","Xin":"xy","Xing":"xc","Xiong":"xh","Xiu":"xj","Xu":"xu","Xuan":"xl","Xue":"xn","Xun":"xm","Za":"za","Zai":"zp","Zan":"zr","Zang":"zs","Zao":"zq","Ze":"ze","Zei":"zk","Zen":"zw","Zeng":"zt","Zha":"ua","Zhai":"up","Zhan":"ur","Zhang":"us","Zhao":"uq","Zhe":"ue","Zhen":"uw","Zheng":"ut","Zhi":"ui","Zhong":"uh","Zhou":"uz","Zhu":"uu","Zhua":"ux","Zhuai":"uy","Zhuan":"ul","Zhuang":"ug","Zhui":"un","Zhun":"um","Zhuo":"uo","Zi":"zi","Zong":"zh","Zou":"zz","Zu":"zu","Zuan":"zl","Zui":"zn","Zun":"zm","Zuo":"zo"},"PinYinJiaJia":{"Lv":"lv","Lve":"lx","Lue":"lx","Nv":"nv","Nve":"nx","Nue":"nx","A":"aa","O":"oo","E":"ee","Ai":"as","Ei":"ew","Ao":"ad","Ou":"op","An":"af","En":"er","Ang":"ag","Eng":"et","Er":"eq","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yd","You":"yp","Yan":"yf","Yin":"yl","Yang":"yg","Ying":"yq","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"ws","Wei":"ww","Wan":"wf","Wen":"wr","Wang":"wg","Weng":"wt","Yu":"yu","Yue":"yx","Yuan":"yc","Yun":"yz","Yong":"yy","Ba":"ba","Bai":"bs","Ban":"bf","Bang":"bg","Bao":"bd","Bei":"bw","Ben":"br","Beng":"bt","Bi":"bi","Bian":"bj","Biang":"bh","Biao":"bk","Bie":"bm","Bin":"bl","Bing":"bq","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cs","Can":"cf","Cang":"cg","Cao":"cd","Ce":"ce","Cen":"cr","Ceng":"ct","Cha":"ua","Chai":"us","Chan":"uf","Chang":"ug","Chao":"ud","Che":"ue","Chen":"ur","Cheng":"ut","Chi":"ui","Chong":"uy","Chou":"up","Chu":"uu","Chua":"ub","Chuai":"ux","Chuan":"uc","Chuang":"uh","Chui":"uv","Chun":"uz","Chuo":"uo","Ci":"ci","Cong":"cy","Cou":"cp","Cu":"cu","Cuan":"cc","Cui":"cv","Cun":"cz","Cuo":"co","Da":"da","Dai":"ds","Dan":"df","Dang":"dg","Dao":"dd","De":"de","Dei":"dw","Den":"dr","Deng":"dt","Di":"di","Dia":"db","Dian":"dj","Diao":"dk","Die":"dm","Ding":"dq","Diu":"dn","Dong":"dy","Dou":"dp","Du":"du","Duan":"dc","Dui":"dv","Dun":"dz","Duo":"do","Fa":"fa","Fan":"ff","Fang":"fg","Fei":"fw","Fen":"fr","Feng":"ft","Fiao":"fk","Fo":"fo","Fou":"fp","Fu":"fu","Ga":"ga","Gai":"gs","Gan":"gf","Gang":"gg","Gao":"gd","Ge":"ge","Gei":"gw","Gen":"gr","Geng":"gt","Gong":"gy","Gou":"gp","Gu":"gu","Gua":"gb","Guai":"gx","Guan":"gc","Guang":"gh","Gui":"gv","Gun":"gz","Guo":"go","Ha":"ha","Hai":"hs","Han":"hf","Hang":"hg","Hao":"hd","He":"he","Hei":"hw","Hen":"hr","Heng":"ht","Hong":"hy","Hou":"hp","Hu":"hu","Hua":"hb","Huai":"hx","Huan":"hc","Huang":"hh","Hui":"hv","Hun":"hz","Huo":"ho","Ji":"ji","Jia":"jb","Jian":"jj","Jiang":"jh","Jiao":"jk","Jie":"jm","Jin":"jl","Jing":"jq","Jiong":"jy","Jiu":"jn","Ju":"ju","Juan":"jc","Jue":"jx","Jun":"jz","Ka":"ka","Kai":"ks","Kan":"kf","Kang":"kg","Kao":"kd","Ke":"ke","Ken":"kr","Keng":"kt","Kong":"ky","Kou":"kp","Ku":"ku","Kua":"kb","Kuai":"kx","Kuan":"kc","Kuang":"kh","Kui":"kv","Kun":"kz","Kuo":"ko","La":"la","Lai":"ls","Lan":"lf","Lang":"lg","Lao":"ld","Le":"le","Lei":"lw","Leng":"lt","Li":"li","Lia":"lb","Lian":"lj","Liang":"lh","Liao":"lk","Lie":"lm","Lin":"ll","Ling":"lq","Liu":"ln","Lo":"lo","Long":"ly","Lou":"lp","Lu":"lu","Luan":"lc","Lun":"lz","Luo":"lo","Ma":"ma","Mai":"ms","Man":"mf","Mang":"mg","Mao":"md","Me":"me","Mei":"mw","Men":"mr","Meng":"mt","Mi":"mi","Mian":"mj","Miao":"mk","Mie":"mm","Min":"ml","Ming":"mq","Miu":"mn","Mo":"mo","Mou":"mp","Mu":"mu","Na":"na","Nai":"ns","Nan":"nf","Nang":"ng","Nao":"nd","Ne":"ne","Nei":"nw","Nen":"nr","Neng":"nt","Ni":"ni","Nian":"nj","Niang":"nh","Niao":"nk","Nie":"nm","Nin":"nl","Ning":"nq","Niu":"nn","Nong":"ny","Nou":"np","Nu":"nu","Nuan":"nc","Nun":"nz","Nuo":"no","Pa":"pa","Pai":"ps","Pan":"pf","Pang":"pg","Pao":"pd","Pei":"pw","Pen":"pr","Peng":"pt","Pi":"pi","Pian":"pj","Piao":"pk","Pie":"pm","Pin":"pl","Ping":"pq","Po":"po","Pou":"pp","Pu":"pu","Qi":"qi","Qia":"qb","Qian":"qj","Qiang":"qh","Qiao":"qk","Qie":"qm","Qin":"ql","Qing":"qq","Qiong":"qy","Qiu":"qn","Qu":"qu","Quan":"qc","Que":"qx","Qun":"qz","Ran":"rf","Rang":"rg","Rao":"rd","Re":"re","Ren":"rr","Reng":"rt","Ri":"ri","Rong":"ry","Rou":"rp","Ru":"ru","Rua":"rb","Ruan":"rc","Rui":"rv","Run":"rz","Ruo":"ro","Sa":"sa","Sai":"ss","San":"sf","Sang":"sg","Sao":"sd","Se":"se","Sen":"sr","Seng":"st","Sha":"ia","Shai":"is","Shan":"if","Shang":"ig","Shao":"id","She":"ie","Shei":"iw","Shen":"ir","Sheng":"it","Shi":"ii","Shou":"ip","Shu":"iu","Shua":"ib","Shuai":"ix","Shuan":"ic","Shuang":"ih","Shui":"iv","Shun":"iz","Shuo":"io","Si":"si","Song":"sy","Sou":"sp","Su":"su","Suan":"sc","Sui":"sv","Sun":"sz","Suo":"so","Ta":"ta","Tai":"ts","Tan":"tf","Tang":"tg","Tao":"td","Te":"te","Tei":"tw","Teng":"tt","Ti":"ti","Tian":"tj","Tiao":"tk","Tie":"tm","Ting":"tq","Tong":"ty","Tou":"tp","Tu":"tu","Tuan":"tc","Tui":"tv","Tun":"tz","Tuo":"to","Xi":"xi","Xia":"xb","Xian":"xj","Xiang":"xh","Xiao":"xk","Xie":"xm","Xin":"xl","Xing":"xq","Xiong":"xy","Xiu":"xn","Xu":"xu","Xuan":"xc","Xue":"xx","Xun":"xz","Za":"za","Zai":"zs","Zan":"zf","Zang":"zg","Zao":"zd","Ze":"ze","Zei":"zw","Zen":"zr","Zeng":"zt","Zha":"va","Zhai":"vs","Zhan":"vf","Zhang":"vg","Zhao":"vd","Zhe":"ve","Zhen":"vr","Zheng":"vt","Zhi":"vi","Zhong":"vy","Zhou":"vp","Zhu":"vu","Zhua":"vb","Zhuai":"vx","Zhuan":"vc","Zhuang":"vh","Zhui":"vv","Zhun":"vz","Zhuo":"vo","Zi":"zi","Zong":"zy","Zou":"zp","Zu":"zu","Zuan":"zc","Zui":"zv","Zun":"zz","Zuo":"zo"},"XingKongJianDao":{"Lv":"lv","Lve":"ly","Lue":"ly","Nv":"nv","Nve":"ny","Nue":"ny","A":"xa","O":"xo","E":"xe","Ai":"xj","Ei":"xw","Ao":"xs","Ou":"xt","An":"xd","En":"xk","Ang":"xf","Eng":"xh","Er":"xu","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"ys","You":"yt","Yan":"yd","Yin":"yb","Yang":"yf","Ying":"yg","Wu":"wj","Wa":"ws","Wo":"wo","Wai":"wh","Wei":"ww","Wan":"wf","Wen":"wn","Wang":"wp","Weng":"wr","Yu":"yv","Yue":"yy","Yuan":"yr","Yun":"yw","Yong":"yl","Ba":"ba","Bai":"bj","Ban":"bd","Bang":"bf","Bao":"bs","Bei":"bw","Ben":"bk","Beng":"bh","Bi":"bi","Bian":"bm","Biang":"bx","Biao":"bp","Bie":"bc","Bin":"bb","Bing":"bg","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cj","Can":"cd","Cang":"cf","Cao":"cs","Ce":"ce","Cen":"ck","Ceng":"ch","Cha":"ja","Chai":"jj","Chan":"jd","Chang":"jf","Chao":"js","Che":"je","Chen":"jk","Cheng":"jh","Chi":"wi","Chong":"wl","Chou":"jt","Chu":"ju","Chua":"wx","Chuai":"wg","Chuan":"wr","Chuang":"wn","Chui":"wy","Chun":"jz","Chuo":"jo","Ci":"ci","Cong":"cl","Cou":"ct","Cu":"cu","Cuan":"cr","Cui":"cy","Cun":"cz","Cuo":"co","Da":"da","Dai":"dj","Dan":"dd","Dang":"df","Dao":"ds","De":"de","Dei":"dw","Den":"dk","Deng":"dh","Di":"di","Dia":"dx","Dian":"dm","Diao":"dp","Die":"dc","Ding":"dg","Diu":"dq","Dong":"dl","Dou":"dt","Du":"du","Duan":"dr","Dui":"dy","Dun":"dz","Duo":"do","Fa":"fs","Fan":"ff","Fang":"fp","Fei":"fw","Fen":"fn","Feng":"fr","Fiao":"fp","Fo":"fl","Fou":"fd","Fu":"fl","Ga":"ga","Gai":"gj","Gan":"gd","Gang":"gf","Gao":"gs","Ge":"ge","Gei":"gw","Gen":"gk","Geng":"gh","Gong":"gl","Gou":"gt","Gu":"gu","Gua":"gx","Guai":"gg","Guan":"gr","Guang":"gn","Gui":"gy","Gun":"gz","Guo":"go","Ha":"ha","Hai":"hj","Han":"hd","Hang":"hf","Hao":"hs","He":"he","Hei":"hw","Hen":"hk","Heng":"hh","Hong":"hl","Hou":"ht","Hu":"hu","Hua":"hx","Huai":"hg","Huan":"hr","Huang":"hn","Hui":"hy","Hun":"hz","Huo":"ho","Ji":"jk","Jia":"js","Jian":"jm","Jiang":"jn","Jiao":"jp","Jie":"jc","Jin":"jb","Jing":"jg","Jiong":"jy","Jiu":"jq","Ju":"jv","Juan":"jt","Jue":"jh","Jun":"jw","Ka":"ka","Kai":"kj","Kan":"kd","Kang":"kf","Kao":"ks","Ke":"ke","Ken":"kk","Keng":"kh","Kong":"kl","Kou":"kt","Ku":"ku","Kua":"kx","Kuai":"kg","Kuan":"kr","Kuang":"kn","Kui":"ky","Kun":"kz","Kuo":"ko","La":"la","Lai":"lj","Lan":"ld","Lang":"lf","Lao":"ls","Le":"le","Lei":"lw","Leng":"lh","Li":"li","Lia":"lx","Lian":"lm","Liang":"ln","Liao":"lp","Lie":"lc","Lin":"lb","Ling":"lg","Liu":"lq","Lo":"ll","Long":"ll","Lou":"lt","Lu":"lu","Luan":"lr","Lun":"lz","Luo":"lo","Ma":"ma","Mai":"mj","Man":"md","Mang":"mf","Mao":"ms","Me":"me","Mei":"mw","Men":"mk","Meng":"mh","Mi":"mi","Mian":"mm","Miao":"mp","Mie":"mc","Min":"mb","Ming":"mg","Miu":"mq","Mo":"mo","Mou":"mt","Mu":"mu","Na":"na","Nai":"nj","Nan":"nd","Nang":"nf","Nao":"ns","Ne":"ne","Nei":"nw","Nen":"nk","Neng":"nh","Ni":"ni","Nian":"nm","Niang":"nn","Niao":"np","Nie":"nc","Nin":"nb","Ning":"ng","Niu":"nq","Nong":"nl","Nou":"nt","Nu":"nu","Nuan":"nr","Nun":"nz","Nuo":"no","Pa":"pa","Pai":"pj","Pan":"pd","Pang":"pf","Pao":"ps","Pei":"pw","Pen":"pk","Peng":"ph","Pi":"pi","Pian":"pm","Piao":"pp","Pie":"pc","Pin":"pb","Ping":"pg","Po":"po","Pou":"pt","Pu":"pu","Qi":"qk","Qia":"qs","Qian":"qm","Qiang":"qx","Qiao":"qp","Qie":"qc","Qin":"qb","Qing":"qg","Qiong":"qy","Qiu":"qq","Qu":"qv","Quan":"qt","Que":"qh","Qun":"qw","Ran":"rd","Rang":"rf","Rao":"rs","Re":"re","Ren":"rk","Reng":"rh","Ri":"ri","Rong":"rl","Rou":"rt","Ru":"ru","Rua":"rx","Ruan":"rr","Rui":"ry","Run":"rz","Ruo":"ro","Sa":"sa","Sai":"sj","San":"sd","Sang":"sf","Sao":"ss","Se":"se","Sen":"sk","Seng":"sh","Sha":"ea","Shai":"ej","Shan":"ed","Shang":"ef","Shao":"es","She":"ee","Shei":"ew","Shen":"ek","Sheng":"eh","Shi":"ei","Shou":"et","Shu":"eu","Shua":"ex","Shuai":"eg","Shuan":"er","Shuang":"en","Shui":"ey","Shun":"ez","Shuo":"eo","Si":"si","Song":"sl","Sou":"st","Su":"su","Suan":"sr","Sui":"sy","Sun":"sz","Suo":"so","Ta":"ta","Tai":"tj","Tan":"td","Tang":"tf","Tao":"ts","Te":"te","Tei":"tw","Teng":"th","Ti":"ti","Tian":"tm","Tiao":"tp","Tie":"tc","Ting":"tg","Tong":"tl","Tou":"tt","Tu":"tu","Tuan":"tr","Tui":"ty","Tun":"tz","Tuo":"to","Xi":"xi","Xia":"xx","Xian":"xm","Xiang":"xn","Xiao":"xp","Xie":"xc","Xin":"xb","Xing":"xg","Xiong":"xl","Xiu":"xq","Xu":"xv","Xuan":"xr","Xue":"xy","Xun":"xw","Za":"za","Zai":"zj","Zan":"zd","Zang":"zf","Zao":"zs","Ze":"ze","Zei":"zw","Zen":"zk","Zeng":"zh","Zha":"qa","Zhai":"fj","Zhan":"qd","Zhang":"qf","Zhao":"fs","Zhe":"fe","Zhen":"qk","Zheng":"qh","Zhi":"fi","Zhong":"fy","Zhou":"qt","Zhu":"qu","Zhua":"fx","Zhuai":"fg","Zhuan":"fr","Zhuang":"fn","Zhui":"fy","Zhun":"fz","Zhuo":"qo","Zi":"zi","Zong":"zl","Zou":"zt","Zu":"zu","Zuan":"zr","Zui":"zy","Zun":"zz","Zuo":"zo"},"DaNiu":{"Lv":"lv","Lve":"lx","Lue":"lx","Nv":"nv","Nve":"nx","Nue":"nx","A":"ea","O":"eo","E":"ee","Ai":"eh","Ei":"ew","Ao":"es","Ou":"er","An":"ed","En":"ek","Ang":"ef","Eng":"ej","Er":"eu","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"ys","You":"yr","Yan":"yd","Yin":"yb","Yang":"yf","Ying":"yg","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wh","Wei":"ww","Wan":"wd","Wen":"wk","Wang":"wf","Weng":"wj","Yu":"yu","Yue":"yh","Yuan":"yj","Yun":"yw","Yong":"yl","Ba":"ba","Bai":"bh","Ban":"bd","Bang":"bf","Bao":"bs","Bei":"bw","Ben":"bk","Beng":"bj","Bi":"bi","Bian":"bc","Biang":"bn","Biao":"bm","Bie":"bp","Bin":"bb","Bing":"bg","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"ch","Can":"cd","Cang":"cf","Cao":"cs","Ce":"ce","Cen":"ck","Ceng":"cj","Cha":"ia","Chai":"ih","Chan":"id","Chang":"if","Chao":"is","Che":"ie","Chen":"ik","Cheng":"ij","Chi":"ii","Chong":"il","Chou":"ir","Chu":"iu","Chua":"iq","Chuai":"ig","Chuan":"iz","Chuang":"ix","Chui":"in","Chun":"iy","Chuo":"io","Ci":"ci","Cong":"cl","Cou":"cr","Cu":"cu","Cuan":"cz","Cui":"cn","Cun":"cy","Cuo":"co","Da":"da","Dai":"dh","Dan":"dd","Dang":"df","Dao":"ds","De":"de","Dei":"dw","Den":"dk","Deng":"dj","Di":"di","Dia":"dk","Dian":"dc","Diao":"dm","Die":"dp","Ding":"dg","Diu":"dt","Dong":"dl","Dou":"dr","Du":"du","Duan":"dz","Dui":"dn","Dun":"dy","Duo":"do","Fa":"fa","Fan":"fd","Fang":"ff","Fei":"fw","Fen":"fk","Feng":"fj","Fiao":"fm","Fo":"fo","Fou":"fr","Fu":"fu","Ga":"ga","Gai":"gh","Gan":"gd","Gang":"gf","Gao":"gs","Ge":"ge","Gei":"gw","Gen":"gk","Geng":"gj","Gong":"gl","Gou":"gr","Gu":"gu","Gua":"gq","Guai":"gg","Guan":"gz","Guang":"gx","Gui":"gn","Gun":"gy","Guo":"go","Ha":"ha","Hai":"hh","Han":"hd","Hang":"hf","Hao":"hs","He":"he","Hei":"hw","Hen":"hk","Heng":"hj","Hong":"hl","Hou":"hr","Hu":"hu","Hua":"hq","Huai":"hg","Huan":"hz","Huang":"hx","Hui":"hn","Hun":"hy","Huo":"ho","Ji":"ji","Jia":"jk","Jian":"jc","Jiang":"jn","Jiao":"jm","Jie":"jp","Jin":"jb","Jing":"jg","Jiong":"jl","Jiu":"jt","Ju":"ju","Juan":"jj","Jue":"jh","Jun":"jw","Ka":"ka","Kai":"kh","Kan":"kd","Kang":"kf","Kao":"ks","Ke":"ke","Ken":"kk","Keng":"kj","Kong":"kl","Kou":"kr","Ku":"ku","Kua":"kq","Kuai":"kg","Kuan":"kz","Kuang":"kx","Kui":"kn","Kun":"ky","Kuo":"ko","La":"la","Lai":"lh","Lan":"ld","Lang":"lf","Lao":"ls","Le":"le","Lei":"lw","Leng":"lj","Li":"li","Lia":"lk","Lian":"lc","Liang":"ln","Liao":"lm","Lie":"lp","Lin":"lb","Ling":"lg","Liu":"lt","Lo":"lo","Long":"ll","Lou":"lr","Lu":"lu","Luan":"lz","Lun":"ly","Luo":"lo","Ma":"ma","Mai":"mh","Man":"md","Mang":"mf","Mao":"ms","Me":"me","Mei":"mw","Men":"mk","Meng":"mj","Mi":"mi","Mian":"mc","Miao":"mm","Mie":"mp","Min":"mb","Ming":"mg","Miu":"mt","Mo":"mo","Mou":"mr","Mu":"mu","Na":"na","Nai":"nh","Nan":"nd","Nang":"nf","Nao":"ns","Ne":"ne","Nei":"nw","Nen":"nk","Neng":"nj","Ni":"ni","Nian":"nc","Niang":"nn","Niao":"nm","Nie":"np","Nin":"nb","Ning":"ng","Niu":"nt","Nong":"nl","Nou":"nr","Nu":"nu","Nuan":"nz","Nun":"ny","Nuo":"no","Pa":"pa","Pai":"ph","Pan":"pd","Pang":"pf","Pao":"ps","Pei":"pw","Pen":"pk","Peng":"pj","Pi":"pi","Pian":"pc","Piao":"pm","Pie":"pp","Pin":"pb","Ping":"pg","Po":"po","Pou":"pr","Pu":"pu","Qi":"qi","Qia":"qk","Qian":"qc","Qiang":"qn","Qiao":"qm","Qie":"qp","Qin":"qb","Qing":"qg","Qiong":"ql","Qiu":"qt","Qu":"qu","Quan":"qj","Que":"qh","Qun":"qw","Ran":"rd","Rang":"rf","Rao":"rs","Re":"re","Ren":"rk","Reng":"rj","Ri":"ri","Rong":"rl","Rou":"rr","Ru":"ru","Rua":"rq","Ruan":"rz","Rui":"rn","Run":"ry","Ruo":"ro","Sa":"sa","Sai":"sh","San":"sd","Sang":"sf","Sao":"ss","Se":"se","Sen":"sk","Seng":"sj","Sha":"ua","Shai":"uh","Shan":"ud","Shang":"uf","Shao":"us","She":"ue","Shei":"uw","Shen":"uk","Sheng":"uj","Shi":"ui","Shou":"ur","Shu":"uu","Shua":"uq","Shuai":"ug","Shuan":"uz","Shuang":"ux","Shui":"un","Shun":"uy","Shuo":"uo","Si":"si","Song":"sl","Sou":"sr","Su":"su","Suan":"sz","Sui":"sn","Sun":"sy","Suo":"so","Ta":"ta","Tai":"th","Tan":"td","Tang":"tf","Tao":"ts","Te":"te","Tei":"tw","Teng":"tj","Ti":"ti","Tian":"tc","Tiao":"tm","Tie":"tp","Ting":"tg","Tong":"tl","Tou":"tr","Tu":"tu","Tuan":"tz","Tui":"tn","Tun":"ty","Tuo":"to","Xi":"xi","Xia":"xk","Xian":"xc","Xiang":"xn","Xiao":"xm","Xie":"xp","Xin":"xb","Xing":"xg","Xiong":"xl","Xiu":"xt","Xu":"xu","Xuan":"xj","Xue":"xh","Xun":"xw","Za":"za","Zai":"zh","Zan":"zd","Zang":"zf","Zao":"zs","Ze":"ze","Zei":"zw","Zen":"zk","Zeng":"zj","Zha":"aa","Zhai":"ah","Zhan":"ad","Zhang":"af","Zhao":"as","Zhe":"ae","Zhen":"ak","Zheng":"aj","Zhi":"ai","Zhong":"al","Zhou":"ar","Zhu":"au","Zhua":"aq","Zhuai":"ag","Zhuan":"az","Zhuang":"ax","Zhui":"an","Zhun":"ay","Zhuo":"ao","Zi":"zi","Zong":"zl","Zou":"zr","Zu":"zu","Zuan":"zz","Zui":"zn","Zun":"zy","Zuo":"zo"},"XiaoLang":{"Lv":"lx","Lve":"lb","Lue":"lb","Nv":"nx","Nve":"nb","Nue":"nb","A":"aa","O":"oo","E":"uu","Ai":"ai","Ei":"ui","Ao":"ao","Ou":"ou","An":"an","En":"un","Ang":"ah","Eng":"un","Er":"ur","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"ys","You":"yr","Yan":"yj","Yin":"yd","Yang":"yh","Ying":"yv","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wk","Wei":"ww","Wan":"wj","Wen":"wm","Wang":"wh","Weng":"wn","Yu":"yu","Yue":"yb","Yuan":"yg","Yun":"yy","Yong":"yl","Ba":"ba","Bai":"bk","Ban":"bj","Bang":"bh","Bao":"bs","Bei":"bw","Ben":"bm","Beng":"bn","Bi":"bi","Bian":"bf","Biang":"bm","Biao":"bc","Bie":"bp","Bin":"bd","Bing":"bv","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"ck","Can":"cj","Cang":"ch","Cao":"cs","Ce":"ce","Cen":"cm","Ceng":"cn","Cha":"ia","Chai":"ik","Chan":"ij","Chang":"ih","Chao":"is","Che":"ie","Chen":"im","Cheng":"in","Chi":"ii","Chong":"il","Chou":"ir","Chu":"iu","Chua":"if","Chuai":"iv","Chuan":"ig","Chuang":"iz","Chui":"id","Chun":"iy","Chuo":"io","Ci":"ci","Cong":"cl","Cou":"cr","Cu":"cu","Cuan":"cg","Cui":"cd","Cun":"cy","Cuo":"co","Da":"da","Dai":"dk","Dan":"dj","Dang":"dh","Dao":"ds","De":"de","Dei":"dw","Den":"dm","Deng":"dn","Di":"di","Dia":"dk","Dian":"df","Diao":"dc","Die":"dp","Ding":"dv","Diu":"dt","Dong":"dl","Dou":"dr","Du":"du","Duan":"dg","Dui":"dd","Dun":"dy","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fw","Fen":"fm","Feng":"fn","Fiao":"fc","Fo":"fo","Fou":"fr","Fu":"fu","Ga":"ga","Gai":"gk","Gan":"gj","Gang":"gh","Gao":"gs","Ge":"ge","Gei":"gw","Gen":"gm","Geng":"gn","Gong":"gl","Gou":"gr","Gu":"gu","Gua":"gf","Guai":"gv","Guan":"gg","Guang":"gz","Gui":"gd","Gun":"gy","Guo":"go","Ha":"ha","Hai":"hk","Han":"hj","Hang":"hh","Hao":"hs","He":"he","Hei":"hw","Hen":"hm","Heng":"hn","Hong":"hl","Hou":"hr","Hu":"hu","Hua":"hf","Huai":"hv","Huan":"hg","Huang":"hz","Hui":"hd","Hun":"hy","Huo":"ho","Ji":"ji","Jia":"jk","Jian":"jf","Jiang":"jm","Jiao":"jc","Jie":"jp","Jin":"jd","Jing":"jv","Jiong":"jj","Jiu":"jt","Ju":"ju","Juan":"jg","Jue":"jb","Jun":"jy","Ka":"ka","Kai":"kk","Kan":"kj","Kang":"kh","Kao":"ks","Ke":"ke","Ken":"km","Keng":"kn","Kong":"kl","Kou":"kr","Ku":"ku","Kua":"kf","Kuai":"kv","Kuan":"kg","Kuang":"kz","Kui":"kd","Kun":"ky","Kuo":"ko","La":"la","Lai":"lk","Lan":"lj","Lang":"lh","Lao":"ls","Le":"le","Lei":"lw","Leng":"ln","Li":"li","Lia":"lk","Lian":"lf","Liang":"lm","Liao":"lc","Lie":"lp","Lin":"ld","Ling":"lv","Liu":"lt","Lo":"lo","Long":"ll","Lou":"lr","Lu":"lu","Luan":"lg","Lun":"ly","Luo":"lo","Ma":"ma","Mai":"mk","Man":"mj","Mang":"mh","Mao":"ms","Me":"me","Mei":"mw","Men":"mm","Meng":"mn","Mi":"mi","Mian":"mf","Miao":"mc","Mie":"mp","Min":"md","Ming":"mv","Miu":"mt","Mo":"mo","Mou":"mr","Mu":"mu","Na":"na","Nai":"nk","Nan":"nj","Nang":"nh","Nao":"ns","Ne":"ne","Nei":"nw","Nen":"nm","Neng":"nn","Ni":"ni","Nian":"nf","Niang":"nm","Niao":"nc","Nie":"np","Nin":"nd","Ning":"nv","Niu":"nt","Nong":"nl","Nou":"nr","Nu":"nu","Nuan":"ng","Nun":"ny","Nuo":"no","Pa":"pa","Pai":"pk","Pan":"pj","Pang":"ph","Pao":"ps","Pei":"pw","Pen":"pm","Peng":"pn","Pi":"pi","Pian":"pf","Piao":"pc","Pie":"pp","Pin":"pd","Ping":"pv","Po":"po","Pou":"pr","Pu":"pu","Qi":"qi","Qia":"qk","Qian":"qf","Qiang":"qm","Qiao":"qc","Qie":"qp","Qin":"qd","Qing":"qv","Qiong":"qj","Qiu":"qt","Qu":"qu","Quan":"qg","Que":"qb","Qun":"qy","Ran":"rj","Rang":"rh","Rao":"rs","Re":"re","Ren":"rm","Reng":"rn","Ri":"ri","Rong":"rl","Rou":"rr","Ru":"ru","Rua":"rf","Ruan":"rg","Rui":"rd","Run":"ry","Ruo":"ro","Sa":"sa","Sai":"sk","San":"sj","Sang":"sh","Sao":"ss","Se":"se","Sen":"sm","Seng":"sn","Sha":"va","Shai":"vk","Shan":"vj","Shang":"vh","Shao":"vs","She":"ve","Shei":"vw","Shen":"vm","Sheng":"vn","Shi":"vi","Shou":"vr","Shu":"vu","Shua":"vf","Shuai":"vv","Shuan":"vg","Shuang":"vz","Shui":"vd","Shun":"vy","Shuo":"vo","Si":"si","Song":"sl","Sou":"sr","Su":"su","Suan":"sg","Sui":"sd","Sun":"sy","Suo":"so","Ta":"ta","Tai":"tk","Tan":"tj","Tang":"th","Tao":"ts","Te":"te","Tei":"tw","Teng":"tn","Ti":"ti","Tian":"tf","Tiao":"tc","Tie":"tp","Ting":"tv","Tong":"tl","Tou":"tr","Tu":"tu","Tuan":"tg","Tui":"td","Tun":"ty","Tuo":"to","Xi":"xi","Xia":"xk","Xian":"xf","Xiang":"xm","Xiao":"xc","Xie":"xp","Xin":"xd","Xing":"xv","Xiong":"xj","Xiu":"xt","Xu":"xu","Xuan":"xg","Xue":"xb","Xun":"xy","Za":"za","Zai":"zk","Zan":"zj","Zang":"zh","Zao":"zs","Ze":"ze","Zei":"zw","Zen":"zm","Zeng":"zn","Zha":"ea","Zhai":"ek","Zhan":"ej","Zhang":"eh","Zhao":"es","Zhe":"ee","Zhen":"em","Zheng":"en","Zhi":"ei","Zhong":"el","Zhou":"er","Zhu":"eu","Zhua":"ef","Zhuai":"ev","Zhuan":"eg","Zhuang":"ez","Zhui":"ed","Zhun":"ey","Zhuo":"eo","Zi":"zi","Zong":"zl","Zou":"zr","Zu":"zu","Zuan":"zg","Zui":"zd","Zun":"zy","Zuo":"zo"}} \ No newline at end of file diff --git a/Flow.Launcher/ResultListBox.xaml b/Flow.Launcher/ResultListBox.xaml index 8cb15400f..e469bb63b 100644 --- a/Flow.Launcher/ResultListBox.xaml +++ b/Flow.Launcher/ResultListBox.xaml @@ -36,6 +36,7 @@ + @@ -66,7 +67,7 @@ Grid.Column="2" Margin="0 0 10 0" VerticalAlignment="Center" - Visibility="{Binding ShowOpenResultHotkey}"> + Visibility="{Binding Settings.ShowOpenResultHotkey, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}"> @@ -79,7 +80,7 @@ Style="{DynamicResource ItemHotkeyStyle}"> - + diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs index bec59a2b1..e5b70cd87 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs @@ -35,6 +35,7 @@ public partial class SettingsPaneGeneralViewModel : BaseModel public class SearchWindowAlignData : DropdownDataGeneric { } public class SearchPrecisionData : DropdownDataGeneric { } public class LastQueryModeData : DropdownDataGeneric { } + public class DoublePinyinSchemaData : DropdownDataGeneric { } public bool StartFlowLauncherOnSystemStartup { @@ -177,6 +178,7 @@ public partial class SettingsPaneGeneralViewModel : BaseModel DropdownDataGeneric.UpdateLabels(SearchWindowAligns); DropdownDataGeneric.UpdateLabels(SearchPrecisionScores); DropdownDataGeneric.UpdateLabels(LastQueryModes); + DropdownDataGeneric.UpdateLabels(DoublePinyinSchemas); // Since we are using Binding instead of DynamicResource, we need to manually trigger the update OnPropertyChanged(nameof(AlwaysPreviewToolTip)); } @@ -262,9 +264,25 @@ public partial class SettingsPaneGeneralViewModel : BaseModel public bool ShouldUsePinyin { get => Settings.ShouldUsePinyin; - set => Settings.ShouldUsePinyin = value; + set + { + if (value == false && UseDoublePinyin == true) + { + UseDoublePinyin = false; + } + Settings.ShouldUsePinyin = value; + } } + public bool UseDoublePinyin + { + set => Settings.UseDoublePinyin = value; + get => Settings.UseDoublePinyin; + } + + public List DoublePinyinSchemas { get; } = + DropdownDataGeneric.GetValues("DoublePinyinSchemas"); + public List Languages => _translater.LoadAvailableLanguages(); public string AlwaysPreviewToolTip => string.Format( diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs index 7a7c19dd3..fdc9ef530 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs @@ -69,15 +69,33 @@ public partial class SettingsPaneHotkeyViewModel : BaseModel return; } - var window = new CustomQueryHotkeySetting(Settings); - window.UpdateItem(item); - window.ShowDialog(); + var settingItem = Settings.CustomPluginHotkeys.FirstOrDefault(o => + o.ActionKeyword == item.ActionKeyword && o.Hotkey == item.Hotkey); + if (settingItem == null) + { + App.API.ShowMsgBox(App.API.GetTranslation("invalidPluginHotkey")); + return; + } + + var window = new CustomQueryHotkeySetting(settingItem); + if (window.ShowDialog() is not true) return; + + var index = Settings.CustomPluginHotkeys.IndexOf(settingItem); + Settings.CustomPluginHotkeys[index] = new CustomPluginHotkey(window.Hotkey, window.ActionKeyword); + HotKeyMapper.RemoveHotkey(settingItem.Hotkey); // remove origin hotkey + HotKeyMapper.SetCustomQueryHotkey(Settings.CustomPluginHotkeys[index]); // set new hotkey } [RelayCommand] private void CustomHotkeyAdd() { - new CustomQueryHotkeySetting(Settings).ShowDialog(); + var window = new CustomQueryHotkeySetting(); + if (window.ShowDialog() is true) + { + var customHotkey = new CustomPluginHotkey(window.Hotkey, window.ActionKeyword); + Settings.CustomPluginHotkeys.Add(customHotkey); + HotKeyMapper.SetCustomQueryHotkey(customHotkey); // set new hotkey + } } [RelayCommand] @@ -114,10 +132,18 @@ public partial class SettingsPaneHotkeyViewModel : BaseModel return; } - var window = new CustomShortcutSetting(item.Key, item.Value, this); + var settingItem = Settings.CustomShortcuts.FirstOrDefault(o => + o.Key == item.Key && o.Value == item.Value); + if (settingItem == null) + { + App.API.ShowMsgBox(App.API.GetTranslation("invalidShortcut")); + return; + } + + var window = new CustomShortcutSetting(settingItem.Key, settingItem.Value, this); if (window.ShowDialog() is not true) return; - var index = Settings.CustomShortcuts.IndexOf(item); + var index = Settings.CustomShortcuts.IndexOf(settingItem); Settings.CustomShortcuts[index] = new CustomShortcutModel(window.Key, window.Value); } diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs index 07df0682d..efe67d016 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs @@ -1,7 +1,9 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using CommunityToolkit.Mvvm.Input; +using Flow.Launcher.Core.Plugin; using Flow.Launcher.Plugin; using Flow.Launcher.ViewModel; @@ -96,6 +98,35 @@ public partial class SettingsPanePluginStoreViewModel : BaseModel } } + [RelayCommand] + private async Task InstallPluginAsync() + { + var file = GetFileFromDialog( + App.API.GetTranslation("SelectZipFile"), + $"{App.API.GetTranslation("ZipFiles")} (*.zip)|*.zip"); + + if (!string.IsNullOrEmpty(file)) + await PluginInstaller.InstallPluginAndCheckRestartAsync(file); + } + + private static string GetFileFromDialog(string title, string filter = "") + { + var dlg = new Microsoft.Win32.OpenFileDialog + { + InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\Downloads", + Multiselect = false, + CheckFileExists = true, + CheckPathExists = true, + Title = title, + Filter = filter + }; + var result = dlg.ShowDialog(); + if (result == true) + return dlg.FileName; + + return string.Empty; + } + public bool SatisfiesFilter(PluginStoreItemViewModel plugin) { // Check plugin language diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs index b62a35495..3bee2a2b6 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs @@ -136,6 +136,7 @@ public partial class SettingsPaneThemeViewModel : BaseModel }; Settings.ColorScheme = value; _ = _theme.RefreshFrameAsync(); + Win32Helper.EnableWin32DarkMode(value); } } diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml index 7f8555d65..df0243ce8 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml @@ -91,7 +91,10 @@ - + @@ -196,7 +200,10 @@ - + - + + + + + + + + + + + - - - + + + + + + + + + + + + Sub="{DynamicResource KoreanImeRegistryTooltip}" + Type="First"> + Sub="{DynamicResource KoreanImeOpenLinkToolTip}" + Type="Last"> + - + - + - + - + - + + Sub="{Binding BackdropSubText}" + Type="First"> + Icon="" + Type="Last"> - + - + ()) + foreach (var pair in PluginManager.GetResultUpdatePlugin()) { var plugin = (IResultUpdated)pair.Plugin; plugin.ResultsUpdated += (s, e) => @@ -821,6 +834,7 @@ namespace Flow.Launcher.ViewModel public bool MainWindowVisibilityStatus { get; set; } = true; public event VisibilityChangedEventHandler VisibilityChanged; + public event ActualApplicationThemeChangedEventHandler ActualApplicationThemeChanged; public Visibility ClockPanelVisibility { get; set; } public Visibility SearchIconVisibility { get; set; } @@ -1975,6 +1989,7 @@ namespace Flow.Launcher.ViewModel { _resultsViewUpdateTask.Dispose(); } + ThemeManager.Current.ActualApplicationThemeChanged -= ThemeManager_ActualApplicationThemeChanged; _disposed = true; } } diff --git a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs index d1cf74501..f5523212e 100644 --- a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs +++ b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs @@ -1,5 +1,5 @@ using System; -using System.Linq; +using System.Threading.Tasks; using CommunityToolkit.Mvvm.Input; using Flow.Launcher.Core.Plugin; using Flow.Launcher.Plugin; @@ -9,27 +9,28 @@ namespace Flow.Launcher.ViewModel { public partial class PluginStoreItemViewModel : BaseModel { - private PluginPair PluginManagerData => PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7"); + private readonly UserPlugin _newPlugin; + private readonly PluginPair _oldPluginPair; + public PluginStoreItemViewModel(UserPlugin plugin) { - _plugin = plugin; + _newPlugin = plugin; + _oldPluginPair = PluginManager.GetPluginForId(plugin.ID); } - private UserPlugin _plugin; + public string ID => _newPlugin.ID; + public string Name => _newPlugin.Name; + public string Description => _newPlugin.Description; + public string Author => _newPlugin.Author; + public string Version => _newPlugin.Version; + public string Language => _newPlugin.Language; + public string Website => _newPlugin.Website; + public string UrlDownload => _newPlugin.UrlDownload; + public string UrlSourceCode => _newPlugin.UrlSourceCode; + public string IcoPath => _newPlugin.IcoPath; - public string ID => _plugin.ID; - public string Name => _plugin.Name; - public string Description => _plugin.Description; - public string Author => _plugin.Author; - public string Version => _plugin.Version; - public string Language => _plugin.Language; - public string Website => _plugin.Website; - public string UrlDownload => _plugin.UrlDownload; - public string UrlSourceCode => _plugin.UrlSourceCode; - public string IcoPath => _plugin.IcoPath; - - public bool LabelInstalled => PluginManager.GetPluginForId(_plugin.ID) != null; - public bool LabelUpdate => LabelInstalled && new Version(_plugin.Version) > new Version(PluginManager.GetPluginForId(_plugin.ID).Metadata.Version); + public bool LabelInstalled => _oldPluginPair != null; + public bool LabelUpdate => LabelInstalled && new Version(_newPlugin.Version) > new Version(_oldPluginPair.Metadata.Version); internal const string None = "None"; internal const string RecentlyUpdated = "RecentlyUpdated"; @@ -41,15 +42,15 @@ namespace Flow.Launcher.ViewModel get { string category = None; - if (DateTime.Now - _plugin.LatestReleaseDate < TimeSpan.FromDays(7)) + if (DateTime.Now - _newPlugin.LatestReleaseDate < TimeSpan.FromDays(7)) { category = RecentlyUpdated; } - if (DateTime.Now - _plugin.DateAdded < TimeSpan.FromDays(7)) + if (DateTime.Now - _newPlugin.DateAdded < TimeSpan.FromDays(7)) { category = NewRelease; } - if (PluginManager.GetPluginForId(_plugin.ID) != null) + if (_oldPluginPair != null) { category = Installed; } @@ -59,11 +60,22 @@ namespace Flow.Launcher.ViewModel } [RelayCommand] - private void ShowCommandQuery(string action) + private async Task ShowCommandQueryAsync(string action) { - var actionKeyword = PluginManagerData.Metadata.ActionKeywords.Any() ? PluginManagerData.Metadata.ActionKeywords[0] + " " : String.Empty; - App.API.ChangeQuery($"{actionKeyword}{action} {_plugin.Name}"); - App.API.ShowMainWindow(); + switch (action) + { + case "install": + await PluginInstaller.InstallPluginAndCheckRestartAsync(_newPlugin); + break; + case "uninstall": + await PluginInstaller.UninstallPluginAndCheckRestartAsync(_oldPluginPair.Metadata); + break; + case "update": + await PluginInstaller.UpdatePluginAndCheckRestartAsync(_newPlugin, _oldPluginPair.Metadata); + break; + default: + break; + } } } } diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs index 01fa3d203..ea222d023 100644 --- a/Flow.Launcher/ViewModel/PluginViewModel.cs +++ b/Flow.Launcher/ViewModel/PluginViewModel.cs @@ -1,5 +1,4 @@ -using System.Linq; -using System.Threading.Tasks; +using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; @@ -32,21 +31,6 @@ namespace Flow.Launcher.ViewModel } } - private static string PluginManagerActionKeyword - { - get - { - var keyword = PluginManager - .GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7") - .Metadata.ActionKeywords.FirstOrDefault(); - return keyword switch - { - null or "*" => string.Empty, - _ => keyword - }; - } - } - private async Task LoadIconAsync() { Image = await App.API.LoadImageAsync(PluginPair.Metadata.IcoPath); @@ -186,10 +170,9 @@ namespace Flow.Launcher.ViewModel } [RelayCommand] - private void OpenDeletePluginWindow() + private async Task OpenDeletePluginWindowAsync() { - App.API.ChangeQuery($"{PluginManagerActionKeyword} uninstall {PluginPair.Metadata.Name}".Trim(), true); - App.API.ShowMainWindow(); + await PluginInstaller.UninstallPluginAndCheckRestartAsync(PluginPair.Metadata); } [RelayCommand] diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs index 648ac49bb..c58abae28 100644 --- a/Flow.Launcher/ViewModel/ResultViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultViewModel.cs @@ -64,9 +64,6 @@ namespace Flow.Launcher.ViewModel public Settings Settings { get; } - public Visibility ShowOpenResultHotkey => - Settings.ShowOpenResultHotkey ? Visibility.Visible : Visibility.Collapsed; - public Visibility ShowDefaultPreview => Result.PreviewPanel == null ? Visibility.Visible : Visibility.Collapsed; public Visibility ShowCustomizedPreview => Result.PreviewPanel == null ? Visibility.Collapsed : Visibility.Visible; @@ -152,8 +149,6 @@ namespace Flow.Launcher.ViewModel private bool PreviewImageAvailable => !string.IsNullOrEmpty(Result.Preview.PreviewImagePath) || Result.Preview.PreviewDelegate != null; - public string OpenResultModifiers => Settings.OpenResultModifiers; - public string ShowTitleToolTip => string.IsNullOrEmpty(Result.TitleToolTip) ? Result.Title : Result.TitleToolTip; diff --git a/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs index 1eee6dba5..67bbbd930 100644 --- a/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs +++ b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs @@ -1,6 +1,5 @@ using System.Collections.ObjectModel; using System.Linq; -using System.Windows; using CommunityToolkit.Mvvm.Input; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin; diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml index 4a764bbfa..66e30855f 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/de.xaml @@ -26,6 +26,6 @@ Wenn Sie nicht Chrome, Firefox oder Edge verwenden oder deren portable Version nutzen, müssen Sie das Lesezeichen-Datenverzeichnis hinzufügen und die richtige Browser-Engine auswählen, damit dieses Plug-in funktioniert. Zum Beispiel: Die Engine von Brave ist Chromium, und deren Standardspeicherort der Lesezeichen-Daten ist: %LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Bei der Firefox-Engine ist das Lesezeichenverzeichnis der Ordner userdata, der die Datei places.sqlite enthält. - Load favicons (can be time consuming during startup) + Favicons laden (kann während des Starts zeitaufwendig sein) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml index 2dff7543f..9f92d86b1 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pl.xaml @@ -19,12 +19,12 @@ Ścieżka katalogu danych Dodaj Edytuj - Usu + Usuń Przeglądaj Inne Silnik przeglądarki Jeśli nie używasz Chrome, Firefox lub Edge, lub używasz ich wersji przenośnej, musisz dodać katalog danych zakładek i wybrać poprawny silnik przeglądarki, aby wtyczka działała. Na przykład: silnikiem przeglądarki Brave jest Chromium, a domyślna lokalizacja danych zakładek to: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". W przypadku silnika Firefoksa, katalog zakładek to folder danych użytkownika zawierający plik places.sqlite. - Load favicons (can be time consuming during startup) + Wczytaj ikony ulubionych (może być czasochłonne podczas uruchamiania) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml index b8fd4fb83..07ccc2ea4 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml @@ -25,6 +25,6 @@ Браузерний рушій Якщо ви не використовуєте Chrome, Firefox або Edge, або використовуєте їхні портативні версії, вам потрібно додати каталог даних закладок і вибрати правильний рушій браузера, щоб цей плагін працював. Наприклад: Рушій Brave - Chromium, і за замовчуванням розташування даних закладок: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Для браузера Firefox директорія закладок - це папка userdata, що містить файл places.sqlite. - Load favicons (can be time consuming during startup) + Завантажити піктограми (може зайняти багато часу під час запуску) diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs index f35e64237..b598995df 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs @@ -19,7 +19,7 @@ namespace Flow.Launcher.Plugin.Calculator @"bin2dec|hex2dec|oct2dec|" + @"factorial|sign|isprime|isinfty|" + @"==|~=|&&|\|\||(?:\<|\>)=?|" + - @"[ei]|[0-9]|[\+\%\-\*\/\^\., ""]|[\(\)\|\!\[\]]" + + @"[ei]|[0-9]|0x[\da-fA-F]+|[\+\%\-\*\/\^\., ""]|[\(\)\|\!\[\]]" + @")+$", RegexOptions.Compiled); private static readonly Regex RegBrackets = new Regex(@"[\(\)\[\]]", RegexOptions.Compiled); private static Engine MagesEngine; diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json index 485babd26..3168edfcc 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json @@ -2,11 +2,11 @@ "ID": "CEA0FDFC6D3B4085823D60DC76F28855", "ActionKeyword": "*", "Name": "Calculator", - "Description": "Provide mathematical calculations.(Try 5*3-2 in Flow Launcher)", + "Description": "Perform mathematical calculations (including hexadecimal values)", "Author": "cxfksword", "Version": "1.0.0", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", "ExecuteFileName": "Flow.Launcher.Plugin.Calculator.dll", "IcoPath": "Images\\calculator.png" -} \ No newline at end of file +} diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml index d327dcebb..ebdb0ff35 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ar.xaml @@ -96,8 +96,11 @@ حذف حذف الملف الحالي نهائيًا حذف المجلد الحالي نهائيًا - المسار: - Name: + اسم البرنامج + Type + المسار + ملف + مجلد حذف المحدد تشغيل كمستخدم مختلف تشغيل العنصر المحدد باستخدام حساب مستخدم مختلف diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml index 80e181a8f..38f4f145e 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/cs.xaml @@ -96,8 +96,11 @@ Smazat Trvale odstranit aktuální soubor Trvale smazat aktuální složku - Cesta: - Name: + Jméno + Type + Cesta + Soubor + Složka Odstranit vybraný Spustit jako jiný uživatel Spustí vybranou položku jako uživatel s jiným účtem diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml index 7cbe281d8..8c011814c 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/da.xaml @@ -96,8 +96,11 @@ Slet Permanently delete current file Permanently delete current folder - Path: - Name: + Name + Type + Path + File + Folder Delete the selected Run as different user Run the selected using a different user account diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml index 10700a0ee..1d8c3937a 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/de.xaml @@ -3,8 +3,8 @@ Bitte treffen Sie zuerst eine Auswahl - Please select a folder path. - Please choose a different name or folder path. + Bitte wählen Sie einen Ordnerpfad aus. + Bitte wählen Sie einen anderen Namen oder Ordnerpfad. Bitte wählen Sie einen Ordner-Link aus Sind Sie sicher, dass Sie {0} löschen wollen? Sind Sie sicher, dass Sie diese Datei dauerhaft löschen möchten? @@ -27,14 +27,14 @@ Hinzufügen Allgemeine Einstellung Aktions-Schlüsselwörter individuell anpassen - Customise Quick Access + Schnellzugriff individuell anpassen Schnellzugriff-Links Everyhting-Einstellung Vorschau-Panel Größe Erstellungsdatum Änderungsdatum - File Age + Dateialter Datei-Info anzeigen Datums- und Zeitformat Sortieroption: @@ -44,7 +44,7 @@ Shell-Pfad Indexsuche ausgeschlossene Pfade Ort des Suchergebnisses als Arbeitsverzeichnis der ausführbaren Datei verwenden - Display more information like size and age in tooltips + Mehr Informationen wie Größe und Alter in Tooltips anzeigen Drücken Sie Enter, um Ordner im Default-Dateimanager zu öffnen Indexsuche für Pfadsuche verwenden Indexierungsoptionen @@ -81,23 +81,26 @@ Strg+Enter, um das Verzeichnis zu öffnen Strg+Enter, um den enthaltenden Ordner zu öffnen - {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3} + {0}{4}Größe: {1}{4}Erstellungsdatum: {2}{4}Änderunsgdatum: {3} Unbekannt - {0}{3}Space free: {1}{3}Total size: {2} + {0}{3}Platz frei: {1}{3}Größe total: {2} Pfad kopieren Pfad des aktuellen Elements in Zwischenablage kopieren - Copy name - Copy name of current item to clipboard + Name kopieren + Name des aktuellen Elements in Zwischenablage kopieren Kopieren Aktuelle Datei in Zwischenablage kopieren Aktuellen Ordner in Zwischenablage kopieren Löschen Aktuelle Datei dauerhaft löschen Aktuellen Ordner dauerhaft löschen - Pfad: - Name: + Name + Typ + Pfad + Datei + Ordner Ausgewähltes löschen Als anderer Benutzer ausführen Ausgewähltes unter Verwendung eines anderen Benutzerkontos ausführen @@ -164,12 +167,12 @@ Everything-Dienst erfolgreich installiert Der Everything-Dienst konnte nicht automatisch installiert werden. Bitte installieren Sie ihn manuell über https://www.voidtools.com Klicken Sie hier, um es zu starten - Es kann keine Everything-Installation gefuinden werden, möchten Sie einen Ort manuell auswählen?{0}{0}Klicken Sie auf Nein und Everything wird automatisch für Sie installiert + Es kann keine Everything-Installation gefunden werden, möchten Sie einen Ort manuell auswählen?{0}{0}Klicken Sie auf Nein und Everything wird automatisch für Sie installiert Möchten Sie die Inhaltssuche für Everything aktivieren? Es kann sehr langsam sein ohne Index (was nur in Everything v1.5+ unterstützt wird) - Unable to find Everything.exe - Failed to install Everything, please install it manually + Everything.exe kann nicht gefunden werden + Everything konnte nicht installiert werden, bitte installieren Sie es manuell Natives Kontextmenü @@ -178,10 +181,10 @@ Unten können Sie die Elemente angeben, die Sie aus dem Kontextmenü ausschließen möchten. Diese können partiell (z. B. „Stift mit“) oder vollständig („Öffnen mit“) sein. - Today - {0} days ago - 1 month ago - {0} months ago - 1 year ago - {0} years ago + Heute + Vor {0} Tagen + Vor 1 Monat + Vor {0} Monaten + Vor 1 Jahr + Vor {0} Jahren diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml index 4e372adbe..ae541a745 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es-419.xaml @@ -96,8 +96,11 @@ Eliminar Permanently delete current file Permanently delete current folder - Path: - Name: + Name + Type + Ruta + Archivo + Carpeta Delete the selected Run as different user Run the selected using a different user account diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml index 4f5977fa1..10ee4a9a4 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/es.xaml @@ -34,7 +34,7 @@ Tamaño Fecha de creación Fecha de modificación - Edad del archivo + Antigüedad del archivo Mostrar información del archivo Formato de fecha y hora Ordenar por: @@ -44,7 +44,7 @@ Ruta del Shell Rutas excluídas del índice de búsqueda Usar la ubicación de los resultados de búsqueda como directorio de trabajo del ejecutable - Mostrar más información, como tamaño y antigüedad, en los consejos (tooltips) + Mostrar más información, como el tamaño y la antigüedad, en los mensajes emergentes Pulsar Entrar para abrir la carpeta en el administrador de archivos predeterminado Usar búsqueda indexada para buscar rutas Opciones de indexación @@ -96,8 +96,11 @@ Eliminar Elimina permanentemente el archivo actual Elimina permanentemente la carpeta actual - Ruta: - Nombre: + Nombre + Tipo + Ruta + Archivo + Carpeta Elimina el seleccionado Ejecutar como usuario diferente Ejecuta la selección usando una cuenta de usuario diferente diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml index 726fbe7d7..8809004c7 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/fr.xaml @@ -96,8 +96,11 @@ Supprimer Supprimer définitivement le fichier actuel Supprimer définitivement le dossier actuel - Chemin : - Nom : + Nom + Type + Chemin + Fichier + Dossier Supprimer la sélection Exécuter en tant qu'utilisateur différent Exécuter le programme sélectionné en utilisant un autre compte d'utilisateur diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml index 6e955848d..a18a15aad 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/he.xaml @@ -96,8 +96,11 @@ מחק מחק לצמיתות את הקובץ הנוכחי מחק לצמיתות את התיקייה הנוכחית - נתיב: - שם: + שם + Type + נתיב + קובץ + תיקייה מחק את הפריט שנבחר הפעל כמשתמש אחר הפעל את הפריט שנבחר באמצעות חשבון משתמש אחר diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml index df756e886..3afaf2f25 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml @@ -96,8 +96,11 @@ Cancella Elimina permanentemente il file corrente Elimina definitivamente la cartella corrente - Percorso: - Name: + Nome + Type + Percorso + File + Cartella Elimina il selezionato Esegui come utente differente Esegui la selezione utilizzando un altro account utente diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml index 3d944a2b8..648efe642 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml @@ -96,8 +96,11 @@ 削除 現在のファイルを完全に削除 現在のフォルダーを完全に削除 - Path: - Name: + 名前 + Type + Path + ファイル + フォルダー Delete the selected Run as different user Run the selected using a different user account @@ -138,7 +141,7 @@ Warning: Everything service is not running Error while querying Everything Sort By - Name + 名前 Path サイズ Extension diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml index 27e4aa76a..cf4d8b8ad 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ko.xaml @@ -96,8 +96,11 @@ 삭제 이 파일을 영구적으로 삭제 이 폴더를 영구적으로 삭제 - 경로: - Name: + Name + Type + Path + 파일 + 폴더 선택 항목을 삭제 다른 유저 권한으로 실행 선택한 사용자 계정으로 실행 diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml index e5ef88959..733136c36 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nb.xaml @@ -96,8 +96,11 @@ Slett Slett gjeldende fil permanent Slett gjeldende mappe permanent - Sti: - Name: + Navn + Type + Sti + Fil + Mappe Slett valgte Kjør som annen bruker Kjør valgte med en annen brukerkonto diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml index d8178a1f3..c4bfb639d 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/nl.xaml @@ -96,8 +96,11 @@ Verwijder Permanently delete current file Permanently delete current folder - Path: - Name: + Name + Type + Pad + Bestand + Map Delete the selected Run as different user Run the selected using a different user account diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml index 5a29fd9ab..ddf56ab37 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pl.xaml @@ -2,9 +2,9 @@ - Pierw dokonaj wyboru - Please select a folder path. - Please choose a different name or folder path. + Najpierw dokonaj wyboru + Wybierz ścieżkę folderu. + Wybierz inną nazwę lub ścieżkę folderu. Musisz wybrać któryś folder z listy Czy jesteś pewien że chcesz usunąć {0}? Jesteś pewny, że chcesz usunąć ten plik trwale? @@ -27,14 +27,14 @@ Dodaj Ustawienia ogólne Zmień słowa kluczowe akcji - Customise Quick Access + Dostosuj Szybki Dostęp Linki szybkiego dostępu Ustawienia Everything Panel podglądu Rozmiar Data utworzenia Data modyfikacji - File Age + Wiek pliku Wyświetl informacje o pliku Format daty i czasu Opcje sortowania: @@ -44,7 +44,7 @@ Ścieżka powłoki Wykluczone ścieżki indeksu Użyj lokalizacji wyników wyszukiwania jako katalogu roboczego pliku wykonywalnego - Display more information like size and age in tooltips + Wyświetlaj więcej informacji, takich jak rozmiar i wiek w podpowiedziach Naciśnij Enter, aby otworzyć folder w domyślnym menedżerze plików Użyj wyszukiwania indeksowego do przeszukiwania ścieżek Opcje indeksowania @@ -81,23 +81,26 @@ Ctrl + Enter, aby otworzyć folder Ctrl + Enter, aby otworzyć folder zawierający - {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3} + {0} {4}Rozmiar: {1} {4}Data utworzenia: {2} {4} Data modyfikacji: {3} Nieznane - {0}{3}Space free: {1}{3}Total size: {2} + {0} {3}Wolna przestrzeń: {1} {3}Rozmiar całkowity: {2} Skopiuj Ścieżkę Kopiuj ścieżkę bieżącego elementu do schowka - Copy name - Copy name of current item to clipboard + Kopiuj nazwę + Kopiuj nazwę bieżącego elementu do schowka Kopiuj Kopiuj bieżący plik do schowka Kopiuj bieżący folder do schowka Usu Trwale usuń bieżący plik Trwale usuń bieżący folder - Ścieżka: - Name: + Nazwa + Type + Ścieżka + Plik + Folder Usuń zaznaczone Uruchom jako inny użytkownik Uruchom wybrane używając innego konta użytkownika @@ -168,8 +171,8 @@ Czy chcesz włączyć wyszukiwanie zawartości dla programu Everything? Może działać bardzo wolno bez indeksu (który jest obsługiwany tylko w Everything w wersji 1.5 i nowszych) - Unable to find Everything.exe - Failed to install Everything, please install it manually + Nie znaleziono pliku Everything.exe + Błąd instalacji Everything, zainstaluj aplikację samodzielnie Natywne menu kontekstowe @@ -178,10 +181,10 @@ Poniżej możesz określić elementy, które chcesz wykluczyć z menu kontekstowego. Mogą być one częściowe (np. "otw w") lub pełne ("Otwórz za pomocą"). - Today - {0} days ago - 1 month ago - {0} months ago - 1 year ago - {0} years ago + Dzisiaj + {0} dni wcześniej + 1 miesiąc wcześniej + {0} miesięcy wcześniej + 1 rok temu + {0} lat temu diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml index 5785a5616..d0a260290 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml @@ -96,8 +96,11 @@ Apagar Permanently delete current file Permanently delete current folder - Caminho: - Name: + Nome + Type + Path + Arquivo + Pasta Delete the selected Run as different user Run the selected using a different user account diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml index 5db8251e2..98a77d06a 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml @@ -96,8 +96,11 @@ Eliminar Eliminar permanentemente o ficheiro atual Eliminar permanentemente a pasta atual - Caminho: - Nome: + Nome + Tipo + Caminho + Ficheiro + Pasta Eliminar seleção Executar com outro utilizador Executar ações com uma conta de utilizador diferente diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml index 35bd1d87d..44a3a9b65 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml @@ -96,8 +96,11 @@ Удалить Permanently delete current file Permanently delete current folder - Путь: - Name: + Name + Type + Path + Файл + Папка Delete the selected Запустить от имени другого пользователя Run the selected using a different user account diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml index 1323d6ae0..7c3f5deff 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sk.xaml @@ -96,8 +96,11 @@ Odstrániť Natrvalo odstrániť aktuálny súbor Natrvalo odstrániť aktuálny priečinok - Cesta: - Názov: + Názov + Typ + Cesta + Súbor + Priečinok Odstrániť vybraný Spustiť ako iný používateľ Spustí vybranú položku ako používateľ s iným kontom diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml index 6af550884..4df64e4d5 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/sr.xaml @@ -96,8 +96,11 @@ Obriši Permanently delete current file Permanently delete current folder - Path: - Name: + Name + Type + Path + File + Folder Delete the selected Run as different user Run the selected using a different user account diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml index 44674952b..ed327e1bc 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/tr.xaml @@ -96,8 +96,11 @@ Sil Mevcut dosyayı kalıcı olarak sil Mevcut klasörü kalıcı olarak sil - Yol: - Name: + Name + Type + Path + Dosya + Klasör Seçileni sil Başka bir kullanıcı olarak çalıştır Run the selected using a different user account diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml index b203687e9..38829112c 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml @@ -3,8 +3,8 @@ Будь ласка, спочатку зробіть вибір - Please select a folder path. - Please choose a different name or folder path. + Виберіть шлях до теки. + Виберіть інше ім'я або шлях до теки. Будь ласка, оберіть посилання на теку Ви впевнені, що хочете видалити {0}? Ви впевнені, що хочете назавжди видалити цей файл? @@ -27,14 +27,14 @@ Додати Загальні налаштування Налаштувати ключові слова дії - Customise Quick Access + Налаштування швидкого доступу Посилання швидкого доступу Налаштування Everything Панель поперегляду Розмір Дата створення Дата останньої зміни - File Age + Дата створення Показати інформацію про файл Формат дати й часу Варіант сортування: @@ -44,7 +44,7 @@ Шлях до оболонки Shell Виключені шляхи індексного пошуку Використовувати розташування результату пошуку як робочу директорію виконуваного файлу - Display more information like size and age in tooltips + Показувати більше інформації, наприклад розмір і дату створення, у підказках Натисніть Enter, щоб відкрити папку у файловому менеджері за замовчуванням Використовуйте індексний пошук для пошуку шляху Параметри індексації @@ -81,23 +81,26 @@ Ctrl + Enter, щоб відкрити каталог Ctrl + Enter, щоб відкрити відповідну папку - {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3} + {0}{4}Розмір: {1}{4}Дата створення: {2}{4}Дата змінення: {3} Невідомо - {0}{3}Space free: {1}{3}Total size: {2} + {0}{3}Вільного місця: {1}{3}Загальний розмір: {2} Копіювати шлях Копіювати шлях до поточного елемента в буфер обміну - Copy name - Copy name of current item to clipboard + Копіювати назву + Скопіювати назву поточного елемента в буфер обміну Копіювати Копіювання поточного файлу в буфер обміну Копіювати поточну папку в буфер обміну Видалити Безповоротно видалити поточний файл Назавжди видалити поточну папку - Шлях: - Name: + Назва + Тип + Шлях + Файл + Тека Видалити вибране Запустити від імені іншого користувача Запустити вибране під обліковим записом іншого користувача @@ -156,7 +159,7 @@ Попередження: Це не швидке сортування, пошук може бути повільним Шукати повний шлях - Enable File/Folder Run Count + Увімкнути підрахунок запусків файлів / тек Натисніть, щоб запустити або встановити Everything Встановлення програми Everything @@ -168,20 +171,20 @@ Бажаєте увімкнути пошук контенту для Everything? Без індексу (який підтримується лише у версії Everything v1.5+) воно може працювати дуже повільно - Unable to find Everything.exe - Failed to install Everything, please install it manually + Не вдалося знайти Everything.exe + Не вдалося встановити Everything, встановіть його вручну Рідне контекстне меню Відображати рідне контекстне меню (експериментально) Нижче ви можете вказати елементи, які хочете включити до контекстного меню, вони можуть бути частковими (наприклад, «шир пера») або повними («Відкрити за допомогою»). - Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + Нижче ви можете вказати елементи, які ви хочете виключити з контекстного меню. Вони можуть бути частковими (наприклад, «pen wit») або повними («Відкрити за допомогою»). - Today - {0} days ago - 1 month ago - {0} months ago - 1 year ago - {0} years ago + Сьогодні + {0} дн. тому + Місяць тому + {0} міс. тому + Рік тому + {0} р. тому diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml index f41276a67..de6f9a6a4 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml @@ -96,8 +96,11 @@ Xóa Permanently delete current file Permanently delete current folder - Đường dẫn: - Name: + Tên + Type + Path + Ngày tháng + Thư Mục Xóa đã chọn Xóa lựa chọn đã chọn Chạy phần đã chọn bằng tài khoản người dùng khác diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml index 9bce72062..79d8fc66d 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-cn.xaml @@ -96,8 +96,11 @@ 删除 永久删除当前文件 永久删除当前文件夹 - 路径: - 名称: + 名称 + 类型 + 路径 + 文件 + 目录 删除所选内容 以其他用户身份运行 使用其他用户帐户运行所选内容 diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml index 931c9de29..c4e22066d 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/zh-tw.xaml @@ -96,8 +96,11 @@ 刪除 Permanently delete current file Permanently delete current folder - 路徑: - Name: + 名稱 + Type + 路徑 + 檔案 + 資料夾 刪除所選內容 Run as different user Run the selected using a different user account diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs index 283820204..f1aea98b4 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs @@ -17,7 +17,7 @@ namespace Flow.Launcher.Plugin.Explorer { internal static PluginInitContext Context { get; set; } - internal Settings Settings; + internal static Settings Settings { get; set; } private SettingsViewModel viewModel; @@ -97,7 +97,7 @@ namespace Flow.Launcher.Plugin.Explorer return Context.API.GetTranslation("plugin_explorer_plugin_description"); } - private void FillQuickAccessLinkNames() + private static void FillQuickAccessLinkNames() { // Legacy version does not have names for quick access links, so we fill them with the path name. foreach (var link in Settings.QuickAccessLinks) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs index 85b595390..32651ecb8 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/QuickAccess.cs @@ -6,7 +6,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks { internal static class QuickAccess { - private const int quickAccessResultScore = 100; + private const int QuickAccessResultScore = 100; internal static List AccessLinkListMatched(Query query, IEnumerable accessLinks) { @@ -19,8 +19,9 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks .ThenBy(x => x.Name) .Select(l => l.Type switch { - ResultType.Folder => ResultManager.CreateFolderResult(l.Name, l.Path, l.Path, query, quickAccessResultScore), - ResultType.File => ResultManager.CreateFileResult(l.Path, query, quickAccessResultScore), + ResultType.Volume => ResultManager.CreateDriveSpaceDisplayResult(l.Path, query.ActionKeyword, QuickAccessResultScore), + ResultType.Folder => ResultManager.CreateFolderResult(l.Name, l.Path, l.Path, query, QuickAccessResultScore), + ResultType.File => ResultManager.CreateFileResult(l.Path, query, QuickAccessResultScore), _ => throw new ArgumentOutOfRangeException() }) .ToList(); @@ -32,8 +33,9 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks .ThenBy(x => x.Name) .Select(l => l.Type switch { - ResultType.Folder => ResultManager.CreateFolderResult(l.Name, l.Path, l.Path, query), - ResultType.File => ResultManager.CreateFileResult(l.Path, query, quickAccessResultScore), + ResultType.Volume => ResultManager.CreateDriveSpaceDisplayResult(l.Path, query.ActionKeyword, QuickAccessResultScore), + ResultType.Folder => ResultManager.CreateFolderResult(l.Name, l.Path, l.Path, query, QuickAccessResultScore), + ResultType.File => ResultManager.CreateFileResult(l.Path, query, QuickAccessResultScore), _ => throw new ArgumentOutOfRangeException() }).ToList(); } diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs index e87d2df97..7791a9881 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs @@ -171,7 +171,17 @@ namespace Flow.Launcher.Plugin.Explorer.Search }; } + internal static Result CreateDriveSpaceDisplayResult(string path, string actionKeyword, int score) + { + return CreateDriveSpaceDisplayResult(path, actionKeyword, score, SearchManager.UseIndexSearch(path)); + } + internal static Result CreateDriveSpaceDisplayResult(string path, string actionKeyword, bool windowsIndexed = false) + { + return CreateDriveSpaceDisplayResult(path, actionKeyword, 500, windowsIndexed); + } + + private static Result CreateDriveSpaceDisplayResult(string path, string actionKeyword, int score, bool windowsIndexed = false) { var progressBarColor = "#26a0da"; var title = string.Empty; // hide title when use progress bar, @@ -197,7 +207,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search SubTitle = subtitle, AutoCompleteText = GetPathWithActionKeyword(path, ResultType.Folder, actionKeyword), IcoPath = path, - Score = 500, + Score = score, ProgressBar = progressValue, ProgressBarColor = progressBarColor, Preview = new Result.PreviewInfo diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs index 12df6c145..f4f87d4d4 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs @@ -246,6 +246,18 @@ namespace Flow.Launcher.Plugin.Explorer.Search public bool IsFileContentSearch(string actionKeyword) => actionKeyword == Settings.FileContentSearchActionKeyword; + public static bool UseIndexSearch(string path) + { + if (Main.Settings.IndexSearchEngine is not Settings.IndexSearchEngineOption.WindowsIndex) + return false; + + // Check if the path is using windows index search + var pathToDirectory = FilesFolders.ReturnPreviousDirectoryIfIncompleteString(path); + + return !Main.Settings.IndexSearchExcludedSubdirectoryPaths.Any( + x => FilesFolders.ReturnPreviousDirectoryIfIncompleteString(pathToDirectory).StartsWith(x.Path, StringComparison.OrdinalIgnoreCase)) + && WindowsIndex.WindowsIndex.PathIsIndexed(pathToDirectory); + } private bool UseWindowsIndexForDirectorySearch(string locationPath) { diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml index e200a187f..0daa36e63 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml @@ -8,10 +8,7 @@ d:DesignHeight="300" d:DesignWidth="300" mc:Ignorable="d"> - + @@ -47,7 +44,7 @@ TextWrapping="Wrap" /> - + - - - - - - - - - - - - - + + + + + + + + + + + + - - + + - - - - + + + diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs index eb66e1efc..e6294b98b 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs @@ -1,6 +1,7 @@ using System; using System.Collections.ObjectModel; using System.ComponentModel; +using System.IO; using System.Linq; using System.Windows; using System.Windows.Forms; @@ -14,6 +15,8 @@ namespace Flow.Launcher.Plugin.Explorer.Views; [INotifyPropertyChanged] public partial class QuickAccessLinkSettings { + private static readonly string ClassName = nameof(QuickAccessLinkSettings); + private string _selectedPath; public string SelectedPath { @@ -27,6 +30,9 @@ public partial class QuickAccessLinkSettings if (string.IsNullOrEmpty(_selectedName)) { SelectedName = _selectedPath.GetPathName(); + } + if (!string.IsNullOrEmpty(_selectedPath)) + { _accessLinkType = GetResultType(_selectedPath); } } @@ -187,13 +193,13 @@ public partial class QuickAccessLinkSettings private static ResultType GetResultType(string path) { // Check if the path is a file or folder - if (System.IO.File.Exists(path)) + if (File.Exists(path)) { return ResultType.File; } - else if (System.IO.Directory.Exists(path)) + else if (Directory.Exists(path)) { - if (string.Equals(System.IO.Path.GetPathRoot(path), path, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(Path.GetPathRoot(path), path, StringComparison.OrdinalIgnoreCase)) { return ResultType.Volume; } @@ -205,6 +211,7 @@ public partial class QuickAccessLinkSettings else { // This should not happen, but just in case, we assume it's a folder + Main.Context.API.LogError(ClassName, $"The path '{path}' does not exist or is invalid. Defaulting to Folder type."); return ResultType.Folder; } } diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml index 6fb809d90..8a75cde72 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml @@ -43,10 +43,15 @@ تم تحديث الإضافة {0} بنجاح. يرجى إعادة تشغيل Flow. تم تحديث {0} إضافات بنجاح. يرجى إعادة تشغيل Flow. تم تعديل الإضافة {0} بالفعل. يرجى إعادة تشغيل Flow قبل إجراء أي تغييرات أخرى. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} مدير الإضافات - إدارة تثبيت وإلغاء تثبيت أو تحديث إضافات Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window مؤلف غير معروف @@ -61,5 +66,5 @@ تحذير التثبيت من مصدر غير معروف - إعادة تشغيل Flow Launcher تلقائيًا بعد تثبيت/إلغاء تثبيت/تحديث الإضافات + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml index d47e1814b..5ca1700d4 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Správce pluginů - Správa instalace, odinstalace nebo aktualizace pluginů Flow Launcheru + Install, uninstall or update Flow Launcher plugins via the search window Neznámý autor @@ -61,5 +66,5 @@ Upozornění na instalaci z neznámého zdroje - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml index 616ce779b..a5d0231ce 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml index 47ea31cce..c7ef77801 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml @@ -43,10 +43,15 @@ Plug-in {0} erfolgreich aktualisiert. Bitte starten Sie Flow neu. {0} Plug-ins erfolgreich aktualisiert. Bitte starten Sie Flow neu. Plug-in {0} ist bereits modifiziert worden. Bitte starten Sie Flow neu, bevor Sie irgendwelche weitere Änderungen vornehmen. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plug-ins-Manager - Verwaltung der Installation, Deinstallation oder Aktualisierung der Plug-ins von Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window Unbekannter Autor @@ -61,5 +66,5 @@ Warnung vor Installation aus unbekannter Quelle - Automatischer Neustart von Flow Launcher nach Installation/Deinstallation/Aktualisierung von Plug-ins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml index 573ca9051..fa2e65240 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml @@ -45,10 +45,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -63,5 +68,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager \ No newline at end of file diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml index 616ce779b..a5d0231ce 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml index b0f25f3ea..b6a3a6cbc 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml @@ -43,10 +43,15 @@ Complemento {0} actualizado correctamente. Por favor, reinicie Flow. {0} complementos se han actualizado correctamente. Por favor, reinicie Flow. El complemento {0} ya ha sido modificado. Por favor, reinicie Flow antes de realizar más cambios. + {0} ya está modificado + Reiniciar Flow antes de realizar más cambios + + Archivo de instalación zip no válido + Por favor, compruebe si hay un plugin.json en {0} Administrador de complementos - Administración de instalación, desinstalación o actualización de los complementos de Flow Launcher + Instalar, desinstalar o actualizar complementos de Flow Launcher desde la ventana de búsqueda Autor desconocido @@ -61,5 +66,5 @@ Aviso de instalación desde fuentes desconocidas - Reiniciar automáticamente Flow Launcher después de instalar/desinstalar/actualizar complementos + Reiniciar Flow Launcher automáticamente después de instalar/desinstalar/actualizar el complemento a través del Administrador de complementos diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml index 3142ef86d..c95c97231 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml @@ -43,10 +43,15 @@ Plugin {0} mis à jour avec succès. Veuillez redémarrer Flow. {0} plugins mis à jour avec succès. Veuillez redémarrer Flow. Le plugin {0} a déjà été modifié. Veuillez redémarrer Flow avant de faire d'autres modifications. + {0} est déjà modifié + Veuillez redémarrer Flow avant d'apporter d'autres modifications + + Fichier d'installation zip invalide + Veuillez vérifier s'il y a un plugin.json dans {0} Gestionnaire de plugins - Gestion de l'installation, de la désinstallation ou de la mise à jour des plugins Flow Launcher + Installer, désinstaller ou mettre à jour les plugins Flow Launcher via la fenêtre de recherche Auteur inconnu @@ -61,5 +66,5 @@ Avertissement d'installation à partir d'une source inconnue - Redémarrer automatiquement Flow Launcher après l'installation/désinstallation/mise à jour des plugins + Redémarrer Flow Launcher automatiquement après l'installation/désinstallation/mise à jour du plugin via le gestionnaire de plugins diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml index 8c7f0cf02..3fe7fd968 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml @@ -43,10 +43,15 @@ התוסף {0} עודכן בהצלחה. נא הפעל מחדש את Flow. {0} תוספים עודכנו בהצלחה. נא הפעל מחדש את Flow. התוסף {0} כבר השתנה. נא הפעל מחדש את Flow לפני ביצוע שינויים נוספים. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} מנהל תוספים - ניהול התקנה, הסרה או עדכון של תוספים עבור Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window מחבר לא ידוע @@ -61,5 +66,5 @@ אזהרה בעת התקנה ממקור לא ידוע - הפעל מחדש את Flow Launcher באופן אוטומטי לאחר התקנה/הסרה/עדכון של תוספים + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml index d154e59dc..3ccefa2db 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml @@ -43,10 +43,15 @@ Il plugin {0} aggiornato con successo. Riavviare Flow. {0} plugin aggiornato con successo. Riavviare Flow. Il plugin {0} è già stato modificato. Riavviare Flow prima di fare altre modifiche. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Gestore dei plugin - Gestione dell'installazione, disinstallazione o aggiornamento dei plugin di Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window Autore Sconosciuto @@ -61,5 +66,5 @@ Avviso di installazione da sorgenti sconosciute - Riavvia automaticamente Flow Launcher dopo l'installazione/disinstallazione/aggiornamento dei plugin + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml index 616ce779b..d62f0f61b 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -60,6 +65,6 @@ Visit the PluginsManifest repository to see community-made plugin submissions - Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + 不明な提供元からインストールするとき警告する + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml index f6f46448d..8c15f27ad 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} 플러그인 관리자 - 플러그인의 설치/삭제/업데이트를 관리하는 플러그인 + Install, uninstall or update Flow Launcher plugins via the search window 알수없는 제작자 @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml index b0fd2d10a..bccd55459 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml @@ -43,10 +43,15 @@ Programtillegg {0} oppdatert. Vennligst restart Flow. {0} programtillegg oppdatert. Start Flow på nytt. Programtillegg {0} er allerede endret. Start Flow på nytt før nye endringer foretas. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Programtilleggsbehandling - Administrasjon av installasjon, avinstallere eller oppdatere Flow Launcher programtillegg + Install, uninstall or update Flow Launcher plugins via the search window Ukjent utvikler @@ -61,5 +66,5 @@ Advarsel om installering fra ukjent kilde - Start Flow Launcher automatisk på nytt etter installasjon/avinstallering/oppdatering av programtillegg + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml index 616ce779b..a5d0231ce 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml index 187900931..3124cc634 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml @@ -43,10 +43,15 @@ Wtyczka {0} została pomyślnie zaktualizowana. Proszę ponownie uruchomić Flow. {0} wtyczek zaktualizowano pomyślnie. Proszę ponownie uruchomić Flow. Wtyczka {0} została już zmodyfikowana. Proszę ponownie uruchomić Flow przed wprowadzeniem dalszych zmian. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Menadżer wtyczek - Zarządzanie instalowaniem, odinstalowywaniem i aktualizowaniem wtyczek Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window Nieznany autor @@ -61,5 +66,5 @@ Ostrzeżenie o instalacji z nieznanego źródła - Automatycznie uruchom ponownie Flow Launcher po zainstalowaniu/odinstalowaniu/zaktualizowaniu wtyczek + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml index 179bcab97..2407d5b6e 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml index 01535c689..40cfc8253 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml @@ -43,10 +43,15 @@ Plugin {0} atualizado com sucesso. Por favor, reinicie o Flow Launcher. {0} plugins atualizados com sucesso. Deve reiniciar Flow Launcher. O plugin {0} foi modificado. Por favor, reinicie o Flow Launcher antes de fazer mais alterações. + {0} já modificado + Reinicie Flow Launcher antes de fazer mais alterações + + Ficheiro Zip inválido + Verifique se existe o ficheiro "plugin.json" em {0} Gestor de plugins - Módulo para instalar, desinstalar e atualizar os plugins do Flow Launcher + Instalar, desinstalar ou atualizar plugins do Flow Launcher através da janela de pesquisa Autor desconhecido @@ -61,5 +66,5 @@ Aviso ao instalar de fontes desconhecidas - Reiniciar automaticamente após instalar/desinstalar/atualizar plugins + Reiniciar Flow Launcher após instalar/desinstalar/atualizar um plugin via Gestor de plugins diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml index 5b0a379b5..18913c7c6 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Автор неизвестен @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml index 5529b2fc1..f788c9ce3 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml @@ -43,10 +43,15 @@ Plugin {0} bol úspešne aktualizovaný. Prosím, reštartuje Flow. Pluginy úspešne aktualizované ({0}). Reštartuje Flow. Plugin {0} už bol upravený. Prosím, reštartuje Flow pred ďalšími zmenami. + Plugin {0} už bol upravený + Pred vykonaním ďalších zmien reštartujte Flow Launcher + + Neplatný inštalačný súbor zip + Skontrolujte, či sa v {0} nachádza plugin.json Správca pluginov - Správa inštalácie, odinštalácie alebo aktualizácie pluginov programu Flow Launcher + Inštalovať, odinštalovať alebo aktualizovať pluginy Flow Launchera cez vyhľadávacie okno Neznámy autor @@ -61,5 +66,5 @@ Upozornenie na inštaláciu z neznámeho zdroja - Automaticky reštartovať Flow Launcher po inštalácií/odinštalácii/aktualizáciu pluginov + Automaticky reštartovať Flow Launcher po inštalácii/odinštalácii/aktualizáciu pluginu cez Správcu pluginov diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml index 616ce779b..a5d0231ce 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml index 14f2e1309..ed9aaf4b3 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Bilinmeyen Yazar @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml index 3d2b50a78..e07f417c7 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml @@ -13,8 +13,8 @@ Встановлення плагіна Завантажити та встановити {0} Видалення плагіна - Keep plugin settings - Do you want to keep the settings of the plugin for the next usage? + Зберегти налаштування плагіну + Хочете зберегти налаштування плагіну для наступного використання? Plugin successfully installed. Restarting Flow, please wait... Не вдалося знайти файл метаданих plugin.json у розпакованому zip-архіві. Помилка: Плагін, який має ідентичну або новішу версію з {0}, вже існує. @@ -43,10 +43,15 @@ Плагін {0} успішно оновлено. Будь ласка, перезапустіть Flow. {0} плагіни успішно оновлено. Будь ласка, перезапустіть Flow. Плагін {0} вже було змінено. Будь ласка, перезапустіть Flow, перш ніж вносити будь-які подальші зміни. + {0} вже змінено + Перезапустіть Flow перед тим, як вносити будь-які подальші зміни. + + Неправильний встановлюваний zip-файл + Перевірте, чи є файл plugin.json у {0}. Менеджер плагінів - Керування встановленням, видаленням або оновленням плагінів Flow Launcher + Встановити, видалити або оновити плагіни Flow Launcher через вікно пошуку. Невідомий автор @@ -61,5 +66,5 @@ Попередження про встановлення з невідомого джерела - Автоматичний перезапуск Flow Launcher після встановлення/видалення/оновлення плагінів + Автоматично перезапускати Flow Launcher після встановлення / видалення / оновлення плагіну за допомогою Менеджера плагінів diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml index 3f9315d60..1a2a5c93a 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Trình quản lý plugin - Quản lý cài đặt, gỡ cài đặt hoặc cập nhật plugin Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window Không rõ tác giả @@ -61,5 +66,5 @@ Cảnh báo cài đặt từ nguồn không xác định - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml index 1a4199965..446609850 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml @@ -43,10 +43,15 @@ 成功更新插件{0}。请重新启动 Flow Launcher。 插件 {0} 更新成功。请重新启动 Flow Launcher。 插件 {0} 已被修改。请在进行任何进一步更改之前重新启动Flow。 + {0} 已被修改 + 请在进行任何进一步更改之前重新启动 Flow + + 无效的 zip 安装程序文件 + 请检查 {0} 中是否有plugin.json 插件管理 - 安装,卸载或更新 Flow Launcher 插件 + 通过搜索窗口安装、卸载或更新 Flow Launcher 插件 未知作者 @@ -61,5 +66,5 @@ 未知源安装警告 - 安装/卸载/更新插件后自动重启 Flow Launcher + 通过插件管理器安装/卸载/更新插件后自动重启 Flow Launcher diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml index f16feb050..ddd24d0ed 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} 擴充功能管理 - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window 未知的作者 @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs index 25182f6d3..efbe8d7ba 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs @@ -114,6 +114,14 @@ namespace Flow.Launcher.Plugin.PluginsManager return; } + if (Context.API.PluginModified(plugin.ID)) + { + Context.API.ShowMsgError( + string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_title"), plugin.Name), + Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_message")); + return; + } + string message; if (Settings.AutoRestartAfterChanging) { @@ -158,7 +166,8 @@ namespace Flow.Launcher.Plugin.PluginsManager if (cts.IsCancellationRequested) return; else - Install(plugin, filePath); + if (!Install(plugin, filePath)) + return; } catch (HttpRequestException e) { @@ -196,7 +205,7 @@ namespace Flow.Launcher.Plugin.PluginsManager } } - private async Task DownloadFileAsync(string prgBoxTitle, string downloadUrl, string filePath, CancellationTokenSource cts, bool deleteFile = true, bool showProgress = true) + private async Task DownloadFileAsync(string progressBoxTitle, string downloadUrl, string filePath, CancellationTokenSource cts, bool deleteFile = true, bool showProgress = true) { if (deleteFile && File.Exists(filePath)) File.Delete(filePath); @@ -204,12 +213,12 @@ namespace Flow.Launcher.Plugin.PluginsManager if (showProgress) { var exceptionHappened = false; - await Context.API.ShowProgressBoxAsync(prgBoxTitle, + await Context.API.ShowProgressBoxAsync(progressBoxTitle, async (reportProgress) => { if (reportProgress == null) { - // when reportProgress is null, it means there is expcetion with the progress box + // when reportProgress is null, it means there is exception with the progress box // so we record it with exceptionHappened and return so that progress box will close instantly exceptionHappened = true; return; @@ -242,6 +251,18 @@ namespace Flow.Launcher.Plugin.PluginsManager if (FilesFolders.IsZipFilePath(search, checkFileExists: true)) { pluginFromLocalPath = Utilities.GetPluginInfoFromZip(search); + + if (pluginFromLocalPath == null) return new List + { + new() + { + Title = Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_title"), + SubTitle = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_subtitle"), + search), + IcoPath = icoPath + } + }; + pluginFromLocalPath.LocalInstallPath = search; updateFromLocalPath = true; } @@ -261,6 +282,7 @@ namespace Flow.Launcher.Plugin.PluginsManager select new { + existingPlugin.Metadata.ID, pluginUpdateSource.Name, pluginUpdateSource.Author, CurrentVersion = existingPlugin.Metadata.Version, @@ -290,6 +312,14 @@ namespace Flow.Launcher.Plugin.PluginsManager IcoPath = x.IcoPath, Action = e => { + if (Context.API.PluginModified(x.ID)) + { + Context.API.ShowMsgError( + string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_title"), x.Name), + Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_message")); + return false; + } + string message; if (Settings.AutoRestartAfterChanging) { @@ -340,8 +370,11 @@ namespace Flow.Launcher.Plugin.PluginsManager } else { - await Context.API.UpdatePluginAsync(x.PluginExistingMetadata, x.PluginNewUserPlugin, - downloadToFilePath); + if (!await Context.API.UpdatePluginAsync(x.PluginExistingMetadata, x.PluginNewUserPlugin, + downloadToFilePath)) + { + return; + } if (Settings.AutoRestartAfterChanging) { @@ -406,6 +439,14 @@ namespace Flow.Launcher.Plugin.PluginsManager IcoPath = icoPath, AsyncAction = async e => { + if (resultsForUpdate.All(x => Context.API.PluginModified(x.ID))) + { + Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_install_error_title"), + string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"), + string.Join(" ", resultsForUpdate.Select(x => x.Name)))); + return false; + } + string message; if (Settings.AutoRestartAfterChanging) { @@ -427,6 +468,7 @@ namespace Flow.Launcher.Plugin.PluginsManager return false; } + var anyPluginSuccess = false; await Task.WhenAll(resultsForUpdate.Select(async plugin => { var downloadToFilePath = Path.Combine(Path.GetTempPath(), @@ -444,8 +486,11 @@ namespace Flow.Launcher.Plugin.PluginsManager if (cts.IsCancellationRequested) return; else - await Context.API.UpdatePluginAsync(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, - downloadToFilePath); + if (!await Context.API.UpdatePluginAsync(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, + downloadToFilePath)) + return; + + anyPluginSuccess = true; } catch (Exception ex) { @@ -458,6 +503,8 @@ namespace Flow.Launcher.Plugin.PluginsManager } })); + if (!anyPluginSuccess) return false; + if (Settings.AutoRestartAfterChanging) { Context.API.ShowMsg(Context.API.GetTranslation("plugin_pluginsmanager_update_title"), @@ -559,6 +606,20 @@ namespace Flow.Launcher.Plugin.PluginsManager { var plugin = Utilities.GetPluginInfoFromZip(localPath); + if (plugin == null) + { + return new List + { + new() + { + Title = Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_title"), + SubTitle = string.Format(Context.API.GetTranslation("plugin_pluginsmanager_invalid_zip_subtitle"), + localPath), + IcoPath = icoPath + } + }; + } + plugin.LocalInstallPath = localPath; return new List @@ -600,14 +661,17 @@ namespace Flow.Launcher.Plugin.PluginsManager return false; var author = pieces[3]; + var acceptedHost = "github.com"; var acceptedSource = "https://github.com"; var constructedUrlPart = string.Format("{0}/{1}/", acceptedSource, author); - return url.StartsWith(acceptedSource) && - Context.API.GetAllPlugins().Any(x => - !string.IsNullOrEmpty(x.Metadata.Website) && - x.Metadata.Website.StartsWith(constructedUrlPart) - ); + if (!Uri.TryCreate(url, UriKind.Absolute, out var uri) || uri.Host != acceptedHost) + return false; + + return Context.API.GetAllPlugins().Any(x => + !string.IsNullOrEmpty(x.Metadata.Website) && + x.Metadata.Website.StartsWith(constructedUrlPart) + ); } internal async ValueTask> RequestInstallOrUpdateAsync(string search, CancellationToken token, @@ -649,7 +713,7 @@ namespace Flow.Launcher.Plugin.PluginsManager return Search(results, search); } - private void Install(UserPlugin plugin, string downloadedFilePath) + private bool Install(UserPlugin plugin, string downloadedFilePath) { if (!File.Exists(downloadedFilePath)) throw new FileNotFoundException($"Plugin {plugin.ID} zip file not found at {downloadedFilePath}", @@ -657,10 +721,13 @@ namespace Flow.Launcher.Plugin.PluginsManager try { - Context.API.InstallPlugin(plugin, downloadedFilePath); + if (!Context.API.InstallPlugin(plugin, downloadedFilePath)) + return false; if (!plugin.IsFromLocalInstallPath) File.Delete(downloadedFilePath); + + return true; } catch (FileNotFoundException e) { @@ -682,6 +749,8 @@ namespace Flow.Launcher.Plugin.PluginsManager plugin.Name)); Context.API.LogException(ClassName, e.Message, e); } + + return false; } internal List RequestUninstall(string search) @@ -696,6 +765,14 @@ namespace Flow.Launcher.Plugin.PluginsManager IcoPath = x.Metadata.IcoPath, AsyncAction = async e => { + if (Context.API.PluginModified(x.Metadata.ID)) + { + Context.API.ShowMsgError( + string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_title"), x.Metadata.Name), + Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error_message")); + return false; + } + string message; if (Settings.AutoRestartAfterChanging) { @@ -717,7 +794,10 @@ namespace Flow.Launcher.Plugin.PluginsManager MessageBoxButton.YesNo) == MessageBoxResult.Yes) { Context.API.HideMainWindow(); - await UninstallAsync(x.Metadata); + if (!await UninstallAsync(x.Metadata)) + { + return false; + } if (Settings.AutoRestartAfterChanging) { Context.API.RestartApp(); @@ -742,7 +822,7 @@ namespace Flow.Launcher.Plugin.PluginsManager return Search(results, search); } - private async Task UninstallAsync(PluginMetadata plugin) + private async Task UninstallAsync(PluginMetadata plugin) { try { @@ -750,13 +830,14 @@ namespace Flow.Launcher.Plugin.PluginsManager Context.API.GetTranslation("plugin_pluginsmanager_keep_plugin_settings_subtitle"), Context.API.GetTranslation("plugin_pluginsmanager_keep_plugin_settings_title"), button: MessageBoxButton.YesNo) == MessageBoxResult.No; - await Context.API.UninstallPluginAsync(plugin, removePluginSettings); + return await Context.API.UninstallPluginAsync(plugin, removePluginSettings); } catch (ArgumentException e) { Context.API.LogException(ClassName, e.Message, e); Context.API.ShowMsgError(Context.API.GetTranslation("plugin_pluginsmanager_uninstall_error_title"), - Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error")); + string.Format(Context.API.GetTranslation("plugin_pluginsmanager_plugin_modified_error"), plugin.Name)); + return false; } } } diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs index 4bb78f6ff..d76ce40c4 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs @@ -65,9 +65,7 @@ namespace Flow.Launcher.Plugin.PluginsManager using (ZipArchive archive = System.IO.Compression.ZipFile.OpenRead(filePath)) { - var pluginJsonPath = archive.Entries.FirstOrDefault(x => x.Name == "plugin.json").ToString(); - ZipArchiveEntry pluginJsonEntry = archive.GetEntry(pluginJsonPath); - + var pluginJsonEntry = archive.Entries.FirstOrDefault(x => x.Name == "plugin.json"); if (pluginJsonEntry != null) { using Stream stream = pluginJsonEntry.Open(); diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json index 327011ac3..949e9e9db 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json @@ -4,7 +4,7 @@ "pm" ], "Name": "Plugins Manager", - "Description": "Management of installing, uninstalling or updating Flow Launcher plugins", + "Description": "Install, uninstall or update Flow Launcher plugins via the search window", "Author": "Jeremy Wu", "Version": "1.0.0", "Language": "csharp", diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml index 7e59db5ec..1d7ff227b 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml @@ -8,7 +8,7 @@ zamknij {0} procesów zamknij wszystkie instancje - Show title for processes with visible windows - Put processes with visible windows on the top + Pokaż tytuł dla procesów z widocznymi oknami + Umieść procesy z widocznymi oknami na górze diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml index 56004028b..6d2086abc 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml @@ -8,7 +8,7 @@ вбити {0} процесів вбити всі екземпляри - Show title for processes with visible windows - Put processes with visible windows on the top + Показувати назву процесів із видимими вікнами + Помістити процеси з видимими вікнами у верхній частині diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml index 7919ae7cb..cf716a153 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml @@ -46,8 +46,8 @@ Bitte wählen Sie eine Programmquelle aus Sind Sie sicher, dass Sie die ausgewählten Programmquellen löschen wollen? - Please select program sources that are not added by you - Please select program sources that are added by you + Bitte wählen Sie die Programmquellen aus, die nicht von Ihnen hinzugefügt werden + Bitte wählen Sie die Programmquellen aus, die von Ihnen hinzugefügt werden Eine andere Programmquelle mit dem gleichen Ort ist bereits vorhanden. Programmquelle @@ -76,7 +76,7 @@ Als anderer Benutzer ausführen Als Administrator ausführen Enthaltenden Ordner öffnen - Hide + Ausblenden Zielordner öffnen Programm diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml index 4a1d815ec..0134627c5 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml @@ -6,14 +6,14 @@ 削除 編集 追加 - Name + 名前 有効 Enabled 無効 Status Enabled Disabled - Location + 場所 All Programs File Type Reindex diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml index 290954d5f..29158b2ce 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml @@ -34,8 +34,8 @@ Приховує програми з поширеними назвами деінсталяторів, наприклад, unins000.exe Пошук в описі програми Flow буде шукати опис програми - Hide duplicated apps - Hide duplicated Win32 programs that are already in the UWP list + Приховати дублікати застосунків + Приховати дублікати програми Win32, які вже є в списку UWP Суфікси Максимальна глибина @@ -46,8 +46,8 @@ Будь ласка, виберіть джерело програми Ви впевнені, що хочете видалити вибрані джерела програм? - Please select program sources that are not added by you - Please select program sources that are added by you + Виберіть джерела програм, які не були додані вами. + Виберіть джерела програм, які були додані вами. Інше програмне джерело з тим самим розташуванням вже існує. Вихідний код програми @@ -76,7 +76,7 @@ Запустити від імені іншого користувача Запустити від імені адміністратора Відкрити папку - Hide + Приховати Відкрити цільову папку Програма @@ -86,7 +86,7 @@ Кастомізований провідник Аргументи - You can customize the explorer used for opening the container folder by inputing the Environmental Variable of the explorer you want to use. It will be useful to use CMD to test whether the Environmental Variable is available. + Ви можете налаштувати провідник, який використовується для відкриття теки контейнера, ввівши змінну середовища провідника, який ви хочете використовувати. Буде корисно використовувати CMD, аби перевірити, чи доступна змінна середовища. Введіть спеціальні аргументи, які ви хочете додати до вашого провідника. %s для батьківського каталогу, %f для повного шляху (працює лише для win32). Докладнішу інформацію можна знайти на веб-сайті провідника. diff --git a/Plugins/Flow.Launcher.Plugin.Program/Main.cs b/Plugins/Flow.Launcher.Plugin.Program/Main.cs index b9187a801..b34f0a65b 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Main.cs @@ -103,7 +103,7 @@ namespace Flow.Launcher.Plugin.Program .Where(p => HideDuplicatedWindowsAppFilter(p, uwpsDirectories)) .Where(p => p.Enabled) .Select(p => p.Result(query.Search, Context.API)) - .Where(r => r?.Score > 0) + .Where(r => string.IsNullOrEmpty(query.Search) || r?.Score > 0) .ToList(); } catch (OperationCanceledException) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs index cb33250e1..28f774333 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs @@ -290,12 +290,13 @@ namespace Flow.Launcher.Plugin.Program.Programs } private static readonly Channel PackageChangeChannel = Channel.CreateBounded(1); + private static PackageCatalog? catalog; public static async Task WatchPackageChangeAsync() { if (Environment.OSVersion.Version.Major >= 10) { - var catalog = PackageCatalog.OpenForCurrentUser(); + catalog ??= PackageCatalog.OpenForCurrentUser(); catalog.PackageInstalling += (_, args) => { if (args.IsComplete) @@ -424,7 +425,7 @@ namespace Flow.Launcher.Plugin.Program.Programs } } - if (!matchResult.IsSearchPrecisionScoreMet()) + if (!matchResult.IsSearchPrecisionScoreMet() && !string.IsNullOrEmpty(query)) return null; var result = new Result @@ -468,7 +469,6 @@ namespace Flow.Launcher.Plugin.Program.Programs } }; - return result; } diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs index a87b002d4..7aca8f3b6 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs @@ -136,7 +136,7 @@ namespace Flow.Launcher.Plugin.Program.Programs List candidates = new List(); - if (!matchResult.IsSearchPrecisionScoreMet()) + if (!matchResult.IsSearchPrecisionScoreMet() && !string.IsNullOrEmpty(query)) { if (ExecutableName != null) // only lnk program will need this one { diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml index d209cb739..d47474784 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml @@ -6,7 +6,7 @@ Натисніть будь-яку клавішу, щоб закрити це вікно... Не закривати командний рядок після виконання команди Завжди запускати від імені адміністратора - Use Windows Terminal + Використовувати Термінал Windows Запустити від імені іншого користувача Shell Дозволяє виконувати системні команди з Flow Launcher diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml index 27fee87be..7d131d944 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml @@ -2,7 +2,7 @@ - Name + 名前 説明 コマンド diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml index c09a447d2..33cee56d8 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/pl.xaml @@ -69,7 +69,7 @@ Zresetuj Potwierdź Anuluj - Please enter a non-empty command keyword + Proszę wprowadzić niepuste słowo kluczowe polecenia Komendy systemowe Wykonywanie komend systemowych, np. wyłącz, zablokuj komputer, otwórz ustawienia itp. diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml index 19d69511b..c82be249a 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml @@ -26,7 +26,7 @@ Поради щодо Flow Launcher Тека UserData Flow Launcher Перемкнути режим гри - Set the Flow Launcher Theme + Встановити тему Flow Launcher Редагувати @@ -51,7 +51,7 @@ Перегляньте документацію Flow Launcher для отримання додаткової допомоги та підказок щодо використання порад Відкрити каталог, де зберігаються налаштування Flow Launcher Перемкнути режим гри - Quickly change the Flow Launcher theme + Швидко змінити тему Flow Launcher Успішно @@ -62,14 +62,14 @@ Ви впевнені, що хочете перезавантажити комп'ютер за допомогою додаткових параметрів завантаження? Ви впевнені, що хочете вийти з системи? - Command Keyword Setting - Custom Command Keyword - Enter a keyword to search for command: {0}. This keyword is used to match your query. - Command Keyword + Налаштування ключового слова команди + Власне ключове слово команди + Введіть ключове слово для пошуку команди: {0}. Це ключове слово використовується для відповідності вашому запиту. + Ключове слово команди Скинути Підтвердити Скасувати - Please enter a non-empty command keyword + Введіть непорожнє ключове слово команди Системні команди Надає команди, пов'язані з системою, наприклад, вимкнення, блокування, налаштування тощо. diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml index d693a3f28..05ee39777 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/pl.xaml @@ -17,7 +17,7 @@ Wyzwalacz Adres URL Szukaj - Use Search Query Autocomplete + Użyj autouzupełniania zapytań wyszukiwania Autouzupełnianie danych z: Musisz wybrać coś z listy Czy jesteś pewien że chcesz usunąć {0}? diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml index 5536a7e68..51e1efc6e 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml @@ -17,7 +17,7 @@ Ключове слово дії URL Пошук - Use Search Query Autocomplete + Використовувати автозаповнення пошукового запиту Автозаповнення даних з: Будь ласка, виберіть пошуковий запит в Інтернеті Ви впевнені, що хочете видалити {0}? @@ -29,8 +29,8 @@ Таким чином, загальна формула для пошуку на Netflix має вигляд https://www.netflix.com/search?q={q} - Copy URL - Copy search URL to clipboard + Копіювати URL + Скопіювати URL-адресу пошуку в буфер обміну Назва diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.de-DE.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.de-DE.resx index d9de28e4b..e963e34da 100644 --- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.de-DE.resx +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.de-DE.resx @@ -348,7 +348,7 @@ Area UpdateAndSecurity - Sichern und wiederherstellen + Sichern und Wiederherstellen Area Control Panel (legacy settings) @@ -1324,7 +1324,7 @@ Area Control Panel (legacy settings) - Remotedesktop + Remote-Desktop Area System @@ -1752,7 +1752,7 @@ Einen Dateityp immer in einem spezifischen Programm öffnen lassen - Stimme ändern + Ändern der Stimme des Erzählers Tastaturprobleme finden und beheben @@ -1761,7 +1761,7 @@ Screenreader verwenden - Arbeitsgruppe auf diesem Computer Anzeigen + Anzeigen, zu welcher Arbeitsgruppe dieser Computer gehört Mausrad-Einstellungen ändern @@ -1773,7 +1773,7 @@ Probleme finden und beheben - Einstellung für empfangene Inhalte von Tippen und Senden + Ändern der Einstellungen für Inhalte, die über Tippen und Senden empfangen werden Change default settings for media or devices @@ -1812,7 +1812,7 @@ Ein Bluetooth-Gerät hinzufügen - Customise the mouse buttons + Individuelles Anpassen der Maustasten Set tablet buttons to perform certain tasks @@ -1869,16 +1869,16 @@ Scanner und Kameras ansehen - Microsoft IME Register Word (Japanese) + Microsoft IME Register Word (Japanisch) - Restore your files with File History + Ihre Dateien mit File History wiederherstellen Turn On-Screen keyboard on or off - Block or allow third-party cookies + Cookies von Drittanbietern blockieren oder zulassen Audioaufzeichnungsprobleme finden und beheben @@ -1902,7 +1902,7 @@ Preview, delete, show or hide fonts - Microsoft Quick Settings + Microsoft-Schnelleinstellungen View reliability history @@ -1917,7 +1917,7 @@ Sicherheitsrichtlinien zurücksetzen - Pop-ups blockieren oder erlauben + Pop-ups blockieren oder zulassen Autovervollständigung im Internet Explorer ein- oder ausschalten @@ -1938,7 +1938,7 @@ Automatische Fensteranordnung ausschalten - Troubleshooting History + Fehlerbehebungshistorie Speicherprobleme Ihres Computers diagnostizieren @@ -1968,13 +1968,13 @@ Specify single- or double-click to open - Select users who can use remote desktop + Benutzer auswählen, die den Remote-Desktop verwenden können - Show which programs are installed on your computer + Anzeigen, welche Programme auf Ihrem Computer installiert sind - Allow remote access to your computer + Remote-Zugriff auf Ihren Computer erlauben Erweiterte Systemeinstellungen ansehen @@ -2082,7 +2082,7 @@ Ihren Wiederherstellungsschlüssel sichern - Save backup copies of your files with File History + Backup-Kopien Ihrer Dateien mit File History speichern View current accessibility settings @@ -2143,7 +2143,7 @@ Windows-Features ein- oder ausschalten - Betriebssystem, welches auf deinem Computer läuft, anzeigen + Anzeigen, welches Betriebssystem auf Ihrem Computer ausgeführt wird Lokale Dienste ansehen @@ -2176,7 +2176,7 @@ Change advanced colour management settings for displays, scanners and printers - Lasse Windows Vereinfachte Zugriffseinstellungen vorschlagen + Windows die Einstellungen für erleichterte Bedienung vorschlagen lassen Clear disk space by deleting unnecessary files @@ -2191,16 +2191,16 @@ Record steps to reproduce a problem - Aussehen und Leistung von Windows anpassen + Anpassen des Erscheinungsbildes und der Leistung von Windows Einstellungen für Microsoft IME (Japanisch) - Lade jemanden ein, sich mit deinem PC zu verbinden und dir zu helfen oder anderen zu helfen + Laden Sie jemanden ein, eine Verbindung zu Ihrem PC herzustellen und Ihnen zu helfen, oder bieten Sie an, jemand anderem zu helfen - Programme für frühere Versionen von Windows ausführen + Programme ausführen, die für frühere Versionen von Windows entwickelt wurden Choose the order of how your screen rotates @@ -2239,7 +2239,7 @@ Wählen Sie, wie Sie Links öffnen - Allow Remote Assistance invitations to be sent from this computer + Erlauben, dass Einladungen zur Remote-Unterstützung von diesem Computer aus gesendet werden Task-Manager @@ -2257,7 +2257,7 @@ Lupe ein- oder ausschalten - See the name of this computer + Den Namen dieses Computers ansehen Netzwerkverbindungen ansehen @@ -2302,13 +2302,13 @@ How to change the size of virtual memory - Hear text read aloud with Narrator + Text mit Erzähler vorlesen lassen Set up USB game controllers - Show which domain your computer is on + Anzeigen, in welcher Domäne sich Ihr Computer befindet Alle Problemberichte ansehen @@ -2401,7 +2401,7 @@ Create and format hard disk partitions - Change date, time or number formats + Datums-, Zeit- oder Zahlenformate ändern Change PC wake-up settings @@ -2452,13 +2452,13 @@ Change the way measurements are displayed - Press key combinations one at a time + Tastenkombinationen nacheinander drücken - Restore data, files or computer from backup (Windows 7) + Daten, Dateien oder Computer aus Backup wiederherstellen (Windows 7) - Set your default programs + Ihre per Default vorgegebenen Programme festlegen Eine Breitbandverbindung einrichten @@ -2473,10 +2473,10 @@ Geplante Tasks - Ignore repeated keystrokes using FilterKeys + Wiederholte Tastenanschläge unter Verwendung von FilterKeys ignorieren - Find and fix bluescreen problems + Probleme mit Bluescreens finden und beheben Einen Ton hören, wenn Tasten gedrückt werden @@ -2485,16 +2485,16 @@ Browsing-Historie löschen - Change what the power buttons do + Ändern, was die Power-Tasten bewirken - Create standard user account + Standard-Benutzerkonto erstellen Take speech tutorials - View system resource usage in Task Manager + Systemressourcennutzung im Task-Manager ansehen Einen Account erstellen diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx index 91be8a392..6625a42dd 100644 --- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx @@ -837,7 +837,7 @@ ライト モード - Location + 場所 Area Privacy diff --git a/appveyor.yml b/appveyor.yml index 646594f4a..39e2a114c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: '1.20.1.{build}' +version: '1.20.2.{build}' # Do not build on tags because we create a release on merge to master. Otherwise will upload artifacts twice changing the hash, as well as triggering duplicate GitHub release action & NuGet deployments. skip_tags: true