From e4a17c57e5677a5ace570440c8c57e75907d6e46 Mon Sep 17 00:00:00 2001 From: Berke Alp Kaya <102745765+brk4lp@users.noreply.github.com> Date: Sun, 11 Oct 2026 20:57:55 +0300 Subject: [PATCH] feat: v1.3.0-beta.1 - optional Defender disabling, resizable window, build pre-checks, i18n cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add 'Disable Windows Defender' option to Standard builds: disables Defender services in the offline image and attempts Defender package removal, identical to CORE Defender servicing; CORE-only destructive operations stay CORE-only - Make the main window resizable (CanResizeWithGrip, min 880x560) - Localize remaining hardcoded status messages ('Hazır', 'Windows sürümleri yükleniyor...', 'Exporting image...') - Pick the startup UI language from the OS UI language (en-US fallback) instead of always tr-TR - Validate paths before building: source ISO must exist, output must differ from the source ISO and stay outside the working directory, directories must be creatable - Check free disk space before building (scratch: 2x ISO + 10 GB, output: 1.2x ISO) - Remove 66 dead localization keys; all 8 languages now carry the same 174-key set; add the new keys to all languages - Publish prerelease-suffixed tags (v1.3.0-beta.1) as GitHub pre-releases --- .github/workflows/release.yml | 4 +- CHANGELOG.md | 19 +++ README.md | 2 +- Resources/Strings.de-DE.txt | 29 ++-- Resources/Strings.en-US.txt | 78 ++------- Resources/Strings.es-ES.txt | 29 ++-- Resources/Strings.fr-FR.txt | 29 ++-- Resources/Strings.ja-JP.txt | 29 ++-- Resources/Strings.ru-RU.txt | 29 ++-- Resources/Strings.tr-TR.txt | 78 ++------- Resources/Strings.zh-CN.txt | 29 ++-- src/Models/ComponentRemovalOptions.cs | 6 + src/Services/LocalizationService.cs | 43 ++++- src/Services/PowerShellService.cs | 48 +++++- src/ViewModels/LocalizedStrings.cs | 2 + src/ViewModels/MainViewModel.cs | 160 +++++++++++++++++- src/Views/MainWindow.xaml | 6 +- .../PowerShellServiceScriptTests.cs | 20 +++ tiny11-ui.csproj | 6 +- 19 files changed, 404 insertions(+), 242 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1c3c1b2..6b28532 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -64,4 +64,6 @@ jobs: run: | $assets = Get-ChildItem artifacts -File | Where-Object { $_.Extension -in '.zip', '.sha256' } | Select-Object -ExpandProperty FullName if ($assets.Count -ne 2) { throw "Expected two release assets, found $($assets.Count)." } - gh release create $env:RELEASE_TAG @assets --verify-tag --generate-notes --title "Tiny11 GUI $env:RELEASE_TAG" + $prereleaseArgs = @() + if ($env:RELEASE_TAG -like '*-*') { $prereleaseArgs = @('--prerelease') } + gh release create $env:RELEASE_TAG @assets --verify-tag --generate-notes --title "Tiny11 GUI $env:RELEASE_TAG" @prereleaseArgs diff --git a/CHANGELOG.md b/CHANGELOG.md index 1df5cb6..6ea7acc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,25 @@ Notable changes to Tiny11 GUI are documented here. The project follows semantic ## Unreleased +## 1.3.0-beta.1 — 2026-10-11 + +### Added + +- Optional **Disable Windows Defender** checkbox for Standard builds. When selected, Defender antivirus services are disabled in the offline image and Defender package removal is attempted — the same Defender servicing CORE builds apply. CORE-only destructive operations (recovery image removal, Windows Update service disabling) are not applied to Standard builds. +- Build pre-checks before any servicing starts: source ISO existence, output path must differ from the source ISO and stay outside the working directory, and output/working directories must be creatable. +- Free disk space pre-check. The working drive needs roughly 2× the ISO size plus 10 GB and the output drive 1.2× the ISO size; the build refuses to start with a clear message instead of failing mid-way through DISM. +- The UI language is now chosen from the operating system's UI language (with English fallback) instead of always starting in Turkish. + +### Changed + +- The main window is now resizable (`CanResizeWithGrip`, minimum 880×560) instead of fixed-size, so it fits smaller or high-DPI screens. +- Versioned releases whose tag contains a pre-release suffix (for example `v1.3.0-beta.1`) are published as GitHub pre-releases. + +### Fixed + +- Removed hardcoded Turkish and English status messages ("Hazır", "Windows sürümleri yükleniyor...", "Exporting image...") that appeared regardless of the selected UI language; they are now localized in all eight languages. +- Localization resource files are consistent again: 66 unused legacy keys were removed, and all eight languages now carry the identical 174-key set. Previously six translations were missing 49 keys that only existed in English and Turkish. + ## 1.2.3 — 2026-09-18 ### Fixed diff --git a/README.md b/README.md index 0614336..c721d25 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Tiny11 GUI is inspired by [tiny11builder](https://github.com/ntdevlabs/tiny11bui - Build from WIM- or ESD-based Windows 11 media with edition selection - Removable apps: Edge, OneDrive, Cortana, Chat, Teams, Xbox -- Disable telemetry, Windows Update, Defender, sponsored apps, reserved storage, BitLocker +- Disable telemetry, Windows Update, sponsored apps, reserved storage, BitLocker, and (optionally) Windows Defender - Size reduction: DISM component store cleanup, recovery compression of `install.wim`, Hyper-V/Recall/Speech/OCR/Handwriting stripping, driver store cleanup - Bypass TPM/CPU/RAM/Secure Boot checks and MS account/network/privacy setup steps - Built-in presets: Minimal, Balanced, Gaming, Enterprise diff --git a/Resources/Strings.de-DE.txt b/Resources/Strings.de-DE.txt index 0ecd080..13a33d1 100644 --- a/Resources/Strings.de-DE.txt +++ b/Resources/Strings.de-DE.txt @@ -1,4 +1,3 @@ -AppTitle=Tiny11 Builder GUI IsoSelection=Quell-ISO: WorkingDirectory=Arbeitsverzeichnis: OutputPath=Pfad der Ausgabe-ISO: @@ -31,7 +30,6 @@ PresetEnterpriseTooltip=Für Unternehmensumgebungen geeignet MicrosoftEdge=Microsoft Edge OneDrive=OneDrive Cortana=Cortana -WindowsChat=Windows-Chat MicrosoftTeams=Microsoft Teams / Chat XboxApps=Xbox-Apps Telemetry=Telemetrie (Datenerfassung) @@ -56,15 +54,12 @@ Copilot=Copilot SpeechOcrHandwriting=Sprache / OCR / Handschrift DriverCleanup=Nicht verwendete Treiber (Drucker/Scanner/Modem/Xbox) Ready=Bereit -Processing=Verarbeitung... -Completed=Abgeschlossen! Error=Ein Fehler ist aufgetreten IsoSelected=ISO-Datei ausgewählt: {0} WorkingDirSelected=Arbeitsverzeichnis ausgewählt: {0} OutputPathSelected=Pfad der Ausgabe-ISO ausgewählt: {0} AutounattendSelected=Eigene autounattend.xml ausgewählt: {0} AutounattendCleared=Auswahl der autounattend.xml gelöscht. -BuildStarted=Tiny11-Erstellung gestartet BuildCompleted=Vorgang erfolgreich abgeschlossen! BuildFailed=Vorgang fehlgeschlagen! TPMTooltip=TPM-2.0-Anforderung umgehen @@ -147,22 +142,12 @@ LogEditionParseLineError=Analysefehler: {0} - Zeile: {1} LogEditionsRetrievalFailed=Windows-Editionen konnten nicht ermittelt werden: {0} LogExpectedLocation=Erwarteter Speicherort: {0} LogFileSize=Dateigröße: {0} GB ({1} Bytes) -LogIsoCopyError=Fehler beim Kopieren der ISO: {0} -LogIsoCopying=ISO-Datei wird kopiert: {0} LogIsoPath=ISO: {0} -LogIsoSaved=ISO-Datei erfolgreich gespeichert: {0} -LogIsoUnmounted=ISO ausgehängt. -LogIsoUnmountError=Fehler beim Aushängen der ISO: {0} LogIsoUnmounting=ISO wird ausgehängt... LogOutputLocation=Ausgabeort: {0} LogOutputPath=Ausgabe: {0} -LogProcessCompletedBanner=*** Vorgang erfolgreich abgeschlossen *** -LogProcessFailed=Vorgang fehlgeschlagen (Exitcode: {0}), Bereinigung läuft... -LogProcessFailedBanner=*** Vorgang mit Fehlercode beendet: {0} *** LogProcessing=Verarbeitung... -LogProcessSuccess=Vorgang erfolgreich abgeschlossen! LogRegistryUnloading=Registrierungs-Hives werden entladen... -LogRemoveChat=Chat entfernen: {0} LogRemoveCortana=Cortana entfernen: {0} LogRemoveEdge=Edge entfernen: {0} LogRemoveOneDrive=OneDrive entfernen: {0} @@ -174,3 +159,17 @@ LogTempFilesDeleting=Temporäre Dateien werden gelöscht... LogTiny11Starting=Tiny11-Erstellung wird gestartet... LogWimUnmounting=WIM wird ausgehängt (Änderungen werden verworfen)... LogWorkingDir=Arbeitsverzeichnis: {0} + +DefenderTooltip=Wenn ausgewählt, werden die Windows-Defender-Antivirendienste im Image deaktiviert (wie bei CORE-Builds). Das installierte System hat keinen Antivirenschutz. +StatusLoadingEditions=Windows-Editionen werden geladen... +StatusReadyDefaultEditions=Bereit (Standardeditionen) +StatusExportingImage=Image wird exportiert... +ValidationFailed=Vorabprüfungen fehlgeschlagen. Der Build wurde nicht gestartet. +ValidationIsoNotFound=Windows-ISO-Datei nicht gefunden: {0} +ValidationInvalidPath=Ungültiger Pfad: {0} +ValidationOutputEqualsIso=Die Ausgabe-ISO darf nicht mit der Quell-ISO identisch sein. +ValidationOutputInsideScratch=Die Ausgabe-ISO darf nicht im Arbeitsverzeichnis liegen. +ValidationOutputDirCreateFailed=Ausgabeverzeichnis konnte nicht erstellt werden: {0} +ValidationScratchCreateFailed=Arbeitsverzeichnis konnte nicht erstellt werden: {0} +ValidationDiskSpace=Nicht genug freier Speicherplatz auf {0}: {1:F1} GB erforderlich, {2:F1} GB verfügbar. +ValidationDiskSpaceUnknown=Freier Speicherplatz konnte nicht geprüft werden ({0}). Es wird fortgefahren. diff --git a/Resources/Strings.en-US.txt b/Resources/Strings.en-US.txt index a4f2de5..6f8ecc0 100644 --- a/Resources/Strings.en-US.txt +++ b/Resources/Strings.en-US.txt @@ -1,4 +1,3 @@ -AppTitle=Tiny11 Builder GUI IsoSelection=Source ISO: WorkingDirectory=Working Directory: OutputPath=Output ISO Path: @@ -43,7 +42,6 @@ PresetEnterpriseTooltip=Business environment suitable MicrosoftEdge=Microsoft Edge OneDrive=OneDrive Cortana=Cortana -WindowsChat=Windows Chat MicrosoftTeams=Microsoft Teams / Chat XboxApps=Xbox Apps @@ -78,8 +76,6 @@ DriverCleanup=Unused Drivers (Printer/Scanner/Modem/Xbox) # Status Messages Ready=Ready -Processing=Processing... -Completed=Completed! Error=Error Occurred IsoSelected=ISO file selected: {0} WorkingDirSelected=Working directory selected: {0} @@ -88,17 +84,10 @@ AutounattendSelected=Custom autounattend.xml selected: {0} AutounattendCleared=Custom autounattend.xml selection cleared. # Build Process Messages -BuildStarted=Tiny11 Build Process Started -MountingIso=Mounting ISO file... -RunningScript=Running PowerShell script... BuildCompleted=Process completed successfully! BuildFailed=Process failed! # Error Messages -IsoMountFailed=Could not mount ISO file! -ScriptNotFound=Script file not found: {0} -AdminRightsWarning=Running with administrator privileges is recommended -MissingFields=Missing: {0} # Tooltips TPMTooltip=Bypass TPM 2.0 requirement @@ -112,15 +101,9 @@ AutounattendTooltip=Use your own autounattend.xml instead of the built-in OOBE b # Language Selection Language=Application Language: -LanguageTurkish=Türkçe -LanguageEnglish=English -LanguageChangedTR=Language changed to Turkish -LanguageChangedEN=Language changed to English LanguageChanged=Language changed to {0} # Image Types Content -StandardTypeContent=Standard (tiny11maker) -CoreTypeContent=Core (tiny11Coremaker) # Startup Messages AppStarted=Tiny11 GUI started @@ -145,7 +128,6 @@ LogSelectedOptions=Selected Options: LogRemoveEdge=Remove Edge: {0} LogRemoveOneDrive=Remove OneDrive: {0} LogRemoveCortana=Remove Cortana: {0} -LogRemoveChat=Remove Chat: {0} LogRemoveTeams=Remove Teams: {0} LogRemoveXbox=Remove Xbox: {0} LogDisableTelemetry=Disable Telemetry: {0} @@ -160,8 +142,6 @@ LogNo=No # Log Messages - Process Status LogScriptCreated=Custom script created: {0} LogTiny11Starting=Tiny11 build process starting... -LogIsoMounting=ISO file is being mounted... -LogIsoMounted=ISO mounted: {0} LogProcessing=Processing... LogBuildSuccess=Tiny11 ISO created successfully! LogOutputLocation=Output location: {0} @@ -179,7 +159,6 @@ LogWimUnmounting=WIM unmounting (discarding changes)... LogIsoUnmounting=ISO unmounting... LogRegistryUnloading=Registry hives unloading... LogTempFilesDeleting=Temporary files deleting... -LogTempFilesError=Some temporary files could not be deleted: {0} LogCancelComplete=Process cancelled and cleanup completed. LogCancelError=Error during cancellation: {0} LogCancelByUser=Process cancelled by user. @@ -187,38 +166,6 @@ LogCancelReceived=Cancel request received... LogAlreadyRunning=A process is already running! # Log Messages - Script Process -LogPreparingDirs=Directories are being prepared... -LogCopyingIso=ISO content is being copied... -LogConvertingEsd=ESD -> WIM converting... -LogMountingWim=Windows image mounting... -LogRemovingApps=Removing unnecessary applications... -LogRemoving=Removing: {0} -LogSkipped=Skipped: {0} -LogRemovingEdge=Microsoft Edge is being removed... -LogDeleted=Deleted: {0} -LogRemovingOneDrive=OneDrive is being removed... -LogApplyingRegistry=Registry settings are being applied... -LogBypassingRequirements=System requirements are being bypassed... -LogDisablingTelemetry=Telemetry is being disabled... -LogDisablingSponsoredApps=Sponsored apps are being disabled... -LogDisablingReservedStorage=Reserved Storage is being disabled... -LogDisablingBitLocker=BitLocker auto-encryption is being disabled... -LogBypassingMSAccount=Microsoft account requirement is being bypassed... -LogDisablingWindowsUpdate=Windows Update is being disabled... -LogDisablingDefender=Windows Defender is being disabled (Security risk!)... -LogSavingRegistry=Registry is being saved... -LogCreatingOobeScript=OOBE bypass script is being created... -LogCreatingAutounattend=autounattend.xml is being created... -LogSavingChanges=Changes are being saved... -LogUnmountingSourceIso=Source ISO unmounting... -LogCreatingIso=Tiny11 ISO is being created... -LogOscdimgNotFound=oscdimg.exe not found! Windows ADK must be installed. -LogOscdimgFound=oscdimg found: {0} -LogCleaningUp=Cleanup in progress... -LogIsoCreatedSuccess=Tiny11 ISO created successfully! -LogLocation=Location: {0} -LogSize=Size: {0} GB -LogIsoCreationFailed=ISO could not be created! # Status Messages StatusStarting=Starting process... @@ -251,23 +198,14 @@ EditionsLoadFailed=Could not load Windows editions LoadingDefaultEditions=Loading default editions... # Process Messages -LogProcessFailed=Process failed (Exit Code: {0}), cleaning up... -LogProcessSuccess=Process completed successfully! -LogIsoCopying=Copying ISO file: {0} -LogIsoSaved=ISO file saved successfully: {0} -LogIsoCopyError=ISO copy error: {0} -LogSystemCleanupComplete=System cleanup completed LogCleanupError=Cleanup error: {0} LogComprehensiveCleanup=Performing comprehensive system cleanup... LogComprehensiveCleanupComplete=Comprehensive cleanup completed LogCleanupContinue=Cleanup error (continuing): {0} -LogSystemCleanupInProgress=System cleanup in progress... # Log Messages - Additional LogAdminRightsRecommended=Warning: Running the application with administrator privileges is recommended. LogAdminRightsNeededForEditions=Administrator privileges may be required to read Windows editions. -LogProcessCompletedBanner=*** Process Completed Successfully *** -LogProcessFailedBanner=*** Process Ended With Error Code: {0} *** LogPresetMinimalApplied=Minimal preset applied - Maximum optimization LogPresetBalancedApplied=Balanced preset applied - Balanced optimization LogPresetGamingApplied=Gaming preset applied - Performance optimization @@ -275,5 +213,17 @@ LogPresetEnterpriseApplied=Enterprise preset applied - Business environment opti LogEditionParseLineError=Parse error: {0} - Line: {1} LogEditionParseFallback=Parsing failed, adding all default editions... LogEditionsRetrievalFailed=Could not retrieve Windows editions: {0} -LogIsoUnmounted=ISO unmounted. -LogIsoUnmountError=ISO unmount error: {0} + +DefenderTooltip=When selected, Windows Defender antivirus services are disabled in the image (same as CORE builds). The installed system will have no antivirus protection. +StatusLoadingEditions=Loading Windows editions... +StatusReadyDefaultEditions=Ready (default editions) +StatusExportingImage=Exporting image... +ValidationFailed=Pre-checks failed. The build was not started. +ValidationIsoNotFound=Windows ISO file not found: {0} +ValidationInvalidPath=Invalid path: {0} +ValidationOutputEqualsIso=The output ISO cannot be the same as the source ISO. +ValidationOutputInsideScratch=The output ISO cannot be inside the working directory. +ValidationOutputDirCreateFailed=The output directory could not be created: {0} +ValidationScratchCreateFailed=The working directory could not be created: {0} +ValidationDiskSpace=Not enough free disk space on {0}: {1:F1} GB required, {2:F1} GB available. +ValidationDiskSpaceUnknown=Free disk space could not be checked ({0}). Continuing anyway. diff --git a/Resources/Strings.es-ES.txt b/Resources/Strings.es-ES.txt index 1353d1a..dcd0189 100644 --- a/Resources/Strings.es-ES.txt +++ b/Resources/Strings.es-ES.txt @@ -1,4 +1,3 @@ -AppTitle=Interfaz de Tiny11 Builder IsoSelection=ISO de origen: WorkingDirectory=Carpeta de trabajo: OutputPath=Ruta de la ISO de salida: @@ -31,7 +30,6 @@ PresetEnterpriseTooltip=Adecuado para entornos empresariales MicrosoftEdge=Microsoft Edge OneDrive=OneDrive Cortana=Cortana -WindowsChat=Chat de Windows MicrosoftTeams=Microsoft Teams / Chat XboxApps=Aplicaciones de Xbox Telemetry=Telemetría (recopilación de datos) @@ -56,15 +54,12 @@ Copilot=Copilot SpeechOcrHandwriting=Voz / OCR / escritura a mano DriverCleanup=Controladores sin usar (impresora/escáner/módem/Xbox) Ready=Listo -Processing=Procesando... -Completed=¡Completado! Error=Se produjo un error IsoSelected=Archivo ISO seleccionado: {0} WorkingDirSelected=Carpeta de trabajo seleccionada: {0} OutputPathSelected=Ruta de la ISO de salida seleccionada: {0} AutounattendSelected=autounattend.xml personalizado seleccionado: {0} AutounattendCleared=Se borró la selección de autounattend.xml. -BuildStarted=Se inició la creación de Tiny11 BuildCompleted=¡El proceso terminó correctamente! BuildFailed=¡El proceso ha fallado! TPMTooltip=Omitir el requisito de TPM 2.0 @@ -147,22 +142,12 @@ LogEditionParseLineError=Error de análisis: {0} - Línea: {1} LogEditionsRetrievalFailed=No se pudieron obtener las ediciones de Windows: {0} LogExpectedLocation=Ubicación esperada: {0} LogFileSize=Tamaño del archivo: {0} GB ({1} bytes) -LogIsoCopyError=Error al copiar la ISO: {0} -LogIsoCopying=Copiando archivo ISO: {0} LogIsoPath=ISO: {0} -LogIsoSaved=Archivo ISO guardado correctamente: {0} -LogIsoUnmounted=ISO desmontada. -LogIsoUnmountError=Error al desmontar la ISO: {0} LogIsoUnmounting=Desmontando la ISO... LogOutputLocation=Ubicación de salida: {0} LogOutputPath=Salida: {0} -LogProcessCompletedBanner=*** Proceso completado correctamente *** -LogProcessFailed=El proceso falló (código de salida: {0}); limpiando... -LogProcessFailedBanner=*** El proceso terminó con el código de error: {0} *** LogProcessing=Procesando... -LogProcessSuccess=¡Proceso completado correctamente! LogRegistryUnloading=Descargando subárboles del Registro... -LogRemoveChat=Eliminar Chat: {0} LogRemoveCortana=Eliminar Cortana: {0} LogRemoveEdge=Eliminar Edge: {0} LogRemoveOneDrive=Eliminar OneDrive: {0} @@ -174,3 +159,17 @@ LogTempFilesDeleting=Eliminando archivos temporales... LogTiny11Starting=Iniciando la creación de Tiny11... LogWimUnmounting=Desmontando WIM (descartando cambios)... LogWorkingDir=Carpeta de trabajo: {0} + +DefenderTooltip=Al seleccionarlo, los servicios antivirus de Windows Defender se desactivan en la imagen (igual que en las compilaciones CORE). El sistema instalado no tendrá protección antivirus. +StatusLoadingEditions=Cargando ediciones de Windows... +StatusReadyDefaultEditions=Listo (ediciones predeterminadas) +StatusExportingImage=Exportando imagen... +ValidationFailed=Las comprobaciones previas fallaron. La compilación no se inició. +ValidationIsoNotFound=No se encontró el archivo ISO de Windows: {0} +ValidationInvalidPath=Ruta no válida: {0} +ValidationOutputEqualsIso=La ISO de salida no puede ser la misma que la ISO de origen. +ValidationOutputInsideScratch=La ISO de salida no puede estar dentro del directorio de trabajo. +ValidationOutputDirCreateFailed=No se pudo crear el directorio de salida: {0} +ValidationScratchCreateFailed=No se pudo crear el directorio de trabajo: {0} +ValidationDiskSpace=Espacio insuficiente en {0}: se requieren {1:F1} GB, hay {2:F1} GB disponibles. +ValidationDiskSpaceUnknown=No se pudo comprobar el espacio libre en disco ({0}). Se continúa. diff --git a/Resources/Strings.fr-FR.txt b/Resources/Strings.fr-FR.txt index ffffe76..6d66373 100644 --- a/Resources/Strings.fr-FR.txt +++ b/Resources/Strings.fr-FR.txt @@ -1,4 +1,3 @@ -AppTitle=Interface Tiny11 Builder IsoSelection=ISO source : WorkingDirectory=Dossier de travail : OutputPath=Chemin de l’ISO de sortie : @@ -31,7 +30,6 @@ PresetEnterpriseTooltip=Adapté aux environnements professionnels MicrosoftEdge=Microsoft Edge OneDrive=OneDrive Cortana=Cortana -WindowsChat=Conversation Windows MicrosoftTeams=Microsoft Teams / Conversation XboxApps=Applications Xbox Telemetry=Télémétrie (collecte de données) @@ -56,15 +54,12 @@ Copilot=Copilot SpeechOcrHandwriting=Voix / OCR / écriture manuscrite DriverCleanup=Pilotes inutilisés (imprimante/scanner/modem/Xbox) Ready=Prêt -Processing=Traitement en cours... -Completed=Terminé ! Error=Une erreur s’est produite IsoSelected=Fichier ISO sélectionné : {0} WorkingDirSelected=Dossier de travail sélectionné : {0} OutputPathSelected=Chemin de l’ISO de sortie sélectionné : {0} AutounattendSelected=autounattend.xml personnalisé sélectionné : {0} AutounattendCleared=Sélection du fichier autounattend.xml effacée. -BuildStarted=Création de Tiny11 démarrée BuildCompleted=Opération terminée avec succès ! BuildFailed=Échec de l’opération ! TPMTooltip=Contourner l’exigence TPM 2.0 @@ -147,22 +142,12 @@ LogEditionParseLineError=Erreur d’analyse : {0} - Ligne : {1} LogEditionsRetrievalFailed=Impossible d’obtenir les éditions de Windows : {0} LogExpectedLocation=Emplacement attendu : {0} LogFileSize=Taille du fichier : {0} Go ({1} octets) -LogIsoCopyError=Erreur de copie de l’ISO : {0} -LogIsoCopying=Copie du fichier ISO : {0} LogIsoPath=ISO : {0} -LogIsoSaved=Fichier ISO enregistré : {0} -LogIsoUnmounted=ISO démontée. -LogIsoUnmountError=Erreur lors du démontage de l’ISO : {0} LogIsoUnmounting=Démontage de l’ISO... LogOutputLocation=Emplacement de sortie : {0} LogOutputPath=Sortie : {0} -LogProcessCompletedBanner=*** Opération terminée avec succès *** -LogProcessFailed=Échec de l’opération (code de sortie : {0}), nettoyage... -LogProcessFailedBanner=*** Opération terminée avec le code d’erreur : {0} *** LogProcessing=Traitement en cours... -LogProcessSuccess=Opération terminée avec succès ! LogRegistryUnloading=Déchargement des ruches du Registre... -LogRemoveChat=Supprimer Conversation : {0} LogRemoveCortana=Supprimer Cortana : {0} LogRemoveEdge=Supprimer Edge : {0} LogRemoveOneDrive=Supprimer OneDrive : {0} @@ -174,3 +159,17 @@ LogTempFilesDeleting=Suppression des fichiers temporaires... LogTiny11Starting=Démarrage de la création de Tiny11... LogWimUnmounting=Démontage du WIM (abandon des modifications)... LogWorkingDir=Dossier de travail : {0} + +DefenderTooltip=Si coché, les services antivirus Windows Defender sont désactivés dans l'image (comme pour les builds CORE). Le système installé n'aura aucune protection antivirus. +StatusLoadingEditions=Chargement des éditions Windows... +StatusReadyDefaultEditions=Prêt (éditions par défaut) +StatusExportingImage=Exportation de l'image... +ValidationFailed=Les vérifications préalables ont échoué. La génération n'a pas démarré. +ValidationIsoNotFound=Fichier ISO Windows introuvable : {0} +ValidationInvalidPath=Chemin non valide : {0} +ValidationOutputEqualsIso=L'ISO de sortie ne peut pas être identique à l'ISO source. +ValidationOutputInsideScratch=L'ISO de sortie ne peut pas se trouver dans le répertoire de travail. +ValidationOutputDirCreateFailed=Impossible de créer le répertoire de sortie : {0} +ValidationScratchCreateFailed=Impossible de créer le répertoire de travail : {0} +ValidationDiskSpace=Espace disque insuffisant sur {0} : {1:F1} Go requis, {2:F1} Go disponibles. +ValidationDiskSpaceUnknown=Impossible de vérifier l'espace disque libre ({0}). Continuation. diff --git a/Resources/Strings.ja-JP.txt b/Resources/Strings.ja-JP.txt index ae57cc9..1305f3a 100644 --- a/Resources/Strings.ja-JP.txt +++ b/Resources/Strings.ja-JP.txt @@ -1,4 +1,3 @@ -AppTitle=Tiny11 Builder GUI IsoSelection=ソース ISO: WorkingDirectory=作業フォルダー: OutputPath=出力 ISO のパス: @@ -31,7 +30,6 @@ PresetEnterpriseTooltip=業務環境向け MicrosoftEdge=Microsoft Edge OneDrive=OneDrive Cortana=Cortana -WindowsChat=Windows チャット MicrosoftTeams=Microsoft Teams / チャット XboxApps=Xbox アプリ Telemetry=テレメトリ(データ収集) @@ -56,15 +54,12 @@ Copilot=Copilot SpeechOcrHandwriting=音声 / OCR / 手書き入力 DriverCleanup=未使用のドライバー(プリンター/スキャナー/モデム/Xbox) Ready=準備完了 -Processing=処理中... -Completed=完了しました! Error=エラーが発生しました IsoSelected=ISO ファイルを選択しました: {0} WorkingDirSelected=作業フォルダーを選択しました: {0} OutputPathSelected=出力 ISO のパスを選択しました: {0} AutounattendSelected=カスタム autounattend.xml を選択しました: {0} AutounattendCleared=autounattend.xml の選択を解除しました。 -BuildStarted=Tiny11 の作成を開始しました BuildCompleted=処理が正常に完了しました! BuildFailed=処理に失敗しました! TPMTooltip=TPM 2.0 の要件を回避 @@ -147,22 +142,12 @@ LogEditionParseLineError=解析エラー: {0} - 行: {1} LogEditionsRetrievalFailed=Windows エディションを取得できませんでした: {0} LogExpectedLocation=想定される場所: {0} LogFileSize=ファイル サイズ: {0} GB({1} バイト) -LogIsoCopyError=ISO のコピー エラー: {0} -LogIsoCopying=ISO ファイルをコピーしています: {0} LogIsoPath=ISO: {0} -LogIsoSaved=ISO ファイルを保存しました: {0} -LogIsoUnmounted=ISO をマウント解除しました。 -LogIsoUnmountError=ISO のマウント解除エラー: {0} LogIsoUnmounting=ISO をマウント解除しています... LogOutputLocation=出力先: {0} LogOutputPath=出力: {0} -LogProcessCompletedBanner=*** 処理が正常に完了しました *** -LogProcessFailed=処理に失敗しました(終了コード: {0})。クリーンアップしています... -LogProcessFailedBanner=*** 処理はエラー コード {0} で終了しました *** LogProcessing=処理中... -LogProcessSuccess=処理が正常に完了しました! LogRegistryUnloading=レジストリ ハイブをアンロードしています... -LogRemoveChat=チャットを削除: {0} LogRemoveCortana=Cortana を削除: {0} LogRemoveEdge=Edge を削除: {0} LogRemoveOneDrive=OneDrive を削除: {0} @@ -174,3 +159,17 @@ LogTempFilesDeleting=一時ファイルを削除しています... LogTiny11Starting=Tiny11 の作成を開始しています... LogWimUnmounting=WIM をマウント解除しています(変更を破棄)... LogWorkingDir=作業フォルダー: {0} + +DefenderTooltip=選択すると、CORE ビルドと同様に、イメージ内の Windows Defender ウイルス対策サービスが無効になります。インストール後のシステムにはウイルス対策保護がありません。 +StatusLoadingEditions=Windows エディションを読み込み中... +StatusReadyDefaultEditions=準備完了 (既定のエディション) +StatusExportingImage=イメージをエクスポート中... +ValidationFailed=事前チェックに失敗しました。ビルドは開始されませんでした。 +ValidationIsoNotFound=Windows ISO ファイルが見つかりません: {0} +ValidationInvalidPath=無効なパスです: {0} +ValidationOutputEqualsIso=出力 ISO をソース ISO と同じにすることはできません。 +ValidationOutputInsideScratch=出力 ISO を作業ディレクトリ内に置くことはできません。 +ValidationOutputDirCreateFailed=出力ディレクトリを作成できませんでした: {0} +ValidationScratchCreateFailed=作業ディレクトリを作成できませんでした: {0} +ValidationDiskSpace={0} の空き容量が不足しています: {1:F1} GB 必要、{2:F1} GB 利用可能。 +ValidationDiskSpaceUnknown=空きディスク容量を確認できませんでした ({0})。続行します。 diff --git a/Resources/Strings.ru-RU.txt b/Resources/Strings.ru-RU.txt index 736e6d4..2fa527b 100644 --- a/Resources/Strings.ru-RU.txt +++ b/Resources/Strings.ru-RU.txt @@ -1,4 +1,3 @@ -AppTitle=Tiny11 Builder GUI IsoSelection=Исходный ISO: WorkingDirectory=Рабочая папка: OutputPath=Путь к выходному ISO: @@ -31,7 +30,6 @@ PresetEnterpriseTooltip=Подходит для рабочей среды MicrosoftEdge=Microsoft Edge OneDrive=OneDrive Cortana=Cortana -WindowsChat=Чат Windows MicrosoftTeams=Microsoft Teams / Чат XboxApps=Приложения Xbox Telemetry=Телеметрия (сбор данных) @@ -56,15 +54,12 @@ Copilot=Copilot SpeechOcrHandwriting=Речь / OCR / рукописный ввод DriverCleanup=Неиспользуемые драйверы (принтер/сканер/модем/Xbox) Ready=Готово -Processing=Обработка... -Completed=Завершено! Error=Произошла ошибка IsoSelected=Выбран ISO-файл: {0} WorkingDirSelected=Выбрана рабочая папка: {0} OutputPathSelected=Выбран путь выходного ISO: {0} AutounattendSelected=Выбран пользовательский autounattend.xml: {0} AutounattendCleared=Выбор autounattend.xml сброшен. -BuildStarted=Начато создание Tiny11 BuildCompleted=Процесс успешно завершён! BuildFailed=Процесс завершился ошибкой! TPMTooltip=Обойти требование TPM 2.0 @@ -147,22 +142,12 @@ LogEditionParseLineError=Ошибка разбора: {0} - Строка: {1} LogEditionsRetrievalFailed=Не удалось получить редакции Windows: {0} LogExpectedLocation=Ожидаемое расположение: {0} LogFileSize=Размер файла: {0} ГБ ({1} байт) -LogIsoCopyError=Ошибка копирования ISO: {0} -LogIsoCopying=Копирование ISO-файла: {0} LogIsoPath=ISO: {0} -LogIsoSaved=ISO-файл успешно сохранён: {0} -LogIsoUnmounted=ISO отключён. -LogIsoUnmountError=Ошибка отключения ISO: {0} LogIsoUnmounting=Отключение ISO... LogOutputLocation=Расположение результата: {0} LogOutputPath=Результат: {0} -LogProcessCompletedBanner=*** Процесс успешно завершён *** -LogProcessFailed=Процесс завершился ошибкой (код: {0}), выполняется очистка... -LogProcessFailedBanner=*** Процесс завершён с кодом ошибки: {0} *** LogProcessing=Обработка... -LogProcessSuccess=Процесс успешно завершён! LogRegistryUnloading=Выгрузка кустов реестра... -LogRemoveChat=Удалить Chat: {0} LogRemoveCortana=Удалить Cortana: {0} LogRemoveEdge=Удалить Edge: {0} LogRemoveOneDrive=Удалить OneDrive: {0} @@ -174,3 +159,17 @@ LogTempFilesDeleting=Удаление временных файлов... LogTiny11Starting=Запуск создания Tiny11... LogWimUnmounting=Отключение WIM (изменения будут отброшены)... LogWorkingDir=Рабочая папка: {0} + +DefenderTooltip=Если выбрано, антивирусные службы Windows Defender отключаются в образе (как в сборках CORE). В установленной системе не будет антивирусной защиты. +StatusLoadingEditions=Загрузка выпусков Windows... +StatusReadyDefaultEditions=Готово (выпуски по умолчанию) +StatusExportingImage=Экспорт образа... +ValidationFailed=Предварительные проверки не пройдены. Сборка не запущена. +ValidationIsoNotFound=Файл ISO Windows не найден: {0} +ValidationInvalidPath=Недопустимый путь: {0} +ValidationOutputEqualsIso=Выходной ISO не может совпадать с исходным ISO. +ValidationOutputInsideScratch=Выходной ISO не может находиться внутри рабочего каталога. +ValidationOutputDirCreateFailed=Не удалось создать выходной каталог: {0} +ValidationScratchCreateFailed=Не удалось создать рабочий каталог: {0} +ValidationDiskSpace=Недостаточно свободного места на {0}: требуется {1:F1} ГБ, доступно {2:F1} ГБ. +ValidationDiskSpaceUnknown=Не удалось проверить свободное место на диске ({0}). Продолжаем. diff --git a/Resources/Strings.tr-TR.txt b/Resources/Strings.tr-TR.txt index ad19575..c360acb 100644 --- a/Resources/Strings.tr-TR.txt +++ b/Resources/Strings.tr-TR.txt @@ -1,4 +1,3 @@ -AppTitle=Tiny11 Builder GUI IsoSelection=Kaynak ISO: WorkingDirectory=Çalışma Dizini: OutputPath=Çıktı ISO Yolu: @@ -43,7 +42,6 @@ PresetEnterpriseTooltip=İş ortamına uygun MicrosoftEdge=Microsoft Edge OneDrive=OneDrive Cortana=Cortana -WindowsChat=Windows Chat MicrosoftTeams=Microsoft Teams / Sohbet XboxApps=Xbox Apps @@ -78,8 +76,6 @@ DriverCleanup=Kullanılmayan Sürücüler (Yazıcı/Tarayıcı/Modem/Xbox) # Status Messages Ready=Hazır -Processing=İşlem Sürüyor... -Completed=Tamamlandı! Error=Hata Oluştu IsoSelected=ISO dosyası seçildi: {0} WorkingDirSelected=Çalışma dizini seçildi: {0} @@ -88,17 +84,10 @@ AutounattendSelected=Özel autounattend.xml seçildi: {0} AutounattendCleared=Özel autounattend.xml seçimi temizlendi. # Build Process Messages -BuildStarted=Tiny11 Oluşturma İşlemi Başladı -MountingIso=ISO dosyası mount ediliyor... -RunningScript=PowerShell betiği çalıştırılıyor... BuildCompleted=İşlem başarıyla tamamlandı! BuildFailed=İşlem başarısız oldu! # Error Messages -IsoMountFailed=ISO dosyası mount edilemedi! -ScriptNotFound=Script dosyası bulunamadı: {0} -AdminRightsWarning=Yönetici yetkisi ile çalışması önerilir -MissingFields=Eksik: {0} # Tooltips TPMTooltip=TPM 2.0 gereksinimini atlat @@ -112,15 +101,9 @@ AutounattendTooltip=Dahili OOBE bypass ayarları yerine kendi autounattend.xml d # Language Selection Language=Uygulama Dili: -LanguageTurkish=Türkçe -LanguageEnglish=English -LanguageChangedTR=Dil Türkçe olarak değiştirildi -LanguageChangedEN=Dil İngilizce olarak değiştirildi LanguageChanged=Dil {0} olarak değiştirildi # Image Types Content -StandardTypeContent=Standart (tiny11maker) -CoreTypeContent=Core (tiny11Coremaker) # Startup Messages AppStarted=Tiny11 GUI başlatıldı @@ -145,7 +128,6 @@ LogSelectedOptions=Seçilen Ayarlar: LogRemoveEdge=Edge Kaldır: {0} LogRemoveOneDrive=OneDrive Kaldır: {0} LogRemoveCortana=Cortana Kaldır: {0} -LogRemoveChat=Chat Kaldır: {0} LogRemoveTeams=Teams Kaldır: {0} LogRemoveXbox=Xbox Kaldır: {0} LogDisableTelemetry=Telemetri Devre Dışı: {0} @@ -160,8 +142,6 @@ LogNo=Hayır # Log Messages - Process Status LogScriptCreated=Özel script oluşturuldu: {0} LogTiny11Starting=Tiny11 oluşturma işlemi başlatılıyor... -LogIsoMounting=ISO dosyası mount ediliyor... -LogIsoMounted=ISO mount edildi: {0} LogProcessing=İşlem sürüyor... LogBuildSuccess=Tiny11 ISO dosyası başarıyla oluşturuldu! LogOutputLocation=Çıktı konumu: {0} @@ -179,7 +159,6 @@ LogWimUnmounting=WIM unmount ediliyor (değişiklikler atılıyor)... LogIsoUnmounting=ISO unmount ediliyor... LogRegistryUnloading=Registry hive'ları kaldırılıyor... LogTempFilesDeleting=Geçici dosyalar siliniyor... -LogTempFilesError=Bazı geçici dosyalar silinemedi: {0} LogCancelComplete=İşlem iptal edildi ve temizlik yapıldı. LogCancelError=İptal sırasında hata: {0} LogCancelByUser=İşlem kullanıcı tarafından iptal edildi. @@ -187,38 +166,6 @@ LogCancelReceived=İptal isteği alındı... LogAlreadyRunning=Zaten bir işlem çalışıyor! # Log Messages - Script Process -LogPreparingDirs=Dizinler hazırlanıyor... -LogCopyingIso=ISO içeriği kopyalanıyor... -LogConvertingEsd=ESD -> WIM dönüştürülüyor... -LogMountingWim=Windows image mount ediliyor... -LogRemovingApps=Gereksiz uygulamalar kaldırılıyor... -LogRemoving=Kaldırılıyor: {0} -LogSkipped=Atlandı: {0} -LogRemovingEdge=Microsoft Edge kaldırılıyor... -LogDeleted=Silindi: {0} -LogRemovingOneDrive=OneDrive kaldırılıyor... -LogApplyingRegistry=Registry ayarları uygulanıyor... -LogBypassingRequirements=Sistem gereksinimleri bypass ediliyor... -LogDisablingTelemetry=Telemetri devre dışı bırakılıyor... -LogDisablingSponsoredApps=Önerilen uygulamalar devre dışı bırakılıyor... -LogDisablingReservedStorage=Reserved Storage devre dışı bırakılıyor... -LogDisablingBitLocker=BitLocker otomatik şifreleme devre dışı bırakılıyor... -LogBypassingMSAccount=Microsoft hesabı gereksinimi bypass ediliyor... -LogDisablingWindowsUpdate=Windows Update devre dışı bırakılıyor... -LogDisablingDefender=Windows Defender devre dışı bırakılıyor (Güvenlik riski!)... -LogSavingRegistry=Registry kaydediliyor... -LogCreatingOobeScript=OOBE bypass scripti oluşturuluyor... -LogCreatingAutounattend=autounattend.xml oluşturuluyor... -LogSavingChanges=Değişiklikler kaydediliyor... -LogUnmountingSourceIso=Kaynak ISO unmount ediliyor... -LogCreatingIso=Tiny11 ISO oluşturuluyor... -LogOscdimgNotFound=oscdimg.exe bulunamadı! Windows ADK yüklü olmalı. -LogOscdimgFound=oscdimg bulundu: {0} -LogCleaningUp=Temizlik yapılıyor... -LogIsoCreatedSuccess=Tiny11 ISO başarıyla oluşturuldu! -LogLocation=Konum: {0} -LogSize=Boyut: {0} GB -LogIsoCreationFailed=ISO oluşturulamadı! # Status Messages StatusStarting=İşlem başlatılıyor... @@ -251,23 +198,14 @@ EditionsLoadFailed=Windows sürümleri yüklenemedi LoadingDefaultEditions=Varsayılan sürümler yükleniyor... # Process Messages -LogProcessFailed=İşlem başarısız oldu (Exit Code: {0}), temizlik yapılıyor... -LogProcessSuccess=İşlem başarıyla tamamlandı! -LogIsoCopying=ISO dosyası kopyalanıyor: {0} -LogIsoSaved=ISO dosyası başarıyla kaydedildi: {0} -LogIsoCopyError=ISO kopyalama hatası: {0} -LogSystemCleanupComplete=Sistem temizliği tamamlandı LogCleanupError=Temizlik hatası: {0} LogComprehensiveCleanup=Kapsamlı sistem temizliği yapılıyor... LogComprehensiveCleanupComplete=Kapsamlı temizlik tamamlandı LogCleanupContinue=Temizlik hatası (devam edilebilir): {0} -LogSystemCleanupInProgress=Sistem temizliği yapılıyor... # Log Messages - Additional LogAdminRightsRecommended=Uyarı: Uygulamanın yönetici yetkisiyle çalıştırılması önerilir. LogAdminRightsNeededForEditions=Windows sürümlerini okumak için yönetici yetkisi gerekebilir. -LogProcessCompletedBanner=*** İşlem Başarıyla Tamamlandı *** -LogProcessFailedBanner=*** İşlem Hata Koduyla Sonlandı: {0} *** LogPresetMinimalApplied=Minimal preset uygulandı - Maksimum optimizasyon LogPresetBalancedApplied=Balanced preset uygulandı - Dengeli optimizasyon LogPresetGamingApplied=Gaming preset uygulandı - Performans optimizasyonu @@ -275,5 +213,17 @@ LogPresetEnterpriseApplied=Enterprise preset uygulandı - İş ortamı optimizas LogEditionParseLineError=Parse hatası: {0} - Satır: {1} LogEditionParseFallback=Parse başarısız, tüm varsayılan sürümler ekleniyor... LogEditionsRetrievalFailed=Windows sürümleri alınamadı: {0} -LogIsoUnmounted=ISO unmount edildi. -LogIsoUnmountError=ISO unmount hatası: {0} + +DefenderTooltip=Seçildiğinde Windows Defender antivirüs servisleri imajda devre dışı bırakılır (CORE derlemelerdekiyle aynı işlem). Kurulan sistemde antivirüs koruması olmayacak. +StatusLoadingEditions=Windows sürümleri yükleniyor... +StatusReadyDefaultEditions=Hazır (Varsayılan sürümler) +StatusExportingImage=İmaj dışa aktarılıyor... +ValidationFailed=Ön kontroller başarısız. İşlem başlatılmadı. +ValidationIsoNotFound=Windows ISO dosyası bulunamadı: {0} +ValidationInvalidPath=Geçersiz yol: {0} +ValidationOutputEqualsIso=Çıktı ISO'su, kaynak ISO ile aynı olamaz. +ValidationOutputInsideScratch=Çıktı ISO'su, çalışma dizininin içinde olamaz. +ValidationOutputDirCreateFailed=Çıktı dizini oluşturulamadı: {0} +ValidationScratchCreateFailed=Çalışma dizini oluşturulamadı: {0} +ValidationDiskSpace={0} üzerinde yeterli boş disk alanı yok: {1:F1} GB gerekli, {2:F1} GB kullanılabilir. +ValidationDiskSpaceUnknown=Boş disk alanı kontrol edilemedi ({0}). Devam ediliyor. diff --git a/Resources/Strings.zh-CN.txt b/Resources/Strings.zh-CN.txt index 125ca4c..d411f6b 100644 --- a/Resources/Strings.zh-CN.txt +++ b/Resources/Strings.zh-CN.txt @@ -1,4 +1,3 @@ -AppTitle=Tiny11 Builder 图形界面 IsoSelection=源 ISO: WorkingDirectory=工作目录: OutputPath=输出 ISO 路径: @@ -31,7 +30,6 @@ PresetEnterpriseTooltip=适合企业环境 MicrosoftEdge=Microsoft Edge OneDrive=OneDrive Cortana=Cortana -WindowsChat=Windows 聊天 MicrosoftTeams=Microsoft Teams / 聊天 XboxApps=Xbox 应用 Telemetry=遥测(数据收集) @@ -56,15 +54,12 @@ Copilot=Copilot SpeechOcrHandwriting=语音 / OCR / 手写 DriverCleanup=未使用的驱动程序(打印机/扫描仪/调制解调器/Xbox) Ready=就绪 -Processing=正在处理... -Completed=已完成! Error=发生错误 IsoSelected=已选择 ISO 文件:{0} WorkingDirSelected=已选择工作目录:{0} OutputPathSelected=已选择输出 ISO 路径:{0} AutounattendSelected=已选择自定义 autounattend.xml:{0} AutounattendCleared=已清除 autounattend.xml 选择。 -BuildStarted=已开始创建 Tiny11 BuildCompleted=操作成功完成! BuildFailed=操作失败! TPMTooltip=绕过 TPM 2.0 要求 @@ -147,22 +142,12 @@ LogEditionParseLineError=解析错误:{0} - 行:{1} LogEditionsRetrievalFailed=无法获取 Windows 版本:{0} LogExpectedLocation=预期位置:{0} LogFileSize=文件大小:{0} GB({1} 字节) -LogIsoCopyError=ISO 复制错误:{0} -LogIsoCopying=正在复制 ISO 文件:{0} LogIsoPath=ISO:{0} -LogIsoSaved=ISO 文件已成功保存:{0} -LogIsoUnmounted=ISO 已卸载。 -LogIsoUnmountError=ISO 卸载错误:{0} LogIsoUnmounting=正在卸载 ISO... LogOutputLocation=输出位置:{0} LogOutputPath=输出:{0} -LogProcessCompletedBanner=*** 操作成功完成 *** -LogProcessFailed=操作失败(退出代码:{0}),正在清理... -LogProcessFailedBanner=*** 操作结束,错误代码:{0} *** LogProcessing=正在处理... -LogProcessSuccess=操作成功完成! LogRegistryUnloading=正在卸载注册表配置单元... -LogRemoveChat=删除聊天:{0} LogRemoveCortana=删除 Cortana:{0} LogRemoveEdge=删除 Edge:{0} LogRemoveOneDrive=删除 OneDrive:{0} @@ -174,3 +159,17 @@ LogTempFilesDeleting=正在删除临时文件... LogTiny11Starting=正在开始创建 Tiny11... LogWimUnmounting=正在卸载 WIM(放弃更改)... LogWorkingDir=工作目录:{0} + +DefenderTooltip=选中后,映像中的 Windows Defender 防病毒服务将被禁用(与 CORE 构建相同)。安装后的系统将没有防病毒保护。 +StatusLoadingEditions=正在加载 Windows 版本... +StatusReadyDefaultEditions=就绪(默认版本) +StatusExportingImage=正在导出映像... +ValidationFailed=预检查失败,构建未启动。 +ValidationIsoNotFound=找不到 Windows ISO 文件:{0} +ValidationInvalidPath=无效的路径:{0} +ValidationOutputEqualsIso=输出 ISO 不能与源 ISO 相同。 +ValidationOutputInsideScratch=输出 ISO 不能位于工作目录内。 +ValidationOutputDirCreateFailed=无法创建输出目录:{0} +ValidationScratchCreateFailed=无法创建工作目录:{0} +ValidationDiskSpace={0} 可用磁盘空间不足:需要 {1:F1} GB,可用 {2:F1} GB。 +ValidationDiskSpaceUnknown=无法检查可用磁盘空间({0})。继续执行。 diff --git a/src/Models/ComponentRemovalOptions.cs b/src/Models/ComponentRemovalOptions.cs index 7930ff2..9fb56a1 100644 --- a/src/Models/ComponentRemovalOptions.cs +++ b/src/Models/ComponentRemovalOptions.cs @@ -19,6 +19,12 @@ public class ComponentRemovalOptions public bool DisableReservedStorage { get; set; } = true; public bool DisableBitLocker { get; set; } = true; + /// + /// Windows Defender antivirüs servislerini imajda devre dışı bırakır ve Defender paketini + /// kaldırmayı dener (CORE derlemesindeki Defender işlemleriyle aynı). + /// + public bool DisableDefender { get; set; } = false; + // Sistem Gereksinimleri Bypass public bool BypassTPM { get; set; } = true; public bool BypassCPU { get; set; } = true; diff --git a/src/Services/LocalizationService.cs b/src/Services/LocalizationService.cs index 63cafef..466d10a 100644 --- a/src/Services/LocalizationService.cs +++ b/src/Services/LocalizationService.cs @@ -10,16 +10,53 @@ public class LocalizationService private static LocalizationService? _instance; public static LocalizationService Instance => _instance ??= new LocalizationService(); + private static readonly string[] SupportedLanguages = + { + "tr-TR", "en-US", "ru-RU", "ja-JP", "de-DE", "fr-FR", "es-ES", "zh-CN" + }; + private readonly Dictionary _strings = new Dictionary(); - private string _currentLanguage = "tr-TR"; // Varsayılan dil + private string _currentLanguage = "en-US"; public event EventHandler? LanguageChanged; - public string CurrentLanguage { get; private set; } = "tr-TR"; + public string CurrentLanguage { get; private set; } = "en-US"; public LocalizationService() { - LoadLanguage(_currentLanguage); + LoadLanguage(DetectDefaultLanguage()); + } + + /// + /// İşletim sisteminin UI diline göre başlangıç dilini seçer. + /// Tam eşleşme yoksa dil kodu (ör. de-AT → de-DE), o da yoksa en-US kullanılır. + /// + private static string DetectDefaultLanguage() + { + try + { + var uiCulture = CultureInfo.CurrentUICulture; + if (!string.IsNullOrEmpty(uiCulture?.Name)) + { + var exact = SupportedLanguages.FirstOrDefault(code => + string.Equals(code, uiCulture.Name, StringComparison.OrdinalIgnoreCase)); + if (exact != null) return exact; + + var languageTag = uiCulture.TwoLetterISOLanguageName; + if (!string.IsNullOrEmpty(languageTag)) + { + var neutral = SupportedLanguages.FirstOrDefault(code => + code.StartsWith(languageTag + "-", StringComparison.OrdinalIgnoreCase)); + if (neutral != null) return neutral; + } + } + } + catch + { + // Culture API'leri her ortanda çalışmayabilir; sessizce İngilizce'ye dön. + } + + return "en-US"; } public void LoadLanguage(string languageCode) diff --git a/src/Services/PowerShellService.cs b/src/Services/PowerShellService.cs index 9587dc3..151cdda 100644 --- a/src/Services/PowerShellService.cs +++ b/src/Services/PowerShellService.cs @@ -572,13 +572,34 @@ private string GenerateTiny11Script(string isoPath, string scratchPath, string o sb.AppendLine(); } - if (isCoreBuild) + // Defender paket kaldırma: standart build'de "Disable Defender" seçildiyse veya CORE build'de çalışır. + // CORE build'de Defender ile birlikte diğer sistem paketleri de kaldırılır. + var removeDefenderPackage = options.DisableDefender || isCoreBuild; + if (removeDefenderPackage) { - sb.AppendLine(@"# CORE: servis edilebilirliği azaltan ek sistem paketi temizliği"); - sb.AppendLine(@"Write-Host 'CORE build: removing recovery and selected system packages...' -ForegroundColor Red"); - sb.AppendLine(@"$corePackagePatterns = @('Windows-Defender-Client-Package*', 'Microsoft-Windows-InternetExplorer-Optional-Package*', 'Microsoft-Windows-MediaPlayer-Package*', 'Microsoft-Windows-WordPad-FoD-Package*', 'Microsoft-Windows-StepsRecorder-Package*')"); + var corePackagePatterns = new List { "Windows-Defender-Client-Package*" }; + if (isCoreBuild) + { + corePackagePatterns.Add("Microsoft-Windows-InternetExplorer-Optional-Package*"); + corePackagePatterns.Add("Microsoft-Windows-MediaPlayer-Package*"); + corePackagePatterns.Add("Microsoft-Windows-WordPad-FoD-Package*"); + corePackagePatterns.Add("Microsoft-Windows-StepsRecorder-Package*"); + } + + sb.AppendLine(isCoreBuild + ? @"# CORE: servis edilebilirliği azaltan ek sistem paketi temizliği" + : @"# Windows Defender paketini kaldırmayı dene"); + sb.AppendLine(isCoreBuild + ? @"Write-Host 'CORE build: removing recovery and selected system packages...' -ForegroundColor Red" + : @"Write-Host 'Attempting Windows Defender package removal...' -ForegroundColor Cyan"); + sb.AppendLine(@"$corePackagePatterns = @("); + foreach (var pattern in corePackagePatterns) + { + sb.AppendLine($@" '{pattern}'"); + } + sb.AppendLine(@")"); sb.AppendLine(@"$packageOutput = & $dismPath /English /Image:$mountDir /Get-Packages /Format:List"); - sb.AppendLine(@"Assert-NativeSuccess 'CORE package inventory'"); + sb.AppendLine($@"Assert-NativeSuccess '{(isCoreBuild ? "CORE package inventory" : "Defender package inventory")}'"); sb.AppendLine(@"$packageNames = $packageOutput | Select-String '^Package Identity\s*:\s*(.+)$' | ForEach-Object { $_.Matches[0].Groups[1].Value.Trim() }"); sb.AppendLine(@"foreach ($pattern in $corePackagePatterns) {"); sb.AppendLine(@" foreach ($packageName in ($packageNames | Where-Object { $_ -like $pattern })) {"); @@ -591,6 +612,10 @@ private string GenerateTiny11Script(string isoPath, string scratchPath, string o sb.AppendLine(@" }"); sb.AppendLine(@" }"); sb.AppendLine(@"}"); + } + + if (isCoreBuild) + { sb.AppendLine(@"$winRePath = Join-Path $mountDir 'Windows\System32\Recovery\winre.wim'"); sb.AppendLine(@"if (Test-Path $winRePath) { Remove-Item $winRePath -Force -ErrorAction Stop; New-Item $winRePath -ItemType File -Force | Out-Null }"); sb.AppendLine(); @@ -779,10 +804,17 @@ private string GenerateTiny11Script(string isoPath, string scratchPath, string o sb.AppendLine(); } - if (isCoreBuild) + // Defender servislerini devre dışı bırak: standart build'de "Disable Defender" + // seçildiyse veya CORE build'de. Offline düzenleme olduğundan Tamper Protection + // devrede değildir. + if (options.DisableDefender || isCoreBuild) { - sb.AppendLine(@"# CORE: Defender servislerini devre dışı bırak"); - sb.AppendLine(@"Write-Host 'CORE build: disabling Defender services...' -ForegroundColor Red"); + sb.AppendLine(isCoreBuild + ? @"# CORE: Defender servislerini devre dışı bırak" + : @"# Windows Defender servislerini devre dışı bırak"); + sb.AppendLine(isCoreBuild + ? @"Write-Host 'CORE build: disabling Defender services...' -ForegroundColor Red" + : @"Write-Host 'Disabling Windows Defender services...' -ForegroundColor Cyan"); sb.AppendLine(@"foreach ($serviceName in @('WinDefend', 'WdNisSvc', 'WdNisDrv', 'WdFilter', 'Sense')) {"); sb.AppendLine(@" $serviceKey = 'HKLM\OFFLINE_SYSTEM\ControlSet001\Services\' + $serviceName"); sb.AppendLine(@" & reg.exe query $serviceKey 2>$null | Out-Null"); diff --git a/src/ViewModels/LocalizedStrings.cs b/src/ViewModels/LocalizedStrings.cs index 432dbb3..1ec7dee 100644 --- a/src/ViewModels/LocalizedStrings.cs +++ b/src/ViewModels/LocalizedStrings.cs @@ -102,6 +102,7 @@ public LocalizedSystemFeatures(LocalizationService localization) public string SponsoredApps => _localization.GetString("SponsoredApps"); public string ReservedStorage => _localization.GetString("ReservedStorage"); public string BitLocker => _localization.GetString("BitLockerEncryption"); + public string WindowsDefender => _localization.GetString("WindowsDefender"); } public class LocalizedSystemRequirements @@ -174,5 +175,6 @@ public LocalizedTooltips(LocalizationService localization) public string EnterprisePreset => _localization.GetString("PresetEnterpriseTooltip"); public string LanguageSelector => _localization.GetString("Language"); public string AutounattendTooltip => _localization.GetString("AutounattendTooltip"); + public string DefenderTooltip => _localization.GetString("DefenderTooltip"); } } diff --git a/src/ViewModels/MainViewModel.cs b/src/ViewModels/MainViewModel.cs index f26ddd1..e28399f 100644 --- a/src/ViewModels/MainViewModel.cs +++ b/src/ViewModels/MainViewModel.cs @@ -148,6 +148,9 @@ public bool IsEnterprisePreset private bool _disableBitLocker = true; public bool DisableBitLocker { get => _disableBitLocker; set { _disableBitLocker = value; OnPropertyChanged(); } } + private bool _disableDefender = false; + public bool DisableDefender { get => _disableDefender; set { _disableDefender = value; OnPropertyChanged(); } } + // System Requirements Bypass private bool _bypassTPM = true; public bool BypassTPM { get => _bypassTPM; set { _bypassTPM = value; OnPropertyChanged(); } } @@ -527,7 +530,13 @@ private async void StartBuild() { StatusText = GetLocalizedString("StatusStarting"); IsIndeterminate = true; - + + // Yol doğrulamaları ve disk alanı ön kontrolü + if (!ValidateBuildPrerequisites()) + { + return; + } + // Çalışma dizini oluştur if (!Directory.Exists(ScratchPath)) { @@ -550,6 +559,7 @@ private async void StartBuild() DisableSponsoredApps = DisableSponsoredApps, DisableReservedStorage = DisableReservedStorage, DisableBitLocker = DisableBitLocker, + DisableDefender = DisableDefender, // Sistem gereksinimleri bypass BypassTPM = BypassTPM, @@ -592,6 +602,7 @@ private async void StartBuild() LogOutput += " " + string.Format(GetLocalizedString("LogRemoveXbox"), RemoveXbox ? yes : no) + "\n"; LogOutput += " " + string.Format(GetLocalizedString("LogDisableTelemetry"), DisableTelemetry ? yes : no) + "\n"; LogOutput += " " + string.Format(GetLocalizedString("LogDisableUpdate"), DisableWindowsUpdate ? yes : no) + "\n"; + LogOutput += " " + string.Format(GetLocalizedString("LogDisableDefender"), DisableDefender ? yes : no) + "\n"; LogOutput += " " + string.Format(GetLocalizedString("LogBypassTPM"), BypassTPM ? yes : no) + "\n"; LogOutput += " " + string.Format(GetLocalizedString("LogBypassMSAccount"), BypassMSAccount ? yes : no) + "\n"; LogOutput += " " + string.Format(GetLocalizedString("LogCustomAutounattend"), string.IsNullOrWhiteSpace(CustomAutounattendPath) ? no : CustomAutounattendPath) + "\n"; @@ -659,6 +670,139 @@ private async void StartBuild() } } + /// + /// İşlem başlamadan önce yol doğrulamaları ve disk alanı kontrolü yapar. + /// Hata varsa log'a yazar ve false döner. + /// + private bool ValidateBuildPrerequisites() + { + string fullIsoPath, fullScratchPath, fullOutputPath; + try + { + fullIsoPath = Path.GetFullPath(IsoPath); + fullScratchPath = Path.GetFullPath(ScratchPath); + fullOutputPath = Path.GetFullPath(OutputPath); + } + catch (Exception ex) + { + LogOutput += string.Format(GetLocalizedString("ValidationInvalidPath"), ex.Message) + "\n"; + return FailPrerequisites(); + } + + if (!File.Exists(fullIsoPath)) + { + LogOutput += string.Format(GetLocalizedString("ValidationIsoNotFound"), fullIsoPath) + "\n"; + return FailPrerequisites(); + } + + if (string.Equals(fullOutputPath, fullIsoPath, StringComparison.OrdinalIgnoreCase)) + { + LogOutput += GetLocalizedString("ValidationOutputEqualsIso") + "\n"; + return FailPrerequisites(); + } + + if (IsPathInsideDirectory(fullOutputPath, fullScratchPath)) + { + LogOutput += GetLocalizedString("ValidationOutputInsideScratch") + "\n"; + return FailPrerequisites(); + } + + try + { + Directory.CreateDirectory(fullScratchPath); + } + catch (Exception ex) + { + LogOutput += string.Format(GetLocalizedString("ValidationScratchCreateFailed"), $"{fullScratchPath} ({ex.Message})") + "\n"; + return FailPrerequisites(); + } + + var outputDirectory = Path.GetDirectoryName(fullOutputPath); + try + { + if (!string.IsNullOrEmpty(outputDirectory)) + { + Directory.CreateDirectory(outputDirectory); + } + } + catch (Exception ex) + { + LogOutput += string.Format(GetLocalizedString("ValidationOutputDirCreateFailed"), $"{outputDirectory} ({ex.Message})") + "\n"; + return FailPrerequisites(); + } + + return CheckFreeDiskSpace(fullIsoPath, fullScratchPath, fullOutputPath); + } + + /// + /// Scratch ve çıktı sürücülerinde yeterli boş alan olup olmadığını kontrol eder. + /// Tahmin: scratch için ISO boyutunun 2 katı + 10 GB, çıktı için ISO boyutunun 1,2 katı. + /// + private bool CheckFreeDiskSpace(string fullIsoPath, string fullScratchPath, string fullOutputPath) + { + const double gigabyte = 1024.0 * 1024.0 * 1024.0; + double isoSizeGb; + try + { + isoSizeGb = new FileInfo(fullIsoPath).Length / gigabyte; + } + catch (Exception ex) + { + LogOutput += string.Format(GetLocalizedString("ValidationDiskSpaceUnknown"), ex.Message) + "\n"; + return true; + } + + var scratchRequiredGb = isoSizeGb * 2.0 + 10.0; + var outputRequiredGb = isoSizeGb * 1.2; + + try + { + var scratchRoot = Path.GetPathRoot(fullScratchPath) ?? fullScratchPath; + var outputRoot = Path.GetPathRoot(fullOutputPath) ?? fullOutputPath; + var scratchAvailableGb = new DriveInfo(scratchRoot).AvailableFreeSpace / gigabyte; + var sameDrive = string.Equals(scratchRoot, outputRoot, StringComparison.OrdinalIgnoreCase); + var outputAvailableGb = sameDrive + ? scratchAvailableGb + : new DriveInfo(outputRoot).AvailableFreeSpace / gigabyte; + + var scratchOk = scratchAvailableGb >= scratchRequiredGb; + var outputOk = outputAvailableGb >= (sameDrive ? scratchRequiredGb + outputRequiredGb : outputRequiredGb); + + if (!scratchOk) + { + LogOutput += string.Format(GetLocalizedString("ValidationDiskSpace"), scratchRoot, scratchRequiredGb, scratchAvailableGb) + "\n"; + return FailPrerequisites(); + } + + if (!outputOk) + { + LogOutput += string.Format(GetLocalizedString("ValidationDiskSpace"), + outputRoot, sameDrive ? scratchRequiredGb + outputRequiredGb : outputRequiredGb, outputAvailableGb) + "\n"; + return FailPrerequisites(); + } + } + catch (Exception ex) + { + // Örn. UNC yollarında DriveInfo çalışmayabilir; kontrolü atlayıp devam et. + LogOutput += string.Format(GetLocalizedString("ValidationDiskSpaceUnknown"), ex.Message) + "\n"; + } + + return true; + } + + private static bool IsPathInsideDirectory(string path, string directory) + { + var normalizedDirectory = Path.GetFullPath(directory) + .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) + Path.DirectorySeparatorChar; + return path.StartsWith(normalizedDirectory, StringComparison.OrdinalIgnoreCase); + } + + private bool FailPrerequisites() + { + LogOutput += GetLocalizedString("ValidationFailed") + "\n"; + return false; + } + private bool CanStartBuild() { // İşlem çalışıyorsa başlatılamaz @@ -715,11 +859,11 @@ private async Task LoadWindowsEditionsAsync() SelectedEdition = WindowsEditions[3]; // Windows 11 Pro'yu varsayılan yap IsEditionSelectionEnabled = true; - StatusText = "Hazır (Varsayılan sürümler)"; + StatusText = GetLocalizedString("StatusReadyDefaultEditions"); return; } - StatusText = "Windows sürümleri yükleniyor..."; + StatusText = GetLocalizedString("StatusLoadingEditions"); IsIndeterminate = true; var editions = await _powerShellService.GetWindowsEditionsAsync(IsoPath!); @@ -741,7 +885,7 @@ private async Task LoadWindowsEditionsAsync() LogOutput += GetLocalizedString("NoEditionsFound") + "\n"; } - StatusText = "Hazır"; + StatusText = GetLocalizedString("StatusReady"); } catch (Exception ex) { @@ -759,7 +903,7 @@ private async Task LoadWindowsEditionsAsync() SelectedEdition = WindowsEditions[3]; // Windows 11 Pro IsEditionSelectionEnabled = true; - StatusText = "Hazır (Varsayılan sürümler)"; + StatusText = GetLocalizedString("StatusReadyDefaultEditions"); } finally { @@ -776,7 +920,7 @@ private void OnOutputReceived(string output) // Progress tracking based on output messages if (output.Contains("Exporting image")) - StatusText = "Exporting image..."; + StatusText = GetLocalizedString("StatusExportingImage"); else if (output.Contains("Unmounting image")) StatusText = GetLocalizedString("StatusUnmounting"); else if (output.Contains("Cleanup complete")) @@ -815,6 +959,7 @@ private void ApplyMinimalPreset() DisableSponsoredApps = true; DisableReservedStorage = true; DisableBitLocker = true; + DisableDefender = true; BypassTPM = true; BypassCPU = true; @@ -851,6 +996,7 @@ private void ApplyBalancedPreset() DisableSponsoredApps = true; DisableReservedStorage = true; DisableBitLocker = true; + DisableDefender = false; BypassTPM = true; BypassCPU = true; @@ -887,6 +1033,7 @@ private void ApplyGamingPreset() DisableSponsoredApps = true; DisableReservedStorage = false; // Performans için DisableBitLocker = true; + DisableDefender = false; BypassTPM = true; BypassCPU = true; @@ -923,6 +1070,7 @@ private void ApplyEnterprisePreset() DisableSponsoredApps = true; DisableReservedStorage = false; DisableBitLocker = false; // Enterprise güvenlik + DisableDefender = false; // Enterprise güvenlik BypassTPM = false; // Enterprise güvenlik için TPM korunur BypassCPU = true; diff --git a/src/Views/MainWindow.xaml b/src/Views/MainWindow.xaml index caf7602..940e732 100644 --- a/src/Views/MainWindow.xaml +++ b/src/Views/MainWindow.xaml @@ -7,9 +7,10 @@ xmlns:converters="clr-namespace:tiny11_ui.Converters" mc:Ignorable="d" Title="Tiny11 GUI" - Height="920" Width="1040" + Height="880" Width="1000" + MinHeight="560" MinWidth="880" WindowStartupLocation="CenterScreen" - ResizeMode="NoResize"> + ResizeMode="CanResizeWithGrip"> @@ -218,6 +219,7 @@ + diff --git a/tests/Tiny11UI.Tests/PowerShellServiceScriptTests.cs b/tests/Tiny11UI.Tests/PowerShellServiceScriptTests.cs index 060fcd5..e8b34d4 100644 --- a/tests/Tiny11UI.Tests/PowerShellServiceScriptTests.cs +++ b/tests/Tiny11UI.Tests/PowerShellServiceScriptTests.cs @@ -397,6 +397,7 @@ private static async Task RunPowerShellHarness(string harness) DisableSponsoredApps = false, DisableReservedStorage = false, DisableBitLocker = false, + DisableDefender = false, BypassTPM = false, BypassCPU = false, BypassRAM = false, @@ -592,6 +593,25 @@ public void TeamsAndChat_IsOneFunctionalPackageFamilyChoice() Assert.Contains("Microsoft.Windows.Teams", packages); } + [Fact] + public void DefenderOption_AppliesDefenderServicingToStandardBuild() + { + var service = new PowerShellService(new LocalizationService()); + var baseline = service.PreviewScript(@"C:\images\windows.iso", @"C:\scratch", @"C:\output\tiny11.iso", 3, BareOptions()); + var options = BareOptions(); + options.DisableDefender = true; + var standard = service.PreviewScript(@"C:\images\windows.iso", @"C:\scratch", @"C:\output\tiny11.iso", 3, options); + + Assert.DoesNotContain("WinDefend", baseline); + Assert.DoesNotContain("Windows-Defender-Client-Package", baseline); + Assert.Contains("WinDefend", standard); + Assert.Contains("Windows-Defender-Client-Package*", standard); + Assert.Contains("Assert-NativeSuccess 'Defender package inventory'", standard); + // CORE'a özgü yıkıcı işlemler standart build'e sızmamalı. + Assert.DoesNotContain(@"Windows\System32\Recovery\winre.wim", standard); + Assert.DoesNotContain(@"Services\wuauserv", standard); + } + [Fact] public void CoreBuild_ProducesAdditionalDestructiveOperations() { diff --git a/tiny11-ui.csproj b/tiny11-ui.csproj index 1843fb2..edc9b1c 100644 --- a/tiny11-ui.csproj +++ b/tiny11-ui.csproj @@ -9,9 +9,9 @@ enable tiny11_ui app.manifest - 1.2.3 - 1.2.3.0 - 1.2.3.0 + 1.3.0-beta.1 + 1.3.0.0 + 1.3.0.0