Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: BCUninstaller/Bulk-Crap-Uninstaller
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v6.1
Choose a base ref
...
head repository: BCUninstaller/Bulk-Crap-Uninstaller
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v6.2
Choose a head ref

Commits on Mar 6, 2026

  1. Pin System.* packages at 8.* to fix portable self-contained build

    Fixes #864
    Root issue: dotnet/runtime#29663
    Klocman committed Mar 6, 2026
    Copy the full SHA
    05f2c74 View commit details

Commits on Mar 7, 2026

  1. Merge French localization update by Thierry

    Klocman committed Mar 7, 2026
    Copy the full SHA
    3d53b17 View commit details
  2. Fix : Swedish translation causes UI overflow in some windows #810 (#865)

    Leise-Shadow authored Mar 7, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    4ecea11 View commit details

Commits on Jun 8, 2026

  1. Improved publish script (#868)

    tsiakoulias authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    5cf83c4 View commit details
  2. Updated Hungarian translation (#875)

    I've translated the last few strings that were not yet translated. The Hungarian translation is now complete.
    titanicbobo authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    e6c4d31 View commit details
  3. Improve Scoop custom path detection (#892)

    breshinotestachegira authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    2dcf118 View commit details
  4. Improve uninstall list load error handling (#895)

    breshinotestachegira authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    f0e57a5 View commit details
  5. Fix tweak visibility filtering (#898)

    breshinotestachegira authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    fb8f5ad View commit details
  6. Fix orphaned-only view preset (#899)

    breshinotestachegira authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    1059816 View commit details
  7. Add invalid-uninstaller view preset (#903)

    breshinotestachegira authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    744c367 View commit details
  8. Stabilize icon handle ownership (#902)

    breshinotestachegira authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    af9780a View commit details
  9. Fix: Use Directory.GetLastWriteTime instead of GetCreationTime for in…

    …stall date (#908)
    
    When InstallDate is not available in the registry, BCU falls back to using
    file/directory timestamps. The directory's last write time is more accurate
    than creation time as it reflects when files were added during installation.
    
    This improves accuracy for applications like Google Web Designer where the
    registry InstallDate value is not set.
    
    Fixes #886
    AniketDeshmane authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    af1bd83 View commit details
  10. Updated Vietnamese translations (#918)

    wanwanvxt authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    baae38f View commit details
  11. Do not offer to send "no way to uninstall" error messages (#922)

    Klocman authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    a07ac72 View commit details
  12. Ignore ERROR_BAD_CONFIGURATION when listing MSI components (#924)

    Klocman authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    e3eb03c View commit details
  13. Eat InvalidOperationException coming from ListViewGroupAccessibleObje…

    …ct (#925)
    Klocman authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    83983c2 View commit details
  14. Copy the full SHA
    c50c461 View commit details
  15. Ignore disposed owners in LoadingDialog

    Klocman committed Jun 8, 2026
    Copy the full SHA
    8bdabe2 View commit details
  16. Harden BCU console export and size detection (#897)

    breshinotestachegira authored Jun 8, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    7a80f0f View commit details

Commits on Jun 9, 2026

  1. Harden registry factory parsing (#893)

    breshinotestachegira authored Jun 9, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    9d73ccb View commit details
  2. Guard startup uninstall list loading (#927)

    breshinotestachegira authored Jun 9, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    c8b37bc View commit details
  3. Add certificate and integrity columns to app list (#894)

    * Add text status column to app list
    
    * Remove trailing whitespace from status column designer
    
    * Add status column regression tests
    
    * Split status column into certificate and integrity
    
    * Fix build
    
    * Tweak status naming
    
    * Hide the Certificate column if the feature is disabled
    TODO: Split the column from highlighting logic
    
    * Reorder and resize new columns
    
    * Move new strings to resources
    
    * Fix tests
    
    ---------
    
    Co-authored-by: Marcin Szeniak <14913904+Klocman@users.noreply.github.com>
    breshinotestachegira and Klocman authored Jun 9, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    0a457dd View commit details
  4. Build tests on debug and launcher on release

    Klocman committed Jun 9, 2026
    Copy the full SHA
    290748b View commit details
  5. Version up to 6.2

    Klocman committed Jun 9, 2026
    Copy the full SHA
    d4f2e1f View commit details
  6. Installer - Clean up log, caches and settings on BCU uninstallation

    Fixes #896
    Klocman committed Jun 9, 2026
    Copy the full SHA
    b391b5b View commit details
  7. Add building launcher to CI as a test; Undo building launcher in sln …

    …on Release
    Klocman committed Jun 9, 2026
    Copy the full SHA
    f188909 View commit details
  8. BugFix #896 Clean generated files on uninstall (#928)

    * Clean generated files on uninstall
    
    * Simplify the file list
    
    * Re-add CleanLogs.bat
    
    ---------
    
    Co-authored-by: <14913904+Klocman@users.noreply.github.com>
    One-Simon authored Jun 9, 2026

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
    Copy the full SHA
    51d6ca7 View commit details
Showing with 2,508 additions and 1,129 deletions.
  1. +4 −0 .github/workflows/ci.yaml
  2. +63 −0 installer/BcuSetup.iss
  3. +88 −13 publish.bat
  4. +1 −0 source/BulkCrapUninstaller.sln
  5. +15 −11 source/BulkCrapUninstaller/BulkCrapUninstaller.csproj
  6. +3 −2 source/BulkCrapUninstaller/Controls/AdvancedClipboardCopy.vi.resx
  7. +2 −2 source/BulkCrapUninstaller/Controls/FileTargeter.vi.resx
  8. +1 −1 source/BulkCrapUninstaller/Controls/ListLegend.fr.resx
  9. +5 −5 source/BulkCrapUninstaller/Controls/ListLegend.vi.resx
  10. +3 −3 source/BulkCrapUninstaller/Controls/RelatedUninstallerAdder.vi.resx
  11. +10 −10 source/BulkCrapUninstaller/Controls/Settings/AdvancedFilters.cs
  12. +1 −1 source/BulkCrapUninstaller/Controls/Settings/AdvancedFilters.vi.resx
  13. +1 −1 source/BulkCrapUninstaller/Controls/Settings/CacheSettings.fr.resx
  14. +5 −5 source/BulkCrapUninstaller/Controls/Settings/CacheSettings.vi.resx
  15. +13 −11 source/BulkCrapUninstaller/Controls/Settings/PropertiesSidebar.fr.resx
  16. +22 −22 source/BulkCrapUninstaller/Controls/Settings/PropertiesSidebar.vi.resx
  17. +4 −1 source/BulkCrapUninstaller/Controls/Settings/UninstallationSettings.fr.resx
  18. +1 −1 source/BulkCrapUninstaller/Controls/Settings/UninstallationSettings.sv.resx
  19. +19 −16 source/BulkCrapUninstaller/Controls/Settings/UninstallationSettings.vi.resx
  20. +3 −3 source/BulkCrapUninstaller/Controls/UninstallConfirmation.vi.resx
  21. +7 −6 source/BulkCrapUninstaller/EntryPoint.cs
  22. +7 −7 source/BulkCrapUninstaller/Forms/Helpers/FeedbackBox.fr.resx
  23. +7 −7 source/BulkCrapUninstaller/Forms/Helpers/FeedbackBox.vi.resx
  24. +28 −28 source/BulkCrapUninstaller/Forms/Helpers/FeedbackWindow.fr.resx
  25. +1 −1 source/BulkCrapUninstaller/Forms/Helpers/FeedbackWindow.vi.resx
  26. +9 −9 source/BulkCrapUninstaller/Forms/Helpers/NewsPopup.fr.resx
  27. +7 −7 source/BulkCrapUninstaller/Forms/Helpers/NewsPopup.vi.resx
  28. +2 −2 source/BulkCrapUninstaller/Forms/Helpers/PropertiesWindow.vi.resx
  29. +2 −2 source/BulkCrapUninstaller/Forms/Helpers/RatingPopup.fr.resx
  30. +2 −2 source/BulkCrapUninstaller/Forms/Helpers/RatingPopup.vi.resx
  31. +3 −3 source/BulkCrapUninstaller/Forms/Helpers/TargetWindow.fr.resx
  32. +5 −5 source/BulkCrapUninstaller/Forms/Helpers/TargetWindow.vi.resx
  33. +6 −2 source/BulkCrapUninstaller/Forms/Windows/AboutBox.fr.resx
  34. +5 −4 source/BulkCrapUninstaller/Forms/Windows/AboutBox.vi.resx
  35. +8 −8 source/BulkCrapUninstaller/Forms/Windows/JunkRemoveWindow.vi.resx
  36. +52 −30 source/BulkCrapUninstaller/Forms/Windows/MainWindow.Designer.cs
  37. +53 −32 source/BulkCrapUninstaller/Forms/Windows/MainWindow.cs
  38. +20 −17 source/BulkCrapUninstaller/Forms/Windows/MainWindow.fr.resx
  39. +53 −17 source/BulkCrapUninstaller/Forms/Windows/MainWindow.resx
  40. +97 −94 source/BulkCrapUninstaller/Forms/Windows/MainWindow.vi.resx
  41. +3 −3 source/BulkCrapUninstaller/Forms/Windows/SettingsWindow.fr.resx
  42. +34 −34 source/BulkCrapUninstaller/Forms/Windows/SettingsWindow.vi.resx
  43. +3 −3 source/BulkCrapUninstaller/Forms/Windows/UninstallProgressWindow.fr.resx
  44. +11 −11 source/BulkCrapUninstaller/Forms/Windows/UninstallProgressWindow.vi.resx
  45. +2 −11 source/BulkCrapUninstaller/Forms/Wizards/BeginUninstallTaskWizard.fr.resx
  46. +15 −15 source/BulkCrapUninstaller/Forms/Wizards/BeginUninstallTaskWizard.vi.resx
  47. +9 −9 source/BulkCrapUninstaller/Forms/Wizards/FirstStartBox.fr.resx
  48. +41 −42 source/BulkCrapUninstaller/Forms/Wizards/FirstStartBox.vi.resx
  49. +53 −19 source/BulkCrapUninstaller/Functions/ApplicationList/ApplicationListConstants.cs
  50. +19 −18 source/BulkCrapUninstaller/Functions/ApplicationList/UninstallerListConfigurator.cs
  51. +34 −0 source/BulkCrapUninstaller/Functions/Tools/StartupArgumentTools.cs
  52. +54 −0 source/BulkCrapUninstaller/Properties/Localisable.Designer.cs
  53. +34 −30 source/BulkCrapUninstaller/Properties/Localisable.fr.resx
  54. +15 −0 source/BulkCrapUninstaller/Properties/Localisable.hu.resx
  55. +18 −0 source/BulkCrapUninstaller/Properties/Localisable.resx
  56. +162 −157 source/BulkCrapUninstaller/Properties/Localisable.vi.resx
  57. +44 −0 source/BulkCrapUninstallerTests/ApplicationEntrySerializerTests.cs
  58. +24 −0 source/BulkCrapUninstallerTests/ApplicationUninstallerEntryTests.cs
  59. +26 −0 source/BulkCrapUninstallerTests/DrawingToolsTests.cs
  60. +153 −0 source/BulkCrapUninstallerTests/Functions/ApplicationListConstantsTests.cs
  61. +55 −0 source/BulkCrapUninstallerTests/Functions/StartupArgumentToolsTests.cs
  62. +54 −0 source/BulkCrapUninstallerTests/UninstallListTests.cs
  63. +1 −1 source/Directory.Build.props
  64. +1 −1 source/KlocTools/Controls/WindowTargeter.vi.resx
  65. +12 −0 source/KlocTools/Forms/LoadingDialog.cs
  66. +1 −1 source/KlocTools/Forms/ProcessWaiter.vi.resx
  67. +2 −2 source/KlocTools/Forms/ProcessWaiterControl.vi.resx
  68. +3 −3 source/KlocTools/Forms/Tools/Buttons.vi.resx
  69. +7 −1 source/KlocTools/Forms/Tools/PremadeDialogs.cs
  70. +5 −3 source/KlocTools/IO/MsiTools.cs
  71. +1 −1 source/KlocTools/KlocTools.csproj
  72. +14 −14 source/KlocTools/Properties/Localisation.fr.resx
  73. +31 −31 source/KlocTools/Properties/Localisation.vi.resx
  74. +27 −2 source/KlocTools/Tools/DrawingTools.cs
  75. +39 −1 source/KlocTools/Tools/SerializationTools.cs
  76. +1 −1 source/NBug_custom/Core/UI/WinForms/Full.fr.resx
  77. +1 −1 source/NBug_custom/Core/UI/WinForms/Full.vi.resx
  78. +17 −17 source/NBug_custom/Properties/Localization.vi.resx
  79. +13 −0 source/ObjectListView/ObjectListView.cs
  80. +1 −1 source/OculusHelper/OculusHelper.csproj
  81. +96 −17 source/UninstallTools/ApplicationEntrySerializer.cs
  82. +15 −10 source/UninstallTools/ApplicationUninstallerEntry.cs
  83. +3 −3 source/UninstallTools/Controls/FilterEditor.vi.resx
  84. +10 −10 source/UninstallTools/Controls/UninstallListEditor.vi.resx
  85. +7 −6 source/UninstallTools/Dialogs/StartupManagerWindow.fr.resx
  86. +22 −21 source/UninstallTools/Dialogs/StartupManagerWindow.vi.resx
  87. +48 −39 source/UninstallTools/Factory/InfoAdders/FastSizeGenerator.cs
  88. +1 −1 source/UninstallTools/Factory/InfoAdders/InstallDateAdder.cs
  89. +41 −24 source/UninstallTools/Factory/RegistryFactory.cs
  90. +88 −3 source/UninstallTools/Factory/ScoopFactory.cs
  91. +101 −27 source/UninstallTools/Lists/UninstallList.cs
  92. +11 −8 source/UninstallTools/Properties/Localisation.fr.resx
  93. +10 −0 source/UninstallTools/Properties/Localisation.hu.resx
  94. +92 −89 source/UninstallTools/Properties/Localisation.vi.resx
  95. +1 −1 source/UninstallTools/UninstallTools.csproj
  96. +10 −0 source/UninstallTools/Uninstaller/NoWayToUninstallException.cs
  97. +7 −8 source/UninstallTools/Uninstaller/UninstallManager.cs
  98. +9 −0 source/UninstallerAutomatizer/Forms/MainWindow.hu.resx
  99. +1 −1 source/UninstallerAutomatizer/Forms/MainWindow.vi.resx
  100. +217 −0 source/UninstallerAutomatizer/Properties/Localization.hu.resx
  101. +22 −22 source/UninstallerAutomatizer/Properties/Localization.vi.resx
  102. +1 −1 source/UninstallerAutomatizer/UninstallerAutomatizer.csproj
  103. +3 −0 source/UniversalUninstaller/Properties/Localisation.hu.resx
  104. +2 −2 source/UniversalUninstaller/Properties/Localisation.vi.resx
  105. +1 −1 source/UniversalUninstaller/TargetList.vi.resx
  106. +9 −9 source/UniversalUninstaller/UninstallSelection.cs
  107. +2 −2 source/UniversalUninstaller/UninstallSelection.vi.resx
4 changes: 4 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
@@ -24,6 +24,10 @@ jobs:
msbuild source\BulkCrapUninstaller.sln /t:Publish /p:Configuration=Release /p:Platform="Any CPU" /verbosity:minimal
/p:filealignment=512 /p:DeployOnBuild=true /p:PublishSingleFile=False /p:SelfContained=False /p:PublishReadyToRun=false /p:PublishTrimmed=False
/p:PublishProtocol=FileSystem /p:PublishDir="${{ github.workspace }}\bin\publish"
- name: Build launcher
run: >
msbuild "source\BCU-launcher\BCU-launcher.vcxproj" /t:Build /p:Configuration=Release /p:Platform=Win32 /m /verbosity:minimal
- uses: actions/upload-artifact@v4
with:
63 changes: 63 additions & 0 deletions installer/BcuSetup.iss
Original file line number Diff line number Diff line change
@@ -134,6 +134,25 @@ Name: {app}\BCU-launcher.exe; Type: files
Name: {app}\win-x64; Type: filesandordirs
Name: {app}\win-x86; Type: filesandordirs

[UninstallDelete]
; Remove files generated by BCU itself. Installed files are removed automatically by Inno Setup.
Type: files; Name: "{app}\CleanLogs.bat"
Type: files; Name: "{app}\BCUninstaller.settings"
Type: files; Name: "{app}\*.log"
Type: files; Name: "{app}\Exception_*.zip"
Type: files; Name: "{app}\InfoCache.xml"
Type: files; Name: "{app}\CertCache.xml"
Type: files; Name: "{app}\UsageStatistics.xml"
Type: files; Name: "{app}\RatingCashe*"
Type: files; Name: "{app}\*\CleanLogs.bat"
Type: files; Name: "{app}\*\BCUninstaller.settings"
Type: files; Name: "{app}\*\*.log"
Type: files; Name: "{app}\*\Exception_*.zip"
Type: files; Name: "{app}\*\InfoCache.xml"
Type: files; Name: "{app}\*\CertCache.xml"
Type: files; Name: "{app}\*\UsageStatistics.xml"
Type: files; Name: "{app}\*\RatingCashe*"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; Check: IsNotPortable

@@ -163,6 +182,50 @@ begin
end;
#endif
// The same as CleanLogs.bat except ran at the end of uninstallation
// TODO: Test, fix issues and enable
//procedure DeinitializeUninstall();
//var
// AppDataSafe: string;
// MicrosoftPath: string;
// SettingsDir: string;
// ResultCode: Integer;
// Cmd: string;
//begin
// // Choose LOCALAPPDATA if available, otherwise fall back to APPDATA
// if DirExists(ExpandConstant('{localappdata}')) then
// AppDataSafe := ExpandConstant('{localappdata}')
// else
// AppDataSafe := ExpandConstant('{userappdata}');
//
// // Delete .NET Assembly Usage Logs under %LOCALAPPDATA%\Microsoft (recursively)
// MicrosoftPath := AppDataSafe + '\\Microsoft';
// if DirExists(MicrosoftPath) then
// begin
// Cmd := '/C del /f /s BCUninstaller.exe.log SteamHelper.exe.log StoreAppHelper.exe.log UninstallerAutomatizer.exe.log UpdateHelper.exe.log';
// Exec(ExpandConstant('{cmd}'), Cmd, MicrosoftPath, SW_HIDE, ewWaitUntilTerminated, ResultCode);
// end;
//
// // Remove settings directories created by .NET under %LOCALAPPDATA%\\Marcin_Szeniak\\BCUninstaller*
// SettingsDir := AppDataSafe + '\\Marcin_Szeniak';
// if DirExists(SettingsDir) then
// begin
// // Remove matching directories
// Cmd := '/C for /d %G in ("' + SettingsDir + '\\BCUninstaller*") do rd /s /q "%G"';
// Exec(ExpandConstant('{cmd}'), Cmd, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
//
// // If the settings dir is now empty, remove it
// try
// if RemoveDir(SettingsDir) then
// begin
// // removed
// end;
// except
// // ignore
// end;
// end;
//end;
[CustomMessages]
en.MainFiles=Main Files
pl.MainFiles=Główne pliki
101 changes: 88 additions & 13 deletions publish.bat
Original file line number Diff line number Diff line change
@@ -5,31 +5,45 @@ rem Release Debug
set config=Release

set msbuild="D:\Applications\VS2022\MSBuild\Current\Bin\amd64\MSBuild.exe"
if not exist %msbuild% call :findMsbuild
if not exist %msbuild% (
echo Failed to locate MSBuild.exe. Update publish.bat.
pause
exit /b 1
)

set solutionDir=%CD%\source
set publish=%CD%\bin\publish

set netVer=net8.0
set netVerFull=net8.0-windows10.0.18362.0

rmdir /q /s "%publish%"
if errorlevel 1 (pause)
rmdir /q /s bin\launcher
if errorlevel 1 (pause)
if exist "%publish%" (
rmdir /q /s "%publish%"
if errorlevel 1 (pause & exit /b 1)
)
if exist bin\launcher (
rmdir /q /s bin\launcher
if errorlevel 1 (pause & exit /b 1)
)


set platform=x64
call :publish
if errorlevel 1 (pause & exit /b 1)

rem Since BCU is now on .NET8, realistically only Arm64 and x64 Windows systems are supported now, so there's no point in building x86
rem set platform=x86
rem call :publish

copy bin\launcher\BCU-launcher.exe %publish%\BCUninstaller.exe
copy bin\launcher\BCU-launcher.exe "%publish%\BCUninstaller.exe"
if errorlevel 1 (echo Failed to copy BCU-launcher.exe & pause & exit /b 1)
copy "%target%\BCU_manual.html" "%publish%\BCU_manual.html"
copy "%target%\Licence.txt" "%publish%\Licence.txt"
copy "%target%\PrivacyPolicy.txt" "%publish%\PrivacyPolicy.txt"
copy "%target%\NOTICE" "%publish%\NOTICE"

rmdir /q /s bin\launcher
if exist bin\launcher rmdir /q /s bin\launcher

IF %config%==Release (del /f /s /q "%publish%\*.pdb")

@@ -38,17 +52,25 @@ rem --- AnyCPU --------------------------------------------------

set target=%CD%\bin\publish-AnyCPU-%netVer%

rmdir /q /s "%target%"
if errorlevel 1 (pause)
if exist "%target%" (
rmdir /q /s "%target%"
if errorlevel 1 (pause & exit /b 1)
)

set platform=Any CPU
set selfContained=False
set runtime=

echo ====== Building AnyCPU ======

%msbuild% "source\BulkCrapUninstaller.sln" /p:filealignment=512 /t:Publish /p:DeployOnBuild=true /p:PublishSingleFile=False /p:SelfContained=False /p:PublishProtocol=FileSystem /p:Configuration=%config% /p:Platform="Any CPU" /p:TargetFrameworks=%netVerFull% /p:PublishDir="%target%" /p:PublishReadyToRun=false /p:PublishTrimmed=False /verbosity:minimal
call :publishProjects
if errorlevel 1 (pause & exit /b 1)

IF %config%==Release (del /f /s /q "%target%\*.pdb")

echo ====== Publishing finished! ======
pause
exit
exit /b 0



@@ -57,13 +79,66 @@ rem -------------------------------------------------------------
:publish
set identifier=win-%platform%
set target=%CD%\bin\publish\%identifier%
set selfContained=True
set runtime=/p:RuntimeIdentifier=%identifier%

echo ====== Building %identifier% ======

%msbuild% "source\BulkCrapUninstaller.sln" /p:filealignment=512 /t:Restore;Rebuild /p:DeployOnBuild=true /p:PublishSingleFile=False /p:SelfContained=True /p:PublishProtocol=FileSystem /p:Configuration=%config% /p:Platform=%platform% /p:TargetFrameworks=%netVerFull% /p:PublishDir="%target%" /p:RuntimeIdentifier=%identifier% /p:PublishReadyToRun=false /p:PublishTrimmed=False /verbosity:minimal
call :buildLauncher
if errorlevel 1 goto :eof

call :publishProjects
goto :eof

rem -------------------------------------------------------------

:publishProjects
for /r "%solutionDir%" %%F in (*.csproj) do (
call :publishProjectIfEligible "%%~fF"
if errorlevel 1 goto :eof
)

%msbuild% "source\BulkCrapUninstaller.sln" /p:filealignment=512 /t:Publish /p:DeployOnBuild=true /p:PublishSingleFile=False /p:SelfContained=True /p:PublishProtocol=FileSystem /p:Configuration=%config% /p:Platform=%platform% /p:TargetFrameworks=%netVerFull% /p:PublishDir="%target%" /p:RuntimeIdentifier=%identifier% /p:PublishReadyToRun=false /p:PublishTrimmed=False /verbosity:minimal
exit /b 0

:publishProjectIfEligible
findstr /i /c:"exe</OutputType>" "%~1" >nul
if errorlevel 1 exit /b 0

call :publishProject "%~1"
if errorlevel 1 exit /b 1

exit /b 0

:publishProject
%msbuild% "%~1" /restore /m /p:filealignment=512 /t:Publish /p:DeployOnBuild=true /p:PublishSingleFile=False /p:SelfContained=%selfContained% /p:PublishProtocol=FileSystem /p:Configuration=%config% /p:Platform="%platform%" /p:TargetFramework=%netVerFull% /p:PublishDir="%target%" %runtime% /p:PublishReadyToRun=false /p:PublishTrimmed=False /verbosity:minimal

goto :eof

rem -------------------------------------------------------------
rem -------------------------------------------------------------

:buildLauncher
rem Build via solution so platform mapping is respected automatically.
%msbuild% "source\BulkCrapUninstaller.sln" /t:BCU-launcher /m /p:Configuration=%config% /p:Platform=%platform% "/p:SolutionDir=%solutionDir%\\" /verbosity:minimal

goto :eof

rem -------------------------------------------------------------

:findMsbuild
set vswhere=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe

if exist "%vswhere%" (
for /f "delims=" %%I in ('"%vswhere%" -latest -products * -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\amd64\MSBuild.exe') do (
set msbuild="%%~fI"
goto :eof
)
)

for /f "delims=" %%I in ('where msbuild 2^>nul') do (
set msbuild="%%~fI"
goto :eof
)

goto :eof

rem -------------------------------------------------------------
1 change: 1 addition & 0 deletions source/BulkCrapUninstaller.sln
Original file line number Diff line number Diff line change
@@ -143,6 +143,7 @@ Global
{4F843421-01D4-48E8-B88B-CDF30DD671A4}.Release|x86.ActiveCfg = Release|x86
{4F843421-01D4-48E8-B88B-CDF30DD671A4}.Release|x86.Build.0 = Release|x86
{C631EFBE-0463-417D-AEBE-A4BE3E660C43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C631EFBE-0463-417D-AEBE-A4BE3E660C43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C631EFBE-0463-417D-AEBE-A4BE3E660C43}.Debug|ARM64.ActiveCfg = Debug|ARM64
{C631EFBE-0463-417D-AEBE-A4BE3E660C43}.Debug|ARM64.Build.0 = Debug|ARM64
{C631EFBE-0463-417D-AEBE-A4BE3E660C43}.Debug|x64.ActiveCfg = Debug|x64
26 changes: 15 additions & 11 deletions source/BulkCrapUninstaller/BulkCrapUninstaller.csproj
Original file line number Diff line number Diff line change
@@ -47,19 +47,23 @@
</None>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\KlocTools\KlocTools.csproj" />
<ProjectReference Include="..\NBug_custom\NBug.csproj" />
<ProjectReference Include="..\NetSettingBinder\NetSettingBinder.csproj" />
<ItemGroup>
<ProjectReference Include="..\KlocTools\KlocTools.csproj" />
<ProjectReference Include="..\NBug_custom\NBug.csproj" />
<ProjectReference Include="..\NetSettingBinder\NetSettingBinder.csproj" />
<ProjectReference Include="..\ObjectListView\ObjectListView.csproj" />
<ProjectReference Include="..\PortableSettingsProvider\PortableSettingsProvider.csproj" />
<ProjectReference Include="..\SimpleTreeMap\SimpleTreeMap.csproj" />
<ProjectReference Include="..\UninstallTools\UninstallTools.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.VisualBasic" Version="10.3.0" />
</ItemGroup>
<ProjectReference Include="..\UninstallTools\UninstallTools.csproj" />
</ItemGroup>

<ItemGroup>
<InternalsVisibleTo Include="BulkCrapUninstallerTests" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.VisualBasic" Version="10.3.0" />
</ItemGroup>

<ItemGroup>
<Compile Update="Properties\Localisable.Designer.cs">
@@ -84,4 +88,4 @@
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>
</Project>
Original file line number Diff line number Diff line change
@@ -119,15 +119,16 @@
</resheader>
<data name="comboBoxInsert.Items" xml:space="preserve">
<value>Chèn...</value>
<comment>...</comment>
</data>
<data name="checkBoxUnescape.Text" xml:space="preserve">
<value>Cho phép ký tự thoát</value>
<value>Cho phép ký tự thoát (Unescape)</value>
</data>
<data name="buttonHelp.Text" xml:space="preserve">
<value>Trợ giúp</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Định dạng</value>
<value>Chuỗi regex</value>
</data>
<data name="groupBox2.Text" xml:space="preserve">
<value>Kết quả</value>
4 changes: 2 additions & 2 deletions source/BulkCrapUninstaller/Controls/FileTargeter.vi.resx
Original file line number Diff line number Diff line change
@@ -121,12 +121,12 @@
<value>Thư mục cài đặt...</value>
</data>
<data name="openFileDialog1.Title" xml:space="preserve">
<value>Chọn bất kỳ tệp nào liên quan đến ứng dụng</value>
<value>Chọn bất kỳ tệp tin nào thuộc về ứng dụng</value>
</data>
<data name="openFileDialog1.Filter" xml:space="preserve">
<value>Tất cả tệp|*.*</value>
</data>
<data name="button1.Text" xml:space="preserve">
<value>Đường dẫn hoặc tệp tin ứng dụng...</value>
<value>Đường dẫn hoặc tệp tin của ứng dụng...</value>
</data>
</root>
2 changes: 1 addition & 1 deletion source/BulkCrapUninstaller/Controls/ListLegend.fr.resx
Original file line number Diff line number Diff line change
@@ -124,7 +124,7 @@
<value>Application non enregistrée</value>
</data>
<data name="labelInvalid.Text" xml:space="preserve">
<value>Désinstalleur invalide</value>
<value>Désinstalleur manquant</value>
</data>
<data name="labelUnverified.Text" xml:space="preserve">
<value>Certificat non vérifié</value>
10 changes: 5 additions & 5 deletions source/BulkCrapUninstaller/Controls/ListLegend.vi.resx
Original file line number Diff line number Diff line change
@@ -118,22 +118,22 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="labelWinFeature.Text" xml:space="preserve">
<value>Windows Feature</value>
<value>Tính năng Windows (Windows Features)</value>
</data>
<data name="labelOrphaned.Text" xml:space="preserve">
<value>Ứng dụng chưa đăng ký</value>
<value>Không có thông tin đăng ký</value>
</data>
<data name="labelInvalid.Text" xml:space="preserve">
<value>Thiếu trình gỡ cài đặt</value>
</data>
<data name="labelUnverified.Text" xml:space="preserve">
<value>Chứng chỉ chưa được xác minh</value>
<value>Chứng chỉ chưa xác minh</value>
</data>
<data name="labelVerified.Text" xml:space="preserve">
<value>Chứng chỉ đã được xác minh</value>
<value>Chứng chỉ đã xác minh</value>
</data>
<data name="labelLegend.Text" xml:space="preserve">
<value>Chú thích màu</value>
<value>Đánh dấu bằng màu sắc</value>
</data>
<data name="labelStoreApp.Text" xml:space="preserve">
<value>Ứng dụng từ Windows Store</value>
Original file line number Diff line number Diff line change
@@ -118,7 +118,7 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="olvColumnName.Text" xml:space="preserve">
<value>Tên trình gỡ cài đặt liên quan</value>
<value>Tên trình gỡ cài đặt liên quan</value>
</data>
<data name="olvColumnEnabled.Text" xml:space="preserve">
<value>Thêm vào danh sách tác vụ</value>
@@ -127,9 +127,9 @@
<value>Liên quan đến: </value>
</data>
<data name="labelInfo.Text" xml:space="preserve">
<value>Đây là danh sách các ứng dụng có thể liên quan đến ứng các dụng bạn đã chọn để gỡ cài đặt. Bằng cách kiểm tra các ứng dụng này, bạn có thể thêm chúng vào hàng đợi gỡ cài đặt.</value>
<value>Đây là danh sách các ứng dụng có thể liên quan đến các ứng dụng bạn đã chọn để gỡ cài đặt. Bạn có thể thêm vào hàng đợi gỡ cài đặt bằng cách tích chọn chúng.</value>
</data>
<data name="labelInfo2.Text" xml:space="preserve">
<value>Hãy cẩn thận để không gỡ cài đặt phần mềm quan trọng mà các ứng dụng khác có thể cần để hoạt động bình thường.</value>
<value>Hãy đảm bảo rằng bạn không gỡ cài đặt các phần mềm quan trọng mà các ứng dụng khác có thể vẫn cần để hoạt động bình thường.</value>
</data>
</root>
20 changes: 10 additions & 10 deletions source/BulkCrapUninstaller/Controls/Settings/AdvancedFilters.cs
Original file line number Diff line number Diff line change
@@ -110,16 +110,16 @@ public void LoadUninstallList(string fileName)
uninstallListEditor1.CurrentList = result;
UnsavedChanges = false;
}
catch (SecurityException ex)
{
PremadeDialogs.GenericError(ex);
}
catch (Exception ex)
{
PremadeDialogs.GenericError("File is not an uninstall list or it can't be opened",
"Please note that uninstall lists are saved in the \"Advanced filtering\" view, not by exporting. Lists should have the .bcul extension.\n\nError message: " + ex.Message);
}
}
catch (SecurityException ex)
{
PremadeDialogs.GenericError(ex);
}
catch (Exception ex)
{
MessageBoxes.OpenUninstallListError(
Localisable.MessageBoxes_Error_details + ex.Message);
}
}

/// <summary>
/// Show file select gui
Original file line number Diff line number Diff line change
@@ -130,7 +130,7 @@
<value>Lưu thành...</value>
</data>
<data name="toolStripButtonSaveUlDef.Text" xml:space="preserve">
<value>Lưu làm mặc định</value>
<value>Lưu thành mặc định</value>
</data>
<data name="toolStripButtonDelete.Text" xml:space="preserve">
<value>Xoá danh sách mặc định</value>
Original file line number Diff line number Diff line change
@@ -118,7 +118,7 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label1.Text" xml:space="preserve">
<value>La mise en cache peut beaucoup réduire le temps de recherche, mais si une application est modifiée, BCU pourrait ne pas noter le changement (ex. la taille). NOTE: pour être effectifs, ces paramètres peuvent requérir le redémarrage de BCU.</value>
<value>La mise en cache peut beaucoup réduire le temps de recherche, mais si une application est modifiée, BCU pourrait ne pas noter le changement (ex. la taille). NOTE : pour prendre effet, ces paramètres peuvent requérir le redémarrage de BCU.</value>
</data>
<data name="checkBoxCerts.Text" xml:space="preserve">
<value>Mettre en cache les résultats de scan de certificat d'application</value>
Original file line number Diff line number Diff line change
@@ -118,19 +118,19 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label1.Text" xml:space="preserve">
<value>Bộ nhớ đệm có thể giảm đáng kể thời gian tìm kiếm nhưng BCU có thể không biết những thay đổi đối với ứng dụng của bạn.
Lưu ý: Bạn có thể cần phải khởi động lại BCU để các cài đặt này có hiệu lực.</value>
<value>Việc lưu bộ nhớ đệm có thể giảm đáng kể thời gian tìm kiếm nhưng nếu một ứng dụng có sự thay đổi thì BCU có thể sẽ không nhận biết được.
LƯU Ý: Bạn có thể cần phải khởi động lại BCU để các cài đặt này có hiệu lực.</value>
</data>
<data name="checkBoxCerts.Text" xml:space="preserve">
<value>Lưu trữ tạm thời các kết quả quét chứng chỉ ứng dụng</value>
<value>Lưu bộ nhớ đệm kết quả quét chứng chỉ ứng dụng</value>
</data>
<data name="checkBoxInfo.Text" xml:space="preserve">
<value>Lưu trữ tạm thời thông tin bị thiếu được thu thập</value>
<value>Lưu bộ nhớ đệm các thông tin còn thiếu đã thu thập được</value>
</data>
<data name="button1.Text" xml:space="preserve">
<value>Xoá bộ nhớ đệm</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Bộ nhớ đệm</value>
<value>Bộ nhớ đệm (Cache)</value>
</data>
</root>
Original file line number Diff line number Diff line change
@@ -136,7 +136,8 @@ Attention : vérifiez à deux fois avant de supprimer ces applications, elles po
<value>Surligner les désinstalleurs certifiés</value>
</data>
<data name="checkBoxCertTest.ToolTip" xml:space="preserve">
<value>Utiliser des couleurs pour identifier les désinstalleurs certifiés. Si le certificat a été vérifié avec succès, il utilise la couleur grise, autrement il utilise la couleur bleue.
<value>Utiliser des couleurs pour identifier les désinstalleurs certifiés.
Si le certificat a été vérifié avec succès utiliser la couleur verte, autrement utiliser la couleur bleue.

Attention : la vérification peut mettre longtemps à se terminer.</value>
</data>
@@ -147,20 +148,21 @@ Attention : la vérification peut mettre longtemps à se terminer.</value>
<value>Filtrer tout ce qui a été publié par Microsoft. C'est aussi simple que cela.</value>
</data>
<data name="checkBoxListSysComp.Text" xml:space="preserve">
<value>Montrer les composants système</value>
<value>Afficher les composants système</value>
</data>
<data name="checkBoxListSysComp.ToolTip" xml:space="preserve">
<value>Quelques désinstalleurs peuvent être marqués comme "composants système" pour les masquer dans la
liste Ajout/Suppression de programmes. Les pilotes sont souvent marqués avec cette balise.</value>
liste Ajout/Suppression de programmes.
Les pilotes sont souvent marqués avec cette balise.</value>
</data>
<data name="checkBoxListProtected.Text" xml:space="preserve">
<value>Montrer les éléments protégés</value>
<value>Afficher les éléments protégés</value>
</data>
<data name="checkBoxListProtected.ToolTip" xml:space="preserve">
<value>Les éléments protégés sont marqués avec la balise "NoRemove", signifiant que l'éditeur ne veut pas que vous les enleviez.</value>
</data>
<data name="checkBoxShowUpdates.Text" xml:space="preserve">
<value>Montrer les mises à jour</value>
<value>Afficher les mises à jour</value>
</data>
<data name="checkBoxShowUpdates.ToolTip" xml:space="preserve">
<value>Mises à jour d'autres applications. En général elles sont désinstallées ensemble avec leur application parente, ainsi elles peuvent être ignorées.</value>
@@ -172,12 +174,12 @@ liste Ajout/Suppression de programmes. Les pilotes sont souvent marqués avec ce
<value>Sélectionnner par cases à cocher</value>
</data>
<data name="checkBoxViewCheckboxes.ToolTip" xml:space="preserve">
<value>Changer le style de sélection de la liste en cases à cocher. Elles sont plus fiables car un simple clic ne peut désélectionner tout.
<value>Change le style de sélection de la liste en cases à cocher. Elles sont plus fiables car un simple clic ne peut désélectionner tout.

Vous pouvez cocher de multiples éléments en les surlignant et en pressant la barre d'espace.</value>
</data>
<data name="checkBoxViewGroups.Text" xml:space="preserve">
<value>Montrer les éléments en groupes</value>
<value>Afficher les éléments en groupes</value>
</data>
<data name="checkBoxViewGroups.ToolTip" xml:space="preserve">
<value>Grouper les éléments en fonction de la colonne
@@ -188,18 +190,18 @@ Le groupage de la plupart des colonnes utilise un tri intelligent.</value>
<value>Réglages de la vue liste</value>
</data>
<data name="checkBoxShowStoreApps.Text" xml:space="preserve">
<value>Montrer les applis du Windows Store</value>
<value>Afficher les applis du Windows Store</value>
</data>
<data name="checkBoxWinFeature.Text" xml:space="preserve">
<value>Montrer les fonctionalités Windows</value>
<value>Afficher les fonctionnalités Windows</value>
</data>
<data name="checkBoxHighlightSpecial.Text" xml:space="preserve">
<value>Surligner les désinstalleurs spéciaux</value>
</data>
<data name="checkBoxHighlightSpecial.ToolTip" xml:space="preserve">
<value>Utiliser des couleurs pour différencier les applications spéciales, par exemple les applis du store et les Fonctionnalités Windows</value>
<value>Utiliser des couleurs pour différencier les applications spéciales, par exemple les applis du Store et les Fonctionnalités Windows.</value>
</data>
<data name="checkBoxTweaks.Text" xml:space="preserve">
<value>Montrer les perfectionnements</value>
<value>Afficher les perfectionnements</value>
</data>
</root>
Original file line number Diff line number Diff line change
@@ -118,30 +118,30 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="checkBoxOrphans.Text" xml:space="preserve">
<value>Hiển thị các ứng dụng chưa đăng ký</value>
<value>Hiển thị các ứng dụng không có thông tin đăng ký</value>
</data>
<data name="checkBoxOrphans.ToolTip" xml:space="preserve">
<value>Hiển thị các ứng dụng chưa có bất kỳ trình gỡ cài đặt được đăng ký nào. Chúng không hiển thị trong hầu hết các trình quản lý gỡ cài đặt nhưng vẫn chiếm dung lượng. Các mục chưa đăng ký được đánh dấu bằng màu đỏ.
<value>Hiển thị các ứng dụng không đăng ký bất kỳ trình gỡ cài đặt nào với hệ thống. Chúng thường không xuất hiện trong hầu hết các trình quản lý gỡ cài đặt nhưng vẫn chiếm dung lượng ổ cứng. Các mục này được đánh dấu bằng màu đỏ.

Cảnh báo: Hãy kiểm tra kỹ trước khi xóa các ứng dụng này, chúng có thể vẫn cần thiết!</value>
</data>
<data name="checkBoxInvalidTest.Text" xml:space="preserve">
<value>Đánh dấu các mục thiếu trình gỡ cài đặt</value>
<value>Đánh dấu các ứng dụng thiếu trình gỡ cài đặt</value>
</data>
<data name="checkBoxInvalidTest.ToolTip" xml:space="preserve">
<value>Dùng màu xám để xác định trình gỡ cài đặt bị hỏng hoặc bị thiếu.</value>
<value>Sử dụng màu xám để đánh dấu trình gỡ cài đặt bị hỏng hoặc bị thiếu.</value>
</data>
<data name="checkBoxCertTest.Text" xml:space="preserve">
<value>Đánh dấu trình gỡ cài đặt đã đạt chứng chỉ</value>
<value>Đánh dấu trình gỡ cài đặt chứng chỉ</value>
</data>
<data name="checkBoxCertTest.ToolTip" xml:space="preserve">
<value>Sử dụng màu sắc để xác định trình gỡ cài đặt đã đạt chứng chỉ.
Màu xanh lục nếu chứng chỉ đã được xác minh thành công, ngược lại là màu xanh lam.
<value>Sử dụng màu sắc để đánh dấu các trình gỡ cài đặt chứng chỉ.
Nếu chứng chỉ được xác minh thành công sẽ là màu xanh lá, ngược lại sẽ là màu xanh dương.

Cảnh báo: Quá trình xác minh có thể mất nhiều thời gian để hoàn tất.</value>
Cảnh báo: Quá trình xác minh có thể mất nhiều thời gian.</value>
</data>
<data name="checkBoxListHideMicrosoft.Text" xml:space="preserve">
<value>Ẩn mọi thứ do Microsoft phát hành</value>
<value>Ẩn ứng dụng do Microsoft phát hành</value>
</data>
<data name="checkBoxListHideMicrosoft.ToolTip" xml:space="preserve">
<value>Lọc bỏ mọi thứ do Microsoft phát hành. Chỉ thế thôi.</value>
@@ -150,26 +150,26 @@ Cảnh báo: Quá trình xác minh có thể mất nhiều thời gian để ho
<value>Hiển thị các thành phần hệ thống</value>
</data>
<data name="checkBoxListSysComp.ToolTip" xml:space="preserve">
<value>Một số trình gỡ cài đặt có thể được đánh dấu là "thành phần hệ thống" và bị ẩn khỏi danh sách Thêm/Xóa phần mềm.
Các "Driver" thường được đánh dấu bằng thẻ này.</value>
<value>Một số trình gỡ cài đặt có thể được đánh dấu là "thành phần hệ thống" để ẩn chúng khỏi danh sách "Add/Remove Programs" mặc định của Windows.
Các trình điều khiển (Driver) thường được đánh dấu bằng thẻ này.</value>
</data>
<data name="checkBoxListProtected.Text" xml:space="preserve">
<value>Hiển thị các mục được bảo vệ</value>
</data>
<data name="checkBoxListProtected.ToolTip" xml:space="preserve">
<value>Các mục được bảo vệ được đánh dấu bằng thẻ "NoRemove", nghĩa là nhà phát hành không muốn bạn xóa chúng.</value>
<value>Các mục được bảo vệ sẽ có thẻ "NoRemove", nghĩa là nhà phát hành không muốn bạn gỡ bỏ chúng.</value>
</data>
<data name="checkBoxTweaks.Text" xml:space="preserve">
<value>Hiển thị các tinh chỉnh</value>
<value>Hiển thị các bản tinh chỉnh (Tweaks)</value>
</data>
<data name="checkBoxShowUpdates.Text" xml:space="preserve">
<value>Hiển thị các ứng dụng cập nhật</value>
</data>
<data name="checkBoxShowUpdates.ToolTip" xml:space="preserve">
<value>Các ứng dụng dùng để cập nhật các ứng dụng khác. Chúng thường được gỡ cài đặt cùng với ứng dụng gốc nên có thể yên tâm bỏ qua.</value>
<value>Các bản cập nhật của những ứng dụng khác. Thông thường chúng sẽ bị gỡ bỏ cùng với ứng dụng gốc, vì vậy bạn có thể bỏ qua chúng.</value>
</data>
<data name="checkBoxWinFeature.Text" xml:space="preserve">
<value>Hiển thị Windows features</value>
<value>Hiển thị tính năng Windows (Windows Features)</value>
</data>
<data name="checkBoxShowStoreApps.Text" xml:space="preserve">
<value>Hiển thị ứng dụng từ Windows Store</value>
@@ -178,27 +178,27 @@ Các "Driver" thường được đánh dấu bằng thẻ này.</value>
<value>Bộ lọc</value>
</data>
<data name="checkBoxViewCheckboxes.Text" xml:space="preserve">
<value>Chọn bằng cách tích vào hộp kiểm</value>
<value>Chọn bằng ô tích (checkbox)</value>
</data>
<data name="checkBoxViewCheckboxes.ToolTip" xml:space="preserve">
<value>Thay đổi kiểu lựa chọn của danh sách thành bằng cách tích các hộp kiểm. Chúng an toàn hơn vì không thể bỏ chọn mọi thứ bằng một cú nhấp chuột.
<value>Thay đổi kiểu chọn của danh sách sang dạng ô tích chọn. Cách này an toàn hơn vì chỉ một cú nhấp chuột sẽ không làm mất chọn tất cả các mục trước đó.

Bạn có thể kiểm tra nhiều mục bằng cách tích chúng nhấn phím cách.</value>
Bạn có thể tích chọn nhiều mục bằng cách bôi đen chúng rồi nhấn phím Cách.</value>
</data>
<data name="checkBoxViewGroups.Text" xml:space="preserve">
<value>Hiển thị các mục theo nhóm</value>
</data>
<data name="checkBoxViewGroups.ToolTip" xml:space="preserve">
<value>Nhóm các mục trong danh sách theo các cột được sắp xếp.
Việc nhóm hầu hết các cột sử dụng bộ lọc thông minh.</value>
<value>Nhóm các mục lại dựa theo cột được chọn.
Việc nhóm phần lớn các cột đều sử dụng bộ lọc thông minh.</value>
</data>
<data name="checkBoxHighlightSpecial.Text" xml:space="preserve">
<value>Đánh dấu các trình gỡ cài đặt đặc biệt</value>
</data>
<data name="checkBoxHighlightSpecial.ToolTip" xml:space="preserve">
<value>Dùng màu sắc để phân biệt các ứng dụng đặc biệt, ví dụ như Store Apps và Windows Features.</value>
<value>Sử dụng màu sắc để phân biệt các ứng dụng đặc biệt, ví dụ như Store Apps và Windows Features.</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Cài đặt chế độ xem</value>
<value>Chế độ hiển thị danh sách</value>
</data>
</root>
Original file line number Diff line number Diff line change
@@ -169,7 +169,10 @@
<value>Créer un point de restauration avant désinstallation</value>
</data>
<data name="checkBoxRestorePoint.ToolTip" xml:space="preserve">
<value>Vous pouvez créer un point de restauration système pour sauvegarder le registre, certains paramètres et fichiers. Il est recommandé de créer un point de restauration avant de supprimer des pilotes et des applications système importantes.</value>
<value>Vous pouvez créer un point de restauration système pour sauvegarder le registre, certains paramètres et fichiers.
Il est recommandé de créer un point de restauration avant de supprimer des pilotes et des applications système importantes.

Si ce paramètre est grisé, les Points de Restauration sont désactivés ou indisponibles. Dans ce cas, aucun point de restauration ne sera créé !</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
Original file line number Diff line number Diff line change
@@ -166,7 +166,7 @@
<value>Automatisk avslutning vid väntan på användarindata</value>
</data>
<data name="checkBoxAutoDaemon.Text" xml:space="preserve">
<value>Bevaka "tysta" avinstallationsprogram för popup-fönster eller andra hinder och automatisera dem (kör automatizer daemon).</value>
<value>Automatisera tysta popup-fönster för avinstallation via daemon.</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Tyst avinstallation</value>
Original file line number Diff line number Diff line change
@@ -118,35 +118,38 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="checkBoxManualNoCollisionProtection.Text" xml:space="preserve">
<value>Tắt tính năng chống xung đột khi chạy trình gỡ
cài đặt theo cách thủ công</value>
<value>Tắt tính năng chống xung đột khi chạy trình
gỡ cài đặt theo cách thủ công</value>
</data>
<data name="checkBoxConcurrentOneLoud.Text" xml:space="preserve">
<value>Mỗi lần chỉ chạy một trình gỡ cài đặt</value>
<value>Mỗi lần chỉ chạy một trình gỡ cài đặt có giao diện (Loud)</value>
</data>
<data name="checkBoxConcurrent.Text" xml:space="preserve">
<value>Tự động chạy đồng thời các trình gỡ cài đặt (nếu có thể)</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>Số trình gỡ cài đặt tối đa chạy đồng thời:</value>
<value>Số trình gỡ cài đặt tối đa được chạy cùng lúc:</value>
</data>
<data name="groupBox3.Text" xml:space="preserve">
<value>Gỡ cài đặt đồng thời</value>
</data>
<data name="checkBoxShutdown.Text" xml:space="preserve">
<value>Ngăn chặn việc tắt/khởi động lại hệ thống</value>
<value>Ngăn hệ thống tắt nguồn/khởi động lại</value>
</data>
<data name="checkBoxRestorePoint.Text" xml:space="preserve">
<value>Tạo điểm khôi phục trước khi gỡ cài đặt</value>
<value>Tạo điểm khôi phục (Restore Point) trước khi gỡ cài đặt</value>
</data>
<data name="checkBoxRestorePoint.ToolTip" xml:space="preserve">
<value>Bạn có thể sao lưu registry, một số cài đặt và tệp bằng cách tạo điểm khôi phục hệ thống. Bạn nên tạo điểm khôi phục trước khi xóa driver và các ứng dụng hệ thống quan trọng.</value>
<value>Bạn có thể tạo một điểm khôi phục hệ thống để sao lưu registry, một số cài đặt và các tệp tin.
Khuyến nghị nên tạo điểm khôi phục trước khi gỡ bỏ các trình điều khiển (Driver) và các ứng dụng hệ thống quan trọng.

Nếu cài đặt này bị mờ đi thì tức là tính năng Điểm khôi phục (Restore Points) trên Windows đã bị tắt hoặc không khả dụng. Trong trường hợp đó, không có điểm khôi phục nào được tạo!</value>
</data>
<data name="checkBoxBatchSortQuiet.Text" xml:space="preserve">
<value>Sắp xếp trình gỡ cài đặt một cách thông minh</value>
</data>
<data name="checkBoxDiisableProtection.Text" xml:space="preserve">
<value>Vô hiệu hóa bảo vệ</value>
<value>Tắt tính năng bảo vệ</value>
</data>
<data name="checkBoxSimulate.Text" xml:space="preserve">
<value>Mô phỏng quá trình gỡ cài đặt</value>
@@ -155,23 +158,23 @@ cài đặt theo cách thủ công</value>
<value>Cài đặt chung</value>
</data>
<data name="checkBoxAutoKillQuiet.Text" xml:space="preserve">
<value>Tự động huỷ các trình gỡ cài đặt âm thầm bị lỗi</value>
<value>Tự động dừng các trình gỡ cài đặt yên lặng (Quiet) bị treo</value>
</data>
<data name="checkBoxRetryQuiet.Text" xml:space="preserve">
<value>Thử lại các trình gỡ cài đặt âm thầm không thành công một lần nữa</value>
<value>Thử lại một lần nếu bộ gỡ cài đặt yên lặng (Quiet) bị lỗi</value>
</data>
<data name="checkBoxGenerate.Text" xml:space="preserve">
<value>Tạo trình gỡ cài đặt âm thầm bị thiếu nếu có thể</value>
<value>Tự động tạo lệnh gỡ cài đặt yên lặng (Quiet) nếu có thể</value>
</data>
<data name="checkBoxGenerateStuck.Text" xml:space="preserve">
<value>Tự động huỷ trình gỡ cài đặt nếu nó bị kẹt khi chờ thao tác của người dùng</value>
<value>Tự động dừng nếu trình gỡ cài đặt bị treo khi chờ người dùng nhập liệu</value>
</data>
<data name="checkBoxAutoDaemon.Text" xml:space="preserve">
<value>Giám sát các trình gỡ cài đặt "im lặng" bật lên cửa sổ
không mong muốn hoặc treo máy, và tự động hóa chúng
(chạy trình nền tự động)</value>
<value>Giám sát các trình gỡ cài đặt "im lặng" (Silent) để phát
hiện cửa sổ bật lên (popup) hoặc lỗi trì hoãn và tự động
xử lý chúng</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Gỡ cài đặt âm thầm</value>
<value>Gỡ cài đặt yên lặng (Quiet)</value>
</data>
</root>
Original file line number Diff line number Diff line change
@@ -118,10 +118,10 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="labelInfo2.Text" xml:space="preserve">
<value>Thứ tự sắp xếp ban đầu tùy thuộc vào tuỳ chọn gỡ cài đặt của bạn nhưng có thể thay đổi bằng cách kéo các mục. Lưu ý: BCU có thể thay đổi thứ tự nếu bật tính năng gỡ cài đặt đồng thời.</value>
<value>Thứ tự ban đầu phụ thuộc vào cài đặt gỡ bỏ của bạn nhưng bạn có thể thay đổi bằng cách kéo thả các mục. Lưu ý: BCU có thể tự động thay đổi thứ tự này nếu tính năng gỡ cài đặt đồng thời được bật.</value>
</data>
<data name="labelInfo.Text" xml:space="preserve">
<value>Đây là danh sách các ứng dụng sẽ được gỡ cài đặt, theo thứ tự từ trên xuống dưới. Nếu bạn bỏ tích trường "Gỡ cài đặt", ứng dụng sẽ không được gỡ cài đặt. Nếu tính năng "Gỡ cài đặt âm thầm" không khả dụng cho một ứng dụng thì bạn không thể tích vào trường này.</value>
<value>Đây là danh sách các ứng dụng sẽ bị gỡ cài đặt, theo thứ tự từ trên xuống dưới. Nếu bạn bỏ chọn ở cột "Gỡ cài đặt", ứng dụng đó sẽ không bị gỡ. Nếu một ứng dụng không hỗ trợ gỡ cài đặt qua "Chế độ yên lặng (Quiet)", bạn sẽ không thể tích chọn ô đó.</value>
<comment>jp translator: I don't know the difference between Quiet Uninstall and Silent Uninstall. Can I translate them to mean the same meaning? At this stage, we are trying to separate the two, but Quiet Uninstall is not very familiar to Japanese people.</comment>
</data>
<data name="buttonSmartSort.Text" xml:space="preserve">
@@ -131,7 +131,7 @@
<value>Vị trí cài đặt</value>
</data>
<data name="olvColumnQuiet.Text" xml:space="preserve">
<value>Gỡ cài đặt âm thầm</value>
<value>Chế độ yên lặng (Quiet)</value>
</data>
<data name="olvColumnEnabled.Text" xml:space="preserve">
<value>Gỡ cài đặt</value>
13 changes: 7 additions & 6 deletions source/BulkCrapUninstaller/EntryPoint.cs
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@ Apache License Version 2.0
using Klocman.Extensions;
using Klocman.Forms;
using Klocman.Forms.Tools;
using Klocman.Tools;
using UninstallTools.Dialogs;

namespace BulkCrapUninstaller
@@ -136,11 +137,11 @@ private static void HandleBeingSecondInstance()
}
else
{
CustomMessageBox.ShowDialog(null, new CmbBasicSettings("BCUninstaller is already running", "BCUninstaller is already running", "You can start only one instance of BCUninstaller. Close previous instances and try again. If you don't see the BCUninstaller window or it's not responding, try closing it with Task Manager.", Icon.ExtractAssociatedIcon(location), "OK"));
}
}
catch (Exception ex)
{
CustomMessageBox.ShowDialog(null, new CmbBasicSettings("BCUninstaller is already running", "BCUninstaller is already running", "You can start only one instance of BCUninstaller. Close previous instances and try again. If you don't see the BCUninstaller window or it's not responding, try closing it with Task Manager.", DrawingTools.ExtractAssociatedIcon(location), "OK"));
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
@@ -166,4 +167,4 @@ private static void SetupDependancies()
//}
}
}
}
}
14 changes: 7 additions & 7 deletions source/BulkCrapUninstaller/Forms/Helpers/FeedbackBox.fr.resx
Original file line number Diff line number Diff line change
@@ -121,10 +121,10 @@
<value>Merci d'utiliser BCUninstaller !</value>
</data>
<data name="p1welcomeSubheading.Text" xml:space="preserve">
<value>Si vous aimez cet outil open-source gratuit, n'hésitez pas à en parler à vos amis, à le partager sur les réseaux sociaux, ou donnez vos impressions - tout compte !</value>
<value>Si vous trouvez cet outil open-source gratuit utile, merci de prendre une minute pour aider ! Parlez-en à vos amis, partagez-le sur les réseaux sociaux, donnez un retour - chaque petit geste compte !</value>
</data>
<data name="buttonSendFeedback2.Text" xml:space="preserve">
<value>Envoyer vos impressions</value>
<value>Envoyer un retour</value>
</data>
<data name="buttonRate.Text" xml:space="preserve">
<value>Évaluer (en bas de la page)</value>
@@ -136,16 +136,16 @@
<value>Des problèmes ou des fonctions manquantes ?</value>
</data>
<data name="p1FeedbackDesc.Text" xml:space="preserve">
<value>Si vous avez des problèmes avec BCU ou si vous souhaitez suggérer une nouvelle fonction, voyez ces liens :</value>
<value>Si vous avez des problèmes avec BCU ou si vous souhaitez suggérer une nouvelle fonction, merci de vérifier ces liens :</value>
</data>
<data name="buttonSubmitGithub.Text" xml:space="preserve">
<value>Soumettre sur GitHub (Nécessite un compte)</value>
</data>
<data name="buttonSendFeedback.Text" xml:space="preserve">
<value>Envoyer vos impressions</value>
<value>Envoyer un retour</value>
</data>
<data name="p1HelpHeading.Text" xml:space="preserve">
<value>Vous souhaitez aider BCU ?</value>
<value>Voulez-vous aider ?</value>
</data>
<data name="p1HelpDesc.Text" xml:space="preserve">
<value>Vous n'avez pas à être un programmeur pour aider ! Vous pouvez faire un don pour accélérer les mises à jour, ou traduire BCU dans votre langue maternelle. Toute aide est grandement appréciée, même petite !</value>
@@ -157,12 +157,12 @@
<value>Problèmes sur GitHub</value>
</data>
<data name="checkBoxNeverShow.Text" xml:space="preserve">
<value>Ne plus jamais montrer cette fenêtre, jamais.</value>
<value>Ne plus jamais montrer cette fenêtre, jamais</value>
</data>
<data name="buttonClose.Text" xml:space="preserve">
<value>Fermer</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Envoyer vos impressions</value>
<value>Envoyer un retour</value>
</data>
</root>
14 changes: 7 additions & 7 deletions source/BulkCrapUninstaller/Forms/Helpers/FeedbackBox.vi.resx
Original file line number Diff line number Diff line change
@@ -121,7 +121,7 @@
<value>Cảm ơn bạn đã sử dụng BCUninstaller!</value>
</data>
<data name="p1welcomeSubheading.Text" xml:space="preserve">
<value>Bạn đã thấy công cụ mã nguồn mở miễn phí này hữu ích chứ? Nếu có, hãy dành một phút để giúp chúng tôi nhé! Hãy giới thiệu nó với bạn bè của bạn, chia sẻ nó lên mạng xã hội, hay cung cấp phản hồi - mọi đóng góp nhỏ đều có giá trị!</value>
<value>Bạn đã thấy công cụ mã nguồn mở miễn phí này hữu ích chưa? Nếu có, hãy dành một phút để giúp chúng tôi nhé! Hãy giới thiệu nó với bạn bè của bạn, chia sẻ nó lên mạng xã hội, hay cung cấp phản hồi - mọi đóng góp nhỏ đều có giá trị!</value>
</data>
<data name="buttonSendFeedback2.Text" xml:space="preserve">
<value>Gửi phản hồi</value>
@@ -133,10 +133,10 @@
<value>Chia sẻ lên Twitter</value>
</data>
<data name="p1FeedbackHeading.Text" xml:space="preserve">
<value>Có bất kỳ trục trặc hay thiếu tính năng nào không?</value>
<value>Có trục trặc hay thiếu tính năng?</value>
</data>
<data name="p1FeedbackDesc.Text" xml:space="preserve">
<value>Nếu bạn gặp phải bất kỳ sự cố nào với BCU hoặc muốn đề xuất tính năng mới, vui lòng kiểm tra các liên kết này:</value>
<value>Nếu bạn gặp phải bất kỳ sự cố nào với BCU hoặc muốn đề xuất tính năng mới, vui lòng truy cập các liên kết này:</value>
</data>
<data name="buttonSubmitGithub.Text" xml:space="preserve">
<value>Gửi lên GitHub (Cần có tài khoản)</value>
@@ -145,19 +145,19 @@
<value>Gửi phản hồi</value>
</data>
<data name="p1HelpHeading.Text" xml:space="preserve">
<value>Bạn có muốn góp sức không?</value>
<value>Bạn có muốn góp chút công không?</value>
</data>
<data name="p1HelpDesc.Text" xml:space="preserve">
<value>Bạn không cần phải là lập trình viên để góp sức! Bạn có thể quyên góp để đẩy nhanh quá trình cập nhật hoặc dịch BCU sang tiếng mẹ đẻ của bạn. Mọi sự giúp đỡ đều được trân trọng, dù là nhỏ nhất!</value>
<value>Bạn không cần phải là một lập trình viên thì mới có thể giúp đỡ! Bạn có thể quyên góp (donate) để tiến độ cập nhật nhanh hơn, hoặc dịch BCU sang ngôn ngữ mẹ đẻ của mình. Mọi sự giúp đỡ đều rất đáng trân quý, bất kể lớn nhỏ!</value>
</data>
<data name="buttonTranslate.Text" xml:space="preserve">
<value>Dịch BCU</value>
<value>Đóng góp dịch thuật</value>
</data>
<data name="buttonIssues.Text" xml:space="preserve">
<value>Báo cáo lỗi trên GitHub</value>
</data>
<data name="checkBoxNeverShow.Text" xml:space="preserve">
<value>Không bao giờ hiển thị lại cửa sổ này nữa</value>
<value>Không hiện lại cửa sổ này nữa</value>
</data>
<data name="buttonClose.Text" xml:space="preserve">
<value>Đóng</value>
56 changes: 28 additions & 28 deletions source/BulkCrapUninstaller/Forms/Helpers/FeedbackWindow.fr.resx
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
@@ -26,36 +26,36 @@
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
@@ -147,6 +147,6 @@
<value>4, 3, 4, 3</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Soumettre une impression</value>
<value>Soumettre un retour</value>
</data>
</root>
Original file line number Diff line number Diff line change
@@ -118,7 +118,7 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="loadingLabel.Text" xml:space="preserve">
<value>Đang nạp, vui lòng đợi...</value>
<value>Đang tải, vui lòng đợi...</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Gửi phản hồi</value>
18 changes: 9 additions & 9 deletions source/BulkCrapUninstaller/Forms/Helpers/NewsPopup.fr.resx
Original file line number Diff line number Diff line change
@@ -118,33 +118,33 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label1.Text" xml:space="preserve">
<value>(Cliquez n'importe où pour fermer ce message)</value>
<value>(Cliquez n'importe où pour fermer cette fenêtre)</value>
</data>
<data name="linkLabel7.Text" xml:space="preserve">
<value>Don (Paypal, Bitcoin, Steam gift)</value>
<value>Donner (Paypal, Bitcoin, cadeaux Steam)</value>
</data>
<data name="linkLabel6.Text" xml:space="preserve">
<value>Envoyez vos impressions</value>
<value>Envoyez un retour / Contacter le développeur</value>
</data>
<data name="linkLabel5.Text" xml:space="preserve">
<value>Aide</value>
<value>Lire le fichier d'aide</value>
</data>
<data name="linkLabel4.Text" xml:space="preserve">
<value>Politique de confidentialité</value>
<value>Lire la politique de confidentialité</value>
</data>
<data name="linkLabel3.Text" xml:space="preserve">
<value>Licence du programme</value>
<value>Lire la licence</value>
</data>
<data name="linkLabel2.Text" xml:space="preserve">
<value>Voir le code source ou contribuer</value>
</data>
<data name="linkLabel1.Text" xml:space="preserve">
<value>Voir les notes de mise à jour</value>
<value>Voir les notes de mise à jour et le journal de modifications</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>Les donations m'aident à financer ce projet, dont les certificats de signature, l'hébergement et autres nécessités.</value>
<value>Les dons me permettent de rester intéressé par ce projet et de financer les certificats de signature de code, l'hébergement et autres dépenses nécessaires.</value>
</data>
<data name="checkBoxNeverShow.Text" xml:space="preserve">
<value>Ne plus jamais montrer cette fenêtre, jamais.</value>
<value>Ne plus jamais montrer cette fenêtre.</value>
</data>
</root>
14 changes: 7 additions & 7 deletions source/BulkCrapUninstaller/Forms/Helpers/NewsPopup.vi.resx
Original file line number Diff line number Diff line change
@@ -118,22 +118,22 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label3.Text" xml:space="preserve">
<value>Các khoản tài trợ giúp tôi duy trì sự hứng thú với dự án này, đồng thời cũng để thanh toán chi phí cho chứng chỉ ký code, lưu trữ và các nhu cầu cần thiết khác.</value>
<value>Các khoản quyên góp giúp tôi duy trì niềm đam mê với dự án này, cũng như có chi phí để chi trả cho chứng chỉ ký mã nguồn (code signing certificate), dịch vụ lưu trữ (hosting) và các nhu cầu thiết yếu khác.</value>
</data>
<data name="linkLabel1.Text" xml:space="preserve">
<value>Xem các bản ghi chú phát hành và nhật ký thay đổi</value>
<value>Xem ghi chú phát hành và nhật ký thay đổi (changelog)</value>
</data>
<data name="linkLabel2.Text" xml:space="preserve">
<value>Xem mã nguồn hoặc đóng góp</value>
<value>Xem mã nguồn hoặc đóng góp cho dự án</value>
</data>
<data name="linkLabel3.Text" xml:space="preserve">
<value>Đọc giấy phép</value>
<value>Đọc điều khoản giấy phép</value>
</data>
<data name="linkLabel4.Text" xml:space="preserve">
<value>Đọc chính sách bảo mật</value>
</data>
<data name="linkLabel5.Text" xml:space="preserve">
<value>Đọc tệp tin trợ giúp</value>
<value>Đọc tài liệu hướng dẫn</value>
</data>
<data name="linkLabel6.Text" xml:space="preserve">
<value>Gửi phản hồi / Liên hệ với nhà phát triển</value>
@@ -142,9 +142,9 @@
<value>Quyên góp (PayPal, Bitcoin, Steam gifts)</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>(Nhấp chuột vào bất cứ đâu để đóng hộp thoại này)</value>
<value>(Nhấp vào bất kỳ đâu để đóng hộp thoại này)</value>
</data>
<data name="checkBoxNeverShow.Text" xml:space="preserve">
<value>Không bao giờ hiển thị lại cửa sổ này nữa</value>
<value>Không hiện lại cửa sổ này nữa</value>
</data>
</root>
Original file line number Diff line number Diff line change
@@ -134,13 +134,13 @@
<value>Tổng quan</value>
</data>
<data name="tabPageFileInfo.Text" xml:space="preserve">
<value>Thông tin trình gỡ cài đặt</value>
<value>Trình gỡ cài đặt</value>
</data>
<data name="tabPageRegistry.Text" xml:space="preserve">
<value>Registry</value>
</data>
<data name="tabPageCertificate.Text" xml:space="preserve">
<value>Giấy chứng chỉ</value>
<value>Chứng chỉ (Certificate)</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Thông tin chi tiết </value>
4 changes: 2 additions & 2 deletions source/BulkCrapUninstaller/Forms/Helpers/RatingPopup.fr.resx
Original file line number Diff line number Diff line change
@@ -130,10 +130,10 @@
<value>Douteux | Mauvaise qualité</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Partager votre note avec d'autres</value>
<value>Partager votre note avec d'autres utilisateurs</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Note</value>
<value>Noter</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
4 changes: 2 additions & 2 deletions source/BulkCrapUninstaller/Forms/Helpers/RatingPopup.vi.resx
Original file line number Diff line number Diff line change
@@ -124,13 +124,13 @@
<value>Hữu ích | Chất lượng tốt</value>
</data>
<data name="buttonNormal.Text" xml:space="preserve">
<value>Có vấn đề | Chất lượng kém</value>
<value>Đáng ngờ | Chất lượng kém</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Đánh giá</value>
</data>
<data name="buttonBad.Text" xml:space="preserve">
<value>Rác | Nguy hiểm tiềm tàng</value>
<value>Rác rưởi | Nguy hiểm tiềm tàng</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Chia sẻ đánh giá của bạn với người dùng khác</value>
6 changes: 3 additions & 3 deletions source/BulkCrapUninstaller/Forms/Helpers/TargetWindow.fr.resx
Original file line number Diff line number Diff line change
@@ -124,14 +124,14 @@
<value>Sélectionner en utilisant une fenêtre</value>
</data>
<data name="groupBox2.Text" xml:space="preserve">
<value>Sélectionner en utilisant le dossier d'installation ou les fichiers programmes</value>
<value>Sélectionner en utilisant le dossier d'installation ou les fichiers de programmes</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>Note: assurez-vous que tous les fichiers sélectionnés sont dans le dossier d'installation de l'application.
<value>Note : assurez-vous que tous les fichiers sélectionnés sont dans le dossier d'installation de l'application.

Vous pouvez sélectionner un dossier qui contient de multiples applications pour les désinstaller toutes.</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Détruire une application</value>
<value>Cibler une application</value>
</data>
</root>
10 changes: 5 additions & 5 deletions source/BulkCrapUninstaller/Forms/Helpers/TargetWindow.vi.resx
Original file line number Diff line number Diff line change
@@ -118,20 +118,20 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="groupBox1.Text" xml:space="preserve">
<value>Chọn một cửa sổ</value>
<value>Chọn bằng cửa sổ ứng dụng</value>
</data>
<data name="groupBox2.Text" xml:space="preserve">
<value>Chọn thư mục cài đặt hoặc tệp tin ứng dụng</value>
<value>Chọn bằng thư mục cài đặt hoặc tệp tin chương trình</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>Tìm và gỡ cài đặt một ứng dụng dựa vào một trong các thông tin sau: cửa sổ, lối tắt hoặc vị trí cài đặt hoặc tệp .exe của ứng dụng đó.</value>
<value>Tìm và gỡ cài đặt một ứng dụng dựa trên: cửa sổ, lối tắt (shortcut), vị trí cài đặt hoặc tệp tin ".exe".</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>Lưu ý: Hãy đảm bảo bất kỳ tệp bạn chọn phải nằm trong thư mục cài đặt ứng dụng.
<value>Hãy đảm bảo rằng bất kỳ tệp tin nào bạn chọn phải nằm bên trong thư mục cài đặt của ứng dụng.

Bạn có thể chọn một thư mục chứa nhiều ứng dụng để gỡ cài đặt tất cả chúng cùng một lúc.</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Nhắm mục tiêu ứng dụng</value>
<value>Định vị ứng dụng</value>
</data>
</root>
8 changes: 6 additions & 2 deletions source/BulkCrapUninstaller/Forms/Windows/AboutBox.fr.resx
Original file line number Diff line number Diff line change
@@ -136,14 +136,15 @@
<value>Version du programme</value>
</data>
<data name="linkLabel5.Text" xml:space="preserve">
<value>NBug par Teoman Soygul</value>
<value>NBug</value>
<comment>I have translated it directly in Japanese, but it may not convey the meaning very well.</comment>
</data>
<data name="linkLabel3.Text" xml:space="preserve">
<value>Icônes Modern UI</value>
<comment>Si "Modern UI Icons" significa "Iconos de Interfaz de Usuario Moderno" la traducción será "Iconos Modernos de Interface de Usuario"</comment>
</data>
<data name="linkLabel2.Text" xml:space="preserve">
<value>PortableSettingsProvider par CodeChimp</value>
<value>PortableSettingsProvider</value>
<comment>1</comment>
</data>
<data name="groupBox2.Text" xml:space="preserve">
@@ -169,6 +170,7 @@
</data>
<data name="linkLabel6.Text" xml:space="preserve">
<value>DotNetZip</value>
<comment>jp translator: what's this?</comment>
</data>
<data name="labelName.Text" xml:space="preserve">
<value>BCUninstaller (Bulk Crap Uninstaller)</value>
@@ -182,8 +184,10 @@
</data>
<data name="linkLabel8.Text" xml:space="preserve">
<value>TestStack.White</value>
<comment>I have translated it directly in Japanese, but it may not convey the meaning very well.</comment>
</data>
<data name="linkLabel9.Text" xml:space="preserve">
<value>es.exe (CLI pour Everything)</value>
<comment>Almost all the translations here were in English</comment>
</data>
</root>
9 changes: 5 additions & 4 deletions source/BulkCrapUninstaller/Forms/Windows/AboutBox.vi.resx
Original file line number Diff line number Diff line change
@@ -130,13 +130,13 @@
<value>Tác giả</value>
</data>
<data name="labelis64.Text" xml:space="preserve">
<value>Phiên bản 64bit: </value>
<value>Bản 64bit: </value>
</data>
<data name="labelPortable.Text" xml:space="preserve">
<value>Được cài bằng trình cài đặt: </value>
<value>Trạng thái cài đặt:</value>
</data>
<data name="labelArchitecture.Text" xml:space="preserve">
<value>Cấu trúc: </value>
<value>Kiến trúc phần cứng:</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Phiên bản ứng dụng</value>
@@ -147,6 +147,7 @@
</data>
<data name="linkLabel9.Text" xml:space="preserve">
<value>es.exe (CLI for Everything)</value>
<comment>Almost all the translations here were in English</comment>
</data>
<data name="linkLabel3.Text" xml:space="preserve">
<value>Modern UI Icons</value>
@@ -172,7 +173,7 @@
<comment>I have translated it directly in Japanese, but it may not convey the meaning very well.</comment>
</data>
<data name="groupBox2.Text" xml:space="preserve">
<value>Thành phần được sử dụng</value>
<value>Thư viện và tài nguyên sử dụng</value>
</data>
<data name="button1.Text" xml:space="preserve">
<value>Đóng</value>
Original file line number Diff line number Diff line change
@@ -118,28 +118,28 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="detailsToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Chi tiết</value>
<value>Chi tiết (&amp;D)</value>
</data>
<data name="copyToClipboardToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Sao chép vào bảng nhớ tạm</value>
<value>Sao chép vào bảng nhớ tạm (&amp;C)</value>
</data>
<data name="openToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Mở</value>
<value>Mở (&amp;O)</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Dọn dẹp những thứ còn sót lại</value>
<value>Dọn dẹp tàn dư</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Danh sách các tệp tin và/hoặc registry còn lại sau khi gỡ cài đặt</value>
<value>Danh sách các tệp tin và/hoặc các khóa registry còn sót lại sau khi gỡ cài đặt</value>
</data>
<data name="headerConfInfo.Text" xml:space="preserve">
<value>Việc phát hiện những mụcthừa này là một quá trình phức tạp và có thể mắc sai sót. Do đó, tất cả các mục đều được đánh giá mức độ tin cậy và quyết định cuối cùng thuộc về bạn. Những mục có mức độ tin cậy tốt và rất tốt thường an toàn để xóa, nhưng bạn vẫn nên kiểm tra lại chúng.</value>
<value>Việc phát hiện các tàn dư này là một quá trình phức tạp và có thể xảy ra sai sót. Do đó, tất cả các mục đều được gắn một mức độ tin cậy và quyết định cuối cùng thuộc về bạn. Các mục có độ tin cậy tốt và rất tốt thường an toàn để xóa nhưng vẫn nên kiểm tra kỹ lại chúng.</value>
</data>
<data name="headerConfTitle.Text" xml:space="preserve">
<value>Mức độ tin cậy</value>
</data>
<data name="headerIntro.Text" xml:space="preserve">
<value>Các mục sau đây dường như bị trình gỡ cài đặt của chúng bỏ lại. Một số trình gỡ cài đặt có thể không xóa được một số mục, và có thể dẫn đến chiếm dung lượng ổ đĩa. Tuy nhiên, hầu hết các mục này có thể là cài đặt của ứng dụng, thường chiếm rất ít dung lượng và vô hại.</value>
<value>Các mục sau đây dường như bị trình gỡ cài đặt của chúng bỏ lại. Một số trình gỡ cài đặt có thể không xóa sạch hoàn toàn, dẫn đến việc lãng phí dung lượng ổ cứng. Tuy nhiên, hầu hết các mục này có khả năng chỉ là các tệp cài đặt của ứng dụng, thường chiếm rất ít dung lượng và vô hại.</value>
</data>
<data name="olvColumnUninstallerName.Text" xml:space="preserve">
<value>Tên trình gỡ cài đặt</value>
@@ -163,7 +163,7 @@
<value>Huỷ</value>
</data>
<data name="exportDialog.Title" xml:space="preserve">
<value>Xuất danh sách các mục còn sót lại</value>
<value>Xuất danh sách tệp tàn dư</value>
<comment>leftover=rimanenti</comment>
</data>
<data name="exportDialog.Filter" xml:space="preserve">
82 changes: 52 additions & 30 deletions source/BulkCrapUninstaller/Forms/Windows/MainWindow.Designer.cs
85 changes: 53 additions & 32 deletions source/BulkCrapUninstaller/Forms/Windows/MainWindow.cs
Original file line number Diff line number Diff line change
@@ -354,8 +354,21 @@ private void DisposeListPostProcessor(object x, FormClosedEventArgs y)
_uninstallerListPostProcesser.Dispose();
}

private static bool _certificateColumnWasEnabled = true;
private void OnTestCertificatesChanged(object x, SettingChangedEventArgs<bool> y)
{
if (!y.NewValue)
{
_certificateColumnWasEnabled = olvColumnCertificate.IsVisible;
olvColumnCertificate.IsVisible = false;
uninstallerObjectListView.RebuildColumns();
}
else
{
olvColumnCertificate.IsVisible = _certificateColumnWasEnabled;
uninstallerObjectListView.RebuildColumns();
}

if (!_listView.FirstRefreshCompleted)
return;
if (y.NewValue) _uninstallerListPostProcesser.StartProcessingThread(_listView.FilteredUninstallers);
@@ -1419,7 +1432,7 @@ private void listView_ListRefreshIsRunningChanged(object sender,
_anySysComponents = _listView.AllUninstallers.Any(x => x.SystemComponent);
_anyUpdates = _listView.AllUninstallers.Any(x => x.IsUpdate);
_anyInvalid = _listView.AllUninstallers.Any(x => !x.IsValid);
_anyTweaks = _listView.AllUninstallers.Any(x => x.RatingId != null && x.RatingId.StartsWith("tweak", StringComparison.OrdinalIgnoreCase));
_anyTweaks = _listView.AllUninstallers.Any(x => x.IsScriptTweak);

propertiesSidebar.StoreAppsEnabled = _anyStoreApps;
propertiesSidebar.WinFeaturesEnabled = _anyWinFeatures;
@@ -1435,13 +1448,12 @@ private void listView_ListRefreshIsRunningChanged(object sender,
{
_setMan.LoadSorting();

var args = Environment.GetCommandLineArgs();
var dir = args.Skip(1).FirstOrDefault();
if (!string.IsNullOrEmpty(dir))
{
try
{
advancedFilters1.LoadUninstallList(dir);
var dir = StartupArgumentTools.GetStartupUninstallListPath(Environment.GetCommandLineArgs());
if (!string.IsNullOrEmpty(dir))
{
try
{
advancedFilters1.LoadUninstallList(dir);
}
catch (Exception ex)
{ PremadeDialogs.GenericError(ex); }
@@ -1608,11 +1620,18 @@ private void runToolStripMenuItem_DropDownItemClicked(object sender, ToolStripIt
PremadeDialogs.StartProcessSafely(e.ClickedItem.Text);
}

private void viewUpdatesToolStripMenuItem_Click(object sender, EventArgs e)
{
_setMan.Selected.Settings.FilterShowUpdates = true;
filterEditor1.Search(true.ToString(), ComparisonMethod.Equals, nameof(ApplicationUninstallerEntry.IsUpdate));
}
private void viewUpdatesToolStripMenuItem_Click(object sender, EventArgs e)
{
_setMan.Selected.Settings.FilterShowUpdates = true;
filterEditor1.Search(true.ToString(), ComparisonMethod.Equals, nameof(ApplicationUninstallerEntry.IsUpdate));
}

private void viewInvalidToolStripMenuItem_Click(object sender, EventArgs e)
{
everythingToolStripMenuItem_Click(sender, e);
_setMan.Selected.Settings.AdvancedTestInvalid = true;
filterEditor1.Search(false.ToString(), ComparisonMethod.Equals, nameof(ApplicationUninstallerEntry.IsValid));
}

private void filterEditor1_FocusSearchTarget(object sender, EventArgs e)
{
@@ -1682,11 +1701,12 @@ private void AddSelectedAsAdvancedFilters(bool exclude)
advancedFilters1.RepopulateList();
}

private void viewUnregisteredToolStripMenuItem_Click(object sender, EventArgs e)
{
_setMan.Selected.Settings.AdvancedDisplayOrphans = true;
filterEditor1.Search(true.ToString(), ComparisonMethod.Equals, nameof(ApplicationUninstallerEntry.IsOrphaned));
}
private void viewUnregisteredToolStripMenuItem_Click(object sender, EventArgs e)
{
everythingToolStripMenuItem_Click(sender, e);
_setMan.Selected.Settings.AdvancedDisplayOrphans = true;
filterEditor1.Search(true.ToString(), ComparisonMethod.Equals, nameof(ApplicationUninstallerEntry.IsOrphaned));
}

private void viewToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
{
@@ -1762,15 +1782,16 @@ private void troubleshootUninstallProblemsToolStripMenuItem_Click(object sender,
PremadeDialogs.StartProcessSafely(toolPath);
}

private void filteringToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
{
var isSimpleFiltering = !IsAdvancedFilteringEnabled;

viewUnregisteredToolStripMenuItem.Enabled = isSimpleFiltering;
viewUpdatesToolStripMenuItem.Enabled = isSimpleFiltering;
viewWindowsStoreAppsToolStripMenuItem.Enabled = isSimpleFiltering;
viewWindowsFeaturesToolStripMenuItem.Enabled = isSimpleFiltering;
}
private void filteringToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
{
var isSimpleFiltering = !IsAdvancedFilteringEnabled;

viewUnregisteredToolStripMenuItem.Enabled = isSimpleFiltering;
viewUpdatesToolStripMenuItem.Enabled = isSimpleFiltering;
viewInvalidToolStripMenuItem.Enabled = isSimpleFiltering;
viewWindowsStoreAppsToolStripMenuItem.Enabled = isSimpleFiltering;
viewWindowsFeaturesToolStripMenuItem.Enabled = isSimpleFiltering;
}

private void automaticallyStartedToolStripMenuItem_Click(object sender, EventArgs e)
{
@@ -1856,11 +1877,11 @@ private void onlyWebBrowsersToolStripMenuItem_Click(object sender, EventArgs e)
s.FilterShowTweaks = true;
}

private void viewTweaksToolStripMenuItem_Click(object sender, EventArgs e)
{
everythingToolStripMenuItem_Click(sender, e);
filterEditor1.Search(@"\Resources\Scripts\Tweak", ComparisonMethod.Contains, nameof(ApplicationUninstallerEntry.UninstallString));
}
private void viewTweaksToolStripMenuItem_Click(object sender, EventArgs e)
{
everythingToolStripMenuItem_Click(sender, e);
filterEditor1.Search(true.ToString(), ComparisonMethod.Equals, nameof(ApplicationUninstallerEntry.IsScriptTweak));
}

private void createRestorePointToolStripMenuItem_Click(object sender, EventArgs e)
{
37 changes: 20 additions & 17 deletions source/BulkCrapUninstaller/Forms/Windows/MainWindow.fr.resx
Original file line number Diff line number Diff line change
@@ -232,7 +232,7 @@
<value>Ouvrir dans l'&amp;explorateur...</value>
</data>
<data name="openWebPageContextMenuStripItem.Text" xml:space="preserve">
<value>Ouvrir la page &amp;web</value>
<value>Ouvrir la Page &amp;Web</value>
</data>
<data name="lookUpOnlineToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Rechercher en ligne</value>
@@ -247,10 +247,10 @@
<value>&amp;Recharger les désinstalleurs</value>
</data>
<data name="loadUninstallerListToolStripMenuItem.Text" xml:space="preserve">
<value>Charger la/les &amp;listes de désinstallation...</value>
<value>&amp;Ouvrir la Liste de Désinstallation...</value>
</data>
<data name="exportSelectedToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Exporter la sélection...</value>
<value>&amp;Exporter les données des désinstalleurs sélectionnés...</value>
</data>
<data name="exitToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Quitter</value>
@@ -259,16 +259,16 @@
<value>&amp;Fichier</value>
</data>
<data name="showColorLegendToolStripMenuItem.Text" xml:space="preserve">
<value>Montrer la légende des couleurs</value>
<value>Afficher la légende des couleurs</value>
</data>
<data name="displayToolbarToolStripMenuItem.Text" xml:space="preserve">
<value>Montrer la barre d'ou&amp;tils</value>
<value>Afficher la barre d'ou&amp;tils</value>
</data>
<data name="displayStatusbarToolStripMenuItem.Text" xml:space="preserve">
<value>Montrer la &amp;barre d'état</value>
<value>Afficher la &amp;barre d'état</value>
</data>
<data name="displaySettingsToolStripMenuItem.Text" xml:space="preserve">
<value>Montrer la barre latérale des réglage&amp;s</value>
<value>Afficher la barre latérale des réglage&amp;s</value>
</data>
<data name="useSystemThemeToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Utiliser le thème système</value>
@@ -316,13 +316,13 @@
<value>Ouvrir dans l'&amp;explorateur...</value>
</data>
<data name="toolStripMenuItem14.Text" xml:space="preserve">
<value>Ouvrir la page &amp;web</value>
<value>Ouvrir la Page &amp;Web</value>
</data>
<data name="onlineSearchToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Rechercher en ligne</value>
</data>
<data name="propertiesToolStripMenuItem.Text" xml:space="preserve">
<value>Montrer les &amp;propriétés</value>
<value>Afficher les &amp;propriétés</value>
</data>
<data name="basicOperationsToolStripMenuItem.Text" xml:space="preserve">
<value>Opérations &amp;basiques</value>
@@ -358,7 +358,7 @@
<value>Opérations a&amp;vancées</value>
</data>
<data name="cleanUpProgramFilesToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Nettoyer Program Files</value>
<value>&amp;Nettoyer les dossiers "Program Files"...</value>
</data>
<data name="openProgramsAndFeaturesToolStripMenuItem.Text" xml:space="preserve">
<value>Ouvrir "&amp;Programmes et Fonctionnalités"</value>
@@ -379,7 +379,7 @@
<value>Vérifier les mises à jour</value>
</data>
<data name="submitFeedbackToolStripMenuItem.Text" xml:space="preserve">
<value>Soumettre une réaction...</value>
<value>Soumettre un retour...</value>
</data>
<data name="resetSettingsToolStripMenuItem.Text" xml:space="preserve">
<value>Réinitialiser les réglages</value>
@@ -409,10 +409,10 @@
<value>Réglages</value>
</data>
<data name="toolStripButtonSelAll.Text" xml:space="preserve">
<value>Sélectionner tous les éléments</value>
<value>Sélectionner tout</value>
</data>
<data name="toolStripButtonSelNone.Text" xml:space="preserve">
<value>Désélectionner tous les éléments</value>
<value>Désélectionner tout</value>
</data>
<data name="toolStripButtonSelInv.Text" xml:space="preserve">
<value>Inverser la sélection</value>
@@ -439,7 +439,7 @@
<value>Noter...</value>
</data>
<data name="rateToolStripMenuItem1.Text" xml:space="preserve">
<value>Passez en revue...</value>
<value>Noter...</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Bulk Crap Uninstaller</value>
@@ -466,7 +466,7 @@
<value>Google</value>
</data>
<data name="toolStripMenuItem16.Text" xml:space="preserve">
<value>AlternativeTo</value>
<value>AlternativeTo.net</value>
</data>
<data name="viewUpdatesToolStripMenuItem.Text" xml:space="preserve">
<value>Voir les Mises à jour</value>
@@ -523,7 +523,7 @@
<value>Inclure</value>
</data>
<data name="showTreemapToolStripMenuItem.Text" xml:space="preserve">
<value>Montrer la &amp;carte en arbre</value>
<value>Afficher la &amp;carte arborescente</value>
</data>
<data name="viewUnregisteredToolStripMenuItem.Text" xml:space="preserve">
<value>Voir les Non Enregistrés</value>
@@ -562,7 +562,7 @@
<value>Filtres &amp;Rapides</value>
</data>
<data name="troubleshootUninstallProblemsToolStripMenuItem.Text" xml:space="preserve">
<value>Résolutions de problèmes de désinstallation...</value>
<value>Résoudre les problèmes de désinstallation...</value>
</data>
<data name="startDiskCleanupToolStripMenuItem.Text" xml:space="preserve">
<value>Lancer le Nettoyage de disque</value>
@@ -588,4 +588,7 @@
<data name="takeOwnershipToolStripMenuItem.Text" xml:space="preserve">
<value>Devenir propriétaire</value>
</data>
<data name="autosizeAllColumnsToolStripMenuItem.Text" xml:space="preserve">
<value>Redimensionner auto toutes les colonnes</value>
</data>
</root>
70 changes: 53 additions & 17 deletions source/BulkCrapUninstaller/Forms/Windows/MainWindow.resx
Original file line number Diff line number Diff line change
@@ -199,6 +199,12 @@
<data name="olvColumnPublisher.Width" type="System.Int32, mscorlib">
<value>160</value>
</data>
<data name="olvColumnCertificate.Text" xml:space="preserve">
<value>Certificate</value>
</data>
<data name="olvColumnCertificate.Width" type="System.Int32, mscorlib">
<value>70</value>
</data>
<data name="olvColumnRating.Text" xml:space="preserve">
<value>User rating</value>
</data>
@@ -265,6 +271,12 @@
<data name="olvColumnSystemComponent.Width" type="System.Int32, mscorlib">
<value>40</value>
</data>
<data name="olvColumnIntegrity.Text" xml:space="preserve">
<value>Integrity</value>
</data>
<data name="olvColumnIntegrity.Width" type="System.Int32, mscorlib">
<value>85</value>
</data>
<data name="olvColumnProtected.Text" xml:space="preserve">
<value>Protected</value>
</data>
@@ -299,7 +311,7 @@
<value>4, 3, 4, 3</value>
</data>
<data name="uninstallerObjectListView.Size" type="System.Drawing.Size, System.Drawing">
<value>377, 485</value>
<value>377, 482</value>
</data>
<data name="uninstallerObjectListView.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -326,7 +338,7 @@
<value>4, 3, 4, 3</value>
</data>
<data name="listViewPanel.Size" type="System.Drawing.Size, System.Drawing">
<value>379, 487</value>
<value>379, 484</value>
</data>
<data name="listViewPanel.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
@@ -365,7 +377,7 @@
<value>5, 3, 5, 3</value>
</data>
<data name="treeMap1.Size" type="System.Drawing.Size, System.Drawing">
<value>379, 56</value>
<value>379, 59</value>
</data>
<data name="treeMap1.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
@@ -398,7 +410,7 @@
<value>379, 548</value>
</data>
<data name="splitContainerListAndMap.SplitterDistance" type="System.Int32, mscorlib">
<value>487</value>
<value>484</value>
</data>
<data name="splitContainerListAndMap.SplitterWidth" type="System.Int32, mscorlib">
<value>5</value>
@@ -1489,12 +1501,18 @@
<data name="viewUpdatesToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>213, 22</value>
</data>
<data name="viewUpdatesToolStripMenuItem.Text" xml:space="preserve">
<value>View Updates</value>
</data>
<data name="viewWindowsFeaturesToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>213, 22</value>
</data>
<data name="viewUpdatesToolStripMenuItem.Text" xml:space="preserve">
<value>View Updates</value>
</data>
<data name="viewInvalidToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>213, 22</value>
</data>
<data name="viewInvalidToolStripMenuItem.Text" xml:space="preserve">
<value>View Invalid</value>
</data>
<data name="viewWindowsFeaturesToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>213, 22</value>
</data>
<data name="viewWindowsFeaturesToolStripMenuItem.Text" xml:space="preserve">
<value>View Windows Features</value>
</data>
@@ -2192,6 +2210,12 @@
<data name="&gt;&gt;olvColumnPublisher.Type" xml:space="preserve">
<value>BrightIdeasSoftware.OLVColumn, ObjectListView, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;olvColumnCertificate.Name" xml:space="preserve">
<value>olvColumnCertificate</value>
</data>
<data name="&gt;&gt;olvColumnCertificate.Type" xml:space="preserve">
<value>BrightIdeasSoftware.OLVColumn, ObjectListView, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;olvColumnRating.Name" xml:space="preserve">
<value>olvColumnRating</value>
</data>
@@ -2264,6 +2288,12 @@
<data name="&gt;&gt;olvColumnSystemComponent.Type" xml:space="preserve">
<value>BrightIdeasSoftware.OLVColumn, ObjectListView, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;olvColumnIntegrity.Name" xml:space="preserve">
<value>olvColumnIntegrity</value>
</data>
<data name="&gt;&gt;olvColumnIntegrity.Type" xml:space="preserve">
<value>BrightIdeasSoftware.OLVColumn, ObjectListView, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;olvColumnProtected.Name" xml:space="preserve">
<value>olvColumnProtected</value>
</data>
@@ -2843,12 +2873,18 @@
<data name="&gt;&gt;viewUpdatesToolStripMenuItem.Name" xml:space="preserve">
<value>viewUpdatesToolStripMenuItem</value>
</data>
<data name="&gt;&gt;viewUpdatesToolStripMenuItem.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;viewWindowsFeaturesToolStripMenuItem.Name" xml:space="preserve">
<value>viewWindowsFeaturesToolStripMenuItem</value>
</data>
<data name="&gt;&gt;viewUpdatesToolStripMenuItem.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;viewInvalidToolStripMenuItem.Name" xml:space="preserve">
<value>viewInvalidToolStripMenuItem</value>
</data>
<data name="&gt;&gt;viewInvalidToolStripMenuItem.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;viewWindowsFeaturesToolStripMenuItem.Name" xml:space="preserve">
<value>viewWindowsFeaturesToolStripMenuItem</value>
</data>
<data name="&gt;&gt;viewWindowsFeaturesToolStripMenuItem.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
@@ -3344,4 +3380,4 @@
<metadata name="usageTracker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 60</value>
</metadata>
</root>
</root>
191 changes: 97 additions & 94 deletions source/BulkCrapUninstaller/Forms/Windows/MainWindow.vi.resx

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -175,7 +175,7 @@ BCU attendra la fin de la commande courante avant d'exécuter la suivante.</valu
<value>Divers</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Réglages de BCUninstaller</value>
<value>Réglages de Bulk Crap Uninstaller</value>
</data>
<data name="tabPageFolders.Text" xml:space="preserve">
<value>Dossiers</value>
@@ -200,7 +200,7 @@ Utilisez des chemins complets de dossiers, un chemin par ligne. Les chemins inva
<value>Toujours montrer les résidus avec faible confiance</value>
</data>
<data name="checkBoxNeverFeedback.Text" xml:space="preserve">
<value>Ne jamais demander les impressions ou de l'aide</value>
<value>Ne jamais demander les retours ou de l'aide</value>
</data>
<data name="checkBoxScanSteam.Text" xml:space="preserve">
<value>Steam</value>
@@ -251,7 +251,7 @@ Utilisez des chemins complets de dossiers, un chemin par ligne. Les chemins inva
<value>Sauvegarder avant la suppression des résidus</value>
</data>
<data name="groupBoxLanguage.Text" xml:space="preserve">
<value>Langue</value>
<value>Langage</value>
</data>
<data name="tabPageInterface.Text" xml:space="preserve">
<value>Interface</value>
68 changes: 34 additions & 34 deletions source/BulkCrapUninstaller/Forms/Windows/SettingsWindow.vi.resx
Original file line number Diff line number Diff line change
@@ -118,17 +118,17 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label5.Text" xml:space="preserve">
<value>Câu lệnh trước khi bắt đầu gỡ cài đặt</value>
<value>Câu lệnh thực thi trước khi bắt đầu gỡ cài đặt</value>
</data>
<data name="label6.Text" xml:space="preserve">
<value>Câu lệnh sau khi gỡ cài đặt kết thúc</value>
<value>Câu lệnh thực thi sau khi bắt đầu gỡ cài đặt</value>
</data>
<data name="checkBoxColorblind.Text" xml:space="preserve">
<value>Chế độ mù màu</value>
<value>Chế độ cho người mù màu</value>
<comment>Switches colors to be better for color-blind people</comment>
</data>
<data name="checkBoxDpiaware.Text" xml:space="preserve">
<value>Bật tính năng tỷ lệ giao diện hỗ trợ DPI</value>
<value>Bật tính năng DPI-aware</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>Nhấp đúp vào danh sách ứng dụng</value>
@@ -137,13 +137,13 @@
<value>Lặt vặt</value>
</data>
<data name="checkBoxAutoLoad.Text" xml:space="preserve">
<value>Tự động nạp danh sách bộ lọc gỡ cài đặt có tên "Default.bcul" khi khởi động</value>
<value>Tự động tải Danh sách bộ lọc gỡ cài đặt "Default.bcul" khi khởi động</value>
</data>
<data name="checkBoxRatings.Text" xml:space="preserve">
<value>Hiển thị xếp hạng người dùng cho ứng dụng</value>
<value>Bật tính năng hiển thị đánh giá ứng dụng từ người dùng</value>
</data>
<data name="checkBoxUpdateSearch.Text" xml:space="preserve">
<value>Kiểm tra các bản cập nhật khi khởi động</value>
<value>Tự động kiểm tra cập nhật khi khởi động</value>
</data>
<data name="checkBoxSendStats.Text" xml:space="preserve">
<value>Gửi số liệu thống kê sử dụng ẩn danh</value>
@@ -152,54 +152,54 @@
<value>Ngôn ngữ ứng dụng:</value>
</data>
<data name="label10.Text" xml:space="preserve">
<value>Ứng dụng phải được khởi động lại để thay đổi ngôn ngữ có hiệu lực.</value>
<value>Ứng dụng sẽ phải khởi động lại để thay đổi ngôn ngữ có hiệu lực.</value>
</data>
<data name="radioButtonBackupAsk.Text" xml:space="preserve">
<value>Luôn yêu cầu tạo</value>
<value>Luôn hỏi trước khi tạo</value>
</data>
<data name="radioButtonBackupNever.Text" xml:space="preserve">
<value>Không bao giờ yêu cầu tạo</value>
<value>Không bao giờ hỏi</value>
</data>
<data name="radioButtonBackupAuto.Text" xml:space="preserve">
<value>Tự động tạo trong thư mục:</value>
</data>
<data name="groupBoxBackup.Text" xml:space="preserve">
<value>Sao lưu trước khi xóa phần còn sót lại</value>
<value>Sao lưu trước khi dọn dẹp tàn dư</value>
</data>
<data name="checkBoxShowAllBadJunk.Text" xml:space="preserve">
<value>Luôn hiển thị nội dung rác với độ tin cậy thấp</value>
<value>Luôn hiển thị dữ liệu rác độ tin cậy thấp</value>
</data>
<data name="checkBoxLoud.Text" xml:space="preserve">
<value>Yêu cầu xóa trình gỡ cài đặt gốc khỏi tác vụ âm thầm</value>
<value>Hỏi trước khi xóa các trình gỡ có giao diện (Loud) khỏi tác vụ yên lặng</value>
</data>
<data name="checkBoxNeverFeedback.Text" xml:space="preserve">
<value>Không bao giờ yêu cầu phản hồi hoặc trợ giúp</value>
<value>Không bao giờ hỏi xin phản hồi hoặc trợ giúp</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>Tìm kiếm rác sau khi gỡ cài đặt</value>
<value>Tìm kiếm dữ liệu rác sau khi gỡ cài đặt</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>Tạo điểm khôi phục trước khi gỡ cài đặt</value>
<value>Tạo điểm khôi phục (Restore point) trước khi gỡ cài đặt</value>
</data>
<data name="groupBoxMessages.Text" xml:space="preserve">
<value>Hộp tin nhắn</value>
<value>Hộp thoại thông báo</value>
</data>
<data name="checkBoxEnableExternal.Text" xml:space="preserve">
<value>Cho phép thực thi các ứng dụng bên ngoài</value>
</data>
<data name="label7.Text" xml:space="preserve">
<value>Bạn có thể chỉ định các câu lệnh sẽ thực thi trước và sau khi gỡ cài đặt. Mỗi dòng tương ứng với một lệnh và được thực thi như thể sử dụng hộp thoại "Khởi chạy...".
<value>Bạn có thể chỉ định các lệnh sẽ chạy trước và sau khi gỡ cài đặt. Mỗi dòng tương đương với một lệnh và sẽ được thực thi tương tự như khi bạn dùng hộp thoại "Run..." của Windows.

BCU sẽ đợi cho đến khi lệnh hiện đang thực thi hoàn tất trước khi thực thi lệnh tiếp theo.</value>
BCU sẽ đợi cho đến khi lệnh hiện tại chạy xong rồi mới thực hiện lệnh tiếp theo.</value>
</data>
<data name="groupBoxExternal.Text" xml:space="preserve">
<value>Ứng dụng bên ngoài</value>
</data>
<data name="button2.Text" xml:space="preserve">
<value>Đó&amp;ng</value>
<value>Đóng (&amp;C)</value>
</data>
<data name="tabPageGeneral.Text" xml:space="preserve">
<value>Chung</value>
<value>Tổng quan</value>
</data>
<data name="groupBoxLanguage.Text" xml:space="preserve">
<value>Ngôn ngữ</value>
@@ -211,13 +211,13 @@ BCU sẽ đợi cho đến khi lệnh hiện đang thực thi hoàn tất trư
<value>Gỡ cài đặt</value>
</data>
<data name="labelWinUpdateInfo.Text" xml:space="preserve">
<value>Phát hiện Windows Updates sử dụng WUA, vốn khá chậm. Quá trình này có thể mất vài phút để hoàn tất.</value>
<value>Việc phát hiện các bản cập nhật Windows sử dụng dịch vụ WUA nên khá chậm. Quá trình này có thể mất vài phút để hoàn thành.</value>
</data>
<data name="checkBoxScanWinUpdates.Text" xml:space="preserve">
<value>Windows Update</value>
</data>
<data name="labelWinFeatureInfo.Text" xml:space="preserve">
<value>Phát hiện Windows Features sử dụng WMI và trên một số hệ thống quá trình này có thể chậm hoặc thậm chí thất bại (thường là dấu hiệu cho thấy hệ thống bị lỗi).</value>
<value>Việc phát hiện các Tính năng Windows (Windows Features) sử dụng dịch vụ WMI nên có thể chạy chậm hoặc thậm chí bị lỗi trên một số hệ thống (thường là dấu hiệu hệ thống đã bị lỗi/hỏng tệp).</value>
</data>
<data name="checkBoxScanWinFeatures.Text" xml:space="preserve">
<value>Windows Features</value>
@@ -238,39 +238,39 @@ BCU sẽ đợi cho đến khi lệnh hiện đang thực thi hoàn tất trư
<value>Chocolatey</value>
</data>
<data name="groupBoxAppStores.Text" xml:space="preserve">
<value>Kho ứng dụng để quét</value>
<value>Các chợ ứng dụng cần quét</value>
</data>
<data name="checkBoxScanRegistry.Text" xml:space="preserve">
<value>Registry (khuyến khích bật)</value>
<value>Registry (khuyến nghị nên bật)</value>
</data>
<data name="checkBoxScanDrives.Text" xml:space="preserve">
<value>Ổ đĩa (phát hiện các ứng dụng chưa đăng ký)</value>
<value>Ổ đĩa (Để phát hiện các ứng dụng không có thông tin đăng ký)</value>
</data>
<data name="checkBoxPreDefined.Text" xml:space="preserve">
<value>Dựa trên các quy tắc được xác định trước</value>
<value>Dựa trên các quy tắc đã định nghĩa trước</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Tìm kiếm ứng dụng trong...</value>
</data>
<data name="tabPageDetection.Text" xml:space="preserve">
<value>Phát hiện</value>
<value>Quét &amp; Phát hiện</value>
</data>
<data name="tabPageExternal.Text" xml:space="preserve">
<value>Công cụ bên ngoài</value>
</data>
<data name="checkBoxRemovable.Text" xml:space="preserve">
<value>Quét các ổ đĩa di động</value>
<value>Quét các ổ đĩa di động (USB, ổ cứng ngoài)</value>
<comment>Scan pendrives, USB hard drives, SD Cards, etc.</comment>
</data>
<data name="checkBoxAutoInstallFolderDetect.Text" xml:space="preserve">
<value>Cố gắng tự động phát hiện các thư mục cài đặt tùy chỉnh</value>
</data>
<data name="labelProgramFolders.Text" xml:space="preserve">
<value>Bạn có thể thiết lập các thư mục cài đặt ứng dụng tùy chỉnh (ví dụ: D:\Applications). Những thư mục đó sẽ được BCU sẽ sử dụng các thư mục này để tìm kiếm các tệp sót lại sau khi gỡ cài đặt, các ứng dụng chưa đăng ký và một vài thứ khác. Mặc dù không bắt buộc, nhưng việc cung cấp danh sách các thư mục này sẽ giúp BCU hoạt động hiệu quả hơn.
<value>Bạn có thể chỉ định các thư mục tùy chỉnh mà bạn thường cài đặt ứng dụng vào đó (ví dụ: D:\Applications). BCU sẽ sử dụng các thư mục này để tìm kiếm tàn dư gỡ cài đặt, các ứng dụng không đăng ký và một số thứ khác. Mặc dù không bắt buộc, danh sách các thư mục này sẽ giúp BCU hoạt động hiệu quả hơn.

Các thư mục mặc định của Windows luôn được quét, bạn không cần đưa chúng vào danh sách này.
Các thư mục mặc định của Windows luôn được tự động quét, bạn không cần thêm chúng vào danh sách này.

Hãy sử dụng đường dẫn thư mục đầy đủ, một dòng một đường dân. Đường dẫn không hợp lệ thư mục không tồn tại sẽ bị bỏ qua.</value>
Sử dụng đường dẫn thư mục đầy đủ, mỗi dòng một đường dẫn. Các đường dẫn không hợp lệ hoặc thư mục không tồn tại sẽ bị bỏ qua.</value>
</data>
<data name="groupBoxProgramFolders.Text" xml:space="preserve">
<value>Thư mục cài đặt ứng dụng</value>
@@ -279,10 +279,10 @@ Hãy sử dụng đường dẫn thư mục đầy đủ, một dòng một đư
<value>Thư mục</value>
</data>
<data name="groupBox2.Text" xml:space="preserve">
<value>Khởi động cùng hệ thống</value>
<value>Khởi động cùng hệ thống (Startup)</value>
</data>
<data name="groupBox3.Text" xml:space="preserve">
<value>Mạng</value>
<value>Mạng (Network)</value>
</data>
<data name="tabPageMisc.Text" xml:space="preserve">
<value>Lặt vặt</value>
Original file line number Diff line number Diff line change
@@ -134,7 +134,7 @@
</data>
<data name="label3.Text" xml:space="preserve">
<value>Les désinstalleurs sélectionnés vont maintenant être exécutés un à la fois.
Si le processus semble bloqué, vous pouvez cliquer sur le bouton "Passer" pour éviter d'attendre qu'il se termine. Cela peut arriver si le désinstalleur plante ou démarre un nouveau processus et ne le ferme pas. </value>
Si le processus semble bloqué, vous pouvez cliquer sur le bouton "Passer" pour éviter d'attendre qu'il se termine. Cela peut arriver si le désinstalleur plante ou démarre un nouveau processus et ne le ferme pas.</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Liste de désinstalleurs</value>
@@ -152,13 +152,13 @@ Si le processus semble bloqué, vous pouvez cliquer sur le bouton "Passer" pour
<value>Id</value>
</data>
<data name="toolStripButtonRun.Text" xml:space="preserve">
<value>Lancer le désinstalleur maintenant</value>
<value>Lancer le désinstalleur</value>
</data>
<data name="toolStripButtonTerminate.Text" xml:space="preserve">
<value>Interrompre</value>
</data>
<data name="toolStripButtonFolderOpen.Text" xml:space="preserve">
<value>Ouvrir le l'emplacement d'installation</value>
<value>Ouvrir l'emplacement d'installation</value>
</data>
<data name="toolStripButtonProperties.Text" xml:space="preserve">
<value>Propriétés</value>
Original file line number Diff line number Diff line change
@@ -127,7 +127,7 @@
<value>Trạng thái</value>
</data>
<data name="olvColumnIsSilent.Text" xml:space="preserve">
<value>Gỡ âm thầm</value>
<value>Chế độ yên lặng (Quiet)</value>
</data>
<data name="olvColumnName.Text" xml:space="preserve">
<value>Tên</value>
@@ -139,10 +139,10 @@
<value>Bỏ qua</value>
</data>
<data name="terminateToolStripMenuItem.Text" xml:space="preserve">
<value>Chấm dứt</value>
<value>Buộc dừng (Terminate)</value>
</data>
<data name="runNowToolStripMenuItem.Text" xml:space="preserve">
<value>Khởi chạy ngay bây giờ</value>
<value>Gỡ ngay bây giờ</value>
</data>
<data name="manualUninstallToolStripMenuItem.Text" xml:space="preserve">
<value>Gỡ cài đặt thủ công</value>
@@ -151,20 +151,20 @@
<value>Mở thư mục cài đặt</value>
</data>
<data name="propertiesToolStripMenuItem.Text" xml:space="preserve">
<value>Thuộc tính</value>
<value>Chi tiết</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>Các trình gỡ cài đặt đã chọn sẽ được chạy lần lượt.
Nếu quá trình dường như bị kẹt, bạn có thể nhấp vào nút "Bỏ qua" để tránh phải đợi nó hoàn thành. Điều này có thể xảy ra nếu trình gỡ cài đặt bị lỗi hoặc khởi chạy một tiến trình mới không đóng nó lại.</value>
<value>Các bộ gỡ cài đặt được chọn sẽ lần lượt được thực thi theo thứ tự.
Nếu quá trình có vẻ bị treo, bạn có thể nhấp vào nút "Bỏ qua" để tránh phải chờ đợi tốn thời gian. Điều này có thể xảy ra nếu bộ gỡ cài đặt bị lỗi (crash) hoặc khởi chạy một tiến trình mới không tự đóng lại.</value>
</data>
<data name="toolStripButtonRun.Text" xml:space="preserve">
<value>Khởi chạy trình gỡ cài đặt</value>
<value>Chạy trình gỡ cài đặt</value>
</data>
<data name="toolStripButtonSkip.Text" xml:space="preserve">
<value>Bỏ qua</value>
</data>
<data name="toolStripButtonTerminate.Text" xml:space="preserve">
<value>Chấm dứt</value>
<value>Buộc dừng (Terminate)</value>
</data>
<data name="toolStripButtonManualUninstall.Text" xml:space="preserve">
<value>Gỡ cài đặt thủ công</value>
@@ -173,7 +173,7 @@ Nếu quá trình dường như bị kẹt, bạn có thể nhấp vào nút "B
<value>Mở thư mục cài đặt</value>
</data>
<data name="toolStripButtonProperties.Text" xml:space="preserve">
<value>Thuộc tính</value>
<value>Chi tiết</value>
</data>
<data name="toolStripButtonSettings.Text" xml:space="preserve">
<value>Cài đặt</value>
@@ -182,13 +182,13 @@ Nếu quá trình dường như bị kẹt, bạn có thể nhấp vào nút "B
<value>Trợ giúp</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>Chúng sẽ được gỡ cài đặt theo thứ tự từ trên xuống.</value>
<value>Các mục trong danh sách này sẽ bị gỡ cài đặt theo thứ tự từ trên xuống dưới.</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Danh sách trình gỡ cài đặt</value>
</data>
<data name="checkBoxFinishSleep.Text" xml:space="preserve">
<value>Thiết lập PC của bạn vào chế độ ngủ khi hoàn tất</value>
<value>Chuyển PC của bạn sang chế độ ngủ (Sleep) khi hoàn tất</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Tiến trình gỡ cài đặt</value>
Original file line number Diff line number Diff line change
@@ -145,16 +145,7 @@
<value>Certaines applications doivent peut-être être fermées avant désinstallation</value>
</data>
<data name="tabPage3.Text" xml:space="preserve">
<value>En cours</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>Créer un point de restauration avant désinstallation</value>
</data>
<data name="label4.Text" xml:space="preserve">
<value>Vous pouvez créer un point de restauration système pour sauvegarder le registre, certains paramètres et fichiers. Il est recommandé de créer un point de restauration avant de supprimer des pilotes et des applications système importantes.</value>
</data>
<data name="label8.Text" xml:space="preserve">
<value>Attention: la restauration système doit être activée pour que cela fonctionne!</value>
<value>Applis en cours</value>
</data>
<data name="label5.Text" xml:space="preserve">
<value>Changer les réglages de désinstallation</value>
@@ -208,7 +199,7 @@
<value>COMMENCER LA DESINSTALLATION</value>
</data>
<data name="label6.Text" xml:space="preserve">
<value>Assurez-vous que les informations suivantes sont correctes avant de commencer la désinstallation. C'est la dernière chance!</value>
<value>Assurez-vous que les informations suivantes sont correctes avant de commencer la désinstallation. C'est la dernière chance !</value>
</data>
<data name="tabPage5.Text" xml:space="preserve">
<value>Final</value>
Original file line number Diff line number Diff line change
@@ -124,10 +124,10 @@
<value>Huỷ</value>
</data>
<data name="buttonPrev.Text" xml:space="preserve">
<value>Trờ về</value>
<value>Quay lại</value>
</data>
<data name="buttonNext.Text" xml:space="preserve">
<value>Tiếp tục</value>
<value>Kế tiếp</value>
</data>
<data name="tabPage1.Text" xml:space="preserve">
<value>Có liên quan đến</value>
@@ -136,7 +136,7 @@
<value>Xác nhận</value>
</data>
<data name="tabPage3.Text" xml:space="preserve">
<value>Các ứng dụng đang khởi chạy</value>
<value>Ứng dụng đang chạy</value>
</data>
<data name="tabPage4.Text" xml:space="preserve">
<value>Cài đặt</value>
@@ -151,60 +151,60 @@
<value>l</value>
</data>
<data name="label17.Text" xml:space="preserve">
<value>Cho phép gỡ cài đặt đồng thời</value>
<value>Tính năng gỡ cài đặt đồng thời đang được bật</value>
</data>
<data name="labelWillBeSilent.Text" xml:space="preserve">
<value>l</value>
</data>
<data name="label15.Text" xml:space="preserve">
<value>Gỡ cài đặt âm thầm</value>
<value>Quá trình gỡ cài đặt sẽ chạy ở chế độ im lặng (Silent)</value>
</data>
<data name="labelRestorePointCreated.Text" xml:space="preserve">
<value>l</value>
</data>
<data name="label13.Text" xml:space="preserve">
<value>Tạo một điểm khôi phục mới</value>
<value>Tạo một điểm khôi phục (Restore point) mới</value>
</data>
<data name="labelFilesStillUsed.Text" xml:space="preserve">
<value>l</value>
</data>
<data name="label11.Text" xml:space="preserve">
<value>Đang được sử dụng bởi tiến trình khác</value>
<value>Các tệp tin vẫn đang được sử dụng bởi các tiến trình khác</value>
</data>
<data name="labelTotalSize.Text" xml:space="preserve">
<value>l</value>
</data>
<data name="label9.Text" xml:space="preserve">
<value>Ước tính kích thước tổng</value>
<value>Tổng dung lượng ước tính</value>
</data>
<data name="labelApps.Text" xml:space="preserve">
<value>l</value>
</data>
<data name="label7.Text" xml:space="preserve">
<value>Các ứng dụng cần gỡ cài đặt</value>
<value>Các ứng dụng sẽ gỡ cài đặt</value>
</data>
<data name="button2.Text" xml:space="preserve">
<value>BẮT ĐẦU QUÁ TRÌNH GỠ CÀI ĐẶT</value>
</data>
<data name="tabPage5.Text" xml:space="preserve">
<value>Phần cuối</value>
<value>Xác nhận cuối cùng</value>
</data>
<data name="p1Heading.Text" xml:space="preserve">
<value>Các ứng dụng liên quan mà bạn có thể muốn gỡ cài đặt</value>
<value>Các ứng dụng liên quan có thể bạn muốn gỡ cài đặt</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>Xác nhận rằng những mục dưới đây không có vấn đề gì khi gỡ cài đặt</value>
<value>Xác nhận rằng tất cả các mục dưới đây đều an toàn để gỡ cài đặt</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>Một số ứng dụng có thể cần được đóng lại trước khi gỡ cài đặt</value>
<value>Một số ứng dụng có thể cần phải đóng lại trước khi tiến hành gỡ cài đặt</value>
</data>
<data name="label5.Text" xml:space="preserve">
<value>Thay đổi cài đặt mặc định của bạn</value>
</data>
<data name="label6.Text" xml:space="preserve">
<value>Vui lòng xác nhận rằng tất cả thông tin dưới đây chính xác trước khi bắt đầu gỡ cài đặt. Đây là lần cơ hội cuối cùng của bạn!</value>
<value>Vui lòng đảm bảo các thông tin sau đây đã chính xác trước khi bắt đầu. Đây là cơ hội cuối cùng của bạn!</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Bắt đầu quá trình gỡ cài đặt mới</value>
<value>Bắt đầu tác vụ gỡ cài đặt mới</value>
</data>
</root>
18 changes: 9 additions & 9 deletions source/BulkCrapUninstaller/Forms/Wizards/FirstStartBox.fr.resx
Original file line number Diff line number Diff line change
@@ -127,10 +127,10 @@
<value>Continuer</value>
</data>
<data name="buttonFinish.Text" xml:space="preserve">
<value>Quitter l'assistant</value>
<value>Terminer l'installation</value>
</data>
<data name="p5finishContact.Text" xml:space="preserve">
<value>Vous pouvez maintenant utiliser BCUninstaller. Si vous avez toute question ou souhaiteriez suggérer une nouvelle fonction, visitez le lien ci-dessous.</value>
<value>Vous pouvez maintenant utiliser BCUninstaller. Si vous des questions ou souhaiteriez suggérer une nouvelle fonction, visitez le lien ci-dessous.</value>
</data>
<data name="p5LinkContact.Text" xml:space="preserve">
<value>Ouvrir le formulaire de contact</value>
@@ -170,7 +170,7 @@ de l'application</value>
<value>Vous pouvez chercher manuellement les mises à jour depuis la barre de menus.</value>
</data>
<data name="checkBoxSendStats.Text" xml:space="preserve">
<value>Envoyer automatiquement les statistiques d'utilisation</value>
<value>Envoyer automatiquement les statistiques anonymes d'utilisation</value>
</data>
<data name="p4netUsageAdd.Text" xml:space="preserve">
<value>L'envoi de ces statistiques aidera à améliorer BCUninstaller.</value>
@@ -219,7 +219,7 @@ Si le désinstalleur d'origine est introuvable, vous devrez utiliser l'option "D
<value>Les applications marquées comme "composants système" sont cachées de la plupart des gestionnaires basiques de désinstallation. Cette balise ne signifie PAS que l'application fait partie du système d'exploitation.</value>
</data>
<data name="checkBoxListSysComp.Text" xml:space="preserve">
<value>Montrer les désinstalleurs marqués comme
<value>Afficher les désinstalleurs marqués comme
"composants système"</value>
</data>
<data name="p3advProtectTitle.Text" xml:space="preserve">
@@ -229,7 +229,7 @@ Si le désinstalleur d'origine est introuvable, vous devrez utiliser l'option "D
<value>Les éléments protégés sont marqués avec la balise "NoRemove", qui signifie que l'éditeur ne veut pas que vous les supprimiez. Cette balise est souvent utilisée par des grands ensembles de logiciels pour vous empêcher de désinstaller leurs parties individuelles.</value>
</data>
<data name="checkBoxListProtected.Text" xml:space="preserve">
<value>Montrer les désinstalleurs marqués comme "protégés"</value>
<value>Afficher les désinstalleurs marqués comme "protégés"</value>
</data>
<data name="checkBoxDiisableProtection.Text" xml:space="preserve">
<value>Désactiver la protection des désinstalleurs marqués
@@ -254,7 +254,7 @@ comme "protégés"</value>
<value>● Grouper les désinstalleurs similaires.</value>
</data>
<data name="checkBoxGroups.Text" xml:space="preserve">
<value>Montrer les désinstalleurs en groupes</value>
<value>Afficher les désinstalleurs en groupes</value>
</data>
<data name="checkBoxCheckboxes.Text" xml:space="preserve">
<value>Sélectionnner par cases à cocher</value>
@@ -279,16 +279,16 @@ Attention : la vérification peut mettre longtemps.</value>
<value>Cet assistant vous fera faire un tour rapide et aidera à configurer l'application.</value>
</data>
<data name="p1languageHeading.Text" xml:space="preserve">
<value>Langage sélectionné</value>
<value>Langue sélectionnée</value>
</data>
<data name="p1languageDesc.Text" xml:space="preserve">
<value>Vous pouvez forcer BCUninstaller à utiliser une localisation spécifique si le langage par défaut est incorrect. Un redémarrage sera réalisé pour appliquer le nouveau langage. </value>
<value>Vous pouvez forcer BCUninstaller à utiliser une localisation spécifique si la langue par défaut est incorrecte. Un redémarrage sera réalisé pour appliquer la nouvelle langue. </value>
</data>
<data name="buttonLanguageApply.Text" xml:space="preserve">
<value>Appliquer</value>
</data>
<data name="p1languageExtradetails.Text" xml:space="preserve">
<value>Si vous souhaitez aider à traduire BCUninstaller dans votre langage, cliquez sur le lien ci-dessous pour me contacter. Toute aide est grandement appréciée !</value>
<value>Si vous souhaitez aider à traduire BCUninstaller dans votre langue, cliquez sur le lien ci-dessous pour me contacter. Toute aide est grandement appréciée !</value>
</data>
<data name="p1linkLabelContact.Text" xml:space="preserve">
<value>Ouvrir le formulaire de contact</value>
83 changes: 41 additions & 42 deletions source/BulkCrapUninstaller/Forms/Wizards/FirstStartBox.vi.resx

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -3,20 +3,54 @@
Apache License Version 2.0
*/

using System.Drawing;
using BulkCrapUninstaller.Properties;
using UninstallTools;

namespace BulkCrapUninstaller.Functions.ApplicationList
{
internal static class ApplicationListConstants
{
public static ApplicationListColors Colors => Settings.Default.MiscColorblind ? ApplicationListColors.ColorBlind : ApplicationListColors.Normal;

public static Color GetApplicationBackColor(ApplicationUninstallerEntry entry)
{
if (Settings.Default.AdvancedHighlightSpecial)
{
using System.Drawing;
using BulkCrapUninstaller.Properties;
using Klocman.Resources;
using UninstallTools;

namespace BulkCrapUninstaller.Functions.ApplicationList
{
internal static class ApplicationListConstants
{
public static ApplicationListColors Colors => Settings.Default.MiscColorblind ? ApplicationListColors.ColorBlind : ApplicationListColors.Normal;

public static string GetApplicationCertificateText(ApplicationUninstallerEntry entry)
{
if (entry == null) return Localisable.Empty;

if (!Settings.Default.AdvancedTestCertificates)
return CommonStrings.Unknown;

var result = entry.IsCertificateValid(true);
if (!result.HasValue)
return Localisable.CertificateColumn_NotFound;

return result.Value ? Localisable.CertificateColumn_Verified : Localisable.CertificateColumn_Unverified;
}

public static object GetApplicationIntegrityText(ApplicationUninstallerEntry entry)
{
if (entry == null) return Localisable.Empty;

var missingRegistry = entry.IsOrphaned || !entry.IsRegistered;
var missingUninstaller = !entry.IsValid;

if (missingRegistry && missingUninstaller)
return new[] { Localisable.IntegrityColumn_Invalid, Localisable.IntegrityColumn_Unregistered };

if (missingRegistry)
return Localisable.IntegrityColumn_Unregistered;

if (missingUninstaller)
return Localisable.IntegrityColumn_Invalid;

return Localisable.IntegrityColumn_Good;
}

public static Color GetApplicationBackColor(ApplicationUninstallerEntry entry)
{
if (Settings.Default.AdvancedHighlightSpecial)
{
if (entry.UninstallerKind == UninstallerType.WindowsFeature)
return Colors.WindowsFeatureColor;

@@ -64,8 +98,8 @@ public static Color GetApplicationTreemapColor(ApplicationUninstallerEntry entry
? Colors.VerifiedColor
: Colors.UnverifiedColor;
}

return Color.White;
}
}
}

return Color.White;
}
}
}
Original file line number Diff line number Diff line change
@@ -111,10 +111,9 @@ public IEnumerable<Filter> GenerateEquivalentFilter()
results.Add(new Filter("Updates", true, new FilterCondition(true.ToString(),
ComparisonMethod.Equals, nameof(ApplicationUninstallerEntry.IsUpdate))));

// TODO Better detection, can lead to bugs down the line
if (!_settings.Settings.FilterShowTweaks)
results.Add(new Filter("Tweaks", true, new FilterCondition(@"\Resources\Scripts\Tweak",
ComparisonMethod.Contains, nameof(ApplicationUninstallerEntry.UninstallString))));
if (!_settings.Settings.FilterShowTweaks)
results.Add(new Filter("Tweaks", true, new FilterCondition(true.ToString(),
ComparisonMethod.Equals, nameof(ApplicationUninstallerEntry.IsScriptTweak))));

return results;
}
@@ -143,13 +142,10 @@ private bool ListViewFilter(object obj)

if (!_settings.Settings.FilterShowUpdates && entry.IsUpdate) return false;

if (entry.RatingId != null)
{
if (!_settings.Settings.FilterShowTweaks && entry.RatingId.StartsWith("tweak", StringComparison.Ordinal))
return false;
}

if (string.IsNullOrEmpty(_filteringFilterCondition.FilterText)) return true;
if (!_settings.Settings.FilterShowTweaks && entry.IsScriptTweak)
return false;

if (string.IsNullOrEmpty(_filteringFilterCondition.FilterText)) return true;

return _filteringFilterCondition.TestEntry(entry) == true;
}
@@ -201,12 +197,17 @@ public void SetupListView()
_reference.olvColumnGuid.AspectGetter = ListViewDelegates.ColumnGuidAspectGetter;
_reference.olvColumnGuid.GroupKeyGetter = ListViewDelegates.ColumnGuidGroupKeyGetter;

_reference.olvColumnSystemComponent.AspectName = RegistryFactory.RegistryNameSystemComponent;
_reference.olvColumnSystemComponent.AspectToStringConverter = ListViewDelegates.BoolToYesNoAspectConverter;
_reference.olvColumnSystemComponent.GroupKeyToTitleConverter = ListViewDelegates.BoolToYesNoAspectConverter;

_reference.olvColumnIs64.AspectGetter =
y => (y as ApplicationUninstallerEntry)?.Is64Bit.GetLocalisedName();
_reference.olvColumnSystemComponent.AspectName = RegistryFactory.RegistryNameSystemComponent;
_reference.olvColumnSystemComponent.AspectToStringConverter = ListViewDelegates.BoolToYesNoAspectConverter;
_reference.olvColumnSystemComponent.GroupKeyToTitleConverter = ListViewDelegates.BoolToYesNoAspectConverter;

_reference.olvColumnCertificate.AspectGetter = y => ApplicationListConstants.GetApplicationCertificateText(y as ApplicationUninstallerEntry);

_reference.olvColumnIntegrity.AspectGetter = y => ApplicationListConstants.GetApplicationIntegrityText(y as ApplicationUninstallerEntry);
_reference.olvColumnIntegrity.AspectToStringConverter = x => x is string[] arr ? string.Join(", ", arr) : x?.ToString();

_reference.olvColumnIs64.AspectGetter =
y => (y as ApplicationUninstallerEntry)?.Is64Bit.GetLocalisedName();

_reference.olvColumnProtected.AspectToStringConverter = ListViewDelegates.BoolToYesNoAspectConverter;
_reference.olvColumnProtected.GroupKeyToTitleConverter = ListViewDelegates.BoolToYesNoAspectConverter;
@@ -267,4 +268,4 @@ public void UpdateColumnFiltering(bool anyUninstallers)
_updateThrottleTimer.Start();
}
}
}
}
34 changes: 34 additions & 0 deletions source/BulkCrapUninstaller/Functions/Tools/StartupArgumentTools.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
Copyright (c) 2017 Marcin Szeniak (https://github.com/Klocman/)
Apache License Version 2.0
*/

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace BulkCrapUninstaller.Functions.Tools
{
public static class StartupArgumentTools
{
public static string GetStartupUninstallListPath(IEnumerable<string> commandLineArgs)
{
var candidate = commandLineArgs?.Skip(1).FirstOrDefault();
if (string.IsNullOrWhiteSpace(candidate))
return null;

try
{
if (!candidate.EndsWith(".bcul", StringComparison.OrdinalIgnoreCase))
return null;

return File.Exists(candidate) ? candidate : null;
}
catch (Exception ex) when (ex is ArgumentException or NotSupportedException or PathTooLongException)
{
return null;
}
}
}
}
54 changes: 54 additions & 0 deletions source/BulkCrapUninstaller/Properties/Localisable.Designer.cs
64 changes: 34 additions & 30 deletions source/BulkCrapUninstaller/Properties/Localisable.fr.resx
Original file line number Diff line number Diff line change
@@ -124,7 +124,7 @@
<value>Recherche de vestiges...</value>
</data>
<data name="LoadingDialogTitlePopulatingList" xml:space="preserve">
<value>Création de la liste des programmes installés...</value>
<value>Remplissage de la liste de désinstalleurs...</value>
</data>
<data name="LoadingDialogTitleRemovingJunk" xml:space="preserve">
<value>Suppression des vestiges...</value>
@@ -133,10 +133,10 @@
<value>Recherche de mises à jour...</value>
</data>
<data name="SearchNothingFoundMessage" xml:space="preserve">
<value>Il n'y a pas d'entrée correspondant à votre chaîne de recherche.</value>
<value>Il n'y a pas d'entrée correspondant à votre critère de recherche.</value>
</data>
<data name="StrExportHeader" xml:space="preserve">
<value>Exportation BCUninstaller
<value>Export BCUninstaller
Éditeur | Version | Date | Taille | Registre | Type de désinstalleur | Chaîne de désinstallation | Chaîne de désinstallation silencieuse | Commentaires</value>
</data>
<data name="StrIsPortable" xml:space="preserve">
@@ -147,10 +147,10 @@
<value>Échec en appelant l'API</value>
</data>
<data name="MessageBoxes_BackupFailedQuestion_Message" xml:space="preserve">
<value>Échec en sauvegardant le registre, voulez-vous continuer tout de même ?</value>
<value>Échec en sauvegarde du registre, voulez-vous continuer tout de même ?</value>
</data>
<data name="MessageBoxes_BackupFailedQuestion_Details" xml:space="preserve">
<value>Détails de l'erreur : </value>
<value>Détails d'erreur : </value>
</data>
<data name="MessageBoxes_Title_Leftover_removal" xml:space="preserve">
<value>Suppression des vestiges</value>
@@ -171,7 +171,7 @@ Détails de l'erreur :
Fichiers et dossiers seront déplacés dans la corbeille, vous pouvez les restaurer à partir d'ici.</value>
</data>
<data name="MessageBoxes_CanSelectOnlyOneItemInfo_Title" xml:space="preserve">
<value>Échec de l'action</value>
<value>Action échouée</value>
</data>
<data name="MessageBoxes_CanSelectOnlyOneItemInfo_Message" xml:space="preserve">
<value>Vous devez ne sélectionner qu'une entrée pour cette action</value>
@@ -186,40 +186,38 @@ Fichiers et dossiers seront déplacés dans la corbeille, vous pouvez les restau
<value>Ouvrir du contenu en ligne</value>
</data>
<data name="MessageBoxes_NoNetworkConnected_Message" xml:space="preserve">
<value>Connection à internet impossible, il n'y a pas de réseau disponible.</value>
<value>Connexion à internet impossible, il n'y a pas de réseau disponible.</value>
</data>
<data name="MessageBoxes_NoNetworkConnected_Details" xml:space="preserve">
<value>Vérifiez que le câble réseau est branché. Si vous utilisez le Wi-Fi vérifiez que vous avez une bonne force de signal.</value>
</data>
<data name="MessageBoxes_Title_Submit_feedback" xml:space="preserve">
<value>Soumettre une réaction</value>
<value>Soumettre un retour</value>
</data>
<data name="MessageBoxes_AskToSubmitFeedback_Message" xml:space="preserve">
<value>Voudriez-vous envoyer une réaction concernant BCU ?</value>
<value>Voudriez-vous envoyer un retour concernant BCU ?</value>
</data>
<data name="MessageBoxes_AskToSubmitFeedback_Details" xml:space="preserve">
<value>Cela prendra moins d'une minute mais aidera grandement le développement ! Toute réaction est appréciée, que ce soit un rapport de bogue, une demande de fonction ou un simple merci !
<value>Cela prendra moins d'une minute mais aidera grandement le développement ! Tout retour est apprécié, que ce soit un rapport de bogue, une demande de fonction ou un simple merci !

Vous pouvez l'envoyer plus tard à partir de la barre de menu du haut (Aide-&gt;Soumettre une réaction).</value>
Vous pouvez l'envoyer plus tard à partir de la barre de menu du haut (Aide-&gt;Soumettre un retour).</value>
</data>
<data name="MessageBoxes_UpdateUptodate_Message" xml:space="preserve">
<value>La version courante est à jour</value>
</data>
<data name="MessageBoxes_UpdateUptodate_Details" xml:space="preserve">
<value>Aucune mise à jour n'a été trouvée pour l'heure, vous avez la dernière version.

Vous voulez ajouter une fonctionnalité ou corriger une bogue ? Merci de m'envoyer votre réaction en utilisant le menu "Aide-&gt;Soumettre une réaction".</value>
Vous voulez ajouter une fonctionnalité ou corriger une bogue ? Merci de m'envoyer votre retour en utilisant le menu "Aide-&gt;Soumettre un retour".</value>
</data>
<data name="MessageBoxes_UpdateFailed_Message" xml:space="preserve">
<value>Erreur rencontrée en vérifiant les mises à jour</value>
</data>
<data name="MessageBoxes_UpdateFailed_Details" xml:space="preserve">
<value>Vérifiez que BCUninstaller n'est pas bloqué dans votre pare-feu et que vous avez une connection internet fonctionnelle.

</value>
<value>Vérifiez que BCUninstaller n'est pas bloqué dans votre pare-feu et que vous avez une connection internet fonctionnelle.</value>
</data>
<data name="MessageBoxes_UpdateAskToDownload_Message" xml:space="preserve">
<value>Une nouvelle version {0} est disponible, voulez-vous mettre à jour maintenant ?</value>
<value>Nouvelle version {0} disponible, voulez-vous mettre à jour maintenant ?</value>
<comment>0 is version number</comment>
</data>
<data name="MessageBoxes_UpdateAskToDownload_Details" xml:space="preserve">
@@ -260,14 +258,14 @@ Attention : pendant la mise à jour le dossier "Update" et le fichier "Update.zi
<comment>keep space in front</comment>
</data>
<data name="StrDebug" xml:space="preserve">
<value> DEBUG</value>
<value>DEBUG</value>
<comment>keep space in front</comment>
</data>
<data name="MessageBoxes_CanWalkAwayInfo_Title" xml:space="preserve">
<value>Progression de la désinstallation</value>
</data>
<data name="MessageBoxes_CanWalkAwayInfo_Message" xml:space="preserve">
<value>Vous pouvez maintenant laisser l'ordinateur opérer</value>
<value>Vous pouvez maintenant laisser l'ordinateur</value>
</data>
<data name="MessageBoxes_CanWalkAwayInfo_Details" xml:space="preserve">
<value>Les désinstalleurs restants devraient pouvoir terminer sans aucune intervention de l'utilisateur. Vous devriez quand même vérifier de temps en temps au cas où un des désinstalleurs plante.</value>
@@ -457,7 +455,7 @@ Voulez-vous utiliser les désinstalleurs "causants" pour ces éléments, ou doiv
<value>Le point de restauration N'A PAS ETE CRÉÉ, vous ne pourrez pas restaurer les changements ! Voulez-vous continuer quand même la désinstallation ?</value>
</data>
<data name="MainWindow_Rename_Description" xml:space="preserve">
<value>Renommer "{0}"</value>
<value>Renommage de "{0}"</value>
</data>
<data name="MainWindow_Rename_Title" xml:space="preserve">
<value>Renommer l'entrée sélectionnée</value>
@@ -534,10 +532,10 @@ Voulez-vous utiliser les désinstalleurs "causants" pour ces éléments, ou doiv
<value>Échec d'exécution externe</value>
</data>
<data name="MessageBoxes_RestartNeededForSettingChangeQuestion_Details" xml:space="preserve">
<value>Certains paramètres ne prendront effet jusqu'à ce que l'application soit relancée.</value>
<value>Certains paramètres ne prendront pas effet jusqu'à ce que l'application soit relancée.</value>
</data>
<data name="MessageBoxes_RestartNeededForSettingChangeQuestion_Message" xml:space="preserve">
<value>Voulez-vous redémarrer BCU à appliquer les nouveaux réglages</value>
<value>Voulez-vous redémarrer BCU à appliquer les nouveaux réglages ?</value>
</data>
<data name="MessageBoxes_RestartNeededForSettingChangeQuestion_Title" xml:space="preserve">
<value>Modifier les réglages de l'application</value>
@@ -546,7 +544,7 @@ Voulez-vous utiliser les désinstalleurs "causants" pour ces éléments, ou doiv
<value>Certificat manquant</value>
</data>
<data name="MainWindow_Statusbar_ProcessingUninstallers" xml:space="preserve">
<value>Traitement des désinstalleurs ({0})</value>
<value>Traitement des applications détectées, ({0}) restantes...</value>
<comment>{1} = how many application uninstallers still need to be processed</comment>
</data>
<data name="MessageBoxes_TaskSkip_Details" xml:space="preserve">
@@ -679,16 +677,16 @@ Vous pouver tenter de désactiver la prévention de collision dans les réglages
<value>Extensions</value>
</data>
<data name="LocalizedX509Certificate2_FriendlyName" xml:space="preserve">
<value>Nom familier</value>
<value>Nom Familier</value>
</data>
<data name="LocalizedX509Certificate2_IssuerName" xml:space="preserve">
<value>Nom de l'émetteur</value>
<value>Nom de l'Emetteur</value>
</data>
<data name="LocalizedX509Certificate2_NotAfter" xml:space="preserve">
<value>Pas après</value>
<value>Pas Après</value>
</data>
<data name="LocalizedX509Certificate2_NotBefore" xml:space="preserve">
<value>Pas avant</value>
<value>Pas Avant</value>
</data>
<data name="LocalizedX509Certificate2_PrivateKey" xml:space="preserve">
<value>Clé Privée</value>
@@ -700,10 +698,10 @@ Vous pouver tenter de désactiver la prévention de collision dans les réglages
<value>Clé Publique</value>
</data>
<data name="LocalizedX509Certificate2_RawData" xml:space="preserve">
<value>Données brutes</value>
<value>Données Brutes</value>
</data>
<data name="LocalizedX509Certificate2_SerialNumber" xml:space="preserve">
<value>Numéro de série</value>
<value>Numéro de Série</value>
</data>
<data name="LocalizedX509Certificate2_SubjectName" xml:space="preserve">
<value>Nom de sujet</value>
@@ -763,10 +761,10 @@ Vous pouver tenter de désactiver la prévention de collision dans les réglages
<value>Sélectionner où enregistrer la sauvegarde. Un nouveau dossier sera créé.</value>
</data>
<data name="NewsPopup_UpdatedTitle" xml:space="preserve">
<value>BCU a été mis à jour en v{0}!</value>
<value>BCU a été mis à jour en v{0} !</value>
</data>
<data name="NewsPopup_FirstStartTitle" xml:space="preserve">
<value>Bienvenue à BCU version {0}!</value>
<value>Bienvenue à BCU version {0} !</value>
</data>
<data name="UninstallProgressWindow_StatusPuttingToSleepInSeconds" xml:space="preserve">
<value>Mise en veille du PC dans {0}s. Décocher la case veille pour annuler.</value>
@@ -783,4 +781,10 @@ Vous pouver tenter de désactiver la prévention de collision dans les réglages
<value>Désinstalle</value>
<comment>Option for "Double clicking in application list..."</comment>
</data>
<data name="MessageBoxes_CantRenameUninstallerKind_Title" xml:space="preserve">
<value>Ne peut renommer {0}</value>
</data>
<data name="MessageBoxes_CantRenameUninstallerKind_Details" xml:space="preserve">
<value>Ce type de désinstalleur ne supporte pas de renommer ({0}).</value>
</data>
</root>
15 changes: 15 additions & 0 deletions source/BulkCrapUninstaller/Properties/Localisable.hu.resx
Original file line number Diff line number Diff line change
@@ -768,4 +768,19 @@ A beállításoknál megpróbálhatja letiltani az összeütközések észlelés
<data name="JunkRemoveWindow_SelectBackupDirectoryTitle" xml:space="preserve">
<value>Válassza ki, hová szeretné menteni a biztonsági másolatot. Egy új könyvtár jön létre.</value>
</data>
<data name="MessageBoxes_ModifyCommandMissing_Details" xml:space="preserve">
<value>A kijelölt alkalmazáshoz nincs beállítva módosító parancs. Szükséges lehet eltávolítani, majd újra telepíteni az alkalmazást a telepítési beállítások módosításához.</value>
</data>
<data name="UninstallerListDoubleClickAction_DoNothing" xml:space="preserve">
<value>Nem csinál semmit</value>
<comment>Option for "Double clicking in application list..."</comment>
</data>
<data name="UninstallerListDoubleClickAction_Properties" xml:space="preserve">
<value>Megnyitja a tulajdonságokat</value>
<comment>Option for "Double clicking in application list..."</comment>
</data>
<data name="UninstallerListDoubleClickAction_Uninstall" xml:space="preserve">
<value>Eltávolít</value>
<comment>Option for "Double clicking in application list..."</comment>
</data>
</root>
18 changes: 18 additions & 0 deletions source/BulkCrapUninstaller/Properties/Localisable.resx
Original file line number Diff line number Diff line change
@@ -789,4 +789,22 @@ You can try disabling collision detection in the settings, but it is not recomme
<data name="MessageBoxes_CantRenameUninstallerKind_Details" xml:space="preserve">
<value>This uninstaller kind does not support renaming ({0}).</value>
</data>
<data name="CertificateColumn_NotFound" xml:space="preserve">
<value>Not found</value>
</data>
<data name="CertificateColumn_Verified" xml:space="preserve">
<value>Verified</value>
</data>
<data name="CertificateColumn_Unverified" xml:space="preserve">
<value>Unverified</value>
</data>
<data name="IntegrityColumn_Invalid" xml:space="preserve">
<value>No uninstaller</value>
</data>
<data name="IntegrityColumn_Unregistered" xml:space="preserve">
<value>No registry</value>
</data>
<data name="IntegrityColumn_Good" xml:space="preserve">
<value>Good</value>
</data>
</root>
319 changes: 162 additions & 157 deletions source/BulkCrapUninstaller/Properties/Localisable.vi.resx

Large diffs are not rendered by default.

44 changes: 44 additions & 0 deletions source/BulkCrapUninstallerTests/ApplicationEntrySerializerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using System.IO;
using Klocman.Tools;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using UninstallTools;

namespace BulkCrapUninstallerTests
{
[TestClass]
public class ApplicationEntrySerializerTests
{
[TestMethod]
public void SerializeApplicationEntries_InvalidXmlCharactersAreRemoved_ValidUnicodeIsPreserved()
{
var path = Path.GetTempFileName();
try
{
var entry = new ApplicationUninstallerEntry
{
DisplayName = "Test app",
Publisher = "Pu\u0002blisher",
Comment = "Before\u0001after \U0001F600",
CacheIdOverride = "Id\u0003value"
};

ApplicationEntrySerializer.SerializeApplicationEntries(path, new[] { entry });

var result = SerializationTools.DeserializeFromXml<ApplicationEntrySerializer>(path);

Assert.IsNotNull(result);
Assert.AreEqual(1, result.Items.Count);
Assert.AreEqual("Publisher", result.Items[0].Publisher);
Assert.AreEqual("Beforeafter \U0001F600", result.Items[0].Comment);
Assert.AreEqual("Idvalue", result.Items[0].CacheIdOverride);
Assert.AreEqual("Pu\u0002blisher", entry.Publisher);
Assert.AreEqual("Before\u0001after \U0001F600", entry.Comment);
Assert.AreEqual("Id\u0003value", entry.CacheIdOverride);
}
finally
{
File.Delete(path);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using UninstallTools;

namespace BulkCrapUninstallerTests
{
[TestClass]
public class ApplicationUninstallerEntryTests
{
[DataTestMethod]
[DataRow("Tweak-TestEntry", true)]
[DataRow("tweak-TestEntry", true)]
[DataRow("Steam App 42", false)]
[DataRow(null, false)]
public void IsScriptTweak_MatchesCurrentTweakIdFormat(string ratingId, bool expected)
{
var entry = new ApplicationUninstallerEntry
{
RatingId = ratingId
};

Assert.AreEqual(expected, entry.IsScriptTweak);
}
}
}
26 changes: 26 additions & 0 deletions source/BulkCrapUninstallerTests/DrawingToolsTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System.Drawing;
using System.IO;
using Klocman.Tools;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BulkCrapUninstallerTests
{
[TestClass]
public class DrawingToolsTests
{
[TestMethod]
public void CreateOwnedIconFromHandle_ReturnsUsableClone()
{
using var sourceIcon = SystemIcons.Application;
var handle = sourceIcon.GetHicon();

using var ownedIcon = DrawingTools.CreateOwnedIconFromHandle(handle);
using var stream = new MemoryStream();

ownedIcon.Save(stream);

Assert.IsTrue(stream.Length > 0);
Assert.AreEqual(sourceIcon.Size, ownedIcon.Size);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
using BulkCrapUninstaller.Functions.ApplicationList;
using BulkCrapUninstaller.Properties;
using Klocman.Resources;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using UninstallTools;

namespace BulkCrapUninstallerTests.Functions
{
[TestClass]
public class ApplicationListConstantsTests
{
private bool _advancedTestCertificates;

[TestInitialize]
public void TestInitialize()
{
_advancedTestCertificates = Settings.Default.AdvancedTestCertificates;
Settings.Default.AdvancedTestCertificates = true;
}

[TestCleanup]
public void TestCleanup()
{
Settings.Default.AdvancedTestCertificates = _advancedTestCertificates;
}

[TestMethod]
public void GetApplicationCertificateText_ReturnsNoneWhenCertificateIsMissing()
{
var entry = new ApplicationUninstallerEntry
{
IsValid = true
};

var result = ApplicationListConstants.GetApplicationCertificateText(entry);

Assert.AreEqual(Localisable.CertificateColumn_NotFound, result);
}

[TestMethod]
public void GetApplicationCertificateText_ReturnsVerifiedCertificateStatus()
{
var entry = new ApplicationUninstallerEntry
{
IsValid = true
};
entry.SetCertificate(null, true);

var result = ApplicationListConstants.GetApplicationCertificateText(entry);

Assert.AreEqual(Localisable.CertificateColumn_Verified, result);
}

[TestMethod]
public void GetApplicationCertificateText_ReturnsUnverifiedCertificateStatus()
{
var entry = new ApplicationUninstallerEntry
{
IsValid = true
};
entry.SetCertificate(null, false);

var result = ApplicationListConstants.GetApplicationCertificateText(entry);

Assert.AreEqual(Localisable.CertificateColumn_Unverified, result);
}

[TestMethod]
public void GetApplicationCertificateText_ReturnsEmptyWhenCertificateChecksAreDisabled()
{
var entry = new ApplicationUninstallerEntry
{
IsValid = true
};
Settings.Default.AdvancedTestCertificates = false;

var result = ApplicationListConstants.GetApplicationCertificateText(entry);

Assert.AreEqual(CommonStrings.Unknown, result);
}

[TestMethod]
public void GetApplicationIntegrityText_ReturnsGoodWhenEntryIsRegisteredAndValid()
{
var entry = new ApplicationUninstallerEntry
{
IsRegistered = true,
IsValid = true
};

var result = ApplicationListConstants.GetApplicationIntegrityText(entry);

Assert.AreEqual(UninstallTools.Properties.Localisation.Confidence_Good, result);
}

[TestMethod]
public void GetApplicationIntegrityText_ReturnsMissingUninstallerWhenEntryIsInvalid()
{
var entry = new ApplicationUninstallerEntry
{
IsRegistered = true,
IsValid = false
};

var result = ApplicationListConstants.GetApplicationIntegrityText(entry);

Assert.AreEqual(Localisable.IntegrityColumn_Invalid, result);
}

[TestMethod]
public void GetApplicationIntegrityText_ReturnsMissingRegistryWhenEntryIsUnregistered()
{
var entry = new ApplicationUninstallerEntry
{
IsRegistered = false,
IsValid = true
};

var result = ApplicationListConstants.GetApplicationIntegrityText(entry);

Assert.AreEqual(Localisable.IntegrityColumn_Unregistered, result);
}

[TestMethod]
public void GetApplicationIntegrityText_ReturnsMissingRegistryWhenEntryIsOrphaned()
{
var entry = new ApplicationUninstallerEntry
{
IsRegistered = true,
IsOrphaned = true,
IsValid = true
};

var result = ApplicationListConstants.GetApplicationIntegrityText(entry);

Assert.AreEqual(Localisable.IntegrityColumn_Unregistered, result);
}

[TestMethod]
public void GetApplicationIntegrityText_ReturnsMissingRegistryAndUninstallerWhenBothAreMissing()
{
var entry = new ApplicationUninstallerEntry
{
IsRegistered = false,
IsValid = false
};

var result = ApplicationListConstants.GetApplicationIntegrityText(entry);

CollectionAssert.AreEqual(new[] { Localisable.IntegrityColumn_Invalid, Localisable.IntegrityColumn_Unregistered }, (object[])result);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using System;
using System.IO;
using BulkCrapUninstaller.Functions.Tools;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BulkCrapUninstallerTests.Functions
{
[TestClass]
public class StartupArgumentToolsTests
{
[TestMethod]
public void GetStartupUninstallListPath_ReturnsNullWhenThereAreNoArguments()
{
var result = StartupArgumentTools.GetStartupUninstallListPath(Array.Empty<string>());

Assert.IsNull(result);
}

[TestMethod]
public void GetStartupUninstallListPath_ReturnsNullForNonBculArgument()
{
var result = StartupArgumentTools.GetStartupUninstallListPath(new[] { "BCUninstaller.exe", "/setup" });

Assert.IsNull(result);
}

[TestMethod]
public void GetStartupUninstallListPath_ReturnsNullForMissingBculFile()
{
var result = StartupArgumentTools.GetStartupUninstallListPath(new[] { "BCUninstaller.exe", @"C:\missing\Default.bcul" });

Assert.IsNull(result);
}

[TestMethod]
public void GetStartupUninstallListPath_ReturnsExistingBculPath()
{
var tempPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".bcul");

try
{
File.WriteAllText(tempPath, "<UninstallList />");

var result = StartupArgumentTools.GetStartupUninstallListPath(new[] { "BCUninstaller.exe", tempPath });

Assert.AreEqual(tempPath, result);
}
finally
{
if (File.Exists(tempPath))
File.Delete(tempPath);
}
}
}
}
54 changes: 54 additions & 0 deletions source/BulkCrapUninstallerTests/UninstallListTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using System.IO;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using UninstallTools.Lists;

namespace BulkCrapUninstallerTests
{
[TestClass]
public class UninstallListTests
{
[TestMethod]
public void ReadFromFile_EmptyFile_ThrowsInvalidDataException()
{
var path = Path.GetTempFileName();
try
{
File.WriteAllText(path, string.Empty);

var ex = Assert.ThrowsException<InvalidDataException>(() => UninstallList.ReadFromFile(path));

StringAssert.Contains(ex.Message, "empty");
}
finally
{
File.Delete(path);
}
}

[TestMethod]
public void ReadFromFile_LeadingBomAndWhitespace_LoadsList()
{
var path = Path.GetTempFileName();
try
{
var input = new UninstallList(new[] { new Filter("Test", "Example App") });
input.SaveToFile(path);

var originalContents = File.ReadAllText(path);
File.WriteAllText(path, "\uFEFF\r\n\t " + originalContents, Encoding.UTF8);

var result = UninstallList.ReadFromFile(path);

Assert.IsNotNull(result);
Assert.AreEqual(1, result.Filters.Count);
Assert.AreEqual("Test", result.Filters[0].Name);
Assert.AreEqual("Example App", result.Filters[0].ComparisonEntries[0].FilterText);
}
finally
{
File.Delete(path);
}
}
}
}
2 changes: 1 addition & 1 deletion source/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>6.1</Version>
<Version>6.2</Version>

<Authors>https://github.com/Klocman/Bulk-Crap-Uninstaller</Authors>
<Copyright>Copyright Apache-2.0 © 2026</Copyright>
2 changes: 1 addition & 1 deletion source/KlocTools/Controls/WindowTargeter.vi.resx
Original file line number Diff line number Diff line change
@@ -118,6 +118,6 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label2.Text" xml:space="preserve">
<value>Nhấp và kéo trên cửa sổ để chọn</value>
<value>Nhấp và kéo chuột vào cửa sổ để chọn</value>
</data>
</root>
12 changes: 12 additions & 0 deletions source/KlocTools/Forms/LoadingDialog.cs
Original file line number Diff line number Diff line change
@@ -221,6 +221,12 @@ public static LoadingDialog Show(Form owner, string title, Action<LoadingDialogI
_startAutomatically = false,
};

if (loadBar.Owner != null && (loadBar.Owner.IsDisposed || !loadBar.Owner.IsHandleCreated))
{
// Owner is not valid, show the dialog without it
loadBar.Owner = null;
}

loadBar.Show(loadBar.Owner);
return loadBar;
}
@@ -245,6 +251,12 @@ public static Exception ShowDialog(Form owner, string title, Action<LoadingDialo
_startAutomatically = true
})
{
if (loadBar.Owner != null && (loadBar.Owner.IsDisposed || !loadBar.Owner.IsHandleCreated))
{
// Owner is not valid, show the dialog without it
loadBar.Owner = null;
}

loadBar.ShowDialog(loadBar.Owner);
return loadBar.Error;
}
2 changes: 1 addition & 1 deletion source/KlocTools/Forms/ProcessWaiter.vi.resx
Original file line number Diff line number Diff line change
@@ -118,6 +118,6 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="$this.Text" xml:space="preserve">
<value>Chờ cho quá trình kết thúc...</value>
<value>Đang chờ tiến trình kết thúc...</value>
</data>
</root>
4 changes: 2 additions & 2 deletions source/KlocTools/Forms/ProcessWaiterControl.vi.resx
Original file line number Diff line number Diff line change
@@ -124,12 +124,12 @@
<value>Buộc dừng tất cả</value>
</data>
<data name="buttonIgnore.Text" xml:space="preserve">
<value>Phớt lờ</value>
<value>Bỏ qua</value>
</data>
<data name="buttonCancel.Text" xml:space="preserve">
<value>Huỷ</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>Các quy trình sau đây có thể đang sử dụng các tệp sẽ được gỡ cài đặt, vui lòng đóng chúng trước khi tiếp tục. Nếu bạn quyết định không đóng chúng, việc gỡ cài đặt một số mục có thể không thành công hoặc gây ra sự cố. Bạn cũng có thể mất mọi dữ liệu chưa lưu được mở trong các ứng dụng đó.</value>
<value>Các tiến trình sau đây có thể đang sử dụng những tệp tin chuẩn bị bị gỡ cài đặt, vui lòng đóng chúng lại trước khi tiếp tục. Nếu bạn quyết định không đóng, việc gỡ cài đặt một số mục có thể thất bại hoặc gây ra lỗi hệ thống. Bạn cũng có thể bị mất bất kỳ dữ liệu nào chưa kịp lưu trong các ứng dụng đó.</value>
</data>
</root>
6 changes: 3 additions & 3 deletions source/KlocTools/Forms/Tools/Buttons.vi.resx
Original file line number Diff line number Diff line change
@@ -160,7 +160,7 @@
<value>Loại bỏ</value>
</data>
<data name="ButtonReset" xml:space="preserve">
<value>Cài lại</value>
<value>Đặt lại</value>
</data>
<data name="ButtonSkip" xml:space="preserve">
<value>Bỏ qua</value>
@@ -180,10 +180,10 @@
<value>Gỡ cài đặt</value>
</data>
<data name="ButtonUseLoud" xml:space="preserve">
<value>Dùng chế độ ồn ào</value>
<value>Dùng chế độ thường (Loud)</value>
</data>
<data name="ButtonYes" xml:space="preserve">
<value>Đúng</value>
<value></value>
</data>
<data name="ButtonDetails" xml:space="preserve">
<value>Chi tiết</value>
8 changes: 7 additions & 1 deletion source/KlocTools/Forms/Tools/PremadeDialogs.cs
Original file line number Diff line number Diff line change
@@ -67,6 +67,12 @@ public static bool StartProcessSafely(string command, string arguments)
return false;
}

/// <summary>
/// Exception that is not sendable to the error report system. This is used for exceptions that are expected to be thrown and don't contain useful information.
/// </summary>
/// <inheritdoc />
public class NotSendableException(string message) : Exception(message);

/// <summary>
/// Show a generic error message with supplied exception info. Shows all inner exceptions and stack traces as well as a
/// copy button.
@@ -78,7 +84,7 @@ public static void GenericError(Exception ex)

Console.WriteLine(@"Showing error message: " + ex);

if (SendErrorAction != null)
if (SendErrorAction != null && ex is not NotSendableException)
SendErrorQuestion(ex);
else
GenericError(ex.Message, GetExceptionDetailString(ex));
8 changes: 5 additions & 3 deletions source/KlocTools/IO/MsiTools.cs
Original file line number Diff line number Diff line change
@@ -81,6 +81,8 @@ public static IEnumerable<string> GetAllComponents()
{
var ret = (ResultWin32)MsiWrapper.MsiEnumComponents(i, lpComponentBuf);
if (ret == ResultWin32.ERROR_NO_MORE_ITEMS) break;
// Some MSI products return ERROR_BAD_CONFIGURATION for whatever reason, safest to skip them
if (ret == ResultWin32.ERROR_BAD_CONFIGURATION) continue;
if (ret != 0) throw ret.ToException();
yield return lpComponentBuf.ToString();
}
@@ -111,7 +113,7 @@ public static string GetInstalledComponentPathRaw(string component)
{
if (ComponentPathLookup.TryGetValue(component, out var value))
return value;

InitLookups();

_reverseComponentLookup.TryGetValue(component, out var product);
@@ -162,7 +164,7 @@ public static MsiComponentPaths GetInstalledComponentPaths(Guid productCodeGuid)
#if RELEASE
_ => hiveId.ToString()
#else
_ => throw new ArgumentOutOfRangeException(nameof(hiveId), hiveId, @"Invalid hive")
_ => throw new ArgumentOutOfRangeException(nameof(hiveId), hiveId, @"Invalid hive")
#endif
};
path = hiveName + path[3..];
@@ -199,7 +201,7 @@ public static void InitLookups()
{
lock (GuidRegistryFormatPattern)
{
if (_componentLookup != null) return;
if (_reverseComponentLookup != null) return;

var sw = Stopwatch.StartNew();

2 changes: 1 addition & 1 deletion source/KlocTools/KlocTools.csproj
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Management" Version="10.0.3" />
<PackageReference Include="System.Management" Version="[8.*,9)" />
</ItemGroup>

<ItemGroup>
28 changes: 14 additions & 14 deletions source/KlocTools/Properties/Localisation.fr.resx
Original file line number Diff line number Diff line change
@@ -211,7 +211,7 @@
<value>Arrêter les processus en cours</value>
</data>
<data name="RegistryTools_AddRegToRegistry_FileNotExist" xml:space="preserve">
<value>Le nom de fichier ne pointe pas sur un fichier .reg valide</value>
<value>Le chemin ne pointe pas sur un fichier .reg valide</value>
</data>
<data name="RegistryTools_RemoveRegistryKey_PathEmptyNull" xml:space="preserve">
<value>Le chemin ne peut pas être vide ou nul</value>
@@ -233,13 +233,13 @@ Vous pouvez copier les informations détaillées concernant cette erreur dans le
<value>Détails d'erreur: </value>
</data>
<data name="FileInfo_CreationTime" xml:space="preserve">
<value>Heure de création</value>
<value>Heure de Création</value>
</data>
<data name="FileInfo_LastAccessTime" xml:space="preserve">
<value>Heure de dernier accès</value>
<value>Heure de Dernier Accès</value>
</data>
<data name="FileInfo_LastWriteTime" xml:space="preserve">
<value>Heure de dernière écriture</value>
<value>Heure de Dernière Ecriture</value>
</data>
<data name="FileInfo_Attributes" xml:space="preserve">
<value>Attributs</value>
@@ -248,10 +248,10 @@ Vous pouvez copier les informations détaillées concernant cette erreur dans le
<value>Est lecture seule</value>
</data>
<data name="FileInfo_FullName" xml:space="preserve">
<value>Nom complet</value>
<value>Nom Complet</value>
</data>
<data name="FileInfo_FileName" xml:space="preserve">
<value>Nom de fichier</value>
<value>Nom de Fichier</value>
</data>
<data name="FileInfo_Size" xml:space="preserve">
<value>Taille</value>
@@ -266,33 +266,33 @@ Vous pouvez copier les informations détaillées concernant cette erreur dans le
<value>Commentaire</value>
</data>
<data name="FileInfo_CompanyName" xml:space="preserve">
<value>Nom de compagnie</value>
<value>Nom de Compagnie</value>
</data>
<data name="FileInfo_FileDescription" xml:space="preserve">
<value>Description</value>
</data>
<data name="FileInfo_FileVersion" xml:space="preserve">
<value>Version de fichier</value>
<value>Version de Fichier</value>
</data>
<data name="FileInfo_InternalName" xml:space="preserve">
<value>Nom interne</value>
<value>Nom Interne</value>
</data>
<data name="FileInfo_Language" xml:space="preserve">
<value>Langage</value>
<value>Langue</value>
</data>
<data name="FileInfo_LegalCopyright" xml:space="preserve">
<value>Copyright</value>
</data>
<data name="FileInfo_LegalTrademarks" xml:space="preserve">
<value>Marque déposée</value>
<value>Marques déposées</value>
</data>
<data name="FileInfo_OriginalFilename" xml:space="preserve">
<value>Nom de fichier d'origine</value>
<value>Nom de fichier Original</value>
</data>
<data name="FileInfo_ProductName" xml:space="preserve">
<value>Nom de produit</value>
<value>Nom de Produit</value>
</data>
<data name="FileInfo_ProductVersion" xml:space="preserve">
<value>Version de produit</value>
<value>Version de Produit</value>
</data>
</root>
62 changes: 31 additions & 31 deletions source/KlocTools/Properties/Localisation.vi.resx
Original file line number Diff line number Diff line change
@@ -118,16 +118,16 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Enums_YesNoAsk_Ask" xml:space="preserve">
<value>Yêu cầu</value>
<value>Hỏi</value>
</data>
<data name="Error_SeparateArgsFromCommand_Empty" xml:space="preserve">
<value>Tên tệp không được bỏ trống</value>
<value>Tên tệp tin không được để trống.</value>
</data>
<data name="Error_SeparateArgsFromCommand_MissingQuotationMark" xml:space="preserve">
<value>Dấu ngoặc kép ở cuối bị thiếu.</value>
<value>Thiếu dấu ngoặc kép đóng.</value>
</data>
<data name="Error_SeparateArgsFromCommand_NoDot" xml:space="preserve">
<value>Tên tệp phải phần mở rộng được phân tách bằng dấu chấm.</value>
<value>Tên tệp tin phải chứa phần mở rộng được phân tách bằng dấu chấm.</value>
</data>
<data name="FileSize_GB_Long" xml:space="preserve">
<value>Gigabytes</value>
@@ -157,7 +157,7 @@
<value>Không</value>
</data>
<data name="Yes" xml:space="preserve">
<value>Đúng</value>
<value></value>
</data>
<data name="ToFuzzyTimeSinceString_Days_Since" xml:space="preserve">
<value>{0} ngày trước</value>
@@ -172,7 +172,7 @@
<value>Một giờ trước</value>
</data>
<data name="ToFuzzyTimeSinceString_JustNow" xml:space="preserve">
<value>Ngay bây giờ</value>
<value>Vừa xong</value>
</data>
<data name="ToFuzzyTimeSinceString_Minutes_Since" xml:space="preserve">
<value>{0} phút trước</value>
@@ -193,28 +193,28 @@
<value>Một năm trước</value>
</data>
<data name="PremadeDialogs_GenericError_Heading" xml:space="preserve">
<value>Ứng dụng gặp lỗi không mong muốn</value>
<value>Ứng dụng đã gặp phải một lỗi không mong muốn</value>
</data>
<data name="PremadeDialogs_GenericError_Title" xml:space="preserve">
<value>Lỗi không mong muốn</value>
</data>
<data name="PremadeDialogs_KillRunningProcessesQuestion_Details" xml:space="preserve">
<value>Bạn có thể mất dữ liệu chưa được lưu. Vui lòng đóng ứng dụng theo cách thủ công để tránh mất dữ liệu.</value>
<value>Bạn có thể bị mất bất kỳ dữ liệu nào chưa lưu. Để tránh mất dữ liệu, hãy đóng các ứng dụng này thủ công.</value>
</data>
<data name="PremadeDialogs_KillRunningProcessesQuestion_Message" xml:space="preserve">
<value>Bạn có chắc muốn chấm dứt tất cả các tiến trình không?</value>
<value>Bạn có chắc chắn muốn chấm dứt tất cả các tiến trình này không?</value>
</data>
<data name="PremadeDialogs_KillRunningProcessesQuestion_Title" xml:space="preserve">
<value>Chấm dứt tiến trình đang chạy</value>
<value>Chấm dứt các tiến trình đang chạy</value>
</data>
<data name="RegistryTools_AddRegToRegistry_FileNotExist" xml:space="preserve">
<value>Đường dẫn không trỏ đến tệp .reg hợp lệ.</value>
<value>Đường dẫn không trỏ tới một tệp .reg hợp lệ</value>
</data>
<data name="RegistryTools_RemoveRegistryKey_PathEmptyNull" xml:space="preserve">
<value>Đường dẫn không được bỏ trống hoặc NULL.</value>
<value>Đường dẫn không được để trống hoặc có giá trị null</value>
</data>
<data name="RegistryTools_RemoveRegistryKey_PointsAtRoot" xml:space="preserve">
<value>Đường dẫn không thể trỏ đến khóa gốc</value>
<value>Đường dẫn không được trỏ vào một khóa gốc (root key)</value>
</data>
<data name="RegistryTools_RemoveRegistryKey_RemoveDefault" xml:space="preserve">
<value>Không thể xóa giá trị mặc định</value>
@@ -223,35 +223,35 @@
<value>Chi tiết lỗi: </value>
</data>
<data name="PremadeDialogs_GenericError_Details" xml:space="preserve">
<value>Lỗi này không yêu cầu phải tắt ứng dụng nhưng có thể khiến một số chức năng ngừng hoạt động. Hầu hết các lỗi liên quan đến hệ thống tập tin đều có thể được bỏ qua một cách an toàn.
<value>Mặc dù lỗi này không bắt buộc ứng dụng phải đóng lại, nhưng một số chức năng có thể sẽ ngừng hoạt động. Hầu hết các lỗi liên quan đến hệ thống tệp tin (filesystem) đều có thể bỏ qua một cách an toàn.

Thông báo lỗi: {0}

Bạn có thể sao chép thông tin chi tiết về lỗi này vào bảng nhớ tạm của mình bằng cách nhấp vào nút "Sao chép". Vui lòng xem xét gửi thông tin lỗi này cho nhà phát triển.</value>
Bạn có thể sao chép thông tin chi tiết về lỗi này vào bộ nhớ tạm bằng cách nhấp vào nút "Sao chép". Hãy cân nhắc việc gửi thông tin lỗi này cho nhà phát triển để cải thiện ứng dụng.</value>
</data>
<data name="FileInfo_CreationTime" xml:space="preserve">
<value>Thời điểm Tạo</value>
<value>Thời gian tạo</value>
</data>
<data name="FileInfo_LastAccessTime" xml:space="preserve">
<value>Lần Truy cập Cuối cùng</value>
<value>Thời gian truy cập cuối</value>
</data>
<data name="FileInfo_LastWriteTime" xml:space="preserve">
<value>Lần Thay đổi Cuối cùng</value>
<value>Thời gian chỉnh sửa cuối</value>
</data>
<data name="FileInfo_Attributes" xml:space="preserve">
<value>Thuộc tính</value>
<value>Thuộc tính tệp</value>
</data>
<data name="FileInfo_IsReadOnly" xml:space="preserve">
<value>Chỉ đọc</value>
<value>Chỉ đọc (Read-only)</value>
</data>
<data name="FileInfo_FullName" xml:space="preserve">
<value>Tên đầy đủ</value>
<value>Đường dẫn đầy đủ</value>
</data>
<data name="FileInfo_FileName" xml:space="preserve">
<value>Tên Tệp tin</value>
</data>
<data name="FileInfo_Size" xml:space="preserve">
<value>Kích thước</value>
<value>Dung lượng</value>
</data>
<data name="FileInfo_Directory" xml:space="preserve">
<value>Thư mục</value>
@@ -260,19 +260,19 @@ Bạn có thể sao chép thông tin chi tiết về lỗi này vào bảng nh
<value>Tồn tại trên ổ đĩa</value>
</data>
<data name="FileInfo_Comments" xml:space="preserve">
<value>Chú thích</value>
<value>Ghi chú</value>
</data>
<data name="FileInfo_CompanyName" xml:space="preserve">
<value>Tên Công ty</value>
<value>Tên công ty phát triển</value>
</data>
<data name="FileInfo_FileDescription" xml:space="preserve">
<value>Mô tả</value>
<value>Mô tả tệp tin</value>
</data>
<data name="FileInfo_FileVersion" xml:space="preserve">
<value>Phiên bản Tệp tin</value>
<value>Phiên bản tệp tin</value>
</data>
<data name="FileInfo_InternalName" xml:space="preserve">
<value>Tên Nội địa</value>
<value>Tên nội bộ (Internal Name)</value>
</data>
<data name="FileInfo_Language" xml:space="preserve">
<value>Ngôn ngữ</value>
@@ -284,15 +284,15 @@ Bạn có thể sao chép thông tin chi tiết về lỗi này vào bảng nh
<value>Thương hiệu</value>
</data>
<data name="FileInfo_OriginalFilename" xml:space="preserve">
<value>Tên Tệp tin Gốc</value>
<value>Tên tệp tin gốc</value>
</data>
<data name="FileInfo_ProductName" xml:space="preserve">
<value>Tên Sản phẩm</value>
<value>Tên sản phẩm</value>
</data>
<data name="FileInfo_ProductVersion" xml:space="preserve">
<value>Phiên bản Sản phẩm</value>
<value>Phiên bản sản phẩm</value>
</data>
<data name="PremadeDialogs_GenericError_InnerExceptionTitle" xml:space="preserve">
<value>Inner:</value>
<value>Lỗi nội bộ (Inner Exception):</value>
</data>
</root>
29 changes: 27 additions & 2 deletions source/KlocTools/Tools/DrawingTools.cs
Original file line number Diff line number Diff line change
@@ -51,11 +51,32 @@ public static Icon ExtractAssociatedIcon(string filePath)
var index = 0;
var handle = SafeNativeMethods.ExtractAssociatedIcon(new HandleRef(null, IntPtr.Zero), iconPath, ref index);
if (handle != IntPtr.Zero)
return Icon.FromHandle(handle);
return CreateOwnedIconFromHandle(handle);
}
return null;
}

/// <summary>
/// Clone an icon handle into a managed icon instance and release the original native handle.
/// </summary>
public static Icon CreateOwnedIconFromHandle(IntPtr handle)
{
if (handle == IntPtr.Zero)
throw new ArgumentException("Icon handle must not be zero", nameof(handle));

try
{
using (var temporaryIcon = Icon.FromHandle(handle))
{
return (Icon)temporaryIcon.Clone();
}
}
finally
{
SafeNativeMethods.DestroyIcon(handle);
}
}


/// <summary>
/// This class suppresses stack walks for unmanaged code permission.
@@ -69,6 +90,10 @@ internal static class SafeNativeMethods
{
[DllImport("shell32.dll", EntryPoint = "ExtractAssociatedIcon", CharSet = CharSet.Auto)]
internal static extern IntPtr ExtractAssociatedIcon(HandleRef hInst, StringBuilder iconPath, ref int index);

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool DestroyIcon(IntPtr hIcon);
}

public static Color ColorLerp(Color from, Color to, float ratio)
@@ -136,4 +161,4 @@ public static Icon IconFromImage(Image img)
return new Icon(ms);
}
}
}
}
40 changes: 39 additions & 1 deletion source/KlocTools/Tools/SerializationTools.cs
Original file line number Diff line number Diff line change
@@ -7,12 +7,40 @@ Apache License Version 2.0
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace Klocman.Tools
{
public static class SerializationTools
{
public static string SanitizeInvalidXmlCharacters(string input)
{
if (string.IsNullOrEmpty(input))
return input;

StringBuilder output = null;
var consumedUtf16Chars = 0;

foreach (var rune in input.EnumerateRunes())
{
if (IsValidXmlCharacter(rune))
{
output?.Append(rune.ToString());
}
else
{
output ??= new StringBuilder(input.Length);
if (consumedUtf16Chars > 0 && output.Length == 0)
output.Append(input, 0, consumedUtf16Chars);
}

consumedUtf16Chars += rune.Utf16SequenceLength;
}

return output?.ToString() ?? input;
}

public static T DeserializeFromXml<T>(string fullFilename)
{
var serializer = new XmlSerializer(typeof(T));
@@ -60,5 +88,15 @@ public DictSerializeData(TKey key, TValue data)
public TValue Data { get; set; }
public TKey Key { get; set; }
}

private static bool IsValidXmlCharacter(Rune value)
{
return value.Value == 0x9 ||
value.Value == 0xA ||
value.Value == 0xD ||
(value.Value >= 0x20 && value.Value <= 0xD7FF) ||
(value.Value >= 0xE000 && value.Value <= 0xFFFD) ||
(value.Value >= 0x10000 && value.Value <= 0x10FFFF);
}
}
}
}
2 changes: 1 addition & 1 deletion source/NBug_custom/Core/UI/WinForms/Full.fr.resx
Original file line number Diff line number Diff line change
@@ -118,6 +118,6 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="warningLabel.Text" xml:space="preserve">
<value>L'application a planté et elle va maintenant être rejetée. Si vous cliquez sur Quitter, l'application se fermera immédiatement. Si vous cliquez sur Envoyer et Quitter, l'application se fermera et un rapport de bogue sera envoyé.</value>
<value>L'application a planté et elle va maintenant être arrêtée. Si vous cliquez sur Quitter, l'application se fermera immédiatement. Si vous cliquez sur Envoyer et Quitter, l'application se fermera et un rapport de bogue sera envoyé.</value>
</data>
</root>
2 changes: 1 addition & 1 deletion source/NBug_custom/Core/UI/WinForms/Full.vi.resx
Original file line number Diff line number Diff line change
@@ -118,6 +118,6 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="warningLabel.Text" xml:space="preserve">
<value>Ứng dụng đã gặp sự cố và sẽ tự động đóng. Nếu bạn nhấp chuột vào nút "Thoát", ứng dụng sẽ đóng ngay lập tức. Nếu bạn nhấp chuột vào nút "Gửi và Thoát", ứng dụng sẽ đóng và đồng thời gửi một báo cáo lỗi về sự cố này.</value>
<value>Ứng dụng đã gặp sự cố và sẽ bị đóng. Nếu bạn nhấp vào "Thoát", ứng dụng sẽ đóng ngay lập tức. Nếu bạn nhấp vào "Gửi và Thoát", ứng dụng sẽ đóng và một báo cáo lỗi sẽ được gửi đi.</value>
</data>
</root>
34 changes: 17 additions & 17 deletions source/NBug_custom/Properties/Localization.vi.resx
Original file line number Diff line number Diff line change
@@ -118,73 +118,73 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="UI_Console_Full_Message" xml:space="preserve">
<value>Lỗi ngoại lệ chưa được xử lý. Đang đóng ứng dụng.</value>
<value>Đã xảy ra ngoại lệ chưa được xử lý. Đang đóng ứng dụng.</value>
<comment>Unhandled exception occurred. Closing application.</comment>
</data>
<data name="UI_Console_Minimal_Message" xml:space="preserve">
<value>Lỗi ngoại lệ chưa được xử lý. Đang đóng ứng dụng.</value>
<value>Đã xảy ra ngoại lệ chưa được xử lý. Đang đóng ứng dụng.</value>
<comment>Unhandled exception occurred. Closing application.</comment>
</data>
<data name="UI_Console_Normal_Message" xml:space="preserve">
<value>Lỗi ngoại lệ chưa được xử lý. Đang đóng ứng dụng.</value>
<value>Đã xảy ra ngoại lệ chưa được xử lý. Đang đóng ứng dụng.</value>
<comment>Unhandled exception occurred. Closing application.</comment>
</data>
<data name="UI_Dialog_Full_Exception_Tab" xml:space="preserve">
<value>Ngoại lệ</value>
<value>Ngoại lệ (Exception)</value>
<comment>Exception</comment>
</data>
<data name="UI_Dialog_Full_General_Tab" xml:space="preserve">
<value>Chung</value>
<value>Tổng quan</value>
<comment>General</comment>
</data>
<data name="UI_Dialog_Full_How_to_Reproduce_the_Error_Notification" xml:space="preserve">
<value>Vui lòng cung cấp một mô tả ngắn gọn đề tái hiện lỗi: </value>
<value>Vui lòng thêm mô tả ngắn gọn về cách chúng tôi có thể tái hiện lại lỗi này:</value>
<comment>Please add a brief description of how we can reproduce the error:</comment>
</data>
<data name="UI_Dialog_Full_Message" xml:space="preserve">
<value>Ứng dụng đã gặp sự cố và sẽ tự động đóng. Nếu bạn nhấp chuột vào nút "Thoát", ứng dụng sẽ đóng ngay lập tức. Nếu bạn nhấp chuột vào nút "Gửi và Thoát", ứng dụng sẽ đóng và đồng thời gửi một báo cáo lỗi về sự cố này.</value>
<value>Ứng dụng đã gặp sự cố và sẽ bị đóng. Nếu bạn nhấp vào "Thoát", ứng dụng sẽ đóng ngay lập tức. Nếu bạn nhấp vào "Gửi và Thoát", ứng dụng sẽ đóng và một báo cáo lỗi sẽ được gửi đi.</value>
<comment>The application has crashed and it will now be dismissed. If you click Quit, the application will close immediately. If you click Send and Quit, the application will close and a bug report will be send.</comment>
</data>
<data name="UI_Dialog_Full_Quit_Button" xml:space="preserve">
<value>&amp;Thoát</value>
<value>Thoát (&amp;Q)</value>
<comment>&amp;Quit</comment>
</data>
<data name="UI_Dialog_Full_Report_Contents_Tab" xml:space="preserve">
<value>Nội dung báo cáo</value>
<comment>Report Contents</comment>
</data>
<data name="UI_Dialog_Full_Send_and_Quit_Button" xml:space="preserve">
<value>&amp;Gửi và thoát</value>
<value>Gửi và thoát (&amp;S)</value>
<comment>&amp;Send and Quit</comment>
</data>
<data name="UI_Dialog_Full_Title" xml:space="preserve">
<value>Lỗi</value>
<value>Lỗi (Error)</value>
<comment>Error</comment>
</data>
<data name="UI_Dialog_Minimal_Message" xml:space="preserve">
<value>Ứng dụng đã gặp sự cố và sẽ bị đóng lại.
Một báo cáo lỗi đã được gửi đến nhà phát triển. Chúng tôi chân thành xin lỗi vì sự bất tiện này.</value>
<value>Ứng dụng đã gặp lỗi và sẽ bị đóng ngay bây giờ.
Một báo cáo lỗi đã được gửi tới các nhà phát triển. Chúng tôi thành thật xin lỗi vì sự bất tiện này.</value>
<comment>The application has crashed and it will now be dismissed.
A bug report has been sent to the developers. We apologize for the inconvenience.</comment>
</data>
<data name="UI_Dialog_Minimal_Title" xml:space="preserve">
<value>Lỗi</value>
<value>Lỗi (Error)</value>
<comment>Error</comment>
</data>
<data name="UI_Dialog_Normal_Continue_Button" xml:space="preserve">
<value>Tiế&amp;p tục</value>
<value>Tiếp tục (&amp;C)</value>
<comment>&amp;Continue</comment>
</data>
<data name="UI_Dialog_Normal_Message" xml:space="preserve">
<value>Đã xảy ra một lỗi ngoại lệ chưa được xử lý trong ứng dụng. Nếu bạn chọn "Tiếp tục", ứng dụng sẽ bỏ qua lỗi này và cố gắng tiếp tục chạy. Nếu bạn chọn "Thoát", ứng dụng sẽ đóng ngay lập tức.</value>
<value>Đã xảy ra một ngoại lệ chưa được xử lý trong ứng dụng. Nếu bạn nhấn "Tiếp tục", ứng dụng sẽ bỏ qua lỗi này và cố gắng chạy tiếp. Nếu bạn nhấn "Thoát", ứng dụng sẽ đóng ngay lập tức.</value>
<comment>.</comment>
</data>
<data name="UI_Dialog_Normal_Quit_Button" xml:space="preserve">
<value>&amp;Thoát</value>
<value>Thoát (&amp;Q)</value>
<comment>&amp;Quit</comment>
</data>
<data name="UI_Dialog_Normal_Title" xml:space="preserve">
<value>Lỗi</value>
<value>Lỗi (Error)</value>
<comment>Error</comment>
</data>
</root>
13 changes: 13 additions & 0 deletions source/ObjectListView/ObjectListView.cs
Original file line number Diff line number Diff line change
@@ -6251,6 +6251,19 @@ protected override void WndProc(ref Message m)
}
}

protected override void OnGotFocus(EventArgs e)
{
try
{
base.OnGotFocus(e);
}
catch (InvalidOperationException)
{
// HACK: Eat InvalidOperationException coming from System.Windows.Forms.ListViewGroup.ListViewGroupAccessibleObject..ctor
// For some reason this started happening despite no code changes in ObjectListView. It seems to be caused by the move to newer .NET
}
}

/// <summary>
/// Handle the search for item m if possible.
/// </summary>
2 changes: 1 addition & 1 deletion source/OculusHelper/OculusHelper.csproj
Original file line number Diff line number Diff line change
@@ -13,6 +13,6 @@

<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="10.0.3" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="[8.*,9)" />
</ItemGroup>
</Project>
113 changes: 96 additions & 17 deletions source/UninstallTools/ApplicationEntrySerializer.cs
Original file line number Diff line number Diff line change
@@ -3,18 +3,36 @@
Apache License Version 2.0
*/

using System.Collections.Generic;
using System.Linq;
using Klocman.Tools;

namespace UninstallTools
{
public sealed class ApplicationEntrySerializer
{
public static void SerializeApplicationEntries(string filename, IEnumerable<ApplicationUninstallerEntry> items)
{
SerializationTools.SerializeToXml(filename, new ApplicationEntrySerializer(items));
}
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Klocman.Tools;

namespace UninstallTools
{
public sealed class ApplicationEntrySerializer
{
private static readonly PropertyInfo[] SanitizableProperties = typeof(ApplicationUninstallerEntry)
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(x => x.CanRead && x.CanWrite && x.GetIndexParameters().Length == 0 &&
(x.PropertyType == typeof(string) || x.PropertyType == typeof(string[])))
.ToArray();
private static readonly MethodInfo MemberwiseCloneMethod = typeof(object)
.GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic);

private static readonly FieldInfo[] SanitizableFields = typeof(ApplicationUninstallerEntry)
.GetFields(BindingFlags.Instance | BindingFlags.Public)
.Where(x => x.FieldType == typeof(string) || x.FieldType == typeof(string[]))
.ToArray();

public static void SerializeApplicationEntries(string filename, IEnumerable<ApplicationUninstallerEntry> items)
{
var sanitizedItems = items?
.Select(CloneAndSanitizeForXmlExport)
.ToList() ?? new List<ApplicationUninstallerEntry>();

SerializationTools.SerializeToXml(filename, new ApplicationEntrySerializer(sanitizedItems));
}

public ApplicationEntrySerializer(IEnumerable<ApplicationUninstallerEntry> items)
{
@@ -24,8 +42,69 @@ public ApplicationEntrySerializer(IEnumerable<ApplicationUninstallerEntry> items
// Needed for serialization
public ApplicationEntrySerializer()
{
}

public List<ApplicationUninstallerEntry> Items { get; set; }
}
}
}

public List<ApplicationUninstallerEntry> Items { get; set; }

private static ApplicationUninstallerEntry CloneAndSanitizeForXmlExport(ApplicationUninstallerEntry item)
{
if (item == null)
return null;

var clone = (ApplicationUninstallerEntry)MemberwiseCloneMethod.Invoke(item, null);
SanitizeForXmlExport(clone);
return clone;
}

private static void SanitizeForXmlExport(ApplicationUninstallerEntry item)
{
foreach (var property in SanitizableProperties)
{
if (property.PropertyType == typeof(string))
{
var currentValue = property.GetValue(item) as string;
var sanitizedValue = SerializationTools.SanitizeInvalidXmlCharacters(currentValue);
if (!string.Equals(currentValue, sanitizedValue, System.StringComparison.Ordinal))
property.SetValue(item, sanitizedValue);
}
else if (property.PropertyType == typeof(string[]))
{
var currentValue = property.GetValue(item) as string[];
if (currentValue == null)
continue;

var sanitizedValue = currentValue
.Select(SerializationTools.SanitizeInvalidXmlCharacters)
.ToArray();

if (!currentValue.SequenceEqual(sanitizedValue, System.StringComparer.Ordinal))
property.SetValue(item, sanitizedValue);
}
}

foreach (var field in SanitizableFields)
{
if (field.FieldType == typeof(string))
{
var currentValue = field.GetValue(item) as string;
var sanitizedValue = SerializationTools.SanitizeInvalidXmlCharacters(currentValue);
if (!string.Equals(currentValue, sanitizedValue, System.StringComparison.Ordinal))
field.SetValue(item, sanitizedValue);
}
else if (field.FieldType == typeof(string[]))
{
var currentValue = field.GetValue(item) as string[];
if (currentValue == null)
continue;

var sanitizedValue = currentValue
.Select(SerializationTools.SanitizeInvalidXmlCharacters)
.ToArray();

if (!currentValue.SequenceEqual(sanitizedValue, System.StringComparer.Ordinal))
field.SetValue(item, sanitizedValue);
}
}
}
}
}
25 changes: 15 additions & 10 deletions source/UninstallTools/ApplicationUninstallerEntry.cs
Original file line number Diff line number Diff line change
@@ -177,15 +177,20 @@ public string InstallSource
/// <summary>
/// True if this is an update for another product
/// </summary>
[ComparisonTarget]
[LocalisedName(typeof(Localisation), nameof(Localisation.IsUpdate))]
public bool IsUpdate { get; set; }

/// <summary>
/// True if the application can be uninstalled. False if the uninstaller is missing or is otherwise invalid.
/// </summary>
[ComparisonTarget]
[LocalisedName(typeof(Localisation), nameof(Localisation.IsValid))]
[ComparisonTarget]
[LocalisedName(typeof(Localisation), nameof(Localisation.IsUpdate))]
public bool IsUpdate { get; set; }

[XmlIgnore]
[ComparisonTarget]
public bool IsScriptTweak => !string.IsNullOrEmpty(RatingId) &&
RatingId.StartsWith("Tweak-", StringComparison.OrdinalIgnoreCase);

/// <summary>
/// True if the application can be uninstalled. False if the uninstaller is missing or is otherwise invalid.
/// </summary>
[ComparisonTarget]
[LocalisedName(typeof(Localisation), nameof(Localisation.IsValid))]
public bool IsValid { get; set; }

/// <summary>
@@ -523,4 +528,4 @@ private static string CleanupPath(string path, bool isFilename = false)
return path.TrimEnd('\\');
}
}
}
}
6 changes: 3 additions & 3 deletions source/UninstallTools/Controls/FilterEditor.vi.resx
Original file line number Diff line number Diff line change
@@ -118,15 +118,15 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="labelText.Text" xml:space="preserve">
<value>Văn bản lọc</value>
<value>Từ khoá lọc</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>Phương thức so sánh</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>Thuộc tính mục tiêu</value>
<value>Thuộc tính áp dụng</value>
</data>
<data name="checkBoxInvert.Text" xml:space="preserve">
<value>Đảo ngược kết quả</value>
<value>Đảo ngược kết quả lọc</value>
</data>
</root>
20 changes: 10 additions & 10 deletions source/UninstallTools/Controls/UninstallListEditor.vi.resx
Original file line number Diff line number Diff line change
@@ -121,16 +121,16 @@
<value>Tên bộ lọc</value>
</data>
<data name="columnHeaderType.Text" xml:space="preserve">
<value>Kiểu</value>
<value>Loại bộ lọc</value>
</data>
<data name="columnHeaderConditions.Text" xml:space="preserve">
<value>Điều kiện</value>
<value>Các điều kiện lọc</value>
</data>
<data name="toolStripButtonAddFilter.Text" xml:space="preserve">
<value>Thêm</value>
</data>
<data name="toolStripButtonRemoveFilter.Text" xml:space="preserve">
<value>Loại bỏ</value>
<value>Xoá</value>
</data>
<data name="toolStripButtonAddFiltersFromList.Text" xml:space="preserve">
<value>Thêm từ danh sách...</value>
@@ -139,13 +139,13 @@
<value>Danh sách bộ lọc</value>
</data>
<data name="labelFilterType.Text" xml:space="preserve">
<value>Kiểu: </value>
<value>Loại:</value>
</data>
<data name="comboBoxFilterType.Items" xml:space="preserve">
<value>Bao gôm</value>
<value>Bao gồm</value>
</data>
<data name="comboBoxFilterType.Items1" xml:space="preserve">
<value>Ngoại trừ</value>
<value>Loại trừ</value>
</data>
<data name="labelFilterName.Text" xml:space="preserve">
<value>Tên: </value>
@@ -157,18 +157,18 @@
<value>Thêm</value>
</data>
<data name="toolStripButtonRemoveCondition.Text" xml:space="preserve">
<value>Loại bỏ</value>
<value>Xoá</value>
</data>
<data name="groupBoxConditions.Text" xml:space="preserve">
<value>Điều kiện bộ lọc</value>
<value>Các điều kiện lọc</value>
</data>
<data name="groupBoxConditionEditor.Text" xml:space="preserve">
<value>Trình chỉnh sửa điều kiện</value>
</data>
<data name="openFileDialog.Filter" xml:space="preserve">
<value>Danh sách bộ lọc gỡ cài đặt (*.bcul)|*.bcul|Tất cả tệp|*.*</value>
<value>Danh sách bộ lọc gỡ cài đặt (*.bcul)|*.bcul|Tất cả các tệp|*.*</value>
</data>
<data name="openFileDialog.Title" xml:space="preserve">
<value>Làm mới danh sách bộ lọc gỡ cài đặt</value>
<value>Mở danh sách bộ lọc gỡ cài đặt</value>
</data>
</root>
13 changes: 7 additions & 6 deletions source/UninstallTools/Dialogs/StartupManagerWindow.fr.resx
Original file line number Diff line number Diff line change
@@ -118,19 +118,20 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="comboBoxFilter.Items" xml:space="preserve">
<value>Montrer tout</value>
<value>Afficher tout</value>
</data>
<data name="comboBoxFilter.Items1" xml:space="preserve">
<value>Montrer les entrées de démarrage</value>
<value>Afficher les entrées de démarrage</value>
</data>
<data name="comboBoxFilter.Items2" xml:space="preserve">
<value>Montrer les tâches</value>
<value>Afficher les tâches</value>
</data>
<data name="comboBoxFilter.Items3" xml:space="preserve">
<value>Montrer les extensions de navigateur</value>
<value>Afficher les extensions de navigateur</value>
</data>
<data name="buttonRefresh.Text" xml:space="preserve">
<value>Rafraîchir</value>
<comment>更新</comment>
</data>
<data name="buttonCancel.Text" xml:space="preserve">
<value>Fermer</value>
@@ -139,7 +140,7 @@
<value>Exporter...</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Commandes se lançant pendant le démarrage du système ou la connection</value>
<value>Liste de commandes pouvant s'exécuter automatiquement sans intervention uyilisateur</value>
</data>
<data name="columnHeader1.Text" xml:space="preserve">
<value>Nom du programme</value>
@@ -175,7 +176,7 @@
<value>Déplacer vers le registre</value>
</data>
<data name="runForAllUsersToolStripMenuItem.Text" xml:space="preserve">
<value>Tout utilisateur</value>
<value>Lancer pour tous utilisateurs</value>
</data>
<data name="enableToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Activé</value>
43 changes: 22 additions & 21 deletions source/UninstallTools/Dialogs/StartupManagerWindow.vi.resx
Original file line number Diff line number Diff line change
@@ -118,22 +118,23 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="comboBoxFilter.Items" xml:space="preserve">
<value>Hiển thị tất cả</value>
<value>Hiển thị tất cả mọi thứ</value>
</data>
<data name="comboBoxFilter.Items1" xml:space="preserve">
<value>Hiển thị các mục khởi động cùng hệ thống</value>
<value>Hiển thị các mục khởi động cùng hệ thống (Startup)</value>
</data>
<data name="comboBoxFilter.Items2" xml:space="preserve">
<value>Hiển thị các tác vụ</value>
<value>Hiển thị các tác vụ lịch trình (Tasks)</value>
</data>
<data name="comboBoxFilter.Items3" xml:space="preserve">
<value>Hiển thị các các tiện ích mở rộng của trình duyệt</value>
<value>Hiển thị các tiện ích mở rộng trình duyệt (Extensions)</value>
</data>
<data name="comboBoxFilter.Items4" xml:space="preserve">
<value>Hiển thị các dịch vụ</value>
<value>Hiển thị các dịch vụ hệ thống (Services)</value>
</data>
<data name="buttonRefresh.Text" xml:space="preserve">
<value>Làm mới</value>
<value>Tải lại</value>
<comment>更新</comment>
</data>
<data name="buttonCancel.Text" xml:space="preserve">
<value>Đóng</value>
@@ -142,10 +143,10 @@
<value>Xuất...</value>
</data>
<data name="columnHeader1.Text" xml:space="preserve">
<value>Tên chường trình</value>
<value>Tên chương trình</value>
</data>
<data name="columnHeader5.Text" xml:space="preserve">
<value>Đã kích hoạt</value>
<value>Đang bật</value>
</data>
<data name="columnHeader2.Text" xml:space="preserve">
<value>Nhà phát hành</value>
@@ -154,48 +155,48 @@
<value>Vị trí</value>
</data>
<data name="columnHeader4.Text" xml:space="preserve">
<value>Câu lệnh</value>
<value>Lệnh thực thi</value>
</data>
<data name="openFileLocationToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Mở vị trí tệp thực thi</value>
<value>Mở vị trí tệp thực thi (&amp;O)</value>
</data>
<data name="openLinkLocationToolStripMenuItem.Text" xml:space="preserve">
<value>Mở liên kết</value>
<value>Mở vị trí liên kết (Shortcut)</value>
</data>
<data name="runCommandToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Thực thi câu lệnh</value>
<value>Chạy lệnh này (&amp;R)</value>
</data>
<data name="copyToClipboardToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Sao chép vào bảng nhớ tạm</value>
<value>Sao chép vào bảng nhớ tạm (&amp;C)</value>
</data>
<data name="createBackupToolStripMenuItem.Text" xml:space="preserve">
<value>Tạo &amp;bản sao lưu</value>
<value>Tạo bản sao lưu (&amp;B)</value>
</data>
<data name="moveToRegistryToolStripMenuItem.Text" xml:space="preserve">
<value>Di chuyển đến registry</value>
<value>Chuyển vào Registry</value>
</data>
<data name="runForAllUsersToolStripMenuItem.Text" xml:space="preserve">
<value>Chạy cho tất cả người dùng</value>
</data>
<data name="enableToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Kích hoạt</value>
<value>Kích hoạt (&amp;E)</value>
</data>
<data name="deleteToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Xoá</value>
<value>Xoá (&amp;D)</value>
</data>
<data name="groupBox1.Text" xml:space="preserve">
<value>Danh sách các câu lệnh có thể được thực thi tự động mà không cần sự can thiệp của người dùng</value>
<value>Danh sách các lệnh có thể tự động thực thi mà không cần sự can thiệp của người dùng</value>
</data>
<data name="exportDialog.Filter" xml:space="preserve">
<value>Tệp văn bản|*.txt</value>
</data>
<data name="exportDialog.Title" xml:space="preserve">
<value>Xuất các mục khởi động cùng hệ thống...</value>
<value>Xuất các mục khởi động...</value>
</data>
<data name="folderBrowserDialog.Description" xml:space="preserve">
<value>Chọn một thư mục trống để sao lưu.</value>
<value>Vui lòng chọn một thư mục trống để lưu bản sao lưu.</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Trình quản lý Khởi động cùng hệ thống</value>
<value>Trình quản lý khởi động (Startup Manager)</value>
</data>
</root>
87 changes: 48 additions & 39 deletions source/UninstallTools/Factory/InfoAdders/FastSizeGenerator.cs
Original file line number Diff line number Diff line change
@@ -31,18 +31,18 @@ static FastSizeGenerator()
Trace.WriteLine(@"FastSizeGenerator: Scripting.FileSystemObjectClass is not available - " + ex.Message);
}

try
{
if (EvGetSize(UninstallToolsGlobalConfig.AssemblyLocation).GetKbSize() == 0)
throw new SystemException("Test failed to get valid BCU directory size");

_everythingAvailable = true;
}
catch (SystemException ex)
{
_everythingAvailable = false;
Trace.WriteLine(@"FastSizeGenerator: Everything search engine is not available - " + ex.Message);
}
try
{
if (EvGetSize(UninstallToolsGlobalConfig.AssemblyLocation).GetKbSize() == 0)
throw new SystemException("Test failed to get valid BCU directory size");

_everythingAvailable = true;
}
catch (Exception ex)
{
_everythingAvailable = false;
Trace.WriteLine(@"FastSizeGenerator: Everything search engine is not available - " + ex.Message);
}
}

public void AddMissingInformation(ApplicationUninstallerEntry target)
@@ -99,44 +99,53 @@ private static async Task<string> StartHelperAndReadOutput(string args)
var esPath = Path.Combine(UninstallToolsGlobalConfig.AssemblyLocation, "es.exe");
if (!File.Exists(esPath)) throw new FileNotFoundException();

using (var process = Process.Start(new ProcessStartInfo(esPath, args)
{
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = false,
CreateNoWindow = true,
StandardOutputEncoding = Encoding.UTF8
}))
{
if (process == null) throw new InvalidOperationException("Could not start a new process");

var timeoutTask = Task.Delay(TimeSpan.FromSeconds(40));
var readOutputTask = process.StandardOutput.ReadToEndAsync();

await Task.WhenAny(readOutputTask, timeoutTask);

if (!readOutputTask.IsCompleted)
{
using (var process = Process.Start(new ProcessStartInfo(esPath, args)
{
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
StandardOutputEncoding = Encoding.UTF8
}))
{
if (process == null) throw new InvalidOperationException("Could not start a new process");

var timeoutTask = Task.Delay(TimeSpan.FromSeconds(40));
var readOutputTask = process.StandardOutput.ReadToEndAsync();
var readErrorTask = process.StandardError.ReadToEndAsync();

await Task.WhenAny(readOutputTask, timeoutTask);

if (!readOutputTask.IsCompleted)
{
try
{
process.Kill();
}
catch
{
// Ignore exceptions from killing the process
}
throw new TimeoutException("es.exe appears to have hung");
}

if (process.ExitCode == 0) return await readOutputTask;
throw new IOException("es.exe failed to connect to Everything", process.ExitCode);
}
}
}
throw new TimeoutException("es.exe appears to have hung");
}

var output = await readOutputTask;
var errorOutput = await readErrorTask;
process.WaitForExit();

if (process.ExitCode == 0) return output;

var message = string.IsNullOrWhiteSpace(errorOutput)
? "es.exe failed to connect to Everything"
: "es.exe failed to connect to Everything: " + errorOutput.Trim();
throw new IOException(message, process.ExitCode);
}
}

public string[] RequiredValueNames { get; } = { nameof(ApplicationUninstallerEntry.InstallLocation) };
public bool RequiresAllValues { get; } = true;
public bool AlwaysRun { get; } = false;
public string[] CanProduceValueNames { get; } = { nameof(ApplicationUninstallerEntry.EstimatedSize) };
public InfoAdderPriority Priority { get; } = InfoAdderPriority.RunLast;
}
}
}
Original file line number Diff line number Diff line change
@@ -17,7 +17,7 @@ public void AddMissingInformation(ApplicationUninstallerEntry target)
if (File.Exists(target.UninstallerFullFilename))
target.InstallDate = File.GetCreationTime(target.UninstallerFullFilename);
else if (Directory.Exists(target.InstallLocation))
target.InstallDate = Directory.GetCreationTime(target.InstallLocation);
target.InstallDate = Directory.GetLastWriteTime(target.InstallLocation);
}
catch
{
65 changes: 41 additions & 24 deletions source/UninstallTools/Factory/RegistryFactory.cs
Original file line number Diff line number Diff line change
@@ -55,18 +55,27 @@ public IList<ApplicationUninstallerEntry> GetUninstallerEntries(ListGenerationPr
{
var uninstallerRegistryKeys = new List<KeyValuePair<RegistryKey, bool>>();

progressCallback(new ListGenerationProgress(0, -1, Localisation.Progress_Registry_Gathering));

foreach (var kvp in GetParentRegistryKeys())
{
uninstallerRegistryKeys.AddRange(
kvp.Key.GetSubKeyNames()
.Select(subkeyName => OpenSubKeySafe(kvp.Key, subkeyName))
.Where(subkey => subkey != null)
.Select(subkey => new KeyValuePair<RegistryKey, bool>(subkey, kvp.Value)));

kvp.Key.Close();
}
progressCallback(new ListGenerationProgress(0, -1, Localisation.Progress_Registry_Gathering));

foreach (var kvp in GetParentRegistryKeys())
{
try
{
uninstallerRegistryKeys.AddRange(
kvp.Key.GetSubKeyNames()
.Select(subkeyName => OpenSubKeySafe(kvp.Key, subkeyName))
.Where(subkey => subkey != null)
.Select(subkey => new KeyValuePair<RegistryKey, bool>(subkey, kvp.Value)));
}
catch (Exception ex) when (ex is SecurityException or UnauthorizedAccessException or IOException)
{
Trace.WriteLine($@"Failed to enumerate registry key {kvp.Key.Name} - {ex}");
}
finally
{
kvp.Key.Close();
}
}

void WorkLogic(KeyValuePair<RegistryKey, bool> data, List<ApplicationUninstallerEntry> state)
{
@@ -252,17 +261,25 @@ private static bool GetProtectedFlag(RegistryKey uninstallerKey)
return Convert.ToInt32(uninstallerKey.GetValue("NoRemove", 0)) != 0;
}

private static RegistryKey OpenSubKeySafe(RegistryKey baseKey, string name, bool writable = false)
{
try
{
return baseKey.OpenSubKey(name, writable);
}
catch (SecurityException)
{
return null;
}
}
private static RegistryKey OpenSubKeySafe(RegistryKey baseKey, string name, bool writable = false)
{
try
{
return baseKey.OpenSubKey(name, writable);
}
catch (SecurityException)
{
return null;
}
catch (UnauthorizedAccessException)
{
return null;
}
catch (IOException)
{
return null;
}
}

private static IEnumerable<KeyValuePair<RegistryKey, bool>> GetParentRegistryKeys()
{
@@ -366,4 +383,4 @@ private ApplicationUninstallerEntry TryCreateFromRegistry(RegistryKey uninstalle
return tempEntry;
}
}
}
}
91 changes: 88 additions & 3 deletions source/UninstallTools/Factory/ScoopFactory.cs
128 changes: 101 additions & 27 deletions source/UninstallTools/Lists/UninstallList.cs
19 changes: 11 additions & 8 deletions source/UninstallTools/Properties/Localisation.fr.resx
10 changes: 10 additions & 0 deletions source/UninstallTools/Properties/Localisation.hu.resx
181 changes: 92 additions & 89 deletions source/UninstallTools/Properties/Localisation.vi.resx
2 changes: 1 addition & 1 deletion source/UninstallTools/UninstallTools.csproj
10 changes: 10 additions & 0 deletions source/UninstallTools/Uninstaller/NoWayToUninstallException.cs
15 changes: 7 additions & 8 deletions source/UninstallTools/Uninstaller/UninstallManager.cs
9 changes: 9 additions & 0 deletions source/UninstallerAutomatizer/Forms/MainWindow.hu.resx
2 changes: 1 addition & 1 deletion source/UninstallerAutomatizer/Forms/MainWindow.vi.resx
217 changes: 217 additions & 0 deletions source/UninstallerAutomatizer/Properties/Localization.hu.resx
44 changes: 22 additions & 22 deletions source/UninstallerAutomatizer/Properties/Localization.vi.resx
3 changes: 3 additions & 0 deletions source/UniversalUninstaller/Properties/Localisation.hu.resx
4 changes: 2 additions & 2 deletions source/UniversalUninstaller/Properties/Localisation.vi.resx
2 changes: 1 addition & 1 deletion source/UniversalUninstaller/TargetList.vi.resx
18 changes: 9 additions & 9 deletions source/UniversalUninstaller/UninstallSelection.cs
4 changes: 2 additions & 2 deletions source/UniversalUninstaller/UninstallSelection.vi.resx