diff --git a/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs b/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs index 64c4cd627..79d6d7605 100644 --- a/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs +++ b/Flow.Launcher.Core/ExternalPlugins/UserPlugin.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace Flow.Launcher.Core.ExternalPlugins { @@ -13,9 +13,11 @@ namespace Flow.Launcher.Core.ExternalPlugins public string Website { get; set; } public string UrlDownload { get; set; } public string UrlSourceCode { get; set; } + public string LocalInstallPath { get; set; } public string IcoPath { get; set; } public DateTime? LatestReleaseDate { get; set; } public DateTime? DateAdded { get; set; } + public bool IsFromLocalInstallPath => !string.IsNullOrEmpty(LocalInstallPath); } } diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs index 46c72624a..5a6633525 100644 --- a/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs +++ b/Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs @@ -139,11 +139,20 @@ namespace Flow.Launcher.Core.Plugin return Task.CompletedTask; } - public virtual ValueTask DisposeAsync() + public virtual async ValueTask DisposeAsync() { - RPC?.Dispose(); - ErrorStream?.Dispose(); - return ValueTask.CompletedTask; + try + { + await RPC.InvokeAsync("close"); + } + catch (RemoteMethodNotFoundException e) + { + } + finally + { + RPC?.Dispose(); + ErrorStream?.Dispose(); + } } } } diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 7f4d4ea35..e7dfb31c0 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -380,7 +380,8 @@ namespace Flow.Launcher.Core.Plugin /// - /// Update a plugin to new version, from a zip file. Will Delete zip after updating. + /// Update a plugin to new version, from a zip file. By default will remove the zip file if update is via url, + /// unless it's a local path installation /// public static void UpdatePlugin(PluginMetadata existingVersion, UserPlugin newVersion, string zipFilePath) { @@ -390,11 +391,11 @@ namespace Flow.Launcher.Core.Plugin } /// - /// Install a plugin. Will Delete zip after updating. + /// Install a plugin. By default will remove the zip file if installation is from url, unless it's a local path installation /// public static void InstallPlugin(UserPlugin plugin, string zipFilePath) { - InstallPlugin(plugin, zipFilePath, true); + InstallPlugin(plugin, zipFilePath, checkModified: true); } /// @@ -420,7 +421,9 @@ namespace Flow.Launcher.Core.Plugin // Unzip plugin files to temp folder var tempFolderPluginPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); System.IO.Compression.ZipFile.ExtractToDirectory(zipFilePath, tempFolderPluginPath); - File.Delete(zipFilePath); + + if(!plugin.IsFromLocalInstallPath) + File.Delete(zipFilePath); var pluginFolderPath = GetContainingFolderPathAfterUnzip(tempFolderPluginPath); diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs index acc693ed5..06eb868b8 100644 --- a/Flow.Launcher.Core/Resource/Internationalization.cs +++ b/Flow.Launcher.Core/Resource/Internationalization.cs @@ -96,13 +96,10 @@ namespace Flow.Launcher.Core.Resource { LoadLanguage(language); } - // Culture of this thread - // Use CreateSpecificCulture to preserve possible user-override settings in Windows + // Culture of main thread + // Use CreateSpecificCulture to preserve possible user-override settings in Windows, if Flow's language culture is the same as Windows's CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(language.LanguageCode); CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture; - // App domain - CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture(language.LanguageCode); - CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.DefaultThreadCurrentCulture; // Raise event after culture is set Settings.Language = language.LanguageCode; @@ -193,7 +190,7 @@ namespace Flow.Launcher.Core.Resource { p.Metadata.Name = pluginI18N.GetTranslatedPluginTitle(); p.Metadata.Description = pluginI18N.GetTranslatedPluginDescription(); - pluginI18N.OnCultureInfoChanged(CultureInfo.DefaultThreadCurrentCulture); + pluginI18N.OnCultureInfoChanged(CultureInfo.CurrentCulture); } catch (Exception e) { diff --git a/Flow.Launcher.Core/Resource/Theme.cs b/Flow.Launcher.Core/Resource/Theme.cs index 96338cf6a..61f0b18e0 100644 --- a/Flow.Launcher.Core/Resource/Theme.cs +++ b/Flow.Launcher.Core/Resource/Theme.cs @@ -176,8 +176,6 @@ namespace Flow.Launcher.Core.Resource } if (dict["ItemTitleStyle"] is Style resultItemStyle && - dict["ItemSubTitleStyle"] is Style resultSubItemStyle && - dict["ItemSubTitleSelectedStyle"] is Style resultSubItemSelectedStyle && dict["ItemTitleSelectedStyle"] is Style resultItemSelectedStyle && dict["ItemHotkeyStyle"] is Style resultHotkeyItemStyle && dict["ItemHotkeySelectedStyle"] is Style resultHotkeyItemSelectedStyle) @@ -189,9 +187,25 @@ namespace Flow.Launcher.Core.Resource Setter[] setters = { fontFamily, fontStyle, fontWeight, fontStretch }; Array.ForEach( - new[] { resultItemStyle, resultSubItemStyle, resultItemSelectedStyle, resultSubItemSelectedStyle, resultHotkeyItemStyle, resultHotkeyItemSelectedStyle }, o + new[] { resultItemStyle, resultItemSelectedStyle, resultHotkeyItemStyle, resultHotkeyItemSelectedStyle }, o => Array.ForEach(setters, p => o.Setters.Add(p))); } + + if ( + dict["ItemSubTitleStyle"] is Style resultSubItemStyle && + dict["ItemSubTitleSelectedStyle"] is Style resultSubItemSelectedStyle) + { + Setter fontFamily = new Setter(TextBlock.FontFamilyProperty, new FontFamily(Settings.ResultSubFont)); + Setter fontStyle = new Setter(TextBlock.FontStyleProperty, FontHelper.GetFontStyleFromInvariantStringOrNormal(Settings.ResultSubFontStyle)); + Setter fontWeight = new Setter(TextBlock.FontWeightProperty, FontHelper.GetFontWeightFromInvariantStringOrNormal(Settings.ResultSubFontWeight)); + Setter fontStretch = new Setter(TextBlock.FontStretchProperty, FontHelper.GetFontStretchFromInvariantStringOrNormal(Settings.ResultSubFontStretch)); + + Setter[] setters = { fontFamily, fontStyle, fontWeight, fontStretch }; + Array.ForEach( + new[] { resultSubItemStyle,resultSubItemSelectedStyle}, o + => Array.ForEach(setters, p => o.Setters.Add(p))); + } + /* Ignore Theme Window Width and use setting */ var windowStyle = dict["WindowStyle"] as Style; var width = Settings.WindowSize; diff --git a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj index 831091732..e36b9c5e0 100644 --- a/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj +++ b/Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj @@ -57,8 +57,6 @@ - - diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 7bb8fe200..6528f626c 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -31,6 +31,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings public string SelectPrevPageHotkey { get; set; } = $"PageDown"; public string OpenContextMenuHotkey { get; set; } = $"Ctrl+O"; public string SettingWindowHotkey { get; set; } = $"Ctrl+I"; + public string CycleHistoryUpHotkey { get; set; } = $"{KeyConstant.Alt} + Up"; + public string CycleHistoryDownHotkey { get; set; } = $"{KeyConstant.Alt} + Down"; public string Language { @@ -54,6 +56,13 @@ namespace Flow.Launcher.Infrastructure.UserSettings } } public bool UseDropShadowEffect { get; set; } = false; + + /* Appearance Settings. It should be separated from the setting later.*/ + public double WindowHeightSize { get; set; } = 42; + public double ItemHeightSize { get; set; } = 58; + public double QueryBoxFontSize { get; set; } = 20; + public double ResultItemFontSize { get; set; } = 16; + public double ResultSubItemFontSize { get; set; } = 13; public string QueryBoxFont { get; set; } = FontFamily.GenericSansSerif.Name; public string QueryBoxFontStyle { get; set; } public string QueryBoxFontWeight { get; set; } @@ -62,6 +71,10 @@ namespace Flow.Launcher.Infrastructure.UserSettings public string ResultFontStyle { get; set; } public string ResultFontWeight { get; set; } public string ResultFontStretch { get; set; } + public string ResultSubFont { get; set; } = FontFamily.GenericSansSerif.Name; + public string ResultSubFontStyle { get; set; } + public string ResultSubFontWeight { get; set; } + public string ResultSubFontStretch { get; set; } public bool UseGlyphIcons { get; set; } = true; public bool UseAnimation { get; set; } = true; public bool UseSound { get; set; } = true; @@ -175,32 +188,16 @@ namespace Flow.Launcher.Infrastructure.UserSettings public bool AlwaysPreview { get; set; } = false; public bool AlwaysStartEn { get; set; } = false; + private SearchPrecisionScore _querySearchPrecision = SearchPrecisionScore.Regular; [JsonInclude, JsonConverter(typeof(JsonStringEnumConverter))] - public SearchPrecisionScore QuerySearchPrecision { get; private set; } = SearchPrecisionScore.Regular; - - [JsonIgnore] - public string QuerySearchPrecisionString + public SearchPrecisionScore QuerySearchPrecision { - get { return QuerySearchPrecision.ToString(); } + get => _querySearchPrecision; set { - try - { - var precisionScore = (SearchPrecisionScore)Enum - .Parse(typeof(SearchPrecisionScore), value); - - QuerySearchPrecision = precisionScore; - StringMatcher.Instance.UserSettingSearchPrecision = precisionScore; - } - catch (ArgumentException e) - { - Logger.Log.Exception(nameof(Settings), "Failed to load QuerySearchPrecisionString value from Settings file", e); - - QuerySearchPrecision = SearchPrecisionScore.Regular; - StringMatcher.Instance.UserSettingSearchPrecision = SearchPrecisionScore.Regular; - - throw; - } + _querySearchPrecision = value; + if (StringMatcher.Instance != null) + StringMatcher.Instance.UserSettingSearchPrecision = value; } } @@ -219,6 +216,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings /// public double CustomWindowTop { get; set; } = 0; + public bool KeepMaxResults { get; set; } = false; public int MaxResultsToShow { get; set; } = 5; public int ActivateTimes { get; set; } @@ -271,6 +269,9 @@ namespace Flow.Launcher.Infrastructure.UserSettings public AnimationSpeeds AnimationSpeed { get; set; } = AnimationSpeeds.Medium; public int CustomAnimationLength { get; set; } = 360; + [JsonIgnore] + public bool WMPInstalled { get; set; } = true; + // This needs to be loaded last by staying at the bottom public PluginsSettings PluginSettings { get; set; } = new PluginsSettings(); @@ -280,42 +281,9 @@ namespace Flow.Launcher.Infrastructure.UserSettings { get { - var list = new List - { - new("Up", "HotkeyLeftRightDesc"), - new("Down", "HotkeyLeftRightDesc"), - new("Left", "HotkeyUpDownDesc"), - new("Right", "HotkeyUpDownDesc"), - new("Escape", "HotkeyESCDesc"), - new("F5", "ReloadPluginHotkey"), - new("Alt+Home", "HotkeySelectFirstResult"), - new("Alt+End", "HotkeySelectLastResult"), - new("Ctrl+R", "HotkeyRequery"), - new("Ctrl+H", "ToggleHistoryHotkey"), - new("Ctrl+OemCloseBrackets", "QuickWidthHotkey"), - new("Ctrl+OemOpenBrackets", "QuickWidthHotkey"), - new("Ctrl+OemPlus", "QuickHeightHotkey"), - new("Ctrl+OemMinus", "QuickHeightHotkey"), - new("Ctrl+Shift+Enter", "HotkeyCtrlShiftEnterDesc"), - new("Shift+Enter", "OpenContextMenuHotkey"), - new("Enter", "HotkeyRunDesc"), - new("Ctrl+Enter", "OpenContainFolderHotkey"), - new("Alt+Enter", "HotkeyOpenResult"), - new("Ctrl+F12", "ToggleGameModeHotkey"), - new("Ctrl+Shift+C", "CopyFilePathHotkey"), - - new($"{OpenResultModifiers}+D1", "HotkeyOpenResultN", 1), - new($"{OpenResultModifiers}+D2", "HotkeyOpenResultN", 2), - new($"{OpenResultModifiers}+D3", "HotkeyOpenResultN", 3), - new($"{OpenResultModifiers}+D4", "HotkeyOpenResultN", 4), - new($"{OpenResultModifiers}+D5", "HotkeyOpenResultN", 5), - new($"{OpenResultModifiers}+D6", "HotkeyOpenResultN", 6), - new($"{OpenResultModifiers}+D7", "HotkeyOpenResultN", 7), - new($"{OpenResultModifiers}+D8", "HotkeyOpenResultN", 8), - new($"{OpenResultModifiers}+D9", "HotkeyOpenResultN", 9), - new($"{OpenResultModifiers}+D0", "HotkeyOpenResultN", 10) - }; + var list = FixedHotkeys(); + // Customizeable hotkeys if(!string.IsNullOrEmpty(Hotkey)) list.Add(new(Hotkey, "flowlauncherHotkey", () => Hotkey = "")); if(!string.IsNullOrEmpty(PreviewHotkey)) @@ -340,7 +308,12 @@ namespace Flow.Launcher.Infrastructure.UserSettings list.Add(new(SelectNextPageHotkey, "SelectNextPageHotkey", () => SelectNextPageHotkey = "")); if(!string.IsNullOrEmpty(SelectPrevPageHotkey)) list.Add(new(SelectPrevPageHotkey, "SelectPrevPageHotkey", () => SelectPrevPageHotkey = "")); + if (!string.IsNullOrEmpty(CycleHistoryUpHotkey)) + list.Add(new(CycleHistoryUpHotkey, "CycleHistoryUpHotkey", () => CycleHistoryUpHotkey = "")); + if (!string.IsNullOrEmpty(CycleHistoryDownHotkey)) + list.Add(new(CycleHistoryDownHotkey, "CycleHistoryDownHotkey", () => CycleHistoryDownHotkey = "")); + // Custom Query Hotkeys foreach (var customPluginHotkey in CustomPluginHotkeys) { if (!string.IsNullOrEmpty(customPluginHotkey.Hotkey)) @@ -350,6 +323,45 @@ namespace Flow.Launcher.Infrastructure.UserSettings return list; } } + + private List FixedHotkeys() + { + return new List + { + new("Up", "HotkeyLeftRightDesc"), + new("Down", "HotkeyLeftRightDesc"), + new("Left", "HotkeyUpDownDesc"), + new("Right", "HotkeyUpDownDesc"), + new("Escape", "HotkeyESCDesc"), + new("F5", "ReloadPluginHotkey"), + new("Alt+Home", "HotkeySelectFirstResult"), + new("Alt+End", "HotkeySelectLastResult"), + new("Ctrl+R", "HotkeyRequery"), + new("Ctrl+H", "ToggleHistoryHotkey"), + new("Ctrl+OemCloseBrackets", "QuickWidthHotkey"), + new("Ctrl+OemOpenBrackets", "QuickWidthHotkey"), + new("Ctrl+OemPlus", "QuickHeightHotkey"), + new("Ctrl+OemMinus", "QuickHeightHotkey"), + new("Ctrl+Shift+Enter", "HotkeyCtrlShiftEnterDesc"), + new("Shift+Enter", "OpenContextMenuHotkey"), + new("Enter", "HotkeyRunDesc"), + new("Ctrl+Enter", "OpenContainFolderHotkey"), + new("Alt+Enter", "HotkeyOpenResult"), + new("Ctrl+F12", "ToggleGameModeHotkey"), + new("Ctrl+Shift+C", "CopyFilePathHotkey"), + + new($"{OpenResultModifiers}+D1", "HotkeyOpenResultN", 1), + new($"{OpenResultModifiers}+D2", "HotkeyOpenResultN", 2), + new($"{OpenResultModifiers}+D3", "HotkeyOpenResultN", 3), + new($"{OpenResultModifiers}+D4", "HotkeyOpenResultN", 4), + new($"{OpenResultModifiers}+D5", "HotkeyOpenResultN", 5), + new($"{OpenResultModifiers}+D6", "HotkeyOpenResultN", 6), + new($"{OpenResultModifiers}+D7", "HotkeyOpenResultN", 7), + new($"{OpenResultModifiers}+D8", "HotkeyOpenResultN", 8), + new($"{OpenResultModifiers}+D9", "HotkeyOpenResultN", 9), + new($"{OpenResultModifiers}+D0", "HotkeyOpenResultN", 10) + }; + } } public enum LastQueryMode diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs index fc6c5d185..ea79386b3 100644 --- a/Flow.Launcher.Plugin/Result.cs +++ b/Flow.Launcher.Plugin/Result.cs @@ -204,7 +204,7 @@ namespace Flow.Launcher.Plugin Score = Score, TitleHighlightData = TitleHighlightData, OriginQuery = OriginQuery, - PluginDirectory = PluginDirectory + PluginDirectory = PluginDirectory, }; } @@ -258,7 +258,7 @@ namespace Flow.Launcher.Plugin public string ProgressBarColor { get; set; } = "#26a0da"; /// - /// Contains data used to populate the the preview section of this result. + /// Contains data used to populate the preview section of this result. /// public PreviewInfo Preview { get; set; } = PreviewInfo.Default; diff --git a/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs b/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs index 4137ca8d0..dd8c4b112 100644 --- a/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs +++ b/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Linq; #pragma warning disable IDE0005 using System.Windows; #pragma warning restore IDE0005 @@ -200,6 +201,24 @@ namespace Flow.Launcher.Plugin.SharedCommands } } + /// + /// This checks whether a given string is a zip file path. + /// By default does not check if the zip file actually exist on disk, can do so by + /// setting checkFileExists = true. + /// + public static bool IsZipFilePath(string querySearchString, bool checkFileExists = false) + { + if (IsLocationPathString(querySearchString) && querySearchString.Split('.').Last() == "zip") + { + if (checkFileExists) + return FileExists(querySearchString); + + return true; + } + + return false; + } + /// /// This checks whether a given string is a directory path or network location string. /// It does not check if location actually exists. diff --git a/Flow.Launcher.Test/Plugins/ExplorerTest.cs b/Flow.Launcher.Test/Plugins/ExplorerTest.cs index e9d37433f..80cb74729 100644 --- a/Flow.Launcher.Test/Plugins/ExplorerTest.cs +++ b/Flow.Launcher.Test/Plugins/ExplorerTest.cs @@ -191,11 +191,15 @@ namespace Flow.Launcher.Test.Plugins [TestCase(@"\c:\", false)] [TestCase(@"cc:\", false)] [TestCase(@"\\\SomeNetworkLocation\", false)] + [TestCase(@"\\SomeNetworkLocation\", true)] [TestCase("RandomFile", false)] [TestCase(@"c:\>*", true)] [TestCase(@"c:\>", true)] [TestCase(@"c:\SomeLocation\SomeOtherLocation\>", true)] [TestCase(@"c:\SomeLocation\SomeOtherLocation", true)] + [TestCase(@"c:\SomeLocation\SomeOtherLocation\SomeFile.exe", true)] + [TestCase(@"\\SomeNetworkLocation\SomeFile.exe", true)] + public void WhenGivenQuerySearchString_ThenShouldIndicateIfIsLocationPathString(string querySearchString, bool expectedResult) { // When, Given diff --git a/Flow.Launcher.sln b/Flow.Launcher.sln index 13e98833a..e44b23232 100644 --- a/Flow.Launcher.sln +++ b/Flow.Launcher.sln @@ -54,6 +54,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Scripts\post_build.ps1 = Scripts\post_build.ps1 README.md = README.md SolutionAssemblyInfo.cs = SolutionAssemblyInfo.cs + Settings.XamlStyler = Settings.XamlStyler EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Flow.Launcher.Plugin.Shell", "Plugins\Flow.Launcher.Plugin.Shell\Flow.Launcher.Plugin.Shell.csproj", "{C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}" diff --git a/Flow.Launcher/App.xaml b/Flow.Launcher/App.xaml index b8e2a1cfe..76a613c3f 100644 --- a/Flow.Launcher/App.xaml +++ b/Flow.Launcher/App.xaml @@ -24,6 +24,7 @@ + diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs index f4a17761f..9fa5af7e3 100644 --- a/Flow.Launcher/App.xaml.cs +++ b/Flow.Launcher/App.xaml.cs @@ -62,6 +62,7 @@ namespace Flow.Launcher _settingsVM = new SettingWindowViewModel(_updater, _portable); _settings = _settingsVM.Settings; + _settings.WMPInstalled = WindowsMediaPlayerHelper.IsWindowsMediaPlayerInstalled(); AbstractPluginEnvironment.PreStartPluginExecutablePathUpdate(_settings); diff --git a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs index fabd01a24..ed94771f0 100644 --- a/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs +++ b/Flow.Launcher/Converters/QuerySuggestionBoxConverter.cs @@ -44,7 +44,7 @@ public class QuerySuggestionBoxConverter : IMultiValueConverter // Check if Text will be larger than our QueryTextBox Typeface typeface = new Typeface(queryTextBox.FontFamily, queryTextBox.FontStyle, queryTextBox.FontWeight, queryTextBox.FontStretch); // TODO: Obsolete warning? - var ft = new FormattedText(queryTextBox.Text, CultureInfo.DefaultThreadCurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, queryTextBox.FontSize, Brushes.Black); + var ft = new FormattedText(queryTextBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, queryTextBox.FontSize, Brushes.Black); var offset = queryTextBox.Padding.Right; diff --git a/Flow.Launcher/CustomShortcutSetting.xaml.cs b/Flow.Launcher/CustomShortcutSetting.xaml.cs index 097d6a53b..82efb4869 100644 --- a/Flow.Launcher/CustomShortcutSetting.xaml.cs +++ b/Flow.Launcher/CustomShortcutSetting.xaml.cs @@ -8,7 +8,6 @@ namespace Flow.Launcher { public partial class CustomShortcutSetting : Window { - private SettingWindowViewModel viewModel; public string Key { get; set; } = String.Empty; public string Value { get; set; } = String.Empty; private string originalKey { get; init; } = null; @@ -17,13 +16,11 @@ namespace Flow.Launcher public CustomShortcutSetting(SettingWindowViewModel vm) { - viewModel = vm; InitializeComponent(); } - public CustomShortcutSetting(string key, string value, SettingWindowViewModel vm) + public CustomShortcutSetting(string key, string value) { - viewModel = vm; Key = key; Value = value; originalKey = key; @@ -46,8 +43,7 @@ namespace Flow.Launcher return; } // Check if key is modified or adding a new one - if (((update && originalKey != Key) || !update) - && viewModel.ShortcutExists(Key)) + if ((update && originalKey != Key) || !update) { MessageBox.Show(InternationalizationManager.Instance.GetTranslation("duplicateShortcut")); return; diff --git a/Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs b/Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs new file mode 100644 index 000000000..2eec6c89b --- /dev/null +++ b/Flow.Launcher/Helper/WindowsMediaPlayerHelper.cs @@ -0,0 +1,11 @@ +using Microsoft.Win32; + +namespace Flow.Launcher.Helper; +internal static class WindowsMediaPlayerHelper +{ + internal static bool IsWindowsMediaPlayerInstalled() + { + using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\MediaPlayer"); + return key.GetValue("Installation Directory") != null; + } +} diff --git a/Flow.Launcher/Images/info.png b/Flow.Launcher/Images/info.png new file mode 100644 index 000000000..75ffe11e0 Binary files /dev/null and b/Flow.Launcher/Images/info.png differ diff --git a/Flow.Launcher/Images/keyboard.png b/Flow.Launcher/Images/keyboard.png new file mode 100644 index 000000000..5ac670419 Binary files /dev/null and b/Flow.Launcher/Images/keyboard.png differ diff --git a/Flow.Launcher/Images/plugins.png b/Flow.Launcher/Images/plugins.png new file mode 100644 index 000000000..cb1e5906c Binary files /dev/null and b/Flow.Launcher/Images/plugins.png differ diff --git a/Flow.Launcher/Images/proxy.png b/Flow.Launcher/Images/proxy.png new file mode 100644 index 000000000..ded7126aa Binary files /dev/null and b/Flow.Launcher/Images/proxy.png differ diff --git a/Flow.Launcher/Images/store.png b/Flow.Launcher/Images/store.png new file mode 100644 index 000000000..a4b19c8f9 Binary files /dev/null and b/Flow.Launcher/Images/store.png differ diff --git a/Flow.Launcher/Images/theme.png b/Flow.Launcher/Images/theme.png new file mode 100644 index 000000000..9518343b7 Binary files /dev/null and b/Flow.Launcher/Images/theme.png differ diff --git a/Flow.Launcher/Languages/ar.xaml b/Flow.Launcher/Languages/ar.xaml index 7f5c067f5..5a361d478 100644 --- a/Flow.Launcher/Languages/ar.xaml +++ b/Flow.Launcher/Languages/ar.xaml @@ -156,6 +156,7 @@ Play a small sound when the search window opens Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animation Use Animation in UI Animation Speed @@ -170,14 +171,37 @@ Hotkey Hotkeys - Flow Launcher Hotkey + Open Flow Launcher Enter shortcut to show/hide Flow Launcher. - Preview Hotkey + Toggle Preview Enter shortcut to show/hide preview in search window. + Hotkey Presets + List of currently registered hotkeys Open Result Modifier Key Select a modifier key to open selected result via keyboard. Show Hotkey Show result selection hotkey with results. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Open Context Menu + Open Setting Window + Copy File Path + Toggle Game Mode + Toggle History + Open Containing Folder + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Custom Query Hotkeys Custom Query Shortcuts Built-in Shortcuts @@ -188,6 +212,7 @@ Delete Edit Add + None Please select an item Are you sure you want to delete {0} plugin hotkey? Are you sure you want to delete shortcut: {0} with expansion {1}? @@ -286,6 +311,11 @@ Hotkey is unavailable, please select a new hotkey Invalid plugin hotkey 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. Custom Query Shortcut @@ -297,8 +327,12 @@ 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. - - Hotkey Unavailable + + Save + Overwrite + Cancel + Reset + Delete Version @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Open Setting Window Reload Plugin Data + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Weather Weather in Google Result > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml index c5ac941bc..1e387b2bc 100644 --- a/Flow.Launcher/Languages/cs.xaml +++ b/Flow.Launcher/Languages/cs.xaml @@ -156,6 +156,7 @@ Přehrát krátký zvuk při otevření okna vyhledávání Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animace Použít animaci v UI Rychlost animace @@ -170,14 +171,37 @@ Klávesová zkratka Klávesové zkratky - Klávesová zkratka pro Flow Launcher + Open Flow Launcher Zadejte zkratku pro zobrazení/skrytí nástroje Flow Launcher. - Klávesová zkratka pro náhled + Toggle Preview Zadejte klávesovou zkratku pro zobrazení/skrytí náhledu v okně vyhledávání. + Hotkey Presets + List of currently registered hotkeys Modifikační klávesa pro otevření výsledků Výběrem modifikační klávesy otevřete vybraný výsledek pomocí klávesnice. Zobrazit klávesovou zkratku Zobrazí klávesovou zkratku spolu s výsledky. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Otevřít kontextovou nabídku + Otevřít okno s nastavením + Copy File Path + Toggle Game Mode + Toggle History + Otevřít umístění složky + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Vlastní klávesové zkratky pro vyhledávání Vlastní zkratky dotazů Vestavěné zkratky @@ -188,6 +212,7 @@ Smazat Editovat Přidat + None Vyberte prosím položku Jste si jisti, že chcete odstranit klávesovou zkratku {0} pro plugin? Opravdu chcete odstranit zástupce: {0} pro dotaz {1}? @@ -286,6 +311,11 @@ Klávesová zkratka je nedostupná, zadejte prosím novou zkratku Neplatná klávesová zkratka pluginu 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. Vlastní klávesová zkratka pro zadávání dotazů @@ -297,8 +327,12 @@ 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é. - - Klávesová zkratka je nedostupná + + Uložit + Overwrite + Zrušit + Reset + Smazat Verze @@ -368,6 +402,12 @@ Pokud před zkratku při zadávání přidáte znak "@", bude odpovíd Otevřít okno s nastavením Znovu načíst data pluginů + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Počasí Výsledky počasí Google > ping 8.8.8 diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml index 830f49798..9f4ff0491 100644 --- a/Flow.Launcher/Languages/da.xaml +++ b/Flow.Launcher/Languages/da.xaml @@ -156,6 +156,7 @@ Play a small sound when the search window opens Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animation Use Animation in UI Animation Speed @@ -170,14 +171,37 @@ Genvejstast Genvejstast - Flow Launcher genvejstast + Open Flow Launcher Enter shortcut to show/hide Flow Launcher. - Preview Hotkey + Toggle Preview Enter shortcut to show/hide preview in search window. + Hotkey Presets + List of currently registered hotkeys Åbn resultatmodifikatorer Select a modifier key to open selected result via keyboard. Vis hotkey Show result selection hotkey with results. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Open Context Menu + Open Setting Window + Copy File Path + Toggle Game Mode + Toggle History + Open Containing Folder + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Tilpasset søgegenvejstast Custom Query Shortcut Built-in Shortcut @@ -188,6 +212,7 @@ Slet Rediger Tilføj + None Vælg venligst Er du sikker på du vil slette {0} plugin genvejstast? Are you sure you want to delete shortcut: {0} with expansion {1}? @@ -286,6 +311,11 @@ Genvejstast er utilgængelig, vælg venligst en ny genvejstast Ugyldig plugin genvejstast 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. Custom Query Shortcut @@ -297,8 +327,12 @@ 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. - - Genvejstast utilgængelig + + Gem + Overwrite + Annuller + Reset + Slet Version @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Open Setting Window Reload Plugin Data + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Weather Weather in Google Result > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml index 189ac678e..84cce5a47 100644 --- a/Flow.Launcher/Languages/de.xaml +++ b/Flow.Launcher/Languages/de.xaml @@ -156,6 +156,7 @@ Ton abspielen, wenn das Suchfenster geöffnet wird Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animation Animationen in der Oberfläche verwenden Animation Speed @@ -170,14 +171,37 @@ Tastenkombination Tastenkombination - Flow Launcher Tastenkombination + Open Flow Launcher Verknüpfung eingeben, um Flow Launcher anzuzeigen/auszublenden. - Preview Hotkey + Toggle Preview Enter shortcut to show/hide preview in search window. + Hotkey Presets + List of currently registered hotkeys Öffnen Sie die Ergebnismodifikatoren Wählen Sie eine Modifikatortaste, um das ausgewählte Ergebnis über die Tastatur zu öffnen. Hotkey anzeigen Hotkey für die Ergebnisauswahl mit Ergebnissen anzeigen. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Kontextmenü öffnen + Einstellungsfenster öffnen + Copy File Path + Gott Modus + Toggle History + Öffne beinhaltenden Ordner + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Benutzerdefinierte Abfrage Tastenkombination Custom Query Shortcut Built-in Shortcut @@ -188,6 +212,7 @@ Löschen Bearbeiten Hinzufügen + None Bitte einen Eintrag auswählen Wollen Sie die {0} Plugin Tastenkombination wirklich löschen? Are you sure you want to delete shortcut: {0} with expansion {1}? @@ -286,6 +311,11 @@ Tastenkombination ist nicht verfügbar, bitte wähle eine andere Tastenkombination Ungültige Plugin Tastenkombination Aktualisieren + 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. Custom Query Shortcut @@ -297,8 +327,12 @@ 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. - - Tastenkombination nicht verfügbar + + Speichern + Overwrite + Abbrechen + Reset + Löschen Version @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Einstellungsfenster öffnen Plugin-Daten neu laden + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Wetter Wetter in Google-Ergebnis > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index fd24f825e..28b516757 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -56,6 +56,8 @@ Preserve Last Query Select last Query Empty last Query + Fixed Window Height + The window height will not be resizeable by dragging Maximum results shown You can also quickly adjust this by using CTRL+Plus and CTRL+Minus. Ignore hotkeys in fullscreen mode @@ -77,6 +79,9 @@ When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window. Query Search Precision Changes minimum match score required for results. + None + Low + Regular Search with Pinyin Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese. Always Preview @@ -142,8 +147,13 @@ Launch programs as admin or a different user ProcessKiller Terminate unwanted processes + Search Bar Height + Item Height Query Box Font - Result Item Font + Result Title Font + Result Subtitle Font + Reset + Customize Window Mode Opacity Theme {0} not exists, fallback to default theme @@ -158,6 +168,7 @@ Play a small sound when the search window opens Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animation Use Animation in UI Animation Speed @@ -169,6 +180,7 @@ Clock Date + Hotkey Hotkeys @@ -188,6 +200,8 @@ Select Previous Item Next Page Previous Page + Cycle Previous Query + Cycle Next Query Open Context Menu Open Setting Window Copy File Path @@ -414,4 +428,8 @@ sn Sticky Notes + + File Size + Created + Last Modified diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml index 9fc54c373..aa3536f80 100644 --- a/Flow.Launcher/Languages/es-419.xaml +++ b/Flow.Launcher/Languages/es-419.xaml @@ -156,6 +156,7 @@ Reproducir un sonido al abrir la ventana de búsqueda Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animación Usar Animación en la Interfaz Animation Speed @@ -170,14 +171,37 @@ Tecla Rápida Tecla Rápida - Tecla de acceso a Flow Launcher + Open Flow Launcher Introduzca el acceso directo para mostrar/ocultar Flow Launcher. - Preview Hotkey + Toggle Preview Enter shortcut to show/hide preview in search window. + Hotkey Presets + List of currently registered hotkeys Abrir Tecla de Modificación de Resultado Seleccione una tecla de modificación para abrir el resultado seleccionado vía teclado. Mostrar tecla de acceso directo Mostrar tecla rápida de selección con resultados. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Open Context Menu + Open Setting Window + Copy File Path + Toggle Game Mode + Toggle History + Abrir Carpeta Contenedora + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Tecla Rápida de Consulta Personalizada Custom Query Shortcut Built-in Shortcut @@ -188,6 +212,7 @@ Eliminar Editar Añadir + None Por favor, seleccione un elemento ¿Está seguro que desea eliminar la tecla de acceso directo del plugin {0}? Are you sure you want to delete shortcut: {0} with expansion {1}? @@ -286,6 +311,11 @@ Tecla no disponible, por favor seleccione una nueva tecla de acceso directo Tecla de acceso directo al plugin inválida 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. Custom Query Shortcut @@ -297,8 +327,12 @@ 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. - - Tecla No Disponible + + Guardar + Overwrite + Cancelar + Reset + Eliminar Versión @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Abrir Ventana de Ajustes Recargar Datos del Plugin + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Clima Clima en los Resultados de Google > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml index 5153b79f7..a0d8e00c3 100644 --- a/Flow.Launcher/Languages/es.xaml +++ b/Flow.Launcher/Languages/es.xaml @@ -156,6 +156,7 @@ Reproduce un pequeño sonido cuando se abre el cuadro de búsqueda Volumen del efecto de sonido Ajusta el volumen del efecto de sonido + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animación Usa animación en la Interfaz de Usuario Velocidad de animación @@ -170,14 +171,37 @@ Atajo de teclado Atajos de teclado - Atajo de teclado de Flow Launcher + Abrir Flow Launcher Introduzca el atajo de teclado para mostrar/ocultar Flow Launcher. - Acceso directo para vista previa + Cambiar vista previa Introduzca el acceso directo para mostrar/ocultar la vista previa en la ventana de búsqueda. + Ajustes preestablecidos de atajos de teclado + Lista de atajos de teclado actualmente registrados Tecla modificadora para abrir resultado Seleccione una tecla modificadora para abrir el resultado seleccionado con el teclado. Mostrar atajo de teclado Muestra atajo de teclado de selección junto a los resultados. + Completar automáticamente + Ejecuta completar automáticamente para los elementos seleccionados. + Seleccionar siguiente elemento + Seleccionar elemento anterior + Siguiente página + Página anterior + Cycle Previous Query + Cycle Next Query + Abrir menú contextual + Abrir ventana de configuración + Copiar ruta del archivo + Cambiar a Modo Juego + Cambiar historial + Abrir carpeta contenedora + Ejecutar como administrador + Actualizar resultados de búsqueda + Recargar datos de complementos + Ajuste rápido de la anchuira de la ventana + Ajuste rápido de la altura de la ventana + Se utiliza cuando se requiere que los complementos recarguen y actualicen sus datos existentes. + Se puede añadir otro atajo de teclado más para esta función. Atajos de teclado de consulta personalizada Accesos directos de consulta personalizada Accesos directos integrados @@ -188,6 +212,7 @@ Eliminar Editar Añadir + Ninguno Por favor, seleccione un elemento ¿Está seguro que desea eliminar el atajo de teclado de consulta personalizada {0}? ¿Está seguro de que desea eliminar el acceso directo: {0} con la expansión {1}? @@ -286,6 +311,11 @@ El atajo de teclado no está disponible, por favor seleccione uno nuevo Atajo de teclado de complemento no válido 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. Acceso directo de consulta personalizada @@ -297,8 +327,12 @@ 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. - - No disponible + + Guardar + Sobrescribir + Cancelar + Restablecer + Eliminar Versión @@ -368,6 +402,12 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci Abrir ventana de configuración Recargar datos del complemento + Seleccionar primer resultado + Seleccionar último resultado + Ejecutar consulta actual de nuevo + Abrir resultado + Abrir resultado #{0} + El tiempo El tiempo en los resultados de Google > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml index 82b93b1e7..de3d849e9 100644 --- a/Flow.Launcher/Languages/fr.xaml +++ b/Flow.Launcher/Languages/fr.xaml @@ -136,7 +136,7 @@ Rechercher des fichiers, dossiers et contenus de fichiers Recherche Web Recherchez sur le Web avec la prise en charge de moteurs de recherche différents - Programme + Programmes Lancez des programmes en tant qu'administrateur ou un utilisateur différent Tueur de processus Terminer les processus non désirés @@ -156,6 +156,7 @@ Jouer un petit son lorsque la fenêtre de recherche s'ouvre Volume de l'effet sonore Ajuster le volume de l'effet sonore + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animation Utiliser l'animation dans l'interface Vitesse d'animation @@ -172,12 +173,35 @@ Raccourcis Ouvrir Flow Launcher Entrez le raccourci pour afficher/masquer Flow Launcher. - Prévisualiser le raccourci + Afficher/masquer l'aperçu Entrez le raccourci pour afficher/masquer l'aperçu dans la fenêtre de recherche. + Préréglages des raccourcis clavier + Liste des raccourcis clavier actuellement enregistrés Modificateurs de résultats ouverts Sélectionnez une touche de modification pour ouvrir le résultat sélectionné via le clavier. Afficher le raccourci clavier Afficher le raccourci de sélection des résultats avec les résultats. + Saisie automatique + Exécute la saisie automatique pour les éléments sélectionnés. + Sélectionner l'objet suivant + Sélectionner l'élément précédent + Page suivante + Page précédente + Cycle de requête précédente + Cycle de requête suivante + Ouvrir le Menu Contextuel + Ouvrir la Fenêtre des Réglages + Copier le chemin du fichier + Basculer le mode de jeu + Basculer l'historique + Ouvrir le répertoire + Exécuter en tant qu'Administrateur + Rafraîchir les résultats de recherche + Recharger les données des plugins + Ajuster rapidement la largeur de la fenêtre + Ajuster rapidement la hauteur de la fenêtre + Utiliser lorsque vous avez besoin de recharger et mettre à jour les données existantes de vos plugins. + Vous pouvez ajouter un raccourci clavier supplémentaire pour cette fonction. Requêtes personnalisées Custom Query Shortcut Built-in Shortcut @@ -188,6 +212,7 @@ Supprimer Modifier Ajouter + Aucun Veuillez sélectionner un élément Voulez-vous vraiment supprimer {0} raccourci(s) ? Êtes-vous sûr de vouloir supprimer le raccourci : {0} avec l'expansion {1} ? @@ -285,6 +310,11 @@ Raccourci indisponible. Veuillez en choisir un autre. Raccourci invalide 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. Raccourci de requête personnalisée @@ -296,8 +326,12 @@ 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. - - Raccourci indisponible + + Sauvegarder + Écraser + Annuler + Réinitialiser + Supprimer Version @@ -367,6 +401,12 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu Ouvrir la Fenêtre des Réglages Recharger les Données des Plugins + Sélectionner le premier résultat + Sélectionner le dernier résultat + Exécuter à nouveau la requête actuelle + Ouvrir le résultat + Ouvrir le résultat #{0} + Météo Météo dans les résultats Google > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml index a9a6e4fee..6d7a42f45 100644 --- a/Flow.Launcher/Languages/it.xaml +++ b/Flow.Launcher/Languages/it.xaml @@ -154,8 +154,9 @@ Scuro Effetto sonoro Riproduce un piccolo suono all'apertura della finestra di ricerca - Sound Effect Volume - Adjust the volume of the sound effect + Volume Effetti Sonori + Regola il volume degli effetti sonori + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animazione Usa l'animazione nell'interfaccia utente Velocità di animazione @@ -170,14 +171,37 @@ Tasti scelta rapida Tasti scelta rapida - Tasto scelta rapida Flow Launcher + Apri Flow Launcher Immettere la scorciatoia per mostrare/nascondere Flow Launcher. - Anteprima Scorciatoia + Attiva/Disattiva Anteprima Inserisci la scorciatoia per mostrare/nascondere l'anteprima nella finestra di ricerca. + Preimpostazioni Scorciatoie + Elenco di scorciatoie attualmente registrate Apri modificatori di risultato Seleziona un tasto modificatore per aprire il risultato selezionato via tastiera. Mostra tasto di scelta rapida Mostra tasto di scelta rapida dei risultati con i risultati. + Auto Completamento + Esegue il completamento automatico per gli elementi selezionati. + Seleziona Elemento Successivo + Seleziona Elemento Precedente + Pagina Successiva + Pagina Precedente + Cycle Previous Query + Cycle Next Query + Apri il menu di scelta rapida + Aprire la finestra delle impostazioni + Copia Percorso File + Attiva/Disattiva Modalità Di Gioco + Attiva/Disattiva Cronologia + Apri cartella superiore + Esegui come Amministratore + Aggiorna Risultati di Ricerca + Ricarica i Dati dei Plugin + Regolazione Rapida della Larghezza della Finestra + Regolazione Rapida dell'Altezza della Finestra + Utilizzare quando richiedono plugin per ricaricare e aggiornare i propri dati esistenti. + Puoi aggiungere un'altra scorciatoia per questa funzione. Tasti scelta rapida per ricerche personalizzate Custom Query Shortcut Built-in Shortcut @@ -188,6 +212,7 @@ Cancella Modifica Aggiungi + Vuoto Selezionare un oggetto Volete cancellare il tasto di scelta rapida per il plugin {0}? Sei sicuro di voler eliminare la scorciatoia: {0} con espansione {1}? @@ -286,6 +311,11 @@ Tasto di scelta rapida non disponibile, per favore scegli un nuovo tasto di scelta rapida Tasto di scelta rapida plugin non valido 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. Scorciatoia per ricerca personalizzata @@ -297,8 +327,12 @@ 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. - - Tasto di scelta rapida non disponibile + + Salva + Sovrascrivi + Annulla + Resetta + Cancella Versione @@ -368,6 +402,12 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde Aprire la finestra delle impostazioni Ricarica i dati del plugin + Seleziona il primo risultato + Seleziona l'ultimo risultato + Esegui nuovamente la ricerca corrente + Apri risultato + Apri risultato #{0} + Meteo Meteo nel risultato di Google > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml index f4859c806..018be0d59 100644 --- a/Flow.Launcher/Languages/ja.xaml +++ b/Flow.Launcher/Languages/ja.xaml @@ -1,7 +1,7 @@  - Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program. + ホットキー "{0}" の登録に失敗しました。このホットキーは別のプログラムで使用されている可能性があります。別のホットキーに変更するか、このホットキーを使用しているプログラムを終了してください。 Flow Launcher {0}の起動に失敗しました Flow Launcherプラグインの形式が正しくありません @@ -13,80 +13,80 @@ 設定 Flow Launcherについて 終了 - Close - Copy + 閉じる + コピー 切り取り 貼り付け - Undo - Select All - File - Folder + 元に戻す + 全て選択 + ファイル + フォルダー Text ゲームモード - Suspend the use of Hotkeys. - Position Reset - Reset search window position + ホットキーの使用を一時停止します。 + 位置のリセット + 検索ウィンドウの位置をリセットします。 設定 一般 - Portable Mode - Store all settings and user data in one folder (Useful when used with removable drives or cloud services). + ポータブルモード + すべての設定とユーザーデータを1つのフォルダに保存します(リムーバブルドライブやクラウドサービスで使用する場合に便利です)。 スタートアップ時にFlow Launcherを起動する Error setting launch on startup フォーカスを失った時にFlow Launcherを隠す 最新版が入手可能であっても、アップグレードメッセージを表示しない - Search Window Position - Remember Last Position - Monitor with Mouse Cursor - Monitor with Focused Window - Primary Monitor - Custom Monitor - Search Window Position on Monitor - Center - Center Top - Left Top - Right Top - Custom Position + 検索ウィンドウの位置 + 最後の表示位置を記憶する + マウスカーソルがあるモニター + フォーカス中のウィンドウがあるモニター + プライマリモニター + モニター(カスタム) + モニター上の検索ウィンドウの位置 + 中央 + 中央上部 + 左上 + 右上 + カスタムの位置 言語 前回のクエリの扱い - Show/Hide previous results when Flow Launcher is reactivated. + Flow Launcherを再表示したとき、以前の結果を表示するかどうか選択します。 前回のクエリを保存 前回のクエリを選択 前回のクエリを消去 結果の最大表示件数 - You can also quickly adjust this by using CTRL+Plus and CTRL+Minus. + CTRL+PlusとCTRL+Minusを使用すれば、簡単に調整することもできます。 ウィンドウがフルスクリーン時にホットキーを無効にする - Disable Flow Launcher activation when a full screen application is active (Recommended for games). - Default File Manager - Select the file manager to use when opening the folder. - Default Web Browser - Setting for New Tab, New Window, Private Mode. - Python Path - Node.js Path - Please select the Node.js executable - Please select pythonw.exe - Always Start Typing in English Mode - Temporarily change your input method to English mode when activating Flow. + フルスクリーンのアプリケーションが起動しているとき、Flow Launcherの起動を無効にします(ゲームをするときにおすすめです)。 + デフォルトのファイルマネージャー + フォルダを開くときに使用するファイルマネージャを選択します。 + デフォルトのウェブブラウザー + 新規タブ、新規ウィンドウ、プライベートモードに関して設定します。 + Python のパス + Node.js のパス + Node.js の実行ファイルを選択してください + pythonw.exe を選択してください + 常に英語モードで入力を開始する + Flowを起動したとき、一時的に入力方法を英語モードに変更します。 自動更新 選択 起動時にFlow Launcherを隠す トレイアイコンを隠す - When the icon is hidden from the tray, the Settings menu can be opened by right-clicking on the search window. - Query Search Precision - Changes minimum match score required for results. - Search with Pinyin - Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese. - 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 + トレイアイコンが非表示になっているときは、検索ウィンドウを右クリックすることで設定メニューを開くことができます。 + クエリ検索精度 + 表示する結果に必要な一致スコアの最小値を変更します。 + ピンインによる検索 + ピンインを使用して検索できるようにします。ピンインは、中国語をローマ字表記するための標準的な表記体系です。 + 常にプレビューする + Flow が有効になったとき、常にプレビューパネルを開きます。 {0} を押してプレビューの表示/非表示を切り替えます。 + 現在のテーマでぼかしの効果が有効になっている場合、影の効果を有効にすることはできません Search Plugin - Ctrl+F to search plugins - No results found - Please try a different search. - Plugin + Ctrl+F でプラグインを検索します + 検索結果が見つかりませんでした + 別の検索を試してみてください。 + プラグイン プラグイン プラグインを探す 有効 @@ -99,7 +99,7 @@ Current Priority New Priority 重要度 - Change Plugin Results Priority + プラグインの結果の優先度を変更します。 プラグイン・ディレクトリ by 初期化時間: @@ -115,69 +115,93 @@ Recently Updated プラグイン Installed - Refresh - Install + 更新 + インストール アンインストール 更新 Plugin already installed New Version This plugin has been updated within the last 7 days - New Update is Available + 新しいアップデートが利用可能です テーマ - Appearance + 外観 テーマを探す - How to create a theme - Hi There - Explorer - Search for files, folders and file contents - WebSearch - Search the web with different search engine support - Program - Launch programs as admin or a different user - ProcessKiller - Terminate unwanted processes + テーマの作成方法 + やあ! + エクスプローラー + ファイルやフォルダー、ファイルの内容を検索します + Web検索 + 異なる検索エンジンをサポートするWeb検索 + プログラム + 管理者または別のユーザーとしてプログラムを起動します + プロセスキラー + 不要なプロセスを終了します 検索ボックスのフォント 検索結果一覧のフォント ウィンドウモード 透過度 テーマ {0} が存在しません、デフォルトのテーマに戻します。 テーマ {0} を読み込めません、デフォルトのテーマに戻します。 - Theme Folder - Open Theme Folder - Color Scheme - System Default - Light - Dark - Sound Effect - Play a small sound when the search window opens - Sound Effect Volume - Adjust the volume of the sound effect - Animation - Use Animation in UI - Animation Speed - The speed of the UI animation - Slow - Medium - Fast - Custom - Clock - Date + テーマフォルダー + テーマフォルダーを開く + 配色 + システムのデフォルト + ライト + ダーク + 効果音 + 検索ウィンドウが開いたとき、小さな音を鳴らします + 効果音の音量 + 効果音の音量を調整します + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. + アニメーション + UIでアニメーションを使用します + アニメーション速度 + UI アニメーションの速度 + ゆっくり + ふつう + はやい + カスタム + 時刻 + 日付 ホットキー ホットキー - Flow Launcher ホットキー - Enter shortcut to show/hide Flow Launcher. - Preview Hotkey + Flow Launcherを開く + Flow Launcher の表示/非表示を切り替えるショートカットを入力してください。 + Toggle Preview Enter shortcut to show/hide preview in search window. + Hotkey Presets + List of currently registered hotkeys 結果修飾子を開く Select a modifier key to open selected result via keyboard. ホットキーを表示 Show result selection hotkey with results. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Open Context Menu + Open Setting Window + Copy File Path + Toggle Game Mode + Toggle History + Open Containing Folder + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. カスタムクエリ ホットキー Custom Query Shortcut Built-in Shortcut @@ -188,6 +212,7 @@ 削除 編集 追加 + None 項目選択してください {0} プラグインのホットキーを本当に削除しますか? Are you sure you want to delete shortcut: {0} with expansion {1}? @@ -286,6 +311,11 @@ ホットキーは使用できません。新しいホットキーを選択してください プラグインホットキーは無効です 更新 + 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. Custom Query Shortcut @@ -297,8 +327,12 @@ 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. - - ホットキーは使用できません + + 保存 + Overwrite + + Reset + 削除 バージョン @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Open Setting Window プラグインデータのリロード + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Weather Weather in Google Result > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml index bf76718e8..c3bb574b9 100644 --- a/Flow.Launcher/Languages/ko.xaml +++ b/Flow.Launcher/Languages/ko.xaml @@ -156,6 +156,7 @@ 검색창을 열 때 작은 소리를 재생합니다. Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. 애니메이션 일부 UI에 애니메이션을 사용합니다. Animation Speed @@ -170,14 +171,37 @@ 단축키 단축키 - Flow Launcher 단축키 + Open Flow Launcher Flow Launcher를 열 때 사용할 단축키를 입력하세요. - 미리보기 단축키 + Toggle Preview 미리보기 패널을 켜고 끌 때 사용할 단축키를 입력하세요. + Hotkey Presets + List of currently registered hotkeys 결과 선택 단축키 결과 항목을 선택하는 단축키입니다. 단축키 표시 결과창에서 결과 선택 단축키를 표시합니다. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + 콘텍스트 메뉴 열기 + 설정창 열기 + Copy File Path + Toggle Game Mode + Toggle History + 포함된 폴더 열기 + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. 사용자지정 쿼리 단축키 사용자 지정 쿼리 단축어 내장 단축어 @@ -188,6 +212,7 @@ 삭제 편집 추가 + None 항목을 선택하세요. {0} 플러그인 단축키를 삭제하시겠습니까? Are you sure you want to delete shortcut: {0} with expansion {1}? @@ -286,6 +311,11 @@ 단축키를 사용할 수 없습니다. 다른 단축키를 입력하세요. 플러그인 단축키가 유효하지 않습니다. 업데이트 + 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. 사용자 지정 쿼리 단축어 @@ -297,8 +327,12 @@ 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. - - 단축키를 사용할 수 없습니다. + + 저장 + Overwrite + 취소 + Reset + 삭제 버전 @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 설정창 열기 플러그인 데이터 새로고침 + Select first result + Select last result + Run current query again + Open result + Open result #{0} + 날씨 구글 날씨 검색 > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml index 7f5c067f5..5a361d478 100644 --- a/Flow.Launcher/Languages/nb.xaml +++ b/Flow.Launcher/Languages/nb.xaml @@ -156,6 +156,7 @@ Play a small sound when the search window opens Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animation Use Animation in UI Animation Speed @@ -170,14 +171,37 @@ Hotkey Hotkeys - Flow Launcher Hotkey + Open Flow Launcher Enter shortcut to show/hide Flow Launcher. - Preview Hotkey + Toggle Preview Enter shortcut to show/hide preview in search window. + Hotkey Presets + List of currently registered hotkeys Open Result Modifier Key Select a modifier key to open selected result via keyboard. Show Hotkey Show result selection hotkey with results. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Open Context Menu + Open Setting Window + Copy File Path + Toggle Game Mode + Toggle History + Open Containing Folder + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Custom Query Hotkeys Custom Query Shortcuts Built-in Shortcuts @@ -188,6 +212,7 @@ Delete Edit Add + None Please select an item Are you sure you want to delete {0} plugin hotkey? Are you sure you want to delete shortcut: {0} with expansion {1}? @@ -286,6 +311,11 @@ Hotkey is unavailable, please select a new hotkey Invalid plugin hotkey 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. Custom Query Shortcut @@ -297,8 +327,12 @@ 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. - - Hotkey Unavailable + + Save + Overwrite + Cancel + Reset + Delete Version @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Open Setting Window Reload Plugin Data + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Weather Weather in Google Result > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml index 66383a90c..dedc8ff1b 100644 --- a/Flow.Launcher/Languages/nl.xaml +++ b/Flow.Launcher/Languages/nl.xaml @@ -116,7 +116,7 @@ Plugins Installed Vernieuwen - Install + Installeren Uninstall Update Plugin already installed @@ -156,6 +156,7 @@ Een klein geluid afspelen wanneer het zoekvenster wordt geopend Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is niet beschikbaar en is vereist voor volume aanpassing door Flow. Controleer uw installatie als u volume wilt aanpassen. Animatie Animatie gebruiken in UI Animation Speed @@ -170,35 +171,59 @@ Sneltoets Sneltoets - Flow Launcher Sneltoets + Open Flow Launcher Voer snelkoppeling in om Flow Launcher te tonen/verbergen. - Preview Hotkey + Toggle Preview Enter shortcut to show/hide preview in search window. + Hotkey Presets + List of currently registered hotkeys Open resultaatmodificatoren Kies een aanpassingstoets om het geselecteerde resultaat te openen via het toetsenbord. Sneltoets weergeven Show result selection hotkey with results. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Ga naar vorige zoekopdracht + Ga naar volgende zoekopdracht + Open Context Menu + Open Setting Window + Copy File Path + Toggle Game Mode + Toggle History + Open Containing Folder + Run As Admin + Refresh Search Results + Reload Plugins Data + Snel vensterbreedte aanpassen + Snel vensterhoogte aanpassen + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Custom Query Sneltoets Custom Query Shortcut Built-in Shortcut - Query + Zoekopdracht Shortcut Expansion Beschrijving Verwijder Bewerken Toevoegen + None Selecteer een item Weet u zeker dat je {0} plugin sneltoets wilt verwijderen? Are you sure you want to delete shortcut: {0} with expansion {1}? Get text from clipboard. Get path from active explorer. - Query window shadow effect - Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited. + Zoekvenster schaduweffect + Schaduw effect vergt een substantieel gebruik van uw GPU. Niet aanbevolen als uw computerprestaties beperkt zijn. Window Width Size You can also quickly adjust this by using Ctrl+[ and Ctrl+]. - Use Segoe Fluent Icons - Use Segoe Fluent Icons for query results where supported + Gebruik Segoe Fluent pictogrammen + Gebruik Segoe Fluent iconen voor zoekresultaten wanneer ondersteund Press Key @@ -253,7 +278,7 @@ Arg For File - Default Web Browser + Standaard webbrowser The default setting follows the OS default browser setting. If specified separately, flow uses that browser. Browser Browser Name @@ -286,6 +311,11 @@ Sneltoets is niet beschikbaar, selecteer een nieuwe sneltoets Ongeldige plugin sneltoets 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. Custom Query Shortcut @@ -297,8 +327,12 @@ 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. - - Sneltoets niet beschikbaar + + Opslaan + Overwrite + Annuleer + Reset + Verwijder Versie @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Open Setting Window Reload Plugin Data + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Weather Weather in Google Result > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml index 8ac419ab0..03da99d91 100644 --- a/Flow.Launcher/Languages/pl.xaml +++ b/Flow.Launcher/Languages/pl.xaml @@ -156,6 +156,7 @@ Odtwarzaj krótki dźwięk po otwarciu okna wyszukiwania Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animacja Użyj animacji w interfejsie użytkownika Szybkość animacji @@ -170,14 +171,37 @@ Skrót klawiszowy Skrót klawiszowy - Skrót klawiszowy Flow Launcher + Open Flow Launcher Wprowadź skrót, aby pokazać/ukryć Flow Launcher. - Podgląd skrótu + Toggle Preview Wprowadź skrót, aby pokazać/ukryć podgląd w oknie wyszukiwania. + Hotkey Presets + List of currently registered hotkeys Modyfikatory klawiszów otwierających wyniki Select a modifier key to open selected result via keyboard. Pokaż skrót klawiszowy Show result selection hotkey with results. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Open Context Menu + Open Setting Window + Copy File Path + Toggle Game Mode + Toggle History + Otwórz folder zawierający + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Skrót klawiszowy niestandardowych zapytań Custom Query Shortcut Built-in Shortcut @@ -188,6 +212,7 @@ Usuń Edytuj Dodaj + None Musisz coś wybrać Czy jesteś pewien że chcesz usunąć skrót klawiszowy {0} wtyczki? Are you sure you want to delete shortcut: {0} with expansion {1}? @@ -286,6 +311,11 @@ Skrót klawiszowy jest niedostępny, musisz podać inny skrót klawiszowy Niepoprawny skrót klawiszowy Aktualizuj + 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. Niestandardowy skrót zapytania @@ -297,8 +327,12 @@ 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. - - Niepoprawny skrót klawiszowy + + Zapisz + Overwrite + Anuluj + Reset + Usu Wersja @@ -368,6 +402,12 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d Open Setting Window Reload Plugin Data + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Weather Weather in Google Result > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml index e2ddd0524..562f43b96 100644 --- a/Flow.Launcher/Languages/pt-br.xaml +++ b/Flow.Launcher/Languages/pt-br.xaml @@ -156,6 +156,7 @@ Reproduzir um pequeno som ao abrir a janela de pesquisa Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animação Utilizar Animação na Interface Velocidade de Animação @@ -170,14 +171,37 @@ Atalho Atalho - Atalho do Flow Launcher + Open Flow Launcher Digite o atalho para exibir/ocultar o Flow Launcher. - Atalho de pré-visualização + Toggle Preview Digite o atalho para exibir/ocultar a pré-visualização na janela de pesquisa. + Hotkey Presets + List of currently registered hotkeys Modificadores de resultado aberto Selecione uma tecla modificadora para abrir o resultar selecionado pelo teclado. Mostrar tecla de atalho Exibir atalho de seleção de resultado com resultados. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Abrir Menu de Contexto + Abrir Janela de Configurações + Copy File Path + Toggle Game Mode + Toggle History + Abrir a pasta correspondente + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Atalho de Consulta Personalizada Custom Query Shortcut Built-in Shortcut @@ -188,6 +212,7 @@ Apagar Editar Adicionar + None Por favor selecione um item Tem cereza de que deseja deletar o atalho {0} do plugin? Tem certeza que deseja excluir o atalho: {0} com expansão {1}? @@ -286,6 +311,11 @@ Atalho indisponível, escolha outro Atalho de plugin inválido 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. Atalho Personalidado de Pesquisa @@ -297,8 +327,12 @@ 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. - - Atalho indisponível + + Salvar + Overwrite + Cancelar + Reset + Apagar Versão @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Abrir Janela de Configurações Recarregar Dados de Plugin + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Clima Clima no Resultado do Google > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml index ce04e907a..58f3aba43 100644 --- a/Flow.Launcher/Languages/pt-pt.xaml +++ b/Flow.Launcher/Languages/pt-pt.xaml @@ -156,6 +156,7 @@ Reproduzir um som ao abrir a janela de pesquisa Volume dos efeitos sonoros Ajustar volume dos efeitos sonoros + Windows Media Player não está disponível e é necessário para o ajuste de volume. Verifique a sua instalação caso precise ajustar o volume. Animação Utilizar animações na aplicação Velocidade da animação @@ -170,14 +171,37 @@ Tecla de atalho Teclas de atalho - Tecla de atalho Flow Launcher + Abrir Flow Launcher Introduza o atalho para mostrar/ocultar Flow Launcher - Preview Hotkey + Comutar pré-visualização Introduza o atalho para mostrar/ocultar a pré-visualização na janela de pesquisa. + Predefinições de teclas de atalho + Listagem de teclas de atalho registadas Tecla modificadora para os resultados Selecione a tecla modificadora para abrir o resultado com o teclado Mostrar tecla de atalho Mostrar tecla de atalho perto dos resultados + Conclusão automática + Executa a conclusão automática para os itens selecionados. + Selecionar seguinte + Selecionar anterior + Página seguinte + Página anterior + Ir para consulta anterior + Ir para consulta seguinte + Abrir menu de contexto + Abrir janela de definições + Copiar caminho do ficheiro + Comutar modo de jogo + Comutar histórico + Abrir pasta do resultado + Executar como administrador + Recarregar resultados + Recarregar dados dos plugins + Ajuste rápido da largura da janela + Ajuste rápido da altura da janela + Para utilizar quando pretende recarregar o plugin e os dados existentes. + Ainda pode adicionar mais uma tecla de atalho para esta função. Teclas de atalho personalizadas Atalhos de consultas personalizadas Atalhos nativos @@ -188,6 +212,7 @@ Eliminar Editar Adicionar + Nenhuma Selecione um item Tem a certeza de que deseja remover a tecla de atalho do plugin {0}? Tem a certeza de que deseja eliminar o atalho: {0} com expansão {1}? @@ -285,6 +310,11 @@ Tecla de atalho indisponível, por favor escolha outra Tecla de atalho inválida 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. Atalho de consulta personalizada @@ -296,8 +326,12 @@ 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. - - Tecla de atalho indisponível + + Guardar + Substituir + Cancelar + Repor + Eliminar Versão @@ -367,6 +401,12 @@ Queira por favor mover a pasta do seu perfil de {0} para {1} Abrir janela de definições Recarregar dados do plugin + Selecionar primeiro resultado + Selecionar último resultado + Executar consulta novamente + Abrir resultado + Abrir resultado #{0} + Meteorologia Meteorologia no Google > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml index cf1e88c44..739252da7 100644 --- a/Flow.Launcher/Languages/ru.xaml +++ b/Flow.Launcher/Languages/ru.xaml @@ -1,7 +1,10 @@ - - + + - Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program. + Не удалось зарегистрировать сочетание клавиш "{0}". Возможно, оно используется другой программой. Измените сочетание клавиш или закройте другую программу. Flow Launcher Не удалось запустить {0} Недопустимый формат файла плагина Flow Launcher @@ -75,6 +78,9 @@ Когда значок скрыт в трее, меню настройки можно открыть, щёлкнув правой кнопкой мыши на окне поиска. Точность поиска запросов Изменение минимального количества совпадений при поиске, необходимого для получения результатов. + Нет + Низкая + Обычная Поиск с использованием пиньинь Позволяет использовать пиньинь для поиска. Пиньинь - это стандартная система латинизированной орфографии для перевода китайского языка. Всегда предпросмотр @@ -154,8 +160,9 @@ Тёмная Звуковой эффект Воспроизведение небольшого звука при открытии окна поиска - Sound Effect Volume - Adjust the volume of the sound effect + Громкость звукового эффекта + Регулировка громкости звукового эффекта + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Анимация Использование анимации в меню Скорость анимации @@ -170,14 +177,37 @@ Горячая клавиша Горячая клавиша - Горячая клавиша Flow Launcher + Open Flow Launcher Введите ярлык, чтобы показать/скрыть Flow Launcher. - Просмотр горячей клавиши + Toggle Preview Введите ярлык для показа/скрытия предпросмотра в окне поиска. + Hotkey Presets + List of currently registered hotkeys Открыть ключ модификации результата Выберите клавишу-модификатор, чтобы открыть выбранный результат с помощью клавиатуры. Показать горячую клавишу Показать горячую клавишу выбора результата с результатами. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Открыть контекстное меню + Открыть окно настроек + Copy File Path + Toggle Game Mode + Toggle History + Открыть папку с содержимым + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Горячие клавиши пользовательского запроса Ярлыки пользовательского запроса Встроенные ярлыки @@ -188,6 +218,7 @@ Удалить Редактировать Добавить + None Сначала выберите элемент Вы уверены что хотите удалить горячую клавишу для плагина {0}? Вы уверены, что хотите удалить ярлык: {0} с расширением {1}? @@ -286,19 +317,28 @@ Горячая клавиша недоступна. Пожалуйста, задайте новую Недействительная горячая клавиша плагина Обновить + 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. Ярлык пользовательского запроса Введите ярлык, который автоматически расширяется до указанного запроса. - 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. +Если вы добавите префикс '@' при вводе ярлыка, он будет заменяться в любом местоположении в запросе. Встроенные ярлыки всегда заменяются в любом месте в запросе. Ярлык уже существует, пожалуйста, введите новый ярлык или измените существующий. Ярлык и/или его расширение пусты. - - Горячая клавиша недоступна + + Сохранить + Overwrite + Отменить + Reset + Удалить Версия @@ -368,6 +408,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Открыть окно настроек Перезагрузить данные плагинов + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Команда Weather Погода в результатах Google > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml index 974895bcb..3f1d39f0c 100644 --- a/Flow.Launcher/Languages/sk.xaml +++ b/Flow.Launcher/Languages/sk.xaml @@ -156,6 +156,7 @@ Po otvorení okna vyhľadávania prehrať krátky zvuk Hlasitosť zvukového efektu Upraviť hlasitosť zvukového efektu + Prehrávač Windows Media Player, ktorý sa vyžaduje sa na nastavenie hlasitosti Flow Launchera nie je k dispozícii. Ak potrebujete upraviť hlasitosť, prosím, skontrolujte si svoju inštaláciu. Animácia Animovať používateľské rozhranie Rýchlosť animácie @@ -170,14 +171,37 @@ Klávesové skratky Klávesové skratky - Klávesová skratka pre Flow Launcher + Otvoriť Flow Launcher Zadajte skratku na zobrazenie/skrytie Flow Launchera. - Klávesová skratka pre náhľad + Prepnúť náhľad Zadajte klávesovú skratku pre zobrazenie/skrytie náhľadu vo vyhľadávacom okne. + Predvoľby klávesových skratiek + Zoznam aktuálne registrovaných klávesových skratiek Modifikačný kláves na otvorenie výsledkov Vyberte modifikačný kláves na otvorenie vybraného výsledku pomocou klávesnice. Zobraziť klávesovú skratku Zobrazí klávesovú skratku spolu s výsledkami. + Automatické dokončovanie + Spustí automatické dokončovanie vybraných položiek. + Vybrať ďalšiu položku + Vybrať prechádzajúcu položku + Ďalšia strana + Predchádzajúca strana + Prejsť na predchádzajúci dopyt + Prejsť na nasledujúci dopyt + Otvoriť kontextovú ponuku + Otvoriť okno s nastaveniami + Kopírovať cestu k súboru + Prepnúť herný režim + Prepnúť históriu + Otvoriť umiestnenie priečinka + Spustiť ako správca + Aktualizovať výsledky vyhľadávania + Znova načítať údaje pluginov + Rýchla úprava šírky okna + Rýchla úprava výšky okna + Použite, ak potrebujete, aby pluginy znovu načítali a aktualizovali svoje existujúce údaje. + Pre túto funkciu môžete pridať alternatívnu klávesovú skratku. Klávesové skratky vlastného vyhľadávania Klávesové skratky vlastného dopytu Vstavané skratky @@ -188,8 +212,9 @@ Odstrániť Upraviť Pridať + Žiadna Vyberte položku, prosím - Ste si istý, že chcete odstrániť klávesovú skratku {0} pre plugin? + Naozaj chcete odstrániť klávesovú skratku {0} pre plugin? Naozaj chcete odstrániť skratku: {0} pre dopyt {1}? Kopírovať text do schránky. Získať cestu z aktívneho Prieskumníka. @@ -286,6 +311,11 @@ Klávesová skratka je nedostupná, prosím, zadajte novú skratku Neplatná klávesová skratka pluginu 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 vlastného dopytu @@ -297,8 +327,12 @@ 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. - - Klávesová skratka je nedostupná + + Uložiť + Prepísať + Zrušiť + Resetovať + Odstrániť Verzia @@ -368,6 +402,12 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s Otvoriť okno s nastaveniami Znova načítať údaje pluginov + Vybrať prvý výsledok + Vybrať posledný výsledok + Spustiť aktuálny dopyt znova + Otvoriť výsledok + Otvoriť výsledok #{0} + Počasie Počasie na Googli > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml index 973ee60cc..335a7deb7 100644 --- a/Flow.Launcher/Languages/sr.xaml +++ b/Flow.Launcher/Languages/sr.xaml @@ -156,6 +156,7 @@ Play a small sound when the search window opens Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animation Use Animation in UI Animation Speed @@ -170,14 +171,37 @@ Prečica Prečica - Flow Launcher prečica + Open Flow Launcher Enter shortcut to show/hide Flow Launcher. - Preview Hotkey + Toggle Preview Enter shortcut to show/hide preview in search window. + Hotkey Presets + List of currently registered hotkeys Отворите модификаторе резултата Select a modifier key to open selected result via keyboard. покажи хоткеи Show result selection hotkey with results. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Open Context Menu + Open Setting Window + Copy File Path + Toggle Game Mode + Toggle History + Open Containing Folder + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. prečica za ručno dodat upit Custom Query Shortcut Built-in Shortcut @@ -188,6 +212,7 @@ Obriši Izmeni Dodaj + None Molim Vas izaberite stavku Da li ste sigurni da želite da obrišete prečicu za {0} plugin? Are you sure you want to delete shortcut: {0} with expansion {1}? @@ -286,6 +311,11 @@ Prečica je nedustupna, molim Vas izaberite drugu prečicu Nepravlna prečica za plugin 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. Custom Query Shortcut @@ -297,8 +327,12 @@ 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. - - Prečica nedostupna + + Sačuvaj + Overwrite + Otkaži + Reset + Obriši Verzija @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Open Setting Window Reload Plugin Data + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Weather Weather in Google Result > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml index 16564c112..8a54a9b8a 100644 --- a/Flow.Launcher/Languages/tr.xaml +++ b/Flow.Launcher/Languages/tr.xaml @@ -156,6 +156,7 @@ Arama penceresi açıldığında küçük bir ses oynat Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Animasyon Arayüzde Animasyon Kullan Animation Speed @@ -170,14 +171,37 @@ Kısayol Tuşu Kısayol Tuşu - Flow Launcher Kısayolu + Open Flow Launcher Enter shortcut to show/hide Flow Launcher. - Preview Hotkey + Toggle Preview Enter shortcut to show/hide preview in search window. + Hotkey Presets + List of currently registered hotkeys Açık Sonuç Değiştiricileri Select a modifier key to open selected result via keyboard. Kısayol Tuşunu Göster Show result selection hotkey with results. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Open Context Menu + Open Setting Window + Copy File Path + Toggle Game Mode + Toggle History + Open Containing Folder + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Özel Sorgu Kısayolları Custom Query Shortcut Built-in Shortcut @@ -188,6 +212,7 @@ Sil Düzenle Ekle + None Lütfen bir öğe seçin {0} eklentisi için olan kısayolu silmek istediğinize emin misiniz? Are you sure you want to delete shortcut: {0} with expansion {1}? @@ -286,6 +311,11 @@ Kısayol tuşu kullanılabilir değil, lütfen başka bir kısayol tuşu seçin Geçersiz eklenti kısayol tuşu Güncelle + 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. Custom Query Shortcut @@ -297,8 +327,12 @@ 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. - - Kısayol tuşu kullanılabilir değil + + Kaydet + Overwrite + İptal + Reset + Sil Sürüm @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Open Setting Window Reload Plugin Data + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Weather Weather in Google Result > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml index 46ae5d2c0..88f88b7cb 100644 --- a/Flow.Launcher/Languages/uk-UA.xaml +++ b/Flow.Launcher/Languages/uk-UA.xaml @@ -156,6 +156,7 @@ Відтворювати невеликий звук при відкритті вікна пошуку Гучність звукового ефекту Налаштуйте гучність звукового ефекту + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. Анімація Використовувати анімацію в інтерфейсі Швидкість анімації @@ -169,15 +170,38 @@ Гаряча клавіша - Гаряча клавіша - Гаряча клавіша Flow Launcher + Гарячі клавіші + Open Flow Launcher Введіть скорочення, щоб показати/приховати Flow Launcher. - Гаряча клавіша попереднього перегляду + Toggle Preview Введіть скорочення, щоб показати/приховати попередній перегляд у вікні пошуку. + Hotkey Presets + List of currently registered hotkeys Відкрити ключ зміни результатів Виберіть ключ модифікатора для відкриття вибраних результатів за допомогою клавіатури. Показати гарячу клавішу Показати гарячу клавішу вибору результату з результатами. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + Відкрити контекстне меню + Відкрити вікно налаштувань + Copy File Path + Перемкнути режим гри + Toggle History + Відкрийте папку, що містить файл + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. Задані гарячі клавіші для запитів Користувацькі скорочення запитів Вбудовані скорочення @@ -188,6 +212,7 @@ Видалити Редагувати Додати + None Спочатку виберіть елемент Ви впевнені, що хочете видалити гарячу клавішу ({0}) плагіну? Ви впевнені, що хочете видалити скорочення: {0} з розширенням {1}? @@ -286,6 +311,11 @@ Гаряча клавіша недоступна. Будь ласка, вкажіть нову Недійсна гаряча клавіша плагіна Оновити + 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. Власне скорочення запиту @@ -297,8 +327,12 @@ Скорочення вже існує, будь ласка, введіть нове або відредагуйте існуюче. Скорочення та/або його розширення є порожнім. - - Гаряча клавіша недоступна + + Зберегти + Overwrite + Скасувати + Reset + Видалити Версія @@ -348,7 +382,7 @@ Пошук та запуск усіх файлів і програм на вашому комп'ютері Шукайте все: програми, файли, закладки, YouTube, Twitter тощо. І все це за допомогою клавіатури, навіть не торкаючись миші. Flow Launcher запускається за допомогою наведеної нижче гарячої клавіші, спробуйте натиснути її зараз. Щоб її змінити, клацніть на ввід і натисніть потрібну гарячу клавішу на клавіатурі. - Гаряча клавіша + Гарячі клавіші Ключове слово дії та команди Шукайте в Інтернеті, запускайте програми або виконуйте різноманітні функції за допомогою плагінів Flow Launcher. Деякі функції починаються з ключового слова дії, але за потреби їх можна використовувати і без нього. Спробуйте наведені нижче запити у Flow Launcher. Давайте запустимо Flow Launcher @@ -368,6 +402,12 @@ Відкрити вікно налаштувань Перезавантажити дані плагінів + Select first result + Select last result + Run current query again + Open result + Open result #{0} + Погода Погода в результатах Google > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml new file mode 100644 index 000000000..dbb8b9a05 --- /dev/null +++ b/Flow.Launcher/Languages/vi.xaml @@ -0,0 +1,426 @@ + + + + Không thể đăng ký phím nóng "{0}". Phím nóng có thể được sử dụng bởi một chương trình khác. Chuyển sang phím nóng khác hoặc thoát khỏi chương trình khác. + Trình khởi chạy luồng + Không thể khởi động {0} + Định dạng tệp plugin Flow Launcher không chính xác + Đặt ở vị trí trên cùng trong truy vấn này + Hủy trên cùng trong truy vấn này + Thực thi truy vấn:{0} + Thời gian thực hiện lần cuối:{0} + Mở + Cài đặt + Giới thiệu + Thoát + Đóng + Sao chép + Di chuyển + Dán + Hoàn tác + Chọn tất cả + Ngày tháng + Thư Mục + Văn bản + Chế độ trò chơi + Tạm dừng sử dụng phím nóng. + Đặt lại vị trí + Đặt lại vị trí của cửa sổ tìm kiếm + + + Cài đặt + Tổng quan + Chế độ Portabler + Lưu trữ tất cả cài đặt và dữ liệu người dùng trong một thư mục (hữu ích khi sử dụng với thiết bị lưu trữ di động hoặc dịch vụ đám mây). + Khởi động Flow Launcher khi khởi động hệ thống + Không lưu được tính năng tự khởi động khi khởi động hệ thống + Ẩn Flow Launcher khi mất tiêu điểm + Không hiển thị thông báo khi có phiên bản mới + Vị trí Suchfenster + Ghi nhớ vị trí cuối cùng + Màn hình bằng con trỏ chuột + Màn hình có cửa sổ được tập trung + Màn hình chính + Màn hình tùy chỉnh + Tìm kiếm vị trí cửa sổ trên màn hình + Trung tâm + Trung tâm trên cùng + Liên kết oben + Trên cùng bên phải + Vị trí tùy chỉnh + Ngôn Ngữ + Chọn kiểu truy vấn + Hiển thị/ẩn các kết quả trước đó khi Flow Launcher được kích hoạt lại. + Giữ lại truy vấn cuối cùng + Chọn truy vấn cuối cùng + Trống truy vấn cuối cùng + Số kết quả tối đa + Có thể thiết lập nhanh chóng bằng CTRL+Plus và CTRL+Minus. + Bỏ qua phím nóng khi cửa sổ ở chế độ toàn màn hình + Tắt Flow Launcher khi ứng dụng toàn màn hình đang hoạt động (Được khuyến nghị để chơi trò chơi). + Trình quản lý ngày tháng tiêu chuẩn + Chọn trình quản lý tệp để sử dụng khi mở thư mục. + Trình duyệt chuẩn + Cài đặt cho tab mới, cửa sổ mới và chế độ riêng tư. + Python-Pfad + Node.js-Pfad + Vui lòng chọn chương trình Node.js + Vui lòng chọn pythonw.exe + Luôn bắt đầu nhập ở chế độ tiếng Anh + Tạm thời chuyển phương thức nhập sang tiếng Anh khi kích hoạt Flow. + Cập nhật tự động + Chọn + Ẩn Trình khởi chạy luồng khi khởi động + Ẩn biểu tượng thanh trạng thái + Khi biểu tượng bị ẩn khỏi khay, bạn có thể mở menu Cài đặt bằng cách nhấp chuột phải vào cửa sổ tìm kiếm. + Độ chính xác của tìm kiếm truy vấn + Kết quả tìm kiếm bắt buộc. + Hoạt động bính âm + Cho phép bạn sử dụng Bính âm để tìm kiếm. Bính âm là hệ thống ký hiệu La Mã tiêu chuẩn để dịch văn bản tiếng Trung. + Luôn xem trước + Luôn mở bảng xem trước khi Flow kích hoạt. Nhấn {0} để chuyển đổi chế độ xem trước. + Hiệu ứng đổ bóng không được phép nếu chủ đề hiện tại bật hiệu ứng làm mờ + + + Plugin tìm kiếm + Ctrl+F để tìm kiếm plugin + Không tìm thấy kết quả nào + Vui lòng thử tìm kiếm khác. + Tiện ích mở rộng + Tiện ích mở rộng + Tìm kiếm thêm plugin + Bật + Tắt + Cài đặt từ hành động + Từ khóa hành động + Từ hành động hiện tại + Từ hành động mới + Thay đổi từ hành động + Ưu tiên hiện tại + Ưu tiên mới + Ưu tiên + Thay đổi mức độ ưu tiên của kết quả plugin + Trình cắm + tác giả + Khởi tạo ban đầu: + Abfragezeit: + Phiên bản + Trang web + Gỡ cài đặt + + + + Tải tiện ích mở rộng + Bản phát hành mới + Cập nhật gần đây + Tiện ích mở rộng + Đã cài đặt + Làm mới + Cài đặt + Gỡ cài đặt + Cập nhật + Plugin đã được cài đặt + 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 + + + + + Giao Diện + Giao diện + Tìm kiếm thêm chủ đề + Cách tạo chủ đề + Xin chào + Thư mục + Tìm kiếm tệp, thư mục và nội dung tệp + Tìm kiếm trên web + Tìm kiếm trên web với sự hỗ trợ của công cụ tìm kiếm khác + Chương trình + Khởi chạy chương trình với tư cách quản trị viên hoặc người dùng khác + Buộc Tắt Tiến Trình + Chấm dứt các tiến trình không mong muốn + Phông chữ hộp truy vấn + Phông chữ kết quả + chế độ cửa sổ + độ mờ + Chủ đề {0} không tồn tại nên mẫu mặc định được kích hoạt + Tải chủ đề {0} không thành công, mẫu mặc định được kích hoạt + Mở thư mục chủ đề + Mở thư mục chủ đề + Bảng màu + Mặc định hệ thống + Sáng + Tối + Hiệu ứng âm thanh + Phát âm thanh khi cửa sổ tìm kiếm mở + Âm lượng hiệu ứng âm thanh + Điều chỉnh âm lượng của hiệu ứng âm thanh + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. + Hoạt hình + Sử dụng hình động trong giao diện + Tốc độ hoạt ảnh + Tốc độ của hoạt ảnh giao diện người dùng + Chậm + Trung bình + Nhanh + Tùy chỉnh + Giờ + Ngày + + + Phím tắt + Phím tắt + Chào mừng bạn đến với Trình khởi chạy luồng + Nhập phím tắt để hiển thị/ẩn Flow Launcher. + Bật tắt xem trước + Nhập phím tắt để hiển thị/ẩn bản xem trước trong cửa sổ tìm kiếm. + Cài đặt trước phím nóng + Danh sách các phím nóng hiện đã đăng ký + Mở công cụ sửa đổi kết quả + Chọn phím bổ trợ để mở kết quả đã chọn từ bàn phím. + Giải thích phím nóng + Hiển thị phím tắt chọn kết quả cùng với kết quả. + Tự động hoàn thành + Chạy tự động hoàn thành cho các mục đã chọn. + Select Next Item + Select Previous Item + Trang Tiếp Theo + Previous Page + Cycle Previous Query + Cycle Next Query + Mở menu ngữ cảnh + Mở cửa sổ cài đặt + Chép đường dẫn tập tin + Chuyển đổi chế độ trò chơi + Chuyển đổi lịch sử + Mở thư mục chứa + Chạy với quyền admin + Refresh Search Results + Dữ liệu plugin không tải + 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. + Phím tắt truy vấn tùy chỉnh + Lối tắt truy vấn tùy chỉnh + Phím tắt tích hợp + Truy vấn + Phím tắt + Mở rộng + Mô Tả + Xóa + Chỉnh sửa + Thêm + Không + Vui lòng chọn một mục + Bạn có chắc chắn muốn xóa tổ hợp phím plugin {0} không? + Bạn có chắc chắn muốn xóa lối tắt: {0} với phần mở rộng {1} không? + Nhận văn bản từ bảng nhớ tạm. + Nhận đường dẫn từ trình thám hiểm đang hoạt động. + Hiệu ứng đổ bóng trong cửa sổ truy vấn + Hiệu ứng đổ bóng gây rất nhiều áp lực lên GPU. Không nên dùng nếu hiệu suất máy tính của bạn bị hạn chế. + Chiều rộng kích thước cửa sổ + Bạn cũng có thể nhanh chóng điều chỉnh điều này bằng cách sử dụng Ctrl+[ và Ctrl+]. + Sử dụng biểu tượng Segoe + Sử dụng Biểu tượng Segoe Fluent cho kết quả truy vấn nếu được hỗ trợ + Nhấn phím + + + Proxy HTTP + Proxy HTTP hoạt động + Máy chủ HTTP + Cổng + Tài Khoản + Mật khẩu + Proxy thử nghiệm + Lưu + Máy chủ không được để trống + Cổng máy chủ không được để trống + Định dạng cổng Falsches + Đã lưu cấu hình proxy thành công + Proxy được cấu hình đúng + Kết nối với proxy không thành công + + + Giới thiệu + Trang web + GitHub + Tài liệu + Phiên bản + Biểu tượng + Bạn đã kích hoạt Flow Launcher {0} lần + Kiểm tra các bản cập nhật + Trở thành nhà tài trợ + Đã có phiên bản mới {0}, bạn có muốn khởi động lại Flow Launcher để sử dụng bản cập nhật không? + Kiểm tra cập nhật không thành công. Vui lòng kiểm tra kết nối và cài đặt proxy của bạn tới api.github.com. + + + Tải xuống bản cập nhật không thành công. Vui lòng kiểm tra cài đặt kết nối và proxy của bạn tới github-cloud.s3.amazonaws.com, + hoặc truy cập https://github.com/Flow-Launcher/Flow.Launcher/releases để tải xuống các bản cập nhật theo cách thủ công. + + + Ghi chú phát hành + Mẹo sử dụng + Công cụ dành cho nhà phát triển + Thư mục cài đặt + Thư mục nhật ký + Xóa tệp nhật ký + Bạn có chắc chắn muốn xóa tất cả nhật ký không? + Wizard + + + Chọn trình quản lý tệp + Vui lòng chỉ định vị trí tệp của trình quản lý tệp mà bạn đang sử dụng và thêm đối số nếu cần. Đối số mặc định là "%d" và một đường dẫn được nhập tại vị trí đó. Ví dụ: Nếu một lệnh được yêu cầu như "totalcmd.exe /A c:\windows", đối số là /A "%d". + "%f" là một đối số đại diện cho đường dẫn tệp. Nó được sử dụng để nhấn mạnh tên tệp/thư mục khi mở một vị trí tệp cụ thể trong trình quản lý tệp của bên thứ 3. Đối số này chỉ có sẵn trong phần "Arg for File" mục. Nếu trình quản lý tệp không có chức năng đó, bạn có thể sử dụng "%d". + Trình quản lý ngày tháng + Tên hồ sơ + Đường dẫn quản lý tệp + Đối số cho thư mục + Đối số cho tệp + + + Trình duyệt web tiêu chuẩn + Mặc định sử dụng mặc định trình duyệt của hệ điều hành. Nếu được chỉ định, Flow sẽ sử dụng trình duyệt này. + Trình duyệt + Tên trình duyệt + Đường dẫn trình duyệt + Cửa sổ mới + Thẻ Mới + Chế độ riêng tư + + + Thay đổi mức độ ưu tiên + Số càng cao thì kết quả được xếp hạng càng cao. Hãy thử số 5. ​​Nếu bạn muốn kết quả sâu hơn so với các plugin khác, hãy sử dụng số âm + Vui lòng chỉ định số nguyên hợp lệ cho mức độ ưu tiên! + + + Từ khóa hành động cũ + Từ khóa hành động mới + Viết tắt + Fertig + Không thể tìm thấy plugin được chỉ định + Từ khóa hành động mới không được để trống + Từ khóa hành động mới này đã được gán cho một plugin khác, vui lòng chọn một plugin khác + Thành công + Đã hoàn tất thành công + Sử dụng * nếu bạn muốn xác định từ khóa hành động. + + + Phím nóng truy vấn tùy chỉnh + 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ệ + Cập nhật + 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. + + + Phím tắt truy vấn tùy chỉnh + Nhập một phím tắt tự động mở rộng theo truy vấn đã chỉ định. + + Một phím tắt được mở rộng khi nó khớp chính xác với truy vấn. + + Nếu bạn thêm tiền tố '@' trong khi nhập phím tắt, phím tắt đó sẽ khớp với bất kỳ vị trí nào trong truy vấn. Các phím tắt dựng sẵn khớp với bất kỳ vị trí nào trong truy vấn. + + + 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. + + + Lưu + Ghi đè lên + Hủy + Đặt lại + Xóa + + + Phiên bản + Thời gian + Vui lòng cho chúng tôi biết ứng dụng bị lỗi như thế nào để chúng tôi có thể khắc phục + Gửi báo cáo + Huỷ bỏ + Chung + Ngoại lệ + Loại ngoại lệ + Nguồn + Ngăn xếp dấu vết + Gửi + Đã gửi báo cáo thành công + Báo cáo lỗi + Trình khởi chạy luồng có lỗi + + + Cảnh báo nhỏ... + + + Kiểm tra cập nhật mới + Bạn đã có phiên bản mới nhất + Tìm thấy cập nhật + Đang cập nhật... + + + Flow Launcher không thể di chuyển dữ liệu hồ sơ của bạn sang phiên bản cập nhật mới. + Vui lòng di chuyển thủ công thư mục dữ liệu hồ sơ của bạn từ {0} sang {1} + + + Cập nhật mới + Đã có sẵn V{0} của Flow Launcher + Đã xảy ra lỗi khi cố cài đặt bản cập nhật phần mềm + Cập nhật + Viết tắt + Cập nhật không thành công + Kiểm tra kết nối Internet của bạn và cập nhật cài đặt proxy để truy cập github-cloud.s3.amazonaws.com. + Bản cập nhật này sẽ khởi động lại Flow Launcher + Các tệp sau sẽ được cập nhật + Cập nhật tệp + Thông tin mô tả + + + Bỏ Qua + Chào mừng bạn đến với Trình khởi chạy luồng + Xin chào, đây là lần đầu tiên bạn sử dụng Flow Launcher! + Trước khi bạn bắt đầu, trình hướng dẫn này sẽ giúp thiết lập Flow Launcher. Bạn có thể bỏ qua điều này nếu bạn muốn. Vui lòng chọn ngôn ngữ + Tìm kiếm và khởi chạy tất cả các tệp và ứng dụng trên PC của bạn + Tìm kiếm mọi thứ từ ứng dụng, tệp, dấu trang, YouTube, Twitter và hơn thế nữa. Tất cả đều từ bàn phím thoải mái mà không cần chạm vào chuột. + Trình khởi chạy Flow bắt đầu bằng phím nóng bên dưới, hãy tiếp tục và dùng thử ngay bây giờ. Để thay đổi nó, hãy nhấp vào đầu vào và nhấn phím nóng mong muốn trên bàn phím. + Phím tắt + Từ khóa và lệnh hành động + Tìm kiếm trên web, khởi chạy ứng dụng hoặc chạy các chức năng khác nhau thông qua plugin Flow Launcher. Một số chức năng nhất định bắt đầu bằng từ khóa hành động và nếu cần, chúng có thể được sử dụng mà không cần từ khóa hành động. Hãy thử các truy vấn bên dưới trong Flow Launcher. + Bắt đầu Flow-Launcher + Xong. Thưởng thức Flow Launcher. Đừng quên phím tắt để khởi động Flow Launcher :) + + + + Menu Quay lại / Ngữ cảnh + Mục Điều hướng + Mở menu ngữ cảnh + Mở thư mục chứa + Chạy với tư cách quản trị viên / mở thư mục trong trình quản lý tệp tiêu chuẩn + Lịch sử tìm kiếm + Quay lại kết quả trong menu ngữ cảnh + Tự động hoàn thành + Mở/chạy mục đã chọn + Mở cửa sổ cài đặt + Dữ liệu plugin không tải + + Select first result + Select last result + Run current query again + Open result + Open result #{0} + + Thời Tiết + Thời tiết từ kết quả của Google + > ping 8.8.8.8 + Lệnh Shell + Bluetooth + Cài đặt Bluetooth + sn + Ghi chú + + diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml index b2d9eeaa5..dd24444b0 100644 --- a/Flow.Launcher/Languages/zh-cn.xaml +++ b/Flow.Launcher/Languages/zh-cn.xaml @@ -156,6 +156,7 @@ 启用激活音效 音效音量 调整音效音量 + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. 动画 启用动画 动画速度 @@ -170,14 +171,37 @@ 热键 热键 - Flow Launcher 激活热键 + Open Flow Launcher 输入显示/隐藏 Flow Launcher 的快捷键。 - 预览快捷键 + Toggle Preview 输入在搜索窗口中开启/关闭预览的快捷键。 + Hotkey Presets + List of currently registered hotkeys 打开结果快捷键修饰符 选择一个用以打开搜索结果的按键修饰符。 显示热键 显示用于打开结果的快捷键。 + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + 打开菜单目录 + 打开设置窗口 + Copy File Path + 切换游戏模式 + Toggle History + 打开所在目录 + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. 自定义查询热键 自定义查询捷径 内置捷径 @@ -188,6 +212,7 @@ 删除 编辑 添加 + None 请选择一项 你确定要删除插件 {0} 的热键吗? 你确定要删除捷径 {0} (展开为 {1})? @@ -286,6 +311,11 @@ 热键不可用,请选择一个新的热键 插件热键不合法 更新 + 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. 自定义查询捷径 @@ -297,8 +327,12 @@ 捷径已存在,请输入一个新的或者编辑已有的。 捷径及其展开均不能为空。 - - 热键不可用 + + 保存 + Overwrite + 取消 + Reset + 删除 版本 @@ -368,6 +402,12 @@ 打开设置窗口 重新加载插件数据 + Select first result + Select last result + Run current query again + Open result + Open result #{0} + 天气 谷歌天气结果 > ping 8.8.8.8 diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml index 4f5db8194..3b0f19638 100644 --- a/Flow.Launcher/Languages/zh-tw.xaml +++ b/Flow.Launcher/Languages/zh-tw.xaml @@ -156,6 +156,7 @@ 搜尋窗口打開時播放音效 Sound Effect Volume Adjust the volume of the sound effect + Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume. 動畫 使用介面動畫 Animation Speed @@ -170,14 +171,37 @@ 快捷鍵 快捷鍵 - Flow Launcher 快捷鍵 + Open Flow Launcher 執行縮寫以顯示 / 隱藏 Flow Launcher。 - 預覽快捷鍵 + Toggle Preview Enter shortcut to show/hide preview in search window. + Hotkey Presets + List of currently registered hotkeys 開放結果修飾符 Select a modifier key to open selected result via keyboard. 顯示快捷鍵 Show result selection hotkey with results. + Auto Complete + Runs autocomplete for the selected items. + Select Next Item + Select Previous Item + Next Page + Previous Page + Cycle Previous Query + Cycle Next Query + 打開選單 + 打開視窗設定 + Copy File Path + Toggle Game Mode + Toggle History + 開啟檔案位置 + Run As Admin + Refresh Search Results + Reload Plugins Data + Quick Adjust Window Width + Quick Adjust Window Height + Use when require plugins to reload and update their existing data. + You can add one more hotkey for this function. 自定義查詢快捷鍵 自訂查詢縮寫 內建縮寫 @@ -188,6 +212,7 @@ 刪除 編輯 新增 + None 請選擇一項 確定要刪除插件 {0} 的快捷鍵嗎? 你確定你要刪除縮寫:{0} 展開為 {1}? @@ -286,6 +311,11 @@ 快捷鍵不存在,請設定一個新的快捷鍵 擴充功能熱鍵無法使用 更新 + 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. Custom Query Shortcut @@ -297,8 +327,12 @@ 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. - - 快捷鍵無法使用 + + 儲存 + Overwrite + 取消 + Reset + 刪除 版本 @@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 開啟視窗設定 重新載入插件資料 + Select first result + Select last result + Run current query again + Open result + Open result #{0} + 天氣 Google 搜尋的天氣結果 > ping 8.8.8.8 diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml index adecfa2ba..2b10f79b3 100644 --- a/Flow.Launcher/MainWindow.xaml +++ b/Flow.Launcher/MainWindow.xaml @@ -7,12 +7,14 @@ xmlns:flowlauncher="clr-namespace:Flow.Launcher" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:svgc="http://sharpvectors.codeplex.com/svgc/" + xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:ui="http://schemas.modernwpf.com/2019" xmlns:vm="clr-namespace:Flow.Launcher.ViewModel" Name="FlowMainWindow" Title="Flow Launcher" - MinWidth="{Binding MainWindowWidth, Mode=OneWay}" - MaxWidth="{Binding MainWindowWidth, Mode=OneWay}" + Width="{Binding MainWindowWidth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" + MinWidth="400" + MinHeight="30" d:DataContext="{d:DesignInstance Type=vm:MainViewModel}" AllowDrop="True" AllowsTransparency="True" @@ -21,12 +23,13 @@ Deactivated="OnDeactivated" Icon="Images/app.png" Initialized="OnInitialized" + Left="{Binding Settings.WindowLeft, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Loaded="OnLoaded" LocationChanged="OnLocationChanged" Opacity="{Binding MainWindowOpacity, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" PreviewKeyDown="OnKeyDown" PreviewKeyUp="OnKeyUp" - ResizeMode="NoResize" + ResizeMode="CanResize" ShowInTaskbar="False" SizeToContent="Height" Topmost="True" @@ -34,6 +37,10 @@ WindowStartupLocation="Manual" WindowStyle="None" mc:Ignorable="d"> + + + + @@ -197,312 +204,324 @@ Key="{Binding SelectPrevPageHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='key'}" Command="{Binding SelectPrevPageCommand}" Modifiers="{Binding SelectPrevPageHotkey, Converter={StaticResource StringToKeyBindingConverter}, ConverterParameter='modifiers'}" /> + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - + + + - - - - - + + + + + + + + + + + + - - - - \ No newline at end of file + + + + diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 9c5ed46c0..c333c4e85 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -12,7 +12,6 @@ using Flow.Launcher.Helper; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.ViewModel; using Screen = System.Windows.Forms.Screen; -using ContextMenuStrip = System.Windows.Forms.ContextMenuStrip; using DragEventArgs = System.Windows.DragEventArgs; using KeyEventArgs = System.Windows.Input.KeyEventArgs; using NotifyIcon = System.Windows.Forms.NotifyIcon; @@ -24,7 +23,6 @@ using System.Windows.Data; using ModernWpf.Controls; using Key = System.Windows.Input.Key; using System.Media; -using static Flow.Launcher.ViewModel.SettingWindowViewModel; using DataObject = System.Windows.DataObject; using System.Windows.Media; using System.Windows.Interop; @@ -46,9 +44,11 @@ namespace Flow.Launcher private ContextMenu contextMenu = new ContextMenu(); private MainViewModel _viewModel; private bool _animating; - MediaPlayer animationSound = new MediaPlayer(); private bool isArrowKeyPressed = false; + private MediaPlayer animationSoundWMP; + private SoundPlayer animationSoundWPF; + #endregion public MainWindow(Settings settings, MainViewModel mainVM) @@ -60,16 +60,71 @@ namespace Flow.Launcher InitializeComponent(); InitializePosition(); - animationSound.Open(new Uri(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav")); + InitSoundEffects(); DataObject.AddPastingHandler(QueryTextBox, OnPaste); + + this.Loaded += (_, _) => + { + var handle = new WindowInteropHelper(this).Handle; + var win = HwndSource.FromHwnd(handle); + win.AddHook(WndProc); + }; } + DispatcherTimer timer = new DispatcherTimer + { + Interval = new TimeSpan(0, 0, 0, 0, 500), + IsEnabled = false + }; + public MainWindow() { InitializeComponent(); } + private const int WM_ENTERSIZEMOVE = 0x0231; + private const int WM_EXITSIZEMOVE = 0x0232; + private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) + { + if (msg == WM_ENTERSIZEMOVE) + { + handled = true; + } + if (msg == WM_EXITSIZEMOVE) + { + OnResizeEnd(); + handled = true; + } + return IntPtr.Zero; + } + + private void OnResizeEnd() + { + int shadowMargin = 0; + if (_settings.UseDropShadowEffect) + { + shadowMargin = 32; + } + + if (!_settings.KeepMaxResults) + { + var itemCount = (Height - (_settings.WindowHeightSize + 14) - shadowMargin) / _settings.ItemHeightSize; + + if (itemCount < 2) + { + _settings.MaxResultsToShow = 2; + } + else + { + _settings.MaxResultsToShow = Convert.ToInt32(Math.Truncate(itemCount)); + } + } + + _viewModel.MainWindowWidth = Width; + FlowMainWindow.SizeToContent = SizeToContent.Height; + } + private void OnCopy(object sender, ExecutedRoutedEventArgs e) { var result = _viewModel.Results.SelectedItem?.Result; @@ -96,7 +151,7 @@ namespace Flow.Launcher e.DataObject = data; } } - + private async void OnClosing(object sender, CancelEventArgs e) { _notifyIcon.Visible = false; @@ -140,9 +195,7 @@ namespace Flow.Launcher { if (_settings.UseSound) { - animationSound.Position = TimeSpan.Zero; - animationSound.Volume = _settings.SoundVolume / 100.0; - animationSound.Play(); + SoundPlay(); } UpdatePosition(); PreviewReset(); @@ -508,6 +561,33 @@ namespace Flow.Launcher windowsb.Begin(FlowMainWindow); } + private void InitSoundEffects() + { + if (_settings.WMPInstalled) + { + animationSoundWMP = new MediaPlayer(); + animationSoundWMP.Open(new Uri(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav")); + } + else + { + animationSoundWPF = new SoundPlayer(AppDomain.CurrentDomain.BaseDirectory + "Resources\\open.wav"); + } + } + + private void SoundPlay() + { + if (_settings.WMPInstalled) + { + animationSoundWMP.Position = TimeSpan.Zero; + animationSoundWMP.Volume = _settings.SoundVolume / 100.0; + animationSoundWMP.Play(); + } + else + { + animationSoundWPF.Play(); + } + } + private void OnMouseDown(object sender, MouseButtonEventArgs e) { if (e.ChangedButton == MouseButton.Left) DragMove(); @@ -532,11 +612,11 @@ namespace Flow.Launcher { _settings.WindowLeft = Left; _settings.WindowTop = Top; - //This condition stops extra hide call when animator is on, + //This condition stops extra hide call when animator is on, // which causes the toggling to occasional hide instead of show. if (_viewModel.MainWindowVisibilityStatus) { - // Need time to initialize the main query window animation. + // Need time to initialize the main query window animation. // This also stops the mainwindow from flickering occasionally after Settings window is opened // and always after Settings window is closed. if (_settings.UseAnimation) @@ -607,7 +687,7 @@ namespace Flow.Launcher } return screen ?? Screen.AllScreens[0]; } - + public double HorizonCenter(Screen screen) { var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0); diff --git a/Flow.Launcher/Properties/Resources.ar-SA.resx b/Flow.Launcher/Properties/Resources.ar-SA.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.ar-SA.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.cs-CZ.resx b/Flow.Launcher/Properties/Resources.cs-CZ.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.cs-CZ.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.da-DK.resx b/Flow.Launcher/Properties/Resources.da-DK.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.da-DK.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.de-DE.resx b/Flow.Launcher/Properties/Resources.de-DE.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.de-DE.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.es-419.resx b/Flow.Launcher/Properties/Resources.es-419.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.es-419.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.es-EM.resx b/Flow.Launcher/Properties/Resources.es-EM.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.es-EM.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.fr-FR.resx b/Flow.Launcher/Properties/Resources.fr-FR.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.fr-FR.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.it-IT.resx b/Flow.Launcher/Properties/Resources.it-IT.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.it-IT.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.ja-JP.resx b/Flow.Launcher/Properties/Resources.ja-JP.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.ja-JP.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.ko-KR.resx b/Flow.Launcher/Properties/Resources.ko-KR.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.ko-KR.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.nb-NO.resx b/Flow.Launcher/Properties/Resources.nb-NO.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.nb-NO.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.nl-NL.resx b/Flow.Launcher/Properties/Resources.nl-NL.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.nl-NL.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.pl-PL.resx b/Flow.Launcher/Properties/Resources.pl-PL.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.pl-PL.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.pt-BR.resx b/Flow.Launcher/Properties/Resources.pt-BR.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.pt-BR.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.pt-PT.resx b/Flow.Launcher/Properties/Resources.pt-PT.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.pt-PT.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.ru-RU.resx b/Flow.Launcher/Properties/Resources.ru-RU.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.ru-RU.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.sk-SK.resx b/Flow.Launcher/Properties/Resources.sk-SK.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.sk-SK.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.sr-CS.resx b/Flow.Launcher/Properties/Resources.sr-CS.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.sr-CS.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.tr-TR.resx b/Flow.Launcher/Properties/Resources.tr-TR.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.tr-TR.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.uk-UA.resx b/Flow.Launcher/Properties/Resources.uk-UA.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.uk-UA.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.zh-TW.resx b/Flow.Launcher/Properties/Resources.zh-TW.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.zh-TW.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Properties/Resources.zh-cn.resx b/Flow.Launcher/Properties/Resources.zh-cn.resx deleted file mode 100644 index b5e00e8a2..000000000 --- a/Flow.Launcher/Properties/Resources.zh-cn.resx +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/Flow.Launcher/Resources/Controls/Card.xaml b/Flow.Launcher/Resources/Controls/Card.xaml index 24a895485..c29a5f602 100644 --- a/Flow.Launcher/Resources/Controls/Card.xaml +++ b/Flow.Launcher/Resources/Controls/Card.xaml @@ -20,6 +20,7 @@ + @@ -36,6 +37,27 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Flow.Launcher/Resources/Controls/Card.xaml.cs b/Flow.Launcher/Resources/Controls/Card.xaml.cs index 06266c775..c8f788aca 100644 --- a/Flow.Launcher/Resources/Controls/Card.xaml.cs +++ b/Flow.Launcher/Resources/Controls/Card.xaml.cs @@ -16,6 +16,7 @@ namespace Flow.Launcher.Resources.Controls { InitializeComponent(); } + public string Title { get { return (string)GetValue(TitleProperty); } diff --git a/Flow.Launcher/Resources/Controls/CardGroup.xaml b/Flow.Launcher/Resources/Controls/CardGroup.xaml new file mode 100644 index 000000000..f48bf4b6c --- /dev/null +++ b/Flow.Launcher/Resources/Controls/CardGroup.xaml @@ -0,0 +1,32 @@ + + + + + + + + + + + + diff --git a/Flow.Launcher/Resources/Controls/CardGroup.xaml.cs b/Flow.Launcher/Resources/Controls/CardGroup.xaml.cs new file mode 100644 index 000000000..b9588275c --- /dev/null +++ b/Flow.Launcher/Resources/Controls/CardGroup.xaml.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.ObjectModel; +using System.Windows; +using System.Windows.Controls; + +namespace Flow.Launcher.Resources.Controls; + +public partial class CardGroup : UserControl +{ + public enum CardGroupPosition + { + NotInGroup, + First, + Middle, + Last + } + + public new ObservableCollection Content + { + get { return (ObservableCollection)GetValue(ContentProperty); } + set { SetValue(ContentProperty, value); } + } + + public static new readonly DependencyProperty ContentProperty = + DependencyProperty.Register(nameof(Content), typeof(ObservableCollection), typeof(CardGroup)); + + public static readonly DependencyProperty PositionProperty = DependencyProperty.RegisterAttached( + "Position", typeof(CardGroupPosition), typeof(CardGroup), + new FrameworkPropertyMetadata(CardGroupPosition.NotInGroup, FrameworkPropertyMetadataOptions.AffectsRender) + ); + + public static void SetPosition(UIElement element, CardGroupPosition value) + { + element.SetValue(PositionProperty, value); + } + + public static CardGroupPosition GetPosition(UIElement element) + { + return (CardGroupPosition)element.GetValue(PositionProperty); + } + + public CardGroup() + { + InitializeComponent(); + Content = new ObservableCollection(); + } +} diff --git a/Flow.Launcher/Resources/Controls/CardGroupCardStyleSelector.cs b/Flow.Launcher/Resources/Controls/CardGroupCardStyleSelector.cs new file mode 100644 index 000000000..605934e80 --- /dev/null +++ b/Flow.Launcher/Resources/Controls/CardGroupCardStyleSelector.cs @@ -0,0 +1,21 @@ +using System.Windows; +using System.Windows.Controls; + +namespace Flow.Launcher.Resources.Controls; + +public class CardGroupCardStyleSelector : StyleSelector +{ + public Style FirstStyle { get; set; } + public Style MiddleStyle { get; set; } + public Style LastStyle { get; set; } + + public override Style SelectStyle(object item, DependencyObject container) + { + var itemsControl = ItemsControl.ItemsControlFromItemContainer(container); + var index = itemsControl.ItemContainerGenerator.IndexFromContainer(container); + + if (index == 0) return FirstStyle; + if (index == itemsControl.Items.Count - 1) return LastStyle; + return MiddleStyle; + } +} diff --git a/Flow.Launcher/Resources/Controls/ExCard.xaml b/Flow.Launcher/Resources/Controls/ExCard.xaml index 8f0eb3cb4..a70c0f4ea 100644 --- a/Flow.Launcher/Resources/Controls/ExCard.xaml +++ b/Flow.Launcher/Resources/Controls/ExCard.xaml @@ -14,7 +14,6 @@ x:Name="expanderHeader" Padding="0" BorderThickness="1" - IsExpanded="{Binding Mode=TwoWay, Path=IsExpanded}" SnapsToDevicePixels="False"> + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs new file mode 100644 index 000000000..de6a4df5e --- /dev/null +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Windows.Navigation; +using Flow.Launcher.SettingPages.ViewModels; + +namespace Flow.Launcher.SettingPages.Views; + +public partial class SettingsPaneAbout +{ + private SettingsPaneAboutViewModel _viewModel = null!; + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + if (!IsInitialized) + { + if (e.ExtraData is not SettingWindow.PaneData { Settings: { } settings, Updater: { } updater }) + throw new ArgumentException("Settings are required for SettingsPaneAbout."); + _viewModel = new SettingsPaneAboutViewModel(settings, updater); + DataContext = _viewModel; + InitializeComponent(); + } + base.OnNavigatedTo(e); + } + + private void OnRequestNavigate(object sender, RequestNavigateEventArgs e) + { + App.API.OpenUrl(e.Uri.AbsoluteUri); + e.Handled = true; + } +} diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml new file mode 100644 index 000000000..6b301e33a --- /dev/null +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs new file mode 100644 index 000000000..dfb4a7eaf --- /dev/null +++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml.cs @@ -0,0 +1,66 @@ +using System; +using System.ComponentModel; +using System.Windows.Data; +using System.Windows.Input; +using System.Windows.Navigation; +using Flow.Launcher.Core.Plugin; +using Flow.Launcher.SettingPages.ViewModels; +using Flow.Launcher.ViewModel; + +namespace Flow.Launcher.SettingPages.Views; + +public partial class SettingsPanePluginStore +{ + private SettingsPanePluginStoreViewModel _viewModel = null!; + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + if (!IsInitialized) + { + if (e.ExtraData is not SettingWindow.PaneData { Settings: { } settings }) + throw new ArgumentException($"Settings are required for {nameof(SettingsPanePluginStore)}."); + _viewModel = new SettingsPanePluginStoreViewModel(); + DataContext = _viewModel; + InitializeComponent(); + } + _viewModel.PropertyChanged += ViewModel_PropertyChanged; + base.OnNavigatedTo(e); + } + + private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(SettingsPanePluginStoreViewModel.FilterText)) + { + ((CollectionViewSource)FindResource("PluginStoreCollectionView")).View.Refresh(); + } + } + + protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) + { + _viewModel.PropertyChanged -= ViewModel_PropertyChanged; + base.OnNavigatingFrom(e); + } + + private void SettingsPanePlugins_OnKeyDown(object sender, KeyEventArgs e) + { + if (e.Key is not Key.F || Keyboard.Modifiers is not ModifierKeys.Control) return; + PluginStoreFilterTextbox.Focus(); + } + + private void Hyperlink_OnRequestNavigate(object sender, RequestNavigateEventArgs e) + { + PluginManager.API.OpenUrl(e.Uri.AbsoluteUri); + e.Handled = true; + } + + private void PluginStoreCollectionView_OnFilter(object sender, FilterEventArgs e) + { + if (e.Item is not PluginStoreItemViewModel plugin) + { + e.Accepted = false; + return; + } + + e.Accepted = _viewModel.SatisfiesFilter(plugin); + } +} diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml new file mode 100644 index 000000000..37079a46f --- /dev/null +++ b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs new file mode 100644 index 000000000..d48505c3d --- /dev/null +++ b/Flow.Launcher/SettingPages/Views/SettingsPanePlugins.xaml.cs @@ -0,0 +1,30 @@ +using System; +using System.Windows.Input; +using System.Windows.Navigation; +using Flow.Launcher.SettingPages.ViewModels; + +namespace Flow.Launcher.SettingPages.Views; + +public partial class SettingsPanePlugins +{ + private SettingsPanePluginsViewModel _viewModel = null!; + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + if (!IsInitialized) + { + if (e.ExtraData is not SettingWindow.PaneData { Settings: { } settings }) + throw new ArgumentException("Settings are required for SettingsPaneHotkey."); + _viewModel = new SettingsPanePluginsViewModel(settings); + DataContext = _viewModel; + InitializeComponent(); + } + base.OnNavigatedTo(e); + } + + private void SettingsPanePlugins_OnKeyDown(object sender, KeyEventArgs e) + { + if (e.Key is not Key.F || Keyboard.Modifiers is not ModifierKeys.Control) return; + PluginFilterTextbox.Focus(); + } +} diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml new file mode 100644 index 000000000..768abbf97 --- /dev/null +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + @@ -609,2920 +197,72 @@ Grid.Row="0" Width="50" Height="50" + RenderOptions.BitmapScalingMode="HighQuality" Source="images/app.png" /> + TextAlignment="Center" /> - - - - - - - - - - - -  - - - - + + - - - + + + + + - - - - - - - -  - - - + + + + + - - - - - - - -  - - - + + + + + - - - - - - - - + + + + + + + + + + - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - -  - - - - - - - - - - - - -  - - - - - - - - - - - -  - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - -  - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - -  - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - -  - - - - - - - - - - - - + diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index 8144c8ff8..957379ce4 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -1,507 +1,172 @@ -using Flow.Launcher.Core.Plugin; -using Flow.Launcher.Core.Resource; -using Flow.Launcher.Helper; -using Flow.Launcher.Infrastructure; -using Flow.Launcher.Infrastructure.Hotkey; -using Flow.Launcher.Infrastructure.UserSettings; -using Flow.Launcher.Plugin; -using Flow.Launcher.ViewModel; -using ModernWpf; -using ModernWpf.Controls; -using System; -using System.ComponentModel; -using System.IO; +using System; using System.Windows; -using System.Windows.Data; using System.Windows.Forms; using System.Windows.Input; using System.Windows.Interop; -using System.Windows.Navigation; -using NHotkey; -using Button = System.Windows.Controls.Button; -using Control = System.Windows.Controls.Control; -using KeyEventArgs = System.Windows.Input.KeyEventArgs; -using MessageBox = System.Windows.MessageBox; +using Flow.Launcher.Core; +using Flow.Launcher.Core.Configuration; +using Flow.Launcher.Helper; +using Flow.Launcher.Infrastructure.UserSettings; +using Flow.Launcher.Plugin; +using Flow.Launcher.SettingPages.Views; +using Flow.Launcher.ViewModel; +using ModernWpf.Controls; using TextBox = System.Windows.Controls.TextBox; -using ThemeManager = ModernWpf.ThemeManager; -namespace Flow.Launcher +namespace Flow.Launcher; + +public partial class SettingWindow { - public partial class SettingWindow + private readonly IPublicAPI _api; + private readonly Settings _settings; + private readonly SettingWindowViewModel _viewModel; + + public SettingWindow(IPublicAPI api, SettingWindowViewModel viewModel) { - public readonly IPublicAPI API; - private Settings settings; - private SettingWindowViewModel viewModel; + _settings = viewModel.Settings; + DataContext = viewModel; + _viewModel = viewModel; + _api = api; + InitializePosition(); + InitializeComponent(); + NavView.SelectedItem = NavView.MenuItems[0]; /* Set First Page */ + } - public SettingWindow(IPublicAPI api, SettingWindowViewModel viewModel) + private void OnLoaded(object sender, RoutedEventArgs e) + { + RefreshMaximizeRestoreButton(); + // Fix (workaround) for the window freezes after lock screen (Win+L) + // https://stackoverflow.com/questions/4951058/software-rendering-mode-wpf + HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource; + HwndTarget hwndTarget = hwndSource.CompositionTarget; + hwndTarget.RenderMode = RenderMode.Default; + + InitializePosition(); + } + + private void OnClosed(object sender, EventArgs e) + { + _settings.SettingWindowState = WindowState; + _settings.SettingWindowTop = Top; + _settings.SettingWindowLeft = Left; + _viewModel.Save(); + _api.SavePluginSettings(); + } + + private void OnCloseExecuted(object sender, ExecutedRoutedEventArgs e) + { + Close(); + } + + private void window_MouseDown(object sender, MouseButtonEventArgs e) /* for close hotkey popup */ + { + if (Keyboard.FocusedElement is not TextBox textBox) { - settings = viewModel.Settings; - DataContext = viewModel; - this.viewModel = viewModel; - API = api; - InitializePosition(); - InitializeComponent(); - + return; } + var tRequest = new TraversalRequest(FocusNavigationDirection.Next); + textBox.MoveFocus(tRequest); + } - #region General + /* Custom TitleBar */ - private void OnLoaded(object sender, RoutedEventArgs e) + private void OnMinimizeButtonClick(object sender, RoutedEventArgs e) + { + WindowState = WindowState.Minimized; + } + + private void OnMaximizeRestoreButtonClick(object sender, RoutedEventArgs e) + { + WindowState = WindowState switch { - RefreshMaximizeRestoreButton(); - // Fix (workaround) for the window freezes after lock screen (Win+L) - // https://stackoverflow.com/questions/4951058/software-rendering-mode-wpf - HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource; - HwndTarget hwndTarget = hwndSource.CompositionTarget; - hwndTarget.RenderMode = RenderMode.SoftwareOnly; + WindowState.Maximized => WindowState.Normal, + _ => WindowState.Maximized + }; + } - pluginListView = (CollectionView)CollectionViewSource.GetDefaultView(Plugins.ItemsSource); - pluginListView.Filter = PluginListFilter; + private void OnCloseButtonClick(object sender, RoutedEventArgs e) + { + Close(); + } - pluginStoreView = (CollectionView)CollectionViewSource.GetDefaultView(StoreListBox.ItemsSource); - pluginStoreView.Filter = PluginStoreFilter; - - viewModel.PropertyChanged += new PropertyChangedEventHandler(SettingsWindowViewModelChanged); - - InitializePosition(); - } - - private void SettingsWindowViewModelChanged(object sender, PropertyChangedEventArgs e) + private void RefreshMaximizeRestoreButton() + { + if (WindowState == WindowState.Maximized) { - if (e.PropertyName == nameof(viewModel.ExternalPlugins)) - { - pluginStoreView = (CollectionView)CollectionViewSource.GetDefaultView(StoreListBox.ItemsSource); - pluginStoreView.Filter = PluginStoreFilter; - pluginStoreView.Refresh(); - } + MaximizeButton.Visibility = Visibility.Collapsed; + RestoreButton.Visibility = Visibility.Visible; } - - private void OnSelectPythonPathClick(object sender, RoutedEventArgs e) + else { - var selectedFile = viewModel.GetFileFromDialog( - InternationalizationManager.Instance.GetTranslation("selectPythonExecutable"), - "Python|pythonw.exe"); - - if (!string.IsNullOrEmpty(selectedFile)) - settings.PluginSettings.PythonExecutablePath = selectedFile; - } - - private void OnSelectNodePathClick(object sender, RoutedEventArgs e) - { - var selectedFile = viewModel.GetFileFromDialog( - InternationalizationManager.Instance.GetTranslation("selectNodeExecutable")); - - if (!string.IsNullOrEmpty(selectedFile)) - settings.PluginSettings.NodeExecutablePath = selectedFile; - } - - private void OnSelectFileManagerClick(object sender, RoutedEventArgs e) - { - SelectFileManagerWindow fileManagerChangeWindow = new SelectFileManagerWindow(settings); - fileManagerChangeWindow.ShowDialog(); - } - - private void OnSelectDefaultBrowserClick(object sender, RoutedEventArgs e) - { - var browserWindow = new SelectBrowserWindow(settings); - browserWindow.ShowDialog(); - } - - #endregion - - #region Hotkey - - private void OnToggleHotkey(object sender, HotkeyEventArgs e) - { - HotKeyMapper.OnToggleHotkey(sender, e); - } - - private void OnDeleteCustomHotkeyClick(object sender, RoutedEventArgs e) - { - var item = viewModel.SelectedCustomPluginHotkey; - if (item == null) - { - MessageBox.Show(InternationalizationManager.Instance.GetTranslation("pleaseSelectAnItem")); - return; - } - - string deleteWarning = - string.Format(InternationalizationManager.Instance.GetTranslation("deleteCustomHotkeyWarning"), - item.Hotkey); - if ( - MessageBox.Show(deleteWarning, InternationalizationManager.Instance.GetTranslation("delete"), - MessageBoxButton.YesNo) == MessageBoxResult.Yes) - { - settings.CustomPluginHotkeys.Remove(item); - HotKeyMapper.RemoveHotkey(item.Hotkey); - } - } - - private void OnEditCustomHotkeyClick(object sender, RoutedEventArgs e) - { - var item = viewModel.SelectedCustomPluginHotkey; - if (item != null) - { - CustomQueryHotkeySetting window = new CustomQueryHotkeySetting(this, settings); - window.UpdateItem(item); - window.ShowDialog(); - } - else - { - MessageBox.Show(InternationalizationManager.Instance.GetTranslation("pleaseSelectAnItem")); - } - } - - private void OnAddCustomHotkeyClick(object sender, RoutedEventArgs e) - { - new CustomQueryHotkeySetting(this, settings).ShowDialog(); - } - - #endregion - - #region Plugin - - private void OnPluginToggled(object sender, RoutedEventArgs e) - { - var id = viewModel.SelectedPlugin.PluginPair.Metadata.ID; - // used to sync the current status from the plugin manager into the setting to keep consistency after save - settings.PluginSettings.Plugins[id].Disabled = viewModel.SelectedPlugin.PluginPair.Metadata.Disabled; - } - - private void OnPluginPriorityClick(object sender, RoutedEventArgs e) - { - if (sender is Control { DataContext: PluginViewModel pluginViewModel }) - { - PriorityChangeWindow priorityChangeWindow = new PriorityChangeWindow(pluginViewModel.PluginPair.Metadata.ID, pluginViewModel); - priorityChangeWindow.ShowDialog(); - } - } - - #endregion - - #region Proxy - - private void OnTestProxyClick(object sender, RoutedEventArgs e) - { // TODO: change to command - var msg = viewModel.TestProxy(); - MessageBox.Show(msg); // TODO: add message box service - } - - #endregion - - private void OnCheckUpdates(object sender, RoutedEventArgs e) - { - viewModel.UpdateApp(); // TODO: change to command - } - - private void OnRequestNavigate(object sender, RequestNavigateEventArgs e) - { - API.OpenUrl(e.Uri.AbsoluteUri); - e.Handled = true; - } - - private void OnClosed(object sender, EventArgs e) - { - settings.SettingWindowState = WindowState; - settings.SettingWindowTop = Top; - settings.SettingWindowLeft = Left; - viewModel.Save(); - API.SavePluginSettings(); - } - - private void OnCloseExecuted(object sender, ExecutedRoutedEventArgs e) - { - Close(); - } - - private void OpenThemeFolder(object sender, RoutedEventArgs e) - { - PluginManager.API.OpenDirectory(Path.Combine(DataLocation.DataDirectory(), Constant.Themes)); - } - - private void OpenSettingFolder(object sender, RoutedEventArgs e) - { - PluginManager.API.OpenDirectory(Path.Combine(DataLocation.DataDirectory(), Constant.Settings)); - } - - private void OpenWelcomeWindow(object sender, RoutedEventArgs e) - { - var WelcomeWindow = new WelcomeWindow(settings); - WelcomeWindow.ShowDialog(); - } - private void OpenLogFolder(object sender, RoutedEventArgs e) - { - viewModel.OpenLogFolder(); - } - private void ClearLogFolder(object sender, RoutedEventArgs e) - { - var confirmResult = MessageBox.Show( - InternationalizationManager.Instance.GetTranslation("clearlogfolderMessage"), - InternationalizationManager.Instance.GetTranslation("clearlogfolder"), - MessageBoxButton.YesNo); - - if (confirmResult == MessageBoxResult.Yes) - { - viewModel.ClearLogFolder(); - } - } - - private void OnExternalPluginInstallClick(object sender, RoutedEventArgs e) - { - if (sender is not Button { DataContext: PluginStoreItemViewModel plugin } button) - { - return; - } - - if (storeClickedButton != null) - { - FlyoutService.GetFlyout(storeClickedButton).Hide(); - } - - viewModel.DisplayPluginQuery($"install {plugin.Name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7")); - } - - private void OnExternalPluginUninstallClick(object sender, MouseButtonEventArgs e) - { - if (e.ChangedButton == MouseButton.Left) - { - var name = viewModel.SelectedPlugin.PluginPair.Metadata.Name; - viewModel.DisplayPluginQuery($"uninstall {name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7")); - } - } - - private void OnExternalPluginUninstallClick(object sender, RoutedEventArgs e) - { - if (storeClickedButton != null) - { - FlyoutService.GetFlyout(storeClickedButton).Hide(); - } - - if (sender is Button { DataContext: PluginStoreItemViewModel plugin }) - viewModel.DisplayPluginQuery($"uninstall {plugin.Name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7")); - - } - - private void OnExternalPluginUpdateClick(object sender, RoutedEventArgs e) - { - if (storeClickedButton != null) - { - FlyoutService.GetFlyout(storeClickedButton).Hide(); - } - if (sender is Button { DataContext: PluginStoreItemViewModel plugin }) - viewModel.DisplayPluginQuery($"update {plugin.Name}", PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7")); - - } - - private void window_MouseDown(object sender, MouseButtonEventArgs e) /* for close hotkey popup */ - { - if (Keyboard.FocusedElement is not TextBox textBox) - { - return; - } - var tRequest = new TraversalRequest(FocusNavigationDirection.Next); - textBox.MoveFocus(tRequest); - } - - private void ColorSchemeSelectedIndexChanged(object sender, EventArgs e) - => ThemeManager.Current.ApplicationTheme = settings.ColorScheme switch - { - Constant.Light => ApplicationTheme.Light, - Constant.Dark => ApplicationTheme.Dark, - Constant.System => null, - _ => ThemeManager.Current.ApplicationTheme - }; - - /* Custom TitleBar */ - - private void OnMinimizeButtonClick(object sender, RoutedEventArgs e) - { - WindowState = WindowState.Minimized; - } - - private void OnMaximizeRestoreButtonClick(object sender, RoutedEventArgs e) - { - WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized; - } - - private void OnCloseButtonClick(object sender, RoutedEventArgs e) - { - - Close(); - } - - private void RefreshMaximizeRestoreButton() - { - if (WindowState == WindowState.Maximized) - { - maximizeButton.Visibility = Visibility.Collapsed; - restoreButton.Visibility = Visibility.Visible; - } - else - { - maximizeButton.Visibility = Visibility.Visible; - restoreButton.Visibility = Visibility.Collapsed; - } - } - - private void Window_StateChanged(object sender, EventArgs e) - { - RefreshMaximizeRestoreButton(); - } - - #region Shortcut - - private void OnDeleteCustomShortCutClick(object sender, RoutedEventArgs e) - { - viewModel.DeleteSelectedCustomShortcut(); - } - - private void OnEditCustomShortCutClick(object sender, RoutedEventArgs e) - { - if (viewModel.EditSelectedCustomShortcut()) - { - //customShortcutView.Items.Refresh(); Should Fix - } - } - - private void OnAddCustomShortCutClick(object sender, RoutedEventArgs e) - { - viewModel.AddCustomShortcut(); - } - - #endregion - - private CollectionView pluginListView; - private CollectionView pluginStoreView; - - private bool PluginListFilter(object item) - { - if (string.IsNullOrEmpty(pluginFilterTxb.Text)) - return true; - if (item is PluginViewModel model) - { - return StringMatcher.FuzzySearch(pluginFilterTxb.Text, model.PluginPair.Metadata.Name).IsSearchPrecisionScoreMet(); - } - return false; - } - - private bool PluginStoreFilter(object item) - { - if (string.IsNullOrEmpty(pluginStoreFilterTxb.Text)) - return true; - if (item is PluginStoreItemViewModel model) - { - return StringMatcher.FuzzySearch(pluginStoreFilterTxb.Text, model.Name).IsSearchPrecisionScoreMet() - || StringMatcher.FuzzySearch(pluginStoreFilterTxb.Text, model.Description).IsSearchPrecisionScoreMet(); - } - return false; - } - - private string lastPluginListSearch = ""; - private string lastPluginStoreSearch = ""; - - private void RefreshPluginListEventHandler(object sender, RoutedEventArgs e) - { - if (pluginFilterTxb.Text != lastPluginListSearch) - { - lastPluginListSearch = pluginFilterTxb.Text; - pluginListView.Refresh(); - } - } - - private void RefreshPluginStoreEventHandler(object sender, RoutedEventArgs e) - { - if (pluginStoreFilterTxb.Text != lastPluginStoreSearch) - { - lastPluginStoreSearch = pluginStoreFilterTxb.Text; - pluginStoreView.Refresh(); - } - } - - private void PluginFilterTxb_OnKeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.Enter) - RefreshPluginListEventHandler(sender, e); - } - - private void PluginStoreFilterTxb_OnKeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.Enter) - RefreshPluginStoreEventHandler(sender, e); - } - - private void OnPluginSettingKeydown(object sender, KeyEventArgs e) - { - if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control && e.Key == Key.F) - pluginFilterTxb.Focus(); - } - - private void PluginStore_OnKeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.F && (Keyboard.Modifiers & ModifierKeys.Control) != 0) - { - pluginStoreFilterTxb.Focus(); - } - } - - public void InitializePosition() - { - if (settings.SettingWindowTop >= 0 && settings.SettingWindowLeft >= 0) - { - Top = settings.SettingWindowTop; - Left = settings.SettingWindowLeft; - } - else - { - Top = WindowTop(); - Left = WindowLeft(); - } - WindowState = settings.SettingWindowState; - } - - public double WindowLeft() - { - var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); - var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0); - var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0); - var left = (dip2.X - this.ActualWidth) / 2 + dip1.X; - return left; - } - - public double WindowTop() - { - var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); - var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y); - var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height); - var top = (dip2.Y - this.ActualHeight) / 2 + dip1.Y - 20; - return top; - } - - private Button storeClickedButton; - - private void StoreListItem_Click(object sender, RoutedEventArgs e) - { - if (sender is not Button button) - return; - - storeClickedButton = button; - - var flyout = FlyoutService.GetFlyout(button); - flyout.Closed += (_, _) => - { - storeClickedButton = null; - }; - - } - - private void PluginStore_GotFocus(object sender, RoutedEventArgs e) - { - Keyboard.Focus(pluginStoreFilterTxb); - } - - private void Plugin_GotFocus(object sender, RoutedEventArgs e) - { - Keyboard.Focus(pluginFilterTxb); + MaximizeButton.Visibility = Visibility.Visible; + RestoreButton.Visibility = Visibility.Collapsed; } } + + private void Window_StateChanged(object sender, EventArgs e) + { + RefreshMaximizeRestoreButton(); + } + + public void InitializePosition() + { + if (_settings.SettingWindowTop == null) + { + Top = WindowTop(); + Left = WindowLeft(); + } + else + { + Top = _settings.SettingWindowTop; + Left = _settings.SettingWindowLeft; + } + WindowState = _settings.SettingWindowState; + } + + private double WindowLeft() + { + var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); + var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0); + var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0); + var left = (dip2.X - this.ActualWidth) / 2 + dip1.X; + return left; + } + + private double WindowTop() + { + var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position); + var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y); + var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height); + var top = (dip2.Y - this.ActualHeight) / 2 + dip1.Y - 20; + return top; + } + + private void NavigationView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args) + { + var paneData = new PaneData(_settings, _viewModel.Updater, _viewModel.Portable); + if (args.IsSettingsSelected) + { + ContentFrame.Navigate(typeof(SettingsPaneGeneral), paneData); + } + else + { + var selectedItem = (NavigationViewItem)args.SelectedItem; + if (selectedItem == null) return; + + var pageType = selectedItem.Name switch + { + nameof(General) => typeof(SettingsPaneGeneral), + nameof(Plugins) => typeof(SettingsPanePlugins), + nameof(PluginStore) => typeof(SettingsPanePluginStore), + nameof(Theme) => typeof(SettingsPaneTheme), + nameof(Hotkey) => typeof(SettingsPaneHotkey), + nameof(Proxy) => typeof(SettingsPaneProxy), + nameof(About) => typeof(SettingsPaneAbout), + _ => typeof(SettingsPaneGeneral) + }; + ContentFrame.Navigate(pageType, paneData); + } + } + + public record PaneData(Settings Settings, Updater Updater, IPortable Portable); } diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 67efc6a86..dcca3fb1a 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -19,8 +19,6 @@ using Microsoft.VisualStudio.Threading; using System.Text; using System.Threading.Channels; using ISavable = Flow.Launcher.Plugin.ISavable; -using System.IO; -using System.Collections.Specialized; using CommunityToolkit.Mvvm.Input; using System.Globalization; using System.Windows.Input; @@ -42,6 +40,7 @@ namespace Flow.Launcher.ViewModel private readonly FlowLauncherJsonStorage _userSelectedRecordStorage; private readonly FlowLauncherJsonStorage _topMostRecordStorage; private readonly History _history; + private int lastHistoryIndex = 1; private readonly UserSelectedRecord _userSelectedRecord; private readonly TopMostRecord _topMostRecord; @@ -71,6 +70,21 @@ namespace Flow.Launcher.ViewModel case nameof(Settings.WindowSize): OnPropertyChanged(nameof(MainWindowWidth)); break; + case nameof(Settings.WindowHeightSize): + OnPropertyChanged(nameof(MainWindowHeight)); + break; + case nameof(Settings.QueryBoxFontSize): + OnPropertyChanged(nameof(QueryBoxFontSize)); + break; + case nameof(Settings.ItemHeightSize): + OnPropertyChanged(nameof(ItemHeightSize)); + break; + case nameof(Settings.ResultItemFontSize): + OnPropertyChanged(nameof(ResultItemFontSize)); + break; + case nameof(Settings.ResultSubItemFontSize): + OnPropertyChanged(nameof(ResultSubItemFontSize)); + break; case nameof(Settings.AlwaysStartEn): OnPropertyChanged(nameof(StartWithEnglishMode)); break; @@ -83,6 +97,12 @@ namespace Flow.Launcher.ViewModel case nameof(Settings.AutoCompleteHotkey): OnPropertyChanged(nameof(AutoCompleteHotkey)); break; + case nameof(Settings.CycleHistoryUpHotkey): + OnPropertyChanged(nameof(CycleHistoryUpHotkey)); + break; + case nameof(Settings.CycleHistoryDownHotkey): + OnPropertyChanged(nameof(CycleHistoryDownHotkey)); + break; case nameof(Settings.AutoCompleteHotkey2): OnPropertyChanged(nameof(AutoCompleteHotkey2)); break; @@ -256,6 +276,32 @@ namespace Flow.Launcher.ViewModel } } + [RelayCommand] + public void ReverseHistory() + { + if (_history.Items.Count > 0) + { + ChangeQueryText(_history.Items[_history.Items.Count - lastHistoryIndex].Query.ToString()); + if (lastHistoryIndex < _history.Items.Count) + { + lastHistoryIndex++; + } + } + } + + [RelayCommand] + public void ForwardHistory() + { + if (_history.Items.Count > 0) + { + ChangeQueryText(_history.Items[_history.Items.Count - lastHistoryIndex].Query.ToString()); + if (lastHistoryIndex > 1) + { + lastHistoryIndex--; + } + } + } + [RelayCommand] private void LoadContextMenu() { @@ -346,6 +392,7 @@ namespace Flow.Launcher.ViewModel { _userSelectedRecord.Add(result); _history.Add(result.OriginQuery.RawQuery); + lastHistoryIndex = 1; } if (hideWindow) @@ -394,7 +441,18 @@ namespace Flow.Launcher.ViewModel [RelayCommand] private void SelectPrevItem() { - SelectedResults.SelectPrevResult(); + if (_history.Items.Count > 0 + && QueryText == string.Empty + && SelectedIsFromQueryResults()) + { + lastHistoryIndex = 1; + ReverseHistory(); + } + else + { + SelectedResults.SelectPrevResult(); + } + } [RelayCommand] @@ -421,7 +479,7 @@ namespace Flow.Launcher.ViewModel { GameModeStatus = !GameModeStatus; } - + [RelayCommand] public void CopyAlternative() { @@ -440,7 +498,6 @@ namespace Flow.Launcher.ViewModel public Settings Settings { get; } public string ClockText { get; private set; } public string DateText { get; private set; } - public CultureInfo Culture => CultureInfo.DefaultThreadCurrentCulture; private async Task RegisterClockAndDateUpdateAsync() { @@ -449,9 +506,9 @@ namespace Flow.Launcher.ViewModel while (await timer.WaitForNextTickAsync().ConfigureAwait(false)) { if (Settings.UseClock) - ClockText = DateTime.Now.ToString(Settings.TimeFormat, Culture); + ClockText = DateTime.Now.ToString(Settings.TimeFormat, CultureInfo.CurrentCulture); if (Settings.UseDate) - DateText = DateTime.Now.ToString(Settings.DateFormat, Culture); + DateText = DateTime.Now.ToString(Settings.DateFormat, CultureInfo.CurrentCulture); } } @@ -479,17 +536,9 @@ namespace Flow.Launcher.ViewModel [RelayCommand] private void IncreaseWidth() { - if (MainWindowWidth + 100 > 1920 || Settings.WindowSize == 1920) - { - Settings.WindowSize = 1920; - } - else - { - Settings.WindowSize += 100; - Settings.WindowLeft -= 50; - } - - OnPropertyChanged(); + Settings.WindowSize += 100; + Settings.WindowLeft -= 50; + OnPropertyChanged(nameof(MainWindowWidth)); } [RelayCommand] @@ -505,7 +554,7 @@ namespace Flow.Launcher.ViewModel Settings.WindowSize -= 100; } - OnPropertyChanged(); + OnPropertyChanged(nameof(MainWindowWidth)); } [RelayCommand] @@ -657,7 +706,41 @@ namespace Flow.Launcher.ViewModel public double MainWindowWidth { get => Settings.WindowSize; - set => Settings.WindowSize = value; + set + { + if (!MainWindowVisibilityStatus) return; + Settings.WindowSize = value; + } + } + + public double MainWindowHeight + { + get => Settings.WindowHeightSize; + set => Settings.WindowHeightSize = value; + } + + public double QueryBoxFontSize + { + get => Settings.QueryBoxFontSize; + set => Settings.QueryBoxFontSize = value; + } + + public double ItemHeightSize + { + get => Settings.ItemHeightSize; + set => Settings.ItemHeightSize = value; + } + + public double ResultItemFontSize + { + get => Settings.ResultItemFontSize; + set => Settings.ResultItemFontSize = value; + } + + public double ResultSubItemFontSize + { + get => Settings.ResultSubItemFontSize; + set => Settings.ResultSubItemFontSize = value; } public string PluginIconPath { get; set; } = null; @@ -678,7 +761,7 @@ namespace Flow.Launcher.ViewModel return hotkey; } - + public string PreviewHotkey => VerifyOrSetDefaultHotkey(Settings.PreviewHotkey, "F1"); public string AutoCompleteHotkey => VerifyOrSetDefaultHotkey(Settings.AutoCompleteHotkey, "Ctrl+Tab"); public string AutoCompleteHotkey2 => VerifyOrSetDefaultHotkey(Settings.AutoCompleteHotkey2, ""); @@ -690,6 +773,8 @@ namespace Flow.Launcher.ViewModel public string SelectPrevPageHotkey => VerifyOrSetDefaultHotkey(Settings.SelectPrevPageHotkey, ""); public string OpenContextMenuHotkey => VerifyOrSetDefaultHotkey(Settings.OpenContextMenuHotkey, "Ctrl+O"); public string SettingWindowHotkey => VerifyOrSetDefaultHotkey(Settings.SettingWindowHotkey, "Ctrl+I"); + public string CycleHistoryUpHotkey => VerifyOrSetDefaultHotkey(Settings.CycleHistoryUpHotkey, "Alt+Up"); + public string CycleHistoryDownHotkey => VerifyOrSetDefaultHotkey(Settings.CycleHistoryDownHotkey, "Alt+Down"); public string Image => Constant.QueryTextBoxIconImagePath; @@ -1116,6 +1201,7 @@ namespace Flow.Launcher.ViewModel public async void Hide() { + lastHistoryIndex = 1; // Trick for no delay MainWindowOpacity = 0; lastContextMenuResult = new Result(); diff --git a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs index bc98efabc..513d0443f 100644 --- a/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs +++ b/Flow.Launcher/ViewModel/PluginStoreItemViewModel.cs @@ -1,12 +1,15 @@ using System; +using System.Linq; +using CommunityToolkit.Mvvm.Input; using Flow.Launcher.Core.ExternalPlugins; using Flow.Launcher.Core.Plugin; using Flow.Launcher.Plugin; namespace Flow.Launcher.ViewModel { - public class PluginStoreItemViewModel : BaseModel + public partial class PluginStoreItemViewModel : BaseModel { + private PluginPair PluginManagerData => PluginManager.GetPluginForId("9f8f9b14-2518-4907-b211-35ab6290dee7"); public PluginStoreItemViewModel(UserPlugin plugin) { _plugin = plugin; @@ -26,19 +29,13 @@ namespace Flow.Launcher.ViewModel public string IcoPath => _plugin.IcoPath; public bool LabelInstalled => PluginManager.GetPluginForId(_plugin.ID) != null; - public bool LabelUpdate => LabelInstalled && VersionConvertor(_plugin.Version) > VersionConvertor(PluginManager.GetPluginForId(_plugin.ID).Metadata.Version); + public bool LabelUpdate => LabelInstalled && new Version(_plugin.Version) > new Version(PluginManager.GetPluginForId(_plugin.ID).Metadata.Version); internal const string None = "None"; internal const string RecentlyUpdated = "RecentlyUpdated"; internal const string NewRelease = "NewRelease"; internal const string Installed = "Installed"; - public Version VersionConvertor(string version) - { - Version ResultVersion = new Version(version); - return ResultVersion; - } - public string Category { get @@ -60,5 +57,13 @@ namespace Flow.Launcher.ViewModel return category; } } + + [RelayCommand] + private void ShowCommandQuery(string action) + { + var actionKeyword = PluginManagerData.Metadata.ActionKeywords.Any() ? PluginManagerData.Metadata.ActionKeywords[0] + " " : String.Empty; + App.API.ChangeQuery($"{actionKeyword}{action} {_plugin.Name}"); + App.API.ShowMainWindow(); + } } } diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs index d2919507d..b4daa8c7a 100644 --- a/Flow.Launcher/ViewModel/PluginViewModel.cs +++ b/Flow.Launcher/ViewModel/PluginViewModel.cs @@ -1,4 +1,5 @@ -using System.Windows; +using System.Linq; +using System.Windows; using System.Windows.Media; using Flow.Launcher.Plugin; using Flow.Launcher.Infrastructure.Image; @@ -26,6 +27,21 @@ namespace Flow.Launcher.ViewModel } } + private 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 void LoadIconAsync() { @@ -46,7 +62,11 @@ namespace Flow.Launcher.ViewModel public bool PluginState { get => !PluginPair.Metadata.Disabled; - set => PluginPair.Metadata.Disabled = !value; + set + { + PluginPair.Metadata.Disabled = !value; + PluginSettingsObject.Disabled = !value; + } } public bool IsExpanded { @@ -62,11 +82,13 @@ namespace Flow.Launcher.ViewModel private Control _settingControl; private bool _isExpanded; + + public bool HasSettingControl => PluginPair.Plugin is ISettingProvider; public Control SettingControl => IsExpanded ? _settingControl ??= PluginPair.Plugin is not ISettingProvider settingProvider - ? new Control() + ? null : settingProvider.CreateSettingPanel() : null; private ImageSource _image = ImageLoader.MissingImage; @@ -78,6 +100,7 @@ namespace Flow.Launcher.ViewModel public string InitAndQueryTime => InternationalizationManager.Instance.GetTranslation("plugin_init_time") + " " + PluginPair.Metadata.InitTime + "ms, " + InternationalizationManager.Instance.GetTranslation("plugin_query_time") + " " + PluginPair.Metadata.AvgQueryTime + "ms"; public string ActionKeywordsText => string.Join(Query.ActionKeywordSeparator, PluginPair.Metadata.ActionKeywords); public int Priority => PluginPair.Metadata.Priority; + public Infrastructure.UserSettings.Plugin PluginSettingsObject { get; set; } public void ChangeActionKeyword(string newActionKeyword, string oldActionKeyword) { @@ -88,13 +111,14 @@ namespace Flow.Launcher.ViewModel public void ChangePriority(int newPriority) { PluginPair.Metadata.Priority = newPriority; + PluginSettingsObject.Priority = newPriority; OnPropertyChanged(nameof(Priority)); } [RelayCommand] private void EditPluginPriority() { - PriorityChangeWindow priorityChangeWindow = new PriorityChangeWindow(PluginPair.Metadata.ID, this); + PriorityChangeWindow priorityChangeWindow = new PriorityChangeWindow(PluginPair. Metadata.ID, this); priorityChangeWindow.ShowDialog(); } @@ -106,6 +130,19 @@ namespace Flow.Launcher.ViewModel PluginManager.API.OpenDirectory(directory); } + [RelayCommand] + private void OpenSourceCodeLink() + { + PluginManager.API.OpenUrl(PluginPair.Metadata.Website); + } + + [RelayCommand] + private void OpenDeletePluginWindow() + { + PluginManager.API.ChangeQuery($"{PluginManagerActionKeyword} uninstall {PluginPair.Metadata.Name}".Trim(), true); + PluginManager.API.ShowMainWindow(); + } + public static bool IsActionKeywordRegistered(string newActionKeyword) => PluginManager.ActionKeywordRegistered(newActionKeyword); [RelayCommand] diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs index 3f204c16c..5130e7eba 100644 --- a/Flow.Launcher/ViewModel/ResultViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultViewModel.cs @@ -29,7 +29,7 @@ namespace Flow.Launcher.ViewModel if (Result.Glyph is { FontFamily: not null } glyph) { - // Checks if it's a system installed font, which does not require path to be provided. + // Checks if it's a system installed font, which does not require path to be provided. if (glyph.FontFamily.EndsWith(".ttf") || glyph.FontFamily.EndsWith(".otf")) { string fontFamilyPath = glyph.FontFamily; @@ -64,7 +64,7 @@ namespace Flow.Launcher.ViewModel } - private Settings Settings { get; } + public Settings Settings { get; } public Visibility ShowOpenResultHotkey => Settings.ShowOpenResultHotkey ? Visibility.Visible : Visibility.Collapsed; diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs index db85b1ad2..68e59009f 100644 --- a/Flow.Launcher/ViewModel/ResultsViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs @@ -32,9 +32,15 @@ namespace Flow.Launcher.ViewModel _settings = settings; _settings.PropertyChanged += (s, e) => { - if (e.PropertyName == nameof(_settings.MaxResultsToShow)) + switch (e.PropertyName) { - OnPropertyChanged(nameof(MaxHeight)); + case nameof(_settings.MaxResultsToShow): + OnPropertyChanged(nameof(MaxHeight)); + break; + case nameof(_settings.ItemHeightSize): + OnPropertyChanged(nameof(ItemHeightSize)); + OnPropertyChanged(nameof(MaxHeight)); + break; } }; } @@ -43,14 +49,19 @@ namespace Flow.Launcher.ViewModel #region Properties - public double MaxHeight => MaxResults * (double)Application.Current.FindResource("ResultItemHeight")!; + public double MaxHeight => MaxResults * _settings.ItemHeightSize; + public double ItemHeightSize + { + get => _settings.ItemHeightSize; + set => _settings.ItemHeightSize = value; + } public int SelectedIndex { get; set; } public ResultViewModel SelectedItem { get; set; } public Thickness Margin { get; set; } public Visibility Visibility { get; set; } = Visibility.Collapsed; - + public ICommand RightClickResultCommand { get; init; } public ICommand LeftClickResultCommand { get; init; } diff --git a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs index fe1ea4e7b..481802045 100644 --- a/Flow.Launcher/ViewModel/SettingWindowViewModel.cs +++ b/Flow.Launcher/ViewModel/SettingWindowViewModel.cs @@ -1,1006 +1,66 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using Flow.Launcher.Core; +using Flow.Launcher.Core; using Flow.Launcher.Core.Configuration; -using Flow.Launcher.Core.ExternalPlugins; -using Flow.Launcher.Core.Plugin; -using Flow.Launcher.Core.Resource; -using Flow.Launcher.Helper; -using Flow.Launcher.Infrastructure; using Flow.Launcher.Infrastructure.Storage; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin; -using Flow.Launcher.Plugin.SharedModels; -using System.Collections.ObjectModel; -using CommunityToolkit.Mvvm.Input; -using System.Globalization; -using System.Runtime.CompilerServices; -using Flow.Launcher.Infrastructure.Hotkey; -namespace Flow.Launcher.ViewModel +namespace Flow.Launcher.ViewModel; + +public class SettingWindowViewModel : BaseModel { - public partial class SettingWindowViewModel : BaseModel + private readonly FlowLauncherJsonStorage _storage; + + public Updater Updater { get; } + + public IPortable Portable { get; } + + public Settings Settings { get; } + + public SettingWindowViewModel(Updater updater, IPortable portable) { - private readonly Updater _updater; - private readonly IPortable _portable; - private readonly FlowLauncherJsonStorage _storage; - - public SettingWindowViewModel(Updater updater, IPortable portable) - { - _updater = updater; - _portable = portable; - _storage = new FlowLauncherJsonStorage(); - Settings = _storage.Load(); - Settings.PropertyChanged += (s, e) => - { - switch (e.PropertyName) - { - case nameof(Settings.ActivateTimes): - OnPropertyChanged(nameof(ActivatedTimes)); - break; - case nameof(Settings.WindowSize): - OnPropertyChanged(nameof(WindowWidthSize)); - break; - case nameof(Settings.UseDate): - case nameof(Settings.DateFormat): - OnPropertyChanged(nameof(DateText)); - break; - case nameof(Settings.UseClock): - case nameof(Settings.TimeFormat): - OnPropertyChanged(nameof(ClockText)); - break; - case nameof(Settings.Language): - OnPropertyChanged(nameof(ClockText)); - OnPropertyChanged(nameof(DateText)); - OnPropertyChanged(nameof(AlwaysPreviewToolTip)); - break; - case nameof(Settings.PreviewHotkey): - OnPropertyChanged(nameof(AlwaysPreviewToolTip)); - break; - case nameof(Settings.SoundVolume): - OnPropertyChanged(nameof(SoundEffectVolume)); - break; - } - }; - } - - [RelayCommand] - public void SetTogglingHotkey(HotkeyModel hotkey) - { - HotKeyMapper.SetHotkey(hotkey, HotKeyMapper.OnToggleHotkey); - } - - public Settings Settings { get; set; } - - public async void UpdateApp() - { - await _updater.UpdateAppAsync(App.API, false); - } - - public bool AutoUpdates - { - get => Settings.AutoUpdates; - set - { - Settings.AutoUpdates = value; - - if (value) - { - UpdateApp(); - } - } - } - - public CultureInfo Culture => CultureInfo.DefaultThreadCurrentCulture; - - public bool StartFlowLauncherOnSystemStartup - { - get => Settings.StartFlowLauncherOnSystemStartup; - set - { - Settings.StartFlowLauncherOnSystemStartup = value; - - try - { - if (value) - AutoStartup.Enable(); - else - AutoStartup.Disable(); - } - catch (Exception e) - { - Notification.Show(InternationalizationManager.Instance.GetTranslation("setAutoStartFailed"), - e.Message); - } - } - } - - // This is only required to set at startup. When portable mode enabled/disabled a restart is always required - private bool _portableMode = DataLocation.PortableDataLocationInUse(); - - public bool PortableMode - { - get => _portableMode; - set - { - if (!_portable.CanUpdatePortability()) - return; - - if (DataLocation.PortableDataLocationInUse()) - { - _portable.DisablePortableMode(); - } - else - { - _portable.EnablePortableMode(); - } - } - } - - /// - /// Save Flow settings. Plugins settings are not included. - /// - public void Save() - { - foreach (var vm in PluginViewModels) - { - var id = vm.PluginPair.Metadata.ID; - - Settings.PluginSettings.Plugins[id].Disabled = vm.PluginPair.Metadata.Disabled; - Settings.PluginSettings.Plugins[id].Priority = vm.Priority; - } - - _storage.Save(); - } - - public string GetFileFromDialog(string title, string filter = "") - { - var dlg = new System.Windows.Forms.OpenFileDialog - { - InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), - Multiselect = false, - CheckFileExists = true, - CheckPathExists = true, - Title = title, - Filter = filter - }; - - var result = dlg.ShowDialog(); - if (result == System.Windows.Forms.DialogResult.OK) - { - return dlg.FileName; - } - else - { - return string.Empty; - } - } - - #region general - - // todo a better name? - public class LastQueryMode : BaseModel - { - public string Display { get; set; } - public Infrastructure.UserSettings.LastQueryMode Value { get; set; } - } - - private List _lastQueryModes = new List(); - - public List LastQueryModes - { - get - { - if (_lastQueryModes.Count == 0) - { - _lastQueryModes = InitLastQueryModes(); - } - - return _lastQueryModes; - } - } - - private List InitLastQueryModes() - { - var modes = new List(); - var enums = (Infrastructure.UserSettings.LastQueryMode[])Enum.GetValues( - typeof(Infrastructure.UserSettings.LastQueryMode)); - foreach (var e in enums) - { - var key = $"LastQuery{e}"; - var display = _translater.GetTranslation(key); - var m = new LastQueryMode { Display = display, Value = e, }; - modes.Add(m); - } - - return modes; - } - - private void UpdateLastQueryModeDisplay() - { - foreach (var item in LastQueryModes) - { - item.Display = _translater.GetTranslation($"LastQuery{item.Value}"); - } - } - - public string Language - { - get - { - return Settings.Language; - } - set - { - InternationalizationManager.Instance.ChangeLanguage(value); - - if (InternationalizationManager.Instance.PromptShouldUsePinyin(value)) - ShouldUsePinyin = true; - - UpdateLastQueryModeDisplay(); - } - } - - public bool ShouldUsePinyin - { - get - { - return Settings.ShouldUsePinyin; - } - set - { - Settings.ShouldUsePinyin = value; - } - } - - public List QuerySearchPrecisionStrings - { - get - { - var precisionStrings = new List(); - - var enumList = Enum.GetValues(typeof(SearchPrecisionScore)).Cast().ToList(); - - enumList.ForEach(x => precisionStrings.Add(x.ToString())); - - return precisionStrings; - } - } - - public List OpenResultModifiersList => new List - { - KeyConstant.Alt, KeyConstant.Ctrl, $"{KeyConstant.Ctrl}+{KeyConstant.Alt}" - }; - - private Internationalization _translater => InternationalizationManager.Instance; - public List Languages => _translater.LoadAvailableLanguages(); - public IEnumerable MaxResultsRange => Enumerable.Range(2, 16); - - public string AlwaysPreviewToolTip => - string.Format(_translater.GetTranslation("AlwaysPreviewToolTip"), Settings.PreviewHotkey); - - public string TestProxy() - { - var proxyServer = Settings.Proxy.Server; - var proxyUserName = Settings.Proxy.UserName; - if (string.IsNullOrEmpty(proxyServer)) - { - return InternationalizationManager.Instance.GetTranslation("serverCantBeEmpty"); - } - - if (Settings.Proxy.Port <= 0) - { - return InternationalizationManager.Instance.GetTranslation("portCantBeEmpty"); - } - - HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_updater.GitHubRepository); - - if (string.IsNullOrEmpty(proxyUserName) || string.IsNullOrEmpty(Settings.Proxy.Password)) - { - request.Proxy = new WebProxy(proxyServer, Settings.Proxy.Port); - } - else - { - request.Proxy = new WebProxy(proxyServer, Settings.Proxy.Port) - { - Credentials = new NetworkCredential(proxyUserName, Settings.Proxy.Password) - }; - } - - try - { - var response = (HttpWebResponse)request.GetResponse(); - if (response.StatusCode == HttpStatusCode.OK) - { - return InternationalizationManager.Instance.GetTranslation("proxyIsCorrect"); - } - else - { - return InternationalizationManager.Instance.GetTranslation("proxyConnectFailed"); - } - } - catch - { - return InternationalizationManager.Instance.GetTranslation("proxyConnectFailed"); - } - } - - #endregion - - #region plugin - - public static string Plugin => @"https://github.com/Flow-Launcher/Flow.Launcher.PluginsManifest"; - public PluginViewModel SelectedPlugin { get; set; } - - public IList PluginViewModels - { - get => PluginManager.AllPlugins - .OrderBy(x => x.Metadata.Disabled) - .ThenBy(y => y.Metadata.Name) - .Select(p => new PluginViewModel { PluginPair = p }) - .ToList(); - } - - public IList ExternalPlugins - { - get - { - return LabelMaker(PluginsManifest.UserPlugins); - } - } - - private IList LabelMaker(IList list) - { - return list.Select(p => new PluginStoreItemViewModel(p)) - .OrderByDescending(p => p.Category == PluginStoreItemViewModel.NewRelease) - .ThenByDescending(p => p.Category == PluginStoreItemViewModel.RecentlyUpdated) - .ThenByDescending(p => p.Category == PluginStoreItemViewModel.None) - .ThenByDescending(p => p.Category == PluginStoreItemViewModel.Installed) - .ToList(); - } - - public Control SettingProvider - { - get - { - var settingProvider = SelectedPlugin.PluginPair.Plugin as ISettingProvider; - if (settingProvider != null) - { - var control = settingProvider.CreateSettingPanel(); - control.HorizontalAlignment = HorizontalAlignment.Stretch; - control.VerticalAlignment = VerticalAlignment.Stretch; - return control; - } - else - { - return new Control(); - } - } - } - - [RelayCommand] - private async Task RefreshExternalPluginsAsync() - { - await PluginsManifest.UpdateManifestAsync(); - OnPropertyChanged(nameof(ExternalPlugins)); - } - - - internal void DisplayPluginQuery(string queryToDisplay, PluginPair plugin, int actionKeywordPosition = 0) - { - var actionKeyword = plugin.Metadata.ActionKeywords.Count == 0 - ? string.Empty - : plugin.Metadata.ActionKeywords[actionKeywordPosition]; - - App.API.ChangeQuery($"{actionKeyword} {queryToDisplay}"); - App.API.ShowMainWindow(); - } - - #endregion - - #region theme - - public static string Theme => @"https://flowlauncher.com/docs/#/how-to-create-a-theme"; - public static string ThemeGallery => @"https://github.com/Flow-Launcher/Flow.Launcher/discussions/1438"; - - public string SelectedTheme - { - get { return Settings.Theme; } - set - { - ThemeManager.Instance.ChangeTheme(value); - - if (ThemeManager.Instance.BlurEnabled && Settings.UseDropShadowEffect) - DropShadowEffect = false; - } - } - - public List Themes - => ThemeManager.Instance.LoadAvailableThemes().Select(Path.GetFileNameWithoutExtension).ToList(); - - public bool DropShadowEffect - { - get { return Settings.UseDropShadowEffect; } - set - { - if (ThemeManager.Instance.BlurEnabled && value) - { - MessageBox.Show(InternationalizationManager.Instance.GetTranslation("shadowEffectNotAllowed")); - return; - } - - if (value) - { - ThemeManager.Instance.AddDropShadowEffectToCurrentTheme(); - } - else - { - ThemeManager.Instance.RemoveDropShadowEffectFromCurrentTheme(); - } - - Settings.UseDropShadowEffect = value; - } - } - - public class ColorScheme - { - public string Display { get; set; } - public ColorSchemes Value { get; set; } - } - - public List ColorSchemes - { - get - { - List modes = new List(); - var enums = (ColorSchemes[])Enum.GetValues(typeof(ColorSchemes)); - foreach (var e in enums) - { - var key = $"ColorScheme{e}"; - var display = _translater.GetTranslation(key); - var m = new ColorScheme { Display = display, Value = e, }; - modes.Add(m); - } - - return modes; - } - } - - public class SearchWindowScreen - { - public string Display { get; set; } - public SearchWindowScreens Value { get; set; } - } - - public List SearchWindowScreens - { - get - { - List modes = new List(); - var enums = (SearchWindowScreens[])Enum.GetValues(typeof(SearchWindowScreens)); - foreach (var e in enums) - { - var key = $"SearchWindowScreen{e}"; - var display = _translater.GetTranslation(key); - var m = new SearchWindowScreen { Display = display, Value = e, }; - modes.Add(m); - } - - return modes; - } - } - - public class SearchWindowAlign - { - public string Display { get; set; } - public SearchWindowAligns Value { get; set; } - } - - public List SearchWindowAligns - { - get - { - List modes = new List(); - var enums = (SearchWindowAligns[])Enum.GetValues(typeof(SearchWindowAligns)); - foreach (var e in enums) - { - var key = $"SearchWindowAlign{e}"; - var display = _translater.GetTranslation(key); - var m = new SearchWindowAlign { Display = display, Value = e, }; - modes.Add(m); - } - - return modes; - } - } - - public List ScreenNumbers - { - get - { - var screens = System.Windows.Forms.Screen.AllScreens; - var screenNumbers = new List(); - for (int i = 1; i <= screens.Length; i++) - { - screenNumbers.Add(i); - } - - return screenNumbers; - } - } - - public List TimeFormatList { get; } = new() - { - "h:mm", - "hh:mm", - "H:mm", - "HH:mm", - "tt h:mm", - "tt hh:mm", - "h:mm tt", - "hh:mm tt", - "hh:mm:ss tt", - "HH:mm:ss" - }; - - public List DateFormatList { get; } = new() - { - "MM'/'dd dddd", - "MM'/'dd ddd", - "MM'/'dd", - "MM'-'dd", - "MMMM', 'dd", - "dd'/'MM", - "dd'-'MM", - "ddd MM'/'dd", - "dddd MM'/'dd", - "dddd", - "ddd dd'/'MM", - "dddd dd'/'MM", - "dddd dd', 'MMMM", - "dd', 'MMMM" - }; - - public string TimeFormat - { - get => Settings.TimeFormat; - set => Settings.TimeFormat = value; - } - - public string DateFormat - { - get => Settings.DateFormat; - set => Settings.DateFormat = value; - } - - public string ClockText => DateTime.Now.ToString(TimeFormat, Culture); - - public string DateText => DateTime.Now.ToString(DateFormat, Culture); - - public double WindowWidthSize - { - get => Settings.WindowSize; - set => Settings.WindowSize = value; - } - - public bool UseGlyphIcons - { - get => Settings.UseGlyphIcons; - set => Settings.UseGlyphIcons = value; - } - - public bool UseAnimation - { - get => Settings.UseAnimation; - set => Settings.UseAnimation = value; - } - - public class AnimationSpeed - { - public string Display { get; set; } - public AnimationSpeeds Value { get; set; } - } - - public List AnimationSpeeds - { - get - { - List speeds = new List(); - var enums = (AnimationSpeeds[])Enum.GetValues(typeof(AnimationSpeeds)); - foreach (var e in enums) - { - var key = $"AnimationSpeed{e}"; - var display = _translater.GetTranslation(key); - var m = new AnimationSpeed { Display = display, Value = e, }; - speeds.Add(m); - } - - return speeds; - } - } - - public bool UseSound - { - get => Settings.UseSound; - set => Settings.UseSound = value; - } - - public double SoundEffectVolume - { - get => Settings.SoundVolume; - set => Settings.SoundVolume = value; - } - - public bool UseClock - { - get => Settings.UseClock; - set => Settings.UseClock = value; - } - - public bool UseDate - { - get => Settings.UseDate; - set => Settings.UseDate = value; - } - - public double SettingWindowWidth - { - get => Settings.SettingWindowWidth; - set => Settings.SettingWindowWidth = value; - } - - public double SettingWindowHeight - { - get => Settings.SettingWindowHeight; - set => Settings.SettingWindowHeight = value; - } - - public double SettingWindowTop - { - get => Settings.SettingWindowTop; - set => Settings.SettingWindowTop = value; - } - - public double SettingWindowLeft - { - get => Settings.SettingWindowLeft; - set => Settings.SettingWindowLeft = value; - } - - public Brush PreviewBackground - { - get - { - var wallpaper = WallpaperPathRetrieval.GetWallpaperPath(); - if (wallpaper != null && File.Exists(wallpaper)) - { - var memStream = new MemoryStream(File.ReadAllBytes(wallpaper)); - var bitmap = new BitmapImage(); - bitmap.BeginInit(); - bitmap.StreamSource = memStream; - bitmap.DecodePixelWidth = 800; - bitmap.DecodePixelHeight = 600; - bitmap.EndInit(); - var brush = new ImageBrush(bitmap) { Stretch = Stretch.UniformToFill }; - return brush; - } - else - { - var wallpaperColor = WallpaperPathRetrieval.GetWallpaperColor(); - var brush = new SolidColorBrush(wallpaperColor); - return brush; - } - } - } - - public ResultsViewModel PreviewResults - { - get - { - var results = new List - { - new Result - { - Title = InternationalizationManager.Instance.GetTranslation("SampleTitleExplorer"), - SubTitle = - InternationalizationManager.Instance.GetTranslation("SampleSubTitleExplorer"), - IcoPath = - Path.Combine(Constant.ProgramDirectory, - @"Plugins\Flow.Launcher.Plugin.Explorer\Images\explorer.png") - }, - new Result - { - Title = InternationalizationManager.Instance.GetTranslation("SampleTitleWebSearch"), - SubTitle = - InternationalizationManager.Instance.GetTranslation("SampleSubTitleWebSearch"), - IcoPath = - Path.Combine(Constant.ProgramDirectory, - @"Plugins\Flow.Launcher.Plugin.WebSearch\Images\web_search.png") - }, - new Result - { - Title = InternationalizationManager.Instance.GetTranslation("SampleTitleProgram"), - SubTitle = InternationalizationManager.Instance.GetTranslation("SampleSubTitleProgram"), - IcoPath = - Path.Combine(Constant.ProgramDirectory, - @"Plugins\Flow.Launcher.Plugin.Program\Images\program.png") - }, - new Result - { - Title = InternationalizationManager.Instance.GetTranslation("SampleTitleProcessKiller"), - SubTitle = - InternationalizationManager.Instance.GetTranslation("SampleSubTitleProcessKiller"), - IcoPath = Path.Combine(Constant.ProgramDirectory, - @"Plugins\Flow.Launcher.Plugin.ProcessKiller\Images\app.png") - } - }; - var vm = new ResultsViewModel(Settings); - vm.AddResults(results, "PREVIEW"); - return vm; - } - } - - public FontFamily SelectedQueryBoxFont - { - get - { - if (Fonts.SystemFontFamilies.Count(o => - o.FamilyNames.Values != null && - o.FamilyNames.Values.Contains(Settings.QueryBoxFont)) > 0) - { - var font = new FontFamily(Settings.QueryBoxFont); - return font; - } - else - { - var font = new FontFamily("Segoe UI"); - return font; - } - } - set - { - Settings.QueryBoxFont = value.ToString(); - ThemeManager.Instance.ChangeTheme(Settings.Theme); - } - } - - public FamilyTypeface SelectedQueryBoxFontFaces - { - get - { - var typeface = SyntaxSugars.CallOrRescueDefault( - () => SelectedQueryBoxFont.ConvertFromInvariantStringsOrNormal( - Settings.QueryBoxFontStyle, - Settings.QueryBoxFontWeight, - Settings.QueryBoxFontStretch - )); - return typeface; - } - set - { - Settings.QueryBoxFontStretch = value.Stretch.ToString(); - Settings.QueryBoxFontWeight = value.Weight.ToString(); - Settings.QueryBoxFontStyle = value.Style.ToString(); - ThemeManager.Instance.ChangeTheme(Settings.Theme); - } - } - - public FontFamily SelectedResultFont - { - get - { - if (Fonts.SystemFontFamilies.Count(o => - o.FamilyNames.Values != null && - o.FamilyNames.Values.Contains(Settings.ResultFont)) > 0) - { - var font = new FontFamily(Settings.ResultFont); - return font; - } - else - { - var font = new FontFamily("Segoe UI"); - return font; - } - } - set - { - Settings.ResultFont = value.ToString(); - ThemeManager.Instance.ChangeTheme(Settings.Theme); - } - } - - public FamilyTypeface SelectedResultFontFaces - { - get - { - var typeface = SyntaxSugars.CallOrRescueDefault( - () => SelectedResultFont.ConvertFromInvariantStringsOrNormal( - Settings.ResultFontStyle, - Settings.ResultFontWeight, - Settings.ResultFontStretch - )); - return typeface; - } - set - { - Settings.ResultFontStretch = value.Stretch.ToString(); - Settings.ResultFontWeight = value.Weight.ToString(); - Settings.ResultFontStyle = value.Style.ToString(); - ThemeManager.Instance.ChangeTheme(Settings.Theme); - } - } - - public string ThemeImage => Constant.QueryTextBoxIconImagePath; - - #endregion - - #region hotkey - - public CustomPluginHotkey SelectedCustomPluginHotkey { get; set; } - - #endregion - - #region shortcut - - public ObservableCollection CustomShortcuts => Settings.CustomShortcuts; - - public ObservableCollection BuiltinShortcuts => Settings.BuiltinShortcuts; - - public CustomShortcutModel? SelectedCustomShortcut { get; set; } - - public void DeleteSelectedCustomShortcut() - { - var item = SelectedCustomShortcut; - if (item == null) - { - MessageBox.Show(InternationalizationManager.Instance.GetTranslation("pleaseSelectAnItem")); - return; - } - - string deleteWarning = string.Format( - InternationalizationManager.Instance.GetTranslation("deleteCustomShortcutWarning"), - item.Key, item.Value); - if (MessageBox.Show(deleteWarning, InternationalizationManager.Instance.GetTranslation("delete"), - MessageBoxButton.YesNo) == MessageBoxResult.Yes) - { - Settings.CustomShortcuts.Remove(item); - } - } - - public bool EditSelectedCustomShortcut() - { - var item = SelectedCustomShortcut; - if (item == null) - { - MessageBox.Show(InternationalizationManager.Instance.GetTranslation("pleaseSelectAnItem")); - return false; - } - - var shortcutSettingWindow = new CustomShortcutSetting(item.Key, item.Value, this); - if (shortcutSettingWindow.ShowDialog() == true) - { - // Fix un-selectable shortcut item after the first selection - // https://stackoverflow.com/questions/16789360/wpf-listbox-items-with-changing-hashcode - SelectedCustomShortcut = null; - item.Key = shortcutSettingWindow.Key; - item.Value = shortcutSettingWindow.Value; - SelectedCustomShortcut = item; - return true; - } - - return false; - } - - public void AddCustomShortcut() - { - var shortcutSettingWindow = new CustomShortcutSetting(this); - if (shortcutSettingWindow.ShowDialog() == true) - { - var shortcut = new CustomShortcutModel(shortcutSettingWindow.Key, shortcutSettingWindow.Value); - Settings.CustomShortcuts.Add(shortcut); - } - } - - public bool ShortcutExists(string key) - { - return Settings.CustomShortcuts.Any(x => x.Key == key) || Settings.BuiltinShortcuts.Any(x => x.Key == key); - } - - #endregion - - #region about - - public string Website => Constant.Website; - public string SponsorPage => Constant.SponsorPage; - public string ReleaseNotes => _updater.GitHubRepository + @"/releases/latest"; - public string Documentation => Constant.Documentation; - public string Docs => Constant.Docs; - public string Github => Constant.GitHub; - - public string Version - { - get - { - if (Constant.Version == "1.0.0") - { - return Constant.Dev; - } - else - { - return Constant.Version; - } - } - } - - public string ActivatedTimes => - string.Format(_translater.GetTranslation("about_activate_times"), Settings.ActivateTimes); - - public string CheckLogFolder - { - get - { - var logFiles = GetLogFiles(); - long size = logFiles.Sum(file => file.Length); - return string.Format("{0} ({1})", _translater.GetTranslation("clearlogfolder"), - BytesToReadableString(size)); - } - } - - private static DirectoryInfo GetLogDir(string version = "") - { - return new DirectoryInfo(Path.Combine(DataLocation.DataDirectory(), Constant.Logs, version)); - } - - private static List GetLogFiles(string version = "") - { - return GetLogDir(version).EnumerateFiles("*", SearchOption.AllDirectories).ToList(); - } - - internal void ClearLogFolder() - { - var logDirectory = GetLogDir(); - var logFiles = GetLogFiles(); - - logFiles.ForEach(f => f.Delete()); - - logDirectory.EnumerateDirectories("*", SearchOption.TopDirectoryOnly) - .Where(dir => !Constant.Version.Equals(dir.Name)) - .ToList() - .ForEach(dir => dir.Delete()); - - OnPropertyChanged(nameof(CheckLogFolder)); - } - - internal void OpenLogFolder() - { - App.API.OpenDirectory(GetLogDir(Constant.Version).FullName); - } - - internal static string BytesToReadableString(long bytes) - { - const int scale = 1024; - string[] orders = new string[] { "GB", "MB", "KB", "B" }; - long max = (long)Math.Pow(scale, orders.Length - 1); - - foreach (string order in orders) - { - if (bytes > max) - return string.Format("{0:##.##} {1}", decimal.Divide(bytes, max), order); - - max /= scale; - } - - return "0 B"; - } - - #endregion + _storage = new FlowLauncherJsonStorage(); + + Updater = updater; + Portable = portable; + Settings = _storage.Load(); + } + + public async void UpdateApp() + { + await Updater.UpdateAppAsync(App.API, false); + } + + + + /// + /// Save Flow settings. Plugins settings are not included. + /// + public void Save() + { + _storage.Save(); + } + + public double SettingWindowWidth + { + get => Settings.SettingWindowWidth; + set => Settings.SettingWindowWidth = value; + } + + public double SettingWindowHeight + { + get => Settings.SettingWindowHeight; + set => Settings.SettingWindowHeight = value; + } + + public double SettingWindowTop + { + get => Settings.SettingWindowTop; + set => Settings.SettingWindowTop = value; + } + + public double SettingWindowLeft + { + get => Settings.SettingWindowLeft; + set => Settings.SettingWindowLeft = value; } } diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj index fe118c2c3..234afe28a 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj @@ -12,6 +12,7 @@ false false true + en @@ -35,6 +36,44 @@ false + + + + + + + + PreserveNewest @@ -59,4 +98,4 @@ - \ No newline at end of file + diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml new file mode 100644 index 000000000..ddc10950e --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/vi.xaml @@ -0,0 +1,28 @@ + + + + + Dấu trang trình duyệt + Tìm kiếm dấu trang trình duyệt của bạn + + + Dữ liệu đánh dấu + Mở dấu trang trong: + Cửa sổ mới + Thêm Tab mới + Đặt trình duyệt từ đường dẫn: + Chọn + Sao chép url + Sao chép url của dấu trang vào clipboard + Tải trình duyệt từ: + Tên trình duyệt + Đường dẫn thư mục dữ liệu + Thêm + Sửa + Xóa + Duyệt + Khác + Công cụ trình duyệt + Nếu bạn không sử dụng Chrome, Firefox hoặc Edge hoặc bạn đang sử dụng phiên bản di động của chúng, bạn cần thêm thư mục dữ liệu dấu trang và chọn đúng công cụ trình duyệt để plugin này hoạt động. + Ví dụ: Engine của Brave là Chrome; và vị trí dữ liệu dấu trang mặc định của nó là: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Đối với công cụ Firefox, thư mục dấu trang là thư mục dữ liệu người dùng chứa tệp địa điểm.sqlite. + diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs b/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs index 27bdf94ee..81a68739b 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs +++ b/Plugins/Flow.Launcher.Plugin.Calculator/DecimalSeparator.cs @@ -1,7 +1,7 @@ using System.ComponentModel; using Flow.Launcher.Core.Resource; -namespace Flow.Launcher.Plugin.Caculator +namespace Flow.Launcher.Plugin.Calculator { [TypeConverter(typeof(LocalizationConverter))] public enum DecimalSeparator diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj index 415f852f4..69c03b877 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj +++ b/Plugins/Flow.Launcher.Plugin.Calculator/Flow.Launcher.Plugin.Calculator.csproj @@ -5,8 +5,8 @@ net7.0-windows {59BD9891-3837-438A-958D-ADC7F91F6F7E} Properties - Flow.Launcher.Plugin.Caculator - Flow.Launcher.Plugin.Caculator + Flow.Launcher.Plugin.Calculator + Flow.Launcher.Plugin.Calculator true true false @@ -18,7 +18,7 @@ true portable false - ..\..\Output\Debug\Plugins\Flow.Launcher.Plugin.Caculator\ + ..\..\Output\Debug\Plugins\Flow.Launcher.Plugin.Calculator\ DEBUG;TRACE prompt 4 @@ -28,7 +28,7 @@ pdbonly true - ..\..\Output\Release\Plugins\Flow.Launcher.Plugin.Caculator\ + ..\..\Output\Release\Plugins\Flow.Launcher.Plugin.Calculator\ TRACE prompt 4 diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml new file mode 100644 index 000000000..82ebbbe93 --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/vi.xaml @@ -0,0 +1,15 @@ + + + + Máy tính + Cho phép thực hiện các phép tính toán học. (Thử 5*3-2 trong Flow Launcher) + Không phải là số (NaN) + Biểu thức sai hoặc không đầy đủ (Bạn có quên một số dấu ngoặc đơn không?) + Sao chép số này vào clipboard + Dấu tách thập phân + Dấu phân cách thập phân được sử dụng ở đầu ra. + Sử dụng ngôn ngữ hệ thống + Dấu phẩy (,) + dấu chấm (.) + Tối đa. chữ số thập phân + diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs index 338b5bcbe..5077e6061 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Calculator/Main.cs @@ -6,10 +6,10 @@ using System.Text.RegularExpressions; using System.Windows; using System.Windows.Controls; using Mages.Core; -using Flow.Launcher.Plugin.Caculator.ViewModels; -using Flow.Launcher.Plugin.Caculator.Views; +using Flow.Launcher.Plugin.Calculator.ViewModels; +using Flow.Launcher.Plugin.Calculator.Views; -namespace Flow.Launcher.Plugin.Caculator +namespace Flow.Launcher.Plugin.Calculator { public class Main : IPlugin, IPluginI18n, ISettingProvider { @@ -62,7 +62,7 @@ namespace Flow.Launcher.Plugin.Caculator switch (_settings.DecimalSeparator) { case DecimalSeparator.Comma: - case DecimalSeparator.UseSystemLocale when CultureInfo.DefaultThreadCurrentCulture.NumberFormat.NumberDecimalSeparator == ",": + case DecimalSeparator.UseSystemLocale when CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator == ",": expression = query.Search.Replace(",", "."); break; default: @@ -158,7 +158,7 @@ namespace Flow.Launcher.Plugin.Caculator private string GetDecimalSeparator() { - string systemDecimalSeperator = CultureInfo.DefaultThreadCurrentCulture.NumberFormat.NumberDecimalSeparator; + string systemDecimalSeperator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; switch (_settings.DecimalSeparator) { case DecimalSeparator.UseSystemLocale: return systemDecimalSeperator; diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/NumberTranslator.cs b/Plugins/Flow.Launcher.Plugin.Calculator/NumberTranslator.cs index ed4aed75b..4eacb9d34 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/NumberTranslator.cs +++ b/Plugins/Flow.Launcher.Plugin.Calculator/NumberTranslator.cs @@ -2,7 +2,7 @@ using System.Text; using System.Text.RegularExpressions; -namespace Flow.Launcher.Plugin.Caculator +namespace Flow.Launcher.Plugin.Calculator { /// /// Tries to convert all numbers in a text from one culture format to another. diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Settings.cs b/Plugins/Flow.Launcher.Plugin.Calculator/Settings.cs index 615514873..8354863b8 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Calculator/Settings.cs @@ -1,5 +1,5 @@  -namespace Flow.Launcher.Plugin.Caculator +namespace Flow.Launcher.Plugin.Calculator { public class Settings { diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs index afe4d1c0c..09f745669 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs +++ b/Plugins/Flow.Launcher.Plugin.Calculator/ViewModels/SettingsViewModel.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Linq; -namespace Flow.Launcher.Plugin.Caculator.ViewModels +namespace Flow.Launcher.Plugin.Calculator.ViewModels { public class SettingsViewModel : BaseModel { diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml index 9fd4bb17c..d6237c6da 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml +++ b/Plugins/Flow.Launcher.Plugin.Calculator/Views/CalculatorSettings.xaml @@ -1,13 +1,13 @@ /// Interaction logic for CalculatorSettings.xaml diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json index a77475460..6abc41668 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json +++ b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json @@ -4,9 +4,9 @@ "Name": "Calculator", "Description": "Provide mathematical calculations.(Try 5*3-2 in Flow Launcher)", "Author": "cxfksword", - "Version": "3.1.0", + "Version": "3.1.1", "Language": "csharp", "Website": "https://github.com/Flow-Launcher/Flow.Launcher", - "ExecuteFileName": "Flow.Launcher.Plugin.Caculator.dll", + "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/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index f2491d928..cd4a1dc84 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -29,6 +29,12 @@ Customise Action Keywords Quick Access Links Everything Setting + Preview Panel + Size + Date Created + Date Modified + Display File Info + Date and time format Sort Option: Everything Path: Launch Hidden @@ -105,10 +111,12 @@ Open With Select a program to open with - + {0} free of {1} Open in Default File Manager - Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches. + + Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches. + Failed to load Everything SDK @@ -133,7 +141,7 @@ Warning: This is not a Fast Sort option, searches may be slow Search Full Path - + Click to launch or install Everything Everything Installation Installing Everything service. Please wait... diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml index f69f15868..32159af96 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/it.xaml @@ -100,8 +100,8 @@ Rimuovi da Accesso Rapido Rimuovi elemento corrente dall'Accesso Rapido Mostra Menu Contestuale di Windows - Open With - Select a program to open with + Apri Con + Seleziona un programma con cui aprire {0} disponibili su {1} diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml index cb7f2cda5..ccdba5da9 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ru.xaml @@ -15,9 +15,9 @@ To fix this, start the Windows Search service. Select here to remove this warning The warning message has been switched off. As an alternative for searching files and folders, would you like to install Everything plugin?{0}{0}Select 'Yes' to install Everything plugin, or 'No' to return Explorer Alternative - Error occurred during search: {0} - Could not open folder - Could not open file + При поиске произошла ошибка: {0} + Не удалось открыть папку + Не удалось открыть файл Удалить diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml new file mode 100644 index 000000000..ee69ba9a3 --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/vi.xaml @@ -0,0 +1,145 @@ + + + + + Vui lòng lựa chọn trước + Hãy chọn một thư mục. + Bạn có chắc chắn muốn xóa {0} không? + Bạn có chắc là muốn xóa vĩnh viễn các ảnh này? + Bạn có chắc là muốn xóa vĩnh viễn các ảnh này? + Xóa thành công + Thành công trong việc xóa + Việc chỉ định từ khóa hành động chung có thể mang lại quá nhiều kết quả trong quá trình tìm kiếm. Vui lòng chọn từ khóa hành động cụ thể + Không thể đặt Truy cập nhanh thành từ khóa hành động chung khi được bật. Vui lòng chọn từ khóa hành động cụ thể + Dịch vụ cần thiết cho Windows Index Search dường như không chạy + Để khắc phục điều này, hãy khởi động dịch vụ Windows Search. Chọn vào đây để xóa cảnh báo này + Thông báo cảnh báo đã bị tắt. Là một giải pháp thay thế cho việc tìm kiếm tệp và thư mục, bạn có muốn cài đặt plugin Mọi thứ không?{0}{0}Chọn 'Có' để cài đặt plugin Mọi thứ hoặc 'Không' để quay lại + Nhà thám hiểm thay thế + Đã xảy ra lỗi trong quá trình tìm kiếm: {0} + Không thể mở thư mục + Không thể mở file + + + Xóa + Sửa + Thêm + Cài đặt chung + Tùy chỉnh từ khóa hành động + Liên kết truy cập nhanh + Cài đặt mọi thứ + Tùy Chọn Sắp Xếp + Đường dẫn mọi thứ: + Khởi chạy ẩn + Đường dẫn soạn thảo + Đường dẫn Shell + Đường dẫn bị loại trừ tìm kiếm chỉ mục + Sử dụng vị trí của kết quả tìm kiếm làm thư mục làm việc của tệp thực thi + Chạy với tư cách quản trị viên / mở thư mục trong trình quản lý tệp tiêu chuẩn + Sử dụng Tìm kiếm Chỉ mục để Tìm kiếm Đường dẫn + Tùy chọn lập chỉ mục + Tìm kiếm trên web với sự hỗ trợ của công cụ tìm kiếm khác + Tìm kiếm đường dẫn: + Tìm kiếm nội dung tệp: + Tìm kiếm chỉ mục: + Truy cập nhanh + Từ hành động hiện tại + Xong + Đã bật + Khi bị tắt, Flow sẽ không thực thi tùy chọn tìm kiếm này và sẽ hoàn nguyên về '*' để giải phóng từ khóa hành động + Tất cả mọi thứ + Windows Index + Direct Enumeration + File Editor Path + Folder Editor Path + + Content Search Engine + Directory Recursive Search Engine + Index Search Engine + Mở tùy chọn lập chỉ mục Windows + + + Thư mục + Find and manage files and folders via Windows Search or Everything + + + Ctrl + Enter to open the directory + Ctrl + Enter to open the containing folder + + + Copy đường dẫn + Copy path of current item to clipboard + Sao chép + Copy current file to clipboard + Copy current folder to clipboard + Xóa + Permanently delete current file + Permanently delete current folder + Đường dẫn: + 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 + Mở thư mục chứa + Open the location that contains current item + Mở bằng trình chỉnh sửa: + Failed to open file at {0} with Editor {1} at {2} + Open With Shell: + Failed to open folder {0} with Shell {1} at {2} + Loại trừ các thư mục hiện tại và thư mục con khỏi Tìm kiếm chỉ mục + Bị loại trừ khỏi Tìm kiếm chỉ mục + Mở tùy chọn lập chỉ mục Windows + Quản lý các tập tin và thư mục được lập chỉ mục + Quản lý các tập tin và thư mục được lập chỉ mục + Thêm vào Bảng truy cập nhanh + Thêm {0} hiện tại vào Truy cập nhanh + Đã thêm thành công + Đã thêm thành công vào Truy cập nhanh + Đã được gỡ bỏ thành công + Đã xóa thành công khỏi Truy cập nhanh + Thêm vào Truy cập nhanh để có thể mở nó bằng từ khóa hành động Kích hoạt tìm kiếm của Explorer + Loại bỏ khỏi bảng truy cập nhanh + Loại bỏ khỏi bảng truy cập nhanh + Xóa {0} hiện tại khỏi Truy cập nhanh + Show Windows Context Menu + Mở bằng + Select a program to open with + + + {0} phần {1} + Trình quản lý tệp mặc định + Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches. + + + Failed to load Everything SDK + Warning: Everything service is not running + Error while querying Everything + Sắp xếp theo + Tên + Đường dẫn + Kích thước + Mở rộng + Loại tên + Ngày Tạo + ngày sửa đổi + Thuộc tính + File List FileName + Số lần chạy + Date Recently Changed + Ngày truy cập + Date Run + + + Warning: This is not a Fast Sort option, searches may be slow + + Search Full Path + + Click to launch or install Everything + Everything Installation + Installing Everything service. Please wait... + Successfully installed Everything service + Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com + Click here to start it + Không thể tìm thấy bản cài đặt Mọi thứ, bạn có muốn chọn vị trí theo cách thủ công không?{0}{0}Nhấp vào không và Mọi thứ sẽ được cài đặt tự động cho bạn + Do you want to enable content search for Everything? + It can be very slow without index (which is only supported in Everything v1.5+) + + diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs index a87f766a1..34f80f552 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs @@ -8,11 +8,15 @@ using System.Threading.Tasks; using System.Windows; using Flow.Launcher.Plugin.Explorer.Search.Everything; using System.Windows.Input; +using Path = System.IO.Path; +using System.Windows.Controls; +using Flow.Launcher.Plugin.Explorer.Views; namespace Flow.Launcher.Plugin.Explorer.Search { public static class ResultManager { + private static readonly string[] SizeUnits = { "B", "KB", "MB", "GB", "TB" }; private static PluginInitContext Context; private static Settings Settings { get; set; } @@ -172,36 +176,28 @@ namespace Flow.Launcher.Plugin.Explorer.Search }; } - private static string ToReadableSize(long pDrvSize, int pi) + internal static string ToReadableSize(long sizeOnDrive, int pi) { - int mok = 0; - double drvSize = pDrvSize; - string uom = "Byte"; // Unit Of Measurement + var unitIndex = 0; + double readableSize = sizeOnDrive; - while (drvSize > 1024.0) + while (readableSize > 1024.0 && unitIndex < SizeUnits.Length - 1) { - drvSize /= 1024.0; - mok++; + readableSize /= 1024.0; + unitIndex++; } - if (mok == 1) - uom = "KB"; - else if (mok == 2) - uom = " MB"; - else if (mok == 3) - uom = " GB"; - else if (mok == 4) - uom = " TB"; + var unit = SizeUnits[unitIndex] ?? ""; - var returnStr = $"{Convert.ToInt32(drvSize)}{uom}"; - if (mok != 0) + var returnStr = $"{Convert.ToInt32(readableSize)} {unit}"; + if (unitIndex != 0) { returnStr = pi switch { - 1 => $"{drvSize:F1}{uom}", - 2 => $"{drvSize:F2}{uom}", - 3 => $"{drvSize:F3}{uom}", - _ => $"{Convert.ToInt32(drvSize)}{uom}" + 1 => $"{readableSize:F1} {unit}", + 2 => $"{readableSize:F2} {unit}", + 3 => $"{readableSize:F3} {unit}", + _ => $"{Convert.ToInt32(readableSize)} {unit}" }; } @@ -239,6 +235,9 @@ namespace Flow.Launcher.Plugin.Explorer.Search var title = Path.GetFileName(filePath); + + /* Preview Detail */ + var result = new Result { Title = title, @@ -249,6 +248,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search TitleHighlightData = StringMatcher.FuzzySearch(query.Search, title).MatchData, Score = score, CopyText = filePath, + PreviewPanel = new Lazy(() => new PreviewPanel(Settings, filePath)), Action = c => { try diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs index 137ba2f19..088bcf5d6 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs @@ -55,6 +55,16 @@ namespace Flow.Launcher.Plugin.Explorer public bool WarnWindowsSearchServiceOff { get; set; } = true; + public bool ShowFileSizeInPreviewPanel { get; set; } = true; + + public bool ShowCreatedDateInPreviewPanel { get; set; } = true; + + public bool ShowModifiedDateInPreviewPanel { get; set; } = true; + + public string PreviewPanelDateFormat { get; set; } = "yyyy-MM-dd"; + + public string PreviewPanelTimeFormat { get; set; } = "HH:mm"; + private EverythingSearchManager _everythingManagerInstance; private WindowsIndexSearchManager _windowsIndexSearchManager; @@ -137,7 +147,7 @@ namespace Flow.Launcher.Plugin.Explorer ContentSearchEngine == ContentIndexSearchEngineOption.Everything; public bool EverythingSearchFullPath { get; set; } = false; - + #endregion internal enum ActionKeyword diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs index 02199fb5a..064795b43 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; +using System.Globalization; using System.IO; using System.Linq; using System.Windows; @@ -101,7 +102,107 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels #endregion + #region Preview Panel + public bool ShowFileSizeInPreviewPanel + { + get => Settings.ShowFileSizeInPreviewPanel; + set + { + Settings.ShowFileSizeInPreviewPanel = value; + OnPropertyChanged(); + } + } + + public bool ShowCreatedDateInPreviewPanel + { + get => Settings.ShowCreatedDateInPreviewPanel; + set + { + Settings.ShowCreatedDateInPreviewPanel = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(ShowPreviewPanelDateTimeChoices)); + OnPropertyChanged(nameof(PreviewPanelDateTimeChoicesVisibility)); + } + } + + public bool ShowModifiedDateInPreviewPanel + { + get => Settings.ShowModifiedDateInPreviewPanel; + set + { + Settings.ShowModifiedDateInPreviewPanel = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(ShowPreviewPanelDateTimeChoices)); + OnPropertyChanged(nameof(PreviewPanelDateTimeChoicesVisibility)); + } + } + + public string PreviewPanelDateFormat + { + get => Settings.PreviewPanelDateFormat; + set + { + Settings.PreviewPanelDateFormat = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(PreviewPanelDateFormatDemo)); + } + } + + public string PreviewPanelTimeFormat + { + get => Settings.PreviewPanelTimeFormat; + set + { + Settings.PreviewPanelTimeFormat = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(PreviewPanelTimeFormatDemo)); + } + } + + public string PreviewPanelDateFormatDemo => DateTime.Now.ToString(PreviewPanelDateFormat, CultureInfo.CurrentCulture); + public string PreviewPanelTimeFormatDemo => DateTime.Now.ToString(PreviewPanelTimeFormat, CultureInfo.CurrentCulture); + + public bool ShowPreviewPanelDateTimeChoices => ShowCreatedDateInPreviewPanel || ShowModifiedDateInPreviewPanel; + + public Visibility PreviewPanelDateTimeChoicesVisibility => ShowCreatedDateInPreviewPanel || ShowModifiedDateInPreviewPanel ? Visibility.Visible : Visibility.Collapsed; + + + public List TimeFormatList { get; } = new() + { + "h:mm", + "hh:mm", + "H:mm", + "HH:mm", + "tt h:mm", + "tt hh:mm", + "h:mm tt", + "hh:mm tt", + "hh:mm:ss tt", + "HH:mm:ss" + }; + + + public List DateFormatList { get; } = new() + { + "dd/MM/yyyy", + "dd/MM/yyyy ddd", + "dd/MM/yyyy, dddd", + "dd-MM-yyyy", + "dd-MM-yyyy ddd", + "dd-MM-yyyy, dddd", + "dd.MM.yyyy", + "dd.MM.yyyy ddd", + "dd.MM.yyyy, dddd", + "MM/dd/yyyy", + "MM/dd/yyyy ddd", + "MM/dd/yyyy, dddd", + "yyyy-MM-dd", + "yyyy-MM-dd ddd", + "yyyy-MM-dd, dddd", + }; + + #endregion #region ActionKeyword diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml index b0708b793..5c92fc271 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml @@ -348,6 +348,57 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml new file mode 100644 index 000000000..b5cfd1a5d --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs new file mode 100644 index 000000000..878832e4f --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -0,0 +1,101 @@ +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using Flow.Launcher.Infrastructure.Image; +using Flow.Launcher.Plugin.Explorer.Search; + +namespace Flow.Launcher.Plugin.Explorer.Views; + +#nullable enable + +public partial class PreviewPanel : UserControl, INotifyPropertyChanged +{ + private string FilePath { get; } + public string FileSize { get; } = ""; + public string CreatedAt { get; } = ""; + public string LastModifiedAt { get; } = ""; + private ImageSource _previewImage = new BitmapImage(); + private Settings Settings { get; } + + public ImageSource PreviewImage + { + get => _previewImage; + private set + { + _previewImage = value; + OnPropertyChanged(); + } + } + + public Visibility FileSizeVisibility => Settings.ShowFileSizeInPreviewPanel + ? Visibility.Visible + : Visibility.Collapsed; + public Visibility CreatedAtVisibility => Settings.ShowCreatedDateInPreviewPanel + ? Visibility.Visible + : Visibility.Collapsed; + public Visibility LastModifiedAtVisibility => Settings.ShowModifiedDateInPreviewPanel + ? Visibility.Visible + : Visibility.Collapsed; + + public Visibility FileInfoVisibility => + Settings.ShowFileSizeInPreviewPanel || + Settings.ShowCreatedDateInPreviewPanel || + Settings.ShowModifiedDateInPreviewPanel + ? Visibility.Visible + : Visibility.Collapsed; + + public PreviewPanel(Settings settings, string filePath) + { + InitializeComponent(); + + Settings = settings; + + FilePath = filePath; + + if (Settings.ShowFileSizeInPreviewPanel) + { + var fileSize = new FileInfo(filePath).Length; + FileSize = ResultManager.ToReadableSize(fileSize, 2); + } + + if (Settings.ShowCreatedDateInPreviewPanel) + { + CreatedAt = File + .GetCreationTime(filePath) + .ToString( + $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", + CultureInfo.CurrentCulture + ); + } + + if (Settings.ShowModifiedDateInPreviewPanel) + { + LastModifiedAt = File + .GetLastWriteTime(filePath) + .ToString( + $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", + CultureInfo.CurrentCulture + ); + } + + _ = LoadImageAsync(); + } + + private async Task LoadImageAsync() + { + PreviewImage = await ImageLoader.LoadAsync(FilePath, true).ConfigureAwait(false); + } + + public event PropertyChangedEventHandler? PropertyChanged; + + protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } +} diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/vi.xaml new file mode 100644 index 000000000..58fcba3eb --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/vi.xaml @@ -0,0 +1,9 @@ + + + + Activate {0} plugin action keyword + + Chỉ báo plugin + Cung cấp plugin gợi ý từ hành động + + diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj b/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj index 92500ae6a..b438305d6 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Flow.Launcher.Plugin.PluginsManager.csproj @@ -6,6 +6,7 @@ true true false + en @@ -27,7 +28,7 @@ PreserveNewest - + PreserveNewest @@ -36,4 +37,4 @@ PreserveNewest - \ No newline at end of file + diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Images/zipfolder.png b/Plugins/Flow.Launcher.Plugin.PluginsManager/Images/zipfolder.png new file mode 100644 index 000000000..5d3ed0ace Binary files /dev/null and b/Plugins/Flow.Launcher.Plugin.PluginsManager/Images/zipfolder.png differ diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml index ca5d964ab..e13a857a1 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml index 1351e69cb..3c377c27f 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml @@ -24,7 +24,6 @@ {0} z {1} {2}{3}Chcete tento zásuvný modul aktualizovat? Flow se po aktualizaci automaticky restartuje. {0} by {1} {2}{2}Would you like to update this plugin? Aktualizace Pluginu - Aktualizace tohoto pluginu je k dispozici, chcete ji zobrazit? Tento plugin je již nainstalován Stahování manifestu pluginu se nezdařilo Zkontrolujte, zda se můžete připojit k webu github.com. Tato chyba pravděpodobně znamená, že nemůžete instalovat nebo aktualizovat zásuvné moduly. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml index f224af73f..723af440d 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml index 642c0d6a1..c69c3a2b5 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml index a89d9df21..de6a3a2fb 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/en.xaml @@ -26,7 +26,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml index f224af73f..723af440d 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml index e3fa09615..75126dea6 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml @@ -24,7 +24,6 @@ {0} por {1} {2}{3}¿Desea actualizar este complemento? Después de la actualización Flow se reiniciará automáticamente. {0} por {1} {2}{2}¿Desea actualizar este complemento? Actualizar complemento - Este complemento tiene una actualización, ¿desea verla? Este complemento ya está instalado La descarga del manifiesto del complemento ha fallado Por favor, compruebe que puede establecer conexión con github.com. Este error significa que es posible que no pueda instalar o actualizar complementos. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml index c36e4c39c..d40f2f9da 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml @@ -24,7 +24,6 @@ {0} par {1} {2}{3}Voulez-vous mettre à jour ce plugin ? Après la mise à jour Flow redémarrera automatiquement. {0} par {1} {2}{2}Voulez-vous mettre à jour ce plugin ? Mise à jour du Plugin - Ce plugin a une mise à jour, voulez-vous le voir ? Ce plugin est déjà installé Échec du téléchargement du Plugin Manifest Veuillez vérifier si vous pouvez vous connecter à github.com. Cette erreur signifie que vous ne serez pas en mesure d'installer ou de mettre à jour des plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml index e2ae667c1..9b6cf3068 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml @@ -6,9 +6,9 @@ Download completato Errore: non è possibile scaricare il plugin {0} da {1} {2}{3}Vuoi disinstallare questo plugin? Dopo la disinstallazione, Flow si riavvierà automaticamente. - {0} by {1} {2}{2}Would you like to uninstall this plugin? + {0} di {1} {2}{2}Vuoi disinstallare questo plugin? {0} da {1} {2}{3}Vuoi installare questo plugin? Dopo l'installazione, Flow si riavvierà automaticamente. - {0} by {1} {2}{2}Would you like to install this plugin? + {0} di {1} {2}{2}Vuoi installare questo plugin? Installazione del plugin Installazione del Plugin Scarica e installa {0} @@ -18,30 +18,29 @@ Errore: esiste già un plugin che ha la stessa o maggiore versione con {0}. Errore durante l'installazione del plugin Errore durante il tentativo di installare {0} - Error uninstalling plugin + Errore durante la disinstallazione del plugin Nessun aggiornamento disponibile Tutti i plugin sono aggiornati {0} da {1} {2}{3}Vuoi aggiornare questo plugin? Dopo l'aggiornamento, Flow si riavvierà automaticamente. - {0} by {1} {2}{2}Would you like to update this plugin? + {0} di {1} {2}{2}Vuoi aggiornare questo plugin? Aggiornamento del plugin - Questo plugin ha un aggiornamento, vuoi vederlo? Questo plugin è già stato installato Download del manifesto del plugin fallito Controlla se puoi connetterti a github.com. Questo errore significa che potresti non essere in grado di installare o aggiornare i plugin. - Update all plugins - Would you like to update all plugins? - Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins. - Would you like to update {0} plugins? - {0} plugins successfully updated. Restarting Flow, please wait... - Plugin {0} successfully updated. Restarting Flow, please wait... + Aggiorna tutti i plugin + Vuoi aggiornare tutti i plugin? + Vuoi aggiornare {0} plugin?{1}Flow Launcher verrà riavviato dopo aver aggiornato tutti i plugin. + Vuoi aggiornare {0} plugin? + {0} plugin aggiornati con successo. Riavviando Flow, attendere... + Il plugin {0} aggiornato con successo. Riavviando Flow, attendere... Installazione da una fonte sconosciuta Stai installando questo plugin da una fonte sconosciuta e potrebbe contenere potenziali rischi!{0}{0}Si prega di assicurarsi di capire la provenienza di questo plugin e se sia sicuro.{0}{0}Vuoi comunque continuare?{0}{0}(Puoi disattivare questo avviso dalle impostazioni) - Plugin {0} successfully installed. Please restart Flow. - Plugin {0} successfully uninstalled. Please restart Flow. - Plugin {0} successfully updated. Please restart Flow. - {0} plugins successfully updated. Please restart Flow. - Plugin {0} has already been modified. Please restart Flow before making any further changes. + Il plugin {0} installato con successo. Riavviare Flow. + Il plugin {0} disinstallato con successo. Riavviare Flow. + 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. Gestore dei plugin @@ -60,5 +59,5 @@ Avviso di installazione da sorgenti sconosciute - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Riavvia automaticamente Flow Launcher dopo l'installazione/disinstallazione/aggiornamento dei plugin diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml index f224af73f..723af440d 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml index d95a5d6a5..9bcf0a74b 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? 플러그인 업데이트 - This plugin has an update, would you like to see it? 이미 설치된 플러그인입니다 플러그인 목록 다운로드 실패 Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml index f224af73f..723af440d 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml index f224af73f..723af440d 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml index f224af73f..723af440d 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml index 949607f42..8640625c2 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? Este plugin já está instalado Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml index 7d94d6b33..c69317276 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml @@ -24,7 +24,6 @@ {0} de {1} {2}{3}Tem a certeza de que pretende atualizar este plugin? Após a atualização, Flow Launcher será reiniciado. {0} de {1} {2}{2}Gostaria de atualizar este plugin? Atualização de plugin - Existe uma atualização para este plugin. Deseja ver? Este plugin já está instalado Erro ao descarregar o manifesto do plugin Verifique se consegue estabelecer ligação a github.com. Este erro significa que pode não ser possível instalar ou atualizar os plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml index f224af73f..723af440d 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml index 016842da9..1982dd5cf 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml @@ -24,7 +24,6 @@ {0} od {1} {2}{3}Chcete aktualizovať tento plugin? Po aktualizácii sa Flow automaticky reštartuje. {0} od {1} {2}{2}Chcete aktualizovať tento plugin? Aktualizácia pluginu - Aktualizácia pre tento plugin je k dispozícii, chcete ju zobraziť? Tento plugin je už nainštalovaný Stiahnutie manifestu pluginu zlyhalo Skontrolujte, či sa môžete pripojiť ku github.com. Táto chyba znamená, že pravdepodobne nemôžete pluginy inštalovať alebo aktualizovať. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml index f224af73f..723af440d 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml index f224af73f..723af440d 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? Plugin Update - This plugin has an update, would you like to see it? This plugin is already installed Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml index b4d60f5b6..db863b70f 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml @@ -24,7 +24,6 @@ {0} від {1} {2}{3}Бажаєте оновити цей плагін? Після оновлення Flow буде автоматично перезапущено. {0} від {1} {2}{2}Бажаєте оновити цей плагін? Оновлення плагіна - Цей плагін має оновлення, бажаєте його переглянути? Цей плагін вже встановлено Не вдалося завантажити маніфест плагіна Будь ласка, перевірте, чи можете ви підключитися до github.com. Ця помилка означає, що ви не можете встановлювати або оновлювати плагіни. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml new file mode 100644 index 000000000..b41ad44e9 --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml @@ -0,0 +1,63 @@ + + + + + Plugin đang được tải + Đã tải xuống thành công! + Lỗi: Không thể tải plugin xuống + {0} bởi {1} {2}{3}Bạn có muốn gỡ cài đặt plugin này không? Sau khi gỡ cài đặt Flow sẽ tự động khởi động lại. + {0} by {1} {2}{2}Would you like to uninstall this plugin? + {0} bởi {1} {2}{3}Bạn có muốn gỡ cài đặt plugin này không? Sau khi gỡ cài đặt Flow sẽ tự động khởi động lại. + {0} by {1} {2}{2}Would you like to install this plugin? + Đã cài đặt plugin + Cài đặt Plugin + Tải về và cài đặt + Đã gỡ cài đặt plugin + Đã cài đặt thành công plugin. Đang khởi động lại Flow, vui lòng đợi... + Không thể tìm thấy tệp siêu dữ liệu plugin.json từ tệp zip được giải nén. + Lỗi: Đã tồn tại một plugin có phiên bản tương tự hoặc cao hơn với {0}. + Lỗi cài đặt plugin + Đã xảy ra lỗi khi cố gắng cài đặt {0} + Lỗi cài đặt plugin + Không có cập nhật + Tất cả các plugin đều được cập nhật + {0} bởi {1} {2}{3}Bạn có muốn gỡ cài đặt plugin này không? Sau khi gỡ cài đặt Flow sẽ tự động khởi động lại. + {0} by {1} {2}{2}Would you like to update this plugin? + Cập nhật plugin + Đã cài đặt plugin + Tải xuống bản kê khai plugin không thành công + Vui lòng kiểm tra xem bạn có thể kết nối với github.com không. Lỗi này có nghĩa là bạn không thể cài đặt hoặc cập nhật plugin. + Update all plugins + Would you like to update all plugins? + Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins. + Would you like to update {0} plugins? + {0} plugins successfully updated. Restarting Flow, please wait... + Plugin {0} successfully updated. Restarting Flow, please wait... + Cài đặt từ một nguồn không xác định + Bạn đang cài đặt plugin này từ một nguồn không xác định và nó có thể chứa những rủi ro tiềm ẩn!{0}{0}Hãy đảm bảo rằng bạn hiểu plugin này đến từ đâu và nó an toàn.{0}{0}Bạn vẫn muốn tiếp tục chứ? {0}{0}(Bạn có thể tắt cảnh báo này thông qua cài đặt) + + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + {0} plugins successfully updated. Please restart Flow. + Plugin {0} has already been modified. Please restart Flow before making any further changes. + + + 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 + Không rõ tác giả + + + Mở website + Truy cập trang web của plugin + Xem mã nguồn + Xem mã nguồn của plugin + Đề xuất cải tiến hoặc gửi vấn đề + Đề xuất cải tiến hoặc gửi vấn đề cho nhà phát triển plugin + Đi tới kho plugin của Flow + Truy cập kho lưu trữ PluginsManifest để xem các bản gửi plugin do cộng đồng gửi + + + Cảnh báo cài đặt từ nguồn không xác định + Automatically restart Flow Launcher after installing/uninstalling/updating plugins + diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml index 749c7c3ac..676c20a73 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}您要更新此插件吗? 更新后,Flow Launcher 将自动重启。 {0} 作者: {1} {2}{2}您想要更新这个插件吗? 插件更新 - 该插件有更新,您想看看吗? 此插件已安装 插件列表下载失败 请检查您是否可以连接到 github.com。这个错误意味着您可能无法安装或更新插件。 diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml index 3505c4a7d..ae37579dc 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml @@ -24,7 +24,6 @@ {0} by {1} {2}{3}Would you like to update this plugin? After the update Flow will automatically restart. {0} by {1} {2}{2}Would you like to update this plugin? 擴充功能更新 - This plugin has an update, would you like to see it? 已安裝此擴充功能 Plugin Manifest Download Failed Please check if you can connect to github.com. This error means you may not be able to install or update plugins. diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs index 8cd58ac52..15cbda7f2 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/PluginsManager.cs @@ -3,11 +3,9 @@ using Flow.Launcher.Core.Plugin; using Flow.Launcher.Infrastructure; using Flow.Launcher.Infrastructure.Http; using Flow.Launcher.Infrastructure.Logger; -using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin.SharedCommands; using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Linq; using System.Net.Http; @@ -99,13 +97,12 @@ namespace Flow.Launcher.Plugin.PluginsManager if (Context.API.GetAllPlugins() .Any(x => x.Metadata.ID == plugin.ID && x.Metadata.Version.CompareTo(plugin.Version) < 0)) { - if (MessageBox.Show(Context.API.GetTranslation("plugin_pluginsmanager_update_exists"), - Context.API.GetTranslation("plugin_pluginsmanager_update_title"), - MessageBoxButton.YesNo) == MessageBoxResult.Yes) - Context - .API - .ChangeQuery( - $"{Context.CurrentPluginMetadata.ActionKeywords.FirstOrDefault()} {Settings.UpdateCommand} {plugin.Name}"); + var updateDetail = !plugin.IsFromLocalInstallPath ? plugin.Name : plugin.LocalInstallPath; + + Context + .API + .ChangeQuery( + $"{Context.CurrentPluginMetadata.ActionKeywords.FirstOrDefault()} {Settings.UpdateCommand} {updateDetail}"); var mainWindow = Application.Current.MainWindow; mainWindow.Show(); @@ -147,12 +144,17 @@ namespace Flow.Launcher.Plugin.PluginsManager try { - if (File.Exists(filePath)) + if (!plugin.IsFromLocalInstallPath) { - File.Delete(filePath); - } + if (File.Exists(filePath)) + File.Delete(filePath); - await Http.DownloadAsync(plugin.UrlDownload, filePath).ConfigureAwait(false); + await Http.DownloadAsync(plugin.UrlDownload, filePath).ConfigureAwait(false); + } + else + { + filePath = plugin.LocalInstallPath; + } Install(plugin, filePath); } @@ -193,24 +195,38 @@ namespace Flow.Launcher.Plugin.PluginsManager { await PluginsManifest.UpdateManifestAsync(token, usePrimaryUrlOnly); + var pluginFromLocalPath = null as UserPlugin; + var updateFromLocalPath = false; + + if (FilesFolders.IsZipFilePath(search, checkFileExists: true)) + { + pluginFromLocalPath = Utilities.GetPluginInfoFromZip(search); + pluginFromLocalPath.LocalInstallPath = search; + updateFromLocalPath = true; + } + + var updateSource = !updateFromLocalPath + ? PluginsManifest.UserPlugins + : new List { pluginFromLocalPath }; + var resultsForUpdate = ( from existingPlugin in Context.API.GetAllPlugins() - join pluginFromManifest in PluginsManifest.UserPlugins - on existingPlugin.Metadata.ID equals pluginFromManifest.ID - where String.Compare(existingPlugin.Metadata.Version, pluginFromManifest.Version, + join pluginUpdateSource in updateSource + on existingPlugin.Metadata.ID equals pluginUpdateSource.ID + where string.Compare(existingPlugin.Metadata.Version, pluginUpdateSource.Version, StringComparison.InvariantCulture) < - 0 // if current version precedes manifest version + 0 // if current version precedes version of the plugin from update source (e.g. PluginsManifest) && !PluginManager.PluginModified(existingPlugin.Metadata.ID) select new { - pluginFromManifest.Name, - pluginFromManifest.Author, + pluginUpdateSource.Name, + pluginUpdateSource.Author, CurrentVersion = existingPlugin.Metadata.Version, - NewVersion = pluginFromManifest.Version, + NewVersion = pluginUpdateSource.Version, existingPlugin.Metadata.IcoPath, PluginExistingMetadata = existingPlugin.Metadata, - PluginNewUserPlugin = pluginFromManifest + PluginNewUserPlugin = pluginUpdateSource }).ToList(); if (!resultsForUpdate.Any()) @@ -261,13 +277,21 @@ namespace Flow.Launcher.Plugin.PluginsManager _ = Task.Run(async delegate { - if (File.Exists(downloadToFilePath)) + if (!x.PluginNewUserPlugin.IsFromLocalInstallPath) { - File.Delete(downloadToFilePath); - } + if (File.Exists(downloadToFilePath)) + { + File.Delete(downloadToFilePath); + } - await Http.DownloadAsync(x.PluginNewUserPlugin.UrlDownload, downloadToFilePath) - .ConfigureAwait(false); + await Http.DownloadAsync(x.PluginNewUserPlugin.UrlDownload, downloadToFilePath) + .ConfigureAwait(false); + } + else + { + downloadToFilePath = x.PluginNewUserPlugin.LocalInstallPath; + } + PluginManager.UpdatePlugin(x.PluginExistingMetadata, x.PluginNewUserPlugin, downloadToFilePath); @@ -396,7 +420,7 @@ namespace Flow.Launcher.Plugin.PluginsManager results = results.Prepend(updateAllResult); } - return Search(results, search); + return !updateFromLocalPath ? Search(results, search) : results.ToList(); } internal bool PluginExists(string id) @@ -470,6 +494,42 @@ namespace Flow.Launcher.Plugin.PluginsManager return new List { result }; } + internal List InstallFromLocalPath(string localPath) + { + var plugin = Utilities.GetPluginInfoFromZip(localPath); + + plugin.LocalInstallPath = localPath; + + return new List + { + new Result + { + Title = $"{plugin.Name} by {plugin.Author}", + SubTitle = plugin.Description, + IcoPath = plugin.IcoPath, + Action = e => + { + if (Settings.WarnFromUnknownSource) + { + if (!InstallSourceKnown(plugin.Website) + && MessageBox.Show(string.Format( + Context.API.GetTranslation("plugin_pluginsmanager_install_unknown_source_warning"), + Environment.NewLine), + Context.API.GetTranslation( + "plugin_pluginsmanager_install_unknown_source_warning_title"), + MessageBoxButton.YesNo) == MessageBoxResult.No) + return false; + } + + Application.Current.MainWindow.Hide(); + _ = InstallOrUpdateAsync(plugin); + + return ShouldHideWindow; + } + } + }; + } + private bool InstallSourceKnown(string url) { var author = url.Split('/')[3]; @@ -489,6 +549,9 @@ namespace Flow.Launcher.Plugin.PluginsManager && search.Split('.').Last() == zip) return InstallFromWeb(search); + if (FilesFolders.IsZipFilePath(search, checkFileExists: true)) + return InstallFromLocalPath(search); + var results = PluginsManifest .UserPlugins @@ -522,10 +585,13 @@ namespace Flow.Launcher.Plugin.PluginsManager if (!File.Exists(downloadedFilePath)) throw new FileNotFoundException($"Plugin {plugin.ID} zip file not found at {downloadedFilePath}", downloadedFilePath); + try { PluginManager.InstallPlugin(plugin, downloadedFilePath); - File.Delete(downloadedFilePath); + + if (!plugin.IsFromLocalInstallPath) + File.Delete(downloadedFilePath); } catch (FileNotFoundException e) { diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs b/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs index 792891ad1..9800fa020 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Utilities.cs @@ -1,5 +1,10 @@ -using ICSharpCode.SharpZipLib.Zip; +using Flow.Launcher.Core.ExternalPlugins; +using Flow.Launcher.Infrastructure.UserSettings; +using ICSharpCode.SharpZipLib.Zip; +using Newtonsoft.Json; using System.IO; +using System.IO.Compression; +using System.Linq; namespace Flow.Launcher.Plugin.PluginsManager { @@ -55,5 +60,28 @@ namespace Flow.Launcher.Plugin.PluginsManager return string.Empty; } + + internal static UserPlugin GetPluginInfoFromZip(string filePath) + { + var plugin = null as UserPlugin; + + 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); + + if (pluginJsonEntry != null) + { + using (StreamReader reader = new StreamReader(pluginJsonEntry.Open())) + { + string pluginJsonContent = reader.ReadToEnd(); + plugin = JsonConvert.DeserializeObject(pluginJsonContent); + plugin.IcoPath = "Images\\zipfolder.png"; + } + } + } + + return plugin; + } } } diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj index 861fc3197..876bac1e7 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Flow.Launcher.Plugin.ProcessKiller.csproj @@ -12,6 +12,7 @@ true false false + en @@ -54,4 +55,4 @@ - \ No newline at end of file + diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/vi.xaml new file mode 100644 index 000000000..0bf065ee1 --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/vi.xaml @@ -0,0 +1,11 @@ + + + + Buộc Tắt tiến trình + Tắt các tiến trình đang chạy từ Flow Launcher + + tiêu diệt tất cả các phiên bản của "{0}" + Buộc tắt các tiến trình {0} + Tắt tất cả phên bản + + diff --git a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj index e9c680824..132c0c705 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj +++ b/Plugins/Flow.Launcher.Plugin.Program/Flow.Launcher.Plugin.Program.csproj @@ -12,6 +12,7 @@ true false false + en @@ -59,6 +60,7 @@ + \ No newline at end of file diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml index d7e87b50b..25ceac3bb 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml @@ -32,6 +32,8 @@ When enabled, Flow will load programs from the PATH environment variable Hide app path For executable files such as UWP or lnk, hide the file path from being visible + Hide uninstallers + Hides programs with common uninstaller names, such as unins000.exe Search in Program Description Flow will search program's description Suffixes @@ -92,4 +94,4 @@ This app is not intended to be run as administrator Unable to run {0} - \ No newline at end of file + diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml index 3a4d0e238..e73c8d24e 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml @@ -6,42 +6,42 @@ Cancella Modifica Aggiungi - Name - Enable + Nome + Abilita Abilitato - Disable + Disabilita Status Abilitato Disabled - Location - All Programs + Posizione + Tutti i programmi File Type - Reindex - Indexing + Reindicizza + Indicizzando Index Sources Options UWP Apps When enabled, Flow will load UWP Applications Start Menu - When enabled, Flow will load programs from the start menu + Se abilitato, Flow caricherà i programmi dal Menu Start Registry - When enabled, Flow will load programs from the registry + Se abilitato, Flow caricherà i programmi dal Registro PATH When enabled, Flow will load programs from the PATH environment variable - Hide app path - For executable files such as UWP or lnk, hide the file path from being visible - Search in Program Description + Nascondi percorso app + Per i file eseguibili come UWP o lnk, nascondere il percorso del file + Cerca nella Descrizione del Programma Flow will search program's description - Suffixes - Max Depth + Suffissi + Profondità max - Directory - Browse - File Suffixes: - Maximum Search Depth (-1 is unlimited): + Cartella + Sfoglia + Suffissi dei file: + Profondità massima di ricerca (-1 è illimitata): - Please select a program source - Are you sure you want to delete the selected program sources? + Seleziona la sorgente del programma + Sei sicuro di voler cancellare le sorgenti dei programmi selezionate? Another program source with the same location already exists. Program Source @@ -49,11 +49,11 @@ Aggiorna Program Plugin will only index files with selected suffixes and .url files with selected protocols. - Successfully updated file suffixes - File suffixes can't be empty + Suffissi dei file aggiornati con successo + I suffissi del file non possono essere vuoti Protocols can't be empty - File Suffixes + Suffissi dei file URL Protocols Steam Games Epic Games @@ -67,18 +67,18 @@ Insert protocols of .url files you want to index. Protocols should be separated by ';', and should end with "://". (ex>ftp://;mailto://) - Run As Different User - Run As Administrator + Esegui Come Utente Differente + Esegui Come Amministratore Apri percorso file - Disable this program from displaying + Disabilita questo programma dalla visualizzazione Open target folder - Program - Search programs in Flow Launcher + Programma + Cerca programmi in Flow Launcher - Invalid Path + Percorso non valido - Customized Explorer + Esplora Risorse personalizzato Parametri You can customized the explorer used for opening the container folder by inputing the Environmental Variable of the explorer you want to use. It will be useful to use CMD to test whether the Environmental Variable is available. Inserisci i parametri personalizzati che vuoi aggiungere per il tuo Esplora Risorse personalizzato. %s per la cartella superiore, %f per il percorso completo (che funziona solo per win32). Controlla il sito dell'Esplora Risorse per i dettagli. diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml new file mode 100644 index 000000000..7ec467566 --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml @@ -0,0 +1,93 @@ + + + + + Khôi phục về mặc định + Xóa + Sửa + Thêm + Tên + Kích hoạt + Đã bật + Vô hiệu + Trạng thái + Đã bật + Vô hiệu hóa + Vị trí + Tất cả ứng dụng + Loại tệp + Chỉ số hoá + Nhập dữ liệu + Nguồn chỉ mục + Tùy chỉnh + UWP Apps + When enabled, Flow will load UWP Applications + Menu Khởi động + Khi được bật, Flow sẽ tải các chương trình từ menu bắt đầu + Đăng ký + Khi được bật, Flow sẽ tải các chương trình từ menu bắt đầu + ĐƯỜNG DẪN + Khi được bật, Flow sẽ tải các chương trình từ menu bắt đầu + Ẩn đường dẫn ứng dụng + Đối với các tệp thực thi như UWP hoặc lnk, hãy ẩn đường dẫn tệp để không hiển thị + Tìm kiếm trong Mô tả chương trình + Flow will search program's description + Hậu tố + Độ sâu tối đa: + + Danh bạ + Duyệt + Hậu tố tệp: + Độ sâu tìm kiếm tối đa (-1 là không giới hạn): + + Hãy chọn một nguồn dữ liệu + Bạn có chắc chắn là muốn xóa các đặt hàng đã chọn? + Another program source with the same location already exists. + + Program Source + Edit directory and status of this program source. + + Cập nhật + Program Plugin will only index files with selected suffixes and .url files with selected protocols. + Đã cập nhật thành công hậu tố tệp + Hậu tố tệp không được để trống + Trường cổng không được trống + + Hậu tố tệp + URL Protocols + Steam Games + Epic Games + Http/Https + Custom URL Protocols + Custom File Suffixes + + Insert file suffixes you want to index. Suffixes should be separated by ';'. (ex>bat;py) + + + Insert protocols of .url files you want to index. Protocols should be separated by ';', and should end with "://". (ex>ftp://;mailto://) + + + Xóa lựa chọn đã chọn + Chạy với quyền quản trị + Mở thư mục chứa + Vô hiệu hóa chương trình này hiển thị + Open target folder + + Chương trình + Tìm kiếm chương trình trong Flow Launcher + + Đường dẫn không hợp lệ + + Trình khám phá tùy chỉnh + Đối số + Bạn có thể tùy chỉnh trình thám hiểm được sử dụng để mở thư mục vùng chứa bằng cách nhập Biến môi trường của trình khám phá mà bạn muốn sử dụng. Sẽ rất hữu ích khi sử dụng CMD để kiểm tra xem Biến môi trường có sẵn hay không. + Nhập các đối số tùy chỉnh mà bạn muốn thêm cho trình khám phá tùy chỉnh của mình. %s cho thư mục mẹ, %f cho đường dẫn đầy đủ (chỉ hoạt động với win32). Kiểm tra trang web của nhà thám hiểm để biết chi tiết. + + + Thành công + Lỗi + Đã vô hiệu hóa thành công chương trình này khỏi hiển thị trong truy vấn của bạn + Ứng dụng này không nhằm mục đích chạy với tư cách quản trị viên + Không thể đọc {0} + + diff --git a/Plugins/Flow.Launcher.Plugin.Program/Main.cs b/Plugins/Flow.Launcher.Plugin.Program/Main.cs index e0a7f23de..8bf1830e3 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Main.cs @@ -11,6 +11,7 @@ using Flow.Launcher.Plugin.Program.Programs; using Flow.Launcher.Plugin.Program.Views; using Flow.Launcher.Plugin.Program.Views.Models; using Microsoft.Extensions.Caching.Memory; +using Path = System.IO.Path; using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch; namespace Flow.Launcher.Plugin.Program @@ -33,6 +34,17 @@ namespace Flow.Launcher.Plugin.Program private static readonly MemoryCacheOptions cacheOptions = new() { SizeLimit = 1560 }; private static MemoryCache cache = new(cacheOptions); + private static readonly string[] commonUninstallerNames = + { + "uninst.exe", + "unins000.exe", + "uninst000.exe", + "uninstall.exe" + }; + // For cases when the uninstaller is named like "Uninstall Program Name.exe" + private const string CommonUninstallerPrefix = "uninstall"; + private const string CommonUninstallerSuffix = ".exe"; + static Main() { } @@ -52,6 +64,7 @@ namespace Flow.Launcher.Plugin.Program .Concat(_uwps) .AsParallel() .WithCancellation(token) + .Where(HideUninstallersFilter) .Where(p => p.Enabled) .Select(p => p.Result(query.Search, Context.API)) .Where(r => r?.Score > 0) @@ -68,6 +81,16 @@ namespace Flow.Launcher.Plugin.Program return result; } + private bool HideUninstallersFilter(IProgram program) + { + if (!_settings.HideUninstallers) return true; + if (program is not Win32 win32) return true; + var fileName = Path.GetFileName(win32.ExecutablePath); + return !commonUninstallerNames.Contains(fileName, StringComparer.OrdinalIgnoreCase) && + !(fileName.StartsWith(CommonUninstallerPrefix, StringComparison.OrdinalIgnoreCase) && + fileName.EndsWith(CommonUninstallerSuffix, StringComparison.OrdinalIgnoreCase)); + } + public async Task InitAsync(PluginInitContext context) { Context = context; diff --git a/Plugins/Flow.Launcher.Plugin.Program/Settings.cs b/Plugins/Flow.Launcher.Plugin.Program/Settings.cs index ca203f803..fb24f64d7 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Settings.cs @@ -102,7 +102,7 @@ namespace Flow.Launcher.Plugin.Program // CustomSuffixes no longer contains custom suffixes // users has tweaked the settings // or this function has been executed once - if (UseCustomSuffixes == true || ProgramSuffixes == null) + if (UseCustomSuffixes == true || ProgramSuffixes == null) return; var suffixes = ProgramSuffixes.ToList(); foreach(var item in BuiltinSuffixesStatus) @@ -117,6 +117,7 @@ namespace Flow.Launcher.Plugin.Program public bool EnableStartMenuSource { get; set; } = true; public bool EnableDescription { get; set; } = false; public bool HideAppsPath { get; set; } = true; + public bool HideUninstallers { get; set; } = false; public bool EnableRegistrySource { get; set; } = true; public bool EnablePathSource { get; set; } = false; public bool EnableUWP { get; set; } = true; diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml index fa97de4f2..e5ca6967e 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml @@ -85,6 +85,11 @@ Content="{DynamicResource flowlauncher_plugin_program_enable_hidelnkpath}" IsChecked="{Binding HideAppsPath}" ToolTip="{DynamicResource flowlauncher_plugin_program_enable_hidelnkpath_tooltip}" /> + ProgramSettingDisplayList { get; set; } public bool EnableDescription @@ -47,6 +47,16 @@ namespace Flow.Launcher.Plugin.Program.Views } } + public bool HideUninstallers + { + get => _settings.HideUninstallers; + set + { + Main.ResetCache(); + _settings.HideUninstallers = value; + } + } + public bool EnableRegistrySource { get => _settings.EnableRegistrySource; diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj b/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj index dfbf54c3a..8f443214b 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj +++ b/Plugins/Flow.Launcher.Plugin.Shell/Flow.Launcher.Plugin.Shell.csproj @@ -12,8 +12,9 @@ true false false + en - + true portable @@ -24,7 +25,7 @@ 4 false - + pdbonly true @@ -39,13 +40,13 @@ - + PreserveNewest - + MSBuild:Compile @@ -56,9 +57,9 @@ PreserveNewest - + - - \ No newline at end of file + + diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml index ee473d80e..4e61940d1 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/it.xaml @@ -2,8 +2,8 @@ Sostituisci Win+R - Close Command Prompt after pressing any key - Press any key to close this window... + Chiudi il Prompt dei Comandi dopo aver premuto un tasto + Premi un tasto per chiudere questa finestra... Non chiudere il prompt dei comandi dopo l'esecuzione dei comandi Esegui sempre come amministratore Esegui come utente differente diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml index b7d02c558..bf3864c7b 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ru.xaml @@ -1,17 +1,17 @@  - Replace Win+R + Заменить Win+R Close Command Prompt after pressing any key Press any key to close this window... - Do not close Command Prompt after command execution - Always run as administrator + Не закрывать командную строку после выполнения команды + Всегда запускать с правами администратора Run as different user - Shell + Оболочка Allows to execute system commands from Flow Launcher - this command has been executed {0} times + эта команда была выполнена {0} раз execute command through command shell Run As Administrator - Copy the command - Only show number of most used commands: + Скопировать команду + Показывать только самые используемые команды: diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/vi.xaml new file mode 100644 index 000000000..22d909686 --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/vi.xaml @@ -0,0 +1,17 @@ + + + + Thay thế Win + R + Close Command Prompt after pressing any key + Press any key to close this window... + Không đóng dấu nhắc lệnh sau khi thực hiện lệnh + Luôn chạy với tư cách quản trị viên + Xóa lựa chọn đã chọn + Vỏ + Allows to execute system commands from Flow Launcher + lệnh này đã được thực thi {0} lần + thực thi lệnh thông qua lệnh shell + Chạy với quyền quản trị + Sao chép lệnh + Chỉ hiển thị số lượng lệnh được sử dụng nhiều nhất: + diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj b/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj index c7a722189..b797b3cf4 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj +++ b/Plugins/Flow.Launcher.Plugin.Sys/Flow.Launcher.Plugin.Sys.csproj @@ -12,8 +12,9 @@ true false false + en - + true portable @@ -24,7 +25,7 @@ 4 false - + pdbonly true @@ -39,7 +40,7 @@ - + MSBuild:Compile @@ -50,10 +51,10 @@ PreserveNewest - + PreserveNewest - \ No newline at end of file + diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml index 62d455c07..129c6a6fa 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/it.xaml @@ -5,25 +5,25 @@ Comando Descrizione - Shutdown - Restart - Restart With Advanced Boot Options - Log Off/Sign Out - Lock - Sleep - Hibernate - Index Option - Empty Recycle Bin - Open Recycle Bin + Spegni + Riavvia + Riavvia con Opzioni di Avvio Avanzate + Disconnetti + Blocca + Sospendi + Ibernazione + Opzioni di Indice + Svuota Cestino + Apri Cestino Esci - Save Settings + Salva Impostazioni Riavvia Flow Launcher Impostazioni Ricarica i dati del plugin - Check For Update - Open Log Location - Flow Launcher Tips - Flow Launcher UserData Folder + Controlla Aggiornamenti + Apri Posizione dei Log + Consigli di Flow Launcher + Cartella UserData di Flow Launcher Attiva/Disattiva Modalità Di Gioco diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/vi.xaml new file mode 100644 index 000000000..bb76debc3 --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/vi.xaml @@ -0,0 +1,63 @@ + + + + + Lệnh + Mô Tả + + Shutdown + Restart + Restart With Advanced Boot Options + Log Off/Sign Out + Lock + Sleep + Hibernate + Index Option + Empty Recycle Bin + Open Recycle Bin + Thoát + Save Settings + Bắt đầu Flow-Launcher + Cài đặt + Dữ liệu plugin không tải + Check For Update + Open Log Location + Flow Launcher Tips + Flow Launcher UserData Folder + Toggle Game Mode + + + shutdown máy tính + Khởi động lại máy tính + Khởi động lại máy tính với Tùy chọn khởi động nâng cao cho chế độ An toàn và Gỡ lỗi, cũng như các tùy chọn khác + Đăng xuất + Khóa máy tính này + Chào mừng bạn đến với Trình khởi chạy luồng + Bắt đầu Flow-Launcher + Tweak Flow Launcher's settings + Đặt máy tính vào chế độ ngủ + Dọn sạch thùng rác + Open recycle bin + Tùy chọn lập chỉ mục + Máy tính ngủ đông + Lưu tất cả cài đặt Flow Launcher + Làm mới dữ liệu plugin với nội dung mới + Mở vị trí nhật ký của Flow Launcher + Kiểm tra bản cập nhật Flow Launcher mới + Truy cập tài liệu của Flow Launcher để được trợ giúp thêm và cách sử dụng các mẹo + Mở vị trí lưu trữ cài đặt của Flow Launcher + Toggle Game Mode + + + Thành công + Đã lưu tất cả cài đặt của Flow Launcher + Đã tải lại tất cả dữ liệu plugin hiện hành + Bạn có chắc chắn muốn tắt máy tính không? + Bạn có chắc muốn khởi động lại cấp này? + Bạn có chắc chắn muốn khởi động lại máy tính bằng Advanced Boot Options không? + Are you sure you want to log off? + + Lệnh hệ thống + Cung cấp các lệnh liên quan đến Hệ thống. ví dụ. tắt máy, khóa, cài đặt, v.v. + + diff --git a/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj b/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj index c03acefae..3db0cd0cb 100644 --- a/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj +++ b/Plugins/Flow.Launcher.Plugin.Url/Flow.Launcher.Plugin.Url.csproj @@ -1,5 +1,5 @@  - + Library net7.0-windows @@ -11,8 +11,9 @@ true false false + en - + true portable @@ -23,7 +24,7 @@ 4 false - + pdbonly true @@ -33,7 +34,7 @@ 4 false - + PreserveNewest @@ -56,4 +57,4 @@ - \ No newline at end of file + diff --git a/Plugins/Flow.Launcher.Plugin.Url/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Url/Languages/ru.xaml index 418731021..5110f65ef 100644 --- a/Plugins/Flow.Launcher.Plugin.Url/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.Url/Languages/ru.xaml @@ -12,6 +12,6 @@ Open the typed URL from Flow Launcher Please set your browser path: - Choose + Выберите Application(*.exe)|*.exe|All files|*.* diff --git a/Plugins/Flow.Launcher.Plugin.Url/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Url/Languages/vi.xaml new file mode 100644 index 000000000..41f87fe19 --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.Url/Languages/vi.xaml @@ -0,0 +1,17 @@ + + + + Mở tìm kiếm + Cửa sổ mới + Tab mới + + Mở url:{0} + Không thể mở url:{0} + + Địa chỉ URL + Mở URL đã nhập từ Flow Launcher + + Vui lòng đặt đường dẫn trình duyệt của bạn: + Chọn + Ứng dụng(*.exe)|*.exe|Tất cả các tệp|*.* + diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml index 6be89607d..dc9bd7a2e 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/it.xaml @@ -1,7 +1,7 @@  - Search Source Setting + Impostazioni Sorgenti di Ricerca Apri ricerca in: Nuova Finestra Nuova Scheda @@ -12,40 +12,40 @@ Aggiungi Abilitato Abilitato - Disabled - Confirm - Action Keyword + Disabilitato + Conferma + Parola Chiave URL - Search - Use Search Query Autocomplete: - Autocomplete Data from: - Please select a web search + Cerca + Usa Autocompletamento Ricerca: + Autocompleta i dati da: + Seleziona una ricerca web Sei sicuro di voler eliminare {0}? - If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads + Se vuoi aggiungere una ricerca di un particolare sito web a Flow, prima immetti una stringa di testo fittizia nella barra di ricerca di quel sito web, e avvia la ricerca. Ora copia il contenuto della barra degli indirizzi del browser e incollalo nel campo URL sotto. Sostituisci la stringa di prova con {q}. Per esempio, se cerchi 'casino' su Netflix, sulla barra degli indirizzi ci sarà https://www.netflix.com/search?q=Casino - Now copy this entire string and paste it in the URL field below. - Then replace casino with {q}. - Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} + Ora copia l'intera stringa e incollala nel campo URL sotto. + Sostituisci 'casino' con {q}. + Così la formula generica per una ricerca su Netflix è https://www.netflix.com/search?q={q} - Title - Status - Select Icon - Icon + Titolo + Stato + Seleziona Icona + Icona Annulla - Invalid web search - Please enter a title - Please enter an action keyword - Please enter a URL - Action keyword already exists, please enter a different one + Ricerca web non valida + Inserisci un titolo + Inserisci una parola chiave + Inserisci un URL + La parola chiave esiste già, inserirne una diversa Successo - Hint: You do not need to place custom images in this directory, if Flow's version is updated they will be lost. Flow will automatically copy any images outside of this directory across to WebSearch's custom image location. + Suggerimento: Non è necessario inserire immagini personalizzate in questa cartella, se Flow viene aggiornato queste verranno perse. Flow copierà automaticamente tutte le immagini al di fuori di questa cartella nella posizione delle immagini personalizzate di WebSearch. - Web Searches - Allows to perform web searches + Ricerche Web + Consente di eseguire ricerche web diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml index fab878992..a2ec9405a 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ru.xaml @@ -5,8 +5,8 @@ Open search in: New Window New Tab - Set browser from path: - Choose + Установить браузер по пути: + Выберите Удалить Редактировать Добавить diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml new file mode 100644 index 000000000..a6de788b5 --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/vi.xaml @@ -0,0 +1,51 @@ + + + + Cài đặt nguồn tìm kiếm + Mở tìm kiếm + Cửa sổ mới + Tab mới + Đặt trình duyệt từ đường dẫn: + Chọn + Xóa + Sửa + Thêm + Đã bật + Đã bật + Vô hiệu hóa + Xác nhận + Từ khóa hành động + Địa chỉ URL + Tìm kiếm + Sử dụng Tự động hoàn thành truy vấn tìm kiếm: + Tự động hoàn thành dữ liệu từ: + Vui lòng chọn tìm kiếm trên web + Bạn có chắc chắn muốn xóa {0} không? + If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads + https://www.netflix.com/search?q=Casino + + Now copy this entire string and paste it in the URL field below. + Then replace casino with {q}. + Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} + + + + + + Tiêu đề + Trạng thái + Chọn Biểu tượng + Biểu tượng + Hủy + Tìm kiếm trên web không hợp lệ + Vui lòng nhập tiêu đề + Vui lòng nhập từ khóa hành động + Hãy nhập URL + Từ khóa hành động đã tồn tại, vui lòng nhập một từ khóa khác + Thành công + Gợi ý: Bạn không cần đặt hình ảnh tùy chỉnh trong thư mục này, nếu phiên bản của Flow được cập nhật, chúng sẽ bị mất. Flow sẽ tự động sao chép mọi hình ảnh bên ngoài thư mục này sang vị trí hình ảnh tùy chỉnh của WebSearch. + + Tìm kiếm Web + Cho phép thực hiện tìm kiếm trên web + + diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Flow.Launcher.Plugin.WindowsSettings.csproj b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Flow.Launcher.Plugin.WindowsSettings.csproj index 47ab3b2ba..73fcd9f83 100644 --- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Flow.Launcher.Plugin.WindowsSettings.csproj +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Flow.Launcher.Plugin.WindowsSettings.csproj @@ -9,6 +9,7 @@ prompt en-US enable + en @@ -68,4 +69,4 @@ - \ No newline at end of file + diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.it-IT.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.it-IT.resx index c0319e5fd..bcd3617ba 100644 --- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.it-IT.resx +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.it-IT.resx @@ -837,7 +837,7 @@ Modalità chiara - Location + Posizione Area Privacy diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.vi-VN.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.vi-VN.resx new file mode 100644 index 000000000..851470744 --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.vi-VN.resx @@ -0,0 +1,2515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Giới thiệu + Area System + + + truy cập.cpl + File name, Should not translated + + + Tùy chọn khả năng tiếp cận + Area Control Panel (legacy settings) + + + Ứng dụng phụ kiện + Area Privacy + + + Truy cập cơ quan hoặc trường học + Area UserAccounts + + + Thông tin tài khoản + Area Privacy + + + Tài khoản + Area SurfaceHub + + + Trung tâm thông báo + Area Control Panel (legacy settings) + + + Kích hoạt + Area UpdateAndSecurity + + + Lịch sử hoạt động + Area Privacy + + + Thêm phần cứng + Area Control Panel (legacy settings) + + + Thêm chương trình xóa + Area Control Panel (legacy settings) + + + Thêm điện thoại của bạn + Area Phone + + + Các công cụ quản trị + Area System + + + Cài đặt hiển thị nâng cao + Area System, only available on devices that support advanced display options + + + Đồ họa nâng cao + + + ID quảng cáo + Area Privacy, Deprecated in Windows 10, version 1809 and later + + + Chế độ trên máy bay + Area NetworkAndInternet + + + Alt-Tab thay thế cho phép tìm kiếm thông qua các cửa sổ của bạn. + Means the key combination "Tabulator+Alt" on the keyboard + + + Tên khác + + + Hình ảnh động + + + Màu ứng dụng + + + Chẩn đoán DM + Area Privacy + + + Tính năng ứng dụng + Area Apps + + + Ứng dụng + Short/modern name for application + + + Ứng dụng và tính năng + Area Apps + + + Thiết lập hệ thống + Type of the setting is a "Modern Windows settings". We use the same term as used in start menu search at the moment. + + + Ứng dụng cho trang web + Area Apps + + + Âm lượng của từng ứng dụng và tùy chọn thiết bị + Area System, Added in Windows 10, version 1903 + + + appwiz.cpl + File name, Should not translated + + + Khu vực + Mean the settings area or settings category + + + Tài khoản + + + Các công cụ quản trị + Area Control Panel (legacy settings) + + + Ngoại hình và cá nhân hóa + + + Ứng dụng + + + Đồng hồ và khu vực + + + Bảng điều khiển + + + Cortana + + + Thiết bị + + + Truy cập nhanh + + + Phụ trợ + + + Trò chơi + + + Phần cứng và âm thanh + + + Trang chủ + + + Thực tế hỗn hợp + + + Mạng và Internet + + + Cá nhân hóa + + + Điện thoại + + + Quyền riêng tư + + + Chương trình + + + SurfaceHub + + + Hệ thống + + + Hệ thống và bảo mật + + + Thời gian và ngôn ngữ + + + Cập nhật và bảo mật + + + Tài khoản người sử dụng + + + Quyền truy cập được chỉ định + + + Âm thanh + Area EaseOfAccess + + + Cảnh báo âm thanh + + + Âm thanh và lời nói + Area MixedReality, only available if the Mixed Reality Portal app is installed. + + + Tải tập tin tự động + Area Privacy + + + Tự động phát + Area Device + + + Nền + Area Personalization + + + Ứng dụng nền + Area Privacy + + + Sao lưu + Area UpdateAndSecurity + + + Sao lưu và Khôi phục + Area Control Panel (legacy settings) + + + Trình tiết kiệm pin + Area System, only available on devices that have a battery, such as a tablet + + + Cài đặt tiết kiệm pin + Area System, only available on devices that have a battery, such as a tablet + + + Chi tiết sử dụng trình tiết kiệm pin + + + Sử dụng Pin + Area System, only available on devices that have a battery, such as a tablet + + + Thiết bị sinh trắc học + Area Control Panel (legacy settings) + + + Mã hóa ổ đĩa BitLocker + Area Control Panel (legacy settings) + + + Xanh dương (sáng) + + + Bluetooth + Area Device + + + Thiết bị Bluetooth + Area Control Panel (legacy settings) + + + Xanh lam – vàng + + + Bopomofo IME + Area TimeAndLanguage + + + bpmf + Should not translated + + + Đang phát sóng + Area Gaming + + + Lịch + Area Privacy + + + Lịch sử cuộc gọi + Area Privacy + + + đang gọi + + + Máy ảnh + Area Privacy + + + Cangjie IME + Area TimeAndLanguage + + + Caps Lock + Mean the "Caps Lock" key + + + Di động và SIM + Area NetworkAndInternet + + + Chọn thư mục nào xuất hiện trên Bắt đầu + Area Personalization + + + Dịch vụ khách hàng cho NetWare + Area Control Panel (legacy settings) + + + Nhận văn bản từ bảng nhớ tạm. + Area System + + + Phụ đề chi tiết + Area EaseOfAccess + + + Bộ lọc màu + Area EaseOfAccess + + + Quản lý màu sắc + Area Control Panel (legacy settings) + + + Màu + Area Personalization + + + Lệnh + The command to direct start a setting + + + Các thiết bị đã kết nối + Area Device + + + Danh bạ + Area Privacy + + + Bảng điều khiển + Type of the setting is a "(legacy) Control Panel setting" + + + Sao chép lệnh + + + Cách ly lõi + Means the protection of the system core + + + Cortana + Area Cortana + + + Cortana trên các thiết bị của tôi + Area Cortana + + + Cortana - Ngôn ngữ + Area Cortana + + + Người quản lý thông tin xác thực + Area Control Panel (legacy settings) + + + Thiết bị chéo + + + Thiết bị tùy chỉnh + + + Màu tối + + + Chế độ tối + + + Sử dụng dữ liệu + Area NetworkAndInternet + + + Ngày và giờ + Area TimeAndLanguage + + + Ứng dụng mặc định + Area Apps + + + Camera mặc định + Area Device + + + Vị trí mặc định + Area Control Panel (legacy settings) + + + Chương trình mặc định + Area Control Panel (legacy settings) + + + Vị trí mặc định + Area System + + + Delivery Optimization + Area UpdateAndSecurity + + + desk.cpl + File name, Should not translated + + + Desktop themes + Area Control Panel (legacy settings) + + + Mù màu Deuteranopia + Medical: Mean you don't can see red colors + + + Quản lý thiết bị + Area Control Panel (legacy settings) + + + Devices and printers + Area Control Panel (legacy settings) + + + DHCP + Should not translated + + + Dial-up + Area NetworkAndInternet + + + Truy cập thẳng + Area NetworkAndInternet, only available if DirectAccess is enabled + + + Direct open your phone + Area EaseOfAccess + + + Hiển thị + Area EaseOfAccess + + + Hiển thị thuộc tính + Area Control Panel (legacy settings) + + + DNS + Should not translated + + + Tài liệu + Area Privacy + + + Duplicating my display + Area System + + + During these hours + Area System + + + Ease of access center + Area Control Panel (legacy settings) + + + Bản in + Means the "Windows Edition" + + + Email + Area Privacy + + + Email and app accounts + Area UserAccounts + + + Mã hóa + Area System + + + Môi trường + Area MixedReality, only available if the Mixed Reality Portal app is installed. + + + Ethernet + Area NetworkAndInternet + + + Exploit Protection + + + Phụ trợ + Area Extra, , only used for setting of 3rd-Party tools + + + Eye control + Area EaseOfAccess + + + Eye tracker + Area Privacy, requires eyetracker hardware + + + Family and other people + Area UserAccounts + + + Feedback and diagnostics + Area Privacy + + + Tệp tin hệ thống + Area Privacy + + + FindFast + Area Control Panel (legacy settings) + + + findfast.cpl + File name, Should not translated + + + Tìm thiết bị + Area UpdateAndSecurity + + + Tường lửa + + + Focus assist - Quiet hours + Area System + + + Focus assist - Quiet moments + Area System + + + Tùy chọn thư mục + Area Control Panel (legacy settings) + + + Phông chữ + Area EaseOfAccess + + + Dành cho nhà phát triển + Area UpdateAndSecurity + + + Game bar + Area Gaming + + + Trình điều khiển trò chơi + Area Control Panel (legacy settings) + + + Game DVR + Area Gaming + + + Chế độ trò chơi + Area Gaming + + + Cổng + Should not translated + + + Tổng quan + Area Privacy + + + Get programs + Area Control Panel (legacy settings) + + + Bắt đầu + Area Control Panel (legacy settings) + + + Ánh Nhìn + Area Personalization, Deprecated in Windows 10, version 1809 and later + + + Cài đặt đồ họa + Area System + + + Thang độ xám + + + Green week + Mean you don't can see green colors + + + Headset display + Area MixedReality, only available if the Mixed Reality Portal app is installed. + + + Độ tương phản cao + Area EaseOfAccess + + + Holographic audio + + + Holographic Environment + + + Holographic Headset + + + Holographic Management + + + Home group + Area Control Panel (legacy settings) + + + Mã ID + MEans The "Windows Identifier" + + + Hình ảnh + + + Tùy chọn lập chỉ mục + Area Control Panel (legacy settings) + + + inetcpl.cpl + File name, Should not translated + + + Hồng ngoại + Area Control Panel (legacy settings) + + + Inking and typing + Area Privacy + + + Tùy chọn Internet + Area Control Panel (legacy settings) + + + intl.cpl + File name, Should not translated + + + Đảo ngược màu + + + IP + Should not translated + + + Isolated Browsing + + + Japan IME settings + Area TimeAndLanguage, available if the Microsoft Japan input method editor is installed + + + joy.cpl + File name, Should not translated + + + Joystick properties + Area Control Panel (legacy settings) + + + jpnime + Should not translated + + + Bàn phím + Area EaseOfAccess + + + Bàn phím số + + + Keys + + + Ngôn ngữ + Area TimeAndLanguage + + + Màu sắc đèn + + + Chế độ sáng + + + Vị trí + Area Privacy + + + Khoá màn hình + Area Personalization + + + Phóng + Area EaseOfAccess + + + Mail - Microsoft Exchange or Windows Messaging + Area Control Panel (legacy settings) + + + main.cpl + File name, Should not translated + + + Manage known networks + Area NetworkAndInternet + + + Manage optional features + Area Apps + + + Tin nhắn + Area Privacy + + + Metered connection + + + Micro điện thoại + Area Privacy + + + Microsoft Mail Post Office + Area Control Panel (legacy settings) + + + mlcfg32.cpl + File name, Should not translated + + + mmsys.cpl + File name, Should not translated + + + Thiết bị di động + + + Điểm phát sóng di động + Area NetworkAndInternet + + + modem.cpl + File name, Should not translated + + + Đơn âm + + + Xem chi tiết + Area Cortana + + + Chuyển động + Area Privacy + + + Chuột + Area EaseOfAccess + + + Mouse and touchpad + Area Device + + + Mouse, Fonts, Keyboard, and Printers properties + Area Control Panel (legacy settings) + + + Con trỏ chuột + Area EaseOfAccess + + + Multimedia properties + Area Control Panel (legacy settings) + + + Đa nhiệm + Area System + + + Người dẫn chuyện + Area EaseOfAccess + + + Thanh điều hướng + Area Personalization + + + netcpl.cpl + File name, Should not translated + + + netsetup.cpl + File name, Should not translated + + + Mạng + Area NetworkAndInternet + + + Network and sharing center + Area Control Panel (legacy settings) + + + Kết nối mạng + Area Control Panel (legacy settings) + + + Network properties + Area Control Panel (legacy settings) + + + Network Setup Wizard + Area Control Panel (legacy settings) + + + Trạng thái mạng + Area NetworkAndInternet + + + NFC + Area NetworkAndInternet + + + NFC Transactions + "NFC should not translated" + + + Chế độ đêm + + + Night light settings + Area System + + + Ghi chú + + + Chỉ khả dụng khi bạn đã kết nối thiết bị di động với thiết bị của mình. + + + Chỉ khả dụng trên các thiết bị hỗ trợ tùy chọn đồ họa nâng cao. + + + Chỉ khả dụng trên các thiết bị có pin, chẳng hạn như máy tính bảng. + + + Không được dùng nữa trong Windows 10, phiên bản 1809 (bản dựng 17763) trở lên. + + + Only available if Dial is paired. + + + Only available if DirectAccess is enabled. + + + Chỉ khả dụng trên các thiết bị hỗ trợ tùy chọn đồ họa nâng cao. + + + Only present if user is enrolled in WIP. + + + Requires eyetracker hardware. + + + Available if the Microsoft Japan input method editor is installed. + + + Available if the Microsoft Pinyin input method editor is installed. + + + Available if the Microsoft Wubi input method editor is installed. + + + Only available if the Mixed Reality Portal app is installed. + + + Only available on mobile and if the enterprise has deployed a provisioning package. + + + Added in Windows 10, version 1903 (build 18362). + + + Added in Windows 10, version 2004 (build 19041). + + + Only available if "settings apps" are installed, for example, by a 3rd party. + + + Only available if touchpad hardware is present. + + + Only available if the device has a Wi-Fi adapter. + + + Device must be Windows Anywhere-capable. + + + Only available if enterprise has deployed a provisioning package. + + + Thông báo + Area Privacy + + + Hành động thông báo + Area System + + + Num Lock + Mean the "Num Lock" key + + + nwc.cpl + File name, Should not translated + + + odbccp32.cpl + File name, Should not translated + + + ODBC Data Source Administrator (32-bit) + Area Control Panel (legacy settings) + + + ODBC Data Source Administrator (64-bit) + Area Control Panel (legacy settings) + + + Offline files + Area Control Panel (legacy settings) + + + Bàn đồ ngoại tuyến + Area Apps + + + Offline Maps - Download maps + Area Apps + + + On-Screen + + + Hệ điều hành + Means the "Operating System" + + + thiết bị khác + Area Privacy + + + Tùy chọn khác + Area EaseOfAccess + + + Người dùng khác + + + Kiểm soát phụ huynh + Area Control Panel (legacy settings) + + + Mật khẩu + + + password.cpl + File name, Should not translated + + + Password properties + Area Control Panel (legacy settings) + + + Pen and input devices + Area Control Panel (legacy settings) + + + Pen and touch + Area Control Panel (legacy settings) + + + Pen and Windows Ink + Area Device + + + Ghép đôi người xung quanh + Area Control Panel (legacy settings) + + + Performance information and tools + Area Control Panel (legacy settings) + + + Permissions and history + Area Cortana + + + Personalization (category) + Area Personalization + + + Điện thoại + Area Phone + + + Phone and modem + Area Control Panel (legacy settings) + + + Phone and modem - Options + Area Control Panel (legacy settings) + + + Phone calls + Area Privacy + + + Phone - Default apps + Area System + + + Picture + + + Hình ảnh + Area Privacy + + + Pinyin IME settings + Area TimeAndLanguage, available if the Microsoft Pinyin input method editor is installed + + + Pinyin IME settings - domain lexicon + Area TimeAndLanguage + + + Pinyin IME settings - Key configuration + Area TimeAndLanguage + + + Pinyin IME settings - UDP + Area TimeAndLanguage + + + Playing a game full screen + Area Gaming + + + Plugin to search for Windows settings + + + Windows Settings + + + Power and sleep + Area System + + + powercfg.cpl + File name, Should not translated + + + Tùy chọn chế độ Nguồn + Area Control Panel (legacy settings) + + + Trình bày + + + Máy in + Area Control Panel (legacy settings) + + + Printers and scanners + Area Device + + + chụp màn hình + Mean the "Print screen" key + + + Problem reports and solutions + Area Control Panel (legacy settings) + + + Vi xử lý + + + Programs and features + Area Control Panel (legacy settings) + + + Projecting to this PC + Area System + + + Mù màu Protanopia + Medical: Mean you don't can see green colors + + + Đang cấp phép + Area UserAccounts, only available if enterprise has deployed a provisioning package + + + Cảm ứng tiệm cận + Area NetworkAndInternet + + + Proxy + Area NetworkAndInternet + + + Quickime + Area TimeAndLanguage + + + Quiet moments game + + + Radio + Area Privacy + + + RAM + Means the Read-Access-Memory (typical the used to inform about the size) + + + Sự công nhận + + + Phục Hồi + Area UpdateAndSecurity + + + Red eye + Mean red eye effect by over-the-night flights + + + Đỏ – xanh lục + Mean the weakness you can't differ between red and green colors + + + Red week + Mean you don't can see red colors + + + Khu vực + Area TimeAndLanguage + + + Khu vực, ngôn ngữ + Area TimeAndLanguage + + + Regional settings properties + Area Control Panel (legacy settings) + + + Khu vực, ngôn ngữ + Area Control Panel (legacy settings) + + + Region formatting + + + RemoteApp and desktop connections + Area Control Panel (legacy settings) + + + VNC + Area System + + + Scanners and cameras + Area Control Panel (legacy settings) + + + schedtasks + File name, Should not translated + + + Lịch trình + + + Hoạt động theo lịch trình + Area Control Panel (legacy settings) + + + Xoay màn hình + Area System + + + Thanh cuộn + + + Khóa cuộn + Mean the "Scroll Lock" key + + + SDNS + Should not translated + + + Searching Windows + Area Cortana + + + SecureDNS + Should not translated + + + Security Center + Area Control Panel (legacy settings) + + + Security Processor + + + Session cleanup + Area SurfaceHub + + + Settings home page + Area Home, Overview-page for all areas of settings + + + Set up a kiosk + Area UserAccounts + + + Shared experiences + Area System + + + Shortcuts + + + wifi + dont translate this, is a short term to find entries + + + Sign-in options + Area UserAccounts + + + Sign-in options - Dynamic lock + Area UserAccounts + + + Kích thước + Size for text and symbols + + + Âm thanh + Area System + + + Nói + + Area EaseOfAccess + + + Nhận dạng tiếng nói + Area Control Panel (legacy settings) + + + Speech typing + + + Start + Area Personalization + + + Start places + + + Startup apps + Area Apps + + + sticpl.cpl + File name, Should not translated + + + Storage + Area System + + + Storage policies + Area System + + + Storage Sense + Area System + + + in + Example: Area "System" in System settings + + + Sync center + Area Control Panel (legacy settings) + + + Sync your settings + Area UserAccounts + + + sysdm.cpl + File name, Should not translated + + + Hệ thống + Area Control Panel (legacy settings) + + + System properties and Add New Hardware wizard + Area Control Panel (legacy settings) + + + Tab + Means the key "Tabulator" on the keyboard + + + Tablet mode + Area System + + + Tablet PC settings + Area Control Panel (legacy settings) + + + Talk + + + Talk to Cortana + Area Cortana + + + Thanh tác vụ + Area Personalization + + + Taskbar color + + + Công việc + Area Privacy + + + Web Conferencing + Area SurfaceHub + + + Team device management + Area SurfaceHub + + + Văn bản thành giọng nói + Area Control Panel (legacy settings) + + + Giao diện + Area Personalization + + + themes.cpl + File name, Should not translated + + + timedate.cpl + File name, Should not translated + + + Dòng thời gian + + + Chạm + + + Phản hồi khi chạm + + + Touchpad + Area Device + + + Minh bạch + + + Mù màu lam + Medical: Mean you don't can see yellow and blue colors + + + Khắc phục sự cố + Area UpdateAndSecurity + + + TruePlay + Area Gaming + + + Đang nhập + Area Device + + + Gỡ cài đặt + Area MixedReality, only available if the Mixed Reality Portal app is installed. + + + USB + Area Device + + + Tài khoản người sử dụng + Area Control Panel (legacy settings) + + + Phiên bản + Means The "Windows Version" + + + Phát lại video + Area Apps + + + Video + Area Privacy + + + Máy ảo + + + Virus + Means the virus in computers and software + + + giọng nói "gây nghiện" + Area Privacy + + + Âm lượng + + + VPN + Area NetworkAndInternet + + + Hình nền + + + Warmer color + + + Welcome center + Area Control Panel (legacy settings) + + + Màn hình chào mừng + Area SurfaceHub + + + wgpocpl.cpl + File name, Should not translated + + + Bánh xe + Area Device + + + Wifi + Area NetworkAndInternet, only available if Wi-Fi calling is enabled + + + Gọi qua Wi-Fi + Area NetworkAndInternet, only available if Wi-Fi calling is enabled + + + Cài đặt WiFi + "Wi-Fi" should not translated + + + chế độ cửa sổ + + + Windows Anytime Upgrade + Area Control Panel (legacy settings) + + + Windows Anywhere + Area UserAccounts, device must be Windows Anywhere-capable + + + Windows CardSpace + Area Control Panel (legacy settings) + + + Windows Defender + Area Control Panel (legacy settings) + + + Windows Firewall + Area Control Panel (legacy settings) + + + Windows Hello setup - Face + Area UserAccounts + + + Windows Hello setup - Fingerprint + Area UserAccounts + + + Windows Insider Program + Area UpdateAndSecurity + + + Windows Mobility Center + Area Control Panel (legacy settings) + + + Windows search + Area Cortana + + + Windows Security + Area UpdateAndSecurity + + + Windows Update + Area UpdateAndSecurity + + + Windows Update - Advanced options + Area UpdateAndSecurity + + + Windows Update - Check for updates + Area UpdateAndSecurity + + + Windows Update - Restart options + Area UpdateAndSecurity + + + Windows Update - View optional updates + Area UpdateAndSecurity + + + Windows Update - View update history + Area UpdateAndSecurity + + + Wireless + + + Workplace + + + Workplace provisioning + Area UserAccounts + + + Wubi IME settings + Area TimeAndLanguage, available if the Microsoft Wubi input method editor is installed + + + Wubi IME settings - UDP + Area TimeAndLanguage + + + Xbox Networking + Area Gaming + + + Your info + Area UserAccounts + + + Zoom + Mean zooming of things via a magnifier + + + Change device installation settings + + + Turn off background images + + + Navigation properties + + + Media streaming options + + + Make a file type always open in a specific program + + + Change the Narrator’s voice + + + Find and fix keyboard problems + + + Use screen reader + + + Show which workgroup this computer is on + + + Change mouse wheel settings + + + Manage computer certificates + + + Find and fix problems + + + Change settings for content received using Tap and send + + + Change default settings for media or devices + + + Print the speech reference card + + + Calibrate display colour + + + Manage file encryption certificates + + + View recent messages about your computer + + + Give other users access to this computer + + + Show hidden files and folders + + + Change Windows To Go start-up options + + + See which processes start up automatically when you start Windows + + + Tell if an RSS feed is available on a website + + + Add clocks for different time zones + + + Add a Bluetooth device + + + Customise the mouse buttons + + + Set tablet buttons to perform certain tasks + + + View installed fonts + + + Change the way currency is displayed + + + Edit group policy + + + Manage browser add-ons + + + Check processor speed + + + Check firewall status + + + Send or receive a file + + + Add or remove user accounts + + + Edit the system environment variables + + + Manage BitLocker + + + Auto-hide the taskbar + + + Change sound card settings + + + Make changes to accounts + + + Edit local users and groups + + + View network computers and devices + + + Install a program from the network + + + View scanners and cameras + + + Microsoft IME Register Word (Japanese) + + + Restore your files with File History + + + Turn On-Screen keyboard on or off + + + Block or allow third-party cookies + + + Find and fix audio recording problems + + + Create a recovery drive + + + Microsoft New Phonetic Settings + + + Generate a system health report + + + Fix problems with your computer + + + Back up and Restore (Windows 7) + + + Preview, delete, show or hide fonts + + + Microsoft Quick Settings + + + View reliability history + + + Access RemoteApp and desktops + + + Set up ODBC data sources + + + Reset Security Policies + + + Block or allow pop-ups + + + Turn autocomplete in Internet Explorer on or off + + + Microsoft Pinyin SimpleFast Options + + + Change what closing the lid does + + + Turn off unnecessary animations + + + Create a restore point + + + Turn off automatic window arrangement + + + Troubleshooting History + + + Diagnose your computer's memory problems + + + View recommended actions to keep Windows running smoothly + + + Change cursor blink rate + + + Add or remove programs + + + Create a password reset disk + + + Configure advanced user profile properties + + + Start or stop using AutoPlay for all media and devices + + + Change Automatic Maintenance settings + + + Specify single- or double-click to open + + + Select users who can use remote desktop + + + Show which programs are installed on your computer + + + Allow remote access to your computer + + + View advanced system settings + + + How to install a program + + + Change how your keyboard works + + + Automatically adjust for daylight saving time + + + Change the order of Windows SideShow gadgets + + + Check keyboard status + + + Control the computer without the mouse or keyboard + + + Change or remove a program + + + Change multi-touch gesture settings + + + Set up ODBC data sources (64-bit) + + + Configure proxy server + + + Change your homepage + + + Group similar windows on the taskbar + + + Change Windows SideShow settings + + + Use audio description for video + + + Change workgroup name + + + Find and fix printing problems + + + Change when the computer sleeps + + + Set up a virtual private network (VPN) connection + + + Accommodate learning abilities + + + Set up a dial-up connection + + + Set up a connection or network + + + How to change your Windows password + + + Make it easier to see the mouse pointer + + + Set up iSCSI initiator + + + Accommodate low vision + + + Manage offline files + + + Review your computer's status and resolve issues + + + Microsoft ChangJie Settings + + + Replace sounds with visual cues + + + Change temporary Internet file settings + + + Connect to the Internet + + + Find and fix audio playback problems + + + Change the mouse pointer display or speed + + + Back up your recovery key + + + Save backup copies of your files with File History + + + View current accessibility settings + + + Change tablet pen settings + + + Change how your mouse works + + + Show how much RAM is on this computer + + + Edit power plan + + + Adjust system volume + + + Defragment and optimise your drives + + + Set up ODBC data sources (32-bit) + + + Change Font Settings + + + Magnify portions of the screen using Magnifier + + + Change the file type associated with a file extension + + + View event logs + + + Manage Windows Credentials + + + Set up a microphone + + + Change how the mouse pointer looks + + + Change power-saving settings + + + Optimise for blindness + + + + + + + Turn Windows features on or off + + + Show which operating system your computer is running + + + View local services + + + Manage Work Folders + + + Encrypt your offline files + + + Train the computer to recognise your voice + + + Advanced printer setup + + + Change default printer + + + Edit environment variables for your account + + + Optimise visual display + + + Change mouse click settings + + + Change advanced colour management settings for displays, scanners and printers + + + Let Windows suggest Ease of Access settings + + + Clear disk space by deleting unnecessary files + + + View devices and printers + + + Private Character Editor + + + Record steps to reproduce a problem + + + Adjust the appearance and performance of Windows + + + Settings for Microsoft IME (Japanese) + + + Invite someone to connect to your PC and help you, or offer to help someone else + + + Run programs made for previous versions of Windows + + + Choose the order of how your screen rotates + + + Change how Windows searches + + + Set flicks to perform certain tasks + + + Change account type + + + Change screen saver + + + Change User Account Control settings + + + Turn on easy access keys + + + Identify and repair network problems + + + Find and fix networking and connection problems + + + Play CDs or other media automatically + + + View basic information about your computer + + + Choose how you open links + + + Allow Remote Assistance invitations to be sent from this computer + + + Task Manager + + + Turn flicks on or off + + + Add a language + + + View network status and tasks + + + Turn Magnifier on or off + + + See the name of this computer + + + View network connections + + + Perform recommended maintenance tasks automatically + + + Manage disk space used by your offline files + + + Turn High Contrast on or off + + + Change the way time is displayed + + + Change how web pages are displayed in tabs + + + Change the way dates and lists are displayed + + + Manage audio devices + + + Change security settings + + + Check security status + + + Delete cookies or temporary files + + + Specify which hand you write with + + + Change touch input settings + + + How to change the size of virtual memory + + + Hear text read aloud with Narrator + + + Set up USB game controllers + + + Show which domain your computer is on + + + View all problem reports + + + 16-Bit Application Support + + + Set up dialling rules + + + Enable or disable session cookies + + + Give administrative rights to a domain user + + + Choose when to turn off display + + + Move the pointer with the keypad using MouseKeys + + + Change Windows SideShow-compatible device settings + + + Adjust commonly used mobility settings + + + Change text-to-speech settings + + + Set the time and date + + + Change location settings + + + Change mouse settings + + + Manage Storage Spaces + + + Show or hide file extensions + + + Allow an app through Windows Firewall + + + Change system sounds + + + Adjust ClearType text + + + Turn screen saver on or off + + + Find and fix windows update problems + + + Change Bluetooth settings + + + Connect to a network + + + Change the search provider in Internet Explorer + + + Join a domain + + + Add a device + + + Find and fix problems with Windows Search + + + Choose a power plan + + + Change how the mouse pointer looks when it’s moving + + + Uninstall a program + + + Create and format hard disk partitions + + + Change date, time or number formats + + + Change PC wake-up settings + + + Manage network passwords + + + Change input methods + + + Manage advanced sharing settings + + + Change battery settings + + + Rename this computer + + + Lock or unlock the taskbar + + + Manage Web Credentials + + + Change the time zone + + + Start speech recognition + + + View installed updates + + + What's happened to the Quick Launch toolbar? + + + Change search options for files and folders + + + Adjust settings before giving a presentation + + + Scan a document or picture + + + Change the way measurements are displayed + + + Press key combinations one at a time + + + Khôi phục dữ liệu, tập tin hoặc máy tính từ bản sao lưu (Windows 7) + + + Set your default programs + + + Set up a broadband connection + + + Calibrate the screen for pen or touch input + + + Manage user certificates + + + Schedule tasks + + + Ignore repeated keystrokes using FilterKeys + + + Find and fix bluescreen problems + + + Hear a tone when keys are pressed + + + Delete browsing history + + + Change what the power buttons do + + + Create standard user account + + + Take speech tutorials + + + View system resource usage in Task Manager + + + Create an account + + + Get more features with a new edition of Windows + + + Bảng điều khiển + + + TaskLink + + + Unknown + + \ No newline at end of file diff --git a/Settings.XamlStyler b/Settings.XamlStyler new file mode 100644 index 000000000..7ea0744f1 --- /dev/null +++ b/Settings.XamlStyler @@ -0,0 +1,42 @@ +{ + "AttributesTolerance": 2, + "KeepFirstAttributeOnSameLine": false, + "MaxAttributeCharactersPerLine": 0, + "MaxAttributesPerLine": 1, + "NewlineExemptionElements": "RadialGradientBrush, GradientStop, LinearGradientBrush, ScaleTransform, SkewTransform, RotateTransform, TranslateTransform, Trigger, Condition, Setter", + "SeparateByGroups": false, + "AttributeIndentation": 0, + "AttributeIndentationStyle": 1, + "RemoveDesignTimeReferences": false, + "IgnoreDesignTimeReferencePrefix": false, + "EnableAttributeReordering": true, + "AttributeOrderingRuleGroups": [ + "x:Class", + "xmlns, xmlns:x", + "xmlns:*", + "x:Key, Key, x:Name, Name, x:Uid, Uid, Title", + "Grid.Row, Grid.RowSpan, Grid.Column, Grid.ColumnSpan, Canvas.Left, Canvas.Top, Canvas.Right, Canvas.Bottom", + "Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight", + "Margin, Padding, HorizontalAlignment, VerticalAlignment, HorizontalContentAlignment, VerticalContentAlignment, Panel.ZIndex", + "*:*, *", + "PageSource, PageIndex, Offset, Color, TargetName, Property, Value, StartPoint, EndPoint", + "mc:Ignorable, d:IsDataSource, d:LayoutOverrides, d:IsStaticText", + "Storyboard.*, From, To, Duration" + ], + "FirstLineAttributes": "", + "OrderAttributesByName": true, + "PutEndingBracketOnNewLine": false, + "RemoveEndingTagOfEmptyElement": true, + "SpaceBeforeClosingSlash": true, + "RootElementLineBreakRule": 0, + "ReorderVSM": 2, + "ReorderGridChildren": false, + "ReorderCanvasChildren": false, + "ReorderSetters": 0, + "FormatMarkupExtension": true, + "NoNewLineMarkupExtensions": "x:Bind, Binding", + "ThicknessSeparator": 1, + "ThicknessAttributes": "Margin, Padding, BorderThickness, ThumbnailClipMargin, CornerRadius", + "FormatOnSave": true, + "CommentPadding": 2, +}