Compare commits

..

591 commits
v2.0.0 ... dev

Author SHA1 Message Date
Jack Ye
e8353f7648
Merge pull request #4339 from Flow-Launcher/copilot/fix-folder-search-action
Some checks failed
Build / build (push) Has been cancelled
Fix ArgumentException when editing a disabled Explorer action keyword
2026-03-10 23:29:51 +08:00
VictoriousRaptor
8d042d2134
Fix settings window is minimized when re-opened. (#4341)
* Fix settings window is minimized when re-opened

* Don't save minimized state
2026-03-10 22:50:40 +08:00
Jack Ye
a406eb83e1
Fix ReportWindow crash when log directory is empty or missing (#4338)
* Initial plan

* Fix ReportWindow crash when log directory is empty or doesn't exist

Co-authored-by: Jack251970 <53996452+Jack251970@users.noreply.github.com>

* Improve code comments

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-10 20:29:09 +08:00
copilot-swe-agent[bot]
531b45210a Fix exception when setting Folder Search action keyword in Explorer plugin
- Fix (false, false) case in EditActionKeyword to break gracefully instead
  of throwing ArgumentException. This handles the valid scenario where the
  user changes a disabled keyword's text but keeps it disabled.
- Fix GetActiveActionKeywords to return an empty dictionary instead of null
  when actionKeywordStr is null/empty, preventing NullReferenceException.
- Fix ActionKeyword setter to only auto-enable when the value actually
  changes, preventing unintended side-effects during construction.
- Initialize ActionKeywordSetting backing fields directly in constructor to
  avoid the auto-enable triggering during initialization.
- Change TextBox binding to UpdateSourceTrigger=PropertyChanged so the
  checkbox auto-enables as the user types (before they click the checkbox),
  fixing the checkbox toggle issue caused by LostFocus timing.

Co-authored-by: Jack251970 <53996452+Jack251970@users.noreply.github.com>
2026-03-10 05:40:25 +00:00
copilot-swe-agent[bot]
319db64393 Initial plan 2026-03-10 05:19:00 +00:00
Jack Ye
24f6c90f72
Merge pull request #4333 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Svg.Skia-3.5.0
Some checks are pending
Build / build (push) Waiting to run
Bump Svg.Skia from 3.4.1 to 3.5.0
2026-03-10 11:52:19 +08:00
dependabot[bot]
3e493263c3
Bump Svg.Skia from 3.4.1 to 3.5.0
---
updated-dependencies:
- dependency-name: Svg.Skia
  dependency-version: 3.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 23:05:08 +00:00
Jack Ye
916b4ff091
Merge pull request #4312 from Flow-Launcher/Theme_Enhancement
Some checks are pending
Build / build (push) Waiting to run
Improve code quality
2026-03-09 15:15:41 +08:00
Jack Ye
dad8f3e695
Merge branch 'dev' into Theme_Enhancement 2026-03-09 12:05:48 +08:00
Jeremy Wu
7a46fac41a
Merge pull request #4329 from Flow-Launcher/merge_back_2_1_1
Merge v2.1.1 back to dev
2026-03-09 15:00:27 +11:00
Jeremy
79f3bfab96 merge back v2.1.1 from master to dev 2026-03-09 14:50:29 +11:00
Jeremy Wu
0d9cc7ef83
Release 2.1.1 (#4327)
Some checks failed
Publish Default Plugins / publish (push) Has been cancelled
Build / build (push) Has been cancelled
2026-03-09 11:23:36 +08:00
Jack Ye
0ddcc5c1c6
Merge pull request #4319 from Flow-Launcher/FreezeResources1
Freeze SolidColorBrush to improve performance
2026-03-09 11:11:59 +08:00
Jeremy Wu
5ef6a2b688
New Crowdin updates (#4293) 2026-03-09 04:44:49 +02:00
Jack251970
7766d7053d Rename GetFreezeSolidColorBrush to GetFrozenSolidColorBrush
Renamed the method GetFreezeSolidColorBrush to GetFrozenSolidColorBrush in ThemeHelper.cs for improved naming consistency. Updated all references in Theme.cs accordingly. No changes to functionality.
2026-03-08 23:49:09 +08:00
Jack251970
36e15d3809 Refactor: move CopyStyle to ThemeHelper class
Moved the CopyStyle method from Theme to a new static ThemeHelper class for better code organization and reusability. Updated all references in Theme to use ThemeHelper.CopyStyle. Added ThemeHelper.cs and necessary using directives.
2026-03-08 23:48:10 +08:00
Jack251970
ed14c45fd2 Refactor brush creation with ThemeHelper utility
Introduce ThemeHelper.GetFreezeSolidColorBrush to centralize and reuse SolidColorBrush creation and freezing logic. Refactor Theme.cs to use this helper, improving code clarity and maintainability. Also, use Brushes.Transparent directly where appropriate.
2026-03-08 23:46:08 +08: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
Jack Ye
1bdc1164f8
Merge pull request #4322 from Flow-Launcher/FixSelectionBrush
Use DynamicResource for TextBox SelectionBrush
2026-03-08 17:56:16 +08:00
Jack251970
71944ab6cd Use DynamicResource for TextBox SelectionBrush
Changed SelectionBrush in TextBox style from StaticResource to DynamicResource for SystemAccentColorLight1Brush. This enables automatic updates to the selection color when the resource changes at runtime, improving theme responsiveness.
2026-03-04 18:42:19 +08:00
Jack Ye
984b3dabdc
Fix Explorer plugin Quick Access items missing from general search results (#4294)
Some checks failed
Build / build (push) Has been cancelled
2026-03-04 21:25:25 +11:00
Jack251970
9abf136ea2 Improve SolidColorBrush usage and property checks in Theme
Refactor background brush creation to assign, freeze, and reuse
SolidColorBrush instances for better WPF performance. Replace
string-based property checks with type-safe Control.BackgroundProperty
comparisons for improved robustness.
2026-03-04 12:48:48 +08: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
Jack251970
6566871b15 Refactor theme blur and dark mode handling logic
Refactored Theme.cs to improve theme blur and dark mode handling:
- Replaced static IsBlurTheme() with IsThemeBlurEnabled(dict) for per-theme blur detection.
- Updated all blur checks to use the new method.
- Improved code style, readability, and comments.
- Moved system dark mode registry check to only run when needed.
- Ensured blur and dark mode are applied based on theme and user/system preferences.
2026-03-02 18:03:24 +08:00
Jack Ye
dda900041a
Merge pull request #4299 from Flow-Launcher/IsMinimumAppVersionSatisfied
Some checks failed
Build / build (push) Has been cancelled
Add MinimumAppVersion support for plugin.json
2026-03-01 11:15:01 +08:00
Jack251970
cce80ac5aa Ensure temporary folder deletion 2026-02-27 19:14:03 +08:00
Jack251970
036a3761ea Remove log for plugin version mismatch in PluginManager
Logging when a plugin's minimum Flow Launcher version is not met
has been removed. The method now returns false without logging
any informational message.
2026-02-27 19:05:25 +08:00
Jack251970
48878d2d8c Make log message context-neutral 2026-02-27 19:04:30 +08:00
Jack Ye
dca90916fe
Fix translations
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-27 19:02:50 +08:00
Jack251970
ba1908d605 Update plugin min version warning message formatting
Improved the message shown when a plugin requires a newer Flow Launcher version by adding line breaks for clarity and updating the title wording. Adjusted code to pass Environment.NewLine and modified resource strings in en.xaml to support the new format.
2026-02-27 18:54:13 +08:00
Jack251970
590bf20204 Add null check for plugin metadata deserialization
Throw a JsonException if deserializing plugin metadata from JSON returns null. This prevents null metadata from being used and improves error handling for invalid or corrupted plugin.json files.
2026-02-27 18:53:30 +08:00
Jack251970
b02a5a265d Refactor plugin min version check and improve logging
Refactored the plugin minimum app version check to use Version.TryParse instead of try-catch with Version.Parse, preventing exceptions on invalid input. Improved error handling by logging parse failures as errors and version mismatches as info, making the logic clearer and more robust.
2026-02-27 18:48:59 +08:00
Jack251970
b1b18ee215 Improve error handling for invalid plugin.json files
Previously, installing a plugin with an invalid or corrupted plugin.json would cause an unhandled exception. Now, deserialization errors are caught, a user-friendly error message is shown, and the exception is logged. Added a new localized error message for this scenario in en.xaml.
2026-02-27 18:42:07 +08:00
Jack Ye
8e4f7258ff
Improve translations
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-27 18:36:54 +08:00
Jack251970
2e0db3b90f Add MinimumAppVersion support for plugins
Introduced MinimumAppVersion property to PluginMetadata, enabling plugins to specify required Flow Launcher version. Plugin installation now checks this requirement and prompts users if unsatisfied. Minimum app version logic moved to PluginManager and applied to manifest updates. Added localized strings for user prompts. Refactored SameOrLesserPluginVersionExists to accept PluginMetadata.
2026-02-27 18:30:29 +08:00
Jack Ye
54dc790cb6
Merge pull request #4297 from Flow-Launcher/dependabot/github_actions/actions/upload-artifact-7
Some checks failed
Build / build (push) Has been cancelled
Bump actions/upload-artifact from 6 to 7
2026-02-27 12:08:19 +08:00
dependabot[bot]
ed6fe34192
Bump actions/upload-artifact from 6 to 7
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-26 22:42:54 +00:00
Jeremy Wu
10fcbb9990
Merge pull request #4292 from Flow-Launcher/merge_2_1_0
Some checks failed
Build / build (push) Has been cancelled
Merge v2.1.0 back to dev
2026-02-25 22:54:55 +11:00
Jeremy Wu
980c1a1060
Merge branch 'dev' into merge_2_1_0 2026-02-25 22:45:03 +11:00
Jeremy Wu
cd9825380d
Release 2.1.0 | Plugin 5.2.0 (#4276)
Some checks failed
Publish Default Plugins / publish (push) Has been cancelled
Build / build (push) Has been cancelled
2026-02-24 22:52:23 +11:00
Jack Ye
3b3a59fd62
Fix process priority for logon startup task set to BelowNormal by default (#4283)
Some checks are pending
Build / build (push) Waiting to run
2026-02-24 21:17:22 +11:00
Jack Ye
73f657f84e
Merge pull request #4279 from Flow-Launcher/websearch_ui
Some checks are pending
Build / build (push) Waiting to run
Enable TwoWay binding for MaxSuggestions NumberBox
2026-02-24 14:25:10 +08:00
Jack Ye
c9baab7ac9
Merge branch 'dev' into websearch_ui 2026-02-24 00:08:25 +08:00
Jack251970
72269db8e6 Enable TwoWay binding for MaxSuggestions NumberBox
Changed NumberBox binding for Settings.MaxSuggestions from OneWay to TwoWay, allowing user input in the UI to update the underlying setting. This ensures changes made by users are saved back to the settings model.
2026-02-24 00:07:36 +08:00
Jack Ye
ffa974b4e5
Merge pull request #4277 from Flow-Launcher/websearch_ui
Some checks are pending
Build / build (push) Waiting to run
Downgrade iNKORE.UI.WPF.Modern to 0.10.1 for WebSearch Plugin
2026-02-23 17:09:43 +08:00
Jack Ye
727aac4b82
Merge pull request #4278 from Flow-Launcher/SkiaSharp_runtimes
Some checks are pending
Build / build (push) Waiting to run
Remove Skia sharp unnecessary runtimes from packages
2026-02-23 17:01:00 +08:00
Jack251970
9e66f71774 Revert version bump of SkiaSharp package 2026-02-23 16:36:08 +08:00
Jack Ye
d511872c00
Ensure runtimes folder
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-22 21:29:01 +08:00
Jack251970
c46a52d1ca Remove SkiaSharp .pdb files after build and publish
Added MSBuild targets to delete unnecessary SkiaSharp .pdb files from output and publish directories after build and publish steps, reducing artifact size.
2026-02-22 21:22:17 +08:00
Jack251970
c04da3ab83 Add RISC-V 64-bit runtime support to project config
Included linux-musl-riscv64 and linux-riscv64 in both OutputPath and PublishDir of Flow.Launcher.Plugin.BrowserBookmark.csproj to ensure runtime files for RISC-V 64-bit architectures are available during build and publish.
2026-02-22 21:13:38 +08:00
Jack251970
cb60492657 Downgrade iNKORE.UI.WPF.Modern to 0.10.1
The package reference for iNKORE.UI.WPF.Modern in Flow.Launcher.Plugin.WebSearch.csproj was changed from version 0.10.2.1 to 0.10.1.
2026-02-22 12:38:17 +08:00
Jack Ye
118d6e2a73
Fix incomplete plugin directory deletion on uninstall (#4250)
Some checks failed
Build / build (push) Has been cancelled
2026-02-21 22:34:53 +11:00
Jeremy Wu
918eb0f4a9
New Crowdin updates (#4181) 2026-02-21 12:51:21 +02:00
DB P
11e0f8c3a4
Merge pull request #4273 from onesounds/20250220_SkipConfirm
Some checks are pending
Build / build (push) Waiting to run
Add option to skip confirmation for power actions (Sys Plugin)
2026-02-21 16:01:06 +09:00
Jack251970
a99b8399fe Improve code quality 2026-02-21 14:51:20 +08:00
DB P
7e9a626891 style: fix indentation and tab spacing 2026-02-20 17:40:27 +09:00
DB P
cecd90e675 Refactor: Improve power action logic and property setter
- Add braces for better readability in shutdown/reboot logic (Main.cs).
- Prevent redundant OnPropertyChanged calls in _skipPowerActionConfirmation setter (Settings.cs).
2026-02-20 17:34:37 +09:00
DB P
2d7d025682 Add Skip logic in command 2026-02-20 17:18:21 +09:00
DB P
12fc597b56 Add Checkbox for Skip Confirm 2026-02-20 17:06:31 +09:00
Jack Ye
886cd75ad2
Merge pull request #4272 from umutKaracelebi/fix/readme-drag-drop-typo
Some checks are pending
Build / build (push) Waiting to run
Fix/readme drag drop typo
2026-02-20 12:32:40 +08:00
Jack251970
2b50c4faae README Polish: fixed Flow 2026-02-20 12:22:44 +08:00
umutKaracelebi
9c3dfcd09f README Polish: fixed grammar, consistency, and phrasing 2026-02-19 21:50:29 +03:00
umutKaracelebi
cb52fa6ab7 Fix typo: 'can be change' -> 'can be changed' in Drag & Drop section 2026-02-19 21:29:39 +03:00
Jack Ye
faeba8119a
Merge pull request #4263 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Microsoft.Data.Sqlite-10.0.3
Some checks failed
Build / build (push) Has been cancelled
Bump Microsoft.Data.Sqlite from 10.0.2 to 10.0.3
2026-02-11 10:07:49 +08:00
Jack Ye
89b338fb86
Merge pull request #4264 from Flow-Launcher/dependabot/nuget/Flow.Launcher.Plugin/Microsoft.SourceLink.GitHub-10.0.103
Bump Microsoft.SourceLink.GitHub from 10.0.102 to 10.0.103
2026-02-11 10:07:35 +08:00
dependabot[bot]
60ef8e648c
Bump Microsoft.SourceLink.GitHub from 10.0.102 to 10.0.103
---
updated-dependencies:
- dependency-name: Microsoft.SourceLink.GitHub
  dependency-version: 10.0.103
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-10 22:45:26 +00:00
dependabot[bot]
498913e71d
Bump Microsoft.Data.Sqlite from 10.0.2 to 10.0.3
---
updated-dependencies:
- dependency-name: Microsoft.Data.Sqlite
  dependency-version: 10.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-10 22:45:10 +00:00
Jack Ye
6c1f7fade8
Merge pull request #4260 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/SkiaSharp-3.119.2
Some checks are pending
Build / build (push) Waiting to run
Bump SkiaSharp from 3.119.1 to 3.119.2
2026-02-10 11:44:48 +08:00
dependabot[bot]
0f829d0b91
Bump SkiaSharp from 3.119.1 to 3.119.2
---
updated-dependencies:
- dependency-name: SkiaSharp
  dependency-version: 3.119.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-10 01:07:13 +00:00
Jack Ye
0717933459
Fix progress query management and thread safety (#4135)
Some checks failed
Build / build (push) Has been cancelled
2026-02-08 12:49:12 +11:00
Jack Ye
516059e390
Merge pull request #4252 from Flow-Launcher/dependabot/nuget/Flow.Launcher.Plugin/multi-5d8c206339
Some checks failed
Build / build (push) Has been cancelled
Bump Microsoft.Windows.CsWin32 from 0.3.205 to 0.3.269
2026-02-06 14:06:23 +08:00
Jack251970
d4f472a64e Update AdjustTokenPrivileges PInvoke usage
Refactored the AdjustTokenPrivileges call to use null for the previous state and an out variable for the return length, improving compatibility with the PInvoke signature and aligning with recommended usage.
2026-02-05 20:28:37 +08:00
dependabot[bot]
97d7eab1a7
Bump Microsoft.Windows.CsWin32 from 0.3.205 to 0.3.269
---
updated-dependencies:
- dependency-name: Microsoft.Windows.CsWin32
  dependency-version: 0.3.269
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.Windows.CsWin32
  dependency-version: 0.3.269
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.Windows.CsWin32
  dependency-version: 0.3.269
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-04 22:46:23 +00:00
Jeremy Wu
6c8add051f
Merge pull request #4057 from Flow-Launcher/last_history_show_result_icon
Some checks failed
Build / build (push) Has been cancelled
History results display actual result icon for Last Opened history style
2026-01-26 17:50:55 +11:00
Jeremy
248da93d05 fix preview when toggle history mode via Ctrl + H 2026-01-26 16:57:47 +11:00
Jack Ye
e9dcd8b7ba
Fix code comments
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-01-23 16:15:25 +08:00
Jack251970
935d41dc26 Ensure combability of glyph setter 2026-01-23 16:10:01 +08:00
Jack251970
0f0ee9ffde Revert "Try to fix combability issue"
This reverts commit b703bcdd52.
2026-01-23 16:05:03 +08:00
Jack251970
b703bcdd52 Try to fix combability issue 2026-01-23 15:51:24 +08:00
Jack251970
8e127d0339 Code cleanup 2026-01-21 18:13:27 +08:00
Jack Ye
add111fe3f
Merge pull request #4212 from Flow-Launcher/dependabot/nuget/Flow.Launcher.Plugin/Microsoft.SourceLink.GitHub-10.0.102
Bump Microsoft.SourceLink.GitHub from 8.0.0 to 10.0.102
2026-01-21 18:08:03 +08:00
Jeremy
bf44637400 revert context menu early exit when history result 2026-01-20 23:18:00 +11:00
Jeremy
657e6ae7d3 add null-safe comparison for glyph 2026-01-20 22:55:04 +11:00
Jeremy
4ddb164bbd adjusted context menu call to exit early when history result selected 2026-01-20 22:48:11 +11:00
Jeremy
5c241d7491 fix to respect max history result shown setting 2026-01-20 21:47:38 +11:00
Jeremy
90360022a4 update glyph when history result exists 2026-01-20 21:26:04 +11:00
Jack Ye
ca5f5cf0e3
Merge pull request #4206 from Flow-Launcher/copilot/fix-calculator-thousands-separator
Add setting to disable thousands separator in Calculator plugin
2026-01-17 20:17:41 +08:00
VictoriousRaptor
befcc9b37c
Update Plugins/Flow.Launcher.Plugin.Calculator/Languages/en.xaml 2026-01-17 19:59:47 +08:00
Jack Ye
a46350c76a
Merge pull request #4211 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Microsoft.Data.Sqlite-10.0.2
Bump Microsoft.Data.Sqlite from 10.0.1 to 10.0.2
2026-01-14 21:53:22 +08:00
Jack Ye
d72a15937d
Merge branch 'dev' into dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Microsoft.Data.Sqlite-10.0.2 2026-01-14 21:17:51 +08:00
Jack Ye
56c1b92316
Merge pull request #4210 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Svg.Skia-3.4.1
Bump Svg.Skia from 3.4.0 to 3.4.1
2026-01-14 21:17:13 +08:00
dependabot[bot]
91cd27298d
Bump Microsoft.SourceLink.GitHub from 8.0.0 to 10.0.102
---
updated-dependencies:
- dependency-name: Microsoft.SourceLink.GitHub
  dependency-version: 10.0.102
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-13 22:45:22 +00:00
dependabot[bot]
98bb98c265
Bump Microsoft.Data.Sqlite from 10.0.1 to 10.0.2
---
updated-dependencies:
- dependency-name: Microsoft.Data.Sqlite
  dependency-version: 10.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-13 22:45:07 +00:00
Jeremy
e970bb4d4e fix icon & glyph display based on selected history style results 2026-01-13 23:32:13 +11:00
dependabot[bot]
ed83da5669
Bump Svg.Skia from 3.4.0 to 3.4.1
---
updated-dependencies:
- dependency-name: Svg.Skia
  dependency-version: 3.4.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-13 03:05:02 +00:00
Jack Ye
7e7f85352b
Fix potential locale-dependent test failure
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-01-12 14:13:01 +08:00
Jack251970
013622a2a7 Restore to default in calculator tests 2026-01-12 11:37:47 +08:00
Jack251970
fb4da697a2 Improve calculator thousands separator test 2026-01-12 11:37:06 +08:00
Jack Ye
4e56cb4e74
Merge pull request #4203 from Flow-Launcher/shell_path
Fix ShellPath directory for shell path selection
2026-01-11 21:07:39 +08:00
copilot-swe-agent[bot]
649b142b46 Add UseThousandsSeparator setting to Calculator plugin
Co-authored-by: Jack251970 <53996452+Jack251970@users.noreply.github.com>
2026-01-10 06:30:57 +00:00
copilot-swe-agent[bot]
34257cad60 Initial plan 2026-01-10 06:27:26 +00:00
Jack251970
382a77d2c5 Fix ShellPath directory for shell path selection
Updated OpenShellPath to use Settings.ShellPath directory when prompting for a file path, ensuring the dialog opens in the relevant location instead of the editor path directory.
2026-01-07 13:40:13 +08:00
Jack251970
3745c44455 Revert Update the result when executing history item 2026-01-06 20:11:36 +08:00
Jack251970
9d9ab1ffd2 Do not allow context menu for history items 2026-01-06 18:35:53 +08:00
Jack251970
938a87ceca Fix preview panel blank issue 2026-01-06 18:31:15 +08:00
Jack251970
583bf74724 Update code comments 2026-01-06 15:46:08 +08:00
Jack251970
26e4529f27 Update the result when executing history item 2026-01-06 15:45:49 +08:00
Jack251970
e404d02965 Update the result when executing history item 2026-01-06 15:13:37 +08:00
Jack251970
c610100c13 Use QueryManager function 2026-01-06 15:07:00 +08:00
Jack Ye
8d4e03bdb8
Merge pull request #4202 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Svg.Skia-3.4.0
Bump Svg.Skia from 3.2.1 to 3.4.0
2026-01-06 10:40:22 +08:00
dependabot[bot]
77b631be87
Bump Svg.Skia from 3.2.1 to 3.4.0
---
updated-dependencies:
- dependency-name: Svg.Skia
  dependency-version: 3.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-05 22:08:44 +00:00
Jack251970
e403c41530 Change copied icon logic as origin 2026-01-05 22:55:09 +08:00
Jack251970
5b2fb1fb38 Revert "Ensure history items have valid icons in QueryHistory"
This reverts commit e6a91a9959.
2026-01-05 22:26:39 +08:00
Jack251970
cf4268d1c3 Fix preview panel blank issue 2026-01-05 21:30:06 +08:00
Jack251970
e6a91a9959 Ensure history items have valid icons in QueryHistory
Added CheckIcoPathValidity to QueryHistory to set default icons for history items missing IcoPath, addressing legacy data issues. Integrated this check into MainViewModel's RefreshLastOpenedHistoryResults to guarantee icon validity before updating absolute paths.
2026-01-05 20:17:12 +08:00
Jack251970
f22b6449d4 Fix issue when querying history items in home page 2026-01-05 19:18:47 +08:00
Jeremy
58d910dc57 fix deep copy Glyph on LastOpenHistoryResult 2026-01-05 19:37:05 +11:00
Jeremy
11645fdc9a ensure history results ordered by ExecutedDateTime 2026-01-05 19:27:11 +11:00
Jack251970
177e60739c Add code comments 2026-01-05 14:34:57 +08:00
Jack251970
5f992352ee Code cleanup 2026-01-05 13:48:58 +08:00
Jack251970
216b6f536f Code cleanup 2026-01-05 13:07:02 +08:00
Jack Ye
1e176151a0
Merge pull request #4201 from Flow-Launcher/revert-4118-UI.WPF.Modern
Revert "Upgrade iNKORE.UI.WPF.Modern and refactor scroll logic"
2026-01-05 07:38:31 +08:00
Jack Ye
604fd2be44
Merge branch 'dev' into revert-4118-UI.WPF.Modern 2026-01-04 23:59:04 +08:00
Jack Ye
27c4d35a9b
Merge pull request #4198 from nilvanlopes/feature/websearch-max-suggestions
Add max suggestions limit for web search plugin
2026-01-04 23:58:43 +08:00
Jack Ye
a9e6a68369
Revert "Upgrade iNKORE.UI.WPF.Modern and refactor scroll logic" 2026-01-04 23:47:42 +08:00
Jack251970
6c1c9fe600 Use wrap panel 2026-01-04 23:45:13 +08:00
Jack251970
af9050c34b Test no PrivateAssets 2026-01-04 23:19:41 +08:00
Jack251970
4c46e16160 Fix possible convert issue 2026-01-04 23:19:12 +08:00
Jack251970
590b4c82d2 Try NumberBox 2026-01-04 23:00:24 +08:00
Jeremy
19fa107fea minor fixes and adjustments for code quality 2026-01-04 22:05:39 +11:00
Jeremy
ea7a2d271d mark PopulateHistoryFromLegacyHistory obsolete 2026-01-04 21:37:39 +11:00
Jeremy
55673cdb4b add method comments 2026-01-04 21:16:13 +11:00
Jeremy
25037e3f5f update IcoPath if existing is different to the selected 2026-01-04 20:51:25 +11:00
Jeremy
94ebbab68a update legacy item to show Query style title 2026-01-04 19:54:16 +11:00
Jeremy
4174b5e1e4 fix title when query history style used 2026-01-04 17:41:52 +11:00
Jeremy
101e5e6ff1 fix Glyph optional null when copying 2026-01-04 16:39:33 +11:00
Nilvan Lopes
669f3ef404
Update Plugins/Flow.Launcher.Plugin.WebSearch/Languages/en.xaml
Co-authored-by: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>
2026-01-03 11:14:20 -03:00
Nilvan Lopes
4c7cbadc2f remove the language files other than the en.xaml 2026-01-02 23:07:29 -03:00
Nilvan Lopes
2176553b26 Add max suggestions setting for web search plugins
Introduced a MaxSuggestions property (min 1, max 10) to control the number of autocomplete suggestions shown in web search plugins. Updated the UI to allow user configuration and added localized labels for the new setting in all supported languages. Suggestions in results are now limited according to this setting.
2026-01-02 14:32:44 -03:00
Jeremy
024eeaf6bf changed LastOpenHistoryResult's Copy to DeepCopy to clarify intent 2026-01-02 22:30:09 +11:00
Jack Ye
83883c4b05
Merge pull request #4195 from Flow-Launcher/fix-localized-name
Fix localized name search for Program plugin
2026-01-02 19:20:56 +08:00
VictoriousRaptor
b062fc056f Catch exceptions and release com objects 2026-01-02 12:23:05 +08:00
VictoriousRaptor
3e32fca356 Fix localized name get failure 2026-01-02 01:47:44 +08:00
Jeremy
9c2f2398f1 add method comments for LastOpenedHistoryResult 2026-01-01 23:11:28 +11:00
Jeremy
6d6003fd80 switch to using TrimmedQuery 2026-01-01 22:45:52 +11:00
Jeremy
f9df44a2cd rename to IcoPathAbsolute 2026-01-01 22:32:39 +11:00
Jeremy
7c670de7c2 fix history result highlight and scroll when history mode activated 2026-01-01 18:23:12 +11:00
Jeremy
20854ba5d7 formatting 2026-01-01 18:20:29 +11:00
Jeremy
2e8bb357fc Merge branch 'dev' into last_history_show_result_icon 2026-01-01 17:01:17 +11:00
Jeremy
810725cc6b add explicit JsonInclude for PluginID internal set 2026-01-01 15:43:23 +11:00
Jeremy
8d7fa1d397 revert QueryHistoryItems property 2026-01-01 15:14:05 +11:00
Jeremy
6b6a9a9935 simplify GetHistoryItems 2026-01-01 14:30:28 +11:00
VictoriousRaptor
8e80c3bde6
Add option to show taskbar when Flow Launcher is opend (#4177)
* Add option to show taskbar when Flow Launcher is invoked

Co-authored-by: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>

* Fix: Use ABM_ACTIVATE instead of ABM_SETSTATE for temporary taskbar showing

Co-authored-by: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>

* Remove unnecessary unsafe keyword from ShowTaskbar method

Co-authored-by: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>

* Fix missing closing braces in Win32Helper.cs

Co-authored-by: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>

* Change wording from 'invoked' to 'opened' in localization strings

Co-authored-by: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com>

* Show/hide tasking when showing/hiding Flow

* Remove unused APPBARDATA

* Guard HideTaskbar() with state so show/hide stay balanced

* Improve taskbar visibility management in MainViewModel

Moved taskbar show logic to after keyboard layout switch in Show().Ensures consistent taskbar state when invoking or hiding the app.

* Clean code

* Clean code

* Remove blank line

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Jack Ye <jack1160210343@gmail.com>
Co-authored-by: Jack251970 <1160210343@qq.com>
2025-12-31 18:05:53 +08:00
Jeremy
de0d022268 rename last opened class; use inheritance; initialise at startup 2025-12-31 12:14:07 +11:00
Jack Ye
8092a440f4
Merge pull request #4182 from Flow-Launcher/custom_query_hotkey
Fix an issue that custom query hotkey cannot work with context menu page
2025-12-27 23:34:04 +08:00
Jeremy
d78d313372 update to use IcoAbsoluteLocalPath 2025-12-26 21:37:30 +11:00
Jack Ye
1a7957bee6
Merge pull request #4183 from Flow-Launcher/dependabot/github_actions/toshimaru/auto-author-assign-3.0.1
Bump toshimaru/auto-author-assign from 3.0.0 to 3.0.1
2025-12-26 13:33:53 +08:00
dependabot[bot]
23caeb477c
Bump toshimaru/auto-author-assign from 3.0.0 to 3.0.1
Bumps [toshimaru/auto-author-assign](https://github.com/toshimaru/auto-author-assign) from 3.0.0 to 3.0.1.
- [Release notes](https://github.com/toshimaru/auto-author-assign/releases)
- [Changelog](https://github.com/toshimaru/auto-author-assign/blob/main/CHANGELOG.md)
- [Commits](https://github.com/toshimaru/auto-author-assign/compare/v3.0.0...v3.0.1)

---
updated-dependencies:
- dependency-name: toshimaru/auto-author-assign
  dependency-version: 3.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-25 22:03:58 +00:00
Jack251970
2856803371 Ensure hotkey actions return to query results page first
Added a call to App.API.BackToQueryResults() after showing the main window when a hotkey is triggered. This prevents issues that can occur if the current page is a context menu before changing the query.
2025-12-25 21:14:11 +08:00
Jeremy Wu
ffb37d3e12
New Crowdin updates (#4127) 2025-12-25 17:06:56 +08:00
Jack Ye
bb1dfcde9b
Fix hide item option not working in Program plugin (#4141) 2025-12-25 07:01:47 +02:00
Jack Ye
1594683191
Merge pull request #4178 from Flow-Launcher/dependabot/github_actions/toshimaru/auto-author-assign-3.0.0
Bump toshimaru/auto-author-assign from 2.1.2 to 3.0.0
2025-12-24 12:02:34 +08:00
dependabot[bot]
0d4775bb7d
Bump toshimaru/auto-author-assign from 2.1.2 to 3.0.0
Bumps [toshimaru/auto-author-assign](https://github.com/toshimaru/auto-author-assign) from 2.1.2 to 3.0.0.
- [Release notes](https://github.com/toshimaru/auto-author-assign/releases)
- [Changelog](https://github.com/toshimaru/auto-author-assign/blob/main/CHANGELOG.md)
- [Commits](https://github.com/toshimaru/auto-author-assign/compare/v2.1.2...v3.0.0)

---
updated-dependencies:
- dependency-name: toshimaru/auto-author-assign
  dependency-version: 3.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-22 22:04:55 +00:00
Jeremy Wu
a08a45640d
Merge pull request #4170 from Flow-Launcher/VictoriousRaptor-patch-1
Replace old clipboard plugin with a new one in README
2025-12-22 09:44:54 +11:00
VictoriousRaptor
d1518a490f
Replace old clipboard plugin with a new one in README 2025-12-22 00:02:47 +08:00
VictoriousRaptor
f95d41e093
Merge pull request #4167 from Heck-R/dev
Fix: Result.Preview.Description Does not Display in Preview Panel
2025-12-19 20:33:22 +08:00
Jack251970
a07af87cb1 Update name 2025-12-19 15:56:58 +08:00
Jack Ye
e634e2cbff
Merge branch 'dev' into dev 2025-12-19 15:51:06 +08:00
Jack Ye
c8cebc2b18
Merge pull request #4166 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Microsoft.Data.Sqlite-10.0.1
Bump Microsoft.Data.Sqlite from 10.0.0 to 10.0.1
2025-12-19 14:07:54 +08:00
Heck-R
e01869afda Fix: Result.Preview.Description is not ignored anymore 2025-12-17 23:37:43 +01:00
dependabot[bot]
b4ec480405
Bump Microsoft.Data.Sqlite from 10.0.0 to 10.0.1
---
updated-dependencies:
- dependency-name: Microsoft.Data.Sqlite
  dependency-version: 10.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-17 22:07:00 +00:00
Jack Ye
12ab11a4e4
Merge pull request #4165 from Flow-Launcher/dependabot/github_actions/toshimaru/auto-author-assign-2.1.2
Bump toshimaru/auto-author-assign from 2.1.1 to 2.1.2
2025-12-17 10:24:42 +08:00
dependabot[bot]
bb3c8fbe0c
Bump toshimaru/auto-author-assign from 2.1.1 to 2.1.2
Bumps [toshimaru/auto-author-assign](https://github.com/toshimaru/auto-author-assign) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/toshimaru/auto-author-assign/releases)
- [Changelog](https://github.com/toshimaru/auto-author-assign/blob/main/CHANGELOG.md)
- [Commits](https://github.com/toshimaru/auto-author-assign/compare/v2.1.1...v2.1.2)

---
updated-dependencies:
- dependency-name: toshimaru/auto-author-assign
  dependency-version: 2.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-16 22:04:28 +00:00
Jack Ye
20930617bb
Merge pull request #4118 from Flow-Launcher/UI.WPF.Modern
Upgrade iNKORE.UI.WPF.Modern and refactor scroll logic
2025-12-16 22:54:53 +08:00
Jeremy Wu
0f34829dab
Merge pull request #4160 from Flow-Launcher/add_sponsor
Add sponsor to README
2025-12-16 02:25:06 +11:00
Jack Ye
4221797569
Merge pull request #4125 from Flow-Launcher/dialog_jump_ignore_null_handler
Add null checks and improve dialog window handling
2025-12-15 19:51:32 +08:00
Jeremy Wu
437b7da0f7
formatting 2025-12-15 21:24:14 +11:00
Jeremy Wu
31f5698437
update readme 2025-12-15 21:20:35 +11:00
Jeremy Wu
666d525243
Add sponsor to README
Added sponsor to the README.
2025-12-15 20:59:18 +11:00
Diego Henrique
9066913710
[FEATURE] Folder and File Action Keywords (#4093) 2025-12-14 12:18:21 +02:00
Jack Ye
ebc1a85190
Merge pull request #4155 from Flow-Launcher/dependabot/github_actions/actions/upload-artifact-6
Bump actions/upload-artifact from 5 to 6
2025-12-13 15:39:03 +08:00
dependabot[bot]
4c44877af4
Bump actions/upload-artifact from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 22:04:55 +00:00
VictoriousRaptor
c03c778efb
Merge pull request #4151 from Flow-Launcher/fix3965
Fix incorrect text highlighting when using pinyin queries
2025-12-09 08:35:53 +08:00
VictoriousRaptor
b6339d38fa
Fix compile error introduced by coderabbit 2025-12-08 13:06:14 +08:00
VictoriousRaptor
42e04d459b
Cover all positions in unit test
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-12-08 00:41:08 +08:00
VictoriousRaptor
769179d04b
Fix test case
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-07 19:28:17 +08:00
VictoriousRaptor
a7c67bbb35
Fix incorrect index marker
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-07 19:18:49 +08:00
VictoriousRaptor
b869eb8d1d Avoid adding unnecessary space and improve unit test 2025-12-07 18:50:54 +08:00
VictoriousRaptor
7d9de4b0d2 Fix index lookup for boundary 2025-12-07 18:16:09 +08:00
Jack Ye
a49eb464c8
Merge pull request #4129 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.Calculator/Mages-3.0.1
Bump Mages from 3.0.0 to 3.0.1
2025-11-26 18:33:53 +08:00
Jack Ye
48f67b1886
Improve and fix query result update logic issue & provide access to exact query typed by user (#3502) 2025-11-26 21:15:12 +11:00
dependabot[bot]
ce4a37b292
Bump Mages from 3.0.0 to 3.0.1
---
updated-dependencies:
- dependency-name: Mages
  dependency-version: 3.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-25 22:35:13 +00:00
Jack251970
5623bf253b Add null checks and improve dialog window handling
Added early null checks for `hwnd` to prevent invalid processing.
Enhanced thread safety by locking `_dialogWindow` updates.
Documented dialog window state handling with comments for clarity.
Handled scenarios for dialog window movement, resizing, hiding,
destruction, and termination. Improved robustness and maintainability.
2025-11-23 18:05:12 +08:00
Jack Ye
38c0fae064
Merge pull request #4124 from Flow-Launcher/dependabot/github_actions/actions/checkout-6
Bump actions/checkout from 5 to 6
2025-11-21 17:43:17 +08:00
dependabot[bot]
28065f7231
Bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-20 22:05:52 +00:00
Jeremy Wu
bb841fcc3b
Merge pull request #4122 from Flow-Launcher/merge_2_0_3
Merge v2.0.3 back to dev
2025-11-20 23:33:34 +11:00
Jeremy
1c29fb2db3 merge back v2.0.3 from master to dev 2025-11-20 23:12:58 +11:00
Jeremy Wu
229987ee90
Release 2.0.3 (#4121)
Some checks failed
Publish Default Plugins / publish (push) Has been cancelled
Build / build (push) Has been cancelled
2025-11-20 19:01:51 +08:00
Jeremy Wu
533a58d083
New Crowdin updates (#4051) 2025-11-20 18:26:31 +08:00
Jeremy
7958b17968 wip show result icon 2025-11-20 21:02:19 +11:00
Jack Ye
a773b51ada
Handle recoverable DWM composition exceptions gracefully (#4113) 2025-11-19 22:16:09 +02:00
Jack251970
05f15d9831 Upgrade iNKORE.UI.WPF.Modern and refactor scroll logic
Upgraded `iNKORE.UI.WPF.Modern` to version `0.10.2.1` and
replaced the custom `CustomScrollViewerEx` implementation with
the built-in `ScrollViewerEx` for simplified scrolling behavior.
Updated `Flow.Launcher.Plugin` to version `5.1.0` for compatibility.
Removed unused namespaces and adjusted styles in `Base.xaml`
to align with the new `ScrollViewerEx` usage.
2025-11-18 22:19:02 +08:00
Jeremy Wu
c6c413202c
Merge pull request #4108 from Flow-Launcher/add_sponsor
Add new sponsor to README
2025-11-14 18:11:59 +09:00
Jeremy Wu
f1b80ab90f
Add new sponsor to README 2025-11-14 17:54:45 +09:00
Jack Ye
558240279f
Merge pull request #4103 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Microsoft.Data.Sqlite-10.0.0
Bump Microsoft.Data.Sqlite from 9.0.10 to 10.0.0
2025-11-13 10:26:05 +08:00
dependabot[bot]
3492aac2c0
Bump Microsoft.Data.Sqlite from 9.0.10 to 10.0.0
---
updated-dependencies:
- dependency-name: Microsoft.Data.Sqlite
  dependency-version: 10.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-11 22:07:56 +00:00
Jack Ye
fc93d0904e
Merge pull request #4072 from Flow-Launcher/program_plugin_index_issue
Fix Possible OperationCancelException for WaitAsync Operations
2025-11-08 11:28:58 +08:00
Jack251970
2adbc334a2 Improve semaphore lock handling and code robustness
Added `lockAcquired` flags in `PluginsManifest.cs` and `Main.cs`
to ensure semaphore locks are only released if successfully
acquired, preventing potential runtime errors. Updated `finally`
blocks to conditionally release locks based on these flags.

Removed redundant cancellation check in `EverythingAPI.cs` to
simplify code, assuming cancellation is handled elsewhere. These
changes enhance reliability and maintainability of the codebase.
2025-11-07 15:30:07 +08:00
Jack251970
05c8dd2fe1 Remove unnecessary debug information 2025-11-06 20:48:41 +08:00
Jack251970
88fd1e56d0 Handle OperationCanceledException gracefully
Added a `catch` block for `OperationCanceledException` in
`PluginsManifest.cs` to ignore canceled operations. Updated
`EverythingAPI.cs` to use cancellation tokens with `_semaphore.WaitAsync`
and handle cancellations by exiting the method cleanly with `yield break`.
2025-11-06 20:47:54 +08:00
Jack251970
49f89e33b5 Make locking operations cancelable with tokens
Updated `_semaphore.WaitAsync` in `EverythingAPI.cs` to accept a `CancellationToken` and handle `OperationCanceledException` gracefully, returning `false` instead of propagating the exception.

Refactored locking mechanisms in `Main.cs` to use `CancellationToken` for `_win32sLock` and `_uwpsLock`. Added `try-catch` blocks to handle `OperationCanceledException` and ensure proper lock release. Methods now return `emptyResults` when operations are canceled.
2025-11-06 20:46:29 +08:00
Jack251970
d0a47c84b9 Clarify CancellationToken handling in comments
Updated comments to explain the rationale for not directly passing
CancellationToken to methods and instead checking
IsCancellationRequested within locks. This prevents unexpected
OperationCanceledException. Changes made in EverythingAPI.cs
(IsEverythingRunningAsync) and Main.cs (Win32 and UWP program
preparation). No functional changes to the code.
2025-11-06 15:39:19 +08:00
Jack251970
bfaff5cca5 Improve semaphore usage and logging clarity
Added comments in `EverythingAPI.cs` and `Main.cs` to explain
why `CancellationToken` is not directly passed to semaphore
locks, preventing unexpected `OperationCanceledException`.

Updated debug log messages in `Main.cs` for better clarity,
including changing "Start handling programs" to "Start querying
programs". Removed redundant log messages to improve logging
consistency.
2025-11-06 15:32:08 +08:00
Jack251970
30d7f67d42 Refactor token cancellation check for readability
Simplified the `if` statement that checks for token cancellation
by condensing it into a single line. This improves code readability
and eliminates unnecessary line breaks.
2025-11-06 15:30:32 +08:00
Jack251970
7e332fa615 Refactor caching and indexing logic
Added `ResetCache` calls after clearing `_win32s` and `_uwps` lists to ensure proper cache reset during indexing. Updated logic to return `resultList` after setting cache size and expiration for improved clarity. Removed `await Task.WhenAll` to adjust asynchronous flow in the indexing process.
2025-11-06 15:29:38 +08:00
Jack251970
3d8fd1d352 Improve cancellation, locking, and logging mechanisms
Enhanced cancellation handling by adding `token.IsCancellationRequested` checks to improve responsiveness. Refactored locking mechanisms for `_win32sLock` and `_uwpsLock` using `try-finally` blocks to ensure proper acquisition and release, improving thread safety and preventing deadlocks.

Reorganized Win32 and UWP program querying logic for better modularity and readability. Replaced shared collection access with local variables to improve clarity and maintain thread safety. Simplified empty result handling by directly returning `emptyResults` when canceled.

Removed redundant debug log statements to reduce verbosity and updated remaining logs for clarity. Suppressed unused result warnings by replacing direct calls to `EverythingApiDllImport.Everything_GetMajorVersion()` with null-coalescing assignments.
2025-11-06 15:28:13 +08:00
Jack251970
db0c86d50c Remove CancellationToken from semaphore WaitAsync calls
Removed the `CancellationToken` parameter from `WaitAsync` calls
on semaphores in `EverythingAPI.cs` and `Main.cs`. This change
eliminates cancellation support for semaphore waits, likely due
to a design decision prioritizing simplicity or avoiding issues
with cancellation handling.

In `EverythingAPI.cs`, `WaitAsync(token)` was replaced with
`WaitAsync()` in two methods. Similarly, in `Main.cs`, the
`WaitAsync` calls for `_win32sLock` and `_uwpsLock` were updated
to remove the `token` parameter.

Note: This change may impact the ability to gracefully handle
cancellation during semaphore waits.
2025-11-04 14:25:55 +08:00
Jack251970
6e17d5d756 Improve logging for Win32 program lock acquisition
Added a debug log statement to indicate when the lock for
querying Win32 programs is being acquired. This enhances
granularity in logging, making it easier to distinguish
between the acquisition of locks for Win32 and UWP programs.
Improves traceability and debugging of the program's
execution flow.
2025-11-04 12:27:59 +08:00
Jack Ye
e2ac32139c
Merge pull request #4084 from 90gq29/patch-1
Update en.xaml - Typo fix
2025-11-02 11:39:45 +08:00
90gq29
348a83a1d9
Update en.xaml
In standard title case (used for buttons and such), articles or short function words like "a" or "for" shouldn't be capitalized. 

Doesn't seem to be capitalized for stylistic reasons either as "Check for Updates" is capitalized in standard title case.
2025-11-01 15:29:06 +01:00
Jack251970
4cf942ac3a Add detailed debug logging for query execution process
Enhanced logging to provide better traceability and insights:
- Added debug logs for query reception, cache misses, and lock acquisition.
- Logged query cancellation and completion with result counts.
- Added logs for caching results, including item counts and query details.
- Improved logging for filtering and program selection processes.
- Ensured no functional changes to existing query and filtering logic.
2025-10-26 21:01:07 +08:00
Jack251970
f632a4b773 Add caching to QueryAsync and integrate cache reset logic
Introduced a MemoryCache to improve QueryAsync performance by
caching query results, reducing redundant computations. Added
a ResetCache method to reinitialize the cache when settings
are updated. Integrated cache reset calls into settings
property setters to ensure consistency.

Refactored query logic to leverage MemoryCache.GetOrCreateAsync
for streamlined caching. Removed redundant code and debug
logging for improved readability and maintainability. Ensured
thread safety with proper locking mechanisms. Simplified and
consolidated caching logic for better maintainability.
2025-10-26 20:59:29 +08:00
Jack251970
e2fa122362 Improve program indexing with logging and thread safety
Added detailed debug logging to `IndexWin32ProgramsAsync` and
`IndexUwpProgramsAsync` to track the indexing process, including
preparation, start, retrieval, caching, and completion.

Replaced direct updates to `_settings.LastIndexTime` with a
thread-safe lock to prevent race conditions.

Enhanced `IndexProgramsAsync` with a debug log to indicate the
start of indexing for better traceability.

Updated program retrieval logic to process Win32 and UWP programs
in parallel with cancellation support and applied the
`HideUninstallersFilter` for cleaner results.
2025-10-26 20:56:08 +08:00
Jack251970
6a65f8090f Enhance thread safety and refactor reindexing logic
Introduced `_lastIndexTimeLock` to ensure thread-safe access
and updates to `_settings.LastIndexTime`, preventing race
conditions. Refactored reindexing logic to use a `lock` block
for evaluating and updating the reindexing condition.

Added `emptyResults` as a static readonly placeholder list.
Improved code clarity and maintainability without altering
existing functionality.
2025-10-26 20:51:08 +08:00
Jack251970
637d926f7a Remove caching logic and initialize emptyResults list
The caching-related code, including `cacheOptions` and `cache`, has been removed from `Main.cs`, indicating that the caching mechanism is no longer in use or has been refactored elsewhere. Additionally, the `emptyResults` list is now explicitly initialized as an empty list (`[]`). No changes were made to the `Context` property or the `commonUninstallerNames` array.
2025-10-26 20:41:06 +08:00
Jack251970
7f5efc5ca1 Refactor caching and improve QueryAsync method
Removed the `ResetCache` method and its associated calls to streamline caching management and improve performance. Refactored the `QueryAsync` method for better thread safety, synchronization, and exception handling. Simplified UWP and Win32 program filtering logic and removed redundant code. Eliminated manual cache disposal and reset logic, favoring a more efficient and automated caching mechanism. These changes enhance maintainability, responsiveness, and overall plugin performance.
2025-10-26 20:40:37 +08:00
Jack Ye
1885a48241
Merge pull request #4070 from Flow-Launcher/dependabot/github_actions/actions/upload-artifact-5
Bump actions/upload-artifact from 4 to 5
2025-10-25 14:33:11 +08:00
dependabot[bot]
f0584ac853
Bump actions/upload-artifact from 4 to 5
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-24 22:05:42 +00:00
Jeremy
0f269455b1 remove duplicate history item sort call 2025-10-21 22:18:29 +11:00
Jeremy
25aa5bf2af show history result sorted descending by execution time 2025-10-21 21:54:38 +11:00
Jeremy
92551c58a5 show distinct records when history style is last opened 2025-10-21 21:53:32 +11:00
Diego Henrique
1bfd147421
BUG: Explorer plugin navigate path should only show results in current path (#4053) 2025-10-21 12:12:45 +11:00
Jeremy
26ad473592 change getting last history item to get the same result if exists 2025-10-19 21:46:02 +11:00
Jeremy
10d3ba268d update history result icon display logic & remove badge icon logic 2025-10-19 20:22:03 +11:00
Jeremy
7883e7a0a9 add result IcoPath & Glyph + handling show badge switching 2025-10-18 10:35:23 +11:00
Jeremy Wu
da4b961686
Merge pull request #3854 from Flow-Launcher/plugin_initialization
Asynchronous Loading & Initialization Plugin Model to Improve Window Startup Speed
2025-10-16 22:08:42 +11:00
Jack Ye
fb84cb03f3
Improve code comments
Co-authored-by: Jeremy Wu <jeremy24wu@gmail.com>
2025-10-16 18:48:17 +08:00
Jack Ye
c9e3c628e8
Improve code comments
Co-authored-by: Jeremy Wu <jeremy24wu@gmail.com>
2025-10-16 18:48:07 +08:00
Jack251970
fbeaafa8d3 Remove Score = -100 from result objects in PluginManager
Removed the `Score = -100` property from multiple result objects
in `PluginManager.cs` to simplify the code and improve clarity.
Adjusted the formatting and structure to ensure proper syntax
and maintain code consistency. This includes changes to result
objects that handle re-querying and exception handling.
2025-10-16 18:47:15 +08:00
Jack251970
68454a8a6e Change log level for plugin constructor timing message
Updated the log level for the plugin constructor cost message
from `LogInfo` to `LogDebug` to reduce verbosity in production
logs and make this information available primarily during
debugging sessions.
2025-10-16 18:43:19 +08:00
Jeremy Wu
bd880d304e
update wording 2025-10-16 20:46:35 +11:00
Jeremy Wu
386737acac
update method parameter style 2025-10-16 20:20:51 +11:00
Jack Ye
3690042d2c
Fix DialogJump UriFormatException when navigating to root directories (#4052) 2025-10-15 20:12:51 +11:00
Jack251970
c00d804073 Resolve conflicts 2025-10-15 13:07:43 +08:00
Jack Ye
e2abc1b265
Merge branch 'dev' into plugin_initialization 2025-10-15 13:06:14 +08:00
Jack Ye
3d9ef2c63f
Merge pull request #4042 from 01Dri/feature/history_mode
Add "Last opened" history mode & Fix non-result history item save issue
2025-10-15 12:47:45 +08:00
Jack251970
b13c29ab91 Record user selection after successful execution 2025-10-15 12:40:00 +08:00
Jack251970
df4f08b071 Add exception logging to ResultHelper catch block
Updated the `catch` block in the `ResultHelper` class to explicitly catch `System.Exception` and log the error using `App.API.LogException`. The log includes the class name, a failure message for querying results, and the exception details. This improves error visibility and debugging.
2025-10-15 12:35:53 +08:00
Jack Ye
83cab764a1
Fix typos
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-15 12:30:59 +08:00
Jack251970
b784a14aee Update tooltip text for historyStyleTooltip
The tooltip text for the key `historyStyleTooltip` was updated to improve capitalization and consistency. "History" and "Home Page" were capitalized to align with the formatting of other keys in the file.
2025-10-15 12:28:54 +08:00
Jack251970
629c2eb4c6 Record user-selected results for ranking
Moved `_userSelectedRecord.Add(result)` outside the `if (queryResultsSelected)` block to ensure all user-selected results are recorded, regardless of their source (query results, context menu, or history). Added a comment to clarify that only query results are added to history.
2025-10-15 12:26:21 +08:00
Jack251970
c73689fbc3 Fix spelling 2025-10-15 12:24:36 +08:00
Jack251970
1298b76b77 Track user-selected results for ranking purposes
Added logic to record user-selected results in `_userSelectedRecord`
before executing both synchronous and asynchronous actions. This
enables tracking of user interactions for result ranking or analytics.
Comments were added to clarify the purpose of the new logic.
2025-10-15 12:23:52 +08:00
Jack251970
4b6ee4ea98 Improve code quality 2025-10-15 12:23:00 +08:00
01Dri
10d353defe Returning actions 2025-10-15 00:34:38 -03:00
01Dri
9ca7c8431b Revert modifications and returning actions 2025-10-15 00:34:16 -03:00
01Dri
a8d3cdf62c SubTitle equals 2025-10-14 23:26:32 -03:00
01Dri
764c674350 code quality 2025-10-14 23:15:14 -03:00
01Dri
f31abe83b0 PopulateHistoryFromLegacyHistory with HistoryStyle 2025-10-14 23:12:25 -03:00
Jack Ye
4fe3b55720
Merge pull request #4049 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Microsoft.Data.Sqlite-9.0.10
Bump Microsoft.Data.Sqlite from 9.0.9 to 9.0.10
2025-10-15 10:08:39 +08:00
01Dri
8e96d1a461 HistoryStyle enum values 2025-10-14 22:51:28 -03:00
01Dri
9f652c33b4 History items filtered based on HistoryStyle. 2025-10-14 22:51:09 -03:00
01Dri
d5a2695766 Update the history item if it equals the last added item or already exists in the list. 2025-10-14 22:50:29 -03:00
01Dri
ced824d791 is equals 2025-10-14 22:49:03 -03:00
01Dri
0131b92c7a The HistoryStyle property is used to distinguish history items 2025-10-14 22:47:58 -03:00
dependabot[bot]
a3d1c43580
Bump Microsoft.Data.Sqlite from 9.0.9 to 9.0.10
---
updated-dependencies:
- dependency-name: Microsoft.Data.Sqlite
  dependency-version: 9.0.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-14 22:07:02 +00:00
Jack251970
66fe0b8245 Adjust design-time height in SettingsPaneGeneral.xaml 2025-10-14 23:23:52 +08:00
Jack Ye
adfd5425f0
Merge branch 'dev' into plugin_initialization 2025-10-14 21:53:43 +08:00
Jeremy Wu
8fde82a0eb
Merge pull request #4047 from Flow-Launcher/merge_back_2_0_2
Merge v2.0.2 back to dev
2025-10-15 00:49:27 +11:00
Jack251970
787ccad384 Refactor history handling with async ResultHelper
Replaced `HistoryHelper` with a new `ResultHelper` class to handle plugin result population asynchronously, improving performance and maintainability. Removed `ExecuteAction` and `QueryAction` properties from `LastOpenedHistoryItem` and updated `QueryHistory` and `MainViewModel` to use `LastOpenedHistoryItems` directly.

Refactored history result generation to support `AsyncAction` in `Result` objects, replacing synchronous plugin queries. Simplified legacy history migration and enhanced support for `HistoryStyle`. Improved error handling, code readability, and UI-related logic for history navigation.
2025-10-14 21:29:22 +08:00
Jack251970
693bae7631 Optimize query result selection handling
Refactored `QueryResultsSelected()` usage by introducing a local
variable `queryResultsSelected` to avoid redundant method calls,
improving efficiency and readability. Added a comment to clarify
the purpose of the variable. Updated conditional logic to use
the new variable instead of directly invoking the method.
2025-10-14 20:47:57 +08:00
Jack251970
f6d5a27e0b Refactor and enhance history management system
Refactored the `History` class to separate query and last opened history into distinct models, introducing `LastOpenedHistoryItem` and deprecating `HistoryItem`. Added a `HistoryStyle` enum and property to allow users to toggle between "Query History" and "Last Opened History." Simplified history display logic and updated the UI with a dropdown for history style selection.

Improved history item display with dynamic action population and relative timestamps. Enhanced performance by optimizing history storage with a maximum limit and streamlined logic for adding/retrieving items. Ensured backward compatibility by migrating legacy history data to the new format.

Updated localization strings, removed deprecated properties, and cleaned up redundant code. Fixed bugs related to inconsistent history actions and edge cases with legacy data.
2025-10-14 20:28:39 +08:00
Jack Ye
592440f2b1
Merge pull request #3982 from Flow-Launcher/squirrel_upgrade
Upgrade Nuget Packages
2025-10-14 19:54:21 +08:00
Jack251970
b84ca9b283 Improve code quality 2025-10-14 19:39:33 +08:00
Jeremy
7445d54d22 merge back v2.0.2 from master to dev 2025-10-14 22:35:06 +11:00
Jeremy Wu
f37d4c47cc
Release 2.0.2 | Plugin 5.1.0 (#4046) 2025-10-14 13:49:29 +03:00
Jeremy Wu
02a29c6af4
New Crowdin updates (#4002) 2025-10-14 12:14:37 +03:00
Jack251970
7fa78f0304 Code cleanup 2025-10-13 15:30:38 +08:00
Jack251970
e3527f47ea Add RecordKey for precise history matching and refactor
Added a `RecordKey` property to `HistoryItem` for unique identification of history records, enabling more accurate matching during queries and executions. Updated `HistoryHelper` methods to utilize `RecordKey` for matching, with fallback to `Title` and `SubTitle`. Enhanced `GetExecuteAction` with error handling, nullable reference types, and improved matching logic. Included `RecordKey` in `History` object creation. Enabled nullable reference types in `HistoryHelper.cs` for better code safety. Refactored code for clarity and maintainability.
2025-10-13 15:27:06 +08:00
Jack Ye
e6c4cc25e5
Merge pull request #4037 from AWAS666/httpspref
Prefer https over http setting for url
2025-10-12 13:41:29 +08:00
Jack251970
1e3306ef28 Remove unused file 2025-10-12 13:33:20 +08:00
Jack251970
6f17aa21c2 Resolve conflicts 2025-10-12 13:31:24 +08:00
Jack Ye
b8acead444
Merge branch 'dev' into httpspref 2025-10-12 13:24:11 +08:00
Jack Ye
eb261f503b
Merge pull request #3944 from Flow-Launcher/url_open_enhancement
Enhancement: Support Custom Browser Path & Open in window / tab & In private for URL Plugin
2025-10-12 12:22:36 +08:00
Diego Henrique
cc397d45a9
Merge branch 'dev' into feature/history_mode 2025-10-11 15:43:05 -03:00
Jack Ye
01bbb54054
Merge pull request #4038 from AWAS666/dragdropwebsearch
Enable reordering of websearches with drap and drop
2025-10-11 20:49:17 +08:00
01Dri
2b7c2048ef up 2025-10-11 05:26:28 -03:00
Jack Ye
b297f3d3a3
Fix ArgumentOutOfRangeException in WebSearch Plugin (#4041) 2025-10-11 18:34:05 +11:00
01Dri
a3b7c6808b up 2025-10-11 04:29:33 -03:00
01Dri
a1f82e1652 refactor: using count for better performance 2025-10-11 03:47:04 -03:00
01Dri
690d33ece3 up 2025-10-11 03:43:06 -03:00
01Dri
d7579cce9e fix erros 2025-10-11 03:23:14 -03:00
01Dri
e468c48da4 feat: fix erros 2025-10-11 03:15:10 -03:00
01Dri
e6cae1a79b feat: helper 2025-10-11 03:08:23 -03:00
01Dri
95122e91f5 feat: code quality 2025-10-11 02:56:49 -03:00
01Dri
bf2acfec38 feat: code quality 2025-10-11 02:54:29 -03:00
01Dri
9e1b8c1a72 feat: Populate new history system with legacy query history 2025-10-11 02:43:27 -03:00
AWAS666
d7dd89d719 change from remove/insert to move 2025-10-10 11:40:06 +02:00
AWAS666
20a865f012 missing nullchecks and casts 2025-10-10 10:06:54 +02:00
AWAS666
87676d2994 fix: error when dragging downwards 2025-10-10 10:06:42 +02:00
AWAS666
001dad9a79 revert manual translation 2025-10-10 10:03:16 +02:00
Jack Ye
a412c7978a
Fix format
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-10 12:23:41 +08:00
01Dri
8e8e9d35ac code quality 2025-10-10 00:08:27 -03:00
01Dri
545c4208d9 code quality 2025-10-10 00:07:24 -03:00
01Dri
50f5e850dd feat: code quality 2025-10-09 23:47:59 -03:00
AWAS666
b9a43147dc enable reordering with drap and drop on websearches 2025-10-09 12:35:04 +02:00
AWAS666
ae3559ca74 fix: explicit scheme 2025-10-09 10:48:58 +02:00
AWAS666
1a373e1c40 prefer https over http setting 2025-10-09 10:36:42 +02:00
01Dri
d122276e71 feat: clean imports 2025-10-08 22:09:09 -03:00
01Dri
156cb3055c merge 2025-10-08 22:06:39 -03:00
01Dri
6aa35d592e merge dev 2025-10-08 21:38:10 -03:00
01Dri
b290055e83 feat: up 2025-10-08 21:25:13 -03:00
01Dri
c051c5cd50 feat: new history logic in MainViewModel 2025-10-08 21:15:10 -03:00
01Dri
06711d3b8b feat: Saving actions for history 2025-10-08 21:12:36 -03:00
01Dri
4f2db28196 faet: query action save 2025-10-08 21:12:14 -03:00
01Dri
3681340587 feat: toggle history 2025-10-08 21:11:27 -03:00
01Dri
9e182a2e47 feat: base history model in MainView and refactoring code to replace action between query result or last opened 2025-10-07 00:35:34 -03:00
01Dri
e5736567f6 feat: created a base History model 2025-10-07 00:33:16 -03:00
Jack Ye
a2d12eb225
Merge branch 'dev' into plugin_initialization 2025-10-05 19:25:01 +08:00
Jack Ye
5ae159de5b
Move to iNKORE.UI.WPF.Modern UI Framework (#3593) 2025-10-05 13:44:40 +03:00
Jack Ye
8c98aedac2
Merge pull request #4025 from Flow-Launcher/hide_window_before_sleep
Save settings before shutdown/restart to prevent data loss
2025-10-04 19:52:26 +08:00
01Dri
7ba4f8de4a feat: last opened history 2025-10-04 02:19:57 -03:00
Jack251970
6f6292494c Use ContainsKey(id) for O(1) lookup instead of O(n) iteration 2025-10-03 16:13:24 +08:00
Jack251970
793476432b Show setting panel for initializing or initialization failed plugins 2025-10-03 16:06:22 +08:00
Jack251970
9d7ac851bd Show setting panel for initializing or init failed plugins 2025-10-03 16:04:26 +08:00
Jack251970
54e693d0e2 Add functions in Check Initializing & Init Failed region 2025-10-03 16:03:54 +08:00
Jack251970
969b3ccbcd Revert CancelAsync to Cancel 2025-10-03 15:58:48 +08:00
Jack251970
8a2edf274a Add AutoCompleteText property for results 2025-10-03 15:36:32 +08:00
Jack251970
171eb2dd8b Data race on _allLoadedPlugins (List) across threads 2025-10-03 15:28:11 +08:00
Jack251970
76cc22d5af Use TryRemove and discard out var to clean up action keywords 2025-10-03 15:21:11 +08:00
Jack251970
2be10eb4ca Add translation for plugin failed to respond & Improve translations for plugin stil initializing 2025-10-02 22:26:28 +08:00
Jack251970
297cb5c3ef Return results to tell users that this plugin is still initializing 2025-10-02 22:23:07 +08:00
Jack251970
9a20b0e0de Expose initialized plugins via PublicAPI 2025-10-02 21:59:05 +08:00
Jack251970
66fb1d7c60 Register plugin action keywords when plugins are loaded 2025-10-02 21:52:31 +08:00
Jack251970
5ed94c8abc Resolve conflicts 2025-10-02 20:25:45 +08:00
Jack Ye
6213193cda
Merge branch 'dev' into plugin_initialization 2025-10-02 20:22:20 +08:00
Jack Ye
5b0a30774e
Fix code comment typo
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-02 19:45:08 +08:00
Jack251970
d08ee30a7a Refactor plugin actions to simplify logic
Removed logoff operation logic and associated return statement.
Eliminated return statement after recycle bin error handling.
Removed async plugin data reload and success message logic.
Simplified theme selector query handling by removing `return false`.
These changes streamline the code and improve maintainability.
2025-10-02 19:43:31 +08:00
Jack251970
167570559f Move settings save to post-confirmation for actions
Previously, `Context.API.SaveAppAllSettings()` was called unconditionally before user confirmation for shutdown, restart, and advanced restart actions. This change ensures settings are only saved if the user confirms the action by clicking "Yes" in the confirmation dialog.

For all three functionalities:
- Moved the settings save call inside the `if (result == MessageBoxResult.Yes)` block.
- Retained the existing logic for executing the respective system commands, with checks for `EnableShutdownPrivilege()` to determine whether to use `PInvoke.ExitWindowsEx` or the `shutdown` command.

This change prevents unnecessary settings saves when the user cancels the action.
2025-10-02 19:42:24 +08:00
Jack251970
e376da4482 Save settings before shutdown/restart to prevent data loss
Added a call to `Context.API.SaveAppAllSettings()` before executing system shutdown, restart, or advanced restart operations. This ensures that any unsaved settings are persisted, reducing the risk of data loss during these actions.
2025-10-02 19:29:46 +08:00
Jack Ye
1b7a475631
Merge pull request #4024 from Flow-Launcher/power_enhancement
Use sleep mode listener to fix modern standby sleep mode issue
2025-10-02 19:19:01 +08:00
01Dri
5fcd01224c feat: text 2025-10-02 00:19:40 -03:00
01Dri
bc1f9d3734 refactor: renaming executed history to last opened history 2025-10-02 00:09:28 -03:00
01Dri
c0369e6e76 feat: radio button with history query option or history executed option 2025-10-02 00:03:48 -03:00
01Dri
3cc4f13f4d feat: New option to show executed results in settings 2025-10-01 23:05:41 -03:00
Jack251970
c27817eaf0 Fix possible null exception 2025-09-30 21:20:00 +08:00
Jack251970
f239866c68 Use sleep mode listener to fix modern standby sleep mode issue 2025-09-30 21:11:03 +08:00
Jack Ye
7f0851bcb1
Merge pull request #4023 from Flow-Launcher/shell_setting_panel_enhancement
Refactor ShellSettings with Binding & Fix IsEnabled logic
2025-09-30 20:50:16 +08:00
Jeremy Wu
652ec40d82
add removal todo comment 2025-09-30 22:28:41 +10:00
Jack251970
d56d85b702 Add lock for sound & Rename variable 2025-09-30 19:41:27 +08:00
Jack251970
9be546d6c7 Fix ShowOnlyMostUsedCMDsNumber default value 2025-09-30 09:50:29 +08:00
Jack Ye
aab213a6b9
Add default value for ShowOnlyMostUsedCMDsNumber
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-09-30 09:38:18 +08:00
Jack Ye
89505fce30
Remove unnecessary DataContext
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-30 09:37:48 +08:00
Jack251970
d106c5144b Fix IsEnabled logic 2025-09-29 23:12:02 +08:00
Jack251970
175571a130 Refactor ShellSettings with Binding logic 2025-09-29 23:00:32 +08:00
Jack251970
d363cf8137 Add property change for settings class & Add localize support for enum 2025-09-29 10:42:19 +08:00
Jack251970
ec41ec2377 Improve code quality 2025-09-28 12:04:32 +08:00
Jack251970
64e9150f11 Fix build issue 2025-09-28 12:03:49 +08:00
Jack Ye
08bf147559
Merge branch 'dev' into url_open_enhancement 2025-09-28 12:02:24 +08:00
Jack251970
ca94ef58e8 Fix build issue 2025-09-28 11:46:55 +08:00
Jack Ye
b34851bd12
Merge branch 'dev' into squirrel_upgrade 2025-09-28 11:37:18 +08:00
Jack Ye
5b6ea73513
Code cleanup & Use Flow.Launcher.Localization to improve code quality (#4009)
* Use Flow.Launcher.Localization to improve code quality

* Code cleanup

* Improve code quality

* Improve code quality

* Use internal static Context & Improve code quality

* Use Flow.Launcher.Localization to improve code quality

* Code cleanup

* Use Flow.Launcher.Localization to improve code quality

* Improve code quality

* Improve code quality

* Use Flow.Launcher.Localization to improve code quality

* Fix logic issue

* Fix the variable name typo

* Fix redundant boolean cast and ensure consistent default value handling

* Use Flow.Launcher.Localization to improve code quality

* Revert namespace styles

* Fix indent format

* Revert namespace style

* Fix indent format

* Fix namespace style

* Fix indent format

* Fix indent format
2025-09-27 19:18:33 +03:00
Jack Ye
2d00ab1d3e
Merge pull request #4011 from Flow-Launcher/flow_launcher_localization1
Use Flow.Launcher.Localization to improve code quality
2025-09-28 00:04:14 +08:00
Jack Ye
e068104253
Merge pull request #3995 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Svg.Skia-3.2.1
Bump Svg.Skia from 3.0.6 to 3.2.1
2025-09-25 13:06:11 +08:00
Jack Ye
5e2536c129
Merge branch 'dev' into dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Svg.Skia-3.2.1 2025-09-25 12:41:14 +08:00
Jack Ye
f72e4692e4
Merge pull request #4012 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/SkiaSharp-3.119.1
Bump SkiaSharp from 3.119.0 to 3.119.1
2025-09-25 12:40:28 +08:00
dependabot[bot]
a76e2fea7f
Bump SkiaSharp from 3.119.0 to 3.119.1
---
updated-dependencies:
- dependency-name: SkiaSharp
  dependency-version: 3.119.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-23 22:06:58 +00:00
Jack Ye
09425e1c43
Merge pull request #4006 from sstream17/dev
Support .url Internet Shortcut File Icons
2025-09-23 21:48:22 +08:00
Jack251970
ba7de5d33d Add documents 2025-09-23 21:39:42 +08:00
Jack251970
2770dfde56 Merge branch 'dev' of https://github.com/sstream17/Flow.Launcher into dev 2025-09-23 20:50:45 +08:00
Jack251970
9b2d36b78a Revert "Catch exception"
This reverts commit 49d5cd36df.
2025-09-23 20:48:41 +08:00
Spencer Stream
3bd6906c80 Validate iconPath exists 2025-09-23 07:19:39 -05:00
Jack251970
ac62ebadf0 Add space for code quality 2025-09-23 18:07:15 +08:00
Jack251970
54622d6759 Fix Flow.Launcher.Localization contentHash issue 2025-09-23 17:53:04 +08:00
Jack251970
0a7ed3b52f Add AbstractPluginEnvironment.API back 2025-09-23 17:52:49 +08:00
Jack251970
0e366a6269 Use PublicApi.Instance instead of private one 2025-09-23 17:40:54 +08:00
Jack251970
7350c1d4d5 Use Flow.Launcher.Localization to improve code quality 2025-09-23 17:14:30 +08:00
Jack251970
d87650de08 Use Flow.Launcher.Localization to improve code quality 2025-09-23 16:21:09 +08:00
Jack251970
4865224458 Fix format 2025-09-23 14:09:21 +08:00
Jack251970
49d5cd36df Catch exception 2025-09-23 12:24:44 +08:00
Jack Ye
130033cf4b
Apply suggestion from @Copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-23 12:22:46 +08:00
Spencer Stream
c293a273ca Fix nitpick on extension string comparison 2025-09-22 21:53:54 -05:00
Spencer Stream
90c73e5e3d Support .url file icons 2025-09-22 19:42:49 -05:00
Spencer Stream
fbc88bb4cd Add ini-parser package to Infrastructure project 2025-09-22 19:42:49 -05:00
Jack Ye
1e8819af0c
Merge pull request #4004 from dcog989/404-local-file-crash
Crash when opening non-existent local file
2025-09-22 21:09:29 +08:00
Jack251970
763fee0c14 Add new helper method & Improve code quality 2025-09-22 20:58:22 +08:00
Jack251970
71b8144c3c Add translations & Improve code quality 2025-09-22 20:55:36 +08:00
dcog989
bfd10f6903 Crash when opening non-existent file 2025-09-22 13:37:22 +01:00
Jack Ye
10c79da35c
Merge branch 'dev' into plugin_initialization 2025-09-21 21:37:18 +08:00
Jack Ye
d7d88a9ebb
Merge branch 'dev' into url_open_enhancement 2025-09-21 21:37:14 +08:00
Jack Ye
a32b9ca8c0
Merge branch 'dev' into squirrel_upgrade 2025-09-21 21:37:09 +08:00
Jeremy Wu
7de420e32b
Merge pull request #4001 from Flow-Launcher/merge_back_v2_0_1
Merge v2.0.1 back into dev
2025-09-21 23:32:09 +10:00
Jeremy
dc1f0f1095 merge back v2.0.1 from master into dev 2025-09-21 23:15:34 +10:00
Jack Ye
18a3ae7bff
Merge branch 'dev' into squirrel_upgrade 2025-09-21 20:28:01 +08:00
Jack Ye
35867a0a00
Merge pull request #3999 from Flow-Launcher/portable_mode_fix
Fix PortableMode Check Issue
2025-09-21 20:23:39 +08:00
Jeremy Wu
a05e09908c
Release 2.0.1 (#3998) 2025-09-21 20:23:00 +08:00
Jack251970
6fca1c919e Fix issue in PortableDataLocationInUse 2025-09-21 20:07:18 +08:00
Jeremy Wu
d7e1ad73cc
New Crowdin updates (#3948) 2025-09-21 14:36:35 +03:00
Jack251970
7e56c8a011 Revert changes 2025-09-21 16:48:00 +08:00
Jack251970
d6bc053950 Revert changes 2025-09-21 16:46:43 +08:00
Jack251970
813be4af2b Merge branch 'squirrel_upgrade' of https://github.com/Flow-Launcher/Flow.Launcher into squirrel_upgrade 2025-09-21 16:45:37 +08:00
Jack251970
df1a272090 Fix argument null exception 2025-09-21 16:45:25 +08:00
Jack Ye
f1ae421853
Update code comments
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-21 16:25:24 +08:00
Jack251970
99b7bdab27 Fix build issue 2025-09-21 16:21:38 +08:00
Jack251970
fbb9e09237 Improve code quality 2025-09-21 16:19:13 +08:00
Jack251970
21a6fdd100 Fix issue in PortableDataLocationInUse 2025-09-21 16:17:41 +08:00
Jack251970
2f52c1aa1b Improve code quality 2025-09-21 16:17:31 +08:00
Jack251970
56d6234f1c Initialize logger after data path initialization during portable clean up 2025-09-21 15:17:18 +08:00
Jack251970
81dcadb959 Use getter to fix data location issue 2025-09-21 14:57:50 +08:00
Jack251970
89d726de2a Use getter to fix data location issue 2025-09-21 14:03:43 +08:00
Jack Ye
9211fe476d
Merge branch 'dev' into squirrel_upgrade 2025-09-21 13:42:37 +08:00
Jack Ye
3116f3d363
Merge branch 'dev' into plugin_initialization 2025-09-21 13:22:31 +08:00
dependabot[bot]
846cc65d8e
Bump Svg.Skia from 3.0.6 to 3.2.1
---
updated-dependencies:
- dependency-name: Svg.Skia
  dependency-version: 3.2.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-21 04:49:51 +00:00
Jack Ye
7a7760c3dd
Merge pull request #3997 from Flow-Launcher/flow_launcher_localization
Use Flow.Launcher.Localization to improve code quality
2025-09-21 12:47:34 +08:00
Jack251970
78e5bf2a60 Use Flow.Launcher.Localization to improve code quality 2025-09-21 11:50:51 +08:00
Jack Ye
a2c11af82b
Merge pull request #3980 from Flow-Launcher/try_create_setting_panel
Catch exception when creating setting panel
2025-09-20 07:53:22 +08:00
Jack Ye
89fca85ca8
Merge pull request #3993 from Flow-Launcher/improve_log
Use Debug instead of Info
2025-09-19 13:27:40 +08:00
Jack Ye
536f1a392e
Merge pull request #3986 from Flow-Launcher/wallpaper_lock
Fix Wallpaper File Lock
2025-09-19 13:27:18 +08:00
Jack Ye
5d843ecae8
Merge pull request #3990 from Flow-Launcher/internalization_memory_leak
Remove old dictionaries references to fix possible memory leak
2025-09-19 12:41:43 +08:00
Jack251970
bbc12ec041 Revert "Disable cache feature"
This reverts commit 9a597f2b4d.
2025-09-18 21:45:24 +08:00
Jack251970
72dae631fe Use TextBox.ForegroundProperty 2025-09-18 21:19:49 +08:00
Jack251970
245c492906 Improve code quality 2025-09-18 21:13:12 +08:00
Jeremy Wu
3a8c64b02d
update wording 2025-09-18 23:08:02 +10:00
Jack251970
7a5e55e5f0 Use Debug instead of Info 2025-09-18 21:06:18 +08:00
Jack Ye
16895716e9
Merge pull request #3978 from Flow-Launcher/program_locks
Fix program lock waiting issue
2025-09-18 20:38:15 +08:00
Jack Ye
9030bffdbd
Merge pull request #3992 from Flow-Launcher/clear_cache_twice
Fix DirectoryNotFoundException when deleting cache twice
2025-09-18 19:59:34 +08:00
Jeremy Wu
4bea4101a1
add comment for cache folder size refresh event 2025-09-18 21:40:37 +10:00
Jack251970
ec182ade39 Fix property changed event 2025-09-18 19:18:11 +08:00
Jack251970
35a5e27e2d Fix DirectoryNotFoundException when deleting cache twice 2025-09-18 19:15:22 +08:00
Jack251970
9a597f2b4d Disable cache feature 2025-09-18 18:32:13 +08:00
Jack251970
fc2e3fec63 Improve ImageLoader performance 2025-09-18 18:29:45 +08:00
Jack251970
0f6245a072 Handle exceptions inside ChangeLanguageAsync to avoid unobserved task crashes 2025-09-18 18:18:02 +08:00
Jack251970
86581e6a00 Add disposable for internalization 2025-09-18 18:17:27 +08:00
Jack251970
330e6c09e7 Add language change lock 2025-09-18 18:07:18 +08:00
Jack251970
6c695f09e7 Use clear function 2025-09-18 17:55:06 +08:00
Jack251970
b05c2c1e1a Remove old dictionaries references to fix possible memory leak 2025-09-18 16:25:21 +08:00
Jack Ye
820304ce19
Merge pull request #3988 from Flow-Launcher/default_browser_explorer_translation
Add Default Browser & File Explorer & New Profile Translation & Ignore index change for -1
2025-09-18 12:58:04 +08:00
Jack251970
1017501153 Fix namespace issue 2025-09-18 12:36:40 +08:00
Jack251970
256ae5c4b0 Fill missing translation 2025-09-18 12:15:33 +08:00
Jack251970
a03f62832a Ignore index change for -1 2025-09-18 12:08:49 +08:00
Jack251970
dd07baff59 Add SelectFile helper method & Improve code quality 2025-09-18 11:58:38 +08:00
Jack251970
647c55eaf7 Add property changed check 2025-09-18 11:47:18 +08:00
Jack251970
1fea8edb74 Add translation for default items & new profile item for explorer & browser window 2025-09-18 11:46:09 +08:00
Jack Ye
2dd416028d
Merge pull request #3950 from Flow-Launcher/FileExplorerHelper_enhancement
Use DialogJump to get explorer path
2025-09-18 09:17:47 +08:00
Jack Ye
3f0f118c8b
Merge pull request #3985 from Flow-Launcher/everything_sort_option
Fix AllEverythingSortOptions issue
2025-09-18 09:07:19 +08:00
Jack Ye
e50a2772f8
Update code comments
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-17 19:33:46 +08:00
Jack251970
354b04bea4 Add code comments 2025-09-17 19:29:36 +08:00
Jack251970
60ec9b5c49 Use OnLoaded to ensure the wallpaper file is not locked 2025-09-17 19:24:32 +08:00
Jack251970
83f02f5c91 Use log error & Improve returned color 2025-09-17 19:16:58 +08:00
Jack251970
5c16b86edf Fix file lock during file stream 2025-09-17 19:16:09 +08:00
Jack251970
80c283a370 Improve code quality 2025-09-17 19:15:46 +08:00
Jack251970
23d0b73e20 Fix AllEverythingSortOptions issue 2025-09-17 17:30:03 +08:00
Jack Ye
8bac530504
Merge pull request #3971 from dcog989/calculator-min-fix
Backout 'smart' digit separation & Fix Mages functions for Calculator plugin
2025-09-16 21:13:40 +08:00
Jack251970
8321e400c1 Fix test setting & Add instances to private fields 2025-09-16 21:04:56 +08:00
Jack251970
552b6547db Fix unit test result issue 2025-09-16 16:40:36 +08:00
Jack251970
e10b9254ed Add workaround for log & ln function 2025-09-16 16:31:06 +08:00
Jack251970
6841ad5410 Add calculator unit testing 2025-09-16 16:08:17 +08:00
Jack251970
f7b3a7c812 Fix Squirrel.exe path 2025-09-16 12:12:35 +08:00
Jack251970
3596f59430 Upgrade squirrel package version 2025-09-16 12:03:15 +08:00
Jack Ye
43e3376d2e
Merge pull request #3979 from Flow-Launcher/json_plugin_setting
Improve JsonRPC Plugin Setting Panel
2025-09-16 08:04:57 +08:00
Jack251970
18c8a04cbc Log exception 2025-09-15 21:46:03 +08:00
Jack251970
0355993b00 Use translation 2025-09-15 21:38:53 +08:00
Jack251970
e204daa844 Catch exception when creating setting panel 2025-09-15 21:33:21 +08:00
Jack251970
55f9857dec Remove SystemParameters.VerticalScrollBarWidth 2025-09-15 18:59:01 +08:00
Jack251970
e571204a84 No need to initialize max width 2025-09-15 18:48:09 +08:00
Jack251970
988db485a2 Merge branch 'json_plugin_setting' of https://github.com/Flow-Launcher/Flow.Launcher into json_plugin_setting 2025-09-15 18:46:53 +08:00
Jack251970
f3cb85ea59 Remove unnecessary check 2025-09-15 18:46:47 +08:00
Jack Ye
5695200940
Fix typos
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-15 18:46:05 +08:00
Jack251970
44ca9c3480 Use wrap text warpping & set max width of all children 2025-09-15 18:40:16 +08:00
Jack251970
b5c860db1d Add max width constrain 2025-09-15 18:27:19 +08:00
Jack251970
ef69e329fc Fix release 2025-09-15 15:50:22 +08:00
Jack251970
9321a7df14 Fix program lock issue 2025-09-15 15:40:49 +08:00
Jack251970
684fafdfdd Improve code quality 2025-09-15 15:18:42 +08:00
Jack251970
c2e797615d Improve code quality 2025-09-15 15:18:23 +08:00
Jack251970
f9facda521 Improve code quality 2025-09-15 13:02:42 +08:00
Jack251970
1906d68541 Add ShowErrorMessage setting 2025-09-15 12:57:25 +08:00
Jack251970
cea1402dde Improve code quality 2025-09-15 12:53:17 +08:00
Jack251970
b07420a193 Use EmptyResults to improve code quality 2025-09-15 12:51:31 +08:00
dcog989
9be8b71f09 review feedback, CultureInvariant, mild refactor 2025-09-14 22:28:37 +01:00
dcog989
edc76faeb4 Review feedback, case insensitive, consistent separators 2025-09-14 21:51:47 +01:00
dcog989
e990e0ff5b Handle misplaced separators, Mages edge cases
Allow for e.g. `25,00` when `,` used as digit grouping.
Exclude Mages function from the above relaxed logic.
2025-09-14 19:39:06 +01:00
dcog989
336e51d104 IcoPath to const string 2025-09-14 17:08:37 +01:00
dcog989
c79e4831e1
Merge branch 'Flow-Launcher:dev' into calculator-min-fix 2025-09-14 14:54:28 +01:00
Jack251970
daf35a4972 Do not check bracket complete 2025-09-14 15:54:35 +08:00
Jack251970
495ace1246 Improve plugin description 2025-09-14 12:39:11 +08:00
Jack Ye
51df66e362
Merge pull request #3976 from dcog989/logging-enhanced
Enhanced logging
2025-09-14 12:34:32 +08:00
Jack251970
11f5ea5074 Improve code quality 2025-09-14 12:33:46 +08:00
Jack251970
c2fcf648e0 Improve log file format 2025-09-14 12:25:54 +08:00
Jack251970
2ae57ae34c Format & Improve string resources & Rename enums 2025-09-14 12:20:00 +08:00
Jack Ye
0e0ef0e5a2
Merge pull request #3975 from dcog989/CommunityPluginSource-logging-refined
Catch scary exception, print friendly log
2025-09-14 12:05:19 +08:00
dcog989
d4a757be49 Enhanced logging
User can now choose None, Error, Info, or Debug.
2025-09-13 19:57:54 +01:00
dcog989
08a571f076 Merge branch 'CommunityPluginSource-logging-refined' of https://github.com/dcog989/Flow.Launcher into CommunityPluginSource-logging-refined 2025-09-13 17:06:21 +01:00
dcog989
f3998a190c explicit exception logging 2025-09-13 17:04:32 +01:00
dcog989
6eeef62568
Merge branch 'dev' into CommunityPluginSource-logging-refined 2025-09-13 16:33:49 +01:00
dcog989
e63c4f3b6e Catch scary exception, print friendly log
Rather than showing the user `EXCEPTION OCCURS: System.Threading.Tasks.TaskCanceledException...`, print not scary log msg
2025-09-13 16:30:13 +01:00
dcog989
6462023d58
Merge branch 'dev' into calculator-min-fix 2025-09-13 13:17:40 +01:00
dcog989
110f571b40 Rework solution for nested Mages
Previous solution missed e.g. `pow(min(2,3), 4)`
2025-09-13 13:17:08 +01:00
Jeremy Wu
eaa90b31d8
Merge pull request #3906 from Flow-Launcher/nuget_package_upgrade
Upgrade Nuget packages & Update lock files
2025-09-13 17:36:20 +10:00
Jack251970
29b675b26a Upgrade nuget packages 2025-09-13 14:14:59 +08:00
Jack Ye
889ed58f0c
Merge pull request #3973 from dcog989/bookmark-quick-fix
Bookmark plugin - catch an exception for empty / broken favicons
2025-09-13 14:13:06 +08:00
Jack Ye
7fc30aea93
Merge branch 'dev' into nuget_package_upgrade 2025-09-13 14:06:16 +08:00
Jack Ye
45275f0a2c
Merge pull request #3964 from Flow-Launcher/dependabot/nuget/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Microsoft.Data.Sqlite-9.0.9
Bump Microsoft.Data.Sqlite from 9.0.8 to 9.0.9
2025-09-13 14:05:36 +08:00
dcog989
15f31a1698 Bookmark plugin quick fix
Catch an exception for empty / corrupted favicons.
2025-09-12 22:34:03 +01:00
dcog989
bd186e7fe1 correct + extend description 2025-09-12 20:02:34 +01:00
dcog989
190e0e179f Fix 'German' number formatting 2025-09-12 20:01:55 +01:00
dcog989
103d3832a0 dead code, improve messages, group separator fix? 2025-09-12 19:30:07 +01:00
dcog989
e1079396c3 backout 'smart' digit grouping, mages fixes + workaround
Mages did not like the previous change to smart thousands / decimal so backed that out.

Workaround for https://github.com/FlorianRappl/Mages/issues/132
2025-09-12 19:20:19 +01:00
dependabot[bot]
ca164b37db
Bump Microsoft.Data.Sqlite from 9.0.8 to 9.0.9
---
updated-dependencies:
- dependency-name: Microsoft.Data.Sqlite
  dependency-version: 9.0.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-09 22:07:50 +00:00
Jack251970
f40255bc8a Use DialogJump to get explorer path 2025-09-06 15:52:57 +08:00
Jack251970
8e837b8e56 Avoid clobbering inherited NoWarn; append instead. 2025-09-06 13:37:27 +08:00
Jack Ye
2d8c7a39ca
Merge branch 'dev' into plugin_initialization 2025-09-06 13:31:29 +08:00
Jack Ye
8bc60e55e0
Merge branch 'dev' into nuget_package_upgrade 2025-09-06 13:31:24 +08:00
Jack Ye
45bb6e94fc
Merge branch 'dev' into url_open_enhancement 2025-09-06 13:31:19 +08:00
Jack Ye
cf8096f276
Merge branch 'dev' into plugin_initialization 2025-09-05 20:35:05 +08:00
Jack251970
b501e52f5d Upgrade nuget packages 2025-09-05 19:49:21 +08:00
Jack251970
3f6bebd540 Keep default value same as origin 2025-09-05 19:04:46 +08:00
Jack251970
96d7d18f6d Change string resource names & Redesign setting panel 2025-09-05 19:02:49 +08:00
Jack251970
4f49077bee Add & Use BoolToVisibilityConverter 2025-09-05 19:02:29 +08:00
Jack251970
33aef7eb54 Add convert back implementation for InverseBoolConverter 2025-09-05 19:02:11 +08:00
Jack251970
cdf3905a51 Use InverseBoolConverter 2025-09-05 18:40:50 +08:00
Jack251970
c17db8c9b4 Use using statements 2025-09-05 18:40:28 +08:00
Jack251970
34a58bc5da Add InverseBoolConverter 2025-09-05 18:39:31 +08:00
Jack251970
7ca37697d4 Use PrivateModeArgument & Implement new logic for browser openning 2025-09-05 18:39:22 +08:00
Jack251970
978b18570a Add PrivateModeArgument & Add IPropertyChanged interface for some properties 2025-09-05 18:39:02 +08:00
Jack251970
1303ae5682 Update string resource 2025-09-05 16:07:26 +08:00
Jack251970
33a9654fe0 Add settings control 2025-09-04 22:06:02 +08:00
Jack251970
1dc1643071 Change language strings 2025-09-04 21:46:55 +08:00
Jack251970
48e845c0b1 Change language strings 2025-09-04 21:45:20 +08:00
Jack251970
5976ddeb72 Add more strings 2025-09-04 17:54:03 +08:00
Jack251970
2d5626b0cd Use more settings 2025-09-04 17:30:20 +08:00
Jack251970
c9ca9ad4ba Add more settings 2025-09-04 17:30:08 +08:00
Jack251970
f848d1b7b2 Improve code quality 2025-09-04 17:26:19 +08:00
Jack251970
56bdfa72d1 Improve code quality 2025-09-04 17:24:59 +08:00
Jack251970
6e873abc7b Upgrade nuget package & Fix lock file issue 2025-08-30 16:34:34 +08:00
Jack Ye
528687cf63
Merge branch 'dev' into nuget_package_upgrade 2025-08-30 16:27:15 +08:00
Jack251970
6b60373886 Upgrade nuget packages 2025-08-25 18:50:02 +08:00
Jack251970
b07763ad05 Suppress FLSG0007 2025-08-19 14:27:45 +08:00
Jack251970
922c3d5611 Upgrade nuget packages & Update lock files 2025-08-17 16:54:41 +08:00
Jack251970
fb8daa4ed9 Potential race condition in action keyword management 2025-08-12 18:12:15 +08:00
Jack Ye
04bd9ddc2c
Verify File.Delete exception handling
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-08-12 18:09:59 +08:00
Jack251970
9221435bad Remove plugin from _allLoadedPlugins when one plugin is uninstalled 2025-08-12 18:07:10 +08:00
Jack251970
31c8e850cd Improve code quality 2025-08-12 18:03:23 +08:00
Jack251970
f08466245a Set GetAllInitializedPlugins to private 2025-08-12 17:53:53 +08:00
Jack251970
93af079316 Improve code quality 2025-08-12 17:49:22 +08:00
Jack Ye
97fb8d680f
Merge branch 'dev' into plugin_initialization 2025-07-24 11:54:19 +01:00
Jack251970
3221f930c4 Add info log message for plugin constructors 2025-07-21 21:17:30 +08:00
Jack251970
e0240784b5 Improve code quality 2025-07-21 21:11:48 +08:00
Jack251970
0f8553b45d Refresh home page after plugins are initialized 2025-07-21 19:39:42 +08:00
Jack251970
269d21a4c0 Change plugin modified logic 2025-07-21 18:11:16 +08:00
Jack251970
566bd04e3f Support two types in one class 2025-07-21 18:06:05 +08:00
Jack251970
bef1feea0a Fix plugin page logic 2025-07-21 18:05:22 +08:00
Jack251970
f808469285 Fix logic & Improve code quality 2025-07-21 17:59:28 +08:00
Jack251970
63f86613c3 Use internal PluginModified method instead of API.PluginModified 2025-07-21 17:55:06 +08:00
Jack251970
067a51775e Fix null exception 2025-07-21 17:54:20 +08:00
Jack251970
d9cc67ce6d Merge branch 'plugin_initialization' of https://github.com/Flow-Launcher/Flow.Launcher into plugin_initialization 2025-07-21 17:49:31 +08:00
Jack251970
59e4fb82b9 Fix logic & Add code comments 2025-07-21 17:49:24 +08:00
Jack Ye
a9a705f118
Fix logic
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-21 17:48:17 +08:00
Jack251970
6409c193c4 Add code comments 2025-07-21 17:47:19 +08:00
Jack251970
950a4a00a6 Code quality 2025-07-21 17:45:46 +08:00
Jack251970
67c940f3a8 Do not show setting panel for init failed plugins 2025-07-21 17:45:01 +08:00
Jack251970
324b3eb081 Do not call interface methods for init failed plugins 2025-07-21 17:33:47 +08:00
Jack251970
d4a1953747 Add init failed plugins 2025-07-21 17:28:20 +08:00
Jack251970
b348debc72 Code quality 2025-07-21 17:27:37 +08:00
Jack251970
fc01ddbb1c Save init failed plugins 2025-07-21 17:27:21 +08:00
Jack251970
7f797b1039 Add code comments 2025-07-21 17:22:17 +08:00
Jack251970
3bd76b2dfd Rename variable 2025-07-21 17:17:49 +08:00
Jack251970
8d03fcee2e Remove error codes 2025-07-21 17:17:11 +08:00
Jack251970
9149e3f201 Mark initializing plugins as modified 2025-07-21 17:16:36 +08:00
Jack251970
6d99416641 Search in loaded plugins 2025-07-21 17:14:03 +08:00
Jack251970
6e0f2fc4ce Return loaded plugins 2025-07-21 17:03:21 +08:00
Jack251970
fe3339f645 Get initialized plugins for plugin page 2025-07-21 17:02:19 +08:00
Jack251970
11e05f73d9 Add all loaded plugins 2025-07-21 17:00:19 +08:00
Jack251970
566572b013 Use api function & rename function 2025-07-21 16:57:35 +08:00
Jack251970
8b60d26f5e Fix build issue 2025-07-21 16:56:14 +08:00
Jack251970
50924e4189 Improve code quality 2025-07-21 16:45:34 +08:00
Jack251970
cc68183940 Change variable name 2025-07-21 16:30:39 +08:00
Jack251970
55164ef60f Improve code quality 2025-07-21 16:29:01 +08:00
Jack251970
de568140d2 Improve code quality 2025-07-21 16:27:11 +08:00
Jack251970
445a14278b Add code comments 2025-07-21 16:25:26 +08:00
Jack251970
1d3ab39dca Use () => instead of delegate 2025-07-21 16:24:23 +08:00
Jack251970
35c8e39beb Improve code comments 2025-07-21 16:23:40 +08:00
Jack251970
c3a598464f Fix code comments 2025-07-21 16:20:09 +08:00
Jack251970
0a01d85f40 Improve code quality 2025-07-21 16:16:21 +08:00
Jack251970
52bb909f0b Add plugin to all plugin list later 2025-07-21 16:00:42 +08:00
Jack251970
59a7a2c807 Improve code quality 2025-07-21 15:59:27 +08:00
Jack251970
6beeecb0f7 Use async load & initialization model 2025-07-21 14:26:24 +08:00
Jack251970
c2157e2df1 Add support for concurrent operation of explorers & dialogs adding 2025-07-21 14:03:45 +08:00
Jack251970
d4e672d630 Add support to update translation for one plugin 2025-07-21 13:55:47 +08:00
Jack251970
f5f256809c Add IResultUpdateRegister interface 2025-07-21 13:52:11 +08:00
Jack251970
aee46e8640 Initialize quick jump earlier 2025-07-21 12:10:06 +08:00
Jack251970
9ce911771e Improve code quality 2025-07-21 11:31:54 +08:00
407 changed files with 12156 additions and 13108 deletions

View file

@ -10,7 +10,7 @@ jobs:
runs-on: windows-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: Setup .NET
uses: actions/setup-dotnet@v5
with:

View file

@ -20,7 +20,7 @@ jobs:
NUGET_CERT_REVOCATION_MODE: offline
BUILD_NUMBER: ${{ github.run_number }}
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: Set Flow.Launcher.csproj version
id: update
uses: vers-one/dotnet-project-version-updater@v1.7
@ -54,28 +54,28 @@ jobs:
shell: powershell
run: .\Scripts\post_build.ps1
- name: Upload Plugin Nupkg
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: Plugin nupkg
path: |
Output\Release\Flow.Launcher.Plugin.*.nupkg
compression-level: 0
- name: Upload Setup
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: Flow Installer
path: |
Output\Packages\Flow-Launcher-*.exe
compression-level: 0
- name: Upload Portable Version
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: Portable Version
path: |
Output\Packages\Flow-Launcher-Portable.zip
compression-level: 0
- name: Upload Full Nupkg
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: Full nupkg
path: |
@ -83,7 +83,7 @@ jobs:
compression-level: 0
- name: Upload Release Information
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: RELEASES
path: |

View file

@ -14,4 +14,4 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Assign PR to creator
uses: toshimaru/auto-author-assign@v2.1.1
uses: toshimaru/auto-author-assign@v3.0.1

View file

@ -11,7 +11,7 @@ jobs:
update-pr:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:

View file

@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<AccelerateBuildsInVisualStudio>true</AccelerateBuildsInVisualStudio>
<!-- Work around https://github.com/dotnet/runtime/issues/109682 -->
<!-- Workaround https://github.com/dotnet/runtime/issues/109682 -->
<CETCompat>false</CETCompat>
</PropertyGroup>
</Project>

View file

@ -3,10 +3,8 @@ using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
using Microsoft.Win32;
using Squirrel;
@ -17,8 +15,6 @@ namespace Flow.Launcher.Core.Configuration
{
private static readonly string ClassName = nameof(Portable);
private readonly IPublicAPI API = Ioc.Default.GetRequiredService<IPublicAPI>();
/// <summary>
/// As at Squirrel.Windows version 1.5.2, UpdateManager needs to be disposed after finish
/// </summary>
@ -45,13 +41,13 @@ namespace Flow.Launcher.Core.Configuration
#endif
IndicateDeletion(DataLocation.PortableDataPath);
API.ShowMsgBox(API.GetTranslation("restartToDisablePortableMode"));
PublicApi.Instance.ShowMsgBox(Localize.restartToDisablePortableMode());
UpdateManager.RestartApp(Constant.ApplicationFileName);
}
catch (Exception e)
{
API.LogException(ClassName, "Error occurred while disabling portable mode", e);
PublicApi.Instance.LogException(ClassName, "Error occurred while disabling portable mode", e);
}
}
@ -68,13 +64,13 @@ namespace Flow.Launcher.Core.Configuration
#endif
IndicateDeletion(DataLocation.RoamingDataPath);
API.ShowMsgBox(API.GetTranslation("restartToEnablePortableMode"));
PublicApi.Instance.ShowMsgBox(Localize.restartToEnablePortableMode());
UpdateManager.RestartApp(Constant.ApplicationFileName);
}
catch (Exception e)
{
API.LogException(ClassName, "Error occurred while enabling portable mode", e);
PublicApi.Instance.LogException(ClassName, "Error occurred while enabling portable mode", e);
}
}
@ -94,13 +90,13 @@ namespace Flow.Launcher.Core.Configuration
public void MoveUserDataFolder(string fromLocation, string toLocation)
{
FilesFolders.CopyAll(fromLocation, toLocation, (s) => API.ShowMsgBox(s));
FilesFolders.CopyAll(fromLocation, toLocation, (s) => PublicApi.Instance.ShowMsgBox(s));
VerifyUserDataAfterMove(fromLocation, toLocation);
}
public void VerifyUserDataAfterMove(string fromLocation, string toLocation)
{
FilesFolders.VerifyBothFolderFilesEqual(fromLocation, toLocation, (s) => API.ShowMsgBox(s));
FilesFolders.VerifyBothFolderFilesEqual(fromLocation, toLocation, (s) => PublicApi.Instance.ShowMsgBox(s));
}
public void CreateShortcuts()
@ -139,8 +135,8 @@ namespace Flow.Launcher.Core.Configuration
public void PreStartCleanUpAfterPortabilityUpdate()
{
// Specify here so this method does not rely on other environment variables to initialise
var portableDataDir = Path.Combine(Directory.GetParent(Assembly.GetExecutingAssembly().Location.NonNull()).ToString(), "UserData");
var roamingDataDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "FlowLauncher");
var portableDataDir = DataLocation.PortableDataPath;
var roamingDataDir = DataLocation.RoamingDataPath;
// Get full path to the .dead files for each case
var portableDataDeleteFilePath = Path.Combine(portableDataDir, DataLocation.DeletionIndicatorFile);
@ -150,12 +146,12 @@ namespace Flow.Launcher.Core.Configuration
// delete it and prompt the user to pick the portable data location
if (File.Exists(roamingDataDeleteFilePath))
{
FilesFolders.RemoveFolderIfExists(roamingDataDir, (s) => API.ShowMsgBox(s));
FilesFolders.RemoveFolderIfExists(roamingDataDir, (s) => PublicApi.Instance.ShowMsgBox(s));
if (API.ShowMsgBox(API.GetTranslation("moveToDifferentLocation"),
if (PublicApi.Instance.ShowMsgBox(Localize.moveToDifferentLocation(),
string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
FilesFolders.OpenPath(Constant.RootDirectory, (s) => API.ShowMsgBox(s));
FilesFolders.OpenPath(Constant.RootDirectory, (s) => PublicApi.Instance.ShowMsgBox(s));
Environment.Exit(0);
}
@ -164,9 +160,9 @@ namespace Flow.Launcher.Core.Configuration
// delete it and notify the user about it.
else if (File.Exists(portableDataDeleteFilePath))
{
FilesFolders.RemoveFolderIfExists(portableDataDir, (s) => API.ShowMsgBox(s));
FilesFolders.RemoveFolderIfExists(portableDataDir, (s) => PublicApi.Instance.ShowMsgBox(s));
API.ShowMsgBox(API.GetTranslation("shortcutsUninstallerCreated"));
PublicApi.Instance.ShowMsgBox(Localize.shortcutsUninstallerCreated());
}
}
@ -177,8 +173,7 @@ namespace Flow.Launcher.Core.Configuration
if (roamingLocationExists && portableLocationExists)
{
API.ShowMsgBox(string.Format(API.GetTranslation("userDataDuplicated"),
DataLocation.PortableDataPath, DataLocation.RoamingDataPath, Environment.NewLine));
PublicApi.Instance.ShowMsgBox(Localize.userDataDuplicated(DataLocation.PortableDataPath, DataLocation.RoamingDataPath, Environment.NewLine));
return false;
}

View file

@ -8,7 +8,6 @@ using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure.Http;
using Flow.Launcher.Plugin;
@ -18,13 +17,9 @@ namespace Flow.Launcher.Core.ExternalPlugins
{
private static readonly string ClassName = nameof(CommunityPluginSource);
// We should not initialize API in static constructor because it will create another API instance
private static IPublicAPI api = null;
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
private string latestEtag = "";
private List<UserPlugin> plugins = new();
private List<UserPlugin> plugins = [];
private static readonly JsonSerializerOptions PluginStoreItemSerializationOption = new()
{
@ -41,7 +36,7 @@ namespace Flow.Launcher.Core.ExternalPlugins
/// </remarks>
public async Task<List<UserPlugin>> FetchAsync(CancellationToken token)
{
API.LogInfo(ClassName, $"Loading plugins from {ManifestFileUrl}");
PublicApi.Instance.LogInfo(ClassName, $"Loading plugins from {ManifestFileUrl}");
var request = new HttpRequestMessage(HttpMethod.Get, ManifestFileUrl);
@ -59,29 +54,40 @@ namespace Flow.Launcher.Core.ExternalPlugins
.ConfigureAwait(false);
latestEtag = response.Headers.ETag?.Tag;
API.LogInfo(ClassName, $"Loaded {plugins.Count} plugins from {ManifestFileUrl}");
PublicApi.Instance.LogInfo(ClassName, $"Loaded {plugins.Count} plugins from {ManifestFileUrl}");
return plugins;
}
else if (response.StatusCode == HttpStatusCode.NotModified)
{
API.LogInfo(ClassName, $"Resource {ManifestFileUrl} has not been modified.");
PublicApi.Instance.LogInfo(ClassName, $"Resource {ManifestFileUrl} has not been modified.");
return plugins;
}
else
{
API.LogWarn(ClassName, $"Failed to load resource {ManifestFileUrl} with response {response.StatusCode}");
PublicApi.Instance.LogWarn(ClassName, $"Failed to load resource {ManifestFileUrl} with response {response.StatusCode}");
return null;
}
}
catch (OperationCanceledException) when (token.IsCancellationRequested)
{
PublicApi.Instance.LogDebug(ClassName, $"Fetching from {ManifestFileUrl} was cancelled by caller.");
return null;
}
catch (TaskCanceledException)
{
// Likely an HttpClient timeout or external cancellation not requested by our token
PublicApi.Instance.LogWarn(ClassName, $"Fetching from {ManifestFileUrl} timed out.");
return null;
}
catch (Exception e)
{
if (e is HttpRequestException or WebException or SocketException || e.InnerException is TimeoutException)
{
API.LogException(ClassName, $"Check your connection and proxy settings to {ManifestFileUrl}.", e);
PublicApi.Instance.LogException(ClassName, $"Check your connection and proxy settings to {ManifestFileUrl}.", e);
}
else
{
API.LogException(ClassName, "Error Occurred", e);
PublicApi.Instance.LogException(ClassName, "Error Occurred", e);
}
return null;
}

View file

@ -4,7 +4,6 @@ using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Forms;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedCommands;
@ -15,7 +14,7 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
{
private static readonly string ClassName = nameof(AbstractPluginEnvironment);
protected readonly IPublicAPI API = Ioc.Default.GetRequiredService<IPublicAPI>();
protected readonly IPublicAPI API = PublicApi.Instance;
internal abstract string Language { get; }
@ -58,15 +57,10 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
return SetPathForPluginPairs(PluginsSettingsFilePath, Language);
}
var noRuntimeMessage = string.Format(
API.GetTranslation("runtimePluginInstalledChooseRuntimePrompt"),
Language,
EnvName,
Environment.NewLine
);
var noRuntimeMessage = Localize.runtimePluginInstalledChooseRuntimePrompt(Language, EnvName, Environment.NewLine);
if (API.ShowMsgBox(noRuntimeMessage, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
{
var msg = string.Format(API.GetTranslation("runtimePluginChooseRuntimeExecutable"), EnvName);
var msg = Localize.runtimePluginChooseRuntimeExecutable(EnvName);
var selectedFile = GetFileFromDialog(msg, FileDialogFilter);
@ -77,12 +71,7 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
// Nothing selected because user pressed cancel from the file dialog window
else
{
var forceDownloadMessage = string.Format(
API.GetTranslation("runtimeExecutableInvalidChooseDownload"),
Language,
EnvName,
Environment.NewLine
);
var forceDownloadMessage = Localize.runtimeExecutableInvalidChooseDownload(Language, EnvName, Environment.NewLine);
// Let users select valid path or choose to download
while (string.IsNullOrEmpty(selectedFile))
@ -120,7 +109,7 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
}
else
{
API.ShowMsgBox(string.Format(API.GetTranslation("runtimePluginUnableToSetExecutablePath"), Language));
API.ShowMsgBox(Localize.runtimePluginUnableToSetExecutablePath(Language));
API.LogError(ClassName,
$"Not able to successfully set {EnvName} path, setting's plugin executable path variable is still an empty string.",
$"{Language}Environment");
@ -248,7 +237,7 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
private static string GetUpdatedEnvironmentPath(string filePath)
{
var index = filePath.IndexOf(DataLocation.PluginEnvironments);
// get the substring after "Environments" because we can not determine it dynamically
var executablePathSubstring = filePath[(index + DataLocation.PluginEnvironments.Length)..];
return $"{DataLocation.PluginEnvironmentsPath}{executablePathSubstring}";

View file

@ -51,7 +51,7 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
}
catch (System.Exception e)
{
API.ShowMsgError(API.GetTranslation("failToInstallPythonEnv"));
API.ShowMsgError(Localize.failToInstallPythonEnv());
API.LogException(ClassName, "Failed to install Python environment", e);
}
});

View file

@ -46,7 +46,7 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
}
catch (System.Exception e)
{
API.ShowMsgError(API.GetTranslation("failToInstallTypeScriptEnv"));
API.ShowMsgError(Localize.failToInstallTypeScriptEnv());
API.LogException(ClassName, "Failed to install TypeScript environment", e);
}
});

View file

@ -46,7 +46,7 @@ namespace Flow.Launcher.Core.ExternalPlugins.Environments
}
catch (System.Exception e)
{
API.ShowMsgError(API.GetTranslation("failToInstallTypeScriptEnv"));
API.ShowMsgError(Localize.failToInstallTypeScriptEnv());
API.LogException(ClassName, "Failed to install TypeScript environment", e);
}
});

View file

@ -2,9 +2,8 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Plugin;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Core.Plugin;
namespace Flow.Launcher.Core.ExternalPlugins
{
@ -23,17 +22,15 @@ namespace Flow.Launcher.Core.ExternalPlugins
private static DateTime lastFetchedAt = DateTime.MinValue;
private static readonly TimeSpan fetchTimeout = TimeSpan.FromMinutes(2);
// We should not initialize API in static constructor because it will create another API instance
private static IPublicAPI api = null;
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
public static List<UserPlugin> UserPlugins { get; private set; }
public static async Task<bool> UpdateManifestAsync(bool usePrimaryUrlOnly = false, CancellationToken token = default)
{
bool lockAcquired = false;
try
{
await manifestUpdateLock.WaitAsync(token).ConfigureAwait(false);
lockAcquired = true;
if (UserPlugins == null || usePrimaryUrlOnly || DateTime.Now.Subtract(lastFetchedAt) >= fetchTimeout)
{
@ -44,11 +41,10 @@ namespace Flow.Launcher.Core.ExternalPlugins
return false;
var updatedPluginResults = new List<UserPlugin>();
var appVersion = SemanticVersioning.Version.Parse(Constant.Version);
for (int i = 0; i < results.Count; i++)
{
if (IsMinimumAppVersionSatisfied(results[i], appVersion))
if (PluginManager.IsMinimumAppVersionSatisfied(results[i].Name, results[i].MinimumAppVersion))
updatedPluginResults.Add(results[i]);
}
@ -59,39 +55,21 @@ namespace Flow.Launcher.Core.ExternalPlugins
return true;
}
}
catch (OperationCanceledException)
{
// Ignored
}
catch (Exception e)
{
API.LogException(ClassName, "Http request failed", e);
PublicApi.Instance.LogException(ClassName, "Http request failed", e);
}
finally
{
manifestUpdateLock.Release();
// Only release the lock if it was acquired
if (lockAcquired) manifestUpdateLock.Release();
}
return false;
}
private static bool IsMinimumAppVersionSatisfied(UserPlugin plugin, SemanticVersioning.Version appVersion)
{
if (string.IsNullOrEmpty(plugin.MinimumAppVersion))
return true;
try
{
if (appVersion >= SemanticVersioning.Version.Parse(plugin.MinimumAppVersion))
return true;
}
catch (Exception e)
{
API.LogException(ClassName, $"Failed to parse the minimum app version {plugin.MinimumAppVersion} for plugin {plugin.Name}. "
+ "Plugin excluded from manifest", e);
return false;
}
API.LogInfo(ClassName, $"Plugin {plugin.Name} requires minimum Flow Launcher version {plugin.MinimumAppVersion}, "
+ $"but current version is {Constant.Version}. Plugin excluded from manifest.");
return false;
}
}
}

View file

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0-windows</TargetFramework>
@ -34,6 +34,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<NoWarn>$(NoWarn);FLSG0007</NoWarn>
</PropertyGroup>
<ItemGroup>
@ -55,13 +56,26 @@
<ItemGroup>
<PackageReference Include="Droplex" Version="1.7.0" />
<PackageReference Include="FSharp.Core" Version="9.0.300" />
<PackageReference Include="Meziantou.Framework.Win32.Jobs" Version="3.4.3" />
<PackageReference Include="Flow.Launcher.Localization" Version="0.0.6" />
<PackageReference Include="FSharp.Core" Version="9.0.303" />
<PackageReference Include="Meziantou.Framework.Win32.Jobs" Version="3.4.5" />
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
<PackageReference Include="SemanticVersioning" Version="3.0.0" />
<PackageReference Include="squirrel.windows" Version="1.5.2" NoWarn="NU1701" />
<!-- Do not upgrade this to higher version since higher version removes UpdateManager instance -->
<PackageReference Include="squirrel.windows" Version="1.9.0" NoWarn="NU1701" />
<PackageReference Include="StreamJsonRpc" Version="2.22.11" />
</ItemGroup>
<PropertyGroup>
<FLLUseDependencyInjection>true</FLLUseDependencyInjection>
</PropertyGroup>
<ItemGroup>
<AdditionalFiles Remove="Languages\en.xaml" />
<AdditionalFiles Include="..\Flow.Launcher\Languages\en.xaml">
<Link>Languages\en.xaml</Link>
</AdditionalFiles>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Flow.Launcher.Infrastructure\Flow.Launcher.Infrastructure.csproj" />

View file

@ -0,0 +1,12 @@
using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Plugin;
public interface IResultUpdateRegister
{
/// <summary>
/// Register a plugin to receive results updated event.
/// </summary>
/// <param name="pair"></param>
void RegisterResultsUpdatedEvent(PluginPair pair);
}

View file

@ -27,6 +27,7 @@ namespace Flow.Launcher.Core.Plugin
private JsonStorage<ConcurrentDictionary<string, object?>> _storage = null!;
private static readonly double MainGridColumn0MaxWidthRatio = 0.6;
private static readonly Thickness SettingPanelMargin = (Thickness)Application.Current.FindResource("SettingPanelMargin");
private static readonly Thickness SettingPanelItemLeftMargin = (Thickness)Application.Current.FindResource("SettingPanelItemLeftMargin");
private static readonly Thickness SettingPanelItemTopBottomMargin = (Thickness)Application.Current.FindResource("SettingPanelItemTopBottomMargin");
@ -156,7 +157,7 @@ namespace Flow.Launcher.Core.Plugin
{
if (!NeedCreateSettingPanel()) return null!;
// Create main grid with two columns (Column 1: Auto, Column 2: *)
// Create main grid with two columns (Column 0: Auto, Column 1: *)
var mainPanel = new Grid { Margin = SettingPanelMargin, VerticalAlignment = VerticalAlignment.Center };
mainPanel.ColumnDefinitions.Add(new ColumnDefinition()
{
@ -200,7 +201,7 @@ namespace Flow.Launcher.Core.Plugin
{
Text = attributes.Label,
VerticalAlignment = VerticalAlignment.Center,
TextWrapping = TextWrapping.WrapWithOverflow
TextWrapping = TextWrapping.Wrap
};
// Create a text block for description
@ -211,7 +212,7 @@ namespace Flow.Launcher.Core.Plugin
{
Text = attributes.Description,
VerticalAlignment = VerticalAlignment.Center,
TextWrapping = TextWrapping.WrapWithOverflow
TextWrapping = TextWrapping.Wrap
};
desc.SetResourceReference(TextBlock.StyleProperty, "SettingPanelTextBlockDescriptionStyle"); // for theme change
@ -247,7 +248,8 @@ namespace Flow.Launcher.Core.Plugin
VerticalAlignment = VerticalAlignment.Center,
Margin = SettingPanelItemLeftTopBottomMargin,
Text = Settings[attributes.Name] as string ?? string.Empty,
ToolTip = attributes.Description
ToolTip = attributes.Description,
TextWrapping = TextWrapping.Wrap
};
textBox.TextChanged += (_, _) =>
@ -269,7 +271,8 @@ namespace Flow.Launcher.Core.Plugin
VerticalAlignment = VerticalAlignment.Center,
Margin = SettingPanelItemLeftMargin,
Text = Settings[attributes.Name] as string ?? string.Empty,
ToolTip = attributes.Description
ToolTip = attributes.Description,
TextWrapping = TextWrapping.Wrap
};
textBox.TextChanged += (_, _) =>
@ -282,7 +285,7 @@ namespace Flow.Launcher.Core.Plugin
HorizontalAlignment = HorizontalAlignment.Left,
VerticalAlignment = VerticalAlignment.Center,
Margin = SettingPanelItemLeftMargin,
Content = API.GetTranslation("select")
Content = Localize.select()
};
Btn.Click += (_, _) =>
@ -333,7 +336,7 @@ namespace Flow.Launcher.Core.Plugin
HorizontalAlignment = HorizontalAlignment.Stretch,
VerticalAlignment = VerticalAlignment.Center,
Margin = SettingPanelItemLeftTopBottomMargin,
TextWrapping = TextWrapping.WrapWithOverflow,
TextWrapping = TextWrapping.Wrap,
AcceptsReturn = true,
Text = Settings[attributes.Name] as string ?? string.Empty,
ToolTip = attributes.Description
@ -488,6 +491,8 @@ namespace Flow.Launcher.Core.Plugin
rowCount++;
}
mainPanel.SizeChanged += MainPanel_SizeChanged;
// Wrap the main grid in a user control
return new UserControl()
{
@ -495,6 +500,28 @@ namespace Flow.Launcher.Core.Plugin
};
}
private void MainPanel_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (sender is not Grid grid) return;
var workingWidth = grid.ActualWidth;
if (workingWidth <= 0) return;
var constrainedWidth = MainGridColumn0MaxWidthRatio * workingWidth;
// Set MaxWidth of column 0 and its children
// We must set MaxWidth of its children to make text wrapping work correctly
grid.ColumnDefinitions[0].MaxWidth = constrainedWidth;
foreach (var child in grid.Children)
{
if (child is FrameworkElement element && Grid.GetColumn(element) == 0 && Grid.GetColumnSpan(element) == 1)
{
element.MaxWidth = constrainedWidth;
}
}
}
private static bool NeedSaveInSettings(string type)
{
return type != "textBlock" && type != "separator" && type != "hyperlink";

View file

@ -100,11 +100,11 @@ namespace Flow.Launcher.Core.Plugin
RPC = new JsonRpc(handler, new JsonRPCPublicAPI(Context.API));
RPC.AddLocalRpcMethod("UpdateResults", new Action<string, JsonRPCQueryResponseModel>((rawQuery, response) =>
RPC.AddLocalRpcMethod("UpdateResults", new Action<string, JsonRPCQueryResponseModel>((trimmedQuery, response) =>
{
var results = ParseResults(response);
ResultsUpdated?.Invoke(this,
new ResultUpdatedEventArgs { Query = new Query() { RawQuery = rawQuery }, Results = results });
new ResultUpdatedEventArgs { Query = new Query() { TrimmedQuery = trimmedQuery }, Results = results });
}));
RPC.SynchronizationContext = null;
RPC.StartListening();

View file

@ -5,7 +5,8 @@ using System.IO;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Plugin;
using System.Text.Json;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin.SharedCommands;
namespace Flow.Launcher.Core.Plugin
{
@ -13,10 +14,6 @@ namespace Flow.Launcher.Core.Plugin
{
private static readonly string ClassName = nameof(PluginConfig);
// We should not initialize API in static constructor because it will create another API instance
private static IPublicAPI api = null;
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
/// <summary>
/// Parse plugin metadata in the given directories
/// </summary>
@ -30,15 +27,26 @@ namespace Flow.Launcher.Core.Plugin
// todo use linq when diable plugin is implmented since parallel.foreach + list is not thread saft
foreach (var directory in directories)
{
if (File.Exists(Path.Combine(directory, "NeedDelete.txt")))
if (File.Exists(Path.Combine(directory, DataLocation.PluginDeleteFile)))
{
try
{
Directory.Delete(directory, true);
var fullyDeleted = FilesFolders.TryDeleteDirectoryRobust(directory, maxRetries: 3, retryDelayMs: 200);
if (!fullyDeleted)
{
PublicApi.Instance.LogWarn(ClassName, $"Directory <{directory}> was not fully deleted.");
// Directory was not fully deleted, recreate the marker file so deletion will be retried on next startup
var markerFilePath = Path.Combine(directory, DataLocation.PluginDeleteFile);
if (!File.Exists(markerFilePath))
{
File.WriteAllText(markerFilePath, string.Empty);
}
}
}
catch (Exception e)
{
API.LogException(ClassName, $"Can't delete <{directory}>", e);
PublicApi.Instance.LogException(ClassName, $"Can't delete <{directory}>", e);
}
}
else
@ -55,7 +63,7 @@ namespace Flow.Launcher.Core.Plugin
duplicateList
.ForEach(
x => API.LogWarn(ClassName,
x => PublicApi.Instance.LogWarn(ClassName,
string.Format("Duplicate plugin name: {0}, id: {1}, version: {2} " +
"not loaded due to version not the highest of the duplicates",
x.Name, x.ID, x.Version),
@ -107,7 +115,7 @@ namespace Flow.Launcher.Core.Plugin
string configPath = Path.Combine(pluginDirectory, Constant.PluginMetadataFileName);
if (!File.Exists(configPath))
{
API.LogError(ClassName, $"Didn't find config file <{configPath}>");
PublicApi.Instance.LogError(ClassName, $"Didn't find config file <{configPath}>");
return null;
}
@ -123,19 +131,19 @@ namespace Flow.Launcher.Core.Plugin
}
catch (Exception e)
{
API.LogException(ClassName, $"Invalid json for config <{configPath}>", e);
PublicApi.Instance.LogException(ClassName, $"Invalid json for config <{configPath}>", e);
return null;
}
if (!AllowedLanguage.IsAllowed(metadata.Language))
{
API.LogError(ClassName, $"Invalid language <{metadata.Language}> for config <{configPath}>");
PublicApi.Instance.LogError(ClassName, $"Invalid language <{metadata.Language}> for config <{configPath}>");
return null;
}
if (!File.Exists(metadata.ExecuteFilePath))
{
API.LogError(ClassName, $"Execute file path didn't exist <{metadata.ExecuteFilePath}> for conifg <{configPath}");
PublicApi.Instance.LogError(ClassName, $"Execute file path didn't exist <{metadata.ExecuteFilePath}> for conifg <{configPath}");
return null;
}

View file

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
@ -22,10 +22,6 @@ public static class PluginInstaller
private static readonly Settings Settings = Ioc.Default.GetRequiredService<Settings>();
// We should not initialize API in static constructor because it will create another API instance
private static IPublicAPI api = null;
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
/// <summary>
/// Installs a plugin and restarts the application if required by settings. Prompts user for confirmation and handles download if needed.
/// </summary>
@ -33,18 +29,16 @@ public static class PluginInstaller
/// <returns>A Task representing the asynchronous install operation.</returns>
public static async Task InstallPluginAndCheckRestartAsync(UserPlugin newPlugin)
{
if (API.PluginModified(newPlugin.ID))
if (PublicApi.Instance.PluginModified(newPlugin.ID))
{
API.ShowMsgError(string.Format(API.GetTranslation("pluginModifiedAlreadyTitle"), newPlugin.Name),
API.GetTranslation("pluginModifiedAlreadyMessage"));
PublicApi.Instance.ShowMsgError(Localize.pluginModifiedAlreadyTitle(newPlugin.Name),
Localize.pluginModifiedAlreadyMessage());
return;
}
if (API.ShowMsgBox(
string.Format(
API.GetTranslation("InstallPromptSubtitle"),
newPlugin.Name, newPlugin.Author, Environment.NewLine),
API.GetTranslation("InstallPromptTitle"),
if (PublicApi.Instance.ShowMsgBox(
Localize.InstallPromptSubtitle(newPlugin.Name, newPlugin.Author, Environment.NewLine),
Localize.InstallPromptTitle(),
button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
try
@ -61,7 +55,7 @@ public static class PluginInstaller
if (!newPlugin.IsFromLocalInstallPath)
{
await DownloadFileAsync(
$"{API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
$"{Localize.DownloadingPlugin()} {newPlugin.Name}",
newPlugin.UrlDownload, filePath, cts);
}
else
@ -80,7 +74,7 @@ public static class PluginInstaller
throw new FileNotFoundException($"Plugin {newPlugin.ID} zip file not found at {filePath}", filePath);
}
if (!API.InstallPlugin(newPlugin, filePath))
if (!PublicApi.Instance.InstallPlugin(newPlugin, filePath))
{
return;
}
@ -92,23 +86,20 @@ public static class PluginInstaller
}
catch (Exception e)
{
API.LogException(ClassName, "Failed to install plugin", e);
API.ShowMsgError(API.GetTranslation("ErrorInstallingPlugin"));
PublicApi.Instance.LogException(ClassName, "Failed to install plugin", e);
PublicApi.Instance.ShowMsgError(Localize.ErrorInstallingPlugin());
return; // do not restart on failure
}
if (Settings.AutoRestartAfterChanging)
{
API.RestartApp();
PublicApi.Instance.RestartApp();
}
else
{
API.ShowMsg(
API.GetTranslation("installbtn"),
string.Format(
API.GetTranslation(
"InstallSuccessNoRestart"),
newPlugin.Name));
PublicApi.Instance.ShowMsg(
Localize.installbtn(),
Localize.InstallSuccessNoRestart(newPlugin.Name));
}
}
@ -133,24 +124,23 @@ public static class PluginInstaller
}
catch (Exception e)
{
API.LogException(ClassName, "Failed to validate zip file", e);
API.ShowMsgError(API.GetTranslation("ZipFileNotHavePluginJson"));
PublicApi.Instance.LogException(ClassName, "Failed to validate zip file", e);
PublicApi.Instance.ShowMsgError(Localize.ZipFileNotHavePluginJson());
return;
}
if (API.PluginModified(plugin.ID))
if (PublicApi.Instance.PluginModified(plugin.ID))
{
API.ShowMsgError(string.Format(API.GetTranslation("pluginModifiedAlreadyTitle"), plugin.Name),
API.GetTranslation("pluginModifiedAlreadyMessage"));
PublicApi.Instance.ShowMsgError(Localize.pluginModifiedAlreadyTitle(plugin.Name),
Localize.pluginModifiedAlreadyMessage());
return;
}
if (Settings.ShowUnknownSourceWarning)
{
if (!InstallSourceKnown(plugin.Website)
&& API.ShowMsgBox(string.Format(
API.GetTranslation("InstallFromUnknownSourceSubtitle"), Environment.NewLine),
API.GetTranslation("InstallFromUnknownSourceTitle"),
&& PublicApi.Instance.ShowMsgBox(Localize.InstallFromUnknownSourceSubtitle(Environment.NewLine),
Localize.InstallFromUnknownSourceTitle(),
MessageBoxButton.YesNo) == MessageBoxResult.No)
return;
}
@ -165,51 +155,46 @@ public static class PluginInstaller
/// <returns>A Task representing the asynchronous uninstall operation.</returns>
public static async Task UninstallPluginAndCheckRestartAsync(PluginMetadata oldPlugin)
{
if (API.PluginModified(oldPlugin.ID))
if (PublicApi.Instance.PluginModified(oldPlugin.ID))
{
API.ShowMsgError(string.Format(API.GetTranslation("pluginModifiedAlreadyTitle"), oldPlugin.Name),
API.GetTranslation("pluginModifiedAlreadyMessage"));
PublicApi.Instance.ShowMsgError(Localize.pluginModifiedAlreadyTitle(oldPlugin.Name),
Localize.pluginModifiedAlreadyMessage());
return;
}
if (API.ShowMsgBox(
string.Format(
API.GetTranslation("UninstallPromptSubtitle"),
oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
API.GetTranslation("UninstallPromptTitle"),
if (PublicApi.Instance.ShowMsgBox(
Localize.UninstallPromptSubtitle(oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
Localize.UninstallPromptTitle(),
button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
var removePluginSettings = API.ShowMsgBox(
API.GetTranslation("KeepPluginSettingsSubtitle"),
API.GetTranslation("KeepPluginSettingsTitle"),
var removePluginSettings = PublicApi.Instance.ShowMsgBox(
Localize.KeepPluginSettingsSubtitle(),
Localize.KeepPluginSettingsTitle(),
button: MessageBoxButton.YesNo) == MessageBoxResult.No;
try
{
if (!await API.UninstallPluginAsync(oldPlugin, removePluginSettings))
if (!await PublicApi.Instance.UninstallPluginAsync(oldPlugin, removePluginSettings))
{
return;
}
}
catch (Exception e)
{
API.LogException(ClassName, "Failed to uninstall plugin", e);
API.ShowMsgError(API.GetTranslation("ErrorUninstallingPlugin"));
PublicApi.Instance.LogException(ClassName, "Failed to uninstall plugin", e);
PublicApi.Instance.ShowMsgError(Localize.ErrorUninstallingPlugin());
return; // don not restart on failure
}
if (Settings.AutoRestartAfterChanging)
{
API.RestartApp();
PublicApi.Instance.RestartApp();
}
else
{
API.ShowMsg(
API.GetTranslation("uninstallbtn"),
string.Format(
API.GetTranslation(
"UninstallSuccessNoRestart"),
oldPlugin.Name));
PublicApi.Instance.ShowMsg(
Localize.uninstallbtn(),
Localize.UninstallSuccessNoRestart(oldPlugin.Name));
}
}
@ -221,11 +206,9 @@ public static class PluginInstaller
/// <returns>A Task representing the asynchronous update operation.</returns>
public static async Task UpdatePluginAndCheckRestartAsync(UserPlugin newPlugin, PluginMetadata oldPlugin)
{
if (API.ShowMsgBox(
string.Format(
API.GetTranslation("UpdatePromptSubtitle"),
oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
API.GetTranslation("UpdatePromptTitle"),
if (PublicApi.Instance.ShowMsgBox(
Localize.UpdatePromptSubtitle(oldPlugin.Name, oldPlugin.Author, Environment.NewLine),
Localize.UpdatePromptTitle(),
button: MessageBoxButton.YesNo) != MessageBoxResult.Yes) return;
try
@ -237,7 +220,7 @@ public static class PluginInstaller
if (!newPlugin.IsFromLocalInstallPath)
{
await DownloadFileAsync(
$"{API.GetTranslation("DownloadingPlugin")} {newPlugin.Name}",
$"{Localize.DownloadingPlugin()} {newPlugin.Name}",
newPlugin.UrlDownload, filePath, cts);
}
else
@ -251,30 +234,27 @@ public static class PluginInstaller
return;
}
if (!await API.UpdatePluginAsync(oldPlugin, newPlugin, filePath))
if (!await PublicApi.Instance.UpdatePluginAsync(oldPlugin, newPlugin, filePath))
{
return;
}
}
catch (Exception e)
{
API.LogException(ClassName, "Failed to update plugin", e);
API.ShowMsgError(API.GetTranslation("ErrorUpdatingPlugin"));
PublicApi.Instance.LogException(ClassName, "Failed to update plugin", e);
PublicApi.Instance.ShowMsgError(Localize.ErrorUpdatingPlugin());
return; // do not restart on failure
}
if (Settings.AutoRestartAfterChanging)
{
API.RestartApp();
PublicApi.Instance.RestartApp();
}
else
{
API.ShowMsg(
API.GetTranslation("updatebtn"),
string.Format(
API.GetTranslation(
"UpdateSuccessNoRestart"),
newPlugin.Name));
PublicApi.Instance.ShowMsg(
Localize.updatebtn(),
Localize.UpdateSuccessNoRestart(newPlugin.Name));
}
}
@ -289,17 +269,17 @@ public static class PluginInstaller
public static async Task CheckForPluginUpdatesAsync(Action<List<PluginUpdateInfo>> updateAllPlugins, bool silentUpdate = true, bool usePrimaryUrlOnly = false, CancellationToken token = default)
{
// Update the plugin manifest
await API.UpdatePluginManifestAsync(usePrimaryUrlOnly, token);
await PublicApi.Instance.UpdatePluginManifestAsync(usePrimaryUrlOnly, token);
// Get all plugins that can be updated
var resultsForUpdate = (
from existingPlugin in API.GetAllPlugins()
join pluginUpdateSource in API.GetPluginManifest()
from existingPlugin in PublicApi.Instance.GetAllPlugins()
join pluginUpdateSource in PublicApi.Instance.GetPluginManifest()
on existingPlugin.Metadata.ID equals pluginUpdateSource.ID
where string.Compare(existingPlugin.Metadata.Version, pluginUpdateSource.Version,
StringComparison.InvariantCulture) <
0 // if current version precedes version of the plugin from update source (e.g. PluginsManifest)
&& !API.PluginModified(existingPlugin.Metadata.ID)
&& !PublicApi.Instance.PluginModified(existingPlugin.Metadata.ID)
select
new PluginUpdateInfo()
{
@ -314,25 +294,25 @@ public static class PluginInstaller
}).ToList();
// No updates
if (!resultsForUpdate.Any())
if (resultsForUpdate.Count == 0)
{
if (!silentUpdate)
{
API.ShowMsg(API.GetTranslation("updateNoResultTitle"), API.GetTranslation("updateNoResultSubtitle"));
PublicApi.Instance.ShowMsg(Localize.updateNoResultTitle(), Localize.updateNoResultSubtitle());
}
return;
}
// If all plugins are modified, just return
if (resultsForUpdate.All(x => API.PluginModified(x.ID)))
if (resultsForUpdate.All(x => PublicApi.Instance.PluginModified(x.ID)))
{
return;
}
// Show message box with button to update all plugins
API.ShowMsgWithButton(
API.GetTranslation("updateAllPluginsTitle"),
API.GetTranslation("updateAllPluginsButtonContent"),
PublicApi.Instance.ShowMsgWithButton(
Localize.updateAllPluginsTitle(),
Localize.updateAllPluginsButtonContent(),
() =>
{
updateAllPlugins(resultsForUpdate);
@ -357,7 +337,7 @@ public static class PluginInstaller
using var cts = new CancellationTokenSource();
await DownloadFileAsync(
$"{API.GetTranslation("DownloadingPlugin")} {plugin.PluginNewUserPlugin.Name}",
$"{Localize.DownloadingPlugin()} {plugin.PluginNewUserPlugin.Name}",
plugin.PluginNewUserPlugin.UrlDownload, downloadToFilePath, cts);
// check if user cancelled download before installing plugin
@ -366,7 +346,7 @@ public static class PluginInstaller
return;
}
if (!await API.UpdatePluginAsync(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, downloadToFilePath))
if (!await PublicApi.Instance.UpdatePluginAsync(plugin.PluginExistingMetadata, plugin.PluginNewUserPlugin, downloadToFilePath))
{
return;
}
@ -375,8 +355,8 @@ public static class PluginInstaller
}
catch (Exception e)
{
API.LogException(ClassName, "Failed to update plugin", e);
API.ShowMsgError(API.GetTranslation("ErrorUpdatingPlugin"));
PublicApi.Instance.LogException(ClassName, "Failed to update plugin", e);
PublicApi.Instance.ShowMsgError(Localize.ErrorUpdatingPlugin());
}
}));
@ -384,13 +364,13 @@ public static class PluginInstaller
if (restart)
{
API.RestartApp();
PublicApi.Instance.RestartApp();
}
else
{
API.ShowMsg(
API.GetTranslation("updatebtn"),
API.GetTranslation("PluginsUpdateSuccessNoRestart"));
PublicApi.Instance.ShowMsg(
Localize.updatebtn(),
Localize.PluginsUpdateSuccessNoRestart());
}
}
@ -412,7 +392,7 @@ public static class PluginInstaller
if (showProgress)
{
var exceptionHappened = false;
await API.ShowProgressBoxAsync(progressBoxTitle,
await PublicApi.Instance.ShowProgressBoxAsync(progressBoxTitle,
async (reportProgress) =>
{
if (reportProgress == null)
@ -424,18 +404,18 @@ public static class PluginInstaller
}
else
{
await API.HttpDownloadAsync(downloadUrl, filePath, reportProgress, cts.Token).ConfigureAwait(false);
await PublicApi.Instance.HttpDownloadAsync(downloadUrl, filePath, reportProgress, cts.Token).ConfigureAwait(false);
}
}, cts.Cancel);
// if exception happened while downloading and user does not cancel downloading,
// we need to redownload the plugin
if (exceptionHappened && (!cts.IsCancellationRequested))
await API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
await PublicApi.Instance.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
}
else
{
await API.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
await PublicApi.Instance.HttpDownloadAsync(downloadUrl, filePath, token: cts.Token).ConfigureAwait(false);
}
}
@ -462,7 +442,7 @@ public static class PluginInstaller
if (!Uri.TryCreate(url, UriKind.Absolute, out var uri) || uri.Host != acceptedHost)
return false;
return API.GetAllPlugins().Any(x =>
return PublicApi.Instance.GetAllPlugins().Any(x =>
!string.IsNullOrEmpty(x.Metadata.Website) &&
x.Metadata.Website.StartsWith(constructedUrlPart)
);

File diff suppressed because it is too large Load diff

View file

@ -2,9 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Core.ExternalPlugins.Environments;
#pragma warning disable IDE0005
using Flow.Launcher.Infrastructure.Logger;
@ -18,10 +15,6 @@ namespace Flow.Launcher.Core.Plugin
{
private static readonly string ClassName = nameof(PluginsLoader);
// We should not initialize API in static constructor because it will create another API instance
private static IPublicAPI api = null;
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
public static List<PluginPair> Plugins(List<PluginMetadata> metadatas, PluginsSettings settings)
{
var dotnetPlugins = DotNetPlugins(metadatas);
@ -55,7 +48,7 @@ namespace Flow.Launcher.Core.Plugin
return plugins;
}
private static IEnumerable<PluginPair> DotNetPlugins(List<PluginMetadata> source)
private static List<PluginPair> DotNetPlugins(List<PluginMetadata> source)
{
var erroredPlugins = new List<string>();
@ -64,56 +57,58 @@ namespace Flow.Launcher.Core.Plugin
foreach (var metadata in metadatas)
{
var milliseconds = API.StopwatchLogDebug(ClassName, $"Constructor init cost for {metadata.Name}", () =>
var milliseconds = PublicApi.Instance.StopwatchLogDebug(ClassName, $"Constructor init cost for {metadata.Name}", () =>
{
Assembly assembly = null;
IAsyncPlugin plugin = null;
try
{
Assembly assembly = null;
IAsyncPlugin plugin = null;
var assemblyLoader = new PluginAssemblyLoader(metadata.ExecuteFilePath);
assembly = assemblyLoader.LoadAssemblyAndDependencies();
try
{
var assemblyLoader = new PluginAssemblyLoader(metadata.ExecuteFilePath);
assembly = assemblyLoader.LoadAssemblyAndDependencies();
var type = assemblyLoader.FromAssemblyGetTypeOfInterface(assembly,
typeof(IAsyncPlugin));
var type = assemblyLoader.FromAssemblyGetTypeOfInterface(assembly,
typeof(IAsyncPlugin));
plugin = Activator.CreateInstance(type) as IAsyncPlugin;
plugin = Activator.CreateInstance(type) as IAsyncPlugin;
metadata.AssemblyName = assembly.GetName().Name;
}
metadata.AssemblyName = assembly.GetName().Name;
}
#if DEBUG
catch (Exception)
{
throw;
}
catch (Exception)
{
throw;
}
#else
catch (Exception e) when (assembly == null)
{
Log.Exception(ClassName, $"Couldn't load assembly for the plugin: {metadata.Name}", e);
}
catch (InvalidOperationException e)
{
Log.Exception(ClassName, $"Can't find the required IPlugin interface for the plugin: <{metadata.Name}>", e);
}
catch (ReflectionTypeLoadException e)
{
Log.Exception(ClassName, $"The GetTypes method was unable to load assembly types for the plugin: <{metadata.Name}>", e);
}
catch (Exception e)
{
Log.Exception(ClassName, $"The following plugin has errored and can not be loaded: <{metadata.Name}>", e);
}
catch (Exception e) when (assembly == null)
{
PublicApi.Instance.LogException(ClassName, $"Couldn't load assembly for the plugin: {metadata.Name}", e);
}
catch (InvalidOperationException e)
{
PublicApi.Instance.LogException(ClassName, $"Can't find the required IPlugin interface for the plugin: <{metadata.Name}>", e);
}
catch (ReflectionTypeLoadException e)
{
PublicApi.Instance.LogException(ClassName, $"The GetTypes method was unable to load assembly types for the plugin: <{metadata.Name}>", e);
}
catch (Exception e)
{
PublicApi.Instance.LogException(ClassName, $"The following plugin has errored and can not be loaded: <{metadata.Name}>", e);
}
#endif
if (plugin == null)
{
erroredPlugins.Add(metadata.Name);
return;
}
if (plugin == null)
{
erroredPlugins.Add(metadata.Name);
return;
}
plugins.Add(new PluginPair { Plugin = plugin, Metadata = metadata });
});
plugins.Add(new PluginPair { Plugin = plugin, Metadata = metadata });
});
metadata.InitTime += milliseconds;
PublicApi.Instance.LogDebug(ClassName, $"Constructor cost for <{metadata.Name}> is <{metadata.InitTime}ms>");
}
if (erroredPlugins.Count > 0)
@ -121,12 +116,12 @@ namespace Flow.Launcher.Core.Plugin
var errorPluginString = string.Join(Environment.NewLine, erroredPlugins);
var errorMessage = erroredPlugins.Count > 1 ?
API.GetTranslation("pluginsHaveErrored") :
API.GetTranslation("pluginHasErrored");
Localize.pluginsHaveErrored():
Localize.pluginHasErrored();
API.ShowMsgError($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" +
PublicApi.Instance.ShowMsgError($"{errorMessage}{Environment.NewLine}{Environment.NewLine}" +
$"{errorPluginString}{Environment.NewLine}{Environment.NewLine}" +
API.GetTranslation("referToLogs"));
Localize.referToLogs());
}
return plugins;

View file

@ -6,15 +6,16 @@ namespace Flow.Launcher.Core.Plugin
{
public static class QueryBuilder
{
public static Query Build(string text, Dictionary<string, PluginPair> nonGlobalPlugins)
public static Query Build(string originalQuery, string trimmedQuery, Dictionary<string, PluginPair> nonGlobalPlugins)
{
// home query
if (string.IsNullOrEmpty(text))
if (string.IsNullOrEmpty(trimmedQuery))
{
return new Query()
{
Search = string.Empty,
RawQuery = string.Empty,
OriginalQuery = string.Empty,
TrimmedQuery = string.Empty,
SearchTerms = Array.Empty<string>(),
ActionKeyword = string.Empty,
IsHomeQuery = true
@ -22,14 +23,13 @@ namespace Flow.Launcher.Core.Plugin
}
// replace multiple white spaces with one white space
var terms = text.Split(Query.TermSeparator, StringSplitOptions.RemoveEmptyEntries);
var terms = trimmedQuery.Split(Query.TermSeparator, StringSplitOptions.RemoveEmptyEntries);
if (terms.Length == 0)
{
// nothing was typed
return null;
}
var rawQuery = text;
string actionKeyword, search;
string possibleActionKeyword = terms[0];
string[] searchTerms;
@ -38,21 +38,22 @@ namespace Flow.Launcher.Core.Plugin
{
// use non global plugin for query
actionKeyword = possibleActionKeyword;
search = terms.Length > 1 ? rawQuery[(actionKeyword.Length + 1)..].TrimStart() : string.Empty;
search = terms.Length > 1 ? trimmedQuery[(actionKeyword.Length + 1)..].TrimStart() : string.Empty;
searchTerms = terms[1..];
}
else
{
// non action keyword
actionKeyword = string.Empty;
search = rawQuery.TrimStart();
search = trimmedQuery.TrimStart();
searchTerms = terms;
}
return new Query()
{
Search = search,
RawQuery = rawQuery,
OriginalQuery = originalQuery,
TrimmedQuery = trimmedQuery,
SearchTerms = searchTerms,
ActionKeyword = actionKeyword,
IsHomeQuery = false

View file

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
@ -6,7 +6,6 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Infrastructure.UserSettings;
@ -14,14 +13,10 @@ using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Resource
{
public class Internationalization
public class Internationalization : IDisposable
{
private static readonly string ClassName = nameof(Internationalization);
// We should not initialize API in static constructor because it will create another API instance
private static IPublicAPI api = null;
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
private const string Folder = "Languages";
private const string DefaultLanguageCode = "en";
private const string DefaultFile = "en.xaml";
@ -30,6 +25,7 @@ namespace Flow.Launcher.Core.Resource
private readonly List<string> _languageDirectories = [];
private readonly List<ResourceDictionary> _oldResources = [];
private static string SystemLanguageCode;
private readonly SemaphoreSlim _langChangeLock = new(1, 1);
public Internationalization(Settings settings)
{
@ -103,7 +99,7 @@ namespace Flow.Launcher.Core.Resource
var directory = Path.Combine(Constant.ProgramDirectory, Folder);
if (!Directory.Exists(directory))
{
API.LogError(ClassName, $"Flow Launcher language directory can't be found <{directory}>");
PublicApi.Instance.LogError(ClassName, $"Flow Launcher language directory can't be found <{directory}>");
return;
}
@ -174,7 +170,7 @@ namespace Flow.Launcher.Core.Resource
FirstOrDefault(o => o.LanguageCode.Equals(languageCode, StringComparison.OrdinalIgnoreCase));
if (language == null)
{
API.LogError(ClassName, $"Language code can't be found <{languageCode}>");
PublicApi.Instance.LogError(ClassName, $"Language code can't be found <{languageCode}>");
return AvailableLanguages.English;
}
else
@ -185,20 +181,33 @@ namespace Flow.Launcher.Core.Resource
private async Task ChangeLanguageAsync(Language language, bool updateMetadata = true)
{
// Remove old language files and load language
RemoveOldLanguageFiles();
if (language != AvailableLanguages.English)
await _langChangeLock.WaitAsync();
try
{
LoadLanguage(language);
// Remove old language files and load language
RemoveOldLanguageFiles();
if (language != AvailableLanguages.English)
{
LoadLanguage(language);
}
// Change culture info
ChangeCultureInfo(language.LanguageCode);
if (updateMetadata)
{
// Raise event for plugins after culture is set
await Task.Run(UpdatePluginMetadataTranslations);
}
}
// Change culture info
ChangeCultureInfo(language.LanguageCode);
if (updateMetadata)
catch (Exception e)
{
// Raise event for plugins after culture is set
await Task.Run(UpdatePluginMetadataTranslations);
PublicApi.Instance.LogException(ClassName, $"Failed to change language to <{language.LanguageCode}>", e);
}
finally
{
_langChangeLock.Release();
}
}
@ -240,7 +249,7 @@ namespace Flow.Launcher.Core.Resource
// "Do you want to search with pinyin?"
string text = languageToSet == AvailableLanguages.Chinese ? "是否启用拼音搜索?" : "是否啓用拼音搜索?";
if (API.ShowMsgBox(text, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
if (PublicApi.Instance.ShowMsgBox(text, string.Empty, MessageBoxButton.YesNo) == MessageBoxResult.No)
return false;
return true;
@ -257,6 +266,7 @@ namespace Flow.Launcher.Core.Resource
{
dicts.Remove(r);
}
_oldResources.Clear();
}
private void LoadLanguage(Language language)
@ -296,7 +306,7 @@ namespace Flow.Launcher.Core.Resource
}
else
{
API.LogError(ClassName, $"Language path can't be found <{path}>");
PublicApi.Instance.LogError(ClassName, $"Language path can't be found <{path}>");
var english = Path.Combine(folder, DefaultFile);
if (File.Exists(english))
{
@ -304,7 +314,7 @@ namespace Flow.Launcher.Core.Resource
}
else
{
API.LogError(ClassName, $"Default English Language path can't be found <{path}>");
PublicApi.Instance.LogError(ClassName, $"Default English Language path can't be found <{path}>");
return string.Empty;
}
}
@ -339,7 +349,7 @@ namespace Flow.Launcher.Core.Resource
}
else
{
API.LogError(ClassName, $"No Translation for key {key}");
PublicApi.Instance.LogError(ClassName, $"No Translation for key {key}");
return $"No Translation for key {key}";
}
}
@ -362,11 +372,37 @@ namespace Flow.Launcher.Core.Resource
}
catch (Exception e)
{
API.LogException(ClassName, $"Failed for <{p.Metadata.Name}>", e);
PublicApi.Instance.LogException(ClassName, $"Failed for <{p.Metadata.Name}>", e);
}
}
}
public static void UpdatePluginMetadataTranslation(PluginPair p)
{
// Update plugin metadata name & description
if (p.Plugin is not IPluginI18n pluginI18N) return;
try
{
p.Metadata.Name = pluginI18N.GetTranslatedPluginTitle();
p.Metadata.Description = pluginI18N.GetTranslatedPluginDescription();
pluginI18N.OnCultureInfoChanged(CultureInfo.CurrentCulture);
}
catch (Exception e)
{
PublicApi.Instance.LogException(ClassName, $"Failed for <{p.Metadata.Name}>", e);
}
}
#endregion
#region IDisposable
public void Dispose()
{
RemoveOldLanguageFiles();
_langChangeLock.Dispose();
}
#endregion
}
}

View file

@ -1,30 +0,0 @@
using System.ComponentModel;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Plugin;
namespace Flow.Launcher.Core.Resource
{
public class LocalizedDescriptionAttribute : DescriptionAttribute
{
// We should not initialize API in static constructor because it will create another API instance
private static IPublicAPI api = null;
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
private readonly string _resourceKey;
public LocalizedDescriptionAttribute(string resourceKey)
{
_resourceKey = resourceKey;
}
public override string Description
{
get
{
string description = API.GetTranslation(_resourceKey);
return string.IsNullOrWhiteSpace(description) ?
string.Format("[[{0}]]", _resourceKey) : description;
}
}
}
}

View file

@ -124,8 +124,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);
@ -292,10 +292,10 @@ namespace Flow.Launcher.Core.Resource
dict["ItemHotkeyStyle"] is Style resultHotkeyItemStyle &&
dict["ItemHotkeySelectedStyle"] is Style resultHotkeyItemSelectedStyle)
{
Setter fontFamily = new Setter(TextBlock.FontFamilyProperty, new FontFamily(_settings.ResultFont));
Setter fontStyle = new Setter(TextBlock.FontStyleProperty, FontHelper.GetFontStyleFromInvariantStringOrNormal(_settings.ResultFontStyle));
Setter fontWeight = new Setter(TextBlock.FontWeightProperty, FontHelper.GetFontWeightFromInvariantStringOrNormal(_settings.ResultFontWeight));
Setter fontStretch = new Setter(TextBlock.FontStretchProperty, FontHelper.GetFontStretchFromInvariantStringOrNormal(_settings.ResultFontStretch));
var fontFamily = new Setter(TextBlock.FontFamilyProperty, new FontFamily(_settings.ResultFont));
var fontStyle = new Setter(TextBlock.FontStyleProperty, FontHelper.GetFontStyleFromInvariantStringOrNormal(_settings.ResultFontStyle));
var fontWeight = new Setter(TextBlock.FontWeightProperty, FontHelper.GetFontWeightFromInvariantStringOrNormal(_settings.ResultFontWeight));
var fontStretch = new Setter(TextBlock.FontStretchProperty, FontHelper.GetFontStretchFromInvariantStringOrNormal(_settings.ResultFontStretch));
Setter[] setters = { fontFamily, fontStyle, fontWeight, fontStretch };
Array.ForEach(
@ -307,10 +307,10 @@ namespace Flow.Launcher.Core.Resource
dict["ItemSubTitleStyle"] is Style resultSubItemStyle &&
dict["ItemSubTitleSelectedStyle"] is Style resultSubItemSelectedStyle)
{
Setter fontFamily = new Setter(TextBlock.FontFamilyProperty, new FontFamily(_settings.ResultSubFont));
Setter fontStyle = new Setter(TextBlock.FontStyleProperty, FontHelper.GetFontStyleFromInvariantStringOrNormal(_settings.ResultSubFontStyle));
Setter fontWeight = new Setter(TextBlock.FontWeightProperty, FontHelper.GetFontWeightFromInvariantStringOrNormal(_settings.ResultSubFontWeight));
Setter fontStretch = new Setter(TextBlock.FontStretchProperty, FontHelper.GetFontStretchFromInvariantStringOrNormal(_settings.ResultSubFontStretch));
var fontFamily = new Setter(TextBlock.FontFamilyProperty, new FontFamily(_settings.ResultSubFont));
var fontStyle = new Setter(TextBlock.FontStyleProperty, FontHelper.GetFontStyleFromInvariantStringOrNormal(_settings.ResultSubFontStyle));
var fontWeight = new Setter(TextBlock.FontWeightProperty, FontHelper.GetFontWeightFromInvariantStringOrNormal(_settings.ResultSubFontWeight));
var fontStretch = new Setter(TextBlock.FontStretchProperty, FontHelper.GetFontStretchFromInvariantStringOrNormal(_settings.ResultSubFontStretch));
Setter[] setters = { fontFamily, fontStyle, fontWeight, fontStretch };
Array.ForEach(
@ -395,7 +395,7 @@ namespace Flow.Launcher.Core.Resource
public List<ThemeData> GetAvailableThemes()
{
List<ThemeData> themes = new List<ThemeData>();
var themes = new List<ThemeData>();
foreach (var themeDirectory in _themeDirectories)
{
var filePaths = Directory
@ -410,8 +410,7 @@ namespace Flow.Launcher.Core.Resource
public bool ChangeTheme(string theme = null)
{
if (string.IsNullOrEmpty(theme))
theme = _settings.Theme;
if (string.IsNullOrEmpty(theme)) theme = _settings.Theme;
string path = GetThemePath(theme);
try
@ -426,13 +425,14 @@ namespace Flow.Launcher.Core.Resource
_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
BlurEnabled = Win32Helper.IsBackdropSupported() && IsThemeBlurEnabled(resourceDict);
// Apply blur and drop shadow effect so that we do not need to call it again
_ = RefreshFrameAsync();
@ -444,17 +444,27 @@ namespace Flow.Launcher.Core.Resource
_api.LogError(ClassName, $"Theme <{theme}> path can't be found");
if (theme != Constant.DefaultTheme)
{
_api.ShowMsgBox(string.Format(_api.GetTranslation("theme_load_failure_path_not_exists"), theme));
_api.ShowMsgBox(Localize.theme_load_failure_path_not_exists(theme));
ChangeTheme(Constant.DefaultTheme);
}
return false;
}
catch (XamlParseException)
catch (XamlParseException e)
{
_api.LogError(ClassName, $"Theme <{theme}> fail to parse");
_api.LogException(ClassName, $"Theme <{theme}> fail to parse xaml", e);
if (theme != Constant.DefaultTheme)
{
_api.ShowMsgBox(string.Format(_api.GetTranslation("theme_load_failure_parse_error"), theme));
_api.ShowMsgBox(Localize.theme_load_failure_parse_error(theme));
ChangeTheme(Constant.DefaultTheme);
}
return false;
}
catch (Exception e)
{
_api.LogException(ClassName, $"Theme <{theme}> fail to load", e);
if (theme != Constant.DefaultTheme)
{
_api.ShowMsgBox(Localize.theme_load_failure_parse_error(theme));
ChangeTheme(Constant.DefaultTheme);
}
return false;
@ -657,21 +667,21 @@ 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)
if (backdropType is BackdropTypes.Mica or 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))));
windowBorderStyle.Setters.Remove(windowBorderStyle.Setters.OfType<Setter>().FirstOrDefault(x => x.Property == Control.BackgroundProperty));
windowBorderStyle.Setters.Add(new Setter(Border.BackgroundProperty, ThemeHelper.GetFrozenSolidColorBrush(Color.FromArgb(1, 0, 0, 0))));
}
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)));
windowBorderStyle.Setters.Remove(windowBorderStyle.Setters.OfType<Setter>().FirstOrDefault(x => x.Property == Control.BackgroundProperty));
windowBorderStyle.Setters.Add(new Setter(Border.BackgroundProperty, Brushes.Transparent));
}
// 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);
@ -679,7 +689,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);
@ -788,12 +798,12 @@ namespace Flow.Launcher.Core.Resource
Application.Current.Resources["WindowBorderStyle"] is Style originalStyle)
{
// Copy the original style, including the base style if it exists
CopyStyle(originalStyle, previewStyle);
ThemeHelper.CopyStyle(originalStyle, previewStyle);
}
// 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 backgroundColor = Color.FromRgb(bgColor.Value.R, bgColor.Value.G, bgColor.Value.B);
previewStyle.Setters.Add(new Setter(Border.BackgroundProperty, ThemeHelper.GetFrozenSolidColorBrush(backgroundColor)));
// 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.
@ -807,21 +817,6 @@ namespace Flow.Launcher.Core.Resource
Application.Current.Resources["PreviewWindowBorderStyle"] = previewStyle;
}
private void CopyStyle(Style originalStyle, Style targetStyle)
{
// If the style is based on another style, copy the base style first
if (originalStyle.BasedOn != null)
{
CopyStyle(originalStyle.BasedOn, targetStyle);
}
// Copy the setters from the original style
foreach (var setter in originalStyle.Setters.OfType<Setter>())
{
targetStyle.Setters.Add(new Setter(setter.Property, setter.Value));
}
}
private void ColorizeWindow(string theme, BackdropTypes backdropType)
{
var dict = GetThemeResourceDictionary(theme);
@ -831,20 +826,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")
@ -859,11 +850,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
@ -905,25 +905,20 @@ namespace Flow.Launcher.Core.Resource
else
{
// Only set the background to transparent if the theme supports blur
if (backdropType == BackdropTypes.Mica || backdropType == BackdropTypes.MicaAlt)
if (backdropType is BackdropTypes.Mica or BackdropTypes.MicaAlt)
{
mainWindow.Background = new SolidColorBrush(Color.FromArgb(1, 0, 0, 0));
mainWindow.Background = ThemeHelper.GetFrozenSolidColorBrush(Color.FromArgb(1, 0, 0, 0));
}
else
{
mainWindow.Background = new SolidColorBrush(selectedBG);
mainWindow.Background = ThemeHelper.GetFrozenSolidColorBrush(selectedBG);
}
}
}
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

@ -0,0 +1,30 @@
using System.Linq;
using System.Windows;
using System.Windows.Media;
namespace Flow.Launcher.Core.Resource;
public static class ThemeHelper
{
public static void CopyStyle(Style originalStyle, Style targetStyle)
{
// If the style is based on another style, copy the base style first
if (originalStyle.BasedOn != null)
{
CopyStyle(originalStyle.BasedOn, targetStyle);
}
// Copy the setters from the original style
foreach (var setter in originalStyle.Setters.OfType<Setter>())
{
targetStyle.Setters.Add(new Setter(setter.Property, setter.Value));
}
}
public static SolidColorBrush GetFrozenSolidColorBrush(Color color)
{
var brush = new SolidColorBrush(color);
brush.Freeze();
return brush;
}
}

View file

@ -41,8 +41,8 @@ namespace Flow.Launcher.Core
try
{
if (!silentUpdate)
_api.ShowMsg(_api.GetTranslation("pleaseWait"),
_api.GetTranslation("update_flowlauncher_update_check"));
_api.ShowMsg(Localize.pleaseWait(),
Localize.update_flowlauncher_update_check());
using var updateManager = await GitHubUpdateManagerAsync(GitHubRepository).ConfigureAwait(false);
@ -58,13 +58,13 @@ namespace Flow.Launcher.Core
if (newReleaseVersion <= currentVersion)
{
if (!silentUpdate)
_api.ShowMsgBox(_api.GetTranslation("update_flowlauncher_already_on_latest"));
_api.ShowMsgBox(Localize.update_flowlauncher_already_on_latest());
return;
}
if (!silentUpdate)
_api.ShowMsg(_api.GetTranslation("update_flowlauncher_update_found"),
_api.GetTranslation("update_flowlauncher_updating"));
_api.ShowMsg(Localize.update_flowlauncher_update_found(),
Localize.update_flowlauncher_updating());
await updateManager.DownloadReleases(newUpdateInfo.ReleasesToApply).ConfigureAwait(false);
@ -77,10 +77,7 @@ namespace Flow.Launcher.Core
FilesFolders.CopyAll(DataLocation.PortableDataPath, targetDestination, (s) => _api.ShowMsgBox(s));
if (!FilesFolders.VerifyBothFolderFilesEqual(DataLocation.PortableDataPath, targetDestination,
(s) => _api.ShowMsgBox(s)))
_api.ShowMsgBox(string.Format(
_api.GetTranslation("update_flowlauncher_fail_moving_portable_user_profile_data"),
DataLocation.PortableDataPath,
targetDestination));
_api.ShowMsgBox(Localize.update_flowlauncher_fail_moving_portable_user_profile_data(DataLocation.PortableDataPath, targetDestination));
}
else
{
@ -91,7 +88,7 @@ namespace Flow.Launcher.Core
_api.LogInfo(ClassName, $"Update success:{newVersionTips}");
if (_api.ShowMsgBox(newVersionTips, _api.GetTranslation("update_flowlauncher_new_update"),
if (_api.ShowMsgBox(newVersionTips, Localize.update_flowlauncher_new_update(),
MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
UpdateManager.RestartApp(Constant.ApplicationFileName);
@ -111,8 +108,8 @@ namespace Flow.Launcher.Core
}
if (!silentUpdate)
_api.ShowMsgError(_api.GetTranslation("update_flowlauncher_fail"),
_api.GetTranslation("update_flowlauncher_check_connection"));
_api.ShowMsgError(Localize.update_flowlauncher_fail(),
Localize.update_flowlauncher_check_connection());
}
finally
{
@ -150,9 +147,9 @@ namespace Flow.Launcher.Core
return manager;
}
private string NewVersionTips(string version)
private static string NewVersionTips(string version)
{
var tips = string.Format(_api.GetTranslation("newVersionTips"), version);
var tips = Localize.newVersionTips(version);
return tips;
}

File diff suppressed because it is too large Load diff

View file

@ -13,6 +13,7 @@ using NHotkey;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.UI.Accessibility;
using System.Collections.Concurrent;
namespace Flow.Launcher.Infrastructure.DialogJump
{
@ -58,21 +59,17 @@ namespace Flow.Launcher.Infrastructure.DialogJump
private static readonly Settings _settings = Ioc.Default.GetRequiredService<Settings>();
// We should not initialize API in static constructor because it will create another API instance
private static IPublicAPI api = null;
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
private static HWND _mainWindowHandle = HWND.Null;
private static readonly Dictionary<DialogJumpExplorerPair, IDialogJumpExplorerWindow> _dialogJumpExplorers = new();
private static readonly ConcurrentDictionary<DialogJumpExplorerPair, IDialogJumpExplorerWindow> _dialogJumpExplorers = new();
private static DialogJumpExplorerPair _lastExplorer = null;
private static readonly object _lastExplorerLock = new();
private static readonly Lock _lastExplorerLock = new();
private static readonly Dictionary<DialogJumpDialogPair, IDialogJumpDialogWindow> _dialogJumpDialogs = new();
private static readonly ConcurrentDictionary<DialogJumpDialogPair, IDialogJumpDialogWindow> _dialogJumpDialogs = new();
private static IDialogJumpDialogWindow _dialogWindow = null;
private static readonly object _dialogWindowLock = new();
private static readonly Lock _dialogWindowLock = new();
private static HWINEVENTHOOK _foregroundChangeHook = HWINEVENTHOOK.Null;
private static HWINEVENTHOOK _locationChangeHook = HWINEVENTHOOK.Null;
@ -89,8 +86,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
private static DispatcherTimer _dragMoveTimer = null;
// A list of all file dialog windows that are auto switched already
private static readonly List<HWND> _autoSwitchedDialogs = new();
private static readonly object _autoSwitchedDialogsLock = new();
private static readonly List<HWND> _autoSwitchedDialogs = [];
private static readonly Lock _autoSwitchedDialogsLock = new();
private static HWINEVENTHOOK _moveSizeHook = HWINEVENTHOOK.Null;
private static readonly WINEVENTPROC _moveProc = MoveSizeCallBack;
@ -105,22 +102,13 @@ namespace Flow.Launcher.Infrastructure.DialogJump
#region Initialize & Setup
public static void InitializeDialogJump(IList<DialogJumpExplorerPair> dialogJumpExplorers,
IList<DialogJumpDialogPair> dialogJumpDialogs)
public static void InitializeDialogJump()
{
if (_initialized) return;
// Initialize Dialog Jump explorers & dialogs
_dialogJumpExplorers.Add(WindowsDialogJumpExplorer, null);
foreach (var explorer in dialogJumpExplorers)
{
_dialogJumpExplorers.Add(explorer, null);
}
_dialogJumpDialogs.Add(WindowsDialogJumpDialog, null);
foreach (var dialog in dialogJumpDialogs)
{
_dialogJumpDialogs.Add(dialog, null);
}
// Initialize preinstalled Dialog Jump explorers & dialogs
_dialogJumpExplorers.TryAdd(WindowsDialogJumpExplorer, null);
_dialogJumpDialogs.TryAdd(WindowsDialogJumpDialog, null);
// Initialize main window handle
_mainWindowHandle = Win32Helper.GetMainWindowHandle();
@ -135,6 +123,29 @@ namespace Flow.Launcher.Infrastructure.DialogJump
_initialized = true;
}
public static void InitializeDialogJumpPlugin(PluginPair pair)
{
// Add Dialog Jump explorers & dialogs
if (pair.Plugin is IDialogJumpExplorer explorer)
{
var dialogJumpExplorer = new DialogJumpExplorerPair
{
Plugin = explorer,
Metadata = pair.Metadata
};
_dialogJumpExplorers.TryAdd(dialogJumpExplorer, null);
}
if (pair.Plugin is IDialogJumpDialog dialog)
{
var dialogJumpDialog = new DialogJumpDialogPair
{
Plugin = dialog,
Metadata = pair.Metadata
};
_dialogJumpDialogs.TryAdd(dialogJumpDialog, null);
}
}
public static void SetupDialogJump(bool enabled)
{
if (enabled == _enabled) return;
@ -315,7 +326,7 @@ namespace Flow.Launcher.Infrastructure.DialogJump
{
foreach (var explorer in _dialogJumpExplorers.Keys)
{
if (API.PluginModified(explorer.Metadata.ID) || // Plugin is modified
if (PublicApi.Instance.PluginModified(explorer.Metadata.ID) || // Plugin is modified
explorer.Metadata.Disabled) continue; // Plugin is disabled
var explorerWindow = explorer.Plugin.CheckExplorerWindow(hWnd);
@ -485,6 +496,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
await _foregroundChangeLock.WaitAsync();
try
{
@ -493,7 +506,7 @@ namespace Flow.Launcher.Infrastructure.DialogJump
var dialogWindowChanged = false;
foreach (var dialog in _dialogJumpDialogs.Keys)
{
if (API.PluginModified(dialog.Metadata.ID) || // Plugin is modified
if (PublicApi.Instance.PluginModified(dialog.Metadata.ID) || // Plugin is modified
dialog.Metadata.Disabled) continue; // Plugin is disabled
IDialogJumpDialogWindow dialogWindow;
@ -596,7 +609,7 @@ namespace Flow.Launcher.Infrastructure.DialogJump
{
foreach (var explorer in _dialogJumpExplorers.Keys)
{
if (API.PluginModified(explorer.Metadata.ID) || // Plugin is modified
if (PublicApi.Instance.PluginModified(explorer.Metadata.ID) || // Plugin is modified
explorer.Metadata.Disabled) continue; // Plugin is disabled
var explorerWindow = explorer.Plugin.CheckExplorerWindow(hwnd);
@ -636,6 +649,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
// If the dialog window is moved, update the Dialog Jump window position
var dialogWindowExist = false;
lock (_dialogWindowLock)
@ -661,6 +676,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
// If the dialog window is moved or resized, update the Dialog Jump window position
if (_dragMoveTimer != null)
{
@ -686,6 +703,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
// If the dialog window is destroyed, set _dialogWindowHandle to null
var dialogWindowExist = false;
lock (_dialogWindowLock)
@ -717,6 +736,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
// If the dialog window is hidden, set _dialogWindowHandle to null
var dialogWindowExist = false;
lock (_dialogWindowLock)
@ -748,6 +769,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
uint dwmsEventTime
)
{
if (hwnd.IsNull) return;
// If the dialog window is ended, set _dialogWindowHandle to null
var dialogWindowExist = false;
lock (_dialogWindowLock)
@ -832,9 +855,25 @@ namespace Flow.Launcher.Infrastructure.DialogJump
return true;
}
// file: URI paths
var localPath = path.StartsWith("file:", StringComparison.OrdinalIgnoreCase)
? new Uri(path).LocalPath
: path;
string localPath;
if (path.StartsWith("file:", StringComparison.OrdinalIgnoreCase))
{
// Try to create a URI from the path
if (Uri.TryCreate(path, UriKind.Absolute, out var uri))
{
localPath = uri.LocalPath;
}
else
{
// If URI creation fails, treat it as a regular path
// by removing the "file:" prefix
localPath = path.Substring(5);
}
}
else
{
localPath = path;
}
// Is folder?
var isFolder = Directory.Exists(localPath);
// Is file?
@ -871,7 +910,7 @@ namespace Flow.Launcher.Infrastructure.DialogJump
// Then check all dialog windows
foreach (var dialog in _dialogJumpDialogs.Keys)
{
if (API.PluginModified(dialog.Metadata.ID) || // Plugin is modified
if (PublicApi.Instance.PluginModified(dialog.Metadata.ID) || // Plugin is modified
dialog.Metadata.Disabled) continue; // Plugin is disabled
var dialogWindow = _dialogJumpDialogs[dialog];
@ -884,7 +923,7 @@ namespace Flow.Launcher.Infrastructure.DialogJump
// Finally search for the dialog window again
foreach (var dialog in _dialogJumpDialogs.Keys)
{
if (API.PluginModified(dialog.Metadata.ID) || // Plugin is modified
if (PublicApi.Instance.PluginModified(dialog.Metadata.ID) || // Plugin is modified
dialog.Metadata.Disabled) continue; // Plugin is disabled
IDialogJumpDialogWindow dialogWindow;
@ -1067,11 +1106,8 @@ namespace Flow.Launcher.Infrastructure.DialogJump
_navigationLock.Dispose();
// Stop drag move timer
if (_dragMoveTimer != null)
{
_dragMoveTimer.Stop();
_dragMoveTimer = null;
}
_dragMoveTimer?.Stop();
_dragMoveTimer = null;
}
#endregion

View file

@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Win32;
namespace Flow.Launcher.Infrastructure
{
@ -13,9 +9,10 @@ namespace Flow.Launcher.Infrastructure
/// </summary>
public static string GetActiveExplorerPath()
{
var explorerWindow = GetActiveExplorer();
string locationUrl = explorerWindow?.LocationURL;
return !string.IsNullOrEmpty(locationUrl) ? GetDirectoryPath(new Uri(locationUrl).LocalPath) : null;
var explorerPath = DialogJump.DialogJump.GetActiveExplorerPath();
return !string.IsNullOrEmpty(explorerPath) ?
GetDirectoryPath(new Uri(explorerPath).LocalPath) :
null;
}
/// <summary>
@ -23,74 +20,12 @@ namespace Flow.Launcher.Infrastructure
/// </summary>
private static string GetDirectoryPath(string path)
{
if (!path.EndsWith("\\"))
if (!path.EndsWith('\\'))
{
return path + "\\";
}
return path;
}
/// <summary>
/// Gets the file explorer that is currently in the foreground
/// </summary>
private static dynamic GetActiveExplorer()
{
Type type = Type.GetTypeFromProgID("Shell.Application");
if (type == null) return null;
dynamic shell = Activator.CreateInstance(type);
if (shell == null)
{
return null;
}
var explorerWindows = new List<dynamic>();
var openWindows = shell.Windows();
for (int i = 0; i < openWindows.Count; i++)
{
var window = openWindows.Item(i);
if (window == null) continue;
// find the desired window and make sure that it is indeed a file explorer
// we don't want the Internet Explorer or the classic control panel
// ToLower() is needed, because Windows can report the path as "C:\\Windows\\Explorer.EXE"
if (Path.GetFileName((string)window.FullName)?.ToLower() == "explorer.exe")
{
explorerWindows.Add(window);
}
}
if (explorerWindows.Count == 0) return null;
var zOrders = GetZOrder(explorerWindows);
return explorerWindows.Zip(zOrders).MinBy(x => x.Second).First;
}
/// <summary>
/// Gets the z-order for one or more windows atomically with respect to each other. In Windows, smaller z-order is higher. If the window is not top level, the z order is returned as -1.
/// </summary>
private static IEnumerable<int> GetZOrder(List<dynamic> hWnds)
{
var z = new int[hWnds.Count];
for (var i = 0; i < hWnds.Count; i++) z[i] = -1;
var index = 0;
var numRemaining = hWnds.Count;
PInvoke.EnumWindows((wnd, _) =>
{
var searchIndex = hWnds.FindIndex(x => new IntPtr(x.HWND) == wnd);
if (searchIndex != -1)
{
z[searchIndex] = index;
numRemaining--;
if (numRemaining == 0) return false;
}
index++;
return true;
}, IntPtr.Zero);
return z;
}
}
}

View file

@ -34,6 +34,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<NoWarn>$(NoWarn);FLSG0007</NoWarn>
</PropertyGroup>
<ItemGroup>
@ -56,28 +57,41 @@
<PackageReference Include="Ben.Demystifier" Version="0.4.1" />
<PackageReference Include="BitFaster.Caching" Version="2.5.4" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageReference Include="Fody" Version="6.9.2">
<PackageReference Include="Flow.Launcher.Localization" Version="0.0.6" />
<PackageReference Include="Fody" Version="6.9.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="ini-parser" Version="2.5.2" />
<PackageReference Include="InputSimulator" Version="1.0.4" />
<PackageReference Include="MemoryPack" Version="1.21.4" />
<PackageReference Include="Microsoft.VisualStudio.Threading" Version="17.14.15" />
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.183">
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.205">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="NHotkey.Wpf" Version="3.0.0" />
<PackageReference Include="NLog" Version="6.0.1" />
<PackageReference Include="NLog.OutputDebugString" Version="6.0.1" />
<PackageReference Include="NLog" Version="6.0.4" />
<PackageReference Include="NLog.OutputDebugString" Version="6.0.4" />
<PackageReference Include="PropertyChanged.Fody" Version="4.1.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="SharpVectors.Wpf" Version="1.8.4.2" />
<PackageReference Include="SharpVectors.Wpf" Version="1.8.5" />
<!-- Do not upgrade this to higher version since it can cause this issue on WinForm platform: -->
<!-- PlatformNotSupportedException: SystemEvents is not supported on this platform. -->
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
<PackageReference Include="ToolGood.Words.Pinyin" Version="3.1.0.3" />
</ItemGroup>
<PropertyGroup>
<FLLUseDependencyInjection>true</FLLUseDependencyInjection>
</PropertyGroup>
<ItemGroup>
<AdditionalFiles Remove="Languages\en.xaml" />
<AdditionalFiles Include="..\Flow.Launcher\Languages\en.xaml">
<Link>Languages\en.xaml</Link>
</AdditionalFiles>
</ItemGroup>
</Project>

View file

@ -4,10 +4,8 @@ using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using JetBrains.Annotations;
namespace Flow.Launcher.Infrastructure.Http
@ -20,10 +18,6 @@ namespace Flow.Launcher.Infrastructure.Http
private static readonly HttpClient client = new();
// We should not initialize API in static constructor because it will create another API instance
private static IPublicAPI api = null;
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
static Http()
{
// need to be added so it would work on a win10 machine
@ -82,7 +76,7 @@ namespace Flow.Launcher.Infrastructure.Http
}
catch (UriFormatException e)
{
API.ShowMsgError(API.GetTranslation("pleaseTryAgain"), API.GetTranslation("parseProxyFailed"));
PublicApi.Instance.ShowMsgError(Localize.pleaseTryAgain(), Localize.parseProxyFailed());
Log.Exception(ClassName, "Unable to parse Uri", e);
}
}

View file

@ -22,7 +22,7 @@ namespace Flow.Launcher.Infrastructure.Image
private static Lock storageLock { get; } = new();
private static BinaryStorage<List<(string, bool)>> _storage;
private static readonly ConcurrentDictionary<string, string> GuidToKey = new();
private static IImageHashGenerator _hashGenerator;
private static ImageHashGenerator _hashGenerator;
private static readonly bool EnableImageHash = true;
public static ImageSource Image => ImageCache[Constant.ImageIcon, false];
public static ImageSource MissingImage => ImageCache[Constant.MissingImgIcon, false];
@ -31,7 +31,7 @@ namespace Flow.Launcher.Infrastructure.Image
public const int FullIconSize = 256;
public const int FullImageSize = 320;
private static readonly string[] ImageExtensions = { ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".ico" };
private static readonly string[] ImageExtensions = [".png", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".ico"];
private static readonly string SvgExtension = ".svg";
public static async Task InitializeAsync()
@ -327,7 +327,7 @@ namespace Flow.Launcher.Infrastructure.Image
return img;
}
private static ImageSource LoadFullImage(string path)
private static BitmapImage LoadFullImage(string path)
{
BitmapImage image = new BitmapImage();
image.BeginInit();
@ -364,7 +364,7 @@ namespace Flow.Launcher.Infrastructure.Image
return image;
}
private static ImageSource LoadSvgImage(string path, bool loadFullImage = false)
private static RenderTargetBitmap LoadSvgImage(string path, bool loadFullImage = false)
{
// Set up drawing settings
var desiredHeight = loadFullImage ? FullImageSize : SmallIconSize;

View file

@ -1,13 +1,14 @@
using System;
using System.Runtime.InteropServices;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
using IniParser;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.UI.Shell;
using Windows.Win32.Graphics.Gdi;
using Windows.Win32.UI.Shell;
namespace Flow.Launcher.Infrastructure.Image
{
@ -35,9 +36,32 @@ namespace Flow.Launcher.Infrastructure.Image
private static readonly HRESULT S_PATHNOTFOUND = (HRESULT)0x8004B205;
private const string UrlExtension = ".url";
/// <summary>
/// Obtains a BitmapSource thumbnail for the specified file.
/// </summary>
/// <remarks>
/// If the file is a Windows URL shortcut (".url"), the method attempts to resolve the shortcut's icon and use that for the thumbnail; otherwise it requests a thumbnail for the file path. The native HBITMAP used to create the BitmapSource is always released to avoid native memory leaks.
/// </remarks>
/// <param name="fileName">Path to the file (can be a regular file or a ".url" shortcut).</param>
/// <param name="width">Requested thumbnail width in pixels.</param>
/// <param name="height">Requested thumbnail height in pixels.</param>
/// <param name="options">Thumbnail extraction options (flags) controlling fallback and caching behavior.</param>
/// <returns>A BitmapSource representing the requested thumbnail.</returns>
public static BitmapSource GetThumbnail(string fileName, int width, int height, ThumbnailOptions options)
{
HBITMAP hBitmap = GetHBitmap(Path.GetFullPath(fileName), width, height, options);
HBITMAP hBitmap;
var extension = Path.GetExtension(fileName);
if (string.Equals(extension, UrlExtension, StringComparison.OrdinalIgnoreCase))
{
hBitmap = GetHBitmapForUrlFile(fileName, width, height, options);
}
else
{
hBitmap = GetHBitmap(Path.GetFullPath(fileName), width, height, options);
}
try
{
@ -50,6 +74,21 @@ namespace Flow.Launcher.Infrastructure.Image
}
}
/// <summary>
/// Obtains a native HBITMAP for the specified file at the requested size using the Windows Shell image factory.
/// </summary>
/// <remarks>
/// If <paramref name="options"/> is <see cref="ThumbnailOptions.ThumbnailOnly"/> and thumbnail extraction fails
/// due to extraction errors or a missing path, the method falls back to requesting an icon (<see cref="ThumbnailOptions.IconOnly"/>).
/// The returned HBITMAP is a raw GDI handle; the caller is responsible for releasing it (e.g., via DeleteObject) to avoid native memory leaks.
/// </remarks>
/// <param name="fileName">Path to the file to thumbnail.</param>
/// <param name="width">Requested thumbnail width in pixels.</param>
/// <param name="height">Requested thumbnail height in pixels.</param>
/// <param name="options">Thumbnail request flags that control behavior (e.g., ThumbnailOnly, IconOnly).</param>
/// <returns>An HBITMAP handle containing the image. Caller must free the handle when finished.</returns>
/// <exception cref="COMException">If creating the shell item fails (HRESULT returned by SHCreateItemFromParsingName).</exception>
/// <exception cref="InvalidOperationException">If the shell item does not expose IShellItemImageFactory or if an unexpected error occurs while obtaining the image.</exception>
private static unsafe HBITMAP GetHBitmap(string fileName, int width, int height, ThumbnailOptions options)
{
var retCode = PInvoke.SHCreateItemFromParsingName(
@ -108,5 +147,44 @@ namespace Flow.Launcher.Infrastructure.Image
return hBitmap;
}
/// <summary>
/// Obtains an HBITMAP for a Windows .url shortcut by resolving its IconFile entry and delegating to GetHBitmap.
/// </summary>
/// <remarks>
/// The method parses the .url file as an INI, looks in the "InternetShortcut" section for the "IconFile" entry,
/// and requests a bitmap for that icon path. If no IconFile is present or any error occurs while reading or
/// resolving the icon, it falls back to requesting a thumbnail for the .url file itself.
/// </remarks>
/// <param name="fileName">Path to the .url shortcut file.</param>
/// <param name="width">Requested thumbnail width (pixels).</param>
/// <param name="height">Requested thumbnail height (pixels).</param>
/// <param name="options">ThumbnailOptions flags controlling extraction behavior.</param>
/// <returns>An HBITMAP containing the requested image; callers are responsible for freeing the native handle.</returns>
private static unsafe HBITMAP GetHBitmapForUrlFile(string fileName, int width, int height, ThumbnailOptions options)
{
HBITMAP hBitmap;
try
{
var parser = new FileIniDataParser();
var data = parser.ReadFile(fileName);
var urlSection = data["InternetShortcut"];
var iconPath = urlSection?["IconFile"];
if (!File.Exists(iconPath))
{
// If the IconFile is missing, throw exception to fallback to the default icon
throw new FileNotFoundException("Icon file not specified in Internet shortcut (.url) file.");
}
hBitmap = GetHBitmap(Path.GetFullPath(iconPath), width, height, options);
}
catch
{
hBitmap = GetHBitmap(Path.GetFullPath(fileName), width, height, options);
}
return hBitmap;
}
}
}

View file

@ -34,7 +34,7 @@ namespace Flow.Launcher.Infrastructure.Logger
var fileTarget = new FileTarget
{
FileName = CurrentLogDirectory.Replace(@"\", "/") + "/${shortdate}.txt",
FileName = CurrentLogDirectory.Replace(@"\", "/") + "/Flow.Launcher.${date:format=yyyy-MM-dd}.log",
Layout = layout
};
@ -65,26 +65,22 @@ namespace Flow.Launcher.Infrastructure.Logger
public static void SetLogLevel(LOGLEVEL level)
{
switch (level)
var rule = LogManager.Configuration.FindRuleByName("file");
var nlogLevel = level switch
{
case LOGLEVEL.DEBUG:
UseDebugLogLevel();
break;
default:
UseInfoLogLevel();
break;
}
Info(nameof(Logger), $"Using log level: {level}.");
}
LOGLEVEL.NONE => LogLevel.Off,
LOGLEVEL.ERROR => LogLevel.Error,
LOGLEVEL.DEBUG => LogLevel.Debug,
_ => LogLevel.Info
};
private static void UseDebugLogLevel()
{
LogManager.Configuration.FindRuleByName("file").SetLoggingLevels(LogLevel.Debug, LogLevel.Fatal);
}
rule.SetLoggingLevels(nlogLevel, LogLevel.Fatal);
private static void UseInfoLogLevel()
{
LogManager.Configuration.FindRuleByName("file").SetLoggingLevels(LogLevel.Info, LogLevel.Fatal);
LogManager.ReconfigExistingLoggers();
// We can't log Info when level is set to Error or None, so we use Debug
Debug(nameof(Logger), $"Using log level: {level}.");
}
private static void LogFaultyFormat(string message)
@ -169,7 +165,9 @@ namespace Flow.Launcher.Infrastructure.Logger
public enum LOGLEVEL
{
DEBUG,
INFO
NONE,
ERROR,
INFO,
DEBUG
}
}

View file

@ -85,5 +85,12 @@ QueryFullProcessImageName
EVENT_OBJECT_HIDE
EVENT_SYSTEM_DIALOGEND
DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS
WM_POWERBROADCAST
PBT_APMRESUMEAUTOMATIC
PBT_APMRESUMEAUTOMATIC
PBT_APMRESUMESUSPEND
PowerRegisterSuspendResumeNotification
PowerUnregisterSuspendResumeNotification
DeviceNotifyCallbackRoutine
MonitorFromWindow

View file

@ -27,7 +27,7 @@ namespace Flow.Launcher.Infrastructure
{
switch (e.PropertyName)
{
case nameof (Settings.ShouldUsePinyin):
case nameof(Settings.ShouldUsePinyin):
if (_settings.ShouldUsePinyin)
{
Reload();
@ -52,7 +52,7 @@ namespace Flow.Launcher.Infrastructure
private void CreateDoublePinyinTableFromStream(Stream jsonStream)
{
var table = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, string>>>(jsonStream) ??
var table = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, string>>>(jsonStream) ??
throw new InvalidOperationException("Failed to deserialize double pinyin table: result is null");
var schemaKey = _settings.DoublePinyinSchema.ToString();
@ -128,12 +128,12 @@ namespace Flow.Launcher.Infrastructure
if (IsChineseCharacter(content[i]))
{
var translated = _settings.UseDoublePinyin ? ToDoublePinyin(resultList[i]) : resultList[i];
if (i > 0)
if (i > 0 && content[i - 1] != ' ')
{
resultBuilder.Append(' ');
}
map.AddNewIndex(resultBuilder.Length, translated.Length);
resultBuilder.Append(translated);
previousIsChinese = true;
@ -144,11 +144,14 @@ namespace Flow.Launcher.Infrastructure
if (previousIsChinese)
{
previousIsChinese = false;
resultBuilder.Append(' ');
if (content[i] != ' ')
{
resultBuilder.Append(' ');
}
}
map.AddNewIndex(resultBuilder.Length, resultList[i].Length);
resultBuilder.Append(resultList[i]);
map.AddNewIndex(resultBuilder.Length, 1);
resultBuilder.Append(content[i]);
}
}
@ -156,7 +159,7 @@ namespace Flow.Launcher.Infrastructure
var translation = resultBuilder.ToString();
var result = (translation, map);
return _pinyinCache[content] = result;
}
@ -185,8 +188,8 @@ namespace Flow.Launcher.Infrastructure
private string ToDoublePinyin(string fullPinyin)
{
return currentDoublePinyinTable.TryGetValue(fullPinyin, out var doublePinyinValue)
? doublePinyinValue
return currentDoublePinyinTable.TryGetValue(fullPinyin, out var doublePinyinValue)
? doublePinyinValue
: fullPinyin;
}
}

View file

@ -21,7 +21,7 @@ namespace Flow.Launcher.Infrastructure
public int MapToOriginalIndex(int translatedIndex)
{
var searchResult = _originalToTranslated.BinarySearch(translatedIndex);
return searchResult >= 0 ? searchResult : ~searchResult;
return searchResult >= 0 ? searchResult + 1 : ~searchResult;
}
public void EndConstruct()

View file

@ -1,11 +1,13 @@
using System.Text.Json.Serialization;
using Flow.Launcher.Plugin;
using System.Text.Json.Serialization;
namespace Flow.Launcher.Infrastructure.UserSettings
{
public class CustomBrowserViewModel : BaseModel
{
public string Name { get; set; }
[JsonIgnore]
public string DisplayName => Name == "Default" ? Localize.defaultBrowser_default() : Name;
public string Path { get; set; }
public string PrivateArg { get; set; }
public bool EnablePrivate { get; set; }
@ -26,8 +28,10 @@ namespace Flow.Launcher.Infrastructure.UserSettings
Editable = Editable
};
}
public void OnDisplayNameChanged()
{
OnPropertyChanged(nameof(DisplayName));
}
}
}

View file

@ -1,10 +1,13 @@
using Flow.Launcher.Plugin;
using System.Text.Json.Serialization;
using Flow.Launcher.Plugin;
namespace Flow.Launcher.ViewModel
namespace Flow.Launcher.Infrastructure.UserSettings
{
public class CustomExplorerViewModel : BaseModel
{
public string Name { get; set; }
[JsonIgnore]
public string DisplayName => Name == "Explorer" ? Localize.fileManagerExplorer() : Name;
public string Path { get; set; }
public string FileArgument { get; set; } = "\"%d\"";
public string DirectoryArgument { get; set; } = "\"%d\"";
@ -21,5 +24,10 @@ namespace Flow.Launcher.ViewModel
Editable = Editable
};
}
public void OnDisplayNameChanged()
{
OnPropertyChanged(nameof(DisplayName));
}
}
}

View file

@ -1,8 +1,6 @@
using System;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Plugin;
namespace Flow.Launcher.Infrastructure.UserSettings
{
@ -55,11 +53,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
{
public string Description { get; set; }
public string LocalizedDescription => API.GetTranslation(Description);
// We should not initialize API in static constructor because it will create another API instance
private static IPublicAPI api = null;
private static IPublicAPI API => api ??= Ioc.Default.GetRequiredService<IPublicAPI>();
public string LocalizedDescription => PublicApi.Instance.GetTranslation(Description);
public BaseBuiltinShortcutModel(string key, string description)
{

View file

@ -7,8 +7,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
{
public const string PortableFolderName = "UserData";
public const string DeletionIndicatorFile = ".dead";
public static string PortableDataPath = Path.Combine(Constant.ProgramDirectory, PortableFolderName);
public static string RoamingDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "FlowLauncher");
public static readonly string PortableDataPath = Path.Combine(Constant.ProgramDirectory, PortableFolderName);
public static readonly string RoamingDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "FlowLauncher");
public static string DataDirectory()
{
if (PortableDataLocationInUse())
@ -19,7 +19,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public static bool PortableDataLocationInUse()
{
if (Directory.Exists(PortableDataPath) && !File.Exists(DeletionIndicatorFile))
if (Directory.Exists(PortableDataPath) &&
!File.Exists(Path.Combine(PortableDataPath, DeletionIndicatorFile)))
return true;
return false;
@ -39,6 +40,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public const string PythonEnvironmentName = "Python";
public const string NodeEnvironmentName = "Node.js";
public const string PluginEnvironments = "Environments";
public const string PluginDeleteFile = "NeedDelete.txt";
public static readonly string PluginEnvironmentsPath = Path.Combine(DataDirectory(), PluginEnvironments);
}
}

View file

@ -1,4 +1,4 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text.Json.Serialization;
using System.Windows;
@ -7,9 +7,9 @@ using CommunityToolkit.Mvvm.DependencyInjection;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Infrastructure.Logger;
using Flow.Launcher.Infrastructure.Storage;
using Flow.Launcher.Localization.Attributes;
using Flow.Launcher.Plugin;
using Flow.Launcher.Plugin.SharedModels;
using Flow.Launcher.ViewModel;
namespace Flow.Launcher.Infrastructure.UserSettings
{
@ -481,6 +481,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
public bool LeaveCmdOpen { get; set; }
public bool HideWhenDeactivated { get; set; } = true;
public bool ShowTaskbarWhenInvoked { get; set; } = false;
private bool _showAtTopmost = false;
public bool ShowAtTopmost
@ -514,6 +515,21 @@ namespace Flow.Launcher.Infrastructure.UserSettings
[JsonConverter(typeof(JsonStringEnumConverter))]
public LastQueryMode LastQueryMode { get; set; } = LastQueryMode.Selected;
private HistoryStyle _historyStyle = HistoryStyle.Query;
[JsonConverter(typeof(JsonStringEnumConverter))]
public HistoryStyle HistoryStyle
{
get => _historyStyle;
set
{
if (_historyStyle != value)
{
_historyStyle = value;
OnPropertyChanged();
}
}
}
[JsonConverter(typeof(JsonStringEnumConverter))]
public AnimationSpeeds AnimationSpeed { get; set; } = AnimationSpeeds.Medium;
public int CustomAnimationLength { get; set; } = 360;
@ -696,4 +712,14 @@ namespace Flow.Launcher.Infrastructure.UserSettings
FullPathOpen,
Directory
}
[EnumLocalize]
public enum HistoryStyle
{
[EnumLocalizeKey(nameof(Localize.queryHistory))]
Query,
[EnumLocalizeKey(nameof(Localize.executedHistory))]
LastOpened
}
}

View file

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
@ -19,6 +19,7 @@ using Microsoft.Win32.SafeHandles;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.Graphics.Dwm;
using Windows.Win32.System.Power;
using Windows.Win32.System.Threading;
using Windows.Win32.UI.Input.KeyboardAndMouse;
using Windows.Win32.UI.Shell.Common;
@ -338,9 +339,6 @@ namespace Flow.Launcher.Infrastructure
public const int SC_MAXIMIZE = (int)PInvoke.SC_MAXIMIZE;
public const int SC_MINIMIZE = (int)PInvoke.SC_MINIMIZE;
public const int WM_POWERBROADCAST = (int)PInvoke.WM_POWERBROADCAST;
public const int PBT_APMRESUMEAUTOMATIC = (int)PInvoke.PBT_APMRESUMEAUTOMATIC;
#endregion
#region Window Handle
@ -904,5 +902,146 @@ namespace Flow.Launcher.Infrastructure
}
#endregion
#region File / Folder Dialog
public static string SelectFile()
{
var dlg = new OpenFileDialog();
var result = dlg.ShowDialog();
if (result == true)
return dlg.FileName;
return string.Empty;
}
#endregion
#region Sleep Mode Listener
private static Action _func;
private static PDEVICE_NOTIFY_CALLBACK_ROUTINE _callback = null;
private static DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS _recipient;
private static SafeHandle _recipientHandle;
private static HPOWERNOTIFY _handle = HPOWERNOTIFY.Null;
/// <summary>
/// Registers a listener for sleep mode events.
/// Inspired from: https://github.com/XKaguya/LenovoLegionToolkit
/// https://blog.csdn.net/mochounv/article/details/114668594
/// </summary>
/// <param name="func"></param>
/// <exception cref="Win32Exception"></exception>
public static unsafe void RegisterSleepModeListener(Action func)
{
if (_callback != null)
{
// Only register if not already registered
return;
}
_func = func;
_callback = new PDEVICE_NOTIFY_CALLBACK_ROUTINE(DeviceNotifyCallback);
_recipient = new DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS()
{
Callback = _callback,
Context = null
};
_recipientHandle = new StructSafeHandle<DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS>(_recipient);
_handle = PInvoke.PowerRegisterSuspendResumeNotification(
REGISTER_NOTIFICATION_FLAGS.DEVICE_NOTIFY_CALLBACK,
_recipientHandle,
out var handle) == WIN32_ERROR.ERROR_SUCCESS ?
new HPOWERNOTIFY(new IntPtr(handle)) :
HPOWERNOTIFY.Null;
if (_handle.IsNull)
{
throw new Win32Exception("Error registering for power notifications: " + Marshal.GetLastWin32Error());
}
}
/// <summary>
/// Unregisters the sleep mode listener.
/// </summary>
public static void UnregisterSleepModeListener()
{
if (!_handle.IsNull)
{
PInvoke.PowerUnregisterSuspendResumeNotification(_handle);
_handle = HPOWERNOTIFY.Null;
_func = null;
_callback = null;
_recipientHandle = null;
}
}
private static unsafe uint DeviceNotifyCallback(void* context, uint type, void* setting)
{
switch (type)
{
case PInvoke.PBT_APMRESUMEAUTOMATIC:
// Operation is resuming automatically from a low-power state.This message is sent every time the system resumes
_func?.Invoke();
break;
case PInvoke.PBT_APMRESUMESUSPEND:
// Operation is resuming from a low-power state.This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key
_func?.Invoke();
break;
}
return 0;
}
private sealed class StructSafeHandle<T> : SafeHandle where T : struct
{
private readonly nint _ptr = nint.Zero;
public StructSafeHandle(T recipient) : base(nint.Zero, true)
{
var pRecipient = Marshal.AllocHGlobal(Marshal.SizeOf<T>());
Marshal.StructureToPtr(recipient, pRecipient, false);
SetHandle(pRecipient);
_ptr = pRecipient;
}
public override bool IsInvalid => handle == nint.Zero;
protected override bool ReleaseHandle()
{
Marshal.FreeHGlobal(_ptr);
return true;
}
}
#endregion
#region Taskbar
public static unsafe void ShowTaskbar()
{
// Find the taskbar window
var taskbarHwnd = PInvoke.FindWindowEx(HWND.Null, HWND.Null, "Shell_TrayWnd", null);
if (taskbarHwnd == HWND.Null) return;
// Magic from https://github.com/Oliviaophia/SmartTaskbar
const uint TrayBarFlag = 0x05D1;
var mon = PInvoke.MonitorFromWindow(taskbarHwnd, Windows.Win32.Graphics.Gdi.MONITOR_FROM_FLAGS.MONITOR_DEFAULTTONEAREST);
PInvoke.PostMessage(taskbarHwnd, TrayBarFlag, new WPARAM(1), new LPARAM((nint)mon.Value));
}
public static void HideTaskbar()
{
// Find the taskbar window
var taskbarHwnd = PInvoke.FindWindowEx(HWND.Null, HWND.Null, "Shell_TrayWnd", null);
if (taskbarHwnd == HWND.Null) return;
// Magic from https://github.com/Oliviaophia/SmartTaskbar
const uint TrayBarFlag = 0x05D1;
PInvoke.PostMessage(taskbarHwnd, TrayBarFlag, new WPARAM(0), IntPtr.Zero);
}
#endregion
}
}

View file

@ -23,11 +23,23 @@
"resolved": "8.4.0",
"contentHash": "tqVU8yc/ADO9oiTRyTnwhFN68hCwvkliMierptWOudIAvWY1mWCh5VFh+guwHJmpMwfg0J0rY+yyd5Oy7ty9Uw=="
},
"Flow.Launcher.Localization": {
"type": "Direct",
"requested": "[0.0.6, )",
"resolved": "0.0.6",
"contentHash": "WNI/TLGPDr3XdOW8gaALN0Uyz9h+bzqOaNZev2nHEuA3HW9o7XuqaM6C0PqNi96mNgxiypwWpVazBNzaylJ2Aw=="
},
"Fody": {
"type": "Direct",
"requested": "[6.9.2, )",
"resolved": "6.9.2",
"contentHash": "YBHobPGogb0vYhGYIxn/ndWqTjNWZveDi5jdjrcshL2vjwU3gQGyDeI7vGgye+2rAM5fGRvlLgNWLW3DpviS/w=="
"requested": "[6.9.3, )",
"resolved": "6.9.3",
"contentHash": "1CUGgFdyECDKgi5HaUBhdv6k+VG9Iy4OCforGfHyar3xQXAJypZkzymgKtWj/4SPd6nSG0Qi7NH71qHrDSZLaA=="
},
"ini-parser": {
"type": "Direct",
"requested": "[2.5.2, )",
"resolved": "2.5.2",
"contentHash": "hp3gKmC/14+6eKLgv7Jd1Z7OV86lO+tNfOXr/stQbwmRhdQuXVSvrRAuAe7G5+lwhkov0XkqZ8/bn1PYWMx6eg=="
},
"InputSimulator": {
"type": "Direct",
@ -58,9 +70,9 @@
},
"Microsoft.Windows.CsWin32": {
"type": "Direct",
"requested": "[0.3.183, )",
"resolved": "0.3.183",
"contentHash": "Ze3aE2y7xgzKxEWtNb4SH0CExXpCHr3sbmwnvMiWMzJhWDX/G4Rs5wgg2UNs3VN+qVHh/DkDWLCPaVQv/b//Nw==",
"requested": "[0.3.205, )",
"resolved": "0.3.205",
"contentHash": "U5wGAnyKd7/I2YMd43nogm81VMtjiKzZ9dsLMVI4eAB7jtv5IEj0gprj0q/F3iRmAIaGv5omOf8iSYx2+nE6BQ==",
"dependencies": {
"Microsoft.Windows.SDK.Win32Docs": "0.1.42-alpha",
"Microsoft.Windows.SDK.Win32Metadata": "61.0.15-preview",
@ -78,17 +90,17 @@
},
"NLog": {
"type": "Direct",
"requested": "[6.0.1, )",
"resolved": "6.0.1",
"contentHash": "qDWiqy8/xdpZKtHna/645KbalwP86N2NFJEzfqhcv+Si4V2iNaEfR/dCneuF/4+Dcwl3f7jHMXj3ndWYftV3Ug=="
"requested": "[6.0.4, )",
"resolved": "6.0.4",
"contentHash": "Xr+lIk1ZlTTFXEqnxQVLxrDqZlt2tm5X+/AhJbaY2emb/dVtGDiU5QuEtj3gHtwV/SWlP/rJ922I/BPuOJXlRw=="
},
"NLog.OutputDebugString": {
"type": "Direct",
"requested": "[6.0.1, )",
"resolved": "6.0.1",
"contentHash": "wwJCQLaHVzuRf8TsXB+EEdrzVvE3dnzCSMQMDgwkw3AXp8VSp3JSVF/Q/H0oEqggKgKhPs13hh3a7svyQr4s3A==",
"requested": "[6.0.4, )",
"resolved": "6.0.4",
"contentHash": "TOP2Ap9BbE98B/l/TglnguowOD0rXo8B/20xAgvj9shO/kf6IJ5M4QMhVxq72mrneJ/ANhHY7Jcd+xJbzuI5PA==",
"dependencies": {
"NLog": "6.0.1"
"NLog": "6.0.4"
}
},
"PropertyChanged.Fody": {
@ -102,9 +114,9 @@
},
"SharpVectors.Wpf": {
"type": "Direct",
"requested": "[1.8.4.2, )",
"resolved": "1.8.4.2",
"contentHash": "PNxLkMBJnV8A+6yH9OqOlhLJegvWP/dvh0rAJp2l0kcrR+rB4R2tQ9vhUqka+UilH4atN8T6zvjDOizVyfz2Ng=="
"requested": "[1.8.5, )",
"resolved": "1.8.5",
"contentHash": "WURdBDq5AE8RjKV9pFS7lNkJe81gxja9SaMGE4URq9GJUZ6M+5DGUL0Lm3B0iYW2/Meyowaz4ffGsyW+RBSTtg=="
},
"System.Drawing.Common": {
"type": "Direct",
@ -123,8 +135,8 @@
},
"JetBrains.Annotations": {
"type": "Transitive",
"resolved": "2024.3.0",
"contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug=="
"resolved": "2025.2.2",
"contentHash": "0X56ZRizuHdrnPpgXjWV7f2tQO1FlQg5O1967OGKnI/4ZRNOK642J8L7brM1nYvrxTTU5TP1yRyXLRLaXLPQ8A=="
},
"MemoryPack.Core": {
"type": "Transitive",
@ -190,7 +202,7 @@
"flow.launcher.plugin": {
"type": "Project",
"dependencies": {
"JetBrains.Annotations": "[2024.3.0, )"
"JetBrains.Annotations": "[2025.2.2, )"
}
}
}

View file

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0-windows</TargetFramework>
@ -15,10 +15,10 @@
</PropertyGroup>
<PropertyGroup>
<Version>5.0.0</Version>
<PackageVersion>5.0.0</PackageVersion>
<AssemblyVersion>5.0.0</AssemblyVersion>
<FileVersion>5.0.0</FileVersion>
<Version>5.2.0</Version>
<PackageVersion>5.2.0</PackageVersion>
<AssemblyVersion>5.2.0</AssemblyVersion>
<FileVersion>5.2.0</FileVersion>
<PackageId>Flow.Launcher.Plugin</PackageId>
<Authors>Flow-Launcher</Authors>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
@ -68,13 +68,13 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Fody" Version="6.9.2">
<PackageReference Include="Fody" Version="6.9.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0" />
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.183">
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="10.0.103" PrivateAssets="All" />
<PackageReference Include="JetBrains.Annotations" Version="2025.2.2" />
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.269">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

View file

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
@ -173,9 +173,21 @@ namespace Flow.Launcher.Plugin
/// <summary>
/// Get all loaded plugins
/// </summary>
/// <remarks>
/// Will also return any plugins not fully initialized yet
/// </remarks>
/// <returns></returns>
List<PluginPair> GetAllPlugins();
/// <summary>
/// Get all initialized plugins
/// </summary>
/// <param name="includeFailed">
/// Whether to include plugins that failed to initialize
/// </param>
/// <returns></returns>
List<PluginPair> GetAllInitializedPlugins(bool includeFailed);
/// <summary>
/// Registers a callback function for global keyboard events.
/// </summary>

View file

@ -137,6 +137,11 @@ namespace Flow.Launcher.Plugin
[JsonIgnore]
public int QueryCount { get; set; }
/// <summary>
/// The minimum Flow Launcher version required for this plugin. Default is "".
/// </summary>
public string MinimumAppVersion { get; set; } = string.Empty;
/// <summary>
/// The path to the plugin settings directory which is not validated.
/// It is used to store plugin settings files and data files.

View file

@ -1,4 +1,5 @@
using System.Text.Json.Serialization;
using System;
using System.Text.Json.Serialization;
namespace Flow.Launcher.Plugin
{
@ -8,11 +9,29 @@ namespace Flow.Launcher.Plugin
public class Query
{
/// <summary>
/// Raw query, this includes action keyword if it has.
/// It has handled buildin custom query shortkeys and build-in shortcuts, and it trims the whitespace.
/// We didn't recommend use this property directly. You should always use Search property.
/// Original query, exactly how the user has typed into the search box.
/// We don't recommend using this property directly. You should always use Search property.
/// </summary>
public string RawQuery { get; internal init; }
public string OriginalQuery { get; internal init; }
/// <summary>
/// Raw query, this includes action keyword if it has.
/// It has handled built-in custom query hotkeys and built-in shortcuts, and it trims the whitespace.
/// We don't recommend using this property directly. You should always use Search property.
/// </summary>
[Obsolete("RawQuery is renamed to TrimmedQuery. This property will be removed. Update the code to use TrimmedQuery instead.")]
public string RawQuery {
get => TrimmedQuery;
internal init { TrimmedQuery = value; }
}
/// <summary>
/// Original query but with trimmed whitespace. Includes action keyword.
/// It has handled built-in custom query hotkeys and build-in shortcuts.
/// If you need the exact original query from the search box, use OriginalQuery property instead.
/// We don't recommend using this property directly. You should always use Search property.
/// </summary>
public string TrimmedQuery { get; internal init; }
/// <summary>
/// Determines whether the query was forced to execute again.
@ -28,7 +47,7 @@ namespace Flow.Launcher.Plugin
/// <summary>
/// Search part of a query.
/// This will not include action keyword if exclusive plugin gets it, otherwise it should be same as RawQuery.
/// This will not include action keyword if exclusive plugin gets it, otherwise it should be same as TrimmedQuery.
/// Since we allow user to switch a exclusive plugin to generic plugin,
/// so this property will always give you the "real" query part of the query
/// </summary>
@ -103,6 +122,6 @@ namespace Flow.Launcher.Plugin
}
/// <inheritdoc />
public override string ToString() => RawQuery;
public override string ToString() => TrimmedQuery;
}
}

View file

@ -4,11 +4,13 @@ using System.IO;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media;
using System.Text.Json.Serialization;
namespace Flow.Launcher.Plugin
{
/// <summary>
/// Describes a result of a <see cref="Query"/> executed by a plugin
/// Describes a result of a <see cref="Query"/> executed by a plugin.
/// This or its child classes is serializable.
/// </summary>
public class Result
{
@ -21,6 +23,8 @@ namespace Flow.Launcher.Plugin
private string _icoPath;
private string _icoPathAbsolute;
private string _copyText = string.Empty;
private string _badgeIcoPath;
@ -64,15 +68,27 @@ namespace Flow.Launcher.Plugin
public string AutoCompleteText { get; set; }
/// <summary>
/// The image to be displayed for the result.
/// Path or URI to the icon image for this result.
/// Updates <see cref="IcoPathAbsolute"/> appropriately when set.
/// </summary>
/// <value>Can be a local file path or a URL.</value>
/// <remarks>GlyphInfo is prioritized if not null</remarks>
/// <remarks>
/// Preferred usage: provide a path relative to the plugin directory (for example: "Images\icon.png").
/// Because <see cref="IcoPath"/> is serialized, using relative paths keeps the icon reference portable
/// when Flow is moved.
///
/// Accepted formats:
/// - Relative file paths (resolved against <see cref="PluginDirectory"/> into <see cref="IcoPathAbsolute"/>)
/// - Absolute file paths (left as-is)
/// - HTTP/HTTPS URLs (left as-is)
/// - Data URIs (left as-is)
/// </remarks>
public string IcoPath
{
get => _icoPath;
set
{
_icoPath = value;
// As a standard this property will handle prepping and converting to absolute local path for icon image processing
if (!string.IsNullOrEmpty(value)
&& !string.IsNullOrEmpty(PluginDirectory)
@ -81,15 +97,23 @@ namespace Flow.Launcher.Plugin
&& !value.StartsWith("https://", StringComparison.OrdinalIgnoreCase)
&& !value.StartsWith("data:image", StringComparison.OrdinalIgnoreCase))
{
_icoPath = Path.Combine(PluginDirectory, value);
_icoPathAbsolute = Path.Combine(PluginDirectory, value);
}
else
{
_icoPath = value;
_icoPathAbsolute = value;
}
}
}
/// <summary>
/// Absolute path or URI which is used to load and display the result icon for Flow.
/// This is populated by the <see cref="IcoPath"/> setter.
/// If a relative path was provided to <see cref="IcoPath"/>, this property will contain the resolved
/// absolute local path after combining with <see cref="PluginDirectory"/>.
/// </summary>
public string IcoPathAbsolute => _icoPathAbsolute;
/// <summary>
/// The image to be displayed for the badge of the result.
/// </summary>
@ -131,17 +155,34 @@ namespace Flow.Launcher.Plugin
/// <summary>
/// Delegate to load an icon for this result.
/// </summary>
[JsonIgnore]
public IconDelegate Icon = null;
/// <summary>
/// Delegate to load an icon for the badge of this result.
/// </summary>
[JsonIgnore]
public IconDelegate BadgeIcon = null;
private GlyphInfo _glyph;
/// <summary>
/// Information for Glyph Icon (Prioritized than IcoPath/Icon if user enable Glyph Icons)
/// </summary>
public GlyphInfo Glyph { get; init; }
public GlyphInfo Glyph
{
get => _glyph;
init => _glyph = value;
}
/// <summary>
/// Set the Glyph Icon after initialization
/// </summary>
/// <param name="glyph"></param>
public void SetGlyph(GlyphInfo glyph)
{
_glyph = glyph;
}
/// <summary>
/// An action to take in the form of a function call when the result has been selected.
@ -151,6 +192,7 @@ namespace Flow.Launcher.Plugin
/// Its result determines what happens to Flow Launcher's query form:
/// when true, the form will be hidden; when false, it will stay in focus.
/// </remarks>
[JsonIgnore]
public Func<ActionContext, bool> Action { get; set; }
/// <summary>
@ -161,6 +203,7 @@ namespace Flow.Launcher.Plugin
/// Its result determines what happens to Flow Launcher's query form:
/// when true, the form will be hidden; when false, it will stay in focus.
/// </remarks>
[JsonIgnore]
public Func<ActionContext, ValueTask<bool>> AsyncAction { get; set; }
/// <summary>
@ -203,11 +246,13 @@ namespace Flow.Launcher.Plugin
/// <example>
/// As external information for ContextMenu
/// </example>
[JsonIgnore]
public object ContextData { get; set; }
/// <summary>
/// Plugin ID that generated this result
/// </summary>
[JsonInclude]
public string PluginID { get; internal set; }
/// <summary>
@ -223,6 +268,7 @@ namespace Flow.Launcher.Plugin
/// <summary>
/// Customized Preview Panel
/// </summary>
[JsonIgnore]
public Lazy<UserControl> PreviewPanel { get; set; }
/// <summary>
@ -352,6 +398,7 @@ namespace Flow.Launcher.Plugin
/// <summary>
/// Delegate to get the preview panel's image
/// </summary>
[JsonIgnore]
public IconDelegate PreviewDelegate { get; set; } = null;
/// <summary>

View file

@ -130,6 +130,119 @@ namespace Flow.Launcher.Plugin.SharedCommands
}
}
/// <summary>
/// Attempts to delete a directory robustly with retry logic for locked files.
/// This method tries to delete files individually with retries, then removes empty directories.
/// Returns true if the directory was completely deleted, false if some files/folders remain.
/// </summary>
/// <param name="path">The directory path to delete</param>
/// <param name="maxRetries">Maximum number of retry attempts for locked files (default: 3)</param>
/// <param name="retryDelayMs">Delay in milliseconds between retries (default: 100ms)</param>
/// <returns>True if directory was fully deleted, false if some items remain</returns>
public static bool TryDeleteDirectoryRobust(string path, int maxRetries = 3, int retryDelayMs = 100)
{
if (!Directory.Exists(path))
return true;
bool fullyDeleted = true;
try
{
// First, try to delete all files in the directory tree
var files = Directory.GetFiles(path, "*", SearchOption.AllDirectories);
foreach (var file in files)
{
bool fileDeleted = false;
for (int attempt = 0; attempt <= maxRetries; attempt++)
{
try
{
// Remove read-only attribute if present
var fileInfo = new FileInfo(file);
if (fileInfo.Exists && fileInfo.IsReadOnly)
{
fileInfo.IsReadOnly = false;
}
File.Delete(file);
fileDeleted = true;
break;
}
catch (UnauthorizedAccessException)
{
// File is in use or access denied, wait and retry
if (attempt < maxRetries)
{
System.Threading.Thread.Sleep(retryDelayMs);
}
}
catch (IOException)
{
// File is in use, wait and retry
if (attempt < maxRetries)
{
System.Threading.Thread.Sleep(retryDelayMs);
}
}
catch
{
// Other exceptions, don't retry
break;
}
}
if (!fileDeleted)
{
fullyDeleted = false;
}
}
// Then, try to delete all empty directories (from deepest to shallowest)
var directories = Directory.GetDirectories(path, "*", SearchOption.AllDirectories)
.OrderByDescending(d => d.Length) // Delete deeper directories first
.ToArray();
foreach (var directory in directories)
{
try
{
if (Directory.Exists(directory) && !Directory.EnumerateFileSystemEntries(directory).Any())
{
Directory.Delete(directory, false);
}
}
catch
{
// If we can't delete an empty directory, mark as not fully deleted
fullyDeleted = false;
}
}
// Finally, try to delete the root directory itself
try
{
if (Directory.Exists(path) && !Directory.EnumerateFileSystemEntries(path).Any())
{
Directory.Delete(path, false);
}
else if (Directory.Exists(path))
{
fullyDeleted = false;
}
}
catch
{
fullyDeleted = false;
}
}
catch
{
fullyDeleted = false;
}
return fullyDeleted;
}
/// <summary>
/// Checks if a directory exists
/// </summary>
@ -150,6 +263,16 @@ namespace Flow.Launcher.Plugin.SharedCommands
return File.Exists(filePath);
}
/// <summary>
/// Checks if a file or directory exists
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static bool FileOrLocationExists(this string path)
{
return LocationExists(path) || FileExists(path);
}
/// <summary>
/// Open a directory window (using the OS's default handler, usually explorer)
/// </summary>

View file

@ -4,35 +4,35 @@
"net9.0-windows7.0": {
"Fody": {
"type": "Direct",
"requested": "[6.9.2, )",
"resolved": "6.9.2",
"contentHash": "YBHobPGogb0vYhGYIxn/ndWqTjNWZveDi5jdjrcshL2vjwU3gQGyDeI7vGgye+2rAM5fGRvlLgNWLW3DpviS/w=="
"requested": "[6.9.3, )",
"resolved": "6.9.3",
"contentHash": "1CUGgFdyECDKgi5HaUBhdv6k+VG9Iy4OCforGfHyar3xQXAJypZkzymgKtWj/4SPd6nSG0Qi7NH71qHrDSZLaA=="
},
"JetBrains.Annotations": {
"type": "Direct",
"requested": "[2024.3.0, )",
"resolved": "2024.3.0",
"contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug=="
"requested": "[2025.2.2, )",
"resolved": "2025.2.2",
"contentHash": "0X56ZRizuHdrnPpgXjWV7f2tQO1FlQg5O1967OGKnI/4ZRNOK642J8L7brM1nYvrxTTU5TP1yRyXLRLaXLPQ8A=="
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[8.0.0, )",
"resolved": "8.0.0",
"contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
"requested": "[10.0.103, )",
"resolved": "10.0.103",
"contentHash": "qZk7r40ftpZY+/sO019sgWAWfNqC2CLSspDdAxNYCJU/bCi/8jVwvOMjzb/d5gjCRNzQ4OCYgBfhdpQyVwLTyw==",
"dependencies": {
"Microsoft.Build.Tasks.Git": "8.0.0",
"Microsoft.SourceLink.Common": "8.0.0"
"Microsoft.Build.Tasks.Git": "10.0.103",
"Microsoft.SourceLink.Common": "10.0.103"
}
},
"Microsoft.Windows.CsWin32": {
"type": "Direct",
"requested": "[0.3.183, )",
"resolved": "0.3.183",
"contentHash": "Ze3aE2y7xgzKxEWtNb4SH0CExXpCHr3sbmwnvMiWMzJhWDX/G4Rs5wgg2UNs3VN+qVHh/DkDWLCPaVQv/b//Nw==",
"requested": "[0.3.269, )",
"resolved": "0.3.269",
"contentHash": "O4GVJ0ymxcoFRGS07VcoEClj7A9PIciHIjWDrPymzonhYlOfM7V0ZqGBUK19cUH3BPca9MfSOH0KLK/9JzQ8+Q==",
"dependencies": {
"Microsoft.Windows.SDK.Win32Docs": "0.1.42-alpha",
"Microsoft.Windows.SDK.Win32Metadata": "61.0.15-preview",
"Microsoft.Windows.WDK.Win32Metadata": "0.12.8-experimental"
"Microsoft.Windows.SDK.Win32Metadata": "69.0.7-preview",
"Microsoft.Windows.WDK.Win32Metadata": "0.13.25-experimental"
}
},
"PropertyChanged.Fody": {
@ -46,13 +46,13 @@
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
"resolved": "10.0.103",
"contentHash": "QoiCMcPuxC6eqRQmrmF9zBY96ejIznXtve/lJJbonGD9I5Aygf2AUCOWslGiCEtBbfWRSuUnepBjuuVOdAl5ag=="
},
"Microsoft.SourceLink.Common": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
"resolved": "10.0.103",
"contentHash": "cMtGW5/r0ck72Jg2QwZcNTX59z+iB/B1kW84VMa/eX8L19DhHIuIcQjfK0pgLLBxd60Jl0Bj9GUolcM0MnJnZA=="
},
"Microsoft.Windows.SDK.Win32Docs": {
"type": "Transitive",
@ -61,15 +61,15 @@
},
"Microsoft.Windows.SDK.Win32Metadata": {
"type": "Transitive",
"resolved": "61.0.15-preview",
"contentHash": "cysex3dazKtCPALCluC2XX3f5Aedy9H2pw5jb+TW5uas2rkem1Z7FRnbUrg2vKx0pk0Qz+4EJNr37HdYTEcvEQ=="
"resolved": "69.0.7-preview",
"contentHash": "RJoNjQJVCIDNLPbvYuaygCFknTyAxOUE45of1voj0jjOgJa9MB2m1/G8L8F3IYc+2EFG5aqa/9y8PEx7Tk2tLQ=="
},
"Microsoft.Windows.WDK.Win32Metadata": {
"type": "Transitive",
"resolved": "0.12.8-experimental",
"contentHash": "3n8R44/Z96Ly+ty4eYVJfESqbzvpw96lRLs3zOzyDmr1x1Kw7FNn5CyE416q+bZQV3e1HRuMUvyegMeRE/WedA==",
"resolved": "0.13.25-experimental",
"contentHash": "IM50tb/+UIwBr9FMr6ZKcZjCMW+Axo6NjGqKxgjUfyCY8dRnYUfrJEXxAaXoWtYP4X8EmASmC1Jtwh4XucseZg==",
"dependencies": {
"Microsoft.Windows.SDK.Win32Metadata": "61.0.15-preview"
"Microsoft.Windows.SDK.Win32Metadata": "63.0.31-preview"
}
}
}

View file

@ -1,6 +1,7 @@
using Flow.Launcher.Plugin.SharedCommands;
using NUnit.Framework;
using NUnit.Framework.Legacy;
using System.IO;
namespace Flow.Launcher.Test
{
@ -50,5 +51,89 @@ namespace Flow.Launcher.Test
{
ClassicAssert.AreEqual(expectedResult, FilesFolders.PathContains(parentPath, path, allowEqual: expectedResult));
}
[Test]
public void TryDeleteDirectoryRobust_WhenDirectoryDoesNotExist_ReturnsTrue()
{
// Arrange
string nonExistentPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
// Act
bool result = FilesFolders.TryDeleteDirectoryRobust(nonExistentPath);
// Assert
ClassicAssert.IsTrue(result);
}
[Test]
public void TryDeleteDirectoryRobust_WhenDirectoryIsEmpty_DeletesSuccessfully()
{
// Arrange
string tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
Directory.CreateDirectory(tempDir);
// Act
bool result = FilesFolders.TryDeleteDirectoryRobust(tempDir);
// Assert
ClassicAssert.IsTrue(result);
ClassicAssert.IsFalse(Directory.Exists(tempDir));
}
[Test]
public void TryDeleteDirectoryRobust_WhenDirectoryHasFiles_DeletesSuccessfully()
{
// Arrange
string tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
Directory.CreateDirectory(tempDir);
File.WriteAllText(Path.Combine(tempDir, "test.txt"), "test content");
// Act
bool result = FilesFolders.TryDeleteDirectoryRobust(tempDir);
// Assert
ClassicAssert.IsTrue(result);
ClassicAssert.IsFalse(Directory.Exists(tempDir));
}
[Test]
public void TryDeleteDirectoryRobust_WhenDirectoryHasNestedStructure_DeletesSuccessfully()
{
// Arrange
string tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
Directory.CreateDirectory(tempDir);
string subDir1 = Path.Combine(tempDir, "SubDir1");
string subDir2 = Path.Combine(tempDir, "SubDir2");
Directory.CreateDirectory(subDir1);
Directory.CreateDirectory(subDir2);
File.WriteAllText(Path.Combine(subDir1, "file1.txt"), "content1");
File.WriteAllText(Path.Combine(subDir2, "file2.txt"), "content2");
File.WriteAllText(Path.Combine(tempDir, "root.txt"), "root content");
// Act
bool result = FilesFolders.TryDeleteDirectoryRobust(tempDir);
// Assert
ClassicAssert.IsTrue(result);
ClassicAssert.IsFalse(Directory.Exists(tempDir));
}
[Test]
public void TryDeleteDirectoryRobust_WhenFileIsReadOnly_RemovesAttributeAndDeletes()
{
// Arrange
string tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
Directory.CreateDirectory(tempDir);
string filePath = Path.Combine(tempDir, "readonly.txt");
File.WriteAllText(filePath, "readonly content");
File.SetAttributes(filePath, FileAttributes.ReadOnly);
// Act
bool result = FilesFolders.TryDeleteDirectoryRobust(tempDir);
// Assert
ClassicAssert.IsTrue(result);
ClassicAssert.IsFalse(Directory.Exists(tempDir));
}
}
}

View file

@ -39,6 +39,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Plugins\Flow.Launcher.Plugin.Calculator\Flow.Launcher.Plugin.Calculator.csproj" />
<ProjectReference Include="..\Plugins\Flow.Launcher.Plugin.Explorer\Flow.Launcher.Plugin.Explorer.csproj" />
<ProjectReference Include="..\Plugins\Flow.Launcher.Plugin.Program\Flow.Launcher.Plugin.Program.csproj" />
<ProjectReference Include="..\Plugins\Flow.Launcher.Plugin.Url\Flow.Launcher.Plugin.Url.csproj" />
@ -49,8 +50,8 @@
<ItemGroup>
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="nunit" Version="4.3.2" />
<PackageReference Include="NUnit3TestAdapter" Version="5.0.0">
<PackageReference Include="nunit" Version="4.4.0" />
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

View file

@ -0,0 +1,134 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using Flow.Launcher.Plugin.Calculator;
using Mages.Core;
using NUnit.Framework;
using NUnit.Framework.Legacy;
namespace Flow.Launcher.Test.Plugins
{
[TestFixture]
public class CalculatorPluginTest
{
private readonly Main _plugin;
private readonly Settings _settings = new()
{
DecimalSeparator = DecimalSeparator.UseSystemLocale,
MaxDecimalPlaces = 10,
ShowErrorMessage = false, // Make sure we return the empty results when error occurs
UseThousandsSeparator = true // Default value
};
private readonly Engine _engine = new(new Configuration
{
Scope = new Dictionary<string, object>
{
{ "e", Math.E }, // e is not contained in the default mages engine
}
});
public CalculatorPluginTest()
{
_plugin = new Main();
var settingField = typeof(Main).GetField("_settings", BindingFlags.NonPublic | BindingFlags.Instance);
if (settingField == null)
Assert.Fail("Could not find field '_settings' on Flow.Launcher.Plugin.Calculator.Main");
settingField.SetValue(_plugin, _settings);
var engineField = typeof(Main).GetField("MagesEngine", BindingFlags.NonPublic | BindingFlags.Static);
if (engineField == null)
Assert.Fail("Could not find static field 'MagesEngine' on Flow.Launcher.Plugin.Calculator.Main");
engineField.SetValue(null, _engine);
}
[Test]
public void ThousandsSeparatorTest_Enabled()
{
_settings.UseThousandsSeparator = true;
_settings.DecimalSeparator = DecimalSeparator.Dot;
var result = GetCalculationResult("1000+234");
// When thousands separator is enabled, the result should contain a separator
// Since decimal separator is dot, thousands separator should be comma
ClassicAssert.AreEqual("1,234", result);
_settings.DecimalSeparator = DecimalSeparator.Comma;
var result2 = GetCalculationResult("1000+234");
// When thousands separator is enabled, the result should contain a separator
// Since decimal separator is comma, thousands separator should be dot
ClassicAssert.AreEqual("1.234", result2);
}
[Test]
public void ThousandsSeparatorTest_Disabled()
{
_settings.UseThousandsSeparator = false;
_settings.DecimalSeparator = DecimalSeparator.UseSystemLocale;
var result = GetCalculationResult("1000+234");
ClassicAssert.AreEqual("1234", result);
}
[Test]
public void ThousandsSeparatorTest_LargeNumber()
{
_settings.UseThousandsSeparator = false;
_settings.DecimalSeparator = DecimalSeparator.UseSystemLocale;
var result = GetCalculationResult("1000000+234567");
ClassicAssert.AreEqual("1234567", result);
}
// Basic operations
[TestCase(@"1+1", "2")]
[TestCase(@"2-1", "1")]
[TestCase(@"2*2", "4")]
[TestCase(@"4/2", "2")]
[TestCase(@"2^3", "8")]
// Decimal places
[TestCase(@"10/3", "3.3333333333")]
// Parentheses
[TestCase(@"(1+2)*3", "9")]
[TestCase(@"2^(1+2)", "8")]
// Functions
[TestCase(@"pow(2,3)", "8")]
[TestCase(@"min(1,-1,-2)", "-2")]
[TestCase(@"max(1,-1,-2)", "1")]
[TestCase(@"sqrt(16)", "4")]
[TestCase(@"sin(pi)", "0.0000000000")]
[TestCase(@"cos(0)", "1")]
[TestCase(@"tan(0)", "0")]
[TestCase(@"log10(100)", "2")]
[TestCase(@"log(100)", "2")]
[TestCase(@"log2(8)", "3")]
[TestCase(@"ln(e)", "1")]
[TestCase(@"abs(-5)", "5")]
// Constants
[TestCase(@"pi", "3.1415926536")]
// Complex expressions
[TestCase(@"(2+3)*sqrt(16)-log(100)/ln(e)", "18")]
[TestCase(@"sin(pi/2)+cos(0)+tan(0)", "2")]
// Error handling (should return empty result)
[TestCase(@"10/0", "")]
[TestCase(@"sqrt(-1)", "")]
[TestCase(@"log(0)", "")]
[TestCase(@"invalid_expression", "")]
public void CalculatorTest(string expression, string result)
{
_settings.UseThousandsSeparator = false;
_settings.DecimalSeparator = DecimalSeparator.Dot;
ClassicAssert.AreEqual(GetCalculationResult(expression), result);
}
private string GetCalculationResult(string expression)
{
var results = _plugin.Query(new Plugin.Query()
{
Search = expression
});
return results.Count > 0 ? results[0].Title : string.Empty;
}
}
}

View file

@ -16,9 +16,9 @@ namespace Flow.Launcher.Test
{">", new PluginPair {Metadata = new PluginMetadata {ActionKeywords = new List<string> {">"}}}}
};
Query q = QueryBuilder.Build("> ping google.com -n 20 -6", nonGlobalPlugins);
Query q = QueryBuilder.Build("> ping google.com -n 20 -6", "> ping google.com -n 20 -6", nonGlobalPlugins);
ClassicAssert.AreEqual("> ping google.com -n 20 -6", q.RawQuery);
ClassicAssert.AreEqual("> ping google.com -n 20 -6", q.TrimmedQuery);
ClassicAssert.AreEqual("ping google.com -n 20 -6", q.Search, "Search should not start with the ActionKeyword.");
ClassicAssert.AreEqual(">", q.ActionKeyword);
@ -39,10 +39,10 @@ namespace Flow.Launcher.Test
{">", new PluginPair {Metadata = new PluginMetadata {ActionKeywords = new List<string> {">"}, Disabled = true}}}
};
Query q = QueryBuilder.Build("> ping google.com -n 20 -6", nonGlobalPlugins);
Query q = QueryBuilder.Build("> ping google.com -n 20 -6", "> ping google.com -n 20 -6", nonGlobalPlugins);
ClassicAssert.AreEqual("> ping google.com -n 20 -6", q.Search);
ClassicAssert.AreEqual(q.Search, q.RawQuery, "RawQuery should be equal to Search.");
ClassicAssert.AreEqual(q.Search, q.TrimmedQuery, "TrimmedQuery should be equal to Search.");
ClassicAssert.AreEqual(6, q.SearchTerms.Length, "The length of SearchTerms should match.");
ClassicAssert.AreNotEqual(">", q.ActionKeyword, "ActionKeyword should not match that of a disabled plugin.");
ClassicAssert.AreEqual("ping google.com -n 20 -6", q.SecondToEndSearch, "SecondToEndSearch should be trimmed of multiple whitespace characters");
@ -51,7 +51,7 @@ namespace Flow.Launcher.Test
[Test]
public void GenericPluginQueryTest()
{
Query q = QueryBuilder.Build("file.txt file2 file3", new Dictionary<string, PluginPair>());
Query q = QueryBuilder.Build("file.txt file2 file3", "file.txt file2 file3", new Dictionary<string, PluginPair>());
ClassicAssert.AreEqual("file.txt file2 file3", q.Search);
ClassicAssert.AreEqual("", q.ActionKeyword);

View file

@ -22,19 +22,33 @@ namespace Flow.Launcher.Test
ClassicAssert.AreEqual(10, GetOriginalToTranslatedAt(mapping, 1));
}
[TestCase(0, 0)]
[TestCase(2, 1)]
[TestCase(3, 1)]
[TestCase(5, 2)]
[TestCase(6, 2)]
[TestCase(0, 0)] // "F" -> "F"
[TestCase(1, 1)] // "l" -> "l"
[TestCase(2, 2)] // "o" -> "o"
[TestCase(3, 3)] // "w" -> "w"
[TestCase(4, 4)] // " " -> " "
[TestCase(5, 5)] // "Y" (translated from "用") -> original index 5
[TestCase(6, 5)] // "o" (translated from "用") -> original index 5
[TestCase(7, 5)] // "n" (translated from "用") -> original index 5
[TestCase(8, 5)] // "g" (translated from "用") -> original index 5
[TestCase(10, 6)] // "H" (translated from "户") -> original index 6
[TestCase(11, 6)] // "u" (translated from "户") -> original index 6
public void MapToOriginalIndex_ShouldReturnExpectedIndex(int translatedIndex, int expectedOriginalIndex)
{
var mapping = new TranslationMapping();
// a测试
// a Ce Shi
mapping.AddNewIndex(0, 1);
mapping.AddNewIndex(2, 2);
mapping.AddNewIndex(5, 3);
// Test case :
// 0123456
// Flow 用户
// 012345678901
// Flow Yong Hu
mapping.AddNewIndex(0, 1); // F
mapping.AddNewIndex(1, 1); // l
mapping.AddNewIndex(2, 1); // o
mapping.AddNewIndex(3, 1); // w
mapping.AddNewIndex(4, 1); // ' '
mapping.AddNewIndex(5, 4); // 用 -> Yong
mapping.AddNewIndex(10, 2); // 户 -> Hu
var result = mapping.MapToOriginalIndex(translatedIndex);
ClassicAssert.AreEqual(expectedOriginalIndex, result);

View file

@ -47,7 +47,7 @@ namespace Flow.Launcher
if (addedActionKeywords.Any(App.API.ActionKeywordAssigned))
{
App.API.ShowMsgBox(App.API.GetTranslation("newActionKeywordsHasBeenAssigned"));
App.API.ShowMsgBox(Localize.newActionKeywordsHasBeenAssigned());
return;
}
@ -63,7 +63,7 @@ namespace Flow.Launcher
if (sortedOldActionKeywords.SequenceEqual(sortedNewActionKeywords))
{
// User just changes the sequence of action keywords
App.API.ShowMsgBox(App.API.GetTranslation("newActionKeywordsSameAsOld"));
App.API.ShowMsgBox(Localize.newActionKeywordsSameAsOld());
}
else
{

View file

@ -2,7 +2,8 @@
x:Class="Flow.Launcher.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="http://schemas.modernwpf.com/2019"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
ShutdownMode="OnMainWindowClose"
Startup="OnStartup">
<Application.Resources>
@ -10,17 +11,17 @@
<ResourceDictionary.MergedDictionaries>
<ui:ThemeResources>
<ui:ThemeResources.ThemeDictionaries>
<ResourceDictionary x:Key="Light">
<ResourceDictionary x:Key="Light" ui:ThemeDictionary.Key="Light">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Resources/Light.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
<ResourceDictionary x:Key="Dark">
<ResourceDictionary x:Key="Dark" ui:ThemeDictionary.Key="Dark">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Resources/Dark.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast">
<ResourceDictionary x:Key="HighContrast" ui:ThemeDictionary.Key="HighContrast">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Resources/Dark.xaml" />
</ResourceDictionary.MergedDictionaries>
@ -33,6 +34,15 @@
<ResourceDictionary Source="pack://application:,,,/Themes/Win11Light.xaml" />
<ResourceDictionary Source="pack://application:,,,/Languages/en.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- Override styles in UI.Modern.WPF -->
<Thickness x:Key="ListViewItemCompactSelectedBorderThemeThickness">2</Thickness>
<sys:Double x:Key="CheckBoxMinWidth">0</sys:Double>
<sys:Double x:Key="GridViewItemMinWidth">0</sys:Double>
<sys:Double x:Key="GridViewItemMinHeight">40</sys:Double>
<sys:Double x:Key="ListViewItemMinWidth">0</sys:Double>
<sys:Double x:Key="ListViewItemMinHeight">36</sys:Double>
<SolidColorBrush x:Key="NavigationViewSelectionIndicatorForeground" Color="#FF0063B1" />
</ResourceDictionary>
</Application.Resources>
</Application>

View file

@ -22,6 +22,7 @@ using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using Flow.Launcher.SettingPages.ViewModels;
using Flow.Launcher.ViewModel;
using iNKORE.UI.WPF.Modern.Common;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.VisualStudio.Threading;
@ -45,6 +46,7 @@ namespace Flow.Launcher
private static Settings _settings;
private static MainWindow _mainWindow;
private readonly MainViewModel _mainVM;
private readonly Internationalization _internationalization;
// To prevent two disposals running at the same time.
private static readonly object _disposingLock = new();
@ -55,6 +57,9 @@ namespace Flow.Launcher
public App()
{
// Do not use bitmap cache since it can cause WPF second window freezing issue
ShadowAssist.UseBitmapCache = false;
// Initialize settings
_settings.WMPInstalled = WindowsMediaPlayerHelper.IsWindowsMediaPlayerInstalled();
@ -107,6 +112,7 @@ namespace Flow.Launcher
API = Ioc.Default.GetRequiredService<IPublicAPI>();
_settings.Initialize();
_mainVM = Ioc.Default.GetRequiredService<MainViewModel>();
_internationalization = Ioc.Default.GetRequiredService<Internationalization>();
}
catch (Exception e)
{
@ -181,20 +187,23 @@ namespace Flow.Launcher
// So set to OnExplicitShutdown to prevent the application from shutting down before main window is created
Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
// Setup log level before any logging is done
Log.SetLogLevel(_settings.LogLevel);
// Update dynamic resources base on settings
Current.Resources["SettingWindowFont"] = new FontFamily(_settings.SettingWindowFont);
Current.Resources["ContentControlThemeFontFamily"] = new FontFamily(_settings.SettingWindowFont);
// Initialize notification system before any notification api is called
Notification.Install();
// Enable Win32 dark mode if the system is in dark mode before creating all windows
Win32Helper.EnableWin32DarkMode(_settings.ColorScheme);
// Initialize language before portable clean up since it needs translations
await Ioc.Default.GetRequiredService<Internationalization>().InitializeLanguageAsync();
await _internationalization.InitializeLanguageAsync();
// Clean up after portability update
Ioc.Default.GetRequiredService<Portable>().PreStartCleanUpAfterPortabilityUpdate();
API.LogInfo(ClassName, "Begin Flow Launcher startup ----------------------------------------------------");
@ -204,32 +213,25 @@ namespace Flow.Launcher
RegisterDispatcherUnhandledException();
RegisterTaskSchedulerUnhandledException();
var imageLoadertask = ImageLoader.InitializeAsync();
AbstractPluginEnvironment.PreStartPluginExecutablePathUpdate(_settings);
PluginManager.LoadPlugins(_settings.PluginSettings);
// Register ResultsUpdated event after all plugins are loaded
Ioc.Default.GetRequiredService<MainViewModel>().RegisterResultsUpdatedEvent();
var imageLoaderTask = ImageLoader.InitializeAsync();
Http.Proxy = _settings.Proxy;
// Initialize plugin manifest before initializing plugins so that they can use the manifest instantly
await API.UpdatePluginManifestAsync();
await PluginManager.InitializePluginsAsync();
// Update plugin titles after plugins are initialized with their api instances
Internationalization.UpdatePluginMetadataTranslations();
await imageLoadertask;
await imageLoaderTask;
_mainWindow = new MainWindow();
Current.MainWindow = _mainWindow;
Current.MainWindow.Title = Constant.FlowLauncher;
// Initialize Dialog Jump before hotkey mapper since hotkey mapper will register its hotkey
// Initialize Dialog Jump after main window is created so that it can access main window handle
DialogJump.InitializeDialogJump();
DialogJump.SetupDialogJump(_settings.EnableDialogJump);
// Initialize hotkey mapper instantly after main window is created because
// it will steal focus from main window which causes window hide
HotKeyMapper.Initialize();
@ -237,19 +239,43 @@ namespace Flow.Launcher
// Initialize theme for main window
Ioc.Default.GetRequiredService<Theme>().ChangeTheme();
DialogJump.InitializeDialogJump(PluginManager.GetDialogJumpExplorers(), PluginManager.GetDialogJumpDialogs());
DialogJump.SetupDialogJump(_settings.EnableDialogJump);
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
RegisterExitEvents();
AutoStartup();
AutoUpdates();
AutoPluginUpdates();
API.SaveAppAllSettings();
API.LogInfo(ClassName, "End Flow Launcher startup ----------------------------------------------------");
API.LogInfo(ClassName, "End Flow Launcher startup ------------------------------------------------------");
_ = API.StopwatchLogInfoAsync(ClassName, "Startup cost", async () =>
{
API.LogInfo(ClassName, "Begin plugin initialization ----------------------------------------------------");
AbstractPluginEnvironment.PreStartPluginExecutablePathUpdate(_settings);
PluginManager.LoadPlugins(_settings.PluginSettings);
await PluginManager.InitializePluginsAsync(_mainVM);
// Refresh the history results after plugins are initialized so that we can parse the absolute icon paths
_mainVM.RefreshLastOpenedHistoryResults();
// Refresh home page after plugins are initialized because users may open main window during plugin initialization
// And home page is created without full plugin list
if (_settings.ShowHomePage && _mainVM.QueryResultsSelected() && string.IsNullOrEmpty(_mainVM.QueryText))
{
_mainVM.QueryResults();
}
AutoPluginUpdates();
// Save all settings since we possibly update the plugin environment paths
API.SaveAppAllSettings();
API.LogInfo(ClassName, "End plugin initialization ------------------------------------------------------");
});
});
}
@ -274,7 +300,7 @@ namespace Flow.Launcher
// but if it fails (permissions, etc) then don't keep retrying
// this also gives the user a visual indication in the Settings widget
_settings.StartFlowLauncherOnSystemStartup = false;
API.ShowMsgError(API.GetTranslation("setAutoStartFailed"), e.Message);
API.ShowMsgError(Localize.setAutoStartFailed(), e.Message);
}
}
}
@ -421,6 +447,7 @@ namespace Flow.Launcher
_mainWindow?.Dispatcher.Invoke(_mainWindow.Dispose);
_mainVM?.Dispose();
DialogJump.Dispose();
_internationalization.Dispose();
}
API.LogInfo(ClassName, "End Flow Launcher dispose ----------------------------------------------------");

View file

@ -5,7 +5,7 @@ using System.Windows.Input;
namespace Flow.Launcher.Converters;
internal class BoolToIMEConversionModeConverter : IValueConverter
public class BoolToIMEConversionModeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
@ -22,7 +22,7 @@ internal class BoolToIMEConversionModeConverter : IValueConverter
}
}
internal class BoolToIMEStateConverter : IValueConverter
public class BoolToIMEStateConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{

View file

@ -0,0 +1,91 @@
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace Flow.Launcher.Converters;
public class CornerRadiusFilterConverter : DependencyObject, IValueConverter
{
public CornerRadiusFilterKind Filter { get; set; }
public double Scale { get; set; } = 1.0;
public static CornerRadius Convert(CornerRadius radius, CornerRadiusFilterKind filterKind)
{
CornerRadius result = radius;
switch (filterKind)
{
case CornerRadiusFilterKind.Top:
result.BottomLeft = 0;
result.BottomRight = 0;
break;
case CornerRadiusFilterKind.Right:
result.TopLeft = 0;
result.BottomLeft = 0;
break;
case CornerRadiusFilterKind.Bottom:
result.TopLeft = 0;
result.TopRight = 0;
break;
case CornerRadiusFilterKind.Left:
result.TopRight = 0;
result.BottomRight = 0;
break;
}
return result;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var cornerRadius = (CornerRadius)value;
var scale = Scale;
if (!double.IsNaN(scale))
{
cornerRadius.TopLeft *= scale;
cornerRadius.TopRight *= scale;
cornerRadius.BottomRight *= scale;
cornerRadius.BottomLeft *= scale;
}
var filterType = Filter;
if (filterType == CornerRadiusFilterKind.TopLeftValue ||
filterType == CornerRadiusFilterKind.BottomRightValue)
{
return GetDoubleValue(cornerRadius, filterType);
}
return Convert(cornerRadius, filterType);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
private static double GetDoubleValue(CornerRadius radius, CornerRadiusFilterKind filterKind)
{
switch (filterKind)
{
case CornerRadiusFilterKind.TopLeftValue:
return radius.TopLeft;
case CornerRadiusFilterKind.BottomRightValue:
return radius.BottomRight;
}
return 0;
}
}
public enum CornerRadiusFilterKind
{
None,
Top,
Right,
Bottom,
Left,
TopLeftValue,
BottomRightValue
}

View file

@ -0,0 +1,32 @@
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace Flow.Launcher.Converters;
public class PlacementRectangleConverter : IMultiValueConverter
{
public Thickness Margin { get; set; }
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length == 2 &&
values[0] is double width &&
values[1] is double height)
{
var margin = Margin;
var topLeft = new Point(margin.Left, margin.Top);
var bottomRight = new Point(width - margin.Right, height - margin.Bottom);
var rect = new Rect(topLeft, bottomRight);
return rect;
}
return Rect.Empty;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

View file

@ -0,0 +1,19 @@
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace Flow.Launcher.Converters;
public class SharedSizeGroupConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (Visibility)value != Visibility.Collapsed ? (string)parameter : null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

View file

@ -5,7 +5,7 @@ using System.Windows.Input;
namespace Flow.Launcher.Converters;
class StringToKeyBindingConverter : IValueConverter
public class StringToKeyBindingConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{

View file

@ -41,7 +41,7 @@ namespace Flow.Launcher
if (string.IsNullOrEmpty(Hotkey) && string.IsNullOrEmpty(ActionKeyword))
{
App.API.ShowMsgBox(App.API.GetTranslation("emptyPluginHotkey"));
App.API.ShowMsgBox(Localize.emptyPluginHotkey());
return;
}

View file

@ -40,14 +40,14 @@ namespace Flow.Launcher
{
if (string.IsNullOrEmpty(Key) || string.IsNullOrEmpty(Value))
{
App.API.ShowMsgBox(App.API.GetTranslation("emptyShortcut"));
App.API.ShowMsgBox(Localize.emptyShortcut());
return;
}
// Check if key is modified or adding a new one
if (((update && originalKey != Key) || !update) && _hotkeyVm.DoesShortcutExist(Key))
{
App.API.ShowMsgBox(App.API.GetTranslation("duplicateShortcut"));
App.API.ShowMsgBox(Localize.duplicateShortcut());
return;
}

View file

@ -37,6 +37,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<NoWarn>$(NoWarn);FLSG0007</NoWarn>
</PropertyGroup>
<Target Name="RemoveUnnecessaryRuntimesAfterBuild" AfterTargets="Build">
@ -132,27 +133,26 @@
<ItemGroup>
<PackageReference Include="ChefKeys" Version="0.1.2" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageReference Include="Fody" Version="6.9.2">
<PackageReference Include="Flow.Launcher.Localization" Version="0.0.6" />
<PackageReference Include="Fody" Version="6.9.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="iNKORE.UI.WPF.Modern" Version="0.10.1" />
<PackageReference Include="MdXaml" Version="1.27.0" />
<PackageReference Include="MdXaml.AnimatedGif" Version="1.27.0" />
<PackageReference Include="MdXaml.Html" Version="1.27.0" />
<PackageReference Include="MdXaml.Plugins" Version="1.27.0" />
<PackageReference Include="MdXaml.Svg" Version="1.27.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.7" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.7" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.9" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.9" />
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" />
<!-- ModernWpfUI v0.9.5 introduced WinRT changes that causes Notification platform unavailable error on some machines -->
<!-- https://github.com/Flow-Launcher/Flow.Launcher/issues/1772#issuecomment-1502440801 -->
<PackageReference Include="ModernWpfUI" Version="0.9.4" />
<PackageReference Include="PropertyChanged.Fody" Version="4.1.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="SemanticVersioning" Version="3.0.0" />
<PackageReference Include="TaskScheduler" Version="2.12.2" />
<PackageReference Include="VirtualizingWrapPanel" Version="2.3.0" />
<PackageReference Include="VirtualizingWrapPanel" Version="2.3.1" />
</ItemGroup>
<ItemGroup>
@ -161,6 +161,10 @@
<ProjectReference Include="..\Flow.Launcher.Plugin\Flow.Launcher.Plugin.csproj" />
</ItemGroup>
<PropertyGroup>
<FLLUseDependencyInjection>true</FLLUseDependencyInjection>
</PropertyGroup>
<ItemGroup>
<Content Include="Resources\open.wav">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
@ -181,7 +185,7 @@
</Target>
<Target Name="RemoveDuplicateAnalyzers" BeforeTargets="CoreCompile">
<!-- Work around https://github.com/dotnet/wpf/issues/6792 -->
<!-- Workaround https://github.com/dotnet/wpf/issues/6792 -->
<ItemGroup>
<FilteredAnalyzer Include="@(Analyzer-&gt;Distinct())" />
<Analyzer Remove="@(Analyzer)" />

View file

@ -1,4 +1,5 @@
using System;
using System.Diagnostics;
using System.Linq;
using System.Security.Principal;
using Flow.Launcher.Infrastructure;
@ -64,7 +65,9 @@ public class AutoStartup
if (task.Definition.Actions.FirstOrDefault() is Microsoft.Win32.TaskScheduler.Action taskAction)
{
var action = taskAction.ToString().Trim();
if (!action.Equals(Constant.ExecutablePath, StringComparison.OrdinalIgnoreCase))
var needsRecreation = !action.Equals(Constant.ExecutablePath, StringComparison.OrdinalIgnoreCase)
|| task.Definition.Settings.Priority != ProcessPriorityClass.Normal;
if (needsRecreation)
{
UnscheduleLogonTask();
ScheduleLogonTask();
@ -184,6 +187,7 @@ public class AutoStartup
td.Settings.StopIfGoingOnBatteries = false;
td.Settings.DisallowStartIfOnBatteries = false;
td.Settings.ExecutionTimeLimit = TimeSpan.Zero;
td.Settings.Priority = ProcessPriorityClass.Normal;
try
{

View file

@ -0,0 +1,33 @@
using System.Windows;
using System.Windows.Controls;
namespace Flow.Launcher.Helper;
public static class BorderHelper
{
#region Child
public static readonly DependencyProperty ChildProperty =
DependencyProperty.RegisterAttached(
"Child",
typeof(UIElement),
typeof(BorderHelper),
new PropertyMetadata(default(UIElement), OnChildChanged));
public static UIElement GetChild(Border border)
{
return (UIElement)border.GetValue(ChildProperty);
}
public static void SetChild(Border border, UIElement value)
{
border.SetValue(ChildProperty, value);
}
private static void OnChildChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((Border)d).Child = (UIElement)e.NewValue;
}
#endregion
}

View file

@ -16,6 +16,15 @@ public static class ErrorReporting
var logger = LogManager.GetLogger(methodName);
logger.Fatal(ExceptionFormatter.FormatExcpetion(e));
if (silent) return;
// Workaround for issue https://github.com/Flow-Launcher/Flow.Launcher/issues/4016
// The crash occurs in PresentationFramework.dll, not necessarily when the Runner UI is visible, originating from this line:
// https://github.com/dotnet/wpf/blob/3439f20fb8c685af6d9247e8fd2978cac42e74ac/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Shell/WindowChromeWorker.cs#L1005
// Many bug reports because users see the "Error report UI" after the crash with System.Runtime.InteropServices.COMException 0xD0000701 or 0x80263001.
// However, displaying this "Error report UI" during WPF crashes, especially when DWM composition is changing, is not ideal; some users reported it hangs for up to a minute before the it appears.
// This change modifies the behavior to log the exception instead of showing the "Error report UI".
if (ExceptionHelper.IsRecoverableDwmCompositionException(e)) return;
var reportWindow = new ReportWindow(e);
reportWindow.Show();
}

View file

@ -0,0 +1,42 @@
// This is a direct copy of the file at https://github.com/microsoft/PowerToys/blob/main/src/modules/launcher/PowerLauncher/Helper/ExceptionHelper.cs and adapted for flow.
using System;
using System.Runtime.InteropServices;
namespace Flow.Launcher.Helper;
internal static class ExceptionHelper
{
private const string PresentationFrameworkExceptionSource = "PresentationFramework";
private const int DWM_E_COMPOSITIONDISABLED = unchecked((int)0x80263001);
// HRESULT for NT STATUS STATUS_MESSAGE_LOST (0xC0000701 | 0x10000000 == 0xD0000701)
private const int STATUS_MESSAGE_LOST_HR = unchecked((int)0xD0000701);
/// <summary>
/// Returns true if the exception is a recoverable DWM composition exception.
/// </summary>
internal static bool IsRecoverableDwmCompositionException(Exception exception)
{
if (exception is not COMException comException)
{
return false;
}
if (comException.HResult is DWM_E_COMPOSITIONDISABLED)
{
return true;
}
if (comException.HResult is STATUS_MESSAGE_LOST_HR && comException.Source == PresentationFrameworkExceptionSource)
{
return true;
}
// Check for common DWM composition changed patterns in the stack trace
var stackTrace = comException.StackTrace;
return !string.IsNullOrEmpty(stackTrace) &&
stackTrace.Contains("DwmCompositionChanged", StringComparison.OrdinalIgnoreCase);
}
}

View file

@ -61,8 +61,8 @@ internal static class HotKeyMapper
string.Format("|HotkeyMapper.SetWithChefKeys|Error registering hotkey: {0} \nStackTrace:{1}",
e.Message,
e.StackTrace));
string errorMsg = string.Format(App.API.GetTranslation("registerHotkeyFailed"), hotkeyStr);
string errorMsgTitle = App.API.GetTranslation("MessageBoxTitle");
string errorMsg = Localize.registerHotkeyFailed(hotkeyStr);
string errorMsgTitle = Localize.MessageBoxTitle();
App.API.ShowMsgBox(errorMsg, errorMsgTitle);
}
}
@ -87,8 +87,8 @@ internal static class HotKeyMapper
e.Message,
e.StackTrace,
hotkeyStr));
string errorMsg = string.Format(App.API.GetTranslation("registerHotkeyFailed"), hotkeyStr);
string errorMsgTitle = App.API.GetTranslation("MessageBoxTitle");
string errorMsg = Localize.registerHotkeyFailed(hotkeyStr);
string errorMsgTitle = Localize.MessageBoxTitle();
App.API.ShowMsgBox(errorMsg, errorMsgTitle);
}
}
@ -112,8 +112,8 @@ internal static class HotKeyMapper
string.Format("|HotkeyMapper.RemoveHotkey|Error removing hotkey: {0} \nStackTrace:{1}",
e.Message,
e.StackTrace));
string errorMsg = string.Format(App.API.GetTranslation("unregisterHotkeyFailed"), hotkeyStr);
string errorMsgTitle = App.API.GetTranslation("MessageBoxTitle");
string errorMsg = Localize.unregisterHotkeyFailed(hotkeyStr);
string errorMsgTitle = Localize.MessageBoxTitle();
App.API.ShowMsgBox(errorMsg, errorMsgTitle);
}
}
@ -143,6 +143,8 @@ internal static class HotKeyMapper
return;
App.API.ShowMainWindow();
// Make sure to go back to the query results page first since it can cause issues if current page is context menu
App.API.BackToQueryResults();
App.API.ChangeQuery(hotkey.ActionKeyword, true);
});
}

View file

@ -0,0 +1,45 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Flow.Launcher.Core.Plugin;
using Flow.Launcher.Plugin;
using Flow.Launcher.Storage;
namespace Flow.Launcher.Helper;
#nullable enable
public static class ResultHelper
{
public static async Task<Result?> PopulateResultsAsync(LastOpenedHistoryResult item)
{
return await PopulateResultsAsync(item.PluginID, item.Query, item.Title, item.SubTitle, item.RecordKey);
}
public static async Task<Result?> PopulateResultsAsync(string pluginId, string trimmedQuery, string title, string subTitle, string recordKey)
{
var plugin = PluginManager.GetPluginForId(pluginId);
if (plugin == null) return null;
var query = QueryBuilder.Build(trimmedQuery, trimmedQuery, PluginManager.GetNonGlobalPlugins());
if (query == null) return null;
try
{
var freshResults = await PluginManager.QueryForPluginAsync(plugin, query, CancellationToken.None);
// Try to match by record key first if it is valid, otherwise fall back to title + subtitle match
if (string.IsNullOrEmpty(recordKey))
{
return freshResults?.FirstOrDefault(r => r.Title == title && r.SubTitle == subTitle);
}
else
{
return freshResults?.FirstOrDefault(r => r.RecordKey == recordKey) ??
freshResults?.FirstOrDefault(r => r.Title == title && r.SubTitle == subTitle);
}
}
catch (System.Exception e)
{
App.API.LogException(nameof(ResultHelper), $"Failed to query results for {plugin.Metadata.Name}", e);
return null;
}
}
}

View file

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
@ -16,7 +17,7 @@ public static class WallpaperPathRetrieval
private const int MaxCacheSize = 3;
private static readonly Dictionary<(string, DateTime), ImageBrush> WallpaperCache = new();
private static readonly object CacheLock = new();
private static readonly Lock CacheLock = new();
public static Brush GetWallpaperBrush()
{
@ -31,7 +32,7 @@ public static class WallpaperPathRetrieval
var wallpaperPath = Win32Helper.GetWallpaperPath();
if (string.IsNullOrEmpty(wallpaperPath) || !File.Exists(wallpaperPath))
{
App.API.LogInfo(ClassName, $"Wallpaper path is invalid: {wallpaperPath}");
App.API.LogError(ClassName, $"Wallpaper path is invalid: {wallpaperPath}");
var wallpaperColor = GetWallpaperColor();
return new SolidColorBrush(wallpaperColor);
}
@ -47,17 +48,22 @@ public static class WallpaperPathRetrieval
return cachedWallpaper;
}
}
using var fileStream = File.OpenRead(wallpaperPath);
var decoder = BitmapDecoder.Create(fileStream, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
var frame = decoder.Frames[0];
var originalWidth = frame.PixelWidth;
var originalHeight = frame.PixelHeight;
int originalWidth, originalHeight;
// Use `using ()` instead of `using var` sentence here to ensure the wallpaper file is not locked
using (var fileStream = File.OpenRead(wallpaperPath))
{
var decoder = BitmapDecoder.Create(fileStream, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
var frame = decoder.Frames[0];
originalWidth = frame.PixelWidth;
originalHeight = frame.PixelHeight;
}
if (originalWidth == 0 || originalHeight == 0)
{
App.API.LogInfo(ClassName, $"Failed to load bitmap: Width={originalWidth}, Height={originalHeight}");
return new SolidColorBrush(Colors.Transparent);
App.API.LogError(ClassName, $"Failed to load bitmap: Width={originalWidth}, Height={originalHeight}");
var wallpaperColor = GetWallpaperColor();
return new SolidColorBrush(wallpaperColor);
}
// Calculate the scaling factor to fit the image within 800x600 while preserving aspect ratio
@ -70,7 +76,9 @@ public static class WallpaperPathRetrieval
// Set DecodePixelWidth and DecodePixelHeight to resize the image while preserving aspect ratio
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad; // Use OnLoad to ensure the wallpaper file is not locked
bitmap.UriSource = new Uri(wallpaperPath);
bitmap.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
bitmap.DecodePixelWidth = decodedPixelWidth;
bitmap.DecodePixelHeight = decodedPixelHeight;
bitmap.EndInit();
@ -104,13 +112,13 @@ public static class WallpaperPathRetrieval
private static Color GetWallpaperColor()
{
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Colors", false);
using var key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Colors", false);
var result = key?.GetValue("Background", null);
if (result is string strResult)
{
try
{
var parts = strResult.Trim().Split(new[] { ' ' }, 3).Select(byte.Parse).ToList();
var parts = strResult.Trim().Split([' '], 3).Select(byte.Parse).ToList();
return Color.FromRgb(parts[0], parts[1], parts[2]);
}
catch (Exception ex)

View file

@ -1,4 +1,4 @@
using System.Collections.ObjectModel;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
@ -234,7 +234,7 @@ namespace Flow.Launcher
private static bool CheckHotkeyAvailability(HotkeyModel hotkey, bool validateKeyGesture) =>
hotkey.Validate(validateKeyGesture) && HotKeyMapper.CheckAvailability(hotkey);
public string EmptyHotkey => App.API.GetTranslation("none");
public string EmptyHotkey => Localize.none();
public ObservableCollection<string> KeysToDisplay { get; set; } = new();

View file

@ -2,7 +2,7 @@
x:Class="Flow.Launcher.HotkeyControlDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="http://schemas.modernwpf.com/2019"
xmlns:ui="http://schemas.inkore.net/lib/ui/wpf/modern"
Background="{DynamicResource PopuBGColor}"
BorderBrush="{DynamicResource PopupButtonAreaBorderColor}"
BorderThickness="0 1 0 0"

View file

@ -9,7 +9,7 @@ using Flow.Launcher.Helper;
using Flow.Launcher.Infrastructure.Hotkey;
using Flow.Launcher.Infrastructure.UserSettings;
using Flow.Launcher.Plugin;
using ModernWpf.Controls;
using iNKORE.UI.WPF.Modern.Controls;
namespace Flow.Launcher;
@ -33,7 +33,7 @@ public partial class HotkeyControlDialog : ContentDialog
public EResultType ResultType { get; private set; } = EResultType.Cancel;
public string ResultValue { get; private set; } = string.Empty;
public static string EmptyHotkey => App.API.GetTranslation("none");
public static string EmptyHotkey => Localize.none();
private static bool isOpenFlowHotkey;
@ -41,7 +41,7 @@ public partial class HotkeyControlDialog : ContentDialog
{
WindowTitle = windowTitle switch
{
"" or null => App.API.GetTranslation("hotkeyRegTitle"),
"" or null => Localize.hotkeyRegTitle(),
_ => windowTitle
};
DefaultHotkey = defaultHotkey;
@ -146,10 +146,7 @@ public partial class HotkeyControlDialog : ContentDialog
Alert.Visibility = Visibility.Visible;
if (registeredHotkeyData.RemoveHotkey is not null)
{
tbMsg.Text = string.Format(
App.API.GetTranslation("hotkeyUnavailableEditable"),
description
);
tbMsg.Text = Localize.hotkeyUnavailableEditable(description);
SaveBtn.IsEnabled = false;
SaveBtn.Visibility = Visibility.Collapsed;
OverwriteBtn.IsEnabled = true;
@ -158,10 +155,7 @@ public partial class HotkeyControlDialog : ContentDialog
}
else
{
tbMsg.Text = string.Format(
App.API.GetTranslation("hotkeyUnavailableUneditable"),
description
);
tbMsg.Text = Localize.hotkeyUnavailableUneditable(description);
SaveBtn.IsEnabled = false;
SaveBtn.Visibility = Visibility.Visible;
OverwriteBtn.IsEnabled = false;
@ -175,7 +169,7 @@ public partial class HotkeyControlDialog : ContentDialog
if (!CheckHotkeyAvailability(hotkey.Value, true))
{
tbMsg.Text = App.API.GetTranslation("hotkeyUnavailable");
tbMsg.Text = Localize.hotkeyUnavailable();
Alert.Visibility = Visibility.Visible;
SaveBtn.IsEnabled = false;
SaveBtn.Visibility = Visibility.Visible;

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">إعادة تعيين الموقع</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</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="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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">الإعدادات</system:String>
@ -75,6 +79,8 @@
<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="setAutoStartFailed">خطأ في إعداد التشغيل عند بدء التشغيل</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">إخفاء Flow Launcher عند فقدان التركيز</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="dontPromptUpdateMsg">عدم عرض إشعارات الإصدار الجديد</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">تذكر آخر موقع</system:String>
@ -171,6 +177,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">الإصدار</system:String>
<system:String x:Key="plugin_query_web">الموقع الإلكتروني</system:String>
<system:String x:Key="plugin_uninstall">إلغاء التثبيت</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -443,7 +459,7 @@
<system:String x:Key="icons">الأيقونات</system:String>
<system:String x:Key="about_activate_times">لقد قمت بتفعيل Flow Launcher {0} مرات</system:String>
<system:String x:Key="checkUpdates">التحقق من التحديثات</system:String>
<system:String x:Key="BecomeASponsor">كن راعيا</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">الإصدار الجديد {0} متاح، هل ترغب في إعادة تشغيل Flow Launcher لاستخدام التحديث</system:String>
<system:String x:Key="checkUpdatesFailed">فشل التحقق من التحديثات، يرجى التحقق من الاتصال وإعدادات البروكسي لـ api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">فتح المجلد</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">خطأ</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">حجة للملف</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">متصفح الويب الافتراضي</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">نافذة جديدة</system:String>
<system:String x:Key="defaultBrowser_newTab">تبويب جديد</system:String>
<system:String x:Key="defaultBrowser_parameter">الوضع الخاص</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">تغيير الأولوية</system:String>
@ -589,8 +610,9 @@
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">خطأ</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">يرجى الانتظار...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Obnovit pozici</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</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="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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Nastavení</system:String>
@ -75,6 +79,8 @@
<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="setAutoStartFailed">Při nastavování spouštění došlo k chybě</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Skrýt Flow Launcher při vykliknutí</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="dontPromptUpdateMsg">Nezobrazovat oznámení o nové verzi</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Zapamatovat poslední pozici</system:String>
@ -171,6 +177,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Verze</system:String>
<system:String x:Key="plugin_query_web">Webová stránka</system:String>
<system:String x:Key="plugin_uninstall">Odinstalovat</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Ikony</system:String>
<system:String x:Key="about_activate_times">Flow Launcher byl aktivován {0} krát</system:String>
<system:String x:Key="checkUpdates">Zkontrolovat Aktualizace</system:String>
<system:String x:Key="BecomeASponsor">Staňte se sponzorem</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Je k dispozici nová verze {0}, chcete Flow Launcher restartovat, aby se mohl aktualizovat?</system:String>
<system:String x:Key="checkUpdatesFailed">Hledání aktualizací se nezdařilo, zkontrolujte prosím své internetové připojení a nastavení proxy serveru k api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Open Folder</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Chyba</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Argumenty pro Soubor</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Výchozí prohlížeč</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">Nové okno</system:String>
<system:String x:Key="defaultBrowser_newTab">Nová karta</system:String>
<system:String x:Key="defaultBrowser_parameter">Soukromý režim</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Změnit prioritu</system:String>
@ -589,8 +610,9 @@ Pokud před zkratku při zadávání přidáte znak &quot;@&quot;, bude odpovíd
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">Chyba</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Počkejte prosím...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Position Reset</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</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="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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Indstillinger</system:String>
@ -75,6 +79,8 @@
<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="setAutoStartFailed">Error setting launch on startup</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Skjul Flow Launcher ved mistet fokus</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="dontPromptUpdateMsg">Vis ikke notifikationer om nye versioner</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String>
@ -171,6 +177,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Version</system:String>
<system:String x:Key="plugin_query_web">Hjemmeside</system:String>
<system:String x:Key="plugin_uninstall">Uninstall</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">Du har aktiveret Flow Launcher {0} gange</system:String>
<system:String x:Key="checkUpdates">Tjek for opdateringer</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Ny version {0} er tilgængelig, genstart venligst Flow Launcher</system:String>
<system:String x:Key="checkUpdatesFailed">Check updates failed, please check your connection and proxy settings to api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Open Folder</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Error</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Arg for fil</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Default Web Browser</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">New Window</system:String>
<system:String x:Key="defaultBrowser_newTab">New Tab</system:String>
<system:String x:Key="defaultBrowser_parameter">Privattilstand</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Skift prioritet</system:String>
@ -589,8 +610,9 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">Error</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Please wait...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Zurücksetzen der Position</system:String>
<system:String x:Key="PositionResetToolTip">Position des Suchfensters zurücksetzen</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Zum Suchen hier tippen</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Einstellungen</system:String>
@ -75,6 +79,8 @@
<system:String x:Key="useLogonTaskForStartupTooltip">Nach der Deinstallation müssen Sie diese Aufgabe (Flow.Launcher Startup) via Task-Scheduler manuell entfernen</system:String>
<system:String x:Key="setAutoStartFailed">Fehler bei Einstellungsstart beim Start</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Flow Launcher ausblenden, wenn Fokus verloren geht</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="dontPromptUpdateMsg">Versionsbenachrichtigungen nicht zeigen</system:String>
<system:String x:Key="SearchWindowPosition">Ort des Suchfensters</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Letzte Position merken</system:String>
@ -171,6 +177,10 @@
<system:String x:Key="homePageToolTip">Ergebnisse der Homepage zeigen, wenn Abfragetext leer ist.</system:String>
<system:String x:Key="historyResultsForHomePage">Historie-Ergebnisse auf Homepage zeigen</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximal gezeigte Historie-Ergebnisse auf Homepage</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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">Dies kann nur bearbeitet werden, wenn das Plug-in das Home-Feature unterstützt und die Homepage aktiviert ist.</system:String>
<system:String x:Key="showAtTopmost">Suchfenster an vorderster zeigen</system:String>
<system:String x:Key="showAtTopmostToolTip">Setzt die Einstellung 'Immer im Vordergrund' anderer Programme außer Kraft und zeigt Flow in der vordersten Position an.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Version</system:String>
<system:String x:Key="plugin_query_web">Website</system:String>
<system:String x:Key="plugin_uninstall">Deinstallieren</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Plug-in-Einstellungen können nicht entfernt werden</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plug-ins: {0} - Plug-in-Einstellungsdateien können nicht entfernt werden, bitte entfernen Sie diese manuell</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Plug-in-Cache kann nicht entfernt werden</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">Sie haben Flow Launcher {0} mal aktiviert</system:String>
<system:String x:Key="checkUpdates">Nach Updates suchen</system:String>
<system:String x:Key="BecomeASponsor">Ein Sponsor werden</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Neue Version {0} ist verfügbar. Möchten Sie Flow Launcher neu starten, um das Update zu verwenden?</system:String>
<system:String x:Key="checkUpdatesFailed">Überprüfung der Updates fehlgeschlagen. Bitte überprüfen Sie Ihre Verbindungs- und Proxy-Einstellungen zu api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Ordner öffnen</system:String>
<system:String x:Key="advanced">Erweitert</system:String>
<system:String x:Key="logLevel">Log-Ebene</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Fehler</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Einstellung der Fensterschriftart</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Arg For File</system:String>
<system:String x:Key="fileManagerPathNotFound">Der Dateimanager '{0}' konnte nicht unter '{1}' gefunden werden. Möchten Sie fortfahren?</system:String>
<system:String x:Key="fileManagerPathError">Pfadfehler bei Dateimanager</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Webbrowser per Default</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">Neues Fenster</system:String>
<system:String x:Key="defaultBrowser_newTab">Neuer Tab</system:String>
<system:String x:Key="defaultBrowser_parameter">Privater Modus</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Priorität ändern</system:String>
@ -589,8 +610,9 @@ Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt die
Der spezifizierte Dateimanager konnte nicht gefunden werden. Bitte überprüfen Sie die Einstellung des benutzerdefinierten Dateimanagers unter Einstellungen &gt; Allgemein.
</system:String>
<system:String x:Key="errorTitle">Fehler</system:String>
<system:String x:Key="folderOpenError">Beim Öffnen des Ordners ist ein Fehler aufgetreten. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">Beim Öffnen der URL im Browser ist ein Fehler aufgetreten. Bitte überprüfen Sie die Konfiguration Ihres Default-Webbrowsers im Abschnitt „Allgemein“ des Einstellungsfensters</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Bitte warten Sie ...</system:String>

View file

@ -66,6 +66,10 @@
<system:String x:Key="PositionReset">Position Reset</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</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="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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Settings</system:String>
@ -77,6 +81,8 @@
<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="setAutoStartFailed">Error setting launch on startup</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Hide Flow Launcher when focus is lost</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="dontPromptUpdateMsg">Do not show new version notifications</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String>
@ -166,6 +172,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -209,6 +219,8 @@
<system:String x:Key="plugin_query_version">Version</system:String>
<system:String x:Key="plugin_query_web">Website</system:String>
<system:String x:Key="plugin_uninstall">Uninstall</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -219,6 +231,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -438,7 +454,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">You have activated Flow Launcher {0} times</system:String>
<system:String x:Key="checkUpdates">Check for Updates</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">New version {0} is available, would you like to restart Flow Launcher to use the update?</system:String>
<system:String x:Key="checkUpdatesFailed">Check updates failed, please check your connection and proxy settings to api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -462,8 +478,10 @@
<system:String x:Key="userdatapathButton">Open Folder</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Error</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -485,6 +503,7 @@
<system:String x:Key="fileManager_file_arg">Arg For File</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Default Web Browser</system:String>
@ -495,6 +514,8 @@
<system:String x:Key="defaultBrowser_newWindow">New Window</system:String>
<system:String x:Key="defaultBrowser_newTab">New Tab</system:String>
<system:String x:Key="defaultBrowser_parameter">Private Mode</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Change Priority</system:String>
@ -582,8 +603,9 @@
The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
</system:String>
<system:String x:Key="errorTitle">Error</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Please wait...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Position Reset</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</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="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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Ajustes</system:String>
@ -75,6 +79,8 @@
<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="setAutoStartFailed">Error setting launch on startup</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Ocultar Flow Launcher cuando se pierde el enfoque</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="dontPromptUpdateMsg">No mostrar notificaciones de nuevas versiones</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String>
@ -171,6 +177,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Versión</system:String>
<system:String x:Key="plugin_query_web">Sitio web</system:String>
<system:String x:Key="plugin_uninstall">Uninstall</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">Has activado Flow Launcher {0} veces</system:String>
<system:String x:Key="checkUpdates">Buscar actualizaciones</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">La nueva versión {0} está disponible, ¿desea reiniciar Flow Launcher para usar la actualización?</system:String>
<system:String x:Key="checkUpdatesFailed">Falló la comprobación de actualizaciones, compruebe su conexión y configuración de proxy a api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Open Folder</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Error</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Arg para Archivo</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Navegador Web Predeterminado</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">Nueva Ventana</system:String>
<system:String x:Key="defaultBrowser_newTab">Nueva Pestaña</system:String>
<system:String x:Key="defaultBrowser_parameter">Modo Privado</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Cambiar Prioridad</system:String>
@ -589,8 +610,9 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">Error</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Por favor espere...</system:String>

View file

@ -24,8 +24,8 @@
<system:String x:Key="userDataDuplicated">Flow Launcher ha detectado que los datos de usario existen tanto en {0} como en {1}. {2}{2}Por favor, elimine {1} para continuar. No se han producido cambios.</system:String>
<!-- Plugin Loader -->
<system:String x:Key="pluginHasErrored">El siguiente complemento ha sufrido un error y no puede cargarse:</system:String>
<system:String x:Key="pluginsHaveErrored">Los siguientes complementos han sufrido un error y no pueden cargarse:</system:String>
<system:String x:Key="pluginHasErrored">El siguiente complemento ha sufrido un fallo y no se puede cargar:</system:String>
<system:String x:Key="pluginsHaveErrored">Los siguientes complementos han sufrido un fallo y no se pueden cargar:</system:String>
<system:String x:Key="referToLogs">Por favor, consulte los registros para más información</system:String>
<!-- Http -->
@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Restablecer posición</system:String>
<system:String x:Key="PositionResetToolTip">Restablece la posición de la ventana de búsqueda</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Escribir aquí para buscar</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Este complemento aún se está inicializando...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Seleccione este resultado para volver a realizar la consulta</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: ¡No se ha recibido respuesta!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Seleccione este resultado para más información</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Configuración</system:String>
@ -75,6 +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">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>
@ -171,6 +177,10 @@
<system:String x:Key="homePageToolTip">Muestra los resultados de la página de inicio cuando el texto de la consulta está vacío.</system:String>
<system:String x:Key="historyResultsForHomePage">Mostrar historial de resultados en la página de inicio</system:String>
<system:String x:Key="historyResultsCountForHomePage">Número máximo de resultados del historial en la página de inicio</system:String>
<system:String x:Key="historyStyle">Estilo del historial</system:String>
<system:String x:Key="historyStyleTooltip">Elija el tipo de historial que desea mostrar en el historial y la página de inicio</system:String>
<system:String x:Key="queryHistory">Historial de consultas</system:String>
<system:String x:Key="executedHistory">Historial de últimas aperturas</system:String>
<system:String x:Key="homeToggleBoxToolTip">Esto solo se puede editar si el complemento soporta la función de Inicio y la Página de Inicio está activada.</system:String>
<system:String x:Key="showAtTopmost">Mostrar ventana de búsqueda en primer plano</system:String>
<system:String x:Key="showAtTopmostToolTip">Anula el ajuste «Siempre arriba» de otros programas y muestra Flow en primer plano.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Versión</system:String>
<system:String x:Key="plugin_query_web">Sitio web</system:String>
<system:String x:Key="plugin_uninstall">Desinstalar</system:String>
<system:String x:Key="plugin_default_search_delay_time">Tiempo de retardo de búsqueda: predeterminado</system:String>
<system:String x:Key="plugin_search_delay_time">Tiempo de retardo de búsqueda: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fallo al eliminar la configuración del complemento</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Complementos: {0} - Fallo al eliminar los archivos de configuración del complemento, por favor elimínelos manualmente</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fallo al eliminar la caché del complemento</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fallo al desinstalar {0}</system:String>
<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>
@ -332,7 +348,7 @@
<system:String x:Key="PlaceholderTextTip">Cambia el texto del marcador de posición. La entrada vacía utilizará: {0}</system:String>
<system:String x:Key="KeepMaxResults">Tamaño fijo de la ventana</system:String>
<system:String x:Key="KeepMaxResultsToolTip">El tamaño de la ventana no se puede ajustar mediante arrastre.</system:String>
<system:String x:Key="MaxShowResultsCannotWorkWithAlwaysPreview">Since Always Preview is on, maximum results shown may not take effect because preview panel requires a certain minimum height</system:String>
<system:String x:Key="MaxShowResultsCannotWorkWithAlwaysPreview">Dado que la vista previa está siempre activada, es posible que no se muestren los resultados máximos, ya que el panel de vista previa requiere una altura mínima determinada</system:String>
<!-- Setting Hotkey -->
<system:String x:Key="hotkey">Atajo de teclado</system:String>
@ -395,7 +411,7 @@
<system:String x:Key="showBadges">Mostrar distintivos en resultados</system:String>
<system:String x:Key="showBadgesToolTip">Para los complementos compatibles, se muestran distintivos que ayudan a distinguirlos más fácilmente.</system:String>
<system:String x:Key="showBadgesGlobalOnly">Mostrar distintivos en resultados solo para consulta global</system:String>
<system:String x:Key="showBadgesGlobalOnlyToolTip">Mostrar distintivos solo para los resultados de consultas globales</system:String>
<system:String x:Key="showBadgesGlobalOnlyToolTip">Muestra distintivos solo para los resultados de consultas globales</system:String>
<system:String x:Key="dialogJumpHotkey">Salto de diálogo</system:String>
<system:String x:Key="dialogJumpHotkeyToolTip">Introducir atajo de teclado para acceder rápidamente a la ventana de diálogo Abrir/Guardar como en la ruta del administrador de archivos actual.</system:String>
<system:String x:Key="dialogJump">Salto de diálogo</system:String>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Iconos</system:String>
<system:String x:Key="about_activate_times">Ha activado Flow Launcher {0} veces</system:String>
<system:String x:Key="checkUpdates">Buscar actualizaciones</system:String>
<system:String x:Key="BecomeASponsor">Hágase Patrocinador</system:String>
<system:String x:Key="BecomeASponsor">Conviértase en Patrocinador</system:String>
<system:String x:Key="newVersionTips">La nueva versión {0} está disponible, ¿desea reiniciar Flow Launcher para actualizar?</system:String>
<system:String x:Key="checkUpdatesFailed">Ha fallado la comprobación de las actualizaciones, por favor, compruebe la configuración de su proxy y conexión a api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Abrir carpeta</system:String>
<system:String x:Key="advanced">Avanzado</system:String>
<system:String x:Key="logLevel">Nivel de registro</system:String>
<system:String x:Key="LogLevelDEBUG">Depuración</system:String>
<system:String x:Key="LogLevelNONE">Silencioso</system:String>
<system:String x:Key="LogLevelERROR">Error</system:String>
<system:String x:Key="LogLevelINFO">Información</system:String>
<system:String x:Key="LogLevelDEBUG">Depuración</system:String>
<system:String x:Key="settingWindowFontTitle">Configuración de fuente de la ventana</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Argumentos del archivo</system:String>
<system:String x:Key="fileManagerPathNotFound">El administrador de archivos '{0}' no pudo ser localizado en '{1}'. ¿Desea continuar?</system:String>
<system:String x:Key="fileManagerPathError">Error de ruta del administrador de archivos</system:String>
<system:String x:Key="fileManagerExplorer">Explorador de archivos</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Navegador web predeterminado</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">Nueva ventana</system:String>
<system:String x:Key="defaultBrowser_newTab">Nueva pestaña</system:String>
<system:String x:Key="defaultBrowser_parameter">Modo privado</system:String>
<system:String x:Key="defaultBrowser_default">Predeterminado</system:String>
<system:String x:Key="defaultBrowser_new_profile">Nuevo perfil</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Cambiar la prioridad</system:String>
@ -589,8 +610,9 @@ Si añade un prefijo &quot;@&quot; al introducir un acceso directo, éste coinci
No se ha encontrado el administrador de archivos especificado. Compruebe la configuración del Administrador de archivos personalizado en Configuración &gt; General.
</system:String>
<system:String x:Key="errorTitle">Error</system:String>
<system:String x:Key="folderOpenError">Se ha producido un error al abrir la carpeta. {0}</system:String>
<system:String x:Key="folderOpenError">Se ha producido un error al abrir la carpeta.</system:String>
<system:String x:Key="browserOpenError">Se ha producido un error al abrir la URL en el navegador. Por favor, compruebe la configuración de su navegador web predeterminado en la sección General de la ventana de configuración</system:String>
<system:String x:Key="fileNotFoundError">No se encuentra el archivo o directorio: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Por favor espere...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Réinitialiser la position</system:String>
<system:String x:Key="PositionResetToolTip">Réinitialiser la position de la fenêtre de recherche</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Tapez ici pour rechercher</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Ce plugin est toujours en cours d'initialisation...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Sélectionner ce résultat pour la requête</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Ne répond pas !</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Sélectionnez ce résultat pour plus d'informations</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Paramètres</system:String>
@ -75,6 +79,8 @@
<system:String x:Key="useLogonTaskForStartupTooltip">Après une désinstallation, vous devez supprimer manuellement cette tâche (Flow.Launcher Startup) via le planificateur de tâches</system:String>
<system:String x:Key="setAutoStartFailed">Erreur lors de la configuration du lancement au démarrage</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Cacher Flow Launcher lors de la perte de focus</system:String>
<system:String x:Key="showTaskbarWhenOpened">Afficher la barre des tâches lorsque Flow Launcher est ouvert</system:String>
<system:String x:Key="showTaskbarWhenOpenedToolTip">Afficher temporairement la barre des tâches lorsque Flow Launcher est ouvert, utile pour les barres de tâches auto-masquées.</system:String>
<system:String x:Key="dontPromptUpdateMsg">Ne pas afficher le message de mise à jour pour les nouvelles versions</system:String>
<system:String x:Key="SearchWindowPosition">Emplacement de la fenêtre de recherche</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Se souvenir de la dernière position</system:String>
@ -171,6 +177,10 @@
<system:String x:Key="homePageToolTip">Afficher les résultats de la page d'accueil lorsque le texte de la requête est vide.</system:String>
<system:String x:Key="historyResultsForHomePage">Afficher les résultats de l'historique sur la page d'accueil</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximum de résultats de l'historique affichés sur la page d'accueil</system:String>
<system:String x:Key="historyStyle">Style d'historique</system:String>
<system:String x:Key="historyStyleTooltip">Choisissez le type d'historique à afficher dans l'historique et la page d'accueil</system:String>
<system:String x:Key="queryHistory">Historique des requêtes</system:String>
<system:String x:Key="executedHistory">Historique des dernières ouvertures</system:String>
<system:String x:Key="homeToggleBoxToolTip">Ceci ne peut être édité que si le plugin prend en charge la fonction Accueil et que la page d'accueil est activée.</system:String>
<system:String x:Key="showAtTopmost">Afficher la fenêtre de recherche en premier plan</system:String>
<system:String x:Key="showAtTopmostToolTip">Outrepasse le paramètre 'toujours en premier plan' des autres programmes et affiche Flow Launcher en première position.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Version</system:String>
<system:String x:Key="plugin_query_web">Site Web</system:String>
<system:String x:Key="plugin_uninstall">Désinstaller</system:String>
<system:String x:Key="plugin_default_search_delay_time">Délai de recherche : par défaut</system:String>
<system:String x:Key="plugin_search_delay_time">Délai de recherche : {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Échec de la suppression des paramètres du plugin</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins : {0} - Échec de la suppression des fichiers de configuration des plugins, veuillez les supprimer manuellement</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Échec de la suppression du cache du plugin</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Échec de la désinstallation de {0}</system:String>
<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>
@ -396,24 +412,24 @@
<system:String x:Key="showBadgesToolTip">Pour les plugins pris en charge, des badges sont affichés afin de les distinguer plus facilement.</system:String>
<system:String x:Key="showBadgesGlobalOnly">Afficher les badges de résultats pour la requête globale uniquement</system:String>
<system:String x:Key="showBadgesGlobalOnlyToolTip">Afficher les badges pour les résultats des requêtes globales uniquement</system:String>
<system:String x:Key="dialogJumpHotkey">Dialog Jump</system:String>
<system:String x:Key="dialogJumpHotkey">Saut de dialogue</system:String>
<system:String x:Key="dialogJumpHotkeyToolTip">Entrez le raccourci pour naviguer rapidement dans la fenêtre de dialogue Ouvrir/Enregistrer sous, vers le chemin du gestionnaire de fichiers actuel.</system:String>
<system:String x:Key="dialogJump">Dialog Jump</system:String>
<system:String x:Key="dialogJump">Saut de dialogue</system:String>
<system:String x:Key="dialogJumpToolTip">Lorsque la fenêtre de dialogue Ouvrir/Enregistrer sous s'ouvre, accédez rapidement au chemin d'accès actuel du gestionnaire de fichiers.</system:String>
<system:String x:Key="autoDialogJump">Dialog Jump Automatically</system:String>
<system:String x:Key="autoDialogJump">Saut de dialogue automatique</system:String>
<system:String x:Key="autoDialogJumpToolTip">Lorsque la fenêtre de dialogue Ouvrir/Enregistrer sous est affichée, naviguez automatiquement vers le chemin du gestionnaire de fichiers actuel. (Expérimental)</system:String>
<system:String x:Key="showDialogJumpWindow">Show Dialog Jump Window</system:String>
<system:String x:Key="showDialogJumpWindowToolTip">Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.</system:String>
<system:String x:Key="dialogJumpWindowPosition">Dialog Jump Window Position</system:String>
<system:String x:Key="dialogJumpWindowPositionToolTip">Select position for the Dialog Jump search window</system:String>
<system:String x:Key="DialogJumpWindowPositionUnderDialog">Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed</system:String>
<system:String x:Key="DialogJumpWindowPositionFollowDefault">Default search window position. Displayed when triggered by search window hotkey</system:String>
<system:String x:Key="dialogJumpResultBehaviour">Dialog Jump Result Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window to the selected result path</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Left click or Enter key</system:String>
<system:String x:Key="showDialogJumpWindow">Afficher la fenêtre de saut de dialogue</system:String>
<system:String x:Key="showDialogJumpWindowToolTip">Afficher la fenêtre de recherche de saut de dialogue lorsque la fenêtre de dialogue Ouvrir/Enregistrer sous est affichée pour naviguer rapidement vers les emplacements de fichier/dossier.</system:String>
<system:String x:Key="dialogJumpWindowPosition">Position de la fenêtre de saut de dialogue</system:String>
<system:String x:Key="dialogJumpWindowPositionToolTip">Sélectionnez la position pour la fenêtre de recherche de saut de dialogue</system:String>
<system:String x:Key="DialogJumpWindowPositionUnderDialog">Fixé sous la fenêtre de dialogue Ouvrir/Enregistrer sous. Affiché à l'ouverture et reste jusqu'à ce que la fenêtre soit fermée.</system:String>
<system:String x:Key="DialogJumpWindowPositionFollowDefault">Position de la fenêtre de recherche par défaut. Affiché lorsqu'il est déclenché par le raccourci clavier de la fenêtre de recherche</system:String>
<system:String x:Key="dialogJumpResultBehaviour">Comportement de navigation des résultats du saut de dialogue</system:String>
<system:String x:Key="dialogJumpResultBehaviourToolTip">Comportement pour naviguer dans la fenêtre de dialogue Ouvrir/Enregistrer sous vers le chemin de résultat sélectionné</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Clic gauche ou touche Entrée</system:String>
<system:String x:Key="DialogJumpResultBehaviourRightClick">Clique droit</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">Dialog Jump File Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpFileResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window when the result is a file path</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">Comportement de navigation des résultats du saut de dialogue</system:String>
<system:String x:Key="dialogJumpFileResultBehaviourToolTip">Comportement pour naviguer dans la fenêtre de dialogue Ouvrir/Enregistrer sous lorsque le résultat est un chemin de fichier</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPath">Remplir le chemin complet dans la zone de nom de fichier</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPathOpen">Remplir le chemin complet dans la zone de nom de fichier et ouvrir</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourDirectory">Remplir le répertoire dans la zone de chemin</system:String>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Icônes</system:String>
<system:String x:Key="about_activate_times">Vous avez utilisé Flow Launcher {0} fois</system:String>
<system:String x:Key="checkUpdates">Vérifier les mises à jour</system:String>
<system:String x:Key="BecomeASponsor">Devenir un Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Devenez un sponsor</system:String>
<system:String x:Key="newVersionTips">Nouvelle version {0} disponible, souhaitez-vous redémarrer Flow Launcher pour l'installer ?</system:String>
<system:String x:Key="checkUpdatesFailed">Échec de la vérification de la mise à jour, vérifiez votre connexion et vos paramètres de configuration proxy pour pouvoir acceder à api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -466,8 +482,10 @@
<system:String x:Key="userdatapathButton">Ouvrir le dossier</system:String>
<system:String x:Key="advanced">Avancé</system:String>
<system:String x:Key="logLevel">Niveau de journalisation</system:String>
<system:String x:Key="LogLevelDEBUG">Débogage</system:String>
<system:String x:Key="LogLevelNONE">Silencieux</system:String>
<system:String x:Key="LogLevelERROR">Erreur</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Débogage</system:String>
<system:String x:Key="settingWindowFontTitle">Réglage de la police de la fenêtre</system:String>
<!-- Release Notes Window -->
@ -489,6 +507,7 @@
<system:String x:Key="fileManager_file_arg">Arguments pour le fichier</system:String>
<system:String x:Key="fileManagerPathNotFound">Le gestionnaire de fichiers '{0}' n'a pas pu être situé à '{1}'. Souhaitez-vous continuer ?</system:String>
<system:String x:Key="fileManagerPathError">Erreur de chemin du gestionnaire de fichiers</system:String>
<system:String x:Key="fileManagerExplorer">Explorateur de fichiers</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Navigateur web par défaut</system:String>
@ -499,6 +518,8 @@
<system:String x:Key="defaultBrowser_newWindow">Nouvelle fenêtre</system:String>
<system:String x:Key="defaultBrowser_newTab">Nouvel onglet</system:String>
<system:String x:Key="defaultBrowser_parameter">Mode privé</system:String>
<system:String x:Key="defaultBrowser_default">Par défaut</system:String>
<system:String x:Key="defaultBrowser_new_profile">Nouveau profil</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Changer la priorité</system:String>
@ -588,8 +609,9 @@ Si vous ajoutez un préfixe &quot;@&quot; lors de la saisie d'un raccourci, celu
Le gestionnaire de fichiers spécifié n'a pas été trouvé. Veuillez vérifier le paramètre Gestionnaire de fichiers personnalisé dans Paramètres &gt; Général.
</system:String>
<system:String x:Key="errorTitle">Erreur</system:String>
<system:String x:Key="folderOpenError">Une erreur s'est produite lors de l'ouverture du dossier. {0}</system:String>
<system:String x:Key="folderOpenError">Une erreur s'est produite lors de l'ouverture du dossier.</system:String>
<system:String x:Key="browserOpenError">Une erreur s'est produite lors de l'ouverture de l'URL dans le navigateur. Veuillez vérifier la configuration de votre navigateur Web par défaut dans la section &quot;Général&quot; de la fenêtre des paramètres</system:String>
<system:String x:Key="fileNotFoundError">Fichier ou répertoire introuvable : {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Veuillez patienter...</system:String>

View file

@ -8,9 +8,9 @@
</system:String>
<system:String x:Key="runtimePluginChooseRuntimeExecutable">אנא בחר את קובץ ההפעלה {0}</system:String>
<system:String x:Key="runtimeExecutableInvalidChooseDownload">
Your selected {0} executable is invalid.
קובץ ההפעלה {0} שבחרת אינו חוקי.
{2}{2}
Click yes if you would like select the {0} executable again. Click no if you would like to download {1}
לחץ על כן אם ברצונך, בחר את {0} ההפעלה הקודמת. לחץ על לא אם ברצונך להוריד את {1}
</system:String>
<system:String x:Key="runtimePluginUnableToSetExecutablePath">לא ניתן להגדיר נתיב הפעלה {0}, אנא נסה שוב בהגדרות Flow (גלול עד למטה).</system:String>
<system:String x:Key="failedToInitializePluginsTitle">נכשל בהפעלת תוספים</system:String>
@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">איפוס מיקום</system:String>
<system:String x:Key="PositionResetToolTip">אפס את מיקום חלון החיפוש</system:String>
<system:String x:Key="queryTextBoxPlaceholder">הקלד כאן כדי לחפש</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">הגדרות</system:String>
@ -75,6 +79,8 @@
<system:String x:Key="useLogonTaskForStartupTooltip">לאחר הסרת ההתקנה, עליך להסיר ידנית משימה זו (Flow.Launcher Startup) דרך מתזמן המשימות</system:String>
<system:String x:Key="setAutoStartFailed">שגיאה בהגדרת ההפעלה בעת הפעלת windows</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">הסתר את Flow Launcher כאשר הוא אינו החלון הפעיל</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="dontPromptUpdateMsg">אל תציג התראות על גרסה חדשה</system:String>
<system:String x:Key="SearchWindowPosition">מיקום חלון חיפוש</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">זכור את המיקום האחרון</system:String>
@ -170,6 +176,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">ניתן לערוך זאת רק אם התוסף תומך בתכונת הבית ודף הבית מופעל.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">עוקף את הגדרת תמיד עליון של תוכנות אחרות, ומציג את Flow במיקום הגבוה ביותר.</system:String>
@ -213,6 +223,8 @@
<system:String x:Key="plugin_query_version">גרסה</system:String>
<system:String x:Key="plugin_query_web">אתר</system:String>
<system:String x:Key="plugin_uninstall">הסר התקנה</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">נכשל בהסרת הגדרות התוסף</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">תוספים: {0} - נכשל בהסרת קבצי הגדרות התוסף, יש להסירם ידנית</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">נכשל בהסרת מטמון התוסף</system:String>
@ -223,6 +235,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -442,7 +458,7 @@
<system:String x:Key="icons">סמלים</system:String>
<system:String x:Key="about_activate_times">הפעלת את Flow Launcher {0} פעמים</system:String>
<system:String x:Key="checkUpdates">בדוק עדכונים</system:String>
<system:String x:Key="BecomeASponsor">תן חסות</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">גרסה חדשה {0} זמינה, האם ברצונך להפעיל מחדש את Flow Launcher כדי להשתמש בעדכון?</system:String>
<system:String x:Key="checkUpdatesFailed">בדיקת העדכונים נכשלה, אנא בדוק את הגדרות החיבור ואת הגדרות ה-Proxy שלך לכתובת api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -466,8 +482,10 @@
<system:String x:Key="userdatapathButton">פתח תיקיה</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">רמת יומן</system:String>
<system:String x:Key="LogLevelDEBUG">ניפוי שגיאות</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">שגיאה</system:String>
<system:String x:Key="LogLevelINFO">מידע</system:String>
<system:String x:Key="LogLevelDEBUG">ניפוי שגיאות</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -489,6 +507,7 @@
<system:String x:Key="fileManager_file_arg">ארגומנט לקובץ</system:String>
<system:String x:Key="fileManagerPathNotFound">לא ניתן היה לאתר את מנהל הקבצים '{0}' ב-'{1}'. האם ברצונך להמשיך?</system:String>
<system:String x:Key="fileManagerPathError">שגיאת נתיב למנהל הקבצים</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">דפדפן ברירת מחדל</system:String>
@ -499,6 +518,8 @@
<system:String x:Key="defaultBrowser_newWindow">חלון חדש</system:String>
<system:String x:Key="defaultBrowser_newTab">כרטיסייה חדשה</system:String>
<system:String x:Key="defaultBrowser_parameter">מצב פרטיות</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">שנה עדיפות</system:String>
@ -588,8 +609,9 @@
לא ניתן היה למצוא את מנהל הקבצים שצוין. אנא בדוק את ההגדרה של מנהל קבצים מותאם אישית תחת הגדרות &gt; כללי.
</system:String>
<system:String x:Key="errorTitle">שגיאה</system:String>
<system:String x:Key="folderOpenError">אירעה שגיאה בעת פתיחת התיקייה. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">אירעה שגיאה בעת פתיחת כתובת ה-URL בדפדפן. אנא בדוק את תצורת דפדפן האינטרנט המוגדר כברירת מחדל שלך במקטע הכללי של חלון ההגדרות</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">אנא המתן...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Ripristina Posizione</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</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="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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Impostazioni</system:String>
@ -75,6 +79,8 @@
<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="setAutoStartFailed">Errore nell'impostazione del lancio all'avvio</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Nascondi Flow Launcher quando perde il focus</system:String>
<system:String x:Key="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="dontPromptUpdateMsg">Non mostrare le notifiche per una nuova versione</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Ricorda L'Ultima Posizione</system:String>
@ -143,8 +149,8 @@
<system:String x:Key="searchDelay">Search Delay</system:String>
<system:String x:Key="searchDelayToolTip">Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average.</system:String>
<system:String x:Key="searchDelayNumberBoxToolTip">Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled.</system:String>
<system:String x:Key="searchDelayTime">Default Search Delay Time</system:String>
<system:String x:Key="searchDelayTimeToolTip">Wait time before showing results after typing stops. Higher values wait longer. (ms)</system:String>
<system:String x:Key="searchDelayTime">Tempo predefinito ritardo ricerca</system:String>
<system:String x:Key="searchDelayTimeToolTip">Tempo di attesa prima di mostrare i risultati dopo l'interruzione della digitazione. Valori più alti attendono più a lungo. (ms)</system:String>
<system:String x:Key="KoreanImeTitle">Information for Korean IME user</system:String>
<system:String x:Key="KoreanImeGuide">
The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
@ -171,6 +177,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Versione</system:String>
<system:String x:Key="plugin_query_web">Sito Web</system:String>
<system:String x:Key="plugin_uninstall">Disinstalla</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -254,11 +270,11 @@
<system:String x:Key="UpdatePromptTitle">Plugin update</system:String>
<system:String x:Key="UpdatePromptSubtitle">{0} di {1} {2}{2}Vuoi aggiornare questo plugin?</system:String>
<system:String x:Key="DownloadingPlugin">Download del plugin</system:String>
<system:String x:Key="AutoRestartAfterChange">Automatically restart after installing/uninstalling/updating plugins in plugin store</system:String>
<system:String x:Key="ZipFileNotHavePluginJson">Zip file does not have a valid plugin.json configuration</system:String>
<system:String x:Key="AutoRestartAfterChange">Riavvia automaticamente dopo l'installazione/disinstallazione/aggiornamento dei plugin nel Plugin Store</system:String>
<system:String x:Key="ZipFileNotHavePluginJson">Il file zip non contiene una configurazione plugin.json valida</system:String>
<system:String x:Key="InstallFromUnknownSourceTitle">Installazione da una fonte sconosciuta</system:String>
<system:String x:Key="InstallFromUnknownSourceSubtitle">This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window)</system:String>
<system:String x:Key="ZipFiles">Zip files</system:String>
<system:String x:Key="ZipFiles">File zip</system:String>
<system:String x:Key="SelectZipFile">Please select zip file</system:String>
<system:String x:Key="installLocalPluginTooltip">Install plugin from local path</system:String>
<system:String x:Key="updateNoResultTitle">Nessun aggiornamento disponibile</system:String>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Icone</system:String>
<system:String x:Key="about_activate_times">Hai usato Flow Launcher {0} volte</system:String>
<system:String x:Key="checkUpdates">Cerca aggiornamenti</system:String>
<system:String x:Key="BecomeASponsor">Diventa un sostenitore</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Una nuova versione {0} è disponibile, riavvia Flow Launcher per favore.</system:String>
<system:String x:Key="checkUpdatesFailed">Ricerca aggiornamenti fallita, per favore controlla la tua connessione e le eventuali impostazioni proxy per api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -458,7 +474,7 @@
<system:String x:Key="clearlogfolder">Cancella i log</system:String>
<system:String x:Key="clearlogfolderMessage">Sei sicuro di voler cancellare tutti i log?</system:String>
<system:String x:Key="cachefolder">Cache Folder</system:String>
<system:String x:Key="clearcachefolder">Clear Caches</system:String>
<system:String x:Key="clearcachefolder">Cancella cache</system:String>
<system:String x:Key="clearcachefolderMessage">Are you sure you want to delete all caches?</system:String>
<system:String x:Key="clearfolderfailMessage">Failed to clear part of folders and files. Please see log file for more information</system:String>
<system:String x:Key="welcomewindow">Wizard</system:String>
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Apri Cartella</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Error</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Arg Per Cartella</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Browser predefinito</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">Nuova Finestra</system:String>
<system:String x:Key="defaultBrowser_newTab">Nuova Scheda</system:String>
<system:String x:Key="defaultBrowser_parameter">Modalità Privata</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Cambia Priorità</system:String>
@ -589,8 +610,9 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">Error</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Attendere prego...</system:String>
@ -619,7 +641,7 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde
<!-- Plugin Update Window -->
<system:String x:Key="restartAfterUpdating">Restart Flow Launcher after updating plugins</system:String>
<system:String x:Key="updatePluginCheckboxContent">{0}: Update from v{1} to v{2}</system:String>
<system:String x:Key="updatePluginNoSelected">No plugin selected</system:String>
<system:String x:Key="updatePluginNoSelected">Nessun plugin selezionato</system:String>
<!-- Welcome Window -->
<system:String x:Key="Skip">Salta</system:String>

View file

@ -2,43 +2,43 @@
<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">
<!-- Startup -->
<system:String x:Key="runtimePluginInstalledChooseRuntimePrompt">
Flow detected you have installed {0} plugins, which will require {1} to run. Would you like to download {1}?
Flow はあなたが {0} プラグインをインストールしており、実行するために {1} が必要であることを検知しました。{1} をインストールしますか?
{2}{2}
Click no if it's already installed, and you will be prompted to select the folder that contains the {1} executable
{1}がすでにインストールされている場合は「いいえ」をクリックし、それが入っているフォルダーを選択してください
</system:String>
<system:String x:Key="runtimePluginChooseRuntimeExecutable">Please select the {0} executable</system:String>
<system:String x:Key="runtimePluginChooseRuntimeExecutable">{0} の実行ファイルを選択してください</system:String>
<system:String x:Key="runtimeExecutableInvalidChooseDownload">
Your selected {0} executable is invalid.
あなたが選択した {0} の実行ファイルが不正です。
{2}{2}
Click yes if you would like select the {0} executable again. Click no if you would like to download {1}
{0} の実行ファイルをもう一度選択する場合は「はい」を、{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="failedToInitializePluginsMessage">Plugins: {0} - fail to load and would be disabled, please contact plugin creator for help</system:String>
<system:String x:Key="runtimePluginUnableToSetExecutablePath">{0} の実行可能ファイルのパスを設定できません。Flow の設定から試してください(下までスクロールしてください)。</system:String>
<system:String x:Key="failedToInitializePluginsTitle">プラグインの起動失敗</system:String>
<system:String x:Key="failedToInitializePluginsMessage">プラグイン: {0} の読み込みに失敗したため、無効になりました。プラグインの作成者にお問い合わせください</system:String>
<!-- Portable -->
<system:String x:Key="restartToDisablePortableMode">Flow Launcherはポータブルモードの無効化のために再起動する必要があります。再起動の後、ポータブルな形式の設定項目は削除され、あなたのパソコンのフォルダに保存されます</system:String>
<system:String x:Key="restartToEnablePortableMode">Flow Launcherはポータブルモードの有効化のために再起動する必要があります。再起動の後、パソコンに保存された設定項目は削除され、ポータブルな形式で保存されます</system:String>
<system:String x:Key="moveToDifferentLocation">Flow Launcherはポータブルモードの有効化を検知しました。Flow Launcherを別の場所に移動しますか</system:String>
<system:String x:Key="shortcutsUninstallerCreated">Flow Launcherはポータブルモードの無効化を検知しました。関連するショートカットやアンインストーラーが配置されます</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>
<system:String x:Key="userDataDuplicated">Flow Launcherはあなたのユーザーデータが{0} と {1} の両方に存在することを検知しました。{2}{2}続行するには、{1}を削除してください。処理は中断されました。</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="pluginHasErrored">以下のプラグインにエラーがあるためロードできません:</system:String>
<system:String x:Key="pluginsHaveErrored">以下のプラグインにエラーがあるためロードできません:</system:String>
<system:String x:Key="referToLogs">詳細はログを参照してください</system:String>
<!-- Http -->
<system:String x:Key="pleaseTryAgain">Please try again</system:String>
<system:String x:Key="parseProxyFailed">Unable to parse Http Proxy</system:String>
<system:String x:Key="pleaseTryAgain">もう一度お試しください</system:String>
<system:String x:Key="parseProxyFailed">Http プロキシをパースできません</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="failToInstallTypeScriptEnv">TypeScript環境のインストールに失敗しました。後でもう一度お試しください</system:String>
<system:String x:Key="failToInstallPythonEnv">Python 環境のインストールに失敗しました。後でもう一度お試しください。</system:String>
<!-- MainWindow -->
<system:String x:Key="registerHotkeyFailed">ホットキー &quot;{0}&quot; の登録に失敗しました。このホットキーは別のプログラムで使用されている可能性があります。別のホットキーに変更するか、このホットキーを使用しているプログラムを終了してください。</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">ホットキー「{0}」の登録解除に失敗しました。もう一度試すか、ログを参照して詳細を確認してください</system:String>
<system:String x:Key="MessageBoxTitle">Flow Launcher</system:String>
<system:String x:Key="couldnotStartCmd">{0}の起動に失敗しました</system:String>
<system:String x:Key="invalidFlowLauncherPluginFileFormat">Flow Launcherプラグインの形式が正しくありません</system:String>
@ -58,12 +58,16 @@
<system:String x:Key="selectAll">全て選択</system:String>
<system:String x:Key="fileTitle">ファイル</system:String>
<system:String x:Key="folderTitle">フォルダー</system:String>
<system:String x:Key="textTitle">Text</system:String>
<system:String x:Key="textTitle">テキスト</system:String>
<system:String x:Key="GameMode">ゲームモード</system:String>
<system:String x:Key="GameModeToolTip">ホットキーの使用を一時停止します。</system:String>
<system:String x:Key="PositionReset">位置のリセット</system:String>
<system:String x:Key="PositionResetToolTip">検索ウィンドウの位置をリセット</system:String>
<system:String x:Key="queryTextBoxPlaceholder">ここに入力して検索</system:String>
<system:String x:Key="pluginStillInitializing">{0}: このプラグインはまだ初期化中です…</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">この結果を選択して再検索する</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: 応答に失敗しました!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">詳細については、この結果を選択してください</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">設定</system:String>
@ -73,8 +77,10 @@
<system:String x:Key="startFlowLauncherOnSystemStartup">スタートアップ時にFlow Launcherを起動する</system:String>
<system:String x:Key="useLogonTaskForStartup">起動の高速化のためにスタートアップではなくログオンタスクを使用</system:String>
<system:String x:Key="useLogonTaskForStartupTooltip">アンインストール後は、「タスク スケジューラ」からこのタスクFlow.Launcher Startupを手動で削除する必要があります。</system:String>
<system:String x:Key="setAutoStartFailed">Error setting launch on startup</system:String>
<system:String x:Key="setAutoStartFailed">スタートアップ時に起動の設定失敗</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">フォーカスを失った時にFlow Launcherを隠す</system:String>
<system:String x:Key="showTaskbarWhenOpened">Flow Launcher を開いたときにタスクバーを表示する</system:String>
<system:String x:Key="showTaskbarWhenOpenedToolTip">Flow Launcher を開いたときに一時的にタスクバーを表示します。タスクバーの自動非表示を設定している場合に便利です。</system:String>
<system:String x:Key="dontPromptUpdateMsg">最新版が入手可能であっても、アップグレードメッセージを表示しない</system:String>
<system:String x:Key="SearchWindowPosition">検索ウィンドウの位置</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">最後の表示位置を記憶する</system:String>
@ -111,7 +117,7 @@
<system:String x:Key="typingStartEn">常に英語モードで入力を開始する</system:String>
<system:String x:Key="typingStartEnTooltip">Flowを起動したとき、一時的に入力方法を英語モードに変更します。</system:String>
<system:String x:Key="autoUpdates">自動更新</system:String>
<system:String x:Key="autoUpdatesTooltip">Automatically check and update the app when available</system:String>
<system:String x:Key="autoUpdatesTooltip">利用可能な場合、Flow Launcherを自動的に確認して更新します</system:String>
<system:String x:Key="select">選択</system:String>
<system:String x:Key="hideOnStartup">起動時にFlow Launcherを隠す</system:String>
<system:String x:Key="hideOnStartupToolTip">起動後、Flow Launcher の検索ウィンドウは非表示になり、トレイに格納されます。</system:String>
@ -123,10 +129,10 @@
<system:String x:Key="SearchPrecisionLow">低</system:String>
<system:String x:Key="SearchPrecisionRegular">標準</system:String>
<system:String x:Key="ShouldUsePinyin">ピンインによる検索</system:String>
<system:String x:Key="ShouldUsePinyinToolTip">Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.</system:String>
<system:String x:Key="ShouldUseDoublePinyin">Use Double Pinyin</system:String>
<system:String x:Key="ShouldUseDoublePinyinToolTip">Use Double Pinyin instead of Full Pinyin to search.</system:String>
<system:String x:Key="DoublePinyinSchema">Double Pinyin Schema</system:String>
<system:String x:Key="ShouldUsePinyinToolTip">Pinyinは中国語を翻訳するためのローマ字入力の標準的な方法です。有効にすると、検索時のメモリ使用量が大幅に増加する可能性があります。</system:String>
<system:String x:Key="ShouldUseDoublePinyin">双拼入力を使用</system:String>
<system:String x:Key="ShouldUseDoublePinyinToolTip">検索するときに全拼の代わりに双拼を使用する。</system:String>
<system:String x:Key="DoublePinyinSchema">双拼の入力方式</system:String>
<system:String x:Key="DoublePinyinSchemasXiaoHe">Xiao He</system:String>
<system:String x:Key="DoublePinyinSchemasZiRanMa">Zi Ran Ma</system:String>
<system:String x:Key="DoublePinyinSchemasWeiRuan">Wei Ruan</system:String>
@ -142,10 +148,10 @@
<system:String x:Key="shadowEffectNotAllowed">現在のテーマでぼかしの効果が有効になっている場合、影の効果を有効にすることはできません</system:String>
<system:String x:Key="searchDelay">検索遅延</system:String>
<system:String x:Key="searchDelayToolTip">入力中に短い遅延を追加することで、UIのちらつきや結果の読み込みを軽減します。平均的なタイピング速度のユーザーにおすすめです。</system:String>
<system:String x:Key="searchDelayNumberBoxToolTip">Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled.</system:String>
<system:String x:Key="searchDelayNumberBoxToolTip">入力中の結果表示までの待ち時間をミリ秒単位で入力します。これは、検索遅延が有効な場合にのみ編集できます。</system:String>
<system:String x:Key="searchDelayTime">デフォルトの検索遅延時間</system:String>
<system:String x:Key="searchDelayTimeToolTip">入力が停止した後に結果が表示されるまでの待ち時間。値が大きいほど長く待機します。(単位 ms)</system:String>
<system:String x:Key="KoreanImeTitle">Information for Korean IME user</system:String>
<system:String x:Key="KoreanImeTitle">韓国語IMEユーザーへの情報</system:String>
<system:String x:Key="KoreanImeGuide">
The Korean input method used in Windows 11 may cause some issues in Flow Launcher.
@ -160,29 +166,33 @@
</system:String>
<system:String x:Key="KoreanImeOpenLink">Open Language and Region System Settings</system:String>
<system:String x:Key="KoreanImeOpenLink">システムの言語と地域設定を開く</system:String>
<system:String x:Key="KoreanImeOpenLinkToolTip">Opens the Korean IME setting location. Go to Korean &gt; Language Options &gt; Keyboard - Microsoft IME &gt; Compatibility</system:String>
<system:String x:Key="KoreanImeOpenLinkButton">開く</system:String>
<system:String x:Key="KoreanImeRegistry">Use Previous Korean IME</system:String>
<system:String x:Key="KoreanImeRegistry">前の韓国語IMEを使用</system:String>
<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="KoreanImeSettingChangeFailTitle">韓国語IME設定の変更に失敗しました</system:String>
<system:String x:Key="KoreanImeSettingChangeFailSubTitle">システムのレジストリへのアクセスが可能か確認するか、サポートにお問い合わせください。</system:String>
<system:String x:Key="homePage">ホームページ</system:String>
<system:String x:Key="homePageToolTip">検索文字列が空の場合、ホームページの結果を表示します。</system:String>
<system:String x:Key="historyResultsForHomePage">クエリの履歴をホームページに表示</system:String>
<system:String x:Key="historyResultsCountForHomePage">ホームページに表示される最大の履歴の数</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="historyStyle">履歴のスタイル</system:String>
<system:String x:Key="historyStyleTooltip">履歴とホームページに表示する履歴の種類を選択します</system:String>
<system:String x:Key="queryHistory">クエリの履歴</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">これは、プラグインがホーム機能をサポートし、ホームページが有効な場合にのみ編集することができます。</system:String>
<system:String x:Key="showAtTopmost">検索ウィンドウを最前面に表示</system:String>
<system:String x:Key="showAtTopmostToolTip">他のプログラムの 'Always on Top' (最前面に表示)設定を上書きし、常に最前面のウィンドウで Flow を表示します。</system:String>
<system:String x:Key="autoRestartAfterChanging">プラグインストアでプラグインを変更した後に再起動します</system:String>
<system:String x:Key="autoRestartAfterChanging">プラグインストアでプラグインを変更した後に再起動</system:String>
<system:String x:Key="autoRestartAfterChangingToolTip">プラグインストア経由でプラグインをインストール、アンインストール、または更新した後、Flow Lancherを自動的に再起動します</system:String>
<system:String x:Key="showUnknownSourceWarning">不明なソースの警告を表示</system:String>
<system:String x:Key="showUnknownSourceWarningToolTip">不明なソースからプラグインをインストールするときに警告を表示する</system:String>
<system:String x:Key="autoUpdatePlugins">Auto update plugins</system:String>
<system:String x:Key="autoUpdatePluginsToolTip">Automatically check plugin updates and notify if there are any updates available</system:String>
<system:String x:Key="autoUpdatePlugins">プラグインの自動アップデート</system:String>
<system:String x:Key="autoUpdatePluginsToolTip">プラグインの更新を自動的にチェックし、利用可能な更新がある場合に通知します</system:String>
<!-- Setting Plugin -->
<system:String x:Key="searchplugin">Search Plugin</system:String>
<system:String x:Key="searchplugin">プラグインの検索</system:String>
<system:String x:Key="searchpluginToolTip">Ctrl+F でプラグインを検索します</system:String>
<system:String x:Key="searchplugin_Noresult_Title">検索結果が見つかりませんでした</system:String>
<system:String x:Key="searchplugin_Noresult_Subtitle">別の検索を試してみてください。</system:String>
@ -191,20 +201,20 @@
<system:String x:Key="browserMorePlugins">プラグインを探す</system:String>
<system:String x:Key="enable">有効</system:String>
<system:String x:Key="disable">無効</system:String>
<system:String x:Key="actionKeywordsTitle">Action keyword Setting</system:String>
<system:String x:Key="actionKeywordsTitle">アクションキーワードの設定</system:String>
<system:String x:Key="actionKeywords">キーワード</system:String>
<system:String x:Key="currentActionKeywords">Current action keyword</system:String>
<system:String x:Key="newActionKeyword">New action keyword</system:String>
<system:String x:Key="actionKeywordsTooltip">Change Action Keywords</system:String>
<system:String x:Key="pluginSearchDelayTime">Plugin search delay time</system:String>
<system:String x:Key="pluginSearchDelayTimeTooltip">Change Plugin Search Delay Time</system:String>
<system:String x:Key="currentActionKeywords">現在のアクションキーワード</system:String>
<system:String x:Key="newActionKeyword">新しいアクションキーワード</system:String>
<system:String x:Key="actionKeywordsTooltip">アクションキーワードの変更</system:String>
<system:String x:Key="pluginSearchDelayTime">プラグインの検索遅延時間</system:String>
<system:String x:Key="pluginSearchDelayTimeTooltip">プラグインの検索遅延時間を変更</system:String>
<system:String x:Key="FilterComboboxLabel">詳細設定:</system:String>
<system:String x:Key="DisplayModeOnOff">有効</system:String>
<system:String x:Key="DisplayModePriority">重要度</system:String>
<system:String x:Key="DisplayModeSearchDelay">検索遅延</system:String>
<system:String x:Key="DisplayModeHomeOnOff">ホームページ</system:String>
<system:String x:Key="currentPriority">Current Priority</system:String>
<system:String x:Key="newPriority">New Priority</system:String>
<system:String x:Key="currentPriority">現在の優先度</system:String>
<system:String x:Key="newPriority">新しい優先度</system:String>
<system:String x:Key="priority">重要度</system:String>
<system:String x:Key="priorityToolTip">プラグインの結果の優先度を変更します。</system:String>
<system:String x:Key="pluginDirectory">プラグイン・ディレクトリ</system:String>
@ -214,59 +224,65 @@
<system:String x:Key="plugin_query_version">バージョン</system:String>
<system:String x:Key="plugin_query_web">ウェブサイト</system:String>
<system:String x:Key="plugin_uninstall">アンインストール</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
<system:String x:Key="failedToRemovePluginCacheMessage">Plugins: {0} - Fail to remove plugin cache files, please remove them manually</system:String>
<system:String x:Key="pluginModifiedAlreadyTitle">{0} modified already</system:String>
<system:String x:Key="pluginModifiedAlreadyMessage">Please restart Flow before making any further changes</system:String>
<system:String x:Key="failedToInstallPluginTitle">Fail to install {0}</system:String>
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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="plugin_default_search_delay_time">検索の遅延時間: デフォルト</system:String>
<system:String x:Key="plugin_search_delay_time">検索の遅延時間: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">プラグイン設定の削除に失敗</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">プラグイン: {0} - プラグイン設定ファイルの削除に失敗しました。手動で削除してください</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">プラグインキャッシュの削除に失敗</system:String>
<system:String x:Key="failedToRemovePluginCacheMessage">プラグイン: {0} - プラグインキャッシュファイルの削除に失敗しました。手動で削除してください</system:String>
<system:String x:Key="pluginModifiedAlreadyTitle">{0} は既に変更されています</system:String>
<system:String x:Key="pluginModifiedAlreadyMessage">これ以上変更を加える前に Flow Launcher を再起動してください</system:String>
<system:String x:Key="failedToInstallPluginTitle">{0} のインストールに失敗</system:String>
<system:String x:Key="failedToUninstallPluginTitle">{0} のアンインストールに失敗</system:String>
<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>
<system:String x:Key="pluginStore_NewRelease">新規リリース</system:String>
<system:String x:Key="pluginStore_RecentlyUpdated">最近の更新</system:String>
<system:String x:Key="pluginStore_None">プラグイン</system:String>
<system:String x:Key="pluginStore_Installed">Installed</system:String>
<system:String x:Key="pluginStore_Installed">インストール済み</system:String>
<system:String x:Key="refresh">更新</system:String>
<system:String x:Key="installbtn">インストール</system:String>
<system:String x:Key="uninstallbtn">アンインストール</system:String>
<system:String x:Key="updatebtn">更新</system:String>
<system:String x:Key="LabelInstalledToolTip">Plugin already installed</system:String>
<system:String x:Key="LabelNew">New Version</system:String>
<system:String x:Key="LabelNewToolTip">This plugin has been updated within the last 7 days</system:String>
<system:String x:Key="LabelInstalledToolTip">プラグインは既にインストールされています</system:String>
<system:String x:Key="LabelNew">新しいバージョン</system:String>
<system:String x:Key="LabelNewToolTip">このプラグインは過去1週間以内に更新されました</system:String>
<system:String x:Key="LabelUpdateToolTip">新しいアップデートが利用可能です</system:String>
<system:String x:Key="ErrorInstallingPlugin">プラグインのインストール失敗</system:String>
<system:String x:Key="ErrorUninstallingPlugin">プラグインのアンインストール失敗</system:String>
<system:String x:Key="ErrorUpdatingPlugin">Error updating plugin</system:String>
<system:String x:Key="ErrorUpdatingPlugin">プラグインの更新に失敗</system:String>
<system:String x:Key="KeepPluginSettingsTitle">プラグインの設定を維持</system:String>
<system:String x:Key="KeepPluginSettingsSubtitle">再びインストールして使用するときのためにプラグインの設定を維持しますか?</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>
<system:String x:Key="UpdateSuccessNoRestart">Plugin {0} successfully updated. Please restart Flow.</system:String>
<system:String x:Key="InstallSuccessNoRestart">プラグイン {0} のインストールに成功しました。Flow を再起動してください。</system:String>
<system:String x:Key="UninstallSuccessNoRestart">プラグイン {0} のアンインストールに成功しました。Flow を再起動してください。</system:String>
<system:String x:Key="UpdateSuccessNoRestart">プラグイン {0} が正常に更新されました。Flow を再起動してください。</system:String>
<system:String x:Key="InstallPromptTitle">プラグインのインストール</system:String>
<system:String x:Key="InstallPromptSubtitle">{0} by {1} {2}{2}このプラグインをインストールしますか?</system:String>
<system:String x:Key="UninstallPromptTitle">プラグインのアンインストール</system:String>
<system:String x:Key="UninstallPromptSubtitle">{0} by {1} {2}{2}このプラグインをアンインストールしますか?</system:String>
<system:String x:Key="UpdatePromptTitle">Plugin update</system:String>
<system:String x:Key="UpdatePromptSubtitle">{0} by {1} {2}{2}Would you like to update this plugin?</system:String>
<system:String x:Key="DownloadingPlugin">Downloading plugin</system:String>
<system:String x:Key="AutoRestartAfterChange">Automatically restart after installing/uninstalling/updating plugins in plugin store</system:String>
<system:String x:Key="ZipFileNotHavePluginJson">Zip file does not have a valid plugin.json configuration</system:String>
<system:String x:Key="UpdatePromptTitle">プラグインの更新</system:String>
<system:String x:Key="UpdatePromptSubtitle">{0} by {1} {2}{2}このプラグインを更新しますか?</system:String>
<system:String x:Key="DownloadingPlugin">プラグインをダウンロード中</system:String>
<system:String x:Key="AutoRestartAfterChange">プラグインストア経由でのプラグインのインストール 、アンインストール、または更新後に自動的に再起動します</system:String>
<system:String x:Key="ZipFileNotHavePluginJson">Zipファイルに有効なplugin.jsonファイルがありません</system:String>
<system:String x:Key="InstallFromUnknownSourceTitle">不明なソースからのインストール</system:String>
<system:String x:Key="InstallFromUnknownSourceSubtitle">このプラグインは不明なソースから提供されており、潜在的なリスクを含んでいる可能性があります!{0}{0}このプラグインの開発元をよく調べ、安全であることをご自身で確かめてください。{0}{0}それでもあなたはこのプラグインをインストールしますか?{0}{0}(この警告は設定の「一般」セクションで無効にすることができます)</system:String>
<system:String x:Key="ZipFiles">Zip files</system:String>
<system:String x:Key="SelectZipFile">Please select zip file</system:String>
<system:String x:Key="ZipFiles">Zip ファイル</system:String>
<system:String x:Key="SelectZipFile">zipファイルを選択してください</system:String>
<system:String x:Key="installLocalPluginTooltip">ローカルパスからプラグインをインストール</system:String>
<system:String x:Key="updateNoResultTitle">No update available</system:String>
<system:String x:Key="updateNoResultSubtitle">All plugins are up to date</system:String>
<system:String x:Key="updateAllPluginsTitle">Plugin updates available</system:String>
<system:String x:Key="updateAllPluginsButtonContent">Update plugins</system:String>
<system:String x:Key="checkPluginUpdatesTooltip">Check plugin updates</system:String>
<system:String x:Key="PluginsUpdateSuccessNoRestart">Plugins are successfully updated. Please restart Flow.</system:String>
<system:String x:Key="updateNoResultTitle">利用可能な更新はありません</system:String>
<system:String x:Key="updateNoResultSubtitle">すべてのプラグインが最新です</system:String>
<system:String x:Key="updateAllPluginsTitle">プラグインの更新が利用可能</system:String>
<system:String x:Key="updateAllPluginsButtonContent">プラグインを更新</system:String>
<system:String x:Key="checkPluginUpdatesTooltip">プラグインの更新を確認</system:String>
<system:String x:Key="PluginsUpdateSuccessNoRestart">プラグインが正常に更新されました。Flow を再起動してください。</system:String>
<!-- Setting Theme -->
<system:String x:Key="theme">テーマ</system:String>
@ -285,13 +301,13 @@
<system:String x:Key="SearchBarHeight">検索バーの高さ</system:String>
<system:String x:Key="ItemHeight">アイテムの高さ</system:String>
<system:String x:Key="queryBoxFont">検索ボックスのフォント</system:String>
<system:String x:Key="resultItemFont">Result Title Font</system:String>
<system:String x:Key="resultSubItemFont">Result Subtitle Font</system:String>
<system:String x:Key="resultItemFont">結果のタイトルのフォント</system:String>
<system:String x:Key="resultSubItemFont">結果のサブタイトルのフォント</system:String>
<system:String x:Key="resetCustomize">リセット</system:String>
<system:String x:Key="resetCustomizeToolTip">Reset to the recommended font and size settings.</system:String>
<system:String x:Key="ImportThemeSize">Import Theme Size</system:String>
<system:String x:Key="ImportThemeSizeToolTip">If a size value intended by the theme designer is available, it will be retrieved and applied.</system:String>
<system:String x:Key="CustomizeToolTip">Customize</system:String>
<system:String x:Key="resetCustomizeToolTip">推奨されるフォントとサイズの設定にリセットします。</system:String>
<system:String x:Key="ImportThemeSize">テーマ中のサイズをインポート</system:String>
<system:String x:Key="ImportThemeSizeToolTip">テーマのデザイナーによって意図されたサイズ値が利用可能なとき、それを取得して適用します。</system:String>
<system:String x:Key="CustomizeToolTip">カスタマイズ</system:String>
<system:String x:Key="windowMode">ウィンドウモード</system:String>
<system:String x:Key="opacity">透過度</system:String>
<system:String x:Key="theme_load_failure_path_not_exists">テーマ {0} が存在しません、デフォルトのテーマに戻します。</system:String>
@ -306,7 +322,7 @@
<system:String x:Key="SoundEffectTip">検索ウィンドウが開いたとき、小さな音を鳴らします</system:String>
<system:String x:Key="SoundEffectVolume">効果音の音量</system:String>
<system:String x:Key="SoundEffectVolumeTip">効果音の音量を調整します</system:String>
<system:String x:Key="SoundEffectWarning">Windows Media Player is unavailable and is required for Flow's volume adjustment. Please check your installation if you need to adjust volume.</system:String>
<system:String x:Key="SoundEffectWarning">Windows Media Player は Flow を使った音量調整に必要です。ボリュームを調整する必要がある場合は、Windows Media Player がインストールされているかどうか確認してください。</system:String>
<system:String x:Key="Animation">アニメーション</system:String>
<system:String x:Key="AnimationTip">UIでアニメーションを使用します</system:String>
<system:String x:Key="AnimationSpeed">アニメーション速度</system:String>
@ -324,15 +340,15 @@
<system:String x:Key="BackdropTypesAcrylic">アクリル</system:String>
<system:String x:Key="BackdropTypesMica">マイカ</system:String>
<system:String x:Key="BackdropTypesMicaAlt">マイカ(代替)</system:String>
<system:String x:Key="TypeIsDarkToolTip">This theme supports two (light/dark) modes.</system:String>
<system:String x:Key="TypeHasBlurToolTip">This theme supports Blur Transparent Background.</system:String>
<system:String x:Key="TypeIsDarkToolTip">このテーマはライトダークの2モードに対応しています。</system:String>
<system:String x:Key="TypeHasBlurToolTip">このテーマは背景をぼかした透明効果をサポートしています。</system:String>
<system:String x:Key="ShowPlaceholder">プレースホルダーを表示</system:String>
<system:String x:Key="ShowPlaceholderTip">クエリが空の場合にプレースホルダを表示します</system:String>
<system:String x:Key="PlaceholderText">検索欄の案内文</system:String>
<system:String x:Key="PlaceholderTextTip">Change placeholder text. Input empty will use: {0}</system:String>
<system:String x:Key="PlaceholderTextTip">プレースホルダのテキストを変更します。空にすると、 {0} が使用されます</system:String>
<system:String x:Key="KeepMaxResults">ウィンドウサイズの固定</system:String>
<system:String x:Key="KeepMaxResultsToolTip">ウィンドウのサイズを固定し、ドラッグでの変更を無効にします。</system:String>
<system:String x:Key="MaxShowResultsCannotWorkWithAlwaysPreview">Since Always Preview is on, maximum results shown may not take effect because preview panel requires a certain minimum height</system:String>
<system:String x:Key="MaxShowResultsCannotWorkWithAlwaysPreview">「常にプレビューする」が有効になっているため、プレビューパネルの高さの確保のために「結果の最大表示件数」設定は無視される可能性があります</system:String>
<!-- Setting Hotkey -->
<system:String x:Key="hotkey">ホットキー</system:String>
@ -372,51 +388,51 @@
<system:String x:Key="customQueryHotkey">カスタムクエリ ホットキー</system:String>
<system:String x:Key="customQueryShortcut">Custom Query Shortcut</system:String>
<system:String x:Key="builtinShortcuts">組み込みショートカット</system:String>
<system:String x:Key="customQuery">Query</system:String>
<system:String x:Key="customQuery">クエリー</system:String>
<system:String x:Key="customShortcut">ショートカット</system:String>
<system:String x:Key="customShortcutExpansion">展開</system:String>
<system:String x:Key="builtinShortcutDescription">説明</system:String>
<system:String x:Key="delete">削除</system:String>
<system:String x:Key="edit">編集</system:String>
<system:String x:Key="add">追加</system:String>
<system:String x:Key="none">None</system:String>
<system:String x:Key="none">なし</system:String>
<system:String x:Key="pleaseSelectAnItem">項目を選択してください</system:String>
<system:String x:Key="deleteCustomHotkeyWarning">{0} プラグインのホットキーを本当に削除しますか?</system:String>
<system:String x:Key="deleteCustomShortcutWarning">本当にこのショートカットを削除しますか?: {0} を {1} に展開</system:String>
<system:String x:Key="shortcut_clipboard_description">Get text from clipboard.</system:String>
<system:String x:Key="shortcut_clipboard_description">クリップボードからテキストを取得します。</system:String>
<system:String x:Key="shortcut_active_explorer_path">アクティブなエクスプローラーからパスを取得します。</system:String>
<system:String x:Key="queryWindowShadowEffect">検索ウィンドウの落陰効果</system:String>
<system:String x:Key="shadowEffectCPUUsage">Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.</system:String>
<system:String x:Key="windowWidthSize">Window Width Size</system:String>
<system:String x:Key="windowWidthSizeToolTip">You can also quickly adjust this by using Ctrl+[ and Ctrl+].</system:String>
<system:String x:Key="shadowEffectCPUUsage">影の効果は GPU に大きな負荷をかけます。お使いのコンピューターの性能が限定的な場合、無効にすることをおすすめします。</system:String>
<system:String x:Key="windowWidthSize">ウィンドウ幅のサイズ</system:String>
<system:String x:Key="windowWidthSizeToolTip">Ctrl+Plus と Ctrl+Minus を使用すれば、簡単に調整することもできます。</system:String>
<system:String x:Key="useGlyphUI">Segoe Fluent アイコンを使用する</system:String>
<system:String x:Key="useGlyphUIEffect">サポートされているクエリ結果にSegoe Fluentアイコンを使用する</system:String>
<system:String x:Key="flowlauncherPressHotkey">Press Key</system:String>
<system:String x:Key="showBadges">Show Result Badges</system:String>
<system:String x:Key="flowlauncherPressHotkey">キーを入力</system:String>
<system:String x:Key="showBadges">結果のバッジを表示</system:String>
<system:String x:Key="showBadgesToolTip">サポートされているプラグインでは、バッジが表示され、より簡単に区別できます。</system:String>
<system:String x:Key="showBadgesGlobalOnly">Show Result Badges for Global Query Only</system:String>
<system:String x:Key="showBadgesGlobalOnlyToolTip">Show badges for global query results only</system:String>
<system:String x:Key="dialogJumpHotkey">Dialog Jump</system:String>
<system:String x:Key="dialogJumpHotkeyToolTip">Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.</system:String>
<system:String x:Key="dialogJump">Dialog Jump</system:String>
<system:String x:Key="dialogJumpToolTip">When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.</system:String>
<system:String x:Key="autoDialogJump">Dialog Jump Automatically</system:String>
<system:String x:Key="autoDialogJumpToolTip">When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)</system:String>
<system:String x:Key="showDialogJumpWindow">Show Dialog Jump Window</system:String>
<system:String x:Key="showDialogJumpWindowToolTip">Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.</system:String>
<system:String x:Key="dialogJumpWindowPosition">Dialog Jump Window Position</system:String>
<system:String x:Key="dialogJumpWindowPositionToolTip">Select position for the Dialog Jump search window</system:String>
<system:String x:Key="DialogJumpWindowPositionUnderDialog">Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed</system:String>
<system:String x:Key="DialogJumpWindowPositionFollowDefault">Default search window position. Displayed when triggered by search window hotkey</system:String>
<system:String x:Key="dialogJumpResultBehaviour">Dialog Jump Result Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window to the selected result path</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Left click or Enter key</system:String>
<system:String x:Key="DialogJumpResultBehaviourRightClick">Right click</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">Dialog Jump File Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpFileResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window when the result is a file path</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPath">Fill full path in file name box</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPathOpen">Fill full path in file name box and open</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourDirectory">Fill directory in path box</system:String>
<system:String x:Key="showBadgesGlobalOnly">グローバルクエリのみ、結果のバッジを表示</system:String>
<system:String x:Key="showBadgesGlobalOnlyToolTip">グローバルクエリの結果にのみバッジを表示する</system:String>
<system:String x:Key="dialogJumpHotkey">ダイアログジャンプ</system:String>
<system:String x:Key="dialogJumpHotkeyToolTip">ショートカットを入力して、「名前を付けて開く/保存」ダイアログ・ウィンドウを現在のファイルマネージャのパスにすばやくナビゲートします。</system:String>
<system:String x:Key="dialogJump">ダイアログジャンプ</system:String>
<system:String x:Key="dialogJumpToolTip">「名前を付けて開く/保存」ダイアログウィンドウが開いたら、すぐにファイルマネージャの現在のパスに移動します。</system:String>
<system:String x:Key="autoDialogJump">自動ダイアログジャンプ</system:String>
<system:String x:Key="autoDialogJumpToolTip">開く/名前を付けて保存ダイアログが表示されると、自動的に現在のファイルマネージャのパスに移動させます。 (実験的)</system:String>
<system:String x:Key="showDialogJumpWindow">ダイアログジャンプウィンドウを表示</system:String>
<system:String x:Key="showDialogJumpWindowToolTip">「名前をつけて保存/開く」ダイアログウィンドウが表示されたときにダイアログジャンプのウィンドウを開いて、ファイルやフォルダーを素早く開く。</system:String>
<system:String x:Key="dialogJumpWindowPosition">ダイアログジャンプのウィンドウの位置</system:String>
<system:String x:Key="dialogJumpWindowPositionToolTip">ダイアログジャンプ検索ウィンドウの位置を選択します</system:String>
<system:String x:Key="DialogJumpWindowPositionUnderDialog">「名前を付けて開く/保存」ダイアログウィンドウの下に固定。ウィンドウが閉じるまで開いたまま表示されます</system:String>
<system:String x:Key="DialogJumpWindowPositionFollowDefault">デフォルトの検索ウィンドウの位置。検索ウィンドウのホットキーによってトリガーされたときに表示されます</system:String>
<system:String x:Key="dialogJumpResultBehaviour">ダイアログジャンプの検索結果の開き方</system:String>
<system:String x:Key="dialogJumpResultBehaviourToolTip">「開く/名前を付けて保存」ダイアログウィンドウの選択した結果パスに移動する動作</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">左クリックまたはEnter キー</system:String>
<system:String x:Key="DialogJumpResultBehaviourRightClick">右クリック</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">ダイアログジャンプのファイルに対する動作</system:String>
<system:String x:Key="dialogJumpFileResultBehaviourToolTip">結果がファイルパスの場合の、「開く/名前を付けて保存」ダイアログウィンドウに対する動作</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPath">フルパスをファイル名ボックスに入力</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPathOpen">フルパスをファイル名ボックスに入力して開く</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourDirectory">パスボックスに含まれるフォルダを入力</system:String>
<!-- Setting Proxy -->
<system:String x:Key="proxy">HTTP プロキシ</system:String>
@ -467,44 +483,49 @@
<system:String x:Key="userdatapathButton">フォルダーを開く</system:String>
<system:String x:Key="advanced">上級者向け機能</system:String>
<system:String x:Key="logLevel">ログレベル</system:String>
<system:String x:Key="LogLevelDEBUG">デバッグ</system:String>
<system:String x:Key="LogLevelNONE">サイレント</system:String>
<system:String x:Key="LogLevelERROR">エラー</system:String>
<system:String x:Key="LogLevelINFO">情報</system:String>
<system:String x:Key="LogLevelDEBUG">デバッグ</system:String>
<system:String x:Key="settingWindowFontTitle">設定ウィンドウで使用するフォント</system:String>
<!-- Release Notes Window -->
<system:String x:Key="seeMoreReleaseNotes">See more release notes on GitHub</system:String>
<system:String x:Key="checkNetworkConnectionTitle">Failed to fetch release notes</system:String>
<system:String x:Key="checkNetworkConnectionSubTitle">Please check your network connection or ensure GitHub is accessible</system:String>
<system:String x:Key="appUpdateTitle">Flow Launcher has been updated to {0}</system:String>
<system:String x:Key="appUpdateButtonContent">Click here to view the release notes</system:String>
<system:String x:Key="seeMoreReleaseNotes">GitHub で詳細なリリース ノートを見る</system:String>
<system:String x:Key="checkNetworkConnectionTitle">リリースノートの取得に失敗</system:String>
<system:String x:Key="checkNetworkConnectionSubTitle">ネットワーク接続を確認するか、GitHubにアクセスできることを確認してください</system:String>
<system:String x:Key="appUpdateTitle">Flow Launcher が {0}に更新されました</system:String>
<system:String x:Key="appUpdateButtonContent">ここをクリックしてリリースノートを表示</system:String>
<!-- FileManager Setting Dialog -->
<system:String x:Key="fileManagerWindow">デフォルトのファイルマネージャー</system:String>
<system:String x:Key="fileManager_learnMore">Learn more</system:String>
<system:String x:Key="fileManager_tips">Please specify the file location of the file manager you using and add arguments as required. The &quot;%d&quot; represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The &quot;%f&quot; represents the file path to open for, used by the Arg for File field and for commands opening specific files.</system:String>
<system:String x:Key="fileManager_tips2">For example, if the file manager uses a command such as &quot;totalcmd.exe /A c:\windows&quot; to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A &quot;%d&quot;. Certain file managers like QTTabBar may just require a path to be supplied, in this instance use &quot;%d&quot; as the File Manager Path and leave the rest of the fields blank.</system:String>
<system:String x:Key="fileManager_name">File Manager</system:String>
<system:String x:Key="fileManager_profile_name">Profile Name</system:String>
<system:String x:Key="fileManager_path">File Manager Path</system:String>
<system:String x:Key="fileManager_directory_arg">Arg For Folder</system:String>
<system:String x:Key="fileManager_file_arg">Arg For File</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManager_learnMore">詳細を見る</system:String>
<system:String x:Key="fileManager_tips">使用したいファイルマネージャーのファイルの位置を指定し、コマンドライン引数を入力してください。&quot;%d&quot; は開こうとしているフォルダーのパスを表し、「フォルダー用の引数」の欄で特定のフォルダーを開くために使用されます。&quot;%f&quot; は開こうとしているファイルのパスを表し、「ファイル用の引数」の欄で特定のファイルを開くために使用されます。</system:String>
<system:String x:Key="fileManager_tips2">例として、ファイルマネージャーが &quot;totalcmd.exe /A c:\windows&quot; というコマンドを c:\windows というフォルダを開くために使用する場合を考えます。この場合、ファイルマネージャーのパスは totalcmd.exe で、フォルダー用の引数は /A &quot;%d&quot; になります。QTTabBarのように、パスのみを要求するファイルマネージャーの場合、”%d” をファイルマネージャーのパスの欄に指定し、残りを空欄にしてください。</system:String>
<system:String x:Key="fileManager_name">ファイル マネージャー</system:String>
<system:String x:Key="fileManager_profile_name">プロファイル名</system:String>
<system:String x:Key="fileManager_path">ファイルマネージャーのパス</system:String>
<system:String x:Key="fileManager_directory_arg">フォルダー用の引数</system:String>
<system:String x:Key="fileManager_file_arg">ファイル用の引数</system:String>
<system:String x:Key="fileManagerPathNotFound">ファイルマネージャー '{0}' は、'{1}' に見つかりませんでした。続行しますか?</system:String>
<system:String x:Key="fileManagerPathError">ファイルマネージャのパスエラー</system:String>
<system:String x:Key="fileManagerExplorer">ファイルエクスプローラー</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">デフォルトのウェブブラウザー</system:String>
<system:String x:Key="defaultBrowser_tips">The default setting follows the OS default browser setting. If specified separately, flow uses that browser.</system:String>
<system:String x:Key="defaultBrowser_name">Browser</system:String>
<system:String x:Key="defaultBrowser_profile_name">Browser Name</system:String>
<system:String x:Key="defaultBrowser_path">Browser Path</system:String>
<system:String x:Key="defaultBrowser_newWindow">New Window</system:String>
<system:String x:Key="defaultBrowser_newTab">New Tab</system:String>
<system:String x:Key="defaultBrowser_parameter">Private Mode</system:String>
<system:String x:Key="defaultBrowser_tips">デフォルトの設定は、OS のデフォルトのブラウザ設定に従います。別々に指定すると、Flow はそのブラウザを使用します。</system:String>
<system:String x:Key="defaultBrowser_name">ブラウザー</system:String>
<system:String x:Key="defaultBrowser_profile_name">ブラウザー名</system:String>
<system:String x:Key="defaultBrowser_path">ブラウザーのパス</system:String>
<system:String x:Key="defaultBrowser_newWindow">新しいウィンドウ</system:String>
<system:String x:Key="defaultBrowser_newTab">新しいタブ</system:String>
<system:String x:Key="defaultBrowser_parameter">プライベートモード</system:String>
<system:String x:Key="defaultBrowser_default">デフォルト</system:String>
<system:String x:Key="defaultBrowser_new_profile">新しいプロファイル</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Change Priority</system:String>
<system:String x:Key="priority_tips">Greater the number, the higher the result will be ranked. Try setting it as 5. If you want the results to be lower than any other plugin's, provide a negative number</system:String>
<system:String x:Key="invalidPriority">Please provide an valid integer for Priority!</system:String>
<system:String x:Key="changePriorityWindow">優先度の変更</system:String>
<system:String x:Key="priority_tips">数値が大きいほど、結果の上の方に表示されます。試しに5として設定してみてください。 結果を他のプラグインよりも低くしたい場合は、負の数字を入力してください</system:String>
<system:String x:Key="invalidPriority">優先度には有効な整数を入力してください!</system:String>
<!-- Action Keyword Setting Dialog -->
<system:String x:Key="oldActionKeywords">古いアクションキーワード</system:String>
@ -514,33 +535,33 @@
<system:String x:Key="cannotFindSpecifiedPlugin">指定されたプラグインが見つかりません</system:String>
<system:String x:Key="newActionKeywordsCannotBeEmpty">新しいアクションキーワードを空にすることはできません</system:String>
<system:String x:Key="newActionKeywordsHasBeenAssigned">新しいアクションキーワードは他のプラグインに割り当てられています。他のアクションキーワードを入力してください</system:String>
<system:String x:Key="newActionKeywordsSameAsOld">This new Action Keyword is the same as old, please choose a different one</system:String>
<system:String x:Key="newActionKeywordsSameAsOld">そのアクションキーワードは以前のものと同じです。他のアクションキーワードを入力してください</system:String>
<system:String x:Key="success">成功しました</system:String>
<system:String x:Key="completedSuccessfully">Completed successfully</system:String>
<system:String x:Key="failedToCopy">Failed to copy</system:String>
<system:String x:Key="actionkeyword_tips">Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords.</system:String>
<system:String x:Key="completedSuccessfully">正常に完了しました</system:String>
<system:String x:Key="failedToCopy">コピーに失敗</system:String>
<system:String x:Key="actionkeyword_tips">プラグインを起動するためのアクションキーワードを、空白区切りで入力してください。特定のキーワードを使用せずにプラグインを使用したい場合、* を入力してください。</system:String>
<!-- Search Delay Settings Dialog -->
<system:String x:Key="searchDelayTimeTitle">Search Delay Time Setting</system:String>
<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>
<system:String x:Key="searchDelayTimeTitle">検索の遅延時間の設定</system:String>
<system:String x:Key="searchDelayTimeTips">プラグインに使用したい検索の遅延時間をミリ秒で入力します。 何も指定したくない場合は空にしておくと、プラグインはデフォルトの検索の遅延時間を使用します。</system:String>
<!-- Search Delay Settings Dialog -->
<system:String x:Key="homeTitle">ホームページ</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>
<system:String x:Key="homeTips">クエリが空のときにプラグインの結果を表示したい場合は、プラグインのホームページの設定を有効にします。</system:String>
<!-- Custom Query Hotkey Dialog -->
<system:String x:Key="customeQueryHotkeyTitle">カスタムクエリのホットキー</system:String>
<system:String x:Key="customeQueryHotkeyTips">Press a custom hotkey to open Flow Launcher and input the specified query automatically.</system:String>
<system:String x:Key="customeQueryHotkeyTips">カスタムホットキーを押して Flow Launcher を開き、指定したクエリを自動的に入力します。</system:String>
<system:String x:Key="preview">プレビュー</system:String>
<system:String x:Key="hotkeyIsNotUnavailable">ホットキーは使用できません。新しいホットキーを選択してください</system:String>
<system:String x:Key="invalidPluginHotkey">Hotkey is invalid</system:String>
<system:String x:Key="invalidPluginHotkey">そのホットキーは無効です</system:String>
<system:String x:Key="update">更新</system:String>
<system:String x:Key="hotkeyRegTitle">Binding Hotkey</system:String>
<system:String x:Key="hotkeyUnavailable">Current hotkey is unavailable.</system:String>
<system:String x:Key="hotkeyUnavailableUneditable">This hotkey is reserved for &quot;{0}&quot; and can't be used. Please choose another hotkey.</system:String>
<system:String x:Key="hotkeyUnavailableEditable">This hotkey is already in use by &quot;{0}&quot;. If you press &quot;Overwrite&quot;, it will be removed from &quot;{0}&quot;.</system:String>
<system:String x:Key="hotkeyRegGuide">Press the keys you want to use for this function.</system:String>
<system:String x:Key="emptyPluginHotkey">Hotkey and action keyword are empty</system:String>
<system:String x:Key="hotkeyRegTitle">ホットキーの設定</system:String>
<system:String x:Key="hotkeyUnavailable">現在のホットキーは使用できません。</system:String>
<system:String x:Key="hotkeyUnavailableUneditable">このホットキーは &quot;{0}&quot; で予約されており、使用できません。別のホットキーを選択してください。</system:String>
<system:String x:Key="hotkeyUnavailableEditable">このホットキーは &quot;{0}&quot; によってすでに使用されています。「上書き」を押すと、&quot;{0}&quot;から削除されます。</system:String>
<system:String x:Key="hotkeyRegGuide">この機能に使用するキーを押してください。</system:String>
<system:String x:Key="emptyPluginHotkey">ホットキーとアクションキーワードが空です</system:String>
<!-- Custom Query Shortcut Dialog -->
<system:String x:Key="customeQueryShortcutTitle">カスタムクエリのショートカット</system:String>
@ -551,11 +572,11 @@
</system:String>
<system:String x:Key="duplicateShortcut">そのショートカットは既に存在します。新しいショートカットを入力するか、既存のショートカットを編集してください。</system:String>
<system:String x:Key="emptyShortcut">ショートカット、展開の少なくとも一方が空です。</system:String>
<system:String x:Key="invalidShortcut">Shortcut is invalid</system:String>
<system:String x:Key="invalidShortcut">ショートカットが無効です</system:String>
<!-- Common Action -->
<system:String x:Key="commonSave">保存</system:String>
<system:String x:Key="commonOverwrite">Overwrite</system:String>
<system:String x:Key="commonOverwrite">上書き</system:String>
<system:String x:Key="commonCancel">キャンセル</system:String>
<system:String x:Key="commonReset">リセット</system:String>
<system:String x:Key="commonDelete">削除</system:String>
@ -580,46 +601,47 @@
<system:String x:Key="reportWindow_report_failed">クラッシュレポートの送信に失敗しました</system:String>
<system:String x:Key="reportWindow_flowlauncher_got_an_error">Flow Launcherにエラーが発生しました</system:String>
<system:String x:Key="reportWindow_please_open_issue">Please open new issue in</system:String>
<system:String x:Key="reportWindow_upload_log">1. Upload log file: {0}</system:String>
<system:String x:Key="reportWindow_copy_below">2. Copy below exception message</system:String>
<system:String x:Key="reportWindow_upload_log">1. ログファイルをアップロード: {0}</system:String>
<system:String x:Key="reportWindow_copy_below">2. 例外メッセージ以下をコピー</system:String>
<!-- File Open Error -->
<system:String x:Key="fileManagerNotFoundTitle">File Manager Error</system:String>
<system:String x:Key="fileManagerNotFoundTitle">ファイルマネージャのエラー</system:String>
<system:String x:Key="fileManagerNotFound">
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
指定されたファイルマネージャーが見つかりませんでした。設定 &gt; 一般でカスタムファイルマネージャの設定を確認してください。
</system:String>
<system:String x:Key="errorTitle">Error</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="errorTitle">エラー</system:String>
<system:String x:Key="folderOpenError">フォルダを開く際にエラーが発生しました。</system:String>
<system:String x:Key="browserOpenError">ブラウザでURLを開く際にエラーが発生しました。設定ウィンドウの一般セクションでデフォルトのウェブブラウザ設定を確認してください</system:String>
<system:String x:Key="fileNotFoundError">ファイルまたはフォルダーが見つかりません: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Please wait...</system:String>
<system:String x:Key="pleaseWait">しばらくお待ちください…</system:String>
<!-- Update -->
<system:String x:Key="update_flowlauncher_update_check">Checking for new update</system:String>
<system:String x:Key="update_flowlauncher_update_check">新しい更新を確認中</system:String>
<system:String x:Key="update_flowlauncher_already_on_latest">Flow Launcherは既に最新です</system:String>
<system:String x:Key="update_flowlauncher_update_found">Update found</system:String>
<system:String x:Key="update_flowlauncher_updating">Updating...</system:String>
<system:String x:Key="update_flowlauncher_update_found">更新が見つかりました</system:String>
<system:String x:Key="update_flowlauncher_updating">更新中…</system:String>
<system:String x:Key="update_flowlauncher_fail_moving_portable_user_profile_data">
Flow Launcher was not able to move your user profile data to the new update version.
Please manually move your profile data folder from {0} to {1}
Flow Launcherはユーザープロファイルデータを新しいバージョンに移動できませんでした。
手動で {0} から {1}にプロフィールデータフォルダを移動してください
</system:String>
<system:String x:Key="update_flowlauncher_new_update">New Update</system:String>
<system:String x:Key="update_flowlauncher_new_update">新しい更新</system:String>
<system:String x:Key="update_flowlauncher_update_new_version_available">Flow Launcher の最新バージョン V{0} が入手可能です</system:String>
<system:String x:Key="update_flowlauncher_update_error">Flow Launcherのアップデート中にエラーが発生しました</system:String>
<system:String x:Key="update_flowlauncher_update">更新</system:String>
<system:String x:Key="update_flowlauncher_update_cancel">キャンセル</system:String>
<system:String x:Key="update_flowlauncher_fail">Update Failed</system:String>
<system:String x:Key="update_flowlauncher_check_connection">Check your connection and try updating proxy settings to github-cloud.s3.amazonaws.com.</system:String>
<system:String x:Key="update_flowlauncher_fail">アップデート失敗</system:String>
<system:String x:Key="update_flowlauncher_check_connection">接続を確認し、その後プロキシ設定を github-cloud.s3.amazonaws.com に更新してみてください。</system:String>
<system:String x:Key="update_flowlauncher_update_restart_flowlauncher_tip">このアップデートでは、Flow Launcherの再起動が必要です</system:String>
<system:String x:Key="update_flowlauncher_update_update_files">次のファイルがアップデートされます</system:String>
<system:String x:Key="update_flowlauncher_update_files">更新ファイル一覧</system:String>
<system:String x:Key="update_flowlauncher_update_update_description">アップデートの詳細</system:String>
<!-- Plugin Update Window -->
<system:String x:Key="restartAfterUpdating">Restart Flow Launcher after updating plugins</system:String>
<system:String x:Key="updatePluginCheckboxContent">{0}: Update from v{1} to v{2}</system:String>
<system:String x:Key="updatePluginNoSelected">No plugin selected</system:String>
<system:String x:Key="restartAfterUpdating">プラグインを更新した後、Flow Launcher を再起動する</system:String>
<system:String x:Key="updatePluginCheckboxContent">{0}: v{1} から v{2} へ更新</system:String>
<system:String x:Key="updatePluginNoSelected">プラグインが選択されていません</system:String>
<!-- Welcome Window -->
<system:String x:Key="Skip">スキップ</system:String>
@ -642,18 +664,18 @@
<system:String x:Key="HotkeyShiftEnterDesc">コンテキストメニューを開く</system:String>
<system:String x:Key="HotkeyCtrlEnterDesc">ファイルのあるフォルダを開く</system:String>
<system:String x:Key="HotkeyCtrlShiftEnterDesc">管理者として実行、または、 デフォルトのファイルマネージャでフォルダを開く</system:String>
<system:String x:Key="HotkeyCtrlHDesc">Query History</system:String>
<system:String x:Key="HotkeyCtrlHDesc">クエリの履歴</system:String>
<system:String x:Key="HotkeyESCDesc">コンテキストメニューから検索結果に戻る</system:String>
<system:String x:Key="HotkeyTabDesc">Autocomplete</system:String>
<system:String x:Key="HotkeyTabDesc">自動補完</system:String>
<system:String x:Key="HotkeyRunDesc">選択したアイテムを開く、または、実行する</system:String>
<system:String x:Key="HotkeyCtrlIDesc">Flow Launcherの設定ウインドウを開く</system:String>
<system:String x:Key="HotkeyF5Desc">プラグインデータのリロード</system:String>
<system:String x:Key="HotkeySelectFirstResult">Select first result</system:String>
<system:String x:Key="HotkeySelectLastResult">Select last result</system:String>
<system:String x:Key="HotkeyRequery">Run current query again</system:String>
<system:String x:Key="HotkeySelectFirstResult">最初の結果を選択</system:String>
<system:String x:Key="HotkeySelectLastResult">最後の結果を選択</system:String>
<system:String x:Key="HotkeyRequery">現在のクエリをもう一度実行</system:String>
<system:String x:Key="HotkeyOpenResult">結果を開く</system:String>
<system:String x:Key="HotkeyOpenResultN">Open result #{0}</system:String>
<system:String x:Key="HotkeyOpenResultN">#{0} を開く</system:String>
<system:String x:Key="RecommendWeather">天気</system:String>
<system:String x:Key="RecommendWeatherDesc">天気についてのGoogle検索</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">창 위치 초기화</system:String>
<system:String x:Key="PositionResetToolTip">검색창 위치 초기화</system:String>
<system:String x:Key="queryTextBoxPlaceholder">검색어 입력</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">설정</system:String>
@ -75,6 +79,8 @@
<system:String x:Key="useLogonTaskForStartupTooltip">Flow Launcher를 제거한 후에는 작업 스케줄러에서 이 작업(Flow.Launcher Startup)을 수동으로 삭제해야 합니다</system:String>
<system:String x:Key="setAutoStartFailed">Error setting launch on startup</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">포커스 잃으면 Flow Launcher 숨김</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="dontPromptUpdateMsg">새 버전 알림 끄기</system:String>
<system:String x:Key="SearchWindowPosition">검색 창 위치</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">마지막 위치 기억</system:String>
@ -162,6 +168,10 @@
<system:String x:Key="homePageToolTip">쿼리 입력창이 비어있을때, 홈페이지의 결과를 표시합니다.</system:String>
<system:String x:Key="historyResultsForHomePage">히스토리를 홈페이지에 표시</system:String>
<system:String x:Key="historyResultsCountForHomePage">홈페이지에 표시할 최대 히스토리 수</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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -205,6 +215,8 @@
<system:String x:Key="plugin_query_version">버전</system:String>
<system:String x:Key="plugin_query_web">웹사이트</system:String>
<system:String x:Key="plugin_uninstall">제거</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -215,6 +227,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -434,7 +450,7 @@
<system:String x:Key="icons">아이콘</system:String>
<system:String x:Key="about_activate_times">Flow Launcher를 {0}번 실행했습니다.</system:String>
<system:String x:Key="checkUpdates">업데이트 확인</system:String>
<system:String x:Key="BecomeASponsor">후원하기</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">새 버전({0})이 있습니다. Flow Launcher를 재시작하세요.</system:String>
<system:String x:Key="checkUpdatesFailed">업데이트 확인을 실패했습니다. api.github.com로의 연결 또는 프록시 설정을 확인해주세요.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -458,8 +474,10 @@
<system:String x:Key="userdatapathButton">폴더 열기</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">로그 레벨</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Error</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">설정창 글꼴</system:String>
<!-- Release Notes Window -->
@ -481,6 +499,7 @@
<system:String x:Key="fileManager_file_arg">파일경로 인수</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">기본 웹 브라우저</system:String>
@ -491,6 +510,8 @@
<system:String x:Key="defaultBrowser_newWindow">새 창</system:String>
<system:String x:Key="defaultBrowser_newTab">새 탭</system:String>
<system:String x:Key="defaultBrowser_parameter">사생활 보호 모드</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">중요도 변경</system:String>
@ -553,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>
@ -580,8 +601,9 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">Error</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">잠시 기다려주세요...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Tilbakestilling av posisjon</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</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="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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Innstillinger</system:String>
@ -75,6 +79,8 @@
<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="setAutoStartFailed">Feil ved å sette kjør ved oppstart</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Skjul Flow Launcher når fokus forsvinner</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="dontPromptUpdateMsg">Ikke vis varsler om nye versjoner</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Husk siste posisjon</system:String>
@ -171,6 +177,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Versjon</system:String>
<system:String x:Key="plugin_query_web">Nettsted</system:String>
<system:String x:Key="plugin_uninstall">Avinstaller</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Ikoner</system:String>
<system:String x:Key="about_activate_times">Du har aktivert Flow Launcher {0} ganger</system:String>
<system:String x:Key="checkUpdates">Se etter oppdateringer</system:String>
<system:String x:Key="BecomeASponsor">Bli en sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Ny versjon {0} er tilgjengelig, vil du starte Flow Launcher på nytt for å bruke oppdateringen?</system:String>
<system:String x:Key="checkUpdatesFailed">Sjekk oppdateringer mislyktes, vennligst sjekk tilkoblingen og proxy-innstillingene til api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Åpne mappe</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Feil</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Arg for fil</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Standard nettleser</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">Nytt vindu</system:String>
<system:String x:Key="defaultBrowser_newTab">Ny fane</system:String>
<system:String x:Key="defaultBrowser_parameter">Privat modus</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Endre prioritet</system:String>
@ -589,8 +610,9 @@ Hvis du legger til et @-prefiks mens du legger inn en snarvei, samsvarer det med
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">Feil</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Vennligst vent...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Positie resetten</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Type om te zoeken</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Instellingen</system:String>
@ -75,6 +79,8 @@
<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="setAutoStartFailed">Fout bij het instellen van uitvoeren bij opstarten</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Verberg Flow Launcher als focus verloren is</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="dontPromptUpdateMsg">Laat geen nieuwe versie notificaties zien</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Laatste Positie Onthouden</system:String>
@ -171,6 +177,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Versie</system:String>
<system:String x:Key="plugin_query_web">Website</system:String>
<system:String x:Key="plugin_uninstall">Verwijderen</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Pictogrammen</system:String>
<system:String x:Key="about_activate_times">U heeft Flow Launcher {0} keer opgestart</system:String>
<system:String x:Key="checkUpdates">Zoek naar Updates</system:String>
<system:String x:Key="BecomeASponsor">Sponsor worden</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Nieuwe versie {0} beschikbaar, start Flow Launcher opnieuw op</system:String>
<system:String x:Key="checkUpdatesFailed">Controleren op updates mislukt, controleer uw verbinding en proxy-instellingen voor api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Map openen</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Error</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Arg voor bestand</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Standaard webbrowser</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">Nieuw Venster</system:String>
<system:String x:Key="defaultBrowser_newTab">Nieuw tabblad</system:String>
<system:String x:Key="defaultBrowser_parameter">Privé modus</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Prioriteit wijzigen</system:String>
@ -589,8 +610,9 @@ Als u een '@' voorvoegsel toevoegt tijdens het invoeren van een snelkoppeling, m
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">Error</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Please wait...</system:String>

View file

@ -8,33 +8,33 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
</system:String>
<system:String x:Key="runtimePluginChooseRuntimeExecutable">Wybierz plik wykonywalny {0}</system:String>
<system:String x:Key="runtimeExecutableInvalidChooseDownload">
Your selected {0} executable is invalid.
Wybrany plik wykonywalny {0} jest nieprawidłowy.
{2}{2}
Click yes if you would like select the {0} executable again. Click no if you would like to download {1}
Kliknij Tak, jeśli chcesz ponownie wybrać plik wykonywalny {0}. Kliknij Nie, jeśli chcesz pobrać {1}
</system:String>
<system:String x:Key="runtimePluginUnableToSetExecutablePath">Nie można ustawić ścieżki do pliku wykonywalnego {0}. Spróbuj ponownie w ustawieniach Flow (przewiń na sam dół).</system:String>
<system:String x:Key="failedToInitializePluginsTitle">Nie udało się zainicjować wtyczek</system:String>
<system:String x:Key="failedToInitializePluginsMessage">Wtyczki: {0} nie udało się ich wczytać i zostaną wyłączone. Skontaktuj się z twórcą wtyczki, aby uzyskać pomoc</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="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>
<system:String x:Key="restartToDisablePortableMode">Flow Launcher musi zostać ponownie uruchomiony, aby wyłączyć tryb przenośny. Spowoduje to usunięcie profilu przenośnego i zachowanie profilu mobilnego</system:String>
<system:String x:Key="restartToEnablePortableMode">Flow Launcher musi zostać ponownie uruchomiony, aby włączyć tryb przenośny. Spowoduje to usunięcie profilu mobilnego i zachowanie profilu przenośnego</system:String>
<system:String x:Key="moveToDifferentLocation">Flow Launcher wykrył włączenie trybu przenośnego. Czy chcesz przenieść aplikację do innej lokalizacji?</system:String>
<system:String x:Key="shortcutsUninstallerCreated">Wykryto wyłączenie trybu przenośnego. Odpowiednie skróty oraz deinstalator zostały utworzone</system:String>
<system:String x:Key="userDataDuplicated">Flow Launcher wykrył zduplikowane dane użytkownika w dwóch lokalizacjach: {0} oraz {1}.{2}{2}Aby kontynuować, usuń dane znajdujące się w {1}. Nie wprowadzono żadnych zmian.</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="pluginHasErrored">Nie można załadować następującej wtyczki z powodu błędu:</system:String>
<system:String x:Key="pluginsHaveErrored">Nie można załadować następujących wtyczek z powodu błędu:</system:String>
<system:String x:Key="referToLogs">Aby uzyskać więcej informacji, zapoznaj się z logami</system:String>
<!-- Http -->
<system:String x:Key="pleaseTryAgain">Please try again</system:String>
<system:String x:Key="parseProxyFailed">Unable to parse Http Proxy</system:String>
<system:String x:Key="pleaseTryAgain">Proszę spróbować ponownie</system:String>
<system:String x:Key="parseProxyFailed">Nie można przetworzyć adresu serwera proxy HTTP</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="failToInstallTypeScriptEnv">Instalacja środowiska TypeScript nie powiodła się. Spróbuj ponownie później.</system:String>
<system:String x:Key="failToInstallPythonEnv">Instalacja środowiska Python nie powiodła się. Spróbuj ponownie później.</system:String>
<!-- MainWindow -->
<system:String x:Key="registerHotkeyFailed">Nie udało się zarejestrować skrótu klawiszowego „{0}”. Skrót może być używany przez inny program. Zmień skrót na inny lub zamknij program, który go używa.</system:String>
@ -64,6 +64,10 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="PositionReset">Resetowanie pozycji</system:String>
<system:String x:Key="PositionResetToolTip">Zresetuj pozycję okna wyszukiwania</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Wpisz tutaj, aby wyszukać</system:String>
<system:String x:Key="pluginStillInitializing">{0}: This plugin is still initializing...</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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Ustawienia</system:String>
@ -75,6 +79,8 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="useLogonTaskForStartupTooltip">Po odinstalowaniu musisz ręcznie usunąć to zadanie (Flow.Launcher Startup) za pomocą Harmonogramu zadań</system:String>
<system:String x:Key="setAutoStartFailed">Błąd uruchamiania ustawień przy starcie</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Ukryj okno Flow Launcher kiedy przestanie ono być aktywne</system:String>
<system:String x:Key="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="dontPromptUpdateMsg">Nie pokazuj powiadomienia o nowej wersji</system:String>
<system:String x:Key="SearchWindowPosition">Pozycja okna wyszukiwania</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Zapamiętaj Ostatnią Pozycję</system:String>
@ -111,7 +117,7 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="typingStartEn">Zawsze rozpoczynaj wpisywanie w trybie angielskim</system:String>
<system:String x:Key="typingStartEnTooltip">Tymczasowo zmień metodę wprowadzania na tryb angielski podczas aktywacji Flow.</system:String>
<system:String x:Key="autoUpdates">Automatyczne aktualizacje</system:String>
<system:String x:Key="autoUpdatesTooltip">Automatically check and update the app when available</system:String>
<system:String x:Key="autoUpdatesTooltip">Automatycznie sprawdzaj i instaluj aktualizacje, gdy będą dostępne</system:String>
<system:String x:Key="select">Wybierz</system:String>
<system:String x:Key="hideOnStartup">Uruchamiaj Flow Launcher zminimalizowany</system:String>
<system:String x:Key="hideOnStartupToolTip">Okno wyszukiwania Flow Launcher jest ukryte w zasobniku systemowym po uruchomieniu.</system:String>
@ -123,7 +129,7 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="SearchPrecisionLow">Niska</system:String>
<system:String x:Key="SearchPrecisionRegular">Standardowa</system:String>
<system:String x:Key="ShouldUsePinyin">Szukaj z Pinyin</system:String>
<system:String x:Key="ShouldUsePinyinToolTip">Pinyin is the standard system of romanized spelling for translating Chinese. Please note, enabling this can significantly increase memory usage during search.</system:String>
<system:String x:Key="ShouldUsePinyinToolTip">Pinyin to standardowy system zapisu języka chińskiego za pomocą alfabetu łacińskiego. Należy pamiętać, że włączenie tej opcji może znacznie zwiększyć zużycie pamięci podczas wyszukiwania.</system:String>
<system:String x:Key="ShouldUseDoublePinyin">Use Double Pinyin</system:String>
<system:String x:Key="ShouldUseDoublePinyinToolTip">Use Double Pinyin instead of Full Pinyin to search.</system:String>
<system:String x:Key="DoublePinyinSchema">Double Pinyin Schema</system:String>
@ -170,6 +176,10 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="homePageToolTip">Wyświetl wyniki strony głównej, gdy pole wyszukiwania jest puste.</system:String>
<system:String x:Key="historyResultsForHomePage">Pokaż wyniki historii na stronie głównej</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maksymalna liczba wyników historii wyświetlanych na stronie głównej</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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">Można edytować tylko wtedy, gdy wtyczka obsługuje funkcję Strona główna i jest ona włączona.</system:String>
<system:String x:Key="showAtTopmost">Wyświetl okno wyszukiwania na wierzchu</system:String>
<system:String x:Key="showAtTopmostToolTip">Wyświetl okno wyszukiwania ponad innymi oknami</system:String>
@ -213,6 +223,8 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="plugin_query_version">Wersja</system:String>
<system:String x:Key="plugin_query_web">Strona</system:String>
<system:String x:Key="plugin_uninstall">Odinstalowywanie</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Nie udało się usunąć ustawień wtyczki</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Wtyczki: {0} nie udało się usunąć plików ustawień wtyczek, usuń je ręcznie</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Nie udało się usunąć cache wtyczki</system:String>
@ -223,6 +235,10 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -442,7 +458,7 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="icons">Ikony</system:String>
<system:String x:Key="about_activate_times">Uaktywniłeś Flow Launcher {0} razy</system:String>
<system:String x:Key="checkUpdates">Szukaj aktualizacji</system:String>
<system:String x:Key="BecomeASponsor">Zostań sponsorem</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Nowa wersja {0} jest dostępna, uruchom ponownie Flow Launcher</system:String>
<system:String x:Key="checkUpdatesFailed">Sprawdzenie aktualizacji nie powiodło się. Sprawdź swoje połączenie i ustawienia proxy dla api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -466,8 +482,10 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="userdatapathButton">Otwórz folder</system:String>
<system:String x:Key="advanced">Zaawansowane</system:String>
<system:String x:Key="logLevel">Poziom logowania</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Błąd</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Ustawienia czcionki okna</system:String>
<!-- Release Notes Window -->
@ -489,6 +507,7 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="fileManager_file_arg">Arg dla pliku</system:String>
<system:String x:Key="fileManagerPathNotFound">Menedżer plików „{0}” nie został znaleziony w lokalizacji „{1}”. Czy chcesz kontynuować?</system:String>
<system:String x:Key="fileManagerPathError">Błąd ścieżki do menedżera plików</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Domyślna przeglądarka</system:String>
@ -499,6 +518,8 @@ Kliknij &quot;nie&quot;, jeśli jest już zainstalowany. Zostaniesz wtedy popros
<system:String x:Key="defaultBrowser_newWindow">Nowe okno</system:String>
<system:String x:Key="defaultBrowser_newTab">Nowa zakładka</system:String>
<system:String x:Key="defaultBrowser_parameter">Tryb prywatny</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Zmień priorytet</system:String>
@ -588,8 +609,9 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d
Nie można znaleźć określonego menedżera plików. Sprawdź ustawienie Niestandardowy menedżer plików w Ustawienia &gt; Ogólne.
</system:String>
<system:String x:Key="errorTitle">Błąd</system:String>
<system:String x:Key="folderOpenError">Wystąpił błąd podczas otwierania folderu. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">Wystąpił błąd podczas otwierania adresu URL w przeglądarce. Sprawdź konfigurację domyślnej przeglądarki internetowej w sekcji Ogólne okna ustawień</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Proszę czekać...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Redefinição de Posição</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</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="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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Configurações</system:String>
@ -75,6 +79,8 @@
<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="setAutoStartFailed">Erro ao ativar início com o sistema</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Esconder Flow Launcher quando foco for perdido</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="dontPromptUpdateMsg">Não mostrar notificações de novas versões</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Lembrar Última Posição</system:String>
@ -90,7 +96,7 @@
<system:String x:Key="SearchWindowAlignCustom">Posição Personalizada</system:String>
<system:String x:Key="language">Idioma</system:String>
<system:String x:Key="lastQueryMode">Estilo da Última Consulta</system:String>
<system:String x:Key="lastQueryModeToolTip">Mostrar/ocultar resultados anteriores quando o Lançador de Fluxos é reativado.</system:String>
<system:String x:Key="lastQueryModeToolTip">Mostrar/ocultar resultados anteriores quando o Flow Launcher for reativado.</system:String>
<system:String x:Key="LastQueryPreserved">Preservar Última Consulta</system:String>
<system:String x:Key="LastQuerySelected">Selecionar última consulta</system:String>
<system:String x:Key="LastQueryEmpty">Limpar última consulta</system:String>
@ -138,7 +144,7 @@
<system:String x:Key="DoublePinyinSchemasXiaoLang">Xiao Lang</system:String>
<system:String x:Key="AlwaysPreview">Sempre Pré-visualizar</system:String>
<system:String x:Key="AlwaysPreviewToolTip">Sempre abrir o painel de pré-visualização quando o Flow é ativado. Pressione {0} para ativar ou desativar a pré-visualização.</system:String>
<system:String x:Key="AlwaysPreviewToolTip">Sempre abrir o painel de pré-visualização quando o Flow for ativado. Pressione {0} para alternar a pré-visualização.</system:String>
<system:String x:Key="shadowEffectNotAllowed">O efeito de sombra não é permitido enquanto o tema atual tem o efeito de desfoque ativado</system:String>
<system:String x:Key="searchDelay">Search Delay</system:String>
<system:String x:Key="searchDelayToolTip">Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average.</system:String>
@ -171,6 +177,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Versão</system:String>
<system:String x:Key="plugin_query_web">Site</system:String>
<system:String x:Key="plugin_uninstall">Desinstalar</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Ícones</system:String>
<system:String x:Key="about_activate_times">Você ativou o Flow Launcher {0} vezes</system:String>
<system:String x:Key="checkUpdates">Procurar atualizações</system:String>
<system:String x:Key="BecomeASponsor">Torne-se um Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">A nova versão {0} está disponível, por favor reinicie o Flow Launcher.</system:String>
<system:String x:Key="checkUpdatesFailed">Falha ao procurar atualizações, confira sua conexão e configuração de proxy para api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Open Folder</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Error</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Arg para Arquivo</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Navegador da Web Padrão</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">Nova Janela</system:String>
<system:String x:Key="defaultBrowser_newTab">Nova Aba</system:String>
<system:String x:Key="defaultBrowser_parameter">Modo Privado</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Alterar Prioridade</system:String>
@ -589,8 +610,9 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">Error</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Por favor, aguarde...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Repor posição</system:String>
<system:String x:Key="PositionResetToolTip">Repor posição da janela de pesquisa</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Escreva aqui para pesquisar</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Este plugin está a ser iniciado...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Selecione este resultado para pesquisar novamente</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Falha na resposta!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Selecione este resultado para mais informação</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Definições</system:String>
@ -75,6 +79,8 @@
<system:String x:Key="useLogonTaskForStartupTooltip">Se desinstalar a aplicação, tem que remover manualmente a tarefa (Flow.Launcher Startup) no agendamento de tarefas</system:String>
<system:String x:Key="setAutoStartFailed">Erro ao definir para iniciar ao arrancar</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Ocultar Flow Launcher ao perder o foco</system:String>
<system:String x:Key="showTaskbarWhenOpened">Mostrar barra de tarefas ao abrir Flow Launcher</system:String>
<system:String x:Key="showTaskbarWhenOpenedToolTip">Mostrar, temporariamente, a barra de tarefas ao abrir Flow launcher. Útil para barra de tarefas oculta automaticamente.</system:String>
<system:String x:Key="dontPromptUpdateMsg">Não notificar acerca de novas versões</system:String>
<system:String x:Key="SearchWindowPosition">Posição da janela de pesquisa</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Memorizar última posição</system:String>
@ -170,6 +176,10 @@
<system:String x:Key="homePageToolTip">Mostrar resultados da página inicial se o termo de pesquisa estiver vazio.</system:String>
<system:String x:Key="historyResultsForHomePage">Mostrar histórico na página inicial</system:String>
<system:String x:Key="historyResultsCountForHomePage">Máximo de resultados a mostrar na Página inicial</system:String>
<system:String x:Key="historyStyle">Estilo do histórico</system:String>
<system:String x:Key="historyStyleTooltip">Escolha o tipo de histórico a ser mostrado no Histórico e na Página inicial</system:String>
<system:String x:Key="queryHistory">Histórico de pesquisas</system:String>
<system:String x:Key="executedHistory">Último histórico aberto</system:String>
<system:String x:Key="homeToggleBoxToolTip">Esta opção apenas pode ser editada se o plugin tiver suporte a Página inicial e se estiver ativo.</system:String>
<system:String x:Key="showAtTopmost">Janela de pesquisa à frente</system:String>
<system:String x:Key="showAtTopmostToolTip">Sobrepõe a definição 'Sempre na frente' das outras aplicações e mostra Flow Launcher à frente de qualquer janela.</system:String>
@ -213,6 +223,8 @@
<system:String x:Key="plugin_query_version">Versão</system:String>
<system:String x:Key="plugin_query_web">Site</system:String>
<system:String x:Key="plugin_uninstall">Desinstalar</system:String>
<system:String x:Key="plugin_default_search_delay_time">Tempo de atraso para pesquisa: padrão</system:String>
<system:String x:Key="plugin_search_delay_time">Tempo de atraso para pesquisa: {0} ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Falha ao remover as definições do plugin</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugin: {0} - Falha ao remover o ficheiro de definições do plugin. Experimente remover manualmente.</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Falha ao limpar a cache do plugin</system:String>
@ -223,6 +235,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Falha ao desinstalar {0}</system:String>
<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>
@ -331,7 +347,7 @@
<system:String x:Key="PlaceholderTextTip">O texto do marcador de posição. Se vazio, será utilizado: {0}</system:String>
<system:String x:Key="KeepMaxResults">Janela com tamanho fixo</system:String>
<system:String x:Key="KeepMaxResultsToolTip">Não pode ajustar o tamanho da janela por arrasto.</system:String>
<system:String x:Key="MaxShowResultsCannotWorkWithAlwaysPreview">Since Always Preview is on, maximum results shown may not take effect because preview panel requires a certain minimum height</system:String>
<system:String x:Key="MaxShowResultsCannotWorkWithAlwaysPreview">Como a opção &quot;Pré-visualizar sempre&quot; está ativa, os resultados máximos mostrados podem não ter efeito porque o painel de visualização requer uma altura mínima</system:String>
<!-- Setting Hotkey -->
<system:String x:Key="hotkey">Tecla de atalho</system:String>
@ -409,13 +425,13 @@
<system:String x:Key="DialogJumpWindowPositionFollowDefault">Default search window position. Displayed when triggered by search window hotkey</system:String>
<system:String x:Key="dialogJumpResultBehaviour">Dialog Jump Result Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window to the selected result path</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Left click or Enter key</system:String>
<system:String x:Key="DialogJumpResultBehaviourRightClick">Right click</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Clique esquerdo ou tecla Enter</system:String>
<system:String x:Key="DialogJumpResultBehaviourRightClick">Clique direito</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">Dialog Jump File Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpFileResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window when the result is a file path</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPath">Fill full path in file name box</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPathOpen">Fill full path in file name box and open</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourDirectory">Fill directory in path box</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPath">Preencher caminho total na caixa Nome do ficheiro</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPathOpen">Preencher caminho total na caixa Nome do ficheiro e abrir</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourDirectory">Preencher diretório na caixa Caminho</system:String>
<!-- Setting Proxy -->
<system:String x:Key="proxy">Proxy HTTP</system:String>
@ -442,7 +458,7 @@
<system:String x:Key="icons">Ícones</system:String>
<system:String x:Key="about_activate_times">Ativou o Flow Launcher {0} vezes</system:String>
<system:String x:Key="checkUpdates">Procurar atualizações</system:String>
<system:String x:Key="BecomeASponsor">Tornar-se patrocinador</system:String>
<system:String x:Key="BecomeASponsor">Torne-se um Patrocinador</system:String>
<system:String x:Key="newVersionTips">Está disponível a versão {0}. Gostaria de reiniciar Flow Launcher para atualizar a sua versão?</system:String>
<system:String x:Key="checkUpdatesFailed">Erro ao procurar atualizações. Verifique a sua ligação e as definições do proxy estabelecidas para api.github.com</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -465,8 +481,10 @@
<system:String x:Key="userdatapathButton">Abrir pasta</system:String>
<system:String x:Key="advanced">Avançado</system:String>
<system:String x:Key="logLevel">Nível de registo</system:String>
<system:String x:Key="LogLevelDEBUG">Depuração</system:String>
<system:String x:Key="LogLevelNONE">Silencioso</system:String>
<system:String x:Key="LogLevelERROR">Erro</system:String>
<system:String x:Key="LogLevelINFO">Informação</system:String>
<system:String x:Key="LogLevelDEBUG">Depuração</system:String>
<system:String x:Key="settingWindowFontTitle">Tipo de letra da aplicação</system:String>
<!-- Release Notes Window -->
@ -488,6 +506,7 @@
<system:String x:Key="fileManager_file_arg">Argumento para ficheiro</system:String>
<system:String x:Key="fileManagerPathNotFound">Não foi possível encontrar o gestor de ficheiros '{0}' em '{1}'. Deseja continuar?</system:String>
<system:String x:Key="fileManagerPathError">Erro no caminho do gestor de ficheiros</system:String>
<system:String x:Key="fileManagerExplorer">Gestor de ficheiros</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Navegador web padrão</system:String>
@ -498,6 +517,8 @@
<system:String x:Key="defaultBrowser_newWindow">Nova janela</system:String>
<system:String x:Key="defaultBrowser_newTab">Novo separador</system:String>
<system:String x:Key="defaultBrowser_parameter">Modo privado</system:String>
<system:String x:Key="defaultBrowser_default">Padrão</system:String>
<system:String x:Key="defaultBrowser_new_profile">Novo perfil</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Alterar prioridade</system:String>
@ -587,8 +608,9 @@ Se adicionar o prefixo '@' durante a introdução do atalho, será utilizada qua
Não foi possível encontrar o gestor de ficheiros. Verifique a definição 'Gestor de ficheiros personalizado' em Definições -&gt; Geral.
</system:String>
<system:String x:Key="errorTitle">Erro</system:String>
<system:String x:Key="folderOpenError">Ocorreu um erro ao abrir a pasta: {0}</system:String>
<system:String x:Key="folderOpenError">Ocorreu um erro ao abrir a pasta.</system:String>
<system:String x:Key="browserOpenError">Ocorreu um erro ao abrir o URL no navegador. Verifique a configuração Navegador web padrão na secção Geral das definições.</system:String>
<system:String x:Key="fileNotFoundError">Ficheiro ou diretório não encontrado: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Por favor aguarde...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Сброс положения</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</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="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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Настройки</system:String>
@ -75,6 +79,8 @@
<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="setAutoStartFailed">Ошибка настройки запуска при запуске</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Скрывать Flow Launcher, если потерян фокуc</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="dontPromptUpdateMsg">Не отображать сообщение об обновлении, когда доступна новая версия</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Запомнить последнее положение</system:String>
@ -167,10 +173,14 @@
<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">Главная страница</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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -199,10 +209,10 @@
<system:String x:Key="pluginSearchDelayTime">Plugin search delay time</system:String>
<system:String x:Key="pluginSearchDelayTimeTooltip">Change Plugin Search Delay Time</system:String>
<system:String x:Key="FilterComboboxLabel">Advanced Settings:</system:String>
<system:String x:Key="DisplayModeOnOff">Enabled</system:String>
<system:String x:Key="DisplayModeOnOff">Включено</system:String>
<system:String x:Key="DisplayModePriority">Приоритет</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">Главная страница</system:String>
<system:String x:Key="currentPriority">Текущий приоритет</system:String>
<system:String x:Key="newPriority">Новый приоритет</system:String>
<system:String x:Key="priority">Приоритет</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Версия</system:String>
<system:String x:Key="plugin_query_web">Веб-сайт</system:String>
<system:String x:Key="plugin_uninstall">Удалить</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Значки</system:String>
<system:String x:Key="about_activate_times">Вы воспользовались Flow Launcher уже {0} раз</system:String>
<system:String x:Key="checkUpdates">Проверить наличие обновлений</system:String>
<system:String x:Key="BecomeASponsor">Стать спонсором</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Доступна новая версия {0}. Вы хотите перезапустить Flow Launcher, чтобы использовать обновление?</system:String>
<system:String x:Key="checkUpdatesFailed">Проверка обновлений не удалась, пожалуйста, проверьте настройки подключения и прокси-сервера к api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Open Folder</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Ошибка</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Аргумент для файла</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Браузер по умолчанию</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">Новое окно</system:String>
<system:String x:Key="defaultBrowser_newTab">Новая вкладка</system:String>
<system:String x:Key="defaultBrowser_parameter">Приватный режим</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Изменить приоритет</system:String>
@ -525,7 +546,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">Главная страница</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 -->
@ -589,8 +610,9 @@
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">Ошибка</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Пожалуйста, подождите...</system:String>

View file

@ -65,6 +65,10 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="PositionReset">Resetovať pozíciu</system:String>
<system:String x:Key="PositionResetToolTip">Resetovať pozíciu vyhľadávacieho okna</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Zadajte text na vyhľadávanie</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Tento plugin sa stále inicializuje…</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Vyberte tento výsledok na opätovné vyhľadávanie</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Nepodarilo sa odpovedať!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Vyberte tento výsledok pre viac informácií</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Nastavenia</system:String>
@ -76,6 +80,8 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="useLogonTaskForStartupTooltip">Po odinštalovaní musíte úlohu manuálne odstrániť (Flow.Launcher Startup) cez Plánovač úloh</system:String>
<system:String x:Key="setAutoStartFailed">Chybné nastavenie spustenia pri spustení</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Schovať Flow Launcher po strate fokusu</system:String>
<system:String x:Key="showTaskbarWhenOpened">Zobraziť panel úloh, keď je Flow Launcher otvorený</system:String>
<system:String x:Key="showTaskbarWhenOpenedToolTip">Dočasne zobraziť panel úloh pri otvorení Flow Launchera, užitočné pri automatickom skrývaní panela úloh.</system:String>
<system:String x:Key="dontPromptUpdateMsg">Nezobrazovať upozornenia na novú verziu</system:String>
<system:String x:Key="SearchWindowPosition">Poloha vyhľadávacieho okna</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Zapamätať si poslednú pozíciu</system:String>
@ -169,14 +175,18 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="KoreanImeSettingChangeFailTitle">Nepodarilo sa zmeniť nastavenie kórejského IME</system:String>
<system:String x:Key="KoreanImeSettingChangeFailSubTitle">Skontrolujte prístup do systémového registra alebo kontaktujte podporu.</system:String>
<system:String x:Key="homePage">Domovská stránka</system:String>
<system:String x:Key="homePageToolTip">Zobraziť výsledky Domovskej stránky, keď je text dopytu prázdny.</system:String>
<system:String x:Key="historyResultsForHomePage">Zobraziť výsledky histórie na Domovskej stránke</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximálny počet zobrazených výsledkov histórie na Domovskej stránke</system:String>
<system:String x:Key="homeToggleBoxToolTip">Úprava je možná len vtedy, ak plugin podporuje funkciu Domovská stránka a Domovská stránka je povolená.</system:String>
<system:String x:Key="homePageToolTip">Zobraziť výsledky domovskej stránky, keď je text dopytu prázdny.</system:String>
<system:String x:Key="historyResultsForHomePage">Zobraziť výsledky histórie na domovskej stránke</system:String>
<system:String x:Key="historyResultsCountForHomePage">Maximálny počet histórie výsledkov zobrazenej na domovskej stránke</system:String>
<system:String x:Key="historyStyle">Štýl histórie</system:String>
<system:String x:Key="historyStyleTooltip">Vyberte, ktorý typ histórie sa má zobraziť v histórii a na domovskej stránke</system:String>
<system:String x:Key="queryHistory">História dopytov</system:String>
<system:String x:Key="executedHistory">História naposledy otvorených</system:String>
<system:String x:Key="homeToggleBoxToolTip">Úprava je možná len vtedy, ak plugin podporuje funkciu domovská stránka a zároveň je povolená.</system:String>
<system:String x:Key="showAtTopmost">Zobraziť vyhľadávacie okno v popredí</system:String>
<system:String x:Key="showAtTopmostToolTip">Prepíše nastavenie &quot;Vždy na vrchu&quot; ostatných programov a zobrazí navrchu Flow.</system:String>
<system:String x:Key="autoRestartAfterChanging">Reštartovať po úprave pluginu cez Repozitár pluginov</system:String>
<system:String x:Key="autoRestartAfterChangingToolTip">Automaticky reštartovať Flow Launcher po inštalácii/odinštalácii/aktualizáciu pluginu cez Repozitár pluginov</system:String>
<system:String x:Key="autoRestartAfterChangingToolTip">Automaticky reštartovať Flow Launcher po inštalácii/odinštalácii/aktualizácii pluginu cez Repozitár pluginov</system:String>
<system:String x:Key="showUnknownSourceWarning">Zobraziť upozornenie na neznámy zdroj</system:String>
<system:String x:Key="showUnknownSourceWarningToolTip">Zobraziť upozornenie pri inštalácii z neznámych zdrojov</system:String>
<system:String x:Key="autoUpdatePlugins">Automaticky aktualizovať pluginy</system:String>
@ -215,6 +225,8 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="plugin_query_version">Verzia</system:String>
<system:String x:Key="plugin_query_web">Webstránka</system:String>
<system:String x:Key="plugin_uninstall">Odinštalovať</system:String>
<system:String x:Key="plugin_default_search_delay_time">Oneskorenie vyhľadávania: predvolené</system:String>
<system:String x:Key="plugin_search_delay_time">Oneskorenie vyhľadávania: {0} ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Nepodarilo sa odstrániť nastavenia pluginu</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Pluginy: {0} Nepodarilo sa odstrániť súbory s nastaveniami pluginu, odstráňte ich manuálne</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Nepodarilo sa odstrániť vyrovnávaciu pamäť pluginu</system:String>
@ -225,6 +237,10 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="failedToUninstallPluginTitle">Nepodarilo sa odinštalovať {0}</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>
@ -255,7 +271,7 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="UpdatePromptTitle">Aktualizácia pluginu</system:String>
<system:String x:Key="UpdatePromptSubtitle">{0} od {1} {2}{2}Chcete aktualizovať tento plugin?</system:String>
<system:String x:Key="DownloadingPlugin">Sťahovanie pluginu</system:String>
<system:String x:Key="AutoRestartAfterChange">Automaticky reštartovať po inštalácii/odinštalácii/aktualizáciu pluginov cez Repozitár pluginov</system:String>
<system:String x:Key="AutoRestartAfterChange">Automaticky reštartovať po inštalácii/odinštalácii/aktualizácii pluginov cez Repozitár pluginov</system:String>
<system:String x:Key="ZipFileNotHavePluginJson">V zipe sa nenachádza platná konfigurácia plugin.json</system:String>
<system:String x:Key="InstallFromUnknownSourceTitle">Inštalácia z neznámeho zdroja</system:String>
<system:String x:Key="InstallFromUnknownSourceSubtitle">Tento plugin pochádza z neznámeho zdroja a môže predstavovať potenciálne riziká!{0}{0}Uistite sa, že viete, odkiaľ tento plugin pochádza, a že je bezpečný.{0}{0}Stále chcete pokračovať?{0}{0}(Toto upozornenie môžete vypnúť sekcii Všeobecné v nastaveniach)</system:String>
@ -267,7 +283,7 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="updateAllPluginsTitle">Dostupná aktualizácia pluginu</system:String>
<system:String x:Key="updateAllPluginsButtonContent">Aktualizovať pluginy</system:String>
<system:String x:Key="checkPluginUpdatesTooltip">Skontrolovať dostupnosť aktualizácií</system:String>
<system:String x:Key="PluginsUpdateSuccessNoRestart">Pluginy {0} boli úspešne aktualizované. Prosím, reštartuje Flow.</system:String>
<system:String x:Key="PluginsUpdateSuccessNoRestart">Pluginy boli úspešne aktualizované. Prosím, reštartuje Flow.</system:String>
<!-- Setting Theme -->
<system:String x:Key="theme">Motív</system:String>
@ -396,28 +412,28 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="showBadges">Zobraziť výsledok v odznaku</system:String>
<system:String x:Key="showBadgesToolTip">Ak to plugin podporuje, zobrazí sa jeho ikona v odznaku na jednoduchšie odlíšenie.</system:String>
<system:String x:Key="showBadgesGlobalOnly">Zobraziť výsledok v odznaku len pre globálne vyhľadávanie</system:String>
<system:String x:Key="showBadgesGlobalOnlyToolTip">Show badges for global query results only</system:String>
<system:String x:Key="dialogJumpHotkey">Dialog Jump</system:String>
<system:String x:Key="dialogJumpHotkeyToolTip">Enter shortcut to quickly navigate the Open/Save As dialog window to the path of the current file manager.</system:String>
<system:String x:Key="dialogJump">Dialog Jump</system:String>
<system:String x:Key="dialogJumpToolTip">When Open/Save As dialog window opens, quickly navigate to the current path of the file manager.</system:String>
<system:String x:Key="autoDialogJump">Dialog Jump Automatically</system:String>
<system:String x:Key="autoDialogJumpToolTip">When Open/Save As dialog window is displayed, automatically navigate to the path of the current file manager. (Experimental)</system:String>
<system:String x:Key="showDialogJumpWindow">Show Dialog Jump Window</system:String>
<system:String x:Key="showDialogJumpWindowToolTip">Display Dialog Jump search window when the open/save dialog window is shown to quickly navigate to file/folder locations.</system:String>
<system:String x:Key="dialogJumpWindowPosition">Dialog Jump Window Position</system:String>
<system:String x:Key="dialogJumpWindowPositionToolTip">Select position for the Dialog Jump search window</system:String>
<system:String x:Key="DialogJumpWindowPositionUnderDialog">Fixed under the Open/Save As dialog window. Displayed on open and stays until the window is closed</system:String>
<system:String x:Key="DialogJumpWindowPositionFollowDefault">Default search window position. Displayed when triggered by search window hotkey</system:String>
<system:String x:Key="dialogJumpResultBehaviour">Dialog Jump Result Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window to the selected result path</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Left click or Enter key</system:String>
<system:String x:Key="DialogJumpResultBehaviourRightClick">Right click</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">Dialog Jump File Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpFileResultBehaviourToolTip">Behaviour to navigate Open/Save As dialog window when the result is a file path</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPath">Fill full path in file name box</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPathOpen">Fill full path in file name box and open</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourDirectory">Fill directory in path box</system:String>
<system:String x:Key="showBadgesGlobalOnlyToolTip">Zobrazí výsledok v odznaku len pre výsledky globálneho vyhľadávania</system:String>
<system:String x:Key="dialogJumpHotkey">Rýchly prechod</system:String>
<system:String x:Key="dialogJumpHotkeyToolTip">Zadajte skratku na rýchly prechod na aktuálnu cestu správcu súborov v dialógovom okne Otvoriť/Uložiť.</system:String>
<system:String x:Key="dialogJump">Rýchly prechod</system:String>
<system:String x:Key="dialogJumpToolTip">Keď sa otvorí dialógové okno Otvoriť/Uložiť, rýchlo prejdete na aktuálnu cestu správcu súborov.</system:String>
<system:String x:Key="autoDialogJump">Automatický rýchly prechod</system:String>
<system:String x:Key="autoDialogJumpToolTip">Keď je otvorené dialógové okno Otvoriť/Uložiť, automaticky prejsť na cestu v aktuálnom správcovi súborov (Experimentálne)</system:String>
<system:String x:Key="showDialogJumpWindow">Zobraziť okno na rýchly prechod</system:String>
<system:String x:Key="showDialogJumpWindowToolTip">Zobraziť okno rýchleho prechodu, keď je zobrazené dialógové okno Ovoriť/Uložiť na rýchlu navigáciu do umiestnenia súborov/priečinkov.</system:String>
<system:String x:Key="dialogJumpWindowPosition">Umiestnenie okna &quot;rýchly prechod&quot;</system:String>
<system:String x:Key="dialogJumpWindowPositionToolTip">Vyberte umiestnenie vyhľadávacieho okna pre &quot;rýchly prechod&quot;</system:String>
<system:String x:Key="DialogJumpWindowPositionUnderDialog">Fixné pod oknom Otvoriť/Uložiť. Zostane zobrazené po otvorení až do uzavretia okna</system:String>
<system:String x:Key="DialogJumpWindowPositionFollowDefault">Predvolená pozícia vyhľadávacieho okna. Zobrazí sa po zadaní skratky na otvorenie vyhľadávacieho okna</system:String>
<system:String x:Key="dialogJumpResultBehaviour">Akcia na prechod k výsledku rýchleho prechodu</system:String>
<system:String x:Key="dialogJumpResultBehaviourToolTip">Ako prejsť na vybranú cestu v otvorenom dialógovom okne Otvoriť/Uložiť</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Kliknutie ľavým tlačidlom myši alebo klávesom Enter</system:String>
<system:String x:Key="DialogJumpResultBehaviourRightClick">Kliknutie pravým tlačidlom myši</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">Akcia na prechod k súboru rýchleho prechodu</system:String>
<system:String x:Key="dialogJumpFileResultBehaviourToolTip">Akcia, ktorá sa vykoná na navigáciu v dialógovom okne Otvoriť/Uložiť, ak výsledkom je súbor</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPath">Vložiť celú cestu k súboru do poľa názvu súboru</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPathOpen">Vložiť celú cestu k súboru do poľa názvu súboru a otvoriť</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourDirectory">Vložiť priečinok do poľa s cestou</system:String>
<!-- Setting Proxy -->
<system:String x:Key="proxy">HTTP proxy</system:String>
@ -468,8 +484,10 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="userdatapathButton">Otvoriť priečinok</system:String>
<system:String x:Key="advanced">Rozšírené</system:String>
<system:String x:Key="logLevel">Úroveň logovania</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Žiadne</system:String>
<system:String x:Key="LogLevelERROR">Chyba</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Nastavenie písma okna</system:String>
<!-- Release Notes Window -->
@ -482,8 +500,8 @@ Nevykonali sa žiadne zmeny.</system:String>
<!-- FileManager Setting Dialog -->
<system:String x:Key="fileManagerWindow">Vyberte správcu súborov</system:String>
<system:String x:Key="fileManager_learnMore">Viac informácií</system:String>
<system:String x:Key="fileManager_tips">Zadajte umiestnenie súboru správcu súborov, ktorý používate, a podľa potreby pridajte argumenty. &quot;%d&quot; predstavuje cestu k priečinku, ktorý sa má otvoriť, používa sa v poli Arg pre priečinok a pri príkazoch na otvorenie konkrétnych priečinkov. &quot;%f&quot; predstavuje cestu k súboru, ktorá sa má otvoriť a používa sa v poli Arg pre súbor a pri príkazoch na otvorenie konkrétnych súborov.</system:String>
<system:String x:Key="fileManager_tips2">Napríklad, ak správca súborov používa príkaz ako &quot;totalcmd.exe /A c:\windows&quot; na otvorenie priečinka c:\windows, cesta správcu súborov bude totalcmd.exe a Arg pre priečinok bude /A &quot;%d&quot;. Niektorí správcovia súborov, ako napríklad QTTabBar, môžu vyžadovať len zadanie cesty, v tomto prípade použite &quot;%d&quot; ako cestu správcu súborov a zvyšok súborov nechajte prázdny.</system:String>
<system:String x:Key="fileManager_tips">Zadajte umiestnenie súboru správcu súborov, ktorý používate, a podľa potreby pridajte argumenty. &quot;%d&quot; predstavuje cestu k priečinku, ktorý sa má otvoriť, používa sa v poli Arg. pre priečinok a pri príkazoch na otvorenie konkrétnych priečinkov. &quot;%f&quot; predstavuje cestu k súboru, ktorá sa má otvoriť a používa sa v poli Arg. pre súbor a pri príkazoch na otvorenie konkrétnych súborov.</system:String>
<system:String x:Key="fileManager_tips2">Napríklad, ak správca súborov používa príkaz ako &quot;totalcmd.exe /A c:\windows&quot; na otvorenie priečinka c:\windows, cesta správcu súborov bude totalcmd.exe a Arg. pre priečinok bude /A &quot;%d&quot;. Niektorí správcovia súborov, ako napríklad QTTabBar, môžu vyžadovať len zadanie cesty, v tomto prípade použite &quot;%d&quot; ako cestu správcu súborov a zvyšok súborov nechajte prázdny.</system:String>
<system:String x:Key="fileManager_name">Správca súborov</system:String>
<system:String x:Key="fileManager_profile_name">Názov profilu</system:String>
<system:String x:Key="fileManager_path">Cesta k správcovi súborov</system:String>
@ -491,6 +509,7 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="fileManager_file_arg">Arg. pre súbor</system:String>
<system:String x:Key="fileManagerPathNotFound">Správca súborov '{0}' sa nenachádza na '{1}'. Chcete pokračovať?</system:String>
<system:String x:Key="fileManagerPathError">Chyba v ceste k správcovi súborov</system:String>
<system:String x:Key="fileManagerExplorer">Prieskumník</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Predvolený webový prehliadač</system:String>
@ -501,6 +520,8 @@ Nevykonali sa žiadne zmeny.</system:String>
<system:String x:Key="defaultBrowser_newWindow">Nové okno</system:String>
<system:String x:Key="defaultBrowser_newTab">Nová karta</system:String>
<system:String x:Key="defaultBrowser_parameter">Privátny režim</system:String>
<system:String x:Key="defaultBrowser_default">Predvolené</system:String>
<system:String x:Key="defaultBrowser_new_profile">Nový profil</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Zmena priority</system:String>
@ -527,7 +548,7 @@ Nevykonali sa žiadne zmeny.</system:String>
<!-- Search Delay Settings Dialog -->
<system:String x:Key="homeTitle">Domovská stránka</system:String>
<system:String x:Key="homeTips">Ak chcete zobrazovať výsledky pluginu, keď je dopyt prázdny, povoľte funkciu Domovská stránka.</system:String>
<system:String x:Key="homeTips">Ak chcete zobrazovať výsledky pluginu, keď je dopyt prázdny, povoľte funkciu domovská stránka.</system:String>
<!-- Custom Query Hotkey Dialog -->
<system:String x:Key="customeQueryHotkeyTitle">Klávesová skratka vlastného vyhľadávania</system:String>
@ -590,8 +611,9 @@ Ak pri zadávaní skratky pred ňu pridáte &quot;@&quot;, bude sa zhodovať s
Zadaný správca súborov sa nenašiel. Skontrolujte nastavenie vlastného správcu súborov v Nastavenia &gt; Všeobecné.
</system:String>
<system:String x:Key="errorTitle">Chyba</system:String>
<system:String x:Key="folderOpenError">Počas otvárania priečinka sa vyskytla chyba. {0}</system:String>
<system:String x:Key="folderOpenError">Pri otváraní priečinka došlo k chybe.</system:String>
<system:String x:Key="browserOpenError">Pri otváraní adresy URL v prehliadači došlo k chybe. Skontrolujte konfiguráciu predvoleného webového prehliadača v nastaveniach Všeobecné</system:String>
<system:String x:Key="fileNotFoundError">Súbor alebo priečinok sa nenašiel: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Čakajte, prosím...</system:String>
@ -619,7 +641,7 @@ Ak pri zadávaní skratky pred ňu pridáte &quot;@&quot;, bude sa zhodovať s
<!-- Plugin Update Window -->
<system:String x:Key="restartAfterUpdating">Po aktualizácii pluginov reštartovať Flow Launcher</system:String>
<system:String x:Key="updatePluginCheckboxContent">{0}: Aktualizované z v{1} na v{2}</system:String>
<system:String x:Key="updatePluginCheckboxContent">{0}: Aktualizácia z v{1} na v{2}</system:String>
<system:String x:Key="updatePluginNoSelected">Nie je vybraný žiaden plugin</system:String>
<!-- Welcome Window -->

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Position Reset</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</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="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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Settings</system:String>
@ -75,6 +79,8 @@
<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="setAutoStartFailed">Error setting launch on startup</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Hide Flow Launcher when focus is lost</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="dontPromptUpdateMsg">Do not show new version notifications</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String>
@ -171,6 +177,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Version</system:String>
<system:String x:Key="plugin_query_web">Website</system:String>
<system:String x:Key="plugin_uninstall">Uninstall</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">You have activated Flow Launcher {0} times</system:String>
<system:String x:Key="checkUpdates">Check for Updates</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">New version {0} is available, would you like to restart Flow Launcher to use the update?</system:String>
<system:String x:Key="checkUpdatesFailed">Check updates failed, please check your connection and proxy settings to api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Open Folder</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Error</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Arg For File</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Default Web Browser</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">New Window</system:String>
<system:String x:Key="defaultBrowser_newTab">New Tab</system:String>
<system:String x:Key="defaultBrowser_parameter">Private Mode</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Change Priority</system:String>
@ -589,8 +610,9 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">Error</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Please wait...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Position Reset</system:String>
<system:String x:Key="PositionResetToolTip">Reset search window position</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="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>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Podešavanja</system:String>
@ -75,6 +79,8 @@
<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="setAutoStartFailed">Error setting launch on startup</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Sakri Flow Launcher kada se izgubi fokus</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="dontPromptUpdateMsg">Ne prikazuj obaveštenje o novoj verziji</system:String>
<system:String x:Key="SearchWindowPosition">Search Window Location</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String>
@ -171,6 +177,10 @@
<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="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>
<system:String x:Key="queryHistory">Query history</system:String>
<system:String x:Key="executedHistory">Last opened history</system:String>
<system:String x:Key="homeToggleBoxToolTip">This can only be edited if plugin supports Home feature and Home Page is enabled.</system:String>
<system:String x:Key="showAtTopmost">Show Search Window at Foremost</system:String>
<system:String x:Key="showAtTopmostToolTip">Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Verzija</system:String>
<system:String x:Key="plugin_query_web">Website</system:String>
<system:String x:Key="plugin_uninstall">Uninstall</system:String>
<system:String x:Key="plugin_default_search_delay_time">Search delay time: default</system:String>
<system:String x:Key="plugin_search_delay_time">Search delay time: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Fail to remove plugin settings</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Plugins: {0} - Fail to remove plugin settings files, please remove them manually</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Fail to remove plugin cache</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Fail to uninstall {0}</system:String>
<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>
@ -443,7 +459,7 @@
<system:String x:Key="icons">Icons</system:String>
<system:String x:Key="about_activate_times">Aktivirali ste Flow Launcher {0} puta</system:String>
<system:String x:Key="checkUpdates">Proveri ažuriranja</system:String>
<system:String x:Key="BecomeASponsor">Become A Sponsor</system:String>
<system:String x:Key="BecomeASponsor">Become a Sponsor</system:String>
<system:String x:Key="newVersionTips">Nove verzija {0} je dostupna, molim Vas ponovo pokrenite Flow Launcher.</system:String>
<system:String x:Key="checkUpdatesFailed">Neuspešna provera ažuriranja, molim Vas proverite vašu vezu i podešavanja za proksi prema api.github.com.</system:String>
<system:String x:Key="downloadUpdatesFailed">
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Open Folder</system:String>
<system:String x:Key="advanced">Advanced</system:String>
<system:String x:Key="logLevel">Log Level</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="LogLevelNONE">Silent</system:String>
<system:String x:Key="LogLevelERROR">Error</system:String>
<system:String x:Key="LogLevelINFO">Info</system:String>
<system:String x:Key="LogLevelDEBUG">Debug</system:String>
<system:String x:Key="settingWindowFontTitle">Setting Window Font</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Arg For File</system:String>
<system:String x:Key="fileManagerPathNotFound">The file manager '{0}' could not be located at '{1}'. Would you like to continue?</system:String>
<system:String x:Key="fileManagerPathError">File Manager Path Error</system:String>
<system:String x:Key="fileManagerExplorer">File Explorer</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Default Web Browser</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">New Window</system:String>
<system:String x:Key="defaultBrowser_newTab">New Tab</system:String>
<system:String x:Key="defaultBrowser_parameter">Private Mode</system:String>
<system:String x:Key="defaultBrowser_default">Default</system:String>
<system:String x:Key="defaultBrowser_new_profile">New Profile</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Change Priority</system:String>
@ -589,8 +610,9 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
The specified file manager could not be found. Please check the Custom File Manager setting under Settings &gt; General.
</system:String>
<system:String x:Key="errorTitle">Error</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder. {0}</system:String>
<system:String x:Key="folderOpenError">An error occurred while opening the folder.</system:String>
<system:String x:Key="browserOpenError">An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window</system:String>
<system:String x:Key="fileNotFoundError">File or directory not found: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Please wait...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Pencere Konumunu Sıfırla</system:String>
<system:String x:Key="PositionResetToolTip">Arama penceresinin konumunu sıfırla</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Aramak için buraya yazın</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Bu eklenti hala başlatılıyor...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Yeniden sorgulamak için bu sonucu seçin</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Yanıt veremedi!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Daha fazla bilgi için bu sonucu seçin</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Ayarlar</system:String>
@ -75,6 +79,8 @@
<system:String x:Key="useLogonTaskForStartupTooltip">Kaldırma işleminden sonra, bu görevi (Flow.Launcher Startup) Görev Zamanlayıcı üzerinden elle kaldırmanız gerekmektedir</system:String>
<system:String x:Key="setAutoStartFailed">Sistemle başlatma ayarı başarısız oldu</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Odak Pencereden Ayrıldığında Gizle</system:String>
<system:String x:Key="showTaskbarWhenOpened">Flow Launcher açıldığında görev çubuğunu göster</system:String>
<system:String x:Key="showTaskbarWhenOpenedToolTip">Flow Launcher açıldığında geçici olarak görev çubuğunu gösterir, otomatik gizlenen görev çubukları için kullanışlıdır.</system:String>
<system:String x:Key="dontPromptUpdateMsg">Güncelleme bildirimlerini gösterme</system:String>
<system:String x:Key="SearchWindowPosition">Pencere Konumu</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Son Konumu Hatırla</system:String>
@ -171,6 +177,10 @@
<system:String x:Key="homePageToolTip">Sorgu metni boş olduğunda ana sayfa sonuçlarını gösterin.</system:String>
<system:String x:Key="historyResultsForHomePage">Geçmiş Sonuçlarını Ana Sayfada Göster</system:String>
<system:String x:Key="historyResultsCountForHomePage">Ana Sayfada Gösterilen Maksimum Geçmiş Sonuçları</system:String>
<system:String x:Key="historyStyle">Geçmiş Stili</system:String>
<system:String x:Key="historyStyleTooltip">Geçmiş ve Ana Sayfada gösterilecek geçmiş türünü seçin</system:String>
<system:String x:Key="queryHistory">Sorgu geçmişi</system:String>
<system:String x:Key="executedHistory">Son açılan geçmiş</system:String>
<system:String x:Key="homeToggleBoxToolTip">Bu sadece eklenti Ana Sayfa özelliğini destekliyorsa ve Ana Sayfa etkinleştirilmiş ise düzenlenebilir.</system:String>
<system:String x:Key="showAtTopmost">Arama Penceresini En Üstte Göster</system:String>
<system:String x:Key="showAtTopmostToolTip">Diğer programların 'Her Zaman Üstte' ayarını geçersiz kılar ve Flowu en önde gösterir.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Sürüm</system:String>
<system:String x:Key="plugin_query_web">İnternet Sitesi</system:String>
<system:String x:Key="plugin_uninstall">Kaldır</system:String>
<system:String x:Key="plugin_default_search_delay_time">Arama gecikme süresi: varsayılan</system:String>
<system:String x:Key="plugin_search_delay_time">Arama gecikme süresi: {0}ms</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Eklenti ayarları kaldırılamıyor</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Eklentiler: {0} - Ayar dosyaları kaldırılamadı, lütfen elle silin</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Eklenti ön belleği kaldırılamıyor</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">{0} kaldırılamıyor</system:String>
<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>
@ -332,7 +348,7 @@
<system:String x:Key="PlaceholderTextTip">Yer tutucu metnini değiştirin. Boş bırakılırsa şu kullanılacak: {0}</system:String>
<system:String x:Key="KeepMaxResults">Sabit Pencere Boyutu</system:String>
<system:String x:Key="KeepMaxResultsToolTip">Pencere boyutu sürüklenerek ayarlanamaz.</system:String>
<system:String x:Key="MaxShowResultsCannotWorkWithAlwaysPreview">Since Always Preview is on, maximum results shown may not take effect because preview panel requires a certain minimum height</system:String>
<system:String x:Key="MaxShowResultsCannotWorkWithAlwaysPreview">Always Preview (Her Zaman Önizleme) açık olduğundan, önizleme paneli belirli bir minimum yükseklik gerektirdiğinden, gösterilen maksimum sonuçlar etkili olmayabilir</system:String>
<!-- Setting Hotkey -->
<system:String x:Key="hotkey">Kısayol Tuşu</system:String>
@ -405,14 +421,14 @@
<system:String x:Key="showDialogJumpWindow">Diyalog Atlama Penceresini Göster</system:String>
<system:String x:Key="showDialogJumpWindowToolTip">Dosya/klasör konumlarına hızlı erişim için aç/kaydet penceresi gösterildiğinde Diyalog Atlama arama penceresini görüntüle.</system:String>
<system:String x:Key="dialogJumpWindowPosition">Diyalog Atlama Penceresi Konumu</system:String>
<system:String x:Key="dialogJumpWindowPositionToolTip">Select position for the Dialog Jump search window</system:String>
<system:String x:Key="dialogJumpWindowPositionToolTip">Diyalog Atlama arama penceresi için konum seçin</system:String>
<system:String x:Key="DialogJumpWindowPositionUnderDialog">Farklı Aç/Kaydet iletişim penceresinin altında düzeltildi. Açıldığında görüntülenir ve pencere kapatılana kadar kalır</system:String>
<system:String x:Key="DialogJumpWindowPositionFollowDefault">Varsayılan arama penceresi konumu. Arama penceresi kısayol tuşu tarafından tetiklendiğinde görüntülenir</system:String>
<system:String x:Key="dialogJumpResultBehaviour">Dialog Jump Result Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpResultBehaviour">Diyalog Atlama Sonucu Gezinme Davranışı</system:String>
<system:String x:Key="dialogJumpResultBehaviourToolTip">Farklı Aç/Kaydet iletişim penceresini seçilen sonuç yoluna yönlendirmek için davranış</system:String>
<system:String x:Key="DialogJumpResultBehaviourLeftClick">Sol tık veya Enter tuşu</system:String>
<system:String x:Key="DialogJumpResultBehaviourRightClick">Sağ tık</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">Dialog Jump File Navigation Behaviour</system:String>
<system:String x:Key="dialogJumpFileResultBehaviour">Dialog Jump Dosya Gezinme Davranışı</system:String>
<system:String x:Key="dialogJumpFileResultBehaviourToolTip">Sonuç bir dosya yolu olduğunda Farklı Aç/Kaydet iletişim penceresinde gezinme davranışı</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPath">Dosya adı kutusuna tam yolu girin</system:String>
<system:String x:Key="DialogJumpFileResultBehaviourFullPathOpen">Dosya adı kutusuna tam yolu girin ve açın</system:String>
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Klasörü Aç</system:String>
<system:String x:Key="advanced">Gelişmiş</system:String>
<system:String x:Key="logLevel">Günlük Düzeyi</system:String>
<system:String x:Key="LogLevelDEBUG">Hata ayıklama</system:String>
<system:String x:Key="LogLevelNONE">Sessiz</system:String>
<system:String x:Key="LogLevelERROR">Hata</system:String>
<system:String x:Key="LogLevelINFO">Bilgi</system:String>
<system:String x:Key="LogLevelDEBUG">Hata ayıklama</system:String>
<system:String x:Key="settingWindowFontTitle">Pencere Yazı Tipini Ayarla</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Dosya Açarken</system:String>
<system:String x:Key="fileManagerPathNotFound">'{0}' dosya yöneticisi '{1}' konumunda bulunamadı. Devam etmek ister misiniz?</system:String>
<system:String x:Key="fileManagerPathError">Dosya Yöneticisi Yol Hatası</system:String>
<system:String x:Key="fileManagerExplorer">Dosya Gezgini</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">İnternet Tarayıcı Seçenekleri</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">Yeni Pencere</system:String>
<system:String x:Key="defaultBrowser_newTab">Yeni Sekme</system:String>
<system:String x:Key="defaultBrowser_parameter">Gizli Mod için Bağımsız Değişken</system:String>
<system:String x:Key="defaultBrowser_default">Varsayılan</system:String>
<system:String x:Key="defaultBrowser_new_profile">Yeni Profil</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Önceliği Ayarla</system:String>
@ -587,8 +608,9 @@
Belirtilen dosya yöneticisi bulunamadı. Lütfen Ayarlar &gt; Genel bölümündeki Özel Dosya Yöneticisi ayarını kontrol edin.
</system:String>
<system:String x:Key="errorTitle">Hata</system:String>
<system:String x:Key="folderOpenError">Klasör açılırken bir hata oluştu. {0}</system:String>
<system:String x:Key="folderOpenError">Klasör açılırken bir hata oluştu.</system:String>
<system:String x:Key="browserOpenError">URL tarayıcıda açılırken bir hata oluştu. Lütfen ayarlar penceresindeki Genel bölümden Varsayılan Web Tarayıcısı ayarını kontrol edin</system:String>
<system:String x:Key="fileNotFoundError">Dosya veya dizin bulunamadı: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Lütfen bekleyin...</system:String>

View file

@ -64,6 +64,10 @@
<system:String x:Key="PositionReset">Скидання позиції</system:String>
<system:String x:Key="PositionResetToolTip">Скинути положення вікна пошуку</system:String>
<system:String x:Key="queryTextBoxPlaceholder">Напишіть тут, аби знайти</system:String>
<system:String x:Key="pluginStillInitializing">{0}: Цей плагін все ще ініціалізується...</system:String>
<system:String x:Key="pluginStillInitializingSubtitle">Виберіть цей результат, щоб повторити запит</system:String>
<system:String x:Key="pluginFailedToRespond">{0}: Не вдалося відповісти!</system:String>
<system:String x:Key="pluginFailedToRespondSubtitle">Виберіть цей результат, щоб отримати додаткову інформацію</system:String>
<!-- Setting General -->
<system:String x:Key="flowlauncher_settings">Налаштування</system:String>
@ -75,6 +79,8 @@
<system:String x:Key="useLogonTaskForStartupTooltip">Після видалення, вам необхідно вручну видалити це завдання (Flow.Launcher Startup) через планувальник завдань</system:String>
<system:String x:Key="setAutoStartFailed">Помилка запуску налаштування під час запуску</system:String>
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Сховати Flow Launcher, якщо втрачено фокус</system:String>
<system:String x:Key="showTaskbarWhenOpened">Показувати панель завдань, коли Flow Launcher відкрито</system:String>
<system:String x:Key="showTaskbarWhenOpenedToolTip">Тимчасово показувати панель завдань при відкритті Flow Launcher, корисно для автоматично прихованих панелей завдань.</system:String>
<system:String x:Key="dontPromptUpdateMsg">Не повідомляти про доступні нові версії</system:String>
<system:String x:Key="SearchWindowPosition">Розташування вікна пошуку</system:String>
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Пам'ятати останню позицію</system:String>
@ -171,6 +177,10 @@
<system:String x:Key="homePageToolTip">Показувати результати на головній сторінці, коли текст запиту порожній.</system:String>
<system:String x:Key="historyResultsForHomePage">Показати результати історії на головній</system:String>
<system:String x:Key="historyResultsCountForHomePage">Максимальна кількість результатів історії, що показуються на головній</system:String>
<system:String x:Key="historyStyle">Стиль історії</system:String>
<system:String x:Key="historyStyleTooltip">Виберіть тип історії, який буде показуватися на сторінці «Історія» та «Головна».</system:String>
<system:String x:Key="queryHistory">Історія запитів</system:String>
<system:String x:Key="executedHistory">Остання відкрита історія</system:String>
<system:String x:Key="homeToggleBoxToolTip">Це можна редагувати тільки в тому випадку, якщо плагін підтримує функцію «Головна сторінка» і вона ввімкнена.</system:String>
<system:String x:Key="showAtTopmost">Показувати вікно пошуку на передньому плані</system:String>
<system:String x:Key="showAtTopmostToolTip">Перекриває налаштування «Завжди зверху» інших програм і виводить Flow на передній план.</system:String>
@ -214,6 +224,8 @@
<system:String x:Key="plugin_query_version">Версія</system:String>
<system:String x:Key="plugin_query_web">Сайт</system:String>
<system:String x:Key="plugin_uninstall">Видалити</system:String>
<system:String x:Key="plugin_default_search_delay_time">Час затримки пошуку: типово</system:String>
<system:String x:Key="plugin_search_delay_time">Час затримки пошуку: {0} мс</system:String>
<system:String x:Key="failedToRemovePluginSettingsTitle">Не вдалося видалити налаштування плагіну</system:String>
<system:String x:Key="failedToRemovePluginSettingsMessage">Плагіни: {0} — Не вдалося видалити файли налаштувань плагінів, видаліть їх вручну.</system:String>
<system:String x:Key="failedToRemovePluginCacheTitle">Не вдалося видалити кеш плагіну</system:String>
@ -224,6 +236,10 @@
<system:String x:Key="failedToUninstallPluginTitle">Не вдалося видалити {0}</system:String>
<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>
@ -467,8 +483,10 @@
<system:String x:Key="userdatapathButton">Відкрити теку</system:String>
<system:String x:Key="advanced">Розширені</system:String>
<system:String x:Key="logLevel">Рівень журналювання</system:String>
<system:String x:Key="LogLevelDEBUG">Налагодження</system:String>
<system:String x:Key="LogLevelNONE">Без звуку</system:String>
<system:String x:Key="LogLevelERROR">Помилка</system:String>
<system:String x:Key="LogLevelINFO">Інформація</system:String>
<system:String x:Key="LogLevelDEBUG">Налагодження</system:String>
<system:String x:Key="settingWindowFontTitle">Встановлення шрифту вікна</system:String>
<!-- Release Notes Window -->
@ -490,6 +508,7 @@
<system:String x:Key="fileManager_file_arg">Аргумент для файлу</system:String>
<system:String x:Key="fileManagerPathNotFound">Не вдалося знайти файловий менеджер «{0}» за адресою «{1}». Чи бажаєте продовжити?</system:String>
<system:String x:Key="fileManagerPathError">Помилка шляху до файлового менеджера</system:String>
<system:String x:Key="fileManagerExplorer">Файловий провідник</system:String>
<!-- DefaultBrowser Setting Dialog -->
<system:String x:Key="defaultBrowserTitle">Типовий веббраузер</system:String>
@ -500,6 +519,8 @@
<system:String x:Key="defaultBrowser_newWindow">Нове вікно</system:String>
<system:String x:Key="defaultBrowser_newTab">Нова вкладка</system:String>
<system:String x:Key="defaultBrowser_parameter">Приватний режим</system:String>
<system:String x:Key="defaultBrowser_default">Типово</system:String>
<system:String x:Key="defaultBrowser_new_profile">Новий профіль</system:String>
<!-- Priority Setting Dialog -->
<system:String x:Key="changePriorityWindow">Змінити пріоритет</system:String>
@ -589,8 +610,9 @@
Вказаний файловий менеджер не знайдено. Перевірте налаштування вашого файлового менеджера в розділі Налаштування &gt; Загальні.
</system:String>
<system:String x:Key="errorTitle">Помилка</system:String>
<system:String x:Key="folderOpenError">Під час відкриття теки сталася помилка. {0}</system:String>
<system:String x:Key="folderOpenError">Під час відкриття теки сталася помилка.</system:String>
<system:String x:Key="browserOpenError">Під час відкриття URL-адреси в браузері сталася помилка. Перевірте налаштування типового веббраузера у розділі «Загальні» вікна налаштувань.</system:String>
<system:String x:Key="fileNotFoundError">Файл або каталог не знайдено: {0}</system:String>
<!-- General Notice -->
<system:String x:Key="pleaseWait">Будь ласка, зачекайте...</system:String>

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