diff --git a/CHANGELOG.md b/CHANGELOG.md index 7df2bd6..e278247 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,23 @@ QPyPack 项目的所有重要变更都将记录在此文件中。 --- +# 更新日志 (Changelog) + +--- + +## [2.7.4] - 2026-08-05 + +#### 新增 +- **打包模式选择**:支持切换「兼容模式」与「精简模式」,兼容模式减少打包出错,精简模式打包后体积更小,构建失败时自动提供重试提示。 +- **保留虚拟环境**:支持生成并复用项目本地虚拟环境,不用每次新建环境,大幅提升同一项目的建构速度。 + +#### 改进 +- **Nuitka 策略优化**:精简模式下动态优化 `playwright`、`ttkbootstrap` 等框架的打包参数,进一步缩小产物体积。 +- **右键菜单优化**:动态加载 Qt 系统翻译包,完善原生右键菜单与对话框的多语言体验,修复右键菜单底色为黑色的BUG(用了一下午才修复好==!)。 +- **UI与视觉统一**:显式配置 Fusion 浅色主题 Palette,统一全局右键菜单样式,优化预设按钮布局与页面边距。 +- **AST 依赖扫描**:扫描路径自动排除虚拟打包目录,统一包名小写判重匹配。 +- **细节修复**:修复提示音开关响应逻辑;支持子进程独立环境变量设置;加强表格空指针安全校验;更新部分翻译;修复多个细小bug。 + ## [2.7.3] - 2026-08-04 #### 新增 diff --git a/CHANGELOG_EN.md b/CHANGELOG_EN.md index fae2636..ef6e65b 100644 --- a/CHANGELOG_EN.md +++ b/CHANGELOG_EN.md @@ -9,6 +9,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [2.7.4] - 2026-08-05 + +#### Added +- **Packaging Mode Selection**: Supports switching between "Compatibility Mode" and "Lite Mode". Compatibility Mode minimizes build errors, while Lite Mode produces smaller output sizes and provides automated retry tips upon build failures. +- **Keep Virtual Environment**: Supports generating and reusing local virtual environments per project without recreating them every time, significantly accelerating rebuilds. + +#### Improved +- **Nuitka Strategy Optimization**: Dynamically optimizes packaging parameters for frameworks like `playwright` and `ttkbootstrap` in Lite Mode to further shrink output size. +- **Context Menu Enhancement**: Dynamically loads Qt system translation packages for improved multilingual native context menus and dialogs, and fixed a bug where the context menu background rendered in black (took an entire afternoon to fix==!). +- **UI & Visual Consistency**: Explicitly configured the Fusion light theme Palette, unified global context menu styling, and optimized preset button layouts and page margins. +- **AST Dependency Scanning**: Scanning paths now automatically exclude virtual packaging directories, and package name comparisons are standardized to lowercase. +- **Bug Fixes & Tweaks**: Fixed audio alert toggle logic; added support for independent subprocess environment variables; strengthened null-pointer checks in tables; updated translations and fixed multiple minor bugs. + ## [2.7.3] - 2026-08-04 #### Added diff --git a/QUICKSTART.md b/QUICKSTART.md new file mode 100644 index 0000000..2b1ed36 --- /dev/null +++ b/QUICKSTART.md @@ -0,0 +1,90 @@ +# ⚡ QPyPack 快速入门指南 (Quick Start Guide) + +欢迎使用 **QPyPack**!本指南将带你在 3 分钟内掌握 QPyPack 的核心功能与打包流程,轻松将 Python 脚本转换为可独立运行的原生可执行程序 (`.exe` / macOS App / Linux 二进制)。 + +--- + +## 📥 第一步:安装与启动 QPyPack + +你可以根据使用习惯选择以下任意一种方式启动 QPyPack: + +### 方式 A:通过 `pip` 安装(推荐开发者使用) + +在已配置 Python (>= 3.8) 的终端中执行: + +```bash +# 安装 QPyPack +pip install qpypack + +# 在命令行直接启动 GUI 界面 +qpypack +``` + +### 方式 B:使用预编译独立免安装版(适合无 Python 环境用户) + +前往 [GitHub Releases](https://github.com/Qwejay/QPyPack/releases) 下载对应系统的可执行文件: +* **Windows**: 下载 `QPyPack.exe` 双击即可运行。 +* **macOS / Linux**: 下载对应的预编译应用程序或可执行文件。 + +--- + +## 🎯 第二步:标准打包 5 步曲 + +启动 QPyPack 后,整体打包过程仅需简单点击几下: + +``` + [1. 拖入源码] ➔ [2. 选择引擎与模式] ➔ [3. 依赖与环境] ➔ [4. 点击构建] ➔ [5. 获取产物] +``` + +### 1. 拖入 Python 源码 +* 将你的主入口文件(如 `main.py` 或 `app.pyw`)**直接拖拽**到主界面的虚线拖拽区域内。 +* 软件将自动解析程序名称、自动比对脚本图标,并初始化工作空间。 + +### 2. 选择打包引擎与模式 +切换到 **「构建设置」** 面板: +* **构建引擎 (Engine)**: + * **PyInstaller**:打包速度极快,零配置,适合快速交付与常规应用。 + * **Nuitka**:将 Python 编译为 C/C++ 二进制,体积更小、运行更快且具有极强的抗反编译保护(无需手动配置 C 编译器,QPyPack 会自动托管)。 +* **打包模式 (Packaging Mode)**: + * **单文件 (`--onefile`)**:生成单个 `.exe` / 可执行文件,干净便携。 + * **精简模式 (Lite Mode)**:动态排除开发/测试等冗余依赖,有效缩减产物体积(若失败可随时切回兼容模式)。 + +### 3. 配置 Python 环境与依赖 +* **Python 解释器**:软件会自动检测系统默认 Python。若本地未安装 Python,可点击「查看 Python」一键自动下载并配置环境。 +* **虚拟环境 (推荐勾选)**:勾选「使用虚拟环境」可隔离本地污染;勾选「保留虚拟环境」可在多次重新打包时复用 `.qpypack_venv`,极大缩短后续构建时间。 +* **依赖扫描**:勾选「分析依赖 (原生 AST)」,QPyPack 会静态扫描源码中的隐式 `import`,彻底解决运行时 `ModuleNotFoundError`。 + +### 4. 开始构建 +* 点击底部的 **「开始构建」** 按钮。 +* 可以在界面下方的 **「执行日誌」** 查看实时编译状态,支持切换「精简模式/详细模式」。 + +### 5. 获取打包产物 +* 构建成功后,点击 **「打开目录」** 即可直接跳转到生成的应用程序目录。 + +--- + +## 💡 典型应用场景配置推荐 + +| 场景需求 | 推荐引擎 | 打包模式 | 关键设置 | +| :--- | :--- | :--- | :--- | +| **日常小工具 / 快速脚本** | PyInstaller | 单文件 (`--onefile`) + 精简模式 | 自动提取图标 | +| **商业软件 / 防反编译源码** | Nuitka | 单文件 (`--onefile`) + 兼容模式 | 使用虚拟环境 + 保留虚拟环境 | +| **大型 GUI 框架 (PySide/PyQt)** | PyInstaller / Nuitka | 文件夹 (`--onedir`) | 勾选「分析依赖 (原生 AST)」 | +| **Playwright / 爬虫自动化** | PyInstaller | 单文件 (`--onefile`) | 自动拦截 Playwright 浏览器依赖 | + +--- + +## ❓ 常见问题排查 (FAQ) + +### Q1: 打包完成后运行报错 `ModuleNotFoundError`? +* **解决方法**:前往【构建设置】->【依赖管理】,勾选 **「分析依赖 (原生 AST)」** 或 **「扫描整个文件夹」**;也可在「隐式导入 (hidden-imports)」中手动填入缺失的包名(如 `pandas, PIL`)。 + +### Q2: 精简模式 (Lite Mode) 构建失败怎么办? +* **解决方法**:精简模式会剔除不常用的动态依赖。如果构建失败,请在【构建设置】中将打包模式切回 **「兼容模式 (Compatibility Mode)」** 重新构建即可。 + +### Q3: 使用 Nuitka 引擎提示缺少 C 编译器? +* **解决方法**:不用担心!QPyPack 内置编译器智能托管,未检测到 MSVC 或 GCC 时会自动为你下载并配置 MinGW-w64 编译器工具链,全程无需手动干预。 + +--- + +📖 **需要更详细的配置与高级优化说明?** 请参阅完整版 [README.md](README.md)。 diff --git a/README.md b/README.md index 3f8381e..7c87149 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,9 @@ QPyPack 是一款现代化的跨平台 Python 打包工具。它深度整合 **P ## ⚡ 快速上手 (Quick Start) -### 方法一:通过 pip 安装并运行 +> 💡 **新手初次使用?** 建议阅读 3 分钟 [**📖 快速入门指南 (QUICKSTART.md)**](QUICKSTART.md) 了解完整的图文打包流程与常见场景配置推荐。 + +### 方法一:通过 pip 安装并运行 (推荐) 在 Python >= 3.8 的环境中,执行以下命令进行安装与启动: @@ -133,7 +135,7 @@ qpypack QPyPack 是一款完全开源且免费的项目,由作者利用业余时间开发与维护。如果本项目帮助您提高了开发效率或解决了打包难题,欢迎通过以下方式对项目进行**自愿赞助**。您的支持将是本项目持续更新的重要动力: -- ⚡ **请作者喝咖啡**:[赞助支持 QPyPack](https://www.ifdian.net/a/qwejay)(支持微信 / 支付宝) +- ⚡ **请作者喝奶茶*:[赞助支持 QPyPack](https://www.ifdian.net/a/qwejay)(支持微信 / 支付宝) > **赞助说明**:赞助完全出于自愿,属于对开源项目的无偿鼓励,不包含任何商业服务绑定或特定功能开发承诺。非常感谢每一位支持开源创作的朋友! @@ -147,4 +149,4 @@ QPyPack 是一款完全开源且免费的项目,由作者利用业余时间开 > **关于打包产物的版权**: > 使用 QPyPack 构建生成的二进制文件/应用程序,其版权和开源许可**完全由使用者自行决定**,QPyPack 的 GPL-3.0 协议不会约束或影响用户打包后的程序。 -Copyright (C) 2026 QwejayHuang. +

Copyright (C) 2026 QwejayHuang.

\ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index db6b2e4..2d3033d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "qpypack" -version = "2.7.3" +version = "2.7.4" description = "A cross-platform GUI packaging and compilation suite based on PyInstaller and Nuitka." readme = "README_EN.md" authors = [ diff --git a/qpypack/locales/de_DE.json b/qpypack/locales/de_DE.json index edc26f1..78595be 100644 --- a/qpypack/locales/de_DE.json +++ b/qpypack/locales/de_DE.json @@ -51,10 +51,10 @@ "Remove Selected": "Auswahl entfernen", "Clear All": "Alles leeren", "Add Mapping": "Zuordnung hinzufügen", - "Restore Defaults": "Wiederherstellen", + "Restore Defaults": "Standardwerte wiederherstellen", "Export Preset...": "Voreinstellung exportieren...", "Import Preset...": "Voreinstellung importieren...", - "Reset to Default Config": "Auf Standardkonfiguration zurücksetzen", + "Reset to Default Config": "Auf Standardeinstellungen zurücksetzen", "Cancel & Return": "Abbrechen & Zurück", "Cancel": "Abbrechen", "Configure Build Settings": "Build-Parameter konfigurieren", @@ -109,12 +109,12 @@ "Target relative path:": "Relativer Zielpfad:", "Import name (e.g. cv2):": "Importname (z.B. cv2):", "PyPI package name for [{imp_name}]:": "PyPI-Paketname für [{imp_name}]:", - "One-File Mode (--onefile)": "Einzeldatei-Modus (--onefile)", - "Folder Mode (--onedir)": "Ordner-Modus (--onedir)", + "One-File Mode (--onefile)": "Einzeldatei (--onefile)", + "Folder Mode (--onedir)": "Ordner (--onedir)", "Contents Directory (--contents-directory):": "Inhaltsverzeichnis (--contents-directory):", "Internal directory name for dependencies (default: _internal)": "Interner Verzeichnisname für Abhängigkeiten (Standard: _internal)", "Hide Console (--noconsole)": "Konsole ausblenden (--noconsole)", - "Use Virtual Environment (Recommended)": "Isolierte virtuelle Umgebung nutzen", + "Use Virtual Environment (Recommended)": "Virtuelle Umgebung nutzen (Empfohlen)", "Install requirements.txt": "requirements.txt installieren", "Analyze Dependencies (AST)": "Abhängigkeiten analysieren (AST)", "Scan Entire Folder": "Gesamten Ordner scannen", @@ -123,7 +123,7 @@ "Concise Log Output": "Kompakte Protokollausgabe", "Auto-save Build Log": "Build-Protokoll automatisch speichern", "Auto Extract Icon": "Anwendungssymbol automatisch extrahieren", - "Clean Temporary Cache After Build": "Temporären Cache nach dem Build leeren", + "Clean Temporary Cache After Build": "Temporären Cache nach dem Build bereinigen", "Sound Notification": "Benachrichtigungston bei Fertigstellung", "Leave blank to auto-detect system default Python": "Leer lassen für automatische Erkennung", "Leave blank to auto-match script name": "Leer lassen, um automatisch den Skriptnamen zu verwenden", @@ -132,7 +132,7 @@ "Comma separated (e.g. tkinter, matplotlib)": "Durch Kommas getrennt (z.B. tkinter, matplotlib)", "Leave blank to auto-detect from environment variables": "Leer lassen für automatische Erkennung aus Variablen", "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "Schließt überflüssige Abhängigkeiten aus, um Dateigröße zu reduzieren.", - "Double-click to edit target path; Drag & drop supported": "Doppelklick zum Bearbeiten; Drag & Drop unterstützt", + "Double-click to edit target path; Drag & Drop supported": "Doppelklick zum Bearbeiten; Drag & Drop unterstützt", "Double-click to edit target path; Drag & drop supported. Use 'Export Preset' to save for reuse.": "Doppelklick zum Bearbeiten; Drag & Drop unterstützt. Nutzen Sie 'Voreinstellung exportieren' zum Speichern.", "PyInstaller — Bundles Python interpreter and bytecode. Fast build speed, zero configuration (no C compiler needed), and excellent compatibility.": "PyInstaller — Schnelle Erstellung, hervorragende Kompatibilität. Keine C-Compiler benötigt.", "Nuitka — Compiles source code into native C/C++ binary. Produces smaller package size, faster execution, and deep anti-decompilation protection (requires C compiler).": "Nuitka — Kompiliert in eine native C/C++ Binärdatei. Bessere Leistung und Schutz des Quellcodes.", @@ -241,7 +241,7 @@ "Python Environment Management": "Python-Umgebungsverwaltung", "Python Environment Required
Application build depends on a Python interpreter.
Please select a version to automatically download, install, and configure environment variables.
": "Python-Umgebung erforderlich
Der Build benötigt einen Python-Interpreter.
Wählen Sie eine Version zum automatischen Download, Installation und Konfiguration der Umgebungsvariablen.
", "Python Environment Management
Supports switching locally detected Python environments or downloading new versions.": "Python-Umgebungsverwaltung
Unterstützt das Wechseln von lokal erkannten Python-Umgebungen oder das Herunterladen neuer Versionen.", - "💡 Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "💡 Empfehlung: Python 3.11.9 wird für optimale Build-Kompatibilität und Engine-Unterstützung empfohlen.", + "Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "Empfehlung: Python 3.11.9 wird für optimale Build-Kompatibilität und Engine-Unterstützung empfohlen.", "View Python": "Python anzeigen", "Locally Detected Pythons": "Lokal erkannte Pythons", "Download New Version": "Neue Version herunterladen", @@ -259,8 +259,8 @@ "Later": "Später", "Python Environment Installed Successfully!

System environment variables updated. Recommended to exit and restart the software to apply changes.": "Python-Umgebung erfolgreich installiert!

Systemumgebungsvariablen aktualisiert. Ein Neustart der Software wird empfohlen.", "Python installed. Please restart QPyPack manually later.": "Python installiert. Bitte starten Sie QPyPack später manuell neu.", - "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\n💡 Tip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[Syntaxfehler] Quellcode-Syntaxanalyse fehlgeschlagen, Build abgebrochen:\n - Datei: {file}\n - Zeile: Zeile {line}\n - Detail: {desc}\n\n💡 Tipp: Dies ist normalerweise KEIN Fehler des Tools.\nStellen Sie sicher, dass die ausgewählte Python-Version mit der Version übereinstimmt, die Sie zum Schreiben des Codes verwendet haben.\nDie Verwendung neuerer Syntax in einer älteren Python-Umgebung löst diesen Fehler aus.\nWir empfehlen, zu [Build-Einstellungen] -> [Engine] zu gehen, um zur richtigen Python-Version zu wechseln.", - "[FAILED] Build interrupted exceptionally!\n\n🔍 Common Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] Build fehlerhaft abgebrochen!\n\n🔍 Häufige Fehlerursachen:\n1. Versionskonflikt (Sehr häufig): Die gewählte Python-Version ist inkompatibel mit dem Quellcode. Wechseln Sie unter [Build-Einstellungen] zur richtigen Version.\n2. Fehlende Abhängigkeiten: Schalten Sie oben auf 'Detaillierter Modus', um nach ModuleNotFoundError zu suchen.\n3. Antivirus-Blockierung: Stellen Sie sicher, dass Ihr Antivirenprogramm den Prozess nicht blockiert.\n\n(Hinweis: Dies liegt meist an Umgebungsunterschieden und nicht an der Engine selbst. Prüfen Sie das Protokoll.)", + "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\nTip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[Syntaxfehler] Quellcode-Syntaxanalyse fehlgeschlagen, Build abgebrochen:\n - Datei: {file}\n - Zeile: Zeile {line}\n - Detail: {desc}\n\nTipp: Dies ist normalerweise KEIN Fehler des Tools.\nStellen Sie sicher, dass die ausgewählte Python-Version mit der Version übereinstimmt, die Sie zum Schreiben des Codes verwendet haben.\nDie Verwendung neuerer Syntax in einer älteren Python-Umgebung löst diesen Fehler aus.\nWir empfehlen, zu [Build-Einstellungen] -> [Engine] zu gehen, um zur richtigen Python-Version zu wechseln.", + "[FAILED] Build interrupted exceptionally!\n\nCommon Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] Build fehlerhaft abgebrochen!\n\nHäufige Fehlerursachen:\n1. Versionskonflikt (Sehr häufig): Die gewählte Python-Version ist inkompatibel mit dem Quellcode. Wechseln Sie unter [Build-Einstellungen] zur richtigen Version.\n2. Fehlende Abhängigkeiten: Schalten Sie oben auf 'Detaillierter Modus', um nach ModuleNotFoundError zu suchen.\n3. Antivirus-Blockierung: Stellen Sie sicher, dass Ihr Antivirenprogramm den Prozess nicht blockiert.\n\n(Hinweis: Dies liegt meist an Umgebungsunterschieden und nicht an der Engine selbst. Prüfen Sie das Protokoll.)", "Status: Build Cancelled": "Status: Build abgebrochen", "Build Cancelled": "Build abgebrochen", "[WARN] Package '{pkg}' failed to install, skipping...": "[WARN] Paket '{pkg}' konnte nicht installiert werden, überspringe...", @@ -283,5 +283,13 @@ "[WARN] Icon conversion to .icns failed, building without icon.": "[WARN] Die Icon-Konvertierung in .icns ist fehlgeschlagen, Build ohne Icon.", "OK": "OK", "Unknown": "Unbekannt", - "Script and settings retained. Ready to rebuild.": "Skript und Einstellungen beibehalten. Bereit zum erneuten Bauen." -} + "Script and settings retained. Ready to rebuild.": "Skript und Einstellungen beibehalten. Bereit zum erneuten Bauen.", + "Packaging Mode:": "Paketierungsmodus:", + "Compatibility Mode (Default)": "Kompatibilitätsmodus (Standard)", + "Lite Mode (Smaller size)": "Lite-Modus (Kleinere Größe)", + "Maximum compatibility. Recommended for apps with complex dynamic imports.": "Maximale Kompatibilität. Empfohlen für Apps mit komplexen dynamischen Importen.", + "Smaller output size. Recommended for 95% of standard apps.": "Kleinere Ausgabegröße. Empfohlen für 95 % der Standard-Apps.", + "Tip: Build failed in Lite Mode. You can try switching to [Compatibility Mode] in Build Settings and rebuild.": "Tipp: Erstellung im Lite-Modus fehlgeschlagen. Versuchen Sie in den [Buildeinstellungen] auf [Kompatibilitätsmodus] zu wechseln.", + "Keep Virtual Environment (Faster Rebuilds)": "Virtuelle Umgebung behalten (Schnellere Rebuilds)", + "[INFO] Reusing existing virtual environment...": "[INFO] Bestehende virtuelle Umgebung wird wiederverwendet..." +} \ No newline at end of file diff --git a/qpypack/locales/es_ES.json b/qpypack/locales/es_ES.json index 8cb359a..7f23ecb 100644 --- a/qpypack/locales/es_ES.json +++ b/qpypack/locales/es_ES.json @@ -50,7 +50,7 @@ "Remove Selected": "Eliminar selección", "Clear All": "Limpiar todo", "Add Mapping": "Añadir mapeo", - "Restore Defaults": "Restaurar", + "Restore Defaults": "Restaurar valores predeterminados", "Export Preset...": "Exportar ajustes...", "Import Preset...": "Importar ajustes...", "Reset to Default Config": "Restablecer configuración predeterminada", @@ -108,12 +108,12 @@ "Target relative path:": "Ruta relativa de destino:", "Import name (e.g. cv2):": "Nombre de importación (ej. cv2):", "PyPI package name for [{imp_name}]:": "Nombre de paquete PyPI para [{imp_name}]:", - "One-File Mode (--onefile)": "Modo de archivo único (--onefile)", - "Folder Mode (--onedir)": "Modo carpeta (--onedir)", + "One-File Mode (--onefile)": "Archivo único (--onefile)", + "Folder Mode (--onedir)": "Carpeta (--onedir)", "Contents Directory (--contents-directory):": "Directorio de contenido (--contents-directory):", "Internal directory name for dependencies (default: _internal)": "Nombre del directorio interno para dependencias (predeterminado: _internal)", "Hide Console (--noconsole)": "Ocultar consola (--noconsole)", - "Use Virtual Environment (Recommended)": "Usar entorno virtual (Recomendado)", + "Use Virtual Environment (Recommended)": "Entorno virtual (Recomendado)", "Install requirements.txt": "Instalar requirements.txt", "Analyze Dependencies (AST)": "Analizar dependencias (AST)", "Scan Entire Folder": "Escanear toda la carpeta", @@ -122,7 +122,7 @@ "Concise Log Output": "Salida de registro concisa", "Auto-save Build Log": "Guardar registro automáticamente", "Auto Extract Icon": "Extraer icono automáticamente", - "Clean Temporary Cache After Build": "Limpiar caché temporal al finalizar", + "Clean Temporary Cache After Build": "Limpiar caché temporal tras la compilación", "Sound Notification": "Notificación sonora al finalizar", "Leave blank to auto-detect system default Python": "Dejar en blanco para detectar automáticamente el intérprete", "Leave blank to auto-match script name": "Dejar en blanco para usar automáticamente el nombre del script", @@ -248,7 +248,7 @@ "Python Environment Management": "Gestión de entorno Python", "Python Environment Required
Application build depends on a Python interpreter.
Please select a version to automatically download, install, and configure environment variables.
": "Entorno Python requerido
La compilación depende de un intérprete de Python.
Seleccione una versión para descargar, instalar y configurar las variables de entorno automáticamente.
", "Python Environment Management
Supports switching locally detected Python environments or downloading new versions.": "Gestión de entorno Python
Admite el cambio de entornos de Python detectados localmente o la descarga de nuevas versiones.", - "💡 Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "💡 Recomendación: Se recomienda Python 3.11.9 para una compatibilidad óptima de compilación y soporte de motor.", + "Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "Recomendación: Se recomienda Python 3.11.9 para una compatibilidad óptima de compilación y soporte de motor.", "View Python": "Ver Python", "Locally Detected Pythons": "Pythons detectados localmente", "Download New Version": "Descargar nueva versión", @@ -266,8 +266,8 @@ "Later": "Más tarde", "Python Environment Installed Successfully!

System environment variables updated. Recommended to exit and restart the software to apply changes.": "¡Entorno Python instalado con éxito!

Variables de entorno del sistema actualizadas. Se recomienda reiniciar el software.", "Python installed. Please restart QPyPack manually later.": "Python instalado. Por favor, reinicie QPyPack manualmente más tarde.", - "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\n💡 Tip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[Error de Sintaxis] Error de análisis sintáctico, compilación abortada:\n - Archivo: {file}\n - Línea: {line}\n - Detalles: {desc}\n\n💡 Consejo: Esto generalmente NO es un fallo de la herramienta.\nAsegúrese de que la versión de Python seleccionada coincida con la utilizada para probar el código.\nEl uso de sintaxis más nueva en un entorno de Python más antiguo desencadenará este error.\nRecomendamos ir a [Opciones de compilación] -> [Motor] para cambiar a la versión correcta de Python.", - "[FAILED] Build interrupted exceptionally!\n\n🔍 Common Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] ¡La compilación se interrumpió de forma excepcional!\n\n🔍 Solución de problemas comunes:\n1. Incompatibilidad de entorno (Más común): La versión de Python seleccionada es incompatible con su código fuente. Vaya a [Opciones de compilación] para cambiar a la versión de Python que utiliza normalmente para este código.\n2. Dependencias faltantes: Haga clic en 'Modo Detallado' arriba para buscar ModuleNotFoundError.\n3. Bloqueo antivirus: Asegúrese de que su software de seguridad no esté bloqueando el proceso de compilación.\n\n(Nota: Esto generalmente es causado por discrepancias de entorno/código y no por el motor en sí. Consulte el registro detallado.)", + "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\nTip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[Error de Sintaxis] Error de análisis sintáctico, compilación abortada:\n - Archivo: {file}\n - Línea: {line}\n - Detalles: {desc}\n\nConsejo: Esto generalmente NO es un fallo de la herramienta.\nAsegúrese de que la versión de Python seleccionada coincida con la utilizada para probar el código.\nEl uso de sintaxis más nueva en un entorno de Python más antiguo desencadenará este error.\nRecomendamos ir a [Opciones de compilación] -> [Motor] para cambiar a la versión correcta de Python.", + "[FAILED] Build interrupted exceptionally!\n\nCommon Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] ¡La compilación se interrumpió de forma excepcional!\n\nSolución de problemas comunes:\n1. Incompatibilidad de entorno (Más común): La versión de Python seleccionada es incompatible con su código fuente. Vaya a [Opciones de compilación] para cambiar a la versión de Python que utiliza normalmente para este código.\n2. Dependencias faltantes: Haga clic en 'Modo Detallado' arriba para buscar ModuleNotFoundError.\n3. Bloqueo antivirus: Asegúrese de que su software de seguridad no esté bloqueando el proceso de compilación.\n\n(Nota: Esto generalmente es causado por discrepancias de entorno/código y no por el motor en sí. Consulte el registro detallado.)", "Status: Build Cancelled": "Estado: Compilación cancelada", "Build Cancelled": "Compilación cancelada", "[WARN] Package '{pkg}' failed to install, skipping...": "[WARN] El paquete '{pkg}' no se pudo instalar, omitiendo...", @@ -284,5 +284,13 @@ "OK": "OK", "Unknown": "Desconocido", "System Temp Directory (Anti-Lock / Cloud-Friendly)": "Directorio temporal del sistema (Anti-bloqueo / Compatible con la nube)", - "Script and settings retained. Ready to rebuild.": "Script y configuraciones conservados. Listo para reconstruir." + "Script and settings retained. Ready to rebuild.": "Script y configuraciones conservados. Listo para reconstruir.", + "Packaging Mode:": "Modo de empaquetado:", + "Compatibility Mode (Default)": "Modo de compatibilidad (Predeterminado)", + "Lite Mode (Smaller size)": "Modo ligero (Tamaño reducido)", + "Maximum compatibility. Recommended for apps with complex dynamic imports.": "Máxima compatibilidad. Recomendado para aplicaciones con importaciones dinámicas complejas.", + "Smaller output size. Recommended for 95% of standard apps.": "Menor tamaño de salida. Recomendado para el 95% de las aplicaciones estándar.", + "Tip: Build failed in Lite Mode. You can try switching to [Compatibility Mode] in Build Settings and rebuild.": "Consejo: Error al compilar en modo ligero. Intente cambiar a [Modo de compatibilidad] en la configuración y vuelva a compilar.", + "Keep Virtual Environment (Faster Rebuilds)": "Conservar entorno virtual (Reconstrucción más rápida)", + "[INFO] Reusing existing virtual environment...": "[INFO] Reutilizando el entorno virtual existente..." } diff --git a/qpypack/locales/fr_FR.json b/qpypack/locales/fr_FR.json index 43cc74a..f94e575 100644 --- a/qpypack/locales/fr_FR.json +++ b/qpypack/locales/fr_FR.json @@ -51,10 +51,10 @@ "Remove Selected": "Supprimer Sélection", "Clear All": "Tout Effacer", "Add Mapping": "Ajouter un Mappage", - "Restore Defaults": "Restaurer par défaut", + "Restore Defaults": "Restaurer les valeurs par défaut", "Export Preset...": "Exporter Préréglage...", "Import Preset...": "Importer Préréglage...", - "Reset to Default Config": "Réinitialiser la configuration", + "Reset to Default Config": "Réinitialiser la configuration par défaut", "Cancel & Return": "Annuler et revenir", "Cancel": "Annuler", "Configure Build Settings": "Paramètres de compilation", @@ -109,12 +109,12 @@ "Target relative path:": "Chemin relatif cible :", "Import name (e.g. cv2):": "Nom d'import (ex : cv2) :", "PyPI package name for [{imp_name}]:": "Nom PyPI pour [{imp_name}] :", - "One-File Mode (--onefile)": "Mode fichier unique (--onefile)", - "Folder Mode (--onedir)": "Mode Dossier (--onedir)", + "One-File Mode (--onefile)": "Fichier unique (--onefile)", + "Folder Mode (--onedir)": "Dossier (--onedir)", "Contents Directory (--contents-directory):": "Répertoire de contenu (--contents-directory) :", "Internal directory name for dependencies (default: _internal)": "Nom du répertoire interne pour les dépendances (par défaut : _internal)", "Hide Console (--noconsole)": "Masquer la console (--noconsole)", - "Use Virtual Environment (Recommended)": "Utiliser un environnement virtuel (Recommandé)", + "Use Virtual Environment (Recommended)": "Environnement virtuel (Recommandé)", "Install requirements.txt": "Installer requirements.txt", "Analyze Dependencies (AST)": "Analyser les dépendances (AST)", "Scan Entire Folder": "Analyser l'ensemble du dossier", @@ -123,7 +123,7 @@ "Concise Log Output": "Sortie de journal concise", "Auto-save Build Log": "Sauvegarder le journal", "Auto Extract Icon": "Extraire automatiquement l'icône", - "Clean Temporary Cache After Build": "Nettoyer le cache après compilation", + "Clean Temporary Cache After Build": "Nettoyer le cache temporaire après compilation", "Sound Notification": "Notification sonore de fin", "Leave blank to auto-detect system default Python": "Laissez vide pour détecter automatiquement", "Leave blank to auto-match script name": "Laissez vide pour utiliser le nom du script", @@ -249,7 +249,7 @@ "Python Environment Management": "Gestion de l'environnement Python", "Python Environment Required
Application build depends on a Python interpreter.
Please select a version to automatically download, install, and configure environment variables.
": "Environnement Python requis
La compilation dépend d'un interprète Python.
Veuillez sélectionner une version à télécharger, installer et configurer automatiquement.
", "Python Environment Management
Supports switching locally detected Python environments or downloading new versions.": "Gestion de l'environnement Python
Permet de basculer entre les environnements détectés localement ou de télécharger de nouvelles versions.", - "💡 Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "💡 Recommandation : Python 3.11.9 est recommandé pour une compatibilité optimale.", + "Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "Recommandation : Python 3.11.9 est recommandé pour une compatibilité optimale.", "View Python": "Voir Python", "Locally Detected Pythons": "Pythons détectés localement", "Download New Version": "Télécharger une nouvelle version", @@ -267,8 +267,8 @@ "Later": "Plus tard", "Python Environment Installed Successfully!

System environment variables updated. Recommended to exit and restart the software to apply changes.": "Environnement Python installé avec succès !

Variables d'environnement mises à jour. Il est recommandé de redémarrer le logiciel.", "Python installed. Please restart QPyPack manually later.": "Python installé. Veuillez redémarrer QPyPack manuellement plus tard.", - "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\n💡 Tip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[Erreur de syntaxe] L'analyse syntaxique a échoué, compilation annulée :\n - Fichier : {file}\n - Ligne : {line}\n - Détail : {desc}\n\n💡 Astuce : Ce n'est généralement PAS une erreur de l'outil.\nAssurez-vous que la version de Python correspond à celle utilisée pour tester le code.\nL'utilisation d'une syntaxe plus récente dans un environnement ancien déclenchera cette erreur.\nIl est recommandé de changer de version de Python dans [Options de compilation].", - "[FAILED] Build interrupted exceptionally!\n\n🔍 Common Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] Compilation interrompue exceptionnellement !\n\n🔍 Dépannage courant :\n1. Incompatibilité d'environnement (Fréquent) : La version Python est incompatible. Allez dans [Options de compilation] pour la changer.\n2. Dépendances manquantes : Vérifiez 'ModuleNotFoundError' dans le mode détaillé.\n3. Blocage Antivirus : Assurez-vous que votre antivirus ne bloque pas le processus.\n\n(Note : Souvent causé par des différences d'environnement/code, pas par le moteur lui-même. Consultez le journal.)", + "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\nTip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[Erreur de syntaxe] L'analyse syntaxique a échoué, compilation annulée :\n - Fichier : {file}\n - Ligne : {line}\n - Détail : {desc}\n\nAstuce : Ce n'est généralement PAS une erreur de l'outil.\nAssurez-vous que la version de Python correspond à celle utilisée pour tester le code.\nL'utilisation d'une syntaxe plus récente dans un environnement ancien déclenchera cette erreur.\nIl est recommandé de changer de version de Python dans [Options de compilation].", + "[FAILED] Build interrupted exceptionally!\n\nCommon Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] Compilation interrompue exceptionnellement !\n\nDépannage courant :\n1. Incompatibilité d'environnement (Fréquent) : La version Python est incompatible. Allez dans [Options de compilation] pour la changer.\n2. Dépendances manquantes : Vérifiez 'ModuleNotFoundError' dans le mode détaillé.\n3. Blocage Antivirus : Assurez-vous que votre antivirus ne bloque pas le processus.\n\n(Note : Souvent causé par des différences d'environnement/code, pas par le moteur lui-même. Consultez le journal.)", "Status: Build Cancelled": "Statut : Compilation annulée", "Build Cancelled": "Compilation annulée", "[WARN] Package '{pkg}' failed to install, skipping...": "[WARN] L'installation du paquet '{pkg}' a échoué, on passe...", @@ -285,5 +285,13 @@ "OK": "OK", "Unknown": "Inconnu", "System Temp Directory (Anti-Lock / Cloud-Friendly)": "Dossier Temp du système (Anti-verrouillage / Compatible Cloud)", - "Script and settings retained. Ready to rebuild.": "Script et paramètres conservés. Prêt à recompiler." + "Script and settings retained. Ready to rebuild.": "Script et paramètres conservés. Prêt à recompiler.", + "Packaging Mode:": "Mode d'empaquetage :", + "Compatibility Mode (Default)": "Mode de compatibilité (Par défaut)", + "Lite Mode (Smaller size)": "Mode léger (Taille réduite)", + "Maximum compatibility. Recommended for apps with complex dynamic imports.": "Compatibilité maximale. Recommandé pour les applications avec des importations dynamiques complexes.", + "Smaller output size. Recommended for 95% of standard apps.": "Taille de sortie plus petite. Recommandé pour 95 % des applications standard.", + "Tip: Build failed in Lite Mode. You can try switching to [Compatibility Mode] in Build Settings and rebuild.": "Conseil : Échec de la compilation en mode léger. Essayez de passer en [Mode de compatibilité] dans les paramètres et recompiler.", + "Keep Virtual Environment (Faster Rebuilds)": "Conserver l'environnement virtuel (Recompilation plus rapide)", + "[INFO] Reusing existing virtual environment...": "[INFO] Réutilisation de l'environnement virtuel existant..." } diff --git a/qpypack/locales/ja_JP.json b/qpypack/locales/ja_JP.json index e75fe2d..567fd66 100644 --- a/qpypack/locales/ja_JP.json +++ b/qpypack/locales/ja_JP.json @@ -1,5 +1,5 @@ { - "PyPI Official (Global Default)": "PyPI 公式 (グローバルデフォルト)", + "PyPI Official (Global Default)": "PyPI 公式 (グローバル既定値)", "Python TestPyPI": "Python TestPyPI", "AWS PyPI Mirror (US/EU)": "AWS PyPI ミラー (米国/欧州)", "Tsinghua University (China)": "清華大学ミラー", @@ -7,10 +7,10 @@ "Tencent Cloud (China)": "Tencent クラウド", "Huawei Cloud (China)": "Huawei クラウド", "USTC (China)": "USTC ミラー", - "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka": "PyInstaller および Nuitka をベースにしたモダンな Python パッケージング GUI", - "Python Packaging, Reimagined.": "Pythonパッケージングの再定義。", - "Drop Python source code to start": "開始するにはPythonソースコードをドロップ", - "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Python スクリプト (.py/.pyw) をここにドラッグ&ドロップ\nまたはクリックして参照...", + "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka": "PyInstaller および Nuitka によるモダンなクロスプラットフォーム Python パッケージング GUI", + "Python Packaging, Reimagined.": "Python パッケージングを再定義。", + "Drop Python source code to start": "Python ソースコードをドロップして開始", + "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Python スクリプト (.py/.pyw) をここにドラッグ&ドロップ\nまたはクリックして参照", "Build Settings": "ビルド設定", "Preferences": "環境設定", "About": "バージョン情報", @@ -20,70 +20,70 @@ "Optimization": "最適化", "Package Map": "パッケージマップ", "Execution Log": "実行ログ", - "Loaded: {filename}": "読み込み完了: {filename}", - "Parsing metadata...": "メタデータを解析中...", + "Loaded: {filename}": "読み込み済み: {filename}", + "Parsing metadata...": "メタデータ解析中...", "Ready, waiting for build.": "準備完了。ビルド待機中。", - "Initializing build...": "ビルドを初期化中...", - "Preparing engine...": "エンジンを準備中...", + "Initializing build...": "ビルド初期化中...", + "Preparing engine...": "エンジン準備中...", "Build Successful": "ビルド成功", - "Open output directory or reset workspace.": "出力ディレクトリを開くか、ワークスペースをリセットしてください。", + "Open output directory or reset workspace.": "出力ディレクトリを開くかワークスペースをリセット", "Build Failed": "ビルド失敗", - "Check log output below for troubleshooting.": "詳細については、以下のビルドログを確認してください。", + "Check log output below for troubleshooting.": "詳細は以下の実行ログを確認してください。", "Status: Ready": "ステータス: 準備完了", "Status: Parsing {filename}...": "ステータス: {filename} を解析中...", - "Status: Loaded {filename}{mode}": "ステータス: {filename}{mode} を読み込みました", + "Status: Loaded {filename}{mode}": "ステータス: {filename}{mode} 読み込み完了", "Status: Packaging ({engine}) ...": "ステータス: パッケージング中 ({engine}) ...", "Status: Build Completed": "ステータス: ビルド完了", "Status: Build Failed": "ステータス: ビルド失敗", - "Status: Workspace Reset": "ステータス: ワークスペースがリセットされました", + "Status: Workspace Reset": "ステータス: ワークスペースをリセットしました", " [Console]": " [コンソールあり]", " [No Console]": " [コンソールなし]", "Start Build": "ビルド開始", - "Stop Build": "ビルド中止", + "Stop Build": "ビルド停止", "Open Directory": "出力先を開く", "Rebuild": "再ビルド", "Save & Return": "保存して戻る", - "Browse": "参照...", - "AST Scan": "AST 構文解析", + "Browse": "参照", + "AST Scan": "AST 解析", "Add File": "ファイルを追加", "Add Dir": "ディレクトリを追加", "Remove Selected": "選択項目を削除", "Clear All": "すべてクリア", "Add Mapping": "マッピングを追加", - "Restore Defaults": "デフォルトに戻す", + "Restore Defaults": "既定値に戻す", "Export Preset...": "プリセットのエクスポート...", "Import Preset...": "プリセットのインポート...", - "Reset to Default Config": "デフォルト設定にリセット", + "Reset to Default Config": "既定の設定にリセット", "Cancel & Return": "変更を破棄して戻る", "Cancel": "キャンセル", - "Configure Build Settings": "ビルドパラメータの構成", + "Configure Build Settings": "ビルド設定の構成", "Toggle Execution Log": "実行ログの表示/非表示", "Detailed Mode": "詳細モード", - "Concise Mode": "簡潔モード", + "Concise Mode": "簡易モード", "Copy": "コピー", "Select All": "すべて選択", - "Clear Log": "ログを消去", - "Export Log...": "ログを保存...", + "Clear Log": "ログのクリア", + "Export Log...": "ログのエクスポート...", "Reset": "リセット", - "Are you sure you want to reset all preferences?
All settings will be restored to default state.": "すべての設定をリセットしてもよろしいですか?
すべての設定がデフォルトの状態に復元されます。", - "Engine & Environment": "ビルドエンジンと環境", + "Are you sure you want to reset all preferences?
All settings will be restored to default state.": "すべての設定を既定値にリセットしますか?
すべての設定が初期状態に復元されます。", + "Engine & Environment": "エンジンと環境", "Execution Mode": "実行モード", - "Mirrors & Scanner": "ミラーソースとスキャナー", + "Mirrors & Scanner": "ミラーとスキャナー", "Additional Resources (Drag & Drop Supported)": "追加リソース (ドラッグ&ドロップ対応)", "Performance Optimization": "パフォーマンス最適化", - "Lock Core Dependencies": "コア依存関係のバージョン固定", + "Lock Core Dependencies": "コア依存関係の固定", "Package Name Mappings": "パッケージ名マッピング", "UI Language:": "表示言語:", "App Metadata & Presets": "アプリのメタデータとプリセット", - "Output Location": "ビルド生成物の出力先", - "Preferences & System Behavior": "動作設定およびシステム動作", + "Output Location": "出力先", + "Preferences & System Behavior": "環境設定と動作", "Build Engine:": "ビルドエンジン:", - "Python Interpreter:": "Python インタープリター:", - "Output Name:": "出力アプリケーション名:", - "App Icon:": "アプリケーションアイコン:", + "Python Interpreter:": "インタープリター:", + "Output Name:": "出力アプリ名:", + "App Icon:": "アプリアイコン:", "Primary PIP Index:": "メイン PIP インデックス:", "Backup PIP Index:": "サブ PIP インデックス:", - "Requirements File:": "依存関係ファイル:", + "Requirements File:": "requirements ファイル:", "Hidden Imports:": "暗黙のインポート:", "Exclude Modules:": "除外モジュール:", "CPU Cores:": "CPU コア数:", @@ -93,104 +93,104 @@ "Version:": "バージョン:", "Author/Company:": "作者/組織名:", "Description:": "詳細説明:", - "Output Location:": "出力先:", + "Output Location:": "出力場所:", "Target Directory:": "保存先ディレクトリ:", "Temporary Directory:": "一時ディレクトリ:", "Source Directory (.qpypack_build)": "ソースディレクトリ (.qpypack_build)", "System Temp Directory": "システム一時ディレクトリ", - "Source File Directory": "ソースファイルと同じディレクトリ", + "Source File Directory": "ソースと同じディレクトリ", "Custom Directory": "カスタムディレクトリ", "Import Name": "import 名", "PyPI Package Name": "PyPI パッケージ名", "File": "ファイル", "Directory": "ディレクトリ", - "Edit Path": "パスを編集", + "Edit Path": "パスの編集", "Target relative path:": "ターゲット相対パス:", "Import name (e.g. cv2):": "インポート名 (例: cv2):", - "PyPI package name for [{imp_name}]:": "[{imp_name}] のPyPIパッケージ名:", - "One-File Mode (--onefile)": "単一ファイルモード (--onefile)", - "Folder Mode (--onedir)": "フォルダーモード (--onedir)", + "PyPI package name for [{imp_name}]:": "[{imp_name}] の PyPI パッケージ名:", + "One-File Mode (--onefile)": "単一ファイル (--onefile)", + "Folder Mode (--onedir)": "フォルダー (--onedir)", "Contents Directory (--contents-directory):": "内部リソースディレクトリ:", - "Internal directory name for dependencies (default: _internal)": "依存関係とリソースの内部ディレクトリ名 (デフォルト: _internal)", - "Hide Console (--noconsole)": "コンソールウィンドウを非表示 (--noconsole)", - "Use Virtual Environment (Recommended)": "独立した仮想環境を使用 (推奨)", - "Install requirements.txt": "requirements.txt をインストール", - "Analyze Dependencies (AST)": "依存関係を自動解析 (AST)", + "Internal directory name for dependencies (default: _internal)": "依存関係とリソースの内部ディレクトリ名 (既定値: _internal)", + "Hide Console (--noconsole)": "コンソール非表示 (--noconsole)", + "Use Virtual Environment (Recommended)": "仮想環境を使用 (推奨)", + "Install requirements.txt": "requirements.txt のインストール", + "Analyze Dependencies (AST)": "依存関係の自動解析 (AST)", "Scan Entire Folder": "フォルダ全体をスキャン", - "Enable UPX Compression": "UPX 圧縮を有効化", - "Lite Mode (Exclude Dev/Test Dependencies)": "軽量化モード (開発・テスト用依存関係を除外)", - "Concise Log Output": "ログ出力を簡略化", - "Auto-save Build Log": "ビルドログを自動保存", - "Auto Extract Icon": "アイコンを自動抽出", - "Clean Temporary Cache After Build": "ビルド完了後に一時キャッシュを削除", + "Enable UPX Compression": "UPX 圧縮の有効化", + "Lite Mode (Exclude Dev/Test Dependencies)": "軽量化モード (開発/テスト用依存関係を除外)", + "Concise Log Output": "簡易ログ出力", + "Auto-save Build Log": "ビルドログの自動保存", + "Auto Extract Icon": "アイコンの自動抽出", + "Clean Temporary Cache After Build": "ビルド後に一時キャッシュを削除", "Sound Notification": "完了通知音", - "Leave blank to auto-detect system default Python": "空欄の場合、システムデフォルトの Python を自動検出します", - "Leave blank to auto-match script name": "空欄の場合、スクリプト名を自動設定します", - "Leave blank to auto-search requirements.txt in current directory": "空欄の場合、要件ファイルを自動検索します", + "Leave blank to auto-detect system default Python": "空欄の場合はシステム既定の Python を自動検出", + "Leave blank to auto-match script name": "空欄の場合はスクリプト名を自動設定", + "Leave blank to auto-search requirements.txt in current directory": "空欄の場合は requirements.txt を自動検索", "Comma separated (e.g. pandas, PyQt5)": "カンマ区切りで入力 (例: pandas, PyQt5)", "Comma separated (e.g. tkinter, matplotlib)": "カンマ区切りで入力 (例: tkinter, matplotlib)", - "Leave blank to auto-detect from environment variables": "空欄の場合、環境変数から自動検出します", - "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "ビルド環境から無駄な依存関係を動的に除外し、ビルド速度とサイズを最適化します。", - "Double-click to edit target path; Drag & drop supported": "ダブルクリックで展開先パスを編集。ドラッグ&ドロップ対応", - "Double-click to edit target path; Drag & drop supported. Use 'Export Preset' to save for reuse.": "ダブルクリックで展開先パスを編集。再利用するには「プリセットのエクスポート」をご利用ください。", - "PyInstaller — Bundles Python interpreter and bytecode. Fast build speed, zero configuration (no C compiler needed), and excellent compatibility.": "PyInstaller — ビルド速度が速く、互換性に優れています。ゼロコンフィギュレーションで利用可能です。", - "Nuitka — Compiles source code into native C/C++ binary. Produces smaller package size, faster execution, and deep anti-decompilation protection (requires C compiler).": "Nuitka — ネイティブ C/C++ バイナリへコンパイルします。パフォーマンスが向上し、ソースコードを保護します。", + "Leave blank to auto-detect from environment variables": "空欄の場合は環境変数から自動検出", + "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "不要な依存関係を動的に除外し、ビルド速度向上と軽量化を図ります。", + "Double-click to edit target path; Drag & drop supported": "ダブルクリックでパスを編集。ドラッグ&ドロップ対応", + "Double-click to edit target path; Drag & drop supported. Use 'Export Preset' to save for reuse.": "ダブルクリックでパスを編集。再利用には「プリセットのエクスポート」をご利用ください。", + "PyInstaller — Bundles Python interpreter and bytecode. Fast build speed, zero configuration (no C compiler needed), and excellent compatibility.": "PyInstaller — 構築が高速で高い互換性。C コンパイラ不要で設定なしで利用可能。", + "Nuitka — Compiles source code into native C/C++ binary. Produces smaller package size, faster execution, and deep anti-decompilation protection (requires C compiler).": "Nuitka — ネイティブ C/C++ バイナリへコンパイル。高速化・軽量化と逆コンパイル防止を実現 (C コンパイラ必須)。", "
Python {ver} Platform Matrix:
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility": "
Python {ver} サポート:
✔ Windows 7    ✔ Windows 8/8.1    ✔ Windows 10/11    ✔ macOS 10.9+    ✔ Linux
レガシー OS 完全な後方互換性", "
Python {ver} Platform Matrix:
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux": "
Python {ver} サポート:
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10/11    ✔ macOS 10.9+    ✔ Linux", - "
Python {ver} Platform Matrix:
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka Auto-detecting and managing C backend compiler": "
Python {ver} サポート:
✖ Windows 7    ✖ Windows 8/8.1    ✔ Windows 10/11    ✔ macOS 10.13+    ✔ Linux
Nuitka C バックエンドコンパイラを自動検出して管理します", + "
Python {ver} Platform Matrix:
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka Auto-detecting and managing C backend compiler": "
Python {ver} サポート:
✖ Windows 7    ✖ Windows 8/8.1    ✔ Windows 10/11    ✔ macOS 10.13+    ✔ Linux
Nuitka C バックエンドコンパイラを自動検出して管理", "
Python Interpreter
Auto-detecting system environment for Windows, macOS & Linux...": "
Python インタープリター
システム環境を自動検出中...", "[INFO] Build Cancelled.": "[INFO] ビルドがキャンセルされました。", - "[INFO] Performing pre-flight environment checks...": "[INFO] 環境の事前チェックを実行中...", - "[INFO] Analyzing source code and project dependencies...": "[INFO] ソースコードと依存関係を分析中...", + "[INFO] Performing pre-flight environment checks...": "[INFO] 事前環境チェックを実行中...", + "[INFO] Analyzing source code and project dependencies...": "[INFO] ソースコードと依存関係を解析中...", "[INFO] Initializing isolated build environment...": "[INFO] 隔離されたビルド環境を初期化中...", - "[INFO] Playwright detected. Installing built-in browsers (PLAYWRIGHT_BROWSERS_PATH=0)...": "[INFO] Playwrightが検出されました。組み込みブラウザーをインストールしています...", + "[INFO] Playwright detected. Installing built-in browsers (PLAYWRIGHT_BROWSERS_PATH=0)...": "[INFO] Playwright を検出。組み込みブラウザーをインストール中...", "[INFO] Python interpreter path: {path}": "[INFO] Python インタープリターパス: {path}", "[INFO] Creating virtual environment...": "[INFO] 仮想環境を作成中...", "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] pip パッケージマネージャーを更新中...", - "[INFO] Scanning project source code via AST engine...": "[INFO] ASTエンジンを使用して依存関係をスキャン中...", + "[INFO] Scanning project source code via AST engine...": "[INFO] AST エンジンで依存関係をスキャン中...", "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Nuitka ヒント: 初回ビルド時に GCC/MinGW のダウンロードが求められる場合があります。", "[INFO] Successfully installed compatible versions.": "[INFO] 互換性のあるバージョンが正常にインストールされました。", "[INFO] Resolving project dependencies...": "[INFO] プロジェクトの依存関係を解決中...", - "Declared in requirements.txt ({count}): {pkgs}": "requirements.txt で宣言されたもの ({count}): {pkgs}", - "Declared in requirements.txt: None": "requirements.txt で宣言されたもの: なし", - "Discovered via scanner ({count}): {pkgs}": "スキャナーで発見されたもの ({count}): {pkgs}", - "Auto-patched missing ({count}): {pkgs}": "自動補完されたもの ({count}): {pkgs}", + "Declared in requirements.txt ({count}): {pkgs}": "requirements.txt での宣言 ({count}): {pkgs}", + "Declared in requirements.txt: None": "requirements.txt での宣言: なし", + "Discovered via scanner ({count}): {pkgs}": "スキャナーの検出結果 ({count}): {pkgs}", + "Auto-patched missing ({count}): {pkgs}": "自動補完結果 ({count}): {pkgs}", "Manifest complete (No missing packages)": "マニフェスト完了 (欠落パッケージなし)", "Build engine packages ({count}): {pkgs}": "ビルドエンジンパッケージ ({count}): {pkgs}", "[INFO] Installing build environment and project dependencies ({count} packages): {pkgs}": "[INFO] 依存関係 ({count} パッケージ) をインストール中: {pkgs}", "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] バックアップの PyPI ソースに切り替えて再試行中: {url}", "[INFO] Starting {engine} engine to compile binary files...": "[INFO] {engine} エンジンを起動してコンパイルを開始中...", - "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] ローカルのMSVC環境を検出しました。ネイティブC++コンパイラを優先します。", - "[INFO] Found local Clang environment, prioritizing LLVM Clang compiler.": "[INFO] ローカルのClang環境を検出しました。LLVM Clangコンパイラを優先します。", - "[INFO] Python 3.13+ detected: Using Zig compiler (--zig) as C backend.": "[INFO] Python 3.13+ を検出しました: Zigコンパイラを使用します。", - "[INFO] Using MinGW64 compiler (--mingw64) for C backend.": "[INFO] MinGW64コンパイラを使用します。", - "[INFO] Found local GCC/MinGW-w64 environment, using MinGW64 compiler.": "[INFO] ローカルの GCC/MinGW-w64 環境を検出しました。MinGW64 コンパイラを使用します。", - "[INFO] Found local Zig environment, letting Nuitka manage C backend compilation.": "[INFO] ローカルの Zig 環境を検出しました。Nuitka に C バックエンドのコンパイルを任せます。", - "[INFO] No local C compiler detected. Nuitka will automatically download and manage a compatible MinGW-w64 toolchain.": "[INFO] ローカルの C コンパイラが検出されませんでした。Nuitka が自動的に互換性のある MinGW-w64 ツールチェーンをダウンロードして管理します。", - "[INFO] Evaluating system physical memory (Available: {ram:.1f} GB). Adaptive concurrency adjusted: {cores} -> {safe_jobs} ...": "[INFO] システムメモリを評価中 (空き: {ram:.1f} GB)。並行処理を調整しました: {cores} -> {safe_jobs} ...", - "[INFO] Stripping icon parameters and automatically rebuilding...": "[INFO] アイコンパラメータを削除して自動的に再ビルド中...", - "[INFO] Lite mode enabled, applying bytecode optimization (-OO) and stripping dev modules...": "[INFO] 軽量化モードを有効にしました。バイトコード最適化 (-OO) を適用し、開発モジュールを削除します...", + "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] ローカルの MSVC 環境を検出。ネイティブ C++ コンパイラを優先します。", + "[INFO] Found local Clang environment, prioritizing LLVM Clang compiler.": "[INFO] ローカルの Clang 環境を検出。LLVM Clang コンパイラを優先します。", + "[INFO] Python 3.13+ detected: Using Zig compiler (--zig) as C backend.": "[INFO] Python 3.13+ を検出: Zig コンパイラを使用します。", + "[INFO] Using MinGW64 compiler (--mingw64) for C backend.": "[INFO] MinGW64 コンパイラを使用します。", + "[INFO] Found local GCC/MinGW-w64 environment, using MinGW64 compiler.": "[INFO] ローカルの GCC/MinGW-w64 環境を検出。MinGW64 コンパイラを使用します。", + "[INFO] Found local Zig environment, letting Nuitka manage C backend compilation.": "[INFO] ローカルの Zig 環境を検出。Nuitka が C バックエンドのコンパイルを管理します。", + "[INFO] No local C compiler detected. Nuitka will automatically download and manage a compatible MinGW-w64 toolchain.": "[INFO] ローカルの C コンパイラが未検出です。Nuitka が自動的に互換のある MinGW-w64 ツールチェーンを管理します。", + "[INFO] Evaluating system physical memory (Available: {ram:.1f} GB). Adaptive concurrency adjusted: {cores} -> {safe_jobs} ...": "[INFO] メモリ状態を評価中 (空き: {ram:.1f} GB)。並行処理を調整しました: {cores} -> {safe_jobs} ...", + "[INFO] Stripping icon parameters and automatically rebuilding...": "[INFO] アイコンパラメーターを除外して自動再ビルド中...", + "[INFO] Lite mode enabled, applying bytecode optimization (-OO) and stripping dev modules...": "[INFO] 軽量化モードを有効化。バイトコード最適化 (-OO) と開発モジュール除外を適用中...", "[INFO] Compilation completed, archiving built files...": "[INFO] コンパイル完了。生成ファイルをアーカイブ中...", "[INFO] Validating output files and generating final product...": "[INFO] 出力ファイルを検証し、最終成果物を生成中...", "[INFO] Build log exported to: {path}": "[INFO] ビルドログを出力しました: {path}", "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] 一時ビルド環境をクリーンアップ中...", "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] コンパイルが正常に完了しました。出力先: {path}", - "[WARN] Target project is in a Cloud Sync directory (e.g. OneDrive/Dropbox). Cloud sync may temporarily lock build files.": "[WARN] クラウド同期フォルダにあります。ファイルがロックされる可能性があります。", - "[WARN] Specified versions failed to install. Stripping version constraints for automatic compatibility match...": "[WARN] 指定バージョンのインストールに失敗しました。バージョン制約を解除して再試行します...", - "[WARN] Some dependencies failed to install, build will proceed with risk...": "[WARN] 一部の依存関係のインストールに失敗しましたが、リスクを承知でビルドを続行します...", - "[WARN] Low disk space detected on build target drive (Available: {free:.1f} GB, >= 5.0 GB recommended). Build process may interrupt due to disk exhaustion.": "[WARN] ディスク空き容量が不足しています (空き: {free:.1f} GB)。中断する可能性があります。", + "[WARN] Target project is in a Cloud Sync directory (e.g. OneDrive/Dropbox). Cloud sync may temporarily lock build files.": "[WARN] クラウド同期フォルダに存在します。ファイルがロックされる可能性があります。", + "[WARN] Specified versions failed to install. Stripping version constraints for automatic compatibility match...": "[WARN] 指定バージョンのインストールに失敗。バージョン制約を解除して再試行します...", + "[WARN] Some dependencies failed to install, build will proceed with risk...": "[WARN] 一部の依存関係のインストールに失敗しましたが、ビルドを続行します...", + "[WARN] Low disk space detected on build target drive (Available: {free:.1f} GB, >= 5.0 GB recommended). Build process may interrupt due to disk exhaustion.": "[WARN] ディスク空き容量が不足しています (空き: {free:.1f} GB)。中断の可能性があります。", "[WARN] Memory allocation exception caught (ZstdError / OOM). Triggering memory protection fallback: Retrying in single-thread mode...": "[WARN] メモリ不足例外が発生しました。シングルスレッドモードで再試行します...", - "[WARN] System low memory detected (zstd memory allocation failed). Automatically retrying in single-thread low-memory mode...": "[WARN] メモリ不足を検出しました。シングルスレッドモードで再試行します...", - "[WARN] Icon resource writing blocked (possibly locked by system/antivirus), triggering fallback protection...": "[WARN] アイコンの書き込みがブロックされました (ウイルス対策ソフト等)。フォールバックをトリガーします...", - "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] 軽量化効果を最大化するために、「仮想環境の使用」を有効にすることを強く推奨します。", + "[WARN] System low memory detected (zstd memory allocation failed). Automatically retrying in single-thread low-memory mode...": "[WARN] メモリ不足を検出。シングルスレッドモードで再試行します...", + "[WARN] Icon resource writing blocked (possibly locked by system/antivirus), triggering fallback protection...": "[WARN] アイコンの書き込みがブロックされました (セキュリティソフト等)。フォールバックを実行します...", + "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] 軽量化効果を最大化するため、「仮想環境を使用」の有効化を推奨します。", "[WARN] Pause code injection exception: {error}": "[WARN] ポーズコード挿入例外: {error}", "[WARN] AST Analysis Exception: {error}": "[WARN] AST 解析例外: {error}", - "[WARN] Read requirements.txt warning: {error}": "[WARN] requirements.txt の読み取り警告: {error}", + "[WARN] Read requirements.txt warning: {error}": "[WARN] requirements.txt 読み取り警告: {error}", "[WARN] Command timeout (>{timeout}s)": "[WARN] コマンドがタイムアウトしました (>{timeout}s)", - "[WARN] Detected 'requests' or 'httpx'. Auto-bundling 'certifi' certificates to prevent SSL errors.": "[WARN] 'requests' または 'httpx' が検出されました。SSL エラーを防ぐために 'certifi' を自動バンドルします。", - "[WARN] Usage of '__file__' detected. In PyInstaller One-File mode, use 'sys._MEIPASS' to reliably locate bundled resource files!": "[WARN] '__file__' の使用が検出されました。単一ファイルモードでは、'sys._MEIPASS' を使用してください!", - "[INFO] Tip: Packaged executables might be falsely flagged by Windows Defender/Antivirus. Adding exclusions or code-signing is recommended.": "[INFO] ヒント: パッケージ化されたファイルはウイルス対策ソフトに誤検知される可能性があります。", - "[ERROR] Build aborted: Insufficient disk space (NoSpaceLeft / Errno 28). Please clean up drive space (at least 5 GB free space recommended) and try again.": "[ERROR] ビルド中止: ディスク容量が不足しています。容量を確保してください。", + "[WARN] Detected 'requests' or 'httpx'. Auto-bundling 'certifi' certificates to prevent SSL errors.": "[WARN] 'requests' または 'httpx' を検出。SSL エラー防止のため 'certifi' を自動バンドルします。", + "[WARN] Usage of '__file__' detected. In PyInstaller One-File mode, use 'sys._MEIPASS' to reliably locate bundled resource files!": "[WARN] '__file__' の使用を検出。単一ファイルモードでは 'sys._MEIPASS' を使用してください。", + "[INFO] Tip: Packaged executables might be falsely flagged by Windows Defender/Antivirus. Adding exclusions or code-signing is recommended.": "[INFO] ヒント: パッケージ化されたファイルはセキュリティソフトに誤検知される場合があります。", + "[ERROR] Build aborted: Insufficient disk space (NoSpaceLeft / Errno 28). Please clean up drive space (at least 5 GB free space recommended) and try again.": "[ERROR] ビルド中止: ディスク容量が不足しています。空き容量を確保してください。", "[ERROR] Output directory is missing write permissions: {error}": "[ERROR] 出力ディレクトリに書き込み権限がありません: {error}", "[ERROR] Requirements file not found: {path}": "[ERROR] 依存関係ファイルが見つかりません: {path}", "[ERROR] Insufficient disk space (Available: {free:.1f} GB). At least 0.5 GB is required to safely initialize the build environment.": "[ERROR] ディスク容量が不足しています (空き: {free:.1f} GB)。", @@ -204,14 +204,14 @@ "[FAILED] Compilation interrupted with exceptions, please click 'Detailed Mode' above the log window for troubleshooting.": "[FAILED] 例外が発生したため中断されました。「詳細モード」でログを確認してください。", "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.": "[ERROR] 対象ファイルがクラウドストレージ等によりロックされています。", "[ERROR] Target file is running or occupied. Please close the existing application and try again.": "[ERROR] ターゲットファイルが実行中または使用中です。アプリケーションを閉じて再試行してください。", - "[WARN] 'multiprocessing' module detected. Ensure 'multiprocessing.freeze_support()' is called under 'if __name__ == \"__main__\":' to prevent infinite process loops (fork bombs).": "[WARN] 'multiprocessing' モジュールが検出されました。無限ループを防ぐために 'multiprocessing.freeze_support()' を呼び出してください。", - "[ERROR] Please load a valid Python source file first!": "[ERROR] 有効な Python ソースコードファイルを先に読み込んでください!", - "[ERROR] Exception occurred during AST parsing: {error}": "[ERROR] AST 構文解析中に例外が発生しました: {error}", + "[WARN] 'multiprocessing' module detected. Ensure 'multiprocessing.freeze_support()' is called under 'if __name__ == \"__main__\":' to prevent infinite process loops (fork bombs).": "[WARN] 'multiprocessing' モジュールを検出。無限ループ防止のため 'multiprocessing.freeze_support()' を呼び出してください。", + "[ERROR] Please load a valid Python source file first!": "[ERROR] 有効な Python ソースコードファイルを先に読み込んでください。", + "[ERROR] Exception occurred during AST parsing: {error}": "[ERROR] AST 解析中に例外が発生しました: {error}", "[ERROR] Failed to export preset file: {error}": "[ERROR] プリセットのエクスポートに失敗しました: {error}", - "[ERROR] Preset file format error or corrupted: {error}": "[ERROR] プリセットのフォーマットが不正です: {error}", + "[ERROR] Preset file format error or corrupted: {error}": "[ERROR] プリセットの形式が不正です: {error}", "[ERROR] Failed to export log file: {error}": "[ERROR] ログのエクスポートに失敗しました: {error}", "[ERROR] Build completed, but the following dependencies failed to install:\n\n - {pkgs}\n\nNote: The application might raise ModuleNotFoundError at runtime.": "[ERROR] ビルドは完了しましたが、以下の依存パッケージのインストールに失敗しました:\n\n - {pkgs}", - "[ERROR] Process error: command or binary missing ({error})": "[ERROR] プロセスエラー: コマンドまたはバイナリがありません ({error})", + "[ERROR] Process error: command or binary missing ({error})": "[ERROR] プロセスエラー: コマンドまたはバイナリが存在しません ({error})", "[ERROR] System execution exception: {error}": "[ERROR] システム実行例外: {error}", "[ERROR] I/O Exception: {err_msg}": "[ERROR] I/O 例外: {err_msg}", "No log content.": "ログ出力がありません。", @@ -222,65 +222,73 @@ "Issues & Feedback": "問題とフィードバック", "PyPI Home": "PyPI ホーム", "Sponsor": "スポンサー", - "QPyPack is a free and open-source tool. If it has improved your efficiency or solved packaging problems, consider buying the author a coffee!": "QPyPackは無料のオープンソースツールです。効率向上に役立った場合は、作者にコーヒーを奢ることをご検討ください!", - "* Sponsorship is completely voluntary, serves as an unconditional encouragement to the open-source community, and involves no commercial commitments. Thank you for your support!": "※ スポンサーシップは完全に任意です。ご支援に感謝します!", - "Python Environment Required": "Python環境が必要です", - "Python is not detected on your system!

QPyPack requires a Python environment to compile your code.
If you haven't installed Python, please download and install it (remember to check 'Add Python.exe to PATH' during installation).": "システムにPythonが検出されません!

インストールされていない場合はダウンロードしてインストールしてください('Add Python.exe to PATH'のチェックを忘れないでください)。", - "Download Python": "Pythonをダウンロード", + "QPyPack is a free and open-source tool. If it has improved your efficiency or solved packaging problems, consider buying the author a coffee!": "QPyPack は無料のオープンソースツールです。役立った場合は、作者へのご支援をご検討ください。", + "* Sponsorship is completely voluntary, serves as an unconditional encouragement to the open-source community, and involves no commercial commitments. Thank you for your support!": "※ スポンサーシップは任意です。ご支援に感謝いたします。", + "Python Environment Required": "Python 環境が必要です", + "Python is not detected on your system!

QPyPack requires a Python environment to compile your code.
If you haven't installed Python, please download and install it (remember to check 'Add Python.exe to PATH' during installation).": "システムに Python が検出されません。

インストールされていない場合はダウンロードしてインストールしてください ('Add Python.exe to PATH' のチェックをお忘れなく)。", + "Download Python": "Python をダウンロード", "Python 3.14.6 (Experimental)": "Python 3.14.6 (実験的)", "Python 3.13.0": "Python 3.13.0", "Python 3.12.4": "Python 3.12.4", "Python 3.11.9 (Recommended)": "Python 3.11.9 (推奨)", "Python 3.10.11": "Python 3.10.11", "Python 3.9.13": "Python 3.9.13", - "Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Win7サポート)", - "Downloading Python {ver}... Please wait.": "Python {ver} をダウンロードしています... お待ちください。", - "Configure Manually": "手動で設定する", - "Switched to [Build Settings] -> [Engine], please set the Python path.": "[ビルド設定] -> [エンジン]に切り替えました。Pythonパスを設定してください。", + "Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Win7 サポート)", + "Downloading Python {ver}... Please wait.": "Python {ver} をダウンロード中... しばらくお待ちください。", + "Configure Manually": "手動で設定", + "Switched to [Build Settings] -> [Engine], please set the Python path.": "[ビルド設定] -> [エンジン] に切り替えました。Python パスを設定してください。", "Python Environment Management": "Python 環境管理", - "Python Environment Required
Application build depends on a Python interpreter.
Please select a version to automatically download, install, and configure environment variables.
": "Python環境が必要です
アプリケーションのビルドにはPythonインタープリターが必要です。
バージョンを選択して、自動ダウンロード、インストール、環境変数の構成を行ってください。
", - "Python Environment Management
Supports switching locally detected Python environments or downloading new versions.": "Python環境管理
検出されたローカルのPython環境の切り替え、または新しいバージョンのダウンロードをサポートします。", - "💡 Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "💡 推奨: 最適なビルドの互換性とエンジンサポートのために、Python 3.11.9 をお勧めします。", - "View Python": "Pythonを表示", + "Python Environment Required
Application build depends on a Python interpreter.
Please select a version to automatically download, install, and configure environment variables.
": "Python 環境が必要です
アプリケーションのビルドには Python インタープリターが必要です。
バージョンを選択して、自動ダウンロード、インストール、環境変数の設定を行ってください。
", + "Python Environment Management
Supports switching locally detected Python environments or downloading new versions.": "Python 環境管理
検出されたローカルの Python 環境の切り替え、または新しいバージョンのダウンロードをサポートします。", + "Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "推奨: 最適なビルド互換性とエンジンサポートのため、Python 3.11.9 をお勧めします。", + "View Python": "Python を表示", "Locally Detected Pythons": "検出されたローカル環境", "Download New Version": "新しいバージョンをダウンロード", - "Use Selected Environment": "選択した環境を使用する", - "No local Python environments detected.": "ローカルのPython環境が検出されませんでした。", - "Select Python Version to Download:": "ダウンロードするPythonのバージョンを選択:", - "Click to automatically download, install Python, and configure system environment variables.": "クリックすると、Pythonが自動的にダウンロード、インストールされ、システム環境変数が設定されます。", + "Use Selected Environment": "選択した環境を使用", + "No local Python environments detected.": "ローカルの Python 環境が検出されませんでした。", + "Select Python Version to Download:": "ダウンロードする Python のバージョンを選択:", + "Click to automatically download, install Python, and configure system environment variables.": "クリックすると、Python が自動的にダウンロード・インストールされ、環境変数が設定されます。", "One-Click Download & Install": "ワンクリックでダウンロード&インストール", - "Use Installed Version Directly": "✔ ローカル環境を直接使用する", + "Use Installed Version Directly": "✔ ローカル環境を直接使用", "✔ Detected locally:
{path}
Ready to switch directly without re-downloading.": "✔ ローカルで検出:
{path}
再ダウンロードせずに直接切り替えることができます。", - "Switched to local Python environment: {path}": "ローカルPython環境に切り替えました: {path}", - "Download complete. Starting Python installation...": "ダウンロードが完了しました。Pythonのインストールを開始しています...", + "Switched to local Python environment: {path}": "ローカル Python 環境に切り替えました: {path}", + "Download complete. Starting Python installation...": "ダウンロードが完了しました。Python のインストールを開始しています...", "Install Complete": "インストール完了", "Exit Now": "今すぐ終了", "Later": "後で", - "Python Environment Installed Successfully!

System environment variables updated. Recommended to exit and restart the software to apply changes.": "Python環境が正常にインストールされました!

システム環境変数が更新されました。変更を適用するためにソフトウェアを再起動することをお勧めします。", - "Python installed. Please restart QPyPack manually later.": "Pythonがインストールされました。後で手動でQPyPackを再起動してください。", - "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\n💡 Tip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[構文エラー] ソースコードの構文解析に失敗しました。ビルドは中止されました:\n - ファイル: {file}\n - 行: {line}行目\n - 詳細: {desc}\n\n💡ヒント: これは通常、パッケージングツールの問題ではありません。\n選択した[ビルドPythonバージョン]がコードの記述/テストに使用したバージョンと一致していることを確認してください。\n古いPython環境で新しい構文(:=, |, match-caseなど)を使用すると、このエラーが発生します。\n[ビルド設定] -> [エンジン]に移動して、適切なPythonバージョンに切り替えることをお勧めします。", - "[FAILED] Build interrupted exceptionally!\n\n🔍 Common Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] ビルドが例外的に中断されました!\n\n🔍 一般的なトラブルシューティング:\n1. 環境の不一致(最も一般的): 選択したPythonバージョンがソースコードと互換性がありません。[ビルド設定]で、通常使用するPythonバージョンに切り替えてください。\n2. 依存関係の欠落: 上の「詳細モード」をクリックして、ModuleNotFoundErrorを確認してください。\n3. アンチウイルスのブロック: セキュリティソフトがビルドプロセスをブロックしていないか確認してください。\n\n(注: これは通常、パッケージングエンジン自体の問題ではなく、環境/コードの不一致によって発生します。詳細なログで正確な原因を確認してください。)", + "Python Environment Installed Successfully!

System environment variables updated. Recommended to exit and restart the software to apply changes.": "Python 環境が正常にインストールされました。

システム環境変数が更新されました。変更を適用するためソフトウェアを再起動することをお勧めします。", + "Python installed. Please restart QPyPack manually later.": "Python がインストールされました。後で手動で QPyPack を再起動してください。", + "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\nTip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[構文エラー] ソースコードの構文解析に失敗しました。ビルドを中止しました:\n - ファイル: {file}\n - 行: {line} 行目\n - 詳細: {desc}\n\nヒント: これは通常パッケージングツールの問題ではありません。\n選択した [ビルド Python バージョン] がコードの記述/テストに使用したバージョンと一致しているか確認してください。\n古い Python 環境で新しい構文 (:=, |, match-case など) を使用するとエラーが発生します。\n[ビルド設定] -> [エンジン] で適切な Python バージョンに切り替えることをお勧めします。", + "[FAILED] Build interrupted exceptionally!\n\nCommon Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] ビルドが例外的に中断されました。\n\n一般的なトラブルシューティング:\n1. 環境の不一致 (最頻出): 選択した Python バージョンがソースコードと互換性がありません。[ビルド設定] で通常使用する Python バージョンに切り替えてください。\n2. 依存関係の欠落: 上の「詳細モード」をクリックして ModuleNotFoundError を確認してください。\n3. セキュリティソフトのブロック: セキュリティソフトがビルドプロセスをブロックしていないか確認してください。\n\n(注: これは通常、パッケージングエンジン自体の問題ではなく環境やコードの不一致によって発生します。詳細はログをご確認ください。)", "Status: Build Cancelled": "ステータス: ビルドがキャンセルされました", "Build Cancelled": "ビルドがキャンセルされました", "[WARN] Package '{pkg}' failed to install, skipping...": "[WARN] パッケージ '{pkg}' のインストールに失敗しました。スキップします...", "Dependency Missing Warning: {pkgs} failed to install. Check log for details.": "依存関係欠落警告: {pkgs} のインストールに失敗しました。", - "Package mappings have been reset to defaults.": "パッケージマッピングが初期設定にリセットされました。", - "Global configuration has been reset.": "グローバル設定がリセットされました。", + "Package mappings have been reset to defaults.": "パッケージマッピングが既定値にリセットされました。", + "Global configuration has been reset.": "全体設定がリセットされました。", "Config preset exported to: {path}": "設定プリセットを出力しました: {path}", "Config preset imported successfully.": "設定プリセットを正常に読み込みました。", - "AST scan completed, found {count} dependencies.": "AST スキャンが完了しました。{count} 個の依存関係を検出しました。", + "AST scan completed, found {count} dependencies.": "AST スキャン完了。{count} 個の依存関係を検出しました。", "Attention: Please check the log for details.": "注意: 詳細はログを確認してください。", - "One-Click Install": "ワンクリック・インストール", - "[ERROR] Python installation failed or was cancelled.": "[ERROR] Pythonのインストールが失敗したか、キャンセルされました。", - "System Default ({sys_native})": "システムデフォルト ({sys_native})", + "One-Click Install": "ワンクリックインストール", + "[ERROR] Python installation failed or was cancelled.": "[ERROR] Python のインストールが失敗したか、キャンセルされました。", + "System Default ({sys_native})": "システム既定 ({sys_native})", "My Studio": "My Studio", "Python Executable": "Python 実行ファイル", "Invalid syntax": "無効な構文", - "[INFO] Downloading Playwright browsers via mirror: {url}": "[INFO] ミラーからPlaywrightブラウザーをダウンロードしています: {url}", - "[INFO] Retrying Playwright browser download via official CDN...": "[INFO] 公式CDN経由でPlaywrightブラウザーのダウンロードを再試行しています...", - "[WARN] Playwright browser installation failed across all sources, build will proceed with risk...": "[WARN] Playwrightブラウザーのインストールがすべてのソースで失敗しました。リスクを承知でビルドを続行します...", + "[INFO] Downloading Playwright browsers via mirror: {url}": "[INFO] ミラーから Playwright ブラウザーをダウンロード中: {url}", + "[INFO] Retrying Playwright browser download via official CDN...": "[INFO] 公式 CDN 経由で Playwright ブラウザーのダウンロードを再試行中...", + "[WARN] Playwright browser installation failed across all sources, build will proceed with risk...": "[WARN] Playwright ブラウザーのインストールがすべてのソースで失敗しました。リスクを承知でビルドを続行します...", "[WARN] Icon conversion to .icns failed, building without icon.": "[WARN] .icns へのアイコン変換に失敗しました。アイコンなしでビルドします。", "OK": "OK", "Unknown": "不明", - "Script and settings retained. Ready to rebuild.": "スクリプトと設定は保持されました。再ビルドの準備ができました。" -} + "Script and settings retained. Ready to rebuild.": "スクリプトと設定を保持しました。再ビルドの準備が完了しました。", + "Packaging Mode:": "パッケージングモード:", + "Compatibility Mode (Default)": "互換モード (既定)", + "Lite Mode (Smaller size)": "軽量モード (サイズ削減)", + "Maximum compatibility. Recommended for apps with complex dynamic imports.": "最高の互換性。複雑な動的インポートを使用するアプリに推奨。", + "Smaller output size. Recommended for 95% of standard apps.": "出力サイズを最小化。一般的なアプリに推奨。", + "Tip: Build failed in Lite Mode. You can try switching to [Compatibility Mode] in Build Settings and rebuild.": "ヒント: 軽量モードでのビルドに失敗しました。[ビルド設定] で [互換モード] に切り替えて再ビルドをお試しください。", + "Keep Virtual Environment (Faster Rebuilds)": "仮想環境を保持 (高速再ビルド)", + "[INFO] Reusing existing virtual environment...": "[INFO] 既存のローカル仮想環境を再利用中..." +} \ No newline at end of file diff --git a/qpypack/locales/ko_KR.json b/qpypack/locales/ko_KR.json index 6c90782..f1ff4b4 100644 --- a/qpypack/locales/ko_KR.json +++ b/qpypack/locales/ko_KR.json @@ -20,7 +20,7 @@ "Resources": "리소스", "Optimization": "최적화", "Package Map": "패키지 매핑", - "Execution Log": "실행 로그", + "Execution Log": "실행 기록", "Loaded: {filename}": "로드 완료: {filename}", "Parsing metadata...": "메타데이터 분석 중...", "Ready, waiting for build.": "준비 완료. 빌드 대기 중.", @@ -47,14 +47,14 @@ "Browse": "찾아보기...", "AST Scan": "AST 구문 분석", "Add File": "파일 추가", - "Add Dir": "폴더 추가", + "Add Dir": "디렉터리 추가", "Remove Selected": "선택 삭제", "Clear All": "모두 지우기", "Add Mapping": "매핑 추가", "Restore Defaults": "기본값 복원", "Export Preset...": "프리셋 내보내기...", "Import Preset...": "프리셋 가져오기...", - "Reset to Default Config": "기본 설정으로 리셋", + "Reset to Default Config": "기본 설정으로 재설정", "Cancel & Return": "취소 및 돌아가기", "Cancel": "취소", "Configure Build Settings": "빌드 매개변수 구성", @@ -108,11 +108,11 @@ "Target relative path:": "대상 상대 경로:", "Import name (e.g. cv2):": "import 이름 (예: cv2):", "PyPI package name for [{imp_name}]:": "[{imp_name}] PyPI 패키지 이름:", - "One-File Mode (--onefile)": "단일 파일 모드 (--onefile)", - "Folder Mode (--onedir)": "폴더 모드 (--onedir)", + "One-File Mode (--onefile)": "단일 파일 (--onefile)", + "Folder Mode (--onedir)": "폴더 (--onedir)", "Contents Directory (--contents-directory):": "내부 리소스 디렉터리:", "Internal directory name for dependencies (default: _internal)": "의존성 및 리소스를 위한 내부 디렉터리 이름 (기본값: _internal)", - "Hide Console (--noconsole)": "콘솔 창 숨기기 (--noconsole)", + "Hide Console (--noconsole)": "콘솔 숨기기 (--noconsole)", "Use Virtual Environment (Recommended)": "가상 환경 사용 (권장)", "Install requirements.txt": "requirements.txt 설치", "Analyze Dependencies (AST)": "의존성 자동 분석 (AST)", @@ -122,7 +122,7 @@ "Concise Log Output": "간소화된 로그 출력", "Auto-save Build Log": "빌드 로그 자동 저장", "Auto Extract Icon": "아이콘 자동 추출", - "Clean Temporary Cache After Build": "빌드 후 임시 캐시 삭제", + "Clean Temporary Cache After Build": "빌드 후 임시 캐시 정리", "Sound Notification": "완료 알림음", "Leave blank to auto-detect system default Python": "비워두면 자동 감지합니다", "Leave blank to auto-match script name": "비워두면 스크립트 이름을 사용합니다", @@ -248,7 +248,7 @@ "Python Environment Management": "Python 환경 관리", "Python Environment Required
Application build depends on a Python interpreter.
Please select a version to automatically download, install, and configure environment variables.
": "Python 환경 필요
애플리케이션 빌드에는 Python 인터프리터가 필요합니다.
버전을 선택하여 환경 변수를 자동으로 다운로드, 설치 및 구성하세요.
", "Python Environment Management
Supports switching locally detected Python environments or downloading new versions.": "Python 환경 관리
로컬에서 감지된 Python 환경을 전환하거나 새 버전을 다운로드할 수 있습니다.", - "💡 Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "💡 권장 사항: 최적의 빌드 호환성과 엔진 지원을 위해 Python 3.11.9를 권장합니다.", + "Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "권장 사항: 최적의 빌드 호환성과 엔진 지원을 위해 Python 3.11.9를 권장합니다.", "View Python": "Python 보기", "Locally Detected Pythons": "로컬에서 감지된 Python", "Download New Version": "새 버전 다운로드", @@ -266,8 +266,8 @@ "Later": "나중에", "Python Environment Installed Successfully!

System environment variables updated. Recommended to exit and restart the software to apply changes.": "Python 환경이 성공적으로 설치되었습니다!

시스템 환경 변수가 업데이트되었습니다. 변경 사항을 적용하려면 소프트웨어를 종료하고 다시 시작하는 것이 좋습니다.", "Python installed. Please restart QPyPack manually later.": "Python이 설치되었습니다. 나중에 수동으로 QPyPack을 다시 시작하십시오.", - "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\n💡 Tip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[구문 오류] 소스 코드 구문 분석 실패, 빌드 중단됨:\n - 파일: {file}\n - 라인: {line}\n - 세부 정보: {desc}\n\n💡 팁: 이는 패키징 도구의 오류가 아닙니다.\n선택한 [빌드 Python 버전]이 [코드 작성/테스트]에 사용한 버전과 일치하는지 확인하세요.\n이전 Python 환경에서 최신 구문을 사용하면 이 오류가 발생합니다.\n올바른 Python 버전으로 전환하려면 [빌드 설정] -> [엔진]으로 이동하는 것이 좋습니다.", - "[FAILED] Build interrupted exceptionally!\n\n🔍 Common Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] 예외적으로 빌드가 중단되었습니다!\n\n🔍 일반적인 문제 해결:\n1. 환경 불일치(가장 일반적): 선택한 Python 버전이 소스 코드와 호환되지 않습니다. [빌드 설정]으로 이동하여 이 코드에 사용하는 Python 버전으로 전환하세요.\n2. 누락된 종속성: 위의 '상세 모드'를 클릭하여 ModuleNotFoundError가 있는지 확인하세요.\n3. 바이러스 백신 차단: 보안 소프트웨어가 빌드 프로세스를 차단하고 있지 않은지 확인하세요.\n\n(참고: 이는 일반적으로 패키징 엔진 자체보다는 환경/코드 불일치로 인해 발생합니다. 정확한 이유는 상세 로그를 확인하세요.)", + "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\nTip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[구문 오류] 소스 코드 구문 분석 실패, 빌드 중단됨:\n - 파일: {file}\n - 라인: {line}\n - 세부 정보: {desc}\n\n팁: 이는 패키징 도구의 오류가 아닙니다.\n선택한 [빌드 Python 버전]이 [코드 작성/테스트]에 사용한 버전과 일치하는지 확인하세요.\n이전 Python 환경에서 최신 구문을 사용하면 이 오류가 발생합니다.\n올바른 Python 버전으로 전환하려면 [빌드 설정] -> [엔진]으로 이동하는 것이 좋습니다.", + "[FAILED] Build interrupted exceptionally!\n\nCommon Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] 예외적으로 빌드가 중단되었습니다!\n\n일반적인 문제 해결:\n1. 환경 불일치(가장 일반적): 선택한 Python 버전이 소스 코드와 호환되지 않습니다. [빌드 설정]으로 이동하여 이 코드에 사용하는 Python 버전으로 전환하세요.\n2. 누락된 종속성: 위의 '상세 모드'를 클릭하여 ModuleNotFoundError가 있는지 확인하세요.\n3. 바이러스 백신 차단: 보안 소프트웨어가 빌드 프로세스를 차단하고 있지 않은지 확인하세요.\n\n(참고: 이는 일반적으로 패키징 엔진 자체보다는 환경/코드 불일치로 인해 발생합니다. 정확한 이유는 상세 로그를 확인하세요.)", "Status: Build Cancelled": "상태: 빌드 취소됨", "Build Cancelled": "빌드 취소됨", "[WARN] Package '{pkg}' failed to install, skipping...": "[WARN] 패키지 '{pkg}' 설치 실패, 건너뛰는 중...", @@ -284,7 +284,13 @@ "OK": "확인", "Unknown": "알 수 없음", "System Temp Directory (Anti-Lock / Cloud-Friendly)": "시스템 임시 디렉토리 (잠금 방지 / 클라우드 동기화 친화적)", - "Script and settings retained. Ready to rebuild.": "스크립트 및 설정이 유지되었습니다. 다시 빌드할 준비가 되었습니다." -} - - + "Script and settings retained. Ready to rebuild.": "스크립트 및 설정이 유지되었습니다. 다시 빌드할 준비가 되었습니다.", + "Packaging Mode:": "패키징 모드:", + "Compatibility Mode (Default)": "호환 모드 (기본값)", + "Lite Mode (Smaller size)": "경량 모드 (용량 최적화)", + "Maximum compatibility. Recommended for apps with complex dynamic imports.": "최대 호환성. 복잡한 동적 임포트를 사용하는 앱에 권장.", + "Smaller output size. Recommended for 95% of standard apps.": "최소 출력 용량. 95%의 일반 앱에 권장.", + "Tip: Build failed in Lite Mode. You can try switching to [Compatibility Mode] in Build Settings and rebuild.": "팁: 경량 모드에서 빌드에 실패했습니다. [빌드 설정]에서 [호환 모드]로 전환 후 다시 시도해 보세요.", + "Keep Virtual Environment (Faster Rebuilds)": "가상 환경 유지 (빠른 재빌드)", + "[INFO] Reusing existing virtual environment...": "[INFO] 기존 로컬 가상 환경 재사용 중..." +} \ No newline at end of file diff --git a/qpypack/locales/pt_BR.json b/qpypack/locales/pt_BR.json index 470c12f..36a9df3 100644 --- a/qpypack/locales/pt_BR.json +++ b/qpypack/locales/pt_BR.json @@ -50,10 +50,10 @@ "Remove Selected": "Remover Selecionado", "Clear All": "Limpar Tudo", "Add Mapping": "Adicionar Mapeamento", - "Restore Defaults": "Restaurar Padrões", + "Restore Defaults": "Restaurar Valores Padrão", "Export Preset...": "Exportar Predefinição...", "Import Preset...": "Importar Predefinição...", - "Reset to Default Config": "Restaurar configurações padrão", + "Reset to Default Config": "Restaurar Configurações Padrão", "Cancel & Return": "Cancelar e voltar", "Cancel": "Cancelar", "Configure Build Settings": "Configurações de compilação", @@ -108,8 +108,8 @@ "Target relative path:": "Caminho relativo de destino:", "Import name (e.g. cv2):": "Nome de importação (ex: cv2):", "PyPI package name for [{imp_name}]:": "Nome do pacote PyPI para [{imp_name}]:", - "One-File Mode (--onefile)": "Modo de arquivo único (--onefile)", - "Folder Mode (--onedir)": "Modo Pasta (--onedir)", + "One-File Mode (--onefile)": "Arquivo único (--onefile)", + "Folder Mode (--onedir)": "Pasta (--onedir)", "Contents Directory (--contents-directory):": "Diretório de Conteúdo (--contents-directory):", "Internal directory name for dependencies (default: _internal)": "Nome do diretório interno para dependências (padrão: _internal)", "Hide Console (--noconsole)": "Ocultar console (--noconsole)", @@ -122,7 +122,7 @@ "Concise Log Output": "Saída de log concisa", "Auto-save Build Log": "Salvar log automaticamente", "Auto Extract Icon": "Extrair ícone automaticamente", - "Clean Temporary Cache After Build": "Limpar cache após compilação", + "Clean Temporary Cache After Build": "Limpar cache temporário após a compilação", "Sound Notification": "Notificação sonora ao concluir", "Leave blank to auto-detect system default Python": "Deixe em branco para detectar automaticamente", "Leave blank to auto-match script name": "Deixe em branco para usar o nome do script", @@ -240,7 +240,7 @@ "Python Environment Management": "Gerenciamento de Ambiente Python", "Python Environment Required
Application build depends on a Python interpreter.
Please select a version to automatically download, install, and configure environment variables.
": "Ambiente Python Necessário
A compilação depende de um intérprete Python.
Selecione uma versão para baixar, instalar e configurar variáveis de ambiente automaticamente.
", "Python Environment Management
Supports switching locally detected Python environments or downloading new versions.": "Gerenciamento de Ambiente Python
Suporta a troca de ambientes Python locais detectados ou o download de novas versões.", - "💡 Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "💡 Recomendação: O Python 3.11.9 é recomendado para melhor compatibilidade de compilação e suporte de motor.", + "Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "Recomendação: O Python 3.11.9 é recomendado para melhor compatibilidade de compilação e suporte de motor.", "View Python": "Ver Python", "Locally Detected Pythons": "Pythons Detectados Localmente", "Download New Version": "Baixar Nova Versão", @@ -258,8 +258,8 @@ "Later": "Depois", "Python Environment Installed Successfully!

System environment variables updated. Recommended to exit and restart the software to apply changes.": "Ambiente Python Instalado com Sucesso!

Variáveis de ambiente do sistema atualizadas. Recomendado reiniciar o software para aplicar as mudanças.", "Python installed. Please restart QPyPack manually later.": "Python instalado. Por favor, reinicie o QPyPack manualmente depois.", - "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\n💡 Tip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[Erro de Sintaxe] Falha na análise sintática, compilação abortada:\n - Arquivo: {file}\n - Linha: {line}\n - Detalhe: {desc}\n\n💡 Dica: Normalmente, isso NÃO é uma falha da ferramenta.\nCertifique-se de que a [Versão do Python] selecionada corresponda à versão usada para [Escrever o Código].\nUsar sintaxe recente em um ambiente antigo causará este erro.\nRecomendamos ir em [Configurações] -> [Motor] para trocar para a versão correta do Python.", - "[FAILED] Build interrupted exceptionally!\n\n🔍 Common Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] Compilação interrompida excepcionalmente!\n\n🔍 Solução de Problemas Comuns:\n1. Incompatibilidade de Ambiente (Mais Comum): A versão selecionada é incompatível com o código. Vá para [Configurações] para alterar a versão.\n2. Dependências Ausentes: Clique em 'Modo Detalhado' acima para verificar ModuleNotFoundError.\n3. Bloqueio de Antivírus: Certifique-se de que seu software de segurança não está bloqueando o processo.\n\n(Nota: Normalmente causado por discrepâncias de ambiente/código e não pela engine em si. Verifique o log detalhado.)", + "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\nTip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[Erro de Sintaxe] Falha na análise sintática, compilação abortada:\n - Arquivo: {file}\n - Linha: {line}\n - Detalhe: {desc}\n\nDica: Normalmente, isso NÃO é uma falha da ferramenta.\nCertifique-se de que a [Versão do Python] selecionada corresponda à versão usada para [Escrever o Código].\nUsar sintaxe recente em um ambiente antigo causará este erro.\nRecomendamos ir em [Configurações] -> [Motor] para trocar para a versão correta do Python.", + "[FAILED] Build interrupted exceptionally!\n\nCommon Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] Compilação interrompida excepcionalmente!\n\nSolução de Problemas Comuns:\n1. Incompatibilidade de Ambiente (Mais Comum): A versão selecionada é incompatível com o código. Vá para [Configurações] para alterar a versão.\n2. Dependências Ausentes: Clique em 'Modo Detalhado' acima para verificar ModuleNotFoundError.\n3. Bloqueio de Antivírus: Certifique-se de que seu software de segurança não está bloqueando o processo.\n\n(Nota: Normalmente causado por discrepâncias de ambiente/código e não pela engine em si. Verifique o log detalhado.)", "Status: Build Cancelled": "Status: Compilação Cancelada", "Build Cancelled": "Compilação Cancelada", "[WARN] Package '{pkg}' failed to install, skipping...": "[WARN] Pacote '{pkg}' falhou ao instalar, pulando...", @@ -282,5 +282,13 @@ "[WARN] Icon conversion to .icns failed, building without icon.": "[WARN] A conversão do ícone para .icns falhou, construindo sem ícone.", "OK": "OK", "Unknown": "Desconhecido", - "Script and settings retained. Ready to rebuild.": "Script e configurações mantidos. Pronto para reconstruir." + "Script and settings retained. Ready to rebuild.": "Script e configurações mantidos. Pronto para reconstruir.", + "Packaging Mode:": "Modo de empacotamento:", + "Compatibility Mode (Default)": "Modo de compatibilidade (Padrão)", + "Lite Mode (Smaller size)": "Modo leve (Tamanho menor)", + "Maximum compatibility. Recommended for apps with complex dynamic imports.": "Compatibilidade máxima. Recomendado para apps com importações dinâmicas complexas.", + "Smaller output size. Recommended for 95% of standard apps.": "Menor tamanho de saída. Recomendado para 95% dos aplicativos padrão.", + "Tip: Build failed in Lite Mode. You can try switching to [Compatibility Mode] in Build Settings and rebuild.": "Dica: Falha ao compilar no Modo Leve. Tente alternar para o [Modo de Compatibilidade] nas Configurações e recompilar.", + "Keep Virtual Environment (Faster Rebuilds)": "Manter ambiente virtual (Recompilação mais rápida)", + "[INFO] Reusing existing virtual environment...": "[INFO] Reutilizando o ambiente virtual existente..." } diff --git a/qpypack/locales/ru_RU.json b/qpypack/locales/ru_RU.json index 5ac3b39..215a853 100644 --- a/qpypack/locales/ru_RU.json +++ b/qpypack/locales/ru_RU.json @@ -19,7 +19,7 @@ "Resources": "Ресурсы", "Optimization": "Оптимизация", "Package Map": "Сопоставление", - "Execution Log": "Журнал выполнения", + "Execution Log": "Журнал работы", "Loaded: {filename}": "Загружено: {filename}", "Parsing metadata...": "Анализ метаданных...", "Ready, waiting for build.": "Готово, ожидание сборки.", @@ -50,10 +50,10 @@ "Remove Selected": "Удалить выбранное", "Clear All": "Очистить все", "Add Mapping": "Добавить правило", - "Restore Defaults": "Восстановить", + "Restore Defaults": "Восстановить значения по умолчанию", "Export Preset...": "Экспортировать пресет...", "Import Preset...": "Импортировать пресет...", - "Reset to Default Config": "Сбросить настройки", + "Reset to Default Config": "Сбросить параметры по умолчанию", "Cancel & Return": "Отменить и вернуться", "Cancel": "Отмена", "Configure Build Settings": "Настройка параметров сборки", @@ -108,12 +108,12 @@ "Target relative path:": "Целевой относительный путь:", "Import name (e.g. cv2):": "Имя импорта (напр. cv2):", "PyPI package name for [{imp_name}]:": "Имя пакета PyPI для [{imp_name}]:", - "One-File Mode (--onefile)": "Режим одного файла (--onefile)", - "Folder Mode (--onedir)": "Режим папки (--onedir)", + "One-File Mode (--onefile)": "Один файл (--onefile)", + "Folder Mode (--onedir)": "Папка (--onedir)", "Contents Directory (--contents-directory):": "Внутренний каталог (--contents-directory):", "Internal directory name for dependencies (default: _internal)": "Имя внутренней папки для зависимостей (по умолчанию: _internal)", "Hide Console (--noconsole)": "Скрыть консоль (--noconsole)", - "Use Virtual Environment (Recommended)": "Использовать виртуальное окружение", + "Use Virtual Environment (Recommended)": "Виртуальное окружение (Рекомендуется)", "Install requirements.txt": "Установить requirements.txt", "Analyze Dependencies (AST)": "Анализ зависимостей (AST)", "Scan Entire Folder": "Сканировать всю папку", @@ -122,7 +122,7 @@ "Concise Log Output": "Краткий вывод журнала", "Auto-save Build Log": "Автосохранение журнала", "Auto Extract Icon": "Автоматическое извлечение иконки", - "Clean Temporary Cache After Build": "Очищать кэш после сборки", + "Clean Temporary Cache After Build": "Очистить временный кэш после сборки", "Sound Notification": "Звуковое уведомление", "Leave blank to auto-detect system default Python": "Оставьте пустым для автоопределения", "Leave blank to auto-match script name": "Оставьте пустым для автоопределения имени", @@ -248,7 +248,7 @@ "Python Environment Management": "Управление окружением Python", "Python Environment Required
Application build depends on a Python interpreter.
Please select a version to automatically download, install, and configure environment variables.
": "Требуется окружение Python
Сборка зависит от интерпретатора Python.
Выберите версию для автоматической загрузки, установки и настройки переменных среды.
", "Python Environment Management
Supports switching locally detected Python environments or downloading new versions.": "Управление окружением Python
Поддерживает переключение локально обнаруженных окружений Python или загрузку новых версий.", - "💡 Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "💡 Рекомендация: Для оптимальной совместимости сборки и поддержки движка рекомендуется Python 3.11.9.", + "Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "Рекомендация: Для оптимальной совместимости сборки и поддержки движка рекомендуется Python 3.11.9.", "View Python": "Показать Python", "Locally Detected Pythons": "Локально обнаруженные Python", "Download New Version": "Скачать новую версию", @@ -266,8 +266,8 @@ "Later": "Позже", "Python Environment Installed Successfully!

System environment variables updated. Recommended to exit and restart the software to apply changes.": "Окружение Python успешно установлено!

Системные переменные обновлены. Рекомендуется перезапустить программу.", "Python installed. Please restart QPyPack manually later.": "Python установлен. Пожалуйста, перезапустите QPyPack позже вручную.", - "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\n💡 Tip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[Синтаксическая ошибка] Ошибка синтаксического анализа исходного кода, сборка прервана:\n - Файл: {file}\n - Строка: {line}\n - Детали: {desc}\n\n💡 Совет: Обычно это НЕ вина инструмента упаковки.\nУбедитесь, что выбранная [Версия Python] совпадает с той, которую вы использовали для написания кода.\nИспользование более нового синтаксиса в старом окружении Python вызовет эту ошибку.\nРекомендуется перейти в [Параметры сборки] -> [Движок], чтобы переключиться на правильную версию Python.", - "[FAILED] Build interrupted exceptionally!\n\n🔍 Common Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] Сборка прервана с ошибкой!\n\n🔍 Часто встречающиеся проблемы:\n1. Несовпадение окружения (Чаще всего): Выбранная версия Python несовместима с исходным кодом. Перейдите в [Параметры сборки] для изменения версии Python.\n2. Отсутствующие зависимости: Нажмите 'Подробный режим' выше для проверки ModuleNotFoundError.\n3. Блокировка антивирусом: Убедитесь, что защитное ПО не блокирует процесс.\n\n(Примечание: Обычно это связано с несовпадениями среды/кода, а не с самим движком упаковки. См. журнал.)", + "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\nTip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[Синтаксическая ошибка] Ошибка синтаксического анализа исходного кода, сборка прервана:\n - Файл: {file}\n - Строка: {line}\n - Детали: {desc}\n\nСовет: Обычно это НЕ вина инструмента упаковки.\nУбедитесь, что выбранная [Версия Python] совпадает с той, которую вы использовали для написания кода.\nИспользование более нового синтаксиса в старом окружении Python вызовет эту ошибку.\nРекомендуется перейти в [Параметры сборки] -> [Движок], чтобы переключиться на правильную версию Python.", + "[FAILED] Build interrupted exceptionally!\n\nCommon Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] Сборка прервана с ошибкой!\n\nЧасто встречающиеся проблемы:\n1. Несовпадение окружения (Чаще всего): Выбранная версия Python несовместима с исходным кодом. Перейдите в [Параметры сборки] для изменения версии Python.\n2. Отсутствующие зависимости: Нажмите 'Подробный режим' выше для проверки ModuleNotFoundError.\n3. Блокировка антивирусом: Убедитесь, что защитное ПО не блокирует процесс.\n\n(Примечание: Обычно это связано с несовпадениями среды/кода, а не с самим движком упаковки. См. журнал.)", "Status: Build Cancelled": "Статус: Сборка отменена", "Build Cancelled": "Сборка отменена", "[WARN] Package '{pkg}' failed to install, skipping...": "[WARN] Ошибка установки пакета '{pkg}', пропуск...", @@ -283,5 +283,13 @@ "[WARN] Icon conversion to .icns failed, building without icon.": "[WARN] Преобразование иконки в .icns не удалось, сборка без иконки.", "OK": "ОК", "Unknown": "Неизвестно", - "Script and settings retained. Ready to rebuild.": "Скрипт и настройки сохранены. Готово к пересборке." -} + "Script and settings retained. Ready to rebuild.": "Скрипт и настройки сохранены. Готово к пересборке.", + "Packaging Mode:": "Режим сборки:", + "Compatibility Mode (Default)": "Режим совместимости (По умолчанию)", + "Lite Mode (Smaller size)": "Облегченный режим (Меньший размер)", + "Maximum compatibility. Recommended for apps with complex dynamic imports.": "Максимальная совместимость. Рекомендуется для приложений со сложным динамическим импортом.", + "Smaller output size. Recommended for 95% of standard apps.": "Меньший размер файла. Рекомендуется для 95% стандартных приложений.", + "Tip: Build failed in Lite Mode. You can try switching to [Compatibility Mode] in Build Settings and rebuild.": "Совет: Сборка в облегченном режиме не удалась. Попробуйте переключиться на [Режим совместимости] в настройках и повторить сборку.", + "Keep Virtual Environment (Faster Rebuilds)": "Сохранять виртуальное окружение (Ускоряет пересборку)", + "[INFO] Reusing existing virtual environment...": "[INFO] Повторное использование существующего виртуального окружения..." +} \ No newline at end of file diff --git a/qpypack/locales/zh_TW.json b/qpypack/locales/zh_TW.json index 04e1fde..ff57c98 100644 --- a/qpypack/locales/zh_TW.json +++ b/qpypack/locales/zh_TW.json @@ -51,21 +51,21 @@ "Remove Selected": "移除選取", "Clear All": "清除全部", "Add Mapping": "新增對映", - "Restore Defaults": "還原預設", + "Restore Defaults": "還原預設值", "Export Preset...": "匯出預設...", "Import Preset...": "匯入預設...", - "Reset to Default Config": "重置為預設設定", + "Reset to Default Config": "重設為預設設定", "Cancel & Return": "取消並返回", "Cancel": "取消", "Configure Build Settings": "設定建置參數", "Toggle Execution Log": "顯示/隱藏日誌", "Detailed Mode": "詳細模式", - "Concise Mode": "精簡模式", + "Concise Mode": "簡潔模式", "Copy": "複製", "Select All": "全選", "Clear Log": "清除日誌", "Export Log...": "匯出日誌...", - "Reset": "重置", + "Reset": "重設", "Are you sure you want to reset all preferences?
All settings will be restored to default state.": "確定重置所有偏好設定?
所有設定將恢復為預設狀態。", "Engine & Environment": "建置引擎與環境", "Execution Mode": "執行模式", @@ -123,7 +123,7 @@ "Concise Log Output": "精簡日誌輸出", "Auto-save Build Log": "自動儲存日誌", "Auto Extract Icon": "自動擷取圖示", - "Clean Temporary Cache After Build": "建置後清理快取", + "Clean Temporary Cache After Build": "建置後清除快取", "Sound Notification": "完成提示音", "Leave blank to auto-detect system default Python": "留空則自動偵測系統預設 Python", "Leave blank to auto-match script name": "留空則自動比對腳本名稱", @@ -249,7 +249,7 @@ "Python Environment Management": "Python 環境管理", "Python Environment Required
Application build depends on a Python interpreter.
Please select a version to automatically download, install, and configure environment variables.
": "需要 Python 建置環境
應用程式建置需要依賴 Python 解譯器。
請選擇版本以自動下載安裝與設定環境變數。
", "Python Environment Management
Supports switching locally detected Python environments or downloading new versions.": "Python 環境管理
支援切換本地已偵測到的 Python 環境或下載新版本。", - "💡 Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "💡 建議: 推薦選擇 Python 3.11.9,該版本具備最佳的編譯相容性與引擎支援。", + "Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": "建議: 推薦選擇 Python 3.11.9,該版本具備最佳的編譯相容性與引擎支援。", "View Python": "檢視 Python", "Locally Detected Pythons": "已偵測環境", "Download New Version": "下載新版本", @@ -267,8 +267,8 @@ "Later": "稍後", "Python Environment Installed Successfully!

System environment variables updated. Recommended to exit and restart the software to apply changes.": "Python 環境安裝成功!

建議退出軟體後重新打開以生效環境變數。", "Python installed. Please restart QPyPack manually later.": "Python 已安裝,請稍後手動重啟軟體。", - "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\n💡 Tip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[語法錯誤] 原始碼語法解析失敗,建置中止:\n - 檔案: {file}\n - 行號: {line}\n - 細節: {desc}\n\n💡 提示:這通常不是打包工具的故障。\n請確認您當前選擇的 [打包 Python 版本] 與您 [編寫程式碼時的版本] 是否一致。\n高版本語法在低版本 Python 中會導致此錯誤。\n建議前往 [建置設定] -> [建置引擎] 切換至對應版本的 Python。", - "[FAILED] Build interrupted exceptionally!\n\n🔍 Common Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] 建置異常中斷!\n\n🔍 常見原因排查:\n1. 環境不匹配 (最常見):您選擇的打包 Python 版本與您的原始碼不相容。請前往 [建置設定] 切換為您平時開發該程式碼的 Python 版本。\n2. 依賴缺失:請點擊上方切換至「詳細模式」,查看是否有 ModuleNotFoundError。\n3. 防毒軟體攔截:請檢查是否有安全軟體阻止了打包過程。\n\n(注意:這通常是環境配置與程式碼差異導致,並非打包引擎本身故障,請查閱詳細日誌獲取確切原因。)", + "[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Line: Line {line}\n - Detail: {desc}\n\nTip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[語法錯誤] 原始碼語法解析失敗,建置中止:\n - 檔案: {file}\n - 行號: {line}\n - 細節: {desc}\n\n提示:這通常不是打包工具的故障。\n請確認您當前選擇的 [打包 Python 版本] 與您 [編寫程式碼時的版本] 是否一致。\n高版本語法在低版本 Python 中會導致此錯誤。\n建議前往 [建置設定] -> [建置引擎] 切換至對應版本的 Python。", + "[FAILED] Build interrupted exceptionally!\n\nCommon Troubleshooting:\n1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": "[FAILED] 建置異常中斷!\n\n常見原因排查:\n1. 環境不匹配 (最常見):您選擇的打包 Python 版本與您的原始碼不相容。請前往 [建置設定] 切換為您平時開發該程式碼的 Python 版本。\n2. 依賴缺失:請點擊上方切換至「詳細模式」,查看是否有 ModuleNotFoundError。\n3. 防毒軟體攔截:請檢查是否有安全軟體阻止了打包過程。\n\n(注意:這通常是環境配置與程式碼差異導致,並非打包引擎本身故障,請查閱詳細日誌獲取確切原因。)", "Status: Build Cancelled": "狀態: 建置已取消", "Build Cancelled": "建置已取消", "[WARN] Package '{pkg}' failed to install, skipping...": "[WARN] 套件 '{pkg}' 安裝失敗,已跳過...", @@ -284,5 +284,13 @@ "[WARN] Icon conversion to .icns failed, building without icon.": "[WARN] 圖示轉換為 .icns 失敗,將不使用圖示建置。", "OK": "確定", "Unknown": "未知", - "Script and settings retained. Ready to rebuild.": "已保留當前設定,就緒等待重新建置。" -} + "Script and settings retained. Ready to rebuild.": "已保留當前設定,就緒等待重新建置。", + "Packaging Mode:": "打包模式:", + "Compatibility Mode (Default)": "相容模式 (預設)", + "Lite Mode (Smaller size)": "精簡模式 (體積小)", + "Maximum compatibility. Recommended for apps with complex dynamic imports.": "最大相容性。適合使用了複雜動態導入的專案。", + "Smaller output size. Recommended for 95% of standard apps.": "產物體積最小。推薦 95% 的常規應用程式使用。", + "Tip: Build failed in Lite Mode. You can try switching to [Compatibility Mode] in Build Settings and rebuild.": "提示: 精簡模式建置失敗。您可以嘗試在【建置設定】中勾選 [相容模式] 重新打包。", + "Keep Virtual Environment (Faster Rebuilds)": "保留虛擬環境 (加速重編)", + "[INFO] Reusing existing virtual environment...": "[INFO] 複用本地已存在的虛擬環境..." +} \ No newline at end of file diff --git a/qpypack/main.py b/qpypack/main.py index dc42a8a..8ba6f80 100644 --- a/qpypack/main.py +++ b/qpypack/main.py @@ -40,9 +40,9 @@ from PySide6.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QHBoxLayo QHeaderView, QDialog, QRadioButton) from PySide6.QtCore import (Qt, QThread, Signal, QPropertyAnimation, QEasingCurve, QParallelAnimationGroup, QFileInfo, QVariantAnimation, - QTimer, QPointF, QRectF, QRect, QSize, QUrl, QLocale, QObject) + QTimer, QPointF, QRectF, QRect, QSize, QUrl, QLocale, QObject, QTranslator, QLibraryInfo) from PySide6.QtGui import (QFont, QDragEnterEvent, QDropEvent, QIcon, QPixmap, - QPainter, QColor, QPen, QImage, QImageWriter, QDesktopServices) + QPainter, QColor, QPen, QImage, QImageWriter, QDesktopServices, QPalette) from PySide6.QtSvg import QSvgRenderer try: @@ -52,7 +52,7 @@ except ImportError: HAS_QT_AUDIO = False __app_name__ = "QPyPack" -__version__ = "2.7.3" +__version__ = "2.7.4" __author__ = "QwejayHuang" __company__ = "QwejayHuang" __description__ = "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka" @@ -62,7 +62,6 @@ _CONFIG_DIR.mkdir(parents=True, exist_ok=True) CONFIG_FILE = (_CONFIG_DIR / "config.ini").as_posix() ZH_CN_DICT = { - # 1. 源镜像名称 (PIP Mirrors) "PyPI Official (Global Default)": "PyPI 官方源 (默认)", "Python TestPyPI": "TestPyPI 测试源", "AWS PyPI Mirror (US/EU)": "AWS PyPI 镜像 (美/欧)", @@ -72,13 +71,11 @@ ZH_CN_DICT = { "Huawei Cloud (China)": "华为云镜像", "USTC (China)": "中科大镜像", - # 2. 软件元数据与标语 (Metadata & Taglines) "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka": "基于 PyInstaller 与 Nuitka 的现代化跨平台 Python 打包工具", "Python Packaging, Reimagined.": "重新定义 Python 应用打包体验", "Drop Python source code to start": "拖拽 Python 源码至此开始", "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "拖拽 Python 脚本 (.py/.pyw) 到此\n或点击浏览", - # 3. 导航与选项卡 (Tabs & Navigation) "Build Settings": "构建设置", "Preferences": "偏好设置", "About": "关于", @@ -89,7 +86,6 @@ ZH_CN_DICT = { "Package Map": "包名映射", "Execution Log": "执行日志", - # 4. 主界面状态与引导 (Main UI & Status Prompts) "Loaded: {filename}": "已载入: {filename}", "Parsing metadata...": "解析元数据...", "Ready, waiting for build.": "就绪,等待构建", @@ -106,10 +102,11 @@ ZH_CN_DICT = { "Status: Build Completed": "状态: 构建完成", "Status: Build Failed": "状态: 构建失败", "Status: Workspace Reset": "状态: 工作区已重置", + "Status: Build Cancelled": "状态: 构建已取消", + "Build Cancelled": "构建已取消", " [Console]": " [控制台]", " [No Console]": " [无控制台]", - # 5. 操作按钮与右键菜单 (Buttons & Context Menus) "Start Build": "开始构建", "Stop Build": "停止构建", "Open Directory": "打开目录", @@ -140,7 +137,6 @@ ZH_CN_DICT = { "Are you sure you want to reset all preferences?
All settings will be restored to default state.": "确定重置所有偏好设置?
所有设置将恢复为默认状态。", - # 6. 设置分组卡片与表单标签 (Card Titles & Form Labels) "Engine & Environment": "引擎与环境", "Execution Mode": "执行模式", "Mirrors & Scanner": "镜像与扫描", @@ -185,15 +181,18 @@ ZH_CN_DICT = { "PyPI package name for [{imp_name}]:": "[{imp_name}] 对应 PyPI 包名:", "Script and settings retained. Ready to rebuild.": "已保留当前配置,就绪等待重新构建。", - # 7. 复选框、占位符与悬停提示 (Checkboxes, Placeholders & Tooltips) - "One-File Mode (--onefile)": "单文件 (--onefile)", + "One-File Mode (--onefile)": "单文件模式 (--onefile)", + "Folder Mode (--onedir)": "文件夹模式 (--onedir)", + "Contents Directory (--contents-directory):": "内部资源目录:", + "Internal directory name for dependencies (default: _internal)": "内部依赖与资源存放目录名 (默认: _internal)", "Hide Console (--noconsole)": "隐藏控制台 (--noconsole)", "Use Virtual Environment (Recommended)": "使用虚拟环境 (推荐)", + "Keep Virtual Environment (Faster Rebuilds)": "保留虚拟环境 (适合频繁重编)", + "[INFO] Reusing existing virtual environment...": "[INFO] 复用本地已存在的虚拟环境...", "Install requirements.txt": "安装 requirements.txt", "Analyze Dependencies (AST)": "分析依赖 (原生 AST)", "Scan Entire Folder": "扫描整个文件夹", "Enable UPX Compression": "启用 UPX 压缩", - "Lite Mode (Exclude Dev/Test Dependencies)": "精简模式 (排除开发/测试依赖)", "Concise Log Output": "精简日志", "Auto-save Build Log": "自动保存日志", "Auto Extract Icon": "自动提取图标", @@ -205,30 +204,23 @@ ZH_CN_DICT = { "Comma separated (e.g. pandas, PyQt5)": "逗号分隔 (如 pandas, PyQt5)", "Comma separated (e.g. tkinter, matplotlib)": "逗号分隔 (如 tkinter, matplotlib)", "Leave blank to auto-detect from environment variables": "留空则从环境变量自动检测", - "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "动态排除构建环境的冗余依赖,提升速度并减小体积。", "Double-click to edit target path; Drag & drop supported": "双击编辑目标路径;支持拖拽", "Double-click to edit target path; Drag & drop supported. Use 'Export Preset' to save for reuse.": "双击编辑目标路径;支持拖拽。建议使用「导出预设」进行保存。", - # 8. 引擎说明与平台兼容性矩阵 (Engine Help & Platform Matrices) "PyInstaller — Bundles Python interpreter and bytecode. Fast build speed, zero configuration (no C compiler needed), and excellent compatibility.": "PyInstaller — 打包解释器与字节码。构建迅速,零配置 (无需 C 编译器),兼容性优异。", - "Nuitka — Compiles source code into native C/C++ binary. Produces smaller package size, faster execution, and deep anti-decompilation protection (requires C compiler).": "Nuitka — 编译为原生 C/C++ 二进制。体积更小,执行更快,具备强抗反编译能力 (需 C 编译器)。", '
Python {ver} Platform Matrix:
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility': '
Python {ver} 平台支持:
✔ Windows 7    ✔ Windows 8/8.1    ✔ Windows 10/11    ✔ macOS 10.9+    ✔ Linux
兼容旧系统 支持 Windows 7 及旧版操作系统', - '
Python {ver} Platform Matrix:
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux': '
Python {ver} 平台支持:
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10/11    ✔ macOS 10.9+    ✔ Linux', - '
Python {ver} Platform Matrix:
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka Auto-detecting and managing C backend compiler': '
Python {ver} 平台支持:
✖ Windows 7    ✖ Windows 8/8.1    ✔ Windows 10/11    ✔ macOS 10.13+    ✔ Linux
Nuitka 自动检测并管理 C 后端编译器', - '
Python Interpreter
Auto-detecting system environment for Windows, macOS & Linux...': '
Python 解释器
自动检测系统环境 (Win/macOS/Linux)...', - # 9. 构建日志与异常错误提示 (Log Output, Errors & Warnings) "[INFO] Build Cancelled.": "[INFO] 构建已取消。", "[INFO] Performing pre-flight environment checks...": "[INFO] 执行预构建环境检查...", "[INFO] Analyzing source code and project dependencies...": "[INFO] 分析源码与依赖...", @@ -264,6 +256,8 @@ ZH_CN_DICT = { "[INFO] Validating output files and generating final product...": "[INFO] 校验并生成最终产物...", "[INFO] Build log exported to: {path}": "[INFO] 日志已导出: {path}", "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] 清理临时构建环境...", + "[INFO] Downloading Playwright browsers via mirror: {url}": "[INFO] 通过镜像下载 Playwright 浏览器: {url}", + "[INFO] Retrying Playwright browser download via official CDN...": "[INFO] 通过官方 CDN 重试下载 Playwright 浏览器...", "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] 构建成功,输出路径: {path}", "[WARN] Target project is in a Cloud Sync directory (e.g. OneDrive/Dropbox). Cloud sync may temporarily lock build files.": "[WARN] 项目位于云同步目录,可能锁定构建文件。", "[WARN] Specified versions failed to install. Stripping version constraints for automatic compatibility match...": "[WARN] 指定版本安装失败,尝试自动匹配兼容版本...", @@ -279,7 +273,11 @@ ZH_CN_DICT = { "[WARN] Command timeout (>{timeout}s)": "[WARN] 命令超时 (>{timeout}s)", "[WARN] Detected 'requests' or 'httpx'. Auto-bundling 'certifi' certificates to prevent SSL errors.": "[WARN] 检测到网络请求库,自动捆绑 'certifi' 根证书以防止 SSL 异常。", "[WARN] Usage of '__file__' detected. In PyInstaller One-File mode, use 'sys._MEIPASS' to reliably locate bundled resource files!": "[WARN] 侦测到 '__file__' 的使用。在 PyInstaller 单文件模式下,请使用 'sys._MEIPASS' 定位资源释放路径,以免引发文件丢失错误。", - "[INFO] Tip: Packaged executables might be falsely flagged by Windows Defender/Antivirus. Adding exclusions or code-signing is recommended.": "[INFO] 提示: 独立可执行程序可能被安全软件误报。建议将其加入白名单,或为正式发布程序添加代码签名。", + "[WARN] 'multiprocessing' module detected. Ensure 'multiprocessing.freeze_support()' is called under 'if __name__ == \"__main__\":' to prevent infinite process loops (fork bombs).": "[WARN] 检测到 multiprocessing 模块。请确保在 'if __name__ == \"__main__\":' 块内调用 'multiprocessing.freeze_support()',以防引发无限进程死机。", + "[WARN] Package '{pkg}' failed to install, skipping...": "[WARN] 包 '{pkg}' 安装失败,已跳过...", + "[WARN] Playwright browser installation failed across all sources, build will proceed with risk...": "[WARN] 所有 Playwright 浏览器下载源均失败,继续构建 (有风险)...", + "[WARN] Icon conversion to .icns failed, building without icon.": "[WARN] 图标转换为 .icns 失败,将不使用图标构建。", + "[INFO] Tip: Packaged executables might be falsely flagged by Windows Defender/Antivirus. Adding exclusions or code-signing is recommended.": "[INFO] 提示: 独立可执行程序可能被安全软件误报。建议加入白名单或添加代码签名。", "[ERROR] Build aborted: Insufficient disk space (NoSpaceLeft / Errno 28). Please clean up drive space (at least 5 GB free space recommended) and try again.": "[ERROR] 构建中止: 磁盘空间不足 (NoSpaceLeft / Errno 28)。建议预留至少 5GB 可用空间。", "[ERROR] Output directory is missing write permissions: {error}": "[ERROR] 目标输出目录无写入权限: {error}", "[ERROR] Requirements file not found: {path}": "[ERROR] 指定的依赖清单文件不存在: {path}", @@ -290,20 +288,55 @@ ZH_CN_DICT = { "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] 虚拟环境创建失败。环境可能缺失模块或权限受限。", "[ERROR] Product transfer failed, file might be occupied by system process or lack permission: {error}": "[ERROR] 构建产物转移失败,文件可能被占用或无写入权限: {error}", "[ERROR] Could not locate valid executable product in temporary build directory: {path}": "[ERROR] 临时构建目录未找到可执行产物: {path}", - "[Syntax Error] Source code contains syntax errors, compilation aborted:\n - File: {file}\n - Type: {type}\n - Line: Line {line}\n - Detail: {desc}\n\nTip: Please ensure the source code runs locally before packaging.": "[ERROR] 源码语法错误,构建中止:\n - 文件: {file}\n - 类型: {type}\n - 行号: {line}\n - 详情: {desc}\n\n提示: 请确保源码可在本地运行。", - "[FAILED] Compilation interrupted with exceptions, please click 'Detailed Mode' above the log window for troubleshooting.": "[FAILED] 构建异常中断,请切换至「详细日志」排查原因。", "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.": "[ERROR] 目标文件被云盘锁定或加密,请解密后重试。", - "[ERROR] Target file is running or occupied. Please close the existing application and try again.": "[ERROR] 目标程序正在运行或被系统占用。请先关闭该程序后再重新构建。", - "[WARN] 'multiprocessing' module detected. Ensure 'multiprocessing.freeze_support()' is called under 'if __name__ == \"__main__\":' to prevent infinite process loops (fork bombs).": "[WARN] 检测到 multiprocessing 模块。请确保在 'if __name__ == \"__main__\":' 块内调用 'multiprocessing.freeze_support()',以防引发无限进程 (Fork Bomb) 死机。", + "[ERROR] Target file is running or occupied. Please close the existing application and try again.": "[ERROR] 目标程序正在运行或被占用。请先关闭程序后再重新构建。", "[ERROR] Please load a valid Python source file first!": "[ERROR] 请加载有效的 Python 源码!", "[ERROR] Exception occurred during AST parsing: {error}": "[ERROR] AST 解析异常: {error}", "[ERROR] Failed to export preset file: {error}": "[ERROR] 导出预设失败: {error}", "[ERROR] Preset file format error or corrupted: {error}": "[ERROR] 预设文件格式错误或已损坏: {error}", "[ERROR] Failed to export log file: {error}": "[ERROR] 导出日志失败: {error}", - "[ERROR] Build completed, but the following dependencies failed to install:\n\n - {pkgs}\n\nNote: The application might raise ModuleNotFoundError at runtime.": "[ERROR] 构建完成,但以下依赖安装失败:\n\n - {pkgs}\n\n注意: 运行时可能抛出 ModuleNotFoundError。", "[ERROR] Process error: command or binary missing ({error})": "[ERROR] 进程错误: 命令或二进制文件缺失 ({error})", "[ERROR] System execution exception: {error}": "[ERROR] 系统执行异常: {error}", "[ERROR] I/O Exception: {err_msg}": "[ERROR] I/O 异常: {err_msg}", + "[ERROR] Python installation failed or was cancelled.": "[ERROR] Python 安装失败或已被主动取消。", + "[ERROR] Build completed, but the following dependencies failed to install:\n\n - {pkgs}\n\nNote: The application might raise ModuleNotFoundError at runtime.": + "[ERROR] 构建完成,但以下依赖安装失败:\n\n - {pkgs}\n\n注意: 运行时程序可能会抛出 ModuleNotFoundError。", + + "[Syntax Error] Source code syntax parsing failed, build aborted:\n" + " - File: {file}\n" + " - Line: Line {line}\n" + " - Detail: {desc}\n\n" + "Tip: This is usually NOT a fault of the packaging tool.\n" + "Please ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\n" + "Using newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\n" + "We recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": + "[Syntax Error] 源码语法解析失败,构建中止:\n" + " - 文件: {file}\n" + " - 行号: {line}\n" + " - 详情: {desc}\n\n" + "提示:这通常不是打包工具的故障。\n" + "请确认您当前选择的【打包 Python 版本】与您【编写代码时的版本】是否一致。\n" + "高版本语法(如海象运算符 :=、类型联合 |、match-case 等)在低版本 Python 中会导致此错误。\n" + "建议前往【构建设置】->【构建引擎】切换至对应版本的 Python。", + + "[Syntax Error] Source code contains syntax errors, compilation aborted:\n - File: {file}\n - Type: {type}\n - Line: Line {line}\n - Detail: {desc}\n\nTip: Please ensure the source code runs locally before packaging.": + "[ERROR] 源码语法错误,构建中止:\n - 文件: {file}\n - 类型: {type}\n - 行号: {line}\n - 详情: {desc}\n\n提示: 请确保源码可在本地运行。", + + "[FAILED] Build interrupted exceptionally!\n\n" + "Common Troubleshooting:\n" + "1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n" + "2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n" + "3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n" + "(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": + "[FAILED] 构建异常中断!\n\n" + "常见原因排查:\n" + "1. 环境不匹配 (最常见):您选择的打包 Python 版本与您的源码不兼容。请前往【构建设置】切换为您平时开发运行该代码的 Python 版本。\n" + "2. 依赖缺失:请点击上方切换至「详细日志」,查看是否有模块未找到 (ModuleNotFoundError)。\n" + "3. 杀毒软件拦截:请检查是否有安全软件阻止了打包过程。\n\n" + "(注意:这通常是环境配置与代码差异导致,并非打包引擎本身故障,请查阅详细日志获取确切原因。)", + "[FAILED] Compilation interrupted with exceptions, please click 'Detailed Mode' above the log window for troubleshooting.": + "[FAILED] 构建异常中断,请切换至「详细日志」排查原因。", + "No log content.": "无日志内容。", "Log saved to: {path}": "日志已保存: {path}", "\\nProgram execution completed, press Enter to exit...": "\\n程序执行完成,按回车键退出...", @@ -315,28 +348,17 @@ ZH_CN_DICT = { "Sponsor": "赞助支持", "QPyPack is a free and open-source tool. If it has improved your efficiency or solved packaging problems, consider buying the author a coffee!": "QPyPack 是一款免费开源工具。如果它提升了您的效率或解决了打包难题,欢迎赞助支持本开源项目。", "* Sponsorship is completely voluntary, serves as an unconditional encouragement to the open-source community, and involves no commercial commitments. Thank you for your support!": "* 赞助完全出于自愿,属于对开源社区的无偿鼓励,不涉及任何商业承诺。感谢您的支持!", + "Python Environment Required": "需要 Python 环境", "Python is not detected on your system!

QPyPack requires a Python environment to compile your code.
If you haven't installed Python, please download and install it (remember to check 'Add Python.exe to PATH' during installation).": "未在系统中检测到有效的 Python 环境

QPyPack 需要依赖 Python 才能编译代码。
如果您尚未安装,请前往官网下载安装 (提示:安装界面底部请务必勾选 'Add Python.exe to PATH')。", "Download Python": "前往下载 Python", - "Python 3.14.6 (Experimental)": "Python 3.14.6 (实验性)", - "Python 3.13.0": "Python 3.13.0", - "Python 3.12.4": "Python 3.12.4", - "Python 3.11.9 (Recommended)": "Python 3.11.9 (推荐)", - "Python 3.10.11": "Python 3.10.11", - "Python 3.9.13": "Python 3.9.13", - "Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Win7 兼容)", - "Downloading Python {ver}... Please wait.": "正在下载 Python {ver},请稍候...", - "Configure Manually": "手动配置路径", - "Switched to [Build Settings] -> [Engine], please set the Python path.": "已自动切换至【构建设置】->【构建引擎】,请手动指定 Python 解释器路径。", - - # 10. Python 环境管理弹窗 (Python Environment Manager) "Python Environment Management": "Python 环境管理", "Python Environment Required
Application build depends on a Python interpreter.
Please select a version to automatically download, install, and configure environment variables.
": "需要 Python 编译环境
应用构建需要依赖 Python 解释器。
请选择版本以自动下载安装与配置环境变量。
", "Python Environment Management
Supports switching locally detected Python environments or downloading new versions.": "Python 环境管理
支持切换本地已检测到的 Python 环境或下载新版本。", - "💡 Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": - "💡 建议: 推荐选择 Python 3.11.9,该版本具备最佳的编译兼容性与引擎支持。", + "Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support.": + "建议: 推荐选择 Python 3.11.9,该版本具备最佳的编译兼容性与引擎支持。", "View Python": "查看 Python", "Locally Detected Pythons": "已检测环境", "Download New Version": "下载新版本", @@ -346,58 +368,30 @@ ZH_CN_DICT = { "Click to automatically download, install Python, and configure system environment variables.": "点击后将自动下载安装 Python 并配置系统环境变量。", "One-Click Download & Install": "下载并自动安装", + "One-Click Install": "一键安装 Python", "Use Installed Version Directly": "✔ 本地已存在,直接切换", "✔ Detected locally:
{path}
Ready to switch directly without re-downloading.": "✔ 本地已检测到此版本:
{path}
可直接切换使用,无需重复下载。", - "Switched to local Python environment: {path}": "已切换 Python 环境: {path}", - "Download complete. Starting Python installation...": "下载完成,正在安装 Python,请稍候...", + "Python 3.14.6 (Experimental)": "Python 3.14.6 (实验性)", + "Python 3.13.0": "Python 3.13.0", + "Python 3.12.4": "Python 3.12.4", + "Python 3.11.9 (Recommended)": "Python 3.11.9 (推荐)", + "Python 3.10.11": "Python 3.10.11", + "Python 3.9.13": "Python 3.9.13", + "Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Win7 兼容)", + "Downloading Python {ver}... Please wait.": "正在下载 Python {ver},请稍候...", + "Download complete. Starting Python installation...": "下载完成,正在后台安装 Python...", "Install Complete": "安装完成", "Exit Now": "退出软件", "Later": "稍后", "Python Environment Installed Successfully!

System environment variables updated. Recommended to exit and restart the software to apply changes.": "Python 环境安装成功!

建议退出软件后重新打开以生效环境变量。", - "Python installed. Please restart QPyPack manually later.": "Python 已安装,请稍后手动重启软件。", + "Python installed. Please restart QPyPack manually later.": "Python 安装完毕。请稍后手动重启 QPyPack 以生效环境变量。", + "Configure Manually": "手动配置路径", + "Switched to [Build Settings] -> [Engine], please set the Python path.": "已自动切换至【构建设置】->【构建引擎】,请手动指定 Python 解释器路径。", + "Switched to local Python environment: {path}": "已成功切换至本地 Python 环境: {path}", - # 11. Python 版本不匹配提示: - "[Syntax Error] Source code syntax parsing failed, build aborted:\n" - " - File: {file}\n" - " - Line: Line {line}\n" - " - Detail: {desc}\n\n" - "💡 Tip: This is usually NOT a fault of the packaging tool.\n" - "Please ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\n" - "Using newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\n" - "We recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": - "[Syntax Error] 源码语法解析失败,构建中止:\n" - " - 文件: {file}\n" - " - 行号: {line}\n" - " - 详情: {desc}\n\n" - "💡 提示:这通常不是打包工具的故障。\n" - "请确认您当前选择的【打包 Python 版本】与您【编写代码时的版本】是否一致。\n" - "高版本语法(如海象运算符 :=、类型联合 |、match-case 等)在低版本 Python 中会导致此错误。\n" - "建议前往【构建设置】->【构建引擎】切换至对应版本的 Python。", - - "[FAILED] Build interrupted exceptionally!\n\n" - "🔍 Common Troubleshooting:\n" - "1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n" - "2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n" - "3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n" - "(Note: This is usually caused by environment/code discrepancies rather than the packaging engine itself. Please check the detailed log for exact reasons.)": - "[FAILED] 构建异常中断!\n\n" - "🔍 常见原因排查:\n" - "1. 环境不匹配 (最常见):您选择的打包 Python 版本与您的源码不兼容。请前往【构建设置】切换为您平时开发运行该代码的 Python 版本。\n" - "2. 依赖缺失:请点击上方切换至「详细日志」,查看是否有模块未找到 (ModuleNotFoundError)。\n" - "3. 杀毒软件拦截:请检查是否有安全软件阻止了打包过程。\n\n" - "(注意:这通常是环境配置与代码差异导致,并非打包引擎本身故障,请查阅详细日志获取确切原因。)", - - "Status: Build Cancelled": "状态: 构建已取消", - "Build Cancelled": "构建已取消", - "[INFO] Build Cancelled.": "[INFO] 构建已取消。", - - "[WARN] Package '{pkg}' failed to install, skipping...": "[WARN] 包 '{pkg}' 安装失败,已跳过...", "Dependency Missing Warning: {pkgs} failed to install. Check log for details.": "依赖缺失警告: {pkgs} 安装失败。详情请查看日志。", - "[ERROR] Build completed, but the following dependencies failed to install:\n\n - {pkgs}\n\nNote: The application might raise ModuleNotFoundError at runtime.": - "[ERROR] 构建完成,但以下依赖安装失败:\n\n - {pkgs}\n\n注意: 运行时程序可能会抛出 ModuleNotFoundError。", - "Package mappings have been reset to defaults.": "包名映射已恢复为默认设置。", "Global configuration has been reset.": "全局偏好配置已恢复默认。", "Config preset exported to: {path}": "配置预设已成功导出至: {path}", @@ -405,26 +399,17 @@ ZH_CN_DICT = { "AST scan completed, found {count} dependencies.": "AST 扫描完成,发现 {count} 个隐式依赖。", "Attention: Please check the log for details.": "提示: 请检查下方日志排查详细原因。", - "One-Click Install": "一键安装 Python", - "Downloading Python {ver}... Please wait.": "正在下载 Python {ver},请稍候...", - "Download complete. Starting Python installation...": "下载完成,正在后台安装 Python...", - "[ERROR] Python installation failed or was cancelled.": "[ERROR] Python 安装失败或已被主动取消。", - "Python installed. Please restart QPyPack manually later.": "Python 安装完毕。请稍后手动重启 QPyPack 以生效环境变量。", - "Switched to local Python environment: {path}": "已成功切换至本地 Python 环境: {path}", - - "One-File Mode (--onefile)": "单文件模式 (--onefile)", - "Folder Mode (--onedir)": "文件夹模式 (--onedir)", - "Contents Directory (--contents-directory):": "内部资源目录:", - "Internal directory name for dependencies (default: _internal)": "内部依赖与资源存放目录名 (默认: _internal)", "System Default ({sys_native})": "系统默认 ({sys_native})", "My Studio": "我的工作室", "Python Executable": "Python 可执行程序", "Invalid syntax": "无效语法", - "[INFO] Downloading Playwright browsers via mirror: {url}": "[INFO] 通过镜像下载 Playwright 浏览器: {url}", - "[INFO] Retrying Playwright browser download via official CDN...": "[INFO] 通过官方 CDN 重试下载 Playwright 浏览器...", - "[WARN] Playwright browser installation failed across all sources, build will proceed with risk...": "[WARN] 所有 Playwright 浏览器下载源均失败,继续构建 (有风险)...", - "[WARN] Icon conversion to .icns failed, building without icon.": "[WARN] 图标转换为 .icns 失败,将不使用图标构建。", "OK": "确定", + "Packaging Mode:": "打包模式:", + "Compatibility Mode (Default)": "兼容模式 (默认)", + "Lite Mode (Smaller size)": "精简模式 (体积小)", + "Maximum compatibility. Recommended for apps with complex dynamic imports.": "最大兼容性。适合使用了复杂动态导入的项目。", + "Smaller output size. Recommended for 95% of standard apps.": "产物体积最小。推荐 95% 的常规应用使用。", + "Tip: Build failed in Lite Mode. You can try switching to [Compatibility Mode] in Build Settings and rebuild.": "提示: 精简模式构建失败。您可以尝试在【构建设置】中勾选 [兼容模式] 重新打包。", "Unknown": "未知" } @@ -458,6 +443,7 @@ class TranslationEngine(QObject): self.current_lang = self.DEFAULT_LOCALE self.translations = {} self.fallback_zh_cn = ZH_CN_DICT + self.qt_translator = QTranslator() def init_locale(self): self.load_all_locales() @@ -528,8 +514,32 @@ class TranslationEngine(QObject): return langs + def update_qt_translator(self, lang_code: str): + app = QApplication.instance() + if not app: + return + + app.removeTranslator(self.qt_translator) + trans_path = QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath) + + target_locale = self.normalize_locale(lang_code) + short_lang = target_locale.split("_")[0] if "_" in target_locale else target_locale + + candidates = [ + f"qtbase_{target_locale}", + f"qtbase_{short_lang}", + f"qt_{target_locale}", + f"qt_{short_lang}" + ] + + for name in candidates: + if self.qt_translator.load(name, trans_path): + app.installTranslator(self.qt_translator) + break + def set_language(self, lang_code: str): target = self.normalize_locale(lang_code) + self.update_qt_translator(target) if target != self.current_lang: self.current_lang = target self.language_changed.emit(self.current_lang) @@ -678,6 +688,7 @@ def load_config(retry=True): updated = False default_updates = { 'language': 'auto', + 'keep_venv': 'False', 'pip_index': default_mirror, 'pip_index_backup': default_backup, 'concise_log': 'True', @@ -777,13 +788,12 @@ def create_pleasant_audio_files(): _AUDIO_EFFECT_REF = None -def play_alert(success=True): +def play_alert(success=True, sound_enabled=True): global _AUDIO_EFFECT_REF + if not sound_enabled: + return + try: - config = load_config() - if not config['Settings'].getboolean('sound_notify', True): - return - sound_file = _CONFIG_DIR / ("sound_success.wav" if success else "sound_failure.wav") if not sound_file.exists(): create_pleasant_audio_files() @@ -827,7 +837,7 @@ def extract_project_imports_via_ast(target_path, scan_dir: bool = False) -> set: files_to_scan = [] for root, _, files in os.walk(target_path): path_parts = set(Path(root).parts) - if path_parts & {'__pycache__', '.qpypack_build', '.venv', 'venv', 'build', 'dist', 'env', '.env'}: + if path_parts & {'__pycache__', '.qpypack_build', '.qpypack_venv', '.venv', 'venv', 'build', 'dist', 'env', '.env'}: continue for file in files: if file.endswith(('.py', '.pyw')): @@ -1113,21 +1123,11 @@ def setup_combo_white_theme(combo: QComboBox, min_view_width: int = None): combo.setView(list_view) combo.setItemDelegate(ComboItemDelegate(combo)) + combo.setSizeAdjustPolicy(QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon) + if min_view_width and combo.view(): combo.view().setMinimumWidth(min_view_width) combo.view().setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded) - - if combo.view(): - combo.view().setStyleSheet(""" - QListView { - background-color: #ffffff; color: #111827; border: 1px solid #d1d5db; - border-radius: 6px; outline: none; padding: 4px; font-size: 12px; - font-family: Consolas, "Segoe UI", sans-serif; - selection-background-color: #2563eb; selection-color: #ffffff; - } - QListView::item { background-color: #ffffff; color: #111827; padding: 4px 8px; border-radius: 4px; } - QListView::item:hover, QListView::item:selected { background-color: #2563eb; color: #ffffff; } - """) arrow_url = _ARROW_ICON_PATH.replace("\\", "/") combo.setStyleSheet(f""" @@ -1933,10 +1933,12 @@ class SettingsPanel(QWidget): scroll = QScrollArea() scroll.setWidgetResizable(True) scroll.setFrameShape(QFrame.Shape.NoFrame) - scroll.setStyleSheet("background: transparent;") + scroll.setStyleSheet("QScrollArea { background: transparent; }") content = QWidget() - content.setStyleSheet("background: transparent;") + content.setObjectName("ScrollContent") + content.setStyleSheet("QWidget#ScrollContent { background: transparent; }") + lay = QVBoxLayout(content) lay.setContentsMargins(0, 5, 0, 15) lay.setSpacing(15) @@ -2126,6 +2128,7 @@ class SettingsPanel(QWidget): self.name_edit.setPlaceholderText(_("Leave blank to auto-match script name")) self.icon_edit = QLineEdit() + self.icon_preview = QLabel() self.icon_preview.setFixedSize(24, 24) self.icon_preview.setScaledContents(True) @@ -2142,12 +2145,25 @@ class SettingsPanel(QWidget): h_icon.addWidget(self.icon_preview) h_icon.addWidget(self.btn_icon) + self.rb_compat_mode = QRadioButton(_("Compatibility Mode (Default)")) + self.rb_lite_mode = QRadioButton(_("Lite Mode (Smaller size)")) + self.rb_compat_mode.setChecked(True) + + pack_mode_cont = QWidget() + h_pack_mode = QHBoxLayout(pack_mode_cont) + h_pack_mode.setContentsMargins(0, 0, 0, 0) + h_pack_mode.addWidget(self.rb_compat_mode) + h_pack_mode.addWidget(self.rb_lite_mode) + h_pack_mode.addStretch() + self.lbl_eng_title = QLabel(_("Build Engine:")) + self.lbl_pack_mode_title = QLabel(_("Packaging Mode:")) self.lbl_py_title = QLabel(_("Python Interpreter:")) self.lbl_app_title = QLabel(_("Output Name:")) self.lbl_icon_title = QLabel(_("App Icon:")) self.form_engine.addRow(self.lbl_eng_title, engine_cont) + self.form_engine.addRow(self.lbl_pack_mode_title, pack_mode_cont) self.form_engine.addRow(self.lbl_py_title, py_cont) self.form_engine.addRow(self.lbl_app_title, self.name_edit) self.form_engine.addRow(self.lbl_icon_title, icon_cont) @@ -2156,6 +2172,7 @@ class SettingsPanel(QWidget): self.card_mode, c_lay_mode = self._create_card(_("Execution Mode")) v_mode = QVBoxLayout() h_radio = QHBoxLayout() + h_radio.setSpacing(10) self.rb_onefile = QRadioButton(_("One-File Mode (--onefile)")) self.rb_onedir = QRadioButton(_("Folder Mode (--onedir)")) @@ -2254,14 +2271,18 @@ class SettingsPanel(QWidget): g_dep.setSpacing(10) self.venv_check = QCheckBox(_("Use Virtual Environment (Recommended)")) + self.keep_venv_check = QCheckBox(_("Keep Virtual Environment (Faster Rebuilds)")) + self.venv_check.toggled.connect(self.keep_venv_check.setEnabled) + self.reqs_check = QCheckBox(_("Install requirements.txt")) self.pipreqs_check = QCheckBox(_("Analyze Dependencies (AST)")) self.pipreqs_dir_check = QCheckBox(_("Scan Entire Folder")) g_dep.addWidget(self.venv_check, 0, 0) - g_dep.addWidget(self.reqs_check, 0, 1) - g_dep.addWidget(self.pipreqs_check, 1, 0) - g_dep.addWidget(self.pipreqs_dir_check, 1, 1) + g_dep.addWidget(self.keep_venv_check, 0, 1) + g_dep.addWidget(self.reqs_check, 1, 0) + g_dep.addWidget(self.pipreqs_check, 1, 1) + g_dep.addWidget(self.pipreqs_dir_check, 2, 0) c_lay_deps.addLayout(g_dep) lay_sub2.addWidget(self.card_deps) @@ -2275,7 +2296,6 @@ class SettingsPanel(QWidget): c_lay_res.addWidget(self.lbl_res_hint) self.add_data_list = DropListWidget() - self.add_data_list.setSelectionMode(QListWidget.SelectionMode.ExtendedSelection) self.add_data_list.setMinimumHeight(120) self.add_data_list.setToolTip(_("Double-click to edit target path; Drag & drop supported")) @@ -2347,12 +2367,7 @@ class SettingsPanel(QWidget): self.lbl_upx_path = QLabel(_("UPX Path:")) self.form_opt.addRow(self.lbl_upx_path, h_upx_row) - self.lite_mode_check = QCheckBox(_("Lite Mode (Exclude Dev/Test Dependencies)")) - self.lite_mode_check.setStyleSheet("color: #D93025; font-weight: bold;") - self.lite_mode_check.setToolTip(_("Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.")) - c_lay_opt.addLayout(self.form_opt) - c_lay_opt.addWidget(self.lite_mode_check) self.card_ver, c_lay_ver = self._create_card(_("Lock Core Dependencies")) self.form_ver = QFormLayout() @@ -2378,9 +2393,7 @@ class SettingsPanel(QWidget): self.mapping_table.setItemDelegate(TableItemDelegate(self.mapping_table)) self.mapping_table.setColumnCount(2) self.mapping_table.setHorizontalHeaderLabels([_("Import Name"), _("PyPI Package Name")]) - self.mapping_table.verticalHeader().setVisible(False) - self.mapping_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) self.mapping_table.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows) self.mapping_table.setMinimumHeight(150) @@ -2444,7 +2457,9 @@ class SettingsPanel(QWidget): c_lay_meta.addLayout(self.form_meta) c_lay_meta.addSpacing(10) - h_preset = QHBoxLayout() + + g_preset = QGridLayout() + g_preset.setSpacing(8) self.btn_exp_preset = QPushButton(_("Export Preset...")) self.btn_exp_preset.setProperty("class", "ToolBtn") self.btn_exp_preset.clicked.connect(self.export_preset) @@ -2457,11 +2472,10 @@ class SettingsPanel(QWidget): self.btn_reset_config.setProperty("class", "ToolBtn") self.btn_reset_config.clicked.connect(self.reset_global_config) - h_preset.addWidget(self.btn_exp_preset) - h_preset.addWidget(self.btn_imp_preset) - h_preset.addWidget(self.btn_reset_config) - h_preset.addStretch() - c_lay_meta.addLayout(h_preset) + g_preset.addWidget(self.btn_exp_preset, 0, 0) + g_preset.addWidget(self.btn_imp_preset, 0, 1) + g_preset.addWidget(self.btn_reset_config, 1, 0, 1, 2) + c_lay_meta.addLayout(g_preset) self.card1, lay1 = self._create_card(_("Output Location")) self.out_mode_combo = QComboBox() @@ -2521,7 +2535,6 @@ class SettingsPanel(QWidget): def build_about_tab(self): main_lay = self.lay_about - # 缩小上下边距,节省垂直空间,避免出现滚动条 main_lay.setContentsMargins(40, 10, 40, 10) main_lay.setSpacing(15) main_lay.addStretch(1) @@ -2541,9 +2554,7 @@ class SettingsPanel(QWidget): logo_lbl.setAlignment(Qt.AlignmentFlag.AlignCenter) main_lay.addWidget(logo_lbl) - # 顶部文字块布局 text_vlay = QVBoxLayout() - # 1. 缩小全局基础间距,让“标题”和“一句话标语”紧密贴合 text_vlay.setSpacing(6) text_vlay.setAlignment(Qt.AlignmentFlag.AlignCenter) @@ -2557,7 +2568,6 @@ class SettingsPanel(QWidget): self.about_desc_lbl.setAlignment(Qt.AlignmentFlag.AlignCenter) text_vlay.addWidget(self.about_desc_lbl) - # 2. 在标语和版权之间额外插入一点空隙,巧妙地拉开层次感 text_vlay.addSpacing(6) current_year = time.localtime().tm_year @@ -2568,7 +2578,6 @@ class SettingsPanel(QWidget): text_vlay.addWidget(ver_lbl) main_lay.addLayout(text_vlay) - # 3. 将整个文字块与下方四个按钮的距离适当拉大,增加呼吸感 main_lay.addSpacing(25) btn_lay = QHBoxLayout() @@ -2662,6 +2671,12 @@ class SettingsPanel(QWidget): self.card2.findChild(QLabel, "CardTitle").setText(_("Preferences & System Behavior")) self.lbl_eng_title.setText(_("Build Engine:")) + self.lbl_pack_mode_title.setText(_("Packaging Mode:")) + self.rb_compat_mode.setText(_("Compatibility Mode (Default)")) + self.rb_lite_mode.setText(_("Lite Mode (Smaller size)")) + self.rb_compat_mode.setToolTip(_("Maximum compatibility. Recommended for apps with complex dynamic imports.")) + self.rb_lite_mode.setToolTip(_("Smaller output size. Recommended for 95% of standard apps.")) + self.lbl_py_title.setText(_("Python Interpreter:")) self.lbl_app_title.setText(_("Output Name:")) self.lbl_icon_title.setText(_("App Icon:")) @@ -2684,6 +2699,12 @@ class SettingsPanel(QWidget): self.sandbox_mode_combo.setItemText(0, _("Source Directory (.qpypack_build)")) self.sandbox_mode_combo.setItemText(1, _("System Temp Directory")) + if not self.ver_comp.isModified(): + self.ver_comp.setText(_("My Studio")) + + if not self.ver_desc.isModified(): + self.ver_desc.setText(_("Python Executable")) + if hasattr(self, 'pip_source_combo') and hasattr(self, 'pip_backup_combo'): cur_main = self._get_url_from_combo(self.pip_source_combo) cur_back = self._get_url_from_combo(self.pip_backup_combo) @@ -2708,7 +2729,6 @@ class SettingsPanel(QWidget): self.btn_save.setText(_("Save & Return")) self.btn_python_path.setText(_("Browse")) self.btn_download_py.setText(_("View Python")) - self.btn_download_py.setToolTip("") self.btn_icon.setText(_("Browse")) self.btn_reqs.setText(_("Browse")) self.btn_scan.setText(_("AST Scan")) @@ -2737,12 +2757,11 @@ class SettingsPanel(QWidget): self.lbl_contents_dir.setText(_("Contents Directory (--contents-directory):")) self.contents_dir_edit.setPlaceholderText(_("Internal directory name for dependencies (default: _internal)")) self.noconsole_check.setText(_("Hide Console (--noconsole)")) - self.venv_check.setText(_("Use Virtual Environment (Recommended)")) + self.keep_venv_check.setText(_("Keep Virtual Environment (Faster Rebuilds)")) self.reqs_check.setText(_("Install requirements.txt")) self.pipreqs_check.setText(_("Analyze Dependencies (AST)")) self.pipreqs_dir_check.setText(_("Scan Entire Folder")) self.upx_check.setText(_("Enable UPX Compression")) - self.lite_mode_check.setText(_("Lite Mode (Exclude Dev/Test Dependencies)")) self.concise_log_check.setText(_("Concise Log Output")) self.auto_save_log_check.setText(_("Auto-save Build Log")) @@ -2753,7 +2772,6 @@ class SettingsPanel(QWidget): self.out_mode_combo.setItemText(0, _("Source File Directory")) self.out_mode_combo.setItemText(1, _("Custom Directory")) self.mapping_table.setHorizontalHeaderLabels([_("Import Name"), _("PyPI Package Name")]) - self.about_desc_lbl.setText(_("Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka")) if hasattr(self, 'sponsor_desc_p1'): self.sponsor_desc_p1.setText(_("QPyPack is a free and open-source tool. If it has improved your efficiency or solved packaging problems, consider buying the author a coffee!")) @@ -2764,13 +2782,6 @@ class SettingsPanel(QWidget): if hasattr(self, 'lbl_res_hint'): self.lbl_res_hint.setText(_("Project-specific. Not saved to global preferences. Use 'Export Preset' to save config.")) self.add_data_list.setToolTip(_("Double-click to edit target path; Drag & drop supported. Use 'Export Preset' to save for reuse.")) - self.lite_mode_check.setToolTip(_("Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.")) - - if hasattr(self, 'btn_github'): - self.btn_github.setText(" " + _("GitHub Repository")) - self.btn_issue.setText(" " + _("Issues & Feedback")) - self.btn_pypi.setText(" " + _("PyPI Home")) - self.btn_sponsor.setText(" " + _("Sponsor")) self.on_engine_changed() self.on_python_path_changed() @@ -2848,6 +2859,7 @@ class SettingsPanel(QWidget): try: data = { "engine": self.engine_combo.currentText(), + "lite_mode": self.rb_lite_mode.isChecked(), "onefile": self.rb_onefile.isChecked(), "contents_dir": self.contents_dir_edit.text().strip(), "icon": self.icon_edit.text(), @@ -2858,13 +2870,13 @@ class SettingsPanel(QWidget): "hidden_imports": self.hidden_edit.text(), "exclude_modules": self.exclude_edit.text(), "use_venv": self.venv_check.isChecked(), + "keep_venv": self.keep_venv_check.isChecked(), "use_reqs": self.reqs_check.isChecked(), "use_pipreqs": self.pipreqs_check.isChecked(), "use_pipreqs_dir": self.pipreqs_dir_check.isChecked(), "reqs_file": self.reqs_file_edit.text(), "pip_source": self._get_url_from_combo(self.pip_source_combo), "pip_backup": self._get_url_from_combo(self.pip_backup_combo), - "lite_mode": self.lite_mode_check.isChecked(), "add_data_list": [self.add_data_list.item(i).data(Qt.ItemDataRole.UserRole) for i in range(self.add_data_list.count())] } Path(fp).write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding='utf-8') @@ -2880,6 +2892,9 @@ class SettingsPanel(QWidget): try: data = json.loads(Path(fp).read_text(encoding='utf-8')) if "engine" in data: self.engine_combo.setCurrentText(data["engine"]) + if "lite_mode" in data: + self.rb_lite_mode.setChecked(bool(data["lite_mode"])) + self.rb_compat_mode.setChecked(not bool(data["lite_mode"])) if "onefile" in data: if data["onefile"]: self.rb_onefile.setChecked(True) @@ -2896,14 +2911,16 @@ class SettingsPanel(QWidget): if "ver_desc" in data: self.ver_desc.setText(data["ver_desc"]) if "hidden_imports" in data: self.hidden_edit.setText(data["hidden_imports"]) if "exclude_modules" in data: self.exclude_edit.setText(data["exclude_modules"]) - if "use_venv" in data: self.venv_check.setChecked(bool(data["use_venv"])) + if "use_venv" in data: + self.venv_check.setChecked(bool(data["use_venv"])) + self.keep_venv_check.setEnabled(bool(data["use_venv"])) + if "keep_venv" in data: self.keep_venv_check.setChecked(bool(data["keep_venv"])) if "use_reqs" in data: self.reqs_check.setChecked(bool(data["use_reqs"])) if "use_pipreqs" in data: self.pipreqs_check.setChecked(bool(data["use_pipreqs"])) if "use_pipreqs_dir" in data: self.pipreqs_dir_check.setChecked(bool(data["use_pipreqs_dir"])) if "reqs_file" in data: self.reqs_file_edit.setText(data["reqs_file"]) if "pip_source" in data: self._set_combo_value(self.pip_source_combo, data["pip_source"]) if "pip_backup" in data: self._set_combo_value(self.pip_backup_combo, data["pip_backup"]) - if "lite_mode" in data: self.lite_mode_check.setChecked(bool(data["lite_mode"])) if "add_data_list" in data: self.add_data_list.clear() for item in data["add_data_list"]: @@ -2925,6 +2942,11 @@ class SettingsPanel(QWidget): self.lang_combo.setCurrentIndex(i); break self.engine_combo.setCurrentText(s.get('engine', 'PyInstaller')) + + is_lite = s.getboolean('lite_mode', False) + self.rb_lite_mode.setChecked(is_lite) + self.rb_compat_mode.setChecked(not is_lite) + is_onefile = s.getboolean('onefile', True) if is_onefile: self.rb_onefile.setChecked(True) @@ -2943,6 +2965,8 @@ class SettingsPanel(QWidget): self._set_combo_value(self.pip_backup_combo, pip_backup) self.venv_check.setChecked(s.getboolean('use_venv', True)) + self.keep_venv_check.setChecked(s.getboolean('keep_venv', False)) + self.keep_venv_check.setEnabled(self.venv_check.isChecked()) self.reqs_check.setChecked(s.getboolean('use_reqs', True)) self.pipreqs_check.setChecked(s.getboolean('use_pipreqs', True)) self.pipreqs_dir_check.setChecked(s.getboolean('use_pipreqs_dir', False)) @@ -2963,7 +2987,6 @@ class SettingsPanel(QWidget): self.concise_log_check.setChecked(s.getboolean('concise_log', True)) self.sound_notify_check.setChecked(s.getboolean('sound_notify', True)) self.auto_save_log_check.setChecked(s.getboolean('auto_save_log', False)) - self.lite_mode_check.setChecked(s.getboolean('lite_mode', False)) self.pyi_ver_edit.setText(s.get('pyi_version', '6.21.0')) self.nuitka_ver_edit.setText(s.get('nuitka_version', '4.1.3')) @@ -2983,6 +3006,8 @@ class SettingsPanel(QWidget): s['language'] = new_lang s['engine'] = self.engine_combo.currentText() + s['lite_mode'] = str(self.rb_lite_mode.isChecked()) + s['onefile'] = str(self.rb_onefile.isChecked()) s['contents_dir'] = self.contents_dir_edit.text().strip() or '_internal' s['noconsole'] = str(self.noconsole_check.isChecked()) @@ -2993,6 +3018,7 @@ class SettingsPanel(QWidget): s['pip_index_backup'] = self._get_url_from_combo(self.pip_backup_combo) s['use_venv'] = str(self.venv_check.isChecked()) + s['keep_venv'] = str(self.keep_venv_check.isChecked()) s['use_reqs'] = str(self.reqs_check.isChecked()) s['use_pipreqs'] = str(self.pipreqs_check.isChecked()) s['use_pipreqs_dir'] = str(self.pipreqs_dir_check.isChecked()) @@ -3012,7 +3038,6 @@ class SettingsPanel(QWidget): s['concise_log'] = str(self.concise_log_check.isChecked()) s['sound_notify'] = str(self.sound_notify_check.isChecked()) s['auto_save_log'] = str(self.auto_save_log_check.isChecked()) - s['lite_mode'] = str(self.lite_mode_check.isChecked()) s['pyi_version'] = self.pyi_ver_edit.text().strip() s['nuitka_version'] = self.nuitka_ver_edit.text().strip() @@ -3021,8 +3046,10 @@ class SettingsPanel(QWidget): config['Mappings'] = {} for r in range(self.mapping_table.rowCount()): - k = self.mapping_table.item(r, 0).text().strip() - v = self.mapping_table.item(r, 1).text().strip() + item_k = self.mapping_table.item(r, 0) + item_v = self.mapping_table.item(r, 1) + k = item_k.text().strip() if item_k else "" + v = item_v.text().strip() if item_v else "" if k and v: config['Mappings'][k] = v save_config(config) @@ -3169,6 +3196,34 @@ class SettingsPanel(QWidget): item.setData(Qt.ItemDataRole.UserRole, (r_type, src, dst)) self.add_data_list.addItem(item) + def _show_lineedit_menu(self, line_edit, pos): + menu = QMenu(line_edit) + + act_undo = menu.addAction(_("Undo") if False else "Undo") + act_undo.triggered.connect(line_edit.undo) + act_undo.setEnabled(line_edit.isUndoAvailable()) + + menu.addSeparator() + + act_cut = menu.addAction("Cut") + act_cut.triggered.connect(line_edit.cut) + act_cut.setEnabled(line_edit.hasSelectedText() and not line_edit.isReadOnly()) + + act_copy = menu.addAction("Copy") + act_copy.triggered.connect(line_edit.copy) + act_copy.setEnabled(line_edit.hasSelectedText()) + + act_paste = menu.addAction("Paste") + act_paste.triggered.connect(line_edit.paste) + act_paste.setEnabled(not line_edit.isReadOnly()) + + menu.addSeparator() + + act_select_all = menu.addAction("Select All") + act_select_all.triggered.connect(line_edit.selectAll) + + menu.exec(line_edit.mapToGlobal(pos)) + def edit_resource(self, item=None): if not item: item = self.add_data_list.currentItem() if not item: return @@ -3310,15 +3365,19 @@ class PackingThread(QThread): self.process.kill() except: pass - def run_cmd(self, cmd, cwd=None, timeout=None, silent_error=False): + def run_cmd(self, cmd, cwd=None, timeout=None, silent_error=False, extra_env=None): if self._is_cancelled: return False - + timer = None is_timeout = [False] - + clean_env = os.environ.copy() clean_env.pop("PYTHONHOME", None) - clean_env.pop("PYTHONPATH", None) + + if not (extra_env and "PYTHONPATH" in extra_env): + if not ("PYTHONPATH" in clean_env and "_qpypack_temp_" in clean_env["PYTHONPATH"]): + clean_env.pop("PYTHONPATH", None) + clean_env["PYTHONUTF8"] = "1" clean_env["PYTHONIOENCODING"] = "utf-8" clean_env["LANG"] = "en_US.UTF-8" @@ -3326,17 +3385,16 @@ class PackingThread(QThread): clean_env["PYTHONUNBUFFERED"] = "1" clean_env["PLAYWRIGHT_BROWSERS_PATH"] = "0" - primary_idx = self.params.get('pip_index_url', '') - if any(domain in primary_idx for domain in ['tsinghua', 'aliyun', 'tencent', 'huawei', 'ustc']) or I18N.current_lang == 'zh_CN': - clean_env["PLAYWRIGHT_DOWNLOAD_HOST"] = "https://npmmirror.com/mirrors/playwright/" + if extra_env: + clean_env.update(extra_env) try: kwargs = {"stdout": subprocess.PIPE, "stderr": subprocess.STDOUT, "cwd": cwd, "text": True, "encoding": "utf-8", "errors": "replace", "env": clean_env} if os.name == 'nt': kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW - + self.process = subprocess.Popen(cmd, **kwargs) - + if timeout: def kill_proc(): is_timeout[0] = True @@ -3352,7 +3410,7 @@ class PackingThread(QThread): buffer = [] last_emit = time.time() - + for line in self.process.stdout: if self._is_cancelled: try: @@ -3361,23 +3419,23 @@ class PackingThread(QThread): except Exception: pass return False - + stripped = line.rstrip('\r\n') self.all_raw_logs.append(stripped) - + buffer.append(stripped) if len(buffer) >= 15 or (time.time() - last_emit) > 0.1: self.progress.emit('\n'.join(buffer)) buffer.clear() last_emit = time.time() - + if buffer: self.progress.emit('\n'.join(buffer)) self.process.wait() - + if is_timeout[0]: self.progress.emit(_("[WARN] Command timeout (>{timeout}s)", timeout=timeout)) return False - + return self.process.returncode == 0 except FileNotFoundError as e: self.progress.emit(_("[ERROR] Process error: command or binary missing ({error})", error=str(e))) @@ -3503,6 +3561,8 @@ class PackingThread(QThread): build_script_path = None ext = ".exe" if os.name == "nt" else "" failed_packages = [] + + script_dir = Path(self.params['script_path']).parent if self.params.get('script_path') else Path.cwd() try: if self._is_cancelled: @@ -3521,7 +3581,7 @@ class PackingThread(QThread): " - File: {file}\n" " - Line: Line {line}\n" " - Detail: {desc}\n\n" - "💡 Tip: This is usually NOT a fault of the packaging tool.\n" + "Tip: This is usually NOT a fault of the packaging tool.\n" "Please ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\n" "Using newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\n" "We recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.", @@ -3655,42 +3715,72 @@ class PackingThread(QThread): if self.params['use_venv']: if self._is_cancelled: return self.build_finished.emit(False, _("[INFO] Build Cancelled."), []) - self.progress.emit(_("[INFO] Creating virtual environment...")) - self.venv_dir = Path(tempfile.mkdtemp(prefix="qpypack_env_")).resolve() - if not self.run_cmd([system_python_exe, "-m", "venv", self.venv_dir.as_posix()]): + + if self.params.get('keep_venv'): + self.venv_dir = (script_dir / ".qpypack_venv").resolve() + else: + self.venv_dir = Path(tempfile.mkdtemp(prefix="qpypack_env_")).resolve() + + python_exe_in_venv = (self.venv_dir / ("Scripts/python.exe" if os.name == "nt" else "bin/python")).as_posix() + + is_venv_valid = False + if self.params.get('keep_venv') and self.venv_dir.exists() and Path(python_exe_in_venv).exists(): + try: + kw = {"capture_output": True, "creationflags": subprocess.CREATE_NO_WINDOW} if os.name == 'nt' else {"capture_output": True} + if subprocess.run([python_exe_in_venv, "-c", "pass"], **kw).returncode == 0: + is_venv_valid = True + except Exception: pass + + if is_venv_valid: + self.progress.emit(_("[INFO] Reusing existing virtual environment...")) + python_exe = python_exe_in_venv + else: + if self.params.get('keep_venv') and self.venv_dir.exists(): + robust_rmtree(self.venv_dir) + + self.progress.emit(_("[INFO] Creating virtual environment...")) + if not self.run_cmd([system_python_exe, "-m", "venv", self.venv_dir.as_posix()]): + if self._is_cancelled: + return self.build_finished.emit(False, _("[INFO] Build Cancelled."), []) + return self.build_finished.emit(False, _("[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions."), []) + + if self.params.get('keep_venv') and self.venv_dir.exists(): + try: + (self.venv_dir / ".gitignore").write_text("*\n", encoding="utf-8") + except Exception: pass + + python_exe = python_exe_in_venv + if self._is_cancelled: return self.build_finished.emit(False, _("[INFO] Build Cancelled."), []) - return self.build_finished.emit(False, _("[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions."), []) - python_exe = (self.venv_dir / ("Scripts/python.exe" if os.name == "nt" else "bin/python")).as_posix() - - if self._is_cancelled: - return self.build_finished.emit(False, _("[INFO] Build Cancelled."), []) - self.progress.emit(_("[INFO] Synchronizing and upgrading pip package manager...")) - self.run_pip_install(python_exe, ["--upgrade", "pip", "-q"]) + self.progress.emit(_("[INFO] Synchronizing and upgrading pip package manager...")) + self.run_pip_install(python_exe, ["--upgrade", "pip", "-q"]) else: python_exe = system_python_exe if self._is_cancelled: return self.build_finished.emit(False, _("[INFO] Build Cancelled."), []) - if self.params.get('use_pipreqs'): - self.progress.emit(_("[INFO] Scanning project source code via AST engine...")) - - scan_dir_mode = self.params.get('use_pipreqs_dir', False) - scan_target = script_dir if scan_dir_mode else build_script_path - - ast_discovered_imports = extract_project_imports_via_ast(scan_target, scan_dir=scan_dir_mode) - env_pkg_map = query_target_env_packages(system_python_exe) - - for m in ast_discovered_imports: - if m.lower() in target_std_libs or m.lower() in local_modules: - continue - canon_name = env_pkg_map.get(m) or get_canonical_pypi_name(m) - if canon_name.lower() not in target_std_libs: - auto_detected_pkgs.add(canon_name) - if canon_name not in final_dependencies: - final_dependencies[canon_name] = canon_name - auto_added_supplements.add(canon_name) + self.progress.emit(_("[INFO] Scanning project source code via AST engine...")) + + scan_dir_mode = self.params.get('use_pipreqs_dir', False) + if scan_dir_mode: + ast_discovered_imports = extract_project_imports_via_ast(script_dir, scan_dir=True) + else: + ast_discovered_imports = script_imports + + env_pkg_map = query_target_env_packages(system_python_exe) + + for m in ast_discovered_imports: + if m.lower() in target_std_libs or m.lower() in local_modules: + continue + canon_name = (env_pkg_map.get(m) or get_canonical_pypi_name(m)).lower() + if canon_name not in target_std_libs: + auto_detected_pkgs.add(canon_name) + if canon_name not in final_dependencies: + final_dependencies[canon_name] = canon_name + auto_added_supplements.add(canon_name) + engine_pkg = "pyinstaller" if engine == "PyInstaller" else "nuitka" if engine == "PyInstaller" and self.params.get('pyi_version'): @@ -3797,14 +3887,15 @@ class PackingThread(QThread): success_pw = False for mirror in pw_mirrors: if self._is_cancelled: break + + pw_env = {} if mirror: - os.environ["PLAYWRIGHT_DOWNLOAD_HOST"] = mirror + pw_env["PLAYWRIGHT_DOWNLOAD_HOST"] = mirror self.progress.emit(_("[INFO] Downloading Playwright browsers via mirror: {url}", url=mirror)) else: - os.environ.pop("PLAYWRIGHT_DOWNLOAD_HOST", None) self.progress.emit(_("[INFO] Retrying Playwright browser download via official CDN...")) - if self.run_cmd([python_exe, "-m", "playwright", "install"], timeout=300, silent_error=True): + if self.run_cmd([python_exe, "-m", "playwright", "install"], timeout=300, silent_error=True, extra_env=pw_env): success_pw = True break @@ -4056,11 +4147,14 @@ class PackingThread(QThread): cmd.append("--enable-plugin=multiprocessing") if os.name == "nt": self.progress.emit(_("[WARN] 'multiprocessing' module detected. Ensure 'multiprocessing.freeze_support()' is called under 'if __name__ == \"__main__\":' to prevent infinite process loops (fork bombs).")) + is_lite = self.params.get('lite_mode') + if 'ttkbootstrap' in imports_lower: - cmd.append("--include-package=ttkbootstrap") + if not is_lite: cmd.append("--include-package=ttkbootstrap") cmd.append("--include-package-data=ttkbootstrap") + if 'playwright' in imports_lower or has_playwright_pkg: - cmd.append("--include-package=playwright") + if not is_lite: cmd.append("--include-package=playwright") cmd.append("--include-package-data=playwright") if any(lib in imports_lower for lib in ('requests', 'httpx', 'urllib3', 'aiohttp')): @@ -4069,7 +4163,7 @@ class PackingThread(QThread): for web_fw in ('fastapi', 'uvicorn', 'flask', 'streamlit', 'pywebio', 'dash'): if web_fw in imports_lower: - cmd.append(f"--include-package={web_fw}") + if not is_lite: cmd.append(f"--include-package={web_fw}") cmd.append(f"--include-package-data={web_fw}") if 'numpy' in imports_lower: cmd.append("--enable-plugin=numpy") @@ -4237,7 +4331,7 @@ class PackingThread(QThread): else: msg = _( "[FAILED] Build interrupted exceptionally!\n\n" - "🔍 Common Troubleshooting:\n" + "Common Troubleshooting:\n" "1. Environment Mismatch (Most Common): The selected Python version is incompatible with your source code. Please go to [Build Settings] to switch to the Python version you normally use for this code.\n" "2. Missing Dependencies: Click 'Detailed Mode' above to check for ModuleNotFoundError.\n" "3. Antivirus Block: Ensure your security software is not blocking the build process.\n\n" @@ -4277,7 +4371,12 @@ class PackingThread(QThread): if self.params['clean_all']: self.progress.emit(_("[INFO] Freeing up space, cleaning temporary build environment...")) - for p in [self.venv_dir, self.temp_workpath, self.temp_out_dir, self.temp_dist_dir]: + cleanup_dirs = [self.temp_workpath, self.temp_out_dir, self.temp_dist_dir] + + if not self.params.get('keep_venv'): + cleanup_dirs.append(self.venv_dir) + + for p in cleanup_dirs: if p and p.exists(): robust_rmtree(p) app_name = self.params.get('app_name', 'app') @@ -4349,7 +4448,7 @@ class PythonInstallerDialog(QDialog): if is_missing_mode: tip_card = QLabel(_( - "💡 Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support." + "Recommendation: Python 3.11.9 is recommended for optimal build compatibility and engine support." )) tip_card.setWordWrap(True) tip_card.setStyleSheet(""" @@ -4519,7 +4618,7 @@ class PythonInstallerDialog(QDialog): text = combo.itemText(i) path = combo.itemData(i) or text if path and os.path.exists(path): - item = QListWidgetItem(f"🐍 {text}") + item = QListWidgetItem(text) item.setData(Qt.ItemDataRole.UserRole, path) self.local_list.addItem(item) found_any = True @@ -4527,7 +4626,7 @@ class PythonInstallerDialog(QDialog): if not found_any: sys_py = find_system_python() if sys_py and os.path.exists(sys_py): - item = QListWidgetItem(f"🐍 {sys_py}") + item = QListWidgetItem(sys_py) item.setData(Qt.ItemDataRole.UserRole, sys_py) self.local_list.addItem(item) found_any = True @@ -5224,8 +5323,10 @@ class MainWindow(QMainWindow): mappings = DEFAULT_MAPPINGS.copy() for r in range(sp.mapping_table.rowCount()): - k = sp.mapping_table.item(r, 0).text().strip() - v = sp.mapping_table.item(r, 1).text().strip() + item_k = sp.mapping_table.item(r, 0) + item_v = sp.mapping_table.item(r, 1) + k = item_k.text().strip() if item_k else "" + v = item_v.text().strip() if item_v else "" if k and v: mappings[k] = v params = { @@ -5251,6 +5352,7 @@ class MainWindow(QMainWindow): 'custom_out_dir': sp.out_dir_edit.text().strip(), 'temp_sandbox_mode': sp.sandbox_mode_combo.currentIndex(), 'use_venv': sp.venv_check.isChecked(), + 'keep_venv': sp.keep_venv_check.isChecked(), 'clean_all': sp.clean_all_check.isChecked(), 'version_file': version_file.as_posix() if version_file else None, 'temp_icon_file': temp_icon_file, @@ -5261,7 +5363,7 @@ class MainWindow(QMainWindow): 'pip_index_backup': backup_pip, 'concise_log': sp.concise_log_check.isChecked(), 'auto_save_log': sp.auto_save_log_check.isChecked(), - 'lite_mode': sp.lite_mode_check.isChecked(), + 'lite_mode': sp.rb_lite_mode.isChecked(), 'pyi_version': sp.pyi_ver_edit.text().strip(), 'nuitka_version': sp.nuitka_ver_edit.text().strip(), } @@ -5280,6 +5382,9 @@ class MainWindow(QMainWindow): self.drop_area.start_build_anim() def on_pack_finished(self, success, msg, failed_pkgs=None): + if not success and self.thread and self.thread.params.get('lite_mode') and not getattr(self.thread, '_is_cancelled', False): + msg += "\n\n" + _("Tip: Build failed in Lite Mode. You can try switching to [Compatibility Mode] in Build Settings and rebuild.") + self.append_log("\n" + msg) self.drop_area.stop_build_anim() @@ -5291,8 +5396,7 @@ class MainWindow(QMainWindow): self.update_ui_state("idle") self.set_status(_("Status: Build Cancelled")) return - - play_alert(success) + play_alert(success, self.settings_panel.sound_notify_check.isChecked()) if success: icon_path = self.settings_panel.icon_edit.text().strip() @@ -5423,14 +5527,39 @@ class MainWindow(QMainWindow): text_edit.append(msg) text_edit.ensureCursorVisible() - def show_log_context_menu(self, pos): + def show_log_context_menu(self, pos): current_log = self.log_stack.currentWidget() menu = QMenu(self) menu.setStyleSheet(""" - QMenu { background-color: #ffffff; color: #111827; border: 1px solid #d1d5db; border-radius: 8px; padding: 4px; } - QMenu::item { padding: 6px 20px; border-radius: 4px; font-size: 12px; font-family: Consolas, "Segoe UI", sans-serif; } - QMenu::item:selected { background-color: #eff6ff; color: #2563eb; font-weight: 600; } - QMenu::separator { height: 1px; background-color: #e5e7eb; margin: 4px 2px; } + QMenu { + background-color: #ffffff; + border: 1px solid #e2e8f0; + border-radius: 8px; + padding: 5px; + } + QMenu::item { + background-color: transparent; + color: #1e293b; + padding: 6px 16px; + border-radius: 6px; + font-size: 12px; + font-weight: 500; + font-family: Consolas, "Segoe UI", sans-serif; + } + QMenu::item:selected { + background-color: #eff6ff; + color: #2563eb; + font-weight: 600; + } + QMenu::item:disabled { + color: #94a3b8; + background-color: transparent; + } + QMenu::separator { + height: 1px; + background-color: #f1f5f9; + margin: 4px 6px; + } """) act_copy = menu.addAction(_("Copy")) @@ -5477,7 +5606,55 @@ def main(): app = QApplication(sys.argv) app.setStyle("Fusion") - + + palette = QPalette() + palette.setColor(QPalette.ColorRole.Window, QColor("#ffffff")) + palette.setColor(QPalette.ColorRole.WindowText, QColor("#111827")) + palette.setColor(QPalette.ColorRole.Base, QColor("#ffffff")) + palette.setColor(QPalette.ColorRole.AlternateBase, QColor("#f9fafb")) + palette.setColor(QPalette.ColorRole.ToolTipBase, QColor("#ffffff")) + palette.setColor(QPalette.ColorRole.ToolTipText, QColor("#111827")) + palette.setColor(QPalette.ColorRole.Text, QColor("#111827")) + palette.setColor(QPalette.ColorRole.Button, QColor("#f1f5f9")) + palette.setColor(QPalette.ColorRole.ButtonText, QColor("#111827")) + palette.setColor(QPalette.ColorRole.Highlight, QColor("#2563eb")) + palette.setColor(QPalette.ColorRole.HighlightedText, QColor("#ffffff")) + app.setPalette(palette) + + app.setStyleSheet(""" + QMenu { + background-color: #ffffff; + border: 1px solid #e2e8f0; + border-radius: 8px; + padding: 5px; + } + QMenu::item { + background-color: transparent; + color: #1e293b; + padding: 6px 16px; + border-radius: 6px; + font-size: 12px; + font-weight: 500; + font-family: Consolas, "Segoe UI", sans-serif; + } + QMenu::item:selected { + background-color: #eff6ff; + color: #2563eb; + font-weight: 600; + } + QMenu::item:disabled { + color: #94a3b8; + background-color: transparent; + } + QMenu::separator { + height: 1px; + background-color: #f1f5f9; + margin: 4px 6px; + } + """) + + I18N.update_qt_translator(I18N.current_lang) + font = QFont() font.setFamilies([ "Segoe UI", "Microsoft YaHei", "PingFang SC",