From fcbf97275406c9775149be25a8c68c606871f6e3 Mon Sep 17 00:00:00 2001 From: pc223 <10551242+pc223@users.noreply.github.com> Date: Tue, 13 Jul 2021 03:44:28 +0700 Subject: [PATCH 001/552] Testing new search order: System.Search.Rank --- .../Search/WindowsIndex/QueryConstructor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs index 20e85bbb5..808f8e7e3 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs @@ -114,7 +114,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex /// public const string QueryWhereRestrictionsForAllFilesAndFoldersSearch = "scope='file:'"; - public const string QueryOrderByFileNameRestriction = " ORDER BY System.FileName"; + public const string QueryOrderByFileNameRestriction = " ORDER BY System.Search.Rank"; /// From 5d3b0ba2c06ceeea0f9f6cae668068bef0e7763a Mon Sep 17 00:00:00 2001 From: pc223 <10551242+pc223@users.noreply.github.com> Date: Tue, 13 Jul 2021 04:12:09 +0700 Subject: [PATCH 002/552] Should be DESC --- .../Search/WindowsIndex/QueryConstructor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs index 808f8e7e3..c42a60193 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/WindowsIndex/QueryConstructor.cs @@ -114,7 +114,7 @@ namespace Flow.Launcher.Plugin.Explorer.Search.WindowsIndex /// public const string QueryWhereRestrictionsForAllFilesAndFoldersSearch = "scope='file:'"; - public const string QueryOrderByFileNameRestriction = " ORDER BY System.Search.Rank"; + public const string QueryOrderByFileNameRestriction = " ORDER BY System.Search.Rank DESC"; /// From 7f887f55e1b1afcdffcb11c4ff8c98c1109af5d8 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sun, 16 Mar 2025 13:23:17 -0500 Subject: [PATCH 003/552] add github action --- .github/workflows/dotnet.yml | 96 ++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 .github/workflows/dotnet.yml diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml new file mode 100644 index 000000000..f33418e9a --- /dev/null +++ b/.github/workflows/dotnet.yml @@ -0,0 +1,96 @@ +# This workflow will build a .NET project +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net + +name: Build + +on: + workflow_dispatch: + push: + branches: + - dev + - master + pull_request: + +jobs: + build: + + runs-on: windows-latest + env: + FlowVersion: 1.19.5 + NUGET_CERT_REVOCATION_MODE: offline + BUILD_NUMBER: ${{ github.run_number }} + steps: + - uses: actions/checkout@v4 + - name: Set Flow.Launcher.csproj version + id: update + uses: vers-one/dotnet-project-version-updater@v1.5 + with: + file: | + "**/SolutionAssemblyInfo.cs" + version: ${{ env.FlowVersion }}.${{ env.BUILD_NUMBER }} + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 7.0.x +# cache: true +# cache-dependency-path: | +# Flow.Launcher/packages.lock.json +# Flow.Launcher.Core/packages.lock.json +# Flow.Launcher.Infrastructure/packages.lock.json +# Flow.Launcher.Plugin/packages.lock.json + - name: Install vpk + Install vpk tool (dotnet tool install will not reinstall if already installed) + We will update the cli by removing cache + run: | + if (!(Get-Command vpk -ErrorAction SilentlyContinue)) { + dotnet tool install -g vpk + } + - name: Restore dependencies + run: dotnet restore --locked-mode + - name: Build + run: dotnet build --no-restore -c Release + - name: Initialize Service + run: | + sc config WSearch start= auto # Starts Windows Search service- Needed for running ExplorerTest + net start WSearch + - name: Test + run: dotnet test --no-build --verbosity normal -c Release + - name: Perform post_build tasks + shell: pwsh + run: .\Scripts\post_build.ps1 -flowversion "${env:FlowVersion}-build.${env:BUILD_NUMBER}" + - name: Upload Plugin Nupkg + uses: actions/upload-artifact@v4 + with: + name: Plugin nupkg + path: | + Output\Release\Flow.Launcher.Plugin.*.nupkg + compression-level: 0 + - name: Upload Setup + uses: actions/upload-artifact@v4 + with: + name: Flow Installer + path: | + Output\Packages\Flow-Launcher-*.exe + compression-level: 0 + - name: Upload Portable Version + uses: actions/upload-artifact@v4 + with: + name: Portable Version + path: | + Output\Packages\Flow-Launcher-Portable.zip + compression-level: 0 + - name: Upload Full Nupkg + uses: actions/upload-artifact@v4 + with: + name: Full nupkg + path: | + Output\Packages\FlowLauncher-*-full.nupkg + + compression-level: 0 + - name: Upload Release Information + uses: actions/upload-artifact@v4 + with: + name: RELEASES + path: | + Output\Packages\RELEASES + compression-level: 0 From 8a5b699d57d804bf312e4121b7fa8bf2211fcef2 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sun, 16 Mar 2025 13:25:05 -0500 Subject: [PATCH 004/552] update vpk install --- .github/workflows/dotnet.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index f33418e9a..d69e66ed8 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -39,12 +39,7 @@ jobs: # Flow.Launcher.Infrastructure/packages.lock.json # Flow.Launcher.Plugin/packages.lock.json - name: Install vpk - Install vpk tool (dotnet tool install will not reinstall if already installed) - We will update the cli by removing cache - run: | - if (!(Get-Command vpk -ErrorAction SilentlyContinue)) { - dotnet tool install -g vpk - } + run: dotnet tool install -g vpk - name: Restore dependencies run: dotnet restore --locked-mode - name: Build From cb47632ef57d848141ba6f77fcae60439551f519 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sun, 16 Mar 2025 16:14:13 -0500 Subject: [PATCH 005/552] remove unused argument --- .github/workflows/dotnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index d69e66ed8..2e4531645 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -52,7 +52,7 @@ jobs: run: dotnet test --no-build --verbosity normal -c Release - name: Perform post_build tasks shell: pwsh - run: .\Scripts\post_build.ps1 -flowversion "${env:FlowVersion}-build.${env:BUILD_NUMBER}" + run: .\Scripts\post_build.ps1 - name: Upload Plugin Nupkg uses: actions/upload-artifact@v4 with: From 9cd4e80a767d113ae518419517a34f5c28f3b67c Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sun, 16 Mar 2025 16:26:14 -0500 Subject: [PATCH 006/552] use nuget packages path and fix pwsh behavior --- Scripts/post_build.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Scripts/post_build.ps1 b/Scripts/post_build.ps1 index 1757ed99e..e6586b280 100644 --- a/Scripts/post_build.ps1 +++ b/Scripts/post_build.ps1 @@ -33,14 +33,14 @@ function Build-Path { function Copy-Resources ($path) { # making version static as multiple versions can exist in the nuget folder and in the case a breaking change is introduced. - Copy-Item -Force $env:USERPROFILE\.nuget\packages\squirrel.windows\1.5.2\tools\Squirrel.exe $path\Output\Update.exe + Copy-Item -Force $env:NUGET_PACKAGES\squirrel.windows\1.5.2\tools\Squirrel.exe $path\Output\Update.exe } function Delete-Unused ($path, $config) { $target = "$path\Output\$config" $included = Get-ChildItem $target -Filter "*.dll" foreach ($i in $included){ - $deleteList = Get-ChildItem $target\Plugins -Include $i -Recurse | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq "$i" } + $deleteList = Get-ChildItem $target\Plugins -Filter $i.Name -Recurse | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq $i.Name } $deleteList | ForEach-Object{ Write-Host Deleting duplicated $_.Name with version $_.VersionInfo.FileVersion at location $_.Directory.FullName } $deleteList | Remove-Item } @@ -72,14 +72,14 @@ function Pack-Squirrel-Installer ($path, $version, $output) { Write-Host "Input path: $input" # dotnet pack is not used because ran into issues, need to test installation and starting up if to use it. - nuget pack $spec -Version $version -BasePath $input -OutputDirectory $output -Properties Configuration=Release + dotnet pack $spec -Version $version -BasePath $input -OutputDirectory $output -Properties Configuration=Release $nupkg = "$output\FlowLauncher.$version.nupkg" Write-Host "nupkg path: $nupkg" $icon = "$path\Flow.Launcher\Resources\app.ico" Write-Host "icon: $icon" # Squirrel.com: https://github.com/Squirrel/Squirrel.Windows/issues/369 - New-Alias Squirrel $env:USERPROFILE\.nuget\packages\squirrel.windows\1.5.2\tools\Squirrel.exe -Force + New-Alias Squirrel $env:NUGET_PACKAGES\squirrel.windows\1.5.2\tools\Squirrel.exe -Force # why we need Write-Output: https://github.com/Squirrel/Squirrel.Windows/issues/489#issuecomment-156039327 # directory of releaseDir in squirrel can't be same as directory ($nupkg) in releasify $temp = "$output\Temp" From 0017971b3170f06d0a4d405a9a124f0d1841b9d2 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sun, 16 Mar 2025 16:39:50 -0500 Subject: [PATCH 007/552] revert nuget_packages enviromental variables --- Scripts/post_build.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/post_build.ps1 b/Scripts/post_build.ps1 index e6586b280..d324fd5aa 100644 --- a/Scripts/post_build.ps1 +++ b/Scripts/post_build.ps1 @@ -33,7 +33,7 @@ function Build-Path { function Copy-Resources ($path) { # making version static as multiple versions can exist in the nuget folder and in the case a breaking change is introduced. - Copy-Item -Force $env:NUGET_PACKAGES\squirrel.windows\1.5.2\tools\Squirrel.exe $path\Output\Update.exe + Copy-Item -Force $env:USERPROFILE\.nuget\packages\squirrel.windows\1.5.2\tools\Squirrel.exe $path\Output\Update.exe } function Delete-Unused ($path, $config) { @@ -79,7 +79,7 @@ function Pack-Squirrel-Installer ($path, $version, $output) { $icon = "$path\Flow.Launcher\Resources\app.ico" Write-Host "icon: $icon" # Squirrel.com: https://github.com/Squirrel/Squirrel.Windows/issues/369 - New-Alias Squirrel $env:NUGET_PACKAGES\squirrel.windows\1.5.2\tools\Squirrel.exe -Force + New-Alias Squirrel $env:USERPROFILE\.nuget\packages\squirrel.windows\1.5.2\tools\Squirrel.exe -Force # why we need Write-Output: https://github.com/Squirrel/Squirrel.Windows/issues/489#issuecomment-156039327 # directory of releaseDir in squirrel can't be same as directory ($nupkg) in releasify $temp = "$output\Temp" From 01b4b27d82d5fb5af8aad67454e9cf66ae3a3cf1 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sun, 16 Mar 2025 16:48:35 -0500 Subject: [PATCH 008/552] revert dotnet pack --- Scripts/post_build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/post_build.ps1 b/Scripts/post_build.ps1 index d324fd5aa..84b9a3877 100644 --- a/Scripts/post_build.ps1 +++ b/Scripts/post_build.ps1 @@ -72,7 +72,7 @@ function Pack-Squirrel-Installer ($path, $version, $output) { Write-Host "Input path: $input" # dotnet pack is not used because ran into issues, need to test installation and starting up if to use it. - dotnet pack $spec -Version $version -BasePath $input -OutputDirectory $output -Properties Configuration=Release + nuget pack $spec -Version $version -BasePath $input -OutputDirectory $output -Properties Configuration=Release $nupkg = "$output\FlowLauncher.$version.nupkg" Write-Host "nupkg path: $nupkg" From cb839a15686eb6ee4794dc0c0b1302bf2652f9bc Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sun, 16 Mar 2025 17:01:57 -0500 Subject: [PATCH 009/552] ignore System.Text.Encodings.Web.dll --- Scripts/post_build.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Scripts/post_build.ps1 b/Scripts/post_build.ps1 index 84b9a3877..6863edb5c 100644 --- a/Scripts/post_build.ps1 +++ b/Scripts/post_build.ps1 @@ -40,6 +40,10 @@ function Delete-Unused ($path, $config) { $target = "$path\Output\$config" $included = Get-ChildItem $target -Filter "*.dll" foreach ($i in $included){ + if ($i.Name in ["System.Text.Encodings.Web.dll"]) { + # ignore some specific dll that seems to make issue + continue + } $deleteList = Get-ChildItem $target\Plugins -Filter $i.Name -Recurse | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq $i.Name } $deleteList | ForEach-Object{ Write-Host Deleting duplicated $_.Name with version $_.VersionInfo.FileVersion at location $_.Directory.FullName } $deleteList | Remove-Item From a870e2773a2eeffdbced2c47842323f7c88dd8f1 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sun, 16 Mar 2025 17:07:33 -0500 Subject: [PATCH 010/552] fix ignore list --- Scripts/post_build.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Scripts/post_build.ps1 b/Scripts/post_build.ps1 index 6863edb5c..40f102ab4 100644 --- a/Scripts/post_build.ps1 +++ b/Scripts/post_build.ps1 @@ -40,7 +40,9 @@ function Delete-Unused ($path, $config) { $target = "$path\Output\$config" $included = Get-ChildItem $target -Filter "*.dll" foreach ($i in $included){ - if ($i.Name in ["System.Text.Encodings.Web.dll"]) { + $ignored = ["System.Text.Encodings.Web.dll"] + + if ($ignored.Contains($i.Name)) { # ignore some specific dll that seems to make issue continue } From d770e6dbb5d39a1ac711728f790831fbc8c81089 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sun, 16 Mar 2025 17:08:55 -0500 Subject: [PATCH 011/552] try delete only the first level dll --- Scripts/post_build.ps1 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Scripts/post_build.ps1 b/Scripts/post_build.ps1 index 40f102ab4..a10441026 100644 --- a/Scripts/post_build.ps1 +++ b/Scripts/post_build.ps1 @@ -46,9 +46,11 @@ function Delete-Unused ($path, $config) { # ignore some specific dll that seems to make issue continue } - $deleteList = Get-ChildItem $target\Plugins -Filter $i.Name -Recurse | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq $i.Name } - $deleteList | ForEach-Object{ Write-Host Deleting duplicated $_.Name with version $_.VersionInfo.FileVersion at location $_.Directory.FullName } - $deleteList | Remove-Item + foreach ($plugin in Get-ChildItem $target\Plugins){ + $deleteList = Get-ChildItem $target\Plugins -Filter $i.Name | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq $i.Name } + $deleteList | ForEach-Object{ Write-Host Deleting duplicated $_.Name with version $_.VersionInfo.FileVersion at location $_.Directory.FullName } + $deleteList | Remove-Item + } } Remove-Item -Path $target -Include "*.xml" -Recurse } From 8e26a4c077f208ea835a2ca1ac81fac74e0b2ec4 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Sun, 16 Mar 2025 22:37:23 -0500 Subject: [PATCH 012/552] delete only the first level dll --- Scripts/post_build.ps1 | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Scripts/post_build.ps1 b/Scripts/post_build.ps1 index a10441026..81b6f3d4b 100644 --- a/Scripts/post_build.ps1 +++ b/Scripts/post_build.ps1 @@ -40,12 +40,6 @@ function Delete-Unused ($path, $config) { $target = "$path\Output\$config" $included = Get-ChildItem $target -Filter "*.dll" foreach ($i in $included){ - $ignored = ["System.Text.Encodings.Web.dll"] - - if ($ignored.Contains($i.Name)) { - # ignore some specific dll that seems to make issue - continue - } foreach ($plugin in Get-ChildItem $target\Plugins){ $deleteList = Get-ChildItem $target\Plugins -Filter $i.Name | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq $i.Name } $deleteList | ForEach-Object{ Write-Host Deleting duplicated $_.Name with version $_.VersionInfo.FileVersion at location $_.Directory.FullName } From 2868c7256e570316255d41491916bd290ffc6cde Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Thu, 20 Mar 2025 10:29:34 -0500 Subject: [PATCH 013/552] fix path issue --- Scripts/post_build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/post_build.ps1 b/Scripts/post_build.ps1 index 81b6f3d4b..6f610c99e 100644 --- a/Scripts/post_build.ps1 +++ b/Scripts/post_build.ps1 @@ -41,7 +41,7 @@ function Delete-Unused ($path, $config) { $included = Get-ChildItem $target -Filter "*.dll" foreach ($i in $included){ foreach ($plugin in Get-ChildItem $target\Plugins){ - $deleteList = Get-ChildItem $target\Plugins -Filter $i.Name | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq $i.Name } + $deleteList = Get-ChildItem $plugin -Filter $i.Name | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq $i.Name } $deleteList | ForEach-Object{ Write-Host Deleting duplicated $_.Name with version $_.VersionInfo.FileVersion at location $_.Directory.FullName } $deleteList | Remove-Item } From f26d5632c8295c4c433e21315506cb9be92fe422 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Wed, 26 Mar 2025 22:01:53 -0500 Subject: [PATCH 014/552] use powershell and revert change in post_build.ps1 --- .github/workflows/dotnet.yml | 2 +- Scripts/post_build.ps1 | 20 +++++++++----------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 2e4531645..3e986c603 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -51,7 +51,7 @@ jobs: - name: Test run: dotnet test --no-build --verbosity normal -c Release - name: Perform post_build tasks - shell: pwsh + shell: powershell run: .\Scripts\post_build.ps1 - name: Upload Plugin Nupkg uses: actions/upload-artifact@v4 diff --git a/Scripts/post_build.ps1 b/Scripts/post_build.ps1 index 6f610c99e..e54852d32 100644 --- a/Scripts/post_build.ps1 +++ b/Scripts/post_build.ps1 @@ -1,5 +1,5 @@ param( - [string]$config = "Release", + [string]$config = "Release", [string]$solution = (Join-Path $PSScriptRoot ".." -Resolve) ) Write-Host "Config: $config" @@ -40,13 +40,11 @@ function Delete-Unused ($path, $config) { $target = "$path\Output\$config" $included = Get-ChildItem $target -Filter "*.dll" foreach ($i in $included){ - foreach ($plugin in Get-ChildItem $target\Plugins){ - $deleteList = Get-ChildItem $plugin -Filter $i.Name | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq $i.Name } - $deleteList | ForEach-Object{ Write-Host Deleting duplicated $_.Name with version $_.VersionInfo.FileVersion at location $_.Directory.FullName } - $deleteList | Remove-Item - } + $deleteList = Get-ChildItem $target\Plugins -Include $i -Recurse | Where { $_.VersionInfo.FileVersion -eq $i.VersionInfo.FileVersion -And $_.Name -eq "$i" } + $deleteList | ForEach-Object{ Write-Host Deleting duplicated $_.Name with version $_.VersionInfo.FileVersion at location $_.Directory.FullName } + $deleteList | Remove-Item } - Remove-Item -Path $target -Include "*.xml" -Recurse + Remove-Item -Path $target -Include "*.xml" -Recurse } function Remove-CreateDumpExe ($path, $config) { @@ -89,7 +87,7 @@ function Pack-Squirrel-Installer ($path, $version, $output) { Squirrel --releasify $nupkg --releaseDir $temp --setupIcon $icon --no-msi | Write-Output Move-Item $temp\* $output -Force Remove-Item $temp - + $file = "$output\Flow-Launcher-Setup.exe" Write-Host "Filename: $file" @@ -109,7 +107,7 @@ function Publish-Self-Contained ($p) { } function Publish-Portable ($outputLocation, $version) { - + & $outputLocation\Flow-Launcher-Setup.exe --silent | Out-Null mkdir "$env:LocalAppData\FlowLauncher\app-$version\UserData" Compress-Archive -Path $env:LocalAppData\FlowLauncher -DestinationPath $outputLocation\Flow-Launcher-Portable.zip @@ -121,7 +119,7 @@ function Main { Copy-Resources $p if ($config -eq "Release"){ - + Delete-Unused $p $config Publish-Self-Contained $p @@ -136,4 +134,4 @@ function Main { } } -Main +Main \ No newline at end of file From 935ac77a09a8817674b31454362a70d327cc2546 Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Wed, 26 Mar 2025 22:13:57 -0500 Subject: [PATCH 015/552] remove lock mode --- .github/workflows/dotnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 3e986c603..52f8d9f7c 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -41,7 +41,7 @@ jobs: - name: Install vpk run: dotnet tool install -g vpk - name: Restore dependencies - run: dotnet restore --locked-mode + run: dotnet restore - name: Build run: dotnet build --no-restore -c Release - name: Initialize Service From a1b1d84a8a33660fd243d7c6d7403296a79f290a Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Thu, 27 Mar 2025 11:57:49 -0500 Subject: [PATCH 016/552] try nuget restore --- .github/workflows/dotnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 52f8d9f7c..718a28dbd 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -41,7 +41,7 @@ jobs: - name: Install vpk run: dotnet tool install -g vpk - name: Restore dependencies - run: dotnet restore + run: nuget restore - name: Build run: dotnet build --no-restore -c Release - name: Initialize Service From e0721aae1464ba54a2c8fb2591cb7fd15660bc61 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 29 Mar 2025 22:03:30 +0800 Subject: [PATCH 017/552] Add new interfaces --- .../Interfaces/IAsyncEmptyQuery.cs | 23 +++++++++++++++ .../Interfaces/IEmptyQuery.cs | 28 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 Flow.Launcher.Plugin/Interfaces/IAsyncEmptyQuery.cs create mode 100644 Flow.Launcher.Plugin/Interfaces/IEmptyQuery.cs diff --git a/Flow.Launcher.Plugin/Interfaces/IAsyncEmptyQuery.cs b/Flow.Launcher.Plugin/Interfaces/IAsyncEmptyQuery.cs new file mode 100644 index 000000000..a18f0848d --- /dev/null +++ b/Flow.Launcher.Plugin/Interfaces/IAsyncEmptyQuery.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace Flow.Launcher.Plugin +{ + /// + /// Asynchronous Query Model for Flow Launcher When Query Text is Empty + /// + public interface IAsyncEmptyQuery + { + /// + /// Asynchronous Querying When Query Text is Empty + /// + /// + /// If the Querying method requires high IO transmission + /// or performing CPU intense jobs (performing better with cancellation), please use this IAsyncEmptyQuery interface + /// + /// Cancel when querying job is obsolete + /// + Task> EmptyQueryAsync(CancellationToken token); + } +} diff --git a/Flow.Launcher.Plugin/Interfaces/IEmptyQuery.cs b/Flow.Launcher.Plugin/Interfaces/IEmptyQuery.cs new file mode 100644 index 000000000..4ebdcf1fd --- /dev/null +++ b/Flow.Launcher.Plugin/Interfaces/IEmptyQuery.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace Flow.Launcher.Plugin +{ + /// + /// Synchronous Query Model for Flow Launcher When Query Text is Empty + /// + /// If the Querying method requires high IO transmission + /// or performaing CPU intense jobs (performing better with cancellation), please try the IAsyncEmptyQuery interface + /// + /// + public interface IEmptyQuery : IAsyncEmptyQuery + { + /// + /// Querying When Query Text is Empty + /// + /// This method will be called within a Task.Run, + /// so please avoid synchrously wait for long. + /// + /// + /// + List EmptyQuery(); + + Task> IAsyncEmptyQuery.EmptyQueryAsync(CancellationToken token) => Task.Run(EmptyQuery); + } +} From 9486355102c12e4c99d00b941eda0380ce8e8716 Mon Sep 17 00:00:00 2001 From: DB P Date: Sat, 5 Apr 2025 20:14:31 +0900 Subject: [PATCH 018/552] Add check registry method --- .../SettingsPaneGeneralViewModel.cs | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs index cec8c318c..a1b38a53c 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Windows.Forms; using CommunityToolkit.Mvvm.Input; @@ -10,6 +11,8 @@ using Flow.Launcher.Helper; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin; using Flow.Launcher.Plugin.SharedModels; +using Microsoft.Win32; +using OpenFileDialog = System.Windows.Forms.OpenFileDialog; namespace Flow.Launcher.SettingPages.ViewModels; @@ -25,6 +28,7 @@ public partial class SettingsPaneGeneralViewModel : BaseModel _updater = updater; _portable = portable; UpdateEnumDropdownLocalizations(); + IsLegacyKoreanIMEEnabled(); } public class SearchWindowScreenData : DropdownDataGeneric { } @@ -187,6 +191,48 @@ public partial class SettingsPaneGeneralViewModel : BaseModel } } + bool IsLegacyKoreanIMEEnabled() + { + const string subKeyPath = @"Software\Microsoft\input\tsf\tsf3override\{A028AE76-01B1-46C2-99C4-ACD9858AE02F}"; + const string valueName = "NoTsf3Override5"; + + try + { + using (RegistryKey key = Registry.CurrentUser.OpenSubKey(subKeyPath)) + { + if (key != null) + { + object value = key.GetValue(valueName); + if (value != null) + { + Debug.WriteLine($"[IME DEBUG] '{valueName}' 값: {value} (타입: {value.GetType()})"); + + if (value is int intValue) + return intValue == 1; + + if (int.TryParse(value.ToString(), out int parsed)) + return parsed == 1; + } + else + { + Debug.WriteLine($"[IME DEBUG] '{valueName}' 값이 존재하지 않습니다."); + } + } + else + { + Debug.WriteLine($"[IME DEBUG] 레지스트리 키를 찾을 수 없습니다: {subKeyPath}"); + } + } + } + catch (Exception ex) + { + Debug.WriteLine($"[IME DEBUG] 예외 발생: {ex.Message}"); + } + + return false; // 기본적으로 새 IME 사용 중으로 간주 + } + + public bool ShouldUsePinyin { get => Settings.ShouldUsePinyin; From 43330db96925fd595823516079168caf442cbda1 Mon Sep 17 00:00:00 2001 From: DB p Date: Sun, 6 Apr 2025 22:14:15 +0900 Subject: [PATCH 019/552] Add InfoBar Control --- Flow.Launcher/Resources/Dark.xaml | 16 ++++++++--- Flow.Launcher/Resources/Light.xaml | 14 ++++++++-- .../Views/SettingsPaneGeneral.xaml | 27 +++++++++++++++++++ 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/Flow.Launcher/Resources/Dark.xaml b/Flow.Launcher/Resources/Dark.xaml index ec089b378..1daddbfa7 100644 --- a/Flow.Launcher/Resources/Dark.xaml +++ b/Flow.Launcher/Resources/Dark.xaml @@ -114,10 +114,20 @@ - - - + + + + + + + + + + diff --git a/Flow.Launcher/Resources/Light.xaml b/Flow.Launcher/Resources/Light.xaml index aa6da9fb2..536099546 100644 --- a/Flow.Launcher/Resources/Light.xaml +++ b/Flow.Launcher/Resources/Light.xaml @@ -105,10 +105,20 @@ - + + + + + - + + + + diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml index 3f8272dda..c53edd07e 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml @@ -28,6 +28,33 @@ Style="{StaticResource PageTitle}" Text="{DynamicResource general}" TextAlignment="left" /> + + + + Date: Sun, 6 Apr 2025 23:17:56 +0900 Subject: [PATCH 020/552] Adjust Inforbar --- Flow.Launcher/Resources/Controls/InfoBar.xaml | 78 +++++++ .../Resources/Controls/InfoBar.xaml.cs | 219 ++++++++++++++++++ .../Views/SettingsPaneGeneral.xaml | 13 +- 3 files changed, 307 insertions(+), 3 deletions(-) create mode 100644 Flow.Launcher/Resources/Controls/InfoBar.xaml create mode 100644 Flow.Launcher/Resources/Controls/InfoBar.xaml.cs diff --git a/Flow.Launcher/Resources/Controls/InfoBar.xaml b/Flow.Launcher/Resources/Controls/InfoBar.xaml new file mode 100644 index 000000000..1713b3459 --- /dev/null +++ b/Flow.Launcher/Resources/Controls/InfoBar.xaml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + - + - + public GlyphInfo Glyph { get; init; } - /// /// An action to take in the form of a function call when the result has been selected. /// @@ -143,7 +142,7 @@ namespace Flow.Launcher.Plugin /// public string PluginDirectory { - get { return _pluginDirectory; } + get => _pluginDirectory; set { _pluginDirectory = value; From 471c3edc6fc679ebfb5b72f5be9ed418c3575bba Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 15:21:11 +0800 Subject: [PATCH 054/552] Add BadgePath & BadgeIcon property --- Flow.Launcher.Plugin/Result.cs | 150 ++++++++++++++--------- Flow.Launcher/ViewModel/MainViewModel.cs | 11 +- 2 files changed, 102 insertions(+), 59 deletions(-) diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs index 2e4befdc2..7e520175e 100644 --- a/Flow.Launcher.Plugin/Result.cs +++ b/Flow.Launcher.Plugin/Result.cs @@ -12,12 +12,19 @@ namespace Flow.Launcher.Plugin /// public class Result { + /// + /// Maximum score. This can be useful when set one result to the top by default. This is the score for the results set to the topmost by users. + /// + public const int MaxScore = int.MaxValue; + private string _pluginDirectory; private string _icoPath; private string _copyText = string.Empty; + private string _badgePath; + /// /// The title of the result. This is always required. /// @@ -80,6 +87,33 @@ namespace Flow.Launcher.Plugin } } + /// + /// The image to be displayed for the badge of the result. + /// + /// Can be a local file path or a URL. + /// If null or empty, will use plugin icon + public string BadgePath + { + get => _badgePath; + set + { + // 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) + && !Path.IsPathRooted(value) + && !value.StartsWith("http://", StringComparison.OrdinalIgnoreCase) + && !value.StartsWith("https://", StringComparison.OrdinalIgnoreCase) + && !value.StartsWith("data:image", StringComparison.OrdinalIgnoreCase)) + { + _badgePath = Path.Combine(PluginDirectory, value); + } + else + { + _badgePath = value; + } + } + } + /// /// Determines if Icon has a border radius /// @@ -94,7 +128,12 @@ namespace Flow.Launcher.Plugin /// /// Delegate to load an icon for this result. /// - public IconDelegate Icon; + public IconDelegate Icon { get; set; } + + /// + /// Delegate to load an icon for the badge of this result. + /// + public IconDelegate BadgeIcon { get; set; } /// /// Information for Glyph Icon (Prioritized than IcoPath/Icon if user enable Glyph Icons) @@ -154,47 +193,6 @@ namespace Flow.Launcher.Plugin } } - /// - public override string ToString() - { - return Title + SubTitle + Score; - } - - /// - /// Clones the current result - /// - public Result Clone() - { - return new Result - { - Title = Title, - SubTitle = SubTitle, - ActionKeywordAssigned = ActionKeywordAssigned, - CopyText = CopyText, - AutoCompleteText = AutoCompleteText, - IcoPath = IcoPath, - RoundedIcon = RoundedIcon, - Icon = Icon, - Glyph = Glyph, - Action = Action, - AsyncAction = AsyncAction, - Score = Score, - TitleHighlightData = TitleHighlightData, - OriginQuery = OriginQuery, - PluginDirectory = PluginDirectory, - ContextData = ContextData, - PluginID = PluginID, - TitleToolTip = TitleToolTip, - SubTitleToolTip = SubTitleToolTip, - PreviewPanel = PreviewPanel, - ProgressBar = ProgressBar, - ProgressBarColor = ProgressBarColor, - Preview = Preview, - AddSelectedCount = AddSelectedCount, - RecordKey = RecordKey - }; - } - /// /// Additional data associated with this result /// @@ -223,16 +221,6 @@ namespace Flow.Launcher.Plugin /// public Lazy PreviewPanel { get; set; } - /// - /// Run this result, asynchronously - /// - /// - /// - public ValueTask ExecuteAsync(ActionContext context) - { - return AsyncAction?.Invoke(context) ?? ValueTask.FromResult(Action?.Invoke(context) ?? false); - } - /// /// Progress bar display. Providing an int value between 0-100 will trigger the progress bar to be displayed on the result /// @@ -254,11 +242,6 @@ namespace Flow.Launcher.Plugin /// public bool AddSelectedCount { get; set; } = true; - /// - /// Maximum score. This can be useful when set one result to the top by default. This is the score for the results set to the topmost by users. - /// - public const int MaxScore = int.MaxValue; - /// /// The key to identify the record. This is used when FL checks whether the result is the topmost record. Or FL calculates the hashcode of the result for user selected records. /// This can be useful when your plugin will change the Title or SubTitle of the result dynamically. @@ -267,6 +250,59 @@ namespace Flow.Launcher.Plugin /// public string RecordKey { get; set; } = null; + /// + /// Run this result, asynchronously + /// + /// + /// + public ValueTask ExecuteAsync(ActionContext context) + { + return AsyncAction?.Invoke(context) ?? ValueTask.FromResult(Action?.Invoke(context) ?? false); + } + + /// + public override string ToString() + { + return Title + SubTitle + Score; + } + + /// + /// Clones the current result + /// + public Result Clone() + { + return new Result + { + Title = Title, + SubTitle = SubTitle, + ActionKeywordAssigned = ActionKeywordAssigned, + CopyText = CopyText, + AutoCompleteText = AutoCompleteText, + IcoPath = IcoPath, + BadgePath = BadgePath, + RoundedIcon = RoundedIcon, + Icon = Icon, + BadgeIcon = BadgeIcon, + Glyph = Glyph, + Action = Action, + AsyncAction = AsyncAction, + Score = Score, + TitleHighlightData = TitleHighlightData, + OriginQuery = OriginQuery, + PluginDirectory = PluginDirectory, + ContextData = ContextData, + PluginID = PluginID, + TitleToolTip = TitleToolTip, + SubTitleToolTip = SubTitleToolTip, + PreviewPanel = PreviewPanel, + ProgressBar = ProgressBar, + ProgressBarColor = ProgressBarColor, + Preview = Preview, + AddSelectedCount = AddSelectedCount, + RecordKey = RecordKey + }; + } + /// /// Info of the preview section of a /// diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 4a6c1d639..38efca72b 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1268,8 +1268,7 @@ namespace Flow.Launcher.ViewModel // Task.Yield will force it to run in ThreadPool await Task.Yield(); - IReadOnlyList results = - await PluginManager.QueryForPluginAsync(plugin, query, token); + var results = await PluginManager.QueryForPluginAsync(plugin, query, token); if (token.IsCancellationRequested) return; @@ -1285,6 +1284,14 @@ namespace Flow.Launcher.ViewModel resultsCopy = DeepCloneResults(results, token); } + foreach (var result in results) + { + if (string.IsNullOrEmpty(result.BadgePath)) + { + result.BadgePath = plugin.Metadata.IcoPath; + } + } + if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, plugin.Metadata, query, token, reSelect))) { From b85c2f48f9a3233991671971b9207996582b177d Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 15:35:36 +0800 Subject: [PATCH 055/552] Add related settings in appreance page --- .../UserSettings/Settings.cs | 2 +- Flow.Launcher/Languages/en.xaml | 2 ++ .../SettingPages/Views/SettingsPaneTheme.xaml | 16 ++++++++++++++-- Flow.Launcher/ViewModel/ResultViewModel.cs | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index b48f047c5..d97a9ed1a 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -101,7 +101,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings public bool UseAnimation { get; set; } = true; public bool UseSound { get; set; } = true; public double SoundVolume { get; set; } = 50; - public bool ShowPluginBadges { get; set; } = false; + public bool ShowBadges { get; set; } = false; public bool UseClock { get; set; } = true; public bool UseDate { get; set; } = false; diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index 609859d0d..66721d828 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -283,6 +283,8 @@ Use Segoe Fluent Icons Use Segoe Fluent Icons for query results where supported Press Key + Show Result Badges + Show badges for query results where supported HTTP Proxy diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml index 49306cd2d..574002a05 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml @@ -698,11 +698,10 @@ - + + + + + + Settings.ShowPluginBadges ? Visibility.Visible : Visibility.Collapsed; + get => Settings.ShowBadges ? Visibility.Visible : Visibility.Collapsed; } private bool GlyphAvailable => Glyph is not null; From 9e3e0f6e3c561b1106e63e0439162ec3df33a60f Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 15:38:00 +0800 Subject: [PATCH 056/552] Change name to BadgeIcoPath --- Flow.Launcher.Plugin/Result.cs | 12 ++++++------ Flow.Launcher/ViewModel/MainViewModel.cs | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs index 7e520175e..70d11dadd 100644 --- a/Flow.Launcher.Plugin/Result.cs +++ b/Flow.Launcher.Plugin/Result.cs @@ -23,7 +23,7 @@ namespace Flow.Launcher.Plugin private string _copyText = string.Empty; - private string _badgePath; + private string _badgeIcoPath; /// /// The title of the result. This is always required. @@ -92,9 +92,9 @@ namespace Flow.Launcher.Plugin /// /// Can be a local file path or a URL. /// If null or empty, will use plugin icon - public string BadgePath + public string BadgeIcoPath { - get => _badgePath; + get => _badgeIcoPath; set { // As a standard this property will handle prepping and converting to absolute local path for icon image processing @@ -105,11 +105,11 @@ namespace Flow.Launcher.Plugin && !value.StartsWith("https://", StringComparison.OrdinalIgnoreCase) && !value.StartsWith("data:image", StringComparison.OrdinalIgnoreCase)) { - _badgePath = Path.Combine(PluginDirectory, value); + _badgeIcoPath = Path.Combine(PluginDirectory, value); } else { - _badgePath = value; + _badgeIcoPath = value; } } } @@ -279,7 +279,7 @@ namespace Flow.Launcher.Plugin CopyText = CopyText, AutoCompleteText = AutoCompleteText, IcoPath = IcoPath, - BadgePath = BadgePath, + BadgeIcoPath = BadgeIcoPath, RoundedIcon = RoundedIcon, Icon = Icon, BadgeIcon = BadgeIcon, diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 38efca72b..0abd14ec5 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1286,9 +1286,9 @@ namespace Flow.Launcher.ViewModel foreach (var result in results) { - if (string.IsNullOrEmpty(result.BadgePath)) + if (string.IsNullOrEmpty(result.BadgeIcoPath)) { - result.BadgePath = plugin.Metadata.IcoPath; + result.BadgeIcoPath = plugin.Metadata.IcoPath; } } From d338c5551d9cf136fffcf74e269f3446215a09e4 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 15:47:41 +0800 Subject: [PATCH 057/552] Fix badge icon url issue --- Flow.Launcher.Plugin/Result.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs index 70d11dadd..ac00d5af5 100644 --- a/Flow.Launcher.Plugin/Result.cs +++ b/Flow.Launcher.Plugin/Result.cs @@ -188,8 +188,9 @@ namespace Flow.Launcher.Plugin // When the Result object is returned from the query call, PluginDirectory is not provided until // UpdatePluginMetadata call is made at PluginManager.cs L196. Once the PluginDirectory becomes available - // we need to update (only if not Uri path) the IcoPath with the full absolute path so the image can be loaded. + // we need to update (only if not Uri path) the IcoPath and BadgeIcoPath with the full absolute path so the image can be loaded. IcoPath = _icoPath; + BadgeIcoPath = _badgeIcoPath; } } From a1ce6b348dbc679bed986de05447e8fb86d7e21b Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 15:48:49 +0800 Subject: [PATCH 058/552] Fix result badge ico path update issue --- Flow.Launcher/ViewModel/MainViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 0abd14ec5..c1a237c6a 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1284,7 +1284,7 @@ namespace Flow.Launcher.ViewModel resultsCopy = DeepCloneResults(results, token); } - foreach (var result in results) + foreach (var result in resultsCopy) { if (string.IsNullOrEmpty(result.BadgeIcoPath)) { From ec99a365b9d27a708464b4506a41d55259c15961 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 15:49:39 +0800 Subject: [PATCH 059/552] Support badge path for result update interface --- Flow.Launcher/ViewModel/MainViewModel.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index c1a237c6a..2155f7bf8 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -245,6 +245,14 @@ namespace Flow.Launcher.ViewModel // make a clone to avoid possible issue that plugin will also change the list and items when updating view model var resultsCopy = DeepCloneResults(e.Results, token); + foreach (var result in resultsCopy) + { + if (string.IsNullOrEmpty(result.BadgeIcoPath)) + { + result.BadgeIcoPath = pair.Metadata.IcoPath; + } + } + PluginManager.UpdatePluginMetadata(resultsCopy, pair.Metadata, e.Query); if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, pair.Metadata, e.Query, token))) From 2eda64aa7af74dad5f3cf21fda8e8a8e6230fe64 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 15:51:26 +0800 Subject: [PATCH 060/552] Support badge icon loading --- Flow.Launcher/ResultListBox.xaml | 2 +- Flow.Launcher/ViewModel/ResultViewModel.cs | 46 ++++++++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/ResultListBox.xaml b/Flow.Launcher/ResultListBox.xaml index 03bff03eb..63c461c43 100644 --- a/Flow.Launcher/ResultListBox.xaml +++ b/Flow.Launcher/ResultListBox.xaml @@ -145,7 +145,7 @@ HorizontalAlignment="Right" VerticalAlignment="Bottom" RenderOptions.BitmapScalingMode="Fant" - Source="{Binding Image, TargetNullValue={x:Null}}" + Source="{Binding BadgeImage, TargetNullValue={x:Null}}" Visibility="{Binding ShowBadge}" /> diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs index 61e228de1..4137d5f58 100644 --- a/Flow.Launcher/ViewModel/ResultViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultViewModel.cs @@ -125,13 +125,21 @@ namespace Flow.Launcher.ViewModel public Visibility ShowBadge { - get => Settings.ShowBadges ? Visibility.Visible : Visibility.Collapsed; + get + { + if (Settings.ShowBadges && BadgeIconAvailable) + return Visibility.Visible; + + return Visibility.Collapsed; + } } private bool GlyphAvailable => Glyph is not null; private bool ImgIconAvailable => !string.IsNullOrEmpty(Result.IcoPath) || Result.Icon is not null; + private bool BadgeIconAvailable => !string.IsNullOrEmpty(Result.BadgeIcoPath) || Result.BadgeIcon is not null; + private bool PreviewImageAvailable => !string.IsNullOrEmpty(Result.Preview.PreviewImagePath) || Result.Preview.PreviewDelegate != null; public string OpenResultModifiers => Settings.OpenResultModifiers; @@ -145,9 +153,11 @@ namespace Flow.Launcher.ViewModel : Result.SubTitleToolTip; private volatile bool _imageLoaded; + private volatile bool _badgeImageLoaded; private volatile bool _previewImageLoaded; private ImageSource _image = ImageLoader.LoadingImage; + private ImageSource _badgeImage = ImageLoader.LoadingImage; private ImageSource _previewImage = ImageLoader.LoadingImage; public ImageSource Image @@ -165,6 +175,21 @@ namespace Flow.Launcher.ViewModel private set => _image = value; } + public ImageSource BadgeImage + { + get + { + if (!_badgeImageLoaded) + { + _badgeImageLoaded = true; + _ = LoadBadgeImageAsync(); + } + + return _badgeImage; + } + private set => _badgeImage = value; + } + public ImageSource PreviewImage { get @@ -210,7 +235,7 @@ namespace Flow.Launcher.ViewModel { var imagePath = Result.IcoPath; var iconDelegate = Result.Icon; - if (ImageLoader.TryGetValue(imagePath, false, out ImageSource img)) + if (ImageLoader.TryGetValue(imagePath, false, out var img)) { _image = img; } @@ -221,11 +246,26 @@ namespace Flow.Launcher.ViewModel } } + private async Task LoadBadgeImageAsync() + { + var badgeImagePath = Result.BadgeIcoPath; + var badgeIconDelegate = Result.BadgeIcon; + if (ImageLoader.TryGetValue(badgeImagePath, false, out var img)) + { + _badgeImage = img; + } + else + { + // We need to modify the property not field here to trigger the OnPropertyChanged event + BadgeImage = await LoadImageInternalAsync(badgeImagePath, badgeIconDelegate, false).ConfigureAwait(false); + } + } + private async Task LoadPreviewImageAsync() { var imagePath = Result.Preview.PreviewImagePath ?? Result.IcoPath; var iconDelegate = Result.Preview.PreviewDelegate ?? Result.Icon; - if (ImageLoader.TryGetValue(imagePath, true, out ImageSource img)) + if (ImageLoader.TryGetValue(imagePath, true, out var img)) { _previewImage = img; } From 01f896a57844184fb24e883fe5939c9689d96403 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 16:11:39 +0800 Subject: [PATCH 061/552] Support global query only --- .../UserSettings/Settings.cs | 1 + Flow.Launcher/Languages/en.xaml | 2 ++ .../SettingPages/Views/SettingsPaneTheme.xaml | 23 ++++++++++++++----- Flow.Launcher/ViewModel/ResultViewModel.cs | 11 ++++++--- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index d97a9ed1a..7c2457a72 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -102,6 +102,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings public bool UseSound { get; set; } = true; public double SoundVolume { get; set; } = 50; public bool ShowBadges { get; set; } = false; + public bool ShowBadgesGlobalOnly { get; set; } = false; public bool UseClock { get; set; } = true; public bool UseDate { get; set; } = false; diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index 66721d828..87db45fbe 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -285,6 +285,8 @@ Press Key Show Result Badges Show badges for query results where supported + Show Result Badges Only for Global Query + Show badges only for global query results HTTP Proxy diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml index 574002a05..57c9a5b70 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml @@ -711,16 +711,27 @@ - - - + + + + + + + Result.OriginQuery.ActionKeyword == Query.GlobalPluginWildcardSign; + private bool GlyphAvailable => Glyph is not null; private bool ImgIconAvailable => !string.IsNullOrEmpty(Result.IcoPath) || Result.Icon is not null; From e6477e886b3e3589727fa8481dd92a98a6206df4 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 16:13:55 +0800 Subject: [PATCH 062/552] Fix global query determination issue --- Flow.Launcher/ViewModel/MainViewModel.cs | 6 +++--- Flow.Launcher/ViewModel/ResultViewModel.cs | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 2155f7bf8..f6b9aa67c 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1208,11 +1208,11 @@ namespace Flow.Launcher.ViewModel _lastQuery = query; - if (query.ActionKeyword == Plugin.Query.GlobalPluginWildcardSign) + if (string.IsNullOrEmpty(query.ActionKeyword)) { - // Wait 45 millisecond for query change in global query + // Wait 15 millisecond for query change in global query // if query changes, return so that it won't be calculated - await Task.Delay(45, _updateSource.Token); + await Task.Delay(15, _updateSource.Token); if (_updateSource.Token.IsCancellationRequested) return; } diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs index 27b385805..68c794aec 100644 --- a/Flow.Launcher/ViewModel/ResultViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Drawing.Text; using System.IO; @@ -137,7 +138,7 @@ namespace Flow.Launcher.ViewModel } } - public bool IsGlobalQuery => Result.OriginQuery.ActionKeyword == Query.GlobalPluginWildcardSign; + public bool IsGlobalQuery => string.IsNullOrEmpty(Result.OriginQuery.ActionKeyword); private bool GlyphAvailable => Glyph is not null; From 8aff3c9f2ae49358d59760675c4ab552da865ad4 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 16:14:23 +0800 Subject: [PATCH 063/552] Improve strings --- Flow.Launcher/Languages/en.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index 87db45fbe..024258f1b 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -285,8 +285,8 @@ Press Key Show Result Badges Show badges for query results where supported - Show Result Badges Only for Global Query - Show badges only for global query results + Show Result Badges for Global Query Only + Show badges for global query results only HTTP Proxy From c1893366982d2f7d729a0cbdca6363c1d5b1218c Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 16:46:45 +0800 Subject: [PATCH 064/552] Fix possible directory not found issue when saving storage --- Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs | 3 ++- Flow.Launcher.Infrastructure/Storage/JsonStorage.cs | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs index 43bb8dade..414743d22 100644 --- a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs +++ b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs @@ -82,8 +82,8 @@ namespace Flow.Launcher.Infrastructure.Storage public void Save() { + FilesFolders.ValidateDirectory(DirectoryPath); // User may delete the directory, so we need to check it var serialized = MemoryPackSerializer.Serialize(Data); - File.WriteAllBytes(FilePath, serialized); } @@ -103,6 +103,7 @@ namespace Flow.Launcher.Infrastructure.Storage // so we need to pass it to SaveAsync public async ValueTask SaveAsync(T data) { + FilesFolders.ValidateDirectory(DirectoryPath); // User may delete the directory, so we need to check it await using var stream = new FileStream(FilePath, FileMode.Create); await MemoryPackSerializer.SerializeAsync(stream, data); } diff --git a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs index cdf3ae909..f283be59e 100644 --- a/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs +++ b/Flow.Launcher.Infrastructure/Storage/JsonStorage.cs @@ -183,7 +183,10 @@ namespace Flow.Launcher.Infrastructure.Storage public void Save() { - string serialized = JsonSerializer.Serialize(Data, + // User may delete the directory, so we need to check it + FilesFolders.ValidateDirectory(DirectoryPath); + + var serialized = JsonSerializer.Serialize(Data, new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText(TempFilePath, serialized); @@ -193,6 +196,9 @@ namespace Flow.Launcher.Infrastructure.Storage public async Task SaveAsync() { + // User may delete the directory, so we need to check it + FilesFolders.ValidateDirectory(DirectoryPath); + await using var tempOutput = File.OpenWrite(TempFilePath); await JsonSerializer.SerializeAsync(tempOutput, Data, new JsonSerializerOptions { WriteIndented = true }); From 5c43dd45b236c6074f63dc314f0d3668c1653e09 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 16:48:02 +0800 Subject: [PATCH 065/552] Code quality --- Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs index 414743d22..b85111756 100644 --- a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs +++ b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs @@ -82,7 +82,9 @@ namespace Flow.Launcher.Infrastructure.Storage public void Save() { - FilesFolders.ValidateDirectory(DirectoryPath); // User may delete the directory, so we need to check it + // User may delete the directory, so we need to check it + FilesFolders.ValidateDirectory(DirectoryPath); + var serialized = MemoryPackSerializer.Serialize(Data); File.WriteAllBytes(FilePath, serialized); } @@ -103,7 +105,9 @@ namespace Flow.Launcher.Infrastructure.Storage // so we need to pass it to SaveAsync public async ValueTask SaveAsync(T data) { - FilesFolders.ValidateDirectory(DirectoryPath); // User may delete the directory, so we need to check it + // User may delete the directory, so we need to check it + FilesFolders.ValidateDirectory(DirectoryPath); + await using var stream = new FileStream(FilePath, FileMode.Create); await MemoryPackSerializer.SerializeAsync(stream, data); } From e6377d046348058c1b32cb2905960747468a5101 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 18:40:03 +0800 Subject: [PATCH 066/552] Fix old Program plugin constructor issue --- .../Storage/BinaryStorage.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs index b85111756..64f809181 100644 --- a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs +++ b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using System.Threading.Tasks; using Flow.Launcher.Infrastructure.Logger; using Flow.Launcher.Infrastructure.UserSettings; @@ -40,6 +41,16 @@ namespace Flow.Launcher.Infrastructure.Storage FilePath = Path.Combine(DirectoryPath, $"{filename}{FileSuffix}"); } + // Let the old Program plugin get this constructor + [Obsolete("This constructor is obsolete. Use BinaryStorage(string filename) instead.")] + public BinaryStorage(string filename, string directoryPath = null!) + { + directoryPath ??= DataLocation.CacheDirectory; + FilesFolders.ValidateDirectory(directoryPath); + + FilePath = Path.Combine(directoryPath, $"{filename}{FileSuffix}"); + } + public async ValueTask TryLoadAsync(T defaultData) { if (Data != null) return Data; From 3aa324d1201a79f7bdb05e21b22775fa85195b6f Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 21:52:51 +0800 Subject: [PATCH 067/552] Throw plugin exception for plugin save interface --- Flow.Launcher.Core/Plugin/PluginManager.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 29d91dc8d..94519bf6f 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -64,7 +64,14 @@ namespace Flow.Launcher.Core.Plugin foreach (var plugin in AllPlugins) { var savable = plugin.Plugin as ISavable; - savable?.Save(); + try + { + savable?.Save(); + } + catch (Exception e) + { + throw new FlowPluginException(plugin.Metadata, e); + } } API.SavePluginSettings(); From bae0fa5c0e128538caf71943407088125289085b Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 22:00:36 +0800 Subject: [PATCH 068/552] Improve code quality --- Flow.Launcher.Core/Plugin/PluginManager.cs | 8 ++++---- .../Resource/Internationalization.cs | 17 ++++++++--------- Flow.Launcher/PublicAPIInstance.cs | 14 ++++++++------ 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 94519bf6f..1d13dcfd3 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -37,7 +37,7 @@ namespace Flow.Launcher.Core.Plugin private static PluginsSettings Settings; private static List _metadatas; - private static List _modifiedPlugins = new(); + private static readonly List _modifiedPlugins = new(); /// /// Directories that will hold Flow Launcher plugin directory @@ -299,7 +299,7 @@ namespace Flow.Launcher.Core.Plugin { Title = $"{metadata.Name}: Failed to respond!", SubTitle = "Select this result for more info", - IcoPath = Flow.Launcher.Infrastructure.Constant.ErrorIcon, + IcoPath = Constant.ErrorIcon, PluginDirectory = metadata.PluginDirectory, ActionKeywordAssigned = query.ActionKeyword, PluginID = metadata.ID, @@ -376,8 +376,8 @@ namespace Flow.Launcher.Core.Plugin { // this method is only checking for action keywords (defined as not '*') registration // hence the actionKeyword != Query.GlobalPluginWildcardSign logic - return actionKeyword != Query.GlobalPluginWildcardSign - && NonGlobalPlugins.ContainsKey(actionKeyword); + return actionKeyword != Query.GlobalPluginWildcardSign + && NonGlobalPlugins.ContainsKey(actionKeyword); } /// diff --git a/Flow.Launcher.Core/Resource/Internationalization.cs b/Flow.Launcher.Core/Resource/Internationalization.cs index ffa17ab4d..df841dbbe 100644 --- a/Flow.Launcher.Core/Resource/Internationalization.cs +++ b/Flow.Launcher.Core/Resource/Internationalization.cs @@ -22,8 +22,8 @@ namespace Flow.Launcher.Core.Resource private const string DefaultFile = "en.xaml"; private const string Extension = ".xaml"; private readonly Settings _settings; - private readonly List _languageDirectories = new List(); - private readonly List _oldResources = new List(); + private readonly List _languageDirectories = new(); + private readonly List _oldResources = new(); private readonly string SystemLanguageCode; public Internationalization(Settings settings) @@ -144,7 +144,7 @@ namespace Flow.Launcher.Core.Resource _settings.Language = isSystem ? Constant.SystemLanguageCode : language.LanguageCode; } - private Language GetLanguageByLanguageCode(string languageCode) + private static Language GetLanguageByLanguageCode(string languageCode) { var lowercase = languageCode.ToLower(); var language = AvailableLanguages.GetAvailableLanguages().FirstOrDefault(o => o.LanguageCode.ToLower() == lowercase); @@ -239,7 +239,7 @@ namespace Flow.Launcher.Core.Resource return list; } - public string GetTranslation(string key) + public static string GetTranslation(string key) { var translation = Application.Current.TryFindResource(key); if (translation is string) @@ -257,8 +257,7 @@ namespace Flow.Launcher.Core.Resource { foreach (var p in PluginManager.GetPluginsForInterface()) { - var pluginI18N = p.Plugin as IPluginI18n; - if (pluginI18N == null) return; + if (p.Plugin is not IPluginI18n pluginI18N) return; try { p.Metadata.Name = pluginI18N.GetTranslatedPluginTitle(); @@ -272,11 +271,11 @@ namespace Flow.Launcher.Core.Resource } } - public string LanguageFile(string folder, string language) + private static string LanguageFile(string folder, string language) { if (Directory.Exists(folder)) { - string path = Path.Combine(folder, language); + var path = Path.Combine(folder, language); if (File.Exists(path)) { return path; @@ -284,7 +283,7 @@ namespace Flow.Launcher.Core.Resource else { Log.Error($"|Internationalization.LanguageFile|Language path can't be found <{path}>"); - string english = Path.Combine(folder, DefaultFile); + var english = Path.Combine(folder, DefaultFile); if (File.Exists(english)) { return english; diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 95ef6c9f3..5438eac7d 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -38,20 +38,23 @@ namespace Flow.Launcher public class PublicAPIInstance : IPublicAPI, IRemovable { private readonly Settings _settings; - private readonly Internationalization _translater; private readonly MainViewModel _mainVM; + // Must use getter to access Application.Current.Resources.MergedDictionaries so earlier private Theme _theme; private Theme Theme => _theme ??= Ioc.Default.GetRequiredService(); + // Must use getter to avoid circular dependency + private Updater _updater; + private Updater Updater => _updater ??= Ioc.Default.GetRequiredService(); + private readonly object _saveSettingsLock = new(); #region Constructor - public PublicAPIInstance(Settings settings, Internationalization translater, MainViewModel mainVM) + public PublicAPIInstance(Settings settings, MainViewModel mainVM) { _settings = settings; - _translater = translater; _mainVM = mainVM; GlobalHotkey.hookedKeyboardCallback = KListener_hookedKeyboardCallback; WebRequest.RegisterPrefix("data", new DataWebRequestFactory()); @@ -100,8 +103,7 @@ namespace Flow.Launcher remove => _mainVM.VisibilityChanged -= value; } - // Must use Ioc.Default.GetRequiredService() to avoid circular dependency - public void CheckForNewUpdate() => _ = Ioc.Default.GetRequiredService().UpdateAppAsync(false); + public void CheckForNewUpdate() => _ = Updater.UpdateAppAsync(false); public void SaveAppAllSettings() { @@ -178,7 +180,7 @@ namespace Flow.Launcher public void StopLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Collapsed; - public string GetTranslation(string key) => _translater.GetTranslation(key); + public string GetTranslation(string key) => Internationalization.GetTranslation(key); public List GetAllPlugins() => PluginManager.AllPlugins.ToList(); From 526f00261d2ccf9a148aec46d92708affef2e4d4 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 22:02:03 +0800 Subject: [PATCH 069/552] Throw plugin exception for plugin dispose interface --- Flow.Launcher.Core/Plugin/PluginManager.cs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 1d13dcfd3..f8a094575 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -88,14 +88,21 @@ namespace Flow.Launcher.Core.Plugin private static async Task DisposePluginAsync(PluginPair pluginPair) { - switch (pluginPair.Plugin) + try { - case IDisposable disposable: - disposable.Dispose(); - break; - case IAsyncDisposable asyncDisposable: - await asyncDisposable.DisposeAsync(); - break; + switch (pluginPair.Plugin) + { + case IDisposable disposable: + disposable.Dispose(); + break; + case IAsyncDisposable asyncDisposable: + await asyncDisposable.DisposeAsync(); + break; + } + } + catch (Exception e) + { + throw new FlowPluginException(pluginPair.Metadata, e); } } From deb22ad0fe02820dcdfe6431793e7ee9ecdf1d75 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 22:05:04 +0800 Subject: [PATCH 070/552] Set CanClose earlier --- Flow.Launcher/MainWindow.xaml.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 30afe67a1..bf7a45b1d 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -291,15 +291,15 @@ namespace Flow.Launcher { if (!CanClose) { + CanClose = true; _notifyIcon.Visible = false; App.API.SaveAppAllSettings(); e.Cancel = true; await ImageLoader.WaitSaveAsync(); await PluginManager.DisposePluginsAsync(); Notification.Uninstall(); - // After plugins are all disposed, we can close the main window - CanClose = true; - // Use this instead of Close() to avoid InvalidOperationException when calling Close() in OnClosing event + // After plugins are all disposed, we shutdown application to close app + // We use this instead of Close() to avoid InvalidOperationException when calling Close() in OnClosing event Application.Current.Shutdown(); } } From 58c3b73ff7d65078185e7072fbac379fc823021a Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 22:13:58 +0800 Subject: [PATCH 071/552] Fix directory path issue --- Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs | 6 +++--- .../Storage/FlowLauncherJsonStorage.cs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs index 64f809181..8ff10816c 100644 --- a/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs +++ b/Flow.Launcher.Infrastructure/Storage/BinaryStorage.cs @@ -45,10 +45,10 @@ namespace Flow.Launcher.Infrastructure.Storage [Obsolete("This constructor is obsolete. Use BinaryStorage(string filename) instead.")] public BinaryStorage(string filename, string directoryPath = null!) { - directoryPath ??= DataLocation.CacheDirectory; - FilesFolders.ValidateDirectory(directoryPath); + DirectoryPath = directoryPath ?? DataLocation.CacheDirectory; + FilesFolders.ValidateDirectory(DirectoryPath); - FilePath = Path.Combine(directoryPath, $"{filename}{FileSuffix}"); + FilePath = Path.Combine(DirectoryPath, $"{filename}{FileSuffix}"); } public async ValueTask TryLoadAsync(T defaultData) diff --git a/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs b/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs index 8b4062b6b..ca78b2f20 100644 --- a/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs +++ b/Flow.Launcher.Infrastructure/Storage/FlowLauncherJsonStorage.cs @@ -17,11 +17,11 @@ namespace Flow.Launcher.Infrastructure.Storage public FlowLauncherJsonStorage() { - var directoryPath = Path.Combine(DataLocation.DataDirectory(), DirectoryName); - FilesFolders.ValidateDirectory(directoryPath); + DirectoryPath = Path.Combine(DataLocation.DataDirectory(), DirectoryName); + FilesFolders.ValidateDirectory(DirectoryPath); var filename = typeof(T).Name; - FilePath = Path.Combine(directoryPath, $"{filename}{FileSuffix}"); + FilePath = Path.Combine(DirectoryPath, $"{filename}{FileSuffix}"); } public new void Save() From 4527b334331a64b8ede630e84447de438f83cf5d Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Apr 2025 22:16:04 +0800 Subject: [PATCH 072/552] Code quality --- Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs b/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs index 1de5841a5..6c506cfc0 100644 --- a/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs +++ b/Flow.Launcher.Plugin/SharedCommands/FilesFolders.cs @@ -264,12 +264,12 @@ namespace Flow.Launcher.Plugin.SharedCommands var index = path.LastIndexOf('\\'); if (index > 0 && index < (path.Length - 1)) { - string previousDirectoryPath = path.Substring(0, index + 1); - return locationExists(previousDirectoryPath) ? previousDirectoryPath : ""; + string previousDirectoryPath = path[..(index + 1)]; + return locationExists(previousDirectoryPath) ? previousDirectoryPath : string.Empty; } else { - return ""; + return string.Empty; } } @@ -285,7 +285,7 @@ namespace Flow.Launcher.Plugin.SharedCommands // not full path, get previous level directory string var indexOfSeparator = path.LastIndexOf('\\'); - return path.Substring(0, indexOfSeparator + 1); + return path[..(indexOfSeparator + 1)]; } return path; From c66cbae78bfa96ecbec3a627ac40bed4d2b442ca Mon Sep 17 00:00:00 2001 From: DB p Date: Sat, 12 Apr 2025 00:56:07 +0900 Subject: [PATCH 073/552] - Adjust Badge layout - Fix glyph margin in win11light --- Flow.Launcher/ResultListBox.xaml | 15 +++++---------- Flow.Launcher/Themes/Win11Light.xaml | 4 ++-- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/Flow.Launcher/ResultListBox.xaml b/Flow.Launcher/ResultListBox.xaml index 63c461c43..8231027f4 100644 --- a/Flow.Launcher/ResultListBox.xaml +++ b/Flow.Launcher/ResultListBox.xaml @@ -102,8 +102,6 @@ + + - + @@ -68,6 +68,7 @@ x:Key="ItemTitleStyle" BasedOn="{StaticResource BaseItemTitleStyle}" TargetType="{x:Type TextBlock}"> + @@ -75,6 +76,7 @@ x:Key="ItemSubTitleStyle" BasedOn="{StaticResource BaseItemSubTitleStyle}" TargetType="{x:Type TextBlock}"> + @@ -84,7 +86,7 @@ TargetType="{x:Type Rectangle}"> - + #d6d4d7 @@ -113,7 +117,7 @@ + + + 6 4 0 4 0 @@ -172,7 +192,7 @@ BasedOn="{StaticResource ClockPanel}" TargetType="{x:Type StackPanel}"> - + @@ -206,7 +226,7 @@ x:Key="PreviewBorderStyle" BasedOn="{StaticResource BasePreviewBorderStyle}" TargetType="{x:Type Border}"> - + @@ -59,7 +59,7 @@ - + @@ -79,7 +79,9 @@ + + + + + diff --git a/Flow.Launcher/Resources/SettingWindowStyle.xaml b/Flow.Launcher/Resources/SettingWindowStyle.xaml index fc9246aa3..c59baeaea 100644 --- a/Flow.Launcher/Resources/SettingWindowStyle.xaml +++ b/Flow.Launcher/Resources/SettingWindowStyle.xaml @@ -7,6 +7,7 @@ + Segoe UI F1 M512,512z M0,0z M448,256C448,150,362,64,256,64L256,448C362,448,448,362,448,256z M0,256A256,256,0,1,1,512,256A256,256,0,1,1,0,256z diff --git a/Flow.Launcher/SelectBrowserWindow.xaml b/Flow.Launcher/SelectBrowserWindow.xaml index 4fc5a91c5..4a0928dc2 100644 --- a/Flow.Launcher/SelectBrowserWindow.xaml +++ b/Flow.Launcher/SelectBrowserWindow.xaml @@ -10,7 +10,6 @@ Width="550" Background="{DynamicResource PopuBGColor}" DataContext="{Binding RelativeSource={RelativeSource Self}}" - FontFamily="{Binding Settings.SettingWindowFont, Mode=TwoWay}" Foreground="{DynamicResource PopupTextColor}" ResizeMode="NoResize" SizeToContent="Height" diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml b/Flow.Launcher/SelectFileManagerWindow.xaml index 7d1fe0f56..0287af9b0 100644 --- a/Flow.Launcher/SelectFileManagerWindow.xaml +++ b/Flow.Launcher/SelectFileManagerWindow.xaml @@ -10,7 +10,6 @@ Width="600" Background="{DynamicResource PopuBGColor}" DataContext="{Binding RelativeSource={RelativeSource Self}}" - FontFamily="{Binding Settings.SettingWindowFont, Mode=TwoWay}" Foreground="{DynamicResource PopupTextColor}" ResizeMode="NoResize" SizeToContent="Height" diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml index 4bf5df227..1a92ad0c2 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneAbout.xaml @@ -103,10 +103,8 @@ Margin="0 0 12 0" Command="{Binding AskClearLogFolderConfirmationCommand}" Content="{Binding LogFolderSize, Mode=OneWay}" /> - + IsEnabled="{Binding NextEnabled, Mode=OneWay}"> + + From 25f39f6934921cc52a4f59243f7adef430b2ed0e Mon Sep 17 00:00:00 2001 From: DB p Date: Thu, 24 Apr 2025 11:08:02 +0900 Subject: [PATCH 169/552] Add dynamic font support for the setting window --- Flow.Launcher/App.xaml.cs | 2 ++ Flow.Launcher/SettingWindow.xaml | 1 + 2 files changed, 3 insertions(+) diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs index 87698a545..606536dad 100644 --- a/Flow.Launcher/App.xaml.cs +++ b/Flow.Launcher/App.xaml.cs @@ -4,6 +4,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; +using System.Windows.Media; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.Core; using Flow.Launcher.Core.Configuration; @@ -175,6 +176,7 @@ namespace Flow.Launcher await imageLoadertask; _mainWindow = new MainWindow(); + Current.Resources["SettingWindowFont"] = new FontFamily(_settings.SettingWindowFont); API.LogInfo(ClassName, "Dependencies Info:{ErrorReporting.DependenciesInfo()}"); diff --git a/Flow.Launcher/SettingWindow.xaml b/Flow.Launcher/SettingWindow.xaml index ab27b235a..a34777d30 100644 --- a/Flow.Launcher/SettingWindow.xaml +++ b/Flow.Launcher/SettingWindow.xaml @@ -13,6 +13,7 @@ MinHeight="600" d:DataContext="{d:DesignInstance vm:SettingWindowViewModel}" Closed="OnClosed" + FontFamily="{Binding Settings.SettingWindowFont, Mode=TwoWay}" Icon="Images\app.ico" Left="{Binding SettingWindowLeft, Mode=TwoWay}" Loaded="OnLoaded" From 8432fa3b40ceb87916676fc5021e7e72dac54078 Mon Sep 17 00:00:00 2001 From: DB p Date: Thu, 24 Apr 2025 11:25:21 +0900 Subject: [PATCH 170/552] Add SettingWindowFont definition to CustomControlTemplate --- Flow.Launcher/Resources/CustomControlTemplate.xaml | 1 + Flow.Launcher/Resources/SettingWindowStyle.xaml | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Flow.Launcher/Resources/CustomControlTemplate.xaml b/Flow.Launcher/Resources/CustomControlTemplate.xaml index be68fc1b1..4e94da526 100644 --- a/Flow.Launcher/Resources/CustomControlTemplate.xaml +++ b/Flow.Launcher/Resources/CustomControlTemplate.xaml @@ -5,6 +5,7 @@ xmlns:ui="http://schemas.modernwpf.com/2019"> + Segoe UI diff --git a/Flow.Launcher/Resources/SettingWindowStyle.xaml b/Flow.Launcher/Resources/SettingWindowStyle.xaml index c59baeaea..60655fa7c 100644 --- a/Flow.Launcher/Resources/SettingWindowStyle.xaml +++ b/Flow.Launcher/Resources/SettingWindowStyle.xaml @@ -7,8 +7,6 @@ - Segoe UI - F1 M512,512z M0,0z M448,256C448,150,362,64,256,64L256,448C362,448,448,362,448,256z M0,256A256,256,0,1,1,512,256A256,256,0,1,1,0,256z + + {DynamicResource SettingWindowFont} + @@ -1360,7 +1363,6 @@ - @@ -1584,6 +1586,7 @@ diff --git a/Flow.Launcher/Resources/Pages/WelcomePage1.xaml b/Flow.Launcher/Resources/Pages/WelcomePage1.xaml index 32fdb62fc..b6a99d9e9 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage1.xaml +++ b/Flow.Launcher/Resources/Pages/WelcomePage1.xaml @@ -127,7 +127,7 @@ Style="{DynamicResource StyleImageFadeIn}" /> - - + + @@ -89,29 +89,29 @@ - + @@ -81,26 +81,26 @@ Canvas.Left="0" Width="450" Height="280" - Margin="0,0,0,0" + Margin="0 0 0 0" Source="../../images/page_img01.png" Style="{DynamicResource StyleImageFadeIn}" /> - + diff --git a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml index 3df4b506e..7495231ae 100644 --- a/Flow.Launcher/Resources/Pages/WelcomePage5.xaml +++ b/Flow.Launcher/Resources/Pages/WelcomePage5.xaml @@ -79,18 +79,18 @@ - + - + - + + Padding="5 18 0 0"> + Margin="5 24 0 0"> @@ -97,8 +97,8 @@ - - + + - + @@ -86,23 +86,23 @@ Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" - Margin="5,0,0,20"> + Margin="5 0 0 20"> @@ -180,18 +180,18 @@ Grid.Row="1" Background="{DynamicResource PopupButtonAreaBGColor}" BorderBrush="{DynamicResource PopupButtonAreaBorderColor}" - BorderThickness="0,1,0,0"> + BorderThickness="0 1 0 0"> - - + + - + - + + BorderThickness="0 1 0 0"> - - + + - + @@ -104,16 +104,16 @@ HorizontalAlignment="Stretch" Click="BrowseButton_Click" Content="{DynamicResource flowlauncher_plugin_program_browse}" - Visibility="{Binding IsCustomSource, Converter={StaticResource BooleanToVisibilityConverter}}" - DockPanel.Dock="Right" /> + DockPanel.Dock="Right" + Visibility="{Binding IsCustomSource, Converter={StaticResource BooleanToVisibilityConverter}}" /> + VerticalAlignment="Center" + IsReadOnly="{Binding IsNotCustomSource}" + Text="{Binding Location, Mode=TwoWay}" /> + Margin="10 0" + VerticalAlignment="Center" + IsChecked="{Binding Enabled, Mode=TwoWay}" /> + BorderThickness="0 1 0 0"> - + - + @@ -151,82 +151,82 @@ TextWrapping="Wrap" /> - + - + appref-ms exe lnk + BorderThickness="1 0 0 0"> @@ -237,27 +237,27 @@ Grid.Row="1" Background="{DynamicResource PopupButtonAreaBGColor}" BorderBrush="{DynamicResource PopupButtonAreaBorderColor}" - BorderThickness="0,1,0,0"> + BorderThickness="0 1 0 0"> From 9b666d31363796bef10e8f031fe99b7d7e13ee73 Mon Sep 17 00:00:00 2001 From: DB p Date: Tue, 29 Apr 2025 20:06:46 +0900 Subject: [PATCH 203/552] Add Flyout UI for Filter --- .../Views/SettingsPanePluginStore.xaml | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml index 66c1cb1bf..fde022da7 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml @@ -65,34 +65,33 @@ Command="{Binding RefreshExternalPluginsCommand}" Content="{DynamicResource refresh}" FontSize="13" /> - - - - + Date: Tue, 29 Apr 2025 19:31:37 +0800 Subject: [PATCH 204/552] Adjust margin & Improve ui --- .../SettingPages/Views/SettingsPanePluginStore.xaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml index fde022da7..df9cc3556 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPanePluginStore.xaml @@ -58,14 +58,14 @@ Orientation="Horizontal"> public bool Disabled { get; set; } - public bool HomeDiabled { get; set; } + public bool HomeDisabled { get; set; } } } diff --git a/Flow.Launcher/ViewModel/PluginViewModel.cs b/Flow.Launcher/ViewModel/PluginViewModel.cs index 092896019..01fa3d203 100644 --- a/Flow.Launcher/ViewModel/PluginViewModel.cs +++ b/Flow.Launcher/ViewModel/PluginViewModel.cs @@ -81,7 +81,7 @@ namespace Flow.Launcher.ViewModel set { PluginPair.Metadata.HomeDisabled = !value; - PluginSettingsObject.HomeDiabled = !value; + PluginSettingsObject.HomeDisabled = !value; } } From eaea38c13ab7c6536ee3b92bf8ad9b8ff436c599 Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Sun, 4 May 2025 11:40:45 +0800 Subject: [PATCH 245/552] Fix typos Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs b/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs index f3c9cfcad..129f43b85 100644 --- a/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs +++ b/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs @@ -8,7 +8,7 @@ namespace Flow.Launcher.Plugin /// Synchronous Query Model for Flow Launcher When Query Text is Empty /// /// If the Querying method requires high IO transmission - /// or performaing CPU intense jobs (performing better with cancellation), please try the IAsyncHomeQuery interface + /// or performing CPU intense jobs (performing better with cancellation), please try the IAsyncHomeQuery interface /// /// public interface IHomeQuery : IAsyncHomeQuery From 78f606f2fcb74467962bb582cd70f65c2d35104e Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Sun, 4 May 2025 11:40:57 +0800 Subject: [PATCH 246/552] Fix typos Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs b/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs index 129f43b85..81186fca2 100644 --- a/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs +++ b/Flow.Launcher.Plugin/Interfaces/IHomeQuery.cs @@ -17,7 +17,7 @@ namespace Flow.Launcher.Plugin /// Querying When Query Text is Empty /// /// This method will be called within a Task.Run, - /// so please avoid synchrously wait for long. + /// so please avoid synchronously wait for long. /// /// /// From 72bd1e60dbe7bdef77704e88641b818d1bb8f98f Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 4 May 2025 11:44:41 +0800 Subject: [PATCH 247/552] Remove code comments with issues --- Flow.Launcher.Plugin/Result.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/Flow.Launcher.Plugin/Result.cs b/Flow.Launcher.Plugin/Result.cs index 060c03317..f0fcd48ff 100644 --- a/Flow.Launcher.Plugin/Result.cs +++ b/Flow.Launcher.Plugin/Result.cs @@ -174,9 +174,6 @@ namespace Flow.Launcher.Plugin /// /// Query information associated with the result /// - /// - /// If the query is for home query, this will be null - /// internal Query OriginQuery { get; set; } /// From 0d9fb29f12948253a956f80fedae0d3a9473091e Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 4 May 2025 16:37:15 +0800 Subject: [PATCH 248/552] Improve code quality --- Flow.Launcher/ViewModel/MainViewModel.cs | 64 +++++++++--------------- 1 file changed, 23 insertions(+), 41 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 6d7b4a8a4..f79596c96 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1192,8 +1192,27 @@ namespace Flow.Launcher.ViewModel var query = QueryText.ToLower().Trim(); History.Clear(); + var results = GetHistoryItems(_history.Items); + + if (!string.IsNullOrEmpty(query)) + { + var filtered = results.Where + ( + r => App.API.FuzzySearch(query, r.Title).IsSearchPrecisionScoreMet() || + App.API.FuzzySearch(query, r.SubTitle).IsSearchPrecisionScoreMet() + ).ToList(); + History.AddResults(filtered, id); + } + else + { + History.AddResults(results, id); + } + } + + private static List GetHistoryItems(IEnumerable historyItems) + { var results = new List(); - foreach (var h in _history.Items) + foreach (var h in historyItems) { var title = App.API.GetTranslation("executeQuery"); var time = App.API.GetTranslation("lastExecuteTime"); @@ -1217,20 +1236,7 @@ namespace Flow.Launcher.ViewModel }; results.Add(result); } - - if (!string.IsNullOrEmpty(query)) - { - var filtered = results.Where - ( - r => App.API.FuzzySearch(query, r.Title).IsSearchPrecisionScoreMet() || - App.API.FuzzySearch(query, r.SubTitle).IsSearchPrecisionScoreMet() - ).ToList(); - History.AddResults(filtered, id); - } - else - { - History.AddResults(results, id); - } + return results; } private async Task QueryResultsAsync(bool searchDelay, bool isReQuery = false, bool reSelect = true) @@ -1431,33 +1437,9 @@ namespace Flow.Launcher.ViewModel await Task.Yield(); // Select last history results and revert its order to make sure last history results are on top - var historyResults = _history.Items.TakeLast(Settings.MaxHistoryResultsToShowForHomePage).Reverse(); + var historyItems = _history.Items.TakeLast(Settings.MaxHistoryResultsToShowForHomePage).Reverse(); - var results = new List(); - foreach (var h in historyResults) - { - var title = App.API.GetTranslation("executeQuery"); - var time = App.API.GetTranslation("lastExecuteTime"); - var result = new Result - { - Title = string.Format(title, h.Query), - SubTitle = string.Format(time, h.ExecutedDateTime), - IcoPath = "Images\\history.png", - Preview = new Result.PreviewInfo - { - PreviewImagePath = Constant.HistoryIcon, - Description = string.Format(time, h.ExecutedDateTime) - }, - OriginQuery = new Query { RawQuery = h.Query }, - Action = _ => - { - SelectedResults = Results; - App.API.ChangeQuery(h.Query); - return false; - } - }; - results.Add(result); - } + var results = GetHistoryItems(historyItems); if (_updateSource.Token.IsCancellationRequested) return; From 67facb8f18f4325def9572e37ccf7f25fbb7a8fa Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 4 May 2025 16:44:05 +0800 Subject: [PATCH 249/552] Use non-async version --- Flow.Launcher/ViewModel/MainViewModel.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index f79596c96..5fd8d395f 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1346,7 +1346,7 @@ namespace Flow.Launcher.ViewModel // Query history results for home page firstly so it will be put on top of the results if (Settings.ShowHistoryResultsForHomePage) { - await QueryHistoryTaskAsync(); + QueryHistoryTask(); } } else @@ -1430,12 +1430,8 @@ namespace Flow.Launcher.ViewModel } } - async Task QueryHistoryTaskAsync() + void QueryHistoryTask() { - // Since it is wrapped within a ThreadPool Thread, the synchronous context is null - // Task.Yield will force it to run in ThreadPool - await Task.Yield(); - // Select last history results and revert its order to make sure last history results are on top var historyItems = _history.Items.TakeLast(Settings.MaxHistoryResultsToShowForHomePage).Reverse(); @@ -1448,8 +1444,6 @@ namespace Flow.Launcher.ViewModel { App.API.LogError(ClassName, "Unable to add item to Result Update Queue"); } - - await Task.CompletedTask; } } From 21d6ec20d45597ad872341afbcb82ef85a85ee87 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 4 May 2025 18:29:39 +0800 Subject: [PATCH 250/552] Use null to distinguish between home query and global query --- Flow.Launcher.Core/Plugin/QueryBuilder.cs | 3 ++- Flow.Launcher.Plugin/Query.cs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Core/Plugin/QueryBuilder.cs b/Flow.Launcher.Core/Plugin/QueryBuilder.cs index fae821736..82745c239 100644 --- a/Flow.Launcher.Core/Plugin/QueryBuilder.cs +++ b/Flow.Launcher.Core/Plugin/QueryBuilder.cs @@ -16,7 +16,8 @@ namespace Flow.Launcher.Core.Plugin Search = string.Empty, RawQuery = string.Empty, SearchTerms = Array.Empty(), - ActionKeyword = string.Empty + // must use null because we need to distinguish between home query and global query + ActionKeyword = null }; } diff --git a/Flow.Launcher.Plugin/Query.cs b/Flow.Launcher.Plugin/Query.cs index c3eede4c6..7d98a4afe 100644 --- a/Flow.Launcher.Plugin/Query.cs +++ b/Flow.Launcher.Plugin/Query.cs @@ -53,6 +53,7 @@ namespace Flow.Launcher.Plugin /// /// The action keyword part of this query. /// For global plugins this value will be empty. + /// For home query this value will be null. /// public string ActionKeyword { get; init; } From 28b8cb6013fb56de9d9946acc6a300af1e0883cf Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 4 May 2025 21:43:48 +0800 Subject: [PATCH 251/552] Improve distinguish between home query and global query --- Flow.Launcher.Core/Plugin/QueryBuilder.cs | 3 +-- Flow.Launcher.Plugin/Query.cs | 1 - Flow.Launcher/ViewModel/MainViewModel.cs | 17 +++++++++++++---- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/QueryBuilder.cs b/Flow.Launcher.Core/Plugin/QueryBuilder.cs index 82745c239..fae821736 100644 --- a/Flow.Launcher.Core/Plugin/QueryBuilder.cs +++ b/Flow.Launcher.Core/Plugin/QueryBuilder.cs @@ -16,8 +16,7 @@ namespace Flow.Launcher.Core.Plugin Search = string.Empty, RawQuery = string.Empty, SearchTerms = Array.Empty(), - // must use null because we need to distinguish between home query and global query - ActionKeyword = null + ActionKeyword = string.Empty }; } diff --git a/Flow.Launcher.Plugin/Query.cs b/Flow.Launcher.Plugin/Query.cs index 7d98a4afe..c3eede4c6 100644 --- a/Flow.Launcher.Plugin/Query.cs +++ b/Flow.Launcher.Plugin/Query.cs @@ -53,7 +53,6 @@ namespace Flow.Launcher.Plugin /// /// The action keyword part of this query. /// For global plugins this value will be empty. - /// For home query this value will be null. /// public string ActionKeyword { get; init; } diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 5fd8d395f..30df8250c 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -33,6 +33,7 @@ namespace Flow.Launcher.ViewModel private bool _isQueryRunning; private Query _lastQuery; + private bool _lastHomeQuery; private string _queryTextBeforeLeaveResults; private string _ignoredQueryText = null; @@ -1261,6 +1262,8 @@ namespace Flow.Launcher.ViewModel return; } + var homeQuery = query.RawQuery == string.Empty; + _updateSource = new CancellationTokenSource(); ProgressBarVisibility = Visibility.Hidden; @@ -1275,11 +1278,11 @@ namespace Flow.Launcher.ViewModel query.IsReQuery = isReQuery; // handle the exclusiveness of plugin using action keyword - RemoveOldQueryResults(query); + RemoveOldQueryResults(query, homeQuery); _lastQuery = query; + _lastHomeQuery = homeQuery; - var homeQuery = query.RawQuery == string.Empty; ICollection plugins = Array.Empty(); if (homeQuery) { @@ -1524,9 +1527,15 @@ namespace Flow.Launcher.ViewModel } } - private void RemoveOldQueryResults(Query query) + private void RemoveOldQueryResults(Query query, bool homeQuery) { - if (_lastQuery?.ActionKeyword != query?.ActionKeyword) + // If last or current query is home query, we need to clear the results + if (_lastHomeQuery || homeQuery) + { + Results.Clear(); + } + // If last and current query are not home query, we need to check action keyword + else if (_lastQuery?.ActionKeyword != query?.ActionKeyword) { Results.Clear(); } From 51fb1515a0d88636d26bfbc5913a994de8871209 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 4 May 2025 22:04:01 +0800 Subject: [PATCH 252/552] Add more debug log info for query --- Flow.Launcher/ViewModel/MainViewModel.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index c505c32a3..c481be02e 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1215,10 +1215,14 @@ namespace Flow.Launcher.ViewModel { _updateSource?.Cancel(); + App.API.LogDebug(ClassName, $"Start query with text: {QueryText}"); + var query = await ConstructQueryAsync(QueryText, Settings.CustomShortcuts, Settings.BuiltinShortcuts); if (query == null) // shortcut expanded { + App.API.LogDebug(ClassName, $"Clear query results"); + // Hide and clear results again because running query may show and add some results Results.Visibility = Visibility.Collapsed; Results.Clear(); @@ -1233,6 +1237,8 @@ namespace Flow.Launcher.ViewModel return; } + App.API.LogDebug(ClassName, $"Start query with ActionKeyword <{query.ActionKeyword}> and RawQuery <{query.RawQuery}>"); + _updateSource = new CancellationTokenSource(); ProgressBarVisibility = Visibility.Hidden; @@ -1253,6 +1259,9 @@ namespace Flow.Launcher.ViewModel var plugins = PluginManager.ValidPluginsForQuery(query); + var validPluginNames = plugins.Select(x => $"<{x.Metadata.Name}>"); + App.API.LogDebug(ClassName, $"Valid <{plugins.Count}> plugins: {string.Join(" ", validPluginNames)}"); + if (plugins.Count == 1) { PluginIconPath = plugins.Single().Metadata.IcoPath; @@ -1321,6 +1330,8 @@ namespace Flow.Launcher.ViewModel // Local function async Task QueryTaskAsync(PluginPair plugin, CancellationToken token) { + App.API.LogDebug(ClassName, $"Wait for querying plugin <{plugin.Metadata.Name}>"); + if (searchDelay) { var searchDelayTime = plugin.Metadata.SearchDelayTime ?? Settings.SearchDelayTime; @@ -1359,6 +1370,8 @@ namespace Flow.Launcher.ViewModel if (token.IsCancellationRequested) return; + App.API.LogDebug(ClassName, $"Update results for plugin <{plugin.Metadata.Name}>"); + if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, plugin.Metadata, query, token, reSelect))) { @@ -1448,6 +1461,8 @@ namespace Flow.Launcher.ViewModel { if (_lastQuery?.ActionKeyword != query?.ActionKeyword) { + App.API.LogDebug(ClassName, $"Remove old results"); + Results.Clear(); } } From 197316397a1596a694cc445351724542b54b66bd Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 4 May 2025 22:05:57 +0800 Subject: [PATCH 253/552] Improve log info --- Flow.Launcher/ViewModel/MainViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index c481be02e..228e66edb 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1215,7 +1215,7 @@ namespace Flow.Launcher.ViewModel { _updateSource?.Cancel(); - App.API.LogDebug(ClassName, $"Start query with text: {QueryText}"); + App.API.LogDebug(ClassName, $"Start query with text: <{QueryText}>"); var query = await ConstructQueryAsync(QueryText, Settings.CustomShortcuts, Settings.BuiltinShortcuts); From b9aa5a88cf5350ca7165fa570de225428472bd3f Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 5 May 2025 08:30:53 +0800 Subject: [PATCH 254/552] Change variable name for code quality --- Flow.Launcher/ViewModel/MainViewModel.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 566cb6814..476c10e74 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -33,7 +33,7 @@ namespace Flow.Launcher.ViewModel private bool _isQueryRunning; private Query _lastQuery; - private bool _lastHomeQuery; + private bool _lastIsHomeQuery; private string _queryTextBeforeLeaveResults; private string _ignoredQueryText = null; @@ -1268,7 +1268,7 @@ namespace Flow.Launcher.ViewModel App.API.LogDebug(ClassName, $"Start query with ActionKeyword <{query.ActionKeyword}> and RawQuery <{query.RawQuery}>"); - var homeQuery = query.RawQuery == string.Empty; + var isHomeQuery = query.RawQuery == string.Empty; _updateSource = new CancellationTokenSource(); @@ -1284,13 +1284,13 @@ namespace Flow.Launcher.ViewModel query.IsReQuery = isReQuery; // handle the exclusiveness of plugin using action keyword - RemoveOldQueryResults(query, homeQuery); + RemoveOldQueryResults(query, isHomeQuery); _lastQuery = query; - _lastHomeQuery = homeQuery; + _lastIsHomeQuery = isHomeQuery; ICollection plugins = Array.Empty(); - if (homeQuery) + if (isHomeQuery) { if (Settings.ShowHomePage) { @@ -1347,7 +1347,7 @@ namespace Flow.Launcher.ViewModel // plugins are ICollection, meaning LINQ will get the Count and preallocate Array Task[] tasks; - if (homeQuery) + if (isHomeQuery) { tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch { @@ -1397,7 +1397,7 @@ namespace Flow.Launcher.ViewModel { App.API.LogDebug(ClassName, $"Wait for querying plugin <{plugin.Metadata.Name}>"); - if (searchDelay && !homeQuery) // Do not delay for home query + if (searchDelay && !isHomeQuery) // Do not delay for home query { var searchDelayTime = plugin.Metadata.SearchDelayTime ?? Settings.SearchDelayTime; @@ -1410,7 +1410,7 @@ namespace Flow.Launcher.ViewModel // Task.Yield will force it to run in ThreadPool await Task.Yield(); - var results = homeQuery ? + var results = isHomeQuery ? await PluginManager.QueryHomeForPluginAsync(plugin, query, token) : await PluginManager.QueryForPluginAsync(plugin, query, token); @@ -1542,10 +1542,10 @@ namespace Flow.Launcher.ViewModel } } - private void RemoveOldQueryResults(Query query, bool homeQuery) + private void RemoveOldQueryResults(Query query, bool isHomeQuery) { // If last or current query is home query, we need to clear the results - if (_lastHomeQuery || homeQuery) + if (_lastIsHomeQuery || isHomeQuery) { Results.Clear(); } From 2713c5babfaaf1a7989043f04b42b34b712116ca Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 5 May 2025 08:35:20 +0800 Subject: [PATCH 255/552] Add code comments --- Flow.Launcher/ViewModel/MainViewModel.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 476c10e74..23958ca70 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -54,8 +54,8 @@ namespace Flow.Launcher.ViewModel private readonly PluginMetadata _historyMetadata = new() { - ID = "298303A65D128A845D28A7B83B3968C2", - Priority = 0 + ID = "298303A65D128A845D28A7B83B3968C2", // ID is for ResultsForUpdate constructor + Priority = 0 // Priority is for calculating scores in UpdateResultView }; #endregion From 41211e8cd380df56a44dc9df996ac2833b431dc1 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 5 May 2025 08:44:08 +0800 Subject: [PATCH 256/552] Improve code comments --- Flow.Launcher/ViewModel/MainViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 23958ca70..dc35a6aa9 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -54,7 +54,7 @@ namespace Flow.Launcher.ViewModel private readonly PluginMetadata _historyMetadata = new() { - ID = "298303A65D128A845D28A7B83B3968C2", // ID is for ResultsForUpdate constructor + ID = "298303A65D128A845D28A7B83B3968C2", // ID is for identifying the update plugin in UpdateActionAsync Priority = 0 // Priority is for calculating scores in UpdateResultView }; From 16404bc2a780430028e3515f19f02b2568f57b5e Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 5 May 2025 12:54:15 +0800 Subject: [PATCH 257/552] Improve log information --- Flow.Launcher/ViewModel/MainViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index dc35a6aa9..25c39ac7a 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1547,13 +1547,13 @@ namespace Flow.Launcher.ViewModel // If last or current query is home query, we need to clear the results if (_lastIsHomeQuery || isHomeQuery) { + App.API.LogDebug(ClassName, $"Remove old results"); Results.Clear(); } // If last and current query are not home query, we need to check action keyword else if (_lastQuery?.ActionKeyword != query?.ActionKeyword) { App.API.LogDebug(ClassName, $"Remove old results"); - Results.Clear(); } } From 36a4f4176778253f00c09a7675ec43b07953282a Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 5 May 2025 17:32:43 +0800 Subject: [PATCH 258/552] Do not need to clear the result when last and current query are home query --- Flow.Launcher/ViewModel/MainViewModel.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 25c39ac7a..a8e431d99 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1544,8 +1544,13 @@ namespace Flow.Launcher.ViewModel private void RemoveOldQueryResults(Query query, bool isHomeQuery) { + // If last and current query are home query, we don't need to clear the results + if (_lastIsHomeQuery && isHomeQuery) + { + return; + } // If last or current query is home query, we need to clear the results - if (_lastIsHomeQuery || isHomeQuery) + else if (_lastIsHomeQuery || isHomeQuery) { App.API.LogDebug(ClassName, $"Remove old results"); Results.Clear(); From 0882378988b72615118150db4c011eafd59ceca9 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 5 May 2025 18:53:40 +0800 Subject: [PATCH 259/552] Add Glyph for history items & topmost items --- Flow.Launcher/ViewModel/MainViewModel.cs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index a8e431d99..a98172f0a 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1221,19 +1221,15 @@ namespace Flow.Launcher.ViewModel { Title = string.Format(title, h.Query), SubTitle = string.Format(time, h.ExecutedDateTime), - IcoPath = "Images\\history.png", - Preview = new Result.PreviewInfo - { - PreviewImagePath = Constant.HistoryIcon, - Description = string.Format(time, h.ExecutedDateTime) - }, + IcoPath = Constant.HistoryIcon, OriginQuery = new Query { RawQuery = h.Query }, Action = _ => { App.API.BackToQueryResults(); App.API.ChangeQuery(h.Query); return false; - } + }, + Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE81C") }; results.Add(result); } @@ -1579,7 +1575,8 @@ namespace Flow.Launcher.ViewModel App.API.ShowMsg(App.API.GetTranslation("success")); App.API.ReQuery(); return false; - } + }, + Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74B") }; } else @@ -1588,7 +1585,6 @@ namespace Flow.Launcher.ViewModel { Title = App.API.GetTranslation("setAsTopMostInThisQuery"), IcoPath = "Images\\up.png", - Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\xeac2"), PluginDirectory = Constant.ProgramDirectory, Action = _ => { @@ -1596,7 +1592,8 @@ namespace Flow.Launcher.ViewModel App.API.ShowMsg(App.API.GetTranslation("success")); App.API.ReQuery(); return false; - } + }, + Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74A") }; } From 7083849d149f4262b478f29d5c0c6834c78fd3c6 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 5 May 2025 19:11:46 +0800 Subject: [PATCH 260/552] Remove unused codes --- Flow.Launcher/ViewModel/MainViewModel.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index a98172f0a..6c4236db9 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -790,8 +790,6 @@ namespace Flow.Launcher.ViewModel } } } - - _selectedResults.Visibility = Visibility.Visible; } } From b1a48e296a9d3ee22b09b98c894e35dc4a2a3bc4 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 6 May 2025 13:58:28 +0800 Subject: [PATCH 261/552] Improve code quality --- Flow.Launcher/ViewModel/MainViewModel.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 6c4236db9..8ec29c216 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -35,7 +35,7 @@ namespace Flow.Launcher.ViewModel private Query _lastQuery; private bool _lastIsHomeQuery; private string _queryTextBeforeLeaveResults; - private string _ignoredQueryText = null; + private string _ignoredQueryText; // Used to ignore query text change when switching between context menu and query results private readonly FlowLauncherJsonStorage _historyItemsStorage; private readonly FlowLauncherJsonStorage _userSelectedRecordStorage; @@ -67,6 +67,7 @@ namespace Flow.Launcher.ViewModel _queryTextBeforeLeaveResults = ""; _queryText = ""; _lastQuery = new Query(); + _ignoredQueryText = null; // null as invalid value Settings = Ioc.Default.GetRequiredService(); Settings.PropertyChanged += (_, args) => From 639a5aebe5a5a5feaf6f1fa10c4845d56218367d Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 6 May 2025 14:02:18 +0800 Subject: [PATCH 262/552] Dispose _updateSource when creating new one & Use _updateToken instead of _updateSource.Token --- Flow.Launcher/ViewModel/MainViewModel.cs | 30 ++++++++++++++---------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 8ec29c216..175f4ff84 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -46,6 +46,7 @@ namespace Flow.Launcher.ViewModel private readonly TopMostRecord _topMostRecord; private CancellationTokenSource _updateSource; // Used to cancel old query flows + private CancellationToken _updateToken; // Used to avoid ObjectDisposedException of _updateSource.Token private ChannelWriter _resultsUpdateChannelWriter; private Task _resultsViewUpdateTask; @@ -68,6 +69,8 @@ namespace Flow.Launcher.ViewModel _queryText = ""; _lastQuery = new Query(); _ignoredQueryText = null; // null as invalid value + _updateSource = new CancellationTokenSource(); + _updateToken = _updateSource.Token; Settings = Ioc.Default.GetRequiredService(); Settings.PropertyChanged += (_, args) => @@ -249,7 +252,7 @@ namespace Flow.Launcher.ViewModel return; } - var token = e.Token == default ? _updateSource.Token : e.Token; + var token = e.Token == default ? _updateToken : e.Token; // make a clone to avoid possible issue that plugin will also change the list and items when updating view model var resultsCopy = DeepCloneResults(e.Results, token); @@ -1265,7 +1268,9 @@ namespace Flow.Launcher.ViewModel var isHomeQuery = query.RawQuery == string.Empty; + _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue _updateSource = new CancellationTokenSource(); + _updateToken = _updateSource.Token; ProgressBarVisibility = Visibility.Hidden; _isQueryRunning = true; @@ -1273,7 +1278,7 @@ namespace Flow.Launcher.ViewModel // Switch to ThreadPool thread await TaskScheduler.Default; - if (_updateSource.Token.IsCancellationRequested) return; + if (_updateToken.IsCancellationRequested) return; // Update the query's IsReQuery property to true if this is a re-query query.IsReQuery = isReQuery; @@ -1322,12 +1327,11 @@ namespace Flow.Launcher.ViewModel { // Wait 15 millisecond for query change in global query // if query changes, return so that it won't be calculated - await Task.Delay(15, _updateSource.Token); - if (_updateSource.Token.IsCancellationRequested) - return; + await Task.Delay(15, _updateToken); + if (_updateToken.IsCancellationRequested) return; }*/ - _ = Task.Delay(200, _updateSource.Token).ContinueWith(_ => + _ = Task.Delay(200, _updateToken).ContinueWith(_ => { // start the progress bar if query takes more than 200 ms and this is the current running query and it didn't finish yet if (_isQueryRunning) @@ -1335,7 +1339,7 @@ namespace Flow.Launcher.ViewModel ProgressBarVisibility = Visibility.Visible; } }, - _updateSource.Token, + _updateToken, TaskContinuationOptions.NotOnCanceled, TaskScheduler.Default); @@ -1346,7 +1350,7 @@ namespace Flow.Launcher.ViewModel { tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch { - false => QueryTaskAsync(plugin, _updateSource.Token), + false => QueryTaskAsync(plugin, _updateToken), true => Task.CompletedTask }).ToArray(); @@ -1360,7 +1364,7 @@ namespace Flow.Launcher.ViewModel { tasks = plugins.Select(plugin => plugin.Metadata.Disabled switch { - false => QueryTaskAsync(plugin, _updateSource.Token), + false => QueryTaskAsync(plugin, _updateToken), true => Task.CompletedTask }).ToArray(); } @@ -1375,13 +1379,13 @@ namespace Flow.Launcher.ViewModel // nothing to do here } - if (_updateSource.Token.IsCancellationRequested) return; + if (_updateToken.IsCancellationRequested) return; // this should happen once after all queries are done so progress bar should continue // until the end of all querying _isQueryRunning = false; - if (!_updateSource.Token.IsCancellationRequested) + if (!_updateToken.IsCancellationRequested) { // update to hidden if this is still the current query ProgressBarVisibility = Visibility.Hidden; @@ -1448,12 +1452,12 @@ namespace Flow.Launcher.ViewModel var results = GetHistoryItems(historyItems); - if (_updateSource.Token.IsCancellationRequested) return; + if (_updateToken.IsCancellationRequested) return; App.API.LogDebug(ClassName, $"Update results for history"); if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, _historyMetadata, query, - _updateSource.Token))) + _updateToken))) { App.API.LogError(ClassName, "Unable to add item to Result Update Queue"); } From 265fd9c868e881da4f61060bb40385268c8d6420 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 6 May 2025 14:13:14 +0800 Subject: [PATCH 263/552] Add update source lock --- Flow.Launcher/ViewModel/MainViewModel.cs | 27 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 175f4ff84..afef8f64e 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -47,6 +47,7 @@ namespace Flow.Launcher.ViewModel private CancellationTokenSource _updateSource; // Used to cancel old query flows private CancellationToken _updateToken; // Used to avoid ObjectDisposedException of _updateSource.Token + private readonly object _updateSourceLock = new(); private ChannelWriter _resultsUpdateChannelWriter; private Task _resultsViewUpdateTask; @@ -69,8 +70,11 @@ namespace Flow.Launcher.ViewModel _queryText = ""; _lastQuery = new Query(); _ignoredQueryText = null; // null as invalid value - _updateSource = new CancellationTokenSource(); - _updateToken = _updateSource.Token; + lock (_updateSourceLock) + { + _updateSource = new CancellationTokenSource(); + _updateToken = _updateSource.Token; + } Settings = Ioc.Default.GetRequiredService(); Settings.PropertyChanged += (_, args) => @@ -1240,7 +1244,10 @@ namespace Flow.Launcher.ViewModel private async Task QueryResultsAsync(bool searchDelay, bool isReQuery = false, bool reSelect = true) { - _updateSource?.Cancel(); + lock (_updateSourceLock) + { + _updateSource.Cancel(); + } App.API.LogDebug(ClassName, $"Start query with text: <{QueryText}>"); @@ -1268,9 +1275,12 @@ namespace Flow.Launcher.ViewModel var isHomeQuery = query.RawQuery == string.Empty; - _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue - _updateSource = new CancellationTokenSource(); - _updateToken = _updateSource.Token; + lock (_updateSourceLock) + { + _updateSource.Dispose(); // Dispose old update source to fix possible cancellation issue + _updateSource = new CancellationTokenSource(); + _updateToken = _updateSource.Token; + } ProgressBarVisibility = Visibility.Hidden; _isQueryRunning = true; @@ -1888,7 +1898,10 @@ namespace Flow.Launcher.ViewModel { if (disposing) { - _updateSource?.Dispose(); + lock (_updateSourceLock) + { + _updateSource?.Dispose(); + } _resultsUpdateChannelWriter?.Complete(); if (_resultsViewUpdateTask?.IsCompleted == true) { From b156afed0bdac5cbe19749fcad2687d4bf2b9e20 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 6 May 2025 14:14:10 +0800 Subject: [PATCH 264/552] Revert "Add update source lock" This reverts commit 265fd9c868e881da4f61060bb40385268c8d6420. --- Flow.Launcher/ViewModel/MainViewModel.cs | 27 ++++++------------------ 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index afef8f64e..175f4ff84 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -47,7 +47,6 @@ namespace Flow.Launcher.ViewModel private CancellationTokenSource _updateSource; // Used to cancel old query flows private CancellationToken _updateToken; // Used to avoid ObjectDisposedException of _updateSource.Token - private readonly object _updateSourceLock = new(); private ChannelWriter _resultsUpdateChannelWriter; private Task _resultsViewUpdateTask; @@ -70,11 +69,8 @@ namespace Flow.Launcher.ViewModel _queryText = ""; _lastQuery = new Query(); _ignoredQueryText = null; // null as invalid value - lock (_updateSourceLock) - { - _updateSource = new CancellationTokenSource(); - _updateToken = _updateSource.Token; - } + _updateSource = new CancellationTokenSource(); + _updateToken = _updateSource.Token; Settings = Ioc.Default.GetRequiredService(); Settings.PropertyChanged += (_, args) => @@ -1244,10 +1240,7 @@ namespace Flow.Launcher.ViewModel private async Task QueryResultsAsync(bool searchDelay, bool isReQuery = false, bool reSelect = true) { - lock (_updateSourceLock) - { - _updateSource.Cancel(); - } + _updateSource?.Cancel(); App.API.LogDebug(ClassName, $"Start query with text: <{QueryText}>"); @@ -1275,12 +1268,9 @@ namespace Flow.Launcher.ViewModel var isHomeQuery = query.RawQuery == string.Empty; - lock (_updateSourceLock) - { - _updateSource.Dispose(); // Dispose old update source to fix possible cancellation issue - _updateSource = new CancellationTokenSource(); - _updateToken = _updateSource.Token; - } + _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue + _updateSource = new CancellationTokenSource(); + _updateToken = _updateSource.Token; ProgressBarVisibility = Visibility.Hidden; _isQueryRunning = true; @@ -1898,10 +1888,7 @@ namespace Flow.Launcher.ViewModel { if (disposing) { - lock (_updateSourceLock) - { - _updateSource?.Dispose(); - } + _updateSource?.Dispose(); _resultsUpdateChannelWriter?.Complete(); if (_resultsViewUpdateTask?.IsCompleted == true) { From 2672512a62503a76d72777c3716cfe48dc1465b7 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 6 May 2025 14:14:50 +0800 Subject: [PATCH 265/552] Dispose the old CancellationTokenSource atomically to avoid races --- Flow.Launcher/ViewModel/MainViewModel.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 175f4ff84..383256dcc 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1268,9 +1268,9 @@ namespace Flow.Launcher.ViewModel var isHomeQuery = query.RawQuery == string.Empty; - _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue - _updateSource = new CancellationTokenSource(); + var oldSource = Interlocked.Exchange(ref _updateSource, new CancellationTokenSource()); _updateToken = _updateSource.Token; + oldSource?.Dispose(); // Dispose old update source to fix possible cancellation issue ProgressBarVisibility = Visibility.Hidden; _isQueryRunning = true; From 788cb3cc16cc639ffbe1d55acb3ab20f4f900396 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 6 May 2025 19:17:33 +0800 Subject: [PATCH 266/552] Revert "Dispose the old CancellationTokenSource atomically to avoid races" This reverts commit 2672512a62503a76d72777c3716cfe48dc1465b7. --- Flow.Launcher/ViewModel/MainViewModel.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 383256dcc..175f4ff84 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1268,9 +1268,9 @@ namespace Flow.Launcher.ViewModel var isHomeQuery = query.RawQuery == string.Empty; - var oldSource = Interlocked.Exchange(ref _updateSource, new CancellationTokenSource()); + _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue + _updateSource = new CancellationTokenSource(); _updateToken = _updateSource.Token; - oldSource?.Dispose(); // Dispose old update source to fix possible cancellation issue ProgressBarVisibility = Visibility.Hidden; _isQueryRunning = true; From deb0c2139f6cbf6f6efd99ba640f65d76596edcd Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 6 May 2025 19:22:37 +0800 Subject: [PATCH 267/552] Remove unused initialization value --- Flow.Launcher/ViewModel/MainViewModel.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 175f4ff84..aab2e2d03 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -69,8 +69,6 @@ namespace Flow.Launcher.ViewModel _queryText = ""; _lastQuery = new Query(); _ignoredQueryText = null; // null as invalid value - _updateSource = new CancellationTokenSource(); - _updateToken = _updateSource.Token; Settings = Ioc.Default.GetRequiredService(); Settings.PropertyChanged += (_, args) => From 297643c3e52d9800154390e40a5518e64cb86d9e Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 6 May 2025 19:35:40 +0800 Subject: [PATCH 268/552] Revert all changes as master branch --- Flow.Launcher/ViewModel/MainViewModel.cs | 35 +++++++++++++----------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index aab2e2d03..c0b74dc68 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1266,9 +1266,12 @@ namespace Flow.Launcher.ViewModel var isHomeQuery = query.RawQuery == string.Empty; - _updateSource?.Dispose(); // Dispose old update source to fix possible cancellation issue - _updateSource = new CancellationTokenSource(); - _updateToken = _updateSource.Token; + _updateSource?.Dispose(); + + var currentUpdateSource = new CancellationTokenSource(); + _updateSource = currentUpdateSource; + var currentCancellationToken = _updateSource.Token; + _updateToken = currentCancellationToken; ProgressBarVisibility = Visibility.Hidden; _isQueryRunning = true; @@ -1276,7 +1279,7 @@ namespace Flow.Launcher.ViewModel // Switch to ThreadPool thread await TaskScheduler.Default; - if (_updateToken.IsCancellationRequested) return; + if (currentCancellationToken.IsCancellationRequested) return; // Update the query's IsReQuery property to true if this is a re-query query.IsReQuery = isReQuery; @@ -1325,11 +1328,11 @@ namespace Flow.Launcher.ViewModel { // Wait 15 millisecond for query change in global query // if query changes, return so that it won't be calculated - await Task.Delay(15, _updateToken); - if (_updateToken.IsCancellationRequested) return; + await Task.Delay(15, currentCancellationToken); + if (currentCancellationToken.IsCancellationRequested) return; }*/ - _ = Task.Delay(200, _updateToken).ContinueWith(_ => + _ = Task.Delay(200, currentCancellationToken).ContinueWith(_ => { // start the progress bar if query takes more than 200 ms and this is the current running query and it didn't finish yet if (_isQueryRunning) @@ -1337,7 +1340,7 @@ namespace Flow.Launcher.ViewModel ProgressBarVisibility = Visibility.Visible; } }, - _updateToken, + currentCancellationToken, TaskContinuationOptions.NotOnCanceled, TaskScheduler.Default); @@ -1348,21 +1351,21 @@ namespace Flow.Launcher.ViewModel { tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch { - false => QueryTaskAsync(plugin, _updateToken), + false => QueryTaskAsync(plugin, currentCancellationToken), true => Task.CompletedTask }).ToArray(); // Query history results for home page firstly so it will be put on top of the results if (Settings.ShowHistoryResultsForHomePage) { - QueryHistoryTask(); + QueryHistoryTask(currentCancellationToken); } } else { tasks = plugins.Select(plugin => plugin.Metadata.Disabled switch { - false => QueryTaskAsync(plugin, _updateToken), + false => QueryTaskAsync(plugin, currentCancellationToken), true => Task.CompletedTask }).ToArray(); } @@ -1377,13 +1380,13 @@ namespace Flow.Launcher.ViewModel // nothing to do here } - if (_updateToken.IsCancellationRequested) return; + if (currentCancellationToken.IsCancellationRequested) return; // this should happen once after all queries are done so progress bar should continue // until the end of all querying _isQueryRunning = false; - if (!_updateToken.IsCancellationRequested) + if (!currentCancellationToken.IsCancellationRequested) { // update to hidden if this is still the current query ProgressBarVisibility = Visibility.Hidden; @@ -1443,19 +1446,19 @@ namespace Flow.Launcher.ViewModel } } - void QueryHistoryTask() + void QueryHistoryTask(CancellationToken token) { // Select last history results and revert its order to make sure last history results are on top var historyItems = _history.Items.TakeLast(Settings.MaxHistoryResultsToShowForHomePage).Reverse(); var results = GetHistoryItems(historyItems); - if (_updateToken.IsCancellationRequested) return; + if (token.IsCancellationRequested) return; App.API.LogDebug(ClassName, $"Update results for history"); if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, _historyMetadata, query, - _updateToken))) + token))) { App.API.LogError(ClassName, "Unable to add item to Result Update Queue"); } From 29f94d66c229cd4036fc00f48e64add87d0fab00 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 9 May 2025 15:57:18 +0800 Subject: [PATCH 269/552] Fix startup flicker --- Flow.Launcher/App.xaml.cs | 2 +- Flow.Launcher/MainWindow.xaml.cs | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs index 402812a92..942e94470 100644 --- a/Flow.Launcher/App.xaml.cs +++ b/Flow.Launcher/App.xaml.cs @@ -203,7 +203,7 @@ namespace Flow.Launcher // it will steal focus from main window which causes window hide HotKeyMapper.Initialize(); - // Main windows needs initialized before theme change because of blur settings + // Initialize theme for main window Ioc.Default.GetRequiredService().ChangeTheme(); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index e2948c540..e243549e3 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -166,9 +166,6 @@ namespace Flow.Launcher // Force update position UpdatePosition(); - // Refresh frame - await _theme.RefreshFrameAsync(); - // Initialize resize mode after refreshing frame SetupResizeMode(); From 7c8a4379a33d9e1fbd0c64d713519d5e8d455831 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sat, 10 May 2025 22:56:48 +1000 Subject: [PATCH 270/552] fix clearing of results logic & minor adjustment to results update (#3524) --- Flow.Launcher/ViewModel/MainViewModel.cs | 64 ++++++++++++--------- Flow.Launcher/ViewModel/ResultsForUpdate.cs | 3 +- Flow.Launcher/ViewModel/ResultsViewModel.cs | 11 +++- 3 files changed, 48 insertions(+), 30 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index c0b74dc68..0c299875f 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -33,7 +33,7 @@ namespace Flow.Launcher.ViewModel private bool _isQueryRunning; private Query _lastQuery; - private bool _lastIsHomeQuery; + private bool _previousIsHomeQuery; private string _queryTextBeforeLeaveResults; private string _ignoredQueryText; // Used to ignore query text change when switching between context menu and query results @@ -1264,7 +1264,7 @@ namespace Flow.Launcher.ViewModel App.API.LogDebug(ClassName, $"Start query with ActionKeyword <{query.ActionKeyword}> and RawQuery <{query.RawQuery}>"); - var isHomeQuery = query.RawQuery == string.Empty; + var currentIsHomeQuery = query.RawQuery == string.Empty; _updateSource?.Dispose(); @@ -1284,14 +1284,10 @@ namespace Flow.Launcher.ViewModel // Update the query's IsReQuery property to true if this is a re-query query.IsReQuery = isReQuery; - // handle the exclusiveness of plugin using action keyword - RemoveOldQueryResults(query, isHomeQuery); - - _lastQuery = query; - _lastIsHomeQuery = isHomeQuery; + ICollection plugins = Array.Empty(); - if (isHomeQuery) + if (currentIsHomeQuery) { if (Settings.ShowHomePage) { @@ -1347,7 +1343,7 @@ namespace Flow.Launcher.ViewModel // plugins are ICollection, meaning LINQ will get the Count and preallocate Array Task[] tasks; - if (isHomeQuery) + if (currentIsHomeQuery) { tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch { @@ -1397,7 +1393,7 @@ namespace Flow.Launcher.ViewModel { App.API.LogDebug(ClassName, $"Wait for querying plugin <{plugin.Metadata.Name}>"); - if (searchDelay && !isHomeQuery) // Do not delay for home query + if (searchDelay && !currentIsHomeQuery) // Do not delay for home query { var searchDelayTime = plugin.Metadata.SearchDelayTime ?? Settings.SearchDelayTime; @@ -1410,7 +1406,7 @@ namespace Flow.Launcher.ViewModel // Task.Yield will force it to run in ThreadPool await Task.Yield(); - var results = isHomeQuery ? + var results = currentIsHomeQuery ? await PluginManager.QueryHomeForPluginAsync(plugin, query, token) : await PluginManager.QueryForPluginAsync(plugin, query, token); @@ -1439,8 +1435,13 @@ namespace Flow.Launcher.ViewModel App.API.LogDebug(ClassName, $"Update results for plugin <{plugin.Metadata.Name}>"); + // Indicate if to clear existing results so to show only ones from plugins with action keywords + var shouldClearExistingResults = ShouldClearExistingResults(query, currentIsHomeQuery); + _lastQuery = query; + _previousIsHomeQuery = currentIsHomeQuery; + if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, plugin.Metadata, query, - token, reSelect))) + token, reSelect, shouldClearExistingResults))) { App.API.LogError(ClassName, "Unable to add item to Result Update Queue"); } @@ -1542,25 +1543,36 @@ namespace Flow.Launcher.ViewModel } } - private void RemoveOldQueryResults(Query query, bool isHomeQuery) + /// + /// Determines whether the existing search results should be cleared based on the current query and the previous query type. + /// This is needed because of the design that treats plugins with action keywords and global action keywords separately. Results are gathered + /// either from plugins with matching action keywords or global action keyword, but not both. So when the current results are from plugins + /// with a matching action keyword and a new result set comes from a new query with the global action keyword, the existing results need to be cleared, + /// and vice versa. The same applies to home page query results. + /// + /// There is no need to clear results from global action keyword if a new set of results comes along that is also from global action keywords. + /// This is because the removal of obsolete results is handled in ResultsViewModel.NewResults(ICollection). + /// + /// The current query. + /// A flag indicating if the current query is a home query. + /// True if the existing results should be cleared, false otherwise. + private bool ShouldClearExistingResults(Query query, bool currentIsHomeQuery) { - // If last and current query are home query, we don't need to clear the results - if (_lastIsHomeQuery && isHomeQuery) + // If previous or current results are from home query, we need to clear them + if (_previousIsHomeQuery || currentIsHomeQuery) { - return; + App.API.LogDebug(ClassName, $"Cleared old results"); + return true; } - // If last or current query is home query, we need to clear the results - else if (_lastIsHomeQuery || isHomeQuery) + + // If the last and current query are not home query type, we need to check the action keyword + if (_lastQuery?.ActionKeyword != query?.ActionKeyword) { - App.API.LogDebug(ClassName, $"Remove old results"); - Results.Clear(); - } - // If last and current query are not home query, we need to check action keyword - else if (_lastQuery?.ActionKeyword != query?.ActionKeyword) - { - App.API.LogDebug(ClassName, $"Remove old results"); - Results.Clear(); + App.API.LogDebug(ClassName, $"Cleared old results"); + return true; } + + return false; } private Result ContextMenuTopMost(Result result) diff --git a/Flow.Launcher/ViewModel/ResultsForUpdate.cs b/Flow.Launcher/ViewModel/ResultsForUpdate.cs index bc0be0de8..1563f85ba 100644 --- a/Flow.Launcher/ViewModel/ResultsForUpdate.cs +++ b/Flow.Launcher/ViewModel/ResultsForUpdate.cs @@ -9,7 +9,8 @@ namespace Flow.Launcher.ViewModel PluginMetadata Metadata, Query Query, CancellationToken Token, - bool ReSelectFirstResult = true) + bool ReSelectFirstResult = true, + bool shouldClearExistingResults = false) { public string ID { get; } = Metadata.ID; } diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs index 02fb379fa..cd2736afa 100644 --- a/Flow.Launcher/ViewModel/ResultsViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs @@ -232,10 +232,15 @@ namespace Flow.Launcher.ViewModel if (!resultsForUpdates.Any()) return Results; + var newResults = resultsForUpdates.SelectMany(u => u.Results, (u, r) => new ResultViewModel(r, _settings)); + + if (resultsForUpdates.Any(x => x.shouldClearExistingResults)) + return newResults.OrderByDescending(rv => rv.Result.Score).ToList(); + return Results.Where(r => r?.Result != null && resultsForUpdates.All(u => u.ID != r.Result.PluginID)) - .Concat(resultsForUpdates.SelectMany(u => u.Results, (u, r) => new ResultViewModel(r, _settings))) - .OrderByDescending(rv => rv.Result.Score) - .ToList(); + .Concat(newResults) + .OrderByDescending(rv => rv.Result.Score) + .ToList(); } #endregion From 0c7d0e9300acd52dba2d03dc9f8f54501d01ee71 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 11 May 2025 09:28:55 +0800 Subject: [PATCH 271/552] Support copy file name --- .../ContextMenu.cs | 23 +++++++++++++++++++ .../Languages/en.xaml | 2 ++ Plugins/Flow.Launcher.Plugin.Explorer/Main.cs | 1 - 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs index 633af7b6b..eabd118fb 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs @@ -140,6 +140,29 @@ namespace Flow.Launcher.Plugin.Explorer Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue8c8") }); + contextMenus.Add(new Result + { + Title = Context.API.GetTranslation("plugin_explorer_copyname"), + SubTitle = Context.API.GetTranslation("plugin_explorer_copyname_subtitle"), + Action = _ => + { + try + { + Context.API.CopyToClipboard(Path.GetFileName(record.FullPath)); + return true; + } + catch (Exception e) + { + var message = "Fail to set text in clipboard"; + LogException(message, e); + Context.API.ShowMsg(message); + return false; + } + }, + IcoPath = Constants.CopyImagePath, + Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ue8c8") + }); + contextMenus.Add(new Result { Title = Context.API.GetTranslation("plugin_explorer_copyfilefolder"), diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index f7d5bdb18..79f8a5848 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -82,6 +82,8 @@ Copy path Copy path of current item to clipboard + Copy name + Copy name of current item to clipboard Copy Copy current file to clipboard Copy current folder to clipboard diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs index e4056131d..1c5d074a0 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs @@ -8,7 +8,6 @@ using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; -using System.Windows; using System.Windows.Controls; using Flow.Launcher.Plugin.Explorer.Exceptions; From 315de2b53146c0120c39e944254b0e7a15dc5295 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 11 May 2025 09:44:43 +0800 Subject: [PATCH 272/552] Adjust margin in appearance page --- Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml index 37de80451..700dc3a91 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml @@ -733,7 +733,7 @@ From 4e6a07c0d7954cc5e2d27aa1421d2d74dcfc19da Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 11 May 2025 11:49:52 +1000 Subject: [PATCH 273/552] Check spelling workflow ignore PRs targeting dev branch --- .github/workflows/spelling.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml index 7aaa9296a..003022ac5 100644 --- a/.github/workflows/spelling.yml +++ b/.github/workflows/spelling.yml @@ -41,9 +41,8 @@ on: # tags-ignore: # - "**" pull_request_target: - branches: - - '**' - # - '!l10n_dev' + branches-ignore: + - dev tags-ignore: - "**" types: From 99a7081d1e60f2edcc5357f115f975fb2fc3b444 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 11 May 2025 11:52:26 +1000 Subject: [PATCH 274/552] fix typo --- .github/workflows/spelling.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml index 003022ac5..47bd66107 100644 --- a/.github/workflows/spelling.yml +++ b/.github/workflows/spelling.yml @@ -42,7 +42,7 @@ on: # - "**" pull_request_target: branches-ignore: - - dev + - master tags-ignore: - "**" types: From 25d985b98ff4c6b7a90be4715ef6ff835e5de4a5 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 11 May 2025 14:32:59 +0800 Subject: [PATCH 275/552] Fix Homepage with triggers history results on arrow up --- Flow.Launcher/ViewModel/MainViewModel.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 0c299875f..df4144510 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -518,9 +518,10 @@ namespace Flow.Launcher.ViewModel [RelayCommand] private void SelectPrevItem() { - if (_history.Items.Count > 0 - && QueryText == string.Empty - && QueryResultsSelected()) + if (QueryResultsSelected() // Results selected + && string.IsNullOrEmpty(QueryText) // No input + && Results.Visibility != Visibility.Visible // Results closed which means no items in Results + && _history.Items.Count > 0) // Have history items { lastHistoryIndex = 1; ReverseHistory(); From af5ff430c47614824e84cc0ed5690bd34536aa90 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 11 May 2025 18:16:29 +1000 Subject: [PATCH 276/552] update comment --- Flow.Launcher/ViewModel/MainViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index df4144510..52581ea1d 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -520,7 +520,7 @@ namespace Flow.Launcher.ViewModel { if (QueryResultsSelected() // Results selected && string.IsNullOrEmpty(QueryText) // No input - && Results.Visibility != Visibility.Visible // Results closed which means no items in Results + && Results.Visibility != Visibility.Visible // No items in result list, e.g. when home page is off and no query text is entered, therefore the view is collapsed. && _history.Items.Count > 0) // Have history items { lastHistoryIndex = 1; From 6ed5308896762787971ff6e085ac2995b50bcfdf Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 11 May 2025 16:53:44 +0800 Subject: [PATCH 277/552] Fix null origin query issue --- Flow.Launcher/Storage/TopMostRecord.cs | 18 +----------------- Flow.Launcher/ViewModel/MainViewModel.cs | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 28 deletions(-) diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs index 7f35904a5..327ad8336 100644 --- a/Flow.Launcher/Storage/TopMostRecord.cs +++ b/Flow.Launcher/Storage/TopMostRecord.cs @@ -12,9 +12,7 @@ namespace Flow.Launcher.Storage internal bool IsTopMost(Result result) { - // origin query is null when user select the context menu item directly of one item from query list - // in this case, we do not need to check if the result is top most - if (records.IsEmpty || result.OriginQuery == null || + if (records.IsEmpty || !records.TryGetValue(result.OriginQuery.RawQuery, out var value)) { return false; @@ -26,25 +24,11 @@ namespace Flow.Launcher.Storage internal void Remove(Result result) { - // origin query is null when user select the context menu item directly of one item from query list - // in this case, we do not need to remove the record - if (result.OriginQuery == null) - { - return; - } - records.Remove(result.OriginQuery.RawQuery, out _); } internal void AddOrUpdate(Result result) { - // origin query is null when user select the context menu item directly of one item from query list - // in this case, we do not need to add or update the record - if (result.OriginQuery == null) - { - return; - } - var record = new Record { PluginID = result.PluginID, diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 0c299875f..efa6dd39d 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -444,12 +444,7 @@ namespace Flow.Launcher.ViewModel if (QueryResultsSelected()) { _userSelectedRecord.Add(result); - // origin query is null when user select the context menu item directly of one item from query list - // so we don't want to add it to history - if (result.OriginQuery != null) - { - _history.Add(result.OriginQuery.RawQuery); - } + _history.Add(result.OriginQuery.RawQuery); lastHistoryIndex = 1; } @@ -1158,7 +1153,7 @@ namespace Flow.Launcher.ViewModel { results = PluginManager.GetContextMenusForPlugin(selected); results.Add(ContextMenuTopMost(selected)); - results.Add(ContextMenuPluginInfo(selected.PluginID)); + results.Add(ContextMenuPluginInfo(selected)); } if (!string.IsNullOrEmpty(query)) @@ -1592,7 +1587,8 @@ namespace Flow.Launcher.ViewModel App.API.ReQuery(); return false; }, - Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74B") + Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74B"), + OriginQuery = result.OriginQuery }; } else @@ -1609,15 +1605,17 @@ namespace Flow.Launcher.ViewModel App.API.ReQuery(); return false; }, - Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74A") + Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\uE74A"), + OriginQuery = result.OriginQuery }; } return menu; } - private static Result ContextMenuPluginInfo(string id) + private static Result ContextMenuPluginInfo(Result result) { + var id = result.PluginID; var metadata = PluginManager.GetPluginForId(id).Metadata; var translator = App.API; @@ -1639,7 +1637,8 @@ namespace Flow.Launcher.ViewModel { App.API.OpenUrl(metadata.Website); return true; - } + }, + OriginQuery = result.OriginQuery }; return menu; } From 0e6741cf3f7d6960df13fc7a53a24c8e8963a47d Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 11 May 2025 17:05:55 +0800 Subject: [PATCH 278/552] Improve code quality --- Flow.Launcher/Storage/TopMostRecord.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Flow.Launcher/Storage/TopMostRecord.cs b/Flow.Launcher/Storage/TopMostRecord.cs index 327ad8336..7714b5001 100644 --- a/Flow.Launcher/Storage/TopMostRecord.cs +++ b/Flow.Launcher/Storage/TopMostRecord.cs @@ -12,8 +12,7 @@ namespace Flow.Launcher.Storage internal bool IsTopMost(Result result) { - if (records.IsEmpty || - !records.TryGetValue(result.OriginQuery.RawQuery, out var value)) + if (records.IsEmpty || !records.TryGetValue(result.OriginQuery.RawQuery, out var value)) { return false; } From 1775c0fd26cc2b1efd2d458131e735fc9f72cfbe Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 11 May 2025 20:27:09 +1000 Subject: [PATCH 279/552] New Crowdin updates (#3430) --- Flow.Launcher/Languages/ar.xaml | 68 +++++++-- Flow.Launcher/Languages/cs.xaml | 68 +++++++-- Flow.Launcher/Languages/da.xaml | 134 +++++++++++------- Flow.Launcher/Languages/de.xaml | 68 +++++++-- Flow.Launcher/Languages/es-419.xaml | 68 +++++++-- Flow.Launcher/Languages/es.xaml | 68 +++++++-- Flow.Launcher/Languages/fr.xaml | 62 ++++++-- Flow.Launcher/Languages/he.xaml | 77 +++++++--- Flow.Launcher/Languages/it.xaml | 68 +++++++-- Flow.Launcher/Languages/ja.xaml | 134 +++++++++++------- Flow.Launcher/Languages/ko.xaml | 113 +++++++++------ Flow.Launcher/Languages/nb.xaml | 68 +++++++-- Flow.Launcher/Languages/nl.xaml | 68 +++++++-- Flow.Launcher/Languages/pl.xaml | 112 ++++++++++----- Flow.Launcher/Languages/pt-br.xaml | 68 +++++++-- Flow.Launcher/Languages/pt-pt.xaml | 59 ++++++-- Flow.Launcher/Languages/ru.xaml | 68 +++++++-- Flow.Launcher/Languages/sk.xaml | 70 ++++++--- Flow.Launcher/Languages/sr.xaml | 68 +++++++-- Flow.Launcher/Languages/tr.xaml | 68 +++++++-- Flow.Launcher/Languages/uk-UA.xaml | 68 +++++++-- Flow.Launcher/Languages/vi.xaml | 68 +++++++-- Flow.Launcher/Languages/zh-cn.xaml | 68 +++++++-- Flow.Launcher/Languages/zh-tw.xaml | 68 +++++++-- .../Languages/ja.xaml | 14 +- .../Languages/ko.xaml | 4 +- .../Languages/pt-pt.xaml | 2 +- .../Languages/ja.xaml | 6 +- .../Languages/pt-pt.xaml | 2 +- .../Languages/ja.xaml | 80 +++++------ .../Languages/pt-pt.xaml | 2 +- .../Languages/ko.xaml | 4 +- .../Languages/ar.xaml | 1 + .../Languages/cs.xaml | 1 + .../Languages/da.xaml | 1 + .../Languages/de.xaml | 1 + .../Languages/es-419.xaml | 1 + .../Languages/es.xaml | 1 + .../Languages/fr.xaml | 1 + .../Languages/he.xaml | 1 + .../Languages/it.xaml | 1 + .../Languages/ja.xaml | 1 + .../Languages/ko.xaml | 1 + .../Languages/nb.xaml | 1 + .../Languages/nl.xaml | 1 + .../Languages/pl.xaml | 1 + .../Languages/pt-br.xaml | 1 + .../Languages/pt-pt.xaml | 1 + .../Languages/ru.xaml | 1 + .../Languages/sk.xaml | 1 + .../Languages/sr.xaml | 1 + .../Languages/tr.xaml | 1 + .../Languages/uk-UA.xaml | 1 + .../Languages/vi.xaml | 1 + .../Languages/zh-cn.xaml | 1 + .../Languages/zh-tw.xaml | 1 + .../Languages/ar.xaml | 2 +- .../Languages/cs.xaml | 2 +- .../Languages/da.xaml | 2 +- .../Languages/de.xaml | 2 +- .../Languages/es-419.xaml | 2 +- .../Languages/es.xaml | 2 +- .../Languages/fr.xaml | 2 +- .../Languages/he.xaml | 2 +- .../Languages/it.xaml | 2 +- .../Languages/ja.xaml | 22 +-- .../Languages/ko.xaml | 6 +- .../Languages/nb.xaml | 2 +- .../Languages/nl.xaml | 2 +- .../Languages/pl.xaml | 2 +- .../Languages/pt-br.xaml | 2 +- .../Languages/pt-pt.xaml | 2 +- .../Languages/ru.xaml | 2 +- .../Languages/sk.xaml | 2 +- .../Languages/sr.xaml | 2 +- .../Languages/tr.xaml | 2 +- .../Languages/uk-UA.xaml | 2 +- .../Languages/vi.xaml | 2 +- .../Languages/zh-cn.xaml | 2 +- .../Languages/zh-tw.xaml | 2 +- .../Languages/ja.xaml | 2 +- .../Languages/he.xaml | 14 +- .../Languages/ja.xaml | 28 ++-- .../Languages/ko.xaml | 2 +- .../Languages/ja.xaml | 2 +- .../Languages/ko.xaml | 12 +- .../Properties/Resources.he-IL.resx | 16 +-- 87 files changed, 1529 insertions(+), 606 deletions(-) diff --git a/Flow.Launcher/Languages/ar.xaml b/Flow.Launcher/Languages/ar.xaml index b5eafaae9..b81c5c9b5 100644 --- a/Flow.Launcher/Languages/ar.xaml +++ b/Flow.Launcher/Languages/ar.xaml @@ -42,6 +42,7 @@ وضع اللعب تعليق استخدام مفاتيح التشغيل السريع. إعادة تعيين الموقع + Reset search window position Type here to search @@ -55,7 +56,7 @@ خطأ في إعداد التشغيل عند بدء التشغيل إخفاء Flow Launcher عند فقدان التركيز عدم عرض إشعارات الإصدار الجديد - موضع نافذة البحث + Search Window Location تذكر آخر موقع الشاشة مع مؤشر الماوس الشاشة مع النافذة المركزة @@ -106,14 +107,35 @@ فتح لوحة المعاينة دائمًا عند تنشيط Flow. اضغط على {0} للتبديل بين المعاينة وعدمها. تأثير الظل غير مسموح به بينما يتم تمكين تأثير التمويه في السمة الحالية Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + فتح + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. البحث عن إضافة @@ -130,8 +152,13 @@ كلمة الفعل الحالية كلمة فعل جديدة تغيير كلمات الفعل - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + مفع + الأولوي + Search Delay + Home Page الأولوية الحالية أولوية جديدة الأولوية @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default متجر الإضافات @@ -184,6 +210,9 @@ خط عنوان النتيجة خط العنوان الفرعي للنتيجة إعادة التعيين + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. تخصيص وضع النافذة الشفافية @@ -211,12 +240,13 @@ الساعة التاريخ Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above بلا Acrylic Mica Mica Alt - هذه السمة تدعم الوضعين (فاتح/داكن). + This theme supports two (light/dark) modes. هذه السمة تدعم الخلفية الضبابية الشفافة. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ استخدام أيقونات Segoe Fluent استخدام أيقونات Segoe Fluent لنتائج الاستعلام حيثما كان مدعومًا اضغط على المفتاح + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only بروكسي HTTP @@ -323,6 +356,7 @@ مجلد السجلات مسح السجلات هل أنت متأكد أنك تريد حذف جميع السجلات؟ + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font اختر مدير الملفات @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one نجاح اكتمل بنجاح + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. مفتاح اختصار الاستعلام المخصص diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml index 806e9f203..71c9c8c6b 100644 --- a/Flow.Launcher/Languages/cs.xaml +++ b/Flow.Launcher/Languages/cs.xaml @@ -42,6 +42,7 @@ Herní režim Potlačit užívání klávesových zkratek. Obnovit pozici + Reset search window position Type here to search @@ -55,7 +56,7 @@ Při nastavování spouštění došlo k chybě Skrýt Flow Launcher při vykliknutí Nezobrazovat oznámení o nové verzi - Pozice vyhledávacího okna + Search Window Location Zapamatovat poslední pozici Obrazovka s kurzorem Obrazovka s aktivním oknem @@ -106,14 +107,35 @@ Při aktivaci služby Flow vždy otevřete panel náhledu. Stisknutím klávesy {0} přepnete náhled. Stínový efekt není povolen, pokud je aktivní efekt rozostření Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Otevřít + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Vyhledat plugin @@ -130,8 +152,13 @@ Aktuální aktivační příkaz Nový aktivační příkaz Upravit aktivační příkaz - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Povoleno + Priorita + Search Delay + Home Page Aktuální priorita Nová priorita Priorita @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Obchod s pluginy @@ -184,6 +210,9 @@ Result Title Font Result Subtitle Font Reset + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Customize Režim okna Neprůhlednost @@ -211,12 +240,13 @@ Hodiny Datum Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above None Acrylic Mica Mica Alt - This theme supports two(light/dark) modes. + This theme supports two (light/dark) modes. This theme supports Blur Transparent Background. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Použít ikony Segoe Fluent Použití ikon Segoe Fluent, pokud jsou podporovány Stiskněte klávesu + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only HTTP Proxy @@ -323,6 +356,7 @@ Složka s logy Vymazat logy Opravdu chcete odstranit všechny logy? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font Vybrat správce souborů @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one Úspěšné Úspěšně dokončeno + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Vlastní klávesová zkratka pro vyhledávání diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml index 6055a79e1..37723dc9b 100644 --- a/Flow.Launcher/Languages/da.xaml +++ b/Flow.Launcher/Languages/da.xaml @@ -30,32 +30,33 @@ Indstillinger Om Afslut - Close + Luk Copy - Cut - Paste + Klip + Indsæt Undo Select All File Folder Text Game Mode - Suspend the use of Hotkeys. + Suspender brugen af genvejstaster. Position Reset + Reset search window position Type here to search Indstillinger Generelt Portable Mode - Store all settings and user data in one folder (Useful when used with removable drives or cloud services). + Gem alle indstillinger og brugerdata i én mappe (nyttigt ved brug af flytbare drev eller cloud-tjenester). Start Flow Launcher ved system start Use logon task instead of startup entry for faster startup experience After uninstallation, you need to manually remove this task (Flow.Launcher Startup) via Task Scheduler Error setting launch on startup Skjul Flow Launcher ved mistet fokus Vis ikke notifikationer om nye versioner - Search Window Position + Search Window Location Remember Last Position Monitor with Mouse Cursor Monitor with Focused Window @@ -104,16 +105,37 @@ Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese. Always Preview Always open preview panel when Flow activates. Press {0} to toggle preview. - Shadow effect is not allowed while current theme has blur effect enabled + Skyggeeffekt er ikke tilladt, når det aktuelle tema har sløringseffekt aktiveret Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Åben + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Search Plugin @@ -123,40 +145,44 @@ Plugin Plugins Find flere plugins - On + Til Deaktiver Action keyword Setting Nøgleord Current action keyword New action keyword Change Action Keywords - Plugin seach delay time - Change Plugin Seach Delay Time - Current Priority - New Priority - Priority + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Enabled + Prioritet + Search Delay + Home Page + Nuværende prioritet + Ny prioritet + Prioritet Change Plugin Results Priority Plugin bibliotek af Initaliseringstid: Søgetid: Version - Website + Hjemmeside Uninstall Fail to remove plugin settings Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default - Plugin Store + Plugin-butik New Release Recently Updated Plugins Installed Refresh - Install + Installer Uninstall Opdater Plugin already installed @@ -168,8 +194,8 @@ Tema Appearance Søg efter flere temaer - How to create a theme - Hi There + Hvordan man opretter et tema + Hejsa Explorer Search for files, folders and file contents WebSearch @@ -184,18 +210,21 @@ Result Title Font Result Subtitle Font Reset + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Customize Vindue mode Gennemsigtighed - Theme {0} not exists, fallback to default theme - Fail to load theme {0}, fallback to default theme - Theme Folder - Open Theme Folder - Color Scheme - System Default - Light - Dark - Sound Effect + Temaet {0} findes ikke. Falder tilbage til standardtema + Kunne ikke indlæse temaet {0}. Falder tilbage til standardtema + Temamappe + Åbn temamappe + Farveskema + Systemstandard + Lys + Mørk + Lydeffekt Play a small sound when the search window opens Sound Effect Volume Adjust the volume of the sound effect @@ -211,12 +240,13 @@ Clock Date Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above None Acrylic Mica Mica Alt - This theme supports two(light/dark) modes. + This theme supports two (light/dark) modes. This theme supports Blur Transparent Background. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Use Segoe Fluent Icons Use Segoe Fluent Icons for query results where supported Press Key + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only HTTP Proxy @@ -302,7 +335,7 @@ Om - Website + Hjemmeside GitHub Docs Version @@ -323,6 +356,7 @@ Log Folder Clear Logs Are you sure you want to delete all logs? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,29 +367,30 @@ Log Level Debug Info + Setting Window Font Select File Manager Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. - File Manager - Profile Name - File Manager Path - Arg For Folder - Arg For File + Filhåndtering + Profilnavn + Sti til filhåndtering + Arg for mappe + Arg for fil Default Web Browser The default setting follows the OS default browser setting. If specified separately, flow uses that browser. Browser Browser Name - Browser Path + Sti til browser New Window New Tab - Private Mode + Privattilstand - Change Priority + Skift prioritet 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 Please provide an valid integer for Priority! @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one Fortsæt Completed successfully + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Tilpasset søgegenvejstast diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml index 4fb441d8c..895a2dab6 100644 --- a/Flow.Launcher/Languages/de.xaml +++ b/Flow.Launcher/Languages/de.xaml @@ -42,6 +42,7 @@ Spielmodus Aussetzen der Verwendung von Hotkeys. Position zurücksetzen + Reset search window position Type here to search @@ -55,7 +56,7 @@ Fehler bei Einstellungsstart beim Start Flow Launcher ausblenden, wenn Fokus verloren geht Versionsbenachrichtigungen nicht zeigen - Position des Suchfensters + Search Window Location Letzte Position merken Monitor mit Mauscursor Monitor mit fokussiertem Fenster @@ -106,14 +107,35 @@ Vorschau-Panel immer öffnen, wenn Flow aktiviert ist. Drücken Sie {0}, um Vorschau umzuschalten. Schatteneffekt ist nicht erlaubt, während das aktuelle Theme den Unschärfe-Effekt aktiviert hat Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Öffnen + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Plug-in suchen @@ -130,8 +152,13 @@ Aktuelles Action-Schlüsselwort Neues Aktions-Schlüsselwort Aktions-Schlüsselwörter ändern - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Aktiviert + Priorität + Search Delay + Home Page Aktuelle Priorität Neue Priorität Priorität @@ -147,7 +174,6 @@ Plug-ins: {0} - Plug-in-Einstellungsdateien können nicht entfernt werden, bitte entfernen Sie diese manuell Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Plug-in-Store @@ -184,6 +210,9 @@ Schriftart des Ergebnistitels Schriftart des Ergebnis-Untertitels Zurücksetzen + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Individuell anpassen Fenstermodus Opazität @@ -211,12 +240,13 @@ Uhr Datum Backdrop-Typ + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above Keine Acrylic Mica Mica Alt - Dieses Theme unterstützt zwei Modi (hell/dunkel). + This theme supports two (light/dark) modes. Dieses Theme unterstützt Unschärfe und transparenten Hintergrund. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Segoe Fluent-Icons verwenden Segoe Fluent-Icons für Abfrageergebnisse verwenden, wo unterstützt Taste drücken + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only HTTP-Proxy @@ -323,6 +356,7 @@ Ordner »Logs« Logs löschen Sind Sie sicher, dass Sie alle Logs löschen wollen? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log-Ebene Debug Info + Setting Window Font Dateimanager auswählen @@ -370,13 +405,16 @@ Dieses neue Aktions-Schlüsselwort ist dasselbe wie das alte, bitte wählen Sie ein anderes Erfolg Erfolgreich abgeschlossen + Failed to copy Geben Sie die Aktions-Schlüsselwörter ein, die Sie zum Starten des Plug-ins verwenden möchten, und trennen Sie sie durch Leerzeichen voneinander ab. Verwenden Sie *, wenn Sie keine spezifizieren möchten, und das Plug-in wird ohne jegliche Aktions-Schlüsselwörter ausgelöst. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Benutzerdefinierter Abfrage-Hotkey diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml index 23d58eca3..902811a56 100644 --- a/Flow.Launcher/Languages/es-419.xaml +++ b/Flow.Launcher/Languages/es-419.xaml @@ -42,6 +42,7 @@ Modo de juego Suspender el uso de las teclas de acceso directo. Position Reset + Reset search window position Type here to search @@ -55,7 +56,7 @@ Error setting launch on startup Ocultar Flow Launcher cuando se pierde el enfoque No mostrar notificaciones de nuevas versiones - Search Window Position + Search Window Location Remember Last Position Monitor with Mouse Cursor Monitor with Focused Window @@ -106,14 +107,35 @@ Always open preview panel when Flow activates. Press {0} to toggle preview. El efecto de sombra no está permitido mientras el tema actual tenga el efecto de desenfoque habilitado Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Abrir + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Search Plugin @@ -130,8 +152,13 @@ Palabra clave actual Nueva palabra clave Cambiar palabras clave - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Enabled + Prioridad + Search Delay + Home Page Prioridad Actual Nueva Prioridad Prioridad @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Tienda de Plugins @@ -184,6 +210,9 @@ Result Title Font Result Subtitle Font Reset + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Customize Modo Ventana Opacidad @@ -211,12 +240,13 @@ Clock Date Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above None Acrylic Mica Mica Alt - This theme supports two(light/dark) modes. + This theme supports two (light/dark) modes. This theme supports Blur Transparent Background. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Usar Iconos de Segoe Fluent Usar iconos de Segoe Fluent para resultados de consultas que sean soportados Press Key + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only Proxy HTTP @@ -323,6 +356,7 @@ Carpeta de registros Clear Logs Are you sure you want to delete all logs? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font Seleccionar Gestor de Archivos @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one Éxito Completado con éxito + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Tecla de Acceso Personalizada diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml index 8b3c42fa6..0dc6833af 100644 --- a/Flow.Launcher/Languages/es.xaml +++ b/Flow.Launcher/Languages/es.xaml @@ -42,6 +42,7 @@ Modo Juego Suspende el uso de atajos de teclado. Restablecer posición + Restablece la posición de la ventana de búsqueda Escribir aquí para buscar @@ -106,14 +107,35 @@ Muestra siempre el panel de vista previa al iniciar Flow. Pulsar {0} para mostrar/ocultar la vista previa. El efecto de sombra no está permitido si el tema actual tiene activado el efecto de desenfoque Retardo de búsqueda - Retrasa un poco la búsqueda al escribir. Esto reduce los saltos en la interfaz y la carga de resultados. + Añade un breve retardo al escribir para reducir el parpadeo de la interfaz de usuario y la carga de resultados. Recomendado si la velocidad de escritura es media. + Introduzca el tiempo de espera (en ms) hasta que la entrada se considere completa. Solo se puede editar cuando el retardo de búsqueda está activado. Tiempo de retardo de búsqueda predeterminado - Tiempo de retardo predeterminado del complemento tras el que aparecerán los resultados de la búsqueda cuando se deje de escribir. - Muy largo - Largo - Normal - Corto - Muy corto + Tiempo de espera antes de mostrar los resultados después de dejar de teclear. A mayor valor, más tiempo de espera. (ms) + Información para usuario de IME coreano + + El método de entrada coreano utilizado en Windows 11 puede causar algunos problemas en Flow Launcher. + + Si se experimenta algún problema, es posible que se tenga que activar "Usar versión anterior del IME coreano". + + + Abrir Configuración en Windows 11 e ir a: + + Hora e idioma > Idioma y región > Coreano > Opciones de idioma > Teclado - Microsoft IME > Compatibilidad, + + y activar "Usar versión anterior de Microsoft IME". + + + + Abrir idioma y región en configuración + Abre la ubicación de configuración del IME coreano. Ir a Coreano > Opciones de idioma > Teclado - Microsoft IME > Compatibilidad + Abrir + Utilizar IME Coreano anterior + Se puede cambiar la configuración anterior del IME coreano directamente desde aquí + Página de inicio + Muestra los resultados de la página de inicio cuando el texto de la consulta está vacío. + Mostrar historial de resultados en la página de inicio + Número máximo de resultados del historial en la página de inicio + Esto solo se puede editar si el complemento soporta la función de Inicio y la Página de Inicio está activada. Buscar complemento @@ -131,7 +153,12 @@ Nueva palabra clave de acción Cambia la palabra clave de acción Tiempo de retardo de la búsqueda del complemento - Cambiar tiempo de retardo de la búsqueda del complemento + Cambia el tiempo de retardo de la búsqueda del complemento + Configuración avanzada: + Activado + Prioridad + Retardo de búsqueda + Página de inicio Prioridad actual Nueva prioridad Prioridad @@ -147,7 +174,6 @@ Complementos: {0} - Fallo al eliminar los archivos de configuración del complemento, por favor elimínelos manualmente Fallo al eliminar la caché del complemento Complementos: {0} - Fallo al eliminar los archivos de caché del complemento, por favor elimínelos manualmente - Predeterminado Tienda complementos @@ -184,6 +210,9 @@ Fuente del título del resultado Fuente del subtítulo del resultado Restablecer + Restablece la configuración recomendada para la fuente y el tamaño. + Importar tamaño del tema + Si existe un valor de tamaño del tema previsto por el diseñador, este se recuperará y aplicará. Personaliza Modo Ventana Opacidad @@ -211,6 +240,7 @@ Reloj Fecha Tipo de telón de fondo + El efecto de telón de fondo no se aplica en la vista previa. Telón de fondo compatible a partir de Windows 11 build 22000 y superiores Ninguno Acrílico @@ -283,6 +313,9 @@ Iconos Segoe Fluent Utiliza iconos Segoe Fluent para los resultados de la consulta cuando sean compatibles Pulsar Tecla + Mostrar distintivos en resultados + Para los complementos compatibles, se muestran distintivos que ayudan a distinguirlos más fácilmente. + Mostrar distintivos en resultados solo para consulta global Proxy HTTP @@ -323,9 +356,10 @@ Carpeta de registros Eliminar registros ¿Está seguro de que desea eliminar todos los registros? - Clear Caches - Are you sure you want to delete all caches? - Failed to clear part of folders and files. Please see log file for more information + Carpeta del caché + Limpiar cachés + ¿Está seguro de que desea eliminar todos los cachés? + No se pudo eliminar parte de las carpetas y archivos. Por favor, consulte el archivo de registro para más información Asistente Ubicación de datos del usuario La configuración del usuario y los complementos instalados se guardan en la carpeta de datos del usuario. Esta ubicación puede variar dependiendo de si está en modo portable o no. @@ -333,6 +367,7 @@ Nivel de registro Depurar Información + Configuración de fuente de la ventana Seleccionar administrador de archivos @@ -370,13 +405,16 @@ Esta nueva palabra clave de acción es la misma que la anterior, por favor elija una diferente Correcto Finalizado correctamente + No se pudo copiar Introduzca las palabras clave de acción que desea utilizar para iniciar el complemento y utilice espacios en blanco para separarlas. Utilice * si no desea especificar ninguna, para que el complemento se inicie sin ninguna palabra clave de acción. Ajuste del tiempo de retardo de búsqueda - Seleccionar el tiempo de retardo de búsqueda que se desea utilizar para el complemento. Seleccionar "{0}" si no se desea especificar nada, y el complemento utilizará el tiempo de retardo de búsqueda predeterminado. - Tiempo de retardo de búsqueda actual - Nuevo tiempo de retardo de búsqueda + Introducir el tiempo de retardo de búsqueda en ms que se desea utilizar para el complemento. Introducir un espacio vacío si no desea especificar ninguno, y el complemento utilizará el tiempo de retardo de búsqueda predeterminado. + + + Página de inicio + Activar el estado de la página de inicio del complemento si se desea mostrar los resultados del complemento cuando la consulta está vacía. Atajo de teclado de consulta personalizada diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml index e46e0dc9d..41fdbaa51 100644 --- a/Flow.Launcher/Languages/fr.xaml +++ b/Flow.Launcher/Languages/fr.xaml @@ -42,6 +42,7 @@ Mode jeu Suspend l'utilisation des raccourcis claviers. Réinitialiser la position + Réinitialiser la position de la fenêtre de recherche Tapez ici pour rechercher @@ -55,7 +56,7 @@ Erreur lors de la configuration du lancement au démarrage Cacher Flow Launcher lors de la perte de focus Ne pas afficher le message de mise à jour pour les nouvelles versions - Position de la fenêtre de recherche + Emplacement de la fenêtre de recherche Se souvenir de la dernière position Surveiller avec le curseur de la souris Surveiller avec la fenêtre ciblée @@ -106,14 +107,35 @@ Toujours ouvrir le panneau d'aperçu lorsque Flow s'active. Appuyez sur {0} pour activer/désactiver l'aperçu. L'effet d'ombre n'est pas autorisé lorsque le thème actuel à un effet de flou activé Délai de recherche - Attendre un certain temps pour effectuer une recherche lors de la saisie. Cela permet de réduire les sauts d'interface et la charge des résultats. + Ajoute un court délai pendant la frappe pour réduire le scintillement de l'interface utilisateur et le chargement des résultats. Recommandé si votre vitesse de frappe est moyenne. + Entrez le temps d'attente (en ms) jusqu'à ce que l'entrée soit considérée comme terminée. Cela ne peut être modifié que si le délai de recherche est activé. Délai de recherche par défaut - Délai par défaut du plugin après lequel les résultats de la recherche s'affichent lorsque la saisie est interrompue. - Très long - Long - Normal - Court - Très court + Délai d'attente avant l'affichage des résultats après l'arrêt de la saisie. Les valeurs élevées permettent d'attendre plus longtemps. (ms) + Information pour les utilisateurs coréens IME + + La méthode de saisie coréenne utilisée dans Windows 11 peut causer des problèmes dans Flow Launcher. + + Si vous rencontrez des problèmes, il se peut que vous deviez activer l'option "Utiliser la version précédente de l'IME coréen". + + + Ouvrez les Paramètres dans Windows 11 et allez dans : + + Heure et langue > Langue et région > Coréen > Options linguistiques > Claviers - Microsoft IME > Compatibilité, + + et activez l'option "Utiliser la version précédente de Microsoft IME". + + + + Ouvrir les paramètres du système de langue et de région + Ouvre l'emplacement de réglage IME coréen. Allez dans coréen > Options linguistiques > Claviers - Microsoft IME > Compatibilité + Ouvrir + Utilisez l'IME coréenne précédente + Vous pouvez modifier les paramètres de l'IME coréen précédent directement à partir d'ici + Page d'accueil + Afficher les résultats de la page d'accueil lorsque le texte de la requête est vide. + Afficher les résultats de l'historique sur la page d'accueil + Maximum de résultats de l'historique affichés sur la page d'accueil + Ceci ne peut être édité que si le plugin prend en charge la fonction Accueil et que la page d'accueil est activée. Rechercher des plugins @@ -132,6 +154,11 @@ Changer les mots-clés d'action Délai de recherche du plugin Modifier le délai de recherche du plugin + Paramètres avancés : + Activé + Priorité + Délai de recherche + Page d'accueil Priorité actuelle Nouvelle priorité Priorité @@ -147,7 +174,6 @@ Plugins : {0} - Échec de la suppression des fichiers de configuration des plugins, veuillez les supprimer manuellement Échec de la suppression du cache du plugin Plugins : {0} - Échec de la suppression des fichiers cache des plugins, veuillez les supprimer manuellement - Défaut Magasin des Plugins @@ -184,6 +210,9 @@ Police du titre du résultat Police des sous-titres du résultat Réinitialiser + Rétablir les paramètres de police et de taille recommandés. + Importer la taille du thème + Si une valeur de taille prévue par le concepteur du thème est disponible, elle sera récupérée et appliquée. Personnaliser Mode fenêtré Opacité @@ -211,6 +240,7 @@ Heure Date Type d'arrière-plan + L'effet de fond n'est pas appliqué dans l'aperçu. Arrière-plan pris en charge à partir de Windows 11 version 22000 et plus Aucun Acrylique @@ -283,6 +313,9 @@ Utiliser les icônes Segoe Fluent Utiliser les icônes Segoe Fluent pour les résultats de requête lorsque pris en charge Appuyez sur une touche + Afficher les badges de résultats + Pour les plugins pris en charge, des badges sont affichés afin de les distinguer plus facilement. + Afficher les badges de résultats pour la requête globale uniquement Proxy HTTP @@ -322,6 +355,7 @@ Répertoire des journaux Effacer le journal Êtes-vous sûr de vouloir supprimer tous les journaux ? + Dossier de cache Vider les caches Êtes-vous sûr de vouloir supprimer tous les caches ? Échec de l'effacement d'une partie des dossiers et des fichiers. Veuillez consulter le fichier journal pour plus d'informations @@ -332,6 +366,7 @@ Niveau de journalisation Débogage Info + Réglage de la police de la fenêtre Sélectionner le gestionnaire de fichiers @@ -369,13 +404,16 @@ Ce nouveau mot-clé d'action est identique à l'ancien, veuillez en choisir un autre Ajout Terminé avec succès + Échec de la copie Saisissez les mots-clés d'action que vous souhaitez utiliser pour lancer le plugin et séparez-les par des espaces. Utilisez * si vous ne voulez en spécifier aucun, et le plugin sera déclenché sans aucun mot-clé d'action. Réglage du délai de recherche - Sélectionnez le délai de recherche que vous souhaitez utiliser pour le plugin. Sélectionnez "{0}" si vous ne voulez pas en spécifier, et le plugin utilisera le délai de recherche par défaut. - Délai de recherche actuel - Nouveau délai de recherche + Entrez le délai de recherche en ms que vous souhaitez utiliser pour le plugin. Laissez la case vide et le plugin utilisera le délai de recherche par défaut. + + + Page d'accueil + Activez l'état de la page d'accueil du plugin si vous souhaitez afficher les résultats du plugin lorsque la requête est vide. Requêtes personnalisées diff --git a/Flow.Launcher/Languages/he.xaml b/Flow.Launcher/Languages/he.xaml index 38e943cda..52eaf5e9f 100644 --- a/Flow.Launcher/Languages/he.xaml +++ b/Flow.Launcher/Languages/he.xaml @@ -42,6 +42,7 @@ מצב משחק השהה את השימוש במקשי קיצור. איפוס מיקום + אפס את מיקום חלון החיפוש הקלד כאן כדי לחפש @@ -55,7 +56,7 @@ שגיאה בהגדרת ההפעלה בעת הפעלת windows הסתר את Flow Launcher כאשר הוא אינו החלון הפעיל אל תציג התראות על גרסה חדשה - מיקום חלון החיפוש + מיקום חלון חיפוש זכור את המיקום האחרון Monitor with Mouse Cursor Monitor with Focused Window @@ -105,21 +106,41 @@ הצג תמיד תצוגה מקדימה פתח תמיד את לוח התצוגה המקדימה כאשר Flow מופעל. הקש על {0} כדי להחליף את התצוגה המקדימה. לא ניתן להחיל אפקט צל כאשר העיצוב הנוכחי מוגדר לאפקט טשטוש - Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. - Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + השהיית חיפוש + מוסיף עיכוב קצר בזמן ההקלדה כדי להפחית קפיצות בממשק המשתמש ועומס בתוצאות. מומלץ אם מהירות ההקלדה שלך ממוצעת. + הזן את זמן ההמתנה (בשניות) עד שהקלט נחשב כמושלם. ניתן לערוך זאת רק אם השהיית חיפוש מופעלת. + זמן עיכוב חיפוש ברירת מחדל + זמן המתנה להצגת התוצאות לאחר שתפסיק להקליד. ערכים גבוהים יותר מייצגים המתנה רבה יותר. (שניות) + Information for Korean IME user + + שיטת הקלט הקוריאנית שמשמשת ב־Windows 11 עלולה לגרום לבעיות מסוימות ב־Flow Launcher. + + אם אתה נתקל בבעיות, ייתכן שתצטרך להפעיל את האפשרות "השתמש בגרסה הקודמת של IME הקוריאני". + + פתח את ההגדרות ב־Windows 11 וגש אל: + + זמן ושפה > שפה ואזור > קוריאנית > אפשרויות שפה > מקלדת - Microsoft IME > תאימות, + + והפעל את האפשרות "השתמש בגרסה הקודמת של Microsoft IME". + + + + פתח את הגדרות מערכת שפה ואזור + פותח את מיקום הגדרות ה־IME הקוריאני. עבור אל קוריאנית > אפשרויות שפה > מקלדת - Microsoft IME > תאימות + פתח + השתמש ב־IME הקוריאני הקודם + באפשרותך לשנות את הגדרות ה־IME הקוריאני הקודם ישירות מכאן + דף הבית + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. חפש תוסף Ctrl+F לחיפוש תוסף לא נמצאו תוצאות - Please try a different search. + אנא נסה חיפוש אחר. תוסף תוספים מצא תוספים נוספים @@ -130,8 +151,13 @@ מילת מפתח נוכחית לפעולה מילת מפתח חדשה לפעולה שנה מילות מפתח לפעולה - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + שנה את זמן השהיית חיפוש של תוסף + הגדרות מתקדמות: + מופעל + עדיפות + עיכוב חיפוש + דף הבית עדיפות נוכחית עדיפות חדשה עדיפות @@ -147,7 +173,6 @@ תוספים: {0} - נכשל בהסרת קבצי הגדרות התוסף, יש להסירם ידנית נכשל בהסרת מטמון התוסף תוספים: {0} - נכשל בהסרת קובצי מטמון התוסף, אנא הסר אותם ידנית - Default חנות תוספים @@ -184,6 +209,9 @@ גופן הכותרת לתוצאה גופן כותרת המשנה לתוצאה אפס + אפס להגדרות הגופן והגודל המומלצות. + ייבוא ​​גודל ערכת נושא + אם ערך הגודל שתוכנן על ידי מעצב ערכת הנושא זמין, הוא יאוחזר ויוחל. התאם אישית מצב חלון שקיפות @@ -211,12 +239,13 @@ שעון תאריך סוג רקע + אפקט הרקע אינו מוחל בתצוגה המקדימה. התמיכה ב-Backdrop קיימת החל מ-Windows 11 build 22000 ומעלה ללא אקריליק מיקה Mica Alt - ערכת נושא זאת תומך בשני מצבים (בהיר/כהה). + ערכת נושא זאת תומכת בשני מצבים (בהיר/כהה). ערכת נושא זו תומכת בטשטוש רקע שקוף. הצג מציין מיקום הצג מציין מיקום כאשר השאילתה ריקה @@ -283,6 +312,9 @@ השתמש ב-Segoe Fluent Icons השתמש ב-Segoe Fluent Icons לתוצאות חיפוש כאשר נתמך הקש על מקש + הצג תגי תוצאות + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only HTTP Proxy @@ -323,6 +355,7 @@ תיקיית יומני רישום נקה יומני רישום האם אתה בטוח שברצונך למחוק את כל היומנים? + תיקיית מטמון נקה נתוני מטמון האם אתה בטוח שברצונך למחוק את כל הנתונים שבמטמון? נכשל ניקוי חלק מהתיקיות והקבצים. עיין בלוג לקבלת מידע נוסף @@ -330,9 +363,10 @@ מיקום נתוני משתמש הגדרות המשתמש והתוספים המותקנים נשמרים בתיקיית נתוני המשתמש. מיקום זה עשוי להשתנות אם התוכנה במצב נייד. פתח תיקיה - Log Level + רמת יומן ניפוי שגיאות מידע + Setting Window Font בחר מנהל קבצים @@ -370,13 +404,16 @@ מילת הפעולה החדשה זהה לישנה, נא לבחור מילת פעולה שונה הצליח הושלם בהצלחה + ההעתקה נכשלה הזן את מילות הפעולה שבהן תרצה להשתמש כדי להפעיל את התוסף, והשתמש ברווחים כדי להפריד ביניהן. השתמש ב-* אם אינך רוצה להגדיר כלל, והתוסף יופעל ללא מילות פעולה. - Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + הגדרת זמן עיכוב החיפוש + הזן את זמן עיכוב החיפוש בשניות שבו אתה רוצה להשתמש עבור התוסף. השאר ריק אם אינך רוצה לציין, והתוסף ישתמש בזמן ברירת המחדל לעיכוב חיפוש. + + + דף הבית + Enable the plugin home page state if you like to show the plugin results when query is empty. מקש קיצור לשאילתה מותאמת אישית diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml index fd34bf366..1a356ad65 100644 --- a/Flow.Launcher/Languages/it.xaml +++ b/Flow.Launcher/Languages/it.xaml @@ -42,6 +42,7 @@ Modalità gioco Sospendere l'uso dei tasti di scelta rapida. Ripristina Posizione + Reset search window position Type here to search @@ -55,7 +56,7 @@ Errore nell'impostazione del lancio all'avvio Nascondi Flow Launcher quando perde il focus Non mostrare le notifiche per una nuova versione - Posizione Finestra Di Ricerca + Search Window Location Ricorda L'Ultima Posizione Monitora con il cursore del mouse Monitora con la finestra in primo piano @@ -106,14 +107,35 @@ Apri sempre il pannello di anteprima quando Flow si attiva. Premi {0} per attivare l'anteprima. L'effetto ombra non è consentito mentre il tema corrente ha un effetto di sfocatura abilitato Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Apri + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Plugin di ricerca @@ -130,8 +152,13 @@ Parola chiave di azione corrente Nuova parola chiave d'azione Cambia Keywords Azione - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Abilitato + Priorità + Search Delay + Home Page Priorità Attuale Nuova Priorità Priorità @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Negozio dei Plugin @@ -184,6 +210,9 @@ Font del Titolo del Risultato Font del Sottotitolo del Risultato Resetta + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Personalizza Modalità finestra Opacità @@ -211,12 +240,13 @@ Orologio Data Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above Vuoto Acrylic Mica Mica Alt - Questo tema supporta due (chiaro/scuro) varianti. + This theme supports two (light/dark) modes. Questo tema supporta lo sfondo trasparente blurrato. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Usa Icone Segoe Fluent Usa Icone Segoe Fluent per risultati di ricerca dove supportate Premi tasto + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only Proxy HTTP @@ -323,6 +356,7 @@ Cartella dei Log Cancella i log Sei sicuro di voler cancellare tutti i log? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font Seleziona Gestore File @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one Successo Completato con successo + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Tasti scelta rapida per ricerche personalizzate diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml index e6f2223cd..949fe5c99 100644 --- a/Flow.Launcher/Languages/ja.xaml +++ b/Flow.Launcher/Languages/ja.xaml @@ -28,7 +28,7 @@ 最終実行時間:{0} 開く 設定 - Flow Launcherについて + 情報 終了 閉じる コピー @@ -42,7 +42,8 @@ ゲームモード ホットキーの使用を一時停止します。 位置のリセット - Type here to search + 検索ウィンドウの位置をリセット + ここに入力して検索 設定 @@ -50,8 +51,8 @@ ポータブルモード すべての設定とユーザーデータを1つのフォルダに保存します(リムーバブルドライブやクラウドサービスで使用する場合に便利です)。 スタートアップ時にFlow Launcherを起動する - Use logon task instead of startup entry for faster startup experience - After uninstallation, you need to manually remove this task (Flow.Launcher Startup) via Task Scheduler + 高速起動のためにスタートアップではなくログオンタスクを使用 + アンインストール後は、「タスク スケジューラ」からこのタスク(Flow.Launcher Startup)を手動で削除する必要があります。 Error setting launch on startup フォーカスを失った時にFlow Launcherを隠す 最新版が入手可能であっても、アップグレードメッセージを表示しない @@ -105,15 +106,36 @@ 常にプレビューする Flow が有効になったとき、常にプレビューパネルを開きます。 {0} を押してプレビューの表示/非表示を切り替えます。 現在のテーマでぼかしの効果が有効になっている場合、影の効果を有効にすることはできません - Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + 検索遅延 + 入力中に短い遅延を追加することで、UIのちらつきや結果の読み込みを軽減します。平均的なタイピング速度のユーザーにおすすめです。 + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + 開く + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Search Plugin @@ -130,8 +152,13 @@ Current action keyword New action keyword Change Action Keywords - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + 詳細設定: + Enabled + 重要度 + 検索遅延 + Home Page Current Priority New Priority 重要度 @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default プラグインストア @@ -178,12 +204,15 @@ 管理者または別のユーザーとしてプログラムを起動します プロセスキラー 不要なプロセスを終了します - Search Bar Height - Item Height + 検索バーの高さ + アイテムの高さ 検索ボックスのフォント Result Title Font Result Subtitle Font Reset + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Customize ウィンドウモード 透過度 @@ -210,20 +239,21 @@ カスタム 時刻 日付 - Backdrop Type - Backdrop supported starting from Windows 11 build 22000 and above - None - Acrylic - Mica - Mica Alt - This theme supports two(light/dark) modes. + バックドロップの種類 + プレビューではバックドロップ効果が適用されません。 + バックドロップは Windows 11 ビルド 22000 以降でサポートされています。 + なし + アクリル + マイカ + マイカ(代替) + This theme supports two (light/dark) modes. This theme supports Blur Transparent Background. - Show placeholder + プレースホルダーを表示 Display placeholder when query is empty - Placeholder text + 検索欄の案内文 Change placeholder text. Input empty will use: {0} - Fixed Window Size - The window size is not adjustable by dragging. + ウィンドウサイズの固定 + ウィンドウのサイズを固定し、ドラッグでの変更を無効にします。 ホットキー @@ -238,8 +268,8 @@ Select a modifier key to open selected result via keyboard. ホットキーを表示 Show result selection hotkey with results. - Auto Complete - Runs autocomplete for the selected items. + 自動補完 + 選択された項目に対して自動補完を実行します。 Select Next Item Select Previous Item Next Page @@ -253,7 +283,7 @@ Toggle Game Mode Toggle History Open Containing Folder - Run As Admin + 管理者として実行 Refresh Search Results Reload Plugins Data Quick Adjust Window Width @@ -283,6 +313,9 @@ Use Segoe Fluent Icons Use Segoe Fluent Icons for query results where supported Press Key + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only HTTP プロキシ @@ -301,15 +334,15 @@ プロキシ接続に失敗しました - Flow Launcherについて + 情報 ウェブサイト GitHub - Docs + ドキュメント バージョン Icons あなたはFlow Launcherを {0} 回利用しました アップデートを確認する - Become A Sponsor + スポンサーになる 新しいバージョン {0} が利用可能です。Flow Launcherを再起動してください。 アップデートの確認に失敗しました、api.github.com への接続とプロキシ設定を確認してください。 @@ -323,6 +356,7 @@ Log Folder Clear Logs Are you sure you want to delete all logs? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,9 +367,10 @@ Log Level Debug Info + Setting Window Font - Select File Manager + デフォルトのファイルマネージャー Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. File Manager @@ -345,7 +380,7 @@ Arg For File - Default Web Browser + デフォルトのウェブブラウザー The default setting follows the OS default browser setting. If specified separately, flow uses that browser. Browser Browser Name @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one 成功しました Completed successfully + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. @@ -404,7 +442,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 保存 Overwrite - + キャンセル Reset 削除 Update @@ -456,14 +494,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in アップデートの詳細 - Skip - Welcome to Flow Launcher - Hello, this is the first time you are running Flow Launcher! - Before starting, this wizard will assist in setting up Flow Launcher. You can skip this if you wish. Please choose a language - Search and run all files and applications on your PC - Search everything from applications, files, bookmarks, YouTube, Twitter and more. All from the comfort of your keyboard without ever touching the mouse. - Flow Launcher starts with the hotkey below, go ahead and try it out now. To change it, click on the input and press the desired hotkey on the keyboard. - Hotkeys + スキップ + Flow Launcherへようこそ + こんにちは!Flow Launcherを初めて起動されたんですね! + 開始する前に、このウィザードが Flow Launcher のセットアップをお手伝いします。ご希望の方はスキップできます。言語を選択してください。 + PC上のファイルとアプリケーションの検索と実行 + アプリケーション、ファイル、ブックマーク、YouTube、X などあらゆるものを検索して実行できます。マウスに触れることなく、キーボードだけで快適に操作できます。 + Flow Launcher は以下のホットキーで起動します。さっそく試してみてください。変更するには、入力欄をクリックし、キーボードで希望のホットキーを押してください。 + ホットキー Action Keyword and Commands Search the web, launch applications or run various functions through Flow Launcher plugins. Certain functions start with an action keyword, and if necessary, they can be used without action keywords. Try the queries below in Flow Launcher. Let's Start Flow Launcher diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml index 3aee3f5e4..9ae2e0195 100644 --- a/Flow.Launcher/Languages/ko.xaml +++ b/Flow.Launcher/Languages/ko.xaml @@ -18,7 +18,7 @@ Failed to register hotkey "{0}". The hotkey may be in use by another program. Change to a different hotkey, or exit another program. - Failed to unregister hotkey "{0}". Please try again or see log for details + 단축키 "{0}" 등록 해제에 실패했습니다. 다시 시도하시거나 로그를 확인하세요 Flow Launcher {0}을 실행할 수 없습니다. Flow Launcher 플러그인 파일 형식이 유효하지 않습니다. @@ -42,6 +42,7 @@ 게임 모드 단축키 사용을 일시중단합니다. 창 위치 초기화 + 검색창 위치 초기화 검색어 입력 @@ -105,15 +106,27 @@ 항상 미리보기 Flow 사용시 항상 미리보기 패널을 열어둡니다. {0} 키를 눌러 프리뷰창을 켜고 끌 수 있습니다. 반투명 흐림 효과를 사용하는 경우, 그림자 효과를 쓸 수 없습니다. - Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. - Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + 검색 지연 + 타이핑 중 UI 깜빡임과 결과 로드를 줄이기 위해 짧은 지연을 추가합니다. 타이핑 속도가 평균 수준이라면 권장합니다. + 입력이 완료된 것으로 감지될 때까지의 대기 시간(밀리초 단위)을 입력하세요. 이 항목은 검색 지연이 활성화된 경우에만 편집할 수 있습니다. + 기본 검색 지연 시간 + 입력이 멈춘 후 결과를 표시하기까지의 대기 시간입니다. 값이 클수록 더 오래 기다립니다. (ms) + 한국어 IME 사용 안내 + + Windows 11에서 사용하는 한국어 IME가 Flow Launcher에서 일부 문제를 일으킬 수 있습니다. 문제가 발생하는 경우, “이전 버전의 Microsoft IME 사용” 옵션을 활성화해야 할 수 있습니다. Windows 11 설정을 열고 다음으로 이동하세요: 시간 및 언어 > 언어 및 지역 > 한국어 > 언어 옵션 > 키보드 옵션 – Microsoft IME > 호환성에서 “이전 버전의 Microsoft IME 사용"을 켭니다. + + + + 시스템의 시간 및 언어 설정 열기 + 한국어 IME 설정 위치를 엽니다. 한국어>언어 옵션>키보드 - Microsoft IME> 호환성으로 이동하세요 + 열기 + 이전 버전의 Microsoft IME 사용 + 이전 버전의 IME를 사용하도록 시스템 설정을 변경합니다 + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. 플러그인 검색 @@ -130,8 +143,13 @@ 현재 액션 키워드 새 액션 키워드 액션 키워드 변경 - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + 고급 설정: + + 중요 + 검색 지연 + Home Page 현재 중요도: 새 중요도: 중요도 @@ -147,7 +165,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default 플러그인 스토어 @@ -172,18 +189,21 @@ 안녕하세요! 탐색기 Search for files, folders and file contents - WebSearch - Search the web with different search engine support + 웹 검색 + 다양한 검색 엔진을 통해 웹을 검색합니다 프로그램 Launch programs as admin or a different user - ProcessKiller - Terminate unwanted processes + 프로세스 킬러 + 필요없는 프로세스를 종료합니다 검색창 높이 결과 항목 높이 쿼리 상자 글꼴 결과 제목 글꼴 결과 부제목 글꼴 초기화 + 권장되는 글꼴 및 크기 설정으로 초기화 합니다. + 테마 크기 가져오기 + 테마 디자이너가 의도한 크기 값이 존재하는 경우, 해당 값을 불러와 적용합니다. 사용자 지정 윈도우 모드 투명도 @@ -211,19 +231,20 @@ 시계 날짜 배경 효과 타입 - Backdrop supported starting from Windows 11 build 22000 and above + 프리뷰 영역에선 배경효과가 적용되지 않아요. + 배경 효과는 윈도우 11 빌드 22000 이상부터 지원합니다 없음 아크릴 - Mica - Mica Alt - This theme supports two(light/dark) modes. - This theme supports Blur Transparent Background. + 마이카 + 마이카 변형 + This theme supports two (light/dark) modes. + 이 테마는 흐릿한 배경 효과를 지원합니다. 안내 텍스트 표시 입력 내용이 없을때 입력창 위치를 알 수 있는 텍스트를 표시합니다 안내 텍스트 안내 텍스트를 변경하세요. 아무것도 입력하지 않으면 다음을 사용합니다: "{0}" - Fixed Window Size - The window size is not adjustable by dragging. + 창 크기 고정 + 창 크기를 드래그하여 조절할 수 없습니다. 단축키 @@ -233,13 +254,13 @@ 미리보기 전환 미리보기 패널을 켜고 끌 때 사용할 단축키를 입력하세요. 단축키 프리셋 - List of currently registered hotkeys + 현재 등록된 단축키 목록 결과 선택 단축키 결과 항목을 선택하는 단축키입니다. 단축키 표시 결과창에서 결과 선택 단축키를 표시합니다. 자동 완성 - Runs autocomplete for the selected items. + 선택된 항목에 대해 자동 완성을 실행합니다. 다음 항목 선택 이전 항목 선택 다음 페이지 @@ -247,7 +268,7 @@ 이전 쿼리로 전환 다음 쿼리로 전환 콘텍스트 메뉴 열기 - Open Native Context Menu + 시스템 우클릭 메뉴 열기 설정창 열기 파일 경로 복사 게임 모드 전환 @@ -283,6 +304,9 @@ 플루언트 아이콘 사용 결과 및 일부 메뉴에서 플루언트 아이콘을 사용합니다. 사용할 키를 누르세요 + 결과 뱃지 표시 + For supported plugins, badges are displayed to help distinguish them more easily. + 전역 검색 결과에서만 뱃지 표시 HTTP 프록시 @@ -323,21 +347,23 @@ 로그 폴더 로그 삭제 정말 모든 로그를 삭제하시겠습니까? - Clear Caches - Are you sure you want to delete all caches? + Cache Folder + 캐시 지우기 + 모든 캐시를 삭제하시겠습니까? Failed to clear part of folders and files. Please see log file for more information 마법사 사용자 데이터 위치 사용자 설정과 설치된 플러그인은 사용자 데이터 폴더에 저장됩니다. 이 위치는 휴대용 모드 활성화 여부에 따라 달라질 수 있습니다. 폴더 열기 - Log Level + 로그 레벨 Debug Info + Setting Window Font 파일관리자 선택 - Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + 사용 중인 파일 관리자의 파일 위치를 지정하고, 필요한 경우 인수를 추가하세요. "%d"는 열고자 하는 디렉터리 경로를 나타내며, 폴더용 인수 필드 및 특정 디렉터리를 여는 명령어에서 사용됩니다. "%f"는 열고자 하는 파일 경로를 나타내며, 파일용 인수 필드 및 특정 파일을 여는 명령어에서 사용됩니다. + 예를 들어, 파일 관리자가 totalcmd.exe /A c:\windows와 같은 명령어로 c:\windows 디렉터리를 연다면, 파일 관리자 경로는 totalcmd.exe가 되고, 폴더용 인수는 /A "%d"가 됩니다. QTTabBar와 같은 일부 파일 관리자는 경로만 전달하면 되는 경우가 있으므로, 이 경우에는 파일 관리자 경로에 "%d"를 입력하고 나머지 필드는 비워두세요. 파일관리자 프로필 이름 파일관리자 경로 @@ -367,16 +393,19 @@ 플러그인을 찾을 수 없습니다. 새 액션 키워드를 입력하세요. 새 액션 키워드가 할당된 플러그인이 이미 있습니다. 다른 액션 키워드를 입력하세요. - This new Action Keyword is the same as old, please choose a different one + 이 새로운 액션 키워드는 기존 것과 동일합니다. 다른 키워드를 선택해주세요. 성공 성공적으로 완료했습니다. + Failed to copy 플러그인을 실행할 때 사용할 액션 키워드를 입력하세요. 여러 개를 입력할 경우 공백으로 구분하세요. 아무 키워드도 지정하지 않으려면 * 를 입력하세요. 이 경우 액션 키워드 없이도 플러그인이 실행됩니다. - Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + 검색 지연 시간 설정 + 플러그인에서 사용할 검색 지연 시간(ms)을 입력하세요. 지정하지 않으려면 비워두세요. 기본 검색 지연 시간이 사용됩니다. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. 사용자지정 쿼리 단축키 @@ -389,7 +418,7 @@ Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". - Press the keys you want to use for this function. + 이 기능에 사용할 키를 눌러주세요. 사용자 지정 쿼리 단축어 @@ -403,13 +432,13 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 저장 - Overwrite + 덮어쓰기 취소 - Reset + 초기화 삭제 확인 - Yes - No + + 아니오 배경 diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml index b78bcb7d7..58571a1c4 100644 --- a/Flow.Launcher/Languages/nb.xaml +++ b/Flow.Launcher/Languages/nb.xaml @@ -42,6 +42,7 @@ Spillmodus Stopp bruken av hurtigtaster. Tilbakestilling av posisjon + Reset search window position Type here to search @@ -55,7 +56,7 @@ Feil ved å sette kjør ved oppstart Skjul Flow Launcher når fokus forsvinner Ikke vis varsler om nye versjoner - Posisjon til søkevindu + Search Window Location Husk siste posisjon Skjerm med musepekeren Skjerm med fokusert vindu @@ -106,14 +107,35 @@ Åpne alltid forhåndsvisningspanel når Flow aktiveres. Trykk på {0} for å velge forhåndsvisning. Skyggeeffekt er ikke tillatt mens gjeldende tema har uskarphet-effekt aktivert Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Åpne + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Søk etter programtillegg @@ -130,8 +152,13 @@ Nåværende handlingsnøkkelord Nytt handlingsnøkkelord Endre handlingsnøkkelord - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Aktivert + Prioritet + Search Delay + Home Page Gjeldende prioritet Ny prioritet Prioritet @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Programtillegg butikk @@ -184,6 +210,9 @@ Skrift for resultattittel Skrift for resultatundertittel Tilbakestill + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Tilpass Vindumodus Ugjennomsiktighet @@ -211,12 +240,13 @@ Klokke Dato Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above Ingen Acrylic Mica Mica Alt - Dette temaet støtter to (lys/mørk) moduser. + This theme supports two (light/dark) modes. Dette temaet støtter uskarp gjennomsiktig bakgrunn. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Bruk Segoe Fluent ikoner Bruk Segoe Fluent Icons for spørreresultater der det støttes Trykk tast + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only HTTP proxy @@ -323,6 +356,7 @@ Loggmappe Tøm logger Er du sikker på at du vil slette alle loggene? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font Velg filbehandler @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one Vellykket Fullført vellykket + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Hurtigtast for egendefinert spørring diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml index ce3406142..70a58e322 100644 --- a/Flow.Launcher/Languages/nl.xaml +++ b/Flow.Launcher/Languages/nl.xaml @@ -42,6 +42,7 @@ Spelmodus Stop het gebruik van Sneltoetsen. Positie resetten + Reset search window position Type here to search @@ -55,7 +56,7 @@ Fout bij het instellen van uitvoeren bij opstarten Verberg Flow Launcher als focus verloren is Laat geen nieuwe versie notificaties zien - Positie Zoekvenster + Search Window Location Laatste Positie Onthouden Monitor met Muiscursor Monitor met Gefocust Venster @@ -106,14 +107,35 @@ Open altijd het voorbeeld paneel wanneer Flow activeert. Druk op {0} om voorbeeld te schakelen. Schaduw effect is niet toegestaan omdat het huidige thema een vervagingseffect heeft Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Openen + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Plug-ins zoeken @@ -130,8 +152,13 @@ Huidige actie sneltoets Nieuw actie sneltoets Wijzig actie-sneltoets - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Enabled + Priority + Search Delay + Home Page Huidige Prioriteit Nieuwe Prioriteit Prioriteit @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Plugin Winkel @@ -184,6 +210,9 @@ Resultaat titel lettertype Result Subtitle Font Herstellen + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Aanpassen Venster Modus Ondoorzichtigheid @@ -211,12 +240,13 @@ Klok Datum Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above None Acrylic Mica Mica Alt - Dit thema ondersteunt twee (licht/donker) modi. + This theme supports two (light/dark) modes. This theme supports Blur Transparent Background. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Gebruik Segoe Fluent pictogrammen Gebruik Segoe Fluent iconen voor zoekresultaten wanneer ondersteund Press Key + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only HTTP Proxy @@ -323,6 +356,7 @@ Log Map Logbestanden wissen Weet u zeker dat u alle logbestanden wilt verwijderen? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font Bestandsbeheerder selecteren @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one Succesvol Succesvol afgerond + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Custom Query Sneltoets diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml index 12af37c3e..7cc6dfcb1 100644 --- a/Flow.Launcher/Languages/pl.xaml +++ b/Flow.Launcher/Languages/pl.xaml @@ -8,9 +8,9 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Wybierz plik wykonywalny {0} - 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 agian. 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} Nie można ustawić ścieżki do pliku wykonywalnego {0}. Spróbuj ponownie w ustawieniach Flow (przewiń na sam dół). Nie udało się zainicjować wtyczek @@ -42,7 +42,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Tryb grania Wstrzymaj używanie skrótów. Resetowanie pozycji - Type here to search + Zresetuj pozycję okna wyszukiwania + Wpisz tutaj, aby wyszukać Ustawienia @@ -105,15 +106,36 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Zawsze podgląd Zawsze otwieraj panel podglądu, gdy aktywowany jest Flow. Naciśnij {0}, aby przełączyć podgląd. Efekt cienia jest niedozwolony, gdy bieżący motyw ma włączony efekt rozmycia - Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. - Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Opóźnienie wyszukiwania + Dodaje krótkie opóźnienie podczas pisania, aby zmniejszyć migotanie interfejsu i obciążenie wynikami. Zalecane przy przeciętnej szybkości pisania. + Wprowadź czas oczekiwania (w ms), po którym wprowadzanie zostanie uznane za zakończone. Edycja jest możliwa tylko, gdy włączone jest Opóźnienie wyszukiwania. + Domyślne opóźnienie wyszukiwania + Opóźnienie (ms) przed pokazaniem wyników po zakończeniu pisania. Wyższe wartości oznaczają dłuższe oczekiwanie. + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Otwórz + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Szukaj wtyczek @@ -130,8 +152,13 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Bieżące słowo kluczowe akcji Nowe słowo kluczowe akcji Zmień słowa kluczowe akcji - Plugin seach delay time - Change Plugin Seach Delay Time + Opóźnienie wyszukiwania wtyczek + Zmień opóźnienie wyszukiwania wtyczek + Ustawienia zaawansowane: + Aktywny + Priorytet + Opóźnienie wyszukiwania + Home Page Obecny Priorytet Nowy Priorytet Priorytet @@ -145,9 +172,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Odinstalowywanie Nie udało się usunąć ustawień wtyczki Wtyczki: {0} – nie udało się usunąć plików ustawień wtyczek, usuń je ręcznie - Fail to remove plugin cache - Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default + Nie udało się usunąć cache wtyczki + Wtyczki: {0} - Nie udało się usunąć plików cache wtyczki, usuń je ręcznie Sklep z wtyczkami @@ -184,6 +210,9 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Czcionka tytułu wyniku Czcionka podtytułu wyniku Resetuj + Przywróć zalecane ustawienia czcionki i rozmiaru. + Rozmiar importu motywu + Jeśli wartość rozmiaru przewidziana przez projektanta motywu jest dostępna, zostanie pobrana i zastosowana. Personalizuj Tryb w oknie Przeźroczystość @@ -210,20 +239,21 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Niestandardowa Zegar Data - Backdrop Type - Backdrop supported starting from Windows 11 build 22000 and above + Typ tła + Efekt tła nie jest stosowany w podglądzie. + Efekt tła obsługiwany od Windows 11 kompilacja 22000 i nowszych Brak - Acrylic - Mica + Akryl + Mika Mica Alt Ten motyw obsługuje dwa tryby (jasny/ciemny). Ten motyw obsługuje rozmyte przezroczyste tło. - Show placeholder - Display placeholder when query is empty - Placeholder text - Change placeholder text. Input empty will use: {0} - Fixed Window Size - The window size is not adjustable by dragging. + Pokaż placeholder + Wyświetlaj placeholder, gdy zapytanie jest puste + Tekst placeholdera + Zmień tekst placeholdera. Jeśli pole będzie puste, zostanie użyty: {0} + Stały rozmiar okna + Nie można zmienić rozmiaru okna, przeciągając. Skrót klawiszowy @@ -283,6 +313,9 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Użyj ikon Segoe Fluent Użyj ikon Segoe Fluent dla wyników wyszukiwania, gdzie jest to obsługiwane Naciśnij klawisz + Pokaż odznaki wyników + W przypadku wspieranych wtyczek wyświetlane są odznaki, aby łatwiej je rozróżnić. + Pokaż odznaki wyników tylko dla zapytań globalnych Serwer proxy HTTP @@ -323,16 +356,18 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Folder dziennika Wyczyść logi Czy na pewno chcesz usunąć wszystkie logi? - Clear Caches - Are you sure you want to delete all caches? - Failed to clear part of folders and files. Please see log file for more information + Cache Folder + Wyczyść pamięć podręczną + Czy na pewno chcesz usunąć wszystkie pamięci podręczne? + Nie udało się wyczyścić części folderów i plików. Więcej informacji w pliku dziennika Kreator Lokalizacja danych użytkownika Ustawienia użytkownika i zainstalowane wtyczki są zapisywane w folderze danych użytkownika. Ta lokalizacja może się różnić w zależności od tego, czy aplikacja jest w trybie przenośnym, czy nie. Otwórz folder - Log Level + Poziom logowania Debug Info + Ustawienia czcionki okna Wybierz menedżer plików @@ -367,16 +402,19 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Nie można odnaleźć podanej wtyczki Nowy wyzwalacz nie może być pusty Ten wyzwalacz został już przypisany do innej wtyczki, musisz podać inny wyzwalacz. - This new Action Keyword is the same as old, please choose a different one + Nowe słowo kluczowe akcji jest takie samo jak poprzednie. Wybierz inne Sukces Zakończono pomyślnie - 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. + Failed to copy + Wpisz słowa kluczowe uruchamiające wtyczkę (oddzielone spacją). Wpisz *, aby uruchamiać wtyczkę bez słów kluczowych. - Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Ustawienie opóźnienia wyszukiwania + Podaj czas opóźnienia wyszukiwania (w ms) dla wtyczki. Pozostaw puste, aby użyć wartości domyślnej. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Skrót klawiszowy niestandardowych zapyta diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml index d0040d799..bd74d1d5f 100644 --- a/Flow.Launcher/Languages/pt-br.xaml +++ b/Flow.Launcher/Languages/pt-br.xaml @@ -42,6 +42,7 @@ Modo Gamer Suspender o uso de Teclas de Atalho. Redefinição de Posição + Reset search window position Type here to search @@ -55,7 +56,7 @@ Erro ao ativar início com o sistema Esconder Flow Launcher quando foco for perdido Não mostrar notificações de novas versões - Posição da Janela de Busca + Search Window Location Lembrar Última Posição Monitor com o Cursor do Mouse Monitor com Janela em Foco @@ -106,14 +107,35 @@ Sempre abrir o painel de pré-visualização quando o Flow é ativado. Pressione {0} para ativar ou desativar a pré-visualização. O efeito de sombra não é permitido enquanto o tema atual tem o efeito de desfoque ativado Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Abrir + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Buscar Plugin @@ -130,8 +152,13 @@ Palavra-chave de ação atual Nova palavra-chave de ação Alterar Palavras-chave de Ação - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Enabled + Prioridade + Search Delay + Home Page Prioridade atual Nova Prioridade Prioridade @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Loja de Plugins @@ -184,6 +210,9 @@ Result Title Font Result Subtitle Font Reset + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Customize Modo Janela Opacidade @@ -211,12 +240,13 @@ Relógio Data Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above None Acrylic Mica Mica Alt - This theme supports two(light/dark) modes. + This theme supports two (light/dark) modes. This theme supports Blur Transparent Background. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Usar Segoe Fluent Icons Usar Segoe Fluent Icons para resultados da consulta quando suportado Apertar Tecla + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only Proxy HTTP @@ -323,6 +356,7 @@ Pasta de Registro Limpar Registros Tem certeza que quer excluir todos os registros? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font Selecione o Gerenciador de Arquivos @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one Sucesso Concluído com sucesso + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Atalho de Consulta Personalizada diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml index 9dc520cbd..cf7312956 100644 --- a/Flow.Launcher/Languages/pt-pt.xaml +++ b/Flow.Launcher/Languages/pt-pt.xaml @@ -42,6 +42,7 @@ Modo de jogo Suspender utilização das teclas de atalho Repor posição + Repor posição da janela de pesquisa Escreva aqui para pesquisar @@ -106,14 +107,34 @@ Abrir painel de pré-visualização ao ativar Flow Launcher. Prima {0} para comutar a pré-visualização. O efeito sombra não é permitido com este tema porque o efeito desfocar está ativo Atraso da pesquisa - Tempo a esperar após a digitação. Esta definição melhora o carregamento dos resultados. + Adiciona um pequeno atraso durante a escrita para reduzir a oscilação ao carregar os resultados. Recomendado se a sua velocidade de escrita for média. + Introduza o tempo de espera (ms) até que a entrada seja considerada completa. Apenas pode editar se ativara opção Atraso de pesquisa. Tempo de espera padrão - O valor padrão a esperar, antes de iniciar a pesquisa após terminar a digitação. - Muito longo - Longo - Normal - Curto - Muito curto + Tempo a aguardar antes de mostrar os resultados. Valores mais altos resultam num atraso maior (ms). + Informações para utilizadores coreanos + + O método de introdução Coreano em sistemas Windows 11 pode causar erros no Flow Launcher. + + Se estiver a sofrer problemas, pode ser necessário ativar "Utilizar versão anterior do IME Coreano". + + Abra as definições no seu sistema e aceda a: + + Hora e Idioma > Idioma e Região > Coreano > Opções de idioma > Teclado - Microsoft IME > Compatibilidade + + e ative "Utilizar versão anterior de Microsoft IME". + + + + Abrir definições de Idioma e Região + Abra a definição do método de introdução coreano. Aceda a Corano > Opções de idioma > Teclado - Microsoft IME > Compatibilidade + Abrir + Utilizar versão anterior de IME Coreano + Pode alterar as definições do método de introdução coreano aqui + Página inicial + Mostrar resultados da página inicial se o termo de pesquisa estiver vazio. + Mostrar histórico na página inicial + Máximo de resultados a mostrar na Página inicial + Esta opção apenas pode ser editada se o plugin tiver suporte a Página inicial e se estiver ativo. Pesquisar plugins @@ -132,6 +153,11 @@ Alterar palavras-chave Tempo de espera do plugin Alterar tempo de espera do plugin + Definições avançadas: + Ativo + Prioridade + Atraso da pesquisa + Página inicial Prioridade atual Nova prioridade Prioridade @@ -147,7 +173,6 @@ Plugin: {0} - Falha ao remover o ficheiro de definições do plugin. Experimente remover manualmente. Falha ao limpar a cache do plugin Plugin: {0} - Falha ao remover os ficheiros em cache do plugin. Experimente remover manualmente. - Padrão Loja de plugins @@ -184,6 +209,9 @@ Tipo de letra dos títulos Tipo de letra dos subtítulos Repor + Repor definições recomendadas para fontes e tamanho. + Tamanho do tema importado + Se o programador do tema tiver disponibilizado o valor, este será utilizado. Personalizar Modo da janela Opacidade @@ -211,6 +239,7 @@ Relógio Data Tipo de fundo + O efeito de fundo não é aplicado na pré-visualização. Esta opção apenas está disponível em sistemas após Windows 11 Build 22000 Nenhuma Acrílico @@ -283,6 +312,9 @@ Utilizar ícones Segoe Fluent Se possível, utilizar ícones Segoe Fluent para os resultados Prima a tecla + Mostrar emblemas dos resultados + Para plugins suportados, são mostrados emblemas para nos ajudar a distingui-los mais facilmente. + Mostrar emblemas apenas para a consulta global Proxy HTTP @@ -322,6 +354,7 @@ Pasta de registos Limpar registos Tem a certeza de que deseja remover todos os registos? + Pasta de cache Limpar cache Tem a certeza de que pretende limpar todas as caches? Não foi possível limpar todas as pastas e ficheiros. Consulte o ficheiro de registo para mais informações. @@ -332,6 +365,7 @@ Nível de registo Depuração Informação + Setting Window Font Selecione o gestor de ficheiros @@ -369,13 +403,16 @@ A palavra-chave escolhida é igual à anterior. Por favor escolha outra. Sucesso Terminado com sucesso + Falha ao copiar Introduza as palavras-chave que pretende utilizar para iniciar o plugin e um espaço vazio caso queira mais do que uma. Utilize * se não quiser especificar uma palavra-chave e o plugin será ativado sem palavras-chave. Definição do tempo de espera - Selecione o tempo de espera que pretende utilizar com este plugin. Selecione "{0}" se não o quiser especificar e, desta forma, o plugin irá utilizar o tempo de espera padrão. - Tempo de espera atual - Novo tempo de espera + Indique o tempo de espera que pretende utilizar com este plugin. Nada escreva se não o quiser especificar e o plugin irá utilizar o tempo de espera padrão. + + + Página inicial + Ative o plugin Página inicial se quiser mostrar os seus resultados so termo de pesquisa estiver vazio. Tecla de atalho personalizada diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml index c38855474..69069c5ec 100644 --- a/Flow.Launcher/Languages/ru.xaml +++ b/Flow.Launcher/Languages/ru.xaml @@ -42,6 +42,7 @@ Игровой режим Приостановить использование горячих клавиш. Сброс положения + Reset search window position Type here to search @@ -55,7 +56,7 @@ Ошибка настройки запуска при запуске Скрывать Flow Launcher, если потерян фокуc Не отображать сообщение об обновлении, когда доступна новая версия - Положение окна поиска + Search Window Location Запомнить последнее положение Монитор с курсором мыши Монитор с фокусированным окном @@ -106,14 +107,35 @@ Всегда открывать панель предварительного просмотра при запуске Flow. Нажмите {0}, чтобы переключить предварительный просмотр. Эффект тени не допускается, если в текущей теме включён эффект размытия Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Открыть + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Поиск плагина @@ -130,8 +152,13 @@ Ключевое слово текущего действия Ключевое слово нового действия Изменить ключевое слово действия - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Enabled + Приоритет + Search Delay + Home Page Текущий приоритет Новый приоритет Приоритет @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Магазин плагинов @@ -184,6 +210,9 @@ Result Title Font Result Subtitle Font Reset + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Customize Оконный режим Прозрачность @@ -211,12 +240,13 @@ Часы Дата Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above None Acrylic Mica Mica Alt - This theme supports two(light/dark) modes. + This theme supports two (light/dark) modes. This theme supports Blur Transparent Background. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Использование значков Segoe Fluent Использовать значки Segoe Fluent для результатов запросов, где они поддерживаются Нажмите клавишу + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only НТТР-прокси @@ -323,6 +356,7 @@ Папка журнала Очистить журнал Вы уверены, что хотите удалить все журналы? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font Выбор менеджера файлов @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one Успешно Выполнено успешно + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Задаваемые горячие клавиши для запросов diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml index 0f07387c6..88ed1c9df 100644 --- a/Flow.Launcher/Languages/sk.xaml +++ b/Flow.Launcher/Languages/sk.xaml @@ -42,6 +42,7 @@ Herný režim Pozastaviť používanie klávesových skratiek. Resetovať pozíciu + Resetovať pozíciu vyhľadávacieho okna Zadajte text na vyhľadávanie @@ -55,7 +56,7 @@ Chybné nastavenie spustenia pri spustení Schovať Flow Launcher po strate fokusu Nezobrazovať upozornenia na novú verziu - Pozícia vyhľadávacieho okna + Poloha vyhľadávacieho okna Zapamätať si poslednú pozíciu Monitor s kurzorom myši Monitor s aktívnym oknom @@ -106,14 +107,35 @@ Pri aktivácii Flowu vždy otvoriť panel s náhľadom. Stlačením klávesu {0} prepnete náhľad. Efekt tieňa nie je povolený, kým má aktuálny motív povolený efekt rozostrenia Oneskorenie vyhľadávania - Pri písaní sa na chvíľu oneskorí vyhľadávanie. Tým sa zníži skákanie rozhrania a načítanie výsledkov. + Pridá krátke oneskorenie počas písania, aby na zníženie blikanie rozhrania počas načítavania. Odporúča sa pri priemernej rýchlosti písania. + Zadajte čas (v ms) čakania, kým vstup bude považovaný za ukončený. Úprava je povolená len vtedy, ak je povolené oneskorenie vyhľadávania. Predvolené oneskorenie vyhľadávania - Predvolené oneskorenie pluginu, po ktorom sa zobrazia výsledky vyhľadávania po zastavení písania. - Veľmi dlhé - Dlhé - Normálne - Krátke - Veľmi krátke + Čas čakania pred zobrazením výsledkov po ukončení písania. Pri vyšších hodnotách sa čaká dlhšie. (ms) + Informácie pre kórejského používateľa IME + + Kórejská metóda vstupu použitá vo Windows 11 môže spôsobiť určité problémy vo Flow Launcheri. + + Ak sa vyskytnú problémy, možno bude potrebné povoliť "Použiť predchádzajúcu verziu editora Microsoft IME". + + + Otvorte nastavenia Windows 11 a prejdite do: + + Čas a jazyk > Jazyk a oblasť > Kórejčina> Možnosti jazyka > Klávesnice – Microsoft IME > Možnosti klávesnice – Kompatibilita, + + a povoľte "Predcházdajúca verzia editora Microsoft IME". + + + + Otvoriť nastavenia systému Jazyk a oblasť + Otvorí okno s nastaveniami kórejského editora Microsoft IME. Prejdite do Kórejčina > Možnosti jazyka > Klávesnice – Microsoft IME > Možnosti klávesnice – Kompatibilita + Otvoriť + Použiť predchádzajúcu verziu editora Microsoft IME + Zmeniť na predchádzajúcu verziu editora Microsoft IME môžete priamo tu + Domovská stránka + Zobraziť výsledky Domovskej stránky, keď je text dopytu prázdny. + Zobraziť výsledky histórie na Domovskej stránke + Maximálny počet histórie výsledkov zobrazenej na Domovskej stránke + Úprava je možná len vtedy, ak plugin podporuje funkciu Domovská stránka a Domovská stránka je povolená. Vyhľadať plugin @@ -130,8 +152,13 @@ Aktuálny aktivačný príkaz Nový aktivačný príkaz Upraviť aktivačný príkaz - Oneskorenie vyhľadávania pomocou pluginu - Zmení oneskorenie vyhľadávania pomocou pluginu + Oneskorenie vyhľadávania pluginu + Zmení oneskorenie vyhľadávania pluginu + Rozšírené nastavenia: + Povolené + Priorita + Oneskorenie vyhľadávania + Domovská stránka Aktuálna priorita Nová priorita Priorita @@ -147,7 +174,6 @@ Pluginy: {0} – Nepodarilo sa odstrániť súbory s nastaveniami pluginu, odstráňte ich manuálne Nepodarilo sa odstrániť vyrovnávaciu pamäť pluginu Pluginy: {0} – Nepodarilo sa odstrániť vyrovnávaciu pamäť pluginu, odstráňte ju manuálne - Predvolené Repozitár pluginov @@ -184,6 +210,9 @@ Písmo nadpisu výsledku Písmo podnadpisu výsledku Resetovať + Resetuje písmo a jeho veľkosť na predvolené hodnoty. + Importovať rozmery motívu + Ak je k dispozícii hodnota veľkosti definovaná autorom motívu, načíta sa a použije. Prispôsobiť Režim okno Nepriehľadnosť @@ -210,8 +239,9 @@ Vlastné Hodiny Dátum - Typ pozadia - Backdrop je podporovaný od Windows 11 zostava 22000 a novších + Typ pozadia (backdrop) + Efekt pozadia sa v náhľade nezobrazuje. + Pozadie je podporované od Windows 11 zostava 22000 a novších Žiadna Acrylic Mica @@ -283,6 +313,9 @@ Použiť ikony Segoe Fluent Použiť ikony Segoe Fluent, ak sú podporované Stlačte kláves + Zobraziť výsledok v odznaku + Ak to plugin podporuje, zobrazí sa jeho ikona v odznaku na jednoduchšie odlíšenie. + Zobraziť výsledok v odznaku len pre globálne vyhľadávanie HTTP proxy @@ -323,6 +356,7 @@ Priečinok s logmi Vymazať logy Naozaj chcete odstrániť všetky logy? + Priečinok vyrovnávacej pamäte Vymazať vyrovnávaciu pamäť Naozaj chcete vymazať všetky vyrovnávacie pamäte? Nepodarilo sa odstrániť niektoré priečinky a súbory. Pre viac informácií si pozrite súbor logu @@ -333,6 +367,7 @@ Úroveň logovania Debug Info + Nastavenie písma okna Vyberte správcu súborov @@ -370,13 +405,16 @@ Tento nový aktivačný príkaz je rovnaký ako starý, vyberte iný Úspešné Úspešne dokončené + Nepodarilo sa skopírovať Zadajte aktivačné príkazy, ktoré chcete používať na spustenie pluginu a oddeľte ich medzerou. Ak nechcete zadať aktivačný príkaz, použite * a plugin bude spustený bez aktivačného príkazu. Nastavenie oneskoreného vyhľadávania - Vyberte oneskorenie vyhľadávania, ktoré chcete použiť pre plugin. Ak vyberiete "{0}", plugin použije predvolené oneskorenie vyhľadávania. - Aktuálne oneskorenie vyhľadávania - Nové oneskorenie vyhľadávania + Zadajte oneskorenie vyhľadávania v ms, ktoré chcete použiť pre plugin. Nechajte prázdne, ak nechcete zadať žiadne, plugin použije predvolené oneskorenie vyhľadávania. + + + Domovská stránka + Ak chcete zobrazovať výsledky pluginu, keď je dopyt prázdny, povoľte funkciu Domovská stránka. Klávesová skratka vlastného vyhľadávania diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml index 1d1eb9120..4b3e3bc0c 100644 --- a/Flow.Launcher/Languages/sr.xaml +++ b/Flow.Launcher/Languages/sr.xaml @@ -42,6 +42,7 @@ Game Mode Suspend the use of Hotkeys. Position Reset + Reset search window position Type here to search @@ -55,7 +56,7 @@ Error setting launch on startup Sakri Flow Launcher kada se izgubi fokus Ne prikazuj obaveštenje o novoj verziji - Search Window Position + Search Window Location Remember Last Position Monitor with Mouse Cursor Monitor with Focused Window @@ -106,14 +107,35 @@ Always open preview panel when Flow activates. Press {0} to toggle preview. Shadow effect is not allowed while current theme has blur effect enabled Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Otvori + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Search Plugin @@ -130,8 +152,13 @@ Current action keyword New action keyword Change Action Keywords - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Enabled + Priority + Search Delay + Home Page Current Priority New Priority Priority @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Plugin Store @@ -184,6 +210,9 @@ Result Title Font Result Subtitle Font Reset + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Customize Režim prozora Neprozirnost @@ -211,12 +240,13 @@ Clock Date Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above None Acrylic Mica Mica Alt - This theme supports two(light/dark) modes. + This theme supports two (light/dark) modes. This theme supports Blur Transparent Background. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Use Segoe Fluent Icons Use Segoe Fluent Icons for query results where supported Press Key + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only HTTP proksi @@ -323,6 +356,7 @@ Log Folder Clear Logs Are you sure you want to delete all logs? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font Select File Manager @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one Uspešno Completed successfully + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. prečica za ručno dodat upit diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml index b9b5d351e..665694ace 100644 --- a/Flow.Launcher/Languages/tr.xaml +++ b/Flow.Launcher/Languages/tr.xaml @@ -42,6 +42,7 @@ Oyun Modu Kısayol tuşlarının kullanımını durdurun. Pencere Konumunu Sıfırla + Reset search window position Type here to search @@ -55,7 +56,7 @@ Sistemle başlatma ayarı başarısız oldu Odak Pencereden Ayrıldığında Gizle Güncelleme bildirimlerini gösterme - Pencere Konumu + Search Window Location Son Konumu Hatırla Fare İmlecinin Bulunduğu Monitör Aktif Pencerenin Bulunduğu Monitör @@ -106,14 +107,35 @@ Önizleme panelini her zaman aç. Önizlemeyi bu ayardan bağımsız {0} kısayolu ile açıp kapatabilirsiniz. Mevcut temada bulanıklık efekti etkinken gölgelendirme efektine izin verilmez Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Eklenti Ara @@ -130,8 +152,13 @@ Geçerli anahtar kelime Yeni anahtar kelime Anahtar kelimeyi değiştir - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Enabled + Priority + Search Delay + Home Page Mevcut öncelik Yeni Öncelik Öncelik @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Eklenti Mağazası @@ -184,6 +210,9 @@ Arama Sonuçları Yazı Tipi Arama Sonuçları Yazı Tipi Sıfırla + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Kişiselleştir Pencere Modu Saydamlık @@ -211,12 +240,13 @@ Saat Tarih Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above Hiçbiri Acrylic Mica Mica Alt - This theme supports two(light/dark) modes. + This theme supports two (light/dark) modes. This theme supports Blur Transparent Background. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Segoe Fluent Simgeleri Arama sonuçlarında mümkünse Segoe Fluent simgelerini kullan. Tuşa basın + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only Vekil Sunucu @@ -323,6 +356,7 @@ Günlük Klasörü Günlükleri Temizle Tüm günlük kayıtlarını silmek istediğinize emin misiniz? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font Dosya Yöneticisi Seçenekleri @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one Başarılı Başarıyla tamamlandı + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Özel Sorgu Kısayolları diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml index 427511c66..b3dc2cd16 100644 --- a/Flow.Launcher/Languages/uk-UA.xaml +++ b/Flow.Launcher/Languages/uk-UA.xaml @@ -42,6 +42,7 @@ Режим гри Призупинити використання гарячих клавіш. Скидання позиції + Reset search window position Type here to search @@ -55,7 +56,7 @@ Помилка запуску налаштування під час запуску Сховати Flow Launcher, якщо втрачено фокус Не повідомляти про доступні нові версії - Положення вікна пошуку + Search Window Location Пам'ятати останню позицію Монітор з курсором миші Монітор зі сфокусованим вікном @@ -106,14 +107,35 @@ Завжди відкривати панель попереднього перегляду при активації Flow. Натисніть {0}, щоб переключити попередній перегляд. Ефект тіні не дозволено, коли поточна тема має ефект розмиття Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Відкрити + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Плагін для пошуку @@ -130,8 +152,13 @@ Поточна гаряча клавіша Нова гаряча клавіша Змінити гарячі клавіши - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Увімкнено + Пріоритет + Search Delay + Home Page Поточний пріоритет Новий пріоритет Пріоритет @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Магазин плагінів @@ -184,6 +210,9 @@ Шрифт заголовка результату Шрифт підзаголовка результату Скинути + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Підлаштувати Віконний режим Прозорість @@ -211,12 +240,13 @@ Годинник Дата Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above Нема Acrylic Mica Mica Alt - This theme supports two(light/dark) modes. + This theme supports two (light/dark) modes. Ця тема підтримує розмитий прозорий фон. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Використання іконок Segoe Fluent Використання іконок Segoe Fluent Icons для результатів запитів, де це підтримується Натисніть клавішу + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only HTTP-проксі @@ -323,6 +356,7 @@ Тека журналу Очистити журнали Ви впевнені, що хочете видалити всі журнали? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font Виберіть файловий менеджер @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one Успішно Успішно завершено + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Задані гарячі клавіші для запитів diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml index 6223efc00..b7b56213b 100644 --- a/Flow.Launcher/Languages/vi.xaml +++ b/Flow.Launcher/Languages/vi.xaml @@ -42,6 +42,7 @@ Chế độ trò chơi Tạm dừng sử dụng phím nóng. Đặt lại vị trí + Reset search window position Type here to search @@ -55,7 +56,7 @@ Không lưu được tính năng tự khởi động khi khởi động hệ thống Ẩn Flow Launcher khi mất tiêu điểm Không hiển thị thông báo khi có phiên bản mới - Vị trí Suchfenster + Search Window Location Ghi nhớ vị trí cuối cùng Màn hình bằng con trỏ chuột Màn hình có cửa sổ được tập trung @@ -106,14 +107,35 @@ Luôn mở bảng xem trước khi Flow kích hoạt. Nhấn {0} để chuyển đổi chế độ xem trước. Hiệu ứng đổ bóng không được phép nếu chủ đề hiện tại bật hiệu ứng làm mờ Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Mở + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Plugin tìm kiếm @@ -130,8 +152,13 @@ Từ hành động hiện tại Từ hành động mới Thay đổi từ hành động - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + Đã bật + Ưu tiên + Search Delay + Home Page Ưu tiên hiện tại Ưu tiên mới Ưu tiên @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default Tải tiện ích mở rộng @@ -184,6 +210,9 @@ Result Title Font Result Subtitle Font Đặt lại + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Customize chế độ cửa sổ độ mờ @@ -211,12 +240,13 @@ Giờ Ngày Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above Không Acrylic Mica Mica Alt - This theme supports two(light/dark) modes. + This theme supports two (light/dark) modes. This theme supports Blur Transparent Background. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ Sử dụng biểu tượng Segoe Sử dụng Biểu tượng Segoe Fluent cho kết quả truy vấn nếu được hỗ trợ Nhấn phím + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only Proxy HTTP @@ -325,6 +358,7 @@ Thư mục nhật ký Xóa tệp nhật ký Bạn có chắc chắn muốn xóa tất cả nhật ký không? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -335,6 +369,7 @@ Log Level Debug Info + Setting Window Font Chọn trình quản lý tệp @@ -372,13 +407,16 @@ This new Action Keyword is the same as old, please choose a different one Thành công Đã hoàn tất thành công + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. Phím nóng truy vấn tùy chỉnh diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml index 3d302da5b..bd3142992 100644 --- a/Flow.Launcher/Languages/zh-cn.xaml +++ b/Flow.Launcher/Languages/zh-cn.xaml @@ -42,6 +42,7 @@ 游戏模式 暂停使用热键。 重置位置 + Reset search window position Type here to search @@ -55,7 +56,7 @@ 设置开机自启时出错 失去焦点时自动隐藏 Flow Launcher 不显示新版本提示 - 搜索窗口位置 + Search Window Location 记住上次的位置 鼠标光标所在显示器 聚焦窗口所在显示器 @@ -106,14 +107,35 @@ Flow 启动时总是打开预览面板。按 {0} 以切换预览。 当前主题已启用模糊效果,不允许启用阴影效果 Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + 打开 + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. 搜索插件 @@ -130,8 +152,13 @@ 当前触发关键字 新触发关键字 更改触发关键字 - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + 启用 + 优先级 + Search Delay + Home Page 当前优先级 新优先级 优先级 @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default 插件商店 @@ -184,6 +210,9 @@ 结果标题字体 结果字幕字体 重置 + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. 自定义 窗口模式 透明度 @@ -211,12 +240,13 @@ 时钟 日期 Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above Acrylic Mica Mica Alt - 该主题支持两种(浅色/深色)模式。 + This theme supports two (light/dark) modes. 该主题支持模糊透明背景。 Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ 使用 Segoe Fluent 图标 在支持时在选项中显示 Segoe Fluent 图标 按下按键 + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only HTTP 代理 @@ -323,6 +356,7 @@ 日志目录 清除日志 你确定要删除所有的日志吗? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font 默认文件管理器 @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one 成功 成功完成 + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. 自定义查询热键 diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml index cecad8e0d..1a71ae135 100644 --- a/Flow.Launcher/Languages/zh-tw.xaml +++ b/Flow.Launcher/Languages/zh-tw.xaml @@ -42,6 +42,7 @@ 遊戲模式 暫停使用快捷鍵。 重設位置 + Reset search window position Type here to search @@ -55,7 +56,7 @@ Error setting launch on startup 失去焦點時自動隱藏 Flow Launcher 不顯示新版本提示 - 搜尋視窗位置 + Search Window Location 記住最後位置 Monitor with Mouse Cursor Monitor with Focused Window @@ -106,14 +107,35 @@ 當 Flow 啟動時,一律開啟預覽面板。按下 {0} 可切換預覽。 Shadow effect is not allowed while current theme has blur effect enabled Search Delay - Delay for a while to search when typing. This reduces interface jumpiness and result load. + Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. + Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. Default Search Delay Time - Plugin default delay time after which search results appear when typing is stopped. - Very long - Long - Normal - Short - Very short + Wait time before showing results after typing stops. Higher values wait longer. (ms) + Information for Korean IME user + + The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + + If you experience any problems, you may need to enable "Use previous version of Korean IME". + + + Open Setting in Windows 11 and go to: + + Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + + and enable "Use previous version of Microsoft IME". + + + + Open Language and Region System Settings + Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + 開啟 + Use Previous Korean IME + You can change the Previous Korean IME settings directly from here + Home Page + Show home page results when query text is empty. + Show History Results in Home Page + Maximum History Results Shown in Home Page + This can only be edited if plugin supports Home feature and Home Page is enabled. Search Plugin @@ -130,8 +152,13 @@ 目前觸發關鍵字 新觸發關鍵字 更改觸發關鍵字 - Plugin seach delay time - Change Plugin Seach Delay Time + Plugin search delay time + Change Plugin Search Delay Time + Advanced Settings: + 已啟用 + 優先 + Search Delay + Home Page 目前優先 新增優先 優先 @@ -147,7 +174,6 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually - Default 插件商店 @@ -184,6 +210,9 @@ Result Title Font Result Subtitle Font Reset + Reset to the recommended font and size settings. + Import Theme Size + If a size value intended by the theme designer is available, it will be retrieved and applied. Customize 視窗模式 透明度 @@ -211,12 +240,13 @@ 時鐘 日期 Backdrop Type + The backdrop effect is not applied in the preview. Backdrop supported starting from Windows 11 build 22000 and above None Acrylic Mica Mica Alt - This theme supports two(light/dark) modes. + This theme supports two (light/dark) modes. This theme supports Blur Transparent Background. Show placeholder Display placeholder when query is empty @@ -283,6 +313,9 @@ 使用 Segoe Fluent 圖示 在支援的情況下,在查詢結果使用 Segoe Fluent 圖示 按下按鍵 + Show Result Badges + For supported plugins, badges are displayed to help distinguish them more easily. + Show Result Badges for Global Query Only HTTP 代理 @@ -323,6 +356,7 @@ 日誌資料夾 清除日誌 請確認要刪除所有日誌嗎? + Cache Folder Clear Caches Are you sure you want to delete all caches? Failed to clear part of folders and files. Please see log file for more information @@ -333,6 +367,7 @@ Log Level Debug Info + Setting Window Font 選擇檔案管理器 @@ -370,13 +405,16 @@ This new Action Keyword is the same as old, please choose a different one 成功 成功完成 + Failed to copy Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. Search Delay Time Setting - Select the search delay time you like to use for the plugin. Select "{0}" if you don't want to specify any, and the plugin will use default search delay time. - Current search delay time - New search delay time + Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + + + Home Page + Enable the plugin home page state if you like to show the plugin results when query is empty. 自定義快捷鍵查詢 diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml index d278faf98..e553a1b7e 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ja.xaml @@ -2,8 +2,8 @@ - Browser Bookmarks - Search your browser bookmarks + ブラウザブックマーク + ブラウザのブックマークを検索します Bookmark Data @@ -12,16 +12,16 @@ New tab Set browser from path: Choose - Copy url - Copy the bookmark's url to clipboard + URLをコピー + ブックマークのURLをクリップボードにコピー Load Browser From: Browser Name Data Directory Path - - + 追加 + 編集 削除 Browse - Others + その他のブラウザ Browser Engine If you are not using Chrome, Firefox or Edge, or you are using their portable version, you need to add bookmarks data directory and select correct browser engine to make this plugin work. For example: Brave's engine is Chromium; and its default bookmarks data location is: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". For Firefox engine, the bookmarks directory is the userdata folder contains the places.sqlite file. diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml index 93916ffaa..a374e7fc1 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/ko.xaml @@ -12,8 +12,8 @@ 새 탭 Set browser from path: 선택 - Copy url - Copy the bookmark's url to clipboard + URL 복사 + 북마크의 URL을 클립보드에 복사 데이터를 가져올 브라우저: 브라우저 이름 데이터 디렉토리 위치 diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml index 4344e8c3d..06af5ea5b 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/pt-pt.xaml @@ -24,5 +24,5 @@ Outros Motor do navegador Se não estiver a usar o Chrome, Firefox ou Edge ou se estiver a usar a versão portátil, tem que adicionar o diretório de dados dos marcadores e selecionar o motor do navegador para que este plugin funcione. - Por exemplo: o motor do Brave é Chromium e a localização padrão dos marcadores é "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para o navegafor Firefox, o diretório de marcadores é a pasta do utilizador que contém o ficheiro places.sqlite. + Por exemplo: o motor do Brave é Chromium e a localização padrão dos marcadores é "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Para o navegador Firefox, o diretório de marcadores é a pasta de utilizador que contém o ficheiro places.sqlite. diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml index 15598118c..757394b4c 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/ja.xaml @@ -1,11 +1,11 @@  - Calculator - Allows to do mathematical calculations.(Try 5*3-2 in Flow Launcher) + 電卓 + 数式の計算ができます(Flow Launcherで「5*3-2」と入力してみてください) Not a number (NaN) Expression wrong or incomplete (Did you forget some parentheses?) - Copy this number to the clipboard + この数字をクリップボードにコピーします Decimal separator The decimal separator to be used in the output. Use system locale diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml index c61f8b3df..b751f3f39 100644 --- a/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.Calculator/Languages/pt-pt.xaml @@ -7,7 +7,7 @@ Expressão errada ou incompleta (esqueceu-se de algum parêntese?) Copiar número para a área de transferência Separador decimal - O separador decimal a ser usado no resultado. + O separador decimal para utilizar no resultado. Utilizar definições do sistema Vírgula (,) Ponto (.) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml index df6199976..29c97a651 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/ja.xaml @@ -21,26 +21,26 @@ 削除 - - - General Setting - Customise Action Keywords + 編集 + 追加 + 一般設定 + アクションキーワードのカスタマイズ Quick Access Links Everything Setting - Preview Panel + プレビューパネル サイズ - Date Created - Date Modified - Display File Info - Date and time format + 作成日時 + 更新日時 + ファイル情報の表示 + 日付と時刻の形式 Sort Option: Everything Path: Launch Hidden Editor Path Shell Path - Index Search Excluded Paths - Use search result's location as the working directory of the executable - Hit Enter to open folder in Default File Manager + インデックス検索の除外パス + 検索結果の場所を実行ファイルの作業ディレクトリとして使用 + Enterキーで既定のファイルマネージャーでフォルダーを開く Use Index Search For Path Search Indexing Options Search: @@ -49,7 +49,7 @@ Index Search: Quick Access: Current Action Keyword - + 完了 Enabled When disabled Flow will not execute this search option, and will additionally revert back to '*' to free up the action keyword Everything @@ -63,57 +63,57 @@ Content Search Engine Directory Recursive Search Engine Index Search Engine - Open Windows Index Option + Windowsのインデックスオプションを開く Excluded File Types (comma seperated) For example: exe,jpg,png Maximum results The maximum number of results requested from active search engine - Explorer - Find and manage files and folders via Windows Search or Everything + エクスプローラー + Windows SearchまたはEverythingを使って、ファイルやフォルダーを検索・管理します Ctrl + Enter to open the directory Ctrl + Enter to open the containing folder - Copy path - Copy path of current item to clipboard - Copy - Copy current file to clipboard - Copy current folder to clipboard + パスをコピー + 現在の項目のパスをコピー + コピー + 現在のファイルをコピー + 現在のフォルダーをコピー 削除 - Permanently delete current file - Permanently delete current folder + 現在のファイルを完全に削除 + 現在のフォルダーを完全に削除 Path: Delete the selected Run as different user Run the selected using a different user account - Open containing folder - Open the location that contains current item - Open With Editor: + フォルダーを開く + 現在の項目が含まれている場所を開きます + エディターで開く: Failed to open file at {0} with Editor {1} at {2} - Open With Shell: + シェルで開く: Failed to open folder {0} with Shell {1} at {2} Exclude current and sub-directories from Index Search Excluded from Index Search - Open Windows Indexing Options + Windowsインデックスオプションを開く Manage indexed files and folders - Failed to open Windows Indexing Options - Add to Quick Access - Add current item to Quick Access + Windowsインデックスオプションを開けませんでした + クイックアクセスに追加 + 現在の項目をクイックアクセスに追加 Successfully Added - Successfully added to Quick Access + クイックアクセスに追加しました Successfully Removed Successfully removed from Quick Access - Add to Quick Access so it can be opened with Explorer's Search Activation action keyword - Remove from Quick Access - Remove from Quick Access - Remove current item from Quick Access - Show Windows Context Menu - Open With - Select a program to open with + エクスプローラーの検索アクティベーション用アクションキーワードで開けるように、クイックアクセスに追加します + クイックアクセスから削除 + クイックアクセスから削除 + 現在の項目をクイックアクセスから削除 + Windowsの右クリックメニューを表示 + アプリで開く + 開くためのプログラムを選択します {0} free of {1} @@ -153,7 +153,7 @@ Successfully installed Everything service Failed to automatically install Everything service. Please manually install it from https://www.voidtools.com Click here to start it - Unable to find an Everything installation, would you like to manually select a location?{0}{0}Click no and Everything will be automatically installed for you + Everythingのインストールが見つかりませんでした。手動で場所を指定しますか?{0}{0}「いいえ」をクリックすると、Everythingが自動的にインストールされます。 Do you want to enable content search for Everything? It can be very slow without index (which is only supported in Everything v1.5+) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml index 27f98449f..39d056e28 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-pt.xaml @@ -6,7 +6,7 @@ Selecione a ligação para a pasta Tem a certeza de que deseja eliminar {0}? Tem a certeza de que pretende eliminar permanentemente este ficheiro? - Tem a certeza de que pretende eliminar permanentemente este ficheiro ou pasta? + Tem a certeza de que pretende eliminar permanentemente este ficheiro/pasta? Eliminada com sucesso {0} eliminado(a) com sucesso. A atribuição de uma palavra-chave global pode devolver demasiados resultados. Deve escolher uma palavra-chave específica. diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/ko.xaml index cc78c9a9a..7af9e9306 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/Languages/ko.xaml @@ -1,9 +1,9 @@  - Activate {0} plugin action keyword + {0} 플러그인의 액션 키워드 - 플러그인 인디케이터 + 플러그인 키워드 힌트 사용중인 플러그인들의 전체 액션 키워드 목록을 보여줍니다 diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ar.xaml index 04619239d..006dd93d6 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ar.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ar.xaml @@ -8,6 +8,7 @@ قتل عمليات {0} قتل جميع الأمثلة + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/cs.xaml index d621b63c4..d53616cc0 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/cs.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/cs.xaml @@ -8,6 +8,7 @@ ukončit {0} procesů ukončit všechny instance + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/da.xaml index 8563f49a0..0a7176d2c 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/da.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/da.xaml @@ -8,6 +8,7 @@ kill {0} processes kill all instances + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml index 766d170a4..7968ef2d8 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/de.xaml @@ -8,6 +8,7 @@ {0} Prozesse beenden Alle Instanzen beenden + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es-419.xaml index 9b4a20a69..50799dca2 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es-419.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es-419.xaml @@ -8,6 +8,7 @@ terminar {0} procesos termina todas las instancias + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml index ab788075e..6ab3f9797 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/es.xaml @@ -8,6 +8,7 @@ finalizar {0} procesos finalizar todas las instancias + Mostrar el título de los procesos con ventanas visibles Colocar procesos con ventanas visibles en la parte superior diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/fr.xaml index 7064de1fe..ae3b6bab2 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/fr.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/fr.xaml @@ -8,6 +8,7 @@ Tuer {0} processus Tuer toutes les instances + Afficher le titre des processus avec des fenêtres visibles Placer les processus dont les fenêtres sont visibles en haut de la page diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/he.xaml index 8567b5412..15d14a42c 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/he.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/he.xaml @@ -8,6 +8,7 @@ סגור {0} תהליכים סגור את כל המופעים + הצג כותרת עבור תהליכים בעלי חלונות גלויים הצב תהליכים עם חלונות גלויים בחלק העליון diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml index 1333fe573..5bd4a9eac 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/it.xaml @@ -8,6 +8,7 @@ termina {0} processi termina tutte le istanze + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ja.xaml index 8563f49a0..0a7176d2c 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ja.xaml @@ -8,6 +8,7 @@ kill {0} processes kill all instances + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ko.xaml index c3d1f6d08..09679a58b 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ko.xaml @@ -8,6 +8,7 @@ {0} 프로세스 종료 모든 인스턴스 종료 + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nb.xaml index 1210818bf..37413385d 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nb.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nb.xaml @@ -8,6 +8,7 @@ terminer {0} processes terminer alle forekomstene + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nl.xaml index cfcd71c37..ea9f9a591 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nl.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/nl.xaml @@ -8,6 +8,7 @@ kill {0} processes kill all instances + Show title for processes with visible windows Zet processen met zichtbare vensters bovenaan diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml index 650f14657..7e59db5ec 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pl.xaml @@ -8,6 +8,7 @@ zamknij {0} procesów zamknij wszystkie instancje + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-br.xaml index 8563f49a0..0a7176d2c 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-br.xaml @@ -8,6 +8,7 @@ kill {0} processes kill all instances + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-pt.xaml index 944a883c9..b50a31744 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/pt-pt.xaml @@ -8,6 +8,7 @@ terminar {0} processos terminar todas as instâncias + Mostrar título dos processos com janelas visíveis Colocar processos com janelas visíveis por cima diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ru.xaml index 0e2bef052..d030a778e 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/ru.xaml @@ -8,6 +8,7 @@ удалить {0} процессов удалить все экземпляры + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sk.xaml index 2b06d3bbe..6c85b9476 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sk.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sk.xaml @@ -8,6 +8,7 @@ ukončiť {0} procesov ukončiť všetky inštancie + Zobraziť nadpis pre procesy s viditeľnými oknami Zobraziť procesy s viditeľným oknom navrchu diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr.xaml index 8563f49a0..0a7176d2c 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/sr.xaml @@ -8,6 +8,7 @@ kill {0} processes kill all instances + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml index 8563f49a0..0a7176d2c 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/tr.xaml @@ -8,6 +8,7 @@ kill {0} processes kill all instances + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml index 02dab46ba..56004028b 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml @@ -8,6 +8,7 @@ вбити {0} процесів вбити всі екземпляри + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/vi.xaml index 89fd67635..5ce54a0dc 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/vi.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/vi.xaml @@ -8,6 +8,7 @@ Buộc tắt các tiến trình {0} Tắt tất cả phên bản + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml index 15e717c79..ceb909db1 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-cn.xaml @@ -8,6 +8,7 @@ 杀死 {0} 进程 杀死所有实例 + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-tw.xaml index 8563f49a0..0a7176d2c 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-tw.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/zh-tw.xaml @@ -8,6 +8,7 @@ kill {0} processes kill all instances + Show title for processes with visible windows Put processes with visible windows on the top diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml index 69ca16b69..d352368cb 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ar.xaml @@ -74,7 +74,7 @@ التشغيل كمستخدم مختلف التشغيل كمسؤول فتح المجلد المحتوي - تعطيل عرض هذا البرنامج + Hide فتح المجلد الهدف البرنامج diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml index 1c70c6b6f..ca57bf027 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/cs.xaml @@ -74,7 +74,7 @@ Spustit jako jiný uživatel Spustit jako správce Otevřít umístění složky - Zakázat zobrazování tohoto programu + Hide Open target folder Program  diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml index 0f39f5d56..a0f09a3b5 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/da.xaml @@ -74,7 +74,7 @@ Run As Different User Run As Administrator Open containing folder - Disable this program from displaying + Hide Open target folder Program diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml index 14e228b2a..ec5d273d6 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/de.xaml @@ -74,7 +74,7 @@ Als anderer Benutzer ausführen Als Administrator ausführen Enthaltenden Ordner öffnen - Dieses Programm von der Anzeige deaktivieren + Hide Zielordner öffnen Programm diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml index b928bd1ce..d9ffa668c 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/es-419.xaml @@ -74,7 +74,7 @@ Run As Different User Run As Administrator Open containing folder - Disable this program from displaying + Hide Open target folder Program diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml index 57b5c94b7..d0b6851d9 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/es.xaml @@ -74,7 +74,7 @@ Ejecutar como usuario diferente Ejecutar como administrador Abrir carpeta contenedora - Desactivar la visualización de este programa + Ocultar Abrir carpeta de destino Programa diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml index 7cccd5a42..e6fd67936 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/fr.xaml @@ -74,7 +74,7 @@ Exécuter en tant qu'utilisateur différent Exécuter en tant qu'administrateur Ouvrir l'emplacement du fichier - Masquer ce programme des résultats + Masquer Ouvrir le répertoire cible Programmes diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml index af272fb46..88053ac57 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/he.xaml @@ -74,7 +74,7 @@ הפעל כמשתמש אחר הפעל כמנהל פתח תיקייה מכילה - השבת הצגת תוכנה זו + הסתר פתח תיקיית יעד תוכנה diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml index cf5de9bab..5004d41cf 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/it.xaml @@ -74,7 +74,7 @@ Esegui Come Utente Differente Esegui Come Amministratore Apri percorso file - Disabilita questo programma dalla visualizzazione + Hide Open target folder Programma diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml index 1f1dd4d37..96ca3af60 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ja.xaml @@ -4,12 +4,12 @@ Reset Default 削除 - - + 編集 + 追加 Name 有効 Enabled - Disable + 無効 Status Enabled Disabled @@ -28,11 +28,11 @@ When enabled, Flow will load programs from the registry PATH When enabled, Flow will load programs from the PATH environment variable - Hide app path - For executable files such as UWP or lnk, hide the file path from being visible + アプリのパスを非表示 + UWPやlnkなどの実行可能ファイルについて、サブタイトル領域にファイルパスが表示されないようにします。 Hide uninstallers Hides programs with common uninstaller names, such as unins000.exe - Search in Program Description + プログラムの説明で検索 Flow will search program's description Hide duplicated apps Hide duplicated Win32 programs that are already in the UWP list @@ -71,14 +71,14 @@ Insert protocols of .url files you want to index. Protocols should be separated by ';', and should end with "://". (ex>ftp://;mailto://) - Run As Different User - Run As Administrator + 別のユーザーとして実行 + 管理者として実行 Open containing folder - Disable this program from displaying + Hide Open target folder - Program - Search programs in Flow Launcher + プログラム + Flow Launcherでプログラムを検索 Invalid Path diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml index affa7567f..266aa4b45 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ko.xaml @@ -34,7 +34,7 @@ Unins000처럼 일반적으로 사용되는 설치 삭제(Uninstaller) 프로그램의 이름을 숨깁니다. 프로그램 설명 검색 Flow will search program's description - Hide duplicated apps + 중복된 앱 숨기기 Hide duplicated Win32 programs that are already in the UWP list 확장자 최대 깊이 @@ -74,8 +74,8 @@ 다른 유저 권한으로 실행 관리자 권한으로 실행 포함된 폴더 열기 - 이 프로그램 표시 비활성화 - Open target folder + Hide + 대상 폴더 열기 프로그램 Flow Launcher에서 프로그램을 검색합니다 diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml index 3fa53aba8..c4b218204 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/nb.xaml @@ -74,7 +74,7 @@ Kjør som en annen bruker Kjør som administrator Åpne inneholdende mappe - Deaktiver visningen av dette programmet + Hide Åpne målmappe Program diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml index 8a86dc511..495296694 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/nl.xaml @@ -74,7 +74,7 @@ Run As Different User Run As Administrator Open containing folder - Disable this program from displaying + Hide Open target folder Program diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml index 8a163de7a..f38fd9623 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/pl.xaml @@ -74,7 +74,7 @@ Uruchom jako inny użytkownik Uruchom jako administrator Otwórz folder nadrzędny - Wyłącz wyświetlanie tego programu + Hide Otwórz folder docelowy Programy diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml index bab077683..3ff8be551 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-br.xaml @@ -74,7 +74,7 @@ Run As Different User Run As Administrator Open containing folder - Disable this program from displaying + Hide Open target folder Program diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml index c7b394593..aa3c500a3 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/pt-pt.xaml @@ -74,7 +74,7 @@ Executar com outro utilizador Executar como administrador Abrir pasta de destino - Desativar exibição deste programa + Ocultar Abrir pasta de destino Programas diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml index 8cb62137e..a75a6d836 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/ru.xaml @@ -74,7 +74,7 @@ Запустить от имени другого пользователя Запустить от имени администратора Открыть содержащую папку - Отключить отображение этой программы + Hide Open target folder Программа diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml index ee0705b96..7fda65160 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/sk.xaml @@ -74,7 +74,7 @@ Spustiť ako iný používateľ Spustiť ako správca Otvoriť umiestnenie priečinka - Zakázať zobrazovanie tohto programu + Skryť Otvoriť cieľový priečinok Program diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml index a69d7e96b..f2da895b0 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/sr.xaml @@ -74,7 +74,7 @@ Run As Different User Run As Administrator Open containing folder - Disable this program from displaying + Hide Open target folder Program diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml index d46de0592..6bda659dd 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/tr.xaml @@ -74,7 +74,7 @@ Run As Different User Yönetici Olarak Çalıştır Open containing folder - Disable this program from displaying + Hide Open target folder Program diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml index 8e8d55f47..3686925a9 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml @@ -74,7 +74,7 @@ Запустити від імені іншого користувача Запустити від імені адміністратора Відкрити папку - Вимкнути відображення цієї програми + Hide Відкрити цільову папку Програма diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml index 21a3981c5..6b238c638 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/vi.xaml @@ -74,7 +74,7 @@ Xóa lựa chọn đã chọn Chạy với quyền quản trị Mở thư mục chứa - Vô hiệu hóa chương trình này hiển thị + Hide Mở thư mục đích Chương trình diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml index 6d5c0079f..b36b72b9b 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-cn.xaml @@ -74,7 +74,7 @@ 以其他用户身份运行 以管理员身份运行 打开文件所在文件夹 - 禁止显示该程序 + Hide 打开目标文件夹 程序 diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml index fd0bd427a..084adfbac 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml @@ -74,7 +74,7 @@ Run As Different User 以系統管理員身分執行 開啟檔案位置 - Disable this program from displaying + Hide Open target folder 程式 diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml index 90eb49317..781227267 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/ja.xaml @@ -12,7 +12,7 @@ Allows to execute system commands from Flow Launcher this command has been executed {0} times execute command through command shell - Run As Administrator + 管理者として実行 Copy the command Only show number of most used commands: diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.xaml index 86688a130..b02a89a0a 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.xaml +++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/he.xaml @@ -26,7 +26,7 @@ מדריך Flow Launcher תיקיית הנתונים של Flow Launcher מצב משחק - Set the Flow Launcher Theme + הגדר את ערכת הנושא של Flow Launcher ערו @@ -51,7 +51,7 @@ עיין במדריך של Flow Launcher לקבלת מידע נוסף וטיפים פתח את מיקום תיקיית ההגדרות של Flow Launcher הפעל/כבה מצב משחק - Quickly change the Flow Launcher theme + שנה במהירות את ערכת הנושא של Flow Launcher הצליח @@ -62,14 +62,14 @@ האם אתה בטוח שברצונך להפעיל מחדש את המחשב עם אפשרויות אתחול מתקדמות? האם אתה בטוח שברצונך להתנתק? - Command Keyword Setting - Custom Command Keyword - Enter a keyword to search for command: {0}. This keyword is used to match your query. - Command Keyword + הגדרת מילת מפתח לפקודה + מילת מפתח מותאמת לפקודה + הזן מילת מפתח כדי לחפש את הפקודה: {0}. מילת מפתח זו משמשת להתאמה לשאילתה שלך. + מילת מפתח לפקודה אפס אישו ביטול - Please enter a non-empty command keyword + אנא הזן מילת מפתח תקינה לפקודה פקודות מערכת מספק פקודות הקשורות למערכת, כגון כיבוי, נעילה, הגדרות ועוד. diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml index bc7dff59f..27fee87be 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ja.xaml @@ -6,20 +6,20 @@ 説明 コマンド - Shutdown - Restart + シャットダウン + 再起動 Restart With Advanced Boot Options Log Off/Sign Out Lock Sleep Hibernate Index Option - Empty Recycle Bin - Open Recycle Bin - - Save Settings + ごみ箱を空にする + ごみ箱を開く + 終了 + 設定を保存 Flow Launcherを再起動する - + 設定 プラグインデータのリロード Check For Update Open Log Location @@ -28,7 +28,7 @@ Toggle Game Mode Set the Flow Launcher Theme - + 編集 コンピュータをシャットダウンする @@ -41,7 +41,7 @@ このアプリの設定 スリープ ゴミ箱を空にする - Open recycle bin + ごみ箱を開く Indexing Options Hibernate computer Save all Flow Launcher settings @@ -58,17 +58,17 @@ All Flow Launcher settings saved Reloaded all applicable plugin data Are you sure you want to shut the computer down? - Are you sure you want to restart the computer? - Are you sure you want to restart the computer with Advanced Boot Options? - Are you sure you want to log off? + 本当にコンピューターを再起動しますか? + 高度な起動オプションでコンピューターを再起動しますか? + 本当にログオフしますか? Command Keyword Setting Custom Command Keyword Enter a keyword to search for command: {0}. This keyword is used to match your query. Command Keyword Reset - Confirm - + 確認 + キャンセル Please enter a non-empty command keyword システムコマンド diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml index f2049038f..e38e6e68b 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/ko.xaml @@ -66,7 +66,7 @@ Custom Command Keyword Enter a keyword to search for command: {0}. This keyword is used to match your query. Command Keyword - Reset + 초기화 확인 취소 Please enter a non-empty command keyword diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml index 9ae628853..4112f41ff 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ja.xaml @@ -34,7 +34,7 @@ タイトル - Status + 状態 アイコンを選択 アイコン キャンセル diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml index 3ac9f6a6c..c8f069ca7 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/ko.xaml @@ -21,20 +21,18 @@ 자동완성 데이터 출처: 웹 검색을 선택하세요 Are you sure you want to delete {0}? - If you want to add a search for a particular website to Flow, first enter a dummy text string in the search bar of that website, and launch the search. Now copy the contents of the browser's address bar, and paste it in the URL field below. Replace your test string with {q}. For example, if you search for casino on Netflix, its address bar reads + 특정 웹사이트의 검색 기능을 Flow에 추가하고 싶다면, 먼저 해당 웹사이트의 검색창에 임의의 텍스트를 입력하고 검색을 실행하세요. 그런 다음 브라우저의 주소 표시줄에 표시된 내용을 복사하여 아래의 URL 필드에 붙여넣습니다. 이때, 검색에 사용한 테스트 문자열을 {q}로 바꿔주세요. 예를 들어, Netflix에서 casino를 검색하면 주소 표시줄에는 다음과 같이 표시됩니다. https://www.netflix.com/search?q=Casino - Now copy this entire string and paste it in the URL field below. - Then replace casino with {q}. - Thus, the generic formula for a search on Netflix is https://www.netflix.com/search?q={q} + 이제 이 전체 문자열을 복사해서 아래의 URL 필드에 붙여넣으세요. 그런 다음 casino를 **{q}**로 바꿔주세요. 따라서 Netflix에서의 일반적인 검색 형식은 다음과 같습니다: https://www.netflix.com/search?q={q} - Copy URL - Copy search URL to clipboard + URL 복사 + 검색 주소를 클립보드에 복사 이름 - Status + 상태 아이콘 선택 아이콘 취소 diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.he-IL.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.he-IL.resx index faa8c2dcc..5bf27c746 100644 --- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.he-IL.resx +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.he-IL.resx @@ -416,7 +416,7 @@ Area Privacy - Cangjie IME + קלט Cangjie Area TimeAndLanguage @@ -547,7 +547,7 @@ Area Control Panel (legacy settings) - deuteranopia + עיוורון צבעים – אדום־ירוק Medical: Mean you don't can see red colors @@ -697,7 +697,7 @@ Area Control Panel (legacy settings) - Game DVR + מקליט משחקים Area Gaming @@ -721,7 +721,7 @@ Area Control Panel (legacy settings) - Glance + הצצה Area Personalization, Deprecated in Windows 10, version 1809 and later @@ -1251,7 +1251,7 @@ Area System - protanopia + עיוורון צבעים – אדום Medical: Mean you don't can see green colors @@ -1297,7 +1297,7 @@ Mean the weakness you can't differ between red and green colors - Red week + שבוע אדום Mean you don't can see red colors @@ -1332,7 +1332,7 @@ Area Control Panel (legacy settings) - schedtasks + משימות מתוזמנות File name, Should not translated @@ -1544,7 +1544,7 @@ שקיפות - tritanopia + עיוורון צבעים – כחול Medical: Mean you don't can see yellow and blue colors From 71b6cb2ca53ce28697fb9ed0ee75004aaf712e49 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 11 May 2025 20:56:21 +0800 Subject: [PATCH 280/552] Fix sound effect issue after sleep or hiberation --- Flow.Launcher/MainWindow.xaml.cs | 33 +++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index e243549e3..46eeb2adc 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -22,6 +22,7 @@ using Flow.Launcher.Infrastructure.Image; using Flow.Launcher.Infrastructure.UserSettings; using Flow.Launcher.Plugin.SharedCommands; using Flow.Launcher.ViewModel; +using Microsoft.Win32; using ModernWpf.Controls; using DataObject = System.Windows.DataObject; using Key = System.Windows.Input.Key; @@ -88,6 +89,8 @@ namespace Flow.Launcher InitSoundEffects(); DataObject.AddPastingHandler(QueryTextBox, QueryTextBox_OnPaste); + + SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; } #endregion @@ -540,16 +543,29 @@ namespace Flow.Launcher #region Window Sound Effects + private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) + { + // Fix for sound not playing after sleep / hibernate + // https://stackoverflow.com/questions/64805186/mediaplayer-doesnt-play-after-computer-sleeps + if (e.Mode == PowerModes.Resume) + { + InitSoundEffects(); + } + } + private void InitSoundEffects() { if (_settings.WMPInstalled) { + animationSoundWMP?.Close(); animationSoundWMP = new MediaPlayer(); animationSoundWMP.Open(new Uri(AppContext.BaseDirectory + "Resources\\open.wav")); } else { + animationSoundWPF?.Dispose(); animationSoundWPF = new SoundPlayer(AppContext.BaseDirectory + "Resources\\open.wav"); + animationSoundWPF.Load(); } } @@ -816,7 +832,7 @@ namespace Flow.Launcher { Name = progressBarAnimationName, Storyboard = progressBarStoryBoard }; - + var stopStoryboard = new StopStoryboard() { BeginStoryboardName = progressBarAnimationName @@ -837,7 +853,7 @@ namespace Flow.Launcher progressStyle.Triggers.Add(trigger); ProgressBar.Style = progressStyle; - + _viewModel.ProgressBarVisibility = Visibility.Hidden; } @@ -885,7 +901,7 @@ namespace Flow.Launcher Duration = TimeSpan.FromMilliseconds(animationLength), FillBehavior = FillBehavior.HoldEnd }; - + var rightMargin = GetThicknessFromStyle(ClockPanel.Style, new Thickness(0, 0, DefaultRightMargin, 0)).Right; var thicknessAnimation = new ThicknessAnimation @@ -913,10 +929,10 @@ namespace Flow.Launcher clocksb.Children.Add(ClockOpacity); iconsb.Children.Add(IconMotion); iconsb.Children.Add(IconOpacity); - + _settings.WindowLeft = Left; _isArrowKeyPressed = false; - + clocksb.Begin(ClockPanel); iconsb.Begin(SearchIcon); } @@ -1088,7 +1104,7 @@ namespace Flow.Launcher { e.Handled = true; } - + #endregion #region Placeholder @@ -1140,7 +1156,7 @@ namespace Flow.Launcher } #endregion - + #region Search Delay private void QueryTextBox_TextChanged1(object sender, TextChangedEventArgs e) @@ -1162,6 +1178,9 @@ namespace Flow.Launcher { _hwndSource?.Dispose(); _notifyIcon?.Dispose(); + animationSoundWMP?.Close(); + animationSoundWPF?.Dispose(); + SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged; } _disposed = true; From 165e498a9450c6bb5f05a256b2e96e87564ed340 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 12 May 2025 15:12:23 +0800 Subject: [PATCH 281/552] Fix exception when deleteing temp files --- .../ChromiumBookmarkLoader.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs index 66be08903..e859976bd 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs @@ -131,7 +131,17 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader } catch (Exception ex) { - File.Delete(tempDbPath); + try + { + if (File.Exists(tempDbPath)) + { + File.Delete(tempDbPath); + } + } + catch (Exception ex1) + { + Main._context.API.LogException(ClassName, $"Failed to delete temporary favicon DB: {tempDbPath}", ex1); + } Main._context.API.LogException(ClassName, $"Failed to copy favicon DB: {dbPath}", ex); return; } From 4931a1436a5b12c99f49a596b75b13115ddf4797 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 12 May 2025 17:19:16 +0800 Subject: [PATCH 282/552] Validate the cache directory before loading all bookmarks --- Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs index 9ad31ad14..155069495 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs @@ -37,8 +37,6 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex context.CurrentPluginMetadata.PluginCacheDirectoryPath, "FaviconCache"); - FilesFolders.ValidateDirectory(_faviconCacheDir); - LoadBookmarksIfEnabled(); } @@ -50,6 +48,9 @@ public class Main : ISettingProvider, IPlugin, IReloadable, IPluginI18n, IContex return; } + // Validate the cache directory before loading all bookmarks because Flow needs this directory to storage favicons + FilesFolders.ValidateDirectory(_faviconCacheDir); + _cachedBookmarks = BookmarkLoader.LoadAllBookmarks(_settings); _ = MonitorRefreshQueueAsync(); _initialized = true; From ed148267de6bce771b554b647b64d45ab507f36d Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 12 May 2025 20:37:37 +0800 Subject: [PATCH 283/552] Do not show error message for initialization if plugin is already disabled --- Flow.Launcher.Core/Plugin/PluginManager.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index a3e80a73f..eb775c2f0 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -220,9 +220,17 @@ namespace Flow.Launcher.Core.Plugin catch (Exception e) { API.LogException(ClassName, $"Fail to Init plugin: {pair.Metadata.Name}", e); - pair.Metadata.Disabled = true; - pair.Metadata.HomeDisabled = true; - failedPlugins.Enqueue(pair); + if (pair.Metadata.Disabled && pair.Metadata.HomeDisabled) + { + // If this plugin is already disabled, do not show error message again + // Or else it will be shown every time + } + else + { + pair.Metadata.Disabled = true; + pair.Metadata.HomeDisabled = true; + failedPlugins.Enqueue(pair); + } } })); From b96a69a5b636c91ff00b681adad785446b98f5c4 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 12 May 2025 22:03:00 +0800 Subject: [PATCH 284/552] Fix Window Positioning with Multiple Montiors Co-authored-by: onesounds --- .../UserSettings/Settings.cs | 4 + Flow.Launcher/MainWindow.xaml.cs | 87 +++++++++++++++++-- Flow.Launcher/SettingWindow.xaml.cs | 30 ++++++- 3 files changed, 109 insertions(+), 12 deletions(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 34bf4f90e..ce1269a29 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -293,6 +293,10 @@ namespace Flow.Launcher.Infrastructure.UserSettings public double WindowLeft { get; set; } public double WindowTop { get; set; } + public double PreviousScreenWidth { get; set; } + public double PreviousScreenHeight { get; set; } + public double PreviousDpiX { get; set; } + public double PreviousDpiY { get; set; } /// /// Custom left position on selected monitor diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 46eeb2adc..230472d88 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -711,8 +711,26 @@ namespace Flow.Launcher { if (_settings.SearchWindowScreen == SearchWindowScreens.RememberLastLaunchLocation) { - Top = _settings.WindowTop; + var previousScreenWidth = _settings.PreviousScreenWidth; + var previousScreenHeight = _settings.PreviousScreenHeight; + GetDpi(out var previousDpiX, out var previousDpiY); + + _settings.PreviousScreenWidth = SystemParameters.VirtualScreenWidth; + _settings.PreviousScreenHeight = SystemParameters.VirtualScreenHeight; + GetDpi(out var currentDpiX, out var currentDpiY); + + if (previousScreenWidth != 0 && previousScreenHeight != 0 && + previousDpiX != 0 && previousDpiY != 0 && + (previousScreenWidth != SystemParameters.VirtualScreenWidth || + previousScreenHeight != SystemParameters.VirtualScreenHeight || + previousDpiX != currentDpiX || previousDpiY != currentDpiY)) + { + AdjustPositionForResolutionChange(); + return; + } + Left = _settings.WindowLeft; + Top = _settings.WindowTop; } else { @@ -725,27 +743,73 @@ namespace Flow.Launcher break; case SearchWindowAligns.CenterTop: Left = HorizonCenter(screen); - Top = 10; + Top = VerticalTop(screen); break; case SearchWindowAligns.LeftTop: Left = HorizonLeft(screen); - Top = 10; + Top = VerticalTop(screen); break; case SearchWindowAligns.RightTop: Left = HorizonRight(screen); - Top = 10; + Top = VerticalTop(screen); break; case SearchWindowAligns.Custom: - Left = Win32Helper.TransformPixelsToDIP(this, - screen.WorkingArea.X + _settings.CustomWindowLeft, 0).X; - Top = Win32Helper.TransformPixelsToDIP(this, 0, - screen.WorkingArea.Y + _settings.CustomWindowTop).Y; + var customLeft = Win32Helper.TransformPixelsToDIP(this, + screen.WorkingArea.X + _settings.CustomWindowLeft, 0); + var customTop = Win32Helper.TransformPixelsToDIP(this, 0, + screen.WorkingArea.Y + _settings.CustomWindowTop); + Left = customLeft.X; + Top = customTop.Y; break; } } } } + private void AdjustPositionForResolutionChange() + { + var screenWidth = SystemParameters.VirtualScreenWidth; + var screenHeight = SystemParameters.VirtualScreenHeight; + GetDpi(out var currentDpiX, out var currentDpiY); + + var previousLeft = _settings.WindowLeft; + var previousTop = _settings.WindowTop; + GetDpi(out var previousDpiX, out var previousDpiY); + + var widthRatio = screenWidth / _settings.PreviousScreenWidth; + var heightRatio = screenHeight / _settings.PreviousScreenHeight; + var dpiXRatio = currentDpiX / previousDpiX; + var dpiYRatio = currentDpiY / previousDpiY; + + var newLeft = previousLeft * widthRatio * dpiXRatio; + var newTop = previousTop * heightRatio * dpiYRatio; + + var screenLeft = SystemParameters.VirtualScreenLeft; + var screenTop = SystemParameters.VirtualScreenTop; + + var maxX = screenLeft + screenWidth - ActualWidth; + var maxY = screenTop + screenHeight - ActualHeight; + + Left = Math.Max(screenLeft, Math.Min(newLeft, maxX)); + Top = Math.Max(screenTop, Math.Min(newTop, maxY)); + } + + private void GetDpi(out double dpiX, out double dpiY) + { + var source = PresentationSource.FromVisual(this); + if (source != null && source.CompositionTarget != null) + { + var matrix = source.CompositionTarget.TransformToDevice; + dpiX = 96 * matrix.M11; + dpiY = 96 * matrix.M22; + } + else + { + dpiX = 96; + dpiY = 96; + } + } + private Screen SelectedScreen() { Screen screen; @@ -806,6 +870,13 @@ namespace Flow.Launcher return left; } + public double VerticalTop(Screen screen) + { + var dip1 = Win32Helper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y); + var top = dip1.Y + 10; + return top; + } + #endregion #region Window Animation diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index 79bd171ed..cf84317ac 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -137,18 +137,40 @@ public partial class SettingWindow if (previousTop == null || previousLeft == null || !IsPositionValid(previousTop.Value, previousLeft.Value)) { - Top = WindowTop(); - Left = WindowLeft(); + SetWindowPosition(WindowTop(), WindowLeft()); } else { - Top = previousTop.Value; - Left = previousLeft.Value; + var left = _settings.SettingWindowLeft.Value; + var top = _settings.SettingWindowTop.Value; + AdjustWindowPosition(ref top, ref left); + SetWindowPosition(top, left); } WindowState = _settings.SettingWindowState; } + private void SetWindowPosition(double top, double left) + { + // Ensure window does not exceed screen boundaries + top = Math.Max(top, SystemParameters.VirtualScreenTop); + left = Math.Max(left, SystemParameters.VirtualScreenLeft); + top = Math.Min(top, SystemParameters.VirtualScreenHeight - ActualHeight); + left = Math.Min(left, SystemParameters.VirtualScreenWidth - ActualWidth); + + Top = top; + Left = left; + } + + private void AdjustWindowPosition(ref double top, ref double left) + { + // Adjust window position if it exceeds screen boundaries + top = Math.Max(top, SystemParameters.VirtualScreenTop); + left = Math.Max(left, SystemParameters.VirtualScreenLeft); + top = Math.Min(top, SystemParameters.VirtualScreenHeight - ActualHeight); + left = Math.Min(left, SystemParameters.VirtualScreenWidth - ActualWidth); + } + private static bool IsPositionValid(double top, double left) { foreach (var screen in Screen.AllScreens) From 7509a86cbfde81f7a0696049b2e0438e6bff4f9a Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 13 May 2025 09:47:46 +0800 Subject: [PATCH 285/552] Use skip message for failed initialization when plugin is already disabled --- Flow.Launcher.Core/Plugin/PluginManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index eb775c2f0..c9d13b61d 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -219,17 +219,18 @@ namespace Flow.Launcher.Core.Plugin } catch (Exception e) { - API.LogException(ClassName, $"Fail to Init plugin: {pair.Metadata.Name}", e); if (pair.Metadata.Disabled && pair.Metadata.HomeDisabled) { // If this plugin is already disabled, do not show error message again // Or else it will be shown every time + API.LogDebug(ClassName, $"Skip init for <{pair.Metadata.Name}>"); } else { pair.Metadata.Disabled = true; pair.Metadata.HomeDisabled = true; failedPlugins.Enqueue(pair); + API.LogException(ClassName, $"Fail to Init plugin: {pair.Metadata.Name}", e); } } })); From 810f7bb4a79e76f6c8a950240113500199948702 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 13 May 2025 09:58:24 +0800 Subject: [PATCH 286/552] Add disable information --- Flow.Launcher.Core/Plugin/PluginManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index c9d13b61d..690fda011 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -219,6 +219,7 @@ namespace Flow.Launcher.Core.Plugin } catch (Exception e) { + API.LogException(ClassName, $"Fail to Init plugin: {pair.Metadata.Name}", e); if (pair.Metadata.Disabled && pair.Metadata.HomeDisabled) { // If this plugin is already disabled, do not show error message again @@ -230,7 +231,7 @@ namespace Flow.Launcher.Core.Plugin pair.Metadata.Disabled = true; pair.Metadata.HomeDisabled = true; failedPlugins.Enqueue(pair); - API.LogException(ClassName, $"Fail to Init plugin: {pair.Metadata.Name}", e); + API.LogDebug(ClassName, $"Disable plugin <{pair.Metadata.Name}> because init failed"); } } })); From 58f80996b7691ad8e59d0b8a3b5e20717653f6e8 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 13 May 2025 10:36:46 +0800 Subject: [PATCH 287/552] Fix results context menu display issue --- .../ViewModels/SettingsPaneThemeViewModel.cs | 2 +- Flow.Launcher/ViewModel/MainViewModel.cs | 12 +++++++++--- Flow.Launcher/ViewModel/ResultsViewModel.cs | 16 +++++++++++++--- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs index d542eb019..f1f3e22c6 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs @@ -479,7 +479,7 @@ public partial class SettingsPaneThemeViewModel : BaseModel ) } }; - var vm = new ResultsViewModel(Settings); + var vm = new ResultsViewModel(Settings, null); vm.AddResults(results, "PREVIEW"); PreviewResults = vm; } diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 401f71ae3..ac339b715 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -148,19 +148,19 @@ namespace Flow.Launcher.ViewModel _userSelectedRecord = _userSelectedRecordStorage.Load(); _topMostRecord = _topMostRecordStorage.Load(); - ContextMenu = new ResultsViewModel(Settings) + ContextMenu = new ResultsViewModel(Settings, this) { LeftClickResultCommand = OpenResultCommand, RightClickResultCommand = LoadContextMenuCommand, IsPreviewOn = Settings.AlwaysPreview }; - Results = new ResultsViewModel(Settings) + Results = new ResultsViewModel(Settings, this) { LeftClickResultCommand = OpenResultCommand, RightClickResultCommand = LoadContextMenuCommand, IsPreviewOn = Settings.AlwaysPreview }; - History = new ResultsViewModel(Settings) + History = new ResultsViewModel(Settings, this) { LeftClickResultCommand = OpenResultCommand, RightClickResultCommand = LoadContextMenuCommand, @@ -1662,6 +1662,12 @@ namespace Flow.Launcher.ViewModel return selected; } + internal bool ResultsSelected(ResultsViewModel results) + { + var selected = SelectedResults == results; + return selected; + } + #endregion #region Hotkey diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs index cd2736afa..799546808 100644 --- a/Flow.Launcher/ViewModel/ResultsViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs @@ -21,6 +21,7 @@ namespace Flow.Launcher.ViewModel private readonly object _collectionLock = new(); private readonly Settings _settings; + private readonly MainViewModel _mainVM; private int MaxResults => _settings?.MaxResultsToShow ?? 6; public ResultsViewModel() @@ -29,9 +30,10 @@ namespace Flow.Launcher.ViewModel BindingOperations.EnableCollectionSynchronization(Results, _collectionLock); } - public ResultsViewModel(Settings settings) : this() + public ResultsViewModel(Settings settings, MainViewModel mainVM) : this() { _settings = settings; + _mainVM = mainVM; _settings.PropertyChanged += (s, e) => { switch (e.PropertyName) @@ -179,6 +181,7 @@ namespace Flow.Launcher.ViewModel UpdateResults(newResults); } + /// /// To avoid deadlock, this method should not called from main thread /// @@ -202,11 +205,18 @@ namespace Flow.Launcher.ViewModel SelectedItem = Results[0]; } + if (token.IsCancellationRequested) + return; + switch (Visibility) { case Visibility.Collapsed when Results.Count > 0: - SelectedIndex = 0; - Visibility = Visibility.Visible; + // Show it only if the results are selected + if (_mainVM == null || _mainVM.ResultsSelected(this)) + { + SelectedIndex = 0; + Visibility = Visibility.Visible; + } break; case Visibility.Visible when Results.Count == 0: Visibility = Visibility.Collapsed; From fa350ddb0779f70d2fa0fbd0f7bf37c84c110638 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 13 May 2025 10:48:00 +0800 Subject: [PATCH 288/552] Add code comments --- Flow.Launcher/ViewModel/ResultsViewModel.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs index 799546808..b91bf0f30 100644 --- a/Flow.Launcher/ViewModel/ResultsViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs @@ -211,8 +211,8 @@ namespace Flow.Launcher.ViewModel switch (Visibility) { case Visibility.Collapsed when Results.Count > 0: - // Show it only if the results are selected - if (_mainVM == null || _mainVM.ResultsSelected(this)) + if (_mainVM == null || // The results is for preview only in apprerance page + _mainVM.ResultsSelected(this)) // The results are selected { SelectedIndex = 0; Visibility = Visibility.Visible; From 8e7e1738507a0f99f75f5b7898743d8b6bf66821 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 13 May 2025 10:49:40 +0800 Subject: [PATCH 289/552] Add code comments --- .../SettingPages/ViewModels/SettingsPaneThemeViewModel.cs | 1 + Flow.Launcher/ViewModel/ResultsViewModel.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs index f1f3e22c6..07d70a67c 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs @@ -479,6 +479,7 @@ public partial class SettingsPaneThemeViewModel : BaseModel ) } }; + // Set main view model to null because this results are for preview only var vm = new ResultsViewModel(Settings, null); vm.AddResults(results, "PREVIEW"); PreviewResults = vm; diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs index b91bf0f30..0dc1b85c4 100644 --- a/Flow.Launcher/ViewModel/ResultsViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs @@ -211,7 +211,7 @@ namespace Flow.Launcher.ViewModel switch (Visibility) { case Visibility.Collapsed when Results.Count > 0: - if (_mainVM == null || // The results is for preview only in apprerance page + if (_mainVM == null || // The results are for preview only in apprerance page _mainVM.ResultsSelected(this)) // The results are selected { SelectedIndex = 0; From 03b558c1fc0947d6994f0c71d5ae002f50e52123 Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Tue, 13 May 2025 10:51:44 +0800 Subject: [PATCH 290/552] Fix typos Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Flow.Launcher/ViewModel/ResultsViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs index 0dc1b85c4..b100bba25 100644 --- a/Flow.Launcher/ViewModel/ResultsViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs @@ -211,7 +211,7 @@ namespace Flow.Launcher.ViewModel switch (Visibility) { case Visibility.Collapsed when Results.Count > 0: - if (_mainVM == null || // The results are for preview only in apprerance page + if (_mainVM == null || // The results are for preview only in appearance page _mainVM.ResultsSelected(this)) // The results are selected { SelectedIndex = 0; From a73ff5f1227598231420e7778a0f76ded73a9c14 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 13 May 2025 13:07:49 +1000 Subject: [PATCH 291/552] update comment --- Flow.Launcher.Core/Plugin/PluginManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 690fda011..aae8dd764 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -224,7 +224,7 @@ namespace Flow.Launcher.Core.Plugin { // If this plugin is already disabled, do not show error message again // Or else it will be shown every time - API.LogDebug(ClassName, $"Skip init for <{pair.Metadata.Name}>"); + API.LogDebug(ClassName, $"Skipped init for <{pair.Metadata.Name}> due to error"); } else { From 93a9a92a4068906a67d46178503e09f312cb43a0 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 13 May 2025 11:11:50 +0800 Subject: [PATCH 292/552] Fix typos --- .../SettingPages/ViewModels/SettingsPaneThemeViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs index 07d70a67c..79465cd71 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs @@ -479,7 +479,7 @@ public partial class SettingsPaneThemeViewModel : BaseModel ) } }; - // Set main view model to null because this results are for preview only + // Set main view model to null because the results are for preview only var vm = new ResultsViewModel(Settings, null); vm.AddResults(results, "PREVIEW"); PreviewResults = vm; From e0ac6d5feed2b4f86e7cfcf19a476506d538b362 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 13 May 2025 12:49:35 +0800 Subject: [PATCH 293/552] Improve Program plugin delete button logic --- .../Languages/en.xaml | 1 + .../Views/ProgramSetting.xaml | 6 ++ .../Views/ProgramSetting.xaml.cs | 72 ++++++++++++------- 3 files changed, 54 insertions(+), 25 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml index ee6b4379d..c19347f2a 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml @@ -48,6 +48,7 @@ Please select a program source Are you sure you want to delete the selected program sources? + Please select program sources that you added Another program source with the same location already exists. Program Source diff --git a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml index 5c0ba8d0b..3bf1c6ad1 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Views/ProgramSetting.xaml @@ -203,6 +203,12 @@ Margin="{StaticResource SettingPanelItemLeftTopBottomMargin}" Click="btnEditProgramSource_OnClick" Content="{DynamicResource flowlauncher_plugin_program_edit}" /> + void ShowMainWindow(); + + /// + /// Focus the query text box in the main window + /// + void FocusQueryTextBox(); /// /// Hide MainWindow diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index a0614d90f..7b80ec480 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -33,6 +33,7 @@ using JetBrains.Annotations; using Squirrel; using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch; using System.ComponentModel; +using System.Windows.Input; namespace Flow.Launcher { @@ -92,6 +93,18 @@ namespace Flow.Launcher } public void ShowMainWindow() => _mainVM.Show(); + + public void FocusQueryTextBox() + { + Application.Current.Dispatcher.Invoke(new Action(() => + { + if (Application.Current.MainWindow is MainWindow mw) + { + mw.QueryTextBox.Focus(); + Keyboard.Focus(mw.QueryTextBox); + } + })); + } public void HideMainWindow() => _mainVM.Hide(); diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs index 0d395c053..758ad09d5 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs @@ -378,10 +378,13 @@ namespace Flow.Launcher.Plugin.Shell private void OnWinRPressed() { + Context.API.ShowMainWindow(); // show the main window and set focus to the query box - _ = Task.Run(() => + _ = Task.Run(async () => { - Context.API.ShowMainWindow(); + await Task.Delay(50); // 💡 키보드 이벤트 처리가 끝난 뒤 + Context.API.FocusQueryTextBox(); + Context.API.ChangeQuery($"{Context.CurrentPluginMetadata.ActionKeywords[0]}{Plugin.Query.TermSeparator}"); }); } From 3718ae5640bbe5e9af2a389964386d9d81444114 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 22 May 2025 10:39:09 +0800 Subject: [PATCH 350/552] Improve code quality & Improve code comments --- Flow.Launcher/PublicAPIInstance.cs | 18 ++++-------------- Flow.Launcher/ViewModel/MainViewModel.cs | 15 +++++++++++++++ Plugins/Flow.Launcher.Plugin.Shell/Main.cs | 9 ++++++--- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 7b80ec480..66e11f881 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -2,6 +2,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Specialized; +using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; @@ -10,6 +11,7 @@ using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using System.Windows; +using System.Windows.Input; using System.Windows.Media; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.Core; @@ -32,8 +34,6 @@ using Flow.Launcher.ViewModel; using JetBrains.Annotations; using Squirrel; using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch; -using System.ComponentModel; -using System.Windows.Input; namespace Flow.Launcher { @@ -93,18 +93,8 @@ namespace Flow.Launcher } public void ShowMainWindow() => _mainVM.Show(); - - public void FocusQueryTextBox() - { - Application.Current.Dispatcher.Invoke(new Action(() => - { - if (Application.Current.MainWindow is MainWindow mw) - { - mw.QueryTextBox.Focus(); - Keyboard.Focus(mw.QueryTextBox); - } - })); - } + + public void FocusQueryTextBox() => _mainVM.FocusQueryTextBox(); public void HideMainWindow() => _mainVM.Hide(); diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 807275fcb..6e1b0dd93 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1926,6 +1926,21 @@ namespace Flow.Launcher.ViewModel Results.AddResults(resultsForUpdates, token, reSelect); } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "")] + public void FocusQueryTextBox() + { + // When application is exiting, the Application.Current will be null + Application.Current?.Dispatcher.Invoke(() => + { + // When application is exiting, the Application.Current will be null + if (Application.Current?.MainWindow is MainWindow window) + { + window.QueryTextBox.Focus(); + Keyboard.Focus(window.QueryTextBox); + } + }); + } + #endregion #region IDisposable diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs index 758ad09d5..2613c770b 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs @@ -382,10 +382,13 @@ namespace Flow.Launcher.Plugin.Shell // show the main window and set focus to the query box _ = Task.Run(async () => { - await Task.Delay(50); // 💡 키보드 이벤트 처리가 끝난 뒤 - Context.API.FocusQueryTextBox(); - Context.API.ChangeQuery($"{Context.CurrentPluginMetadata.ActionKeywords[0]}{Plugin.Query.TermSeparator}"); + + // Win+R is a system-reserved shortcut, and though the plugin intercepts the keyboard event and + // shows the main window, Windows continues to process the Win key and briefly reclaims focus. + // So we need to wait until the keyboard event processing is completed and then set focus + await Task.Delay(50); + Context.API.FocusQueryTextBox(); }); } From 8aae92e61da289815da6d8f5291b5718c6741340 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 22 May 2025 10:47:07 +0800 Subject: [PATCH 351/552] Fix main window null when checking exitting --- Flow.Launcher/App.xaml.cs | 2 +- Flow.Launcher/SettingWindow.xaml.cs | 2 +- Flow.Launcher/ViewModel/MainViewModel.cs | 2 +- Flow.Launcher/WelcomeWindow.xaml.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs index 969bb75bb..cedced181 100644 --- a/Flow.Launcher/App.xaml.cs +++ b/Flow.Launcher/App.xaml.cs @@ -32,7 +32,7 @@ namespace Flow.Launcher #region Public Properties public static IPublicAPI API { get; private set; } - public static bool Exiting => _mainWindow.CanClose; + public static bool LoadingOrExiting => _mainWindow == null || _mainWindow.CanClose; #endregion diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs index c53a4ea80..c1c0f96a7 100644 --- a/Flow.Launcher/SettingWindow.xaml.cs +++ b/Flow.Launcher/SettingWindow.xaml.cs @@ -82,7 +82,7 @@ public partial class SettingWindow _viewModel.PropertyChanged -= ViewModel_PropertyChanged; // If app is exiting, settings save is not needed because main window closing event will handle this - if (App.Exiting) return; + if (App.LoadingOrExiting) return; // Save settings when window is closed _settings.Save(); App.API.SavePluginSettings(); diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index 807275fcb..c4da384f8 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -1729,7 +1729,7 @@ namespace Flow.Launcher.ViewModel public void Show() { // When application is exiting, we should not show the main window - if (App.Exiting) return; + if (App.LoadingOrExiting) return; // When application is exiting, the Application.Current will be null Application.Current?.Dispatcher.Invoke(() => diff --git a/Flow.Launcher/WelcomeWindow.xaml.cs b/Flow.Launcher/WelcomeWindow.xaml.cs index ef0706765..fe8a63e52 100644 --- a/Flow.Launcher/WelcomeWindow.xaml.cs +++ b/Flow.Launcher/WelcomeWindow.xaml.cs @@ -96,7 +96,7 @@ namespace Flow.Launcher private void Window_Closed(object sender, EventArgs e) { // If app is exiting, settings save is not needed because main window closing event will handle this - if (App.Exiting) return; + if (App.LoadingOrExiting) return; // Save settings when window is closed _settings.Save(); } From 087a45c66458c700b5f9f0e28278fe2abd34938a Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Thu, 22 May 2025 20:41:04 +1000 Subject: [PATCH 352/552] New Crowdin updates (#3559) --- Flow.Launcher/Languages/ar.xaml | 11 +++++++++++ Flow.Launcher/Languages/cs.xaml | 11 +++++++++++ Flow.Launcher/Languages/da.xaml | 11 +++++++++++ Flow.Launcher/Languages/de.xaml | 11 +++++++++++ Flow.Launcher/Languages/es-419.xaml | 11 +++++++++++ Flow.Launcher/Languages/es.xaml | 11 +++++++++++ Flow.Launcher/Languages/fr.xaml | 11 +++++++++++ Flow.Launcher/Languages/he.xaml | 11 +++++++++++ Flow.Launcher/Languages/it.xaml | 11 +++++++++++ Flow.Launcher/Languages/ja.xaml | 11 +++++++++++ Flow.Launcher/Languages/ko.xaml | 11 +++++++++++ Flow.Launcher/Languages/nb.xaml | 11 +++++++++++ Flow.Launcher/Languages/nl.xaml | 11 +++++++++++ Flow.Launcher/Languages/pl.xaml | 11 +++++++++++ Flow.Launcher/Languages/pt-br.xaml | 11 +++++++++++ Flow.Launcher/Languages/pt-pt.xaml | 11 +++++++++++ Flow.Launcher/Languages/ru.xaml | 11 +++++++++++ Flow.Launcher/Languages/sk.xaml | 13 ++++++++++++- Flow.Launcher/Languages/sr.xaml | 11 +++++++++++ Flow.Launcher/Languages/tr.xaml | 11 +++++++++++ Flow.Launcher/Languages/uk-UA.xaml | 11 +++++++++++ Flow.Launcher/Languages/vi.xaml | 11 +++++++++++ Flow.Launcher/Languages/zh-cn.xaml | 11 +++++++++++ Flow.Launcher/Languages/zh-tw.xaml | 11 +++++++++++ .../Properties/Resources.ja-JP.resx | 6 +++--- 25 files changed, 268 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/Languages/ar.xaml b/Flow.Launcher/Languages/ar.xaml index b81c5c9b5..42cfdf3eb 100644 --- a/Flow.Launcher/Languages/ar.xaml +++ b/Flow.Launcher/Languages/ar.xaml @@ -371,6 +371,7 @@ اختر مدير الملفات + Learn more يرجى تحديد موقع ملف مدير الملفات الذي تستخدمه وإضافة الحجج حسب الحاجة. يمثل "%d" مسار الدليل المفتوح، ويستخدمه الحقل "الحجة للمجلد" للأوامر التي تفتح أدلة محددة. يمثل "%f" مسار الملف المفتوح، ويستخدمه الحقل "الحجة للملف" للأوامر التي تفتح ملفات محددة. على سبيل المثال، إذا كان مدير الملفات يستخدم أمرًا مثل "totalcmd.exe /A c:\windows" لفتح دليل c:\windows، فإن مسار مدير الملفات سيكون totalcmd.exe، وحجة المجلد ستكون /A "%d". قد تحتاج بعض مديري الملفات مثل QTTabBar فقط إلى توفير مسار، في هذه الحالة استخدم "%d" كمسار مدير الملفات واترك باقي الحقول فارغة. مدير الملفات @@ -378,6 +379,8 @@ مسار مدير الملفات حجة للمجلد حجة للملف + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error متصفح الويب الافتراضي @@ -469,6 +472,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + خطأ + An error occurred while opening the folder. {0} + يرجى الانتظار... diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml index 71c9c8c6b..bfcd92360 100644 --- a/Flow.Launcher/Languages/cs.xaml +++ b/Flow.Launcher/Languages/cs.xaml @@ -371,6 +371,7 @@ Vybrat správce souborů + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Správce souborů @@ -378,6 +379,8 @@ Cesta k správci souborů Argumenty pro složku Argumenty pro Soubor + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Výchozí prohlížeč @@ -469,6 +472,14 @@ Pokud před zkratku při zadávání přidáte znak "@", bude odpovíd 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Chyba + An error occurred while opening the folder. {0} + Počkejte prosím... diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml index 37723dc9b..9a4cbc003 100644 --- a/Flow.Launcher/Languages/da.xaml +++ b/Flow.Launcher/Languages/da.xaml @@ -371,6 +371,7 @@ Select File Manager + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Filhåndtering @@ -378,6 +379,8 @@ Sti til filhåndtering Arg for mappe Arg for fil + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Default Web Browser @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Please wait... diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml index 895a2dab6..88c5b84d4 100644 --- a/Flow.Launcher/Languages/de.xaml +++ b/Flow.Launcher/Languages/de.xaml @@ -371,6 +371,7 @@ Dateimanager auswählen + Learn more Bitte geben Sie den Dateiort des von Ihnen verwendeten Dateimanagers an und fügen Sie bei Bedarf Argumente hinzu. Das „%d“ repräsentiert den dafür zu öffnenden Verzeichnispfad, der vom Feld Arg for Folder und für Befehle zum Öffnen bestimmter Verzeichnisse verwendet wird. Das „%f“ repräsentiert den dafür zu öffnenden Dateipfad, der vom Feld Arg for File und für Befehle zum Öffnen bestimmter Dateien verwendet wird. Zum Beispiel, wenn der Dateimanager einen Befehl wie „totalcmd.exe /A c:\windows“ verwendet, um das Verzeichnis c:\windows zu öffnen, lautet der Dateimanager-Pfad „totalcmd.exe“ und der Arg for Folder „/A %d“. Bestimmte Dateimanager wie QTTabBar kann nur die Angabe eines Pfades erfordern, in diesem Fall verwenden Sie „%d“ als den Dateimanager-Pfad und lassen den Rest der Felder blank. Dateimanager @@ -378,6 +379,8 @@ Dateimanager-Pfad Arg For Folder Arg For File + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Webbrowser per Default @@ -469,6 +472,14 @@ Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt die 1. Logdatei hochladen: {0} 2. Kopieren Sie die Ausnahmemeldung unterhalb + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Fehler + An error occurred while opening the folder. {0} + Bitte warten Sie ... diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml index 902811a56..b73a1ef12 100644 --- a/Flow.Launcher/Languages/es-419.xaml +++ b/Flow.Launcher/Languages/es-419.xaml @@ -371,6 +371,7 @@ Seleccionar Gestor de Archivos + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Gestor de Archivos @@ -378,6 +379,8 @@ Ruta del Gestor de Archivos Arg para Carpeta Arg para Archivo + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Navegador Web Predeterminado @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Por favor espere... diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml index 0dc6833af..2b6074f06 100644 --- a/Flow.Launcher/Languages/es.xaml +++ b/Flow.Launcher/Languages/es.xaml @@ -371,6 +371,7 @@ Seleccionar administrador de archivos + Learn more Especifique la ubicación del archivo del administrador de archivos que está utilizando y añada los argumentos necesarios. El argumento "%d" representa la ruta del directorio a abrir, utilizada por el campo Argumentos de la carpeta y por comandos que abren directorios específicos. El "%f" representa la ruta del archivo a abrir, utilizada por el campo Argumentos del archivo y por comandos que abren archivos específicos. Por ejemplo, si el administrador de archivos utiliza un comando como "totalcmd.exe /A c:\windows" para abrir el directorio c:\windows, la ruta del administrador de archivos será totalcmd.exe, y los Argumentos de la carpeta serán /A "%d". Ciertos administradores de archivos como QTTabBar pueden requerir solo la ruta, en este caso utilice "%d" como la ruta del administrador de archivos y deje el resto de los campos en blanco. Administrador de archivos @@ -378,6 +379,8 @@ Ruta del administrador de archivos Argumentos de la carpeta Argumentos del archivo + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Navegador web predeterminado @@ -469,6 +472,14 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci 1. Subir archivo de registro: {0} 2. Copiar el siguiente mensaje de excepción + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Por favor espere... diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml index 41fdbaa51..cd6d8c01f 100644 --- a/Flow.Launcher/Languages/fr.xaml +++ b/Flow.Launcher/Languages/fr.xaml @@ -370,6 +370,7 @@ Sélectionner le gestionnaire de fichiers + Learn more Veuillez spécifier l'emplacement du fichier de l'explorateur de fichiers que vous utilisez et ajouter des arguments si nécessaire. Le "%d" représente le chemin du répertoire à ouvrir, utilisé par le champ Arg for Folder et pour les commandes ouvrant des répertoires spécifiques. Le "%f" représente le chemin du fichier à ouvrir, utilisé par le champ Arg for File et pour les commandes ouvrant des fichiers spécifiques. Par exemple, si l'explorateur de fichiers utilise une commande telle que "totalcmd.exe /A c:\windows" pour ouvrir le répertoire c:\windows, le chemin de l'explorateur de fichiers sera totalcmd.exe et l'argument Arg For Folder sera /A "%d"". Certains explorateurs de fichiers comme QTTabBar peuvent simplement nécessiter qu'un chemin soit fourni, dans ce cas, utilisez "%d" comme chemin de l'explorateur de fichiers et laissez le reste des fichiers vides. Gestionnaire de fichiers @@ -377,6 +378,8 @@ Chemin du gestionnaire de fichiers Arguments pour le répertoire Arguments pour le fichier + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Navigateur web par défaut @@ -468,6 +471,14 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu 1. Télécharger le fichier journal : {0} 2. Copiez le message d’exception ci-dessous + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Erreur + An error occurred while opening the folder. {0} + Veuillez patienter... diff --git a/Flow.Launcher/Languages/he.xaml b/Flow.Launcher/Languages/he.xaml index 52eaf5e9f..b98c2ec73 100644 --- a/Flow.Launcher/Languages/he.xaml +++ b/Flow.Launcher/Languages/he.xaml @@ -370,6 +370,7 @@ בחר מנהל קבצים + Learn more אנא ציין את מיקום הקובץ של מנהל הקבצים שבו אתה משתמש והוסף ארגומנטים כנדרש. "%d" מייצג את נתיב התיקייה שיש לפתוח, ומשמש בשדה ארגומנט לתיקייה ובפקודות לפתיחת תיקיות מסוימות. "%f" מייצג את נתיב הקובץ שיש לפתוח, ומשמש בשדה ארגומנט לקובץ ובפקודות לפתיחת קבצים מסוימים. לדוגמה, אם מנהל הקבצים משתמש בפקודה כגון "totalcmd.exe /A c:\windows" כדי לפתוח את התיקייה c:\windows, נתיב מנהל הקבצים יהיה totalcmd.exe, והארגומנט לתיקייה יהיה /A "%d". מנהלי קבצים מסוימים, כגון QTTabBar, עשויים לדרוש רק ציון נתיב, במקרה כזה השתמש ב-"%d" כנתיב מנהל הקבצים והשאר את שאר השדות ריקים. מנהל קבצים @@ -377,6 +378,8 @@ נתיב מנהל קבצים ארגומנט לתיקייה ארגומנט לקובץ + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error דפדפן ברירת מחדל @@ -468,6 +471,14 @@ 1. העלה קובץ יומן: {0} 2. העתק את הודעת החריגה למטה + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + שגיאה + An error occurred while opening the folder. {0} + אנא המתן... diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml index 1a356ad65..7ea797fa9 100644 --- a/Flow.Launcher/Languages/it.xaml +++ b/Flow.Launcher/Languages/it.xaml @@ -371,6 +371,7 @@ Seleziona Gestore File + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Gestore File @@ -378,6 +379,8 @@ Percorso Gestore File Arg Per Cartella Arg Per Cartella + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Browser predefinito @@ -469,6 +472,14 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Attendere prego... diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml index 949fe5c99..33673d60f 100644 --- a/Flow.Launcher/Languages/ja.xaml +++ b/Flow.Launcher/Languages/ja.xaml @@ -371,6 +371,7 @@ デフォルトのファイルマネージャー + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. File Manager @@ -378,6 +379,8 @@ File Manager Path Arg For Folder Arg For File + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error デフォルトのウェブブラウザー @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Please wait... diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml index 9ae2e0195..9e8f9a73b 100644 --- a/Flow.Launcher/Languages/ko.xaml +++ b/Flow.Launcher/Languages/ko.xaml @@ -362,6 +362,7 @@ 파일관리자 선택 + Learn more 사용 중인 파일 관리자의 파일 위치를 지정하고, 필요한 경우 인수를 추가하세요. "%d"는 열고자 하는 디렉터리 경로를 나타내며, 폴더용 인수 필드 및 특정 디렉터리를 여는 명령어에서 사용됩니다. "%f"는 열고자 하는 파일 경로를 나타내며, 파일용 인수 필드 및 특정 파일을 여는 명령어에서 사용됩니다. 예를 들어, 파일 관리자가 totalcmd.exe /A c:\windows와 같은 명령어로 c:\windows 디렉터리를 연다면, 파일 관리자 경로는 totalcmd.exe가 되고, 폴더용 인수는 /A "%d"가 됩니다. QTTabBar와 같은 일부 파일 관리자는 경로만 전달하면 되는 경우가 있으므로, 이 경우에는 파일 관리자 경로에 "%d"를 입력하고 나머지 필드는 비워두세요. 파일관리자 @@ -369,6 +370,8 @@ 파일관리자 경로 폴더경로 인수 파일경로 인수 + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error 기본 웹 브라우저 @@ -460,6 +463,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + 잠시 기다려주세요... diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml index 58571a1c4..8d5ac7a94 100644 --- a/Flow.Launcher/Languages/nb.xaml +++ b/Flow.Launcher/Languages/nb.xaml @@ -371,6 +371,7 @@ Velg filbehandler + Learn more Vennligst spesifiser filplasseringen til filbehandleren du bruker, og legg til argumenter etter behov. "%d" representerer katalogbanen som skal åpnes for, brukt av Arg for mappe-feltet og for kommandoer som åpner spesifikke kataloger. "%f" representerer filbanen som skal åpnes for, brukt av Arg for fil-feltet og for kommandoer som åpner spesifikke filer. For eksempel, hvis filbehandleren bruker en kommando som "totalcmd.exe /A c:windows" for å åpne c:windows-katalogen, vil filbehandlingsbanen bli totalcmd.exe, og Arg For Folder vil være /A "%d". Enkelte filbehandlere som QTTabBar kan bare kreve at en bane oppgis, i dette tilfellet bruker du "%d" som filbehandlingsbane og lar resten av feltene stå tomme. Filbehandler @@ -378,6 +379,8 @@ Filbehandler sti Arg for mappe Arg for fil + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Standard nettleser @@ -469,6 +472,14 @@ Hvis du legger til et @-prefiks mens du legger inn en snarvei, samsvarer det med 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Feil + An error occurred while opening the folder. {0} + Vennligst vent... diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml index 70a58e322..0f6ad436d 100644 --- a/Flow.Launcher/Languages/nl.xaml +++ b/Flow.Launcher/Languages/nl.xaml @@ -371,6 +371,7 @@ Bestandsbeheerder selecteren + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Bestandsbeheerder @@ -378,6 +379,8 @@ Bestandsbeheerder pad Arg voor map Arg voor bestand + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Standaard webbrowser @@ -469,6 +472,14 @@ Als u een '@' voorvoegsel toevoegt tijdens het invoeren van een snelkoppeling, m 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Please wait... diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml index 081c8e90e..1397afa25 100644 --- a/Flow.Launcher/Languages/pl.xaml +++ b/Flow.Launcher/Languages/pl.xaml @@ -371,6 +371,7 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Wybierz menedżer plików + Learn more Proszę określić lokalizację pliku menedżera plików, którego używasz i dodać argumenty według potrzeb. Symbol "%d" reprezentuje ścieżkę katalogu do otwarcia, używaną w polu Arg dla Folderu oraz dla poleceń otwierających konkretne katalogi. Symbol "%f" reprezentuje ścieżkę pliku do otwarcia, używaną w polu Arg dla Pliku oraz dla poleceń otwierających konkretne pliki. Na przykład, jeśli menedżer plików używa polecenia takiego jak „totalcmd.exe /A c:\windows" do otwarcia katalogu c:\windows, Ścieżka Menedżera Plików będzie totalcmd.exe, a Argument dla Folderu będzie /A "%d". Niektóre menedżery plików, takie jak QTTabBar, mogą wymagać jedynie podania ścieżki; w takim przypadku użyj "%d" jako Ścieżki Menedżera Plików, a pozostałe pola pozostaw puste. Menadżer plików @@ -378,6 +379,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Ścieżka menedżera plików Arg dla folderu Arg dla pliku + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Domyślna przeglądarka @@ -469,6 +472,14 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d 1. Prześlij plik dziennika: {0} 2. Skopiuj poniższą wiadomość wyjątku + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Błąd + An error occurred while opening the folder. {0} + Proszę czekać... diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml index bd74d1d5f..232134290 100644 --- a/Flow.Launcher/Languages/pt-br.xaml +++ b/Flow.Launcher/Languages/pt-br.xaml @@ -371,6 +371,7 @@ Selecione o Gerenciador de Arquivos + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Gerenciador de Arquivos @@ -378,6 +379,8 @@ Caminho do Gerenciador de Arquivos Arg para Pasta Arg para Arquivo + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Navegador da Web Padrão @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Por favor, aguarde... diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml index cf7312956..f98fdf64b 100644 --- a/Flow.Launcher/Languages/pt-pt.xaml +++ b/Flow.Launcher/Languages/pt-pt.xaml @@ -369,6 +369,7 @@ Selecione o gestor de ficheiros + Saber mais Por favor, especifique a localização do executável do seu gestor de ficheiros e adicione os argumentos necessários. "%d" representa o caminho do diretório a abrir, usado pelo argumento do campo Pasta e para comandos que abrem diretórios específicos. "%f" representa o caminho do ficheiro a abrir, usado pelo argumento do campo Ficheiro e para comandos que abrem ficheiros específicos. Por exemplo, se o gestor de ficheiros utilizar o comando "totalcmd.exe /A c:\windows" para abrir o diretório c:\windows , o caminho para o gestor de ficheiros será totalcmd. exe e os argumentos para a Pasta serão /A "%d". Alguns gestores de ficheiros, como QTTabBar podem apenas exigir que especifique o caminho. Para estes, deve utilizar "%d" como caminho para o gestor de ficheiros e deixar o resto dos campos em branco. Gestor de ficheiros @@ -376,6 +377,8 @@ Caminho do gestor de ficheiros Argumento para pasta Argumento para ficheiro + Não foi possível encontrar o gestor de ficheiros '{0}' em '{1}'. Deseja continuar? + Erro no caminho do gestor de ficheiros Navegador web padrão @@ -467,6 +470,14 @@ Se adicionar o prefixo '@' durante a introdução do atalho, será utilizada qua 1. Carregue o ficheiro de registos: {0} 2. Copie a mensagem abaixo + + Erro do gestor de ficheiros + + Não foi possível encontrar o gestor de ficheiros. Verifique a definição 'Gestor de ficheiros personalizado' em Definições -> Geral. + + Erro + Ocorreu um erro ao abrir a pasta: {0} + Por favor aguarde... diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml index 69069c5ec..2a9b5c26b 100644 --- a/Flow.Launcher/Languages/ru.xaml +++ b/Flow.Launcher/Languages/ru.xaml @@ -371,6 +371,7 @@ Выбор менеджера файлов + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Файловый менеджер @@ -378,6 +379,8 @@ Путь к файловому менеджеру Аргумент для папки Аргумент для файла + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Браузер по умолчанию @@ -469,6 +472,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Ошибка + An error occurred while opening the folder. {0} + Пожалуйста, подождите... diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml index 88ed1c9df..934b0747a 100644 --- a/Flow.Launcher/Languages/sk.xaml +++ b/Flow.Launcher/Languages/sk.xaml @@ -371,6 +371,7 @@ Vyberte správcu súborov + Viac informácií Zadajte umiestnenie súboru správcu súborov, ktorý používate, a podľa potreby pridajte argumenty. "%d" 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. "%f" 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. Napríklad, ak správca súborov používa príkaz ako "totalcmd.exe /A c:\windows" na otvorenie priečinka c:\windows, cesta správcu súborov bude totalcmd.exe a Arg pre priečinok bude /A "%d". Niektorí správcovia súborov, ako napríklad QTTabBar, môžu vyžadovať len zadanie cesty, v tomto prípade použite "%d" ako cestu správcu súborov a zvyšok súborov nechajte prázdny. Správca súborov @@ -378,6 +379,8 @@ Cesta k správcovi súborov Arg. pre priečinok Arg. pre súbor + Správca súborov '{0}' sa nenachádza na '{1}'. Chcete pokračovať? + Chyba v ceste k správcovi súborov Predvolený webový prehliadač @@ -445,7 +448,7 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s Zrušiť Resetovať Odstrániť - Aktualizovať + OK Áno Nie Pozadie @@ -469,6 +472,14 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s 1. Nahrajte súbor logu: {0} 2. Skopírujte nižšie uvedenú správu o výnimke + + Chyba správcu súborov + + Zadaný správca súborov sa nenašiel. Skontrolujte nastavenie vlastného správcu súborov v Nastavenia > Všeobecné. + + Chyba + Počas otvárania priečinka sa vyskytla chyba. {0} + Čakajte, prosím... diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml index 4b3e3bc0c..0d2c04513 100644 --- a/Flow.Launcher/Languages/sr.xaml +++ b/Flow.Launcher/Languages/sr.xaml @@ -371,6 +371,7 @@ Select File Manager + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. File Manager @@ -378,6 +379,8 @@ File Manager Path Arg For Folder Arg For File + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Default Web Browser @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Please wait... diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml index 665694ace..ab9aa31e6 100644 --- a/Flow.Launcher/Languages/tr.xaml +++ b/Flow.Launcher/Languages/tr.xaml @@ -371,6 +371,7 @@ Dosya Yöneticisi Seçenekleri + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Dosya Yöneticisi @@ -378,6 +379,8 @@ Dosya Yöneticisi Yolu Klasör Açarken Dosya Açarken + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error İnternet Tarayıcı Seçenekleri @@ -467,6 +470,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + Lütfen bekleyin... diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml index b3dc2cd16..f7cc7b0ed 100644 --- a/Flow.Launcher/Languages/uk-UA.xaml +++ b/Flow.Launcher/Languages/uk-UA.xaml @@ -371,6 +371,7 @@ Виберіть файловий менеджер + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Файловий менеджер @@ -378,6 +379,8 @@ Шлях до файлового менеджера Аргумент для папки Аргумент для файлу + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Веб-браузер за замовчуванням @@ -469,6 +472,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Помилка + An error occurred while opening the folder. {0} + Будь ласка, зачекайте... diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml index b7b56213b..95e43e297 100644 --- a/Flow.Launcher/Languages/vi.xaml +++ b/Flow.Launcher/Languages/vi.xaml @@ -373,6 +373,7 @@ Chọn trình quản lý tệp + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. Trình quản lý ngày tháng @@ -380,6 +381,8 @@ Đường dẫn quản lý tệp Đối số cho thư mục Đối số cho tệp + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error Trình duyệt web tiêu chuẩn @@ -473,6 +476,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Lỗi + An error occurred while opening the folder. {0} + Cảnh báo nhỏ... diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml index bd3142992..f6576070f 100644 --- a/Flow.Launcher/Languages/zh-cn.xaml +++ b/Flow.Launcher/Languages/zh-cn.xaml @@ -371,6 +371,7 @@ 默认文件管理器 + Learn more 请指定您使用的文件管理器的文件位置并根据需要添加参数。“%d”表示要打开的目录路径,由文件夹字段的参数和打开特定目录的命令使用。“%f”表示要打开的文件路径,由文件字段的参数和打开特定文件的命令使用。 例如,如果文件管理器使用诸如“totalcmd.exe /A c:\windows”之类的命令来打开 c:\windows 目录,则文件管理器路径将为 totalcmd.exe,文件夹参数将为 /A "%d"。某些文件管理器(如 QTTabBar)可能只需要提供路径,在本例中,使用“%d”作为文件管理器路径,其余字段留空。 文件管理器 @@ -378,6 +379,8 @@ 文件管理器路径 文件夹路径参数 选中文件路径参数 + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error 默认浏览器 @@ -469,6 +472,14 @@ 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + 错误 + An error occurred while opening the folder. {0} + 请稍等... diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml index 1a71ae135..42810f590 100644 --- a/Flow.Launcher/Languages/zh-tw.xaml +++ b/Flow.Launcher/Languages/zh-tw.xaml @@ -371,6 +371,7 @@ 選擇檔案管理器 + Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. 檔案管理器 @@ -378,6 +379,8 @@ 檔案管理器路徑 資料夾參數 檔案參數 + The file manager '{0}' could not be located at '{1}'. Would you like to continue? + File Manager Path Error 預設瀏覽器 @@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in 1. Upload log file: {0} 2. Copy below exception message + + File Manager Error + + The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + + Error + An error occurred while opening the folder. {0} + 請稍後... diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx index 2e2de0681..91be8a392 100644 --- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx +++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx @@ -456,7 +456,7 @@ Area Personalization - + The command to direct start a setting @@ -1117,7 +1117,7 @@ Area Control Panel (legacy settings) - + password.cpl @@ -1572,7 +1572,7 @@ Area Control Panel (legacy settings) - + Means The "Windows Version" From 90ad72ca30ca7e99e3e84c4cac4e507f91b47a4c Mon Sep 17 00:00:00 2001 From: 01Dri Date: Fri, 23 May 2025 16:33:47 -0300 Subject: [PATCH 353/552] Diff Time in Created At and LastModifiedAt --- .../Views/PreviewPanel.xaml.cs | 47 ++++++++++++++----- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index aaf1efdc1..1981a8b0e 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -1,4 +1,5 @@ -using System.ComponentModel; +using System; +using System.ComponentModel; using System.Globalization; using System.IO; using System.Runtime.CompilerServices; @@ -65,22 +66,22 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged if (Settings.ShowCreatedDateInPreviewPanel) { - CreatedAt = File - .GetCreationTime(filePath) - .ToString( - $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", - CultureInfo.CurrentCulture - ); + DateTime createdDate = File.GetCreationTime(filePath); + string formattedDate = createdDate.ToString( + $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", + CultureInfo.CurrentCulture + ); + CreatedAt = $"{GetDiffTimeString(createdDate)} - {formattedDate}"; } if (Settings.ShowModifiedDateInPreviewPanel) { - LastModifiedAt = File - .GetLastWriteTime(filePath) - .ToString( - $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", - CultureInfo.CurrentCulture - ); + DateTime lastModifiedDate = File.GetLastWriteTime(filePath); + string formattedDate = lastModifiedDate.ToString( + $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", + CultureInfo.CurrentCulture + ); + LastModifiedAt = $"{GetDiffTimeString(lastModifiedDate)} - {formattedDate}"; } _ = LoadImageAsync(); @@ -90,7 +91,27 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged { PreviewImage = await Main.Context.API.LoadImageAsync(FilePath, true).ConfigureAwait(false); } + + private string GetDiffTimeString(DateTime fileDateTime) + { + DateTime now = DateTime.Now; + TimeSpan difference = now - fileDateTime; + if (difference.TotalDays < 1) + return "Today"; + if (difference.TotalDays < 30) + return $"{(int)difference.TotalDays} days ago"; + + int monthsDiff = (now.Year - fileDateTime.Year) * 12 + now.Month - fileDateTime.Month; + if (monthsDiff < 12) + return monthsDiff == 1 ? "1 month ago" : $"{monthsDiff} months ago"; + + int yearsDiff = now.Year - fileDateTime.Year; + if (now.Month < fileDateTime.Month || (now.Month == fileDateTime.Month && now.Day < fileDateTime.Day)) + yearsDiff--; + + return yearsDiff == 1 ? "1 year ago" : $"{yearsDiff} years ago"; + } public event PropertyChangedEventHandler? PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) From 35e71c6f510256bdad0692919cdbfa1578d5ee87 Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sat, 24 May 2025 00:12:56 -0300 Subject: [PATCH 354/552] Relative Date checkbox --- .../Flow.Launcher.Plugin.Explorer/Languages/en.xaml | 3 +++ .../Languages/pt-br.xaml | 5 +++-- Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs | 3 +++ .../ViewModels/SettingsViewModel.cs | 12 ++++++++++++ .../Views/ExplorerSettings.xaml | 5 +++++ .../Views/PreviewPanel.xaml.cs | 11 ++++++++--- 6 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index 79f8a5848..6680aacff 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -33,6 +33,7 @@ Size Date Created Date Modified + Relative Date Display File Info Date and time format Sort Option: @@ -125,6 +126,8 @@ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches. + + Failed to load Everything SDK diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml index 2754a5a99..59770a29d 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml @@ -29,8 +29,9 @@ Everything Setting Preview Panel Tamanho - Date Created - Date Modified + Data Criação + Data Modificação + Data Relativa Display File Info Date and time format Sort Option: diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs index 3d30bcf29..0a91c024c 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs @@ -66,6 +66,9 @@ namespace Flow.Launcher.Plugin.Explorer public bool ShowCreatedDateInPreviewPanel { get; set; } = true; public bool ShowModifiedDateInPreviewPanel { get; set; } = true; + + public bool ShowRelativeDateInPreviewPanel { get; set; } = true; + public string PreviewPanelDateFormat { get; set; } = "yyyy-MM-dd"; diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs index cf9ebd33f..baa2c6c28 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs @@ -169,6 +169,18 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels } } + public bool ShowRelativeDateInPreviewPanel + { + get => Settings.ShowRelativeDateInPreviewPanel; + set + { + Settings.ShowRelativeDateInPreviewPanel = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(ShowPreviewPanelDateTimeChoices)); + OnPropertyChanged(nameof(PreviewPanelDateTimeChoicesVisibility)); + } + } + public string PreviewPanelDateFormat { get => Settings.PreviewPanelDateFormat; diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml index e5999da41..c16dc4f51 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml @@ -505,6 +505,11 @@ Margin="{StaticResource SettingPanelItemLeftTopBottomMargin}" Content="{DynamicResource plugin_explorer_previewpanel_display_file_modification_checkbox}" IsChecked="{Binding ShowModifiedDateInPreviewPanel}" /> + + diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index 1981a8b0e..aa5ba6cc7 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -71,7 +71,10 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", CultureInfo.CurrentCulture ); - CreatedAt = $"{GetDiffTimeString(createdDate)} - {formattedDate}"; + + string result = formattedDate; + if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}"; + CreatedAt = result; } if (Settings.ShowModifiedDateInPreviewPanel) @@ -81,7 +84,9 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}", CultureInfo.CurrentCulture ); - LastModifiedAt = $"{GetDiffTimeString(lastModifiedDate)} - {formattedDate}"; + string result = formattedDate; + if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}"; + LastModifiedAt = result; } _ = LoadImageAsync(); @@ -92,7 +97,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged PreviewImage = await Main.Context.API.LoadImageAsync(FilePath, true).ConfigureAwait(false); } - private string GetDiffTimeString(DateTime fileDateTime) + private string GetFileAge(DateTime fileDateTime) { DateTime now = DateTime.Now; TimeSpan difference = now - fileDateTime; From 02ddcaa0642a123ee1ac7caf747783651d4fc2f5 Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sat, 24 May 2025 00:15:08 -0300 Subject: [PATCH 355/552] Function name changed to GetRelativeDate --- .../Views/PreviewPanel.xaml.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index aa5ba6cc7..05dfd66f3 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -73,7 +73,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged ); string result = formattedDate; - if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}"; + if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetRelativeDate(createdDate)} - {formattedDate}"; CreatedAt = result; } @@ -85,7 +85,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged CultureInfo.CurrentCulture ); string result = formattedDate; - if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}"; + if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetRelativeDate(lastModifiedDate)} - {formattedDate}"; LastModifiedAt = result; } @@ -97,7 +97,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged PreviewImage = await Main.Context.API.LoadImageAsync(FilePath, true).ConfigureAwait(false); } - private string GetFileAge(DateTime fileDateTime) + private string GetRelativeDate(DateTime fileDateTime) { DateTime now = DateTime.Now; TimeSpan difference = now - fileDateTime; From a711ce4ec793158c6586ec70e5e0cd913c77319b Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sat, 24 May 2025 01:10:12 -0300 Subject: [PATCH 356/552] Translate pt br --- Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml index 59770a29d..3ab958506 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml @@ -29,8 +29,8 @@ Everything Setting Preview Panel Tamanho - Data Criação - Data Modificação + Data de Criação + Data de Modificação Data Relativa Display File Info Date and time format From b2f5713386d4a8a702c91b461f25de1598865776 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 24 May 2025 13:10:25 +0800 Subject: [PATCH 357/552] =?UTF-8?q?Fix=20crash=20on=20=C3=9732=20devices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NativeMethods.txt | 2 +- .../PInvokeExtensions.cs | 26 ++++++++++++++++--- Flow.Launcher.Infrastructure/Win32Helper.cs | 6 ++--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt index 0e50420b0..c01532414 100644 --- a/Flow.Launcher.Infrastructure/NativeMethods.txt +++ b/Flow.Launcher.Infrastructure/NativeMethods.txt @@ -22,7 +22,7 @@ SystemParametersInfo SetForegroundWindow -GetWindowLong +WINDOW_LONG_PTR_INDEX GetForegroundWindow GetDesktopWindow GetShellWindow diff --git a/Flow.Launcher.Infrastructure/PInvokeExtensions.cs b/Flow.Launcher.Infrastructure/PInvokeExtensions.cs index 1a72ab7a6..18b992043 100644 --- a/Flow.Launcher.Infrastructure/PInvokeExtensions.cs +++ b/Flow.Launcher.Infrastructure/PInvokeExtensions.cs @@ -4,14 +4,16 @@ using Windows.Win32.UI.WindowsAndMessaging; namespace Windows.Win32; -// Edited from: https://github.com/files-community/Files internal static partial class PInvoke { + // SetWindowLong + // Edited from: https://github.com/files-community/Files + [DllImport("User32", EntryPoint = "SetWindowLongW", ExactSpelling = true)] - static extern int _SetWindowLong(HWND hWnd, int nIndex, int dwNewLong); + private static extern int _SetWindowLong(HWND hWnd, int nIndex, int dwNewLong); [DllImport("User32", EntryPoint = "SetWindowLongPtrW", ExactSpelling = true)] - static extern nint _SetWindowLongPtr(HWND hWnd, int nIndex, nint dwNewLong); + private static extern nint _SetWindowLongPtr(HWND hWnd, int nIndex, nint dwNewLong); // NOTE: // CsWin32 doesn't generate SetWindowLong on other than x86 and vice versa. @@ -22,4 +24,22 @@ internal static partial class PInvoke ? _SetWindowLong(hWnd, (int)nIndex, (int)dwNewLong) : _SetWindowLongPtr(hWnd, (int)nIndex, dwNewLong); } + + // GetWindowLong + + [DllImport("User32", EntryPoint = "GetWindowLongW", ExactSpelling = true)] + private static extern int _GetWindowLong(HWND hWnd, int nIndex); + + [DllImport("User32", EntryPoint = "GetWindowLongPtrW", ExactSpelling = true)] + private static extern nint _GetWindowLongPtr(HWND hWnd, int nIndex); + + // NOTE: + // CsWin32 doesn't generate GetWindowLong on other than x86 and vice versa. + // For more info, visit https://github.com/microsoft/CsWin32/issues/882 + public static unsafe nint GetWindowLongPtr(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex) + { + return sizeof(nint) is 4 + ? _GetWindowLong(hWnd, (int)nIndex) + : _GetWindowLongPtr(hWnd, (int)nIndex); + } } diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs index 783ade14e..dad5f2f93 100644 --- a/Flow.Launcher.Infrastructure/Win32Helper.cs +++ b/Flow.Launcher.Infrastructure/Win32Helper.cs @@ -192,9 +192,9 @@ namespace Flow.Launcher.Infrastructure SetWindowStyle(hwnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE, style); } - private static int GetWindowStyle(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex) + private static nint GetWindowStyle(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex) { - var style = PInvoke.GetWindowLong(hWnd, nIndex); + var style = PInvoke.GetWindowLongPtr(hWnd, nIndex); if (style == 0 && Marshal.GetLastPInvokeError() != 0) { throw new Win32Exception(Marshal.GetLastPInvokeError()); @@ -202,7 +202,7 @@ namespace Flow.Launcher.Infrastructure return style; } - private static nint SetWindowStyle(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, int dwNewLong) + private static nint SetWindowStyle(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, nint dwNewLong) { PInvoke.SetLastError(WIN32_ERROR.NO_ERROR); // Clear any existing error From f6103b1105d9c741c87ed0f954622c271a87620a Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sat, 24 May 2025 03:16:03 -0300 Subject: [PATCH 358/552] Relative Date -> File Age --- Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml | 2 +- Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml | 2 +- Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs | 2 +- .../ViewModels/SettingsViewModel.cs | 6 +++--- .../Views/ExplorerSettings.xaml | 4 ++-- .../Views/PreviewPanel.xaml.cs | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index 6680aacff..aa86d96cf 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -33,7 +33,7 @@ Size Date Created Date Modified - Relative Date + File Age Display File Info Date and time format Sort Option: diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml index 3ab958506..ca7d9b48e 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml @@ -31,7 +31,7 @@ Tamanho Data de Criação Data de Modificação - Data Relativa + Idade do Arquivo Display File Info Date and time format Sort Option: diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs index 0a91c024c..158cf0347 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs @@ -67,7 +67,7 @@ namespace Flow.Launcher.Plugin.Explorer public bool ShowModifiedDateInPreviewPanel { get; set; } = true; - public bool ShowRelativeDateInPreviewPanel { get; set; } = true; + public bool ShowFileAgeInPreviewPanel { get; set; } = true; public string PreviewPanelDateFormat { get; set; } = "yyyy-MM-dd"; diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs index baa2c6c28..fb33dacab 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs @@ -169,12 +169,12 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels } } - public bool ShowRelativeDateInPreviewPanel + public bool ShowFileAgeInPreviewPanel { - get => Settings.ShowRelativeDateInPreviewPanel; + get => Settings.ShowFileAgeInPreviewPanel; set { - Settings.ShowRelativeDateInPreviewPanel = value; + Settings.ShowFileAgeInPreviewPanel = value; OnPropertyChanged(); OnPropertyChanged(nameof(ShowPreviewPanelDateTimeChoices)); OnPropertyChanged(nameof(PreviewPanelDateTimeChoicesVisibility)); diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml index c16dc4f51..4302e721a 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml @@ -508,8 +508,8 @@ + Content="{DynamicResource plugin_explorer_previewpanel_display_file_age_checkbox}" + IsChecked="{Binding ShowFileAgeInPreviewPanel}" /> diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index 05dfd66f3..801510eb7 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -73,7 +73,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged ); string result = formattedDate; - if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetRelativeDate(createdDate)} - {formattedDate}"; + if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetRelativeDate(createdDate)} - {formattedDate}"; CreatedAt = result; } @@ -85,7 +85,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged CultureInfo.CurrentCulture ); string result = formattedDate; - if (Settings.ShowRelativeDateInPreviewPanel) result = $"{GetRelativeDate(lastModifiedDate)} - {formattedDate}"; + if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetRelativeDate(lastModifiedDate)} - {formattedDate}"; LastModifiedAt = result; } From d726455b047c380179243ff85ee132e7d601ba0c Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sat, 24 May 2025 03:16:51 -0300 Subject: [PATCH 359/552] Relative Date - FileAge --- .../Views/PreviewPanel.xaml.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index 801510eb7..28ceb5e96 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -73,7 +73,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged ); string result = formattedDate; - if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetRelativeDate(createdDate)} - {formattedDate}"; + if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}"; CreatedAt = result; } @@ -85,7 +85,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged CultureInfo.CurrentCulture ); string result = formattedDate; - if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetRelativeDate(lastModifiedDate)} - {formattedDate}"; + if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}"; LastModifiedAt = result; } @@ -97,7 +97,7 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged PreviewImage = await Main.Context.API.LoadImageAsync(FilePath, true).ConfigureAwait(false); } - private string GetRelativeDate(DateTime fileDateTime) + private string GetFileAge(DateTime fileDateTime) { DateTime now = DateTime.Now; TimeSpan difference = now - fileDateTime; From 2ff0fc8a7d8de2306229f8439b530932974f4519 Mon Sep 17 00:00:00 2001 From: DB p Date: Sat, 24 May 2025 15:28:51 +0900 Subject: [PATCH 360/552] Disable ShowFileAgeInPreviewPanel by default --- Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs index 158cf0347..49ad2d358 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs @@ -67,7 +67,7 @@ namespace Flow.Launcher.Plugin.Explorer public bool ShowModifiedDateInPreviewPanel { get; set; } = true; - public bool ShowFileAgeInPreviewPanel { get; set; } = true; + public bool ShowFileAgeInPreviewPanel { get; set; } = false; public string PreviewPanelDateFormat { get; set; } = "yyyy-MM-dd"; From 03d3c9292dcfc3814a890b9e0806e975f3abff59 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 24 May 2025 15:55:37 +0800 Subject: [PATCH 361/552] Fix blnak lie --- Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml | 2 -- Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs | 1 - 2 files changed, 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index aa86d96cf..ca994455a 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -126,8 +126,6 @@ Use '>' to search in this directory, '*' to search for file extensions or '>*' to combine both searches. - - Failed to load Everything SDK diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs index 49ad2d358..4f83fc72e 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs @@ -27,7 +27,6 @@ namespace Flow.Launcher.Plugin.Explorer public string ExcludedFileTypes { get; set; } = ""; - public bool UseLocationAsWorkingDir { get; set; } = false; public bool ShowInlinedWindowsContextMenu { get; set; } = false; From 65e0a0220b07bf58ff6ffed2a796ea1094a66b5c Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 24 May 2025 15:56:02 +0800 Subject: [PATCH 362/552] Revert changes in pt-br.xaml --- Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml index ca7d9b48e..2754a5a99 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/pt-br.xaml @@ -29,9 +29,8 @@ Everything Setting Preview Panel Tamanho - Data de Criação - Data de Modificação - Idade do Arquivo + Date Created + Date Modified Display File Info Date and time format Sort Option: From 0f718e5d920bab13a285f42b4fb9ac83c759a9af Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 24 May 2025 15:59:24 +0800 Subject: [PATCH 363/552] Code quality --- .../Views/PreviewPanel.xaml.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index 28ceb5e96..eabe1ad41 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -97,26 +97,27 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged PreviewImage = await Main.Context.API.LoadImageAsync(FilePath, true).ConfigureAwait(false); } - private string GetFileAge(DateTime fileDateTime) + private static string GetFileAge(DateTime fileDateTime) { - DateTime now = DateTime.Now; - TimeSpan difference = now - fileDateTime; + var now = DateTime.Now; + var difference = now - fileDateTime; if (difference.TotalDays < 1) return "Today"; if (difference.TotalDays < 30) return $"{(int)difference.TotalDays} days ago"; - int monthsDiff = (now.Year - fileDateTime.Year) * 12 + now.Month - fileDateTime.Month; + var monthsDiff = (now.Year - fileDateTime.Year) * 12 + now.Month - fileDateTime.Month; if (monthsDiff < 12) return monthsDiff == 1 ? "1 month ago" : $"{monthsDiff} months ago"; - int yearsDiff = now.Year - fileDateTime.Year; + var yearsDiff = now.Year - fileDateTime.Year; if (now.Month < fileDateTime.Month || (now.Month == fileDateTime.Month && now.Day < fileDateTime.Day)) yearsDiff--; return yearsDiff == 1 ? "1 year ago" : $"{yearsDiff} years ago"; } + public event PropertyChangedEventHandler? PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) From 62d7256db43d03eb56084fe82e21641ef8fa1ceb Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 24 May 2025 16:07:15 +0800 Subject: [PATCH 364/552] Support transaltion for preview information --- .../Flow.Launcher.Plugin.Explorer/Languages/en.xaml | 8 ++++++++ .../Views/PreviewPanel.xaml.cs | 11 +++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index ca994455a..eefd6f4eb 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -167,4 +167,12 @@ Display native context menu (experimental) Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + + + Today + {0} days ago + 1 month ago + {0} months ago + 1 year ago + {0} years ago diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs index eabe1ad41..e1a957199 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs @@ -103,19 +103,22 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged var difference = now - fileDateTime; if (difference.TotalDays < 1) - return "Today"; + return Main.Context.API.GetTranslation("Today"); if (difference.TotalDays < 30) - return $"{(int)difference.TotalDays} days ago"; + return string.Format(Main.Context.API.GetTranslation("DaysAgo"), (int)difference.TotalDays); var monthsDiff = (now.Year - fileDateTime.Year) * 12 + now.Month - fileDateTime.Month; + if (monthsDiff == 1) + return Main.Context.API.GetTranslation("OneMonthAgo"); if (monthsDiff < 12) - return monthsDiff == 1 ? "1 month ago" : $"{monthsDiff} months ago"; + return string.Format(Main.Context.API.GetTranslation("MonthsAgo"), monthsDiff); var yearsDiff = now.Year - fileDateTime.Year; if (now.Month < fileDateTime.Month || (now.Month == fileDateTime.Month && now.Day < fileDateTime.Day)) yearsDiff--; - return yearsDiff == 1 ? "1 year ago" : $"{yearsDiff} years ago"; + return yearsDiff == 1 ? Main.Context.API.GetTranslation("OneYearAgo") : + string.Format(Main.Context.API.GetTranslation("YearsAgo"), yearsDiff); } public event PropertyChangedEventHandler? PropertyChanged; From de7438791ce0374975444eb0adb7b646b908463f Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 25 May 2025 09:14:19 +0800 Subject: [PATCH 365/552] Fix argument null exception when updating plugin directories for errornous plugins --- Flow.Launcher.Core/Plugin/PluginManager.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index aae8dd764..300603c69 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -187,11 +187,19 @@ namespace Flow.Launcher.Core.Plugin { if (AllowedLanguage.IsDotNet(metadata.Language)) { + if (string.IsNullOrEmpty(metadata.AssemblyName)) + { + continue; // Skip if AssemblyName is not set, which can happen for errornous plugins + } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.AssemblyName); metadata.PluginCacheDirectoryPath = Path.Combine(DataLocation.PluginCacheDirectory, metadata.AssemblyName); } else { + if (string.IsNullOrEmpty(metadata.Name)) + { + continue; // Skip if Name is not set, which can happen for errornous plugins + } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.Name); metadata.PluginCacheDirectoryPath = Path.Combine(DataLocation.PluginCacheDirectory, metadata.Name); } From 0d785d1c9ce819a0b0c7afe8f0110c947f727031 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 25 May 2025 09:17:31 +0800 Subject: [PATCH 366/552] Fix typos --- Flow.Launcher.Core/Plugin/PluginManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 300603c69..2689369f8 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -189,7 +189,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.AssemblyName)) { - continue; // Skip if AssemblyName is not set, which can happen for errornous plugins + continue; // Skip if AssemblyName is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.AssemblyName); metadata.PluginCacheDirectoryPath = Path.Combine(DataLocation.PluginCacheDirectory, metadata.AssemblyName); @@ -198,7 +198,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.Name)) { - continue; // Skip if Name is not set, which can happen for errornous plugins + continue; // Skip if Name is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.Name); metadata.PluginCacheDirectoryPath = Path.Combine(DataLocation.PluginCacheDirectory, metadata.Name); From 025895508326602066d1badf741182a91988ab26 Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Sun, 25 May 2025 09:19:41 +0800 Subject: [PATCH 367/552] Log a warning when encountering an empty Name Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Flow.Launcher.Core/Plugin/PluginManager.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 2689369f8..54b74da39 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -198,6 +198,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.Name)) { + Log.Warn($"Plugin with empty Name encountered. Skipping plugin initialization. Metadata: {metadata}"); continue; // Skip if Name is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.Name); From 9e666f95ea6044b855f423c980f0db2090f6ff5f Mon Sep 17 00:00:00 2001 From: Jack Ye <1160210343@qq.com> Date: Sun, 25 May 2025 09:19:54 +0800 Subject: [PATCH 368/552] Log a warning when encountering an empty AssemblyName Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Flow.Launcher.Core/Plugin/PluginManager.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index 54b74da39..c4e505ad0 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -189,6 +189,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.AssemblyName)) { + Log.Warn($"Plugin skipped: AssemblyName is empty for plugin with metadata: {metadata.Name}", typeof(PluginManager)); continue; // Skip if AssemblyName is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.AssemblyName); From 50780db9f54c1b2eef27859a9583fd75d85ff626 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 25 May 2025 09:20:57 +0800 Subject: [PATCH 369/552] Fix build issue --- Flow.Launcher.Core/Plugin/PluginManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginManager.cs b/Flow.Launcher.Core/Plugin/PluginManager.cs index c4e505ad0..9b525f331 100644 --- a/Flow.Launcher.Core/Plugin/PluginManager.cs +++ b/Flow.Launcher.Core/Plugin/PluginManager.cs @@ -189,7 +189,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.AssemblyName)) { - Log.Warn($"Plugin skipped: AssemblyName is empty for plugin with metadata: {metadata.Name}", typeof(PluginManager)); + API.LogWarn(ClassName, $"AssemblyName is empty for plugin with metadata: {metadata.Name}"); continue; // Skip if AssemblyName is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.AssemblyName); @@ -199,7 +199,7 @@ namespace Flow.Launcher.Core.Plugin { if (string.IsNullOrEmpty(metadata.Name)) { - Log.Warn($"Plugin with empty Name encountered. Skipping plugin initialization. Metadata: {metadata}"); + API.LogWarn(ClassName, $"Name is empty for plugin with metadata: {metadata.Name}"); continue; // Skip if Name is not set, which can happen for erroneous plugins } metadata.PluginSettingsDirectoryPath = Path.Combine(DataLocation.PluginSettingsDirectory, metadata.Name); From 5bae2020313e836ed8c15699cb007f260dce67be Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sun, 25 May 2025 02:34:24 -0300 Subject: [PATCH 370/552] Columns - Path and Name --- .../Views/ExplorerSettings.xaml | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml index 4302e721a..3ef61573d 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml @@ -718,9 +718,27 @@ BorderThickness="1" DragEnter="lbxAccessLinks_DragEnter" Drop="LbxAccessLinks_OnDrop" - ItemTemplate="{StaticResource ListViewTemplateAccessLinks}" ItemsSource="{Binding Settings.QuickAccessLinks}" - SelectedItem="{Binding SelectedQuickAccessLink}" /> + SelectedItem="{Binding SelectedQuickAccessLink, Mode=TwoWay}"> + + + + + + + + + + + + + + + + + + + Date: Sun, 25 May 2025 02:34:48 -0300 Subject: [PATCH 371/552] AccessLink Refactor --- .../Search/QuickAccessLinks/AccessLink.cs | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs index 1975211f9..8650b4c4c 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Search/QuickAccessLinks/AccessLink.cs @@ -9,21 +9,20 @@ namespace Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks public string Path { get; set; } public ResultType Type { get; set; } = ResultType.Folder; - - [JsonIgnore] - public string Name + + public string Name { get; set; } + + private string GetPathName() { - get - { - var path = Path.EndsWith(Constants.DirectorySeparator) ? Path[0..^1] : Path; + var path = Path.EndsWith(Constants.DirectorySeparator) ? Path[0..^1] : Path; - if (path.EndsWith(':')) - return path[0..^1] + " Drive"; + if (path.EndsWith(':')) + return path[0..^1] + " Drive"; - return path.Split(new[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.None) - .Last(); - } + return path.Split(new[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.None) + .Last(); } + } } From 179babe31371c27e55108c42e4e216ad595c6643 Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sun, 25 May 2025 02:35:09 -0300 Subject: [PATCH 372/552] New window to add/edit quick access link --- .../Languages/en.xaml | 1 + .../Views/QuickAccessLinkSettings.xaml | 136 ++++++++++++++++++ .../Views/QuickAccessLinkSettings.xaml.cs | 114 +++++++++++++++ 3 files changed, 251 insertions(+) create mode 100644 Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml create mode 100644 Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index eefd6f4eb..960373ef1 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -92,6 +92,7 @@ Permanently delete current file Permanently delete current folder Path: + Name: Delete the selected Run as different user Run the selected using a different user account diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml new file mode 100644 index 000000000..e6ad44e4e --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs new file mode 100644 index 000000000..9d2c54e2d --- /dev/null +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Windows; +using System.Windows.Forms; +using Flow.Launcher.Plugin.Explorer.Search; +using Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks; + +namespace Flow.Launcher.Plugin.Explorer.Views; + +public partial class QuickAccessLinkSettings : INotifyPropertyChanged +{ + + private string _selectedPath; + public string SelectedPath + { + get => _selectedPath; + set + { + if (_selectedPath != value) + { + _selectedPath = value; + OnPropertyChanged(); + SelectedName = GetPathName(); + } + } + } + + + private string _selectedName; + public string SelectedName + { + get => _selectedName; + set + { + if (_selectedName != value) + { + _selectedName = value; + OnPropertyChanged(); + } + } + } + + + public QuickAccessLinkSettings() + { + InitializeComponent(); + } + + + + private void BtnCancel_OnClick(object sender, RoutedEventArgs e) + { + DialogResult = false; + Close(); + } + + private void OnDoneButtonClick(object sender, RoutedEventArgs e) + { + var container = Settings.QuickAccessLinks; + + + // Lembrar de colocar uma logica pra evitar path e name vazios + var newAccessLink = new AccessLink + { + Name = SelectedName, + Path = SelectedPath + }; + container.Add(newAccessLink); + DialogResult = false; + Close(); + } + + private void SelectPath_OnClick(object commandParameter, RoutedEventArgs e) + { + var folderBrowserDialog = new FolderBrowserDialog(); + + if (folderBrowserDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK) + return; + + SelectedPath = folderBrowserDialog.SelectedPath; + } + + private string GetPathName() + { + if (string.IsNullOrEmpty(SelectedPath)) return ""; + var path = SelectedPath.EndsWith(Constants.DirectorySeparator) ? SelectedPath[0..^1] : SelectedPath; + + if (path.EndsWith(':')) + return path[0..^1] + " Drive"; + + return path.Split(new[] { Path.DirectorySeparatorChar }, StringSplitOptions.None) + .Last(); + } + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + protected bool SetField(ref T field, T value, [CallerMemberName] string propertyName = null) + { + if (EqualityComparer.Default.Equals(field, value)) return false; + field = value; + OnPropertyChanged(propertyName); + return true; + } +} + From 3777e2b6d86bfa2f689c942ee9bbf186dc50138d Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sun, 25 May 2025 02:36:55 -0300 Subject: [PATCH 373/552] Changing QuickAccessLinks property to static This change is necessary for quick access settings window --- Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs index 4f83fc72e..2380a1ec9 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs @@ -15,7 +15,7 @@ namespace Flow.Launcher.Plugin.Explorer { public int MaxResult { get; set; } = 100; - public ObservableCollection QuickAccessLinks { get; set; } = new(); + public static ObservableCollection QuickAccessLinks { get; set; } = new(); public ObservableCollection IndexSearchExcludedSubdirectoryPaths { get; set; } = new ObservableCollection(); From 61aca7409668890b1a55a14457ec02f0414d1209 Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sun, 25 May 2025 02:41:17 -0300 Subject: [PATCH 374/552] Separating add commands between QuickAccessLink and IndexSearchExcludedPaths --- .../ViewModels/SettingsViewModel.cs | 27 ++++++++++--------- .../Views/ExplorerSettings.xaml | 4 +-- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs index fb33dacab..508e20893 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs @@ -365,27 +365,28 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels } [RelayCommand] - private void AddLink(object commandParameter) + private void AddQuickAccessLink(object commandParameter) { - var container = commandParameter switch - { - "QuickAccessLink" => Settings.QuickAccessLinks, - "IndexSearchExcludedPaths" => Settings.IndexSearchExcludedSubdirectoryPaths, - _ => throw new ArgumentOutOfRangeException(nameof(commandParameter)) - }; - - ArgumentNullException.ThrowIfNull(container); - + var quickAccessLinkSettings = new QuickAccessLinkSettings(); + quickAccessLinkSettings.ShowDialog(); + } + + + [RelayCommand] + private void AddIndexSearchExcludePaths(object commandParameter) + { + var container = Settings.IndexSearchExcludedSubdirectoryPaths; + var folderBrowserDialog = new FolderBrowserDialog(); - + if (folderBrowserDialog.ShowDialog() != DialogResult.OK) return; - + var newAccessLink = new AccessLink { Path = folderBrowserDialog.SelectedPath }; - + container.Add(newAccessLink); } diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml index 3ef61573d..07f05b1c1 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml @@ -762,7 +762,7 @@ From bc2648c216b4ee485c584bd81e1abb3ada9ba3cb Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sun, 25 May 2025 16:05:26 -0300 Subject: [PATCH 382/552] Code quality --- .../ViewModels/SettingsViewModel.cs | 4 ++-- .../Views/QuickAccessLinkSettings.xaml.cs | 23 ++++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs index 447e72736..6237deabb 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs @@ -383,14 +383,14 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels return; } - var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings,SelectedQuickAccessLink); + var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings.QuickAccessLinks,SelectedQuickAccessLink); quickAccessLinkSettings.ShowDialog(); } [RelayCommand] private void AddQuickAccessLink(object commandParameter) { - var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings); + var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings.QuickAccessLinks); quickAccessLinkSettings.ShowDialog(); } diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs index 5eda62558..28cd68bad 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; @@ -53,20 +54,21 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged private bool IsEdit { get; set; } [CanBeNull] private AccessLink SelectedAccessLink { get; set; } - private Settings Settings { get; } - public QuickAccessLinkSettings(Settings settings) + public ObservableCollection QuickAccessLinks { get; set; } + + public QuickAccessLinkSettings(ObservableCollection quickAccessLinks) { - Settings = settings; + QuickAccessLinks = quickAccessLinks; InitializeComponent(); } - public QuickAccessLinkSettings(Settings settings,AccessLink selectedAccessLink) + public QuickAccessLinkSettings(ObservableCollection quickAccessLinks,AccessLink selectedAccessLink) { IsEdit = true; _selectedName = selectedAccessLink.Name; _selectedPath = selectedAccessLink.Path; SelectedAccessLink = selectedAccessLink; - Settings = settings; + QuickAccessLinks = quickAccessLinks; InitializeComponent(); } @@ -88,7 +90,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged return; } - if (Settings.QuickAccessLinks.Any(x => x.Path == SelectedPath && x.Name == SelectedName)) + if (QuickAccessLinks.Any(x => x.Path == SelectedPath && x.Name == SelectedName)) { var warning = Main.Context.API.GetTranslation("plugin_explorer_quick_access_link_select_different_folder"); Main.Context.API.ShowMsgBox(warning); @@ -99,9 +101,8 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged EditAccessLink(); return; } - var container = Settings.QuickAccessLinks; var newAccessLink = new AccessLink { Name = SelectedName, Path = SelectedPath }; - container.Add(newAccessLink); + QuickAccessLinks.Add(newAccessLink); DialogResult = false; Close(); } @@ -120,12 +121,12 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged { if (SelectedAccessLink == null)throw new ArgumentException("Access Link object is null"); - var obj = Settings.QuickAccessLinks.FirstOrDefault(x => x.GetHashCode() == SelectedAccessLink.GetHashCode()); - int index = Settings.QuickAccessLinks.IndexOf(obj); + var obj = QuickAccessLinks.FirstOrDefault(x => x.GetHashCode() == SelectedAccessLink.GetHashCode()); + int index = QuickAccessLinks.IndexOf(obj); if (index >= 0) { SelectedAccessLink = new AccessLink { Name = SelectedName, Path = SelectedPath }; - Settings.QuickAccessLinks[index] = SelectedAccessLink; + QuickAccessLinks[index] = SelectedAccessLink; } DialogResult = false; IsEdit = false; From cd62e7b5dc4695a83339d2a02c9682603d775479 Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sun, 25 May 2025 16:11:03 -0300 Subject: [PATCH 383/552] uP --- .../Helper/{FolderPathHelper.cs => PathHelper.cs} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename Plugins/Flow.Launcher.Plugin.Explorer/Helper/{FolderPathHelper.cs => PathHelper.cs} (94%) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/FolderPathHelper.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/PathHelper.cs similarity index 94% rename from Plugins/Flow.Launcher.Plugin.Explorer/Helper/FolderPathHelper.cs rename to Plugins/Flow.Launcher.Plugin.Explorer/Helper/PathHelper.cs index 74e23be3a..36b098d1e 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Helper/FolderPathHelper.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Helper/PathHelper.cs @@ -5,7 +5,7 @@ using Flow.Launcher.Plugin.Explorer.Search; namespace Flow.Launcher.Plugin.Explorer.Helper; -public static class FolderPathHelper +public static class PathHelper { public static string GetPathName(this string selectedPath) { From 29831d61bb2b496b88ecd8588c0518e506d7ea3e Mon Sep 17 00:00:00 2001 From: 01Dri Date: Sun, 25 May 2025 16:48:20 -0300 Subject: [PATCH 384/552] AI Review Refactor suggestion --- .../Languages/en.xaml | 2 +- .../ViewModels/SettingsViewModel.cs | 10 ++++---- .../Views/QuickAccessLinkSettings.xaml.cs | 23 ++++++++++--------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml index ef55a4088..cc6b58e42 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml @@ -6,7 +6,7 @@ Please make a selection first Please select a folder path. - Please choose a different name or folder path. + Please choose a different name or folder path. Please select a folder link Are you sure you want to delete {0}? Are you sure you want to permanently delete this file? diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs index 6237deabb..d6effb4e2 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs @@ -9,6 +9,7 @@ using System.Linq; using System.Windows; using System.Windows.Forms; using CommunityToolkit.Mvvm.Input; +using Flow.Launcher.Plugin.Explorer.Helper; using Flow.Launcher.Plugin.Explorer.Search; using Flow.Launcher.Plugin.Explorer.Search.Everything; using Flow.Launcher.Plugin.Explorer.Search.Everything.Exceptions; @@ -352,7 +353,7 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels collection.Remove(SelectedIndexSearchExcludedPath); collection.Add(new AccessLink { - Path = path, Type = selectedType, + Path = path, Type = selectedType, Name = path.GetPathName() }); } @@ -368,10 +369,12 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels var newAccessLink = new AccessLink { + Name = folderBrowserDialog.SelectedPath.GetPathName(), Path = folderBrowserDialog.SelectedPath }; container.Add(newAccessLink); + Save(); } [RelayCommand] @@ -382,16 +385,15 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels ShowUnselectedMessage(); return; } - var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings.QuickAccessLinks,SelectedQuickAccessLink); - quickAccessLinkSettings.ShowDialog(); + if (quickAccessLinkSettings.ShowDialog() == true) Save(); } [RelayCommand] private void AddQuickAccessLink(object commandParameter) { var quickAccessLinkSettings = new QuickAccessLinkSettings(Settings.QuickAccessLinks); - quickAccessLinkSettings.ShowDialog(); + if (quickAccessLinkSettings.ShowDialog() == true) Save(); } diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs index 28cd68bad..388fc2c91 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs @@ -52,9 +52,9 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged } private bool IsEdit { get; set; } - [CanBeNull] private AccessLink SelectedAccessLink { get; set; } + [CanBeNull] private AccessLink SelectedAccessLink { get; } - public ObservableCollection QuickAccessLinks { get; set; } + public ObservableCollection QuickAccessLinks { get; } public QuickAccessLinkSettings(ObservableCollection quickAccessLinks) { @@ -89,10 +89,12 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged Main.Context.API.ShowMsgBox(warning); return; } - - if (QuickAccessLinks.Any(x => x.Path == SelectedPath && x.Name == SelectedName)) + + if (QuickAccessLinks.Any(x => + x.Path.Equals(SelectedPath, StringComparison.OrdinalIgnoreCase) && + x.Name.Equals(SelectedName, StringComparison.OrdinalIgnoreCase))) { - var warning = Main.Context.API.GetTranslation("plugin_explorer_quick_access_link_select_different_folder"); + var warning = Main.Context.API.GetTranslation("plugin_explorer_quick_access_link_path_already_exists"); Main.Context.API.ShowMsgBox(warning); return; } @@ -103,7 +105,7 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged } var newAccessLink = new AccessLink { Name = SelectedName, Path = SelectedPath }; QuickAccessLinks.Add(newAccessLink); - DialogResult = false; + DialogResult = true; Close(); } @@ -121,14 +123,13 @@ public partial class QuickAccessLinkSettings : INotifyPropertyChanged { if (SelectedAccessLink == null)throw new ArgumentException("Access Link object is null"); - var obj = QuickAccessLinks.FirstOrDefault(x => x.GetHashCode() == SelectedAccessLink.GetHashCode()); - int index = QuickAccessLinks.IndexOf(obj); + var index = QuickAccessLinks.IndexOf(SelectedAccessLink); if (index >= 0) { - SelectedAccessLink = new AccessLink { Name = SelectedName, Path = SelectedPath }; - QuickAccessLinks[index] = SelectedAccessLink; + var updatedLink = new AccessLink { Name = SelectedName, Path = SelectedPath }; + QuickAccessLinks[index] = updatedLink; } - DialogResult = false; + DialogResult = true; IsEdit = false; Close(); } From 47878f3829a9cb10f87d5429d07fad097efec3dd Mon Sep 17 00:00:00 2001 From: DB p Date: Tue, 27 May 2025 14:08:32 +0900 Subject: [PATCH 385/552] Fix file explorer invocation to ensure correct file selection behavior --- Flow.Launcher/PublicAPIInstance.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 66e11f881..93567288c 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -338,7 +338,10 @@ namespace Flow.Launcher // Windows File Manager explorer.StartInfo = new ProcessStartInfo { - FileName = targetPath, + FileName = "explorer.exe", + Arguments = FileNameOrFilePath is null + ? DirectoryPath // only open the directory + : $"/select,\"{targetPath}\"", // open the directory and select the file UseShellExecute = true }; } From 41c5b36fba5aa1a627c153db7fa9f7ffc525dd4b Mon Sep 17 00:00:00 2001 From: DB p Date: Tue, 27 May 2025 15:20:41 +0900 Subject: [PATCH 386/552] Enhance OpenDirectory method to support folder opening and file selection using SHOpenFolderAndSelectItems --- Flow.Launcher/PublicAPIInstance.cs | 99 +++++++++++++++++++++++------- 1 file changed, 76 insertions(+), 23 deletions(-) diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 93567288c..58dbd3ff0 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using System.Net; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using System.Windows; @@ -320,47 +321,98 @@ namespace Flow.Launcher ((PluginJsonStorage)_pluginJsonStorages[type]).Save(); } - public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null) + [DllImport("shell32.dll", CharSet = CharSet.Unicode)] + private static extern int SHParseDisplayName( + [MarshalAs(UnmanagedType.LPWStr)] string name, + IntPtr bindingContext, + out IntPtr pidl, + uint sfgaoIn, + out uint psfgaoOut + ); + + [DllImport("shell32.dll")] + private static extern int SHOpenFolderAndSelectItems( + IntPtr pidlFolder, + uint cidl, + [MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, + uint dwFlags + ); + + [DllImport("ole32.dll")] + private static extern void CoTaskMemFree(IntPtr pv); + + private void OpenFolderAndSelectItem(string filePath) + { + IntPtr pidlFolder = IntPtr.Zero; + IntPtr pidlFile = IntPtr.Zero; + uint attr; + + string folderPath = Path.GetDirectoryName(filePath); + + try + { + SHParseDisplayName(folderPath, IntPtr.Zero, out pidlFolder, 0, out attr); + SHParseDisplayName(filePath, IntPtr.Zero, out pidlFile, 0, out attr); + + if (pidlFolder != IntPtr.Zero && pidlFile != IntPtr.Zero) + { + SHOpenFolderAndSelectItems(pidlFolder, 1, new[] { pidlFile }, 0); + } + } + finally + { + if (pidlFile != IntPtr.Zero) + CoTaskMemFree(pidlFile); + if (pidlFolder != IntPtr.Zero) + CoTaskMemFree(pidlFolder); + } + } + + public void OpenDirectory(string directoryPath, string fileNameOrFilePath = null) { try { - using var explorer = new Process(); + string targetPath = fileNameOrFilePath is null + ? directoryPath + : Path.IsPathRooted(fileNameOrFilePath) + ? fileNameOrFilePath + : Path.Combine(directoryPath, fileNameOrFilePath); + var explorerInfo = _settings.CustomExplorer; var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant(); - var targetPath = FileNameOrFilePath is null - ? DirectoryPath - : Path.IsPathRooted(FileNameOrFilePath) - ? FileNameOrFilePath - : Path.Combine(DirectoryPath, FileNameOrFilePath); if (Path.GetFileNameWithoutExtension(explorerPath) == "explorer") { - // Windows File Manager - explorer.StartInfo = new ProcessStartInfo + if (fileNameOrFilePath is null) { - FileName = "explorer.exe", - Arguments = FileNameOrFilePath is null - ? DirectoryPath // only open the directory - : $"/select,\"{targetPath}\"", // open the directory and select the file - UseShellExecute = true - }; + // 폴더만 열기 + Process.Start(new ProcessStartInfo + { + FileName = directoryPath, + UseShellExecute = true + })?.Dispose(); + } + else + { + // SHOpenFolderAndSelectItems 방식 + OpenFolderAndSelectItem(targetPath); + } } else { - // Custom File Manager - explorer.StartInfo = new ProcessStartInfo + // 커스텀 파일 관리자 + var shellProcess = new ProcessStartInfo { - FileName = explorerInfo.Path.Replace("%d", DirectoryPath), + FileName = explorerInfo.Path.Replace("%d", directoryPath), UseShellExecute = true, - Arguments = FileNameOrFilePath is null - ? explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath) + Arguments = fileNameOrFilePath is null + ? explorerInfo.DirectoryArgument.Replace("%d", directoryPath) : explorerInfo.FileArgument - .Replace("%d", DirectoryPath) + .Replace("%d", directoryPath) .Replace("%f", targetPath) }; + Process.Start(shellProcess)?.Dispose(); } - - explorer.Start(); } catch (Win32Exception ex) when (ex.NativeErrorCode == 2) { @@ -384,6 +436,7 @@ namespace Flow.Launcher } } + private void OpenUri(Uri uri, bool? inPrivate = null) { if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps) From 086aeab6c05f4b2ab13e6d0a8239db7d83c588b1 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 27 May 2025 14:36:09 +0800 Subject: [PATCH 387/552] Use PInvoke to improve code quality --- .../NativeMethods.txt | 4 + Flow.Launcher.Infrastructure/Win32Helper.cs | 31 ++++++++ Flow.Launcher/PublicAPIInstance.cs | 76 ++++--------------- 3 files changed, 50 insertions(+), 61 deletions(-) diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt index 0e50420b0..2591506c8 100644 --- a/Flow.Launcher.Infrastructure/NativeMethods.txt +++ b/Flow.Launcher.Infrastructure/NativeMethods.txt @@ -57,3 +57,7 @@ LOCALE_TRANSIENT_KEYBOARD1 LOCALE_TRANSIENT_KEYBOARD2 LOCALE_TRANSIENT_KEYBOARD3 LOCALE_TRANSIENT_KEYBOARD4 + +SHParseDisplayName +SHOpenFolderAndSelectItems +CoTaskMemFree diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs index 783ade14e..4952eec98 100644 --- a/Flow.Launcher.Infrastructure/Win32Helper.cs +++ b/Flow.Launcher.Infrastructure/Win32Helper.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; +using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Threading; @@ -17,6 +18,7 @@ using Windows.Win32; using Windows.Win32.Foundation; using Windows.Win32.Graphics.Dwm; using Windows.Win32.UI.Input.KeyboardAndMouse; +using Windows.Win32.UI.Shell.Common; using Windows.Win32.UI.WindowsAndMessaging; using Point = System.Windows.Point; using SystemFonts = System.Windows.SystemFonts; @@ -753,5 +755,34 @@ namespace Flow.Launcher.Infrastructure } #endregion + + #region Explorer + + public static unsafe void OpenFolderAndSelectFile(string filePath) + { + ITEMIDLIST* pidlFolder = null; + ITEMIDLIST* pidlFile = null; + + var folderPath = Path.GetDirectoryName(filePath); + + try + { + var hrFolder = PInvoke.SHParseDisplayName(folderPath, null, out pidlFolder, 0, null); + if (hrFolder.Failed) throw new COMException("Failed to parse folder path", hrFolder); + + var hrFile = PInvoke.SHParseDisplayName(filePath, null, out pidlFile, 0, null); + if (hrFile.Failed) throw new COMException("Failed to parse file path", hrFile); + + var hrSelect = PInvoke.SHOpenFolderAndSelectItems(pidlFolder, 1, &pidlFile, 0); + if (hrSelect.Failed) throw new COMException("Failed to open folder and select item", hrSelect); + } + finally + { + if (pidlFile != null) PInvoke.CoTaskMemFree(pidlFile); + if (pidlFolder != null) PInvoke.CoTaskMemFree(pidlFolder); + } + } + + #endregion } } diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 58dbd3ff0..c06c56039 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -8,11 +8,9 @@ using System.IO; using System.Linq; using System.Net; using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using System.Windows; -using System.Windows.Input; using System.Windows.Media; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.Core; @@ -320,88 +318,44 @@ namespace Flow.Launcher ((PluginJsonStorage)_pluginJsonStorages[type]).Save(); } - - [DllImport("shell32.dll", CharSet = CharSet.Unicode)] - private static extern int SHParseDisplayName( - [MarshalAs(UnmanagedType.LPWStr)] string name, - IntPtr bindingContext, - out IntPtr pidl, - uint sfgaoIn, - out uint psfgaoOut - ); - - [DllImport("shell32.dll")] - private static extern int SHOpenFolderAndSelectItems( - IntPtr pidlFolder, - uint cidl, - [MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, - uint dwFlags - ); - - [DllImport("ole32.dll")] - private static extern void CoTaskMemFree(IntPtr pv); - - private void OpenFolderAndSelectItem(string filePath) - { - IntPtr pidlFolder = IntPtr.Zero; - IntPtr pidlFile = IntPtr.Zero; - uint attr; - - string folderPath = Path.GetDirectoryName(filePath); - - try - { - SHParseDisplayName(folderPath, IntPtr.Zero, out pidlFolder, 0, out attr); - SHParseDisplayName(filePath, IntPtr.Zero, out pidlFile, 0, out attr); - - if (pidlFolder != IntPtr.Zero && pidlFile != IntPtr.Zero) - { - SHOpenFolderAndSelectItems(pidlFolder, 1, new[] { pidlFile }, 0); - } - } - finally - { - if (pidlFile != IntPtr.Zero) - CoTaskMemFree(pidlFile); - if (pidlFolder != IntPtr.Zero) - CoTaskMemFree(pidlFolder); - } - } public void OpenDirectory(string directoryPath, string fileNameOrFilePath = null) { try { - string targetPath = fileNameOrFilePath is null + var explorerInfo = _settings.CustomExplorer; + var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant(); + var targetPath = fileNameOrFilePath is null ? directoryPath : Path.IsPathRooted(fileNameOrFilePath) ? fileNameOrFilePath : Path.Combine(directoryPath, fileNameOrFilePath); - var explorerInfo = _settings.CustomExplorer; - var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant(); - if (Path.GetFileNameWithoutExtension(explorerPath) == "explorer") { + // Windows File Manager if (fileNameOrFilePath is null) { - // 폴더만 열기 - Process.Start(new ProcessStartInfo + // Only Open the directory + using var explorer = new Process(); + explorer.StartInfo = new ProcessStartInfo { FileName = directoryPath, UseShellExecute = true - })?.Dispose(); + }; + explorer.Start(); } else { - // SHOpenFolderAndSelectItems 방식 - OpenFolderAndSelectItem(targetPath); + // Open the directory and select the file + Win32Helper.OpenFolderAndSelectFile(targetPath); } } else { - // 커스텀 파일 관리자 - var shellProcess = new ProcessStartInfo + // Custom File Manager + using var explorer = new Process(); + explorer.StartInfo = new ProcessStartInfo { FileName = explorerInfo.Path.Replace("%d", directoryPath), UseShellExecute = true, @@ -411,7 +365,7 @@ namespace Flow.Launcher .Replace("%d", directoryPath) .Replace("%f", targetPath) }; - Process.Start(shellProcess)?.Dispose(); + explorer.Start(); } } catch (Win32Exception ex) when (ex.NativeErrorCode == 2) From eb69ce919e65b7b35fe48722f7a7ba8e9aa49096 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 27 May 2025 14:36:24 +0800 Subject: [PATCH 388/552] Add url comments --- Flow.Launcher.Infrastructure/Win32Helper.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs index 4952eec98..96d8e925b 100644 --- a/Flow.Launcher.Infrastructure/Win32Helper.cs +++ b/Flow.Launcher.Infrastructure/Win32Helper.cs @@ -758,6 +758,8 @@ namespace Flow.Launcher.Infrastructure #region Explorer + // https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shopenfolderandselectitems + public static unsafe void OpenFolderAndSelectFile(string filePath) { ITEMIDLIST* pidlFolder = null; From 489699ca89a86047509a1dc8a8dd180d986d22b1 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 27 May 2025 10:46:07 +0000 Subject: [PATCH 389/552] add update PR script --- .github/update_release_pr.py | 103 +++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 .github/update_release_pr.py diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py new file mode 100644 index 000000000..a9d11651b --- /dev/null +++ b/.github/update_release_pr.py @@ -0,0 +1,103 @@ +import os +import requests + +def get_github_prs(token, owner, repo, milestone, label, state): + """ + Fetches pull requests from a GitHub repository that match a given milestone and label. + + Args: + token (str): GitHub token. + owner (str): The owner of the repository. + repo (str): The name of the repository. + milestone (str): The milestone title. + label (str): The label name. + state (str): State of PR, e.g. open + + Returns: + list: A list of dictionaries, where each dictionary represents a pull request. + Returns an empty list if no PRs are found or an error occurs. + """ + headers = { + "Authorization": f"token {token}", + "Accept": "application/vnd.github.v3+json", + } + + milestone_id = None + milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" + params = {"state": state} + + try: + response = requests.get(milestone_url, headers=headers, params=params) + response.raise_for_status() + milestones = response.json() + for ms in milestones: + if ms["title"] == milestone: + milestone_id = ms["number"] + break + + if not milestone_id: + print(f"Milestone '{milestone}' not found in repository '{owner}/{repo}'.") + return [] + + except requests.exceptions.RequestException as e: + print(f"Error fetching milestones: {e}") + return [] + + prs_url = f"https://api.github.com/repos/{owner}/{repo}/pulls" + params = { + "state": state, + "milestone": milestone_id, + "labels": label, + } + + all_prs = [] + page = 1 + while True: + try: + params["page"] = page + response = requests.get(prs_url, headers=headers, params=params) + response.raise_for_status() # Raise an exception for HTTP errors + prs = response.json() + + if not prs: + break # No more PRs to fetch + + all_prs.extend(prs) + page += 1 + + except requests.exceptions.RequestException as e: + print(f"Error fetching pull requests: {e}") + break + + return all_prs + +if __name__ == "__main__": + github_token = os.environ.get("GITHUB_TOKEN") + + if not github_token: + print("Error: GITHUB_TOKEN environment variable not set.") + exit(1) + + repository_owner = "flow-launcher" + repository_name = "flow.launcher" + target_milestone = "1.20.0" + target_label = "enhancement" + state = "closed" + + print(f"Fetching PRs for {repository_owner}/{repository_name} with milestone '{target_milestone}' and label '{target_label}'...") + + pull_requests = get_github_prs( + github_token, + repository_owner, + repository_name, + target_milestone, + target_label, + state + ) + + if pull_requests: + print(f"\nFound {len(pull_requests)} pull requests:") + for pr in pull_requests: + print(f"- {pr['state']} #{pr['number']}: {pr['title']} (URL: {pr['html_url']})") + else: + print("No matching pull requests found.") From f79a2d24674d7f6f208a6c09c8a60ba98618ea84 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 27 May 2025 11:36:38 +0000 Subject: [PATCH 390/552] change to issues endpoint --- .github/update_release_pr.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index a9d11651b..b51620d73 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -24,7 +24,7 @@ def get_github_prs(token, owner, repo, milestone, label, state): milestone_id = None milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" - params = {"state": state} + params = {"state": open} try: response = requests.get(milestone_url, headers=headers, params=params) @@ -37,17 +37,19 @@ def get_github_prs(token, owner, repo, milestone, label, state): if not milestone_id: print(f"Milestone '{milestone}' not found in repository '{owner}/{repo}'.") - return [] + exit(1) except requests.exceptions.RequestException as e: print(f"Error fetching milestones: {e}") - return [] + exit(1) - prs_url = f"https://api.github.com/repos/{owner}/{repo}/pulls" + # This endpoint allows filtering by milestone and label. A PR in GH's perspective is a type of issue. + prs_url = f"https://api.github.com/repos/{owner}/{repo}/issues" params = { "state": state, "milestone": milestone_id, "labels": label, + "per_page": 100, } all_prs = [] @@ -61,18 +63,19 @@ def get_github_prs(token, owner, repo, milestone, label, state): if not prs: break # No more PRs to fetch - - all_prs.extend(prs) + + # Check for pr key since we are using issues endpoint instead. + all_prs.extend([item for item in prs if "pull_request" in item]) page += 1 except requests.exceptions.RequestException as e: print(f"Error fetching pull requests: {e}") - break + exit(1) return all_prs if __name__ == "__main__": - github_token = os.environ.get("GITHUB_TOKEN") + github_token = os.environ.get("GITHUB_TOKEN") if not github_token: print("Error: GITHUB_TOKEN environment variable not set.") From 55b69c601a12899f054cedab4956a2cb0dcf95e5 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Wed, 28 May 2025 11:20:39 +0000 Subject: [PATCH 391/552] get milestone dynamically --- .github/update_release_pr.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index b51620d73..c00683439 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,7 +1,7 @@ import os import requests -def get_github_prs(token, owner, repo, milestone, label, state): +def get_github_prs(token, owner, repo, label, state): """ Fetches pull requests from a GitHub repository that match a given milestone and label. @@ -9,7 +9,6 @@ def get_github_prs(token, owner, repo, milestone, label, state): token (str): GitHub token. owner (str): The owner of the repository. repo (str): The name of the repository. - milestone (str): The milestone title. label (str): The label name. state (str): State of PR, e.g. open @@ -30,13 +29,19 @@ def get_github_prs(token, owner, repo, milestone, label, state): response = requests.get(milestone_url, headers=headers, params=params) response.raise_for_status() milestones = response.json() + + if len(milestones) > 2: + print("More than two milestones found, unable to determine the milestone required.") + + # milestones.pop() for ms in milestones: - if ms["title"] == milestone: + if ms["title"] != "Future": milestone_id = ms["number"] + print(f"Gathering PRs with milestone {ms['title']}..." ) break if not milestone_id: - print(f"Milestone '{milestone}' not found in repository '{owner}/{repo}'.") + print(f"No suitable milestone found in repository '{owner}/{repo}'.") exit(1) except requests.exceptions.RequestException as e: @@ -83,17 +88,15 @@ if __name__ == "__main__": repository_owner = "flow-launcher" repository_name = "flow.launcher" - target_milestone = "1.20.0" target_label = "enhancement" state = "closed" - print(f"Fetching PRs for {repository_owner}/{repository_name} with milestone '{target_milestone}' and label '{target_label}'...") + print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") pull_requests = get_github_prs( github_token, repository_owner, repository_name, - target_milestone, target_label, state ) From 0b616d8721d432fe940c2683c2edfb9695641bf3 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Wed, 28 May 2025 12:03:13 +0000 Subject: [PATCH 392/552] add pr update --- .github/update_release_pr.py | 84 +++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index c00683439..b03b0c425 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -79,6 +79,53 @@ def get_github_prs(token, owner, repo, label, state): return all_prs +def update_pull_request_description(token, owner, repo, pr_number, new_description): + """ + Updates the description (body) of a GitHub Pull Request. + + Args: + token (str): Token. + owner (str): The owner of the repository. + repo (str): The name of the repository. + pr_number (int): The number of the pull request to update. + new_description (str): The new content for the PR's description. + + Returns: + dict or None: The updated PR object (as a dictionary) if successful, + None otherwise. + """ + headers = { + "Authorization": f"token {token}", + "Accept": "application/vnd.github.v3+json", + "Content-Type": "application/json" + } + + url = f"https://api.github.com/repos/{owner}/{repo}/pulls/{pr_number}" + + payload = { + "body": new_description + } + + print(f"Attempting to update PR #{pr_number} in {owner}/{repo}...") + print(f"URL: {url}") + # print(f"Payload: {payload}") # Uncomment for detailed payload debug + + try: + response = requests.patch(url, headers=headers, json=payload) + response.raise_for_status() + + updated_pr_data = response.json() + print(f"Successfully updated PR #{pr_number}.") + return updated_pr_data + + except requests.exceptions.RequestException as e: + print(f"Error updating pull request #{pr_number}: {e}") + if response is not None: + print(f"Response status code: {response.status_code}") + print(f"Response text: {response.text}") + return None + + if __name__ == "__main__": github_token = os.environ.get("GITHUB_TOKEN") @@ -92,7 +139,7 @@ if __name__ == "__main__": state = "closed" print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") - + pull_requests = get_github_prs( github_token, repository_owner, @@ -101,9 +148,32 @@ if __name__ == "__main__": state ) - if pull_requests: - print(f"\nFound {len(pull_requests)} pull requests:") - for pr in pull_requests: - print(f"- {pr['state']} #{pr['number']}: {pr['title']} (URL: {pr['html_url']})") - else: - print("No matching pull requests found.") + if not pull_requests: + print("No matching pull requests found") + exit(1) + + print(f"\nFound {len(pull_requests)} pull requests:") + + description_content = "" + for pr in pull_requests: + description_content+= f"- {pr['title']} #{pr['number']}\n" + + returned_pr = pull_requests = get_github_prs( + github_token, + repository_owner, + repository_name, + "release", + "open" + ) + + if len(returned_pr) != 1: + print(f"Unable to find the exact release PR. Returned result: {returned_pr}") + exit(1) + + release_pr = returned_pr[0] + + print(f"Found release PR: {release_pr['title']}") + + update_pull_request_description(github_token, repository_owner, repository_name, release_pr["number"], description_content) + + print(description_content) \ No newline at end of file From 4a50eec281e6013301efd5b56eb5c601d3921565 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 30 May 2025 10:59:22 +0800 Subject: [PATCH 393/552] Remove TranslationConverter & project reference in Explorer plugin --- .../Resource/TranslationConverter.cs | 25 ------------------- .../UserSettings/CustomShortcutModel.cs | 8 ++++++ .../Resources/SettingWindowStyle.xaml | 1 - .../Views/SettingsPaneHotkey.xaml | 2 +- .../Flow.Launcher.Plugin.Explorer.csproj | 3 +-- .../ViewModels/ActionKeywordModel.cs | 2 ++ .../Views/ExplorerSettings.xaml | 6 ++--- 7 files changed, 14 insertions(+), 33 deletions(-) delete mode 100644 Flow.Launcher.Core/Resource/TranslationConverter.cs diff --git a/Flow.Launcher.Core/Resource/TranslationConverter.cs b/Flow.Launcher.Core/Resource/TranslationConverter.cs deleted file mode 100644 index eb0032758..000000000 --- a/Flow.Launcher.Core/Resource/TranslationConverter.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using CommunityToolkit.Mvvm.DependencyInjection; -using Flow.Launcher.Plugin; - -namespace Flow.Launcher.Core.Resource -{ - public class TranslationConverter : IValueConverter - { - // 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(); - - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - var key = value.ToString(); - if (string.IsNullOrEmpty(key)) return key; - return API.GetTranslation(key); - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => - throw new InvalidOperationException(); - } -} diff --git a/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs index 2d15b54c5..2603d4675 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/CustomShortcutModel.cs @@ -1,6 +1,8 @@ using System; using System.Text.Json.Serialization; using System.Threading.Tasks; +using CommunityToolkit.Mvvm.DependencyInjection; +using Flow.Launcher.Plugin; namespace Flow.Launcher.Infrastructure.UserSettings { @@ -53,6 +55,12 @@ 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(); + public BaseBuiltinShortcutModel(string key, string description) { Key = key; diff --git a/Flow.Launcher/Resources/SettingWindowStyle.xaml b/Flow.Launcher/Resources/SettingWindowStyle.xaml index fc9246aa3..3ebd22c74 100644 --- a/Flow.Launcher/Resources/SettingWindowStyle.xaml +++ b/Flow.Launcher/Resources/SettingWindowStyle.xaml @@ -6,7 +6,6 @@ - F1 M512,512z M0,0z M448,256C448,150,362,64,256,64L256,448C362,448,448,362,448,256z M0,256A256,256,0,1,1,512,256A256,256,0,1,1,0,256z diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml index b1d72ede5..861e9d294 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml @@ -424,7 +424,7 @@ - + diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj index 98164f489..93691814a 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Flow.Launcher.Plugin.Explorer.csproj @@ -46,6 +46,7 @@ + @@ -53,8 +54,6 @@ - - diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs index d4cd1348e..745032d2c 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/ActionKeywordModel.cs @@ -24,6 +24,8 @@ namespace Flow.Launcher.Plugin.Explorer.Views public string Description { get; private init; } + public string LocalizedDescription => Main.Context.API.GetTranslation(Description); + internal Settings.ActionKeyword KeywordProperty { get; } private void OnPropertyChanged([CallerMemberName] string propertyName = "") diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml index 4302e721a..c034ac0e1 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml @@ -3,7 +3,6 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:converters="clr-namespace:Flow.Launcher.Plugin.Explorer.Views.Converters" - xmlns:core="clr-namespace:Flow.Launcher.Core.Resource;assembly=Flow.Launcher.Core" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:qa="clr-namespace:Flow.Launcher.Plugin.Explorer.Search.QuickAccessLinks" @@ -109,7 +108,7 @@ + Text="{Binding LocalizedDescription, Mode=OneTime}"> + - @@ -163,653 +79,685 @@ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - + + + + + + + + + + + + + + + + + + - + + + + + + + + + \ No newline at end of file diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs new file mode 100644 index 000000000..18c67ac5b --- /dev/null +++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Input; +using Flow.Launcher.Infrastructure.Http; + +namespace Flow.Launcher +{ + public partial class ReleaseNotesWindow : Window + { + public ReleaseNotesWindow() + { + InitializeComponent(); + } + + #region Window Events + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")] + private async void Window_Loaded(object sender, RoutedEventArgs e) + { + RefreshMaximizeRestoreButton(); + MarkdownViewer.Markdown = await GetReleaseNotesMarkdownAsync(); + } + + private void OnCloseExecuted(object sender, ExecutedRoutedEventArgs e) + { + Close(); + } + + #endregion + + #region Window Custom TitleBar + + private void OnMinimizeButtonClick(object sender, RoutedEventArgs e) + { + WindowState = WindowState.Minimized; + } + + private void OnMaximizeRestoreButtonClick(object sender, RoutedEventArgs e) + { + WindowState = WindowState switch + { + WindowState.Maximized => WindowState.Normal, + _ => WindowState.Maximized + }; + } + + private void OnCloseButtonClick(object sender, RoutedEventArgs e) + { + Close(); + } + + private void RefreshMaximizeRestoreButton() + { + if (WindowState == WindowState.Maximized) + { + MaximizeButton.Visibility = Visibility.Hidden; + RestoreButton.Visibility = Visibility.Visible; + } + else + { + MaximizeButton.Visibility = Visibility.Visible; + RestoreButton.Visibility = Visibility.Hidden; + } + } + + private void Window_StateChanged(object sender, EventArgs e) + { + RefreshMaximizeRestoreButton(); + } + + #endregion + + #region Release Notes + + private static async Task GetReleaseNotesMarkdownAsync() + { + var releaseNotesJSON = await Http.GetStringAsync("https://api.github.com/repos/Flow-Launcher/Flow.Launcher/releases"); + var releases = JsonSerializer.Deserialize>(releaseNotesJSON); + + // Get the latest releases + var latestReleases = releases.OrderByDescending(release => release.PublishedDate).Take(3); + + // Build the release notes in Markdown format + var releaseNotesHtmlBuilder = new StringBuilder(string.Empty); + foreach (var release in latestReleases) + { + releaseNotesHtmlBuilder.AppendLine("# " + release.Name); + + // Add unit for images: Replace with + var notes = ImageUnitRegex().Replace(release.ReleaseNotes, m => + { + var prefix = m.Groups[1].Value; + var widthValue = m.Groups[2].Value; + var quote = m.Groups[3].Value; + var suffix = m.Groups[4].Value; + // Only replace if width is number like 500 without units like 500px + if (IsNumber(widthValue)) + return $"{prefix}{widthValue}px{quote}{suffix}"; + return m.Value; + }); + + releaseNotesHtmlBuilder.AppendLine(notes); + releaseNotesHtmlBuilder.AppendLine(" "); + } + + return releaseNotesHtmlBuilder.ToString(); + } + + private static bool IsNumber(string input) + { + if (string.IsNullOrEmpty(input)) + return false; + + foreach (char c in input) + { + if (!char.IsDigit(c)) + return false; + } + return true; + } + + private sealed class GitHubReleaseInfo + { + [JsonPropertyName("published_at")] + public DateTimeOffset PublishedDate { get; set; } + + [JsonPropertyName("name")] + public string Name { get; set; } + + [JsonPropertyName("tag_name")] + public string TagName { get; set; } + + [JsonPropertyName("body")] + public string ReleaseNotes { get; set; } + } + + [GeneratedRegex("(]*width\\s*=\\s*[\"']?)(\\d+)([\"']?)([^>]*>)", RegexOptions.IgnoreCase, "en-GB")] + private static partial Regex ImageUnitRegex(); + + #endregion + } +} From 7117ba05ee4ef544f4bc0c7c648fa3e5f8c25971 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 6 Jun 2025 23:08:41 +0800 Subject: [PATCH 500/552] Test release notes window --- Flow.Launcher/MainWindow.xaml.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index a77d6471c..b266d3dc0 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -132,6 +132,9 @@ namespace Flow.Launcher welcomeWindow.Show(); } + var releaseNotesWindow = new ReleaseNotesWindow(); + releaseNotesWindow.Show(); + // Initialize place holder SetupPlaceholderText(); _viewModel.PlaceholderText = _settings.PlaceholderText; From c241d21a4a9259a3ce1eb50f21b0624c6780cba0 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 6 Jun 2025 23:51:26 +0800 Subject: [PATCH 501/552] Fix height --- Flow.Launcher/ReleaseNotesWindow.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml b/Flow.Launcher/ReleaseNotesWindow.xaml index 132de63c8..e61986aea 100644 --- a/Flow.Launcher/ReleaseNotesWindow.xaml +++ b/Flow.Launcher/ReleaseNotesWindow.xaml @@ -157,7 +157,7 @@ Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="5" - MaxHeight="510" + Height="510" Margin="15 0 20 0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" From af0e1180a5cbc18cba3090f10595e58ab12e7ac6 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 6 Jun 2025 23:52:34 +0800 Subject: [PATCH 502/552] Use loaded event & Add style --- Flow.Launcher/ReleaseNotesWindow.xaml | 3 ++- Flow.Launcher/ReleaseNotesWindow.xaml.cs | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml b/Flow.Launcher/ReleaseNotesWindow.xaml index e61986aea..7b2e5f7e7 100644 --- a/Flow.Launcher/ReleaseNotesWindow.xaml +++ b/Flow.Launcher/ReleaseNotesWindow.xaml @@ -161,7 +161,8 @@ Margin="15 0 20 0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" - ClickAction="SafetyDisplayWithRelativePath" /> + ClickAction="SafetyDisplayWithRelativePath" + Loaded="MarkdownViewer_Loaded" /> diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml.cs b/Flow.Launcher/ReleaseNotesWindow.xaml.cs index 18c67ac5b..4f0c1a9ce 100644 --- a/Flow.Launcher/ReleaseNotesWindow.xaml.cs +++ b/Flow.Launcher/ReleaseNotesWindow.xaml.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Input; using Flow.Launcher.Infrastructure.Http; +using MdXaml; namespace Flow.Launcher { @@ -21,11 +22,9 @@ namespace Flow.Launcher #region Window Events - [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")] - private async void Window_Loaded(object sender, RoutedEventArgs e) + private void Window_Loaded(object sender, RoutedEventArgs e) { RefreshMaximizeRestoreButton(); - MarkdownViewer.Markdown = await GetReleaseNotesMarkdownAsync(); } private void OnCloseExecuted(object sender, ExecutedRoutedEventArgs e) @@ -82,6 +81,11 @@ namespace Flow.Launcher private static async Task GetReleaseNotesMarkdownAsync() { var releaseNotesJSON = await Http.GetStringAsync("https://api.github.com/repos/Flow-Launcher/Flow.Launcher/releases"); + + if (string.IsNullOrEmpty(releaseNotesJSON)) + { + return string.Empty; + } var releases = JsonSerializer.Deserialize>(releaseNotesJSON); // Get the latest releases @@ -145,5 +149,12 @@ namespace Flow.Launcher private static partial Regex ImageUnitRegex(); #endregion + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "")] + private async void MarkdownViewer_Loaded(object sender, RoutedEventArgs e) + { + MarkdownViewer.MarkdownStyle = MarkdownStyle.GithubLike; + MarkdownViewer.Markdown = await GetReleaseNotesMarkdownAsync(); + } } } From 02496214ea2cabbd0037bc83f3e9e03125311222 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 7 Jun 2025 00:07:44 +0800 Subject: [PATCH 503/552] Add progress ring --- Flow.Launcher/ReleaseNotesWindow.xaml | 23 ++++++++++++++++ Flow.Launcher/ReleaseNotesWindow.xaml.cs | 34 +++++++++++++++++++++--- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/ReleaseNotesWindow.xaml b/Flow.Launcher/ReleaseNotesWindow.xaml index 7b2e5f7e7..f70fa6f5c 100644 --- a/Flow.Launcher/ReleaseNotesWindow.xaml +++ b/Flow.Launcher/ReleaseNotesWindow.xaml @@ -163,6 +163,29 @@ VerticalAlignment="Stretch" ClickAction="SafetyDisplayWithRelativePath" Loaded="MarkdownViewer_Loaded" /> + + + + +