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 opensSound Effect VolumeAdjust 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.AnimationUse Animation in UIAnimation Speed
@@ -170,14 +171,37 @@
HotkeyHotkeys
- Flow Launcher Hotkey
+ Open Flow LauncherEnter shortcut to show/hide Flow Launcher.
- Preview Hotkey
+ Toggle PreviewEnter shortcut to show/hide preview in search window.
+ Hotkey Presets
+ List of currently registered hotkeysOpen Result Modifier KeySelect a modifier key to open selected result via keyboard.Show HotkeyShow 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 HotkeysCustom Query ShortcutsBuilt-in Shortcuts
@@ -188,6 +212,7 @@
DeleteEditAdd
+ NonePlease select an itemAre 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 hotkeyInvalid plugin hotkeyUpdate
+ 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
+ DeleteVersion
@@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Open Setting WindowReload Plugin Data
+ Select first result
+ Select last result
+ Run current query again
+ Open result
+ Open result #{0}
+
WeatherWeather 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 VolumeAdjust 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.AnimacePoužít animaci v UIRychlost animace
@@ -170,14 +171,37 @@
Klávesová zkratkaKlávesové zkratky
- Klávesová zkratka pro Flow Launcher
+ Open Flow LauncherZadejte zkratku pro zobrazení/skrytí nástroje Flow Launcher.
- Klávesová zkratka pro náhled
+ Toggle PreviewZadejte klávesovou zkratku pro zobrazení/skrytí náhledu v okně vyhledávání.
+ Hotkey Presets
+ List of currently registered hotkeysModifikač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 zkratkuZobrazí 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 @@
SmazatEditovatPřidat
+ NoneVyberte prosím položkuJste 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 zkratkuNeplatná klávesová zkratka pluginuAktualizovat
+ 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
+ SmazatVerze
@@ -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ímZnovu 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 opensSound Effect VolumeAdjust 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.AnimationUse Animation in UIAnimation Speed
@@ -170,14 +171,37 @@
GenvejstastGenvejstast
- Flow Launcher genvejstast
+ Open Flow LauncherEnter shortcut to show/hide Flow Launcher.
- Preview Hotkey
+ Toggle PreviewEnter shortcut to show/hide preview in search window.
+ Hotkey Presets
+ List of currently registered hotkeysÅbn resultatmodifikatorerSelect a modifier key to open selected result via keyboard.Vis hotkeyShow 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øgegenvejstastCustom Query ShortcutBuilt-in Shortcut
@@ -188,6 +212,7 @@
SletRedigerTilføj
+ NoneVælg venligstEr 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 genvejstastUgyldig plugin genvejstastOpdater
+ 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
+ SletVersion
@@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Open Setting WindowReload Plugin Data
+ Select first result
+ Select last result
+ Run current query again
+ Open result
+ Open result #{0}
+
WeatherWeather 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 wirdSound Effect VolumeAdjust 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.AnimationAnimationen in der Oberfläche verwendenAnimation Speed
@@ -170,14 +171,37 @@
TastenkombinationTastenkombination
- Flow Launcher Tastenkombination
+ Open Flow LauncherVerknüpfung eingeben, um Flow Launcher anzuzeigen/auszublenden.
- Preview Hotkey
+ Toggle PreviewEnter shortcut to show/hide preview in search window.
+ Hotkey Presets
+ List of currently registered hotkeysÖffnen Sie die ErgebnismodifikatorenWählen Sie eine Modifikatortaste, um das ausgewählte Ergebnis über die Tastatur zu öffnen.Hotkey anzeigenHotkey 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 TastenkombinationCustom Query ShortcutBuilt-in Shortcut
@@ -188,6 +212,7 @@
LöschenBearbeitenHinzufügen
+ NoneBitte einen Eintrag auswählenWollen 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 TastenkombinationUngültige Plugin TastenkombinationAktualisieren
+ 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öschenVersion
@@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Einstellungsfenster öffnenPlugin-Daten neu laden
+ Select first result
+ Select last result
+ Run current query again
+ Open result
+ Open result #{0}
+
WetterWetter 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 QuerySelect last QueryEmpty last Query
+ Fixed Window Height
+ The window height will not be resizeable by draggingMaximum results shownYou 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 PrecisionChanges minimum match score required for results.
+ None
+ Low
+ RegularSearch with PinyinAllows 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 userProcessKillerTerminate unwanted processes
+ Search Bar Height
+ Item HeightQuery Box Font
- Result Item Font
+ Result Title Font
+ Result Subtitle Font
+ Reset
+ CustomizeWindow ModeOpacityTheme {0} not exists, fallback to default theme
@@ -158,6 +168,7 @@
Play a small sound when the search window opensSound Effect VolumeAdjust 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.AnimationUse Animation in UIAnimation Speed
@@ -169,6 +180,7 @@
ClockDate
+
HotkeyHotkeys
@@ -188,6 +200,8 @@
Select Previous ItemNext PagePrevious Page
+ Cycle Previous Query
+ Cycle Next QueryOpen Context MenuOpen Setting WindowCopy File Path
@@ -414,4 +428,8 @@
snSticky 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úsquedaSound Effect VolumeAdjust 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ónUsar Animación en la InterfazAnimation Speed
@@ -170,14 +171,37 @@
Tecla RápidaTecla Rápida
- Tecla de acceso a Flow Launcher
+ Open Flow LauncherIntroduzca el acceso directo para mostrar/ocultar Flow Launcher.
- Preview Hotkey
+ Toggle PreviewEnter shortcut to show/hide preview in search window.
+ Hotkey Presets
+ List of currently registered hotkeysAbrir Tecla de Modificación de ResultadoSeleccione una tecla de modificación para abrir el resultado seleccionado vía teclado.Mostrar tecla de acceso directoMostrar 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 PersonalizadaCustom Query ShortcutBuilt-in Shortcut
@@ -188,6 +212,7 @@
EliminarEditarAñadir
+ NonePor 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 directoTecla de acceso directo al plugin inválidaActualizar
+ 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
+ EliminarVersión
@@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Abrir Ventana de AjustesRecargar Datos del Plugin
+ Select first result
+ Select last result
+ Run current query again
+ Open result
+ Open result #{0}
+
ClimaClima 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úsquedaVolumen del efecto de sonidoAjusta 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ónUsa animación en la Interfaz de UsuarioVelocidad de animación
@@ -170,14 +171,37 @@
Atajo de tecladoAtajos de teclado
- Atajo de teclado de Flow Launcher
+ Abrir Flow LauncherIntroduzca el atajo de teclado para mostrar/ocultar Flow Launcher.
- Acceso directo para vista previa
+ Cambiar vista previaIntroduzca 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 registradosTecla modificadora para abrir resultadoSeleccione una tecla modificadora para abrir el resultado seleccionado con el teclado.Mostrar atajo de tecladoMuestra 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 personalizadaAccesos directos de consulta personalizadaAccesos directos integrados
@@ -188,6 +212,7 @@
EliminarEditarAñadir
+ NingunoPor 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 nuevoAtajo de teclado de complemento no válidoActualizar
+ 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
+ EliminarVersión
@@ -368,6 +402,12 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci
Abrir ventana de configuraciónRecargar datos del complemento
+ Seleccionar primer resultado
+ Seleccionar último resultado
+ Ejecutar consulta actual de nuevo
+ Abrir resultado
+ Abrir resultado #{0}
+
El tiempoEl 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 fichiersRecherche WebRecherchez sur le Web avec la prise en charge de moteurs de recherche différents
- Programme
+ ProgrammesLancez des programmes en tant qu'administrateur ou un utilisateur différentTueur de processusTerminer les processus non désirés
@@ -156,6 +156,7 @@
Jouer un petit son lorsque la fenêtre de recherche s'ouvreVolume de l'effet sonoreAjuster 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.AnimationUtiliser l'animation dans l'interfaceVitesse d'animation
@@ -172,12 +173,35 @@
RaccourcisOuvrir Flow LauncherEntrez le raccourci pour afficher/masquer Flow Launcher.
- Prévisualiser le raccourci
+ Afficher/masquer l'aperçuEntrez 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ésModificateurs de résultats ouvertsSélectionnez une touche de modification pour ouvrir le résultat sélectionné via le clavier.Afficher le raccourci clavierAfficher 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éesCustom Query ShortcutBuilt-in Shortcut
@@ -188,6 +212,7 @@
SupprimerModifierAjouter
+ AucunVeuillez sélectionner un élémentVoulez-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 invalideActualiser
+ 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
+ SupprimerVersion
@@ -367,6 +401,12 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu
Ouvrir la Fenêtre des RéglagesRecharger 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éoMé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 @@
ScuroEffetto sonoroRiproduce 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.AnimazioneUsa l'animazione nell'interfaccia utenteVelocità di animazione
@@ -170,14 +171,37 @@
Tasti scelta rapidaTasti scelta rapida
- Tasto scelta rapida Flow Launcher
+ Apri Flow LauncherImmettere la scorciatoia per mostrare/nascondere Flow Launcher.
- Anteprima Scorciatoia
+ Attiva/Disattiva AnteprimaInserisci la scorciatoia per mostrare/nascondere l'anteprima nella finestra di ricerca.
+ Preimpostazioni Scorciatoie
+ Elenco di scorciatoie attualmente registrateApri modificatori di risultatoSeleziona un tasto modificatore per aprire il risultato selezionato via tastiera.Mostra tasto di scelta rapidaMostra 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 personalizzateCustom Query ShortcutBuilt-in Shortcut
@@ -188,6 +212,7 @@
CancellaModificaAggiungi
+ VuotoSelezionare un oggettoVolete 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 rapidaTasto di scelta rapida plugin non validoAggiorna
+ 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
+ CancellaVersione
@@ -368,6 +402,12 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde
Aprire la finestra delle impostazioniRicarica i dati del plugin
+ Seleziona il primo risultato
+ Seleziona l'ultimo risultato
+ Esegui nuovamente la ricerca corrente
+ Apri risultato
+ Apri risultato #{0}
+
MeteoMeteo 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 PriorityNew Priority重要度
- Change Plugin Results Priority
+ プラグインの結果の優先度を変更します。プラグイン・ディレクトリby初期化時間:
@@ -115,69 +115,93 @@
Recently UpdatedプラグインInstalled
- Refresh
- Install
+ 更新
+ インストールアンインストール更新Plugin already installedNew VersionThis 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 PreviewEnter 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 ShortcutBuilt-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}
+
WeatherWeather 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 VolumeAdjust 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 LauncherFlow 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 opensSound Effect VolumeAdjust 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.AnimationUse Animation in UIAnimation Speed
@@ -170,14 +171,37 @@
HotkeyHotkeys
- Flow Launcher Hotkey
+ Open Flow LauncherEnter shortcut to show/hide Flow Launcher.
- Preview Hotkey
+ Toggle PreviewEnter shortcut to show/hide preview in search window.
+ Hotkey Presets
+ List of currently registered hotkeysOpen Result Modifier KeySelect a modifier key to open selected result via keyboard.Show HotkeyShow 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 HotkeysCustom Query ShortcutsBuilt-in Shortcuts
@@ -188,6 +212,7 @@
DeleteEditAdd
+ NonePlease select an itemAre 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 hotkeyInvalid plugin hotkeyUpdate
+ 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
+ DeleteVersion
@@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Open Setting WindowReload Plugin Data
+ Select first result
+ Select last result
+ Run current query again
+ Open result
+ Open result #{0}
+
WeatherWeather 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 @@
PluginsInstalledVernieuwen
- Install
+ InstallerenUninstallUpdatePlugin already installed
@@ -156,6 +156,7 @@
Een klein geluid afspelen wanneer het zoekvenster wordt geopendSound Effect VolumeAdjust 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.AnimatieAnimatie gebruiken in UIAnimation Speed
@@ -170,35 +171,59 @@
SneltoetsSneltoets
- Flow Launcher Sneltoets
+ Open Flow LauncherVoer snelkoppeling in om Flow Launcher te tonen/verbergen.
- Preview Hotkey
+ Toggle PreviewEnter shortcut to show/hide preview in search window.
+ Hotkey Presets
+ List of currently registered hotkeysOpen resultaatmodificatorenKies een aanpassingstoets om het geselecteerde resultaat te openen via het toetsenbord.Sneltoets weergevenShow 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 SneltoetsCustom Query ShortcutBuilt-in Shortcut
- Query
+ ZoekopdrachtShortcutExpansionBeschrijvingVerwijderBewerkenToevoegen
+ NoneSelecteer een itemWeet 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 SizeYou 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 ondersteundPress Key
@@ -253,7 +278,7 @@
Arg For File
- Default Web Browser
+ Standaard webbrowserThe default setting follows the OS default browser setting. If specified separately, flow uses that browser.BrowserBrowser Name
@@ -286,6 +311,11 @@
Sneltoets is niet beschikbaar, selecteer een nieuwe sneltoetsOngeldige plugin sneltoetsUpdate
+ 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
+ VerwijderVersie
@@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Open Setting WindowReload Plugin Data
+ Select first result
+ Select last result
+ Run current query again
+ Open result
+ Open result #{0}
+
WeatherWeather 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 wyszukiwaniaSound Effect VolumeAdjust 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.AnimacjaUżyj animacji w interfejsie użytkownikaSzybkość animacji
@@ -170,14 +171,37 @@
Skrót klawiszowySkrót klawiszowy
- Skrót klawiszowy Flow Launcher
+ Open Flow LauncherWprowadź skrót, aby pokazać/ukryć Flow Launcher.
- Podgląd skrótu
+ Toggle PreviewWprowadź skrót, aby pokazać/ukryć podgląd w oknie wyszukiwania.
+ Hotkey Presets
+ List of currently registered hotkeysModyfikatory klawiszów otwierających wynikiSelect a modifier key to open selected result via keyboard.Pokaż skrót klawiszowyShow 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 ShortcutBuilt-in Shortcut
@@ -188,6 +212,7 @@
UsuńEdytujDodaj
+ NoneMusisz 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 klawiszowyNiepoprawny skrót klawiszowyAktualizuj
+ 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
+ UsuWersja
@@ -368,6 +402,12 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d
Open Setting WindowReload Plugin Data
+ Select first result
+ Select last result
+ Run current query again
+ Open result
+ Open result #{0}
+
WeatherWeather 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 pesquisaSound Effect VolumeAdjust 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çãoUtilizar Animação na InterfaceVelocidade de Animação
@@ -170,14 +171,37 @@
AtalhoAtalho
- Atalho do Flow Launcher
+ Open Flow LauncherDigite o atalho para exibir/ocultar o Flow Launcher.
- Atalho de pré-visualização
+ Toggle PreviewDigite o atalho para exibir/ocultar a pré-visualização na janela de pesquisa.
+ Hotkey Presets
+ List of currently registered hotkeysModificadores de resultado abertoSelecione uma tecla modificadora para abrir o resultar selecionado pelo teclado.Mostrar tecla de atalhoExibir 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 PersonalizadaCustom Query ShortcutBuilt-in Shortcut
@@ -188,6 +212,7 @@
ApagarEditarAdicionar
+ NonePor favor selecione um itemTem 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 outroAtalho de plugin inválidoAtualizar
+ 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
+ ApagarVersão
@@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Abrir Janela de ConfiguraçõesRecarregar Dados de Plugin
+ Select first result
+ Select last result
+ Run current query again
+ Open result
+ Open result #{0}
+
ClimaClima 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 pesquisaVolume dos efeitos sonorosAjustar 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çãoUtilizar animações na aplicaçãoVelocidade da animação
@@ -170,14 +171,37 @@
Tecla de atalhoTeclas de atalho
- Tecla de atalho Flow Launcher
+ Abrir Flow LauncherIntroduza o atalho para mostrar/ocultar Flow Launcher
- Preview Hotkey
+ Comutar pré-visualizaçãoIntroduza o atalho para mostrar/ocultar a pré-visualização na janela de pesquisa.
+ Predefinições de teclas de atalho
+ Listagem de teclas de atalho registadasTecla modificadora para os resultadosSelecione a tecla modificadora para abrir o resultado com o tecladoMostrar tecla de atalhoMostrar 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 personalizadasAtalhos de consultas personalizadasAtalhos nativos
@@ -188,6 +212,7 @@
EliminarEditarAdicionar
+ NenhumaSelecione um itemTem 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 outraTecla de atalho inválidaAtualizar
+ 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
+ EliminarVersão
@@ -367,6 +401,12 @@ Queira por favor mover a pasta do seu perfil de {0} para {1}
Abrir janela de definiçõesRecarregar dados do plugin
+ Selecionar primeiro resultado
+ Selecionar último resultado
+ Executar consulta novamente
+ Abrir resultado
+ Abrir resultado #{0}
+
MeteorologiaMeteorologia 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 zvukHlasitosť zvukového efektuUpraviť 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áciaAnimovať používateľské rozhranieRýchlosť animácie
@@ -170,14 +171,37 @@
Klávesové skratkyKlávesové skratky
- Klávesová skratka pre Flow Launcher
+ Otvoriť Flow LauncherZadajte skratku na zobrazenie/skrytie Flow Launchera.
- Klávesová skratka pre náhľad
+ Prepnúť náhľadZadajte 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 skratiekModifikačný kláves na otvorenie výsledkovVyberte modifikačný kláves na otvorenie vybraného výsledku pomocou klávesnice.Zobraziť klávesovú skratkuZobrazí 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ávaniaKlávesové skratky vlastného dopytuVstavané skratky
@@ -188,8 +212,9 @@
OdstrániťUpraviťPridať
+ ŽiadnaVyberte 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ú skratkuNeplatná klávesová skratka pluginuAktualizovať
+ 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 nastaveniamiZnova 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časiePoč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 opensSound Effect VolumeAdjust 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.AnimationUse Animation in UIAnimation Speed
@@ -170,14 +171,37 @@
PrečicaPrečica
- Flow Launcher prečica
+ Open Flow LauncherEnter shortcut to show/hide Flow Launcher.
- Preview Hotkey
+ Toggle PreviewEnter 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 upitCustom Query ShortcutBuilt-in Shortcut
@@ -188,6 +212,7 @@
ObrišiIzmeniDodaj
+ NoneMolim Vas izaberite stavkuDa 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čicuNepravlna prečica za pluginAž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šiVerzija
@@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Open Setting WindowReload Plugin Data
+ Select first result
+ Select last result
+ Run current query again
+ Open result
+ Open result #{0}
+
WeatherWeather 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 oynatSound Effect VolumeAdjust 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.AnimasyonArayüzde Animasyon KullanAnimation Speed
@@ -170,14 +171,37 @@
Kısayol TuşuKısayol Tuşu
- Flow Launcher Kısayolu
+ Open Flow LauncherEnter shortcut to show/hide Flow Launcher.
- Preview Hotkey
+ Toggle PreviewEnter shortcut to show/hide preview in search window.
+ Hotkey Presets
+ List of currently registered hotkeysAçık Sonuç DeğiştiricileriSelect a modifier key to open selected result via keyboard.Kısayol Tuşunu GösterShow 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 ShortcutBuilt-in Shortcut
@@ -188,6 +212,7 @@
SilDüzenleEkle
+ NoneLü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çinGeçersiz eklenti kısayol tuşuGü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
+ SilSürüm
@@ -368,6 +402,12 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
Open Setting WindowReload Plugin Data
+ Select first result
+ Select last result
+ Run current query again
+ Open result
+ Open result #{0}
+
WeatherWeather 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 VolumeAdjust 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 PreviewEnter 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/Resources/Controls/InstalledPluginDisplay.xaml.cs b/Flow.Launcher/Resources/Controls/InstalledPluginDisplay.xaml.cs
new file mode 100644
index 000000000..dfa03a204
--- /dev/null
+++ b/Flow.Launcher/Resources/Controls/InstalledPluginDisplay.xaml.cs
@@ -0,0 +1,9 @@
+namespace Flow.Launcher.Resources.Controls;
+
+public partial class InstalledPluginDisplay
+{
+ public InstalledPluginDisplay()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/Flow.Launcher/Resources/CustomControlTemplate.xaml b/Flow.Launcher/Resources/CustomControlTemplate.xaml
index 2ce53bfdb..a53e61f8c 100644
--- a/Flow.Launcher/Resources/CustomControlTemplate.xaml
+++ b/Flow.Launcher/Resources/CustomControlTemplate.xaml
@@ -45,7 +45,7 @@
-
+
+
@@ -867,7 +1029,7 @@
Grid.Row="1"
Grid.Column="0"
Margin="{TemplateBinding Padding}"
- Padding="0,0,32,0"
+ Padding="0 0 32 0"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Foreground="{TemplateBinding ui:ControlHelper.PlaceholderForeground}"
@@ -887,7 +1049,7 @@
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="2"
- Margin="0,0,0,0"
+ Margin="0 0 0 0"
Padding="{DynamicResource ComboBoxEditableTextPadding}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
@@ -906,7 +1068,7 @@
Grid.Row="1"
Grid.Column="1"
Width="30"
- Margin="0,1,1,1"
+ Margin="0 1 1 1"
HorizontalAlignment="Right"
Background="Transparent"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
@@ -917,7 +1079,7 @@
Grid.Row="1"
Grid.Column="1"
MinHeight="{DynamicResource ComboBoxMinHeight}"
- Margin="0,0,10,0"
+ Margin="0 0 10 0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Data="{StaticResource ChevronDown}"
@@ -944,7 +1106,7 @@
-
+
@@ -1063,7 +1225,7 @@
-
+
@@ -1073,7 +1235,7 @@
-
+
@@ -1083,7 +1245,7 @@
-
+
@@ -1121,7 +1283,7 @@
x:Key="DataGridComboBoxStyle"
BasedOn="{StaticResource DefaultComboBoxStyle}"
TargetType="ComboBox">
-
+
@@ -1133,7 +1295,7 @@
x:Key="DataGridTextBlockComboBoxStyle"
BasedOn="{StaticResource DefaultComboBoxStyle}"
TargetType="ComboBox">
-
+
@@ -1362,7 +1524,7 @@
-
+
@@ -1394,7 +1556,7 @@
BasedOn="{StaticResource DefaultTextBoxStyle}"
TargetType="TextBox">
-
+
@@ -1487,10 +1649,11 @@
0.1,0.9 0.2,1.0
+
+
+
+ 48
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/Resources/Dark.xaml b/Flow.Launcher/Resources/Dark.xaml
index 740024ede..16e29a8e9 100644
--- a/Flow.Launcher/Resources/Dark.xaml
+++ b/Flow.Launcher/Resources/Dark.xaml
@@ -1034,7 +1034,8 @@
-
+
+
diff --git a/Flow.Launcher/Resources/Light.xaml b/Flow.Launcher/Resources/Light.xaml
index fe0f2dbe1..91cbc6cbb 100644
--- a/Flow.Launcher/Resources/Light.xaml
+++ b/Flow.Launcher/Resources/Light.xaml
@@ -1031,7 +1031,8 @@
-
+
+
diff --git a/Flow.Launcher/Resources/MarkupExtensions/CollapsedWhenExtension.cs b/Flow.Launcher/Resources/MarkupExtensions/CollapsedWhenExtension.cs
new file mode 100644
index 000000000..cdcd49339
--- /dev/null
+++ b/Flow.Launcher/Resources/MarkupExtensions/CollapsedWhenExtension.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Windows;
+using System.Windows.Data;
+using System.Windows.Markup;
+
+namespace Flow.Launcher.Resources.MarkupExtensions;
+
+#nullable enable
+
+public class CollapsedWhenExtension : MarkupExtension {
+ private Binding? When { get; set; }
+ public object? IsEqualTo { get; set; }
+
+ public bool? IsEqualToBool
+ {
+ get => IsEqualTo switch
+ {
+ bool b => b,
+ _ => null
+ };
+ set => IsEqualTo = value;
+ }
+
+ public int? IsEqualToInt
+ {
+ get => IsEqualTo switch
+ {
+ int i => i,
+ _ => null
+ };
+ set => IsEqualTo = value;
+ }
+
+ protected virtual Visibility DefaultVisibility => Visibility.Visible;
+ protected virtual Visibility InvertedVisibility => Visibility.Collapsed;
+
+ public CollapsedWhenExtension(Binding when)
+ {
+ When = when;
+ }
+
+ public override object ProvideValue(IServiceProvider serviceProvider) {
+ if (serviceProvider.GetService(typeof(IProvideValueTarget)) is not IProvideValueTarget provideValueTarget)
+ return DependencyProperty.UnsetValue;
+
+ if (provideValueTarget is not { TargetObject: not null, TargetProperty: not null })
+ return DependencyProperty.UnsetValue;
+
+
+ if (When is null)
+ return DependencyProperty.UnsetValue;
+
+ if (IsEqualTo is Binding isEqualToBinding)
+ {
+ var multiBinding = new MultiBinding
+ {
+ Converter = new HideableVisibilityConverter
+ {
+ DefaultVisibility = DefaultVisibility,
+ InvertedVisibility = InvertedVisibility
+ },
+ Bindings = { When, isEqualToBinding }
+ };
+
+ return multiBinding.ProvideValue(serviceProvider);
+ }
+
+ When.Converter = new HideableVisibilityConverter
+ {
+ DefaultVisibility = DefaultVisibility,
+ InvertedVisibility = InvertedVisibility,
+ IsEqualTo = IsEqualTo
+ };
+ return When.ProvideValue(serviceProvider);
+ }
+}
diff --git a/Flow.Launcher/Resources/MarkupExtensions/HideableVisibilityConverter.cs b/Flow.Launcher/Resources/MarkupExtensions/HideableVisibilityConverter.cs
new file mode 100644
index 000000000..e7d1fc6ea
--- /dev/null
+++ b/Flow.Launcher/Resources/MarkupExtensions/HideableVisibilityConverter.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Globalization;
+using System.Windows;
+using System.Windows.Data;
+
+namespace Flow.Launcher.Resources.MarkupExtensions;
+
+#nullable enable
+
+public class HideableVisibilityConverter : IMultiValueConverter, IValueConverter {
+ public Visibility DefaultVisibility { get; init; } = Visibility.Visible;
+ public Visibility InvertedVisibility { get; init; } = Visibility.Collapsed;
+
+ public object? IsEqualTo { get; set; }
+
+ public object Convert(object?[] values, Type targetType, object? parameter, CultureInfo culture) {
+ if (values is not { Length: 2 })
+ return DependencyProperty.UnsetValue;
+
+ var value1 = values[0];
+ var value2 = values[1];
+ if (value1 is Enum enum1 && value2 is Enum enum2)
+ {
+ value1 = System.Convert.ToInt32(enum1);
+ value2 = System.Convert.ToInt32(enum2);
+ }
+
+ return Equals(value1, value2) ? InvertedVisibility : DefaultVisibility;
+ }
+
+ public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ return Equals(value, IsEqualTo) ? InvertedVisibility : DefaultVisibility;
+ }
+
+ public object[] ConvertBack(object? value, Type[] targetTypes, object? parameter, CultureInfo culture) {
+ throw new NotSupportedException();
+ }
+
+ public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ throw new NotSupportedException();
+ }
+}
diff --git a/Flow.Launcher/Resources/MarkupExtensions/VisibleWhenExtension.cs b/Flow.Launcher/Resources/MarkupExtensions/VisibleWhenExtension.cs
new file mode 100644
index 000000000..b5cc26ae5
--- /dev/null
+++ b/Flow.Launcher/Resources/MarkupExtensions/VisibleWhenExtension.cs
@@ -0,0 +1,14 @@
+using System.Windows;
+using System.Windows.Data;
+
+namespace Flow.Launcher.Resources.MarkupExtensions;
+
+#nullable enable
+
+public class VisibleWhenExtension : CollapsedWhenExtension
+{
+ protected override Visibility DefaultVisibility => Visibility.Collapsed;
+ protected override Visibility InvertedVisibility => Visibility.Visible;
+
+ public VisibleWhenExtension(Binding when) : base(when) { }
+}
diff --git a/Flow.Launcher/Resources/SettingWindowStyle.xaml b/Flow.Launcher/Resources/SettingWindowStyle.xaml
new file mode 100644
index 000000000..2c73094c7
--- /dev/null
+++ b/Flow.Launcher/Resources/SettingWindowStyle.xaml
@@ -0,0 +1,413 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/ResultListBox.xaml b/Flow.Launcher/ResultListBox.xaml
index ba4c9e9a4..38202fcf3 100644
--- a/Flow.Launcher/ResultListBox.xaml
+++ b/Flow.Launcher/ResultListBox.xaml
@@ -48,7 +48,6 @@
Margin="0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
- Cursor="Hand"
UseLayoutRounding="False">
@@ -173,8 +172,10 @@
-
+
diff --git a/Flow.Launcher/SettingPages/ViewModels/DropdownDataGeneric.cs b/Flow.Launcher/SettingPages/ViewModels/DropdownDataGeneric.cs
new file mode 100644
index 000000000..15a814436
--- /dev/null
+++ b/Flow.Launcher/SettingPages/ViewModels/DropdownDataGeneric.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using Flow.Launcher.Core.Resource;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.SettingPages.ViewModels;
+
+public class DropdownDataGeneric : BaseModel where TValue : Enum
+{
+ public string Display { get; set; }
+ public TValue Value { get; private init; }
+ private string LocalizationKey { get; init; }
+
+ public static List
GetValues
(string keyPrefix) where TR : DropdownDataGeneric, new()
+ {
+ var data = new List
();
+ var enumValues = (TValue[])Enum.GetValues(typeof(TValue));
+
+ foreach (var value in enumValues)
+ {
+ var key = keyPrefix + value;
+ var display = InternationalizationManager.Instance.GetTranslation(key);
+ data.Add(new TR { Display = display, Value = value, LocalizationKey = key });
+ }
+
+ return data;
+ }
+
+ public static void UpdateLabels
(List
options) where TR : DropdownDataGeneric
+ {
+ foreach (var item in options)
+ {
+ item.Display = InternationalizationManager.Instance.GetTranslation(item.LocalizationKey);
+ }
+ }
+}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
new file mode 100644
index 000000000..b6563d3e5
--- /dev/null
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneAboutViewModel.cs
@@ -0,0 +1,134 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Core;
+using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Core.Resource;
+using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.SettingPages.ViewModels;
+
+public partial class SettingsPaneAboutViewModel : BaseModel
+{
+ private readonly Settings _settings;
+ private readonly Updater _updater;
+
+ public string LogFolderSize
+ {
+ get
+ {
+ var size = GetLogFiles().Sum(file => file.Length);
+ return $"{InternationalizationManager.Instance.GetTranslation("clearlogfolder")} ({BytesToReadableString(size)})";
+ }
+ }
+
+ 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 => Constant.Version switch
+ {
+ "1.0.0" => Constant.Dev,
+ _ => Constant.Version
+ };
+
+ public string ActivatedTimes => string.Format(
+ InternationalizationManager.Instance.GetTranslation("about_activate_times"),
+ _settings.ActivateTimes
+ );
+
+ public SettingsPaneAboutViewModel(Settings settings, Updater updater)
+ {
+ _settings = settings;
+ _updater = updater;
+ }
+
+ [RelayCommand]
+ private void OpenWelcomeWindow()
+ {
+ var window = new WelcomeWindow(_settings);
+ window.ShowDialog();
+ }
+
+ [RelayCommand]
+ private void AskClearLogFolderConfirmation()
+ {
+ var confirmResult = MessageBox.Show(
+ InternationalizationManager.Instance.GetTranslation("clearlogfolderMessage"),
+ InternationalizationManager.Instance.GetTranslation("clearlogfolder"),
+ MessageBoxButton.YesNo
+ );
+
+ if (confirmResult == MessageBoxResult.Yes)
+ {
+ ClearLogFolder();
+ }
+ }
+
+ [RelayCommand]
+ private void OpenSettingsFolder()
+ {
+ PluginManager.API.OpenDirectory(Path.Combine(DataLocation.DataDirectory(), Constant.Settings));
+ }
+
+ [RelayCommand]
+ private void OpenLogsFolder()
+ {
+ App.API.OpenDirectory(GetLogDir(Constant.Version).FullName);
+ }
+
+ [RelayCommand]
+ private Task UpdateApp() => _updater.UpdateAppAsync(App.API, false);
+
+ private 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(LogFolderSize));
+ }
+
+ 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();
+ }
+
+ private static string BytesToReadableString(long bytes)
+ {
+ const int scale = 1024;
+ string[] orders = { "GB", "MB", "KB", "B" };
+ long max = (long)Math.Pow(scale, orders.Length - 1);
+
+ foreach (string order in orders)
+ {
+ if (bytes > max)
+ return $"{decimal.Divide(bytes, max):##.##} {order}";
+
+ max /= scale;
+ }
+
+ return "0 B";
+ }
+
+}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
new file mode 100644
index 000000000..99aafc8e6
--- /dev/null
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
@@ -0,0 +1,217 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Core;
+using Flow.Launcher.Core.Configuration;
+using Flow.Launcher.Core.Resource;
+using Flow.Launcher.Helper;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+using Flow.Launcher.Plugin.SharedModels;
+
+namespace Flow.Launcher.SettingPages.ViewModels;
+
+public partial class SettingsPaneGeneralViewModel : BaseModel
+{
+ public Settings Settings { get; }
+ private readonly Updater _updater;
+ private readonly IPortable _portable;
+
+ public SettingsPaneGeneralViewModel(Settings settings, Updater updater, IPortable portable)
+ {
+ Settings = settings;
+ _updater = updater;
+ _portable = portable;
+ UpdateEnumDropdownLocalizations();
+ }
+
+ public class SearchWindowScreenData : DropdownDataGeneric { }
+ public class SearchWindowAlignData : DropdownDataGeneric { }
+ public class SearchPrecisionData : DropdownDataGeneric { }
+ public class LastQueryModeData : DropdownDataGeneric { }
+
+ 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);
+ }
+ }
+ }
+
+
+ public List SearchWindowScreens { get; } =
+ DropdownDataGeneric.GetValues("SearchWindowScreen");
+
+ public List SearchWindowAligns { get; } =
+ DropdownDataGeneric.GetValues("SearchWindowAlign");
+
+ public List SearchPrecisionScores { get; } =
+ DropdownDataGeneric.GetValues("SearchPrecision");
+
+ public List ScreenNumbers
+ {
+ get
+ {
+ var screens = Screen.AllScreens;
+ var screenNumbers = new List();
+ for (int i = 1; i <= screens.Length; i++)
+ {
+ screenNumbers.Add(i);
+ }
+
+ return screenNumbers;
+ }
+ }
+
+ // 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();
+ }
+ }
+ }
+
+ public List LastQueryModes { get; } =
+ DropdownDataGeneric.GetValues("LastQuery");
+
+ private void UpdateEnumDropdownLocalizations()
+ {
+ DropdownDataGeneric.UpdateLabels(SearchWindowScreens);
+ DropdownDataGeneric.UpdateLabels(SearchWindowAligns);
+ DropdownDataGeneric.UpdateLabels(SearchPrecisionScores);
+ DropdownDataGeneric.UpdateLabels(LastQueryModes);
+ }
+
+ public string Language
+ {
+ get => Settings.Language;
+ set
+ {
+ InternationalizationManager.Instance.ChangeLanguage(value);
+
+ if (InternationalizationManager.Instance.PromptShouldUsePinyin(value))
+ ShouldUsePinyin = true;
+
+ UpdateEnumDropdownLocalizations();
+ }
+ }
+
+ public bool ShouldUsePinyin
+ {
+ get => Settings.ShouldUsePinyin;
+ set => Settings.ShouldUsePinyin = value;
+ }
+
+ public List Languages => InternationalizationManager.Instance.LoadAvailableLanguages();
+
+ public string AlwaysPreviewToolTip => string.Format(
+ InternationalizationManager.Instance.GetTranslation("AlwaysPreviewToolTip"),
+ Settings.PreviewHotkey
+ );
+
+ private string GetFileFromDialog(string title, string filter = "")
+ {
+ var dlg = new OpenFileDialog
+ {
+ InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
+ Multiselect = false,
+ CheckFileExists = true,
+ CheckPathExists = true,
+ Title = title,
+ Filter = filter
+ };
+
+ return dlg.ShowDialog() switch
+ {
+ DialogResult.OK => dlg.FileName,
+ _ => string.Empty
+ };
+ }
+
+ private void UpdateApp()
+ {
+ _ = _updater.UpdateAppAsync(App.API, false);
+ }
+
+ public bool AutoUpdates
+ {
+ get => Settings.AutoUpdates;
+ set
+ {
+ Settings.AutoUpdates = value;
+
+ if (value)
+ {
+ UpdateApp();
+ }
+ }
+ }
+
+ [RelayCommand]
+ private void SelectPython()
+ {
+ var selectedFile = GetFileFromDialog(
+ InternationalizationManager.Instance.GetTranslation("selectPythonExecutable"),
+ "Python|pythonw.exe"
+ );
+
+ if (!string.IsNullOrEmpty(selectedFile))
+ Settings.PluginSettings.PythonExecutablePath = selectedFile;
+ }
+
+ [RelayCommand]
+ private void SelectNode()
+ {
+ var selectedFile = GetFileFromDialog(
+ InternationalizationManager.Instance.GetTranslation("selectNodeExecutable"),
+ "*.exe"
+ );
+
+ if (!string.IsNullOrEmpty(selectedFile))
+ Settings.PluginSettings.NodeExecutablePath = selectedFile;
+ }
+
+ [RelayCommand]
+ private void SelectFileManager()
+ {
+ var fileManagerChangeWindow = new SelectFileManagerWindow(Settings);
+ fileManagerChangeWindow.ShowDialog();
+ }
+
+ [RelayCommand]
+ private void SelectBrowser()
+ {
+ var browserWindow = new SelectBrowserWindow(Settings);
+ browserWindow.ShowDialog();
+ }
+}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs
new file mode 100644
index 000000000..7eb05d945
--- /dev/null
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs
@@ -0,0 +1,134 @@
+using System.Windows;
+using CommunityToolkit.Mvvm.Input;
+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;
+
+namespace Flow.Launcher.SettingPages.ViewModels;
+
+public partial class SettingsPaneHotkeyViewModel : BaseModel
+{
+ public Settings Settings { get; }
+
+ public CustomPluginHotkey SelectedCustomPluginHotkey { get; set; }
+ public CustomShortcutModel SelectedCustomShortcut { get; set; }
+
+ public string[] OpenResultModifiersList => new[]
+ {
+ KeyConstant.Alt,
+ KeyConstant.Ctrl,
+ $"{KeyConstant.Ctrl}+{KeyConstant.Alt}"
+ };
+
+ public SettingsPaneHotkeyViewModel(Settings settings)
+ {
+ Settings = settings;
+ }
+
+ [RelayCommand]
+ private void SetTogglingHotkey(HotkeyModel hotkey)
+ {
+ HotKeyMapper.SetHotkey(hotkey, HotKeyMapper.OnToggleHotkey);
+ }
+
+ [RelayCommand]
+ private void CustomHotkeyDelete()
+ {
+ var item = SelectedCustomPluginHotkey;
+ if (item is null)
+ {
+ MessageBox.Show(InternationalizationManager.Instance.GetTranslation("pleaseSelectAnItem"));
+ return;
+ }
+
+ var result = MessageBox.Show(
+ string.Format(
+ InternationalizationManager.Instance.GetTranslation("deleteCustomHotkeyWarning"), item.Hotkey
+ ),
+ InternationalizationManager.Instance.GetTranslation("delete"),
+ MessageBoxButton.YesNo
+ );
+
+ if (result is MessageBoxResult.Yes)
+ {
+ Settings.CustomPluginHotkeys.Remove(item);
+ HotKeyMapper.RemoveHotkey(item.Hotkey);
+ }
+ }
+
+ [RelayCommand]
+ private void CustomHotkeyEdit()
+ {
+ var item = SelectedCustomPluginHotkey;
+ if (item is null)
+ {
+ MessageBox.Show(InternationalizationManager.Instance.GetTranslation("pleaseSelectAnItem"));
+ return;
+ }
+
+ var window = new CustomQueryHotkeySetting(null, Settings);
+ window.UpdateItem(item);
+ window.ShowDialog();
+ }
+
+ [RelayCommand]
+ private void CustomHotkeyAdd()
+ {
+ new CustomQueryHotkeySetting(null, Settings).ShowDialog();
+ }
+
+ [RelayCommand]
+ private void CustomShortcutDelete()
+ {
+ var item = SelectedCustomShortcut;
+ if (item is null)
+ {
+ MessageBox.Show(InternationalizationManager.Instance.GetTranslation("pleaseSelectAnItem"));
+ return;
+ }
+
+ var result = MessageBox.Show(
+ string.Format(
+ InternationalizationManager.Instance.GetTranslation("deleteCustomShortcutWarning"), item.Key, item.Value
+ ),
+ InternationalizationManager.Instance.GetTranslation("delete"),
+ MessageBoxButton.YesNo
+ );
+
+ if (result is MessageBoxResult.Yes)
+ {
+ Settings.CustomShortcuts.Remove(item);
+ }
+ }
+
+ [RelayCommand]
+ private void CustomShortcutEdit()
+ {
+ var item = SelectedCustomShortcut;
+ if (item is null)
+ {
+ MessageBox.Show(InternationalizationManager.Instance.GetTranslation("pleaseSelectAnItem"));
+ return;
+ }
+
+ var window = new CustomShortcutSetting(item.Key, item.Value);
+ if (window.ShowDialog() is not true) return;
+
+ var index = Settings.CustomShortcuts.IndexOf(item);
+ Settings.CustomShortcuts[index] = new CustomShortcutModel(window.Key, window.Value);
+ }
+
+ [RelayCommand]
+ private void CustomShortcutAdd()
+ {
+ var window = new CustomShortcutSetting(null);
+ if (window.ShowDialog() is true)
+ {
+ var shortcut = new CustomShortcutModel(window.Key, window.Value);
+ Settings.CustomShortcuts.Add(shortcut);
+ }
+ }
+}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
new file mode 100644
index 000000000..e06931011
--- /dev/null
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginStoreViewModel.cs
@@ -0,0 +1,37 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Core.ExternalPlugins;
+using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Plugin;
+using Flow.Launcher.ViewModel;
+
+namespace Flow.Launcher.SettingPages.ViewModels;
+
+public partial class SettingsPanePluginStoreViewModel : BaseModel
+{
+ public string FilterText { get; set; } = string.Empty;
+
+ public IList ExternalPlugins => PluginsManifest.UserPlugins
+ .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();
+
+ [RelayCommand]
+ private async Task RefreshExternalPluginsAsync()
+ {
+ await PluginsManifest.UpdateManifestAsync();
+ OnPropertyChanged(nameof(ExternalPlugins));
+ }
+
+ public bool SatisfiesFilter(PluginStoreItemViewModel plugin)
+ {
+ return string.IsNullOrEmpty(FilterText) ||
+ StringMatcher.FuzzySearch(FilterText, plugin.Name).IsSearchPrecisionScoreMet() ||
+ StringMatcher.FuzzySearch(FilterText, plugin.Description).IsSearchPrecisionScoreMet();
+ }
+}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs
new file mode 100644
index 000000000..dd9e5786d
--- /dev/null
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPanePluginsViewModel.cs
@@ -0,0 +1,44 @@
+using System.Collections.Generic;
+using System.Linq;
+using Flow.Launcher.Core.Plugin;
+using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+using Flow.Launcher.ViewModel;
+
+#nullable enable
+
+namespace Flow.Launcher.SettingPages.ViewModels;
+
+public class SettingsPanePluginsViewModel : BaseModel
+{
+ private readonly Settings _settings;
+
+ public SettingsPanePluginsViewModel(Settings settings)
+ {
+ _settings = settings;
+ }
+
+ public string FilterText { get; set; } = string.Empty;
+
+ public PluginViewModel? SelectedPlugin { get; set; }
+
+ private IEnumerable? _pluginViewModels;
+ private IEnumerable PluginViewModels => _pluginViewModels ??= PluginManager.AllPlugins
+ .OrderBy(plugin => plugin.Metadata.Disabled)
+ .ThenBy(plugin => plugin.Metadata.Name)
+ .Select(plugin => new PluginViewModel
+ {
+ PluginPair = plugin,
+ PluginSettingsObject = _settings.PluginSettings.Plugins[plugin.Metadata.ID]
+ })
+ .ToList();
+
+ public List FilteredPluginViewModels => PluginViewModels
+ .Where(v =>
+ string.IsNullOrEmpty(FilterText) ||
+ StringMatcher.FuzzySearch(FilterText, v.PluginPair.Metadata.Name).IsSearchPrecisionScoreMet() ||
+ StringMatcher.FuzzySearch(FilterText, v.PluginPair.Metadata.Description).IsSearchPrecisionScoreMet()
+ )
+ .ToList();
+}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneProxyViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneProxyViewModel.cs
new file mode 100644
index 000000000..2dd57809d
--- /dev/null
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneProxyViewModel.cs
@@ -0,0 +1,62 @@
+using System.Net;
+using System.Windows;
+using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Core;
+using Flow.Launcher.Core.Resource;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.SettingPages.ViewModels;
+
+public partial class SettingsPaneProxyViewModel : BaseModel
+{
+ private readonly Updater _updater;
+ public Settings Settings { get; }
+
+ public SettingsPaneProxyViewModel(Settings settings, Updater updater)
+ {
+ _updater = updater;
+ Settings = settings;
+ }
+
+ [RelayCommand]
+ private void OnTestProxyClicked()
+ {
+ var message = TestProxy();
+ MessageBox.Show(InternationalizationManager.Instance.GetTranslation(message));
+ }
+
+ private string TestProxy()
+ {
+ if (string.IsNullOrEmpty(Settings.Proxy.Server)) return "serverCantBeEmpty";
+ if (Settings.Proxy.Port <= 0) return "portCantBeEmpty";
+
+ HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_updater.GitHubRepository);
+
+ if (string.IsNullOrEmpty(Settings.Proxy.UserName) || string.IsNullOrEmpty(Settings.Proxy.Password))
+ {
+ request.Proxy = new WebProxy(Settings.Proxy.Server, Settings.Proxy.Port);
+ }
+ else
+ {
+ request.Proxy = new WebProxy(Settings.Proxy.Server, Settings.Proxy.Port)
+ {
+ Credentials = new NetworkCredential(Settings.Proxy.UserName, Settings.Proxy.Password)
+ };
+ }
+
+ try
+ {
+ var response = (HttpWebResponse)request.GetResponse();
+ return response.StatusCode switch
+ {
+ HttpStatusCode.OK => "proxyIsCorrect",
+ _ => "proxyConnectFailed"
+ };
+ }
+ catch
+ {
+ return "proxyConnectFailed";
+ }
+ }
+}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
new file mode 100644
index 000000000..5046a4754
--- /dev/null
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
@@ -0,0 +1,473 @@
+using System;
+using System.Collections.Generic;
+using System.Windows;
+using System.Windows.Controls;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Core.Resource;
+using Flow.Launcher.Helper;
+using Flow.Launcher.Infrastructure;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+using Flow.Launcher.ViewModel;
+using ModernWpf;
+using ThemeManager = Flow.Launcher.Core.Resource.ThemeManager;
+using ThemeManagerForColorSchemeSwitch = ModernWpf.ThemeManager;
+
+namespace Flow.Launcher.SettingPages.ViewModels;
+
+public partial class SettingsPaneThemeViewModel : BaseModel
+{
+ public Settings Settings { get; }
+
+ public static string LinkHowToCreateTheme => @"https://flowlauncher.com/docs/#/how-to-create-a-theme";
+ public static string LinkThemeGallery => "https://github.com/Flow-Launcher/Flow.Launcher/discussions/1438";
+
+ public string SelectedTheme
+ {
+ get => Settings.Theme;
+ set
+ {
+ ThemeManager.Instance.ChangeTheme(value);
+
+ if (ThemeManager.Instance.BlurEnabled && Settings.UseDropShadowEffect)
+ DropShadowEffect = false;
+ }
+ }
+
+ public bool DropShadowEffect
+ {
+ get => 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 double WindowHeightSize
+ {
+ get => Settings.WindowHeightSize;
+ set => Settings.WindowHeightSize = value;
+ }
+
+ public double ItemHeightSize
+ {
+ get => Settings.ItemHeightSize;
+ set => Settings.ItemHeightSize = value;
+ }
+
+ public double QueryBoxFontSize
+ {
+ get => Settings.QueryBoxFontSize;
+ set => Settings.QueryBoxFontSize = value;
+ }
+ public double ResultItemFontSize
+ {
+ get => Settings.ResultItemFontSize;
+ set => Settings.ResultItemFontSize = value;
+ }
+
+ public double ResultSubItemFontSize
+ {
+ get => Settings.ResultSubItemFontSize;
+ set => Settings.ResultSubItemFontSize = value;
+ }
+ public List Themes =>
+ ThemeManager.Instance.LoadAvailableThemes().Select(Path.GetFileNameWithoutExtension).ToList();
+
+
+ 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 = InternationalizationManager.Instance.GetTranslation(key);
+ var m = new ColorScheme { Display = display, Value = e, };
+ modes.Add(m);
+ }
+
+ return modes;
+ }
+ }
+
+ 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 IEnumerable MaxResultsRange => Enumerable.Range(2, 16);
+ public bool KeepMaxResults
+ {
+ get => Settings.KeepMaxResults;
+ set => Settings.KeepMaxResults = value;
+ }
+ public string ClockText => DateTime.Now.ToString(TimeFormat, CultureInfo.CurrentCulture);
+
+ public string DateText => DateTime.Now.ToString(DateFormat, CultureInfo.CurrentCulture);
+
+ 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 = InternationalizationManager.Instance.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 bool ShowWMPWarning
+ {
+ get => !Settings.WMPInstalled && UseSound;
+ }
+
+ public bool EnableVolumeAdjustment
+ {
+ get => Settings.WMPInstalled;
+ }
+
+ 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 Brush PreviewBackground
+ {
+ get
+ {
+ var wallpaper = WallpaperPathRetrieval.GetWallpaperPath();
+ if (wallpaper is not 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();
+ return new ImageBrush(bitmap) { Stretch = Stretch.UniformToFill };
+ }
+
+ var wallpaperColor = WallpaperPathRetrieval.GetWallpaperColor();
+ return new SolidColorBrush(wallpaperColor);
+ }
+ }
+
+ 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
+ {
+ var fontExists = Fonts.SystemFontFamilies.Any(
+ fontFamily =>
+ fontFamily.FamilyNames.Values != null &&
+ fontFamily.FamilyNames.Values.Contains(Settings.QueryBoxFont)
+ );
+
+ return fontExists switch
+ {
+ true => new FontFamily(Settings.QueryBoxFont),
+ _ => new FontFamily("Segoe UI")
+ };
+ }
+ 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
+ {
+ var fontExists = Fonts.SystemFontFamilies.Any(
+ fontFamily =>
+ fontFamily.FamilyNames.Values != null &&
+ fontFamily.FamilyNames.Values.Contains(Settings.ResultFont)
+ );
+ return fontExists switch
+ {
+ true => new FontFamily(Settings.ResultFont),
+ _ => new FontFamily("Segoe UI")
+ };
+ }
+ 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 FontFamily SelectedResultSubFont
+ {
+ get
+ {
+ if (Fonts.SystemFontFamilies.Count(o =>
+ o.FamilyNames.Values != null &&
+ o.FamilyNames.Values.Contains(Settings.ResultSubFont)) > 0)
+ {
+ var font = new FontFamily(Settings.ResultSubFont);
+ return font;
+ }
+ else
+ {
+ var font = new FontFamily("Segoe UI");
+ return font;
+ }
+ }
+ set
+ {
+ Settings.ResultSubFont = value.ToString();
+ ThemeManager.Instance.ChangeTheme(Settings.Theme);
+ }
+ }
+
+ public FamilyTypeface SelectedResultSubFontFaces
+ {
+ get
+ {
+ var typeface = SyntaxSugars.CallOrRescueDefault(
+ () => SelectedResultSubFont.ConvertFromInvariantStringsOrNormal(
+ Settings.ResultSubFontStyle,
+ Settings.ResultSubFontWeight,
+ Settings.ResultSubFontStretch
+ ));
+ return typeface;
+ }
+ set
+ {
+ Settings.ResultSubFontStretch = value.Stretch.ToString();
+ Settings.ResultSubFontWeight = value.Weight.ToString();
+ Settings.ResultSubFontStyle = value.Style.ToString();
+ ThemeManager.Instance.ChangeTheme(Settings.Theme);
+ }
+ }
+ public string ThemeImage => Constant.QueryTextBoxIconImagePath;
+
+ [RelayCommand]
+ private void OpenThemesFolder()
+ {
+ App.API.OpenDirectory(Path.Combine(DataLocation.DataDirectory(), Constant.Themes));
+ }
+
+ public void UpdateColorScheme()
+ {
+ ThemeManagerForColorSchemeSwitch.Current.ApplicationTheme = Settings.ColorScheme switch
+ {
+ Constant.Light => ApplicationTheme.Light,
+ Constant.Dark => ApplicationTheme.Dark,
+ Constant.System => null,
+ _ => ThemeManagerForColorSchemeSwitch.Current.ApplicationTheme
+ };
+ }
+
+ public SettingsPaneThemeViewModel(Settings settings)
+ {
+ Settings = settings;
+ }
+
+}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml
new file mode 100644
index 000000000..15afd7741
--- /dev/null
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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/SettingsPaneGeneral.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs
new file mode 100644
index 000000000..f95015b2e
--- /dev/null
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Windows.Navigation;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.SettingPages.ViewModels;
+
+namespace Flow.Launcher.SettingPages.Views;
+
+public partial class SettingsPaneGeneral
+{
+ private SettingsPaneGeneralViewModel _viewModel = null!;
+
+ protected override void OnNavigatedTo(NavigationEventArgs e)
+ {
+ if (!IsInitialized)
+ {
+ if (e.ExtraData is not SettingWindow.PaneData { Settings: { } settings, Updater: {} updater, Portable: {} portable })
+ throw new ArgumentException("Settings, Updater and Portable are required for SettingsPaneGeneral.");
+ _viewModel = new SettingsPaneGeneralViewModel(settings, updater, portable);
+ DataContext = _viewModel;
+ InitializeComponent();
+ }
+ base.OnNavigatedTo(e);
+ }
+}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
new file mode 100644
index 000000000..3f0f89560
--- /dev/null
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
@@ -0,0 +1,453 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs
new file mode 100644
index 000000000..061eabf51
--- /dev/null
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Windows.Navigation;
+using Flow.Launcher.SettingPages.ViewModels;
+
+namespace Flow.Launcher.SettingPages.Views;
+
+public partial class SettingsPaneHotkey
+{
+ private SettingsPaneHotkeyViewModel _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 SettingsPaneHotkeyViewModel(settings);
+ DataContext = _viewModel;
+ InitializeComponent();
+ }
+ base.OnNavigatedTo(e);
+ }
+}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
new file mode 100644
index 000000000..40d76a471
--- /dev/null
+++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml
@@ -0,0 +1,358 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs
new file mode 100644
index 000000000..95c88d627
--- /dev/null
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneProxy.xaml.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Windows.Navigation;
+using Flow.Launcher.SettingPages.ViewModels;
+
+namespace Flow.Launcher.SettingPages.Views;
+
+public partial class SettingsPaneProxy
+{
+ private SettingsPaneProxyViewModel _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 {nameof(SettingsPaneProxy)}.");
+ _viewModel = new SettingsPaneProxyViewModel(settings, updater);
+ DataContext = _viewModel;
+ InitializeComponent();
+ }
+
+ base.OnNavigatedTo(e);
+ }
+}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
new file mode 100644
index 000000000..08b49e745
--- /dev/null
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
@@ -0,0 +1,709 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs
new file mode 100644
index 000000000..7d412296f
--- /dev/null
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml.cs
@@ -0,0 +1,81 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using System.Windows.Navigation;
+using Flow.Launcher.SettingPages.ViewModels;
+using Page = ModernWpf.Controls.Page;
+
+namespace Flow.Launcher.SettingPages.Views;
+
+public partial class SettingsPaneTheme : Page
+{
+ private SettingsPaneThemeViewModel _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(SettingsPaneTheme)}.");
+ _viewModel = new SettingsPaneThemeViewModel(settings);
+ DataContext = _viewModel;
+ InitializeComponent();
+ }
+
+ base.OnNavigatedTo(e);
+ }
+
+ private void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ _viewModel.UpdateColorScheme();
+ }
+
+ private void Reset_Click(object sender, RoutedEventArgs e)
+ {
+ /*The FamilyTypeface should initialize all of its various properties.*/
+ FamilyTypeface targetTypeface = new FamilyTypeface { Stretch = FontStretches.Normal, Weight = FontWeights.Normal, Style = FontStyles.Normal };
+
+ QueryBoxFontSize.Value = 20;
+ QueryBoxFontComboBox.SelectedIndex = SearchFontIndex("Segoe UI", QueryBoxFontComboBox);
+ QueryBoxFontStyleComboBox.SelectedIndex = SearchFontStyleIndex(targetTypeface, QueryBoxFontStyleComboBox);
+
+ ResultItemFontComboBox.SelectedIndex = SearchFontIndex("Segoe UI", ResultItemFontComboBox);
+ ResultItemFontStyleComboBox.SelectedIndex = SearchFontStyleIndex(targetTypeface, ResultItemFontStyleComboBox);
+ ResultItemFontSize.Value = 16;
+
+ ResultSubItemFontComboBox.SelectedIndex = SearchFontIndex("Segoe UI", ResultSubItemFontComboBox);
+ ResultSubItemFontStyleComboBox.SelectedIndex = SearchFontStyleIndex(targetTypeface, ResultSubItemFontStyleComboBox);
+ ResultSubItemFontSize.Value = 13;
+
+ WindowHeightValue.Value = 42;
+ ItemHeightValue.Value = 58;
+ }
+
+ private int SearchFontIndex(string targetFont, ComboBox combo)
+ {
+ for (int i = 0; i < combo.Items.Count; i++)
+ {
+ if (combo.Items[i]?.ToString() == targetFont)
+ {
+ return i;
+ }
+ }
+ return 0;
+ }
+
+ private int SearchFontStyleIndex(FamilyTypeface targetTypeface, ComboBox combo)
+ {
+ for (int i = 0; i < combo.Items.Count; i++)
+ {
+ if (combo.Items[i] is FamilyTypeface typefaceItem &&
+ typefaceItem.Stretch == targetTypeface.Stretch &&
+ typefaceItem.Weight == targetTypeface.Weight &&
+ typefaceItem.Style == targetTypeface.Style)
+ {
+ return i;
+ }
+ }
+ return 0;
+ }
+}
diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml
index 119268d6b..6194db201 100644
--- a/Flow.Launcher/SettingWindow.xaml
+++ b/Flow.Launcher/SettingWindow.xaml
@@ -2,18 +2,10 @@
x:Class="Flow.Launcher.SettingWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:cc="clr-namespace:Flow.Launcher.Resources.Controls"
- xmlns:converters="clr-namespace:Flow.Launcher.Converters"
- xmlns:core="clr-namespace:Flow.Launcher.Core.Resource;assembly=Flow.Launcher.Core"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:flowlauncher="clr-namespace:Flow.Launcher"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
- xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:ui="http://schemas.modernwpf.com/2019"
- xmlns:userSettings="clr-namespace:Flow.Launcher.Infrastructure.UserSettings;assembly=Flow.Launcher.Infrastructure"
xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
- xmlns:wpftk="clr-namespace:WpfToolkit.Controls;assembly=VirtualizingWrapPanel"
Title="{DynamicResource flowlauncher_settings}"
Width="{Binding SettingWindowWidth, Mode=TwoWay}"
Height="{Binding SettingWindowHeight, Mode=TwoWay}"
@@ -40,566 +32,162 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -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 @@
falsefalsetrue
+ 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.Calculatortruetruefalse
@@ -18,7 +18,7 @@
trueportablefalse
- ..\..\Output\Debug\Plugins\Flow.Launcher.Plugin.Caculator\
+ ..\..\Output\Debug\Plugins\Flow.Launcher.Plugin.Calculator\DEBUG;TRACEprompt4
@@ -28,7 +28,7 @@
pdbonlytrue
- ..\..\Output\Release\Plugins\Flow.Launcher.Plugin.Caculator\
+ ..\..\Output\Release\Plugins\Flow.Launcher.Plugin.Calculator\TRACEprompt4
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 KeywordsQuick Access LinksEverything Setting
+ Preview Panel
+ Size
+ Date Created
+ Date Modified
+ Display File Info
+ Date and time formatSort Option:Everything Path:Launch Hidden
@@ -105,10 +111,12 @@
Open WithSelect 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 slowSearch Full Path
-
+
Click to launch or install EverythingEverything InstallationInstalling 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 RapidoRimuovi elemento corrente dall'Accesso RapidoMostra 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 warningThe 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 returnExplorer 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 @@
truetruefalse
+ 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 installedPlugin Manifest Download FailedPlease 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ánStahování manifestu pluginu se nezdařiloZkontrolujte, 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 installedPlugin Manifest Download FailedPlease 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 installedPlugin Manifest Download FailedPlease 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 installedPlugin Manifest Download FailedPlease 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 installedPlugin Manifest Download FailedPlease 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á instaladoLa descarga del manifiesto del complemento ha falladoPor 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 ManifestVeuillez 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 completatoErrore: 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 pluginInstallazione del PluginScarica 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 pluginErrore durante il tentativo di installare {0}
- Error uninstalling plugin
+ Errore durante la disinstallazione del pluginNessun aggiornamento disponibileTutti 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 installatoDownload del manifesto del plugin fallitoControlla 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 sconosciutaStai 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 installedPlugin Manifest Download FailedPlease 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 installedPlugin Manifest Download FailedPlease 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 installedPlugin Manifest Download FailedPlease 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 installedPlugin Manifest Download FailedPlease 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á instaladoPlugin Manifest Download FailedPlease 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á instaladoErro ao descarregar o manifesto do pluginVerifique 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 installedPlugin Manifest Download FailedPlease 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 zlyhaloSkontrolujte, č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 installedPlugin Manifest Download FailedPlease 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 installedPlugin Manifest Download FailedPlease 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 FailedPlease 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 @@
truefalsefalse
+ 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 @@
truefalsefalse
+ 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 variableHide app pathFor 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.exeSearch in Program DescriptionFlow will search program's descriptionSuffixes
@@ -92,4 +94,4 @@
This app is not intended to be run as administratorUnable 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 @@
CancellaModificaAggiungi
- Name
- Enable
+ Nome
+ AbilitaAbilitato
- Disable
+ DisabilitaStatusAbilitatoDisabled
- Location
- All Programs
+ Posizione
+ Tutti i programmiFile Type
- Reindex
- Indexing
+ Reindicizza
+ IndicizzandoIndex SourcesOptionsUWP AppsWhen enabled, Flow will load UWP ApplicationsStart Menu
- When enabled, Flow will load programs from the start menu
+ Se abilitato, Flow caricherà i programmi dal Menu StartRegistry
- When enabled, Flow will load programs from the registry
+ Se abilitato, Flow caricherà i programmi dal RegistroPATHWhen 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 ProgrammaFlow 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 @@
AggiornaProgram 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 vuotiProtocols can't be empty
- File Suffixes
+ Suffissi dei fileURL ProtocolsSteam GamesEpic 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 AmministratoreApri percorso file
- Disable this program from displaying
+ Disabilita questo programma dalla visualizzazioneOpen target folder
- Program
- Search programs in Flow Launcher
+ Programma
+ Cerca programmi in Flow Launcher
- Invalid Path
+ Percorso non valido
- Customized Explorer
+ Esplora Risorse personalizzatoParametriYou 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 @@
truefalsefalse
+ en
-
+
trueportable
@@ -24,7 +25,7 @@
4false
-
+
pdbonlytrue
@@ -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 comandiEsegui sempre come amministratoreEsegui 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+RClose Command Prompt after pressing any keyPress 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 shellRun 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 @@
truefalsefalse
+ en
-
+
trueportable
@@ -24,7 +25,7 @@
4false
-
+
pdbonlytrue
@@ -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 @@
ComandoDescrizione
- 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 CestinoEsci
- Save Settings
+ Salva ImpostazioniRiavvia Flow LauncherImpostazioniRicarica 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 LauncherAttiva/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 @@
-
+
Librarynet7.0-windows
@@ -11,8 +11,9 @@
truefalsefalse
+ en
-
+
trueportable
@@ -23,7 +24,7 @@
4false
-
+
pdbonlytrue
@@ -33,7 +34,7 @@
4false
-
+
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 LauncherPlease 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 RicercaApri ricerca in:Nuova FinestraNuova Scheda
@@ -12,40 +12,40 @@
AggiungiAbilitatoAbilitato
- Disabled
- Confirm
- Action Keyword
+ Disabilitato
+ Conferma
+ Parola ChiaveURL
- Search
- Use Search Query Autocomplete:
- Autocomplete Data from:
- Please select a web search
+ Cerca
+ Usa Autocompletamento Ricerca:
+ Autocompleta i dati da:
+ Seleziona una ricerca webSei 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
+ IconaAnnulla
- 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 diversaSuccesso
- 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 WindowNew 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 @@
prompten-USenable
+ 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
+ PosizioneArea 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,
+}