Compare commits

...

25 commits

Author SHA1 Message Date
Jack Ye
e2015c4b4f
Merge 7476cdd894 into 5ef6a2b688 2026-03-09 11:05:41 +08:00
Jeremy Wu
5ef6a2b688
New Crowdin updates (#4293) 2026-03-09 04:44:49 +02:00
Jeremy Wu
12c4b4d711
Merge pull request #4313 from Flow-Launcher/InitProgressbarAnimation_Null
Some checks are pending
Build / build (push) Waiting to run
Move progress bar animation init to Loaded event to fix possible null exception of ProgressBar
2026-03-08 21:30:02 +11:00
Jack251970
a2f224225e Move progress bar animation init to Loaded event
InitProgressbarAnimation is now triggered by the progress bar's Loaded event instead of during main window initialization. This ensures the animation starts only after the progress bar is fully loaded, improving reliability and preventing potential UI timing issues.
2026-03-02 18:20:09 +08:00
Jack Ye
7476cdd894
Simplify theme refresh logic in ActualApplicationThemeChanged 2026-03-02 18:04:00 +08:00
Jack251970
65042d9fe1 Update WindowBorderStyle to use global app resources
Changed assignment of WindowBorderStyle to use Application.Current.Resources for global effect, replacing previous use of _oldResource. This ensures theme changes are applied consistently across the application.
2026-03-01 14:28:53 +08:00
Jack251970
46cecb2acc Improve code quality 2026-03-01 14:26:12 +08:00
Jack251970
e3d71f94ef Refactor window border style creation and copying
Replaces GetNewWindowBorderStyle with direct instantiation of a new Style for Border and uses CopyStyle to transfer properties. Removes the old helper method and moves style copying logic inline for improved clarity and maintainability.
2026-03-01 14:23:57 +08:00
Jack251970
4767b444ec Optimize SolidColorBrush usage for window background
Freeze SolidColorBrush instances before assigning them to mainWindow.Background to improve performance and immutability. Applied to both transparent and selected background scenarios.
2026-03-01 14:16:36 +08:00
Jack251970
428a7ad0c2 Prioritize user ColorScheme over system dark mode setting
Refactored dark mode logic to first use user's ColorScheme
preference when "SystemBG" is set to "Auto". Only falls back
to system dark mode setting if ColorScheme is not explicitly
set to "Dark" or "Light". This ensures user preferences take
precedence over system defaults.
2026-03-01 14:15:15 +08:00
Jack251970
2e6fb61248 Refactor blur theme logic and helper function
Renamed IsBlurTheme to IsThemeBlurEnabled and moved system
backdrop support checks out of the helper function. Blur
availability is now determined by combining theme settings
and system capability in the calling code. Updated all
usages to reflect the new logic for improved clarity.
2026-03-01 14:13:32 +08:00
Jack251970
c87f3d3447 Improve theme resource access robustness
Refactored theme resource dictionary lookups to safely check for "WindowBorderStyle" before accessing, preventing potential exceptions. Updated three methods to handle missing styles gracefully and standardized resource key checks. GetWindowBorderStyleBackground now returns transparent if style is missing.
2026-03-01 14:05:36 +08:00
Jack251970
3db201f4a3 Use DispatcherPriority.Render for theme UI updates
Explicitly set DispatcherPriority.Render when invoking RefreshFrameAsync and SetBlurForWindowAsync on the application's dispatcher. This ensures theme-related UI changes are processed with rendering priority, improving responsiveness and visual consistency. Also added System.Windows.Threading import for access to DispatcherPriority.
2026-03-01 14:00:07 +08:00
Jack251970
9943b72839 Refactor drop shadow handling for window border style
Reworked how drop shadow effects are added and removed by creating new unsealed Style instances instead of modifying sealed ones. Resources, triggers, and setters are copied, with margin adjustments and effect setter management to ensure reliability. Introduced GetNewWindowBorderStyle helper for style copying.
2026-03-01 13:59:32 +08:00
Jack251970
5b6b7e728e Rename themeName to theme in UpdateFonts for consistency
Renamed the variable themeName to theme in the UpdateFonts method
to improve naming consistency. No functional changes were made.
2026-03-01 13:59:15 +08:00
Jack251970
340f2cbc04 Refactor blur theme detection for accuracy
Improve IsBlurTheme to check blur support directly in the
current theme's resource dictionary, ensuring precise and
context-specific detection. Updated related logic and comments
for clarity.
2026-03-01 12:19:26 +08:00
Jack251970
84ed1fa1e1 Add null checks and fix dispatcher invocation in Theme
Added early returns if Application.Current is null in RefreshFrameAsync and SetBlurForWindowAsync to prevent null reference exceptions. Updated dispatcher access checks and ensured the correct method is invoked asynchronously for each case, improving robustness and reliability.
2026-02-28 23:22:06 +08:00
Jack251970
a83da2b00f Improve Theme resource handling and suppress async warnings
Add try-catch to UpdateResourceDictionary to prevent crashes from InvalidCastException when updating resources. Set _oldResource to null on error. Suppress VSTHRD103 warnings around SetBlurForWindow to clarify intentional async usage and avoid build warnings.
2026-02-28 23:08:53 +08:00
Jack251970
7b855745d9 Refactor drop shadow logic in Theme.cs for accuracy
Moved RemoveDropShadowEffectFromCurrentTheme() into specific conditional branches within AutoDropShadow to ensure it is only called when appropriate. Explicitly set window corner preference and drop shadow effect based on theme and blur support, improving appearance consistency and logic clarity.
2026-02-28 22:45:23 +08:00
Jack251970
966bcdd5ec Refactor UI thread checks in Theme async methods
Refactored RefreshFrameAsync and SetBlurForWindowAsync to check Dispatcher access before invoking UI updates, ensuring thread safety and reducing unnecessary Dispatcher calls. Also removed redundant code and unused using directive.
2026-02-28 22:03:55 +08:00
Jack251970
5635783973 Limit theme refresh to when color scheme is "System"
Previously, the theme was refreshed on every theme change event.
Now, `_theme.RefreshFrameAsync()` is only called if the color
scheme setting is set to "System", preventing unnecessary
refreshes in other scenarios.
2026-02-28 21:23:20 +08:00
Jack251970
60b92c5b96 Improve brush handling and resource safety in theme styles
Refactored caret and background brush assignment to avoid sharing mutable instances and ensure proper resource referencing. Added GetNewCaretValue helper for safe caret brush creation. Brushes for backgrounds are now frozen for performance. Improved foreground value retrieval and dynamic resource key extraction. Made some methods static for clarity and consistency. Enhances resource management and reliability in theme handling.
2026-02-28 15:14:34 +08:00
Jack251970
41d5e0a27a Revert "Fix: Silently handle InvalidCastException from WPF system resource invalidation on Windows theme change"
This reverts commit 372f142b49.
2026-02-28 14:39:15 +08:00
copilot-swe-agent[bot]
372f142b49 Fix: Silently handle InvalidCastException from WPF system resource invalidation on Windows theme change
Co-authored-by: Jack251970 <53996452+Jack251970@users.noreply.github.com>
2026-02-27 14:45:56 +00:00
copilot-swe-agent[bot]
1146d53792 Initial plan 2026-02-27 14:39:36 +00:00
41 changed files with 392 additions and 208 deletions

View file

@ -11,12 +11,12 @@ using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Windows.Shell;
using System.Windows.Threading;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedModels;
using Microsoft.Win32;
using System.Windows.Threading;
namespace Flow.Launcher.Core.Resource
{
@ -100,12 +100,6 @@ namespace Flow.Launcher.Core.Resource
private void UpdateResourceDictionary(ResourceDictionary dictionaryToUpdate)
{
// Add new resources
if (!Application.Current.Resources.MergedDictionaries.Contains(dictionaryToUpdate))
{
Application.Current.Resources.MergedDictionaries.Add(dictionaryToUpdate);
}
// Remove old resources
if (_oldResource != null && _oldResource != dictionaryToUpdate &&
Application.Current.Resources.MergedDictionaries.Contains(_oldResource))
@ -113,7 +107,20 @@ namespace Flow.Launcher.Core.Resource
Application.Current.Resources.MergedDictionaries.Remove(_oldResource);
}
_oldResource = dictionaryToUpdate;
// Add new resources
try
{
if (!Application.Current.Resources.MergedDictionaries.Contains(dictionaryToUpdate))
{
Application.Current.Resources.MergedDictionaries.Add(dictionaryToUpdate);
}
_oldResource = dictionaryToUpdate;
}
catch (InvalidCastException)
{
// System.InvalidCastException: Unable to cast object of type 'System.Windows.Media.Color' to type 'System.Windows.Expression'.
_oldResource = null;
}
}
/// <summary>
@ -124,8 +131,8 @@ namespace Flow.Launcher.Core.Resource
try
{
// Load a ResourceDictionary for the specified theme.
var themeName = _settings.Theme;
var dict = GetThemeResourceDictionary(themeName);
var theme = _settings.Theme;
var dict = GetThemeResourceDictionary(theme);
// Apply font settings to the theme resource.
ApplyFontSettings(dict);
@ -221,7 +228,13 @@ namespace Flow.Launcher.Core.Resource
var foregroundPropertyValue = style.Setters.OfType<Setter>().Where(x => x.Property.Name == "Foreground")
.Select(x => x.Value).FirstOrDefault();
if (!caretBrushPropertyValue && foregroundPropertyValue != null)
style.Setters.Add(new Setter(TextBoxBase.CaretBrushProperty, foregroundPropertyValue));
{
var newCaretValue = GetNewCaretValue(foregroundPropertyValue);
if (newCaretValue != null)
{
style.Setters.Add(new Setter(TextBoxBase.CaretBrushProperty, newCaretValue));
}
}
}
else
{
@ -246,6 +259,37 @@ namespace Flow.Launcher.Core.Resource
}
}
private static object GetNewCaretValue(object foregroundPropertyValue)
{
object newCaretValue;
if (foregroundPropertyValue is DynamicResourceExtension dynamicResource)
{
newCaretValue = new DynamicResourceExtension(dynamicResource.ResourceKey);
}
else if (foregroundPropertyValue is SolidColorBrush solidBrush)
{
// Create a new brush to avoid sharing mutable freezables with potential expressions
if (solidBrush.IsFrozen)
{
newCaretValue = solidBrush;
}
else
{
var newBrush = new SolidColorBrush(solidBrush.Color)
{
Opacity = solidBrush.Opacity
};
if (newBrush.CanFreeze) newBrush.Freeze();
newCaretValue = newBrush;
}
}
else
{
newCaretValue = foregroundPropertyValue;
}
return newCaretValue;
}
private ResourceDictionary GetThemeResourceDictionary(string theme)
{
var uri = GetThemePath(theme);
@ -275,10 +319,15 @@ namespace Flow.Launcher.Core.Resource
queryBoxStyle.Setters.Add(new Setter(Control.FontStretchProperty, fontStretch));
var caretBrushPropertyValue = queryBoxStyle.Setters.OfType<Setter>().Any(x => x.Property.Name == "CaretBrush");
var foregroundPropertyValue = queryBoxStyle.Setters.OfType<Setter>().Where(x => x.Property.Name == "Foreground")
.Select(x => x.Value).FirstOrDefault();
var foregroundPropertyValue = queryBoxStyle.Setters.OfType<Setter>().FirstOrDefault(x => x.Property.Name == "Foreground")?.Value;
if (!caretBrushPropertyValue && foregroundPropertyValue != null) //otherwise BaseQueryBoxStyle will handle styling
queryBoxStyle.Setters.Add(new Setter(TextBoxBase.CaretBrushProperty, foregroundPropertyValue));
{
var newCaretValue = GetNewCaretValue(foregroundPropertyValue);
if (newCaretValue != null)
{
queryBoxStyle.Setters.Add(new Setter(TextBoxBase.CaretBrushProperty, newCaretValue));
}
}
// Query suggestion box's font style is aligned with query box
querySuggestionBoxStyle.Setters.Add(new Setter(Control.FontFamilyProperty, fontFamily));
@ -419,20 +468,17 @@ namespace Flow.Launcher.Core.Resource
if (string.IsNullOrEmpty(path))
throw new DirectoryNotFoundException($"Theme path can't be found <{path}>");
// Retrieve theme resource always use the resource with font settings applied.
var resourceDict = GetResourceDictionary(theme);
UpdateResourceDictionary(resourceDict);
_settings.Theme = theme;
//always allow re-loading default theme, in case of failure of switching to a new theme from default theme
// Always allow re-loading default theme, in case of failure of switching to a new theme from default theme
if (_oldTheme != theme || theme == Constant.DefaultTheme)
{
_oldTheme = Path.GetFileNameWithoutExtension(_oldResource.Source.AbsolutePath);
}
BlurEnabled = IsBlurTheme();
// Check if blur is enabled
var dict = GetThemeResourceDictionary(theme);
BlurEnabled = Win32Helper.IsBackdropSupported() && IsThemeBlurEnabled(dict);
// Apply blur and drop shadow effect so that we do not need to call it again
_ = RefreshFrameAsync();
@ -477,11 +523,58 @@ namespace Flow.Launcher.Core.Resource
public void AddDropShadowEffectToCurrentTheme()
{
var dict = GetCurrentResourceDictionary();
// Get current theme's WindowBorderStyle
var theme = _settings.Theme;
var dict = GetThemeResourceDictionary(theme);
var windowBorderStyle = dict.Contains("WindowBorderStyle") ? dict["WindowBorderStyle"] as Style : null;
if (windowBorderStyle == null) return;
var windowBorderStyle = dict["WindowBorderStyle"] as Style;
// Get a new unsealed style based on the old one, and copy Resources and Triggers
var newWindowBorderStyle = new Style(typeof(Border));
CopyStyle(windowBorderStyle, newWindowBorderStyle);
var effectSetter = new Setter
// Identify existing Margin to calculate new Margin, and copy other setters
Setter existingMarginSetter = null;
foreach (var setterBase in windowBorderStyle.Setters)
{
if (setterBase is Setter setter)
{
// Skip existing Margin (we'll replace it)
if (setter.Property == FrameworkElement.MarginProperty)
{
existingMarginSetter = setter;
continue;
}
// Skip existing Effect (we'll ensure strictly one is added)
if (setter.Property == UIElement.EffectProperty) continue;
}
// Add other setters (e.g. Background, BorderThickness)
newWindowBorderStyle.Setters.Add(setterBase);
}
// Calculate new Margin
Thickness newMargin;
if (existingMarginSetter == null)
{
newMargin = new Thickness(ShadowExtraMargin, 12, ShadowExtraMargin, ShadowExtraMargin);
}
else
{
var baseMargin = (Thickness)existingMarginSetter.Value;
newMargin = new Thickness(
baseMargin.Left + ShadowExtraMargin,
baseMargin.Top + ShadowExtraMargin,
baseMargin.Right + ShadowExtraMargin,
baseMargin.Bottom + ShadowExtraMargin);
}
// Add new Margin Setter
newWindowBorderStyle.Setters.Add(new Setter(FrameworkElement.MarginProperty, newMargin));
// Add Drop Shadow Effect Setter
newWindowBorderStyle.Setters.Add(new Setter
{
Property = UIElement.EffectProperty,
Value = new DropShadowEffect
@ -491,62 +584,52 @@ namespace Flow.Launcher.Core.Resource
Direction = 270,
BlurRadius = 30
}
};
});
if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == FrameworkElement.MarginProperty) is not Setter marginSetter)
{
var margin = new Thickness(ShadowExtraMargin, 12, ShadowExtraMargin, ShadowExtraMargin);
marginSetter = new Setter()
{
Property = FrameworkElement.MarginProperty,
Value = margin,
};
windowBorderStyle.Setters.Add(marginSetter);
SetResizeBoarderThickness(newMargin);
SetResizeBoarderThickness(margin);
}
else
{
var baseMargin = (Thickness)marginSetter.Value;
var newMargin = new Thickness(
baseMargin.Left + ShadowExtraMargin,
baseMargin.Top + ShadowExtraMargin,
baseMargin.Right + ShadowExtraMargin,
baseMargin.Bottom + ShadowExtraMargin);
marginSetter.Value = newMargin;
SetResizeBoarderThickness(newMargin);
}
windowBorderStyle.Setters.Add(effectSetter);
UpdateResourceDictionary(dict);
Application.Current.Resources["WindowBorderStyle"] = newWindowBorderStyle;
}
public void RemoveDropShadowEffectFromCurrentTheme()
{
var dict = GetCurrentResourceDictionary();
var windowBorderStyle = dict["WindowBorderStyle"] as Style;
// Get current theme's WindowBorderStyle
var theme = _settings.Theme;
var dict = GetThemeResourceDictionary(theme);
var windowBorderStyle = dict.Contains("WindowBorderStyle") ? dict["WindowBorderStyle"] as Style : null;
if (windowBorderStyle == null) return;
if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == UIElement.EffectProperty) is Setter effectSetter)
{
windowBorderStyle.Setters.Remove(effectSetter);
}
// Get a new unsealed style based on the old one, and copy Resources and Triggers
var newWindowBorderStyle = new Style(typeof(Border));
CopyStyle(windowBorderStyle, newWindowBorderStyle);
if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == FrameworkElement.MarginProperty) is Setter marginSetter)
// Copy Setters, excluding the Effect setter and updating the Margin setter
foreach (var setterBase in windowBorderStyle.Setters)
{
var currentMargin = (Thickness)marginSetter.Value;
var newMargin = new Thickness(
currentMargin.Left - ShadowExtraMargin,
currentMargin.Top - ShadowExtraMargin,
currentMargin.Right - ShadowExtraMargin,
currentMargin.Bottom - ShadowExtraMargin);
marginSetter.Value = newMargin;
if (setterBase is Setter setter)
{
// Skip existing Effect (We'll remove it)
if (setter.Property == UIElement.EffectProperty) continue;
// Update Margin by subtracting the extra margin we added for the shadow
if (setter.Property == FrameworkElement.MarginProperty)
{
var currentMargin = (Thickness)setter.Value;
var newMargin = new Thickness(
currentMargin.Left - ShadowExtraMargin,
currentMargin.Top - ShadowExtraMargin,
currentMargin.Right - ShadowExtraMargin,
currentMargin.Bottom - ShadowExtraMargin);
newWindowBorderStyle.Setters.Add(new Setter(FrameworkElement.MarginProperty, newMargin));
continue;
}
}
newWindowBorderStyle.Setters.Add(setterBase);
}
SetResizeBoarderThickness(null);
UpdateResourceDictionary(dict);
Application.Current.Resources["WindowBorderStyle"] = newWindowBorderStyle;
}
public void SetResizeBorderThickness(WindowChrome windowChrome, bool fixedWindowSize)
@ -596,26 +679,33 @@ namespace Flow.Launcher.Core.Resource
/// </summary>
public async Task RefreshFrameAsync()
{
await Application.Current.Dispatcher.InvokeAsync(() =>
if (Application.Current == null) return;
if (!Application.Current.Dispatcher.CheckAccess())
{
// Get the actual backdrop type and drop shadow effect settings
var (backdropType, useDropShadowEffect) = GetActualValue();
await Application.Current?.Dispatcher.InvokeAsync(RefreshFrameAsync, DispatcherPriority.Render);
return;
}
// Remove OS minimizing/maximizing animation
// Methods.SetWindowAttribute(new WindowInteropHelper(mainWindow).Handle, DWMWINDOWATTRIBUTE.DWMWA_TRANSITIONS_FORCEDISABLED, 3);
// Get the actual backdrop type and drop shadow effect settings
var (backdropType, useDropShadowEffect) = GetActualValue();
// The timing of adding the shadow effect should vary depending on whether the theme is transparent.
if (BlurEnabled)
{
AutoDropShadow(useDropShadowEffect);
}
SetBlurForWindow(_settings.Theme, backdropType);
// Remove OS minimizing/maximizing animation
// Methods.SetWindowAttribute(new WindowInteropHelper(mainWindow).Handle, DWMWINDOWATTRIBUTE.DWMWA_TRANSITIONS_FORCEDISABLED, 3);
if (!BlurEnabled)
{
AutoDropShadow(useDropShadowEffect);
}
}, DispatcherPriority.Render);
// The timing of adding the shadow effect should vary depending on whether the theme is transparent.
if (BlurEnabled)
{
AutoDropShadow(useDropShadowEffect);
}
#pragma warning disable VSTHRD103 // Call async methods when in an async method
SetBlurForWindow(_settings.Theme, backdropType);
#pragma warning restore VSTHRD103 // Call async methods when in an async method
if (!BlurEnabled)
{
AutoDropShadow(useDropShadowEffect);
}
}
/// <summary>
@ -623,13 +713,17 @@ namespace Flow.Launcher.Core.Resource
/// </summary>
public async Task SetBlurForWindowAsync()
{
await Application.Current.Dispatcher.InvokeAsync(() =>
if (Application.Current == null) return;
if (!Application.Current.Dispatcher.CheckAccess())
{
// Get the actual backdrop type and drop shadow effect settings
var (backdropType, _) = GetActualValue();
await Application.Current?.Dispatcher.InvokeAsync(SetBlurForWindowAsync, DispatcherPriority.Render);
return;
}
SetBlurForWindow(_settings.Theme, backdropType);
}, DispatcherPriority.Render);
// Get the actual backdrop type and drop shadow effect settings
var (backdropType, _) = GetActualValue();
SetBlurForWindow(_settings.Theme, backdropType);
}
/// <summary>
@ -667,21 +761,25 @@ namespace Flow.Launcher.Core.Resource
if (mainWindow == null) return;
// Check if the theme supports blur
bool hasBlur = dict.Contains("ThemeBlurEnabled") && dict["ThemeBlurEnabled"] is bool b && b;
var hasBlur = IsThemeBlurEnabled(dict);
if (BlurEnabled && hasBlur && Win32Helper.IsBackdropSupported())
{
// If the BackdropType is Mica or MicaAlt, set the windowborderstyle's background to transparent
if (backdropType == BackdropTypes.Mica || backdropType == BackdropTypes.MicaAlt)
{
windowBorderStyle.Setters.Remove(windowBorderStyle.Setters.OfType<Setter>().FirstOrDefault(x => x.Property.Name == "Background"));
windowBorderStyle.Setters.Add(new Setter(Border.BackgroundProperty, new SolidColorBrush(Color.FromArgb(1, 0, 0, 0))));
var brush = new SolidColorBrush(Color.FromArgb(1, 0, 0, 0));
brush.Freeze();
windowBorderStyle.Setters.Add(new Setter(Border.BackgroundProperty, brush));
}
else if (backdropType == BackdropTypes.Acrylic)
{
windowBorderStyle.Setters.Remove(windowBorderStyle.Setters.OfType<Setter>().FirstOrDefault(x => x.Property.Name == "Background"));
windowBorderStyle.Setters.Add(new Setter(Border.BackgroundProperty, new SolidColorBrush(Colors.Transparent)));
var brush = new SolidColorBrush(Colors.Transparent);
brush.Freeze();
windowBorderStyle.Setters.Add(new Setter(Border.BackgroundProperty, brush));
}
// For themes with blur enabled, the window border is rendered by the system, so it's treated as a simple rectangle regardless of thickness.
//(This is to avoid issues when the window is forcibly changed to a rectangular shape during snap scenarios.)
var cornerRadiusSetter = windowBorderStyle.Setters.OfType<Setter>().FirstOrDefault(x => x.Property == Border.CornerRadiusProperty);
@ -689,7 +787,7 @@ namespace Flow.Launcher.Core.Resource
cornerRadiusSetter.Value = new CornerRadius(0);
else
windowBorderStyle.Setters.Add(new Setter(Border.CornerRadiusProperty, new CornerRadius(0)));
// Apply the blur effect
Win32Helper.DWMSetBackdropForWindow(mainWindow, backdropType);
ColorizeWindow(theme, backdropType);
@ -706,13 +804,12 @@ namespace Flow.Launcher.Core.Resource
private void AutoDropShadow(bool useDropShadowEffect)
{
SetWindowCornerPreference("Default");
RemoveDropShadowEffectFromCurrentTheme();
if (useDropShadowEffect)
{
if (BlurEnabled && Win32Helper.IsBackdropSupported())
{
SetWindowCornerPreference("Round");
RemoveDropShadowEffectFromCurrentTheme();
}
else
{
@ -725,9 +822,11 @@ namespace Flow.Launcher.Core.Resource
if (BlurEnabled && Win32Helper.IsBackdropSupported())
{
SetWindowCornerPreference("Default");
RemoveDropShadowEffectFromCurrentTheme();
}
else
{
SetWindowCornerPreference("Default");
RemoveDropShadowEffectFromCurrentTheme();
}
}
@ -746,8 +845,9 @@ namespace Flow.Launcher.Core.Resource
// for theme has not "LightBG" or "DarkBG" case.
private Color GetWindowBorderStyleBackground(string theme)
{
var Resources = GetThemeResourceDictionary(theme);
var windowBorderStyle = (Style)Resources["WindowBorderStyle"];
var dict = GetThemeResourceDictionary(theme);
var windowBorderStyle = dict.Contains("WindowBorderStyle") ? dict["WindowBorderStyle"] as Style : null;
if (windowBorderStyle == null) return Colors.Transparent; // Default is transparent
var backgroundSetter = windowBorderStyle.Setters
.OfType<Setter>()
@ -765,12 +865,12 @@ namespace Flow.Launcher.Core.Resource
else if (backgroundValue is DynamicResourceExtension dynamicResource)
{
// When DynamicResource Extension it is, Key is resource's name.
var resourceKey = backgroundSetter.Value.ToString();
var resourceKey = dynamicResource.ResourceKey.ToString();
// find key in resource and return color.
if (Resources.Contains(resourceKey))
if (dict.Contains(resourceKey))
{
var colorResource = Resources[resourceKey];
var colorResource = dict[resourceKey];
if (colorResource is SolidColorBrush colorBrush)
{
return colorBrush.Color;
@ -803,7 +903,9 @@ namespace Flow.Launcher.Core.Resource
// Apply background color (remove transparency in color)
Color backgroundColor = Color.FromRgb(bgColor.Value.R, bgColor.Value.G, bgColor.Value.B);
previewStyle.Setters.Add(new Setter(Border.BackgroundProperty, new SolidColorBrush(backgroundColor)));
var brush = new SolidColorBrush(backgroundColor);
brush.Freeze();
previewStyle.Setters.Add(new Setter(Border.BackgroundProperty, brush));
// The blur theme keeps the corner round fixed (applying DWM code to modify it causes rendering issues).
// The non-blur theme retains the previously set WindowBorderStyle.
@ -817,7 +919,7 @@ namespace Flow.Launcher.Core.Resource
Application.Current.Resources["PreviewWindowBorderStyle"] = previewStyle;
}
private void CopyStyle(Style originalStyle, Style targetStyle)
private static void CopyStyle(Style originalStyle, Style targetStyle)
{
// If the style is based on another style, copy the base style first
if (originalStyle.BasedOn != null)
@ -841,20 +943,16 @@ namespace Flow.Launcher.Core.Resource
if (mainWindow == null) return;
// Check if the theme supports blur
bool hasBlur = dict.Contains("ThemeBlurEnabled") && dict["ThemeBlurEnabled"] is bool b && b;
var hasBlur = IsThemeBlurEnabled(dict);
// SystemBG value check (Auto, Light, Dark)
string systemBG = dict.Contains("SystemBG") ? dict["SystemBG"] as string : "Auto"; // 기본값 Auto
var systemBG = dict.Contains("SystemBG") ? dict["SystemBG"] as string : "Auto"; // 기본값 Auto
// Check the user's ColorScheme setting
string colorScheme = _settings.ColorScheme;
// Check system dark mode setting (read AppsUseLightTheme value)
int themeValue = (int)Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1);
bool isSystemDark = themeValue == 0;
var colorScheme = _settings.ColorScheme;
// Final decision on whether to use dark mode
bool useDarkMode = false;
var useDarkMode = false;
// If systemBG is not "Auto", prioritize it over ColorScheme and set the mode based on systemBG value
if (systemBG == "Dark")
@ -869,11 +967,20 @@ namespace Flow.Launcher.Core.Resource
{
// If systemBG is "Auto", decide based on ColorScheme
if (colorScheme == "Dark")
{
useDarkMode = true;
}
else if (colorScheme == "Light")
{
useDarkMode = false;
}
else
{
// Check system dark mode setting (read AppsUseLightTheme value)
var themeValue = (int)Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1);
var isSystemDark = themeValue == 0;
useDarkMode = isSystemDark; // Auto (based on system setting)
}
}
// Apply DWM Dark Mode
@ -906,8 +1013,8 @@ namespace Flow.Launcher.Core.Resource
Color selectedBG = useDarkMode ? DarkBG : LightBG;
ApplyPreviewBackground(selectedBG);
bool isBlurAvailable = hasBlur && Win32Helper.IsBackdropSupported(); // Windows 11 미만이면 hasBlur를 강제 false
// If Windows does not support backdrop, treat as blur unavailable
var isBlurAvailable = hasBlur && Win32Helper.IsBackdropSupported();
if (!isBlurAvailable)
{
mainWindow.Background = Brushes.Transparent;
@ -917,23 +1024,22 @@ namespace Flow.Launcher.Core.Resource
// Only set the background to transparent if the theme supports blur
if (backdropType == BackdropTypes.Mica || backdropType == BackdropTypes.MicaAlt)
{
mainWindow.Background = new SolidColorBrush(Color.FromArgb(1, 0, 0, 0));
var backgroundBrush = new SolidColorBrush(Color.FromArgb(1, 0, 0, 0));
backgroundBrush.Freeze();
mainWindow.Background = backgroundBrush;
}
else
{
mainWindow.Background = new SolidColorBrush(selectedBG);
var backgroundBrush = new SolidColorBrush(selectedBG);
backgroundBrush.Freeze();
mainWindow.Background = backgroundBrush;
}
}
}
private static bool IsBlurTheme()
private static bool IsThemeBlurEnabled(ResourceDictionary dict)
{
if (!Win32Helper.IsBackdropSupported()) // Windows 11 미만이면 무조건 false
return false;
var resource = Application.Current.TryFindResource("ThemeBlurEnabled");
return resource is bool b && b;
return dict.Contains("ThemeBlurEnabled") && dict["ThemeBlurEnabled"] is bool enabled && enabled;
}
#endregion

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">متجر الإضافات</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Obchod s pluginy</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Plugin-butik</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Plug-in-Store</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Tienda de Plugins</system:String>

View file

@ -79,8 +79,8 @@
<system:String x:Key="useLogonTaskForStartupTooltip">Después de la desinstalación, es necesario eliminar manualmente la tarea (Flow.Launcher Startup) mediante el Programador de Tareas</system:String>
<system:String x:Key="setAutoStartFailed">Error de configuración de arranque al iniciar</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Ocultar Flow Launcher cuando se pierde el foco</system:String>
<system:String x:Key="showTaskbarWhenOpened">Show taskbar when Flow Launcher is opened</system:String>
<system:String x:Key="showTaskbarWhenOpenedToolTip">Temporarily show the taskbar when Flow Launcher is opened, useful for auto-hidden taskbars.</system:String>
<system:String x:Key="showTaskbarWhenOpened">Mostrar la barra de tareas cuando Flow Launcher está abierto</system:String>
<system:String x:Key="showTaskbarWhenOpenedToolTip">Muestra temporalmente la barra de tareas cuando Flow Launcher está abierto, útil para barras de tareas que se ocultan automáticamente.</system:String>
<system:String x:Key="dontPromptUpdateMsg">No mostrar notificaciones de nuevas versiones</system:String>
<system:String x:Key="SearchWindowPosition">Ubicación de la ventana de búsqueda</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Recordar última ubicación</system:String>
@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">No se puede encontrar plugin.json en el archivo zip extraído, o esta ruta {0} no existe</system:String>
<system:String x:Key="pluginExistAlreadyMessage">Ya existe un complemento con el mismo ID y versión, o la versión es superior a la de este complemento descargado</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error al crear el panel de configuración para el complemento {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requiere la versión {1} de Flow para ejecutarse</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow no cumple los requisitos mínimos de versión para ejecutar {0}. ¿Desea continuar con la instalación?{1}{1}Recomendamos actualizar Flow a la última versión para garantizar que {0} funcione sin problemas.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">No se pudo instalar el plugin porque plugin.json no es válido o está dañado</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Tienda complementos</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Impossible de trouver le fichier plugin.json dans le fichier zip extrait, ou ce chemin {0} n'existe pas</system:String>
<system:String x:Key="pluginExistAlreadyMessage">Un plugin avec le même ID et la même version existe déjà, ou la version est supérieure à ce plugin téléchargé</system:String>
<system:String x:Key="errorCreatingSettingPanel">Erreur lors de la création du panneau de configuration pour le plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} nécessite la version {1} de Flow pour fonctionner</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow ne répond pas aux exigences de version minimale pour que {0} puisse fonctionner. Voulez-vous continuer l'installation ?{1}{1}Nous vous recommandons de mettre à jour Flow vers la dernière version pour vous assurer que {0} fonctionne sans problème.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Impossible d'installer le plugin car plugin.json est invalide ou corrompu</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Magasin des Plugins</system:String>

View file

@ -236,6 +236,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">חנות תוספים</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Negozio dei Plugin</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">展開されたzipファイルからplugin.jsonが見つからないか、このパス {0} が存在しません</system:String>
<system:String x:Key="pluginExistAlreadyMessage">同じIDとバージョンのプラグインがすでに存在するか、またはこのダウンロードしたプラグインよりもバージョンが大きいです</system:String>
<system:String x:Key="errorCreatingSettingPanel">プラグイン {0}の設定パネル作成中にエラーが発生しました:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">プラグインストア</system:String>

View file

@ -228,6 +228,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">플러그인 스토어</system:String>
@ -571,7 +574,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
<system:String x:Key="commonOK">확인</system:String>
<system:String x:Key="commonYes">예</system:String>
<system:String x:Key="commonNo">아니오</system:String>
<system:String x:Key="commonBackground">배경</system:String>
<system:String x:Key="commonBackground">백그라운드</system:String>
<!-- Crash Reporter -->
<system:String x:Key="reportWindow_version">버전</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Programtillegg butikk</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Plugin Winkel</system:String>

View file

@ -236,6 +236,9 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Sklep z wtyczkami</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Loja de Plugins</system:String>

View file

@ -236,6 +236,9 @@
<system:String x:Key="fileNotFoundMessage">Não foi possível encontrar plugin.json no ficheiro zip ou, então, o caminho {0} não existe.</system:String>
<system:String x:Key="pluginExistAlreadyMessage">Já existe um plugin com a mesma ID e versão ou, então, a versão instalada é superior à do plugin descarregado.</system:String>
<system:String x:Key="errorCreatingSettingPanel">Erro ao criar o painel de definição para o plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requer Flow Launcher v {1} para ser executado</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">A sua versão Flow Launcher não cumpre os reuisitos mínimos para executar {0}. Pretende continuar com a instalação?{1}{1}Deve atualizar Flow Launcher para a versão mais recente para poder usufruir de {0} sem quaisquer problemas.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Não foi possível instalar o plugin uma vez que plugin.json parece estar danificado.</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Loja de plugins</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Магазин плагинов</system:String>

View file

@ -238,6 +238,9 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="fileNotFoundMessage">Súbor plugin.json sa nenašiel v rozbalenom zip súbore, alebo táto cesta {0} neexistuje</system:String>
<system:String x:Key="pluginExistAlreadyMessage">Plugin s rovnakým ID už existuje, alebo ide o vyššiu verziu ako stiahnutý plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Chyba pri vytváraní panelu nastavení pre plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">Plugin {0} vyžaduje na spustenie minimálnu verziu Flow Launcheru {1}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow Launcher nespĺňa minimálne požiadavky na verziu na spustenie {0}. Chcete pokračovať v inštalácii?{1}{1}Odporúčame aktualizovať Flow Launcher na najnovšiu verziu, aby {0} fungoval bez problémov.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Inštalácia pluginu zlyhala z dôvodu neplatného alebo poškodeného súboru plugin.json</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Repozitár pluginov</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Plugin Store</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Plugin Store</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">plugin.json dosyası çıkarılan zip dosyasında bulunamadı veya {0} yolu mevcut değil</system:String>
<system:String x:Key="pluginExistAlreadyMessage">Bu eklentiyle aynı ID ve sürüme sahip bir eklenti zaten var, ya da mevcut sürüm daha yüksek</system:String>
<system:String x:Key="errorCreatingSettingPanel">Eklenti {0} için ayar paneli oluşturulurken hata oluştu: {1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Eklenti Mağazası</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Не вдалося знайти файл plugin.json у розпакованому zip-файлі або цей шлях {0} не існує.</system:String>
<system:String x:Key="pluginExistAlreadyMessage">Вже існує плагін з таким самим ідентифікатором та версією, або версія цього плагіну вища за версію завантаженого.</system:String>
<system:String x:Key="errorCreatingSettingPanel">Помилка створення панелі налаштувань для плагіну {0}: {1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">Для роботи {0} необхідна {1} версія Flow</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow не відповідає мінімальним вимогам версії для запуску {0}. Чи хочете ви продовжити його встановлення?{1}{1}Ми рекомендуємо оновити Flow до останньої версії, аби забезпечити безперебійну роботу {0}.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Не вдалося встановити плагін, оскільки файл plugin.json є недійсним або пошкодженим</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Магазин плагінів</system:String>

View file

@ -13,32 +13,32 @@
Click yes if you would like select the {0} executable again. Click no if you would like to download {1}
</system:String>
<system:String x:Key="runtimePluginUnableToSetExecutablePath">Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom).</system:String>
<system:String x:Key="failedToInitializePluginsTitle">Fail to Init Plugins</system:String>
<system:String x:Key="failedToInitializePluginsTitle">Khởi tạo các Plugin thất bại</system:String>
<system:String x:Key="failedToInitializePluginsMessage">Plugins: {0} - fail to load and would be disabled, please contact plugin creator for help</system:String>
<!-- Portable -->
<system:String x:Key="restartToDisablePortableMode">Flow Launcher needs to restart to finish disabling portable mode, after the restart your portable data profile will be deleted and roaming data profile kept</system:String>
<system:String x:Key="restartToEnablePortableMode">Flow Launcher needs to restart to finish enabling portable mode, after the restart your roaming data profile will be deleted and portable data profile kept</system:String>
<system:String x:Key="moveToDifferentLocation">Flow Launcher has detected you enabled portable mode, would you like to move it to a different location?</system:String>
<system:String x:Key="shortcutsUninstallerCreated">Flow Launcher has detected you disabled portable mode, the relevant shortcuts and uninstaller entry have been created</system:String>
<system:String x:Key="restartToDisablePortableMode">Flow Launcher cần được khởi động lại để hoàn tất tắt chế độ Portable. Sau khi khởi động lại, hồ sơ dữ liệu Portable của bạn sẽ bị xóa và hồ sơ dữ liệu Roaming sẽ được giữ lại</system:String>
<system:String x:Key="restartToEnablePortableMode">Flow Launcher cần được khởi động lại để hoàn tất bật chế độ Portable. Sau khi khởi động lại, hồ sơ dữ liệu Roaming của bạn sẽ bị xóa và hồ sơ dữ liệu Portable sẽ được giữ lại</system:String>
<system:String x:Key="moveToDifferentLocation">Flow Launcher nhận thấy bạn đã bật chế độ Portable. Bạn có muốn chuyển Flow Launcher tới một vị trí khác không?</system:String>
<system:String x:Key="shortcutsUninstallerCreated">Flow Launcher nhận thấy bạn đã tắt chế độ Portable. Những shortcut liên quan và mục gỡ cài đặt đã được tạo</system:String>
<system:String x:Key="userDataDuplicated">Flow Launcher detected your user data exists both in {0} and {1}. {2}{2}Please delete {1} in order to proceed. No changes have occurred.</system:String>
<!-- Plugin Loader -->
<system:String x:Key="pluginHasErrored">The following plugin has errored and cannot be loaded:</system:String>
<system:String x:Key="pluginsHaveErrored">The following plugins have errored and cannot be loaded:</system:String>
<system:String x:Key="referToLogs">Please refer to the logs for more information</system:String>
<system:String x:Key="referToLogs">Hãy xem log để biết thêm thông tin</system:String>
<!-- Http -->
<system:String x:Key="pleaseTryAgain">Please try again</system:String>
<system:String x:Key="pleaseTryAgain">Xin vui lòng thử lại</system:String>
<system:String x:Key="parseProxyFailed">Unable to parse Http Proxy</system:String>
<!-- AbstractPluginEnvironment -->
<system:String x:Key="failToInstallTypeScriptEnv">Failed to install TypeScript environment. Please try again later</system:String>
<system:String x:Key="failToInstallPythonEnv">Failed to install Python environment. Please try again later.</system:String>
<system:String x:Key="failToInstallPythonEnv">Cài đặt môi trường Python thất bại. Xin vui lòng thử lại sau.</system:String>
<!-- MainWindow -->
<system:String x:Key="registerHotkeyFailed">Không thể đăng ký phím nóng &quot;{0}&quot;. 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.</system:String>
<system:String x:Key="unregisterHotkeyFailed">Failed to unregister hotkey &quot;{0}&quot;. Please try again or see log for details</system:String>
<system:String x:Key="unregisterHotkeyFailed">Hủy đăng ký phím nóng &quot;{0}&quot; thất bại. Xin vui lòng thử lại hoặc xem log để biết thêm chi tiết</system:String>
<system:String x:Key="MessageBoxTitle">Flow Launcher</system:String>
<system:String x:Key="couldnotStartCmd">Không thể khởi động {0}</system:String>
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Định dạng tệp plugin Flow Launcher không chính xác</system:String>
@ -63,11 +63,11 @@
<system:String x:Key="GameModeToolTip">Tạm dừng sử dụng phím nóng.</system:String>
<system:String x:Key="PositionReset">Đặt lại vị trí</system:String>
<system:String x:Key="PositionResetToolTip">Cài lại vị trí cửa sổ tìm kiếm</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Gõ vào đây để tìm kiếm</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Plugin này vẫn đang được khởi tạo...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Select this result to requery</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Failed to respond!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Select this result for more info</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Phản hồi thất bại!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Hãy chọn kết quả này để biết thêm thông tin</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Cài đặt</system:String>
@ -75,14 +75,14 @@
<system:String x:Key="portableMode">Chế độ Portabler</system:String>
<system:String x:Key="portableModeToolTIp">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).</system:String>
<system:String x:Key="startFlowLauncherOnSystemStartup">Khởi động Flow Launcher khi khởi động hệ thống</system:String>
<system:String x:Key="useLogonTaskForStartup">Use logon task instead of startup entry for faster startup experience</system:String>
<system:String x:Key="useLogonTaskForStartupTooltip">After uninstallation, you need to manually remove this task (Flow.Launcher Startup) via Task Scheduler</system:String>
<system:String x:Key="useLogonTaskForStartup">Dùng logon task thay cho startup entry để khởi động nhanh hơn</system:String>
<system:String x:Key="useLogonTaskForStartupTooltip">Sau khi gỡ cài đặt, bạn cần tự xóa task này (Flow.Launcher Startup) bằng Task Scheduler</system:String>
<system:String x:Key="setAutoStartFailed">Không lưu được tính năng tự khởi động khi khởi động hệ thống</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Ẩn Flow Launcher khi mất tiêu điểm</system:String>
<system:String x:Key="showTaskbarWhenOpened">Show taskbar when Flow Launcher is opened</system:String>
<system:String x:Key="showTaskbarWhenOpenedToolTip">Temporarily show the taskbar when Flow Launcher is opened, useful for auto-hidden taskbars.</system:String>
<system:String x:Key="showTaskbarWhenOpened">Hiện thanh tác vụ khi đang mở Flow Launcher</system:String>
<system:String x:Key="showTaskbarWhenOpenedToolTip">Tạm thời hiện thanh tác vụ khi Flow Launcher được bật, hữu ích khi bạn dùng taskbar tự động ẩn.</system:String>
<system:String x:Key="dontPromptUpdateMsg">Không hiển thị thông báo khi có phiên bản mới</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowPosition">Vị trí cửa sổ tìm kiếm</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Ghi nhớ vị trí cuối cùng</system:String>
<system:String x:Key="SearchWindowScreenCursor">Màn hình bằng con trỏ chuột</system:String>
<system:String x:Key="SearchWindowScreenFocus">Màn hình có cửa sổ được tập trung</system:String>
@ -117,7 +117,7 @@
<system:String x:Key="typingStartEn">Luôn bắt đầu nhập ở chế độ tiếng Anh</system:String>
<system:String x:Key="typingStartEnTooltip">Tạm thời chuyển phương thức nhập sang tiếng Anh khi kích hoạt Flow.</system:String>
<system:String x:Key="autoUpdates">Cập nhật tự động</system:String>
<system:String x:Key="autoUpdatesTooltip">Automatically check and update the app when available</system:String>
<system:String x:Key="autoUpdatesTooltip">Tự động kiểm tra và cập nhật app khi có phiên bản mới</system:String>
<system:String x:Key="select">Chọn</system:String>
<system:String x:Key="hideOnStartup">Ẩn Flow Launcher khi khởi động</system:String>
<system:String x:Key="hideOnStartupToolTip">Flow Launcher sẽ ẩn trong khay hệ thống sau khi khởi động.</system:String>
@ -173,9 +173,9 @@
<system:String x:Key="KoreanImeRegistryTooltip">You can change the Previous Korean IME settings directly from here</system:String>
<system:String x:Key="KoreanImeSettingChangeFailTitle">Failed to change Korean IME setting</system:String>
<system:String x:Key="KoreanImeSettingChangeFailSubTitle">Please check your system registry access or contact support.</system:String>
<system:String x:Key="homePage">Home Page</system:String>
<system:String x:Key="homePage">Trang chủ</system:String>
<system:String x:Key="homePageToolTip">Show home page results when query text is empty.</system:String>
<system:String x:Key="historyResultsForHomePage">Show History Results in Home Page</system:String>
<system:String x:Key="historyResultsForHomePage">Hiện lịch sử kết quả ở trang chủ</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum History Results Shown in Home Page</system:String>
<system:String x:Key="historyStyle">History Style</system:String>
<system:String x:Key="historyStyleTooltip">Choose the type of history to show in the History and Home Page</system:String>
@ -212,7 +212,7 @@
<system:String x:Key="DisplayModeOnOff">Đã bật</system:String>
<system:String x:Key="DisplayModePriority">Ưu tiên</system:String>
<system:String x:Key="DisplayModeSearchDelay">Search Delay</system:String>
<system:String x:Key="DisplayModeHomeOnOff">Home Page</system:String>
<system:String x:Key="DisplayModeHomeOnOff">Trang chủ</system:String>
<system:String x:Key="currentPriority">Ưu tiên hiện tại</system:String>
<system:String x:Key="newPriority">Ưu tiên mới</system:String>
<system:String x:Key="priority">Ưu tiên</system:String>
@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">Tải tiện ích mở rộng</system:String>
@ -255,7 +258,7 @@
<system:String x:Key="ErrorInstallingPlugin">Lỗi cài đặt plugin</system:String>
<system:String x:Key="ErrorUninstallingPlugin">Lỗi cài đặt plugin</system:String>
<system:String x:Key="ErrorUpdatingPlugin">Error updating plugin</system:String>
<system:String x:Key="KeepPluginSettingsTitle">Keep plugin settings</system:String>
<system:String x:Key="KeepPluginSettingsTitle">Giữ lại các cài đặt plugin</system:String>
<system:String x:Key="KeepPluginSettingsSubtitle">Do you want to keep the settings of the plugin for the next usage?</system:String>
<system:String x:Key="InstallSuccessNoRestart">Plugin {0} successfully installed. Please restart Flow.</system:String>
<system:String x:Key="UninstallSuccessNoRestart">Plugin {0} successfully uninstalled. Please restart Flow.</system:String>
@ -545,7 +548,7 @@
<system:String x:Key="searchDelayTimeTips">Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time.</system:String>
<!-- Search Delay Settings Dialog -->
<system:String x:Key="homeTitle">Home Page</system:String>
<system:String x:Key="homeTitle">Trang chủ</system:String>
<system:String x:Key="homeTips">Enable the plugin home page state if you like to show the plugin results when query is empty.</system:String>
<!-- Custom Query Hotkey Dialog -->

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">无法从提取的zip文件中找到plugin.json或者此路径 {0} 不存在</system:String>
<system:String x:Key="pluginExistAlreadyMessage">已存在相同ID和版本的插件或者存在版本大于此下载的插件</system:String>
<system:String x:Key="errorCreatingSettingPanel">为插件 {0} 创建设置面板时出错:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">插件商店</system:String>

View file

@ -237,6 +237,9 @@
<system:String x:Key="fileNotFoundMessage">Unable to find plugin.json from the extracted zip file, or this path {0} does not exist</system:String>
<system:String x:Key="pluginExistAlreadyMessage">A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin</system:String>
<system:String x:Key="errorCreatingSettingPanel">Error creating setting panel for plugin {0}:{1}{2}</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedTitle">{0} requires Flow version {1} to run</system:String>
<system:String x:Key="pluginMinimumAppVersionUnsatisfiedMessage">Flow does not meet the minimum version requirements for {0} to run. Do you want to continue installing it?{1}{1}We recommend updating Flow to the latest version to ensure that {0} works without issues.</system:String>
<system:String x:Key="pluginJsonInvalidOrCorrupted">Failed to install plugin because plugin.json is invalid or corrupted</system:String>
<!-- Setting Plugin Store -->
<system:String x:Key="pluginStore">插件商店</system:String>

View file

@ -342,6 +342,7 @@
Margin="12 0 12 0"
HorizontalAlignment="Center"
VerticalAlignment="Bottom"
Loaded="ProgressBar_Loaded"
StrokeThickness="2"
Visibility="{Binding ProgressBarVisibility, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
X1="-100"

View file

@ -199,9 +199,6 @@ namespace Flow.Launcher
ThemeManager.Current.ApplicationTheme = ApplicationTheme.Dark;
}
// Initialize position
InitProgressbarAnimation();
// Force update position
UpdatePosition();
@ -354,6 +351,11 @@ namespace Flow.Launcher
}
}
private void ProgressBar_Loaded(object sender, RoutedEventArgs e)
{
InitProgressbarAnimation();
}
private async void OnClosing(object sender, CancelEventArgs e)
{
if (!CanClose)

View file

@ -12,7 +12,7 @@
<system:String x:Key="flowlauncher_plugin_calculator_decimal_separator_comma">Coma (,)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_decimal_separator_dot">Punto (.)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_max_decimal_places">Número máximo de decimales</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_use_thousands_separator">Show thousands separator in results</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_use_thousands_separator">Mostrar separador de miles en los resultados</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_failed_to_copy">Ha fallado la copia, inténtelo más tarde</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_show_error_message">Mostrar mensaje de error cuando falle el cálculo</system:String>
</ResourceDictionary>

View file

@ -12,7 +12,7 @@
<system:String x:Key="flowlauncher_plugin_calculator_decimal_separator_comma">Кома (,)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_decimal_separator_dot">Крапка (.)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_max_decimal_places">Макс. кількість знаків після коми</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_use_thousands_separator">Show thousands separator in results</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_use_thousands_separator">Показати роздільник тисяч у результатах</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_failed_to_copy">Копіювання не вдалося, спробуйте пізніше</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_show_error_message">Показувати повідомлення про помилку, якщо обчислення не вдалося</system:String>
</ResourceDictionary>

View file

@ -2,7 +2,7 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_calculator_plugin_name">Máy tính</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_plugin_description">Perform mathematical calculations, including hex values and advanced functions such as 'min(1,2,3)', 'sqrt(123)' and 'cos(123)'.</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_plugin_description">Thực hiện các phép tính toán học, bao gồm cả các số thuộc hệ thập lục phân và các hàm nâng cao như 'min(1,2,3)', 'sqrt(123)' và 'cos(123)'.</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_not_a_number">Không phải là số (NaN)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_expression_not_complete">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?)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_copy_number_to_clipboard">Sao chép số này vào clipboard</system:String>
@ -12,7 +12,7 @@
<system:String x:Key="flowlauncher_plugin_calculator_decimal_separator_comma">Dấu phẩy (,)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_decimal_separator_dot">dấu chấm (.)</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_max_decimal_places">Tối đa. chữ số thập phân</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_use_thousands_separator">Show thousands separator in results</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_failed_to_copy">Copy failed, please try later</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_show_error_message">Show error message when calculation fails</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_use_thousands_separator">Hiển thị dấu phân cách hàng nghìn trong kết quả</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_failed_to_copy">Sao chép thất bại, xin vui lòng thử lại sau</system:String>
<system:String x:Key="flowlauncher_plugin_calculator_show_error_message">Hiển thị thông báo lỗi khi tính toán thất bại</system:String>
</ResourceDictionary>

View file

@ -103,7 +103,7 @@
<system:String x:Key="plugin_explorer_deletefolder_subtitle">Permanently delete current folder</system:String>
<system:String x:Key="plugin_explorer_name">Tên</system:String>
<system:String x:Key="plugin_explorer_type">Type</system:String>
<system:String x:Key="plugin_explorer_path">Path</system:String>
<system:String x:Key="plugin_explorer_path">Đường dẫn</system:String>
<system:String x:Key="plugin_explorer_file">Ngày tháng</system:String>
<system:String x:Key="plugin_explorer_folder">Thư Mục</system:String>
<system:String x:Key="plugin_explorer_deletefilefolder_subtitle">Xóa đã chọn</system:String>
@ -148,35 +148,35 @@
<!-- Everything -->
<system:String x:Key="flowlauncher_plugin_everything_sdk_issue">Failed to load Everything SDK</system:String>
<system:String x:Key="flowlauncher_plugin_everything_is_not_running">Warning: Everything service is not running</system:String>
<system:String x:Key="flowlauncher_plugin_everything_query_error">Error while querying Everything</system:String>
<system:String x:Key="flowlauncher_plugin_everything_is_not_running">Cảnh báo: service Everything hiện không chạy</system:String>
<system:String x:Key="flowlauncher_plugin_everything_query_error">Có lỗi khi truy vấn Everything</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by">Sắp xếp theo</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_name_ascending">Name ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_name_descending">Name ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_path_ascending">Path ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_path_descending">Path ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_size_ascending">Size ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_size_descending">Size ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_extension_ascending">Extension ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_extension_descending">Extension ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_name_ascending">Tên ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_name_descending">Tên ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_path_ascending">Đường dẫn ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_path_descending">Đường dẫn ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_size_ascending">Kích thước ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_size_descending">Kích thước ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_extension_ascending">Tiện ích mở rộng ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_extension_descending">Tiện ích mở rộng ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_type_name_ascending">Type Name ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_type_name_descending">Type Name ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_created_ascending">Date Created ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_created_descending">Date Created ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_modified_ascending">Date Modified ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_modified_descending">Date Modified ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_created_ascending">Ngày tạo ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_created_descending">Ngày tạo ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_modified_ascending">Ngày chỉnh sửa ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_modified_descending">Ngày chỉnh sửa ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_attributes_ascending">Attributes ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_attributes_descending">Attributes ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_file_list_filename_ascending">File List FileName ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_file_list_filename_descending">File List FileName ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_run_count_ascending">Run Count ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_run_count_descending">Run Count ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_recently_changed_ascending">Date Recently Changed ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_recently_changed_descending">Date Recently Changed ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_accessed_ascending">Date Accessed ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_accessed_descending">Date Accessed ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_run_ascending">Date Run ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_run_descending">Date Run ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_run_count_ascending">Số lần chạy ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_run_count_descending">Số lần chạy ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_recently_changed_ascending">Ngày chỉnh sửa gần nhất ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_recently_changed_descending">Ngày chỉnh sửa gần nhất ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_accessed_ascending">Ngày truy cập ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_accessed_descending">Ngày truy cập ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_run_ascending">Ngày chạy ↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_date_run_descending">Ngày chạy ↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_ascending">↑</system:String>
<system:String x:Key="flowlauncher_plugin_everything_sort_by_descending">↓</system:String>
<system:String x:Key="flowlauncher_plugin_everything_nonfastsort_warning">Warning: This is not a Fast Sort option, searches may be slow</system:String>
@ -204,10 +204,10 @@
<system:String x:Key="plugin_explorer_native_context_menu_exclude_patterns_guide">Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with').</system:String>
<!-- Preview Info -->
<system:String x:Key="Today">Today</system:String>
<system:String x:Key="DaysAgo">{0} days ago</system:String>
<system:String x:Key="OneMonthAgo">1 month ago</system:String>
<system:String x:Key="MonthsAgo">{0} months ago</system:String>
<system:String x:Key="OneYearAgo">1 year ago</system:String>
<system:String x:Key="YearsAgo">{0} years ago</system:String>
<system:String x:Key="Today">Hôm nay</system:String>
<system:String x:Key="DaysAgo">{0} ngày trước</system:String>
<system:String x:Key="OneMonthAgo">1 tháng trước</system:String>
<system:String x:Key="MonthsAgo">{0} tháng trước</system:String>
<system:String x:Key="OneYearAgo">1 năm trước</system:String>
<system:String x:Key="YearsAgo">{0} năm trước</system:String>
</ResourceDictionary>

View file

@ -1,9 +1,9 @@
<?xml version="1.0"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="flowlauncher_plugin_pluginindicator_result_subtitle">Activate {0} plugin action keyword</system:String>
<system:String x:Key="flowlauncher_plugin_pluginindicator_result_subtitle">Kích hoạt từ khóa cho plugin {0}</system:String>
<system:String x:Key="flowlauncher_plugin_pluginindicator_plugin_name">Chỉ báo plugin</system:String>
<system:String x:Key="flowlauncher_plugin_pluginindicator_plugin_description">Cung cấp plugin gợi ý từ hành động</system:String>
<system:String x:Key="flowlauncher_plugin_pluginindicator_plugin_description">Cung cấp các gợi ý từ khóa cho plugin</system:String>
</ResourceDictionary>

View file

@ -13,7 +13,7 @@
<system:String x:Key="plugin_pluginsmanager_installing_plugin">Cài đặt Plugin</system:String>
<system:String x:Key="plugin_pluginsmanager_install_from_web">Tải về và cài đặt</system:String>
<system:String x:Key="plugin_pluginsmanager_uninstall_title">Đã gỡ cài đặt plugin</system:String>
<system:String x:Key="plugin_pluginsmanager_keep_plugin_settings_title">Keep plugin settings</system:String>
<system:String x:Key="plugin_pluginsmanager_keep_plugin_settings_title">Giữ lại các cài đặt plugin</system:String>
<system:String x:Key="plugin_pluginsmanager_keep_plugin_settings_subtitle">Do you want to keep the settings of the plugin for the next usage?</system:String>
<system:String x:Key="plugin_pluginsmanager_install_success_restart">Đã cài đặt thành công plugin. Đang khởi động lại Flow, vui lòng đợi...</system:String>
<system:String x:Key="plugin_pluginsmanager_install_errormetadatafile">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.</system:String>
@ -29,10 +29,10 @@
<system:String x:Key="plugin_pluginsmanager_update_alreadyexists">Đã cài đặt plugin</system:String>
<system:String x:Key="plugin_pluginsmanager_update_failed_title">Tải xuống bản kê khai plugin không thành công</system:String>
<system:String x:Key="plugin_pluginsmanager_update_failed_subtitle">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.</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_title">Update all plugins</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_subtitle">Would you like to update all plugins?</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_title">Cập nhật tất cả plugin</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_subtitle">Bạn có muốn cập nhật tất cả các plugin không?</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_prompt">Would you like to update {0} plugins?{1}Flow Launcher will restart after updating all plugins.</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_prompt_no_restart">Would you like to update {0} plugins?</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_prompt_no_restart">Bạn có muốn cập nhật {0} plugin không?</system:String>
<system:String x:Key="plugin_pluginsmanager_update_all_success_restart">{0} plugins successfully updated. Restarting Flow, please wait...</system:String>
<system:String x:Key="plugin_pluginsmanager_update_success_restart">Plugin {0} successfully updated. Restarting Flow, please wait...</system:String>
<system:String x:Key="plugin_pluginsmanager_install_unknown_source_warning_title">Cài đặt từ một nguồn không xác định</system:String>

View file

@ -6,15 +6,15 @@
<system:String x:Key="flowlauncher_plugin_cmd_press_any_key_to_close">Nhấn phím bất kỳ để đóng cửa sổ này...</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_leave_cmd_open">Không đóng dấu nhắc lệnh sau khi thực hiện lệnh</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_always_run_as_administrator">Luôn chạy với tư cách quản trị viên</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_use_windows_terminal">Use Windows Terminal</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_use_windows_terminal">Sử dụng Windows Terminal</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_run_as_different_user">Xóa lựa chọn đã chọn</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_plugin_name">Vỏ</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_plugin_description">Allows to execute system commands from Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_plugin_description">Cho phép thực thi các lệnh hệ thống từ Flow Launcher</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_cmd_has_been_executed_times">lệnh này đã được thực thi {0} lần</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_execute_through_shell">thực thi lệnh thông qua lệnh shell</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_run_as_administrator">Chạy với quyền quản trị</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_copy">Sao chép lệnh</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_history">Chỉ hiển thị số lượng lệnh được sử dụng nhiều nhất:</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_command_not_found">Command not found: {0}</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_error_running_command">Error running the command: {0}</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_command_not_found">Không tìm thấy lệnh: {0}</system:String>
<system:String x:Key="flowlauncher_plugin_cmd_error_running_command">Lỗi khi chạy lệnh: {0}</system:String>
</ResourceDictionary>

View file

@ -2,7 +2,7 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Setting -->
<system:String x:Key="flowlauncher_plugin_sys_skip_confirm">Skip confirmation when Shutting down, Restarting, or Logging off</system:String>
<system:String x:Key="flowlauncher_plugin_sys_skip_confirm">Omitir la confirmación al apagar, reiniciar o cerrar sesión</system:String>
<!-- Command List -->
<system:String x:Key="flowlauncher_plugin_sys_name">Nombre</system:String>

View file

@ -2,7 +2,7 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Setting -->
<system:String x:Key="flowlauncher_plugin_sys_skip_confirm">Skip confirmation when Shutting down, Restarting, or Logging off</system:String>
<system:String x:Key="flowlauncher_plugin_sys_skip_confirm">Ignorar confirmação ao desligar, reiniciar ou terminar sessão</system:String>
<!-- Command List -->
<system:String x:Key="flowlauncher_plugin_sys_name">Nome</system:String>

View file

@ -2,7 +2,7 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Setting -->
<system:String x:Key="flowlauncher_plugin_sys_skip_confirm">Skip confirmation when Shutting down, Restarting, or Logging off</system:String>
<system:String x:Key="flowlauncher_plugin_sys_skip_confirm">Пропустити підтвердження під час вимкнення, перезапуску або виходу із системи</system:String>
<!-- Command List -->
<system:String x:Key="flowlauncher_plugin_sys_name">Назва</system:String>

View file

@ -9,13 +9,13 @@
<system:String x:Key="flowlauncher_plugin_sys_desc">Mô Tả</system:String>
<system:String x:Key="flowlauncher_plugin_sys_command">Lệnh</system:String>
<system:String x:Key="flowlauncher_plugin_sys_shutdown_computer_cmd">Shutdown</system:String>
<system:String x:Key="flowlauncher_plugin_sys_restart_computer_cmd">Restart</system:String>
<system:String x:Key="flowlauncher_plugin_sys_restart_advanced_cmd">Restart With Advanced Boot Options</system:String>
<system:String x:Key="flowlauncher_plugin_sys_log_off_cmd">Log Off/Sign Out</system:String>
<system:String x:Key="flowlauncher_plugin_sys_lock_cmd">Lock</system:String>
<system:String x:Key="flowlauncher_plugin_sys_sleep_cmd">Sleep</system:String>
<system:String x:Key="flowlauncher_plugin_sys_hibernate_cmd">Hibernate</system:String>
<system:String x:Key="flowlauncher_plugin_sys_shutdown_computer_cmd">Tắt máy</system:String>
<system:String x:Key="flowlauncher_plugin_sys_restart_computer_cmd">Khởi động lại</system:String>
<system:String x:Key="flowlauncher_plugin_sys_restart_advanced_cmd">Khởi động lại với các tùy chọn khởi động nâng cao</system:String>
<system:String x:Key="flowlauncher_plugin_sys_log_off_cmd">Đăng xuất</system:String>
<system:String x:Key="flowlauncher_plugin_sys_lock_cmd">Khóa máy</system:String>
<system:String x:Key="flowlauncher_plugin_sys_sleep_cmd">Chế độ ngủ</system:String>
<system:String x:Key="flowlauncher_plugin_sys_hibernate_cmd">Chế độ ngủ đông</system:String>
<system:String x:Key="flowlauncher_plugin_sys_indexoption_cmd">Index Option</system:String>
<system:String x:Key="flowlauncher_plugin_sys_emptyrecyclebin_cmd">Empty Recycle Bin</system:String>
<system:String x:Key="flowlauncher_plugin_sys_openrecyclebin_cmd">Open Recycle Bin</system:String>

View file

@ -2,7 +2,7 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib">
<!-- Setting -->
<system:String x:Key="flowlauncher_plugin_sys_skip_confirm">Skip confirmation when Shutting down, Restarting, or Logging off</system:String>
<system:String x:Key="flowlauncher_plugin_sys_skip_confirm">关闭、重启或注销时跳过确认</system:String>
<!-- Command List -->
<system:String x:Key="flowlauncher_plugin_sys_name">名称</system:String>

View file

@ -19,7 +19,7 @@
<system:String x:Key="flowlauncher_plugin_websearch_url">URL</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_search">Busca en</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_enable_suggestion">Usar autocompletado en consultas de búsqueda</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_max_suggestions">Max Suggestions</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_max_suggestions">Sugerencias máximas</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_enable_suggestion_provider">Autocompletar datos desde:</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_pls_select_web_search">Por favor, seleccione una búsqueda web</system:String>
<system:String x:Key="flowlauncher_plugin_websearch_delete_warning">¿Está seguro de que desea eliminar {0}?</system:String>