From 9ed26560c2208fb409091f0e49766e30b6d023c3 Mon Sep 17 00:00:00 2001 From: "return {name:\"chinchi-codes\"}" <84403078+rohitLovesKrishna@users.noreply.github.com> Date: Wed, 4 Nov 2026 10:21:27 +0530 Subject: [PATCH 1/5] feat(upscale): add offline AI image upscaling with local NCNN models # Conflicts: # src/Filee.Core/Presets/BuiltInData.cs # src/Filee.Core/Presets/Preset.cs # src/Filee.Core/Settings/UserDataStore.cs # tests/Filee.App.Tests/ToolbarPaletteViewTests.cs # Conflicts: # src/Filee.Core/Settings/UserDataStore.cs --- THIRD-PARTY-NOTICES.md | 10 + docs/ENGINES.md | 14 + src/Filee.App/Assets/i18n/ar.json | 41 ++- src/Filee.App/Assets/i18n/de.json | 41 ++- src/Filee.App/Assets/i18n/en.json | 41 ++- src/Filee.App/Assets/i18n/es.json | 41 ++- src/Filee.App/Assets/i18n/fr.json | 41 ++- src/Filee.App/Assets/i18n/hi.json | 41 ++- src/Filee.App/Assets/i18n/id.json | 41 ++- src/Filee.App/Assets/i18n/it.json | 41 ++- src/Filee.App/Assets/i18n/ja.json | 41 ++- src/Filee.App/Assets/i18n/ko.json | 41 ++- src/Filee.App/Assets/i18n/ne.json | 41 ++- src/Filee.App/Assets/i18n/pl.json | 41 ++- src/Filee.App/Assets/i18n/pt-BR.json | 41 ++- src/Filee.App/Assets/i18n/pt-PT.json | 41 ++- src/Filee.App/Assets/i18n/ru.json | 41 ++- src/Filee.App/Assets/i18n/th.json | 41 ++- src/Filee.App/Assets/i18n/tr.json | 41 ++- src/Filee.App/Assets/i18n/zh-CN.json | 41 ++- src/Filee.App/Assets/i18n/zh-TW.json | 41 ++- src/Filee.App/Services/AppHost.cs | 1 + src/Filee.App/Services/PresetAvailability.cs | 4 + src/Filee.App/Services/WindowService.cs | 29 ++ .../ViewModels/Pages/EnginesPageViewModel.cs | 1 + .../ViewModels/Pages/PresetsPageViewModel.cs | 5 +- .../ViewModels/PresetEditorViewModel.cs | 16 + src/Filee.App/ViewModels/UpscaleViewModel.cs | 326 ++++++++++++++++++ .../Views/Pages/EnginesPage.axaml.cs | 1 + src/Filee.App/Views/PresetEditorView.axaml | 41 +++ src/Filee.App/Views/UpscaleWindow.axaml | 124 +++++++ src/Filee.App/Views/UpscaleWindow.axaml.cs | 40 +++ src/Filee.Core/Presets/BuiltInData.cs | 17 + src/Filee.Core/Presets/Preset.cs | 26 +- src/Filee.Core/Presets/UpscaleTool.cs | 49 +++ src/Filee.Core/Settings/AppSettings.cs | 2 +- src/Filee.Core/Settings/UserDataStore.cs | 12 +- src/Filee.Engines/EngineRegistry.cs | 1 + src/Filee.Engines/Filee.Engines.csproj | 1 + .../Infrastructure/EngineDownloads.cs | 5 +- .../Infrastructure/EngineEnvironment.cs | 1 + .../Infrastructure/EngineInstaller.cs | 34 +- src/Filee.Engines/Infrastructure/engines.json | 28 ++ .../Infrastructure/upscale-models.json | 142 ++++++++ src/Filee.Engines/Upscale/UpscaleModels.cs | 147 ++++++++ .../Upscale/UpscalerConverter.cs | 77 +++++ src/Filee.Engines/Upscale/UpscalerEngine.cs | 112 ++++++ .../ToolbarPaletteViewTests.cs | 2 +- tests/Filee.Core.Tests/UpscaleToolTests.cs | 51 +++ tests/Filee.Engines.Tests/UpscalerTests.cs | 151 ++++++++ 50 files changed, 2216 insertions(+), 33 deletions(-) create mode 100644 src/Filee.App/ViewModels/UpscaleViewModel.cs create mode 100644 src/Filee.App/Views/UpscaleWindow.axaml create mode 100644 src/Filee.App/Views/UpscaleWindow.axaml.cs create mode 100644 src/Filee.Core/Presets/UpscaleTool.cs create mode 100644 src/Filee.Engines/Infrastructure/upscale-models.json create mode 100644 src/Filee.Engines/Upscale/UpscaleModels.cs create mode 100644 src/Filee.Engines/Upscale/UpscalerConverter.cs create mode 100644 src/Filee.Engines/Upscale/UpscalerEngine.cs create mode 100644 tests/Filee.Core.Tests/UpscaleToolTests.cs create mode 100644 tests/Filee.Engines.Tests/UpscalerTests.cs diff --git a/THIRD-PARTY-NOTICES.md b/THIRD-PARTY-NOTICES.md index 9ca80c47d..0c813324d 100644 --- a/THIRD-PARTY-NOTICES.md +++ b/THIRD-PARTY-NOTICES.md @@ -88,6 +88,16 @@ Downloaded from their official release pages when the user chooses to install th | Tesseract language data (tessdata_fast 4.1.0), downloaded per language when used | Apache-2.0 | https://github.com/tesseract-ocr/tessdata_fast | | whisper.cpp (whisper-cli.exe Windows build) | MIT | https://github.com/ggml-org/whisper.cpp | | ggml Whisper base model (`ggml-base.bin`) | MIT | https://huggingface.co/ggerganov/whisper.cpp | +| upscayl-bin (AI super-resolution binary) | AGPL-3.0 | https://github.com/upscayl/upscayl-ncnn | +| NMKD Siax (`4x_NMKD-Siax_200k`, Philip Hofmann / NMKD) | WTFPL | https://github.com/upscayl/custom-models, https://openmodeldb.info/models/4x-NMKD-Siax-200k | +| NMKD Superscale (`4x_NMKD-Superscale-SP_178000_G`, Philip Hofmann / NMKD) | WTFPL | https://github.com/upscayl/custom-models, https://openmodeldb.info/models/4x-NMKD-Superscale-SP-178000-G | +| RealESRGAN General (`RealESRGAN_General_x4_v3`, Xintao Wang) | BSD-3-Clause | https://github.com/xinntao/Real-ESRGAN | +| RealESRGAN General WDN (`RealESRGAN_General_WDN_x4_v3`, Xintao Wang) | BSD-3-Clause | https://github.com/xinntao/Real-ESRGAN | +| 4xLSDIR (`4xLSDIR`, Philip Hofmann / Phhofm) | CC-BY-4.0 | https://github.com/upscayl/custom-models, https://openmodeldb.info/models/4x-LSDIR | +| 4xLSDIRplusC (`4xLSDIRplusC`, Philip Hofmann / Phhofm) | CC-BY-4.0 | https://github.com/upscayl/custom-models, https://openmodeldb.info/models/4x-LSDIRplusC | +| 4xLSDIRCompactC3 (`4xLSDIRCompactC3`, Philip Hofmann / Phhofm) | CC-BY-4.0 | https://github.com/upscayl/custom-models, https://openmodeldb.info/models/4x-LSDIRCompactC3 | +| 4xNomos8kSC (`4xNomos8kSC`, Philip Hofmann / Phhofm) | CC-BY-4.0 | https://github.com/upscayl/custom-models, https://openmodeldb.info/models/4x-Nomos8kSC | +| 4xHFA2k (`4xHFA2k`, Philip Hofmann / Phhofm) | CC-BY-4.0 | https://github.com/upscayl/custom-models, https://openmodeldb.info/models/4x-HFA2k | These programs run as separate processes. Their source code is available from the linked projects. diff --git a/docs/ENGINES.md b/docs/ENGINES.md index ea19f378e..451c64abb 100644 --- a/docs/ENGINES.md +++ b/docs/ENGINES.md @@ -1880,3 +1880,17 @@ Filee translates documents, books, and text files locally using a local Ollama i - **Documents & E-books**: DOCX, HWPX, EPUB, KEPUB, FB2, HTMLZ, TXTZ, MD, TXT, and HTML are translated in place, preserving document structure, headings, bold/italic runs, tables, lists, images, and notes. - **Kindle e-books**: MOBI, AZW, AZW3, and PRC formats are translated via EPUB, and can then be routed to any supported target format. - **PDF target**: When a document is translated with PDF as the target format, the route planner translates the document model first and then routes the translated document through Filee's standard document-to-PDF export pipeline. + +## Image Quality Models (Offline AI Upscaler) + +Filee upscales and restores images locally using an offline AI super-resolution engine based on Vulkan/NCNN (`upscayl-bin` / `upscayl-ncnn`) and curated open-source neural network models (`upscayl/custom-models`). All processing runs 100% offline on your computer; no image data is ever uploaded or sent to external servers. + +- **Offline privacy & local execution**: Like all Filee features, image upscaling processes every pixel locally on your machine via direct Vulkan GPU acceleration or CPU mode. No network connection is used during upscaling. +- **Models catalog**: Curated selection of high-quality image models for photos, digital art, illustration, and restoration: + - Compact & fast models (optimized for CPU and integrated GPUs): `4xLSDIRCompactC3`, `RealESRGAN_General_x4_v3`, `RealESRGAN_General_WDN_x4_v3`. + - Detailed & high-fidelity models (recommended for dedicated GPUs): `4x_NMKD-Siax_200k`, `4x_NMKD-Superscale-SP_178000_G`, `4xLSDIR`, `4xLSDIRplusC`, `4xNomos8kSC`, `4xHFA2k`, `uniscale_restore`. +- **Where it lives**: + - **Donut Menu**: When an image is dropped or opened in the donut wheel, the **Upscale** preset opens the interactive Upscale dialog to select models, scale factors (1x to 4x), preview output resolution, and upscale directly. + - **Settings → Presets**: The "Upscale Image" tool preset can be configured with preferred default models and scale factors. + - **Settings → Engines**: "Image Quality Models" engine card with a dedicated **Download Models** manager to browse, search, download, and delete local model files. +- **Supported formats**: PNG, JPG, JPEG, WEBP, ICO, HEIC, AVIF, BMP, and TIFF. diff --git a/src/Filee.App/Assets/i18n/ar.json b/src/Filee.App/Assets/i18n/ar.json index e65e9cb7c..e1d96a1e1 100644 --- a/src/Filee.App/Assets/i18n/ar.json +++ b/src/Filee.App/Assets/i18n/ar.json @@ -1473,5 +1473,44 @@ "engines.ollama.connecting": "جارٍ الاتصال...", "engines.ollama.complete": "اكتمل!", "engines.ollama.failed": "فشل:", - "engines.ollama.error": "خطأ:" + "engines.ollama.error": "خطأ:", + "preset.upscale": "ترقية جودة الصورة", + "preset.upscale.donut": "ترقية الجودة", + "engine.upscaler.name": "نماذج جودة الصورة", + "engine.upscaler.description": "ترقية دقة الصور بالذكاء الاصطناعي حتى 4 أضعاف باستخدام نماذج NCNN المحلية.", + "engines.upscaler.manage": "تنزيل النماذج", + "engines.upscaler.modal_title": "نماذج جودة الصورة", + "engines.upscaler.modal_description": "قم بتنزيل نماذج الذكاء الاصطناعي المحلية لترقية دقة الصور حتى 4×. تجري كافة العمليات دون اتصال بالإنترنت بنسبة 100%.", + "engines.upscaler.search_placeholder": "البحث عن النماذج...", + "engines.upscaler.hardware_gpu": "تسريع GPU نشط ({0})", + "engines.upscaler.hardware_cpu": "وضع CPU (يوصى بالنماذج الخفيفة)", + "engines.upscaler.recommended_gpu": "بطاقة رسومات منفصلة", + "engines.upscaler.recommended_cpu": "المعالج والرسومات المدمجة", + "engines.upscaler.download": "تنزيل", + "engines.upscaler.downloading": "جارٍ التنزيل... {0}%", + "engines.upscaler.downloaded": "تم التنزيل", + "engines.upscaler.download_all": "تنزيل النماذج الموصى بها", + "engines.upscaler.delete_confirm": "هل تريد حذف {0}؟ يمكنك تنزيله مجددًا في أي وقت.", + "engines.upscaler.delete_failed": "تعذر حذف {0}.", + "engines.upscaler.download_failed": "فشل تنزيل {0}.", + "engines.upscaler.no_models": "لم يتم العثور على نماذج تطابق بحثك.", + "upscale.model": "النموذج", + "upscale.scale": "معامل التكبير", + "upscale.output_format": "تنسيق الإخراج", + "upscale.format_same": "نفس التنسيق الأصلي ({0})", + "upscale.resolution_label": "معاينة الدقة", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "ترقية الآن", + "upscale.no_models_installed": "لم يتم تنزيل أي نماذج بعد. يرجى تنزيل نموذج أولاً.", + "upscale.processing": "جارٍ الترقية... {0}%", + "upscale.success": "اكتملت ترقية الصورة بنجاح.", + "error.upscale_failed": "فشلت الترقية: {0}", + "engine.reason.needs_models": "لا توجد نماذج منزلة (انظر الإعدادات ← المحركات)", + "engines.package.upscayl-bin.name": "Upscayl (ترقية دقة الصور بالذكاء الاصطناعي)", + "engines.package.upscayl-bin.description": "ترقية دقة الصور والدقة الفائقة حتى 4 أضعاف بنماذج NCNN محلية.\nتُنزَّل النماذج عند استخدامها أول مرة.", + "error.upscale_needs_engine": "ثبّت Upscayl من الإعدادات ← المحركات لاستخدام ترقية الدقة بالذكاء الاصطناعي.", + "upscale.model_ready": "جاهز", + "upscale.model_download_size": "تنزيل {0} م.ب", + "upscale.downloading_model": "جارٍ تنزيل النموذج...", + "engines.model.delete_confirm": "هل تريد حذف النموذج {0}؟ يمكنك تنزيله مرة أخرى في أي وقت." } diff --git a/src/Filee.App/Assets/i18n/de.json b/src/Filee.App/Assets/i18n/de.json index 23d4dd594..6f02cebf0 100644 --- a/src/Filee.App/Assets/i18n/de.json +++ b/src/Filee.App/Assets/i18n/de.json @@ -1472,5 +1472,44 @@ "engines.ollama.connecting": "Verbindung wird hergestellt...", "engines.ollama.complete": "Abgeschlossen!", "engines.ollama.failed": "Fehlgeschlagen:", - "engines.ollama.error": "Fehler:" + "engines.ollama.error": "Fehler:", + "preset.upscale": "Bild hochskalieren", + "preset.upscale.donut": "Hochskalieren", + "engine.upscaler.name": "Bildqualitäts-Modelle", + "engine.upscaler.description": "KI-Bild-Hochskalierung und Super-Resolution bis zu 4× mit lokalen NCNN-Modellen.", + "engines.upscaler.manage": "Modelle herunterladen", + "engines.upscaler.modal_title": "Bildqualitäts-Modelle", + "engines.upscaler.modal_description": "Laden Sie lokale KI-Modelle herunter, um Bilder bis zu 4× hochzuskalieren. Die Verarbeitung erfolgt zu 100 % offline auf Ihrem Gerät.", + "engines.upscaler.search_placeholder": "Modelle suchen...", + "engines.upscaler.hardware_gpu": "GPU-Beschleunigung aktiv ({0})", + "engines.upscaler.hardware_cpu": "CPU-Modus (Kompakte Modelle empfohlen)", + "engines.upscaler.recommended_gpu": "Dedizierte GPU", + "engines.upscaler.recommended_cpu": "CPU & iGPU", + "engines.upscaler.download": "Herunterladen", + "engines.upscaler.downloading": "Wird heruntergeladen... {0}%", + "engines.upscaler.downloaded": "Heruntergeladen", + "engines.upscaler.download_all": "Empfohlene herunterladen", + "engines.upscaler.delete_confirm": "{0} löschen? Sie können es jederzeit wieder herunterladen.", + "engines.upscaler.delete_failed": "{0} konnte nicht gelöscht werden.", + "engines.upscaler.download_failed": "Fehler beim Herunterladen von {0}.", + "engines.upscaler.no_models": "Keine Modelle gefunden, die Ihrer Suche entsprechen.", + "upscale.model": "Modell", + "upscale.scale": "Skalierungsfaktor", + "upscale.output_format": "Ausgabeformat", + "upscale.format_same": "Gleiches Format wie Quelle ({0})", + "upscale.resolution_label": "Auflösungsvorschau", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "Jetzt hochskalieren", + "upscale.no_models_installed": "Keine Modelle heruntergeladen. Bitte laden Sie zuerst ein Modell herunter.", + "upscale.processing": "Wird hochskaliert... {0}%", + "upscale.success": "Hochskalierung erfolgreich abgeschlossen.", + "error.upscale_failed": "Hochskalierung fehlgeschlagen: {0}", + "engine.reason.needs_models": "Keine Modelle heruntergeladen (siehe Einstellungen → Engines)", + "engines.package.upscayl-bin.name": "Upscayl (KI-Bild-Upscaler)", + "engines.package.upscayl-bin.description": "KI-Bild-Upscaling und Super-Resolution bis zu 4× mit lokalen NCNN-Modellen.\nModelle werden bei der ersten Verwendung heruntergeladen.", + "error.upscale_needs_engine": "Installiere Upscayl unter Einstellungen → Module, um KI-Upscaling zu nutzen.", + "upscale.model_ready": "Bereit", + "upscale.model_download_size": "{0} MB Download", + "upscale.downloading_model": "Modell wird heruntergeladen...", + "engines.model.delete_confirm": "Modell {0} löschen? Du kannst es jederzeit wieder herunterladen." } diff --git a/src/Filee.App/Assets/i18n/en.json b/src/Filee.App/Assets/i18n/en.json index 43c91786d..7b410120f 100644 --- a/src/Filee.App/Assets/i18n/en.json +++ b/src/Filee.App/Assets/i18n/en.json @@ -1494,5 +1494,44 @@ "engines.ollama.connecting": "Connecting...", "engines.ollama.complete": "Complete!", "engines.ollama.failed": "Failed:", - "engines.ollama.error": "Error:" + "engines.ollama.error": "Error:", + "preset.upscale": "Upscale Image", + "preset.upscale.donut": "Upscale", + "engine.upscaler.name": "Image Quality Models", + "engine.upscaler.description": "AI image upscaling and super-resolution up to 4× with local NCNN models.", + "engines.upscaler.manage": "Download Models", + "engines.upscaler.modal_title": "Image Quality Models", + "engines.upscaler.modal_description": "Download local AI super-resolution models to upscale images up to 4×. All processing runs 100% offline on your device.", + "engines.upscaler.search_placeholder": "Search models...", + "engines.upscaler.hardware_gpu": "GPU Acceleration Active ({0})", + "engines.upscaler.hardware_cpu": "CPU Mode (Lightweight models recommended)", + "engines.upscaler.recommended_gpu": "Dedicated GPU", + "engines.upscaler.recommended_cpu": "CPU & iGPU", + "engines.upscaler.download": "Download", + "engines.upscaler.downloading": "Downloading... {0}%", + "engines.upscaler.downloaded": "Downloaded", + "engines.upscaler.download_all": "Download Recommended", + "engines.upscaler.delete_confirm": "Delete {0}? You can download it again at any time.", + "engines.upscaler.delete_failed": "Could not delete {0}.", + "engines.upscaler.download_failed": "Failed to download {0}.", + "engines.upscaler.no_models": "No models found matching your search.", + "upscale.model": "Model", + "upscale.scale": "Scale Factor", + "upscale.output_format": "Output Format", + "upscale.format_same": "Same format as source ({0})", + "upscale.resolution_label": "Resolution Preview", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "Upscale Now", + "upscale.no_models_installed": "No models downloaded. Please download a model first.", + "upscale.processing": "Upscaling... {0}%", + "upscale.success": "Upscaling completed successfully.", + "error.upscale_failed": "Upscaling failed: {0}", + "engine.reason.needs_models": "No models downloaded (see Settings → Engines)", + "engines.package.upscayl-bin.name": "Upscayl (AI image upscaler)", + "engines.package.upscayl-bin.description": "AI image upscaling and super-resolution up to 4× with local NCNN models.\nModels download the first time they are used.", + "error.upscale_needs_engine": "Install Upscayl in Settings → Engines to use AI upscaling.", + "upscale.model_ready": "Ready", + "upscale.model_download_size": "{0} MB download", + "upscale.downloading_model": "Downloading model...", + "engines.model.delete_confirm": "Delete model {0}? You can download it again at any time." } diff --git a/src/Filee.App/Assets/i18n/es.json b/src/Filee.App/Assets/i18n/es.json index 280629611..d35afb74b 100644 --- a/src/Filee.App/Assets/i18n/es.json +++ b/src/Filee.App/Assets/i18n/es.json @@ -1474,5 +1474,44 @@ "engines.ollama.connecting": "Conectando...", "engines.ollama.complete": "¡Completado!", "engines.ollama.failed": "Error:", - "engines.ollama.error": "Error:" + "engines.ollama.error": "Error:", + "preset.upscale": "Escalar imagen", + "preset.upscale.donut": "Escalar", + "engine.upscaler.name": "Modelos de calidad de imagen", + "engine.upscaler.description": "Mejora y superresolución de imágenes con IA local hasta 4× mediante modelos NCNN.", + "engines.upscaler.manage": "Descargar modelos", + "engines.upscaler.modal_title": "Modelos de calidad de imagen", + "engines.upscaler.modal_description": "Descarga modelos locales de superresolución para escalar imágenes hasta 4×. Todo el procesamiento se ejecuta 100% sin conexión.", + "engines.upscaler.search_placeholder": "Buscar modelos...", + "engines.upscaler.hardware_gpu": "Aceleración por GPU activa ({0})", + "engines.upscaler.hardware_cpu": "Modo CPU (se recomiendan modelos ligeros)", + "engines.upscaler.recommended_gpu": "GPU dedicada", + "engines.upscaler.recommended_cpu": "CPU e iGPU", + "engines.upscaler.download": "Descargar", + "engines.upscaler.downloading": "Descargando... {0}%", + "engines.upscaler.downloaded": "Descargado", + "engines.upscaler.download_all": "Descargar recomendados", + "engines.upscaler.delete_confirm": "¿Eliminar {0}? Puedes descargarlo de nuevo en cualquier momento.", + "engines.upscaler.delete_failed": "No se pudo eliminar {0}.", + "engines.upscaler.download_failed": "Error al descargar {0}.", + "engines.upscaler.no_models": "No se encontraron modelos que coincidan con la búsqueda.", + "upscale.model": "Modelo", + "upscale.scale": "Factor de escala", + "upscale.output_format": "Formato de salida", + "upscale.format_same": "Mismo formato que el origen ({0})", + "upscale.resolution_label": "Vista previa de resolución", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "Escalar ahora", + "upscale.no_models_installed": "No hay modelos descargados. Descarga uno primero.", + "upscale.processing": "Escalando... {0}%", + "upscale.success": "Escalado completado con éxito.", + "error.upscale_failed": "Error al escalar: {0}", + "engine.reason.needs_models": "No hay modelos descargados (ver Ajustes → Motores)", + "engines.package.upscayl-bin.name": "Upscayl (escalador de imágenes por IA)", + "engines.package.upscayl-bin.description": "Escalado de imágenes y superresolución por IA hasta 4× con modelos NCNN locales.\nLos modelos se descargan la primera vez que se usan.", + "error.upscale_needs_engine": "Instala Upscayl en Ajustes → Motores para usar el escalado por IA.", + "upscale.model_ready": "Listo", + "upscale.model_download_size": "Descarga de {0} MB", + "upscale.downloading_model": "Descargando modelo...", + "engines.model.delete_confirm": "¿Eliminar el modelo {0}? Puedes descargarlo de nuevo en cualquier momento." } diff --git a/src/Filee.App/Assets/i18n/fr.json b/src/Filee.App/Assets/i18n/fr.json index d691ebbaf..7651c80fb 100644 --- a/src/Filee.App/Assets/i18n/fr.json +++ b/src/Filee.App/Assets/i18n/fr.json @@ -1494,5 +1494,44 @@ "engines.ollama.connecting": "Connexion en cours...", "engines.ollama.complete": "Terminé !", "engines.ollama.failed": "Échec :", - "engines.ollama.error": "Erreur :" + "engines.ollama.error": "Erreur :", + "preset.upscale": "Mettre à l'échelle l'image", + "preset.upscale.donut": "Mettre à l'échelle", + "engine.upscaler.name": "Modèles de qualité d'image", + "engine.upscaler.description": "Amélioration et super-résolution d'images par IA jusqu'à 4× avec des modèles NCNN locaux.", + "engines.upscaler.manage": "Télécharger des modèles", + "engines.upscaler.modal_title": "Modèles de qualité d'image", + "engines.upscaler.modal_description": "Téléchargez des modèles locaux pour agrandir vos images jusqu'à 4×. Tout s'exécute à 100 % hors ligne sur votre appareil.", + "engines.upscaler.search_placeholder": "Rechercher des modèles...", + "engines.upscaler.hardware_gpu": "Accélération GPU active ({0})", + "engines.upscaler.hardware_cpu": "Mode CPU (modèles légers recommandés)", + "engines.upscaler.recommended_gpu": "GPU dédié", + "engines.upscaler.recommended_cpu": "CPU et iGPU", + "engines.upscaler.download": "Télécharger", + "engines.upscaler.downloading": "Téléchargement... {0}%", + "engines.upscaler.downloaded": "Téléchargé", + "engines.upscaler.download_all": "Télécharger les recommandés", + "engines.upscaler.delete_confirm": "Supprimer {0} ? Vous pourrez le télécharger à nouveau à tout moment.", + "engines.upscaler.delete_failed": "Impossible de supprimer {0}.", + "engines.upscaler.download_failed": "Échec du téléchargement de {0}.", + "engines.upscaler.no_models": "Aucun modèle trouvé correspondant à votre recherche.", + "upscale.model": "Modèle", + "upscale.scale": "Facteur d'échelle", + "upscale.output_format": "Format de sortie", + "upscale.format_same": "Même format que la source ({0})", + "upscale.resolution_label": "Aperçu de la résolution", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "Agrandir maintenant", + "upscale.no_models_installed": "Aucun modèle téléchargé. Veuillez d'abord en télécharger un.", + "upscale.processing": "Mise à l'échelle... {0}%", + "upscale.success": "Mise à l'échelle terminée avec succès.", + "error.upscale_failed": "Échec de la mise à l'échelle : {0}", + "engine.reason.needs_models": "Aucun modèle téléchargé (voir Paramètres → Moteurs)", + "engines.package.upscayl-bin.name": "Upscayl (mise à l'échelle d'images par IA)", + "engines.package.upscayl-bin.description": "Mise à l'échelle et super-résolution d'images par IA jusqu'à 4× avec des modèles NCNN locaux.\nLes modèles sont téléchargés à leur première utilisation.", + "error.upscale_needs_engine": "Installez Upscayl dans Paramètres → Moteurs pour utiliser la mise à l'échelle par IA.", + "upscale.model_ready": "Prêt", + "upscale.model_download_size": "Téléchargement de {0} Mo", + "upscale.downloading_model": "Téléchargement du modèle...", + "engines.model.delete_confirm": "Supprimer le modèle {0} ? Vous pouvez le retélécharger à tout moment." } diff --git a/src/Filee.App/Assets/i18n/hi.json b/src/Filee.App/Assets/i18n/hi.json index 91f9b7aac..420b92577 100644 --- a/src/Filee.App/Assets/i18n/hi.json +++ b/src/Filee.App/Assets/i18n/hi.json @@ -1474,5 +1474,44 @@ "engines.ollama.connecting": "कनेक्ट हो रहा है...", "engines.ollama.complete": "पूर्ण हुआ!", "engines.ollama.failed": "विफल:", - "engines.ollama.error": "त्रुटि:" + "engines.ollama.error": "त्रुटि:", + "preset.upscale": "छवि की गुणवत्ता बढ़ाएं", + "preset.upscale.donut": "अपस्केल", + "engine.upscaler.name": "इमेज क्वालिटी मॉडल", + "engine.upscaler.description": "स्थानीय NCNN मॉडल के साथ 4x तक AI छवि सुपर-रिज़ॉल्यूशन और अपस्केलिंग।", + "engines.upscaler.manage": "मॉडल डाउनलोड करें", + "engines.upscaler.modal_title": "इमेज क्वालिटी मॉडल", + "engines.upscaler.modal_description": "छवियों को 4x तक बड़ा और स्पष्ट करने के लिए स्थानीय AI मॉडल डाउनलोड करें। सभी प्रोसेसिंग आपके डिवाइस पर 100% ऑफ़लाइन होती है।", + "engines.upscaler.search_placeholder": "मॉडल खोजें...", + "engines.upscaler.hardware_gpu": "GPU त्वरण सक्रिय ({0})", + "engines.upscaler.hardware_cpu": "CPU मोड (हल्के मॉडल अनुशंसित)", + "engines.upscaler.recommended_gpu": "समर्पित GPU", + "engines.upscaler.recommended_cpu": "CPU और एकीकृत GPU", + "engines.upscaler.download": "डाउनलोड करें", + "engines.upscaler.downloading": "डाउनलोड हो रहा है... {0}%", + "engines.upscaler.downloaded": "डाउनलोड किया गया", + "engines.upscaler.download_all": "अनुशंसित मॉडल डाउनलोड करें", + "engines.upscaler.delete_confirm": "क्या {0} को हटाना चाहते हैं? आप इसे कभी भी दोबारा डाउनलोड कर सकते हैं।", + "engines.upscaler.delete_failed": "{0} को हटाया नहीं जा सका।", + "engines.upscaler.download_failed": "{0} को डाउनलोड करने में विफलता।", + "engines.upscaler.no_models": "आपकी खोज से मेल खाने वाला कोई मॉडल नहीं मिला।", + "upscale.model": "मॉडल", + "upscale.scale": "स्केल फैक्टर", + "upscale.output_format": "आउटपुट प्रारूप", + "upscale.format_same": "स्रोत प्रारूप जैसा ही ({0})", + "upscale.resolution_label": "रिज़ॉल्यूशन पूर्वावलोकन", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "अभी अपस्केल करें", + "upscale.no_models_installed": "कोई मॉडल डाउनलोड नहीं हुआ है। कृपया पहले एक मॉडल डाउनलोड करें।", + "upscale.processing": "अपस्केल हो रहा है... {0}%", + "upscale.success": "सफलतापूर्वक अपस्केल किया गया।", + "error.upscale_failed": "अपस्केल विफल रहा: {0}", + "engine.reason.needs_models": "कोई मॉडल डाउनलोड नहीं है (सेटिंग्स → इंजन देखें)", + "engines.package.upscayl-bin.name": "Upscayl (AI इमेज अपस्केलर)", + "engines.package.upscayl-bin.description": "स्थानीय NCNN मॉडल्स के साथ 4× तक AI इमेज अपस्केलिंग और सुपर-रेज़ोल्यूशन।\nमॉडल पहली बार इस्तेमाल पर डाउनलोड होते हैं।", + "error.upscale_needs_engine": "AI अपस्केलिंग का उपयोग करने के लिए सेटिंग्स → इंजन में Upscayl इंस्टॉल करें।", + "upscale.model_ready": "तैयार", + "upscale.model_download_size": "{0} MB डाउनलोड", + "upscale.downloading_model": "मॉडल डाउनलोड हो रहा है...", + "engines.model.delete_confirm": "क्या मॉडल {0} को हटाएं? आप इसे किसी भी समय फिर से डाउनलोड कर सकते हैं।" } diff --git a/src/Filee.App/Assets/i18n/id.json b/src/Filee.App/Assets/i18n/id.json index 279df415d..1b90488b5 100644 --- a/src/Filee.App/Assets/i18n/id.json +++ b/src/Filee.App/Assets/i18n/id.json @@ -1472,5 +1472,44 @@ "engines.ollama.connecting": "Menghubungkan...", "engines.ollama.complete": "Selesai!", "engines.ollama.failed": "Gagal:", - "engines.ollama.error": "Kesalahan:" + "engines.ollama.error": "Kesalahan:", + "preset.upscale": "Tingkatkan Kualitas Gambar", + "preset.upscale.donut": "Tingkatkan", + "engine.upscaler.name": "Model Kualitas Gambar", + "engine.upscaler.description": "Peningkatan resolusi gambar AI hingga 4× dengan model NCNN lokal.", + "engines.upscaler.manage": "Unduh Model", + "engines.upscaler.modal_title": "Model Kualitas Gambar", + "engines.upscaler.modal_description": "Unduh model super-resolusi AI lokal untuk memperbesar gambar hingga 4×. Semua pemrosesan berjalan 100% offline.", + "engines.upscaler.search_placeholder": "Cari model...", + "engines.upscaler.hardware_gpu": "Akselerasi GPU Aktif ({0})", + "engines.upscaler.hardware_cpu": "Mode CPU (Model ringan disarankan)", + "engines.upscaler.recommended_gpu": "GPU Khusus", + "engines.upscaler.recommended_cpu": "CPU & GPU Terintegrasi", + "engines.upscaler.download": "Unduh", + "engines.upscaler.downloading": "Mengunduh... {0}%", + "engines.upscaler.downloaded": "Terunduh", + "engines.upscaler.download_all": "Unduh yang Disarankan", + "engines.upscaler.delete_confirm": "Hapus {0}? Anda dapat mengunduhnya lagi kapan saja.", + "engines.upscaler.delete_failed": "Gagal menghapus {0}.", + "engines.upscaler.download_failed": "Gagal mengunduh {0}.", + "engines.upscaler.no_models": "Tidak ada model yang cocok dengan pencarian Anda.", + "upscale.model": "Model", + "upscale.scale": "Faktor Skala", + "upscale.output_format": "Format Keluaran", + "upscale.format_same": "Format sama dengan sumber ({0})", + "upscale.resolution_label": "Pratinjau Resolusi", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "Tingkatkan Sekarang", + "upscale.no_models_installed": "Belum ada model yang diunduh. Silakan unduh model terlebih dahulu.", + "upscale.processing": "Meningkatkan resolusi... {0}%", + "upscale.success": "Peningkatan kualitas selesai.", + "error.upscale_failed": "Peningkatan gagal: {0}", + "engine.reason.needs_models": "Belum ada model yang diunduh (lihat Pengaturan → Mesin)", + "engines.package.upscayl-bin.name": "Upscayl (peningkat resolusi gambar AI)", + "engines.package.upscayl-bin.description": "Peningkatan resolusi gambar AI hingga 4× dengan model NCNN lokal.\nModel diunduh saat pertama kali digunakan.", + "error.upscale_needs_engine": "Pasang Upscayl di Pengaturan → Engine untuk menggunakan peningkatan resolusi AI.", + "upscale.model_ready": "Siap", + "upscale.model_download_size": "Unduhan {0} MB", + "upscale.downloading_model": "Mengunduh model...", + "engines.model.delete_confirm": "Hapus model {0}? Anda dapat mengunduhnya lagi kapan saja." } diff --git a/src/Filee.App/Assets/i18n/it.json b/src/Filee.App/Assets/i18n/it.json index 824b1cf8a..10e49260f 100644 --- a/src/Filee.App/Assets/i18n/it.json +++ b/src/Filee.App/Assets/i18n/it.json @@ -1471,5 +1471,44 @@ "engines.ollama.connecting": "Connessione in corso...", "engines.ollama.complete": "Completato!", "engines.ollama.failed": "Non riuscito:", -"engines.ollama.error": "Errore:" +"engines.ollama.error": "Errore:", +"preset.upscale": "Migliora e ingrandisci immagine", +"preset.upscale.donut": "Migliora", +"engine.upscaler.name": "Modelli di qualità immagine", +"engine.upscaler.description": "Miglioramento e super-risoluzione immagini con IA fino a 4× con modelli NCNN locali.", +"engines.upscaler.manage": "Scarica modelli", +"engines.upscaler.modal_title": "Modelli di qualità immagine", +"engines.upscaler.modal_description": "Scarica modelli IA locali per ingrandire le immagini fino a 4×. Tutte le elaborazioni avvengono al 100% offline sul tuo dispositivo.", +"engines.upscaler.search_placeholder": "Cerca modelli...", +"engines.upscaler.hardware_gpu": "Accelerazione GPU attiva ({0})", +"engines.upscaler.hardware_cpu": "Modalità CPU (modelli leggeri consigliati)", +"engines.upscaler.recommended_gpu": "GPU dedicata", +"engines.upscaler.recommended_cpu": "CPU e iGPU", +"engines.upscaler.download": "Scarica", +"engines.upscaler.downloading": "Download in corso... {0}%", +"engines.upscaler.downloaded": "Scaricato", +"engines.upscaler.download_all": "Scarica consigliati", +"engines.upscaler.delete_confirm": "Eliminare {0}? Puoi riscaricarlo in qualsiasi momento.", +"engines.upscaler.delete_failed": "Impossibile eliminare {0}.", +"engines.upscaler.download_failed": "Impossibile scaricare {0}.", +"engines.upscaler.no_models": "Nessun modello trovato corrispondente alla ricerca.", +"upscale.model": "Modello", +"upscale.scale": "Fattore di scala", +"upscale.output_format": "Formato di output", +"upscale.format_same": "Stesso formato dell'origine ({0})", +"upscale.resolution_label": "Anteprima risoluzione", +"upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", +"upscale.button_start": "Migliora adesso", +"upscale.no_models_installed": "Nessun modello scaricato. Scarica prima un modello.", +"upscale.processing": "Miglioramento in corso... {0}%", +"upscale.success": "Miglioramento completato con successo.", +"error.upscale_failed": "Miglioramento non riuscito: {0}", +"engine.reason.needs_models": "Nessun modello scaricato (vedi Impostazioni → Motori)", +"engines.package.upscayl-bin.name": "Upscayl (upscaling immagini IA)", +"engines.package.upscayl-bin.description": "Upscaling e super-risoluzione immagini tramite IA fino a 4× con modelli NCNN locali.\nI modelli vengono scaricati la prima volta che li usi.", +"error.upscale_needs_engine": "Installa Upscayl in Impostazioni → Motori per usare l'upscaling IA.", +"upscale.model_ready": "Pronto", +"upscale.model_download_size": "Download di {0} MB", +"upscale.downloading_model": "Download del modello in corso...", +"engines.model.delete_confirm": "Eliminare il modello {0}? Puoi scaricarlo nuovamente in qualsiasi momento." } diff --git a/src/Filee.App/Assets/i18n/ja.json b/src/Filee.App/Assets/i18n/ja.json index 3cb7e576e..9ccca00fc 100644 --- a/src/Filee.App/Assets/i18n/ja.json +++ b/src/Filee.App/Assets/i18n/ja.json @@ -1474,5 +1474,44 @@ "engines.ollama.connecting": "接続中...", "engines.ollama.complete": "完了!", "engines.ollama.failed": "失敗:", - "engines.ollama.error": "エラー:" + "engines.ollama.error": "エラー:", + "preset.upscale": "画像をアップスケール", + "preset.upscale.donut": "拡大・高画質化", + "engine.upscaler.name": "画質向上AIモデル", + "engine.upscaler.description": "ローカルNCNNモデルを使用した最大4倍のAI画像超解像・高品質拡大。", + "engines.upscaler.manage": "モデルをダウンロード", + "engines.upscaler.modal_title": "画質向上AIモデル", + "engines.upscaler.modal_description": "画像を最大4倍に拡大・高画質化するローカルAI超解像モデルをダウンロードします。すべて端末内で100%オフライン処理されます。", + "engines.upscaler.search_placeholder": "モデルを検索...", + "engines.upscaler.hardware_gpu": "GPUアクセラレーション有効 ({0})", + "engines.upscaler.hardware_cpu": "CPUモード (軽量モデルを推奨)", + "engines.upscaler.recommended_gpu": "専用GPU", + "engines.upscaler.recommended_cpu": "CPUおよび内蔵GPU", + "engines.upscaler.download": "ダウンロード", + "engines.upscaler.downloading": "ダウンロード中... {0}%", + "engines.upscaler.downloaded": "ダウンロード済み", + "engines.upscaler.download_all": "推奨モデルを一括取得", + "engines.upscaler.delete_confirm": "{0} を削除しますか?いつでも再ダウンロードできます。", + "engines.upscaler.delete_failed": "{0} の削除に失敗しました。", + "engines.upscaler.download_failed": "{0} のダウンロードに失敗しました。", + "engines.upscaler.no_models": "一致するモデルが見つかりません。", + "upscale.model": "モデル", + "upscale.scale": "倍率", + "upscale.output_format": "出力形式", + "upscale.format_same": "元の形式と同じ ({0})", + "upscale.resolution_label": "解像度プレビュー", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "今すぐアップスケール", + "upscale.no_models_installed": "モデルがダウンロードされていません。先にモデルをダウンロードしてください。", + "upscale.processing": "アップスケール中... {0}%", + "upscale.success": "アップスケールが正常に完了しました。", + "error.upscale_failed": "アップスケールに失敗しました: {0}", + "engine.reason.needs_models": "モデルがありません (設定 → エンジンを確認)", + "engines.package.upscayl-bin.name": "Upscayl(AI 画像アップスケーラー)", + "engines.package.upscayl-bin.description": "ローカル NCNN モデルで最大 4 倍の AI 画像アップスケールと超解像処理を行います。\nモデルは初めて使うときにダウンロードされます。", + "error.upscale_needs_engine": "AI アップスケールを使用するには、設定 → エンジンで Upscayl をインストールしてください。", + "upscale.model_ready": "準備完了", + "upscale.model_download_size": "{0} MB ダウンロード", + "upscale.downloading_model": "モデルをダウンロード中...", + "engines.model.delete_confirm": "モデル {0} を削除しますか?いつでも再ダウンロードできます。" } diff --git a/src/Filee.App/Assets/i18n/ko.json b/src/Filee.App/Assets/i18n/ko.json index 59b4bf87c..98d6bbb0d 100644 --- a/src/Filee.App/Assets/i18n/ko.json +++ b/src/Filee.App/Assets/i18n/ko.json @@ -1494,5 +1494,44 @@ "engines.ollama.connecting": "연결 중...", "engines.ollama.complete": "완료!", "engines.ollama.failed": "실패:", - "engines.ollama.error": "오류:" + "engines.ollama.error": "오류:", + "preset.upscale": "이미지 고화질 확대", + "preset.upscale.donut": "고화질 확대", + "engine.upscaler.name": "화질 향상 모델", + "engine.upscaler.description": "로컬 NCNN 모델을 사용한 최대 4배 AI 이미지 초해상도 및 고화질 확대예요.", + "engines.upscaler.manage": "모델 다운로드", + "engines.upscaler.modal_title": "화질 향상 모델", + "engines.upscaler.modal_description": "이미지를 최대 4배까지 선명하게 확대하는 로컬 AI 모델을 다운로드해요. 모든 작업은 컴퓨터 내에서 100% 오프라인으로 실행돼요.", + "engines.upscaler.search_placeholder": "모델 검색...", + "engines.upscaler.hardware_gpu": "GPU 가속 활성화됨 ({0})", + "engines.upscaler.hardware_cpu": "CPU 모드 (경량 모델 권장)", + "engines.upscaler.recommended_gpu": "외장 그래픽카드(GPU)", + "engines.upscaler.recommended_cpu": "CPU 및 내장 그래픽", + "engines.upscaler.download": "다운로드", + "engines.upscaler.downloading": "다운로드 중... {0}%", + "engines.upscaler.downloaded": "다운로드 완료", + "engines.upscaler.download_all": "권장 모델 모두 받기", + "engines.upscaler.delete_confirm": "{0}을(를) 삭제할까요? 언제든 다시 내려받을 수 있어요.", + "engines.upscaler.delete_failed": "{0}을(를) 삭제하지 못했어요.", + "engines.upscaler.download_failed": "{0} 다운로드에 실패했어요.", + "engines.upscaler.no_models": "검색 결과와 일치하는 모델이 없어요.", + "upscale.model": "모델", + "upscale.scale": "확대 배율", + "upscale.output_format": "출력 형식", + "upscale.format_same": "원본 형식 유지 ({0})", + "upscale.resolution_label": "해상도 미리보기", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}배)", + "upscale.button_start": "지금 확대하기", + "upscale.no_models_installed": "다운로드된 모델이 없어요. 먼저 모델을 다운로드해 주세요.", + "upscale.processing": "고화질 확대 중... {0}%", + "upscale.success": "고화질 확대가 완료되었어요.", + "error.upscale_failed": "확대에 실패했어요: {0}", + "engine.reason.needs_models": "다운로드된 모델이 없어요 (설정 → 변환 엔진 확인)", + "engines.package.upscayl-bin.name": "Upscayl (AI 이미지 업스케일러)", + "engines.package.upscayl-bin.description": "로컬 NCNN 모델로 최대 4배 AI 이미지 업스케일 및 초해상도를 지원해요.\n모델은 처음 쓸 때 내려받아요.", + "error.upscale_needs_engine": "AI 업스케일을 사용하려면 설정 → 엔진에서 Upscayl을 설치해 주세요.", + "upscale.model_ready": "준비됨", + "upscale.model_download_size": "{0} MB 다운로드", + "upscale.downloading_model": "모델 내려받는 중...", + "engines.model.delete_confirm": "{0} 모델을 삭제할까요? 언제든 다시 내려받을 수 있어요." } diff --git a/src/Filee.App/Assets/i18n/ne.json b/src/Filee.App/Assets/i18n/ne.json index 656c8010c..ceef07163 100644 --- a/src/Filee.App/Assets/i18n/ne.json +++ b/src/Filee.App/Assets/i18n/ne.json @@ -1474,5 +1474,44 @@ "engines.ollama.connecting": "जडान हुँदैछ...", "engines.ollama.complete": "सम्पन्न भयो!", "engines.ollama.failed": "विफल भयो:", - "engines.ollama.error": "त्रुटि:" + "engines.ollama.error": "त्रुटि:", + "preset.upscale": "छविको गुणस्तर बढाउनुहोस्", + "preset.upscale.donut": "अपस्केल", + "engine.upscaler.name": "छवि गुणस्तर मोडेलहरू", + "engine.upscaler.description": "स्थानीय NCNN मोडेलहरूसँग ४× सम्म AI छवि सुपर-रिजोल्युसन र अपस्केलिङ।", + "engines.upscaler.manage": "मोडेलहरू डाउनलोड गर्नुहोस्", + "engines.upscaler.modal_title": "छवि गुणस्तर मोडेलहरू", + "engines.upscaler.modal_description": "तस्बिरहरूलाई ४× सम्म विस्तार गर्न स्थानीय AI सुपर-रिजोल्युसन मोडेलहरू डाउनलोड गर्नुहोस्। सबै प्रक्रिया १००% अफलाइन चल्छ।", + "engines.upscaler.search_placeholder": "मोडेलहरू खोज्नुहोस्...", + "engines.upscaler.hardware_gpu": "GPU प्रवेग सक्रिय ({0})", + "engines.upscaler.hardware_cpu": "CPU मोड (हल्का मोडेलहरू सिफारिस गरिएको)", + "engines.upscaler.recommended_gpu": "समर्पित GPU", + "engines.upscaler.recommended_cpu": "CPU र एकीकृत GPU", + "engines.upscaler.download": "डाउनलोड गर्नुहोस्", + "engines.upscaler.downloading": "डाउनलोड हुँदैछ... {0}%", + "engines.upscaler.downloaded": "डाउनलोड भयो", + "engines.upscaler.download_all": "सिफारिस गरिएका डाउनलोड गर्नुहोस्", + "engines.upscaler.delete_confirm": "{0} मेटाउनुहुन्छ? तपाईं यसलाई पछि फेरि डाउनलोड गर्न सक्नुहुन्छ।", + "engines.upscaler.delete_failed": "{0} मेटाउन सकिएन।", + "engines.upscaler.download_failed": "{0} डाउनलोड गर्न असफल।", + "engines.upscaler.no_models": "तपाईंको खोजीसँग मेल खाने कुनै मोडेल भेटिएन।", + "upscale.model": "मोडेल", + "upscale.scale": "स्केल कारक", + "upscale.output_format": "आउटपुट ढाँचा", + "upscale.format_same": "स्रोत जस्तै ढाँचा ({0})", + "upscale.resolution_label": "रिजोल्युसन पूर्वावलोकन", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "अहिले अपस्केल गर्नुहोस्", + "upscale.no_models_installed": "कुनै मोडेल डाउनलोड गरिएको छैन। कृपया पहिले मोडेल डाउनलोड गर्नुहोस्।", + "upscale.processing": "अपस्केल हुँदैछ... {0}%", + "upscale.success": "अपस्केल सफलतापूर्वक सम्पन्न भयो।", + "error.upscale_failed": "अपस्केल असफल भयो: {0}", + "engine.reason.needs_models": "कुनै मोडेल डाउनलोड गरिएको छैन (सेटिङहरू → इन्जिनहरू हेर्नुहोस्)", + "engines.package.upscayl-bin.name": "Upscayl (AI तस्बिर अपस्केलर)", + "engines.package.upscayl-bin.description": "स्थानीय NCNN मोडेलहरूसँग ४ गुणासम्म AI तस्बिर अपस्केलिङ र सुपर-रिजोल्युसन।\nमोडेलहरू पहिलो पटक प्रयोग गर्दा डाउनलोड हुन्छन्।", + "error.upscale_needs_engine": "AI अपस्केलिङ प्रयोग गर्न सेटिङहरू → इन्जिनहरूमा Upscayl स्थापना गर्नुहोस्।", + "upscale.model_ready": "तयार", + "upscale.model_download_size": "{0} MB डाउनलोड", + "upscale.downloading_model": "मोडेल डाउनलोड हुँदैछ...", + "engines.model.delete_confirm": "मोडेल {0} मेटाउनुहुन्छ? तपाईं यसलाई कुनै पनि समयमा पुन: डाउनलोड गर्न सक्नुहुन्छ।" } diff --git a/src/Filee.App/Assets/i18n/pl.json b/src/Filee.App/Assets/i18n/pl.json index 2412a143f..a559fd86e 100644 --- a/src/Filee.App/Assets/i18n/pl.json +++ b/src/Filee.App/Assets/i18n/pl.json @@ -1494,5 +1494,44 @@ "engines.ollama.connecting": "Łączenie...", "engines.ollama.complete": "Ukończono!", "engines.ollama.failed": "Niepowodzenie:", - "engines.ollama.error": "Błąd:" + "engines.ollama.error": "Błąd:", + "preset.upscale": "Zwiększ rozdzielczość obrazu", + "preset.upscale.donut": "Zwiększ jakość", + "engine.upscaler.name": "Modele jakości obrazu", + "engine.upscaler.description": "Skalowanie AI i super-rozdzielczość obrazów do 4× za pomocą lokalnych modeli NCNN.", + "engines.upscaler.manage": "Pobierz modele", + "engines.upscaler.modal_title": "Modele jakości obrazu", + "engines.upscaler.modal_description": "Pobierz lokalne modele super-rozdzielczości, aby powiększać obrazy do 4×. Wszystko działa w 100% offline na Twoim komputerze.", + "engines.upscaler.search_placeholder": "Szukaj modeli...", + "engines.upscaler.hardware_gpu": "Aktywne przyspieszenie GPU ({0})", + "engines.upscaler.hardware_cpu": "Tryb CPU (zalecane lekkie modele)", + "engines.upscaler.recommended_gpu": "Dedykowana karta graficzna", + "engines.upscaler.recommended_cpu": "CPU i zintegrowana grafika", + "engines.upscaler.download": "Pobierz", + "engines.upscaler.downloading": "Pobieranie... {0}%", + "engines.upscaler.downloaded": "Pobrano", + "engines.upscaler.download_all": "Pobierz zalecane", + "engines.upscaler.delete_confirm": "Usunąć {0}? Możesz pobrać go ponownie w dowolnym momencie.", + "engines.upscaler.delete_failed": "Nie udało się usunąć {0}.", + "engines.upscaler.download_failed": "Błąd pobierania {0}.", + "engines.upscaler.no_models": "Nie znaleziono pasujących modeli.", + "upscale.model": "Model", + "upscale.scale": "Mnożnik skali", + "upscale.output_format": "Format wyjściowy", + "upscale.format_same": "Taki sam jak źródłowy ({0})", + "upscale.resolution_label": "Podgląd rozdzielczości", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "Zwiększ jakość teraz", + "upscale.no_models_installed": "Brak pobranych modeli. Najpierw pobierz model.", + "upscale.processing": "Przetwarzanie... {0}%", + "upscale.success": "Skalowanie zakończone pomyślnie.", + "error.upscale_failed": "Skalowanie nie powiodło się: {0}", + "engine.reason.needs_models": "Brak pobranych modeli (zobacz Ustawienia → Silniki)", + "engines.package.upscayl-bin.name": "Upscayl (skalowanie obrazu SI)", + "engines.package.upscayl-bin.description": "Skalowanie obrazu SI i super-rozdzielczość do 4× za pomocą lokalnych modeli NCNN.\nModele są pobierane przy pierwszym użyciu.", + "error.upscale_needs_engine": "Zainstaluj Upscayl w Ustawienia → Silniki, aby korzystać ze skalowania SI.", + "upscale.model_ready": "Gotowy", + "upscale.model_download_size": "Pobieranie {0} MB", + "upscale.downloading_model": "Pobieranie modelu...", + "engines.model.delete_confirm": "Usunąć model {0}? Możesz pobrać go ponownie w dowolnym momencie." } diff --git a/src/Filee.App/Assets/i18n/pt-BR.json b/src/Filee.App/Assets/i18n/pt-BR.json index f5bdbb9fa..9ef4a9746 100644 --- a/src/Filee.App/Assets/i18n/pt-BR.json +++ b/src/Filee.App/Assets/i18n/pt-BR.json @@ -1494,5 +1494,44 @@ "engines.ollama.connecting": "Conectando...", "engines.ollama.complete": "Concluído!", "engines.ollama.failed": "Falha:", - "engines.ollama.error": "Erro:" + "engines.ollama.error": "Erro:", + "preset.upscale": "Aumentar resolução da imagem", + "preset.upscale.donut": "Super-resolução", + "engine.upscaler.name": "Modelos de qualidade de imagem", + "engine.upscaler.description": "Aprimoramento e super-resolução de imagem com IA até 4× usando modelos locais NCNN.", + "engines.upscaler.manage": "Baixar modelos", + "engines.upscaler.modal_title": "Modelos de qualidade de imagem", + "engines.upscaler.modal_description": "Baixe modelos locais de super-resolução para aumentar imagens em até 4×. Todo o processamento ocorre 100% offline no seu computador.", + "engines.upscaler.search_placeholder": "Pesquisar modelos...", + "engines.upscaler.hardware_gpu": "Aceleração por GPU ativa ({0})", + "engines.upscaler.hardware_cpu": "Modo CPU (modelos leves recomendados)", + "engines.upscaler.recommended_gpu": "GPU dedicada", + "engines.upscaler.recommended_cpu": "CPU e iGPU", + "engines.upscaler.download": "Baixar", + "engines.upscaler.downloading": "Baixando... {0}%", + "engines.upscaler.downloaded": "Baixado", + "engines.upscaler.download_all": "Baixar recomendados", + "engines.upscaler.delete_confirm": "Excluir {0}? Você poderá baixá-lo novamente a qualquer momento.", + "engines.upscaler.delete_failed": "Não foi possível excluir {0}.", + "engines.upscaler.download_failed": "Falha ao baixar {0}.", + "engines.upscaler.no_models": "Nenhum modelo encontrado para sua pesquisa.", + "upscale.model": "Modelo", + "upscale.scale": "Fator de escala", + "upscale.output_format": "Formato de saída", + "upscale.format_same": "Mesmo formato de origem ({0})", + "upscale.resolution_label": "Prévia da resolução", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "Aumentar agora", + "upscale.no_models_installed": "Nenhum modelo baixado. Baixe um modelo primeiro.", + "upscale.processing": "Aumentando resolução... {0}%", + "upscale.success": "Aumento de resolução concluído com sucesso.", + "error.upscale_failed": "Falha no aumento de resolução: {0}", + "engine.reason.needs_models": "Nenhum modelo baixado (ver Configurações → Motores)", + "engines.package.upscayl-bin.name": "Upscayl (upscaler de imagem por IA)", + "engines.package.upscayl-bin.description": "Upscaling e super-resolução de imagens por IA em até 4× com modelos NCNN locais.\nOs modelos são baixados na primeira vez que são usados.", + "error.upscale_needs_engine": "Instale o Upscayl em Configurações → Motores para usar o upscaling por IA.", + "upscale.model_ready": "Pronto", + "upscale.model_download_size": "Download de {0} MB", + "upscale.downloading_model": "Baixando modelo...", + "engines.model.delete_confirm": "Excluir o modelo {0}? Você pode baixá-lo novamente a qualquer momento." } diff --git a/src/Filee.App/Assets/i18n/pt-PT.json b/src/Filee.App/Assets/i18n/pt-PT.json index 56fb31491..baf12e518 100644 --- a/src/Filee.App/Assets/i18n/pt-PT.json +++ b/src/Filee.App/Assets/i18n/pt-PT.json @@ -1494,5 +1494,44 @@ "engines.ollama.connecting": "A ligar...", "engines.ollama.complete": "Concluído!", "engines.ollama.failed": "Falha:", - "engines.ollama.error": "Erro:" + "engines.ollama.error": "Erro:", + "preset.upscale": "Aumentar resolução da imagem", + "preset.upscale.donut": "Super-resolução", + "engine.upscaler.name": "Modelos de qualidade de imagem", + "engine.upscaler.description": "Melhoramento e super-resolução de imagem com IA até 4× com modelos locais NCNN.", + "engines.upscaler.manage": "Transferir modelos", + "engines.upscaler.modal_title": "Modelos de qualidade de imagem", + "engines.upscaler.modal_description": "Transfira modelos locais de super-resolução para aumentar imagens até 4×. Todo o processamento corre 100% offline no seu computador.", + "engines.upscaler.search_placeholder": "Procurar modelos...", + "engines.upscaler.hardware_gpu": "Aceleração por GPU ativa ({0})", + "engines.upscaler.hardware_cpu": "Modo CPU (modelos leves recomendados)", + "engines.upscaler.recommended_gpu": "GPU dedicada", + "engines.upscaler.recommended_cpu": "CPU e iGPU", + "engines.upscaler.download": "Transferir", + "engines.upscaler.downloading": "A transferir... {0}%", + "engines.upscaler.downloaded": "Transferido", + "engines.upscaler.download_all": "Transferir recomendados", + "engines.upscaler.delete_confirm": "Eliminar {0}? Pode voltar a transferi-lo a qualquer momento.", + "engines.upscaler.delete_failed": "Não foi possível eliminar {0}.", + "engines.upscaler.download_failed": "Falha ao transferir {0}.", + "engines.upscaler.no_models": "Nenhum modelo encontrado correspondente à pesquisa.", + "upscale.model": "Modelo", + "upscale.scale": "Fator de escala", + "upscale.output_format": "Formato de saída", + "upscale.format_same": "Mesmo formato de origem ({0})", + "upscale.resolution_label": "Pré-visualização da resolução", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "Aumentar agora", + "upscale.no_models_installed": "Nenhum modelo transferido. Transfira um modelo primeiro.", + "upscale.processing": "Aumentar resolução... {0}%", + "upscale.success": "Super-resolução concluída com sucesso.", + "error.upscale_failed": "Falha no aumento de resolução: {0}", + "engine.reason.needs_models": "Nenhum modelo transferido (ver Definições → Motores)", + "engines.package.upscayl-bin.name": "Upscayl (upscaler de imagem por IA)", + "engines.package.upscayl-bin.description": "Upscaling e super-resolução de imagens por IA até 4× com modelos NCNN locais.\nOs modelos são descarregados na primeira utilização.", + "error.upscale_needs_engine": "Instale o Upscayl em Definições → Motores para usar o upscaling por IA.", + "upscale.model_ready": "Pronto", + "upscale.model_download_size": "Transferência de {0} MB", + "upscale.downloading_model": "A descarregar modelo...", + "engines.model.delete_confirm": "Eliminar o modelo {0}? Pode descarregá-lo novamente a qualquer momento." } diff --git a/src/Filee.App/Assets/i18n/ru.json b/src/Filee.App/Assets/i18n/ru.json index 2c701edb3..e3f798e50 100644 --- a/src/Filee.App/Assets/i18n/ru.json +++ b/src/Filee.App/Assets/i18n/ru.json @@ -1494,5 +1494,44 @@ "engines.ollama.connecting": "Подключение...", "engines.ollama.complete": "Готово!", "engines.ollama.failed": "Ошибка:", - "engines.ollama.error": "Ошибка:" + "engines.ollama.error": "Ошибка:", + "preset.upscale": "Увеличить разрешение изображения", + "preset.upscale.donut": "Увеличить", + "engine.upscaler.name": "Модели улучшения качества", + "engine.upscaler.description": "ИИ-увеличение разрешения изображений до 4× с помощью локальных моделей NCNN.", + "engines.upscaler.manage": "Скачать модели", + "engines.upscaler.modal_title": "Модели улучшения качества", + "engines.upscaler.modal_description": "Загрузите локальные модели сверхвысокого разрешения для масштабирования изображений до 4×. Обработка на 100% автономна.", + "engines.upscaler.search_placeholder": "Поиск моделей...", + "engines.upscaler.hardware_gpu": "Аппаратное ускорение GPU активно ({0})", + "engines.upscaler.hardware_cpu": "Режим CPU (рекомендуются компактные модели)", + "engines.upscaler.recommended_gpu": "Дискретная видеокарта", + "engines.upscaler.recommended_cpu": "CPU и встроенная графика", + "engines.upscaler.download": "Скачать", + "engines.upscaler.downloading": "Загрузка... {0}%", + "engines.upscaler.downloaded": "Загружено", + "engines.upscaler.download_all": "Скачать рекомендуемые", + "engines.upscaler.delete_confirm": "Удалить {0}? Вы сможете скачать её снова в любое время.", + "engines.upscaler.delete_failed": "Не удалось удалить {0}.", + "engines.upscaler.download_failed": "Ошибка загрузки {0}.", + "engines.upscaler.no_models": "Модели по вашему запросу не найдены.", + "upscale.model": "Модель", + "upscale.scale": "Масштаб", + "upscale.output_format": "Формат вывода", + "upscale.format_same": "Исходный формат ({0})", + "upscale.resolution_label": "Предпросмотр разрешения", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "Увеличить сейчас", + "upscale.no_models_installed": "Модели не загружены. Сначала загрузите модель.", + "upscale.processing": "Увеличение... {0}%", + "upscale.success": "Увеличение успешно завершено.", + "error.upscale_failed": "Ошибка при увеличении: {0}", + "engine.reason.needs_models": "Модели не загружены (см. Настройки → Движки)", + "engines.package.upscayl-bin.name": "Upscayl (ИИ-апскейлер изображений)", + "engines.package.upscayl-bin.description": "Апскейлинг и суперразрешение изображений до 4× с помощью локальных моделей NCNN.\nМодели скачиваются при первом использовании.", + "error.upscale_needs_engine": "Установите Upscayl в меню Настройки → Движки для использования ИИ-апскейлинга.", + "upscale.model_ready": "Готово", + "upscale.model_download_size": "Загрузка {0} МБ", + "upscale.downloading_model": "Загрузка модели...", + "engines.model.delete_confirm": "Удалить модель {0}? Вы сможете скачать её снова в любой момент." } diff --git a/src/Filee.App/Assets/i18n/th.json b/src/Filee.App/Assets/i18n/th.json index c16961f73..c6ec53b95 100644 --- a/src/Filee.App/Assets/i18n/th.json +++ b/src/Filee.App/Assets/i18n/th.json @@ -1474,5 +1474,44 @@ "engines.ollama.connecting": "กำลังเชื่อมต่อ...", "engines.ollama.complete": "เสร็จสิ้น!", "engines.ollama.failed": "ล้มเหลว:", - "engines.ollama.error": "ข้อผิดพลาด:" + "engines.ollama.error": "ข้อผิดพลาด:", + "preset.upscale": "เพิ่มความคมชัดและขยายภาพ", + "preset.upscale.donut": "ขยายความคมชัด", + "engine.upscaler.name": "โมเดลเพิ่มคุณภาพรูปภาพ", + "engine.upscaler.description": "การขยายภาพความละเอียดสูงด้วย AI สูงสุด 4 เท่า ด้วยโมเดล NCNN บนเครื่อง", + "engines.upscaler.manage": "ดาวน์โหลดโมเดล", + "engines.upscaler.modal_title": "โมเดลเพิ่มคุณภาพรูปภาพ", + "engines.upscaler.modal_description": "ดาวน์โหลดโมเดล AI ขยายความคมชัดของภาพได้สูงสุด 4 เท่า การประมวลผลทำงานแบบออฟไลน์ 100% บนเครื่องของคุณ", + "engines.upscaler.search_placeholder": "ค้นหาโมเดล...", + "engines.upscaler.hardware_gpu": "เปิดใช้งานการเร่งความเร็วด้วย GPU ({0})", + "engines.upscaler.hardware_cpu": "โหมด CPU (แนะนำโมเดลขนาดเล็ก)", + "engines.upscaler.recommended_gpu": "GPU แยก", + "engines.upscaler.recommended_cpu": "CPU และ GPU ในตัว", + "engines.upscaler.download": "ดาวน์โหลด", + "engines.upscaler.downloading": "กำลังดาวน์โหลด... {0}%", + "engines.upscaler.downloaded": "ดาวน์โหลดแล้ว", + "engines.upscaler.download_all": "ดาวน์โหลดโมเดลที่แนะนำ", + "engines.upscaler.delete_confirm": "ลบ {0} หรือไม่? คุณสามารถดาวน์โหลดใหม่ได้ทุกเมื่อ", + "engines.upscaler.delete_failed": "ไม่สามารถลบ {0} ได้", + "engines.upscaler.download_failed": "ดาวน์โหลด {0} ไม่สำเร็จ", + "engines.upscaler.no_models": "ไม่พบโมเดลที่ตรงกับการค้นหา", + "upscale.model": "โมเดล", + "upscale.scale": "อัตราส่วนการขยาย", + "upscale.output_format": "รูปแบบผลลัพธ์", + "upscale.format_same": "รูปแบบเดิมเหมือนต้นฉบับ ({0})", + "upscale.resolution_label": "ตัวอย่างความละเอียด", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "ขยายภาพทันที", + "upscale.no_models_installed": "ยังไม่มีโมเดลที่ดาวน์โหลด กรุณาดาวน์โหลดโมเดลก่อน", + "upscale.processing": "กำลังขยายภาพ... {0}%", + "upscale.success": "เพิ่มความคมชัดเรียบร้อยแล้ว", + "error.upscale_failed": "การขยายภาพล้มเหลว: {0}", + "engine.reason.needs_models": "ไม่มีโมเดลที่ดาวน์โหลดไว้ (ดูที่ การตั้งค่า → เอนจิน)", + "engines.package.upscayl-bin.name": "Upscayl (เพิ่มความละเอียดภาพด้วย AI)", + "engines.package.upscayl-bin.description": "เพิ่มความละเอียดภาพและซูเปอร์เรโซลูชันสูงสุด 4 เท่าด้วยโมเดล NCNN บนเครื่อง\nโมเดลจะดาวน์โหลดเมื่อใช้ครั้งแรก", + "error.upscale_needs_engine": "ติดตั้ง Upscayl ในการตั้งค่า → เครื่องมือแปลงไฟล์ เพื่อใช้งานการเพิ่มความละเอียดภาพด้วย AI", + "upscale.model_ready": "พร้อมใช้งาน", + "upscale.model_download_size": "ดาวน์โหลด {0} MB", + "upscale.downloading_model": "กำลังดาวน์โหลดโมเดล...", + "engines.model.delete_confirm": "ลบโมเดล {0} หรือไม่ คุณสามารถดาวน์โหลดใหม่ได้ตลอดเวลา" } diff --git a/src/Filee.App/Assets/i18n/tr.json b/src/Filee.App/Assets/i18n/tr.json index 85be7052d..46dee12e2 100644 --- a/src/Filee.App/Assets/i18n/tr.json +++ b/src/Filee.App/Assets/i18n/tr.json @@ -1472,5 +1472,44 @@ "engines.ollama.connecting": "Bağlanıyor...", "engines.ollama.complete": "Tamamlandı!", "engines.ollama.failed": "Başarısız:", - "engines.ollama.error": "Hata:" + "engines.ollama.error": "Hata:", + "preset.upscale": "Görüntü Kalitesini Yükselt", + "preset.upscale.donut": "Büyüt ve İyileştir", + "engine.upscaler.name": "Görüntü Kalitesi Modelleri", + "engine.upscaler.description": "Yerel NCNN modelleriyle 4 kata kadar yapay zeka süper çözünürlük ve görüntü büyütme.", + "engines.upscaler.manage": "Modelleri İndir", + "engines.upscaler.modal_title": "Görüntü Kalitesi Modelleri", + "engines.upscaler.modal_description": "Görüntüleri 4 kata kadar büyütmek için yerel yapay zeka modellerini indirin. Tüm işlemler %100 çevrimdışı çalışır.", + "engines.upscaler.search_placeholder": "Model ara...", + "engines.upscaler.hardware_gpu": "GPU Hızlandırma Etkin ({0})", + "engines.upscaler.hardware_cpu": "CPU Modu (Hafif modeller önerilir)", + "engines.upscaler.recommended_gpu": "Harici GPU", + "engines.upscaler.recommended_cpu": "CPU ve Dahili GPU", + "engines.upscaler.download": "İndir", + "engines.upscaler.downloading": "İndiriliyor... %{0}", + "engines.upscaler.downloaded": "İndirildi", + "engines.upscaler.download_all": "Önerilenleri İndir", + "engines.upscaler.delete_confirm": "{0} silinsin mi? İstediğiniz zaman tekrar indirebilirsiniz.", + "engines.upscaler.delete_failed": "{0} silinemedi.", + "engines.upscaler.download_failed": "{0} indirilemedi.", + "engines.upscaler.no_models": "Aramanızla eşleşen model bulunamadı.", + "upscale.model": "Model", + "upscale.scale": "Ölçek Faktörü", + "upscale.output_format": "Çıkış Formatı", + "upscale.format_same": "Kaynak ile aynı format ({0})", + "upscale.resolution_label": "Çözünürlük Önizlemesi", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "Şimdi Büyüt", + "upscale.no_models_installed": "İndirilmiş model yok. Lütfen önce bir model indirin.", + "upscale.processing": "Büyütülüyor... %{0}", + "upscale.success": "Görüntü büyütme başarıyla tamamlandı.", + "error.upscale_failed": "Büyütme başarısız: {0}", + "engine.reason.needs_models": "İndirilen model yok (Ayarlar → Motorlar bölümüne bakın)", + "engines.package.upscayl-bin.name": "Upscayl (yapay zeka görüntü yükseltici)", + "engines.package.upscayl-bin.description": "Yerel NCNN modelleriyle 4 kata kadar yapay zeka görüntü yükseltme ve süper çözünürlük.\nModeller ilk kullanıldıklarında indirilir.", + "error.upscale_needs_engine": "Yapay zeka yükseltmesini kullanmak için Ayarlar → Dönüştürme motorları bölümünden Upscayl kurun.", + "upscale.model_ready": "Hazır", + "upscale.model_download_size": "{0} MB indirme", + "upscale.downloading_model": "Model indiriliyor...", + "engines.model.delete_confirm": "{0} modeli silinsin mi? İstediğiniz zaman tekrar indirebilirsiniz." } diff --git a/src/Filee.App/Assets/i18n/zh-CN.json b/src/Filee.App/Assets/i18n/zh-CN.json index 3575d4b2e..b339dade7 100644 --- a/src/Filee.App/Assets/i18n/zh-CN.json +++ b/src/Filee.App/Assets/i18n/zh-CN.json @@ -1494,5 +1494,44 @@ "engines.ollama.connecting": "正在连接...", "engines.ollama.complete": "完成!", "engines.ollama.failed": "失败:", - "engines.ollama.error": "错误:" + "engines.ollama.error": "错误:", + "preset.upscale": "放大图像画质", + "preset.upscale.donut": "超分辨率放大", + "engine.upscaler.name": "画质提升模型", + "engine.upscaler.description": "使用本地 NCNN 模型实现最高 4 倍的 AI 图像超分辨率高保真放大。", + "engines.upscaler.manage": "下载模型", + "engines.upscaler.modal_title": "画质提升模型", + "engines.upscaler.modal_description": "下载本地 AI 超分辨率模型,将图像最高放大 4 倍。所有处理完全在本地离线进行,不消耗网络流量。", + "engines.upscaler.search_placeholder": "搜索模型...", + "engines.upscaler.hardware_gpu": "已启用 GPU 硬件加速 ({0})", + "engines.upscaler.hardware_cpu": "CPU 模式(建议使用轻量模型)", + "engines.upscaler.recommended_gpu": "独立显卡", + "engines.upscaler.recommended_cpu": "CPU 与核芯显卡", + "engines.upscaler.download": "下载", + "engines.upscaler.downloading": "正在下载... {0}%", + "engines.upscaler.downloaded": "已下载", + "engines.upscaler.download_all": "下载推荐模型", + "engines.upscaler.delete_confirm": "确定要删除 {0} 吗?您可以随时重新下载。", + "engines.upscaler.delete_failed": "无法删除 {0}。", + "engines.upscaler.download_failed": "下载 {0} 失败。", + "engines.upscaler.no_models": "未找到匹配的模型。", + "upscale.model": "模型", + "upscale.scale": "放大倍率", + "upscale.output_format": "输出格式", + "upscale.format_same": "与源格式相同 ({0})", + "upscale.resolution_label": "分辨率预览", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "立即放大", + "upscale.no_models_installed": "尚未下载模型,请先下载一个模型。", + "upscale.processing": "正在放大... {0}%", + "upscale.success": "画质提升放大已完成。", + "error.upscale_failed": "画质提升失败:{0}", + "engine.reason.needs_models": "尚未下载模型(查看设置 → 引擎)", + "engines.package.upscayl-bin.name": "Upscayl(AI 图像超分辨率放大)", + "engines.package.upscayl-bin.description": "使用本地 NCNN 模型实现最高 4 倍的 AI 图像放大与超分辨率。\n模型在首次使用时下载。", + "error.upscale_needs_engine": "请在“设置 → 转换引擎”中安装 Upscayl 以使用 AI 放大功能。", + "upscale.model_ready": "就绪", + "upscale.model_download_size": "{0} MB 下载", + "upscale.downloading_model": "正在下载模型...", + "engines.model.delete_confirm": "是否删除模型 {0}?您可以随时重新下载。" } diff --git a/src/Filee.App/Assets/i18n/zh-TW.json b/src/Filee.App/Assets/i18n/zh-TW.json index b907b11de..df7ec39e1 100644 --- a/src/Filee.App/Assets/i18n/zh-TW.json +++ b/src/Filee.App/Assets/i18n/zh-TW.json @@ -1494,5 +1494,44 @@ "engines.ollama.connecting": "正在連線...", "engines.ollama.complete": "完成!", "engines.ollama.failed": "失敗:", - "engines.ollama.error": "錯誤:" + "engines.ollama.error": "錯誤:", + "preset.upscale": "放大圖像畫質", + "preset.upscale.donut": "超解析度放大", + "engine.upscaler.name": "畫質提升模型", + "engine.upscaler.description": "使用本機 NCNN 模型實現最高 4 倍的 AI 圖像超解析度高保真放大。", + "engines.upscaler.manage": "下載模型", + "engines.upscaler.modal_title": "畫質提升模型", + "engines.upscaler.modal_description": "下載本機 AI 超解析度模型,將圖像最高放大 4 倍。所有處理完全在本機離線進行,確保隱私安全。", + "engines.upscaler.search_placeholder": "搜尋模型...", + "engines.upscaler.hardware_gpu": "已啟用 GPU 硬體加速 ({0})", + "engines.upscaler.hardware_cpu": "CPU 模式(建議使用輕量模型)", + "engines.upscaler.recommended_gpu": "獨立顯示卡", + "engines.upscaler.recommended_cpu": "CPU 與內建顯示卡", + "engines.upscaler.download": "下載", + "engines.upscaler.downloading": "正在下載... {0}%", + "engines.upscaler.downloaded": "已下載", + "engines.upscaler.download_all": "下載推薦模型", + "engines.upscaler.delete_confirm": "確定要刪除 {0} 嗎?您可以隨時重新下載。", + "engines.upscaler.delete_failed": "無法刪除 {0}。", + "engines.upscaler.download_failed": "下載 {0} 失敗。", + "engines.upscaler.no_models": "找不到相符的模型。", + "upscale.model": "模型", + "upscale.scale": "放大倍率", + "upscale.output_format": "輸出格式", + "upscale.format_same": "與原格式相同 ({0})", + "upscale.resolution_label": "解析度預覽", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "立即放大", + "upscale.no_models_installed": "尚未下載模型,請先下載一個模型。", + "upscale.processing": "正在放大... {0}%", + "upscale.success": "畫質提升放大已完成。", + "error.upscale_failed": "畫質提升失敗:{0}", + "engine.reason.needs_models": "尚未下載模型(查看設定 → 引擎)", + "engines.package.upscayl-bin.name": "Upscayl(AI 影像超解析度放大)", + "engines.package.upscayl-bin.description": "使用本機 NCNN 模型提供最高 4 倍的 AI 影像放大與超解析度。\n模型在第一次使用時下載。", + "error.upscale_needs_engine": "請在「設定 → 轉換引擎」中安裝 Upscayl 以使用 AI 放大功能。", + "upscale.model_ready": "就緒", + "upscale.model_download_size": "{0} MB 下載", + "upscale.downloading_model": "正在下載模型...", + "engines.model.delete_confirm": "確定要刪除模型 {0} 嗎?您可以隨時重新下載。" } diff --git a/src/Filee.App/Services/AppHost.cs b/src/Filee.App/Services/AppHost.cs index 2eb90c92a..0bf8603cc 100644 --- a/src/Filee.App/Services/AppHost.cs +++ b/src/Filee.App/Services/AppHost.cs @@ -63,6 +63,7 @@ public static IServiceProvider Build(string? dataDirectory = null, UserDataStore // Files dragged from a browser with only an address are downloaded without the browser's cookies. services.AddSingleton(_ => new WebDownloader(userAgent: $"Filee/{typeof(AppHost).Assembly.GetName().Version?.ToString(3)}")); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/src/Filee.App/Services/PresetAvailability.cs b/src/Filee.App/Services/PresetAvailability.cs index 32d17b141..84ff6d155 100644 --- a/src/Filee.App/Services/PresetAvailability.cs +++ b/src/Filee.App/Services/PresetAvailability.cs @@ -145,6 +145,10 @@ private PresetJudgement Evaluate(Preset preset, IReadOnlyList format return formats.Any(f => HideService.CanOpen(f.Id)) ? new(PresetUse.Usable, null) : new(PresetUse.Unusable, _loc["error.images_only"]); + if (preset.IsUpscaleTool) + return formats.Any(f => UpscaleTool.CanUpscale(f.Id)) + ? new(PresetUse.Usable, null) + : new(PresetUse.Unusable, _loc["error.images_only"]); if (preset.IsTool) { diff --git a/src/Filee.App/Services/WindowService.cs b/src/Filee.App/Services/WindowService.cs index 5c48e9734..a46ecdbf4 100644 --- a/src/Filee.App/Services/WindowService.cs +++ b/src/Filee.App/Services/WindowService.cs @@ -40,12 +40,14 @@ public sealed class WindowService(ILocalizer loc, IServiceProvider services, Mem private AnnotateWindow? _annotateWindow; private BackgroundWindow? _backgroundWindow; private ImageEditWindow? _imageEdit; + private UpscaleWindow? _upscaleWindow; internal ClipWindow? ClipWindow => _clipWindow; internal HideWindow? HideWindow => _hideWindow; internal AnnotateWindow? AnnotateWindow => _annotateWindow; internal BackgroundWindow? BackgroundWindow => _backgroundWindow; internal ImageEditWindow? ImageEdit => _imageEdit; + internal UpscaleWindow? UpscaleWindow => _upscaleWindow; private readonly HashSet _spreadsheetStudios = []; internal IReadOnlyCollection SpreadsheetStudios => _spreadsheetStudios; @@ -162,6 +164,8 @@ public void ShowTool(IReadOnlyList files, Preset preset, PixelPoint? nea ShowBackgroundWindow(files, preset); else if (preset.IsImageEditTool) ShowImageEditWindow(files, preset); + else if (preset.IsUpscaleTool) + ShowUpscaleWindow(files, preset, near); // Before the crop: the print studio and the PDF page tools have no Tool of their own, which reads as a crop // ("Crop PDF" is one and opens the crop overlay). else if (preset.Id == "tool-sheet-studio") @@ -238,6 +242,31 @@ public void ShowImageEditWindow(IReadOnlyList files, Preset preset) win.Activate(); } + /// + /// Opens the "Upscale Quality" window on the pictures among the files. + /// + public void ShowUpscaleWindow(IReadOnlyList files, Preset preset, PixelPoint? near = null) + { + var pictures = files.Where(f => FormatRegistry.Detect(f) is { } format && UpscaleTool.CanUpscale(format.Id)).ToList(); + if (pictures.Count == 0) + return; + _upscaleWindow?.Close(); + var store = services.GetRequiredService(); + + var log = services.GetService>(); + var vm = new UpscaleViewModel(pictures, preset, loc, store, PictureSize, log); + var win = new UpscaleWindow { DataContext = vm }; + PrepareWindow(win); + win.Closed += (_, _) => + { + if (_upscaleWindow == win) + _upscaleWindow = null; + }; + _upscaleWindow = win; + win.Show(); + win.Activate(); + } + /// /// Opens the "Pixelate / blur" window on the pictures among the files. Each picture is written by an ordinary /// conversion, shown in the toast. diff --git a/src/Filee.App/ViewModels/Pages/EnginesPageViewModel.cs b/src/Filee.App/ViewModels/Pages/EnginesPageViewModel.cs index fd6baa56c..3ff3f8c84 100644 --- a/src/Filee.App/ViewModels/Pages/EnginesPageViewModel.cs +++ b/src/Filee.App/ViewModels/Pages/EnginesPageViewModel.cs @@ -20,6 +20,7 @@ public sealed partial class EngineItemViewModel(IConverter converter, EngineStat public IConverter Converter { get; } = converter; public bool IsTranslator => Converter.Id == "translator"; + /// Localized descriptive name, retaining the engine's technical name for unregistered engines. public string Name { diff --git a/src/Filee.App/ViewModels/Pages/PresetsPageViewModel.cs b/src/Filee.App/ViewModels/Pages/PresetsPageViewModel.cs index e8e92df8a..34435aa45 100644 --- a/src/Filee.App/ViewModels/Pages/PresetsPageViewModel.cs +++ b/src/Filee.App/ViewModels/Pages/PresetsPageViewModel.cs @@ -25,7 +25,8 @@ public void Refresh(ILocalizer l) } private static string TargetLabel(Preset p, ILocalizer l) => - p.TargetFormat == BuiltInData.SameAsSource ? l["presets.same_as_source"] + p.IsUpscaleTool ? l["preset.upscale"] + : p.TargetFormat == BuiltInData.SameAsSource ? l["presets.same_as_source"] : "→ " + (FormatLabels.NameOf(l, p.TargetFormat) ?? p.TargetFormat); } @@ -46,7 +47,7 @@ public PresetsPageViewModel(UserDataStore store, ILocalizer loc, WindowService w VisiblePresets = new FilteredList(Presets, p => [p.Name, p.Target, p.Preset.TargetFormat]); var off = store.Settings.TurnedOffFieldSet(); // Groups and tools convert nothing: they live on the donut only (Settings → Toolbar). - foreach (var preset in store.Presets.Where(p => !p.IsGroup && !p.IsTool && FormatFields.IsShown(p.TargetFormat, off))) + foreach (var preset in store.Presets.Where(p => !p.IsGroup && (!p.IsTool || p.IsUpscaleTool) && FormatFields.IsShown(p.TargetFormat, off))) Presets.Add(new PresetListItem(preset, loc)); SelectedPreset = Presets.FirstOrDefault(); PlacePresets = [.. BuiltInData.PlacePresets().Where(p => FormatFields.IsShown(p.TargetFormat, off)) diff --git a/src/Filee.App/ViewModels/PresetEditorViewModel.cs b/src/Filee.App/ViewModels/PresetEditorViewModel.cs index 6802edcbd..fda96fdc6 100644 --- a/src/Filee.App/ViewModels/PresetEditorViewModel.cs +++ b/src/Filee.App/ViewModels/PresetEditorViewModel.cs @@ -12,6 +12,7 @@ using Filee.Core.Settings; using Filee.Engines.Ocr; using Filee.Engines.Translation; +using Filee.Engines.Upscale; namespace Filee.App.ViewModels; @@ -232,6 +233,9 @@ .. WhisperLanguages.All ]; _targetLanguage = TranslationLanguageChoices.FirstOrDefault(l => string.Equals(l.Value, _edit.Translate.TargetLanguage, StringComparison.OrdinalIgnoreCase)) ?? TranslationLanguageChoices[0]; + _upscaleScale = _edit.Upscale.Scale > 0 ? _edit.Upscale.Scale : 4; + _selectedUpscaleModel = UpscaleModels.FirstOrDefault(m => string.Equals(m.Id, _edit.Upscale.Model, StringComparison.OrdinalIgnoreCase)) + ?? UpscaleModels.FirstOrDefault(); _archiveLevel = ArchiveLevels.First(l => l.Value == _edit.Archive.Level); _combineIntoOne = _edit.Archive.CombineIntoOne; _saveEveryFrame = _edit.Media.SaveEveryFrame; @@ -363,6 +367,12 @@ public async Task TestTranslationAsync() } } + public bool ShowUpscale => _original.IsUpscaleTool || _edit.Upscale.Enabled; + public IReadOnlyList UpscaleModels { get; } = Filee.Engines.Upscale.UpscaleModels.All; + [ObservableProperty] private UpscaleModel? _selectedUpscaleModel; + [ObservableProperty] private int _upscaleScale = 4; + + /// What "Recognize text" needs: Tesseract, or on a Mac Apple Vision (Tesseract only for other languages). public string OcrHint { get; } @@ -1170,6 +1180,12 @@ static double Seconds(double value, double fallback, double min, double max) => _original.Cad.Colors = ShowCadColors ? CadColors.Value : default; _original.Translate.TargetLanguage = TargetLanguage.Value; _original.Translate.Enabled = ShowTranslate; + if (ShowUpscale) + { + _original.Upscale.Enabled = true; + _original.Upscale.Model = SelectedUpscaleModel?.Id; + _original.Upscale.Scale = UpscaleScale; + } var output = _original.Output; // Asking keeps the location it had: a Filee that can't ask (or one from before it) saves there. diff --git a/src/Filee.App/ViewModels/UpscaleViewModel.cs b/src/Filee.App/ViewModels/UpscaleViewModel.cs new file mode 100644 index 000000000..91ab3972f --- /dev/null +++ b/src/Filee.App/ViewModels/UpscaleViewModel.cs @@ -0,0 +1,326 @@ +// ViewModel for the "Upscale Quality" tool window. + +using System.Collections.ObjectModel; +using System.Diagnostics; +using Avalonia.Threading; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Filee.App.Services; +using Filee.Core.Conversion; +using Filee.Core.Localization; +using Filee.Core.Presets; +using Filee.Core.Settings; +using Filee.Engines.Upscale; +using Microsoft.Extensions.Logging; + +namespace Filee.App.ViewModels; + +public sealed partial class UpscaleViewModel : ObservableObject, IDisposable +{ + private readonly Preset _tool; + private readonly ILocalizer _loc; + private readonly UserDataStore _store; + private readonly Func _pictureSize; + private readonly ILogger? _log; + private readonly UpscalerEngine _engine; + private CancellationTokenSource? _cts; + + public IReadOnlyList Pictures { get; } + + public string Heading { get; } + public string? HeadingTip { get; } + + public ObservableCollection Models { get; } = []; + public ObservableCollection> Targets { get; } = []; + + private (int Width, int Height)? _initialDimensions; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(ResolutionPreview))] + private int _scale = 4; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(IsSelectedModelInstalled), nameof(ModelStatusText))] + private UpscaleModel? _selectedModel; + + [ObservableProperty] + private Choice _target = null!; + + [ObservableProperty] + private bool _isProcessing; + + [ObservableProperty] + private double _progressValue; + + [ObservableProperty] + private string _progressText = ""; + + [ObservableProperty] + private bool _isCompleted; + + [ObservableProperty] + private string? _lastOutputFile; + + [ObservableProperty] + private string _statusMessage = ""; + + [ObservableProperty] + private bool _hasError; + + public bool IsSelectedModelInstalled => SelectedModel is not null && UpscaleModels.IsInstalled(SelectedModel.Id); + + public string ModelStatusText + { + get + { + if (SelectedModel is null) + return ""; + if (UpscaleModels.IsInstalled(SelectedModel.Id)) + return _loc["upscale.model_ready"]; + var sizeMb = (SelectedModel.TotalSize / 1_000_000.0).ToString("0.0", System.Globalization.CultureInfo.InvariantCulture); + return _loc.Format("upscale.model_download_size", sizeMb); + } + } + + public string ResolutionPreview + { + get + { + if (_initialDimensions is { } dim) + { + var targetW = dim.Width * Scale; + var targetH = dim.Height * Scale; + return _loc.Format("upscale.resolution_preview", dim.Width, dim.Height, targetW, targetH, Scale); + } + return $"{Scale}×"; + } + } + + public UpscaleViewModel( + IReadOnlyList pictures, + Preset tool, + ILocalizer loc, + UserDataStore store, + Func pictureSize, + ILogger? log = null) + { + Pictures = pictures; + _tool = tool; + _loc = loc; + _store = store; + _pictureSize = pictureSize; + _log = log; + _engine = new UpscalerEngine(log as ILogger); + + Heading = pictures.Count == 1 + ? Path.GetFileName(pictures[0]) + : loc.Format("common.files_count", pictures.Count); + HeadingTip = pictures.Count == 1 ? pictures[0] : string.Join("\n", pictures); + + if (pictures.Count > 0) + { + _initialDimensions = _pictureSize(pictures[0]); + } + + Scale = tool.Upscale.Scale > 0 ? Math.Clamp(tool.Upscale.Scale, 1, 4) : 4; + + InitTargets(); + RefreshModels(); + } + + private void InitTargets() + { + Targets.Clear(); + var firstExt = Pictures.Count > 0 ? Path.GetExtension(Pictures[0]).TrimStart('.').ToLowerInvariant() : "png"; + Targets.Add(new("*", _loc.Format("upscale.format_same", firstExt))); + Targets.Add(new("png", "PNG (.png)")); + Targets.Add(new("jpg", "JPEG (.jpg)")); + Targets.Add(new("webp", "WebP (.webp)")); + Targets.Add(new("avif", "AVIF (.avif)")); + Targets.Add(new("heic", "HEIC (.heic)")); + Targets.Add(new("bmp", "BMP (.bmp)")); + Targets.Add(new("tiff", "TIFF (.tiff)")); + Targets.Add(new("ico", "ICO (.ico)")); + Target = Targets[0]; + } + + public void RefreshModels() + { + Models.Clear(); + foreach (var m in UpscaleModels.All) + { + Models.Add(m); + } + + var initialId = !string.IsNullOrWhiteSpace(_tool.Upscale.Model) ? _tool.Upscale.Model : UpscaleModels.Default; + SelectedModel = Models.FirstOrDefault(m => string.Equals(m.Id, initialId, StringComparison.OrdinalIgnoreCase)) + ?? Models.FirstOrDefault(); + + OnPropertyChanged(nameof(IsSelectedModelInstalled)); + OnPropertyChanged(nameof(ModelStatusText)); + } + + public void NotifyModelStatusChanged() + { + OnPropertyChanged(nameof(IsSelectedModelInstalled)); + OnPropertyChanged(nameof(ModelStatusText)); + } + + [RelayCommand] + public async Task StartUpscaleAsync() + { + if (IsProcessing || SelectedModel is null || Pictures.Count == 0) + return; + + if (UpscalerConverter.LocateExecutable() is null) + { + HasError = true; + StatusMessage = _loc["error.upscale_needs_engine"]; + return; + } + + IsProcessing = true; + IsCompleted = false; + HasError = false; + StatusMessage = ""; + ProgressValue = 0; + + _cts = new CancellationTokenSource(); + var token = _cts.Token; + + var chosenTarget = Target.Value; + var model = SelectedModel; + var currentScale = Scale; + var total = Pictures.Count; + + var workFolder = Path.Combine(JobQueue.DefaultWorkRoot, "upscale-" + Guid.NewGuid().ToString("N")[..8]); + + try + { + if (!UpscaleModels.IsInstalled(model.Id)) + { + ProgressText = _loc["upscale.downloading_model"]; + await UpscaleModels.EnsureAsync(model.Id, progress: null, token); + NotifyModelStatusChanged(); + } + + Directory.CreateDirectory(workFolder); + + for (var i = 0; i < total; i++) + { + token.ThrowIfCancellationRequested(); + var itemIndex = i; + var sourcePath = Pictures[i]; + var sourceExt = Path.GetExtension(sourcePath).TrimStart('.').ToLowerInvariant(); + var targetExt = chosenTarget == "*" ? sourceExt : chosenTarget; + + var tokens = new OutputPathResolver.Tokens(sourcePath, _tool.NameKey ?? "upscale", itemIndex + 1, DateTime.Now); + var resolvedOutput = OutputPathResolver.Resolve(_tool.Output, tokens, targetExt, File.Exists); + if (resolvedOutput is null) + continue; + + var progress = new Progress(p => + { + Dispatcher.UIThread.Post(() => + { + var overall = (itemIndex + p) / total; + ProgressValue = Math.Clamp(overall * 100.0, 0, 100); + var currentPct = (int)Math.Clamp(p * 100.0, 0, 100); + ProgressText = total > 1 + ? $"({itemIndex + 1}/{total}) {_loc.Format("upscale.processing", currentPct)}" + : _loc.Format("upscale.processing", currentPct); + }); + }); + + await _engine.UpscaleAsync( + sourcePath, + resolvedOutput, + sourceExt, + targetExt, + model.Id, + currentScale, + workFolder, + _tool, + progress, + token); + + LastOutputFile = resolvedOutput; + } + + ProgressValue = 100; + ProgressText = _loc["upscale.success"]; + IsCompleted = true; + } + catch (OperationCanceledException) + { + StatusMessage = ""; + ProgressText = ""; + } + catch (Exception ex) + { + HasError = true; + StatusMessage = _loc.Format("error.upscale_failed", ex.Message); + _log?.LogError(ex, "Upscaling failed"); + } + finally + { + try + { + if (Directory.Exists(workFolder)) + Directory.Delete(workFolder, recursive: true); + } + catch + { + // Swept by JobQueue.DeleteStaleWorkFolders + } + + IsProcessing = false; + _cts?.Dispose(); + _cts = null; + } + } + + [RelayCommand] + public void Cancel() + { + if (IsProcessing && _cts is not null) + { + _cts.Cancel(); + } + } + + [RelayCommand] + public void OpenOutputFolder() + { + if (string.IsNullOrEmpty(LastOutputFile) || !File.Exists(LastOutputFile)) + return; + + try + { + if (OperatingSystem.IsWindows()) + { + Process.Start("explorer.exe", $"/select,\"{LastOutputFile}\""); + } + else if (OperatingSystem.IsMacOS()) + { + Process.Start("open", $"-R \"{LastOutputFile}\""); + } + else + { + var dir = Path.GetDirectoryName(LastOutputFile); + if (!string.IsNullOrEmpty(dir)) + Process.Start("xdg-open", $"\"{dir}\""); + } + } + catch (Exception ex) + { + _log?.LogWarning(ex, "Failed to reveal output file"); + } + } + + public void Dispose() + { + _cts?.Cancel(); + _cts?.Dispose(); + } +} diff --git a/src/Filee.App/Views/Pages/EnginesPage.axaml.cs b/src/Filee.App/Views/Pages/EnginesPage.axaml.cs index 526dd7da2..e774f26c7 100644 --- a/src/Filee.App/Views/Pages/EnginesPage.axaml.cs +++ b/src/Filee.App/Views/Pages/EnginesPage.axaml.cs @@ -144,6 +144,7 @@ private async void OnManageOllama(object? sender, RoutedEventArgs e) _ = catalog.CheckInBackgroundAsync(); } + /// Picks the program of a copy the user already has (ffmpeg.exe, ebook-convert.exe, …) and uses it. private async void OnUseOwnCopy(object? sender, RoutedEventArgs e) { diff --git a/src/Filee.App/Views/PresetEditorView.axaml b/src/Filee.App/Views/PresetEditorView.axaml index 5a0b8ea24..5b539162a 100644 --- a/src/Filee.App/Views/PresetEditorView.axaml +++ b/src/Filee.App/Views/PresetEditorView.axaml @@ -5,6 +5,7 @@ @@ -274,6 +275,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Filee.App/Views/UpscaleWindow.axaml b/src/Filee.App/Views/UpscaleWindow.axaml new file mode 100644 index 000000000..7b2bfbd3b --- /dev/null +++ b/src/Filee.App/Views/UpscaleWindow.axaml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + private static void WithoutPictureEditTools(PresetAvailabilityTests.Fixture f) => - f.Store.Presets.RemoveAll(p => p.IsAnnotateTool || p.IsBackgroundTool); + f.Store.Presets.RemoveAll(p => p.IsAnnotateTool || p.IsBackgroundTool || p.IsUpscaleTool); private static ToolbarProfile Profile(string id, params string[] extensions) => new() { diff --git a/tests/Filee.Core.Tests/UpscaleToolTests.cs b/tests/Filee.Core.Tests/UpscaleToolTests.cs new file mode 100644 index 000000000..b2eb4c24c --- /dev/null +++ b/tests/Filee.Core.Tests/UpscaleToolTests.cs @@ -0,0 +1,51 @@ +// "Upscale Quality": the preset in the library (palette only, no donut slot) and how existing libraries get +// it (settings schema 64). + +using Filee.Core.Presets; +using Filee.Core.Profiles; +using Filee.Core.Settings; +using Xunit; + +namespace Filee.Core.Tests; + +public class UpscaleToolTests +{ + private static List Slots(IEnumerable profiles) => + [.. profiles.Select(p => $"{p.Id}: {string.Join(",", p.PresetIds)} | {string.Join(",", p.BackPresetIds ?? [])}")]; + + [Fact] + public void A_new_library_has_the_tool_after_annotate_and_no_slot() + { + var presets = BuiltInData.CreatePresets(); + var annotate = presets.FindIndex(p => p.Id == BuiltInData.AnnotateId); + Assert.True(annotate >= 0); + Assert.Equal(BuiltInData.UpscaleId, presets[annotate + 1].Id); + + var tool = presets.Single(p => p.Id == BuiltInData.UpscaleId); + Assert.True(tool.IsTool); + Assert.True(tool.IsUpscaleTool); + Assert.Equal(Preset.UpscaleTool, tool.Tool); + Assert.Equal("tool-upscale", tool.Id); + + // Palette only: no default profile gets a slot (#806) + Assert.All(BuiltInData.CreateProfiles(), p => + Assert.DoesNotContain(BuiltInData.UpscaleId, p.PresetIds.Concat(p.BackPresetIds ?? []))); + } + + [Fact] + public void Schema_66_adds_the_tool_to_the_library_and_no_slot() + { + var presets = BuiltInData.CreatePresets().Where(p => p.Id != BuiltInData.UpscaleId).ToList(); + var profiles = BuiltInData.CreateProfiles(); + var slots = Slots(profiles); + + Assert.True(SettingsMigrations.ApplyToLibrary(65, presets, profiles)); + + var after = presets.FindIndex(p => p.Id == BuiltInData.BackgroundId); + if (after < 0) + after = presets.FindIndex(p => p.Id == BuiltInData.AnnotateId); + Assert.Equal(BuiltInData.UpscaleId, presets[after + 1].Id); + Assert.Equal(slots, Slots(profiles)); + Assert.False(SettingsMigrations.ApplyToLibrary(AppSettings.CurrentSchemaVersion, presets, profiles)); + } +} diff --git a/tests/Filee.Engines.Tests/UpscalerTests.cs b/tests/Filee.Engines.Tests/UpscalerTests.cs new file mode 100644 index 000000000..b0456a982 --- /dev/null +++ b/tests/Filee.Engines.Tests/UpscalerTests.cs @@ -0,0 +1,151 @@ +using Filee.Core.Presets; +using Filee.Engines.Upscale; +using Xunit; + +namespace Filee.Engines.Tests; + +public class UpscalerTests +{ + [Fact] + public void Catalog_contains_curated_models_with_valid_metadata() + { + var models = UpscaleModels.All; + Assert.NotEmpty(models); + Assert.True(models.Count >= 9); + + foreach (var model in models) + { + Assert.False(string.IsNullOrWhiteSpace(model.Id)); + Assert.False(string.IsNullOrWhiteSpace(model.Name)); + Assert.True(model.Scale >= 2); + Assert.False(string.IsNullOrWhiteSpace(model.License)); + Assert.False(string.IsNullOrWhiteSpace(model.Author)); + Assert.False(string.IsNullOrWhiteSpace(model.Description)); + Assert.True(model.ParamSize > 0); + Assert.Equal(64, model.ParamSha256.Length); + Assert.True(model.BinSize > 0); + Assert.Equal(64, model.BinSha256.Length); + Assert.EndsWith(".bin", model.BinFileName); + Assert.EndsWith(".param", model.ParamFileName); + } + } + + [Fact] + public void Catalog_contains_only_permissive_and_free_licenses() + { + var models = UpscaleModels.All; + // All models must allow commercial use (no CC-BY-NC) + Assert.All(models, m => + { + Assert.Contains(m.License, new[] { "WTFPL", "BSD-3-Clause", "CC-BY-4.0" }); + Assert.DoesNotContain("NC", m.License); + }); + } + + [Theory] + [InlineData("png", true)] + [InlineData("jpg", true)] + [InlineData("jpeg", true)] + [InlineData("webp", true)] + [InlineData("avif", true)] + [InlineData("heic", true)] + [InlineData("ico", true)] + [InlineData("bmp", true)] + [InlineData("tiff", true)] + [InlineData("pdf", false)] + [InlineData("docx", false)] + [InlineData("txt", false)] + [InlineData("mp4", false)] + [InlineData("xlsx", false)] + public void CanUpscale_validates_image_formats(string format, bool expected) + { + Assert.Equal(expected, UpscaleTool.CanUpscale(format)); + } + + [Fact] + public void TargetFor_handles_same_as_source_and_explicit_targets() + { + Assert.Equal("png", UpscaleTool.TargetFor("png", BuiltInData.SameAsSource)); + Assert.Equal("jpg", UpscaleTool.TargetFor("jpg", BuiltInData.SameAsSource)); + Assert.Equal("webp", UpscaleTool.TargetFor("png", "webp")); + Assert.Equal("jpg", UpscaleTool.TargetFor("png", "jpg")); + } + + [Fact] + public void ConversionOf_creates_valid_upscale_preset() + { + var tool = BuiltInData.UpscalePresets().Single(); + var preset = UpscaleTool.ConversionOf(tool, "png", "4xLSDIRCompactC3", 4); + + Assert.Equal(PresetKind.Convert, preset.Kind); + Assert.Null(preset.Tool); + Assert.Equal("png", preset.TargetFormat); + Assert.True(preset.Upscale.Enabled); + Assert.Equal("4xLSDIRCompactC3", preset.Upscale.Model); + Assert.Equal(4, preset.Upscale.Scale); + } + + [Fact] + public void UpscalerConverter_metadata_and_edges() + { + var converter = new UpscalerConverter(); + Assert.Equal("upscaler", converter.Id); + Assert.Equal("Upscayl (AI image upscaler)", converter.DisplayName); + Assert.Equal(1, converter.MaxParallelism); + Assert.NotEmpty(converter.Edges); + + var status = converter.GetStatus(); + Assert.NotNull(status); + } + + [Fact] + public async Task RealUpscale_processes_image_when_binary_available() + { + var bin = UpscalerConverter.LocateExecutable(); + Assert.SkipUnless(bin is not null && File.Exists(bin), "upscayl-bin is not installed on this PC."); + + var installed = UpscaleModels.InstalledModels; + Assert.SkipUnless(installed.Count > 0, "No upscale model is installed on this PC."); + + var engine = new UpscalerEngine(); + var tempIn = Path.Combine(Path.GetTempPath(), $"test-in-{Guid.NewGuid():N}.png"); + var tempOut = Path.Combine(Path.GetTempPath(), $"test-out-{Guid.NewGuid():N}.png"); + var workDir = Path.Combine(Path.GetTempPath(), $"test-work-{Guid.NewGuid():N}"); + + try + { + using (var img = new ImageMagick.MagickImage(ImageMagick.MagickColors.Red, 64, 64)) + { + img.Write(tempIn); + } + + var progressReports = new List(); + var progress = new Progress(p => progressReports.Add(p)); + var tool = BuiltInData.UpscalePresets().Single(); + + await engine.UpscaleAsync( + tempIn, + tempOut, + "png", + "png", + installed[0].Id, + 2, + workDir, + tool, + progress, + TestContext.Current.CancellationToken); + + Assert.True(File.Exists(tempOut)); + using var result = new ImageMagick.MagickImage(tempOut); + Assert.Equal(128u, result.Width); + Assert.Equal(128u, result.Height); + Assert.NotEmpty(progressReports); + } + finally + { + if (File.Exists(tempIn)) File.Delete(tempIn); + if (File.Exists(tempOut)) File.Delete(tempOut); + if (Directory.Exists(workDir)) Directory.Delete(workDir, recursive: true); + } + } +} From f51e07f85c7e68be8c4fbfd173b90d4e38f1e7d3 Mon Sep 17 00:00:00 2001 From: "return {name:\"chinchi-codes\"}" <84403078+rohitLovesKrishna@users.noreply.github.com> Date: Wed, 4 Nov 2026 09:33:05 +0530 Subject: [PATCH 2/5] Address review feedback on offline AI upscaler engine and UI - Restore case 'model' to bin extraction in EngineInstaller to prevent Whisper regression - Add unit test verifying kind 'model' component installation - Add vcruntime to upscayl-bin on Windows and ensure VCOMP140.DLL is copied next to binary - Add Upscale flag to ConversionEdge, RoutePlanner, and route jobs via JobQueue - Use FormatRegistry.Detect and UpscaleTool.TargetFor to avoid raw extensions as format IDs - Remove 'jpeg' from upscaler supported format IDs - Safely handle model deletion with try/catch and error dialog - Add Material trash icon StreamGeometry and fix delete button visibility for installed models - Cancel token and dispose view model on window closing - Use ImageEncoder to respect preset quality and icon constraints - Show live progress percentage during model download in dialog - Use dynamic theme brushes in UpscaleWindow instead of hardcoded hex values - Update NMKD notices author to nmkd and clean up docs/ENGINES.md - Remove 17 leftover keys across all 19 language files --- THIRD-PARTY-NOTICES.md | 4 +- docs/ENGINES.md | 8 +- src/Filee.App/Assets/i18n/ar.json | 17 --- src/Filee.App/Assets/i18n/de.json | 17 --- src/Filee.App/Assets/i18n/en.json | 17 --- src/Filee.App/Assets/i18n/es.json | 17 --- src/Filee.App/Assets/i18n/fr.json | 17 --- src/Filee.App/Assets/i18n/hi.json | 17 --- src/Filee.App/Assets/i18n/id.json | 17 --- src/Filee.App/Assets/i18n/it.json | 17 --- src/Filee.App/Assets/i18n/ja.json | 17 --- src/Filee.App/Assets/i18n/ko.json | 17 --- src/Filee.App/Assets/i18n/ne.json | 17 --- src/Filee.App/Assets/i18n/pl.json | 17 --- src/Filee.App/Assets/i18n/pt-BR.json | 17 --- src/Filee.App/Assets/i18n/pt-PT.json | 17 --- src/Filee.App/Assets/i18n/ru.json | 17 --- src/Filee.App/Assets/i18n/th.json | 17 --- src/Filee.App/Assets/i18n/tr.json | 17 --- src/Filee.App/Assets/i18n/vi.json | 24 +++- src/Filee.App/Assets/i18n/zh-CN.json | 17 --- src/Filee.App/Assets/i18n/zh-TW.json | 17 --- src/Filee.App/Services/WindowService.cs | 11 +- src/Filee.App/ViewModels/UpscaleViewModel.cs | 127 +++++------------- src/Filee.App/Views/UpscaleWindow.axaml | 36 +++-- src/Filee.App/Views/UpscaleWindow.axaml.cs | 20 ++- src/Filee.Core/Conversion/ConversionJob.cs | 2 +- src/Filee.Core/Conversion/IConverter.cs | 5 +- src/Filee.Core/Conversion/JobQueue.cs | 9 +- src/Filee.Core/Conversion/RoutePlanner.cs | 34 ++++- .../Infrastructure/EngineDownloads.cs | 2 +- .../Infrastructure/EngineInstaller.cs | 9 +- .../Upscale/UpscalerConverter.cs | 4 +- src/Filee.Engines/Upscale/UpscalerEngine.cs | 14 +- tests/Filee.App.Tests/ClipWindowTests.cs | 4 +- tests/Filee.Core.Tests/UpscaleRouteTests.cs | 57 ++++++++ tests/Filee.Core.Tests/UpscaleToolTests.cs | 10 +- .../EngineInstallerTests.cs | 34 +++++ 38 files changed, 258 insertions(+), 479 deletions(-) create mode 100644 tests/Filee.Core.Tests/UpscaleRouteTests.cs diff --git a/THIRD-PARTY-NOTICES.md b/THIRD-PARTY-NOTICES.md index 0c813324d..cb039be87 100644 --- a/THIRD-PARTY-NOTICES.md +++ b/THIRD-PARTY-NOTICES.md @@ -89,8 +89,8 @@ Downloaded from their official release pages when the user chooses to install th | whisper.cpp (whisper-cli.exe Windows build) | MIT | https://github.com/ggml-org/whisper.cpp | | ggml Whisper base model (`ggml-base.bin`) | MIT | https://huggingface.co/ggerganov/whisper.cpp | | upscayl-bin (AI super-resolution binary) | AGPL-3.0 | https://github.com/upscayl/upscayl-ncnn | -| NMKD Siax (`4x_NMKD-Siax_200k`, Philip Hofmann / NMKD) | WTFPL | https://github.com/upscayl/custom-models, https://openmodeldb.info/models/4x-NMKD-Siax-200k | -| NMKD Superscale (`4x_NMKD-Superscale-SP_178000_G`, Philip Hofmann / NMKD) | WTFPL | https://github.com/upscayl/custom-models, https://openmodeldb.info/models/4x-NMKD-Superscale-SP-178000-G | +| NMKD Siax (`4x_NMKD-Siax_200k`, nmkd) | WTFPL | https://github.com/upscayl/custom-models | +| NMKD Superscale (`4x_NMKD-Superscale-SP_178000_G`, nmkd) | WTFPL | https://github.com/upscayl/custom-models | | RealESRGAN General (`RealESRGAN_General_x4_v3`, Xintao Wang) | BSD-3-Clause | https://github.com/xinntao/Real-ESRGAN | | RealESRGAN General WDN (`RealESRGAN_General_WDN_x4_v3`, Xintao Wang) | BSD-3-Clause | https://github.com/xinntao/Real-ESRGAN | | 4xLSDIR (`4xLSDIR`, Philip Hofmann / Phhofm) | CC-BY-4.0 | https://github.com/upscayl/custom-models, https://openmodeldb.info/models/4x-LSDIR | diff --git a/docs/ENGINES.md b/docs/ENGINES.md index 451c64abb..d0ccc0f6e 100644 --- a/docs/ENGINES.md +++ b/docs/ENGINES.md @@ -1888,9 +1888,9 @@ Filee upscales and restores images locally using an offline AI super-resolution - **Offline privacy & local execution**: Like all Filee features, image upscaling processes every pixel locally on your machine via direct Vulkan GPU acceleration or CPU mode. No network connection is used during upscaling. - **Models catalog**: Curated selection of high-quality image models for photos, digital art, illustration, and restoration: - Compact & fast models (optimized for CPU and integrated GPUs): `4xLSDIRCompactC3`, `RealESRGAN_General_x4_v3`, `RealESRGAN_General_WDN_x4_v3`. - - Detailed & high-fidelity models (recommended for dedicated GPUs): `4x_NMKD-Siax_200k`, `4x_NMKD-Superscale-SP_178000_G`, `4xLSDIR`, `4xLSDIRplusC`, `4xNomos8kSC`, `4xHFA2k`, `uniscale_restore`. + - Detailed & high-fidelity models (recommended for dedicated GPUs): `4x_NMKD-Siax_200k`, `4x_NMKD-Superscale-SP_178000_G`, `4xLSDIR`, `4xLSDIRplusC`, `4xNomos8kSC`, `4xHFA2k`. - **Where it lives**: - - **Donut Menu**: When an image is dropped or opened in the donut wheel, the **Upscale** preset opens the interactive Upscale dialog to select models, scale factors (1x to 4x), preview output resolution, and upscale directly. + - **Donut Menu**: When an image is dropped or opened in the donut wheel, the **Upscale** preset opens the interactive Upscale dialog to select models, scale factors (2× to 4×), preview output resolution, and upscale directly. - **Settings → Presets**: The "Upscale Image" tool preset can be configured with preferred default models and scale factors. - - **Settings → Engines**: "Image Quality Models" engine card with a dedicated **Download Models** manager to browse, search, download, and delete local model files. -- **Supported formats**: PNG, JPG, JPEG, WEBP, ICO, HEIC, AVIF, BMP, and TIFF. + - **Settings → Engines**: "Upscayl (AI image upscaler)" engine package provides the local `upscayl-bin` binary, with models downloaded on demand with live progress and uninstall support in the Upscale dialog. +- **Supported formats**: PNG, JPG, WEBP, ICO, HEIC, AVIF, BMP, and TIFF. diff --git a/src/Filee.App/Assets/i18n/ar.json b/src/Filee.App/Assets/i18n/ar.json index e1d96a1e1..80c77f612 100644 --- a/src/Filee.App/Assets/i18n/ar.json +++ b/src/Filee.App/Assets/i18n/ar.json @@ -1478,22 +1478,7 @@ "preset.upscale.donut": "ترقية الجودة", "engine.upscaler.name": "نماذج جودة الصورة", "engine.upscaler.description": "ترقية دقة الصور بالذكاء الاصطناعي حتى 4 أضعاف باستخدام نماذج NCNN المحلية.", - "engines.upscaler.manage": "تنزيل النماذج", - "engines.upscaler.modal_title": "نماذج جودة الصورة", "engines.upscaler.modal_description": "قم بتنزيل نماذج الذكاء الاصطناعي المحلية لترقية دقة الصور حتى 4×. تجري كافة العمليات دون اتصال بالإنترنت بنسبة 100%.", - "engines.upscaler.search_placeholder": "البحث عن النماذج...", - "engines.upscaler.hardware_gpu": "تسريع GPU نشط ({0})", - "engines.upscaler.hardware_cpu": "وضع CPU (يوصى بالنماذج الخفيفة)", - "engines.upscaler.recommended_gpu": "بطاقة رسومات منفصلة", - "engines.upscaler.recommended_cpu": "المعالج والرسومات المدمجة", - "engines.upscaler.download": "تنزيل", - "engines.upscaler.downloading": "جارٍ التنزيل... {0}%", - "engines.upscaler.downloaded": "تم التنزيل", - "engines.upscaler.download_all": "تنزيل النماذج الموصى بها", - "engines.upscaler.delete_confirm": "هل تريد حذف {0}؟ يمكنك تنزيله مجددًا في أي وقت.", - "engines.upscaler.delete_failed": "تعذر حذف {0}.", - "engines.upscaler.download_failed": "فشل تنزيل {0}.", - "engines.upscaler.no_models": "لم يتم العثور على نماذج تطابق بحثك.", "upscale.model": "النموذج", "upscale.scale": "معامل التكبير", "upscale.output_format": "تنسيق الإخراج", @@ -1501,11 +1486,9 @@ "upscale.resolution_label": "معاينة الدقة", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "ترقية الآن", - "upscale.no_models_installed": "لم يتم تنزيل أي نماذج بعد. يرجى تنزيل نموذج أولاً.", "upscale.processing": "جارٍ الترقية... {0}%", "upscale.success": "اكتملت ترقية الصورة بنجاح.", "error.upscale_failed": "فشلت الترقية: {0}", - "engine.reason.needs_models": "لا توجد نماذج منزلة (انظر الإعدادات ← المحركات)", "engines.package.upscayl-bin.name": "Upscayl (ترقية دقة الصور بالذكاء الاصطناعي)", "engines.package.upscayl-bin.description": "ترقية دقة الصور والدقة الفائقة حتى 4 أضعاف بنماذج NCNN محلية.\nتُنزَّل النماذج عند استخدامها أول مرة.", "error.upscale_needs_engine": "ثبّت Upscayl من الإعدادات ← المحركات لاستخدام ترقية الدقة بالذكاء الاصطناعي.", diff --git a/src/Filee.App/Assets/i18n/de.json b/src/Filee.App/Assets/i18n/de.json index 6f02cebf0..51cd33612 100644 --- a/src/Filee.App/Assets/i18n/de.json +++ b/src/Filee.App/Assets/i18n/de.json @@ -1477,22 +1477,7 @@ "preset.upscale.donut": "Hochskalieren", "engine.upscaler.name": "Bildqualitäts-Modelle", "engine.upscaler.description": "KI-Bild-Hochskalierung und Super-Resolution bis zu 4× mit lokalen NCNN-Modellen.", - "engines.upscaler.manage": "Modelle herunterladen", - "engines.upscaler.modal_title": "Bildqualitäts-Modelle", "engines.upscaler.modal_description": "Laden Sie lokale KI-Modelle herunter, um Bilder bis zu 4× hochzuskalieren. Die Verarbeitung erfolgt zu 100 % offline auf Ihrem Gerät.", - "engines.upscaler.search_placeholder": "Modelle suchen...", - "engines.upscaler.hardware_gpu": "GPU-Beschleunigung aktiv ({0})", - "engines.upscaler.hardware_cpu": "CPU-Modus (Kompakte Modelle empfohlen)", - "engines.upscaler.recommended_gpu": "Dedizierte GPU", - "engines.upscaler.recommended_cpu": "CPU & iGPU", - "engines.upscaler.download": "Herunterladen", - "engines.upscaler.downloading": "Wird heruntergeladen... {0}%", - "engines.upscaler.downloaded": "Heruntergeladen", - "engines.upscaler.download_all": "Empfohlene herunterladen", - "engines.upscaler.delete_confirm": "{0} löschen? Sie können es jederzeit wieder herunterladen.", - "engines.upscaler.delete_failed": "{0} konnte nicht gelöscht werden.", - "engines.upscaler.download_failed": "Fehler beim Herunterladen von {0}.", - "engines.upscaler.no_models": "Keine Modelle gefunden, die Ihrer Suche entsprechen.", "upscale.model": "Modell", "upscale.scale": "Skalierungsfaktor", "upscale.output_format": "Ausgabeformat", @@ -1500,11 +1485,9 @@ "upscale.resolution_label": "Auflösungsvorschau", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "Jetzt hochskalieren", - "upscale.no_models_installed": "Keine Modelle heruntergeladen. Bitte laden Sie zuerst ein Modell herunter.", "upscale.processing": "Wird hochskaliert... {0}%", "upscale.success": "Hochskalierung erfolgreich abgeschlossen.", "error.upscale_failed": "Hochskalierung fehlgeschlagen: {0}", - "engine.reason.needs_models": "Keine Modelle heruntergeladen (siehe Einstellungen → Engines)", "engines.package.upscayl-bin.name": "Upscayl (KI-Bild-Upscaler)", "engines.package.upscayl-bin.description": "KI-Bild-Upscaling und Super-Resolution bis zu 4× mit lokalen NCNN-Modellen.\nModelle werden bei der ersten Verwendung heruntergeladen.", "error.upscale_needs_engine": "Installiere Upscayl unter Einstellungen → Module, um KI-Upscaling zu nutzen.", diff --git a/src/Filee.App/Assets/i18n/en.json b/src/Filee.App/Assets/i18n/en.json index 7b410120f..a960493e7 100644 --- a/src/Filee.App/Assets/i18n/en.json +++ b/src/Filee.App/Assets/i18n/en.json @@ -1499,22 +1499,7 @@ "preset.upscale.donut": "Upscale", "engine.upscaler.name": "Image Quality Models", "engine.upscaler.description": "AI image upscaling and super-resolution up to 4× with local NCNN models.", - "engines.upscaler.manage": "Download Models", - "engines.upscaler.modal_title": "Image Quality Models", "engines.upscaler.modal_description": "Download local AI super-resolution models to upscale images up to 4×. All processing runs 100% offline on your device.", - "engines.upscaler.search_placeholder": "Search models...", - "engines.upscaler.hardware_gpu": "GPU Acceleration Active ({0})", - "engines.upscaler.hardware_cpu": "CPU Mode (Lightweight models recommended)", - "engines.upscaler.recommended_gpu": "Dedicated GPU", - "engines.upscaler.recommended_cpu": "CPU & iGPU", - "engines.upscaler.download": "Download", - "engines.upscaler.downloading": "Downloading... {0}%", - "engines.upscaler.downloaded": "Downloaded", - "engines.upscaler.download_all": "Download Recommended", - "engines.upscaler.delete_confirm": "Delete {0}? You can download it again at any time.", - "engines.upscaler.delete_failed": "Could not delete {0}.", - "engines.upscaler.download_failed": "Failed to download {0}.", - "engines.upscaler.no_models": "No models found matching your search.", "upscale.model": "Model", "upscale.scale": "Scale Factor", "upscale.output_format": "Output Format", @@ -1522,11 +1507,9 @@ "upscale.resolution_label": "Resolution Preview", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "Upscale Now", - "upscale.no_models_installed": "No models downloaded. Please download a model first.", "upscale.processing": "Upscaling... {0}%", "upscale.success": "Upscaling completed successfully.", "error.upscale_failed": "Upscaling failed: {0}", - "engine.reason.needs_models": "No models downloaded (see Settings → Engines)", "engines.package.upscayl-bin.name": "Upscayl (AI image upscaler)", "engines.package.upscayl-bin.description": "AI image upscaling and super-resolution up to 4× with local NCNN models.\nModels download the first time they are used.", "error.upscale_needs_engine": "Install Upscayl in Settings → Engines to use AI upscaling.", diff --git a/src/Filee.App/Assets/i18n/es.json b/src/Filee.App/Assets/i18n/es.json index d35afb74b..3afc5a928 100644 --- a/src/Filee.App/Assets/i18n/es.json +++ b/src/Filee.App/Assets/i18n/es.json @@ -1479,22 +1479,7 @@ "preset.upscale.donut": "Escalar", "engine.upscaler.name": "Modelos de calidad de imagen", "engine.upscaler.description": "Mejora y superresolución de imágenes con IA local hasta 4× mediante modelos NCNN.", - "engines.upscaler.manage": "Descargar modelos", - "engines.upscaler.modal_title": "Modelos de calidad de imagen", "engines.upscaler.modal_description": "Descarga modelos locales de superresolución para escalar imágenes hasta 4×. Todo el procesamiento se ejecuta 100% sin conexión.", - "engines.upscaler.search_placeholder": "Buscar modelos...", - "engines.upscaler.hardware_gpu": "Aceleración por GPU activa ({0})", - "engines.upscaler.hardware_cpu": "Modo CPU (se recomiendan modelos ligeros)", - "engines.upscaler.recommended_gpu": "GPU dedicada", - "engines.upscaler.recommended_cpu": "CPU e iGPU", - "engines.upscaler.download": "Descargar", - "engines.upscaler.downloading": "Descargando... {0}%", - "engines.upscaler.downloaded": "Descargado", - "engines.upscaler.download_all": "Descargar recomendados", - "engines.upscaler.delete_confirm": "¿Eliminar {0}? Puedes descargarlo de nuevo en cualquier momento.", - "engines.upscaler.delete_failed": "No se pudo eliminar {0}.", - "engines.upscaler.download_failed": "Error al descargar {0}.", - "engines.upscaler.no_models": "No se encontraron modelos que coincidan con la búsqueda.", "upscale.model": "Modelo", "upscale.scale": "Factor de escala", "upscale.output_format": "Formato de salida", @@ -1502,11 +1487,9 @@ "upscale.resolution_label": "Vista previa de resolución", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "Escalar ahora", - "upscale.no_models_installed": "No hay modelos descargados. Descarga uno primero.", "upscale.processing": "Escalando... {0}%", "upscale.success": "Escalado completado con éxito.", "error.upscale_failed": "Error al escalar: {0}", - "engine.reason.needs_models": "No hay modelos descargados (ver Ajustes → Motores)", "engines.package.upscayl-bin.name": "Upscayl (escalador de imágenes por IA)", "engines.package.upscayl-bin.description": "Escalado de imágenes y superresolución por IA hasta 4× con modelos NCNN locales.\nLos modelos se descargan la primera vez que se usan.", "error.upscale_needs_engine": "Instala Upscayl en Ajustes → Motores para usar el escalado por IA.", diff --git a/src/Filee.App/Assets/i18n/fr.json b/src/Filee.App/Assets/i18n/fr.json index 7651c80fb..0f7336492 100644 --- a/src/Filee.App/Assets/i18n/fr.json +++ b/src/Filee.App/Assets/i18n/fr.json @@ -1499,22 +1499,7 @@ "preset.upscale.donut": "Mettre à l'échelle", "engine.upscaler.name": "Modèles de qualité d'image", "engine.upscaler.description": "Amélioration et super-résolution d'images par IA jusqu'à 4× avec des modèles NCNN locaux.", - "engines.upscaler.manage": "Télécharger des modèles", - "engines.upscaler.modal_title": "Modèles de qualité d'image", "engines.upscaler.modal_description": "Téléchargez des modèles locaux pour agrandir vos images jusqu'à 4×. Tout s'exécute à 100 % hors ligne sur votre appareil.", - "engines.upscaler.search_placeholder": "Rechercher des modèles...", - "engines.upscaler.hardware_gpu": "Accélération GPU active ({0})", - "engines.upscaler.hardware_cpu": "Mode CPU (modèles légers recommandés)", - "engines.upscaler.recommended_gpu": "GPU dédié", - "engines.upscaler.recommended_cpu": "CPU et iGPU", - "engines.upscaler.download": "Télécharger", - "engines.upscaler.downloading": "Téléchargement... {0}%", - "engines.upscaler.downloaded": "Téléchargé", - "engines.upscaler.download_all": "Télécharger les recommandés", - "engines.upscaler.delete_confirm": "Supprimer {0} ? Vous pourrez le télécharger à nouveau à tout moment.", - "engines.upscaler.delete_failed": "Impossible de supprimer {0}.", - "engines.upscaler.download_failed": "Échec du téléchargement de {0}.", - "engines.upscaler.no_models": "Aucun modèle trouvé correspondant à votre recherche.", "upscale.model": "Modèle", "upscale.scale": "Facteur d'échelle", "upscale.output_format": "Format de sortie", @@ -1522,11 +1507,9 @@ "upscale.resolution_label": "Aperçu de la résolution", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "Agrandir maintenant", - "upscale.no_models_installed": "Aucun modèle téléchargé. Veuillez d'abord en télécharger un.", "upscale.processing": "Mise à l'échelle... {0}%", "upscale.success": "Mise à l'échelle terminée avec succès.", "error.upscale_failed": "Échec de la mise à l'échelle : {0}", - "engine.reason.needs_models": "Aucun modèle téléchargé (voir Paramètres → Moteurs)", "engines.package.upscayl-bin.name": "Upscayl (mise à l'échelle d'images par IA)", "engines.package.upscayl-bin.description": "Mise à l'échelle et super-résolution d'images par IA jusqu'à 4× avec des modèles NCNN locaux.\nLes modèles sont téléchargés à leur première utilisation.", "error.upscale_needs_engine": "Installez Upscayl dans Paramètres → Moteurs pour utiliser la mise à l'échelle par IA.", diff --git a/src/Filee.App/Assets/i18n/hi.json b/src/Filee.App/Assets/i18n/hi.json index 420b92577..ef61fded0 100644 --- a/src/Filee.App/Assets/i18n/hi.json +++ b/src/Filee.App/Assets/i18n/hi.json @@ -1479,22 +1479,7 @@ "preset.upscale.donut": "अपस्केल", "engine.upscaler.name": "इमेज क्वालिटी मॉडल", "engine.upscaler.description": "स्थानीय NCNN मॉडल के साथ 4x तक AI छवि सुपर-रिज़ॉल्यूशन और अपस्केलिंग।", - "engines.upscaler.manage": "मॉडल डाउनलोड करें", - "engines.upscaler.modal_title": "इमेज क्वालिटी मॉडल", "engines.upscaler.modal_description": "छवियों को 4x तक बड़ा और स्पष्ट करने के लिए स्थानीय AI मॉडल डाउनलोड करें। सभी प्रोसेसिंग आपके डिवाइस पर 100% ऑफ़लाइन होती है।", - "engines.upscaler.search_placeholder": "मॉडल खोजें...", - "engines.upscaler.hardware_gpu": "GPU त्वरण सक्रिय ({0})", - "engines.upscaler.hardware_cpu": "CPU मोड (हल्के मॉडल अनुशंसित)", - "engines.upscaler.recommended_gpu": "समर्पित GPU", - "engines.upscaler.recommended_cpu": "CPU और एकीकृत GPU", - "engines.upscaler.download": "डाउनलोड करें", - "engines.upscaler.downloading": "डाउनलोड हो रहा है... {0}%", - "engines.upscaler.downloaded": "डाउनलोड किया गया", - "engines.upscaler.download_all": "अनुशंसित मॉडल डाउनलोड करें", - "engines.upscaler.delete_confirm": "क्या {0} को हटाना चाहते हैं? आप इसे कभी भी दोबारा डाउनलोड कर सकते हैं।", - "engines.upscaler.delete_failed": "{0} को हटाया नहीं जा सका।", - "engines.upscaler.download_failed": "{0} को डाउनलोड करने में विफलता।", - "engines.upscaler.no_models": "आपकी खोज से मेल खाने वाला कोई मॉडल नहीं मिला।", "upscale.model": "मॉडल", "upscale.scale": "स्केल फैक्टर", "upscale.output_format": "आउटपुट प्रारूप", @@ -1502,11 +1487,9 @@ "upscale.resolution_label": "रिज़ॉल्यूशन पूर्वावलोकन", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "अभी अपस्केल करें", - "upscale.no_models_installed": "कोई मॉडल डाउनलोड नहीं हुआ है। कृपया पहले एक मॉडल डाउनलोड करें।", "upscale.processing": "अपस्केल हो रहा है... {0}%", "upscale.success": "सफलतापूर्वक अपस्केल किया गया।", "error.upscale_failed": "अपस्केल विफल रहा: {0}", - "engine.reason.needs_models": "कोई मॉडल डाउनलोड नहीं है (सेटिंग्स → इंजन देखें)", "engines.package.upscayl-bin.name": "Upscayl (AI इमेज अपस्केलर)", "engines.package.upscayl-bin.description": "स्थानीय NCNN मॉडल्स के साथ 4× तक AI इमेज अपस्केलिंग और सुपर-रेज़ोल्यूशन।\nमॉडल पहली बार इस्तेमाल पर डाउनलोड होते हैं।", "error.upscale_needs_engine": "AI अपस्केलिंग का उपयोग करने के लिए सेटिंग्स → इंजन में Upscayl इंस्टॉल करें।", diff --git a/src/Filee.App/Assets/i18n/id.json b/src/Filee.App/Assets/i18n/id.json index 1b90488b5..095fcc443 100644 --- a/src/Filee.App/Assets/i18n/id.json +++ b/src/Filee.App/Assets/i18n/id.json @@ -1477,22 +1477,7 @@ "preset.upscale.donut": "Tingkatkan", "engine.upscaler.name": "Model Kualitas Gambar", "engine.upscaler.description": "Peningkatan resolusi gambar AI hingga 4× dengan model NCNN lokal.", - "engines.upscaler.manage": "Unduh Model", - "engines.upscaler.modal_title": "Model Kualitas Gambar", "engines.upscaler.modal_description": "Unduh model super-resolusi AI lokal untuk memperbesar gambar hingga 4×. Semua pemrosesan berjalan 100% offline.", - "engines.upscaler.search_placeholder": "Cari model...", - "engines.upscaler.hardware_gpu": "Akselerasi GPU Aktif ({0})", - "engines.upscaler.hardware_cpu": "Mode CPU (Model ringan disarankan)", - "engines.upscaler.recommended_gpu": "GPU Khusus", - "engines.upscaler.recommended_cpu": "CPU & GPU Terintegrasi", - "engines.upscaler.download": "Unduh", - "engines.upscaler.downloading": "Mengunduh... {0}%", - "engines.upscaler.downloaded": "Terunduh", - "engines.upscaler.download_all": "Unduh yang Disarankan", - "engines.upscaler.delete_confirm": "Hapus {0}? Anda dapat mengunduhnya lagi kapan saja.", - "engines.upscaler.delete_failed": "Gagal menghapus {0}.", - "engines.upscaler.download_failed": "Gagal mengunduh {0}.", - "engines.upscaler.no_models": "Tidak ada model yang cocok dengan pencarian Anda.", "upscale.model": "Model", "upscale.scale": "Faktor Skala", "upscale.output_format": "Format Keluaran", @@ -1500,11 +1485,9 @@ "upscale.resolution_label": "Pratinjau Resolusi", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "Tingkatkan Sekarang", - "upscale.no_models_installed": "Belum ada model yang diunduh. Silakan unduh model terlebih dahulu.", "upscale.processing": "Meningkatkan resolusi... {0}%", "upscale.success": "Peningkatan kualitas selesai.", "error.upscale_failed": "Peningkatan gagal: {0}", - "engine.reason.needs_models": "Belum ada model yang diunduh (lihat Pengaturan → Mesin)", "engines.package.upscayl-bin.name": "Upscayl (peningkat resolusi gambar AI)", "engines.package.upscayl-bin.description": "Peningkatan resolusi gambar AI hingga 4× dengan model NCNN lokal.\nModel diunduh saat pertama kali digunakan.", "error.upscale_needs_engine": "Pasang Upscayl di Pengaturan → Engine untuk menggunakan peningkatan resolusi AI.", diff --git a/src/Filee.App/Assets/i18n/it.json b/src/Filee.App/Assets/i18n/it.json index 10e49260f..f9234dcc6 100644 --- a/src/Filee.App/Assets/i18n/it.json +++ b/src/Filee.App/Assets/i18n/it.json @@ -1476,22 +1476,7 @@ "preset.upscale.donut": "Migliora", "engine.upscaler.name": "Modelli di qualità immagine", "engine.upscaler.description": "Miglioramento e super-risoluzione immagini con IA fino a 4× con modelli NCNN locali.", -"engines.upscaler.manage": "Scarica modelli", -"engines.upscaler.modal_title": "Modelli di qualità immagine", "engines.upscaler.modal_description": "Scarica modelli IA locali per ingrandire le immagini fino a 4×. Tutte le elaborazioni avvengono al 100% offline sul tuo dispositivo.", -"engines.upscaler.search_placeholder": "Cerca modelli...", -"engines.upscaler.hardware_gpu": "Accelerazione GPU attiva ({0})", -"engines.upscaler.hardware_cpu": "Modalità CPU (modelli leggeri consigliati)", -"engines.upscaler.recommended_gpu": "GPU dedicata", -"engines.upscaler.recommended_cpu": "CPU e iGPU", -"engines.upscaler.download": "Scarica", -"engines.upscaler.downloading": "Download in corso... {0}%", -"engines.upscaler.downloaded": "Scaricato", -"engines.upscaler.download_all": "Scarica consigliati", -"engines.upscaler.delete_confirm": "Eliminare {0}? Puoi riscaricarlo in qualsiasi momento.", -"engines.upscaler.delete_failed": "Impossibile eliminare {0}.", -"engines.upscaler.download_failed": "Impossibile scaricare {0}.", -"engines.upscaler.no_models": "Nessun modello trovato corrispondente alla ricerca.", "upscale.model": "Modello", "upscale.scale": "Fattore di scala", "upscale.output_format": "Formato di output", @@ -1499,11 +1484,9 @@ "upscale.resolution_label": "Anteprima risoluzione", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "Migliora adesso", -"upscale.no_models_installed": "Nessun modello scaricato. Scarica prima un modello.", "upscale.processing": "Miglioramento in corso... {0}%", "upscale.success": "Miglioramento completato con successo.", "error.upscale_failed": "Miglioramento non riuscito: {0}", -"engine.reason.needs_models": "Nessun modello scaricato (vedi Impostazioni → Motori)", "engines.package.upscayl-bin.name": "Upscayl (upscaling immagini IA)", "engines.package.upscayl-bin.description": "Upscaling e super-risoluzione immagini tramite IA fino a 4× con modelli NCNN locali.\nI modelli vengono scaricati la prima volta che li usi.", "error.upscale_needs_engine": "Installa Upscayl in Impostazioni → Motori per usare l'upscaling IA.", diff --git a/src/Filee.App/Assets/i18n/ja.json b/src/Filee.App/Assets/i18n/ja.json index 9ccca00fc..0fecce2cf 100644 --- a/src/Filee.App/Assets/i18n/ja.json +++ b/src/Filee.App/Assets/i18n/ja.json @@ -1479,22 +1479,7 @@ "preset.upscale.donut": "拡大・高画質化", "engine.upscaler.name": "画質向上AIモデル", "engine.upscaler.description": "ローカルNCNNモデルを使用した最大4倍のAI画像超解像・高品質拡大。", - "engines.upscaler.manage": "モデルをダウンロード", - "engines.upscaler.modal_title": "画質向上AIモデル", "engines.upscaler.modal_description": "画像を最大4倍に拡大・高画質化するローカルAI超解像モデルをダウンロードします。すべて端末内で100%オフライン処理されます。", - "engines.upscaler.search_placeholder": "モデルを検索...", - "engines.upscaler.hardware_gpu": "GPUアクセラレーション有効 ({0})", - "engines.upscaler.hardware_cpu": "CPUモード (軽量モデルを推奨)", - "engines.upscaler.recommended_gpu": "専用GPU", - "engines.upscaler.recommended_cpu": "CPUおよび内蔵GPU", - "engines.upscaler.download": "ダウンロード", - "engines.upscaler.downloading": "ダウンロード中... {0}%", - "engines.upscaler.downloaded": "ダウンロード済み", - "engines.upscaler.download_all": "推奨モデルを一括取得", - "engines.upscaler.delete_confirm": "{0} を削除しますか?いつでも再ダウンロードできます。", - "engines.upscaler.delete_failed": "{0} の削除に失敗しました。", - "engines.upscaler.download_failed": "{0} のダウンロードに失敗しました。", - "engines.upscaler.no_models": "一致するモデルが見つかりません。", "upscale.model": "モデル", "upscale.scale": "倍率", "upscale.output_format": "出力形式", @@ -1502,11 +1487,9 @@ "upscale.resolution_label": "解像度プレビュー", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "今すぐアップスケール", - "upscale.no_models_installed": "モデルがダウンロードされていません。先にモデルをダウンロードしてください。", "upscale.processing": "アップスケール中... {0}%", "upscale.success": "アップスケールが正常に完了しました。", "error.upscale_failed": "アップスケールに失敗しました: {0}", - "engine.reason.needs_models": "モデルがありません (設定 → エンジンを確認)", "engines.package.upscayl-bin.name": "Upscayl(AI 画像アップスケーラー)", "engines.package.upscayl-bin.description": "ローカル NCNN モデルで最大 4 倍の AI 画像アップスケールと超解像処理を行います。\nモデルは初めて使うときにダウンロードされます。", "error.upscale_needs_engine": "AI アップスケールを使用するには、設定 → エンジンで Upscayl をインストールしてください。", diff --git a/src/Filee.App/Assets/i18n/ko.json b/src/Filee.App/Assets/i18n/ko.json index 98d6bbb0d..52bc57f19 100644 --- a/src/Filee.App/Assets/i18n/ko.json +++ b/src/Filee.App/Assets/i18n/ko.json @@ -1499,22 +1499,7 @@ "preset.upscale.donut": "고화질 확대", "engine.upscaler.name": "화질 향상 모델", "engine.upscaler.description": "로컬 NCNN 모델을 사용한 최대 4배 AI 이미지 초해상도 및 고화질 확대예요.", - "engines.upscaler.manage": "모델 다운로드", - "engines.upscaler.modal_title": "화질 향상 모델", "engines.upscaler.modal_description": "이미지를 최대 4배까지 선명하게 확대하는 로컬 AI 모델을 다운로드해요. 모든 작업은 컴퓨터 내에서 100% 오프라인으로 실행돼요.", - "engines.upscaler.search_placeholder": "모델 검색...", - "engines.upscaler.hardware_gpu": "GPU 가속 활성화됨 ({0})", - "engines.upscaler.hardware_cpu": "CPU 모드 (경량 모델 권장)", - "engines.upscaler.recommended_gpu": "외장 그래픽카드(GPU)", - "engines.upscaler.recommended_cpu": "CPU 및 내장 그래픽", - "engines.upscaler.download": "다운로드", - "engines.upscaler.downloading": "다운로드 중... {0}%", - "engines.upscaler.downloaded": "다운로드 완료", - "engines.upscaler.download_all": "권장 모델 모두 받기", - "engines.upscaler.delete_confirm": "{0}을(를) 삭제할까요? 언제든 다시 내려받을 수 있어요.", - "engines.upscaler.delete_failed": "{0}을(를) 삭제하지 못했어요.", - "engines.upscaler.download_failed": "{0} 다운로드에 실패했어요.", - "engines.upscaler.no_models": "검색 결과와 일치하는 모델이 없어요.", "upscale.model": "모델", "upscale.scale": "확대 배율", "upscale.output_format": "출력 형식", @@ -1522,11 +1507,9 @@ "upscale.resolution_label": "해상도 미리보기", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}배)", "upscale.button_start": "지금 확대하기", - "upscale.no_models_installed": "다운로드된 모델이 없어요. 먼저 모델을 다운로드해 주세요.", "upscale.processing": "고화질 확대 중... {0}%", "upscale.success": "고화질 확대가 완료되었어요.", "error.upscale_failed": "확대에 실패했어요: {0}", - "engine.reason.needs_models": "다운로드된 모델이 없어요 (설정 → 변환 엔진 확인)", "engines.package.upscayl-bin.name": "Upscayl (AI 이미지 업스케일러)", "engines.package.upscayl-bin.description": "로컬 NCNN 모델로 최대 4배 AI 이미지 업스케일 및 초해상도를 지원해요.\n모델은 처음 쓸 때 내려받아요.", "error.upscale_needs_engine": "AI 업스케일을 사용하려면 설정 → 엔진에서 Upscayl을 설치해 주세요.", diff --git a/src/Filee.App/Assets/i18n/ne.json b/src/Filee.App/Assets/i18n/ne.json index ceef07163..532b34f19 100644 --- a/src/Filee.App/Assets/i18n/ne.json +++ b/src/Filee.App/Assets/i18n/ne.json @@ -1479,22 +1479,7 @@ "preset.upscale.donut": "अपस्केल", "engine.upscaler.name": "छवि गुणस्तर मोडेलहरू", "engine.upscaler.description": "स्थानीय NCNN मोडेलहरूसँग ४× सम्म AI छवि सुपर-रिजोल्युसन र अपस्केलिङ।", - "engines.upscaler.manage": "मोडेलहरू डाउनलोड गर्नुहोस्", - "engines.upscaler.modal_title": "छवि गुणस्तर मोडेलहरू", "engines.upscaler.modal_description": "तस्बिरहरूलाई ४× सम्म विस्तार गर्न स्थानीय AI सुपर-रिजोल्युसन मोडेलहरू डाउनलोड गर्नुहोस्। सबै प्रक्रिया १००% अफलाइन चल्छ।", - "engines.upscaler.search_placeholder": "मोडेलहरू खोज्नुहोस्...", - "engines.upscaler.hardware_gpu": "GPU प्रवेग सक्रिय ({0})", - "engines.upscaler.hardware_cpu": "CPU मोड (हल्का मोडेलहरू सिफारिस गरिएको)", - "engines.upscaler.recommended_gpu": "समर्पित GPU", - "engines.upscaler.recommended_cpu": "CPU र एकीकृत GPU", - "engines.upscaler.download": "डाउनलोड गर्नुहोस्", - "engines.upscaler.downloading": "डाउनलोड हुँदैछ... {0}%", - "engines.upscaler.downloaded": "डाउनलोड भयो", - "engines.upscaler.download_all": "सिफारिस गरिएका डाउनलोड गर्नुहोस्", - "engines.upscaler.delete_confirm": "{0} मेटाउनुहुन्छ? तपाईं यसलाई पछि फेरि डाउनलोड गर्न सक्नुहुन्छ।", - "engines.upscaler.delete_failed": "{0} मेटाउन सकिएन।", - "engines.upscaler.download_failed": "{0} डाउनलोड गर्न असफल।", - "engines.upscaler.no_models": "तपाईंको खोजीसँग मेल खाने कुनै मोडेल भेटिएन।", "upscale.model": "मोडेल", "upscale.scale": "स्केल कारक", "upscale.output_format": "आउटपुट ढाँचा", @@ -1502,11 +1487,9 @@ "upscale.resolution_label": "रिजोल्युसन पूर्वावलोकन", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "अहिले अपस्केल गर्नुहोस्", - "upscale.no_models_installed": "कुनै मोडेल डाउनलोड गरिएको छैन। कृपया पहिले मोडेल डाउनलोड गर्नुहोस्।", "upscale.processing": "अपस्केल हुँदैछ... {0}%", "upscale.success": "अपस्केल सफलतापूर्वक सम्पन्न भयो।", "error.upscale_failed": "अपस्केल असफल भयो: {0}", - "engine.reason.needs_models": "कुनै मोडेल डाउनलोड गरिएको छैन (सेटिङहरू → इन्जिनहरू हेर्नुहोस्)", "engines.package.upscayl-bin.name": "Upscayl (AI तस्बिर अपस्केलर)", "engines.package.upscayl-bin.description": "स्थानीय NCNN मोडेलहरूसँग ४ गुणासम्म AI तस्बिर अपस्केलिङ र सुपर-रिजोल्युसन।\nमोडेलहरू पहिलो पटक प्रयोग गर्दा डाउनलोड हुन्छन्।", "error.upscale_needs_engine": "AI अपस्केलिङ प्रयोग गर्न सेटिङहरू → इन्जिनहरूमा Upscayl स्थापना गर्नुहोस्।", diff --git a/src/Filee.App/Assets/i18n/pl.json b/src/Filee.App/Assets/i18n/pl.json index a559fd86e..cd7437518 100644 --- a/src/Filee.App/Assets/i18n/pl.json +++ b/src/Filee.App/Assets/i18n/pl.json @@ -1499,22 +1499,7 @@ "preset.upscale.donut": "Zwiększ jakość", "engine.upscaler.name": "Modele jakości obrazu", "engine.upscaler.description": "Skalowanie AI i super-rozdzielczość obrazów do 4× za pomocą lokalnych modeli NCNN.", - "engines.upscaler.manage": "Pobierz modele", - "engines.upscaler.modal_title": "Modele jakości obrazu", "engines.upscaler.modal_description": "Pobierz lokalne modele super-rozdzielczości, aby powiększać obrazy do 4×. Wszystko działa w 100% offline na Twoim komputerze.", - "engines.upscaler.search_placeholder": "Szukaj modeli...", - "engines.upscaler.hardware_gpu": "Aktywne przyspieszenie GPU ({0})", - "engines.upscaler.hardware_cpu": "Tryb CPU (zalecane lekkie modele)", - "engines.upscaler.recommended_gpu": "Dedykowana karta graficzna", - "engines.upscaler.recommended_cpu": "CPU i zintegrowana grafika", - "engines.upscaler.download": "Pobierz", - "engines.upscaler.downloading": "Pobieranie... {0}%", - "engines.upscaler.downloaded": "Pobrano", - "engines.upscaler.download_all": "Pobierz zalecane", - "engines.upscaler.delete_confirm": "Usunąć {0}? Możesz pobrać go ponownie w dowolnym momencie.", - "engines.upscaler.delete_failed": "Nie udało się usunąć {0}.", - "engines.upscaler.download_failed": "Błąd pobierania {0}.", - "engines.upscaler.no_models": "Nie znaleziono pasujących modeli.", "upscale.model": "Model", "upscale.scale": "Mnożnik skali", "upscale.output_format": "Format wyjściowy", @@ -1522,11 +1507,9 @@ "upscale.resolution_label": "Podgląd rozdzielczości", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "Zwiększ jakość teraz", - "upscale.no_models_installed": "Brak pobranych modeli. Najpierw pobierz model.", "upscale.processing": "Przetwarzanie... {0}%", "upscale.success": "Skalowanie zakończone pomyślnie.", "error.upscale_failed": "Skalowanie nie powiodło się: {0}", - "engine.reason.needs_models": "Brak pobranych modeli (zobacz Ustawienia → Silniki)", "engines.package.upscayl-bin.name": "Upscayl (skalowanie obrazu SI)", "engines.package.upscayl-bin.description": "Skalowanie obrazu SI i super-rozdzielczość do 4× za pomocą lokalnych modeli NCNN.\nModele są pobierane przy pierwszym użyciu.", "error.upscale_needs_engine": "Zainstaluj Upscayl w Ustawienia → Silniki, aby korzystać ze skalowania SI.", diff --git a/src/Filee.App/Assets/i18n/pt-BR.json b/src/Filee.App/Assets/i18n/pt-BR.json index 9ef4a9746..aa0bfe4c0 100644 --- a/src/Filee.App/Assets/i18n/pt-BR.json +++ b/src/Filee.App/Assets/i18n/pt-BR.json @@ -1499,22 +1499,7 @@ "preset.upscale.donut": "Super-resolução", "engine.upscaler.name": "Modelos de qualidade de imagem", "engine.upscaler.description": "Aprimoramento e super-resolução de imagem com IA até 4× usando modelos locais NCNN.", - "engines.upscaler.manage": "Baixar modelos", - "engines.upscaler.modal_title": "Modelos de qualidade de imagem", "engines.upscaler.modal_description": "Baixe modelos locais de super-resolução para aumentar imagens em até 4×. Todo o processamento ocorre 100% offline no seu computador.", - "engines.upscaler.search_placeholder": "Pesquisar modelos...", - "engines.upscaler.hardware_gpu": "Aceleração por GPU ativa ({0})", - "engines.upscaler.hardware_cpu": "Modo CPU (modelos leves recomendados)", - "engines.upscaler.recommended_gpu": "GPU dedicada", - "engines.upscaler.recommended_cpu": "CPU e iGPU", - "engines.upscaler.download": "Baixar", - "engines.upscaler.downloading": "Baixando... {0}%", - "engines.upscaler.downloaded": "Baixado", - "engines.upscaler.download_all": "Baixar recomendados", - "engines.upscaler.delete_confirm": "Excluir {0}? Você poderá baixá-lo novamente a qualquer momento.", - "engines.upscaler.delete_failed": "Não foi possível excluir {0}.", - "engines.upscaler.download_failed": "Falha ao baixar {0}.", - "engines.upscaler.no_models": "Nenhum modelo encontrado para sua pesquisa.", "upscale.model": "Modelo", "upscale.scale": "Fator de escala", "upscale.output_format": "Formato de saída", @@ -1522,11 +1507,9 @@ "upscale.resolution_label": "Prévia da resolução", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "Aumentar agora", - "upscale.no_models_installed": "Nenhum modelo baixado. Baixe um modelo primeiro.", "upscale.processing": "Aumentando resolução... {0}%", "upscale.success": "Aumento de resolução concluído com sucesso.", "error.upscale_failed": "Falha no aumento de resolução: {0}", - "engine.reason.needs_models": "Nenhum modelo baixado (ver Configurações → Motores)", "engines.package.upscayl-bin.name": "Upscayl (upscaler de imagem por IA)", "engines.package.upscayl-bin.description": "Upscaling e super-resolução de imagens por IA em até 4× com modelos NCNN locais.\nOs modelos são baixados na primeira vez que são usados.", "error.upscale_needs_engine": "Instale o Upscayl em Configurações → Motores para usar o upscaling por IA.", diff --git a/src/Filee.App/Assets/i18n/pt-PT.json b/src/Filee.App/Assets/i18n/pt-PT.json index baf12e518..0b72a5098 100644 --- a/src/Filee.App/Assets/i18n/pt-PT.json +++ b/src/Filee.App/Assets/i18n/pt-PT.json @@ -1499,22 +1499,7 @@ "preset.upscale.donut": "Super-resolução", "engine.upscaler.name": "Modelos de qualidade de imagem", "engine.upscaler.description": "Melhoramento e super-resolução de imagem com IA até 4× com modelos locais NCNN.", - "engines.upscaler.manage": "Transferir modelos", - "engines.upscaler.modal_title": "Modelos de qualidade de imagem", "engines.upscaler.modal_description": "Transfira modelos locais de super-resolução para aumentar imagens até 4×. Todo o processamento corre 100% offline no seu computador.", - "engines.upscaler.search_placeholder": "Procurar modelos...", - "engines.upscaler.hardware_gpu": "Aceleração por GPU ativa ({0})", - "engines.upscaler.hardware_cpu": "Modo CPU (modelos leves recomendados)", - "engines.upscaler.recommended_gpu": "GPU dedicada", - "engines.upscaler.recommended_cpu": "CPU e iGPU", - "engines.upscaler.download": "Transferir", - "engines.upscaler.downloading": "A transferir... {0}%", - "engines.upscaler.downloaded": "Transferido", - "engines.upscaler.download_all": "Transferir recomendados", - "engines.upscaler.delete_confirm": "Eliminar {0}? Pode voltar a transferi-lo a qualquer momento.", - "engines.upscaler.delete_failed": "Não foi possível eliminar {0}.", - "engines.upscaler.download_failed": "Falha ao transferir {0}.", - "engines.upscaler.no_models": "Nenhum modelo encontrado correspondente à pesquisa.", "upscale.model": "Modelo", "upscale.scale": "Fator de escala", "upscale.output_format": "Formato de saída", @@ -1522,11 +1507,9 @@ "upscale.resolution_label": "Pré-visualização da resolução", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "Aumentar agora", - "upscale.no_models_installed": "Nenhum modelo transferido. Transfira um modelo primeiro.", "upscale.processing": "Aumentar resolução... {0}%", "upscale.success": "Super-resolução concluída com sucesso.", "error.upscale_failed": "Falha no aumento de resolução: {0}", - "engine.reason.needs_models": "Nenhum modelo transferido (ver Definições → Motores)", "engines.package.upscayl-bin.name": "Upscayl (upscaler de imagem por IA)", "engines.package.upscayl-bin.description": "Upscaling e super-resolução de imagens por IA até 4× com modelos NCNN locais.\nOs modelos são descarregados na primeira utilização.", "error.upscale_needs_engine": "Instale o Upscayl em Definições → Motores para usar o upscaling por IA.", diff --git a/src/Filee.App/Assets/i18n/ru.json b/src/Filee.App/Assets/i18n/ru.json index e3f798e50..e3ca9d40d 100644 --- a/src/Filee.App/Assets/i18n/ru.json +++ b/src/Filee.App/Assets/i18n/ru.json @@ -1499,22 +1499,7 @@ "preset.upscale.donut": "Увеличить", "engine.upscaler.name": "Модели улучшения качества", "engine.upscaler.description": "ИИ-увеличение разрешения изображений до 4× с помощью локальных моделей NCNN.", - "engines.upscaler.manage": "Скачать модели", - "engines.upscaler.modal_title": "Модели улучшения качества", "engines.upscaler.modal_description": "Загрузите локальные модели сверхвысокого разрешения для масштабирования изображений до 4×. Обработка на 100% автономна.", - "engines.upscaler.search_placeholder": "Поиск моделей...", - "engines.upscaler.hardware_gpu": "Аппаратное ускорение GPU активно ({0})", - "engines.upscaler.hardware_cpu": "Режим CPU (рекомендуются компактные модели)", - "engines.upscaler.recommended_gpu": "Дискретная видеокарта", - "engines.upscaler.recommended_cpu": "CPU и встроенная графика", - "engines.upscaler.download": "Скачать", - "engines.upscaler.downloading": "Загрузка... {0}%", - "engines.upscaler.downloaded": "Загружено", - "engines.upscaler.download_all": "Скачать рекомендуемые", - "engines.upscaler.delete_confirm": "Удалить {0}? Вы сможете скачать её снова в любое время.", - "engines.upscaler.delete_failed": "Не удалось удалить {0}.", - "engines.upscaler.download_failed": "Ошибка загрузки {0}.", - "engines.upscaler.no_models": "Модели по вашему запросу не найдены.", "upscale.model": "Модель", "upscale.scale": "Масштаб", "upscale.output_format": "Формат вывода", @@ -1522,11 +1507,9 @@ "upscale.resolution_label": "Предпросмотр разрешения", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "Увеличить сейчас", - "upscale.no_models_installed": "Модели не загружены. Сначала загрузите модель.", "upscale.processing": "Увеличение... {0}%", "upscale.success": "Увеличение успешно завершено.", "error.upscale_failed": "Ошибка при увеличении: {0}", - "engine.reason.needs_models": "Модели не загружены (см. Настройки → Движки)", "engines.package.upscayl-bin.name": "Upscayl (ИИ-апскейлер изображений)", "engines.package.upscayl-bin.description": "Апскейлинг и суперразрешение изображений до 4× с помощью локальных моделей NCNN.\nМодели скачиваются при первом использовании.", "error.upscale_needs_engine": "Установите Upscayl в меню Настройки → Движки для использования ИИ-апскейлинга.", diff --git a/src/Filee.App/Assets/i18n/th.json b/src/Filee.App/Assets/i18n/th.json index c6ec53b95..ed1ee3b48 100644 --- a/src/Filee.App/Assets/i18n/th.json +++ b/src/Filee.App/Assets/i18n/th.json @@ -1479,22 +1479,7 @@ "preset.upscale.donut": "ขยายความคมชัด", "engine.upscaler.name": "โมเดลเพิ่มคุณภาพรูปภาพ", "engine.upscaler.description": "การขยายภาพความละเอียดสูงด้วย AI สูงสุด 4 เท่า ด้วยโมเดล NCNN บนเครื่อง", - "engines.upscaler.manage": "ดาวน์โหลดโมเดล", - "engines.upscaler.modal_title": "โมเดลเพิ่มคุณภาพรูปภาพ", "engines.upscaler.modal_description": "ดาวน์โหลดโมเดล AI ขยายความคมชัดของภาพได้สูงสุด 4 เท่า การประมวลผลทำงานแบบออฟไลน์ 100% บนเครื่องของคุณ", - "engines.upscaler.search_placeholder": "ค้นหาโมเดล...", - "engines.upscaler.hardware_gpu": "เปิดใช้งานการเร่งความเร็วด้วย GPU ({0})", - "engines.upscaler.hardware_cpu": "โหมด CPU (แนะนำโมเดลขนาดเล็ก)", - "engines.upscaler.recommended_gpu": "GPU แยก", - "engines.upscaler.recommended_cpu": "CPU และ GPU ในตัว", - "engines.upscaler.download": "ดาวน์โหลด", - "engines.upscaler.downloading": "กำลังดาวน์โหลด... {0}%", - "engines.upscaler.downloaded": "ดาวน์โหลดแล้ว", - "engines.upscaler.download_all": "ดาวน์โหลดโมเดลที่แนะนำ", - "engines.upscaler.delete_confirm": "ลบ {0} หรือไม่? คุณสามารถดาวน์โหลดใหม่ได้ทุกเมื่อ", - "engines.upscaler.delete_failed": "ไม่สามารถลบ {0} ได้", - "engines.upscaler.download_failed": "ดาวน์โหลด {0} ไม่สำเร็จ", - "engines.upscaler.no_models": "ไม่พบโมเดลที่ตรงกับการค้นหา", "upscale.model": "โมเดล", "upscale.scale": "อัตราส่วนการขยาย", "upscale.output_format": "รูปแบบผลลัพธ์", @@ -1502,11 +1487,9 @@ "upscale.resolution_label": "ตัวอย่างความละเอียด", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "ขยายภาพทันที", - "upscale.no_models_installed": "ยังไม่มีโมเดลที่ดาวน์โหลด กรุณาดาวน์โหลดโมเดลก่อน", "upscale.processing": "กำลังขยายภาพ... {0}%", "upscale.success": "เพิ่มความคมชัดเรียบร้อยแล้ว", "error.upscale_failed": "การขยายภาพล้มเหลว: {0}", - "engine.reason.needs_models": "ไม่มีโมเดลที่ดาวน์โหลดไว้ (ดูที่ การตั้งค่า → เอนจิน)", "engines.package.upscayl-bin.name": "Upscayl (เพิ่มความละเอียดภาพด้วย AI)", "engines.package.upscayl-bin.description": "เพิ่มความละเอียดภาพและซูเปอร์เรโซลูชันสูงสุด 4 เท่าด้วยโมเดล NCNN บนเครื่อง\nโมเดลจะดาวน์โหลดเมื่อใช้ครั้งแรก", "error.upscale_needs_engine": "ติดตั้ง Upscayl ในการตั้งค่า → เครื่องมือแปลงไฟล์ เพื่อใช้งานการเพิ่มความละเอียดภาพด้วย AI", diff --git a/src/Filee.App/Assets/i18n/tr.json b/src/Filee.App/Assets/i18n/tr.json index 46dee12e2..d26d60793 100644 --- a/src/Filee.App/Assets/i18n/tr.json +++ b/src/Filee.App/Assets/i18n/tr.json @@ -1477,22 +1477,7 @@ "preset.upscale.donut": "Büyüt ve İyileştir", "engine.upscaler.name": "Görüntü Kalitesi Modelleri", "engine.upscaler.description": "Yerel NCNN modelleriyle 4 kata kadar yapay zeka süper çözünürlük ve görüntü büyütme.", - "engines.upscaler.manage": "Modelleri İndir", - "engines.upscaler.modal_title": "Görüntü Kalitesi Modelleri", "engines.upscaler.modal_description": "Görüntüleri 4 kata kadar büyütmek için yerel yapay zeka modellerini indirin. Tüm işlemler %100 çevrimdışı çalışır.", - "engines.upscaler.search_placeholder": "Model ara...", - "engines.upscaler.hardware_gpu": "GPU Hızlandırma Etkin ({0})", - "engines.upscaler.hardware_cpu": "CPU Modu (Hafif modeller önerilir)", - "engines.upscaler.recommended_gpu": "Harici GPU", - "engines.upscaler.recommended_cpu": "CPU ve Dahili GPU", - "engines.upscaler.download": "İndir", - "engines.upscaler.downloading": "İndiriliyor... %{0}", - "engines.upscaler.downloaded": "İndirildi", - "engines.upscaler.download_all": "Önerilenleri İndir", - "engines.upscaler.delete_confirm": "{0} silinsin mi? İstediğiniz zaman tekrar indirebilirsiniz.", - "engines.upscaler.delete_failed": "{0} silinemedi.", - "engines.upscaler.download_failed": "{0} indirilemedi.", - "engines.upscaler.no_models": "Aramanızla eşleşen model bulunamadı.", "upscale.model": "Model", "upscale.scale": "Ölçek Faktörü", "upscale.output_format": "Çıkış Formatı", @@ -1500,11 +1485,9 @@ "upscale.resolution_label": "Çözünürlük Önizlemesi", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "Şimdi Büyüt", - "upscale.no_models_installed": "İndirilmiş model yok. Lütfen önce bir model indirin.", "upscale.processing": "Büyütülüyor... %{0}", "upscale.success": "Görüntü büyütme başarıyla tamamlandı.", "error.upscale_failed": "Büyütme başarısız: {0}", - "engine.reason.needs_models": "İndirilen model yok (Ayarlar → Motorlar bölümüne bakın)", "engines.package.upscayl-bin.name": "Upscayl (yapay zeka görüntü yükseltici)", "engines.package.upscayl-bin.description": "Yerel NCNN modelleriyle 4 kata kadar yapay zeka görüntü yükseltme ve süper çözünürlük.\nModeller ilk kullanıldıklarında indirilir.", "error.upscale_needs_engine": "Yapay zeka yükseltmesini kullanmak için Ayarlar → Dönüştürme motorları bölümünden Upscayl kurun.", diff --git a/src/Filee.App/Assets/i18n/vi.json b/src/Filee.App/Assets/i18n/vi.json index 7cdafa4c8..c7ae92a90 100644 --- a/src/Filee.App/Assets/i18n/vi.json +++ b/src/Filee.App/Assets/i18n/vi.json @@ -1494,5 +1494,27 @@ "engines.ollama.connecting": "Đang kết nối...", "engines.ollama.complete": "Hoàn tất!", "engines.ollama.failed": "Thất bại:", - "engines.ollama.error": "Lỗi:" + "engines.ollama.error": "Lỗi:", + "preset.upscale": "Nâng cao chất lượng ảnh", + "preset.upscale.donut": "Nâng độ nét", + "engine.upscaler.name": "Mô hình chất lượng hình ảnh", + "engine.upscaler.description": "Nâng độ phân giải ảnh AI lên tới 4× với mô hình NCNN cục bộ.", + "engines.upscaler.modal_description": "Tải các mô hình siêu độ phân giải AI cục bộ để phóng to hình ảnh lên tới 4×. Toàn bộ xử lý chạy 100% ngoại tuyến trên thiết bị của bạn.", + "upscale.model": "Mô hình", + "upscale.scale": "Hệ số tỷ lệ", + "upscale.output_format": "Định dạng đầu ra", + "upscale.format_same": "Cùng định dạng với nguồn ({0})", + "upscale.resolution_label": "Xem trước độ phân giải", + "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", + "upscale.button_start": "Bắt đầu nâng chất lượng", + "upscale.processing": "Đang nâng độ nét... {0}%", + "upscale.success": "Nâng chất lượng ảnh hoàn tất thành công.", + "error.upscale_failed": "Nâng chất lượng ảnh thất bại: {0}", + "engines.package.upscayl-bin.name": "Upscayl (Bộ nâng độ nét ảnh AI)", + "engines.package.upscayl-bin.description": "Nâng độ phân giải ảnh AI lên tới 4× với mô hình NCNN cục bộ.\nMô hình sẽ được tải xuống trong lần đầu tiên sử dụng.", + "error.upscale_needs_engine": "Cài đặt Upscayl trong Cài đặt → Bộ xử lý để sử dụng nâng cấp hình ảnh AI.", + "upscale.model_ready": "Sẵn sàng", + "upscale.model_download_size": "Tải xuống {0} MB", + "upscale.downloading_model": "Đang tải mô hình...", + "engines.model.delete_confirm": "Xóa mô hình {0}? Bạn có thể tải lại bất kỳ lúc nào." } diff --git a/src/Filee.App/Assets/i18n/zh-CN.json b/src/Filee.App/Assets/i18n/zh-CN.json index b339dade7..6a4cba618 100644 --- a/src/Filee.App/Assets/i18n/zh-CN.json +++ b/src/Filee.App/Assets/i18n/zh-CN.json @@ -1499,22 +1499,7 @@ "preset.upscale.donut": "超分辨率放大", "engine.upscaler.name": "画质提升模型", "engine.upscaler.description": "使用本地 NCNN 模型实现最高 4 倍的 AI 图像超分辨率高保真放大。", - "engines.upscaler.manage": "下载模型", - "engines.upscaler.modal_title": "画质提升模型", "engines.upscaler.modal_description": "下载本地 AI 超分辨率模型,将图像最高放大 4 倍。所有处理完全在本地离线进行,不消耗网络流量。", - "engines.upscaler.search_placeholder": "搜索模型...", - "engines.upscaler.hardware_gpu": "已启用 GPU 硬件加速 ({0})", - "engines.upscaler.hardware_cpu": "CPU 模式(建议使用轻量模型)", - "engines.upscaler.recommended_gpu": "独立显卡", - "engines.upscaler.recommended_cpu": "CPU 与核芯显卡", - "engines.upscaler.download": "下载", - "engines.upscaler.downloading": "正在下载... {0}%", - "engines.upscaler.downloaded": "已下载", - "engines.upscaler.download_all": "下载推荐模型", - "engines.upscaler.delete_confirm": "确定要删除 {0} 吗?您可以随时重新下载。", - "engines.upscaler.delete_failed": "无法删除 {0}。", - "engines.upscaler.download_failed": "下载 {0} 失败。", - "engines.upscaler.no_models": "未找到匹配的模型。", "upscale.model": "模型", "upscale.scale": "放大倍率", "upscale.output_format": "输出格式", @@ -1522,11 +1507,9 @@ "upscale.resolution_label": "分辨率预览", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "立即放大", - "upscale.no_models_installed": "尚未下载模型,请先下载一个模型。", "upscale.processing": "正在放大... {0}%", "upscale.success": "画质提升放大已完成。", "error.upscale_failed": "画质提升失败:{0}", - "engine.reason.needs_models": "尚未下载模型(查看设置 → 引擎)", "engines.package.upscayl-bin.name": "Upscayl(AI 图像超分辨率放大)", "engines.package.upscayl-bin.description": "使用本地 NCNN 模型实现最高 4 倍的 AI 图像放大与超分辨率。\n模型在首次使用时下载。", "error.upscale_needs_engine": "请在“设置 → 转换引擎”中安装 Upscayl 以使用 AI 放大功能。", diff --git a/src/Filee.App/Assets/i18n/zh-TW.json b/src/Filee.App/Assets/i18n/zh-TW.json index df7ec39e1..68afd9c8a 100644 --- a/src/Filee.App/Assets/i18n/zh-TW.json +++ b/src/Filee.App/Assets/i18n/zh-TW.json @@ -1499,22 +1499,7 @@ "preset.upscale.donut": "超解析度放大", "engine.upscaler.name": "畫質提升模型", "engine.upscaler.description": "使用本機 NCNN 模型實現最高 4 倍的 AI 圖像超解析度高保真放大。", - "engines.upscaler.manage": "下載模型", - "engines.upscaler.modal_title": "畫質提升模型", "engines.upscaler.modal_description": "下載本機 AI 超解析度模型,將圖像最高放大 4 倍。所有處理完全在本機離線進行,確保隱私安全。", - "engines.upscaler.search_placeholder": "搜尋模型...", - "engines.upscaler.hardware_gpu": "已啟用 GPU 硬體加速 ({0})", - "engines.upscaler.hardware_cpu": "CPU 模式(建議使用輕量模型)", - "engines.upscaler.recommended_gpu": "獨立顯示卡", - "engines.upscaler.recommended_cpu": "CPU 與內建顯示卡", - "engines.upscaler.download": "下載", - "engines.upscaler.downloading": "正在下載... {0}%", - "engines.upscaler.downloaded": "已下載", - "engines.upscaler.download_all": "下載推薦模型", - "engines.upscaler.delete_confirm": "確定要刪除 {0} 嗎?您可以隨時重新下載。", - "engines.upscaler.delete_failed": "無法刪除 {0}。", - "engines.upscaler.download_failed": "下載 {0} 失敗。", - "engines.upscaler.no_models": "找不到相符的模型。", "upscale.model": "模型", "upscale.scale": "放大倍率", "upscale.output_format": "輸出格式", @@ -1522,11 +1507,9 @@ "upscale.resolution_label": "解析度預覽", "upscale.resolution_preview": "{0} × {1} px ➜ {2} × {3} px ({4}×)", "upscale.button_start": "立即放大", - "upscale.no_models_installed": "尚未下載模型,請先下載一個模型。", "upscale.processing": "正在放大... {0}%", "upscale.success": "畫質提升放大已完成。", "error.upscale_failed": "畫質提升失敗:{0}", - "engine.reason.needs_models": "尚未下載模型(查看設定 → 引擎)", "engines.package.upscayl-bin.name": "Upscayl(AI 影像超解析度放大)", "engines.package.upscayl-bin.description": "使用本機 NCNN 模型提供最高 4 倍的 AI 影像放大與超解析度。\n模型在第一次使用時下載。", "error.upscale_needs_engine": "請在「設定 → 轉換引擎」中安裝 Upscayl 以使用 AI 放大功能。", diff --git a/src/Filee.App/Services/WindowService.cs b/src/Filee.App/Services/WindowService.cs index a46ecdbf4..19e021d98 100644 --- a/src/Filee.App/Services/WindowService.cs +++ b/src/Filee.App/Services/WindowService.cs @@ -250,17 +250,24 @@ public void ShowUpscaleWindow(IReadOnlyList files, Preset preset, PixelP var pictures = files.Where(f => FormatRegistry.Detect(f) is { } format && UpscaleTool.CanUpscale(format.Id)).ToList(); if (pictures.Count == 0) return; + if (_upscaleWindow is { DataContext: IDisposable oldVm }) + { + oldVm.Dispose(); + } _upscaleWindow?.Close(); var store = services.GetRequiredService(); - + var conversions = services.GetRequiredService(); var log = services.GetService>(); - var vm = new UpscaleViewModel(pictures, preset, loc, store, PictureSize, log); + var vm = new UpscaleViewModel(pictures, preset, loc, store, PictureSize, + (files, conversion) => conversions.Start(files, conversion), log); var win = new UpscaleWindow { DataContext = vm }; PrepareWindow(win); win.Closed += (_, _) => { if (_upscaleWindow == win) _upscaleWindow = null; + vm.Dispose(); + trimmer.Request(); }; _upscaleWindow = win; win.Show(); diff --git a/src/Filee.App/ViewModels/UpscaleViewModel.cs b/src/Filee.App/ViewModels/UpscaleViewModel.cs index 91ab3972f..ad6ff0ae7 100644 --- a/src/Filee.App/ViewModels/UpscaleViewModel.cs +++ b/src/Filee.App/ViewModels/UpscaleViewModel.cs @@ -1,12 +1,11 @@ // ViewModel for the "Upscale Quality" tool window. using System.Collections.ObjectModel; -using System.Diagnostics; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; -using Filee.App.Services; using Filee.Core.Conversion; +using Filee.Core.Formats; using Filee.Core.Localization; using Filee.Core.Presets; using Filee.Core.Settings; @@ -21,8 +20,8 @@ public sealed partial class UpscaleViewModel : ObservableObject, IDisposable private readonly ILocalizer _loc; private readonly UserDataStore _store; private readonly Func _pictureSize; + private readonly Action, Preset> _start; private readonly ILogger? _log; - private readonly UpscalerEngine _engine; private CancellationTokenSource? _cts; public IReadOnlyList Pictures { get; } @@ -58,9 +57,6 @@ public sealed partial class UpscaleViewModel : ObservableObject, IDisposable [ObservableProperty] private bool _isCompleted; - [ObservableProperty] - private string? _lastOutputFile; - [ObservableProperty] private string _statusMessage = ""; @@ -102,6 +98,7 @@ public UpscaleViewModel( ILocalizer loc, UserDataStore store, Func pictureSize, + Action, Preset> start, ILogger? log = null) { Pictures = pictures; @@ -109,8 +106,8 @@ public UpscaleViewModel( _loc = loc; _store = store; _pictureSize = pictureSize; + _start = start; _log = log; - _engine = new UpscalerEngine(log as ILogger); Heading = pictures.Count == 1 ? Path.GetFileName(pictures[0]) @@ -122,7 +119,7 @@ public UpscaleViewModel( _initialDimensions = _pictureSize(pictures[0]); } - Scale = tool.Upscale.Scale > 0 ? Math.Clamp(tool.Upscale.Scale, 1, 4) : 4; + Scale = tool.Upscale.Scale >= 2 ? Math.Clamp(tool.Upscale.Scale, 2, 4) : 4; InitTargets(); RefreshModels(); @@ -131,8 +128,8 @@ public UpscaleViewModel( private void InitTargets() { Targets.Clear(); - var firstExt = Pictures.Count > 0 ? Path.GetExtension(Pictures[0]).TrimStart('.').ToLowerInvariant() : "png"; - Targets.Add(new("*", _loc.Format("upscale.format_same", firstExt))); + var firstFormatId = Pictures.Count > 0 ? (FormatRegistry.Detect(Pictures[0])?.Id ?? "png") : "png"; + Targets.Add(new("*", _loc.Format("upscale.format_same", firstFormatId))); Targets.Add(new("png", "PNG (.png)")); Targets.Add(new("jpg", "JPEG (.jpg)")); Targets.Add(new("webp", "WebP (.webp)")); @@ -185,66 +182,37 @@ public async Task StartUpscaleAsync() StatusMessage = ""; ProgressValue = 0; + _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; var chosenTarget = Target.Value; var model = SelectedModel; - var currentScale = Scale; - var total = Pictures.Count; - - var workFolder = Path.Combine(JobQueue.DefaultWorkRoot, "upscale-" + Guid.NewGuid().ToString("N")[..8]); + var currentScale = Math.Clamp(Scale, 2, 4); try { if (!UpscaleModels.IsInstalled(model.Id)) { ProgressText = _loc["upscale.downloading_model"]; - await UpscaleModels.EnsureAsync(model.Id, progress: null, token); - NotifyModelStatusChanged(); - } - - Directory.CreateDirectory(workFolder); - - for (var i = 0; i < total; i++) - { - token.ThrowIfCancellationRequested(); - var itemIndex = i; - var sourcePath = Pictures[i]; - var sourceExt = Path.GetExtension(sourcePath).TrimStart('.').ToLowerInvariant(); - var targetExt = chosenTarget == "*" ? sourceExt : chosenTarget; - - var tokens = new OutputPathResolver.Tokens(sourcePath, _tool.NameKey ?? "upscale", itemIndex + 1, DateTime.Now); - var resolvedOutput = OutputPathResolver.Resolve(_tool.Output, tokens, targetExt, File.Exists); - if (resolvedOutput is null) - continue; - - var progress = new Progress(p => + var progress = new Progress(p => { Dispatcher.UIThread.Post(() => { - var overall = (itemIndex + p) / total; - ProgressValue = Math.Clamp(overall * 100.0, 0, 100); - var currentPct = (int)Math.Clamp(p * 100.0, 0, 100); - ProgressText = total > 1 - ? $"({itemIndex + 1}/{total}) {_loc.Format("upscale.processing", currentPct)}" - : _loc.Format("upscale.processing", currentPct); + var pct = (int)Math.Clamp(p.Fraction * 100.0, 0, 100); + ProgressValue = pct; + ProgressText = $"{_loc["upscale.downloading_model"]} ({pct}%)"; }); }); + await UpscaleModels.EnsureAsync(model.Id, progress, token); + NotifyModelStatusChanged(); + } + + Remember(model.Id, currentScale); - await _engine.UpscaleAsync( - sourcePath, - resolvedOutput, - sourceExt, - targetExt, - model.Id, - currentScale, - workFolder, - _tool, - progress, - token); - - LastOutputFile = resolvedOutput; + foreach (var group in Pictures.GroupBy(path => UpscaleTool.TargetFor(FormatRegistry.Detect(path)?.Id ?? "", chosenTarget))) + { + _start([.. group], UpscaleTool.ConversionOf(_tool, group.Key, model.Id, currentScale)); } ProgressValue = 100; @@ -264,19 +232,26 @@ await _engine.UpscaleAsync( } finally { + IsProcessing = false; + } + } + + private void Remember(string modelId, int scale) + { + _tool.Upscale.Model = modelId; + _tool.Upscale.Scale = scale; + if (_store.FindPreset(_tool.Id) is { IsUpscaleTool: true } saved) + { + saved.Upscale.Model = modelId; + saved.Upscale.Scale = scale; try { - if (Directory.Exists(workFolder)) - Directory.Delete(workFolder, recursive: true); + _store.SaveLibrary(); } - catch + catch (Exception ex) { - // Swept by JobQueue.DeleteStaleWorkFolders + _log?.LogWarning(ex, "Could not save upscale tool settings"); } - - IsProcessing = false; - _cts?.Dispose(); - _cts = null; } } @@ -289,38 +264,10 @@ public void Cancel() } } - [RelayCommand] - public void OpenOutputFolder() - { - if (string.IsNullOrEmpty(LastOutputFile) || !File.Exists(LastOutputFile)) - return; - - try - { - if (OperatingSystem.IsWindows()) - { - Process.Start("explorer.exe", $"/select,\"{LastOutputFile}\""); - } - else if (OperatingSystem.IsMacOS()) - { - Process.Start("open", $"-R \"{LastOutputFile}\""); - } - else - { - var dir = Path.GetDirectoryName(LastOutputFile); - if (!string.IsNullOrEmpty(dir)) - Process.Start("xdg-open", $"\"{dir}\""); - } - } - catch (Exception ex) - { - _log?.LogWarning(ex, "Failed to reveal output file"); - } - } - public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); + _cts = null; } } diff --git a/src/Filee.App/Views/UpscaleWindow.axaml b/src/Filee.App/Views/UpscaleWindow.axaml index 7b2bfbd3b..07745608f 100644 --- a/src/Filee.App/Views/UpscaleWindow.axaml +++ b/src/Filee.App/Views/UpscaleWindow.axaml @@ -9,6 +9,9 @@ Icon="avares://Filee/Assets/Icons/filee.ico" Width="540" SizeToContent="Height" MinWidth="460" CanResize="False" WindowStartupLocation="CenterScreen"> + + M9,3V4H4V6H5V19A2,2 0 0,0 7,21H17A2,2 0 0,0 19,19V6H20V4H15V3H9M7,6H17V19H7V6M9,8V17H11V8H9M13,8V17H15V8H13Z + - - - - - - + + + + @@ -87,7 +89,7 @@ - @@ -102,23 +104,19 @@ - - -