diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5b5f230..581d55f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -203,24 +203,31 @@ jobs: - name: Build with PyInstaller (Windows with Version Info) if: runner.os == 'Windows' run: | - pyinstaller --clean --onefile --noconsole --version-file=file_version_info.txt --icon=${{ env.ICON_PATH }} --add-data "${{ env.ICON_PATH }};." --name="${{ env.EXE_NAME_PREFIX }}_${{ env.VERSION }}" ${{ env.MAIN_SCRIPT }} + pyinstaller --clean --onefile --noconsole --version-file=file_version_info.txt --icon=${{ env.ICON_PATH }} --add-data "${{ env.ICON_PATH }};." --add-data "qpypack/locales;locales" --name="${{ env.EXE_NAME_PREFIX }}_Single" ${{ env.MAIN_SCRIPT }} + + pyinstaller --clean --onedir --noconsole --version-file=file_version_info.txt --icon=${{ env.ICON_PATH }} --add-data "${{ env.ICON_PATH }};." --add-data "qpypack/locales;locales" --name="${{ env.EXE_NAME_PREFIX }}_Portable" ${{ env.MAIN_SCRIPT }} - name: Build with PyInstaller (macOS / Linux) if: runner.os != 'Windows' shell: bash run: | if [ "${{ runner.os }}" = "macOS" ]; then - pyinstaller --onefile --noconsole --name=${{ env.EXE_NAME_PREFIX }} --icon=${{ env.ICON_PATH }} ${{ env.MAIN_SCRIPT }} + pyinstaller --onefile --noconsole --name="${{ env.EXE_NAME_PREFIX }}_Single" --icon=${{ env.ICON_PATH }} --add-data "qpypack/locales:locales" ${{ env.MAIN_SCRIPT }} + pyinstaller --onedir --noconsole --name="${{ env.EXE_NAME_PREFIX }}_Portable" --icon=${{ env.ICON_PATH }} --add-data "qpypack/locales:locales" ${{ env.MAIN_SCRIPT }} else - pyinstaller --onefile --noconsole --name=${{ env.EXE_NAME_PREFIX }} ${{ env.MAIN_SCRIPT }} + pyinstaller --onefile --noconsole --name="${{ env.EXE_NAME_PREFIX }}_Single" --add-data "qpypack/locales:locales" ${{ env.MAIN_SCRIPT }} + pyinstaller --onedir --noconsole --name="${{ env.EXE_NAME_PREFIX }}_Portable" --add-data "qpypack/locales:locales" ${{ env.MAIN_SCRIPT }} fi - name: Package Artifact (Windows) if: runner.os == 'Windows' shell: pwsh run: | - $OUT_NAME = "${{ env.EXE_NAME_PREFIX }}-${{ env.VERSION }}-windows-${{ matrix.arch }}" - Compress-Archive -Path "dist/${{ env.EXE_NAME_PREFIX }}_${{ env.VERSION }}.exe" -DestinationPath "$OUT_NAME.zip" -Force + $BASE_NAME = "${{ env.EXE_NAME_PREFIX }}-${{ env.VERSION }}-windows-${{ matrix.arch }}" + + Compress-Archive -Path "dist/${{ env.EXE_NAME_PREFIX }}_Single.exe" -DestinationPath "$BASE_NAME-SingleFile.zip" -Force + + Compress-Archive -Path "dist/${{ env.EXE_NAME_PREFIX }}_Portable" -DestinationPath "$BASE_NAME-Portable.zip" -Force - name: Package Artifact (macOS / Linux) if: runner.os != 'Windows' @@ -228,17 +235,28 @@ jobs: run: | VERSION=${{ env.VERSION }} OS_NAME=$(echo "${{ runner.os }}" | tr '[:upper:]' '[:lower:]') - OUT_NAME="${{ env.EXE_NAME_PREFIX }}-${VERSION}-${OS_NAME}-${{ matrix.arch }}" + BASE_NAME="${{ env.EXE_NAME_PREFIX }}-${VERSION}-${OS_NAME}-${{ matrix.arch }}" cd dist - if [ "${{ matrix.package_extension }}" = "zip" ]; then - zip -r "../${OUT_NAME}.zip" "${{ matrix.artifact_name }}" + + if [ "${{ runner.os }}" = "macOS" ]; then + TARGET_SINGLE="${{ env.EXE_NAME_PREFIX }}_Single.app" + TARGET_PORTABLE="${{ env.EXE_NAME_PREFIX }}_Portable.app" else - tar -czf "../${OUT_NAME}.tar.gz" "${{ matrix.artifact_name }}" + TARGET_SINGLE="${{ env.EXE_NAME_PREFIX }}_Single" + TARGET_PORTABLE="${{ env.EXE_NAME_PREFIX }}_Portable" + fi + + if [ "${{ matrix.package_extension }}" = "zip" ]; then + zip -r "../${BASE_NAME}-SingleFile.zip" "$TARGET_SINGLE" + zip -r "../${BASE_NAME}-Portable.zip" "$TARGET_PORTABLE" + else + tar -czf "../${BASE_NAME}-SingleFile.tar.gz" "$TARGET_SINGLE" + tar -czf "../${BASE_NAME}-Portable.tar.gz" "$TARGET_PORTABLE" fi - name: Append Standalone Binary to GitHub Release uses: softprops/action-gh-release@v2 with: - files: ${{ env.EXE_NAME_PREFIX }}-*.* + files: ${{ env.EXE_NAME_PREFIX }}-*.* env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 02365cd..8008cb0 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,7 @@ dist/ *.egg-info/ .eggs/ *.egg - +*.exe # ========================================== # 4. QPyPack 临时打包引擎缓存 (PyInstaller & Nuitka) # ========================================== @@ -68,4 +68,5 @@ sound_failure.wav .Spotlight-V100 .Trashes ehthumbs.db -Thumbs.db \ No newline at end of file +Thumbs.db + diff --git a/CHANGELOG.md b/CHANGELOG.md index 966f548..6406f6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,34 @@ QPyPack 项目的所有重要变更都将记录在此文件中。 本日志格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/) 规范, 且本项目严格遵循 [语义化版本 (Semantic Versioning)](https://semver.org/lang/zh-CN/) 规范。 +[English Version](./CHANGELOG_EN.md) | **中文** + +--- + +## [2.7.0] - 2026-08-01 + +### 新增 +* **Nuitka 自动编译器嗅探与探测**:新增对 `Clang` (LLVM) 与 `Zig`(专为 Python 3.13+ C 后端优化)编译器的自动探测与调用支持,优先与系统 MSVC (`--msvc=latest`) 或 Clang 自动匹配。 +* **免配置第三方库打包预设**:内置对 `ttkbootstrap`、`customtkinter`、`playwright`、`moviepy` 等高频报错/丢失资源库的自动化 `--collect-all` 与 `--collect-data` 处理,实现零配置打包。 +* **双模式实时日志查看器**:引入“精简模式 (Concise)”与“详细模式 (Detailed)”双视图日志查看器,支持在面板上方一键无缝实时切换、清空与导出日志。 +* **智能 Python 平台兼容性提示**:设置页面的 Python 解释器选择器新增动态指示卡片,实时展示对 Windows 7/8/10/11、macOS 及 Linux 的支持状态与官方下载引导。 +* **构建容错与降级保护机制**:新增编译前物理内存与磁盘空间评估;遭遇 `ZstdError` (OOM 内存溢出) 时自动触发单线程 (`--jobs=1`) 降级重试;遭遇杀毒软件或系统锁定图标时自动触发剥离图标降级构建。 + +### 修复 +* **源码 BOM 与编码解析兼容**:修复处理包含特殊 BOM (`utf-8-sig`) 或非标准系统回退编码的源码时,AST 模块可能抛出解码异常导致扫描中断的问题。 +* **云盘锁定感知与预警**:修复工作所在目录受 OneDrive / Dropbox 等云盘锁定同步时,缺乏明确预警导致打包中断的问题。 +* **控制台程序运行时崩溃**:修复因控制台“按回车退出逻辑与源码语法块作用域/闭合冲突引发的崩溃问题。 + +### 改进 +* **AST 解析引擎原生化重构**:将源码隐式依赖扫描由子进程调用彻底重构为同进程原生 AST 模块解析,大幅降低系统资源开销并成倍提升扫描速度。 +* **环境检索异步并发加速**:引入多线程异步并发检测机制,对系统内所有候选 Python 环境进行并行嗅探与版本校验,彻底消除软件启动时的 I/O 卡顿。 +* **纯矢量 UI 规范与 Emoji 清理**:全面清理侧边栏、Tab 标签及语言列表中的 Emoji 表情,全量升级为 Google Material SVG 矢量图标栈,解决 Linux 及老旧 Windows 系统下的字体回退乱码与排版跳动问题。 +* **卡片式动态构建状态反馈**:主面板拖拽区与状态栏支持实时捕获并渲染编译引擎(Nuitka / Scons / PyInstaller)极细粒度的编译进度文本,大幅缓解打包等待焦虑。 +* **重构“关于”页面与赞助交互**:全新设计“关于”选项卡,引入可视化 GitHub、PyPI、Issues 动作行按钮及自愿赞助模块。 +* **依赖安装弹性降级策略**:重构 pip 依赖构建逻辑,采用统一原子依赖清单;当指定严格版本号(`==`)安装失败时,自动剥离版本约束并拉取最新兼容版本。 +* **跨平台原生字节流图标生成**:剥离对 macOS `sips` 命令行工具的强依赖,重构纯 Python 原生字节流拼装机制处理跨平台 `.ico` 与 `.icns` 生成。 +* **扩展第三方包名映射库**:扩展内置包名映射字典,补充 `pyside6_addons`、`pyside6_essentials`、`attrs`、`psycopg2-binary` 等常见第三方包映射。 + --- ## [2.6.2] - 2026-07-27 diff --git a/CHANGELOG_EN.md b/CHANGELOG_EN.md new file mode 100644 index 0000000..b06cda6 --- /dev/null +++ b/CHANGELOG_EN.md @@ -0,0 +1,239 @@ +# Changelog + +All notable changes to the **QPyPack** project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +**English** | [中文版](./CHANGELOG.md) + +--- + +## [2.7.0] - 2026-08-01 + +### Added +* **Automated Compiler Sniffing & Invocation**: Added auto-detection and invocation for `Clang` (LLVM) and `Zig` (optimized for Python 3.13+ C backend) compilers in Nuitka, prioritizing MSVC (`--msvc=latest`) or Clang when available. +* **Zero-Config Package Presets**: PyInstaller engine now includes automated `--collect-all` and `--collect-data` handling for frequently problematic packages like `ttkbootstrap`, `customtkinter`, `playwright`, and `moviepy`. +* **Dual-Mode Real-Time Log Viewer**: Introduced a dual-mode log viewer with "Concise Mode" and "Detailed Mode" stacked views, supporting real-time seamless switching, clearing, and exporting above the log panel. +* **Smart Python Platform Compatibility Matrix**: Added a dynamic HTML platform support matrix to the Python interpreter selector in Settings, displaying real-time compatibility status for Windows 7/8/10/11, macOS, and Linux along with official download links. +* **Build Fault Tolerance & Fallback Protection**: Added pre-compilation system RAM and disk space evaluation; automatically triggers single-thread (`--jobs=1`) fallback retries on `ZstdError` (OOM) and strips icon flags if antivirus software locks icon resources. + +### Fixed +* **Source Encoding & BOM Compatibility**: Fixed an issue where the AST module could throw decoding exceptions on source code containing BOM (`utf-8-sig`) or non-standard system fallback encodings. +* **Cloud Drive Sync Warning**: Fixed unexpected build interruptions caused by OneDrive/Dropbox file synchronization locks by introducing early lock detection and warnings. +* **Console Runtime Crash**: Fixed crashes caused by console "pause on exit (`input`)" scoping conflicts by refactoring the injection logic to register strictly via `atexit.register`. + +### Changed +* **Native In-Process AST Parsing**: Refactored implicit dependency scanning from spawning subprocesses to native same-process AST parsing, drastically reducing system overhead and multiplying scan speed. +* **Asynchronous Parallel Environment Detection**: Introduced multi-threaded concurrent detection for candidate Python environments, eliminating startup I/O blocking. +* **Pure Vector UI & Emoji Cleanup**: Stripped emojis from sidebars, tab headers, and language selectors in favor of Google Material SVG vector icons, eliminating font fallback glitches and layout jumps on Linux and older Windows systems. +* **Granular Build Progress Feedback**: Main drop cards and status bars now capture and stream live compilation progress text from backend engines (Nuitka / Scons / PyInstaller), eliminating waiting anxiety. +* **Redesigned About Page & Sponsorship Integration**: Overhauled the About tab layout with interactive action buttons for GitHub, PyPI, and Issues, introducing a voluntary sponsorship encouragement section. +* **Atomic Dependency Resolution & Fallback**: Unified dependency build logic into an atomic manifest; automatically strips strict version constraints (`==`) and retries if specific version installs fail. +* **Native Byte-Stream Icon Generation**: Removed reliance on macOS `sips` CLI tool, refactoring pure Python byte-stream assembly for cross-platform `.ico` and `.icns` generation. +* **Expanded Package Mapping Library**: Expanded the built-in package mapping library to cover common third-party packages such as `pyside6_addons`, `pyside6_essentials`, `attrs`, `psycopg2-binary`, etc. + +--- + +## [2.6.2] - 2026-07-27 + +* **UI Slide Transition Animations**: Refactored page switching logic with dual-layer smooth slide animations, eliminating visual flickering and icon displacement when returning to the main dashboard. +* **Non-Intrusive Notification System**: Fully replaced invasive `QMessageBox` popups with lightweight status bar Toast notifications to maintain smooth packaging workflows. +* **Error Log Red Highlighting**: Automatically expands the log panel and highlights fatal exceptions, locked files, or missing dependencies in bright red HTML font for fast troubleshooting. +* **GNU gettext Engine Refactor**: Introduced `TranslationEngine`, refactoring hardcoded Chinese strings into English Base Keys; built-in `zh_CN` fallback dictionary ensures zero external dependency execution. +* **Global Multilingual Support**: Added translation packages for Japanese (`ja_JP`), Korean (`ko_KR`), French (`fr_FR`), German (`de_DE`), Spanish (`es_ES`), Russian (`ru_RU`), Portuguese (`pt_BR`), and Traditional Chinese (`zh_TW`). +* **Smart Language Selector**: Added language selector dropdown in Settings displaying native language names (e.g., Deutsch, Français) with automatic OS locale detection. +* **Scope Variable Collision Fix**: Fixed a critical issue where `QFileDialog` unpacking (`fp, _`) accidentally shadowed global translation function `_()`, causing local scope crashes. +* **Qt Animation Engine Warning**: Fixed low-level geometry animation warnings (`starting an animation without end value`) when applied to `QStackedLayout`. +* **PyPI Static Asset Packaging**: Updated `pyproject.toml` to include `locales/*.json` resources, ensuring i18n support works seamlessly after `pip install`. + +--- + +## [2.6.1] - 2026-07-25 + +* **Dependency Contamination Elimination**: Fixed a bug in "Lite Mode" where AST incorrectly traversed parent directories, preventing unrelated packages from leaking into the output bundle. +* **Build Sandbox Isolation**: Isolated target scripts in dedicated sandboxes during parsing to prevent interference from adjacent files; added an option to "Allow scanning all files in directory". +* **MSVC Smart Detection**: Added C++ compilation environment sniffing. If MSVC is installed, Nuitka automatically applies `--msvc=latest`, prioritizing native compilers and skipping MinGW downloads. +* **UPX Warning Suppression**: Automatically recognizes and ignores UPX compression errors on system core DLLs, slightly boosting build speed. + +--- + +## [2.6.0] - 2026-07-24 + +### 🎨 UI & UX Refactoring +* **Tab Navigation Refactor**: Reorganized TAB layouts for improved aesthetics and usability. +* **Typography & Layout Refinement**: Compacted engine description boxes; introduced cross-platform safe font stacks with graceful fallbacks. +* **High-DPI Rendering**: Prioritized extracting 256px HD icon layers combined with floating-point precision rendering, eliminating icon blurriness on 125%~200% DPI scales. + +### 🛠️ Engine & Stability Fixes +* **Package Name Fallback**: Built-in C-extension hardcoded mapping dictionary to prevent "module not found" errors. +* **False Mirror Timeout Suppression**: Smartly identifies pip package name typos to prevent false "Mirror Connection Timeout" alerts when network connections are normal. +* **Read-Only Directory Protection**: Console anti-crash scripts are now written to system temp directories to prevent build interruptions in read-only source folders. + +--- + +## [2.5.7] - 2026-07-23 + +* **Log Context Menu**: Added "Clear Log" and "Export Log" options. +* **Dropdown & Styling Fixes**: Fixed text overlapping bugs in non-editable combo boxes. +* **Button & Layout Standardization**: Unified sizes for action buttons like "Browse" and "AST Scan". +* **UX Enhancements**: Enabled auto-wrapping for drag-and-drop region titles to prevent UI clipping on long file paths. + +--- + +## [2.5.6] - 2026-07-23 + +* **PIP Dual-Source Backup**: Added backup PyPI mirror configuration and auto-retry fallback mechanisms, pre-loaded with major Chinese PyPI mirrors. +* **UI Visual Overhaul**: Refactored `QComboBox` drop-down popups to unify minimal white themes and scrolling experiences; centered Tab bar labels and set minimum window width (710px). +* **Packaging Stability**: Full-lifecycle control over dependency installations with auto-fallback mirror switching; populated Windows binary metadata `VarFileInfo` translation headers; optimized exclusion strategies in Lite Mode. + +--- + +## [2.5.5] - 2026-07-22 + +* **Accidental Deletion Prevention**: Optimized `build/dist` smart cleanup to protect desktop and workspace directories. +* **Full Sandbox Compilation**: Isolated build outputs in system temp directories, resolving cross-drive and path separator issues. +* **Path Mapping & UX Fixes**: Redirected `cwd` to source script directories during builds to resolve relative path references; fixed `open_dist` folder opening behavior. +* **pipreqs Crash Fix**: Resolved encoding crashes during automated dependency scanning. + +--- + +## [2.5.4] - 2026-07-18 + +* **Lite Mode Introduced**: Automatically strips redundant modules like `pip` and `unittest` and enables Nuitka `-OO` optimization to drastically reduce output size; paired with deep source scanning (up to 500 local dependencies) to maintain runtime stability. +* **False UPX Error Fix**: Explicitly passes `--noupx` when UPX is unchecked, blocking PyInstaller from quietly invoking system UPX tools and generating log noise. +* **Log Encoding Fix**: Enforced `encoding="utf-8"` across all underlying process calls (`subprocess`), solving console encoding garbles on Windows systems with GBK defaults. + +--- + +## [2.5.3] - 2026-07-17 + +* **Engine Version Locking**: Allows custom version pin settings for Nuitka, PyInstaller, and pipreqs in Advanced Settings to prevent upstream breakage. +* **Dynamic Progress UI**: Main dashboard titles now update and cycle build steps in real-time to eliminate perceived hanging. +* **Compilation Crash Fix**: Enforced global UTF-8 environments, resolving fatal GBK encoding errors when Nuitka parses libraries like PyTorch on Chinese Windows systems. +* **High-DPI Rendering Fix**: Resolved font blurriness on fractional scale factors (e.g., 125%) and cleaned up DPI permission errors. +* **Adaptive Dependency Scanning**: Fixed `pipreqs` crashes on non-UTF-8 source files by adding automatic fallback to local encodings. +* **Smart Interpreter Search**: Merged duplicate `.EXE` paths, default-selected current active environment, and stripped `\\?\` path prefixes to prevent subprocess invocation errors. +* **Absolute Clean Recycles**: Added forced cleanup for `nuitka-crash-report.xml` and temporary `__pycache__` folders to keep user directories clean. +* **Icon Update Fix**: Fixed an issue where icons failed to update when initiating new packaging tasks. + +--- + +## [2.5.2] - 2026-07-15 + +* **Refactored Compiler Command Generators**: Completely separated PyInstaller and Nuitka instruction generation into independent pipelines to eliminate cross-engine flag pollution. +* **Nuitka Asset Path Fix**: Fixed Nuitka compilation crashes when relative target paths for data files were set to `.` via `os.path.normpath` path normalization. +* **Nuitka Module Exclusion Fix**: Standardized module exclusion parameters to Nuitka's official `--nofollow-import-to`. +* **Windows Metadata Mapping**: Correctly mapped application description to `--file-description`, application name to `--product-name`, and added support for `--product-version`. + +--- + +## [2.5.1] - 2026-07-15 + +* **Multi-Platform CI/CD**: Utilized GitHub Actions to run concurrently across `windows-latest`, `macos-latest`, and `ubuntu-latest`, automatically attaching builds to Tag Releases. +* **Flat Icon Style**: Removed Emoji icons and updated UI to flat Google-style vector icons. +* **Copyright Notice Update**: Removed author name from the window title bar and added a subtle persistent copyright notice on the right side of the status bar. + +--- + +## [2.5.0] - 2026-07-15 + +* **Cross-Platform Safety & Decoupling**: Fully isolated Windows `winreg` registry calls to ensure safe static module loading on macOS and Linux. +* **Adaptive Image Format Engine**: Introduced `convert_image_to_format` graphics converter supporting SVG, PNG, and JPG conversion into `.ico` and `.icns`. +* **Metadata Translation**: Automatically writes `VSVersionInfo` metadata on Windows and maps standard Bundle IDs (e.g., `com.company.appname`) on macOS. +* **Artifact Extraction**: Refactored output file moving and resetting logic to accurately capture Windows `.exe`, macOS `.app`, and UNIX extensionless binaries. + +--- + +## [2.4.6] - 2026-07-12 + +* **Cross-Platform Compatibility**: Fixed crashes on non-Windows platforms caused by Windows-specific `creationflags` in subprocess calls; refactored UNIX Python interpreter detectors. +* **Modernized UI & UX**: Adopted card-based layouts and pill-tabs, resolving component overlap issues on low-resolution displays. +* **Multi-Version Kernel Sandboxing**: Supports selecting or browsing any local Python interpreter for code analysis and isolated compilation. +* **About Page Overhaul**: Introduced interactive action rows with seamless links to open-source repositories; fixed ICO anti-aliasing distortion. + +--- + +## [2.4.5] - 2026-07-06 + +* **Source Parsing Security**: Removed line-ending manipulation (CRLF to LF) during dependency scans and anti-crash injections, preventing multiline string corruption. + +--- + +## [2.4.4] - 2026-07-06 + +* **Visual Asset Manager**: Added a visual list component supporting file and directory additions via dialogs, with double-click support to modify target release paths. +* **Path Parsing Upgrade**: Rewrote underlying storage and `--add-data` flag construction to prevent absolute paths from being improperly truncated. + +--- + +## [2.4.3] - 2026-07-01 + +* **Custom Dependency List Support**: Added support for configuring custom `requirements.txt` paths per script. +* **Console Import Fixes**: Adjusted anti-crash injection to write temporary entry scripts in the source directory, preserving relative imports. +* **Background Thread Control**: Replaced unsafe `QThread.terminate()` calls with signal disconnection to eliminate UI freezes and deadlocks. +* **Nuitka Standalone Compatibility**: Switched to dynamic matching for `.dist` output folders, preventing build failures caused by entry point renaming. + +--- + +## [2.4.2] - 2026-06-28 + +* **Syntax Error Diagnostics**: Automatically scans build logs upon failure to pinpoint `IndentationError`, `SyntaxError`, and `TabError` in source files. +* **Precise Error Localization**: Highlights file names, line numbers, and error messages to distinguish between source code bugs and packaging engine failures. + +--- + +## [2.4.1] - 2026-06-25 + +* **Modular Settings Refactor**: Reorganized settings into "App Metadata", "Build Control", "Resources & Sandbox", and "Software Settings". +* **Custom Output Directory**: Supports exporting build artifacts to custom global directories with auto-creation of missing parent folders. +* **Compilation Concurrency Limits**: Added options to cap max CPU core usage during parallel compilation. +* **Build Sounds & Auto-Logging**: Introduced system audio notifications upon build completion and options to automatically save `.log` files to the output directory. + +--- + +## [2.4.0] - 2026-06-22 + +* **Console Anti-Crash Mechanism**: Automatically injects pause logic at the end of scripts when building non-GUI applications. +* **Robust File Deletion**: Refactored temp folder cleanup using `robust_rmtree` with delayed retries and read-only attribute stripping. +* **Cloud Storage Lock Pre-Check**: Added I/O pre-checks to catch OneDrive/Dropbox sync file locks before compilation starts. +* **CI/CD Automation**: Added GitHub Actions workflows to auto-publish releases to PyPI and GitHub Release attachments on Tag pushes. + +--- + +## [2.3.5] - 2026-06-17 + +* **Triple-Layer Dependency Safety Net**: Refactored dependency resolution into a 3-layer net (`Requirements -> Pipreqs -> AST Scan`), eliminating missing package runtime crashes. +* **Zero Workspace Pollution**: Moved configuration files to global path `~/.qpypack/config.ini` and shifted intermediate build files to system temp folders. +* **Standardized Build Logs**: Introduced CI/CD lifecycle status tags (`[Init]`, `[Env]`, `[Deps]`, `[Build]`, `[Pack]`). +* **Virtual Environment Self-Healing**: Automatically upgrades pip upon isolated venv creation, eliminating verbose legacy module warnings. + +--- + +## [2.3.0] - 2026-06-15 + +* **GUI Framework Upgrade**: Upgraded from PyQt5 to PySide6 for superior High-DPI scaling support. +* **Streamlined Engines**: Removed cx_Freeze to focus on refining PyInstaller and Nuitka double-engine cores. +* **Nuitka Best Practices**: Enforced `zstandard` compression in single-file mode; enabled `anti-bloat` plugins; added automatic `tkinter` probe detection. + +--- + +## [2.2.0] - 2026-06-14 + +* **Rebranding**: Officially rebranded to **QPyPack**, standardizing internal sandbox and temp file naming conventions. +* **Watchdog Timeouts**: Added timeout watchdog mechanisms to critical build steps to prevent hanging builds. +* **Smart Output Naming**: Automatically parses script versions to default output names as `{Name}_{Version}`. + +--- + +## [1.0.1] - 2026-05-31 + +* **Custom PIP Mirror Support**: Added PIP mirror configuration defaulting to Tsinghua University mirrors, with immediate UI application and `QSettings` persistence. +* **Unified Build Logic**: Virtual environment initialization and dependency resolution now strictly adhere to user-configured PIP mirrors. + +--- + +## 📄 License + +Copyright (C) 2026 QwejayHuang. +Licensed under the [GNU General Public License v3.0](LICENSE). \ No newline at end of file diff --git a/README.md b/README.md index c3aabe9..3fc1c64 100644 --- a/README.md +++ b/README.md @@ -18,56 +18,87 @@

+ - PyPI version + PyPI version + - Python versions + Python versions + + + PyPI Downloads + + + Platform Support +
+ + + Release Date + + + + Last Commit + + License + - GitHub stars + GitHub stars

-QPyPack 是一款致力于简化 Python 应用打包流程的可视化工具。它深度整合了 PyInstaller 与 Nuitka 两大主流编译引擎,将繁琐的终端命令行参数转化为直观、便捷的图形界面交互,帮助开发者更高效、高成功率地生成跨平台原生可执行程序。 +QPyPack 是一款致力于简化 Python 应用打包流程的可视化工具。它深度整合了 **PyInstaller** 与 **Nuitka** 两大主流编译引擎,将繁琐的终端命令行参数转化为直观、极简的图形界面交互,帮助开发者高效、高成功率地生成跨平台原生可执行程序。 --- ## 📷 界面预览 (Screenshots)

-image -image -image -image -image + 主界面英文预览 + 主界面中文预览 + 设置面板预览 +
+ 依赖管理预览 + 高级优化预览 + 关于页面预览

--- ## 🚀 核心特性 (Key Features) -为了降低传统命令行构建的配置成本,解决多平台下环境与依赖冲突问题,QPyPack 深度整合了以下工程化辅助功能: +QPyPack 旨在解决传统命令行打包配置繁琐、依赖遗漏、跨平台兼容性差以及编译失败率高的问题: -### 1. 直观的可视化交互体验 -* 📥 **拖放式载入 (Drag & Drop)**:无需手动拷贝路径,直接将 `.py` 或 `.pyw` 源代码文件拖放至软件窗口,系统将全自动解析并载入工作区。 -* 🎨 **图标智能检索与自适应**:源程序导入后,系统会自动检索同级目录下的常用图像资产(如 `icon.ico` / `logo.ico` / `icon.svg` / `logo.svg`)进行自适应格式转换、自动绑定与高清预览。 -* 🌐 **多语言支持 (i18n)**:原生支持简体中文、英文等多语言界面自由切换,为全球开发者提供零门槛、无障碍的使用体验。 +### 1. 现代化 UI 与直观交互体验 +* 📥 **拖放式载入 (Drag & Drop)**:只需将 `.py` 或 `.pyw` 源代码文件拖入窗口,系统全自动完成解析与工作区初始化。 +* 🎨 **纯矢量图标栈 (Material Design SVG)**:全界面采用 Google Material 矢量图标,全面清理 Emoji 表情,彻底杜绝跨平台系统下字体回退导致的排版乱码与跳动。 +* 🌐 **智能多语言 (i18n)**:原生支持简体中文、繁体中文、英文、德语、法语、日语、韩语等全球主流语言,自动识别系统首选语言并支持无缝切换。 +* 📊 **双模式实时日志查看器**:引入“精简模式 (Concise)”与“详细模式 (Detailed)”双视图日志面板,支持实时捕获编译引擎极细粒度的编译进度、一键导出与高亮提示。 -### 2. 依赖解析与虚拟环境沙盒 -* 🛡️ **虚拟环境隔离 (Virtualenv Sandbox)**:支持一键在系统临时目录下创建隔离的虚拟沙盒,仅安装应用运行所需的最小依赖项,从而有效精简最终可执行产物的体积。 -* 🔍 **多维度依赖解析**: - * **配置同步**:自动检索并优先读取项目目录下的 `requirements.txt` 依赖声明。 - * **AST 静态扫描**:提供辅助的 AST(静态语法树)深度分析,自动提取代码中导入的非标准库模块,精准补齐隐式导入依赖(Hidden Imports)。 -* ⚡ **内置 PyPI 加速源**:预设主流镜像加速通道,大幅提升沙盒中拉取构建引擎与依赖库的速度。 +### 2. 双编译后端与智能环境嗅探 +* ⚙️ **PyInstaller & Nuitka 架构**:图形化界面一键切换引擎,根据所选引擎自适应提供针对性的优化选项与参数控制。 +* 🔍 **C/C++ 编译器智能嗅探**:Nuitka 引擎下自动探测系统内已安装的 **MSVC**、**Clang** (LLVM) 及 **Zig**(专为 Python 3.13+ C 后端优化)编译器并优先调用,免除繁琐的环境变量设置。 +* 💻 **Python 平台兼容性卡片**:动态显示当前选中 Python 解释器对 Windows 7/8/10/11、macOS 及 Linux 的支持状态,并提供官方下载引导。 -### 3. 高级编译参数精准控制 -* ⚙️ **双引擎自适应切换**:在图形界面上实现 PyInstaller 与 Nuitka 的无缝切换,参数面板与优化选项将根据所选引擎的特性进行自适应调整。 -* 📝 **应用元数据注入 (Metadata)**:无需编写繁琐的规格文件,直接在界面输入版本号、公司名和产品描述,工具会自动将元数据注入二进制程序属性中(支持 Windows PE 结构和 macOS Info.plist 写入)。 -* 📂 **附加资源可视化管理 (Data Files)**:支持通过列表交互分别导入文件或文件夹,并支持双击列表条目直接修改打包后的相对释放路径(自适应释放路径映射)。 +### 3. 三重安全依赖网与零配置预设 +* 🛡️ **隔离虚拟沙盒 (Virtualenv Sandbox)**:一键在系统临时目录创建纯净构建沙盒,避免全局环境污染,极大精简产物体积。 +* 🔍 **多维依赖自动补全**:优先读取 `requirements.txt`;搭配深度原生 **AST(静态语法树)** 扫描引擎与 `pipreqs`,精准补齐隐式导入(Hidden Imports)。 +* 📦 **免配置第三方库打包预设**:内置对 `ttkbootstrap`、`customtkinter`、`playwright`、`moviepy` 等高频缺失/报错库的自动化打包处理,实现零配置一键生成。 +* ⚡ **多源 PIP 镜像与备用切源**:内置主流镜像加速源,支持主源超时自动平滑切换至备用源。 + +### 4. 强健的构建容错与自愈降级 +* 📏 **编译前物理资源评估**:自动评估物理内存与磁盘可用空间,智能调整并发 CPU 核心数。 +* 🛡️ **OOM 溢出自愈**:构建过程中遭遇 `ZstdError`(内存溢出)时,自动触发单线程 (`--jobs=1`) 降级重试。 +* 🛡️ **图标锁定抗性**:遭遇杀毒软件或系统锁定图标文件时,自动触发剥离图标参数自愈构建,保障二进制产物顺利生成。 +* ☁️ **云盘锁定预警**:前置感知识别 OneDrive / Dropbox 等云盘对文件的锁定同步状态并提供明确排查提示。 + +### 5. 资源管理与应用元数据 +* 📝 **PE / Plist 元数据注入**:直接在界面设定版本号、公司名、产品描述,全自动写入 Windows PE VersionInfo 或 macOS `Info.plist` 结构。 +* 📂 **可视化附加资源管理**:提供列表化界面管理附加文件与文件夹,支持双击直接编辑打包后的相对释放路径(自适应路径映射)。 --- @@ -85,10 +116,10 @@ pip install qpypack qpypack ``` -### 方法二:下载二进制文件 +### 方法二:下载独立二进制免安装版 -如果您不想配置本地 Python 环境,可直接在 Release 页面下载对应系统的预编译打包版本: -👉 [下载页面](https://github.com/Qwejay/QPyPack/releases) +如果您不想配置本地 Python 环境,可直接在 GitHub Release 页面下载对应系统的预编译打包版本: +👉 [下载预编译版本 (GitHub Releases)](https://github.com/Qwejay/QPyPack/releases) --- @@ -100,7 +131,7 @@ qpypack ## 💖 赞助支持 (Sponsorship) -QPyPack 是一个完全开源且免费的项目,由个人利用业余时间开发与维护。如果本项目帮助您提高了开发效率或解决了打包难题,欢迎通过以下方式对项目进行**自愿赞助**。您的支持将是本项目持续更新与维护的重要动力: +QPyPack 是一款完全开源且免费的项目,由作者利用业余时间开发与维护。如果本项目帮助您提高了开发效率或解决了打包难题,欢迎通过以下方式对项目进行**自愿赞助**。您的支持将是本项目持续更新的重要动力: - ⚡ **请作者喝咖啡**:[赞助支持 QPyPack](https://www.ifdian.net/a/qwejay)(支持微信 / 支付宝) @@ -114,6 +145,6 @@ QPyPack 是一个完全开源且免费的项目,由个人利用业余时间开 > [!NOTE] > **关于打包产物的版权**: -> 使用 QPyPack 构建生成的二进制文件/应用程序,其版权和开源许可**完全由使用者自行决定**,QPyPack 的 GPL-3.0 协议不会影响用户打包后的程序。 +> 使用 QPyPack 构建生成的二进制文件/应用程序,其版权和开源许可**完全由使用者自行决定**,QPyPack 的 GPL-3.0 协议不会约束或影响用户打包后的程序。 Copyright (C) 2026 QwejayHuang. diff --git a/README_EN.md b/README_EN.md index 4d072a9..887605e 100644 --- a/README_EN.md +++ b/README_EN.md @@ -14,67 +14,100 @@

- A Cross-Platform GUI Packaging & Compilation Suite based on PyInstaller and Nuitka + A Modern Cross-Platform Python Application Packaging & Compilation Suite Powered by PyInstaller and Nuitka

+ - PyPI version + PyPI version + - Python versions + Python versions + + + PyPI Downloads + + + Platform Support +
+ + + Release Date + + + + Last Commit + + License + - GitHub stars + GitHub stars

-QPyPack is a visual GUI tool designed to simplify Python application packaging workflows. It deeply integrates two major compilation engines—PyInstaller and Nuitka—converting tedious CLI arguments into an intuitive graphical interface, helping developers generate cross-platform native executables efficiently. +QPyPack is a visual GUI tool designed to simplify Python application packaging workflows. It deeply integrates two major compilation engines—**PyInstaller** and **Nuitka**—converting tedious CLI arguments into an intuitive graphical interface, helping developers generate cross-platform native executables efficiently and reliably. --- ## 📷 Screenshots

-image -image -image -image -image - + 主界面英文预览 + 主界面中文预览 + 设置面板预览 +
+ 依赖管理预览 + 高级优化预览 + 关于页面预览

--- ## 🚀 Key Features -To reduce configuration overhead in traditional CLI builds and resolve cross-platform environment/dependency conflicts, QPyPack provides the following integrated engineering features: +QPyPack addresses configuration complexity, missing implicit dependencies, cross-platform glitches, and high compilation failure rates in traditional CLI workflows: -### 1. Intuitive Visual Interaction -* 📥 **Drag & Drop Loading**: Simply drag `.py` or `.pyw` source files into the app window; QPyPack will automatically parse and load them into the workspace. -* 🎨 **Smart Icon Search & Adaptation**: Automatically searches for common icon assets in the source directory (`icon.ico`, `logo.ico`, `icon.svg`, `logo.svg`), performs format conversion, binds them, and provides high-res previews. -* 🌐 **Internationalization (i18n) Support**: Native multi-language interface support (English, Simplified Chinese, etc.) with real-time switching, providing a seamless, obstacle-free experience for global developers. +### 1. Modern UI & Intuitive UX +* 📥 **Drag & Drop Workspace**: Simply drop `.py` or `.pyw` source files into the window; QPyPack will automatically parse and initialize the workspace. +* 🎨 **Pure Vector Icon Stack (Material Design SVG)**:Cleaned up emoji icons in favor of Google Material SVG vector icons, completely eliminating font fallback issues and alignment glitches across Linux and older Windows systems. +* 🌐 **Native i18n Support**: Multilingual UI support out-of-the-box (English, Simplified/Traditional Chinese, German, French, Japanese, Korean, etc.) with auto-detection and live switching. +* 📊 **Dual-Mode Live Log Viewer**: Toggle between "Concise" and "Detailed" log panels with real-time build status tracking, error highlighting, and log export. -### 2. Dependency Resolution & Sandbox Isolation -* 🛡️ **Virtualenv Sandbox**: One-click creation of isolated temporary virtual environments to install only minimal required dependencies, significantly reducing output binary size. -* 🔍 **Multi-dimensional Dependency Scanning**: - * **Config Sync**: Automatically detects and prioritizes `requirements.txt` in the project directory. - * **AST Static Analysis**: Provides deep Abstract Syntax Tree (AST) scanning to extract non-standard modules and automatically complete hidden imports. -* ⚡ **Built-in PyPI Acceleration Mirrors**: Presets mainstream PyPI mirror channels to drastically speed up package downloading in the sandbox. +### 2. Dual Compilation Backends & Compiler Sniffing +* ⚙️ **PyInstaller & Nuitka Integration**: Seamlessly switch engines via GUI, with dynamic UI controls that adapt based on the selected backend. +* 🔍 **Smart Compiler Auto-Detection**: Automatically sniffs and prioritizes system C/C++ compilers for Nuitka, including **MSVC**, **Clang** (LLVM), and **Zig** (optimized for Python 3.13+ C backends). +* 💻 **Platform Compatibility Matrix**: Real-time status cards displaying OS support (Windows 7/8/10/11, macOS, Linux) for selected Python interpreters with official download shortcuts. + +### 3. Robust Dependency Resolution & Zero-Config Presets +* 🛡️ **Isolated Virtualenv Sandbox**: Create pristine temporary build sandboxes with one click, eliminating global package pollution and minimizing output binary sizes. +* 🔍 **Triple-Layer Dependency Protection**: Reads `requirements.txt`, runs deep native **AST (Abstract Syntax Tree)** static analysis, and executes `pipreqs` to automatically catch hidden imports. +* 📦 **Zero-Config Third-Party Presets**: Built-in automated handling for error-prone libraries like `ttkbootstrap`, `customtkinter`, `playwright`, `moviepy`, and more. +* ⚡ **Multi-Mirror PIP Management**: Integrated PyPI mirror presets with automatic fallback to secondary index sources on network timeout. + +### 4. Build Resilience & Self-Healing Fallbacks +* 📏 **Pre-flight Resource Evaluation**: Assesses available RAM and disk space before build, dynamically adjusting CPU concurrency. +* 🛡️ **OOM Fallback Recovery**: Automatically triggers single-thread retry mode (`--jobs=1`) when catching `ZstdError` / Out-Of-Memory exceptions. +* 🛡️ **Antivirus/Icon Lock Resilience**: Automatically strips icon parameters and retries build if icon resource writing is blocked by security software or system locks. +* ☁️ **Cloud Storage Lock Alerts**: Detects file synchronization locks caused by OneDrive, Dropbox, or other cloud drives and provides clear diagnostic tips. + +### 5. Data File Management & Metadata Injection +* 📝 **PE / Plist Metadata Injection**: Configure version strings, company names, and application descriptions via GUI; automatically writes Windows PE VersionInfo or macOS `Info.plist` bundles. +* 📂 **Visual Data Files Management**: Manage supplementary files and directories in a structured list with inline double-click editing for relative output destination paths. -### 3. Advanced Compilation Control -* ⚙️ **Dual-Engine Adaptive Switch**: Seamlessly switch between PyInstaller and Nuitka. Parameter panels dynamically adapt based on the selected engine. -* 📝 **Application Metadata Injection**: Write version numbers, company names, and descriptions directly in the UI without editing spec/version files (Supports Windows PE metadata & macOS Info.plist). -* 📂 **Visual Data Files Management**: Add files or folders via GUI lists with double-click editing support for output relative destination paths. --- ## ⚡ Quick Start ### Method 1: Install via pip +Ensure you are using Python >= 3.8: + ```bash # Install QPyPack pip install qpypack @@ -85,24 +118,33 @@ qpypack ### Method 2: Download Standalone Binaries -Download pre-compiled binaries directly from the [GitHub Releases](https://github.com/Qwejay/QPyPack/releases) page. +Download pre-compiled standalone executables directly from GitHub Releases: +👉 [GitHub Releases](https://github.com/Qwejay/QPyPack/releases) --- ## 📅 Changelog -For detailed release notes and update history, please refer to [CHANGELOG.md](CHANGELOG.md) or [GitHub Releases](https://github.com/Qwejay/QPyPack/releases). +For detailed update history and release notes, please refer to [CHANGELOG.md](CHANGELOG.md) or [GitHub Releases](https://github.com/Qwejay/QPyPack/releases). --- -## 🤝 Contributing +## 💖 Sponsorship -Issues and Pull Requests are welcome on [GitHub Issues](https://github.com/Qwejay/QPyPack/issues)! +QPyPack is an open-source project developed and maintained by the author in their free time. If QPyPack has improved your efficiency or solved packaging challenges, consider supporting the project with a voluntary donation: + +- ⚡ **Buy the Author a Coffee**: [Sponsor QPyPack](https://www.ifdian.net/a/qwejay) + +> **Note**: Sponsorship is completely voluntary and represents unconditional encouragement to open-source development, involving no commercial commitments or specific feature promises. Thank you for your support! --- ## 📄 License -Open-sourced under [GNU General Public License v3.0](LICENSE). +Open-sourced under the [GNU General Public License v3.0](LICENSE). + +> [!NOTE] +> **Regarding Binary Product Licensing**: +> Binaries and applications built using QPyPack are **entirely owned by the user**. QPyPack's GPL-3.0 license does not restrict or apply to your compiled output binaries. Copyright (C) 2026 QwejayHuang. diff --git a/docs/readme/README_TW.md b/docs/readme/README_TW.md index 0c477ea..5a3340e 100644 --- a/docs/readme/README_TW.md +++ b/docs/readme/README_TW.md @@ -14,57 +14,97 @@

- 基於 PyInstaller 與 Nuitka 的跨平台 Python 應用圖形化打包建置工具 + 基於 PyInstaller 與 Nuitka 的跨平台 Python 應用程式視覺化打包建置工具

+ - PyPI version + PyPI 版本 + - Python versions + Python 版本 + + + PyPI 下載量 + + + 支援平台 +
+ + + 釋出日期 + + + + 最新提交 + + - License + 開源條款 + - GitHub stars + GitHub 星星數

-QPyPack 是一款致力於簡化 Python 應用打包流程的圖形化工具。它深度整合了 PyInstaller 與 Nuitka 兩大主流編譯引擎,將繁瑣的命令列引數轉化為直觀、便利的圖形介面互動,幫助開發者更高效地產生跨平台原生可執行程式。 +QPyPack 是一款致力於簡化 Python 應用程式打包流程的視覺化工具。它深度整合了 **PyInstaller** 與 **Nuitka** 兩大主流編譯引擎,將繁瑣的終端機命令列參數轉化為直觀、極簡的圖形介面互動,協助開發者高效、高成功率地產生跨平台原生可執行程式。 --- ## 📷 介面預覽 (Screenshots)

-image -image +主介面預覽 +設定面板預覽 +相依性管理預覽 +進階優化預覽 +關於頁面預覽

--- ## 🚀 核心特性 (Key Features) -### 1. 直觀的圖形化互動體驗 -* 📥 **拖放式載入 (Drag & Drop)**:直接將 `.py` 或 `.pyw` 原始碼檔案拖放至視窗即可自動解析。 -* 🎨 **圖示智慧偵測與自適應**:自動檢索同級目錄下的圖示資產 (`icon.ico` / `logo.svg` 等) 並進行格式轉換與預覽。 +QPyPack 旨在解決傳統命令列打包設定繁瑣、相依性遺漏、跨平台相容性差以及編譯失敗率高的問題: -### 2. 依賴解析與虛擬環境沙盒 -* 🛡️ **虛擬環境隔離 (Virtualenv Sandbox)**:一鍵建立隔離的虛擬環境,僅安裝最小依賴項以縮減執行檔體積。 -* 🔍 **多維度依賴解析**:自動讀取 `requirements.txt` 並透過 AST 靜態掃描補全隱式匯入 (Hidden Imports)。 +### 1. 現代化 UI 與直觀互動體驗 +* 📥 **拖放式載入 (Drag & Drop)**:只需將 `.py` 或 `.pyw` 原始程式碼檔案拖入視窗,系統全自動完成剖析與工作區初始化。 +* 🎨 **純向量圖示棧 (Material Design SVG)**:全介面採用 Google Material 向量圖示,全面清理 Emoji 表情,徹底杜絕跨平台系統下字型遞補導致的排版亂碼與跳動。 +* 🌐 **智慧多語言 (i18n)**:原生支援簡體中文、繁體中文、英文、德語、法語、日語、韓語等全球主流語言,自動辨識系統偏好語言並支援無縫切換。 +* 📊 **雙模式即時日誌檢視器**:引入「精簡模式 (Concise)」與「詳細模式 (Detailed)」雙檢視日誌面板,支援即時擷取編譯引擎極細粒度的編譯進度、一鍵匯出與高亮提示。 -### 3. 進階編譯參數精準控制 -* ⚙️ **雙引擎自適應切換**:支援 PyInstaller 與 Nuitka 的無縫切換。 -* 📝 **應用元資料寫入 (Metadata)**:直觀輸入版本號、公司名和描述,自動寫入 PE 屬性或 macOS Info.plist。 -* 📂 **附加資源視覺化管理**:清單化管理檔案與資料夾,支援雙擊修改釋放路徑。 +### 2. 雙編譯後端與智慧環境偵測 +* ⚙️ **PyInstaller & Nuitka 架構**:圖形化介面一鍵切換引擎,根據所選引擎自適應提供針對性的優化選項與參數控制。 +* 🔍 **C/C++ 編譯器智慧偵測**:Nuitka 引擎下自動偵測系統內已安裝的 **MSVC**、**Clang** (LLVM) 及 **Zig**(專為 Python 3.13+ C 後端優化)編譯器並優先呼叫,免除繁瑣的環境變數設定。 +* 💻 **Python 平台相容性卡片**:動態顯示當前選中 Python 解譯器對 Windows 7/8/10/11、macOS 及 Linux 的支援狀態,並提供官方下載引導。 + +### 3. 三重安全相依性網與零設定預設 +* 🛡️ **隔離虛擬沙盒 (Virtualenv Sandbox)**:一鍵在系統暫存目錄建立純淨建置沙盒,避免全域環境污染,極大精簡產物體積。 +* 🔍 **多維相依性自動補全**:優先讀取 `requirements.txt`;搭配深度原生 **AST(靜態語法樹)** 掃描引擎與 `pipreqs`,精準補齊隱式匯入(Hidden Imports)。 +* 📦 **免設定第三方套件打包預設**:內建對 `ttkbootstrap`、`customtkinter`、`playwright`、`moviepy` 等高頻缺失/報錯套件的自動化打包處理,實現零設定一鍵產生。 +* ⚡ **多源 PIP 鏡像與備用切源**:內建主流鏡像加速源,支援主源逾時自動平滑切換至備用源。 + +### 4. 強健的建置容錯與自癒降級 +* 📏 **編譯前實體資源評估**:自動評估實體記憶體與磁碟可用空間,智慧調整併發 CPU 核心數。 +* 🛡️ **OOM 記憶體溢出自癒**:建置過程中遭遇 `ZstdError`(記憶體溢出)時,自動觸發單執行緒 (`--jobs=1`) 降級重試。 +* 🛡️ **圖示鎖定抗性**:遭遇防毒軟體或系統鎖定圖示檔案時,自動觸發剝離圖示參數自癒建置,保障二進位產物順利產生。 +* ☁️ **雲端硬碟鎖定預警**:前置感知識別 OneDrive / Dropbox 等雲端硬碟對檔案的鎖定同步狀態並提供明確排查提示。 + +### 5. 資源管理與應用程式元資料 +* 📝 **PE / Plist 元資料注入**:直接在介面設定版本號、公司名稱、產品描述,全自動寫入 Windows PE VersionInfo 或 macOS `Info.plist` 結構。 +* 📂 **視覺化附加資源管理**:提供列表化介面管理附加檔案與資料夾,支援雙擊直接編輯打包後的相對釋放路徑(自適應路徑對映)。 --- ## ⚡ 快速上手 (Quick Start) -### 通過 pip 安裝並執行 +### 方法一:透過 pip 安裝並執行 + +在 Python >= 3.8 的環境中,執行以下命令進行安裝與啟動: ```bash # 安裝 QPyPack @@ -74,18 +114,35 @@ pip install qpypack qpypack ``` -亦可直接在 [GitHub Releases 頁面](https://github.com/Qwejay/QPyPack/releases) 下載預編譯的可執行檔。 +### 方法二:下載獨立二進位免安裝版 + +如果您不想設定本地 Python 環境,可直接在 GitHub Release 頁面下載對應系統的預編譯打包版本: +👉 [下載預編譯版本 (GitHub Releases)](https://github.com/Qwejay/QPyPack/releases) --- -## 📅 更新記錄 (Changelog) +## 📅 更新日誌 (Changelog) -完整的版本更新歷史與 Release 說明請參閱 [CHANGELOG.md](CHANGELOG.md) 或 [GitHub Releases 頁面](https://github.com/Qwejay/QPyPack/releases)。 +完整的版本更新歷史與 Release 說明請參閱 [CHANGELOG.md](../../CHANGELOG.md) 或 [GitHub Releases 頁面](https://github.com/Qwejay/QPyPack/releases)。 --- -## 📄 開源協議 (License) +## 💖 贊助支援 (Sponsorship) -基於 [GNU General Public License v3.0](LICENSE) 協議開源。 +QPyPack 是一款完全開源且免費的專案,由作者利用業餘時間開發與維護。如果本專案協助您提高了開發效率或解決了打包難題,歡迎透過以下方式對專案進行**自願贊助**。您的支援將是本專案持續更新的重要動力: + +- ⚡ **請作者喝咖啡**:[贊助支援 QPyPack](https://www.ifdian.net/a/qwejay)(支援微信 / 支付寶) + +> **贊助說明**:贊助完全出於自願,屬於對開源專案的無償鼓勵,不包含任何商業服務繫結或特定功能開發承諾。非常感謝每一位支援開源創作的朋友! + +--- + +## 📄 開源條款 (License) + +本專案基於 [GNU General Public License v3.0](LICENSE) 開源,允許在遵循條款的前提下自由分發、修改和二次開發。 + +> [!NOTE] +> **關於打包產物的版權**: +> 使用 QPyPack 建置產生的二進位檔案/應用程式,其版權和開源許可**完全由使用者自行決定**,QPyPack 的 GPL-3.0 協議不會約束或影響使用者打包後的程式。 Copyright (C) 2026 QwejayHuang. \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 80e6287..cf81891 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "qpypack" -version = "2.6.2" +version = "2.7.0" description = "A cross-platform GUI packaging and compilation suite based on PyInstaller and Nuitka." readme = "README.md" authors = [ @@ -49,4 +49,12 @@ packages = ["qpypack"] qpypack = [ "icon.ico", "locales/*.json" -] \ No newline at end of file +] + +[project.optional-dependencies] +engines = [ + "pyinstaller", + "nuitka", + "pipreqs", + "zstandard" +] diff --git a/qpypack/locales/de_DE.json b/qpypack/locales/de_DE.json index f671566..775509e 100644 --- a/qpypack/locales/de_DE.json +++ b/qpypack/locales/de_DE.json @@ -1,56 +1,89 @@ { - "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Python-Skript (.py/.pyw) hierher ziehen\noder Klicken zum Durchsuchen...", - "Auto-parse dependencies, resources, and implicit imports": "Automatische Analyse von Abhängigkeiten, Ressourcen und impliziten Importen", - "Loaded: {filename}": "Geladen: {filename}", - "Parsing metadata...": "Metadaten werden analysiert...", - "Ready, waiting for build.": "Bereit, warte auf Build.", - "Initializing build...": "Build-Prozess wird initialisiert...", - "Preparing engine...": "Build-Engine wird vorbereitet...", - "Build Successful": "Build erfolgreich abgeschlossen", - "Open output directory or reset workspace.": "Öffnen Sie das Ausgabeverzeichnis oder setzen Sie den Arbeitsbereich zurück.", - "Build Failed": "Build fehlgeschlagen", - "Check log output below for troubleshooting.": "Überprüfen Sie das Protokoll unten zur Fehlerbehebung.", - "Status: Ready": " Status: Bereit", - "Status: Parsing {filename}...": " Status: Analysiere {filename}...", - "Status: Loaded {filename}{mode}": " Status: {filename}{mode} geladen", - "Status: Packaging ({engine}) ...": " Status: Paketierung läuft ({engine}) ...", - "Status: Build Completed": " Status: Build abgeschlossen", - "Status: Build Failed": " Status: Build fehlgeschlagen", - "Status: Workspace Reset": " Status: Arbeitsbereich zurückgesetzt", - "Start Build": " Build starten", - "Stop Build": " Build abbrechen", - "Open Directory": " Ordner öffnen", - "Rebuild": " Erneut bauen", - "Save & Return": " Speichern & Zurück", + "PyPI Official (Global Default)": "PyPI Offiziell (Globaler Standard)", + "Python TestPyPI": "Python TestPyPI", + "AWS PyPI Mirror (US/EU)": "AWS PyPI-Spiegelserver (USA/EU)", + "Tsinghua University (China)": "Tsinghua Universität", + "Aliyun Cloud (China)": "Aliyun Cloud", + "Tencent Cloud (China)": "Tencent Cloud", + "Huawei Cloud (China)": "Huawei Cloud", + "USTC (China)": "USTC", + "Modern Cross-Platform Python Application Packager": "Modernes Werkzeug zur Python-Paketierung", + "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka": "Plattformübergreifendes GUI-Tool zur Python-Paketierung basierend auf PyInstaller & Nuitka", + "Python Packaging, Reimagined.": "Python-Paketierung, neu gedacht.", + "Drop Python source code to start": "Ziehe den Python-Quellcode hierher, um zu beginnen", "Build Settings": "Build-Einstellungen", "Preferences": "Einstellungen", "About": "Über QPyPack", - "🚀 Engine": "🚀 Engine", - "📦 Dependencies": "📦 Abhängigkeiten", - "📂 Resources": "📂 Ressourcen", - "⚡ Optimization": "⚡ Optimierung", - "🗺️ Package Map": "🗺️ Paket-Zuordnung", + "Engine": "Engine", + "Dependencies": "Abhängigkeiten", + "Resources": "Ressourcen", + "Optimization": "Optimierung", + "Package Map": "Paket-Zuordnung", + "Execution Log": "Ausführungsprotokoll", + "Loaded: {filename}": "Geladen: {filename}", + "Parsing metadata...": "Metadaten werden analysiert...", + "Ready, waiting for build.": "Bereit, warte auf Build.", + "Initializing build...": "Initialisiere Build...", + "Preparing engine...": "Build-Engine wird vorbereitet...", + "Build Successful": "Build erfolgreich", + "Open output directory or reset workspace.": "Öffnen Sie das Ausgabeverzeichnis oder setzen Sie den Arbeitsbereich zurück.", + "Build Failed": "Build fehlgeschlagen", + "Check log output below for troubleshooting.": "Überprüfen Sie das Protokoll unten zur Fehlerbehebung.", + "Status: Ready": "Status: Bereit", + "Status: Parsing {filename}...": "Status: Analysiere {filename}...", + "Status: Loaded {filename}{mode}": "Status: {filename}{mode} geladen", + "Status: Packaging ({engine}) ...": "Status: Paketierung läuft ({engine}) ...", + "Status: Build Completed": "Status: Build abgeschlossen", + "Status: Build Failed": "Status: Build fehlgeschlagen", + "Status: Workspace Reset": "Status: Arbeitsbereich zurückgesetzt", + " [Console]": " [Mit Konsole]", + " [No Console]": " [Ohne Konsole]", + "Start Build": "Build starten", + "Stop Build": "Build abbrechen", + "Open Directory": "Ordner öffnen", + "Rebuild": "Erneut bauen", + "Save & Return": "Speichern & Zurück", + "Browse": "Durchsuchen...", + "AST Scan": "AST-Analyse", + "Add File": "Datei hinzufügen", + "Add Dir": "Ordner hinzufügen", + "Remove Selected": "Auswahl entfernen", + "Clear All": "Alles leeren", + "Add Mapping": "Zuordnung hinzufügen", + "Restore Defaults": "Wiederherstellen", + "Export Preset...": "Voreinstellung exportieren...", + "Import Preset...": "Voreinstellung importieren...", + "Reset to Default Config": "Auf Standardkonfiguration zurücksetzen", + "Cancel & Return": "Abbrechen & Zurück", + "Configure Build Settings": "Build-Parameter konfigurieren", + "Toggle Execution Log": "Ausführungsprotokoll anzeigen/ausblenden", + "Detailed Mode": "Detaillierter Modus", + "Concise Mode": "Kompakter Modus", + "Copy": "Kopieren", + "Select All": "Alles auswählen", + "Clear Log": "Protokoll löschen", + "Export Log...": "Protokoll exportieren...", "Engine & Environment": "Build-Engine und Umgebung", "Execution Mode": "Ausführungsmodus", - "Mirrors & Scanner": "Spiegelserver und Scanner-Einstellungen", - "Additional Resources (Drag & Drop Supported)": "Zusätzliche Ressourcen (Drag & Drop unterstützt)", - "Performance Optimization": "Leistungs- und Kompilieroptimierung", + "Mirrors & Scanner": "Spiegelserver und Scanner", + "Additional Resources (Drag & Drop Supported)": "Zusätzliche Ressourcen (Drag & Drop)", + "Performance Optimization": "Leistungsoptimierung", "Lock Core Dependencies": "Kernabhängigkeiten festlegen", - "Package Name Mappings": "Paketnamen-Zuordnungstabelle", + "Package Name Mappings": "Paketnamen-Zuordnung", "UI Language:": "Oberflächensprache:", - "App Metadata & Presets": "App-Metadaten und Voreinstellungen", + "App Metadata & Presets": "App-Metadaten & Voreinstellungen", "Output Location": "Ausgabeort der Anwendung", - "Preferences & System Behavior": "Einstellungen und Systemverhalten", + "Preferences & System Behavior": "Einstellungen & Systemverhalten", "Build Engine:": "Build-Engine:", "Python Interpreter:": "Python-Interpreter:", "Output Name:": "Name der Ausgabedatei:", "App Icon:": "Anwendungssymbol:", "Primary PIP Index:": "Primärer PIP-Spiegelserver:", "Backup PIP Index:": "Sekundärer PIP-Spiegelserver:", - "Requirements File:": "Abhängigkeitsdatei (requirements.txt):", - "Hidden Imports:": "Implizite Importe (Hidden Imports):", - "Exclude Modules:": "Auszuschließende Module (Excludes):", - "CPU Cores:": "Parallele CPU-Kerne:", + "Requirements File:": "Abhängigkeitsdatei:", + "Hidden Imports:": "Implizite Importe:", + "Exclude Modules:": "Auszuschließende Module:", + "CPU Cores:": "CPU-Kerne:", "UPX Path:": "UPX-Pfad:", "PyInstaller Version:": "PyInstaller-Version:", "Nuitka Version:": "Nuitka-Version:", @@ -60,103 +93,135 @@ "Description:": "Beschreibung:", "Output Rule:": "Ausgaberegel:", "Target Directory:": "Zielverzeichnis:", + "Source File Directory": "Verzeichnis der Quelldatei", + "Custom Directory": "Benutzerdefiniertes Verzeichnis", + "Import Name": "Importname", + "PyPI Package Name": "PyPI-Paketname", + "File": "Datei", + "Directory": "Verzeichnis", + "Edit Path": "Pfad bearbeiten", + "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)", - "Hide Console (--noconsole)": "Konsolenfenster ausblenden (--noconsole)", - "Use Virtual Environment (Recommended)": "Isolierte virtuelle Umgebung nutzen (Empfohlen)", - "Install requirements.txt": "Abhängigkeiten aus requirements.txt installieren", - "Analyze Dependencies (pipreqs)": "Projektabhängigkeiten automatisch analysieren (pipreqs)", + "Hide Console (--noconsole)": "Konsole ausblenden (--noconsole)", + "Use Virtual Environment (Recommended)": "Isolierte virtuelle Umgebung nutzen", + "Install requirements.txt": "requirements.txt installieren", + "Analyze Dependencies (pipreqs)": "Abhängigkeiten analysieren (pipreqs)", "Scan Entire Folder": "Gesamten Ordner scannen", "Enable UPX Compression": "UPX-Komprimierung aktivieren", - "Lite Mode (Exclude Dev/Test Dependencies)": "Lite-Modus (Dev-/Test-Abhängigkeiten ausschließen)", + "Lite Mode (Exclude Dev/Test Dependencies)": "Lite-Modus (Dev/Test ausschließen)", "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", "Sound Notification": "Benachrichtigungston bei Fertigstellung", - "Browse": "Durchsuchen...", - "AST Scan": "AST-Analyse", - "Add File": "Datei hinzufügen", - "Add Dir": "Ordner hinzufügen", - "Remove Selected": "Auswahl entfernen", - "Clear All": "Alles leeren", - "Add Mapping": "Zuordnung hinzufügen", - "Restore Defaults": "Standardwerte wiederherstellen", - "Export Preset...": "Voreinstellung exportieren...", - "Import Preset...": "Voreinstellung importieren...", - "Source File Directory": "Verzeichnis der Quelldatei", - "Custom Directory": "Benutzerdefiniertes Verzeichnis", - "Import Name": "Importname im Code", - "PyPI Package Name": "PyPI-Paketname", - "Reset to Default Config": "Auf Standardkonfiguration zurücksetzen", - "Cancel & Return": "Änderungen verwerfen & Zurück", - "Configure Build Settings": "Build-Parameter konfigurieren", - "Toggle Execution Log": "Protokoll anzeigen/ausblenden", - "Copy": "Kopieren", - "Select All": "Alles auswählen", - "Clear Log": "Protokoll löschen", - "Export Log...": "Protokoll exportieren...", - "A Cross-platform Python Packaging GUI Tool based on PyInstaller & Nuitka": "Ein plattformübergreifendes GUI-Tool zur Paketierung von Python-Anwendungen basierend auf PyInstaller & Nuitka", - " [Console]": " [Mit Konsole]", - " [No Console]": " [Ohne Konsole]", - "File": "Datei", - "Directory": "Verzeichnis", - "PyInstaller: Fast build speed, excellent compatibility. Ideal for rapid iteration.": "PyInstaller: Schnelle Erstellung, hervorragende Kompatibilität. Ideal für schnelle Entwicklungszyklen.", - "Nuitka: Compiles to native C/C++ binary. Better performance and source code protection.": "Nuitka: Kompiliert in eine native C/C++ Binärdatei. Bessere Leistung und Schutz des Quellcodes.", - "Leave blank to auto-detect system default Python": "Leer lassen, um den Standard-Interpreter des Systems automatisch zu erkennen", - "Leave blank to auto-match script name": "Leer lassen, um automatisch den Namen des Skripts zu verwenden", - "Leave blank to auto-search requirements.txt in current directory": "Leer lassen, um automatisch nach requirements.txt im aktuellen Ordner zu suchen", - "Comma separated (e.g. pandas, PyQt5)": "Durch Kommas getrennt (z. B. pandas, PyQt5)", - "Comma separated (e.g. tkinter, matplotlib)": "Durch Kommas getrennt (z. B. tkinter, matplotlib)", - "Leave blank to auto-detect from environment variables": "Leer lassen, um automatisch aus der PATH-Umgebungsvariable zu ermitteln", - "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "Schließt überflüssige Abhängigkeiten aus, um die Ausführungsgeschwindigkeit zu erhöhen und die Dateigröße zu reduzieren.", - "Double-click to edit target path; Drag & drop supported": "Doppelklick zum Bearbeiten des Zielpfads; Drag & Drop wird unterstützt", - "Package mappings have been reset to defaults.": "Paket-Zuordnungen wurden auf Standardwerte zurückgesetzt.", - "Config preset exported to: {path}": "Konfigurations-Voreinstellung exportiert nach: {path}", - "Config preset imported successfully.": "Konfigurations-Voreinstellung erfolgreich importiert.", - "AST scan completed, found {count} dependencies.": "AST-Scan abgeschlossen, {count} Abhängigkeiten gefunden.", - "No log content.": "Kein Protokollinhalt zum Exportieren vorhanden.", + "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", + "Leave blank to auto-search requirements.txt in current directory": "Leer lassen für automatische Suche", + "Comma separated (e.g. pandas, PyQt5)": "Durch Kommas getrennt (z.B. pandas, PyQt5)", + "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", + "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.", + "
Python {ver} Platform Matrix:Download Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility": "
Python {ver} Unterstützung:Python herunterladen
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Vollständige Abwärtskompatibilität", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux": "
Python {ver} Unterstützung:Python herunterladen
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 supported out-of-the-box": "
Python {ver} Unterstützung:Python herunterladen
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 wird nativ unterstützt", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requires MSVC / Clang / Zig (MinGW64 unsupported)": "
Python {ver} Unterstützung:Python herunterladen
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Erfordert MSVC / Clang / Zig", + "
Python InterpreterDownload Python
Auto-detecting system environment for Windows, macOS & Linux...": "
Python InterpreterPython herunterladen
Automatische Systemerkennung...", + "[INFO] Build Cancelled.": "[INFO] Build abgebrochen.", + "[INFO] Performing pre-flight environment checks...": "[INFO] Führe Vorab-Umgebungsprüfungen durch...", + "[INFO] Analyzing source code and project dependencies...": "[INFO] Analysiere Quellcode und Abhängigkeiten...", + "[INFO] Initializing isolated build environment...": "[INFO] Initialisiere isolierte Build-Umgebung...", + "[INFO] Python interpreter path: {path}": "[INFO] Python-Pfad: {path}", + "[INFO] Creating virtual environment...": "[INFO] Erstelle virtuelle Umgebung...", + "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] Synchronisiere und aktualisiere pip...", + "[INFO] Scanning project source code via pipreqs...": "[INFO] Scanne Quellcode mit pipreqs...", + "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] Installiere Engine [{pkg}] und Kern-Abhängigkeiten...", + "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Nuitka-Tipp: Stellen Sie bei Compiler-Download eine stabile Verbindung sicher.", + "[INFO] Successfully installed compatible versions.": "[INFO] Kompatible Versionen erfolgreich installiert.", + "[INFO] Resolving project dependencies...": "[INFO] Abhängigkeiten werden aufgelöst...", + "Declared in requirements.txt ({count}): {pkgs}": "In requirements.txt deklariert ({count}): {pkgs}", + "Declared in requirements.txt: None": "In requirements.txt deklariert: Keine", + "Discovered via scanner ({count}): {pkgs}": "Vom Scanner erkannt ({count}): {pkgs}", + "Auto-patched missing ({count}): {pkgs}": "Automatisch ergänzt ({count}): {pkgs}", + "Manifest complete (No missing packages)": "Manifest vollständig (Keine fehlenden Pakete)", + "Build engine packages ({count}): {pkgs}": "Engine-Pakete ({count}): {pkgs}", + "[INFO] Installing build environment and project dependencies ({count} packages): {pkgs}": "[INFO] Installiere Abhängigkeiten ({count} Pakete): {pkgs}", + "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] Wechsel zum Backup-PyPI-Spiegelserver: {url}", + "[INFO] Starting {engine} engine to compile binary files...": "[INFO] Starte {engine} für die Kompilierung...", + "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] MSVC-Umgebung erkannt, bevorzuge nativen C++ Compiler.", + "[INFO] Found local Clang environment, prioritizing LLVM Clang compiler.": "[INFO] Clang-Umgebung erkannt, bevorzuge LLVM Clang Compiler.", + "[INFO] Python 3.13+ detected: Using Zig compiler (--zig) as C backend.": "[INFO] Python 3.13+ erkannt: Verwende Zig-Compiler (--zig).", + "[INFO] Using MinGW64 compiler (--mingw64) for C backend.": "[INFO] Verwende MinGW64-Compiler (--mingw64).", + "[INFO] Evaluating system physical memory (Available: {ram:.1f} GB). Adaptive concurrency adjusted: {cores} -> {safe_jobs} ...": "[INFO] Evaluiere RAM (Verfügbar: {ram:.1f} GB). Parallelität angepasst: {cores} -> {safe_jobs} ...", + "[INFO] Stripping icon parameters and automatically rebuilding...": "[INFO] Entferne Icon-Parameter und baue neu...", + "[INFO] Writing application icon...": "[INFO] Schreibe Anwendungssymbol...", + "[INFO] Application icon written successfully.": "[INFO] Anwendungssymbol erfolgreich geschrieben.", + "[INFO] Lite mode enabled, excluding non-essential modules...": "[INFO] Lite-Modus aktiv, schließe unwichtige Module aus...", + "[INFO] Enabled Nuitka optimization directives...": "[INFO] Nuitka-Optimierungen aktiviert...", + "[INFO] Compilation completed, archiving built files...": "[INFO] Kompilierung abgeschlossen, archiviere Dateien...", + "[INFO] Validating output files and generating final product...": "[INFO] Validiere Ausgabedateien und erstelle Produkt...", + "[INFO] Build log exported to: {path}": "[INFO] Protokoll exportiert nach: {path}", + "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] Gebe Speicherplatz frei...", + "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] Kompilierung erfolgreich. Pfad: {path}", + "[WARN] Target project is in a Cloud Sync directory (e.g. OneDrive/Dropbox). Cloud sync may temporarily lock build files.": "[WARN] Projekt befindet sich in einem Cloud-Ordner. Dies kann Dateien sperren.", + "[WARN] Specified versions failed to install. Stripping version constraints for automatic compatibility match...": "[WARN] Installation bestimmter Versionen fehlgeschlagen. Versuche Auto-Kompatibilität...", + "[WARN] Some dependencies failed to install, build will proceed with risk...": "[WARN] Einige Abhängigkeiten fehlen, Build wird fortgesetzt (mit Risiko)...", + "[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] Wenig Speicherplatz (Verfügbar: {free:.1f} GB). Der Build könnte fehlschlagen.", + "[WARN] Memory allocation exception caught (ZstdError / OOM). Triggering memory protection fallback: Retrying in single-thread mode...": "[WARN] Out-Of-Memory Ausnahme. Wiederhole im Einzel-Thread-Modus...", + "[WARN] System low memory detected (zstd memory allocation failed). Automatically retrying in single-thread low-memory mode...": "[WARN] Wenig Arbeitsspeicher erkannt. Wiederhole im Einzel-Thread-Modus...", + "[WARN] Icon resource writing blocked (possibly locked by system/antivirus), triggering fallback protection...": "[WARN] Schreiben des Icons blockiert. Aktiviere Fallback...", + "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] Es wird empfohlen, [Virtuelle Umgebung] für den Lite-Modus zu aktivieren.", + "[WARN] Pause code injection exception: {error}": "[WARN] Ausnahme bei Pause-Code Injektion: {error}", + "[WARN] AST Analysis Exception: {error}": "[WARN] AST Analyse-Fehler: {error}", + "[WARN] Read requirements.txt warning: {error}": "[WARN] Lese-Warnung für requirements.txt: {error}", + "[WARN] Parse pipreqs output warning: {error}": "[WARN] Parse-Warnung für pipreqs: {error}", + "[WARN] Command timeout (>{timeout}s)": "[WARN] Befehls-Zeitüberschreitung (>{timeout}s)", + "[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] Abbruch: Zu wenig Speicherplatz. Bitte mindestens 5 GB freigeben.", + "[ERROR] Output directory is missing write permissions: {error}": "[ERROR] Zielverzeichnis fehlen Schreibrechte: {error}", + "[ERROR] Requirements file not found: {path}": "[ERROR] Abhängigkeitsdatei nicht gefunden: {path}", + "[ERROR] Insufficient disk space (Available: {free:.1f} GB). At least 0.5 GB is required to safely initialize the build environment.": "[ERROR] Speicherplatz unzureichend (Verfügbar: {free:.1f} GB).", + "[ERROR] Python interpreter is invalid or not found: {path}": "[ERROR] Python-Interpreter ungültig oder nicht gefunden: {path}", + "[ERROR] The specified icon file does not exist: {path}": "[ERROR] Das Symbol existiert nicht: {path}", + "[ERROR] Additional resource file/directory not found: {path}": "[ERROR] Ressource nicht gefunden: {path}", + "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] Virtuelle Umgebung konnte nicht erstellt werden.", + "[ERROR] Product transfer failed, file might be occupied by system process or lack permission: {error}": "[ERROR] Übertragung fehlgeschlagen: {error}", + "[ERROR] Could not locate valid executable product in temporary build directory: {path}": "[ERROR] Kein ausführbares Produkt gefunden: {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.": "[Syntaxfehler] Quellcode enthält Fehler:\n - Datei: {file}\n - Typ: {type}\n - Zeile: {line}\n - Details: {desc}\n\nTipp: Testen Sie den Code lokal.", + "[FAILED] Compilation interrupted with exceptions, please click 'Detailed Mode' above the log window for troubleshooting.": "[FAILED] Kompilierung abgebrochen. Nutzen Sie den 'Detaillierten Modus'.", + "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.": "[ERROR] Zieldatei durch Cloud gesperrt. Bitte entschlüsseln.", + "[ERROR] Please load a valid Python source file first!": "[ERROR] Bitte zuerst eine gültige Python-Datei laden!", + "[ERROR] Exception occurred during AST parsing: {error}": "[ERROR] Fehler bei AST-Analyse: {error}", + "[ERROR] Failed to export preset file: {error}": "[ERROR] Voreinstellung Export-Fehler: {error}", + "[ERROR] Preset file format error or corrupted: {error}": "[ERROR] Voreinstellung Format-Fehler: {error}", + "[ERROR] Failed to export log file: {error}": "[ERROR] Protokoll Export-Fehler: {error}", + "[ERROR] Build completed, but the following dependencies failed to install:\n\n - {pkgs}\n\nNote: The application might raise ModuleNotFoundError at runtime.": "[ERROR] Build beendet, aber folgende fehlten:\n\n - {pkgs}", + "[ERROR] Process error: command or binary missing ({error})": "[ERROR] Prozessfehler: ({error})", + "[ERROR] System execution exception: {error}": "[ERROR] Systemfehler: {error}", + "Dependency Missing Warning: {pkgs} failed to install. Check log for details.": "Warnung: {pkgs} nicht installiert.", + "Package mappings have been reset to defaults.": "Zuordnungen zurückgesetzt.", + "Config preset exported to: {path}": "Voreinstellung exportiert nach: {path}", + "Config preset imported successfully.": "Voreinstellung importiert.", + "AST scan completed, found {count} dependencies.": "AST-Analyse: {count} Abhängigkeiten gefunden.", + "No log content.": "Kein Protokoll vorhanden.", "Log saved to: {path}": "Protokoll gespeichert unter: {path}", - "Attention: Please check the log for details.": "Achtung: Bitte prüfen Sie das Protokoll für Details.", - "[INFO] Initializing isolated build environment...": "[INFO] Isolierte Build-Umgebung wird initialisiert...", - "[INFO] Python interpreter path: {path}": "[INFO] Verwendeter Python-Interpreter: {path}", - "[INFO] Creating virtual environment...": "[INFO] Erstelle virtuelle Umgebung (venv)...", - "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] Erstellung der virtuellen Umgebung fehlgeschlagen. Dem Python-System fehlen möglicherweise Module oder Rechte.", - "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] Synchronisiere und aktualisiere den Paketmanager pip...", - "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] Installiere Build-Engine [{pkg}] und Kern-Abhängigkeiten...", - "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Nuitka-Hinweis: Falls Sie beim ersten Build zum Download eines GCC/MinGW-Kompilers aufgefordert werden, stellen Sie eine stabile Internetverbindung sicher.", - "[INFO] Dependency installation [1/3]: Installing declared dependencies ({filename})...": "[INFO] Abhängigkeits-Installation [1/3]: Installiere deklarierte Abhängigkeiten ({filename})...", - "[INFO] Dependency installation [2/3]: Calling pipreqs to analyze project dependencies...": "[INFO] Abhängigkeits-Installation [2/3]: Führe pipreqs für statische Code-Analyse aus...", - "[INFO] Enabled single-file sandbox mode: parsing current script only to prevent pollution from other files.": "[INFO] Einzeldatei-Sandbox aktiviert: Analysiere nur das Zielskript, um Konflikte zu vermeiden.", - "[WARN] Enabled full-directory scan mode: scanning all Python files in the current directory...": "[WARN] Vollständiger Verzeichnisscan aktiviert: Scanne alle Python-Dateien im aktuellen Ordner...", - "[INFO] Dependency analysis service source address: {server}": "[INFO] PyPI-Serveradresse für Analyse: {server}", - "[INFO] Querying versions of dependency libraries, please wait...": "[INFO] Frage Paketversionen ab, bitte warten...", - "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] Wechsel zum Backup-PIP-Index: {url}", - "[INFO] Attempting to scan using compatible encoding...": "[INFO] Versuche erneuten Scan mit kompatibler Zeichenkodierung...", - "[WARN] pipreqs skipped deep scan, dependencies will be supplemented by AST scanning engine.": "[WARN] Tiefenscan von pipreqs übersprungen, fehlende Abhängigkeiten werden per AST ergänzt.", - "[INFO] Dependency installation [3/3]: Extracting implicit dependencies via AST static scan...": "[INFO] Abhängigkeits-Installation [3/3]: Extrahiere implizite Importe mittels AST-Scan...", - "[INFO] Parsing and installing implicit import dependencies: {pkgs}": "[INFO] Installiere erkannte implizite Abhängigkeiten: {pkgs}", - "[ERROR] ⚠️ Warning: Failed to install dependency [{pkg}]! May cause runtime crash.": "[ERROR] ⚠️ Warnung: Installation des Pakets [{pkg}] fehlgeschlagen! Kann zu Laufzeitabstürzen führen.", - "[INFO] Starting {engine} engine to compile binary files...": "[INFO] Starte {engine}-Engine für die Kompilierung...", - "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] Lokale MSVC-Umgebung erkannt. Bevorzuge nativen C++ Kompiler.", - "[INFO] Lite mode enabled, executing size reduction strategy...": "[INFO] Lite-Modus aktiv: Führe Optimierungen zur Größenreduzierung aus...", - "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] Es wird dringend empfohlen, 'Virtuelle Umgebung' zu aktivieren, um die Größe optimal zu reduzieren.", - "[INFO] Enabled Nuitka optimization directives...": "[INFO] Nuitka-Optimierungsflags (-OO) angewendet...", - "[INFO] Core compilation completed, extracting and archiving built files...": "[INFO] Hauptkompilierung abgeschlossen, extrahiere und archiviere Ausgabedateien...", - "[ERROR] Product transfer failed, file might be occupied by system process or lack permission: {error}": "[ERROR] Übertragung der Ausgabedatei fehlgeschlagen. Datei ist möglicherweise blockiert oder Rechte fehlen: {error}", - "[ERROR] Could not locate valid executable product in temporary build directory: {path}": "[ERROR] Keine gültige ausführbare Datei im temporären Build-Verzeichnis gefunden: {path}", - "[INFO] Validating output files and generating final product...": "[INFO] Validiere Ausgabedateien und erstelle das Endprodukt...", - "[INFO] Build log exported to: {path}": "[INFO] Build-Protokoll exportiert nach: {path}", - "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] Kompilierung erfolgreich abgeschlossen. Ausgabe: {path}", - "[Syntax Error] Source program has syntax or indentation errors!\n - File: {file}\n - Type: {type}\n - Line: near {line}\n - Desc: {desc}\n\nTip: This is an error in the source code logic. Ensure it runs locally before compiling.": "[Syntaxfehler] Der Quellcode enthält einen Syntax- oder Einrückungsfehler!\n - Datei: {file}\n - Fehlertyp: {type}\n - Zeile: nahe Zeile {line}\n - Details: {desc}\n\nHinweis: Dies ist ein Fehler im Quellcode. Stellen Sie sicher, dass das Skript lokal fehlerfrei läuft.", - "\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!": "\n!!!!!!!!!! [Diagnose-Traceback: Vollständiges Protokoll aufgrund eines Ausführungsfehlers] !!!!!!!!!!", - "[FAILED] Compilation interrupted with exceptions, refer to the log for troubleshooting.": "[FAILED] Kompilierung aufgrund von Fehlern abgebrochen. Prüfen Sie das Protokoll.", - "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] Gebe Speicherplatz frei und bereinige temporäre Build-Umgebung...", - "\\nProgram execution completed, press Enter to exit...": "\\nAusführung beendet. Drücken Sie die Eingabetaste zum Beenden...", - "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.": "[ERROR] Zieldatei ist gesperrt oder durch einen Cloud-Dienst verschlüsselt. Bitte entsperren und erneut versuchen.", - "[ERROR] Please load a valid Python source file first!": "[ERROR] Bitte laden Sie zuerst eine gültige Python-Quelldatei!", - "[ERROR] Exception occurred during AST parsing: {error}": "[ERROR] Ausnahme bei der AST-Analyse aufgetreten: {error}", - "[ERROR] Failed to export preset file: {error}": "[ERROR] Voreinstellungsdatei konnte nicht exportiert werden: {error}", - "[ERROR] Preset file format error or corrupted: {error}": "[ERROR] Ungültiges oder beschädigtes Format der Voreinstellungsdatei: {error}", - "[ERROR] Failed to export log file: {error}": "[ERROR] Protokolldatei konnte nicht exportiert werden: {error}", - "[ERROR] Build completed, but the following dependencies failed to install during pre-build:\n\n 👉 {pkgs}\n\n⚠️ Tip: The program might crash at runtime due to missing modules!": "[ERROR] Build abgeschlossen, aber die Vorab-Installation folgender Abhängigkeiten ist fehlgeschlagen:\n\n 👉 {pkgs}\n\n⚠️ Hinweis: Die Anwendung könnte zur Laufzeit wegen fehlender Module abstürzen!" -} \ No newline at end of file + "Attention: Please check the log for details.": "Achtung: Details im Protokoll.", + "Are you sure you want to reset all preferences to default?": "Wirklich alles zurücksetzen?", + "Global configuration has been reset.": "Konfiguration zurückgesetzt.", + "\\nProgram execution completed, press Enter to exit...": "\\nAusführung beendet. Enter drücken...", + "Project-specific. Not saved to global preferences. Use 'Export Preset' to save config.": "Projektspezifisch. Mit 'Voreinstellung exportieren' speichern.", + "GitHub Repository": "GitHub", + "Issues & Feedback": "Feedback", + "PyPI Home": "PyPI", + "Sponsor": "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 ist kostenlos. Unterstützen Sie den Autor mit einem Kaffee!", + "* Sponsorship is completely voluntary, serves as an unconditional encouragement to the open-source community, and involves no commercial commitments. Thank you for your support!": "* Sponsoring ist freiwillig. Danke für die Unterstützung!", + "Python Environment Required": "Python benötigt", + "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).": "Kein Python gefunden!
Bitte installieren Sie Python (mit 'Add to PATH').", + "Download Python": "Python herunterladen", + "Unknown": "Unbekannt", + "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Python-Skript (.py/.pyw) hierher ziehen\noder Klicken zum Durchsuchen..." +} diff --git a/qpypack/locales/es_ES.json b/qpypack/locales/es_ES.json index 122e0f7..c51819b 100644 --- a/qpypack/locales/es_ES.json +++ b/qpypack/locales/es_ES.json @@ -1,57 +1,90 @@ { - "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Arrastra y suelta el script Python (.py/.pyw) aquí\no Haz clic para buscar...", - "Auto-parse dependencies, resources, and implicit imports": "Análisis automático de dependencias, recursos e importaciones implícitas", - "Loaded: {filename}": "Cargado: {filename}", - "Parsing metadata...": "Analizando metadatos...", - "Ready, waiting for build.": "Listo, esperando compilación.", - "Initializing build...": "Inicializando proceso de compilación...", - "Preparing engine...": "Preparando el motor...", - "Build Successful": "Compilación completada con éxito", - "Open output directory or reset workspace.": "Abre el directorio de salida o reinicia el espacio de trabajo.", - "Build Failed": "Compilación fallida", - "Check log output below for troubleshooting.": "Consulta el registro a continuación para solucionar el problema.", - "Status: Ready": " Estado: Listo", - "Status: Parsing {filename}...": " Estado: Analizando {filename}...", - "Status: Loaded {filename}{mode}": " Estado: {filename}{mode} cargado", - "Status: Packaging ({engine}) ...": " Estado: Empaquetando ({engine}) ...", - "Status: Build Completed": " Estado: Compilación completada", - "Status: Build Failed": " Estado: Compilación fallida", - "Status: Workspace Reset": " Estado: Espacio de trabajo reiniciado", - "Start Build": " Iniciar compilación", - "Stop Build": " Detener", - "Open Directory": " Abrir carpeta", - "Rebuild": " Recompilar", - "Save & Return": " Guardar y regresar", + "PyPI Official (Global Default)": "PyPI Oficial (Predeterminado Global)", + "Python TestPyPI": "Python TestPyPI", + "AWS PyPI Mirror (US/EU)": "Espejo PyPI AWS (EE. UU./UE)", + "Tsinghua University (China)": "Universidad Tsinghua (China)", + "Aliyun Cloud (China)": "Nube Aliyun (China)", + "Tencent Cloud (China)": "Nube Tencent (China)", + "Huawei Cloud (China)": "Nube Huawei (China)", + "USTC (China)": "USTC (China)", + "Modern Cross-Platform Python Application Packager": "Empaquetador de aplicaciones Python multiplataforma moderno", + "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka": "Herramienta GUI multiplataforma para empaquetar aplicaciones Python basada en PyInstaller y Nuitka", + "Python Packaging, Reimagined.": "Empaquetado de Python, reimaginado.", + "Drop Python source code to start": "Suelta el código fuente de Python para comenzar", "Build Settings": "Opciones de compilación", "Preferences": "Preferencias", "About": "Acerca de", - "🚀 Engine": "🚀 Motor", - "📦 Dependencies": "📦 Dependencias", - "📂 Resources": "📂 Recursos", - "⚡ Optimization": "⚡ Optimización", - "🗺️ Package Map": "🗺️ Mapeo", + "Engine": "Motor", + "Dependencies": "Dependencias", + "Resources": "Recursos", + "Optimization": "Optimización", + "Package Map": "Mapeo", + "Execution Log": "Registro de Ejecución", + "Loaded: {filename}": "Cargado: {filename}", + "Parsing metadata...": "Analizando metadatos...", + "Ready, waiting for build.": "Listo, esperando compilación.", + "Initializing build...": "Inicializando compilación...", + "Preparing engine...": "Preparando el motor...", + "Build Successful": "Compilación exitosa", + "Open output directory or reset workspace.": "Abre el directorio de salida o reinicia el espacio de trabajo.", + "Build Failed": "Compilación fallida", + "Check log output below for troubleshooting.": "Consulta el registro a continuación para solucionar el problema.", + "Status: Ready": "Estado: Listo", + "Status: Parsing {filename}...": "Estado: Analizando {filename}...", + "Status: Loaded {filename}{mode}": "Estado: {filename}{mode} cargado", + "Status: Packaging ({engine}) ...": "Estado: Empaquetando ({engine}) ...", + "Status: Build Completed": "Estado: Compilación completada", + "Status: Build Failed": "Estado: Compilación fallida", + "Status: Workspace Reset": "Estado: Espacio de trabajo reiniciado", + " [Console]": " [Con consola]", + " [No Console]": " [Sin consola]", + "Start Build": "Iniciar compilación", + "Stop Build": "Detener", + "Open Directory": "Abrir carpeta", + "Rebuild": "Recompilar", + "Save & Return": "Guardar y regresar", + "Browse": "Examinar...", + "AST Scan": "Análisis AST", + "Add File": "Añadir archivo", + "Add Dir": "Añadir carpeta", + "Remove Selected": "Eliminar selección", + "Clear All": "Limpiar todo", + "Add Mapping": "Añadir mapeo", + "Restore Defaults": "Restaurar", + "Export Preset...": "Exportar ajustes...", + "Import Preset...": "Importar ajustes...", + "Reset to Default Config": "Restablecer configuración predeterminada", + "Cancel & Return": "Cancelar y regresar", + "Configure Build Settings": "Configurar parámetros de compilación", + "Toggle Execution Log": "Alternar registro de ejecución", + "Detailed Mode": "Modo Detallado", + "Concise Mode": "Modo Conciso", + "Copy": "Copiar", + "Select All": "Seleccionar todo", + "Clear Log": "Limpiar registro", + "Export Log...": "Exportar registro...", "Engine & Environment": "Motor de compilación y entorno", "Execution Mode": "Modo de ejecución", "Mirrors & Scanner": "Servidores espejo y escáner", "Additional Resources (Drag & Drop Supported)": "Recursos adicionales (Soporta arrastrar y soltar)", - "Performance Optimization": "Optimización de rendimiento y compilación", - "Lock Core Dependencies": "Bloquear versiones de dependencias clave", - "Package Name Mappings": "Tabla de mapeo de nombres de paquetes", + "Performance Optimization": "Optimización de rendimiento", + "Lock Core Dependencies": "Bloquear dependencias clave", + "Package Name Mappings": "Mapeo de nombres de paquetes", "UI Language:": "Idioma de la interfaz:", - "App Metadata & Presets": "Metadatos de la aplicación y ajustes preestablecidos", + "App Metadata & Presets": "Metadatos y ajustes preestablecidos", "Output Location": "Ubicación del archivo ejecutable", - "Preferences & System Behavior": "Preferencias y comportamiento del sistema", + "Preferences & System Behavior": "Preferencias y comportamiento", "Build Engine:": "Motor de compilación:", "Python Interpreter:": "Intérprete de Python:", "Output Name:": "Nombre del ejecutable:", "App Icon:": "Icono de la aplicación:", "Primary PIP Index:": "Índice PIP principal:", "Backup PIP Index:": "Índice PIP secundario:", - "Requirements File:": "Archivo de dependencias (requirements.txt):", - "Hidden Imports:": "Importaciones implícitas (Hidden Imports):", - "Exclude Modules:": "Excluir módulos (Excludes):", - "CPU Cores:": "Núcleos CPU en paralelo:", - "UPX Path:": "Ruta del ejecutable UPX:", + "Requirements File:": "Archivo de dependencias:", + "Hidden Imports:": "Importaciones implícitas:", + "Exclude Modules:": "Excluir módulos (excludes):", + "CPU Cores:": "Núcleos CPU:", + "UPX Path:": "Ruta UPX:", "PyInstaller Version:": "Versión de PyInstaller:", "Nuitka Version:": "Versión de Nuitka:", "Pipreqs Version:": "Versión de Pipreqs:", @@ -60,103 +93,135 @@ "Description:": "Descripción:", "Output Rule:": "Regla de ubicación:", "Target Directory:": "Carpeta de destino:", + "Source File Directory": "Carpeta del archivo fuente", + "Custom Directory": "Carpeta personalizada", + "Import Name": "Nombre de importación", + "PyPI Package Name": "Paquete PyPI", + "File": "Archivo", + "Directory": "Carpeta", + "Edit Path": "Editar Ruta", + "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)", - "Hide Console (--noconsole)": "Ocultar ventana de la consola (--noconsole)", - "Use Virtual Environment (Recommended)": "Usar entorno virtual aislado (Recomendado)", - "Install requirements.txt": "Instalar dependencias de requirements.txt", - "Analyze Dependencies (pipreqs)": "Analizar dependencias automáticamente (pipreqs)", + "Hide Console (--noconsole)": "Ocultar consola (--noconsole)", + "Use Virtual Environment (Recommended)": "Usar entorno virtual (Recomendado)", + "Install requirements.txt": "Instalar requirements.txt", + "Analyze Dependencies (pipreqs)": "Analizar dependencias (pipreqs)", "Scan Entire Folder": "Escanear toda la carpeta", "Enable UPX Compression": "Habilitar compresión UPX", "Lite Mode (Exclude Dev/Test Dependencies)": "Modo ligero (Excluir dependencias dev/test)", "Concise Log Output": "Salida de registro concisa", - "Auto-save Build Log": "Guardar registro de compilación automáticamente", + "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", "Sound Notification": "Notificación sonora al finalizar", - "Browse": "Examinar...", - "AST Scan": "Análisis AST", - "Add File": "Añadir archivo", - "Add Dir": "Añadir carpeta", - "Remove Selected": "Eliminar selección", - "Clear All": "Limpiar todo", - "Add Mapping": "Añadir mapeo", - "Restore Defaults": "Restaurar valores predeterminados", - "Export Preset...": "Exportar ajustes...", - "Import Preset...": "Importar ajustes...", - "Source File Directory": "Carpeta del archivo fuente", - "Custom Directory": "Carpeta personalizada", - "Import Name": "Nombre de importación en código", - "PyPI Package Name": "Nombre del paquete en PyPI", - "Reset to Default Config": "Restablecer configuración predeterminada", - "Cancel & Return": "Descartar cambios y regresar", - "Configure Build Settings": "Configurar parámetros de compilación", - "Toggle Execution Log": "Mostrar/Ocultar registro de ejecución", - "Copy": "Copiar", - "Select All": "Seleccionar todo", - "Clear Log": "Limpiar registro", - "Export Log...": "Exportar registro...", - "A Cross-platform Python Packaging GUI Tool based on PyInstaller & Nuitka": "Una herramienta GUI multiplataforma para empaquetar aplicaciones Python basada en PyInstaller y Nuitka", - " [Console]": " [Con consola]", - " [No Console]": " [Sin consola]", - "File": "Archivo", - "Directory": "Carpeta", - "PyInstaller: Fast build speed, excellent compatibility. Ideal for rapid iteration.": "PyInstaller: Compilación rápida y excelente compatibilidad. Ideal para desarrollo iterativo.", - "Nuitka: Compiles to native C/C++ binary. Better performance and source code protection.": "Nuitka: Compila a binario C/C++ nativo. Ofrece mayor rendimiento y protección del código fuente.", - "Leave blank to auto-detect system default Python": "Dejar en blanco para detectar automáticamente el intérprete del sistema", + "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", - "Leave blank to auto-search requirements.txt in current directory": "Dejar en blanco para buscar automáticamente requirements.txt en la carpeta actual", + "Leave blank to auto-search requirements.txt in current directory": "Dejar en blanco para buscar automáticamente requirements.txt", "Comma separated (e.g. pandas, PyQt5)": "Separados por comas (ej. pandas, PyQt5)", "Comma separated (e.g. tkinter, matplotlib)": "Separados por comas (ej. tkinter, matplotlib)", - "Leave blank to auto-detect from environment variables": "Dejar en blanco para detectar desde las variables de entorno (PATH)", + "Leave blank to auto-detect from environment variables": "Dejar en blanco para detectar desde las variables de entorno", "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "Excluye dependencias innecesarias dinámicamente para reducir el tamaño y acelerar la compilación.", - "Double-click to edit target path; Drag & drop supported": "Doble clic para editar la ruta relativa. Admite arrastrar y soltar", - "Package mappings have been reset to defaults.": "Los mapeos de paquetes se han restablecido a los valores predeterminados.", - "Config preset exported to: {path}": "Ajuste preestablecido exportado a: {path}", - "Config preset imported successfully.": "Ajuste preestablecido importado con éxito.", - "AST scan completed, found {count} dependencies.": "Análisis AST completado. Se encontraron {count} dependencias.", - "No log content.": "No hay contenido en el registro para exportar.", - "Log saved to: {path}": "Registro guardado en: {path}", - "Attention: Please check the log for details.": "Atención: Por favor, consulte el registro para obtener detalles.", - "[INFO] Initializing isolated build environment...": "[INFO] Inicializando entorno de compilación aislado...", + "Double-click to edit target path; Drag & drop supported": "Doble clic para editar la ruta. Admite arrastrar y soltar", + "PyInstaller — Bundles Python interpreter and bytecode. Fast build speed, zero configuration (no C compiler needed), and excellent compatibility.": "PyInstaller — Empaqueta el intérprete Python y el bytecode. Construcción rápida y excelente compatibilidad.", + "Nuitka — Compiles source code into native C/C++ binary. Produces smaller package size, faster execution, and deep anti-decompilation protection (requires C compiler).": "Nuitka — Compila a binario C/C++ nativo. Menor tamaño, mayor rendimiento y protección de código fuente.", + "
Python {ver} Platform Matrix:Download Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility": "
Python {ver} Soporte:Descargar Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
SO Heredado Compatibilidad total hacia atrás", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux": "
Python {ver} Soporte:Descargar Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 supported out-of-the-box": "
Python {ver} Soporte:Descargar Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka Compatible con MinGW64 listo para usar", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requires MSVC / Clang / Zig (MinGW64 unsupported)": "
Python {ver} Soporte:Descargar Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requiere MSVC / Clang / Zig (MinGW64 no soportado)", + "
Python InterpreterDownload Python
Auto-detecting system environment for Windows, macOS & Linux...": "
Intérprete PythonDescargar Python
Detectando automáticamente el entorno del sistema...", + "[INFO] Build Cancelled.": "[INFO] Compilación cancelada.", + "[INFO] Performing pre-flight environment checks...": "[INFO] Realizando controles de seguridad del entorno...", + "[INFO] Analyzing source code and project dependencies...": "[INFO] Analizando el código fuente y las dependencias...", + "[INFO] Initializing isolated build environment...": "[INFO] Inicializando entorno de compilación...", "[INFO] Python interpreter path: {path}": "[INFO] Ruta del intérprete Python: {path}", - "[INFO] Creating virtual environment...": "[INFO] Creando entorno virtual (venv)...", - "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] No se pudo crear el entorno virtual. Es posible que falten módulos requeridos o los permisos estén restringidos.", - "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] Sincronizando y actualizando el gestor de paquetes pip...", + "[INFO] Creating virtual environment...": "[INFO] Creando entorno virtual...", + "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] Actualizando el gestor de paquetes pip...", + "[INFO] Scanning project source code via pipreqs...": "[INFO] Escaneando dependencias vía pipreqs...", "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] Instalando motor [{pkg}] y dependencias clave...", - "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Consejo de Nuitka: Si se le solicita descargar el compilador GCC/MinGW en la primera compilación, mantenga una conexión estable.", - "[INFO] Dependency installation [1/3]: Installing declared dependencies ({filename})...": "[INFO] Instalación de dependencias [1/3]: Instalando dependencias declaradas ({filename})...", - "[INFO] Dependency installation [2/3]: Calling pipreqs to analyze project dependencies...": "[INFO] Instalación de dependencias [2/3]: Ejecutando pipreqs para el análisis estático del proyecto...", - "[INFO] Enabled single-file sandbox mode: parsing current script only to prevent pollution from other files.": "[INFO] Modo sandbox habilitado: Analizando solo el script de entrada para evitar contaminación.", - "[WARN] Enabled full-directory scan mode: scanning all Python files in the current directory...": "[WARN] Modo de escaneo completo activado: Escaneando todos los archivos Python del directorio...", - "[INFO] Dependency analysis service source address: {server}": "[INFO] Servidor PyPI para análisis de dependencias: {server}", - "[INFO] Querying versions of dependency libraries, please wait...": "[INFO] Consultando versiones de los paquetes, por favor espere...", - "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] Cambiando al índice PIP secundario para reintentar: {url}", - "[INFO] Attempting to scan using compatible encoding...": "[INFO] Reintentando escaneo con codificación compatible...", - "[WARN] pipreqs skipped deep scan, dependencies will be supplemented by AST scanning engine.": "[WARN] Se omitió el escaneo profundo de pipreqs. Las dependencias se completarán mediante AST.", - "[INFO] Dependency installation [3/3]: Extracting implicit dependencies via AST static scan...": "[INFO] Instalación de dependencias [3/3]: Extrayendo importaciones implícitas mediante análisis estático AST...", - "[INFO] Parsing and installing implicit import dependencies: {pkgs}": "[INFO] Instalando dependencias implícitas detectadas: {pkgs}", - "[ERROR] ⚠️ Warning: Failed to install dependency [{pkg}]! May cause runtime crash.": "[ERROR] ⚠️ Advertencia: Error al instalar el paquete [{pkg}]. La aplicación podría fallar en ejecución.", - "[INFO] Starting {engine} engine to compile binary files...": "[INFO] Iniciando motor {engine} para la compilación binaria...", + "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Consejo de Nuitka: Si se solicita descargar GCC/MinGW, mantenga una conexión estable.", + "[INFO] Successfully installed compatible versions.": "[INFO] Versiones compatibles instaladas exitosamente.", + "[INFO] Resolving project dependencies...": "[INFO] Resolviendo dependencias del proyecto...", + "Declared in requirements.txt ({count}): {pkgs}": "Declarado en requirements.txt ({count}): {pkgs}", + "Declared in requirements.txt: None": "Declarado en requirements.txt: Ninguno", + "Discovered via scanner ({count}): {pkgs}": "Descubierto mediante escáner ({count}): {pkgs}", + "Auto-patched missing ({count}): {pkgs}": "Autocompletado faltante ({count}): {pkgs}", + "Manifest complete (No missing packages)": "Manifiesto completo (Sin paquetes faltantes)", + "Build engine packages ({count}): {pkgs}": "Paquetes del motor ({count}): {pkgs}", + "[INFO] Installing build environment and project dependencies ({count} packages): {pkgs}": "[INFO] Instalando dependencias ({count} paquetes): {pkgs}", + "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] Cambiando al índice PyPI secundario: {url}", + "[INFO] Starting {engine} engine to compile binary files...": "[INFO] Iniciando motor {engine} para la compilación...", "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] Entorno MSVC local detectado, priorizando el compilador C++ nativo.", - "[INFO] Lite mode enabled, executing size reduction strategy...": "[INFO] Modo ligero activado: Aplicando estrategias de reducción de tamaño...", - "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] Se recomienda marcar 'Usar entorno virtual' para maximizar el efecto del modo ligero.", - "[INFO] Enabled Nuitka optimization directives...": "[INFO] Aplicando directivas de optimización de Nuitka (-OO)...", - "[INFO] Core compilation completed, extracting and archiving built files...": "[INFO] Compilación principal finalizada, extrayendo y archivando archivos...", - "[ERROR] Product transfer failed, file might be occupied by system process or lack permission: {error}": "[ERROR] Error al transferir el ejecutable. El archivo puede estar ocupado por un proceso o faltan permisos: {error}", - "[ERROR] Could not locate valid executable product in temporary build directory: {path}": "[ERROR] No se pudo encontrar un ejecutable válido en el directorio temporal: {path}", - "[INFO] Validating output files and generating final product...": "[INFO] Validando ejecutable y generando producto final...", - "[INFO] Build log exported to: {path}": "[INFO] Registro de compilación exportado a: {path}", + "[INFO] Found local Clang environment, prioritizing LLVM Clang compiler.": "[INFO] Entorno Clang local detectado, priorizando el compilador LLVM Clang.", + "[INFO] Python 3.13+ detected: Using Zig compiler (--zig) as C backend.": "[INFO] Python 3.13+ detectado: Usando el compilador Zig (--zig) como backend C.", + "[INFO] Using MinGW64 compiler (--mingw64) for C backend.": "[INFO] Usando el compilador MinGW64 (--mingw64) como backend C.", + "[INFO] Evaluating system physical memory (Available: {ram:.1f} GB). Adaptive concurrency adjusted: {cores} -> {safe_jobs} ...": "[INFO] Evaluando memoria física (Disponible: {ram:.1f} GB). Concurrencia ajustada: {cores} -> {safe_jobs} ...", + "[INFO] Stripping icon parameters and automatically rebuilding...": "[INFO] Despojando parámetros de icono y reconstruyendo...", + "[INFO] Writing application icon...": "[INFO] Escribiendo icono de la aplicación...", + "[INFO] Application icon written successfully.": "[INFO] Icono de la aplicación escrito con éxito.", + "[INFO] Lite mode enabled, excluding non-essential modules...": "[INFO] Modo ligero activado, excluyendo módulos no esenciales...", + "[INFO] Enabled Nuitka optimization directives...": "[INFO] Aplicando directivas de optimización de Nuitka...", + "[INFO] Compilation completed, archiving built files...": "[INFO] Compilación finalizada, extrayendo y archivando archivos...", + "[INFO] Validating output files and generating final product...": "[INFO] Validando archivos de salida y generando producto final...", + "[INFO] Build log exported to: {path}": "[INFO] Registro exportado a: {path}", + "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] Limpiando archivos temporales...", "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] Compilación completada con éxito. Ruta de salida: {path}", - "[Syntax Error] Source program has syntax or indentation errors!\n - File: {file}\n - Type: {type}\n - Line: near {line}\n - Desc: {desc}\n\nTip: This is an error in the source code logic. Ensure it runs locally before compiling.": "[Error de sintaxis] El código fuente contiene errores de sintaxis o sangría.\n - Archivo: {file}\n - Tipo de error: {type}\n - Línea: cerca de la línea {line}\n - Descripción: {desc}\n\nConsejo: Se trata de un error en el código fuente. Asegúrese de que funciona localmente antes de compilar.", - "\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!": "\n!!!!!!!!!! [Rastreo de diagnóstico: Registro completo por excepción de ejecución] !!!!!!!!!!", - "[FAILED] Compilation interrupted with exceptions, refer to the log for troubleshooting.": "[FAILED] Compilación interrumpida debido a errores. Verifique el registro.", - "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] Liberando espacio en disco y limpiando archivos temporales...", - "\\nProgram execution completed, press Enter to exit...": "\\nEjecución finalizada. Presione Enter para salir...", - "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.": "[ERROR] El archivo está bloqueado o cifrado por un servicio en la nube. Desbloquéelo y reintente.", - "[ERROR] Please load a valid Python source file first!": "[ERROR] ¡Por favor, cargue primero un archivo de código fuente Python válido!", + "[WARN] Target project is in a Cloud Sync directory (e.g. OneDrive/Dropbox). Cloud sync may temporarily lock build files.": "[WARN] El proyecto está en un directorio sincronizado en la nube. Esto puede bloquear archivos.", + "[WARN] Specified versions failed to install. Stripping version constraints for automatic compatibility match...": "[WARN] Falló la instalación de versiones específicas. Eliminando restricciones para coincidencia automática...", + "[WARN] Some dependencies failed to install, build will proceed with risk...": "[WARN] Algunas dependencias fallaron, la compilación continuará con riesgo...", + "[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] Poco espacio en disco (Disponible: {free:.1f} GB, se recomiendan >= 5.0 GB). Puede haber fallas.", + "[WARN] Memory allocation exception caught (ZstdError / OOM). Triggering memory protection fallback: Retrying in single-thread mode...": "[WARN] Excepción de memoria (OOM). Reintentando en modo de un solo hilo...", + "[WARN] System low memory detected (zstd memory allocation failed). Automatically retrying in single-thread low-memory mode...": "[WARN] Poca memoria detectada. Reintentando en modo de baja memoria de un solo hilo...", + "[WARN] Icon resource writing blocked (possibly locked by system/antivirus), triggering fallback protection...": "[WARN] Escritura de icono bloqueada (posible antivirus), activando protección de respaldo...", + "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] Se recomienda marcar 'Usar entorno virtual' para maximizar el modo ligero.", + "[WARN] Pause code injection exception: {error}": "[WARN] Excepción al inyectar código de pausa: {error}", + "[WARN] AST Analysis Exception: {error}": "[WARN] Excepción de análisis AST: {error}", + "[WARN] Read requirements.txt warning: {error}": "[WARN] Advertencia al leer requirements.txt: {error}", + "[WARN] Parse pipreqs output warning: {error}": "[WARN] Advertencia al analizar pipreqs: {error}", + "[WARN] Command timeout (>{timeout}s)": "[WARN] Tiempo de espera de comando agotado (>{timeout}s)", + "[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] Compilación abortada: Espacio en disco insuficiente. Libere al menos 5 GB.", + "[ERROR] Output directory is missing write permissions: {error}": "[ERROR] El directorio de salida no tiene permisos de escritura: {error}", + "[ERROR] Requirements file not found: {path}": "[ERROR] No se encontró el archivo de dependencias: {path}", + "[ERROR] Insufficient disk space (Available: {free:.1f} GB). At least 0.5 GB is required to safely initialize the build environment.": "[ERROR] Espacio en disco insuficiente (Disponible: {free:.1f} GB).", + "[ERROR] Python interpreter is invalid or not found: {path}": "[ERROR] El intérprete Python no se encuentra o es inválido: {path}", + "[ERROR] The specified icon file does not exist: {path}": "[ERROR] El archivo de icono especificado no existe: {path}", + "[ERROR] Additional resource file/directory not found: {path}": "[ERROR] No se encontró archivo/directorio adicional: {path}", + "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] No se pudo crear el entorno virtual. Faltan módulos o hay restricciones.", + "[ERROR] Product transfer failed, file might be occupied by system process or lack permission: {error}": "[ERROR] Error al transferir el ejecutable: {error}", + "[ERROR] Could not locate valid executable product in temporary build directory: {path}": "[ERROR] No se pudo encontrar un ejecutable válido en el directorio temporal: {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 de Sintaxis] El código fuente contiene errores, compilación abortada:\n - Archivo: {file}\n - Tipo: {type}\n - Línea: Línea {line}\n - Detalles: {desc}\n\nConsejo: Asegúrese de que el código funciona localmente antes de empaquetarlo.", + "[FAILED] Compilation interrupted with exceptions, please click 'Detailed Mode' above the log window for troubleshooting.": "[FAILED] Compilación interrumpida, haga clic en 'Modo Detallado' para solucionar el problema.", + "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.": "[ERROR] El archivo está bloqueado por un servicio en la nube. Desbloquéelo y reintente.", + "[ERROR] Please load a valid Python source file first!": "[ERROR] ¡Por favor, cargue primero un archivo de código fuente válido!", "[ERROR] Exception occurred during AST parsing: {error}": "[ERROR] Ocurrió una excepción durante el análisis AST: {error}", - "[ERROR] Failed to export preset file: {error}": "[ERROR] No se pudo exportar el archivo de ajustes preestablecidos: {error}", - "[ERROR] Preset file format error or corrupted: {error}": "[ERROR] El archivo de ajustes está corrupto o tiene un formato no válido: {error}", - "[ERROR] Failed to export log file: {error}": "[ERROR] No se pudo exportar el archivo de registro: {error}", - "[ERROR] Build completed, but the following dependencies failed to install during pre-build:\n\n 👉 {pkgs}\n\n⚠️ Tip: The program might crash at runtime due to missing modules!": "[ERROR] La compilación finalizó, pero falló la instalación previa de las siguientes dependencias:\n\n 👉 {pkgs}\n\n⚠️ Advertencia: El programa podría fallar en ejecución debido a la falta de módulos." -} \ No newline at end of file + "[ERROR] Failed to export preset file: {error}": "[ERROR] No se pudo exportar el preajuste: {error}", + "[ERROR] Preset file format error or corrupted: {error}": "[ERROR] El archivo de preajuste está corrupto: {error}", + "[ERROR] Failed to export log file: {error}": "[ERROR] No se pudo exportar el registro: {error}", + "[ERROR] Build completed, but the following dependencies failed to install:\n\n - {pkgs}\n\nNote: The application might raise ModuleNotFoundError at runtime.": "[ERROR] Compilación terminada, pero fallaron estas dependencias:\n\n - {pkgs}\n\nNota: La app puede fallar con ModuleNotFoundError al ejecutarse.", + "[ERROR] Process error: command or binary missing ({error})": "[ERROR] Error de proceso: comando o binario faltante ({error})", + "[ERROR] System execution exception: {error}": "[ERROR] Excepción de ejecución del sistema: {error}", + "Dependency Missing Warning: {pkgs} failed to install. Check log for details.": "Advertencia: {pkgs} fallaron al instalarse. Ver registro.", + "Package mappings have been reset to defaults.": "Los mapeos se han restablecido.", + "Config preset exported to: {path}": "Preajuste exportado a: {path}", + "Config preset imported successfully.": "Preajuste importado con éxito.", + "AST scan completed, found {count} dependencies.": "Análisis AST completado. Se encontraron {count} dependencias.", + "No log content.": "No hay registro.", + "Log saved to: {path}": "Registro guardado en: {path}", + "Attention: Please check the log for details.": "Atención: Por favor, consulte el registro.", + "Are you sure you want to reset all preferences to default?": "¿Estás seguro de que quieres restablecer todas las preferencias?", + "Global configuration has been reset.": "La configuración global ha sido restablecida.", + "\\nProgram execution completed, press Enter to exit...": "\\nEjecución finalizada, presione Enter para salir...", + "Project-specific. Not saved to global preferences. Use 'Export Preset' to save config.": "Específico del proyecto. No se guarda globalmente. Usa 'Exportar ajustes'.", + "GitHub Repository": "Repositorio de GitHub", + "Issues & Feedback": "Problemas y comentarios", + "PyPI Home": "Página de PyPI", + "Sponsor": "Patrocinar", + "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 es gratuito. Si ha mejorado tu eficiencia, ¡considera invitarle un café al autor!", + "* Sponsorship is completely voluntary, serves as an unconditional encouragement to the open-source community, and involves no commercial commitments. Thank you for your support!": "* El patrocinio es completamente voluntario. ¡Gracias por tu apoyo!", + "Python Environment Required": "Se requiere entorno 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).": "¡No se detectó Python en su sistema!

Se requiere un entorno Python.
Descárguelo e instálelo (recuerde marcar 'Add Python.exe to PATH').", + "Download Python": "Descargar Python", + "Unknown": "Desconocido", + "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Arrastra y suelta el script (.py/.pyw) aquí\no Haz clic para buscar..." +} diff --git a/qpypack/locales/fr_FR.json b/qpypack/locales/fr_FR.json index 3afb47a..62b1761 100644 --- a/qpypack/locales/fr_FR.json +++ b/qpypack/locales/fr_FR.json @@ -1,162 +1,227 @@ { - "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Glissez-déposez un script Python (.py/.pyw) ici\nou cliquez pour parcourir...", - "Auto-parse dependencies, resources, and implicit imports": "Analyse automatique des dépendances, ressources et imports implicites", + "PyPI Official (Global Default)": "PyPI Officiel (Défaut Global)", + "Python TestPyPI": "Python TestPyPI", + "AWS PyPI Mirror (US/EU)": "Miroir AWS PyPI (US/EU)", + "Tsinghua University (China)": "Université Tsinghua", + "Aliyun Cloud (China)": "Aliyun Cloud", + "Tencent Cloud (China)": "Tencent Cloud", + "Huawei Cloud (China)": "Huawei Cloud", + "USTC (China)": "USTC", + "Modern Cross-Platform Python Application Packager": "Outil moderne de création de paquets Python multiplateforme", + "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka": "Outil GUI multiplateforme pour Python basé sur PyInstaller & Nuitka", + "Python Packaging, Reimagined.": "La création de paquets Python, réinventée.", + "Drop Python source code to start": "Déposez le code source Python pour commencer", + "Build Settings": "Options de compilation", + "Preferences": "Préférences", + "About": "À propos", + "Engine": "Moteur", + "Dependencies": "Dépendances", + "Resources": "Ressources", + "Optimization": "Optimisation", + "Package Map": "Mappage", + "Execution Log": "Journal d'exécution", "Loaded: {filename}": "Chargé : {filename}", "Parsing metadata...": "Analyse des métadonnées...", "Ready, waiting for build.": "Prêt, en attente de compilation.", - "Initializing build...": "Initialisation du processus de compilation...", - "Preparing engine...": "Préparation du moteur de compilation...", + "Initializing build...": "Initialisation de la compilation...", + "Preparing engine...": "Préparation du moteur...", "Build Successful": "Compilation réussie", "Open output directory or reset workspace.": "Ouvrez le dossier de sortie ou réinitialisez l'espace de travail.", "Build Failed": "Échec de la compilation", "Check log output below for troubleshooting.": "Consultez le journal ci-dessous pour résoudre le problème.", - "Status: Ready": " Statut : Prêt", - "Status: Parsing {filename}...": " Statut : Analyse de {filename}...", - "Status: Loaded {filename}{mode}": " Statut : {filename}{mode} chargé", - "Status: Packaging ({engine}) ...": " Statut : Empaquetage en cours ({engine}) ...", - "Status: Build Completed": " Statut : Compilation terminée", - "Status: Build Failed": " Statut : Échec de la compilation", - "Status: Workspace Reset": " Statut : Espace de travail réinitialisé", - "Start Build": " Démarrer la compilation", - "Stop Build": " Interrompre", - "Open Directory": " Ouvrir le dossier", - "Rebuild": " Recompiler", - "Save & Return": " Enregistrer et revenir", - "Build Settings": "Options de compilation", - "Preferences": "Préférences", - "About": "À propos", - "🚀 Engine": "🚀 Moteur", - "📦 Dependencies": "📦 Dépendances", - "📂 Resources": "📂 Ressources", - "⚡ Optimization": "⚡ Optimisation", - "🗺️ Package Map": "🗺️ Mappage", - "Engine & Environment": "Moteur et environnement de compilation", + "Status: Ready": "Statut : Prêt", + "Status: Parsing {filename}...": "Statut : Analyse de {filename}...", + "Status: Loaded {filename}{mode}": "Statut : {filename}{mode} chargé", + "Status: Packaging ({engine}) ...": "Statut : Empaquetage en cours ({engine}) ...", + "Status: Build Completed": "Statut : Compilation terminée", + "Status: Build Failed": "Statut : Échec de la compilation", + "Status: Workspace Reset": "Statut : Espace de travail réinitialisé", + " [Console]": " [Avec console]", + " [No Console]": " [Sans console]", + "Start Build": "Démarrer la compilation", + "Stop Build": "Interrompre", + "Open Directory": "Ouvrir le dossier", + "Rebuild": "Recompiler", + "Save & Return": "Enregistrer et revenir", + "Browse": "Parcourir...", + "AST Scan": "Analyse AST", + "Add File": "Ajouter Fichier", + "Add Dir": "Ajouter Dossier", + "Remove Selected": "Supprimer Sélection", + "Clear All": "Tout Effacer", + "Add Mapping": "Ajouter un Mappage", + "Restore Defaults": "Restaurer par défaut", + "Export Preset...": "Exporter Préréglage...", + "Import Preset...": "Importer Préréglage...", + "Reset to Default Config": "Réinitialiser la configuration", + "Cancel & Return": "Annuler et revenir", + "Configure Build Settings": "Paramètres de compilation", + "Toggle Execution Log": "Afficher/Masquer le journal", + "Detailed Mode": "Mode Détaillé", + "Concise Mode": "Mode Concis", + "Copy": "Copier", + "Select All": "Tout Sélectionner", + "Clear Log": "Effacer le journal", + "Export Log...": "Exporter le journal...", + "Engine & Environment": "Moteur et environnement", "Execution Mode": "Mode d'exécution", - "Mirrors & Scanner": "Miroirs et analyseur de dépendances", - "Additional Resources (Drag & Drop Supported)": "Ressources supplémentaires (Glisser-déposer pris en charge)", - "Performance Optimization": "Optimisation des performances et de la compilation", - "Lock Core Dependencies": "Verrouiller les versions des dépendances clés", - "Package Name Mappings": "Table de mappage des paquets", + "Mirrors & Scanner": "Miroirs et analyseur", + "Additional Resources (Drag & Drop Supported)": "Ressources supplémentaires (Glisser-déposer)", + "Performance Optimization": "Optimisation des performances", + "Lock Core Dependencies": "Verrouiller les dépendances", + "Package Name Mappings": "Table de mappage", "UI Language:": "Langue de l'interface :", - "App Metadata & Presets": "Métadonnées de l'application et préréglages", - "Output Location": "Emplacement de sortie de l'exécutable", - "Preferences & System Behavior": "Préférences et comportement système", + "App Metadata & Presets": "Métadonnées et Préréglages", + "Output Location": "Emplacement de sortie", + "Preferences & System Behavior": "Préférences et comportement", "Build Engine:": "Moteur de compilation :", "Python Interpreter:": "Interprète Python :", "Output Name:": "Nom de l'exécutable :", "App Icon:": "Icône de l'application :", "Primary PIP Index:": "Index PIP principal :", "Backup PIP Index:": "Index PIP secondaire :", - "Requirements File:": "Fichier de dépendances (requirements.txt) :", - "Hidden Imports:": "Imports implicites (Hidden Imports) :", - "Exclude Modules:": "Exclure les modules (Excludes) :", - "CPU Cores:": "Cœurs CPU parallèles :", - "UPX Path:": "Chemin de l'exécutable UPX :", + "Requirements File:": "Fichier de dépendances :", + "Hidden Imports:": "Imports implicites :", + "Exclude Modules:": "Exclure les modules :", + "CPU Cores:": "Cœurs CPU :", + "UPX Path:": "Chemin UPX :", "PyInstaller Version:": "Version de PyInstaller :", "Nuitka Version:": "Version de Nuitka :", "Pipreqs Version:": "Version de Pipreqs :", "Version:": "Version :", "Author/Company:": "Auteur/Organisation :", "Description:": "Description :", - "Output Rule:": "Règle d'emplacement :", + "Output Rule:": "Règle de sortie :", "Target Directory:": "Dossier cible :", - "One-File Mode (--onefile)": "Mode fichier unique (--onefile)", - "Hide Console (--noconsole)": "Masquer la fenêtre de la console (--noconsole)", - "Use Virtual Environment (Recommended)": "Utiliser un environnement virtuel dédié (Recommandé)", - "Install requirements.txt": "Installer les dépendances de requirements.txt", - "Analyze Dependencies (pipreqs)": "Analyser automatiquement les dépendances (pipreqs)", - "Scan Entire Folder": "Analyser l'ensemble du dossier", - "Enable UPX Compression": "Activer la compression d'exécutable UPX", - "Lite Mode (Exclude Dev/Test Dependencies)": "Mode allégé (Exclure les dépendances dev/test)", - "Concise Log Output": "Sortie de journal concise", - "Auto-save Build Log": "Sauvegarder automatiquement le journal", - "Auto Extract Icon": "Extraire automatiquement l'icône", - "Clean Temporary Cache After Build": "Nettoyer le cache temporaire après compilation", - "Sound Notification": "Notification sonore de fin", - "Browse": "Parcourir...", - "AST Scan": "Analyse AST", - "Add File": "Ajouter un fichier", - "Add Dir": "Ajouter un dossier", - "Remove Selected": "Supprimer la sélection", - "Clear All": "Tout effacer", - "Add Mapping": "Ajouter un mappage", - "Restore Defaults": "Restaurer par défaut", - "Export Preset...": "Exporter le préréglage...", - "Import Preset...": "Importer un préréglage...", "Source File Directory": "Dossier du fichier source", "Custom Directory": "Dossier personnalisé", - "Import Name": "Nom d'import dans le code", + "Import Name": "Nom d'import", "PyPI Package Name": "Nom du paquet PyPI", - "Reset to Default Config": "Réinitialiser la configuration", - "Cancel & Return": "Annuler les modifications et revenir", - "Configure Build Settings": "Configurer les paramètres de compilation", - "Toggle Execution Log": "Afficher/Masquer le journal d'exécution", - "Copy": "Copier", - "Select All": "Tout sélectionner", - "Clear Log": "Effacer le journal", - "Export Log...": "Exporter le journal...", - "A Cross-platform Python Packaging GUI Tool based on PyInstaller & Nuitka": "Un outil GUI multiplateforme pour empaqueter des applications Python basé sur PyInstaller & Nuitka", - " [Console]": " [Avec console]", - " [No Console]": " [Sans console]", "File": "Fichier", "Directory": "Dossier", - "PyInstaller: Fast build speed, excellent compatibility. Ideal for rapid iteration.": "PyInstaller : Vitesse de compilation rapide et excellente compatibilité. Idéal pour un développement itératif.", - "Nuitka: Compiles to native C/C++ binary. Better performance and source code protection.": "Nuitka : Compile en binaire C/C++ natif. Offre de meilleures performances et protège le code source.", - "Leave blank to auto-detect system default Python": "Laissez vide pour détecter automatiquement l'interprète Python du système", - "Leave blank to auto-match script name": "Laissez vide pour utiliser automatiquement le nom du script source", - "Leave blank to auto-search requirements.txt in current directory": "Laissez vide pour rechercher automatiquement requirements.txt dans le dossier actuel", + "Edit Path": "Modifier le chemin", + "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)", + "Hide Console (--noconsole)": "Masquer la console (--noconsole)", + "Use Virtual Environment (Recommended)": "Utiliser un environnement virtuel (Recommandé)", + "Install requirements.txt": "Installer requirements.txt", + "Analyze Dependencies (pipreqs)": "Analyser les dépendances (pipreqs)", + "Scan Entire Folder": "Analyser l'ensemble du dossier", + "Enable UPX Compression": "Activer la compression UPX", + "Lite Mode (Exclude Dev/Test Dependencies)": "Mode allégé (Exclure les dépendances dev/test)", + "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", + "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", + "Leave blank to auto-search requirements.txt in current directory": "Laissez vide pour rechercher automatiquement", "Comma separated (e.g. pandas, PyQt5)": "Séparés par des virgules (ex : pandas, PyQt5)", "Comma separated (e.g. tkinter, matplotlib)": "Séparés par des virgules (ex : tkinter, matplotlib)", - "Leave blank to auto-detect from environment variables": "Laissez vide pour détecter automatiquement depuis la variable PATH", - "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "Exclut dynamiquement les dépendances inutiles de l'environnement pour réduire la taille et accélérer la compilation.", - "Double-click to edit target path; Drag & drop supported": "Double-cliquez pour modifier le chemin relatif. Glisser-déposer pris en charge", - "Package mappings have been reset to defaults.": "Le mappage des paquets a été réinitialisé aux valeurs par défaut.", - "Config preset exported to: {path}": "Le préréglage de configuration a été exporté vers : {path}", - "Config preset imported successfully.": "Le préréglage de configuration a été importé avec succès.", - "AST scan completed, found {count} dependencies.": "Analyse AST terminée : {count} dépendances trouvées.", - "No log content.": "Aucun journal à exporter.", - "Log saved to: {path}": "Journal sauvegardé sous : {path}", - "Attention: Please check the log for details.": "Attention : Veuillez consulter le journal pour plus de détails.", - "[INFO] Initializing isolated build environment...": "[INFO] Initialisation d'un environnement de compilation isolé...", - "[INFO] Python interpreter path: {path}": "[INFO] Chemin de l'interprète Python : {path}", - "[INFO] Creating virtual environment...": "[INFO] Création de l'environnement virtuel (venv)...", - "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] Échec de la création de l'environnement virtuel. Des modules nécessaires peuvent manquer ou les permissions sont restreintes.", - "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] Synchronisation et mise à jour du gestionnaire de paquets pip...", - "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] Installation du moteur de compilation [{pkg}] et des dépendances clés...", - "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Astuce Nuitka : Si le téléchargement du compilateur GCC/MinGW est demandé lors du premier build, assurez-vous d'avoir une connexion réseau stable.", - "[INFO] Dependency installation [1/3]: Installing declared dependencies ({filename})...": "[INFO] Installation des dépendances [1/3] : Installation des dépendances déclarées ({filename})...", - "[INFO] Dependency installation [2/3]: Calling pipreqs to analyze project dependencies...": "[INFO] Installation des dépendances [2/3] : Exécution de pipreqs pour l'analyse statique du projet...", - "[INFO] Enabled single-file sandbox mode: parsing current script only to prevent pollution from other files.": "[INFO] Mode bac à sable activé : Analyse du script uniquement pour éviter toute pollution par d'autres fichiers.", - "[WARN] Enabled full-directory scan mode: scanning all Python files in the current directory...": "[WARN] Analyse du dossier complet activée : Analyse de tous les fichiers Python du dossier actuel...", - "[INFO] Dependency analysis service source address: {server}": "[INFO] URL du serveur PyPI utilisé pour l'analyse : {server}", - "[INFO] Querying versions of dependency libraries, please wait...": "[INFO] Interrogation des versions des dépendances en cours, veuillez patienter...", + "Leave blank to auto-detect from environment variables": "Laissez vide pour détecter automatiquement", + "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "Exclut les dépendances inutiles pour réduire la taille et accélérer la compilation.", + "Double-click to edit target path; Drag & drop supported": "Double-cliquez pour modifier le chemin; Glisser-déposer pris en charge", + "PyInstaller — Bundles Python interpreter and bytecode. Fast build speed, zero configuration (no C compiler needed), and excellent compatibility.": "PyInstaller — Vitesse de compilation rapide et excellente compatibilité.", + "Nuitka — Compiles source code into native C/C++ binary. Produces smaller package size, faster execution, and deep anti-decompilation protection (requires C compiler).": "Nuitka — Compile en C/C++ natif. Meilleures performances et protège le code source.", + "
Python {ver} Platform Matrix:Download Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility": "
Support Python {ver} :Télécharger Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
OS Hérités Rétrocompatibilité totale", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux": "
Support Python {ver} :Télécharger Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 supported out-of-the-box": "
Support Python {ver} :Télécharger Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka Support de MinGW64 intégré", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requires MSVC / Clang / Zig (MinGW64 unsupported)": "
Support Python {ver} :Télécharger Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Nécessite MSVC / Clang / Zig", + "
Python InterpreterDownload Python
Auto-detecting system environment for Windows, macOS & Linux...": "
Interprète PythonTélécharger Python
Détection automatique de l'environnement...", + "[INFO] Build Cancelled.": "[INFO] Compilation annulée.", + "[INFO] Performing pre-flight environment checks...": "[INFO] Vérifications de l'environnement en cours...", + "[INFO] Analyzing source code and project dependencies...": "[INFO] Analyse du code source et des dépendances...", + "[INFO] Initializing isolated build environment...": "[INFO] Initialisation de l'environnement isolé...", + "[INFO] Python interpreter path: {path}": "[INFO] Chemin de l'interprète : {path}", + "[INFO] Creating virtual environment...": "[INFO] Création de l'environnement virtuel...", + "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] Mise à jour du gestionnaire pip...", + "[INFO] Scanning project source code via pipreqs...": "[INFO] Analyse via pipreqs...", + "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] Installation du moteur [{pkg}] et de ses dépendances...", + "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Astuce Nuitka : Assurez-vous d'une bonne connexion pour le téléchargement de GCC/MinGW.", + "[INFO] Successfully installed compatible versions.": "[INFO] Versions compatibles installées avec succès.", + "[INFO] Resolving project dependencies...": "[INFO] Résolution des dépendances du projet...", + "Declared in requirements.txt ({count}): {pkgs}": "Déclaré dans requirements.txt ({count}) : {pkgs}", + "Declared in requirements.txt: None": "Déclaré dans requirements.txt : Aucun", + "Discovered via scanner ({count}): {pkgs}": "Découvert via l'analyseur ({count}) : {pkgs}", + "Auto-patched missing ({count}): {pkgs}": "Correction automatique ({count}) : {pkgs}", + "Manifest complete (No missing packages)": "Manifeste complet (Aucun paquet manquant)", + "Build engine packages ({count}): {pkgs}": "Paquets du moteur ({count}) : {pkgs}", + "[INFO] Installing build environment and project dependencies ({count} packages): {pkgs}": "[INFO] Installation des dépendances ({count} paquets) : {pkgs}", "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] Basculement vers l'index PIP secondaire : {url}", - "[INFO] Attempting to scan using compatible encoding...": "[INFO] Tentative de nouvelle analyse avec un encodage compatible...", - "[WARN] pipreqs skipped deep scan, dependencies will be supplemented by AST scanning engine.": "[WARN] L'analyse approfondie de pipreqs a été ignorée, les dépendances seront complétées par le moteur AST.", - "[INFO] Dependency installation [3/3]: Extracting implicit dependencies via AST static scan...": "[INFO] Installation des dépendances [3/3] : Extraction des imports implicites via l'analyse statique AST...", - "[INFO] Parsing and installing implicit import dependencies: {pkgs}": "[INFO] Installation des dépendances implicites détectées : {pkgs}", - "[ERROR] ⚠️ Warning: Failed to install dependency [{pkg}]! May cause runtime crash.": "[ERROR] ⚠️ Attention : Échec de l'installation du paquet [{pkg}] ! L'application pourrait planter à l'exécution.", - "[INFO] Starting {engine} engine to compile binary files...": "[INFO] Lancement du moteur {engine} pour la compilation des binationaux...", - "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] Environnement MSVC local détecté, utilisation prioritaire du compilateur C++ natif.", - "[INFO] Lite mode enabled, executing size reduction strategy...": "[INFO] Mode allégé activé : Appplication des stratégies de réduction de taille...", - "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] Il est fortement recommandé d'activer l'option [Environnement virtuel] pour maximiser l'effet du mode allégé.", - "[INFO] Enabled Nuitka optimization directives...": "[INFO] Application des directives d'optimisation Nuitka (-OO)...", - "[INFO] Core compilation completed, extracting and archiving built files...": "[INFO] Compilation principale terminée, extraction et archivage des fichiers générés...", - "[ERROR] Product transfer failed, file might be occupied by system process or lack permission: {error}": "[ERROR] Échec du transfert du fichier binaire. Le fichier est peut-être verrouillé par un processus ou les autorisations sont insuffisantes : {error}", - "[ERROR] Could not locate valid executable product in temporary build directory: {path}": "[ERROR] Impossible de localiser l'exécutable généré dans le dossier temporaire : {path}", - "[INFO] Validating output files and generating final product...": "[INFO] Validation du fichier de sortie et génération de l'exécutable final...", - "[INFO] Build log exported to: {path}": "[INFO] Le journal de compilation a été exporté sous : {path}", - "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] Compilation terminée avec succès. Chemin de sortie : {path}", - "[Syntax Error] Source program has syntax or indentation errors!\n - File: {file}\n - Type: {type}\n - Line: near {line}\n - Desc: {desc}\n\nTip: This is an error in the source code logic. Ensure it runs locally before compiling.": "[Erreur de syntaxe] Le programme source contient une erreur de syntaxe ou d'indentation !\n - Fichier : {file}\n - Type d'erreur : {type}\n - Ligne : environ {line}\n - Description : {desc}\n\nAstuce : Il s'agit d'une erreur dans votre code source. Assurez-vous qu'il s'exécute correctement en local avant de recompiler.", - "\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!": "\n!!!!!!!!!! [Trace de diagnostic : Journal brut complet suite à une erreur d'exécution] !!!!!!!!!!", - "[FAILED] Compilation interrupted with exceptions, refer to the log for troubleshooting.": "[FAILED] Compilation interrompue en raison d'erreurs. Consultez le journal ci-dessus.", - "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] Libération de l'espace disque et nettoyage de l'environnement temporaire...", + "[INFO] Starting {engine} engine to compile binary files...": "[INFO] Démarrage du moteur {engine} pour la compilation...", + "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] Environnement MSVC détecté, utilisation du compilateur C++ natif.", + "[INFO] Found local Clang environment, prioritizing LLVM Clang compiler.": "[INFO] Environnement Clang détecté, utilisation du compilateur LLVM Clang.", + "[INFO] Python 3.13+ detected: Using Zig compiler (--zig) as C backend.": "[INFO] Python 3.13+ détecté : Utilisation de Zig (--zig).", + "[INFO] Using MinGW64 compiler (--mingw64) for C backend.": "[INFO] Utilisation de MinGW64 (--mingw64).", + "[INFO] Evaluating system physical memory (Available: {ram:.1f} GB). Adaptive concurrency adjusted: {cores} -> {safe_jobs} ...": "[INFO] Évaluation de la mémoire (Libre : {ram:.1f} Go). Concurrence ajustée : {cores} -> {safe_jobs} ...", + "[INFO] Stripping icon parameters and automatically rebuilding...": "[INFO] Suppression des paramètres de l'icône et recompilation...", + "[INFO] Writing application icon...": "[INFO] Écriture de l'icône de l'application...", + "[INFO] Application icon written successfully.": "[INFO] Icône écrite avec succès.", + "[INFO] Lite mode enabled, excluding non-essential modules...": "[INFO] Mode allégé activé, exclusion des modules inutiles...", + "[INFO] Enabled Nuitka optimization directives...": "[INFO] Directives d'optimisation Nuitka activées...", + "[INFO] Compilation completed, archiving built files...": "[INFO] Compilation terminée, archivage des fichiers...", + "[INFO] Validating output files and generating final product...": "[INFO] Validation des fichiers et génération de l'exécutable...", + "[INFO] Build log exported to: {path}": "[INFO] Journal exporté sous : {path}", + "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] Nettoyage de l'environnement temporaire...", + "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] Compilation réussie. Chemin de sortie : {path}", + "[WARN] Target project is in a Cloud Sync directory (e.g. OneDrive/Dropbox). Cloud sync may temporarily lock build files.": "[WARN] Le projet est dans un dossier Cloud. Les fichiers peuvent être verrouillés.", + "[WARN] Specified versions failed to install. Stripping version constraints for automatic compatibility match...": "[WARN] Échec de l'installation de versions spécifiques. Tentative de compatibilité automatique...", + "[WARN] Some dependencies failed to install, build will proceed with risk...": "[WARN] Certaines dépendances ont échoué, la compilation se poursuit (avec risque)...", + "[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] Espace disque faible (Libre : {free:.1f} Go). Risque d'interruption.", + "[WARN] Memory allocation exception caught (ZstdError / OOM). Triggering memory protection fallback: Retrying in single-thread mode...": "[WARN] Erreur de mémoire (OOM). Réessai en mode single-thread...", + "[WARN] System low memory detected (zstd memory allocation failed). Automatically retrying in single-thread low-memory mode...": "[WARN] Mémoire système faible. Réessai en mode single-thread...", + "[WARN] Icon resource writing blocked (possibly locked by system/antivirus), triggering fallback protection...": "[WARN] Écriture de l'icône bloquée (antivirus possible).", + "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] Il est recommandé d'activer [Environnement virtuel] pour le mode allégé.", + "[WARN] Pause code injection exception: {error}": "[WARN] Exception d'injection de pause : {error}", + "[WARN] AST Analysis Exception: {error}": "[WARN] Exception d'analyse AST : {error}", + "[WARN] Read requirements.txt warning: {error}": "[WARN] Avertissement lors de la lecture de requirements.txt : {error}", + "[WARN] Parse pipreqs output warning: {error}": "[WARN] Avertissement lors de l'analyse pipreqs : {error}", + "[WARN] Command timeout (>{timeout}s)": "[WARN] Dépassement de délai de la commande (>{timeout}s)", + "[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] Compilation annulée : Espace disque insuffisant. Libérez au moins 5 Go.", + "[ERROR] Output directory is missing write permissions: {error}": "[ERROR] Le dossier de sortie n'a pas les droits d'écriture : {error}", + "[ERROR] Requirements file not found: {path}": "[ERROR] Fichier de dépendances introuvable : {path}", + "[ERROR] Insufficient disk space (Available: {free:.1f} GB). At least 0.5 GB is required to safely initialize the build environment.": "[ERROR] Espace disque insuffisant (Libre : {free:.1f} Go).", + "[ERROR] Python interpreter is invalid or not found: {path}": "[ERROR] Interprète Python invalide ou introuvable : {path}", + "[ERROR] The specified icon file does not exist: {path}": "[ERROR] L'icône spécifiée n'existe pas : {path}", + "[ERROR] Additional resource file/directory not found: {path}": "[ERROR] Fichier ou ressource introuvable : {path}", + "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] Échec de la création de l'environnement virtuel.", + "[ERROR] Product transfer failed, file might be occupied by system process or lack permission: {error}": "[ERROR] Échec du transfert de l'exécutable : {error}", + "[ERROR] Could not locate valid executable product in temporary build directory: {path}": "[ERROR] Impossible de localiser l'exécutable dans le dossier temporaire : {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.": "[Erreur de syntaxe] Erreur dans le code source :\n - Fichier : {file}\n - Type : {type}\n - Ligne : {line}\n - Détail : {desc}", + "[FAILED] Compilation interrupted with exceptions, please click 'Detailed Mode' above the log window for troubleshooting.": "[FAILED] Compilation interrompue. Consultez le 'Mode Détaillé'.", + "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.": "[ERROR] Le fichier est verrouillé par un service Cloud. Veuillez le déverrouiller.", + "[ERROR] Please load a valid Python source file first!": "[ERROR] Veuillez d'abord charger un fichier Python valide !", + "[ERROR] Exception occurred during AST parsing: {error}": "[ERROR] Exception lors de l'analyse AST : {error}", + "[ERROR] Failed to export preset file: {error}": "[ERROR] Impossible d'exporter le préréglage : {error}", + "[ERROR] Preset file format error or corrupted: {error}": "[ERROR] Fichier de préréglage corrompu : {error}", + "[ERROR] Failed to export log file: {error}": "[ERROR] Impossible d'exporter le journal : {error}", + "[ERROR] Build completed, but the following dependencies failed to install:\n\n - {pkgs}\n\nNote: The application might raise ModuleNotFoundError at runtime.": "[ERROR] Compilation terminée, mais ces dépendances ont échoué :\n\n - {pkgs}", + "[ERROR] Process error: command or binary missing ({error})": "[ERROR] Erreur de processus : {error}", + "[ERROR] System execution exception: {error}": "[ERROR] Exception système : {error}", + "Dependency Missing Warning: {pkgs} failed to install. Check log for details.": "Avertissement : {pkgs} n'a pas pu être installé.", + "Package mappings have been reset to defaults.": "Mappages réinitialisés aux valeurs par défaut.", + "Config preset exported to: {path}": "Préréglage exporté vers : {path}", + "Config preset imported successfully.": "Préréglage importé avec succès.", + "AST scan completed, found {count} dependencies.": "Analyse AST : {count} dépendances trouvées.", + "No log content.": "Aucun contenu de journal.", + "Log saved to: {path}": "Journal sauvegardé sous : {path}", + "Attention: Please check the log for details.": "Attention : Veuillez consulter le journal.", + "Are you sure you want to reset all preferences to default?": "Êtes-vous sûr de vouloir réinitialiser toutes les préférences ?", + "Global configuration has been reset.": "Configuration globale réinitialisée.", "\\nProgram execution completed, press Enter to exit...": "\\nExécution terminée. Appuyez sur Entrée pour quitter...", - "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.": "[ERROR] Le fichier cible est verrouillé ou chiffré par un service Cloud. Veuillez le déverrouiller et réessayer.", - "[ERROR] Please load a valid Python source file first!": "[ERROR] Veuillez d'abord charger un fichier source Python valide !", - "[ERROR] Exception occurred during AST parsing: {error}": "[ERROR] Une exception est survenue lors de l'analyse AST : {error}", - "[ERROR] Failed to export preset file: {error}": "[ERROR] Impossible d'exporter le fichier de préréglage : {error}", - "[ERROR] Preset file format error or corrupted: {error}": "[ERROR] Format de fichier de préréglage invalide ou corrompu : {error}", - "[ERROR] Failed to export log file: {error}": "[ERROR] Impossible d'exporter le journal d'exécution : {error}", - "[ERROR] Build completed, but the following dependencies failed to install during pre-build:\n\n 👉 {pkgs}\n\n⚠️ Tip: The program might crash at runtime due to missing modules!": "[ERROR] La compilation s'est terminée, mais l'installation préalable des dépendances suivantes a échoué :\n\n 👉 {pkgs}\n\n⚠️ Attention : L'application pourrait planter au lancement en raison de modules manquants !" -} \ No newline at end of file + "Project-specific. Not saved to global preferences. Use 'Export Preset' to save config.": "Spécifique au projet. Utilisez 'Exporter Préréglage'.", + "GitHub Repository": "Dépôt GitHub", + "Issues & Feedback": "Problèmes et Retours", + "PyPI Home": "Page PyPI", + "Sponsor": "Parrainer", + "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 est gratuit. Si cela vous a aidé, offrez un café à l'auteur !", + "* Sponsorship is completely voluntary, serves as an unconditional encouragement to the open-source community, and involves no commercial commitments. Thank you for your support!": "* Le parrainage est volontaire. Merci pour votre soutien !", + "Python Environment Required": "Environnement Python requis", + "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 n'est pas détecté !
Installez Python (cochez 'Add to PATH').", + "Download Python": "Télécharger Python", + "Unknown": "Inconnu", + "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Glissez-déposez un script Python (.py/.pyw) ici\nou cliquez pour parcourir..." +} diff --git a/qpypack/locales/ja_JP.json b/qpypack/locales/ja_JP.json index 9bc40d8..4b84477 100644 --- a/qpypack/locales/ja_JP.json +++ b/qpypack/locales/ja_JP.json @@ -1,78 +1,48 @@ { - "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Python スクリプト (.py/.pyw) をここにドラッグ&ドロップ\nまたはクリックして参照...", - "Auto-parse dependencies, resources, and implicit imports": "依存関係、リソース、および暗黙のインポートを自動解析", - "Loaded: {filename}": "読み込み完了: {filename}", - "Parsing metadata...": "メタデータを解析中...", - "Ready, waiting for build.": "準備完了。ビルド待機中。", - "Initializing build...": "ビルドプロセスを初期化中...", - "Preparing engine...": "ビルドエンジンを準備中...", - "Build Successful": "ビルドが正常に完了しました", - "Open output directory or reset workspace.": "出力ディレクトリを開くか、ワークスペースをリセットしてください。", - "Build Failed": "ビルドに失敗しました", - "Check log output below for troubleshooting.": "詳細については、以下のビルドログを確認してください。", - "Status: Ready": " ステータス: 準備完了", - "Status: Parsing {filename}...": " ステータス: {filename} を解析中...", - "Status: Loaded {filename}{mode}": " ステータス: {filename}{mode} を読み込みました", - "Status: Packaging ({engine}) ...": " ステータス: パッケージング中 ({engine}) ...", - "Status: Build Completed": " ステータス: ビルド完了", - "Status: Build Failed": " ステータス: ビルド失敗", - "Status: Workspace Reset": " ステータス: ワークスペースがリセットされました", - "Start Build": " ビルド開始", - "Stop Build": " ビルド中止", - "Open Directory": " 出力先を開く", - "Rebuild": " 再ビルド", - "Save & Return": " 保存して戻る", + "PyPI Official (Global Default)": "PyPI 公式 (グローバルデフォルト)", + "Python TestPyPI": "Python TestPyPI", + "AWS PyPI Mirror (US/EU)": "AWS PyPI ミラー (米国/欧州)", + "Tsinghua University (China)": "清華大学ミラー", + "Aliyun Cloud (China)": "Aliyun クラウド", + "Tencent Cloud (China)": "Tencent クラウド", + "Huawei Cloud (China)": "Huawei クラウド", + "USTC (China)": "USTC ミラー", + "Modern Cross-Platform Python Application Packager": "モダン クロスプラットフォーム Python アプリケーション パッケージャー", + "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ソースコードをドロップ", "Build Settings": "ビルド設定", "Preferences": "環境設定", "About": "バージョン情報", - "🚀 Engine": "🚀 エンジン", - "📦 Dependencies": "📦 依存関係", - "📂 Resources": "📂 リソース", - "⚡ Optimization": "⚡ 最適化", - "🗺️ Package Map": "🗺️ パッケージマップ", - "Engine & Environment": "ビルドエンジンと環境", - "Execution Mode": "実行モード", - "Mirrors & Scanner": "ミラーソースとスキャナー設定", - "Additional Resources (Drag & Drop Supported)": "追加リソース (ドラッグ&ドロップ対応)", - "Performance Optimization": "パフォーマンスおよびコンパイル最適化", - "Lock Core Dependencies": "核心依存関係のバージョン固定", - "Package Name Mappings": "パッケージ名マッピング表", - "UI Language:": "表示言語:", - "App Metadata & Presets": "アプリのメタデータとプリセット", - "Output Location": "ビルド生成物の出力先", - "Preferences & System Behavior": "動作設定およびシステム動作", - "Build Engine:": "ビルドエンジン:", - "Python Interpreter:": "Python インタープリター:", - "Output Name:": "出力アプリケーション名:", - "App Icon:": "アプリケーションアイコン:", - "Primary PIP Index:": "メイン PIP インデックス:", - "Backup PIP Index:": "サブ PIP インデックス:", - "Requirements File:": "依存関係ファイル (requirements.txt):", - "Hidden Imports:": "暗黙のインポート (Hidden Imports):", - "Exclude Modules:": "除外モジュール (Excludes):", - "CPU Cores:": "ビルド並列 CPU コア数:", - "UPX Path:": "UPX 実行ファイルパス:", - "PyInstaller Version:": "PyInstaller バージョン:", - "Nuitka Version:": "Nuitka バージョン:", - "Pipreqs Version:": "Pipreqs バージョン:", - "Version:": "バージョン:", - "Author/Company:": "作者/組織名:", - "Description:": "詳細説明:", - "Output Rule:": "出力先ルール:", - "Target Directory:": "保存先ディレクトリ:", - "One-File Mode (--onefile)": "単一ファイルモード (--onefile)", - "Hide Console (--noconsole)": "コンソールウィンドウを非表示 (--noconsole)", - "Use Virtual Environment (Recommended)": "独立した仮想環境を使用 (推奨)", - "Install requirements.txt": "requirements.txt の依存関係をインストール", - "Analyze Dependencies (pipreqs)": "プロジェクトの依存関係を自動解析 (pipreqs)", - "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": "ビルド完了後に一時キャッシュを削除", - "Sound Notification": "完了通知音を有効化", + "Engine": "エンジン", + "Dependencies": "依存関係", + "Resources": "リソース", + "Optimization": "最適化", + "Package Map": "パッケージマップ", + "Execution Log": "実行ログ", + "Loaded: {filename}": "読み込み完了: {filename}", + "Parsing metadata...": "メタデータを解析中...", + "Ready, waiting for build.": "準備完了。ビルド待機中。", + "Initializing build...": "ビルドを初期化中...", + "Preparing engine...": "エンジンを準備中...", + "Build Successful": "ビルド成功", + "Open output directory or reset workspace.": "出力ディレクトリを開くか、ワークスペースをリセットしてください。", + "Build Failed": "ビルド失敗", + "Check log output below for troubleshooting.": "詳細については、以下のビルドログを確認してください。", + "Status: Ready": "ステータス: 準備完了", + "Status: Parsing {filename}...": "ステータス: {filename} を解析中...", + "Status: Loaded {filename}{mode}": "ステータス: {filename}{mode} を読み込みました", + "Status: Packaging ({engine}) ...": "ステータス: パッケージング中 ({engine}) ...", + "Status: Build Completed": "ステータス: ビルド完了", + "Status: Build Failed": "ステータス: ビルド失敗", + "Status: Workspace Reset": "ステータス: ワークスペースがリセットされました", + " [Console]": " [コンソールあり]", + " [No Console]": " [コンソールなし]", + "Start Build": "ビルド開始", + "Stop Build": "ビルド中止", + "Open Directory": "出力先を開く", + "Rebuild": "再ビルド", + "Save & Return": "保存して戻る", "Browse": "参照...", "AST Scan": "AST 構文解析", "Add File": "ファイルを追加", @@ -83,80 +53,175 @@ "Restore Defaults": "デフォルトに戻す", "Export Preset...": "プリセットのエクスポート...", "Import Preset...": "プリセットのインポート...", - "Source File Directory": "ソースファイルと同じディレクトリ", - "Custom Directory": "カスタムディレクトリ", - "Import Name": "コード内の import 名", - "PyPI Package Name": "PyPI パッケージ名", "Reset to Default Config": "デフォルト設定にリセット", "Cancel & Return": "変更を破棄して戻る", "Configure Build Settings": "ビルドパラメータの構成", "Toggle Execution Log": "実行ログの表示/非表示", + "Detailed Mode": "詳細モード", + "Concise Mode": "簡潔モード", "Copy": "コピー", "Select All": "すべて選択", "Clear Log": "ログを消去", "Export Log...": "ログを保存...", - "A Cross-platform Python Packaging GUI Tool based on PyInstaller & Nuitka": "PyInstaller および Nuitka をベースにしたクロスプラットフォーム Python パッケージング GUI ツール", - " [Console]": " [コンソールあり]", - " [No Console]": " [コンソールなし]", + "Engine & Environment": "ビルドエンジンと環境", + "Execution Mode": "実行モード", + "Mirrors & Scanner": "ミラーソースとスキャナー", + "Additional Resources (Drag & Drop Supported)": "追加リソース (ドラッグ&ドロップ対応)", + "Performance Optimization": "パフォーマンス最適化", + "Lock Core Dependencies": "コア依存関係のバージョン固定", + "Package Name Mappings": "パッケージ名マッピング", + "UI Language:": "表示言語:", + "App Metadata & Presets": "アプリのメタデータとプリセット", + "Output Location": "ビルド生成物の出力先", + "Preferences & System Behavior": "動作設定およびシステム動作", + "Build Engine:": "ビルドエンジン:", + "Python Interpreter:": "Python インタープリター:", + "Output Name:": "出力アプリケーション名:", + "App Icon:": "アプリケーションアイコン:", + "Primary PIP Index:": "メイン PIP インデックス:", + "Backup PIP Index:": "サブ PIP インデックス:", + "Requirements File:": "依存関係ファイル:", + "Hidden Imports:": "暗黙のインポート:", + "Exclude Modules:": "除外モジュール:", + "CPU Cores:": "CPU コア数:", + "UPX Path:": "UPX パス:", + "PyInstaller Version:": "PyInstaller バージョン:", + "Nuitka Version:": "Nuitka バージョン:", + "Pipreqs Version:": "Pipreqs バージョン:", + "Version:": "バージョン:", + "Author/Company:": "作者/組織名:", + "Description:": "詳細説明:", + "Output Rule:": "出力先ルール:", + "Target Directory:": "保存先ディレクトリ:", + "Source File Directory": "ソースファイルと同じディレクトリ", + "Custom Directory": "カスタムディレクトリ", + "Import Name": "import 名", + "PyPI Package Name": "PyPI パッケージ名", "File": "ファイル", "Directory": "ディレクトリ", - "PyInstaller: Fast build speed, excellent compatibility. Ideal for rapid iteration.": "PyInstaller: ビルド速度が速く、互換性に優れています。迅速な反復開発や一般的なアプリケーションに最適です。", - "Nuitka: Compiles to native C/C++ binary. Better performance and source code protection.": "Nuitka: ネイティブ C/C++ バイナリへコンパイルします。実行パフォーマンスが向上し、ソースコードの保護が可能です。", + "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)", + "Hide Console (--noconsole)": "コンソールウィンドウを非表示 (--noconsole)", + "Use Virtual Environment (Recommended)": "独立した仮想環境を使用 (推奨)", + "Install requirements.txt": "requirements.txt をインストール", + "Analyze Dependencies (pipreqs)": "依存関係を自動解析 (pipreqs)", + "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": "ビルド完了後に一時キャッシュを削除", + "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": "空欄の場合、現在のディレクトリから requirements.txt を自動検索します", + "Leave blank to auto-search requirements.txt in current directory": "空欄の場合、要件ファイルを自動検索します", "Comma separated (e.g. pandas, PyQt5)": "カンマ区切りで入力 (例: pandas, PyQt5)", "Comma separated (e.g. tkinter, matplotlib)": "カンマ区切りで入力 (例: tkinter, matplotlib)", - "Leave blank to auto-detect from environment variables": "空欄の場合、PATH 環境変数から自動検出します", - "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "ビルド環境から無駄な依存関係を動的に除外し、ビルド速度の向上とファイルサイズの削減を実現します。", - "Double-click to edit target path; Drag & drop supported": "ダブルクリックで展開先パスを編集。ドラッグ&ドロップによる追加に対応", + "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": "ダブルクリックで展開先パスを編集。ドラッグ&ドロップ対応", + "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++ バイナリへコンパイルします。パフォーマンスが向上し、ソースコードを保護します。", + "
Python {ver} Platform Matrix:Download Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility": "
Python {ver} サポート:Python をダウンロード
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
レガシー OS 完全な後方互換性", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux": "
Python {ver} サポート:Python をダウンロード
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 supported out-of-the-box": "
Python {ver} サポート:Python をダウンロード
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 をそのままサポート", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requires MSVC / Clang / Zig (MinGW64 unsupported)": "
Python {ver} サポート:Python をダウンロード
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka MSVC / Clang / Zig が必要 (MinGW64 はサポート外)", + "
Python InterpreterDownload Python
Auto-detecting system environment for Windows, macOS & Linux...": "
Python インタープリターPython をダウンロード
システム環境を自動検出中...", + "[INFO] Build Cancelled.": "[INFO] ビルドがキャンセルされました。", + "[INFO] Performing pre-flight environment checks...": "[INFO] 環境の事前チェックを実行中...", + "[INFO] Analyzing source code and project dependencies...": "[INFO] ソースコードと依存関係を分析中...", + "[INFO] Initializing isolated build environment...": "[INFO] 隔離されたビルド環境を初期化中...", + "[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 pipreqs...": "[INFO] pipreqs を使用して依存関係をスキャン中...", + "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] ビルドエンジン [{pkg}] およびコア依存関係をインストール中...", + "[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}", + "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 コンパイラ (--zig) を C バックエンドとして使用します。", + "[INFO] Using MinGW64 compiler (--mingw64) for C backend.": "[INFO] MinGW64 コンパイラ (--mingw64) を C バックエンドとして使用します。", + "[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] Writing application icon...": "[INFO] アプリケーションアイコンを書き込み中...", + "[INFO] Application icon written successfully.": "[INFO] アイコンが正常に書き込まれました。", + "[INFO] Lite mode enabled, excluding non-essential modules...": "[INFO] 軽量化モードが有効です。非必須モジュールを除外します...", + "[INFO] Enabled Nuitka optimization directives...": "[INFO] Nuitka 最適化ディレクティブを有効にしました...", + "[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] 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] 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] Parse pipreqs output warning: {error}": "[WARN] pipreqs 出力の解析警告: {error}", + "[WARN] Command timeout (>{timeout}s)": "[WARN] コマンドがタイムアウトしました (>{timeout}s)", + "[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)。", + "[ERROR] Python interpreter is invalid or not found: {path}": "[ERROR] Python インタープリターが無効または見つかりません: {path}", + "[ERROR] The specified icon file does not exist: {path}": "[ERROR] 指定されたアイコンファイルが存在しません: {path}", + "[ERROR] Additional resource file/directory not found: {path}": "[ERROR] 追加リソースが見つかりません: {path}", + "[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.": "[構文エラー] 構文エラーが存在します。コンパイルを中止しました:\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] 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}", + "[ERROR] Process error: command or binary missing ({error})": "[ERROR] プロセスエラー: コマンドまたはバイナリがありません ({error})", + "[ERROR] System execution exception: {error}": "[ERROR] システム実行例外: {error}", + "Dependency Missing Warning: {pkgs} failed to install. Check log for details.": "依存関係欠落警告: {pkgs} のインストールに失敗しました。", "Package mappings have been reset to defaults.": "パッケージマッピングが初期設定にリセットされました。", "Config preset exported to: {path}": "設定プリセットを出力しました: {path}", "Config preset imported successfully.": "設定プリセットを正常に読み込みました。", "AST scan completed, found {count} dependencies.": "AST スキャンが完了しました。{count} 個の依存関係を検出しました。", - "No log content.": "出力可能なログが存在しません。", - "Log saved to: {path}": "ログを正常に保存しました: {path}", - "Attention: Please check the log for details.": "注意: 詳細についてはログ出力を確認してください。", - "[INFO] Initializing isolated build environment...": "[INFO] 隔離されたビルド環境を初期化中...", - "[INFO] Python interpreter path: {path}": "[INFO] 使用する Python インタープリター: {path}", - "[INFO] Creating virtual environment...": "[INFO] 仮想環境 (venv) を作成中...", - "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] 仮想環境の作成に失敗しました。Python 環境に必要なモジュールが不足しているか、実行権限が制限されている可能性があります。", - "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] pip パッケージマネージャーを同期・更新中...", - "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] ビルドエンジン [{pkg}] およびコア依存関係をインストール中...", - "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Nuitka ヒント: 初回ビルド時に GCC/MinGW コンパイラのダウンロードが求められた場合は、安定したネットワーク接続を維持してください。", - "[INFO] Dependency installation [1/3]: Installing declared dependencies ({filename})...": "[INFO] 依存関係のインストール [1/3]: 宣言された依存関係 ({filename}) をインストール中...", - "[INFO] Dependency installation [2/3]: Calling pipreqs to analyze project dependencies...": "[INFO] 依存関係のインストール [2/3]: pipreqs を呼び出してプロジェクトの依存関係を静的解析中...", - "[INFO] Enabled single-file sandbox mode: parsing current script only to prevent pollution from other files.": "[INFO] 単一ファイルサンドボックスモード有効: 他のファイルによる汚染を防ぐため、対象スクリプトのみを解析します。", - "[WARN] Enabled full-directory scan mode: scanning all Python files in the current directory...": "[WARN] 全ディレクトリ解析モード有効: カレントディレクトリ内のすべての Python ファイルをスキャン中...", - "[INFO] Dependency analysis service source address: {server}": "[INFO] 依存関係解析用の PyPI サーバー: {server}", - "[INFO] Querying versions of dependency libraries, please wait...": "[INFO] パッケージのバージョン情報を照会中。お待ちください...", - "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] バックアップの PyPI インデックスに切り替えて再試行中: {url}", - "[INFO] Attempting to scan using compatible encoding...": "[INFO] 互換性のある文字コードを使用してスキャンを再試行中...", - "[WARN] pipreqs skipped deep scan, dependencies will be supplemented by AST scanning engine.": "[WARN] pipreqs による詳細スキャンをスキップしました。不足分は AST スキャンエンジンによって補完されます。", - "[INFO] Dependency installation [3/3]: Extracting implicit dependencies via AST static scan...": "[INFO] 依存関係のインストール [3/3]: AST 静的解析により暗黙の依存関係を抽出中...", - "[INFO] Parsing and installing implicit import dependencies: {pkgs}": "[INFO] 暗黙的にインポートされている依存関係をインストール中: {pkgs}", - "[ERROR] ⚠️ Warning: Failed to install dependency [{pkg}]! May cause runtime crash.": "[ERROR] ⚠️ 警告: 依存パッケージ [{pkg}] のインストールに失敗しました。実行時にクラッシュする可能性があります。", - "[INFO] Starting {engine} engine to compile binary files...": "[INFO] {engine} エンジンを起動し、バイナリファイルのコンパイルを開始中...", - "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] ローカルの MSVC 環境を検出しました。ネイティブ C++ コンパイラを優先使用します。", - "[INFO] Lite mode enabled, executing size reduction strategy...": "[INFO] 軽量化モード有効: バイナリサイズの削減戦略を実行中...", - "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] 軽量化効果を最大化するために、「仮想環境の使用」を有効にすることを強く推奨します。", - "[INFO] Enabled Nuitka optimization directives...": "[INFO] Nuitka 最適化フラグ (-OO) を適用しました...", - "[INFO] Core compilation completed, extracting and archiving built files...": "[INFO] コンパイルコアが完了しました。生成物を抽出およびアーカイブ中...", - "[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}", - "[INFO] Validating output files and generating final product...": "[INFO] 出力ファイルを検証し、最終成果物を生成中...", - "[INFO] Build log exported to: {path}": "[INFO] ビルドログを出力しました: {path}", - "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] コンパイルが正常に完了しました。出力先: {path}", - "[Syntax Error] Source program has syntax or indentation errors!\n - File: {file}\n - Type: {type}\n - Line: near {line}\n - Desc: {desc}\n\nTip: This is an error in the source code logic. Ensure it runs locally before compiling.": "[構文エラー] ソースコードに構文エラーまたはインデントエラーが存在します!\n - 対象ファイル: {file}\n - エラー種別: {type}\n - 発生位置: {line} 行目付近\n - 詳細: {desc}\n\nヒント: これはソースコード自体のエラーです。ローカルで正常に動作することを確認してから再実行してください。", - "\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!": "\n!!!!!!!!!! [診断トレースバック: 異常発生手順の完全な生ログ] !!!!!!!!!!", - "[FAILED] Compilation interrupted with exceptions, refer to the log for troubleshooting.": "[FAILED] 例外が発生したためコンパイルが中断されました。ログを確認してください。", - "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] ディスク容量を解放し、一時ビルド環境をクリーンアップ中...", + "No log content.": "ログ出力がありません。", + "Log saved to: {path}": "ログを保存しました: {path}", + "Attention: Please check the log for details.": "注意: 詳細はログを確認してください。", + "Are you sure you want to reset all preferences to default?": "すべての環境設定をデフォルトにリセットしますか?", + "Global configuration has been reset.": "グローバル設定がリセットされました。", "\\nProgram execution completed, press Enter to exit...": "\\n処理が完了しました。Enter キーを押して終了します...", - "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt 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 during pre-build:\n\n 👉 {pkgs}\n\n⚠️ Tip: The program might crash at runtime due to missing modules!": "[ERROR] ビルドは完了しましたが、以下の依存パッケージの事前インストールに失敗しました:\n\n 👉 {pkgs}\n\n⚠️ 注意: 必要なモジュールが不足しているため、実行時に ModuleNotFoundError でクラッシュする可能性があります。" -} \ No newline at end of file + "Project-specific. Not saved to global preferences. Use 'Export Preset' to save config.": "プロジェクト固有の設定です。「プリセットのエクスポート」を使用して保存してください。", + "GitHub Repository": "GitHub リポジトリ", + "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をダウンロード", + "Unknown": "不明", + "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Python スクリプト (.py/.pyw) をここにドラッグ&ドロップ\nまたはクリックして参照..." +} diff --git a/qpypack/locales/ko_KR.json b/qpypack/locales/ko_KR.json index 44d05cd..bce353a 100644 --- a/qpypack/locales/ko_KR.json +++ b/qpypack/locales/ko_KR.json @@ -1,57 +1,90 @@ { - "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Python 스크립트 (.py/.pyw) 파일을 이곳에 끌어다 놓거나\n클릭하여 찾아보기...", - "Auto-parse dependencies, resources, and implicit imports": "의존성 패키지, 리소스 및 암시적 임포트 자동 분석", - "Loaded: {filename}": "로드 완료: {filename}", - "Parsing metadata...": "메타데이터 분석 중...", - "Ready, waiting for build.": "준비 완료. 빌드 대기 중.", - "Initializing build...": "빌드 프로세스 초기화 중...", - "Preparing engine...": "빌드 엔진 준비 중...", - "Build Successful": "빌드 성공", - "Open output directory or reset workspace.": "출력 디렉터리를 열거나 작업 영역을 리셋하세요.", - "Build Failed": "빌드 실패", - "Check log output below for troubleshooting.": "문제 해결을 위해 아래의 빌드 로그 출력을 확인하세요.", - "Status: Ready": " 상태: 준비 완료", - "Status: Parsing {filename}...": " 상태: {filename} 분석 중...", - "Status: Loaded {filename}{mode}": " 상태: {filename}{mode} 로드됨", - "Status: Packaging ({engine}) ...": " 상태: 패키징 진행 중 ({engine}) ...", - "Status: Build Completed": " 상태: 빌드 완료", - "Status: Build Failed": " 상태: 빌드 실패", - "Status: Workspace Reset": " 상태: 작업 영역 리셋됨", - "Start Build": " 빌드 시작", - "Stop Build": " 빌드 중단", - "Open Directory": " 출력 폴더 열기", - "Rebuild": " 다시 빌드", - "Save & Return": " 저장 후 돌아가기", + "PyPI Official (Global Default)": "PyPI 공식 (글로벌 기본값)", + "Python TestPyPI": "Python TestPyPI", + "AWS PyPI Mirror (US/EU)": "AWS PyPI 미러 (미국/유럽)", + "Tsinghua University (China)": "칭화대학교", + "Aliyun Cloud (China)": "알리윤 클라우드", + "Tencent Cloud (China)": "텐센트 클라우드", + "Huawei Cloud (China)": "화웨이 클라우드", + "USTC (China)": "USTC 미러", + "Modern Cross-Platform Python Application Packager": "모던 크로스 플랫폼 Python 애플리케이션 패키징 도구", + "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 소스 코드를 드래그 앤 드롭하세요", "Build Settings": "빌드 설정", "Preferences": "환경 설정", "About": "정보", - "🚀 Engine": "🚀 엔진", - "📦 Dependencies": "📦 의존성", - "📂 Resources": "📂 리소스", - "⚡ Optimization": "⚡ 최적화", - "🗺️ Package Map": "🗺️ 패키지 매핑", + "Engine": "엔진", + "Dependencies": "의존성", + "Resources": "리소스", + "Optimization": "최적화", + "Package Map": "패키지 매핑", + "Execution Log": "실행 로그", + "Loaded: {filename}": "로드 완료: {filename}", + "Parsing metadata...": "메타데이터 분석 중...", + "Ready, waiting for build.": "준비 완료. 빌드 대기 중.", + "Initializing build...": "빌드 초기화 중...", + "Preparing engine...": "엔진 준비 중...", + "Build Successful": "빌드 성공", + "Open output directory or reset workspace.": "출력 폴더를 열거나 작업 영역을 리셋하세요.", + "Build Failed": "빌드 실패", + "Check log output below for troubleshooting.": "문제 해결을 위해 아래의 로그를 확인하세요.", + "Status: Ready": "상태: 준비 완료", + "Status: Parsing {filename}...": "상태: {filename} 분석 중...", + "Status: Loaded {filename}{mode}": "상태: {filename}{mode} 로드됨", + "Status: Packaging ({engine}) ...": "상태: 패키징 중 ({engine}) ...", + "Status: Build Completed": "상태: 빌드 완료", + "Status: Build Failed": "상태: 빌드 실패", + "Status: Workspace Reset": "상태: 작업 영역 리셋됨", + " [Console]": " [콘솔 모드]", + " [No Console]": " [콘솔 없음]", + "Start Build": "빌드 시작", + "Stop Build": "빌드 중단", + "Open Directory": "출력 폴더 열기", + "Rebuild": "다시 빌드", + "Save & Return": "저장 및 돌아가기", + "Browse": "찾아보기...", + "AST Scan": "AST 구문 분석", + "Add File": "파일 추가", + "Add Dir": "폴더 추가", + "Remove Selected": "선택 삭제", + "Clear All": "모두 지우기", + "Add Mapping": "매핑 추가", + "Restore Defaults": "기본값 복원", + "Export Preset...": "프리셋 내보내기...", + "Import Preset...": "프리셋 가져오기...", + "Reset to Default Config": "기본 설정으로 리셋", + "Cancel & Return": "취소 및 돌아가기", + "Configure Build Settings": "빌드 매개변수 구성", + "Toggle Execution Log": "실행 로그 켜기/끄기", + "Detailed Mode": "상세 모드", + "Concise Mode": "간소화 모드", + "Copy": "복사", + "Select All": "전체 선택", + "Clear Log": "로그 지우기", + "Export Log...": "로그 내보내기...", "Engine & Environment": "빌드 엔진 및 환경", "Execution Mode": "실행 모드", - "Mirrors & Scanner": "미러 서버 및 스캐너 설정", + "Mirrors & Scanner": "미러 서버 및 스캐너", "Additional Resources (Drag & Drop Supported)": "추가 리소스 (드래그 앤 드롭 지원)", - "Performance Optimization": "성능 및 컴파일 최적화", - "Lock Core Dependencies": "핵심 의존성 버전 고정", - "Package Name Mappings": "패키지 이름 매핑 테이블", + "Performance Optimization": "성능 최적화", + "Lock Core Dependencies": "핵심 의존성 고정", + "Package Name Mappings": "패키지 이름 매핑", "UI Language:": "표시 언어:", - "App Metadata & Presets": "앱 메타데이터 및 프리셋", - "Output Location": "빌드 결과물 출력 위치", - "Preferences & System Behavior": "환경 설정 및 시스템 동작", + "App Metadata & Presets": "메타데이터 및 프리셋", + "Output Location": "결과물 출력 위치", + "Preferences & System Behavior": "환경 설정 및 동작", "Build Engine:": "빌드 엔진:", "Python Interpreter:": "Python 인터프리터:", "Output Name:": "출력 파일 이름:", "App Icon:": "애플리케이션 아이콘:", "Primary PIP Index:": "기본 PIP 인덱스:", "Backup PIP Index:": "보조 PIP 인덱스:", - "Requirements File:": "의존성 목록 파일 (requirements.txt):", - "Hidden Imports:": "암시적 임포트 (Hidden Imports):", - "Exclude Modules:": "제외할 모듈 (Excludes):", - "CPU Cores:": "병렬 컴파일 CPU 코어 수:", - "UPX Path:": "UPX 실행 파일 경로:", + "Requirements File:": "의존성 목록 파일:", + "Hidden Imports:": "암시적 임포트:", + "Exclude Modules:": "제외할 모듈:", + "CPU Cores:": "CPU 코어 수:", + "UPX Path:": "UPX 경로:", "PyInstaller Version:": "PyInstaller 버전:", "Nuitka Version:": "Nuitka 버전:", "Pipreqs Version:": "Pipreqs 버전:", @@ -60,103 +93,135 @@ "Description:": "설명:", "Output Rule:": "출력 규칙:", "Target Directory:": "대상 디렉터리:", + "Source File Directory": "소스 파일 디렉터리", + "Custom Directory": "사용자 지정 디렉터리", + "Import Name": "import 이름", + "PyPI Package Name": "PyPI 패키지 이름", + "File": "파일", + "Directory": "디렉터리", + "Edit Path": "경로 편집", + "Target relative path:": "대상 상대 경로:", + "Import name (e.g. cv2):": "import 이름 (예: cv2):", + "PyPI package name for [{imp_name}]:": "[{imp_name}] PyPI 패키지 이름:", "One-File Mode (--onefile)": "단일 파일 모드 (--onefile)", "Hide Console (--noconsole)": "콘솔 창 숨기기 (--noconsole)", - "Use Virtual Environment (Recommended)": "독립된 가상 환경 사용 (권장)", - "Install requirements.txt": "requirements.txt 의존성 설치", - "Analyze Dependencies (pipreqs)": "프로젝트 의존성 자동 분석 (pipreqs)", - "Scan Entire Folder": "디렉터리 전체 스캔", - "Enable UPX Compression": "UPX 실행 파일 압축 활성화", - "Lite Mode (Exclude Dev/Test Dependencies)": "경량화 모드 (개발/테스트 의존성 제외)", + "Use Virtual Environment (Recommended)": "가상 환경 사용 (권장)", + "Install requirements.txt": "requirements.txt 설치", + "Analyze Dependencies (pipreqs)": "의존성 자동 분석 (pipreqs)", + "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": "빌드 완료 후 임시 캐시 삭제", - "Sound Notification": "빌드 완료 알림음", - "Browse": "찾아보기...", - "AST Scan": "AST 구문 분석", - "Add File": "파일 추가", - "Add Dir": "디렉터리 추가", - "Remove Selected": "선택 항목 삭제", - "Clear All": "전체 비우기", - "Add Mapping": "매핑 추가", - "Restore Defaults": "기본값 복원", - "Export Preset...": "프리셋 내보내기...", - "Import Preset...": "프리셋 가져오기...", - "Source File Directory": "소스 파일과 동일한 디렉터리", - "Custom Directory": "사용자 지정 디렉터리", - "Import Name": "코드 내 import 이름", - "PyPI Package Name": "PyPI 패키지 이름", - "Reset to Default Config": "기본 설정으로 리셋", - "Cancel & Return": "변경 사항 취소 후 돌아가기", - "Configure Build Settings": "빌드 파라미터 구성", - "Toggle Execution Log": "실행 로그 표시/숨기기", - "Copy": "복사", - "Select All": "전체 선택", - "Clear Log": "로그 지우기", - "Export Log...": "로그 내보내기...", - "A Cross-platform Python Packaging GUI Tool based on PyInstaller & Nuitka": "PyInstaller 및 Nuitka 기반의 크로스 플랫폼 Python 애플리케이션 패키징 GUI 도구", - " [Console]": " [콘솔 모드]", - " [No Console]": " [콘솔 없음]", - "File": "파일", - "Directory": "디렉터리", - "PyInstaller: Fast build speed, excellent compatibility. Ideal for rapid iteration.": "PyInstaller: 빌드 속도가 빠르고 호환성이 뛰어납니다. 빠른 반복 개발 및 일반 애플리케이션에 적합합니다.", - "Nuitka: Compiles to native C/C++ binary. Better performance and source code protection.": "Nuitka: 네이티브 C/C++ 바이너리로 컴파일합니다. 더 뛰어난 실행 성능과 소스 코드 보안을 제공합니다.", - "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": "비워 두면 PATH 환경 변수에서 자동 감지합니다", - "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "빌드 환경에서 불필요한 의존성을 동적으로 제외하여 빌드 속도를 높이고 결과물 용량을 줄입니다.", - "Double-click to edit target path; Drag & drop supported": "더블 클릭하여 배포 경로 수정. 드래그 앤 드롭 추가 지원", - "Package mappings have been reset to defaults.": "패키지 매핑이 기본값으로 리셋되었습니다.", - "Config preset exported to: {path}": "설정 프리셋을 내보냈습니다: {path}", - "Config preset imported successfully.": "설정 프리셋을 성공적으로 가져왔습니다.", - "AST scan completed, found {count} dependencies.": "AST 스캔 완료. 총 {count}개의 의존성을 발견했습니다.", - "No log content.": "내보낼 로그 내용이 없습니다.", - "Log saved to: {path}": "로그를 성공적으로 저장했습니다: {path}", - "Attention: Please check the log for details.": "주의: 자세한 내용은 로그 출력을 확인하세요.", + "Clean Temporary Cache After Build": "빌드 후 임시 캐시 삭제", + "Sound Notification": "완료 알림음", + "Leave blank to auto-detect system default Python": "비워두면 자동 감지합니다", + "Leave blank to auto-match script name": "비워두면 스크립트 이름을 사용합니다", + "Leave blank to auto-search requirements.txt in current directory": "비워두면 자동 검색합니다", + "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": "더블클릭하여 수정. 드래그 앤 드롭 지원", + "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++ 바이너리로 컴파일하여 실행 속도가 빠릅니다.", + "
Python {ver} Platform Matrix:Download Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility": "
Python {ver} 지원:Python 다운로드
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
레거시 OS 완벽한 하위 호환성", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux": "
Python {ver} 지원:Python 다운로드
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 supported out-of-the-box": "
Python {ver} 지원:Python 다운로드
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 기본 지원", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requires MSVC / Clang / Zig (MinGW64 unsupported)": "
Python {ver} 지원:Python 다운로드
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka MSVC / Clang / Zig 필요", + "
Python InterpreterDownload Python
Auto-detecting system environment for Windows, macOS & Linux...": "
Python 인터프리터Python 다운로드
시스템 환경 자동 감지 중...", + "[INFO] Build Cancelled.": "[INFO] 빌드가 취소되었습니다.", + "[INFO] Performing pre-flight environment checks...": "[INFO] 환경 사전 점검 수행 중...", + "[INFO] Analyzing source code and project dependencies...": "[INFO] 소스 코드 및 의존성 분석 중...", "[INFO] Initializing isolated build environment...": "[INFO] 격리된 빌드 환경 초기화 중...", - "[INFO] Python interpreter path: {path}": "[INFO] 사용할 Python 인터프리터 경로: {path}", - "[INFO] Creating virtual environment...": "[INFO] 가상 환경 (venv) 생성 중...", - "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] 가상 환경 생성에 실패했습니다. 현재 Python 환경에 필수 모듈이 누락되었거나 실행 권한이 제한되었을 수 있습니다.", - "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] pip 패키지 관리자 동기화 및 업그레이드 중...", - "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] 빌드 엔진 [{pkg}] 및 핵심 컴파일 의존성 설치 중...", - "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Nuitka 팁: 첫 빌드 시 GCC/MinGW 컴파일러 다운로드 요청이 나타나면 안정적인 네트워크 연결을 유지하세요.", - "[INFO] Dependency installation [1/3]: Installing declared dependencies ({filename})...": "[INFO] 의존성 설치 [1/3]: 명시된 의존성 목록 ({filename}) 설치 중...", - "[INFO] Dependency installation [2/3]: Calling pipreqs to analyze project dependencies...": "[INFO] 의존성 설치 [2/3]: pipreqs를 호출하여 프로젝트 의존성 정적 분석 중...", - "[INFO] Enabled single-file sandbox mode: parsing current script only to prevent pollution from other files.": "[INFO] 단일 파일 샌드박스 모드 활성화: 다른 파일에 의한 오염을 방지하기 위해 대상 스크립트만 분석합니다.", - "[WARN] Enabled full-directory scan mode: scanning all Python files in the current directory...": "[WARN] 전체 디렉터리 스캔 모드 활성화: 현재 폴더의 모든 Python 파일을 분석 중...", - "[INFO] Dependency analysis service source address: {server}": "[INFO] 의존성 분석용 PyPI 서버 주소: {server}", - "[INFO] Querying versions of dependency libraries, please wait...": "[INFO] 패키지 버전 정보를 조회 중입니다. 잠시만 기다려 주세요...", - "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] 보조 PyPI 인덱스로 전환하여 재시도 중: {url}", - "[INFO] Attempting to scan using compatible encoding...": "[INFO] 호환 인코딩을 사용하여 스캔 재시도 중...", - "[WARN] pipreqs skipped deep scan, dependencies will be supplemented by AST scanning engine.": "[WARN] pipreqs 정밀 스캔을 건너뛰었습니다. 부족한 의존성은 AST 스캔 엔진이 보완합니다.", - "[INFO] Dependency installation [3/3]: Extracting implicit dependencies via AST static scan...": "[INFO] 의존성 설치 [3/3]: AST 정적 분석을 통해 암시적 의존성 추출 중...", - "[INFO] Parsing and installing implicit import dependencies: {pkgs}": "[INFO] 암시적으로 임포트된 의존성 패키지 설치 중: {pkgs}", - "[ERROR] ⚠️ Warning: Failed to install dependency [{pkg}]! May cause runtime crash.": "[ERROR] ⚠️ 경고: 의존성 패키지 [{pkg}] 설치 실패! 실행 시 프로그램이 종료될 수 있습니다.", - "[INFO] Starting {engine} engine to compile binary files...": "[INFO] {engine} 엔진을 시작하여 바이너리 컴파일을 진행합니다...", - "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] 로컬 MSVC 환경이 감지되었습니다. 네이티브 C++ 컴파일러를 우선 사용합니다.", - "[INFO] Lite mode enabled, executing size reduction strategy...": "[INFO] 경량화 모드 활성화: 바이너리 용량 최적화 전략 실행 중...", - "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] 경량화 효과를 극대화하려면 '가상 환경 사용' 옵션을 함께 활성화하는 것을 강력히 권장합니다.", - "[INFO] Enabled Nuitka optimization directives...": "[INFO] Nuitka 최적화 플래그 (-OO) 적용 완료...", - "[INFO] Core compilation completed, extracting and archiving built files...": "[INFO] 핵심 컴파일 완료. 결과물 추출 및 아카이빙 중...", - "[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}", - "[INFO] Validating output files and generating final product...": "[INFO] 출력 파일을 검증하고 최종 결과물을 생성 중...", - "[INFO] Build log exported to: {path}": "[INFO] 빌드 로그를 내보냈습니다: {path}", - "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] 컴파일이 성공적으로 완료되었습니다. 출력 경로: {path}", - "[Syntax Error] Source program has syntax or indentation errors!\n - File: {file}\n - Type: {type}\n - Line: near {line}\n - Desc: {desc}\n\nTip: This is an error in the source code logic. Ensure it runs locally before compiling.": "[구문 오류] 소스 코드에 문법 또는 들여쓰기 오류가 존재합니다!\n - 대상 파일: {file}\n - 오류 유형: {type}\n - 발생 위치: 약 {line}번째 줄\n - 상세 내용: {desc}\n\n팁: 이는 소스 코드 자체의 오류입니다. 로컬에서 정상 실행되는지 확인 후 다시 시도하세요.", - "\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!": "\n!!!!!!!!!! [진단 트레이스백: 해당 단계의 진단용 원본 로그] !!!!!!!!!!", - "[FAILED] Compilation interrupted with exceptions, refer to the log for troubleshooting.": "[FAILED] 예외가 발생하여 컴파일이 중단되었습니다. 로그를 참조하세요.", - "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] 디스크 공간 확보를 위해 임시 빌드 환경을 정리하는 중...", - "\\nProgram execution completed, press Enter to exit...": "\\n실행이 완료되었습니다. 종료하려면 Enter 키를 누르세요...", - "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt 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 during pre-build:\n\n 👉 {pkgs}\n\n⚠️ Tip: The program might crash at runtime due to missing modules!": "[ERROR] 빌드는 완료되었으나 다음 사전 의존성 설치에 실패했습니다:\n\n 👉 {pkgs}\n\n⚠️ 주의: 필수 모듈 누락으로 인해 실행 시 ModuleNotFoundError가 발생할 수 있습니다." -} \ No newline at end of file + "[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 pipreqs...": "[INFO] pipreqs로 소스 코드 스캔 중...", + "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] 빌드 엔진 [{pkg}] 및 코어 의존성 설치 중...", + "[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}", + "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 컴파일러(--zig) 사용.", + "[INFO] Using MinGW64 compiler (--mingw64) for C backend.": "[INFO] MinGW64 컴파일러(--mingw64) 사용.", + "[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] Writing application icon...": "[INFO] 애플리케이션 아이콘 적용 중...", + "[INFO] Application icon written successfully.": "[INFO] 애플리케이션 아이콘 적용 완료.", + "[INFO] Lite mode enabled, excluding non-essential modules...": "[INFO] 경량화 모드 활성화. 불필요한 모듈 제외 중...", + "[INFO] Enabled Nuitka optimization directives...": "[INFO] Nuitka 최적화 적용 완료...", + "[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] 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] 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] Parse pipreqs output warning: {error}": "[WARN] pipreqs 출력 분석 경고: {error}", + "[WARN] Command timeout (>{timeout}s)": "[WARN] 명령 시간 초과 (>{timeout}초)", + "[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] 빌드 중단됨: 디스크 공간 부족. 최소 5GB를 확보하세요.", + "[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).", + "[ERROR] Python interpreter is invalid or not found: {path}": "[ERROR] Python 인터프리터를 찾을 수 없거나 올바르지 않음: {path}", + "[ERROR] The specified icon file does not exist: {path}": "[ERROR] 아이콘 파일이 존재하지 않음: {path}", + "[ERROR] Additional resource file/directory not found: {path}": "[ERROR] 추가 리소스를 찾을 수 없음: {path}", + "[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.": "[구문 오류] 소스 코드에 오류가 있습니다:\n - 파일: {file}\n - 유형: {type}\n - 라인: {line}\n - 세부 정보: {desc}", + "[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] 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}", + "[ERROR] Process error: command or binary missing ({error})": "[ERROR] 프로세스 오류: {error}", + "[ERROR] System execution exception: {error}": "[ERROR] 시스템 실행 예외: {error}", + "Dependency Missing Warning: {pkgs} failed to install. Check log for details.": "의존성 누락 경고: {pkgs} 설치 실패.", + "Package mappings have been reset to defaults.": "패키지 매핑이 초기화되었습니다.", + "Config preset exported to: {path}": "프리셋을 내보냈습니다: {path}", + "Config preset imported successfully.": "프리셋 가져오기 완료.", + "AST scan completed, found {count} dependencies.": "AST 스캔 완료. {count}개의 의존성 발견.", + "No log content.": "로그 내용이 없습니다.", + "Log saved to: {path}": "로그가 저장되었습니다: {path}", + "Attention: Please check the log for details.": "주의: 로그 출력을 확인하세요.", + "Are you sure you want to reset all preferences to default?": "기본 설정으로 리셋하시겠습니까?", + "Global configuration has been reset.": "글로벌 설정이 리셋되었습니다.", + "\\nProgram execution completed, press Enter to exit...": "\\n실행 완료. 종료하려면 Enter를 누르세요...", + "Project-specific. Not saved to global preferences. Use 'Export Preset' to save config.": "프로젝트 전용 설정입니다. '프리셋 내보내기'를 사용하세요.", + "GitHub Repository": "GitHub 레포지토리", + "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이 감지되지 않았습니다!
Python을 설치하세요. ('Add to PATH' 체크 필수)", + "Download Python": "Python 다운로드", + "Unknown": "알 수 없음", + "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Python 스크립트 (.py/.pyw) 파일을 이곳에 끌어다 놓거나\n클릭하여 찾아보기..." +} diff --git a/qpypack/locales/pt_BR.json b/qpypack/locales/pt_BR.json index 9274f26..18eb9c6 100644 --- a/qpypack/locales/pt_BR.json +++ b/qpypack/locales/pt_BR.json @@ -1,78 +1,48 @@ { - "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Arraste e solte o script Python (.py/.pyw) aqui\nou clique para navegar...", - "Auto-parse dependencies, resources, and implicit imports": "Análise automática de dependências, recursos e importações implícitas", - "Loaded: {filename}": "Carregado: {filename}", - "Parsing metadata...": "Analisando metadados...", - "Ready, waiting for build.": "Pronto, aguardando compilação.", - "Initializing build...": "Inicializando processo de compilação...", - "Preparing engine...": "Preparando o motor de compilação...", - "Build Successful": "Compilação concluída com sucesso", - "Open output directory or reset workspace.": "Abra o diretório de saída ou redefina o espaço de trabalho.", - "Build Failed": "Falha na compilação", - "Check log output below for troubleshooting.": "Verifique o log abaixo para solucionar o problema.", - "Status: Ready": " Status: Pronto", - "Status: Parsing {filename}...": " Status: Analisando {filename}...", - "Status: Loaded {filename}{mode}": " Status: {filename}{mode} carregado", - "Status: Packaging ({engine}) ...": " Status: Empacotando ({engine}) ...", - "Status: Build Completed": " Status: Compilação concluída", - "Status: Build Failed": " Status: Falha na compilação", - "Status: Workspace Reset": " Status: Espaço de trabalho redefinido", - "Start Build": " Iniciar Compilação", - "Stop Build": " Interromper", - "Open Directory": " Abrir Pasta", - "Rebuild": " Recompilar", - "Save & Return": " Salvar e Voltar", + "PyPI Official (Global Default)": "PyPI Oficial (Padrão Global)", + "Python TestPyPI": "Python TestPyPI", + "AWS PyPI Mirror (US/EU)": "Espelho AWS PyPI (EUA/UE)", + "Tsinghua University (China)": "Universidade de Tsinghua", + "Aliyun Cloud (China)": "Nuvem Aliyun", + "Tencent Cloud (China)": "Nuvem Tencent", + "Huawei Cloud (China)": "Nuvem Huawei", + "USTC (China)": "USTC", + "Modern Cross-Platform Python Application Packager": "Empacotador Moderno de Aplicações Python", + "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka": "GUI de Empacotamento Python com PyInstaller & Nuitka", + "Python Packaging, Reimagined.": "Empacotamento Python, reimaginado.", + "Drop Python source code to start": "Solte o código fonte Python para começar", "Build Settings": "Configurações de Build", "Preferences": "Preferências", "About": "Sobre", - "🚀 Engine": "🚀 Motor", - "📦 Dependencies": "📦 Dependências", - "📂 Resources": "📂 Recursos", - "⚡ Optimization": "⚡ Otimização", - "🗺️ Package Map": "🗺️ Mapeamento", - "Engine & Environment": "Motor de compilação e ambiente", - "Execution Mode": "Modo de execução", - "Mirrors & Scanner": "Servidores espelho e analisador", - "Additional Resources (Drag & Drop Supported)": "Recursos adicionais (Suporta arrastar e soltar)", - "Performance Optimization": "Otimização de desempenho e compilação", - "Lock Core Dependencies": "Fixar versões das dependências principais", - "Package Name Mappings": "Tabela de mapeamento de nomes de pacotes", - "UI Language:": "Idioma da interface:", - "App Metadata & Presets": "Metadados do aplicativo e predefinições", - "Output Location": "Local de saída do executável", - "Preferences & System Behavior": "Preferências e comportamento do sistema", - "Build Engine:": "Motor de compilação:", - "Python Interpreter:": "Intérprete Python:", - "Output Name:": "Nome do arquivo final:", - "App Icon:": "Ícone do aplicativo:", - "Primary PIP Index:": "Servidor PIP principal:", - "Backup PIP Index:": "Servidor PIP secundário:", - "Requirements File:": "Arquivo de dependências (requirements.txt):", - "Hidden Imports:": "Importações implícitas (Hidden Imports):", - "Exclude Modules:": "Excluir módulos (Excludes):", - "CPU Cores:": "Núcleos de CPU em paralelo:", - "UPX Path:": "Caminho do executável UPX:", - "PyInstaller Version:": "Versão do PyInstaller:", - "Nuitka Version:": "Versão do Nuitka:", - "Pipreqs Version:": "Versão do Pipreqs:", - "Version:": "Versão:", - "Author/Company:": "Autor/Organização:", - "Description:": "Descrição:", - "Output Rule:": "Regra de local de saída:", - "Target Directory:": "Diretório de destino:", - "One-File Mode (--onefile)": "Modo de arquivo único (--onefile)", - "Hide Console (--noconsole)": "Ocultar janela do console (--noconsole)", - "Use Virtual Environment (Recommended)": "Usar ambiente virtual isolado (Recomendado)", - "Install requirements.txt": "Instalar dependências do requirements.txt", - "Analyze Dependencies (pipreqs)": "Analisar dependências automaticamente (pipreqs)", - "Scan Entire Folder": "Escanear a pasta inteira", - "Enable UPX Compression": "Ativar compressão UPX", - "Lite Mode (Exclude Dev/Test Dependencies)": "Modo leve (Excluir dependências dev/test)", - "Concise Log Output": "Saída de log concisa", - "Auto-save Build Log": "Salvar log de compilação automaticamente", - "Auto Extract Icon": "Extrair ícone automaticamente", - "Clean Temporary Cache After Build": "Limpar cache temporário após a compilação", - "Sound Notification": "Notificação sonora ao concluir", + "Engine": "Motor", + "Dependencies": "Dependências", + "Resources": "Recursos", + "Optimization": "Otimização", + "Package Map": "Mapeamento", + "Execution Log": "Log de Execução", + "Loaded: {filename}": "Carregado: {filename}", + "Parsing metadata...": "Analisando metadados...", + "Ready, waiting for build.": "Pronto, aguardando compilação.", + "Initializing build...": "Inicializando compilação...", + "Preparing engine...": "Preparando o motor...", + "Build Successful": "Compilação bem-sucedida", + "Open output directory or reset workspace.": "Abra o diretório de saída ou redefina o espaço de trabalho.", + "Build Failed": "Falha na compilação", + "Check log output below for troubleshooting.": "Verifique o log abaixo para solucionar o problema.", + "Status: Ready": "Status: Pronto", + "Status: Parsing {filename}...": "Status: Analisando {filename}...", + "Status: Loaded {filename}{mode}": "Status: {filename}{mode} carregado", + "Status: Packaging ({engine}) ...": "Status: Empacotando ({engine}) ...", + "Status: Build Completed": "Status: Compilação concluída", + "Status: Build Failed": "Status: Falha na compilação", + "Status: Workspace Reset": "Status: Área redefinida", + " [Console]": " [Com console]", + " [No Console]": " [Sem console]", + "Start Build": "Iniciar Compilação", + "Stop Build": "Interromper", + "Open Directory": "Abrir Pasta", + "Rebuild": "Recompilar", + "Save & Return": "Salvar e Voltar", "Browse": "Navegar...", "AST Scan": "Análise AST", "Add File": "Adicionar Arquivo", @@ -83,80 +53,175 @@ "Restore Defaults": "Restaurar Padrões", "Export Preset...": "Exportar Predefinição...", "Import Preset...": "Importar Predefinição...", - "Source File Directory": "Diretório do arquivo fonte", - "Custom Directory": "Diretório personalizado", - "Import Name": "Nome de importação no código", - "PyPI Package Name": "Nome do pacote no PyPI", "Reset to Default Config": "Restaurar configurações padrão", - "Cancel & Return": "Descartar alterações e voltar", - "Configure Build Settings": "Configurar parâmetros de compilação", - "Toggle Execution Log": "Exibir/Ocultar log de execução", + "Cancel & Return": "Cancelar e voltar", + "Configure Build Settings": "Configurações de compilação", + "Toggle Execution Log": "Exibir/Ocultar Log", + "Detailed Mode": "Modo Detalhado", + "Concise Mode": "Modo Conciso", "Copy": "Copiar", "Select All": "Selecionar Tudo", "Clear Log": "Limpar Log", "Export Log...": "Exportar Log...", - "A Cross-platform Python Packaging GUI Tool based on PyInstaller & Nuitka": "Uma ferramenta GUI multiplataforma para empacotar aplicações Python baseada no PyInstaller & Nuitka", - " [Console]": " [Com console]", - " [No Console]": " [Sem console]", + "Engine & Environment": "Motor e ambiente", + "Execution Mode": "Modo de execução", + "Mirrors & Scanner": "Espelhos e analisador", + "Additional Resources (Drag & Drop Supported)": "Recursos adicionais (Suporta Drag & Drop)", + "Performance Optimization": "Otimização de desempenho", + "Lock Core Dependencies": "Fixar dependências principais", + "Package Name Mappings": "Mapeamento de nomes de pacotes", + "UI Language:": "Idioma da interface:", + "App Metadata & Presets": "Metadados e predefinições", + "Output Location": "Local de saída", + "Preferences & System Behavior": "Preferências e comportamento", + "Build Engine:": "Motor de compilação:", + "Python Interpreter:": "Intérprete Python:", + "Output Name:": "Nome do executável:", + "App Icon:": "Ícone do aplicativo:", + "Primary PIP Index:": "Servidor PIP principal:", + "Backup PIP Index:": "Servidor PIP secundário:", + "Requirements File:": "Arquivo de dependências:", + "Hidden Imports:": "Importações implícitas:", + "Exclude Modules:": "Excluir módulos:", + "CPU Cores:": "Núcleos de CPU:", + "UPX Path:": "Caminho UPX:", + "PyInstaller Version:": "Versão do PyInstaller:", + "Nuitka Version:": "Versão do Nuitka:", + "Pipreqs Version:": "Versão do Pipreqs:", + "Version:": "Versão:", + "Author/Company:": "Autor/Organização:", + "Description:": "Descrição:", + "Output Rule:": "Regra de saída:", + "Target Directory:": "Diretório de destino:", + "Source File Directory": "Diretório do arquivo fonte", + "Custom Directory": "Diretório personalizado", + "Import Name": "Nome de importação", + "PyPI Package Name": "Nome do pacote no PyPI", "File": "Arquivo", "Directory": "Diretório", - "PyInstaller: Fast build speed, excellent compatibility. Ideal for rapid iteration.": "PyInstaller: Compilação rápida e excelente compatibilidade. Ideal para desenvolvimento iterativo.", - "Nuitka: Compiles to native C/C++ binary. Better performance and source code protection.": "Nuitka: Compila para binário C/C++ nativo. Melhora o desempenho e protege o código-fonte.", - "Leave blank to auto-detect system default Python": "Deixe em branco para detectar automaticamente o Python padrão do sistema", - "Leave blank to auto-match script name": "Deixe em branco para usar automaticamente o nome do script", - "Leave blank to auto-search requirements.txt in current directory": "Deixe em branco para buscar automaticamente o requirements.txt na pasta atual", + "Edit Path": "Editar Caminho", + "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)", + "Hide Console (--noconsole)": "Ocultar console (--noconsole)", + "Use Virtual Environment (Recommended)": "Usar ambiente virtual (Recomendado)", + "Install requirements.txt": "Instalar requirements.txt", + "Analyze Dependencies (pipreqs)": "Analisar dependências (pipreqs)", + "Scan Entire Folder": "Escanear a pasta inteira", + "Enable UPX Compression": "Ativar compressão UPX", + "Lite Mode (Exclude Dev/Test Dependencies)": "Modo leve (Excluir dependências dev/test)", + "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", + "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", + "Leave blank to auto-search requirements.txt in current directory": "Deixe em branco para buscar automaticamente", "Comma separated (e.g. pandas, PyQt5)": "Separados por vírgula (ex: pandas, PyQt5)", "Comma separated (e.g. tkinter, matplotlib)": "Separados por vírgula (ex: tkinter, matplotlib)", - "Leave blank to auto-detect from environment variables": "Deixe em branco para detectar automaticamente pelas variáveis de ambiente", - "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "Exclui dependências desnecessárias para reduzir o tamanho final e acelerar a compilação.", - "Double-click to edit target path; Drag & drop supported": "Clique duplo para editar o caminho. Suporta arrastar e soltar", - "Package mappings have been reset to defaults.": "O mapeamento de pacotes foi redefinido para os padrões.", + "Leave blank to auto-detect from environment variables": "Deixe em branco para detectar automaticamente", + "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "Exclui dependências desnecessárias para reduzir o tamanho e acelerar.", + "Double-click to edit target path; Drag & drop supported": "Clique duplo para editar; Suporta arrastar e soltar", + "PyInstaller — Bundles Python interpreter and bytecode. Fast build speed, zero configuration (no C compiler needed), and excellent compatibility.": "PyInstaller — Compilação rápida e excelente compatibilidade. Ideal para desenvolvimento iterativo.", + "Nuitka — Compiles source code into native C/C++ binary. Produces smaller package size, faster execution, and deep anti-decompilation protection (requires C compiler).": "Nuitka — Compila para C/C++ nativo. Melhora o desempenho e protege o código-fonte.", + "
Python {ver} Platform Matrix:Download Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility": "
Python {ver} Suporte:Baixar Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
SO Legado Compatibilidade total", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux": "
Python {ver} Suporte:Baixar Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 supported out-of-the-box": "
Python {ver} Suporte:Baixar Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka Suporta MinGW64", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requires MSVC / Clang / Zig (MinGW64 unsupported)": "
Python {ver} Suporte:Baixar Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requer MSVC / Clang / Zig", + "
Python InterpreterDownload Python
Auto-detecting system environment for Windows, macOS & Linux...": "
Intérprete PythonBaixar Python
Detectando ambiente do sistema...", + "[INFO] Build Cancelled.": "[INFO] Compilação cancelada.", + "[INFO] Performing pre-flight environment checks...": "[INFO] Realizando verificações do ambiente...", + "[INFO] Analyzing source code and project dependencies...": "[INFO] Analisando código fonte e dependências...", + "[INFO] Initializing isolated build environment...": "[INFO] Inicializando ambiente isolado...", + "[INFO] Python interpreter path: {path}": "[INFO] Caminho do Python: {path}", + "[INFO] Creating virtual environment...": "[INFO] Criando ambiente virtual...", + "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] Atualizando pip...", + "[INFO] Scanning project source code via pipreqs...": "[INFO] Escaneando via pipreqs...", + "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] Instalando motor [{pkg}] e dependências centrais...", + "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Dica Nuitka: Mantenha conexão estável se baixar GCC/MinGW.", + "[INFO] Successfully installed compatible versions.": "[INFO] Versões compatíveis instaladas com sucesso.", + "[INFO] Resolving project dependencies...": "[INFO] Resolvendo dependências do projeto...", + "Declared in requirements.txt ({count}): {pkgs}": "Declarado em requirements.txt ({count}): {pkgs}", + "Declared in requirements.txt: None": "Declarado em requirements.txt: Nenhum", + "Discovered via scanner ({count}): {pkgs}": "Descoberto via scanner ({count}): {pkgs}", + "Auto-patched missing ({count}): {pkgs}": "Corrigido automaticamente ({count}): {pkgs}", + "Manifest complete (No missing packages)": "Manifesto completo (Sem pacotes faltando)", + "Build engine packages ({count}): {pkgs}": "Pacotes do motor ({count}): {pkgs}", + "[INFO] Installing build environment and project dependencies ({count} packages): {pkgs}": "[INFO] Instalando dependências ({count} pacotes): {pkgs}", + "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] Alternando para servidor PIP secundário: {url}", + "[INFO] Starting {engine} engine to compile binary files...": "[INFO] Iniciando motor {engine} para compilação...", + "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] Ambiente MSVC local detectado, priorizando compilador C++ nativo.", + "[INFO] Found local Clang environment, prioritizing LLVM Clang compiler.": "[INFO] Ambiente Clang local detectado, priorizando compilador LLVM Clang.", + "[INFO] Python 3.13+ detected: Using Zig compiler (--zig) as C backend.": "[INFO] Python 3.13+ detectado: Usando Zig (--zig).", + "[INFO] Using MinGW64 compiler (--mingw64) for C backend.": "[INFO] Usando compilador MinGW64 (--mingw64).", + "[INFO] Evaluating system physical memory (Available: {ram:.1f} GB). Adaptive concurrency adjusted: {cores} -> {safe_jobs} ...": "[INFO] Avaliando memória (Livre: {ram:.1f} GB). Concorrência ajustada: {cores} -> {safe_jobs} ...", + "[INFO] Stripping icon parameters and automatically rebuilding...": "[INFO] Removendo parâmetros de ícone e recompilando...", + "[INFO] Writing application icon...": "[INFO] Gravando ícone do aplicativo...", + "[INFO] Application icon written successfully.": "[INFO] Ícone gravado com sucesso.", + "[INFO] Lite mode enabled, excluding non-essential modules...": "[INFO] Modo leve ativado, excluindo módulos desnecessários...", + "[INFO] Enabled Nuitka optimization directives...": "[INFO] Diretivas de otimização Nuitka ativadas...", + "[INFO] Compilation completed, archiving built files...": "[INFO] Compilação concluída, arquivando arquivos...", + "[INFO] Validating output files and generating final product...": "[INFO] Validando arquivos e gerando executável...", + "[INFO] Build log exported to: {path}": "[INFO] Log exportado para: {path}", + "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] Limpando ambiente temporário...", + "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] Compilação concluída. Caminho: {path}", + "[WARN] Target project is in a Cloud Sync directory (e.g. OneDrive/Dropbox). Cloud sync may temporarily lock build files.": "[WARN] Projeto em diretório de Nuvem. Pode bloquear arquivos.", + "[WARN] Specified versions failed to install. Stripping version constraints for automatic compatibility match...": "[WARN] Falha ao instalar versões especificadas. Buscando compatibilidade automática...", + "[WARN] Some dependencies failed to install, build will proceed with risk...": "[WARN] Algumas dependências falharam, a compilação continuará com risco...", + "[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] Pouco espaço em disco (Livre: {free:.1f} GB).", + "[WARN] Memory allocation exception caught (ZstdError / OOM). Triggering memory protection fallback: Retrying in single-thread mode...": "[WARN] Exceção de memória (OOM). Re-tentando em modo single-thread...", + "[WARN] System low memory detected (zstd memory allocation failed). Automatically retrying in single-thread low-memory mode...": "[WARN] Sistema com pouca memória. Re-tentando em single-thread...", + "[WARN] Icon resource writing blocked (possibly locked by system/antivirus), triggering fallback protection...": "[WARN] Escrita do ícone bloqueada (possível antivírus).", + "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] Recomendamos ativar [Ambiente Virtual] para o modo leve.", + "[WARN] Pause code injection exception: {error}": "[WARN] Exceção de injeção de pausa: {error}", + "[WARN] AST Analysis Exception: {error}": "[WARN] Exceção de análise AST: {error}", + "[WARN] Read requirements.txt warning: {error}": "[WARN] Aviso ao ler requirements.txt: {error}", + "[WARN] Parse pipreqs output warning: {error}": "[WARN] Aviso ao analisar pipreqs: {error}", + "[WARN] Command timeout (>{timeout}s)": "[WARN] Tempo limite do comando esgotado (>{timeout}s)", + "[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] Compilação abortada: Espaço em disco insuficiente. Limpe pelo menos 5 GB.", + "[ERROR] Output directory is missing write permissions: {error}": "[ERROR] O diretório de saída não possui permissões de escrita: {error}", + "[ERROR] Requirements file not found: {path}": "[ERROR] Arquivo de dependências não encontrado: {path}", + "[ERROR] Insufficient disk space (Available: {free:.1f} GB). At least 0.5 GB is required to safely initialize the build environment.": "[ERROR] Espaço insuficiente (Livre: {free:.1f} GB).", + "[ERROR] Python interpreter is invalid or not found: {path}": "[ERROR] Intérprete Python inválido ou não encontrado: {path}", + "[ERROR] The specified icon file does not exist: {path}": "[ERROR] O ícone não existe: {path}", + "[ERROR] Additional resource file/directory not found: {path}": "[ERROR] Recurso não encontrado: {path}", + "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] Falha ao criar ambiente virtual.", + "[ERROR] Product transfer failed, file might be occupied by system process or lack permission: {error}": "[ERROR] Falha ao transferir o executável: {error}", + "[ERROR] Could not locate valid executable product in temporary build directory: {path}": "[ERROR] Não foi possível localizar o executável na pasta temporária: {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.": "[Erro de Sintaxe] Erro de código, compilação abortada:\n - Arquivo: {file}\n - Tipo: {type}\n - Linha: {line}\n - Detalhe: {desc}", + "[FAILED] Compilation interrupted with exceptions, please click 'Detailed Mode' above the log window for troubleshooting.": "[FAILED] Compilação interrompida com erros. Verifique o 'Modo Detalhado'.", + "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.": "[ERROR] Arquivo bloqueado ou criptografado por drive em nuvem.", + "[ERROR] Please load a valid Python source file first!": "[ERROR] Por favor, carregue um arquivo Python válido!", + "[ERROR] Exception occurred during AST parsing: {error}": "[ERROR] Exceção durante análise AST: {error}", + "[ERROR] Failed to export preset file: {error}": "[ERROR] Falha ao exportar predefinição: {error}", + "[ERROR] Preset file format error or corrupted: {error}": "[ERROR] Predefinição corrompida: {error}", + "[ERROR] Failed to export log file: {error}": "[ERROR] Falha ao exportar log: {error}", + "[ERROR] Build completed, but the following dependencies failed to install:\n\n - {pkgs}\n\nNote: The application might raise ModuleNotFoundError at runtime.": "[ERROR] Compilação concluída, mas as dependências falharam:\n\n - {pkgs}", + "[ERROR] Process error: command or binary missing ({error})": "[ERROR] Erro de processo: {error}", + "[ERROR] System execution exception: {error}": "[ERROR] Exceção de sistema: {error}", + "Dependency Missing Warning: {pkgs} failed to install. Check log for details.": "Aviso: {pkgs} falharam ao instalar.", + "Package mappings have been reset to defaults.": "Mapeamentos redefinidos para os padrões.", "Config preset exported to: {path}": "Predefinição exportada para: {path}", "Config preset imported successfully.": "Predefinição importada com sucesso.", "AST scan completed, found {count} dependencies.": "Análise AST concluída: {count} dependências encontradas.", - "No log content.": "Não há conteúdo de log para exportar.", + "No log content.": "Nenhum conteúdo de log.", "Log saved to: {path}": "Log salvo em: {path}", - "Attention: Please check the log for details.": "Atenção: Por favor, verifique o log para mais detalhes.", - "[INFO] Initializing isolated build environment...": "[INFO] Inicializando ambiente de compilação isolado...", - "[INFO] Python interpreter path: {path}": "[INFO] Caminho do intérprete Python: {path}", - "[INFO] Creating virtual environment...": "[INFO] Criando ambiente virtual (venv)...", - "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] Falha ao criar o ambiente virtual. O Python do sistema pode estar sem módulos essenciais ou com permissões restritas.", - "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] Sincronizando e atualizando o gerenciador de pacotes pip...", - "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] Instalando motor de compilação [{pkg}] e dependências principais...", - "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Dica do Nuitka: Se for solicitado o download do compilador GCC/MinGW, mantenha uma conexão de rede estável.", - "[INFO] Dependency installation [1/3]: Installing declared dependencies ({filename})...": "[INFO] Instalação de dependências [1/3]: Instalando dependências declaradas ({filename})...", - "[INFO] Dependency installation [2/3]: Calling pipreqs to analyze project dependencies...": "[INFO] Instalação de dependências [2/3]: Executando pipreqs para análise estática do projeto...", - "[INFO] Enabled single-file sandbox mode: parsing current script only to prevent pollution from other files.": "[INFO] Modo sandbox ativado: Analisando apenas o script principal para evitar interferência de outros arquivos.", - "[WARN] Enabled full-directory scan mode: scanning all Python files in the current directory...": "[WARN] Escaneamento completo ativado: Analisando todos os arquivos Python da pasta...", - "[INFO] Dependency analysis service source address: {server}": "[INFO] Servidor PyPI utilizado para análise: {server}", - "[INFO] Querying versions of dependency libraries, please wait...": "[INFO] Consultando versões dos pacotes, por favor aguarde...", - "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] Alternando para o servidor PIP secundário: {url}", - "[INFO] Attempting to scan using compatible encoding...": "[INFO] Tentando escanear novamente com codificação compatível...", - "[WARN] pipreqs skipped deep scan, dependencies will be supplemented by AST scanning engine.": "[WARN] A análise profunda do pipreqs foi ignorada. As dependências serão completadas via AST.", - "[INFO] Dependency installation [3/3]: Extracting implicit dependencies via AST static scan...": "[INFO] Instalação de dependências [3/3]: Extraindo importações implícitas via análise estática AST...", - "[INFO] Parsing and installing implicit import dependencies: {pkgs}": "[INFO] Instalando dependências implícitas detectadas: {pkgs}", - "[ERROR] ⚠️ Warning: Failed to install dependency [{pkg}]! May cause runtime crash.": "[ERROR] ⚠️ Aviso: Falha ao instalar o pacote [{pkg}]! A aplicação pode falhar na execução.", - "[INFO] Starting {engine} engine to compile binary files...": "[INFO] Iniciando motor {engine} para compilação binária...", - "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] Ambiente MSVC local detectado. Priorizando o compilador C++ nativo.", - "[INFO] Lite mode enabled, executing size reduction strategy...": "[INFO] Modo leve ativado: Aplicando estratégias para redução de tamanho...", - "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] É altamente recomendável ativar 'Usar ambiente virtual' para maximizar o efeito do modo leve.", - "[INFO] Enabled Nuitka optimization directives...": "[INFO] Aplicando diretivas de otimização do Nuitka (-OO)...", - "[INFO] Core compilation completed, extracting and archiving built files...": "[INFO] Compilação principal concluída. Extraindo e arquivando executáveis...", - "[ERROR] Product transfer failed, file might be occupied by system process or lack permission: {error}": "[ERROR] Falha ao mover o executável final. O arquivo pode estar em uso ou faltam permissões: {error}", - "[ERROR] Could not locate valid executable product in temporary build directory: {path}": "[ERROR] Não foi possível localizar um executável válido na pasta temporária: {path}", - "[INFO] Validating output files and generating final product...": "[INFO] Validando arquivos e gerando o produto final...", - "[INFO] Build log exported to: {path}": "[INFO] Log de compilação exportado para: {path}", - "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] Compilação concluída com sucesso. Local de saída: {path}", - "[Syntax Error] Source program has syntax or indentation errors!\n - File: {file}\n - Type: {type}\n - Line: near {line}\n - Desc: {desc}\n\nTip: This is an error in the source code logic. Ensure it runs locally before compiling.": "[Erro de sintaxe] O código fonte contém um erro de sintaxis ou indentação!\n - Arquivo: {file}\n - Tipo de erro: {type}\n - Linha: próximo à linha {line}\n - Detalhes: {desc}\n\nDica: Este é um erro no seu código fonte. Certifique-se de que ele execute localmente antes de compilar.", - "\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!": "\n!!!!!!!!!! [Rastreamento de diagnóstico: Log completo devido à exceção de execução] !!!!!!!!!!", - "[FAILED] Compilation interrupted with exceptions, refer to the log for troubleshooting.": "[FAILED] Compilação interrompida devido a erros. Verifique o log.", - "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] Liberando espaço em disco e limpando arquivos temporários...", + "Attention: Please check the log for details.": "Atenção: Verifique o log para detalhes.", + "Are you sure you want to reset all preferences to default?": "Tem certeza que deseja redefinir todas as preferências?", + "Global configuration has been reset.": "Configuração global redefinida.", "\\nProgram execution completed, press Enter to exit...": "\\nExecução concluída. Pressione Enter para sair...", - "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.": "[ERROR] O arquivo está bloqueado ou criptografado por um serviço de nuvem. Desbloqueie-o e tente novamente.", - "[ERROR] Please load a valid Python source file first!": "[ERROR] Por favor, carregue primeiro um arquivo de código fonte Python válido!", - "[ERROR] Exception occurred during AST parsing: {error}": "[ERROR] Ocorreu uma exceção durante a análise AST: {error}", - "[ERROR] Failed to export preset file: {error}": "[ERROR] Não foi possível exportar o arquivo de predefinição: {error}", - "[ERROR] Preset file format error or corrupted: {error}": "[ERROR] O arquivo de predefinição está corrompido ou em formato inválido: {error}", - "[ERROR] Failed to export log file: {error}": "[ERROR] Não foi possível exportar o arquivo de log: {error}", - "[ERROR] Build completed, but the following dependencies failed to install during pre-build:\n\n 👉 {pkgs}\n\n⚠️ Tip: The program might crash at runtime due to missing modules!": "[ERROR] A compilação foi concluída, mas falhou a instalação prévia das seguintes dependências:\n\n 👉 {pkgs}\n\n⚠️ Aviso: O programa pode falhar na execução devido à falta de módulos." -} \ No newline at end of file + "Project-specific. Not saved to global preferences. Use 'Export Preset' to save config.": "Específico do projeto. Use 'Exportar Predefinição'.", + "GitHub Repository": "Repositório GitHub", + "Issues & Feedback": "Problemas e Feedback", + "PyPI Home": "Página PyPI", + "Sponsor": "Patrocinar", + "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 é gratuito. Se ajudou você, considere pagar um café ao autor!", + "* Sponsorship is completely voluntary, serves as an unconditional encouragement to the open-source community, and involves no commercial commitments. Thank you for your support!": "* O patrocínio é voluntário. Obrigado pelo seu apoio!", + "Python Environment Required": "Ambiente Python Necessário", + "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 não detectado!
Instale o Python (marque 'Add Python.exe to PATH').", + "Download Python": "Baixar Python", + "Unknown": "Desconhecido", + "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Arraste e solte o script Python (.py/.pyw) aqui\nou clique para navegar..." +} diff --git a/qpypack/locales/ru_RU.json b/qpypack/locales/ru_RU.json index 65c1add..ba698e3 100644 --- a/qpypack/locales/ru_RU.json +++ b/qpypack/locales/ru_RU.json @@ -1,57 +1,90 @@ { - "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Перетащите Python-скрипт (.py/.pyw) сюда\nили нажмите для обзора...", - "Auto-parse dependencies, resources, and implicit imports": "Автоматический анализ зависимостей, ресурсов и неявных импортов", + "PyPI Official (Global Default)": "Официальный PyPI (По умолчанию)", + "Python TestPyPI": "Python TestPyPI", + "AWS PyPI Mirror (US/EU)": "Зеркало AWS PyPI (США/ЕС)", + "Tsinghua University (China)": "Университет Цинхуа (Китай)", + "Aliyun Cloud (China)": "Aliyun Cloud (Китай)", + "Tencent Cloud (China)": "Tencent Cloud (Китай)", + "Huawei Cloud (China)": "Huawei Cloud (Китай)", + "USTC (China)": "USTC (Китай)", + "Modern Cross-Platform Python Application Packager": "Современный кроссплатформенный упаковщик Python", + "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka": "Современный GUI-упаковщик Python на базе PyInstaller и Nuitka", + "Python Packaging, Reimagined.": "Переосмысление упаковки Python.", + "Drop Python source code to start": "Перетащите исходный код Python для начала", + "Build Settings": "Параметры сборки", + "Preferences": "Настройки", + "About": "О программе", + "Engine": "Движок", + "Dependencies": "Зависимости", + "Resources": "Ресурсы", + "Optimization": "Оптимизация", + "Package Map": "Сопоставление", + "Execution Log": "Журнал выполнения", "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.": "Откройте целевую папку или сбросьте рабочую область.", "Build Failed": "Сборка не удалась", "Check log output below for troubleshooting.": "Ознакомьтесь с журналом ниже для устранения неполадок.", - "Status: Ready": " Статус: Готово", - "Status: Parsing {filename}...": " Статус: Анализ {filename}...", - "Status: Loaded {filename}{mode}": " Статус: Загружен {filename}{mode}", - "Status: Packaging ({engine}) ...": " Статус: Упаковка ({engine}) ...", - "Status: Build Completed": " Статус: Сборка завершена", - "Status: Build Failed": " Статус: Сборка не удалась", - "Status: Workspace Reset": " Статус: Рабочая область сброшена", - "Start Build": " Начать сборку", - "Stop Build": " Остановить", - "Open Directory": " Открыть папку", - "Rebuild": " Пересобрать", - "Save & Return": " Сохранить и вернуться", - "Build Settings": "Параметры сборки", - "Preferences": "Настройки", - "About": "О программе", - "🚀 Engine": "🚀 Движок", - "📦 Dependencies": "📦 Зависимости", - "📂 Resources": "📂 Ресурсы", - "⚡ Optimization": "⚡ Оптимизация", - "🗺️ Package Map": "🗺️ Сопоставление", + "Status: Ready": "Статус: Готово", + "Status: Parsing {filename}...": "Статус: Анализ {filename}...", + "Status: Loaded {filename}{mode}": "Статус: Загружен {filename}{mode}", + "Status: Packaging ({engine}) ...": "Статус: Упаковка ({engine}) ...", + "Status: Build Completed": "Статус: Сборка завершена", + "Status: Build Failed": "Статус: Сборка не удалась", + "Status: Workspace Reset": "Статус: Рабочая область сброшена", + " [Console]": " [С консолью]", + " [No Console]": " [Без консоли]", + "Start Build": "Начать сборку", + "Stop Build": "Остановить", + "Open Directory": "Открыть папку", + "Rebuild": "Пересобрать", + "Save & Return": "Сохранить и вернуться", + "Browse": "Обзор...", + "AST Scan": "AST-анализ", + "Add File": "Добавить файл", + "Add Dir": "Добавить папку", + "Remove Selected": "Удалить выбранное", + "Clear All": "Очистить все", + "Add Mapping": "Добавить правило", + "Restore Defaults": "Восстановить", + "Export Preset...": "Экспортировать пресет...", + "Import Preset...": "Импортировать пресет...", + "Reset to Default Config": "Сбросить настройки", + "Cancel & Return": "Отменить и вернуться", + "Configure Build Settings": "Настройка параметров сборки", + "Toggle Execution Log": "Переключить журнал", + "Detailed Mode": "Подробный режим", + "Concise Mode": "Краткий режим", + "Copy": "Копировать", + "Select All": "Выделить все", + "Clear Log": "Очистить журнал", + "Export Log...": "Сохранить журнал...", "Engine & Environment": "Движок сборки и окружение", "Execution Mode": "Режим выполнения", - "Mirrors & Scanner": "Зеркала и сканер зависимостей", - "Additional Resources (Drag & Drop Supported)": "Дополнительные ресурсы (Поддерживается Drag & Drop)", - "Performance Optimization": "Оптимизация производительности и компиляции", - "Lock Core Dependencies": "Фиксация версий ключевых зависимостей", - "Package Name Mappings": "Таблица сопоставления имен пакетов", + "Mirrors & Scanner": "Зеркала и сканер", + "Additional Resources (Drag & Drop Supported)": "Дополнительные ресурсы (Drag & Drop)", + "Performance Optimization": "Оптимизация производительности", + "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:": "Иконка приложения:", + "Output Name:": "Имя файла:", + "App Icon:": "Иконка:", "Primary PIP Index:": "Основное зеркало PIP:", "Backup PIP Index:": "Резервное зеркало PIP:", - "Requirements File:": "Файл зависимостей (requirements.txt):", - "Hidden Imports:": "Неявные импорты (Hidden Imports):", - "Exclude Modules:": "Исключить модули (Excludes):", - "CPU Cores:": "Параллельные ядра ЦП:", - "UPX Path:": "Путь к утилите UPX:", + "Requirements File:": "Файл зависимостей:", + "Hidden Imports:": "Неявные импорты:", + "Exclude Modules:": "Исключить модули:", + "CPU Cores:": "Ядра ЦП:", + "UPX Path:": "Путь UPX:", "PyInstaller Version:": "Версия PyInstaller:", "Nuitka Version:": "Версия Nuitka:", "Pipreqs Version:": "Версия Pipreqs:", @@ -60,103 +93,135 @@ "Description:": "Описание:", "Output Rule:": "Правило размещения:", "Target Directory:": "Целевая папка:", - "One-File Mode (--onefile)": "Режим одного файла (--onefile)", - "Hide Console (--noconsole)": "Скрыть окно консоли (--noconsole)", - "Use Virtual Environment (Recommended)": "Использовать изолированное виртуальное окружение (Рекомендуется)", - "Install requirements.txt": "Установить зависимости из requirements.txt", - "Analyze Dependencies (pipreqs)": "Автоматически проанализировать зависимости (pipreqs)", - "Scan Entire Folder": "Сканировать всю папку", - "Enable UPX Compression": "Включить UPX-сжатие", - "Lite Mode (Exclude Dev/Test Dependencies)": "Облегченный режим (Исключить dev/test зависимости)", - "Concise Log Output": "Краткий вывод журнала", - "Auto-save Build Log": "Автоматически сохранять журнал сборки", - "Auto Extract Icon": "Автоматически извлекать иконку", - "Clean Temporary Cache After Build": "Очищать временный кэш после сборки", - "Sound Notification": "Звуковое уведомление о завершении", - "Browse": "Обзор...", - "AST Scan": "AST-анализ", - "Add File": "Добавить файл", - "Add Dir": "Добавить папку", - "Remove Selected": "Удалить выбранное", - "Clear All": "Очистить все", - "Add Mapping": "Добавить правило", - "Restore Defaults": "Сбросить настройки", - "Export Preset...": "Экспортировать пресет...", - "Import Preset...": "Импортировать пресет...", "Source File Directory": "Папка исходного файла", "Custom Directory": "Пользовательская папка", - "Import Name": "Имя импорта в коде", - "PyPI Package Name": "Имя пакета в PyPI", - "Reset to Default Config": "Сбросить к настройкам по умолчанию", - "Cancel & Return": "Отменить изменения и вернуться", - "Configure Build Settings": "Настройка параметров сборки", - "Toggle Execution Log": "Показать/скрыть журнал выполнения", - "Copy": "Копировать", - "Select All": "Выделить все", - "Clear Log": "Очистить журнал", - "Export Log...": "Сохранить журнал...", - "A Cross-platform Python Packaging GUI Tool based on PyInstaller & Nuitka": "Кроссплатформенный GUI-инструмент упаковки Python-приложений на базе PyInstaller и Nuitka", - " [Console]": " [С консолью]", - " [No Console]": " [Без консоли]", + "Import Name": "Имя импорта", + "PyPI Package Name": "Имя в PyPI", "File": "Файл", "Directory": "Папка", - "PyInstaller: Fast build speed, excellent compatibility. Ideal for rapid iteration.": "PyInstaller: Высокая скорость сборки и отличная совместимость. Идеально для быстрой разработки.", - "Nuitka: Compiles to native C/C++ binary. Better performance and source code protection.": "Nuitka: Компилирует в нативный C/C++ бинарный файл. Выше производительность и защита исходного кода.", - "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": "Оставьте пустым для автоматического поиска в переменной PATH", - "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "Динамически исключает избыточные зависимости для уменьшения размера и ускорения сборки.", - "Double-click to edit target path; Drag & drop supported": "Двойной клик для редактирования пути. Поддерживается Drag & Drop", - "Package mappings have been reset to defaults.": "Сопоставления пакетов сброшены к значениям по умолчанию.", - "Config preset exported to: {path}": "Пресет конфигурации экспортирован в: {path}", - "Config preset imported successfully.": "Пресет конфигурации успешно импортирован.", - "AST scan completed, found {count} dependencies.": "AST-сканирование завершено, найдено зависимостей: {count}.", - "No log content.": "Журнал пуст.", - "Log saved to: {path}": "Журнал сохранен в: {path}", - "Attention: Please check the log for details.": "Внимание: Пожалуйста, проверьте журнал для деталей.", + "Edit Path": "Изменить путь", + "Target relative path:": "Целевой относительный путь:", + "Import name (e.g. cv2):": "Имя импорта (напр. cv2):", + "PyPI package name for [{imp_name}]:": "Имя пакета PyPI для [{imp_name}]:", + "One-File Mode (--onefile)": "Режим одного файла (--onefile)", + "Hide Console (--noconsole)": "Скрыть консоль (--noconsole)", + "Use Virtual Environment (Recommended)": "Использовать виртуальное окружение", + "Install requirements.txt": "Установить requirements.txt", + "Analyze Dependencies (pipreqs)": "Анализ зависимостей (pipreqs)", + "Scan Entire Folder": "Сканировать всю папку", + "Enable UPX Compression": "Включить UPX-сжатие", + "Lite Mode (Exclude Dev/Test Dependencies)": "Облегченный режим (Без dev/test)", + "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": "Оставьте пустым для автоопределения", + "Leave blank to auto-match script name": "Оставьте пустым для автоопределения имени", + "Leave blank to auto-search requirements.txt in current directory": "Оставьте пустым для автопоиска", + "Comma separated (e.g. pandas, PyQt5)": "Через запятую (напр. pandas, PyQt5)", + "Comma separated (e.g. tkinter, matplotlib)": "Через запятую (напр. tkinter, matplotlib)", + "Leave blank to auto-detect from environment variables": "Оставьте пустым для автоопределения (PATH)", + "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "Динамически исключает избыточные зависимости.", + "Double-click to edit target path; Drag & drop supported": "Двойной клик для редактирования. Поддерживается Drag & Drop", + "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++. Меньший размер, выше производительность.", + "
Python {ver} Platform Matrix:Download Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility": "
Python {ver} Поддержка:Скачать Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Устаревшая ОС Полная совместимость", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux": "
Python {ver} Поддержка:Скачать Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 supported out-of-the-box": "
Python {ver} Поддержка:Скачать Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka Поддерживается MinGW64", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requires MSVC / Clang / Zig (MinGW64 unsupported)": "
Python {ver} Поддержка:Скачать Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Требуется MSVC/Clang/Zig", + "
Python InterpreterDownload Python
Auto-detecting system environment for Windows, macOS & Linux...": "
Интерпретатор PythonСкачать Python
Автоопределение среды...", + "[INFO] Build Cancelled.": "[INFO] Сборка отменена.", + "[INFO] Performing pre-flight environment checks...": "[INFO] Выполнение проверок среды...", + "[INFO] Analyzing source code and project dependencies...": "[INFO] Анализ исходного кода и зависимостей...", "[INFO] Initializing isolated build environment...": "[INFO] Инициализация изолированного окружения сборки...", - "[INFO] Python interpreter path: {path}": "[INFO] Путь к интерпретатору Python: {path}", - "[INFO] Creating virtual environment...": "[INFO] Создание виртуального окружения (venv)...", - "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] Не удалось создать виртуальное окружение. Возможно, отсутствуют модули или ограничены права.", - "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] Синхронизация и обновление менеджера пакетов pip...", - "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] Установка движка сборки [{pkg}] и ключевых зависимостей...", - "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Совет Nuitka: Если при первой сборке потребуется загрузка компилятора GCC/MinGW, убедитесь в стабильности сети.", - "[INFO] Dependency installation [1/3]: Installing declared dependencies ({filename})...": "[INFO] Установка зависимостей [1/3]: Установка объявленных зависимостей ({filename})...", - "[INFO] Dependency installation [2/3]: Calling pipreqs to analyze project dependencies...": "[INFO] Установка зависимостей [2/3]: Вызов pipreqs для статического анализа проекта...", - "[INFO] Enabled single-file sandbox mode: parsing current script only to prevent pollution from other files.": "[INFO] Режим песочницы включен: Анализируется только целевой скрипт во избежание конфликтов.", - "[WARN] Enabled full-directory scan mode: scanning all Python files in the current directory...": "[WARN] Включено сканирование всей папки: Анализ всех Python-файлов в текущем каталоге...", - "[INFO] Dependency analysis service source address: {server}": "[INFO] Адрес сервера PyPI для анализа зависимостей: {server}", - "[INFO] Querying versions of dependency libraries, please wait...": "[INFO] Запрос версий пакетов, пожалуйста, подождите...", - "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] Переключение на резервное зеркало PIP: {url}", - "[INFO] Attempting to scan using compatible encoding...": "[INFO] Повторная попытка сканирования с совместимой кодировкой...", - "[WARN] pipreqs skipped deep scan, dependencies will be supplemented by AST scanning engine.": "[WARN] Глубокое сканирование pipreqs пропущено, недостающие зависимости дополняются через AST.", - "[INFO] Dependency installation [3/3]: Extracting implicit dependencies via AST static scan...": "[INFO] Установка зависимостей [3/3]: Извлечение неявных импортов через AST-анализ...", - "[INFO] Parsing and installing implicit import dependencies: {pkgs}": "[INFO] Установка обнаруженных неявных зависимостей: {pkgs}", - "[ERROR] ⚠️ Warning: Failed to install dependency [{pkg}]! May cause runtime crash.": "[ERROR] ⚠️ Предупреждение: Не удалось установить пакет [{pkg}]! Это может вызвать сбой при запуске.", + "[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 pipreqs...": "[INFO] Сканирование через pipreqs...", + "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] Установка движка [{pkg}] и зависимостей...", + "[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}", + "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] Lite mode enabled, executing size reduction strategy...": "[INFO] Включен облегченный режим: Применение стратегий оптимизации размера...", - "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] Настоятельно рекомендуется включить 'Виртуальное окружение' для максимального эффекта.", - "[INFO] Enabled Nuitka optimization directives...": "[INFO] Применены флаги оптимизации Nuitka (-OO)...", - "[INFO] Core compilation completed, extracting and archiving built files...": "[INFO] Основная компиляция завершена, извлечение и архивация файлов...", - "[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}", - "[INFO] Validating output files and generating final product...": "[INFO] Проверка итоговых файлов и генерация приложения...", - "[INFO] Build log exported to: {path}": "[INFO] Журнал сборки экспортирован в: {path}", - "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] Компиляция успешно завершена. Выходной путь: {path}", - "[Syntax Error] Source program has syntax or indentation errors!\n - File: {file}\n - Type: {type}\n - Line: near {line}\n - Desc: {desc}\n\nTip: This is an error in the source code logic. Ensure it runs locally before compiling.": "[Синтаксическая ошибка] Исходный код содержит синтаксическую ошибку или ошибку отступов!\n - Файл: {file}\n - Тип ошибки: {type}\n - Строка: около {line}\n - Детали: {desc}\n\nСовет: Это ошибка в вашем исходном коде. Убедитесь, что скрипт работает локально перед сборкой.", - "\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!": "\n!!!!!!!!!! [Диагностический трассировочный журнал: Полный лог из-за ошибки выполнения] !!!!!!!!!!", - "[FAILED] Compilation interrupted with exceptions, refer to the log for troubleshooting.": "[FAILED] Компиляция прервана из-за ошибок. Проверьте журнал.", - "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] Освобождение места и очистка временного окружения сборки...", - "\\nProgram execution completed, press Enter to exit...": "\\nВыполнение завершено. Нажмите Enter для выхода...", - "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt 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 during pre-build:\n\n 👉 {pkgs}\n\n⚠️ Tip: The program might crash at runtime due to missing modules!": "[ERROR] Сборка завершена, но не удалось предварительно установить следующие зависимости:\n\n 👉 {pkgs}\n\n⚠️ Внимание: Приложение может завершиться с ошибкой при запуске из-за отсутствия модулей!" -} \ No newline at end of file + "[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 (--zig).", + "[INFO] Using MinGW64 compiler (--mingw64) for C backend.": "[INFO] Использование MinGW64 (--mingw64).", + "[INFO] Evaluating system physical memory (Available: {ram:.1f} GB). Adaptive concurrency adjusted: {cores} -> {safe_jobs} ...": "[INFO] Оценка памяти (Доступно: {ram:.1f} ГБ). Потоки: {cores} -> {safe_jobs} ...", + "[INFO] Stripping icon parameters and automatically rebuilding...": "[INFO] Удаление параметров иконки и пересборка...", + "[INFO] Writing application icon...": "[INFO] Запись иконки приложения...", + "[INFO] Application icon written successfully.": "[INFO] Иконка приложения успешно записана.", + "[INFO] Lite mode enabled, excluding non-essential modules...": "[INFO] Облегченный режим включен, исключение модулей...", + "[INFO] Enabled Nuitka optimization directives...": "[INFO] Включены директивы оптимизации Nuitka...", + "[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] Проект в облачной папке (OneDrive/Dropbox). Файлы могут быть заблокированы.", + "[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} ГБ).", + "[WARN] Memory allocation exception caught (ZstdError / OOM). Triggering memory protection fallback: Retrying in single-thread mode...": "[WARN] Исключение памяти (OOM). Повтор в однопоточном режиме...", + "[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] Parse pipreqs output warning: {error}": "[WARN] Предупреждение парсинга pipreqs: {error}", + "[WARN] Command timeout (>{timeout}s)": "[WARN] Превышено время ожидания команды (>{timeout}с)", + "[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] Сборка прервана: Недостаточно места (Очистите 5 ГБ).", + "[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} ГБ).", + "[ERROR] Python interpreter is invalid or not found: {path}": "[ERROR] Неверный интерпретатор Python: {path}", + "[ERROR] The specified icon file does not exist: {path}": "[ERROR] Файл иконки не существует: {path}", + "[ERROR] Additional resource file/directory not found: {path}": "[ERROR] Ресурс не найден: {path}", + "[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.": "[Синтаксическая ошибка] В коде ошибка:\n - Файл: {file}\n - Тип: {type}\n - Строка: {line}\n - Детали: {desc}", + "[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] 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}", + "[ERROR] Process error: command or binary missing ({error})": "[ERROR] Ошибка процесса: {error}", + "[ERROR] System execution exception: {error}": "[ERROR] Ошибка выполнения системы: {error}", + "Dependency Missing Warning: {pkgs} failed to install. Check log for details.": "Внимание: {pkgs} не установлены.", + "Package mappings have been reset to defaults.": "Сопоставления сброшены.", + "Config preset exported to: {path}": "Пресет экспортирован в: {path}", + "Config preset imported successfully.": "Пресет импортирован.", + "AST scan completed, found {count} dependencies.": "AST-анализ: найдено {count} зависимостей.", + "No log content.": "Нет записей в журнале.", + "Log saved to: {path}": "Журнал сохранен в: {path}", + "Attention: Please check the log for details.": "Внимание: Проверьте журнал.", + "Are you sure you want to reset all preferences to default?": "Сбросить все настройки?", + "Global configuration has been reset.": "Настройки сброшены.", + "\\nProgram execution completed, press Enter to exit...": "\\nВыполнение завершено, нажмите Enter...", + "Project-specific. Not saved to global preferences. Use 'Export Preset' to save config.": "Только для этого проекта. Используйте 'Экспортировать пресет'.", + "GitHub Repository": "Репозиторий GitHub", + "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 не найден!
Установите Python (с галочкой 'Add to PATH').", + "Download Python": "Скачать Python", + "Unknown": "Неизвестно", + "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "Перетащите Python-скрипт (.py/.pyw) сюда\nили нажмите для обзора..." +} diff --git a/qpypack/locales/zh_TW.json b/qpypack/locales/zh_TW.json index 6f80c93..36db778 100644 --- a/qpypack/locales/zh_TW.json +++ b/qpypack/locales/zh_TW.json @@ -1,162 +1,227 @@ { - "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "將 Python 腳本 (.py/.pyw) 拖放至此\n或 點擊瀏覽檔案", - "Auto-parse dependencies, resources, and implicit imports": "自動解析依賴項、附加資源及隱式匯入", - "Loaded: {filename}": "已載入: {filename}", - "Parsing metadata...": "正在解析元資料...", - "Ready, waiting for build.": "就緒,等待建置。", - "Initializing build...": "初始化建置流程...", - "Preparing engine...": "準備建置引擎...", - "Build Successful": "建置成功", - "Open output directory or reset workspace.": "前往輸出目錄檢視,或重置當前工作區。", - "Build Failed": "建置失敗", - "Check log output below for troubleshooting.": "請參閱下方記錄檔以排查錯誤。", - "Status: Ready": " 狀態: 準備就緒", - "Status: Parsing {filename}...": " 狀態: 正在解析 {filename}...", - "Status: Loaded {filename}{mode}": " 狀態: 已載入 {filename}{mode}", - "Status: Packaging ({engine}) ...": " 狀態: 打包中 ({engine}) ...", - "Status: Build Completed": " 狀態: 建置完成", - "Status: Build Failed": " 狀態: 建置失敗", - "Status: Workspace Reset": " 狀態: 工作區已重置", - "Start Build": " 開始建置", - "Stop Build": " 停止建置", - "Open Directory": " 開啟輸出目錄", - "Rebuild": " 重新建置", - "Save & Return": " 儲存並返回", + "PyPI Official (Global Default)": "PyPI 官方源 (預設)", + "Python TestPyPI": "TestPyPI 測試源", + "AWS PyPI Mirror (US/EU)": "AWS PyPI 鏡像 (美/歐)", + "Tsinghua University (China)": "清華大學鏡像", + "Aliyun Cloud (China)": "阿里雲鏡像", + "Tencent Cloud (China)": "騰訊雲鏡像", + "Huawei Cloud (China)": "華為雲鏡像", + "USTC (China)": "中科大鏡像", + "Modern Cross-Platform Python Application Packager": "現代化的跨平台 Python 應用程式打包工具", + "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka": "基於 PyInstaller 與 Nuitka 的現代化跨平台 Python 打包工具", + "Python Packaging, Reimagined.": "重新定義 Python 應用程式打包體驗", + "Drop Python source code to start": "拖入 Python 原始碼,即刻啟程", "Build Settings": "建置設定", "Preferences": "偏好設定", "About": "關於", - "🚀 Engine": "🚀 建置引擎", - "📦 Dependencies": "📦 依賴管理", - "📂 Resources": "📂 附加資源", - "⚡ Optimization": "⚡ 效能優化", - "🗺️ Package Map": "🗺️ 包名對映", - "Engine & Environment": "建置引擎與環境", - "Execution Mode": "執行模式", - "Mirrors & Scanner": "鏡像源與掃描設定", - "Additional Resources (Drag & Drop Supported)": "附加資源檔案與目錄 (支援桌面拖放)", - "Performance Optimization": "效能與編譯優化", - "Lock Core Dependencies": "鎖定核心依賴版本", - "Package Name Mappings": "第三方庫包名對映表", - "UI Language:": "介面語言:", - "App Metadata & Presets": "應用元資料與工程預設", - "Output Location": "建置產物輸出位置", - "Preferences & System Behavior": "建置偏好與系統行為", - "Build Engine:": "建置引擎:", - "Python Interpreter:": "Python 解譯器:", - "Output Name:": "輸出程式名稱:", - "App Icon:": "應用程式圖示:", - "Primary PIP Index:": "PIP 主鏡像源:", - "Backup PIP Index:": "PIP 備用源:", - "Requirements File:": "依賴清單 (requirements.txt):", - "Hidden Imports:": "隱式匯入 (Hidden Imports):", - "Exclude Modules:": "排除模組 (Excludes):", - "CPU Cores:": "編譯並行 CPU 核心數:", - "UPX Path:": "UPX 工具路徑:", - "PyInstaller Version:": "PyInstaller 版本:", - "Nuitka Version:": "Nuitka 版本:", - "Pipreqs Version:": "Pipreqs 版本:", - "Version:": "版本號:", - "Author/Company:": "開發者/公司:", - "Description:": "程式描述:", - "Output Rule:": "輸出規則:", - "Target Directory:": "目標目錄:", - "One-File Mode (--onefile)": "單一檔案模式 (--onefile)", - "Hide Console (--noconsole)": "隱藏主控台視窗 (--noconsole)", - "Use Virtual Environment (Recommended)": "使用獨立虛擬環境 (推薦)", - "Install requirements.txt": "安裝 requirements.txt 依賴", - "Analyze Dependencies (pipreqs)": "自動分析依賴項 (pipreqs)", - "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": "建置後清理暫存快取", - "Sound Notification": "建置完成提示音", + "Engine": "建置引擎", + "Dependencies": "依賴管理", + "Resources": "附加資源", + "Optimization": "效能優化", + "Package Map": "套件名稱對映", + "Execution Log": "執行日誌", + "Loaded: {filename}": "已載入: {filename}", + "Parsing metadata...": "解析元資料...", + "Ready, waiting for build.": "就緒,等待建置", + "Initializing build...": "初始化建置...", + "Preparing engine...": "準備引擎...", + "Build Successful": "建置成功", + "Open output directory or reset workspace.": "打開輸出目錄或重置工作區", + "Build Failed": "建置失敗", + "Check log output below for troubleshooting.": "檢查日誌排查錯誤", + "Status: Ready": "狀態: 就緒", + "Status: Parsing {filename}...": "狀態: 解析 {filename}...", + "Status: Loaded {filename}{mode}": "狀態: 已載入 {filename}{mode}", + "Status: Packaging ({engine}) ...": "狀態: 建置中 ({engine})...", + "Status: Build Completed": "狀態: 建置完成", + "Status: Build Failed": "狀態: 建置失敗", + "Status: Workspace Reset": "狀態: 工作區已重置", + " [Console]": " [主控台]", + " [No Console]": " [無主控台]", + "Start Build": "開始建置", + "Stop Build": "停止建置", + "Open Directory": "打開目錄", + "Rebuild": "重新建置", + "Save & Return": "儲存並返回", "Browse": "瀏覽...", - "AST Scan": "AST 語法樹解析", + "AST Scan": "AST 掃描", "Add File": "新增檔案", "Add Dir": "新增目錄", "Remove Selected": "移除選取", "Clear All": "清除全部", "Add Mapping": "新增對映", - "Restore Defaults": "還原預設值", - "Export Preset...": "匯出預設設定...", - "Import Preset...": "匯入預設設定...", - "Source File Directory": "原始碼檔案所在目錄", - "Custom Directory": "自訂目錄", - "Import Name": "程式碼匯入名 (import)", - "PyPI Package Name": "PyPI 套件名 (pip)", + "Restore Defaults": "還原預設", + "Export Preset...": "匯出預設...", + "Import Preset...": "匯入預設...", "Reset to Default Config": "重置為預設設定", - "Cancel & Return": "放棄修改並返回", + "Cancel & Return": "取消並返回", "Configure Build Settings": "設定建置參數", - "Toggle Execution Log": "顯示/隱藏執行日誌", + "Toggle Execution Log": "顯示/隱藏日誌", + "Detailed Mode": "詳細模式", + "Concise Mode": "精簡模式", "Copy": "複製", "Select All": "全選", "Clear Log": "清除日誌", "Export Log...": "匯出日誌...", - "A Cross-platform Python Packaging GUI Tool based on PyInstaller & Nuitka": "基於 PyInstaller 與 Nuitka 的 Python 跨平台打包 GUI 工具", - " [Console]": " [主控台]", - " [No Console]": " [無主控台]", + "Engine & Environment": "建置引擎與環境", + "Execution Mode": "執行模式", + "Mirrors & Scanner": "鏡像源與掃描設定", + "Additional Resources (Drag & Drop Supported)": "附加資源 (支援拖放)", + "Performance Optimization": "效能優化", + "Lock Core Dependencies": "鎖定核心依賴", + "Package Name Mappings": "套件名稱對映", + "UI Language:": "介面語言:", + "App Metadata & Presets": "元資料與預設", + "Output Location": "輸出位置", + "Preferences & System Behavior": "偏好與系統行為", + "Build Engine:": "建置引擎:", + "Python Interpreter:": "Python 解譯器:", + "Output Name:": "輸出名稱:", + "App Icon:": "應用程式圖示:", + "Primary PIP Index:": "主 PIP 源:", + "Backup PIP Index:": "備用 PIP 源:", + "Requirements File:": "依賴清單 (requirements):", + "Hidden Imports:": "隱式匯入 (hidden-imports):", + "Exclude Modules:": "排除模組 (excludes):", + "CPU Cores:": "CPU 核心數:", + "UPX Path:": "UPX 路徑:", + "PyInstaller Version:": "PyInstaller 版本:", + "Nuitka Version:": "Nuitka 版本:", + "Pipreqs Version:": "Pipreqs 版本:", + "Version:": "版本:", + "Author/Company:": "開發者/公司:", + "Description:": "描述:", + "Output Rule:": "輸出規則:", + "Target Directory:": "目標目錄:", + "Source File Directory": "原始碼檔案目錄", + "Custom Directory": "自訂目錄", + "Import Name": "匯入名", + "PyPI Package Name": "PyPI 套件名", "File": "檔案", "Directory": "目錄", - "PyInstaller: Fast build speed, excellent compatibility. Ideal for rapid iteration.": "PyInstaller: 建置速度快,相容性極佳。適合快速迭代與常規應用。", - "Nuitka: Compiles to native C/C++ binary. Better performance and source code protection.": "Nuitka: 編譯為原生 C/C++ 二進位檔。執行效能更好,且具備原始碼防反編譯保護。", + "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)", + "Hide Console (--noconsole)": "隱藏主控台 (--noconsole)", + "Use Virtual Environment (Recommended)": "使用虛擬環境 (推薦)", + "Install requirements.txt": "安裝 requirements.txt", + "Analyze Dependencies (pipreqs)": "分析依賴 (pipreqs)", + "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": "建置後清理快取", + "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": "留空則自動搜尋當前目錄下的 requirements.txt", + "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": "留空則從 PATH 環境變數自動偵測", - "Dynamically exclude redundant dependencies in build environment, improving speed and reducing size.": "動態排除建置環境中的冗餘依賴,提升建置速度並縮減產物容量。", - "Double-click to edit target path; Drag & drop supported": "雙擊修改目標路徑;支援直接從桌面拖放檔案或資料夾", + "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": "雙擊編輯目標路徑;支援拖放", + "PyInstaller — Bundles Python interpreter and bytecode. Fast build speed, zero configuration (no C compiler needed), and excellent compatibility.": "PyInstaller — 打包 Python 解譯器與位元組碼。建置快,零配置(無需 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:Download Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility": "
Python {ver} 平台支援:下載 Python
✔ Windows 7    ✔ Windows 8/8.1    ✔ Windows 10/11    ✔ macOS 10.9+    ✔ Linux
相容舊系統 支援 Windows 7 及舊版作業系統", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux": "
Python {ver} 平台支援:下載 Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10/11    ✔ macOS 10.9+    ✔ Linux", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 supported out-of-the-box": "
Python {ver} 平台支援:下載 Python
✖ Windows 7    ✖ Windows 8/8.1    ✔ Windows 10/11    ✔ macOS 10.13+    ✔ Linux
Nuitka 開箱支援 MinGW64 編譯器", + "
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requires MSVC / Clang / Zig (MinGW64 unsupported)": "
Python {ver} 平台支援:下載 Python
✖ Windows 7    ✖ Windows 8/8.1    ✔ Windows 10/11    ✔ macOS 10.15+    ✔ Linux
Nuitka 需 MSVC / Clang / Zig (不支援 MinGW64)", + "
Python InterpreterDownload Python
Auto-detecting system environment for Windows, macOS & Linux...": "
Python 解譯器下載 Python
自動偵測系統環境 (Win/macOS/Linux)...", + "[INFO] Build Cancelled.": "[INFO] 建置已取消。", + "[INFO] Performing pre-flight environment checks...": "[INFO] 執行環境安全檢查...", + "[INFO] Analyzing source code and project dependencies...": "[INFO] 分析原始碼與依賴...", + "[INFO] Initializing isolated build environment...": "[INFO] 初始化隔離建置環境...", + "[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 pipreqs...": "[INFO] pipreqs 掃描依賴...", + "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] 安裝建置引擎 [{pkg}] 及核心依賴...", + "[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}", + "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] 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] Writing application icon...": "[INFO] 寫入應用程式圖示...", + "[INFO] Application icon written successfully.": "[INFO] 應用程式圖示寫入成功。", + "[INFO] Lite mode enabled, excluding non-essential modules...": "[INFO] 啟用精簡模式,排除非必要模組...", + "[INFO] Enabled Nuitka optimization directives...": "[INFO] 啟用 Nuitka 優化指令...", + "[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,建議 >= 5.0 GB)。", + "[WARN] Memory allocation exception caught (ZstdError / OOM). Triggering memory protection fallback: Retrying in single-thread mode...": "[WARN] 捕獲記憶體異常 (OOM)。切換單執行緒重試...", + "[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] Parse pipreqs output warning: {error}": "[WARN] 解析 pipreqs 警告: {error}", + "[WARN] Command timeout (>{timeout}s)": "[WARN] 命令超時 (>{timeout}s)", + "[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] 建置中止: 磁碟空間不足。請清理至少 5 GB 空間後重試。", + "[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)。", + "[ERROR] Python interpreter is invalid or not found: {path}": "[ERROR] Python 解譯器無效或未找到: {path}", + "[ERROR] The specified icon file does not exist: {path}": "[ERROR] 指定的應用程式圖示檔案不存在: {path}", + "[ERROR] Additional resource file/directory not found: {path}": "[ERROR] 附加資源檔案不存在: {path}", + "[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.": "[語法異常] 原始碼存在語法錯誤,建置中止:\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] 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}", + "Dependency Missing Warning: {pkgs} failed to install. Check log for details.": "依賴缺失警告: {pkgs} 安裝失敗,詳見日誌。", "Package mappings have been reset to defaults.": "套件名稱對映已重置為預設值。", "Config preset exported to: {path}": "設定預設檔已匯出至: {path}", "Config preset imported successfully.": "設定預設檔已成功匯入。", "AST scan completed, found {count} dependencies.": "AST 解析完成,共發現 {count} 項依賴。", - "No log content.": "當前無日誌內容。", + "No log content.": "無日誌內容。", "Log saved to: {path}": "日誌已儲存至: {path}", "Attention: Please check the log for details.": "注意:發生異常,請檢視日誌細節。", - "[INFO] Initializing isolated build environment...": "[INFO] 正在初始化隔離建置環境...", - "[INFO] Python interpreter path: {path}": "[INFO] Python 解譯器路徑: {path}", - "[INFO] Creating virtual environment...": "[INFO] 正在建立虛擬環境 (venv)...", - "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] 虛擬環境建立失敗。當前 Python 環境可能缺少必要模組或權限受限。", - "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] 正在同步並升級 pip 套件管理器...", - "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] 正在安裝建置引擎 [{pkg}] 及核心編譯依賴...", - "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Nuitka 提示:若首次建置提示下載 GCC/MinGW 編譯器,請保持網路連線穩定。", - "[INFO] Dependency installation [1/3]: Installing declared dependencies ({filename})...": "[INFO] 依賴安裝 [1/3]: 正在安裝聲明依賴 ({filename})...", - "[INFO] Dependency installation [2/3]: Calling pipreqs to analyze project dependencies...": "[INFO] 依賴安裝 [2/3]: 正在調用 pipreqs 分析專案依賴...", - "[INFO] Enabled single-file sandbox mode: parsing current script only to prevent pollution from other files.": "[INFO] 已啟用單一檔案沙盒模式:僅對當前腳本解析,防止同目錄其他檔案污染。", - "[WARN] Enabled full-directory scan mode: scanning all Python files in the current directory...": "[WARN] 已允許全目錄掃描模式:正在掃描當前目錄下所有 Python 檔案...", - "[INFO] Dependency analysis service source address: {server}": "[INFO] 依賴分析服務源地址: {server}", - "[INFO] Querying versions of dependency libraries, please wait...": "[INFO] 正在查詢各依賴庫的版本,請稍候...", - "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] 正在切換至備用 PyPI 查詢源重新檢索: {url}", - "[INFO] Attempting to scan using compatible encoding...": "[INFO] 正在嘗試利用相容編碼進行掃描...", - "[WARN] pipreqs skipped deep scan, dependencies will be supplemented by AST scanning engine.": "[WARN] pipreqs 已跳過深度掃描,將由 AST 掃描引擎補全依賴。", - "[INFO] Dependency installation [3/3]: Extracting implicit dependencies via AST static scan...": "[INFO] 依賴安裝 [3/3]: 正在透過 AST 靜態掃描擷取隱式依賴...", - "[INFO] Parsing and installing implicit import dependencies: {pkgs}": "[INFO] 正在解析並安裝隱式匯入依賴: {pkgs}", - "[ERROR] ⚠️ Warning: Failed to install dependency [{pkg}]! May cause runtime crash.": "[ERROR] ⚠️ 警告:依賴庫 [{pkg}] 安裝失敗!可能導致打包後的軟體執行時崩潰。", - "[INFO] Starting {engine} engine to compile binary files...": "[INFO] 正在啟動 {engine} 引擎,開始編譯二進位檔案...", - "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] 偵測到本地 MSVC 環境,優先使用原生 C++ 編譯器。", - "[INFO] Lite mode enabled, executing size reduction strategy...": "[INFO] 已開啟精簡模式,正在執行體積縮減策略...", - "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] 強烈建議勾選 [虛擬環境] 以最大化精簡效果。", - "[INFO] Enabled Nuitka optimization directives...": "[INFO] 已啟用 Nuitka 優化指令 (-OO)...", - "[INFO] Core compilation completed, extracting and archiving built files...": "[INFO] 編譯核心完成,正在擷取並歸檔建置檔案...", - "[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}", - "[INFO] Validating output files and generating final product...": "[INFO] 正在校驗輸出檔案並產生最終產物...", - "[INFO] Build log exported to: {path}": "[INFO] 建置日誌已匯出至: {path}", - "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] 編譯已完成,輸出路徑: {path}", - "[Syntax Error] Source program has syntax or indentation errors!\n - File: {file}\n - Type: {type}\n - Line: near {line}\n - Desc: {desc}\n\nTip: This is an error in the source code logic. Ensure it runs locally before compiling.": "[語法異常] 原始程式碼存在語法不合規或縮排異常錯誤!\n - 錯誤檔案: {file}\n - 異常類型: {type}\n - 異常位置: 第 {line} 行附近\n - 詳細描述: {desc}\n\n提示: 此問題為原始碼邏輯本身錯誤。請在確保本地執行無誤後,再次執行編譯流程。", - "\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!": "\n!!!!!!!!!! [診斷追蹤: 以下是由於該步驟執行異常產生的完整原始日誌] !!!!!!!!!!", - "[FAILED] Compilation interrupted with exceptions, refer to the log for troubleshooting.": "[FAILED] 編譯異常中斷,請參閱日誌以定位排查。", - "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] 正在釋放空間,清理暫存建置環境...", + "Are you sure you want to reset all preferences to default?": "確定要將所有偏好設定重置為預設值嗎?", + "Global configuration has been reset.": "全域設定已重置為預設值。", "\\nProgram execution completed, press Enter to exit...": "\\n程式執行完畢,按下 Enter 鍵退出...", - "[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt 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 during pre-build:\n\n 👉 {pkgs}\n\n⚠️ Tip: The program might crash at runtime due to missing modules!": "[ERROR] 建置已完成,但預建置階段以下依賴安裝失敗:\n\n 👉 {pkgs}\n\n⚠️ 提示:程式執行時可能會因缺少模組導致崩潰!" -} \ No newline at end of file + "Project-specific. Not saved to global preferences. Use 'Export Preset' to save config.": "提示:此資源僅對當前專案生效。若需長期複用請使用「匯出預設」。", + "GitHub Repository": "GitHub 倉庫", + "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!

QPyPack 需要 Python 環境才能編譯。
如果您尚未安裝,請前往官網下載(請務必勾選 'Add Python.exe to PATH')。", + "Download Python": "前往下載 Python", + "Unknown": "未知", + "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "將 Python 腳本 (.py/.pyw) 拖放至此\n或點擊瀏覽..." +} diff --git a/qpypack/main.py b/qpypack/main.py index c8563f2..e4179dc 100644 --- a/qpypack/main.py +++ b/qpypack/main.py @@ -13,6 +13,8 @@ import struct import threading import configparser import locale +import ast +from concurrent.futures import ThreadPoolExecutor from pathlib import Path if os.name == 'nt': @@ -37,7 +39,7 @@ from PySide6.QtCore import (Qt, QThread, Signal, QPropertyAnimation, QEasingCurv QParallelAnimationGroup, QFileInfo, QVariantAnimation, QTimer, QPointF, QRectF, QRect, QSize, QUrl, QLocale, QObject) from PySide6.QtGui import (QFont, QDragEnterEvent, QDropEvent, QIcon, QPixmap, - QPainter, QColor, QPen, QImage, QImageWriter) + QPainter, QColor, QPen, QImage, QImageWriter, QDesktopServices) from PySide6.QtSvg import QSvgRenderer try: @@ -47,176 +49,271 @@ except ImportError: HAS_QT_AUDIO = False __app_name__ = "QPyPack" -__version__ = "2.6.2" +__version__ = "2.7.0" __author__ = "QwejayHuang" __company__ = "QwejayHuang" -__description__ = "Cross-platform Python Application Packaging Tool" +__description__ = "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka" _CONFIG_DIR = Path.home() / ".qpypack" _CONFIG_DIR.mkdir(parents=True, exist_ok=True) CONFIG_FILE = (_CONFIG_DIR / "config.ini").as_posix() ZH_CN_DICT = { - "Drag & Drop Python script (.py/.pyw) here\nor Click to Browse": "将 Python 脚本 (.py/.pyw) 拖放至此\n或 点击浏览文件", - "Auto-parse dependencies, resources, and implicit imports": "自动解析依赖、附加资源及隐式导入", + # 1. 源镜像名称 (PIP Mirrors) + "PyPI Official (Global Default)": "PyPI 官方源 (默认)", + "Python TestPyPI": "TestPyPI 测试源", + "AWS PyPI Mirror (US/EU)": "AWS PyPI 镜像 (美/欧)", + "Tsinghua University (China)": "清华大学镜像", + "Aliyun Cloud (China)": "阿里云镜像", + "Tencent Cloud (China)": "腾讯云镜像", + "Huawei Cloud (China)": "华为云镜像", + "USTC (China)": "中科大镜像", + + # 2. 软件元数据与标语 (Metadata & Taglines) + "Modern Cross-Platform Python Application Packager": "现代化的跨平台 Python 应用打包工具", + "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka": "基于 PyInstaller 与 Nuitka 的现代化跨平台 Python 打包工具", + "Python Packaging, Reimagined.": "重新定义 Python 应用打包体验", + "Drop Python source code to start": "拖入 Python 源码,即刻启程", + + # 3. 导航与选项卡 (Tabs & Navigation) + "Build Settings": "构建设置", + "Preferences": "偏好设置", + "About": "关于", + "Engine": "构建引擎", + "Dependencies": "依赖管理", + "Resources": "附加资源", + "Optimization": "性能优化", + "Package Map": "包名映射", + "Execution Log": "执行日志", + + # 4. 主界面状态与引导 (Main UI & Status Prompts) "Loaded: {filename}": "已载入: {filename}", - "Parsing metadata...": "正在解析元数据...", - "Ready, waiting for build.": "就绪,等待构建。", + "Parsing metadata...": "解析元数据...", + "Ready, waiting for build.": "就绪,等待构建", "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.": "请查看下方日志以排查错误。", - "Status: Ready": " 状态: 准备就绪", - "Status: Parsing {filename}...": " 状态: 正在解析 {filename}...", - "Status: Loaded {filename}{mode}": " 状态: 已载入 {filename}{mode}", - "Status: Packaging ({engine}) ...": " 状态: 构建中 ({engine}) ...", - "Status: Build Completed": " 状态: 构建完成", - "Status: Build Failed": " 状态: 构建失败", - "Status: Workspace Reset": " 状态: 工作区已重置", - "Start Build": " 开始构建", - "Stop Build": " 停止构建", - "Open Directory": " 打开目录", - "Rebuild": " 重新构建", - "Save & Return": " 保存并返回", - "Build Settings": "构建设置", - "Preferences": "首选项", - "About": "关于", - "🚀 Engine": "🚀 构建引擎", - "📦 Dependencies": "📦 依赖管理", - "📂 Resources": "📂 附加资源", - "⚡ Optimization": "⚡ 性能优化", - "🗺️ Package Map": "🗺️ 包名映射", - "Engine & Environment": "构建引擎与环境", - "Execution Mode": "运行模式", - "Mirrors & Scanner": "镜像源与扫描配置", - "Additional Resources (Drag & Drop Supported)": "附加资源文件与目录 (支持桌面拖拽)", - "Performance Optimization": "性能与编译优化", - "Lock Core Dependencies": "锁定核心依赖版本", - "Package Name Mappings": "第三方库包名映射表", - "UI Language:": "界面语言:", - "App Metadata & Presets": "应用元数据与工程预设", - "Output Location": "构建产物输出位置", - "Preferences & System Behavior": "构建偏好与系统行为", - "Build Engine:": "构建引擎:", - "Python Interpreter:": "Python 解释器:", - "Output Name:": "输出名称:", - "App Icon:": "程序图标:", - "Primary PIP Index:": "PIP 主镜像源:", - "Backup PIP Index:": "PIP 备用源:", - "Requirements File:": "依赖清单 (requirements):", - "Hidden Imports:": "隐式导入 (Hidden Imports):", - "Exclude Modules:": "排除模块 (Excludes):", - "CPU Cores:": "编译并发核心数:", - "UPX Path:": "UPX 路径:", - "PyInstaller Version:": "PyInstaller 版本:", - "Nuitka Version:": "Nuitka 版本:", - "Pipreqs Version:": "Pipreqs 版本:", - "Version:": "版本号:", - "Author/Company:": "开发者/公司:", - "Description:": "程序描述:", - "Output Rule:": "输出规则:", - "Target Directory:": "目标目录:", - "One-File Mode (--onefile)": "单文件模式 (--onefile)", - "Hide Console (--noconsole)": "隐藏控制台 (--noconsole)", - "Use Virtual Environment (Recommended)": "使用独立虚拟环境 (推荐)", - "Install requirements.txt": "安装 requirements.txt", - "Analyze Dependencies (pipreqs)": "自动分析依赖 (pipreqs)", - "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": "构建后清理临时缓存", - "Sound Notification": "构建完成提示音", - "Browse": "浏览", - "AST Scan": "AST分析", + "Check log output below for troubleshooting.": "检查日志排查错误", + "Status: Ready": "状态: 就绪", + "Status: Parsing {filename}...": "状态: 解析 {filename}...", + "Status: Loaded {filename}{mode}": "状态: 已载入 {filename}{mode}", + "Status: Packaging ({engine}) ...": "状态: 构建中 ({engine})...", + "Status: Build Completed": "状态: 构建完成", + "Status: Build Failed": "状态: 构建失败", + "Status: Workspace Reset": "状态: 工作区已重置", + " [Console]": " [控制台]", + " [No Console]": " [无控制台]", + + # 5. 操作按钮与右键菜单 (Buttons & Context Menus) + "Start Build": "开始构建", + "Stop Build": "停止构建", + "Open Directory": "打开目录", + "Rebuild": "重新构建", + "Save & Return": "保存并返回", + "Browse": "浏览...", + "AST Scan": "AST 扫描", "Add File": "添加文件", "Add Dir": "添加目录", - "Remove Selected": "移除选中", - "Clear All": "清空", + "Remove Selected": "移除选中项", + "Clear All": "清空全部", "Add Mapping": "添加映射", "Restore Defaults": "恢复默认", "Export Preset...": "导出预设...", "Import Preset...": "导入预设...", - "Source File Directory": "源文件所在目录", - "Custom Directory": "自定义目录", - "Import Name": "代码导入名", - "PyPI Package Name": "PyPI 包名", - "Reset to Default Config": "重置为默认配置", - "Cancel & Return": "放弃修改并返回", - "Configure Build Settings": "配置构建参数", - "Toggle Execution Log": "显示/隐藏执行日志", + "Reset to Default Config": "重置默认配置", + "Cancel & Return": "取消并返回", + "Configure Build Settings": "构建设置", + "Toggle Execution Log": "切换日志", + "Detailed Mode": "详细日志", + "Concise Mode": "精简日志", "Copy": "复制", "Select All": "全选", "Clear Log": "清空日志", "Export Log...": "导出日志...", - "A Cross-platform Python Packaging GUI Tool based on PyInstaller & Nuitka": "基于 PyInstaller 和 Nuitka 的 Python 跨平台打包 GUI 工具", - " [Console]": " [控制台]", - " [No Console]": " [无控制台]", + + # 6. 设置分组卡片与表单标签 (Card Titles & Form Labels) + "Engine & Environment": "引擎与环境", + "Execution Mode": "执行模式", + "Mirrors & Scanner": "镜像与扫描", + "Additional Resources (Drag & Drop Supported)": "附加资源 (支持拖拽)", + "Performance Optimization": "性能优化", + "Lock Core Dependencies": "锁定核心依赖", + "Package Name Mappings": "包名映射", + "UI Language:": "界面语言:", + "App Metadata & Presets": "元数据与预设", + "Output Location": "输出位置", + "Preferences & System Behavior": "偏好与行为", + "Build Engine:": "构建引擎:", + "Python Interpreter:": "Python 解释器:", + "Output Name:": "输出名称:", + "App Icon:": "应用图标:", + "Primary PIP Index:": "主 PIP 源:", + "Backup PIP Index:": "备用 PIP 源:", + "Requirements File:": "依赖清单 (requirements):", + "Hidden Imports:": "隐式导入 (hidden-imports):", + "Exclude Modules:": "排除模块 (excludes):", + "CPU Cores:": "CPU 核心数:", + "UPX Path:": "UPX 路径:", + "PyInstaller Version:": "PyInstaller 版本:", + "Nuitka Version:": "Nuitka 版本:", + "Pipreqs Version:": "Pipreqs 版本:", + "Version:": "版本:", + "Author/Company:": "作者/公司:", + "Description:": "描述:", + "Output Rule:": "输出规则:", + "Target Directory:": "目标目录:", + "Source File Directory": "源文件目录", + "Custom Directory": "自定义目录", + "Import Name": "导入名", + "PyPI Package Name": "PyPI 包名", "File": "文件", "Directory": "目录", - "PyInstaller: Fast build speed, excellent compatibility. Ideal for rapid iteration.": "PyInstaller: 构建速度快,兼容性极佳。适合快速迭代与常规应用。", - "Nuitka: Compiles to native C/C++ binary. Better performance and source code protection.": "Nuitka: 编译为原生 C/C++ 二进制。运行性能更好,且具有源码防反编译保护。", - "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": "双击修改目标路径;支持直接从桌面拖拽文件或文件夹至此区域", - "Package mappings have been reset to defaults.": "包名映射已重置为默认值。", - "Config preset exported to: {path}": "配置预设已导出至: {path}", - "Config preset imported successfully.": "配置预设已成功导入。", - "AST scan completed, found {count} dependencies.": "AST 解析完成,共发现 {count} 项依赖。", - "No log content.": "当前无日志内容。", - "Log saved to: {path}": "日志已保存至: {path}", - "Attention: Please check the log for details.": "注意:发生异常,请查看日志详情。", - "[INFO] Initializing isolated build environment...": "[INFO] 正在初始化隔离构建环境...", - "[INFO] Python interpreter path: {path}": "[INFO] Python 解释器路径: {path}", - "[INFO] Creating virtual environment...": "[INFO] 正在创建虚拟环境...", - "[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions.": "[ERROR] 虚拟环境创建失败。当前 Python 环境可能缺失必要模块或权限受限。", - "[INFO] Synchronizing and upgrading pip package manager...": "[INFO] 正在同步并升级 pip 包管理器...", - "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] 正在安装构建引擎 [{pkg}] 及核心编译依赖...", - "[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.": "[INFO] Nuitka 提示:若首次构建提示下载 GCC/MinGW 编译器,请保持网络正常。", - "[INFO] Dependency installation [1/3]: Installing declared dependencies ({filename})...": "[INFO] 依赖安装 [1/3]: 正在安装声明依赖 ({filename})...", - "[INFO] Dependency installation [2/3]: Calling pipreqs to analyze project dependencies...": "[INFO] 依赖安装 [2/3]: 正在调用 pipreqs 分析项目依赖...", - "[INFO] Enabled single-file sandbox mode: parsing current script only to prevent pollution from other files.": "[INFO] 已启用单文件沙盒模式:仅对当前脚本解析,防止同目录其他文件污染。", - "[WARN] Enabled full-directory scan mode: scanning all Python files in the current directory...": "[WARN] 已允许全目录扫描模式:正在扫描当前目录下所有 Python 文件...", - "[INFO] Dependency analysis service source address: {server}": "[INFO] 依赖分析服务源地址: {server}", - "[INFO] Querying versions of dependency libraries, please wait...": "[INFO] 正在查询各依赖库的版本,请稍候...", - "[INFO] Switching to backup PyPI source for retrieval: {url}": "[INFO] 正在切换至备用 PyPI 查询源重新检索: {url}", - "[INFO] Attempting to scan using compatible encoding...": "[INFO] 正在尝试利用兼容编码进行扫描...", - "[WARN] pipreqs skipped deep scan, dependencies will be supplemented by AST scanning engine.": "[WARN] pipreqs 已跳过深度扫描,将由 AST 扫描引擎补全依赖。", - "[INFO] Dependency installation [3/3]: Extracting implicit dependencies via AST static scan...": "[INFO] 依赖安装 [3/3]: 正在通过 AST 静态扫描提取隐式依赖...", - "[INFO] Parsing and installing implicit import dependencies: {pkgs}": "[INFO] 正在解析并安装隐式导入依赖: {pkgs}", - "[ERROR] ⚠️ Warning: Failed to install dependency [{pkg}]! May cause runtime crash.": "[ERROR] ⚠️ 警告:依赖库 [{pkg}] 安装失败!可能导致打包后的软件运行时崩溃。", - "[INFO] Starting {engine} engine to compile binary files...": "[INFO] 正在启动 {engine} 引擎,开始编译二进制文件...", - "[INFO] Found local MSVC environment, prioritizing native C++ compiler.": "[INFO] 发现本地 MSVC 环境,优先使用原生 C++ 编译器。", - "[INFO] Lite mode enabled, executing size reduction strategy...": "[INFO] 已开启精简模式,正在执行体积缩减策略...", - "[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.": "[WARN] 强烈建议勾选 [虚拟环境] 以最大化精简效果。", - "[INFO] Enabled Nuitka optimization directives...": "[INFO] 已启用 Nuitka 优化指令...", - "[INFO] Core compilation completed, extracting and archiving built files...": "[INFO] 编译核心完成,正在提取并归档编译文件...", - "[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}", - "[INFO] Validating output files and generating final product...": "[INFO] 正在校验输出文件并生成最终产物...", - "[INFO] Build log exported to: {path}": "[INFO] 编译日志已导出至: {path}", - "[SUCCESS] Compilation completed, output path: {path}": "[SUCCESS] 编译已完成,输出路径: {path}", - "[Syntax Error] Source program has syntax or indentation errors!\n - File: {file}\n - Type: {type}\n - Line: near {line}\n - Desc: {desc}\n\nTip: This is an error in the source code logic. Ensure it runs locally before compiling.": "[语法异常] 源程序存在语法不合规或缩进异常错误!\n - 错误源文件: {file}\n - 异常类型: {type}\n - 异常位置: 第 {line} 行附近\n - 错误描述: {desc}\n\n提示: 此问题为源码逻辑本身错误。请在确保本地运行无误后,再次执行编译流程。", - "\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!": "\n!!!!!!!!!! [诊断回溯: 以下是由于该环节执行异常产生的完整原始日志] !!!!!!!!!!", - "[FAILED] Compilation interrupted with exceptions, refer to the log for troubleshooting.": "[FAILED] 编译异常中断,请参阅日志以定位排查。", - "[INFO] Freeing up space, cleaning temporary build environment...": "[INFO] 正在释放空间,清理临时构建环境...", - "\\nProgram execution completed, press Enter to exit...": "\\n程序执行完毕,按回车键退出...", + "Edit Path": "编辑路径", + "Target relative path:": "目标相对路径:", + "Import name (e.g. cv2):": "导入名 (如 cv2):", + "PyPI package name for [{imp_name}]:": "[{imp_name}] 对应 PyPI 包名:", + + # 7. 复选框、占位符与悬停提示 (Checkboxes, Placeholders & Tooltips) + "One-File Mode (--onefile)": "单文件 (--onefile)", + "Hide Console (--noconsole)": "隐藏控制台 (--noconsole)", + "Use Virtual Environment (Recommended)": "使用虚拟环境 (推荐)", + "Install requirements.txt": "安装 requirements.txt", + "Analyze Dependencies (pipreqs)": "分析依赖 (pipreqs)", + "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": "构建后清理缓存", + "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": "留空自动检索 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": "双击编辑目标路径;支持拖拽", + + # 8. 引擎说明与平台兼容性矩阵 (Engine Help & Platform Matrices) + "PyInstaller — Bundles Python interpreter and bytecode. Fast build speed, zero configuration (no C compiler needed), and excellent compatibility.": + "PyInstaller — 打包 Python 解释器与字节码。构建快,零配置(无需 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:Download Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility': + '
Python {ver} 平台支持:下载 Python
✔ Windows 7    ✔ Windows 8/8.1    ✔ Windows 10/11    ✔ macOS 10.9+    ✔ Linux
兼容旧系统 支持 Windows 7 及旧版操作系统', + + '
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux': + '
Python {ver} 平台支持:下载 Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10/11    ✔ macOS 10.9+    ✔ Linux', + + '
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 supported out-of-the-box': + '
Python {ver} 平台支持:下载 Python
✖ Windows 7    ✖ Windows 8/8.1    ✔ Windows 10/11    ✔ macOS 10.13+    ✔ Linux
Nuitka 开箱支持 MinGW64 编译器', + + '
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requires MSVC / Clang / Zig (MinGW64 unsupported)': + '
Python {ver} 平台支持:下载 Python
✖ Windows 7    ✖ Windows 8/8.1    ✔ Windows 10/11    ✔ macOS 10.15+    ✔ Linux
Nuitka 需 MSVC / Clang / Zig (不支持 MinGW64)', + + '
Python InterpreterDownload Python
Auto-detecting system environment for Windows, macOS & Linux...': + '
Python 解释器下载 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] 分析源码与依赖...", + "[INFO] Initializing isolated build environment...": "[INFO] 初始化构建环境...", + "[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 pipreqs...": "[INFO] pipreqs 扫描依赖...", + "[INFO] Installing build engine [{pkg}] and core compilation dependencies...": "[INFO] 安装构建引擎 [{pkg}] 及核心依赖...", + "[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}": "依赖声明 ({count}): {pkgs}", + "Declared in requirements.txt: None": "依赖声明: 无", + "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] 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] Writing application icon...": "[INFO] 写入应用图标...", + "[INFO] Application icon written successfully.": "[INFO] 应用图标写入成功。", + "[INFO] Lite mode enabled, excluding non-essential modules...": "[INFO] 启用精简模式,排除非必要模块...", + "[INFO] Enabled Nuitka optimization directives...": "[INFO] 启用 Nuitka 优化指令...", + "[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,推荐 >= 5.0 GB)。", + "[WARN] Memory allocation exception caught (ZstdError / OOM). Triggering memory protection fallback: Retrying in single-thread mode...": "[WARN] 捕获内存分配异常 (ZstdError/OOM)。切换单线程重试...", + "[WARN] System low memory detected (zstd memory allocation failed). Automatically retrying in single-thread low-memory mode...": "[WARN] 内存不足 (zstd 分配失败),切换单线程重试...", + "[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] Parse pipreqs output warning: {error}": "[WARN] 解析 pipreqs 警告: {error}", + "[WARN] Command timeout (>{timeout}s)": "[WARN] 命令超时 (>{timeout}s)", + "[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] 构建中止: 磁盘空间不足。请清理至少 5 GB 空间后重试。", + "[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)。至少需 0.5 GB 才能安全初始化环境。", + "[ERROR] Python interpreter is invalid or not found: {path}": "[ERROR] Python 解释器无效或未找到: {path}", + "[ERROR] The specified icon file does not exist: {path}": "[ERROR] 指定的应用图标文件不存在: {path}", + "[ERROR] Additional resource file/directory not found: {path}": "[ERROR] 附加数据中的文件/目录不存在: {path}", + "[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] 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 during pre-build:\n\n 👉 {pkgs}\n\n⚠️ Tip: The program might crash at runtime due to missing modules!": "[ERROR] 构建已完成,但预构建阶段以下依赖安装失败:\n\n 👉 {pkgs}\n\n⚠️ 提示:程序运行时可能会因缺少模块导致崩溃!" + "[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}", + "Dependency Missing Warning: {pkgs} failed to install. Check log for details.": "依赖缺失警告: {pkgs} 安装失败,详情见日志。", + "Package mappings have been reset to defaults.": "包映射已重置为默认值。", + "Config preset exported to: {path}": "配置预设已导出: {path}", + "Config preset imported successfully.": "配置预设导入成功。", + "AST scan completed, found {count} dependencies.": "AST 扫描完成,发现 {count} 个依赖。", + "No log content.": "无日志内容。", + "Log saved to: {path}": "日志已保存: {path}", + "Attention: Please check the log for details.": "注意:发生异常,请查看日志详情。", + "Are you sure you want to reset all preferences to default?": "确定要将全局偏好设置重置为默认值吗?", + "Global configuration has been reset.": "全局配置已重置为默认值。", + "\\nProgram execution completed, press Enter to exit...": "\\n程序执行完成,按回车键退出...", + "Project-specific. Not saved to global preferences. Use 'Export Preset' to save config.": + "提示:此处的资源仅对当前工作区生效(不保存到全局偏好)。如需长期复用请使用【导出预设】。", + "GitHub Repository": "GitHub 仓库", + "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!

QPyPack 需要依赖 Python 环境才能编译代码。
如果您尚未安装,请前往官网下载安装(小白提示:安装界面的底部请务必勾选 'Add Python.exe to PATH')。", + "Download Python": "前往下载 Python", + "Unknown": "未知" } class TranslationEngine(QObject): @@ -224,23 +321,23 @@ class TranslationEngine(QObject): DEFAULT_LOCALE = "en_US" LANG_META = { - "en_US": {"native": "English", "flag": "🇺🇸"}, - "zh_CN": {"native": "简体中文", "flag": "🇨🇳"}, - "zh_TW": {"native": "繁體中文", "flag": "🇹🇼"}, - "ja_JP": {"native": "日本語", "flag": "🇯🇵"}, - "ko_KR": {"native": "한국어", "flag": "🇰🇷"}, - "de_DE": {"native": "Deutsch", "flag": "🇩🇪"}, - "fr_FR": {"native": "Français", "flag": "🇫🇷"}, - "es_ES": {"native": "Español", "flag": "🇪🇸"}, - "ru_RU": {"native": "Русский", "flag": "🇷🇺"}, - "pt_BR": {"native": "Português (Brasil)", "flag": "🇧🇷"}, - "it_IT": {"native": "Italiano", "flag": "🇮🇹"}, - "nl_NL": {"native": "Nederlands", "flag": "🇳🇱"}, - "pl_PL": {"native": "Polski", "flag": "🇵🇱"}, - "tr_TR": {"native": "Türkçe", "flag": "🇹🇷"}, - "vi_VN": {"native": "Tiếng Việt", "flag": "🇻🇳"}, - "th_TH": {"native": "ไทย", "flag": "🇹🇭"}, - "ar_SA": {"native": "العربية", "flag": "🇸🇦"}, + "en_US": {"native": "English"}, + "zh_CN": {"native": "简体中文"}, + "zh_TW": {"native": "繁體中文"}, + "ja_JP": {"native": "日本語"}, + "ko_KR": {"native": "한국어"}, + "de_DE": {"native": "Deutsch"}, + "fr_FR": {"native": "Français"}, + "es_ES": {"native": "Español"}, + "ru_RU": {"native": "Русский"}, + "pt_BR": {"native": "Português (Brasil)"}, + "it_IT": {"native": "Italiano"}, + "nl_NL": {"native": "Nederlands"}, + "pl_PL": {"native": "Polski"}, + "tr_TR": {"native": "Türkçe"}, + "vi_VN": {"native": "Tiếng Việt"}, + "th_TH": {"native": "ไทย"}, + "ar_SA": {"native": "العربية"}, } def __init__(self, locales_dir: Path): @@ -305,22 +402,17 @@ class TranslationEngine(QObject): sys_native = qloc.nativeLanguageName().capitalize() or sys_code langs = {"auto": f"System Default ({sys_native})"} - all_codes = set(self.translations.keys()) | {self.DEFAULT_LOCALE, "zh_CN"} for code in sorted(all_codes): if code in self.LANG_META: - meta = self.LANG_META[code] - flag = meta.get("flag", "") - prefix = f"{flag} " if flag and flag != "🌐" else "" - langs[code] = f"{prefix}{meta['native']}" + langs[code] = self.LANG_META[code]["native"] else: qloc = QLocale(code) native_name = qloc.nativeLanguageName() if not native_name or native_name == code: native_name = qloc.languageToString(qloc.language()) - native_name = native_name.capitalize() if native_name else code - langs[code] = native_name + langs[code] = native_name.capitalize() if native_name else code return langs @@ -364,21 +456,33 @@ PYPI_MIRRORS_GLOBAL = [ DEFAULT_MAPPINGS = { 'acoustid': 'pyacoustid', 'cv2': 'opencv-python', 'PIL': 'pillow', 'Pillow': 'pillow', - 'fitz': 'pymupdf', 'skimage': 'scikit-image', 'vlc': 'python-vlc', 'pyzbar': 'pyzbar', - 'docx': 'python-docx', 'pptx': 'python-pptx', 'bs4': 'beautifulsoup4', 'barcode': 'python-barcode', - 'pdfplumber': 'pdfplumber', 'win32com': 'pywin32', 'win32api': 'pywin32', 'win32con': 'pywin32', + 'skimage': 'scikit-image', 'vlc': 'python-vlc', 'pyzbar': 'pyzbar', 'OpenGL': 'PyOpenGL', + + 'pyside6_addons': 'PySide6', 'pyside6_essentials': 'PySide6', + 'pyside6-addons': 'PySide6', 'pyside6-essentials': 'PySide6', + 'pyqt5-plugins': 'PyQt5', 'pyqt5-tools': 'PyQt5', 'pyqt5_plugins': 'PyQt5', + + 'fitz': 'pymupdf', 'docx': 'python-docx', 'pptx': 'python-pptx', + 'bs4': 'beautifulsoup4', 'barcode': 'python-barcode', 'pdfplumber': 'pdfplumber', + + 'win32com': 'pywin32', 'win32api': 'pywin32', 'win32con': 'pywin32', 'win32gui': 'pywin32', 'win32clipboard': 'pywin32', 'win32print': 'pywin32', 'win32file': 'pywin32', 'win32security': 'pywin32', 'win32process': 'pywin32', 'win32evtlog': 'pywin32', 'win32service': 'pywin32', 'win32pipe': 'pywin32', 'win32net': 'pywin32', 'win32crypt': 'pywin32', 'pythoncom': 'pywin32', - 'pywintypes': 'pywin32', 'serial': 'pyserial', 'usb': 'pyusb', 'bluetooth': 'pybluez', + 'pywintypes': 'pywin32', + + 'serial': 'pyserial', 'usb': 'pyusb', 'bluetooth': 'pybluez', 'dns': 'dnspython', + 'websocket': 'websocket-client', 'paho': 'paho-mqtt', 'socketio': 'python-socketio', + 'engineio': 'python-engineio', 'kafka': 'kafka-python', + 'sklearn': 'scikit-learn', 'yaml': 'pyyaml', 'dateutil': 'python-dateutil', 'jwt': 'PyJWT', - 'Crypto': 'pycryptodome', 'crypto': 'pycryptodome', 'OpenGL': 'PyOpenGL', 'dns': 'dnspython', - 'wx': 'wxPython', 'desktop_notifier': 'desktop-notifier', 'dotenv': 'python-dotenv', - 'telegram': 'python-telegram-bot', 'websocket': 'websocket-client', 'git': 'GitPython', - 'github': 'PyGithub', 'gitlab': 'python-gitlab', 'discord': 'discord.py', 'paho': 'paho-mqtt', - 'socketio': 'python-socketio', 'engineio': 'python-engineio', 'kafka': 'kafka-python', + 'Crypto': 'pycryptodome', 'wx': 'wxPython', 'desktop_notifier': 'desktop-notifier', + 'dotenv': 'python-dotenv', 'telegram': 'python-telegram-bot', 'git': 'GitPython', + 'github': 'PyGithub', 'gitlab': 'python-gitlab', 'discord': 'discord.py', 'OpenSSL': 'pyOpenSSL', 'ldap': 'python-ldap', 'magic': 'python-magic', 'slugify': 'python-slugify', - 'snappy': 'python-snappy' + 'snappy': 'python-snappy', + + 'attr': 'attrs', 'psycopg2': 'psycopg2-binary' } MATERIAL_ICONS = { @@ -394,10 +498,13 @@ MATERIAL_ICONS = { 'back': 'M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z', 'info': 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z', 'python': 'M12.06,1.48c-3.14,0-3.52,0.67-3.52,0.67l-0.01,2.44h3.63v0.52H7.43C5.12,5.11,4.5,6.58,4.5,8.81c0,2.34,0.38,3.48,2.3,3.48 h1.14v-1.62c0-1.48,1.23-2.65,2.7-2.65h3.69c1.47,0,2.66-1.19,2.66-2.65V3.88C16.99,1.83,14.67,1.48,12.06,1.48z M10.22,2.83 c0.41,0,0.73,0.33,0.73,0.74c0,0.41-0.33,0.74-0.73,0.74c-0.4,0-0.73-0.33-0.73-0.74C9.49,3.16,9.82,2.83,10.22,2.83z M16.71,9.89 v1.62c0,1.48-1.23,2.65-2.7,2.65H10.3c-1.47,0-2.66,1.19-2.66,2.65v1.49c0,2.05,2.32,2.41,4.92,2.41c3.14,0,3.52-0.67,3.52-0.67 l0.01-2.44h-3.63v-0.52h4.73c2.31,0,2.93-1.47,2.93-3.7c0-2.34-0.38-3.48-2.3-3.48H16.71z M13.88,18.96c0.41,0,0.73,0.33,0.73,0.74c0,0.41-0.33,0.74-0.73,0.74c-0.4,0-0.73-0.33-0.73-0.74C13.15,19.29,13.48,18.96,13.88,18.96z', - 'close': 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z' + 'close': 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z', + 'engine': 'M22.7 19l-9.1-9.1c.9-2.3.4-5-1.5-6.9-2-2-5-2.4-7.4-1.3L9 6 6 9 1.6 4.6C.4 7 1 10 3 12c1.9 1.9 4.6 2.4 6.9 1.5l9.1 9.1c.4.4 1 .4 1.4 0l2.3-2.3c.4-.4.4-1.1 0-1.3z', + 'bolt': 'M11 21h-1l1-7H7.5c-.58 0-.57-.32-.38-.66s.06-.11.08-.15C8.22 11.23 10.3 7.6 13.43 2.15c.18-.32.37-.15.37.15l-1 7h3.5c.58 0 .57.32.38.66s-.06.12-.08.16L11 21z', + 'link': 'M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z' } -def load_config(): +def load_config(retry=True): config = configparser.ConfigParser() default_mirror = "https://pypi.org/simple" default_backup = "https://test.pypi.org/simple" @@ -428,7 +535,19 @@ def load_config(): config.write(f) except: pass else: - config.read(CONFIG_FILE, encoding='utf-8') + try: + config.read(CONFIG_FILE, encoding='utf-8') + except Exception: + if retry: + try: + if os.path.exists(CONFIG_FILE): + os.remove(CONFIG_FILE) + except Exception: + pass + return load_config(retry=False) + else: + pass + if 'Mappings' not in config: config['Mappings'] = DEFAULT_MAPPINGS else: @@ -575,40 +694,39 @@ def is_cloud_locked(filepath): except Exception: return False -def extract_imports_via_ast(script_path, python_exe): - code_snippet = ( - "import ast, sys, json, re\n" - "code = ''\n" - "try:\n" - " with open(sys.argv[1], 'rb') as f: raw = f.read()\n" - " code = raw.decode('utf-8-sig') if raw.startswith(b'\\xef\\xbb\\xbf') else raw.decode('utf-8', errors='ignore')\n" - " imports = set()\n" - " for node in ast.walk(ast.parse(code)):\n" - " if isinstance(node, ast.Import): imports.update(n.name.split('.')[0] for n in node.names)\n" - " elif isinstance(node, ast.ImportFrom) and node.level == 0 and node.module: imports.add(node.module.split('.')[0])\n" - " print('__QPYPACK_RES__:' + json.dumps(list(imports)))\n" - "except:\n" - " try:\n" - " m = re.findall(r'^\\s*(?:from|import)\\s+([a-zA-Z0-9_]+)', code, re.M)\n" - " print('__QPYPACK_RES__:' + json.dumps(list(set(m))))\n" - " except: print('__QPYPACK_RES__:[]')\n" - ) +def is_cloud_sync_path(path_obj: Path) -> bool: + path_str = path_obj.resolve().as_posix().lower() + cloud_keywords = [ + 'onedrive', 'dropbox', 'icloud', 'google drive', 'googledrive', 'gdrive', + 'box sync', 'box.com', 'pcloud', 'mega', 'megasync', 'nextcloud', 'owncloud', + 'synology', 'seafile', 'tresorit', 'yandex', + 'nutstore', '坚果云', '百度云', '百度网盘', '阿里云盘', 'aliyun', '115', '微云' + ] + return any(kw in path_str for kw in cloud_keywords) + +def extract_imports_via_ast(script_path, python_exe=None): + code = "" try: - env = os.environ.copy() - env.pop("PYTHONHOME", None) - env.pop("PYTHONPATH", None) - env["PYTHONUTF8"] = "1" - env["PYTHONIOENCODING"] = "utf-8" - kwargs = {"stdout": subprocess.PIPE, "stderr": subprocess.PIPE, "text": True, "encoding": "utf-8", "env": env} - if os.name == 'nt': kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW - - proc = subprocess.run([python_exe, "-c", code_snippet, script_path], **kwargs) - m = re.search(r'__QPYPACK_RES__:(.*)', proc.stdout) - if m: - return set(json.loads(m.group(1).strip())) - return set() - except: - return set() + raw = Path(script_path).read_bytes() + try: + code = raw.decode('utf-8-sig') + except Exception: + code = raw.decode(locale.getpreferredencoding(), errors='ignore') + + imports = set() + tree = ast.parse(code, filename=script_path) + for node in ast.walk(tree): + if isinstance(node, ast.Import): + imports.update(n.name.split('.')[0] for n in node.names) + elif isinstance(node, ast.ImportFrom) and node.level == 0 and node.module: + imports.add(node.module.split('.')[0]) + return imports + except Exception: + try: + m = re.findall(r'^\s*(?:from|import)\s+([a-zA-Z0-9_]+)', code, re.M) + return set(m) + except Exception: + return set() def get_svg_icon(name, color="#5F6368", size=24): path_data = MATERIAL_ICONS.get(name, "") @@ -742,7 +860,9 @@ def get_stdlib_names(): 'tracemalloc', 'tty', 'turtle', 'turtledemo', 'types', 'unittest', 'uu', 'venv', 'wave', '__future__', 'weakref', 'webbrowser', 'winsound', 'wsgiref', 'xdrlib', - 'xmlrpc', 'zipapp', 'zipimport', 'zlib', 'zoneinfo'} + 'xmlrpc', 'zipapp', 'zipimport', 'zlib', 'zoneinfo', + 'tomllib', 'graphlib', 'ipaddress', 'builtins', 'gc', 'faulthandler', + 'plistlib', 'select', 'unicodedata', 'ensurepip', 'rlcompleter', 'msvcrt'} if sys.version_info >= (3, 10): libs.update(sys.stdlib_module_names) return libs @@ -820,6 +940,7 @@ def find_system_python(): else: unix_bases = [ "/usr/bin", "/usr/local/bin", "/opt/homebrew/bin", + "/Library/Frameworks/Python.framework/Versions/Current/bin", os.path.expanduser("~/.pyenv/shims"), os.path.expanduser("~/.local/bin") ] user_profile = os.environ.get("HOME", "") or os.environ.get("USERPROFILE", "") @@ -891,19 +1012,22 @@ def get_python_executable(): return find_system_python() -def remove_readonly(func, path, exc_info): +def remove_readonly(func, path, exc_info=None): try: os.chmod(path, stat.S_IWRITE) func(path) - except: pass + except Exception: pass def robust_rmtree(path: Path, retries=15, delay=0.8): if not path.exists(): return True for _ in range(retries): try: - shutil.rmtree(path, onerror=remove_readonly) + if sys.version_info >= (3, 12): + shutil.rmtree(path, onexc=lambda func, p, exc: remove_readonly(func, p)) + else: + shutil.rmtree(path, onerror=remove_readonly) if not path.exists(): return True - except: time.sleep(delay) + except Exception: time.sleep(delay) return False def convert_image_to_format(src_path, dest_path, dest_format): @@ -911,37 +1035,95 @@ def convert_image_to_format(src_path, dest_path, dest_format): dst = Path(dest_path).resolve() fmt = dest_format.lower() - if sys.platform == "darwin" and fmt == "icns": - try: - proc = subprocess.run(["sips", "-s", "format", "icns", src.as_posix(), "--out", dst.as_posix()], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) - if proc.returncode == 0 and dst.exists(): return True - except: pass - - try: - img = QImage(src.as_posix()) - if not img.isNull(): - if fmt == "ico": img = img.scaled(256, 256, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) - elif fmt == "icns": img = img.scaled(512, 512, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) - writer = QImageWriter(dst.as_posix(), fmt.upper().encode('utf-8')) - if writer.write(img): return True - except: pass - try: from PIL import Image img = Image.open(src.as_posix()) if fmt == "ico": - img.save(dst.as_posix(), format="ICO", sizes=[(256, 256), (128, 128), (64, 64), (32, 32), (16, 16)]) + ico_sizes = [(256, 256), (128, 128), (64, 64), (48, 48), (32, 32), (16, 16)] + resample_filter = getattr(Image.Resampling, 'LANCZOS', getattr(Image, 'LANCZOS', Image.BICUBIC)) + img.save(dst.as_posix(), format="ICO", sizes=ico_sizes, resample=resample_filter) return True elif fmt == "icns": img.save(dst.as_posix(), format="ICNS", sizes=[(512, 512), (256, 256), (128, 128), (64, 64)]) return True - else: - img.save(dst.as_posix(), format=dest_format.upper()) - return True - except: pass + except Exception: + pass + + try: + img = QImage(src.as_posix()) + if not img.isNull(): + if fmt == "ico": + img = img.scaled(256, 256, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) + writer = QImageWriter(dst.as_posix(), fmt.upper().encode('utf-8')) + if writer.write(img): + return True + except Exception: + pass + + if fmt == "ico": + try: + png_bytes = None + img = QImage(src.as_posix()) + if not img.isNull(): + img_scaled = img.scaled(256, 256, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) + temp_png = Path(tempfile.gettempdir()) / f"qpypack_ico_fallback_{int(time.time())}.png" + if img_scaled.save(temp_png.as_posix(), "PNG"): + png_bytes = temp_png.read_bytes() + temp_png.unlink(missing_ok=True) + elif src.suffix.lower() == '.png': + png_bytes = src.read_bytes() + + if png_bytes: + header = struct.pack(' 0.0: - pop_scale = 1.0 + math.sin(self.burst_value * math.pi) * 0.15 - draw_size = int(self.current_size * pop_scale) - if self.burst_value < 1.0: - alpha = int(255 * (1.0 - self.burst_value)) - painter.setPen(Qt.PenStyle.NoPen) - painter.setBrush(QColor(26, 115, 232, alpha)) - burst_radius_1 = (self.current_size / 2) + 10 + self.burst_value * 40 - dot_size_1 = 8 * (1.0 - self.burst_value) - for i in range(8): - angle = math.radians(i * 45) - dx = center_x + math.cos(angle) * burst_radius_1 - dy = center.y() + math.sin(angle) * burst_radius_1 - painter.drawEllipse(QPointF(dx, dy), dot_size_1, dot_size_1) + if self.is_building: + radius = (self.current_size / 2) + 12 + pen = QPen(QColor(26, 115, 232, 200)) + pen.setWidth(4) + pen.setCapStyle(Qt.PenCapStyle.RoundCap) + painter.setPen(pen) - painter.setBrush(QColor(255, 193, 7, alpha)) - burst_radius_2 = (self.current_size / 2) + self.burst_value * 65 - dot_size_2 = 6 * (1.0 - self.burst_value) - for i in range(8): - angle = math.radians(i * 45 + 22.5) - dx = center_x + math.cos(angle) * burst_radius_2 - dy = center.y() + math.sin(angle) * burst_radius_2 - painter.drawEllipse(QPointF(dx, dy), dot_size_2, dot_size_2) - - pix_rect = QRectF(center_x - draw_size / 2.0, icon_center_y - draw_size / 2.0, float(draw_size), float(draw_size)) - scaled_pix = self.pixmap.scaled( - int(draw_size * self.devicePixelRatioF()), - int(draw_size * self.devicePixelRatioF()), - Qt.AspectRatioMode.KeepAspectRatio, - Qt.TransformationMode.SmoothTransformation - ) - scaled_pix.setDevicePixelRatio(self.devicePixelRatioF()) - painter.drawPixmap(pix_rect, scaled_pix, QRectF(scaled_pix.rect())) - painter.end() + rect = QRectF(center_x - radius, center.y() - radius, radius * 2, radius * 2) + span_angle = int((140 + 60 * math.sin(self.pulse_value * 1.5)) * 16) + start_angle = int(-self.spin_angle * 16) + painter.drawArc(rect, start_angle, span_angle) + + elif self.burst_value > 0.0: + pop_scale = 1.0 + math.sin(self.burst_value * math.pi) * 0.15 + draw_size = int(self.current_size * pop_scale) + if self.burst_value < 1.0: + alpha = int(255 * (1.0 - self.burst_value)) + painter.setPen(Qt.PenStyle.NoPen) + painter.setBrush(QColor(26, 115, 232, alpha)) + burst_radius_1 = (self.current_size / 2) + 5 + self.burst_value * 25 + dot_size_1 = 8 * (1.0 - self.burst_value) + for i in range(8): + angle = math.radians(i * 45) + dx = center_x + math.cos(angle) * burst_radius_1 + dy = center.y() + math.sin(angle) * burst_radius_1 + painter.drawEllipse(QPointF(dx, dy), dot_size_1, dot_size_1) + + painter.setBrush(QColor(255, 193, 7, alpha)) + burst_radius_2 = (self.current_size / 2) + self.burst_value * 35 + dot_size_2 = 6 * (1.0 - self.burst_value) + for i in range(8): + angle = math.radians(i * 45 + 22.5) + dx = center_x + math.cos(angle) * burst_radius_2 + dy = center.y() + math.sin(angle) * burst_radius_2 + painter.drawEllipse(QPointF(dx, dy), dot_size_2, dot_size_2) + + pix_rect = QRectF(center_x - draw_size / 2.0, icon_center_y - draw_size / 2.0, float(draw_size), float(draw_size)) + scaled_pix = self.pixmap.scaled( + int(draw_size * self.devicePixelRatioF()), + int(draw_size * self.devicePixelRatioF()), + Qt.AspectRatioMode.KeepAspectRatio, + Qt.TransformationMode.SmoothTransformation + ) + scaled_pix.setDevicePixelRatio(self.devicePixelRatioF()) + painter.drawPixmap(QPointF(pix_rect.x(), pix_rect.y()), scaled_pix) + finally: + painter.end() class DropArea(QFrame): fileDropped = Signal(str) @@ -1199,7 +1374,7 @@ class DropArea(QFrame): layout.addLayout(h_layout) layout.addSpacing(18) - self.label = QLabel() + self.label = QLabel(_("Python Packaging, Reimagined.")) self.label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.label.setWordWrap(True) self.label.setStyleSheet("QLabel { background: transparent; color: #5F6368; font-size: 16px; font-weight: bold; border: none; }") @@ -1217,11 +1392,7 @@ class DropArea(QFrame): self.retranslate_ui() def retranslate_ui(self): - if not self.current_filename: - self.label.setText(_("Drag & Drop Python script (.py/.pyw) here\nor Click to Browse")) - self.sub_label.setText(_("Auto-parse dependencies, resources, and implicit imports")) - else: - self.label.setText(_("Loaded: {filename}", filename=self.current_filename)) + pass def dragEnterEvent(self, event: QDragEnterEvent): if event.mimeData().hasUrls(): @@ -1414,14 +1585,14 @@ class PythonScannerThread(QThread): resolved_candidates.add(resolved_path) except: resolved_candidates.add(os.path.normpath(cand)) - candidates = resolved_candidates valid_pythons = {} - for cand in candidates: + + def check_candidate(cand): if os.name == 'nt' and "WindowsApps" in cand: try: - if os.path.getsize(cand) == 0: continue - except: continue + if os.path.getsize(cand) == 0: return None + except: return None try: clean_env = os.environ.copy() clean_env.pop("PYTHONHOME", None) @@ -1430,11 +1601,18 @@ class PythonScannerThread(QThread): clean_env["PYTHONIOENCODING"] = "utf-8" kwargs = {"stdout": subprocess.PIPE, "stderr": subprocess.PIPE, "text": True, "encoding": "utf-8", "env": clean_env, "timeout": 2} if os.name == 'nt': kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW - proc = subprocess.run([cand, "-c", "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')"], **kwargs) + proc = subprocess.run([cand, "-c", "import sys; print(sys.version.split()[0])"], **kwargs) if proc.returncode == 0: - ver = proc.stdout.strip() - valid_pythons[cand] = ver + return (cand, proc.stdout.strip()) except: pass + return None + + with ThreadPoolExecutor(max_workers=min(12, len(resolved_candidates) or 1)) as executor: + results = executor.map(check_candidate, resolved_candidates) + for res in results: + if res: + valid_pythons[res[0]] = res[1] + self.scan_done.emit(valid_pythons) class SettingsPanel(QWidget): @@ -1484,9 +1662,9 @@ class SettingsPanel(QWidget): QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { height: 0px; } """) self.init_ui() - self.load_from_config() - I18N.language_changed.connect(self.retranslate_ui) + self.load_from_config() + self.retranslate_ui() self.scanner_thread = PythonScannerThread() self.scanner_thread.scan_done.connect(self.populate_python_combo) @@ -1551,11 +1729,12 @@ class SettingsPanel(QWidget): self.tab_build = QWidget() self.tab_pref_scroll, _cnt_pref, self.lay_pref = self._create_scroll_tab() - self.tab_about = QWidget() + self.tab_about_scroll, _cnt_abt, self.lay_about = self._create_scroll_tab() self.tabs.addTab(self.tab_build, get_svg_icon('package', "#5F6368", 16), _("Build Settings")) self.tabs.addTab(self.tab_pref_scroll, get_svg_icon('settings', "#5F6368", 16), _("Preferences")) - self.tabs.addTab(self.tab_about, get_svg_icon('info', "#5F6368", 16), _("About")) + self.tabs.addTab(self.tab_about_scroll, get_svg_icon('info', "#5F6368", 16), _("About")) + self.build_build_master_tab() self.build_pref_tab() @@ -1607,11 +1786,11 @@ class SettingsPanel(QWidget): sub_scroll4, _cnt4, lay_sub4 = self._create_scroll_tab() sub_scroll5, _cnt5, lay_sub5 = self._create_scroll_tab() - self.sub_tabs.addTab(sub_scroll1, _("🚀 Engine")) - self.sub_tabs.addTab(sub_scroll2, _("📦 Dependencies")) - self.sub_tabs.addTab(sub_scroll3, _("📂 Resources")) - self.sub_tabs.addTab(sub_scroll4, _("⚡ Optimization")) - self.sub_tabs.addTab(sub_scroll5, _("🗺️ Package Map")) + self.sub_tabs.addTab(sub_scroll1, get_svg_icon('engine', "#5F6368", 16), _("Engine")) + self.sub_tabs.addTab(sub_scroll2, get_svg_icon('package', "#5F6368", 16), _("Dependencies")) + self.sub_tabs.addTab(sub_scroll3, get_svg_icon('folder', "#5F6368", 16), _("Resources")) + self.sub_tabs.addTab(sub_scroll4, get_svg_icon('bolt', "#5F6368", 16), _("Optimization")) + self.sub_tabs.addTab(sub_scroll5, get_svg_icon('link', "#5F6368", 16), _("Package Map")) self.card_engine, c_lay_engine = self._create_card(_("Engine & Environment")) self.form_engine = QFormLayout() @@ -1626,7 +1805,32 @@ class SettingsPanel(QWidget): self.engine_desc_lbl = QLabel() self.engine_desc_lbl.setWordWrap(True) self.engine_desc_lbl.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) - self.engine_desc_lbl.setStyleSheet("QLabel { background-color: #f8fafc; color: #475569; border: 1px solid #e2e8f0; border-radius: 6px; padding: 9px 18px; font-size: 12px; }") + self.engine_desc_lbl.setStyleSheet(""" + QLabel { + background-color: #f8fafc; + color: #334155; + border: 1px solid #e2e8f0; + border-radius: 6px; + padding: 8px 12px; + font-size: 12px; + line-height: 1.5; + } + """) + + self.python_desc_lbl = QLabel() + self.python_desc_lbl.setOpenExternalLinks(True) + self.python_desc_lbl.setWordWrap(True) + self.python_desc_lbl.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + self.python_desc_lbl.setStyleSheet(""" + QLabel { + background-color: #ffffff; + color: #334155; + border: 1px solid #e2e8f0; + border-radius: 8px; + padding: 8px 14px; + font-size: 12px; + } + """) engine_cont = QWidget() lay_eng = QVBoxLayout(engine_cont) @@ -1639,16 +1843,24 @@ class SettingsPanel(QWidget): self.python_path_combo.setEditable(True) self.python_path_combo.setPlaceholderText(_("Leave blank to auto-detect system default Python")) setup_combo_white_theme(self.python_path_combo, min_view_width=520) + self.python_path_combo.currentTextChanged.connect(self.on_python_path_changed) self.btn_python_path = QPushButton(_("Browse")) self.btn_python_path.setProperty("class", "ToolBtn") self.btn_python_path.clicked.connect(self.select_python_path) py_cont = QWidget() - h_py = QHBoxLayout(py_cont) - h_py.setContentsMargins(0,0,0,0) - h_py.addWidget(self.python_path_combo, 1) - h_py.addWidget(self.btn_python_path) + lay_py = QVBoxLayout(py_cont) + lay_py.setContentsMargins(0, 0, 0, 0) + lay_py.setSpacing(4) + + h_py_input = QHBoxLayout() + h_py_input.setContentsMargins(0, 0, 0, 0) + h_py_input.addWidget(self.python_path_combo, 1) + h_py_input.addWidget(self.btn_python_path) + + lay_py.addLayout(h_py_input) + lay_py.addWidget(self.python_desc_lbl) self.name_edit = QLineEdit() self.name_edit.setPlaceholderText(_("Leave blank to auto-match script name")) @@ -1708,7 +1920,7 @@ class SettingsPanel(QWidget): setup_combo_white_theme(self.pip_backup_combo, min_view_width=520) for name, url in PYPI_MIRRORS_GLOBAL: - display_text = f"{name}: {url}" + display_text = f"{_(name)}: {url}" self.pip_source_combo.addItem(display_text, url) self.pip_backup_combo.addItem(display_text, url) @@ -1774,9 +1986,16 @@ class SettingsPanel(QWidget): lay_sub2.addStretch() self.card_res, c_lay_res = self._create_card(_("Additional Resources (Drag & Drop Supported)")) + + self.lbl_res_hint = QLabel(_("Project-specific. Not saved to global preferences. Use 'Export Preset' to save config.")) + self.lbl_res_hint.setWordWrap(True) + self.lbl_res_hint.setStyleSheet("font-size: 12px; color: #6b7280; font-weight: normal; margin-top: -2px; margin-bottom: 6px; line-height: 1.4;") + 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.setFixedHeight(180) + self.add_data_list.setMinimumHeight(120) self.add_data_list.setToolTip(_("Double-click to edit target path; Drag & drop supported")) self.add_data_list.itemDoubleClicked.connect(self.edit_resource) @@ -1882,7 +2101,7 @@ class SettingsPanel(QWidget): self.mapping_table.setHorizontalHeaderLabels([_("Import Name"), _("PyPI Package Name")]) self.mapping_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) self.mapping_table.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows) - self.mapping_table.setFixedHeight(260) + self.mapping_table.setMinimumHeight(150) c_lay_map.addWidget(self.mapping_table) btn_map_lay = QHBoxLayout() @@ -1952,8 +2171,13 @@ class SettingsPanel(QWidget): self.btn_imp_preset.setProperty("class", "ToolBtn") self.btn_imp_preset.clicked.connect(self.import_preset) + self.btn_reset_config = QPushButton(_("Reset to Default Config")) + 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) @@ -2005,7 +2229,7 @@ class SettingsPanel(QWidget): self.lay_pref.addStretch() def build_about_tab(self): - main_lay = QVBoxLayout(self.tab_about) + main_lay = self.lay_about main_lay.setContentsMargins(40, 20, 40, 20) main_lay.setSpacing(15) main_lay.addStretch(1) @@ -2035,36 +2259,79 @@ class SettingsPanel(QWidget): ver_lbl.setAlignment(Qt.AlignmentFlag.AlignCenter) main_lay.addWidget(ver_lbl) - self.about_desc_lbl = QLabel(_("A Cross-platform Python Packaging GUI Tool based on PyInstaller & Nuitka")) + self.about_desc_lbl = QLabel(_("Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka")) self.about_desc_lbl.setStyleSheet("font-size: 14px; color: #5f6368;") self.about_desc_lbl.setAlignment(Qt.AlignmentFlag.AlignCenter) main_lay.addWidget(self.about_desc_lbl) main_lay.addSpacing(25) btn_lay = QHBoxLayout() - btn_lay.setSpacing(15) + btn_lay.setSpacing(12) btn_lay.setAlignment(Qt.AlignmentFlag.AlignCenter) - def create_link_btn(text, url): - btn = QPushButton(text) + def create_link_btn(text, url, svg_path, icon_color, bg_color, hover_bg, pressed_bg): + btn = QPushButton(" " + text) btn.setCursor(Qt.CursorShape.PointingHandCursor) - btn.setStyleSheet(""" - QPushButton { background-color: #f1f3f4; color: #3c4043; border: none; border-radius: 8px; padding: 10px 20px; font-size: 13px; font-weight: bold; } - QPushButton:hover { background-color: #e8eaed; color: #1A73E8; } - QPushButton:pressed { background-color: #dadce0; } + + svg_str = f'' + renderer = QSvgRenderer() + renderer.load(svg_str.encode('utf-8')) + pixmap = QPixmap(48, 48) + pixmap.fill(Qt.GlobalColor.transparent) + painter = QPainter(pixmap) + painter.setRenderHint(QPainter.RenderHint.Antialiasing) + painter.setRenderHint(QPainter.RenderHint.SmoothPixmapTransform) + renderer.render(painter) + painter.end() + btn.setIcon(QIcon(pixmap)) + + btn.setStyleSheet(f""" + QPushButton {{ background-color: {bg_color}; color: #3c4043; border: none; border-radius: 8px; padding: 8px 16px; font-size: 13px; font-weight: bold; }} + QPushButton:hover {{ background-color: {hover_bg}; color: {icon_color}; }} + QPushButton:pressed {{ background-color: {pressed_bg}; }} """) btn.clicked.connect(lambda: __import__('webbrowser').open(url)) return btn - btn_github = create_link_btn("GitHub Repository", "https://github.com/qwejay/QPyPack") - btn_issue = create_link_btn("Issues & Feedback", "https://github.com/qwejay/QPyPack/issues") - btn_pypi = create_link_btn("PyPI Home", "https://pypi.org/project/qpypack/") + p_github = "M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.166 6.839 9.489.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.462-1.11-1.462-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0112 6.836c.85.004 1.705.114 2.504.336 1.909-1.294 2.747-1.025 2.747-1.025.546 1.379.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.161 22 16.416 22 12c0-5.523-4.477-10-10-10z" + p_issue = "M20 8h-2.81c-.45-.78-1.07-1.45-1.82-1.96L17 4.41 15.59 3l-2.17 2.17C12.96 5.06 12.49 5 12 5c-.49 0-.96.06-1.41.17L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8zm-6 8h-4v-2h4v2zm0-4h-4v-2h4v2z" + p_pypi = "M12.06,1.48c-3.14,0-3.52,0.67-3.52,0.67l-0.01,2.44h3.63v0.52H7.43C5.12,5.11,4.5,6.58,4.5,8.81c0,2.34,0.38,3.48,2.3,3.48 h1.14v-1.62c0-1.48,1.23-2.65,2.7-2.65h3.69c1.47,0,2.66-1.19,2.66-2.65V3.88C16.99,1.83,14.67,1.48,12.06,1.48z M10.22,2.83 c0.41,0,0.73,0.33,0.73,0.74c0,0.41-0.33,0.74-0.73,0.74c-0.4,0-0.73-0.33-0.73-0.74C9.49,3.16,9.82,2.83,10.22,2.83z M16.71,9.89 v1.62c0,1.48-1.23,2.65-2.7,2.65H10.3c-1.47,0-2.66,1.19-2.66,2.65v1.49c0,2.05,2.32,2.41,4.92,2.41c3.14,0,3.52-0.67,3.52-0.67 l0.01-2.44h-3.63v-0.52h4.73c2.31,0,2.93-1.47,2.93-3.7c0-2.34-0.38-3.48-2.3-3.48H16.71z M13.88,18.96c0.41,0,0.73,0.33,0.73,0.74c0,0.41-0.33,0.74-0.73,0.74c-0.4,0-0.73-0.33-0.73-0.74C13.15,19.29,13.48,18.96,13.88,18.96z" + p_heart = "M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" + + btn_github = create_link_btn(_("GitHub Repository"), "https://github.com/qwejay/QPyPack", p_github, "#24292e", "#f1f3f4", "#e8eaed", "#dadce0") + btn_issue = create_link_btn(_("Issues & Feedback"), "https://github.com/qwejay/QPyPack/issues", p_issue, "#d93025", "#f1f3f4", "#e8eaed", "#dadce0") + btn_pypi = create_link_btn(_("PyPI Home"), "https://pypi.org/project/qpypack/", p_pypi, "#1A73E8", "#f1f3f4", "#e8eaed", "#dadce0") + + btn_sponsor = create_link_btn(_("Sponsor"), "https://www.ifdian.net/a/qwejay", p_heart, "#d93025", "#fce8e6", "#fad2cf", "#f6aea9") + btn_sponsor.setStyleSheet(btn_sponsor.styleSheet().replace("color: #3c4043;", "color: #d93025;")) btn_lay.addWidget(btn_github) btn_lay.addWidget(btn_issue) btn_lay.addWidget(btn_pypi) + btn_lay.addWidget(btn_sponsor) main_lay.addLayout(btn_lay) + main_lay.addSpacing(20) + + self.sponsor_desc = QLabel() + self.sponsor_desc.setWordWrap(True) + self.sponsor_desc.setAlignment(Qt.AlignmentFlag.AlignCenter) + + text_p1 = _("QPyPack is a free and open-source tool. If it has improved your efficiency or solved packaging problems, consider buying the author a coffee!") + text_p2 = _("* Sponsorship is completely voluntary, serves as an unconditional encouragement to the open-source community, and involves no commercial commitments. Thank you for your support!") + + self.sponsor_desc.setText( + f"
" + f"

" + f" {text_p1}" + f"

" + f"

" + f" {text_p2}" + f"

" + f"
" + ) + main_lay.addWidget(self.sponsor_desc) + main_lay.addStretch(1) rights_lbl = QLabel(f"Copyright © {__company__}.") @@ -2077,11 +2344,11 @@ class SettingsPanel(QWidget): self.tabs.setTabText(1, _("Preferences")) self.tabs.setTabText(2, _("About")) - self.sub_tabs.setTabText(0, _("🚀 Engine")) - self.sub_tabs.setTabText(1, _("📦 Dependencies")) - self.sub_tabs.setTabText(2, _("📂 Resources")) - self.sub_tabs.setTabText(3, _("⚡ Optimization")) - self.sub_tabs.setTabText(4, _("🗺️ Package Map")) + self.sub_tabs.setTabText(0, _("Engine")) + self.sub_tabs.setTabText(1, _("Dependencies")) + self.sub_tabs.setTabText(2, _("Resources")) + self.sub_tabs.setTabText(3, _("Optimization")) + self.sub_tabs.setTabText(4, _("Package Map")) self.card_engine.findChild(QLabel, "CardTitle").setText(_("Engine & Environment")) self.card_mode.findChild(QLabel, "CardTitle").setText(_("Execution Mode")) @@ -2116,6 +2383,27 @@ class SettingsPanel(QWidget): self.lbl_out_rule_title.setText(_("Output Rule:")) self.lbl_target_out_title.setText(_("Target Directory:")) + 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) + + self.pip_source_combo.blockSignals(True) + self.pip_backup_combo.blockSignals(True) + + self.pip_source_combo.clear() + self.pip_backup_combo.clear() + + for name, url in PYPI_MIRRORS_GLOBAL: + display_text = f"{_(name)}: {url}" + self.pip_source_combo.addItem(display_text, url) + self.pip_backup_combo.addItem(display_text, url) + + self._set_combo_value(self.pip_source_combo, cur_main) + self._set_combo_value(self.pip_backup_combo, cur_back) + + self.pip_source_combo.blockSignals(False) + self.pip_backup_combo.blockSignals(False) + self.btn_save.setText(_("Save & Return")) self.btn_python_path.setText(_("Browse")) self.btn_icon.setText(_("Browse")) @@ -2132,6 +2420,7 @@ class SettingsPanel(QWidget): self.btn_reset_map.setText(_("Restore Defaults")) self.btn_exp_preset.setText(_("Export Preset...")) self.btn_imp_preset.setText(_("Import Preset...")) + self.btn_reset_config.setText(_("Reset to Default Config")) self.python_path_combo.setPlaceholderText(_("Leave blank to auto-detect system default Python")) self.name_edit.setPlaceholderText(_("Leave blank to auto-match script name")) @@ -2158,13 +2447,26 @@ 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(_("A Cross-platform Python Packaging GUI Tool based on PyInstaller & Nuitka")) + self.about_desc_lbl.setText(_("Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka")) + + text_p1 = _("QPyPack is a free and open-source tool. If it has improved your efficiency or solved packaging problems, consider buying the author a coffee!") + text_p2 = _("* Sponsorship is completely voluntary, serves as an unconditional encouragement to the open-source community, and involves no commercial commitments. Thank you for your support!") + self.sponsor_desc.setText( + f"
" + f"

{text_p1}

" + f"

{text_p2}

" + f"
" + ) + self.btn_reset.setToolTip(_("Reset to Default Config")) self.btn_back.setToolTip(_("Cancel & Return")) - self.add_data_list.setToolTip(_("Double-click to edit target path; Drag & drop supported")) + 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.")) self.on_engine_changed() + self.on_python_path_changed() def populate_python_combo(self, py_dict): current_text = self.python_path_combo.currentText().strip() @@ -2188,6 +2490,18 @@ class SettingsPanel(QWidget): break if not found: self.python_path_combo.setCurrentText(current_text) + fm = self.python_path_combo.fontMetrics() + max_width = 520 + for i in range(self.python_path_combo.count()): + text_w = fm.horizontalAdvance(self.python_path_combo.itemText(i)) + if text_w > max_width: + max_width = text_w + + if self.python_path_combo.view(): + self.python_path_combo.view().setMinimumWidth(max_width + 36) + + self.on_python_path_changed() + def populate_mapping_table(self, mappings_dict): self.mapping_table.setRowCount(0) for imp_name, pypi_name in mappings_dict.items(): @@ -2197,9 +2511,9 @@ class SettingsPanel(QWidget): self.mapping_table.setItem(row, 1, QTableWidgetItem(pypi_name)) def add_mapping_item(self): - imp_name, ok1 = QInputDialog.getText(self, _("Add Mapping"), "Import name (e.g. cv2):") + imp_name, ok1 = QInputDialog.getText(self, _("Add Mapping"), _("Import name (e.g. cv2):")) if not ok1 or not imp_name.strip(): return - pypi_name, ok2 = QInputDialog.getText(self, _("Add Mapping"), f"PyPI package name for [{imp_name.strip()}]:") + pypi_name, ok2 = QInputDialog.getText(self, _("Add Mapping"), _("PyPI package name for [{imp_name}]:", imp_name=imp_name.strip())) if not ok2 or not pypi_name.strip(): return row = self.mapping_table.rowCount() @@ -2330,12 +2644,6 @@ class SettingsPanel(QWidget): self.pipreqs_ver_edit.setText(s.get('pipreqs_version', '')) self.add_data_list.clear() - res_str = s.get('add_data_list', '') - if res_str: - for part in res_str.split("|||"): - if part.count('|') == 2: - r_type, src, dst = part.split('|') - self._add_resource_item(r_type, src, dst) if 'Mappings' in config: self.populate_mapping_table(dict(config['Mappings'])) @@ -2384,10 +2692,7 @@ class SettingsPanel(QWidget): s['pipreqs_version'] = self.pipreqs_ver_edit.text().strip() res_list = [] - for i in range(self.add_data_list.count()): - r_type, src, dst = self.add_data_list.item(i).data(Qt.ItemDataRole.UserRole) - res_list.append(f"{r_type}|{src}|{dst}") - s['add_data_list'] = "|||".join(res_list) + s['add_data_list'] = '' config['Mappings'] = {} for r in range(self.mapping_table.rowCount()): @@ -2422,14 +2727,43 @@ class SettingsPanel(QWidget): def on_engine_changed(self): engine = self.engine_combo.currentText() if engine == "PyInstaller": - self.engine_desc_lbl.setText(_("PyInstaller: Fast build speed, excellent compatibility. Ideal for rapid iteration.")) + self.engine_desc_lbl.setText(_("PyInstaller — Bundles Python interpreter and bytecode. Fast build speed, zero configuration (no C compiler needed), and excellent compatibility.")) else: - self.engine_desc_lbl.setText(_("Nuitka: Compiles to native C/C++ binary. Better performance and source code protection.")) + self.engine_desc_lbl.setText(_("Nuitka — Compiles source code into native C/C++ binary. Produces smaller package size, faster execution, and deep anti-decompilation protection (requires C compiler).")) if getattr(self, 'upx_check', None) is not None and getattr(self, 'upx_path_container', None) is not None: - is_pyi = (engine == "PyInstaller") - self.upx_check.setVisible(is_pyi) - self.upx_path_container.setVisible(is_pyi and self.upx_check.isChecked()) + self.upx_check.setVisible(True) + self.upx_path_container.setVisible(self.upx_check.isChecked()) + + def on_python_path_changed(self, text=""): + raw_text = text or self.python_path_combo.currentText().strip() + ver_match = re.search(r'Python\s+(\d+\.\d+)', raw_text, re.I) + + ver_str = ver_match.group(1) if ver_match else "" + if not ver_str: + m_path = re.search(r'python(\d)(\d+)', raw_text, re.I) + if m_path: ver_str = f"{m_path.group(1)}.{m_path.group(2)}" + + self.python_desc_lbl.setStyleSheet("QLabel { background-color: #f8fafc; color: #334155; border: 1px solid #e2e8f0; border-radius: 6px; padding: 8px 12px; font-size: 12px; line-height: 1.5; }") + + if ver_str: + try: + parts = [int(x) for x in ver_str.split('.')] + major, minor = parts[0], parts[1] + + if (major, minor) <= (3, 8): + self.python_desc_lbl.setText(_('
Python {ver} Platform Matrix:Download Python
✔ Windows 7    ✔ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux
Legacy OS Full backward compatibility', ver=ver_str)) + elif (major, minor) <= (3, 10): + self.python_desc_lbl.setText(_('
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✔ Windows 8.1    ✔ Windows 10 / 11    ✔ macOS 10.9+    ✔ Linux', ver=ver_str)) + elif (major, minor) <= (3, 12): + self.python_desc_lbl.setText(_('
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.13+    ✔ Linux
Nuitka MinGW64 supported out-of-the-box', ver=ver_str)) + else: + self.python_desc_lbl.setText(_('
Python {ver} Platform Matrix:Download Python
✖ Windows 7    ✖ Windows 8 / 8.1    ✔ Windows 10 / 11    ✔ macOS 10.15+    ✔ Linux
Nuitka Requires MSVC / Clang / Zig (MinGW64 unsupported)', ver=ver_str)) + return + except Exception: + pass + + self.python_desc_lbl.setText(_('
Python InterpreterDownload Python
Auto-detecting system environment for Windows, macOS & Linux...')) def on_upx_toggled(self, checked): if getattr(self, 'upx_path_container', None) is not None: @@ -2519,7 +2853,7 @@ class SettingsPanel(QWidget): if not item: item = self.add_data_list.currentItem() if not item: return r_type, src, dst = item.data(Qt.ItemDataRole.UserRole) - new_dst, ok = QInputDialog.getText(self, "Edit Path", "Target relative path:", text=dst) + new_dst, ok = QInputDialog.getText(self, _("Edit Path"), _("Target relative path:"), text=dst) if ok and new_dst: new_dst = new_dst.strip().replace('\\', '/') if not new_dst: new_dst = "." @@ -2534,14 +2868,33 @@ class SettingsPanel(QWidget): def clear_resource(self): self.add_data_list.clear() + def reset_global_config(self): + reply = QMessageBox.question(self, _("Reset to Default Config"), + _("Are you sure you want to reset all preferences to default?"), + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No) + if reply == QMessageBox.StandardButton.Yes: + if os.path.exists(CONFIG_FILE): + try: + os.remove(CONFIG_FILE) + except: pass + + load_config() + self.load_from_config() + + if hasattr(self.parent_win, "show_notification"): + self.parent_win.show_notification(_("Global configuration has been reset.")) + class ScriptAnalysisThread(QThread): analysis_done = Signal(str, str, str, str, set) - def __init__(self, path): + def __init__(self, path, python_exe=None): super().__init__() self.path = path + self.python_exe = python_exe or get_python_executable() def run(self): + if self.isInterruptionRequested(): return + app_name = Path(self.path).stem version = "" author = "My Studio" @@ -2569,16 +2922,19 @@ class ScriptAnalysisThread(QThread): if d_match: desc = d_match.group(1) except: pass + if self.isInterruptionRequested(): return + try: - python_exe = get_python_executable() - script_imports = extract_imports_via_ast(self.path, python_exe) + script_imports = extract_imports_via_ast(self.path, self.python_exe) except: pass + if self.isInterruptionRequested(): return + self.analysis_done.emit(app_name, version, author, desc, script_imports) class PackingThread(QThread): progress = Signal(str) - finished = Signal(bool, str, list) + build_finished = Signal(bool, str, list) def __init__(self, params): super().__init__() @@ -2606,16 +2962,15 @@ class PackingThread(QThread): timer = None is_timeout = [False] - cmd_raw_lines = [] clean_env = os.environ.copy() clean_env.pop("PYTHONHOME", None) clean_env.pop("PYTHONPATH", None) - clean_env["PYTHONUTF8"] = "1" clean_env["PYTHONIOENCODING"] = "utf-8" clean_env["LANG"] = "en_US.UTF-8" - clean_env["LC_ALL"] = "en_US.UTF-8" + clean_env["LC_ALL"] = "en_US.UTF-8" + clean_env["PYTHONUNBUFFERED"] = "1" try: kwargs = {"stdout": subprocess.PIPE, "stderr": subprocess.STDOUT, "cwd": cwd, "text": True, "encoding": "utf-8", "errors": "replace", "env": clean_env} @@ -2639,25 +2994,14 @@ class PackingThread(QThread): buffer = [] last_emit = time.time() - def is_noisy_line(l): - l_lower = l.lower() - if "error:" in l_lower: return False - if "upx" in l_lower and ("subprocess.calledprocesserror" in l_lower or "notcompressibleexception" in l_lower): - return True - return any(kw in l_lower for kw in ["warning:", "info:", "deprecation:", "userwarning:", "futurewarning:"]) - for line in self.process.stdout: if self._is_cancelled: self.process.terminate() return False stripped = line.rstrip('\r\n') - cmd_raw_lines.append(stripped) self.all_raw_logs.append(stripped) - if self.params.get('concise_log', True) and is_noisy_line(stripped): - continue - buffer.append(stripped) if len(buffer) >= 15 or (time.time() - last_emit) > 0.1: self.progress.emit('\n'.join(buffer)) @@ -2668,30 +3012,33 @@ class PackingThread(QThread): self.process.wait() if is_timeout[0]: - self.progress.emit(f"[WARN] Command timeout (>{timeout}s)") + self.progress.emit(_("[WARN] Command timeout (>{timeout}s)", timeout=timeout)) return False - success = self.process.returncode == 0 - if not success and not silent_error and self.params.get('concise_log', True) and cmd_raw_lines: - self.progress.emit(_("\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!")) - self.progress.emit('\n'.join(cmd_raw_lines)) - self.progress.emit("!"*60 + "\n") - - return success + return self.process.returncode == 0 except FileNotFoundError as e: - self.progress.emit(f"[ERROR] Process error: command or binary missing ({e})") + self.progress.emit(_("[ERROR] Process error: command or binary missing ({error})", error=str(e))) return False except Exception as e: - self.progress.emit(f"[ERROR] System execution exception: {e}") + self.progress.emit(_("[ERROR] System execution exception: {error}", error=str(e))) return False finally: if timer: timer.cancel() + if self.process and self.process.stdout: + try: + self.process.stdout.close() + except Exception: + pass def run_pip_install(self, python_exe, pkgs_or_args): primary_idx = self.params.get('pip_index_url', '').strip() backup_idx = self.params.get('pip_index_backup', '').strip() - pip_args = [] + pip_args = [ + "--default-timeout=120", + "--disable-pip-version-check", + "--prefer-binary" + ] if primary_idx: pip_args.extend(["-i", primary_idx]) if backup_idx and backup_idx != primary_idx: pip_args.extend(["--extra-index-url", backup_idx]) @@ -2699,19 +3046,15 @@ class PackingThread(QThread): success = self.run_cmd(cmd) if not success and backup_idx and backup_idx != primary_idx: - last_logs = "\n".join(self.all_raw_logs[-15:]).lower() - if "no matching distribution found" in last_logs or "could not find a version" in last_logs: - return False - self.progress.emit(_("[INFO] Switching to backup PyPI source for retrieval: {url}", url=backup_idx)) - fallback_cmd = [python_exe, "-m", "pip", "install"] + pkgs_or_args + ["-i", backup_idx] + fallback_cmd = [python_exe, "-m", "pip", "install"] + pkgs_or_args + ["-i", backup_idx, "--disable-pip-version-check", "--prefer-binary"] success = self.run_cmd(fallback_cmd) return success def sanitize_script(self, orig_path: Path): if is_cloud_locked(orig_path): - return None, False, _("Target file is locked or encrypted by cloud drive. Please decrypt and try again.") + return None, False, _("[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.") if not self.params['noconsole']: try: @@ -2719,26 +3062,34 @@ class PackingThread(QThread): try: code = raw.decode('utf-8-sig') except: code = raw.decode(locale.getpreferredencoding(), errors='ignore') - pause_prompt_str = _("\\nProgram execution completed, press Enter to exit...") - pause_code = "\n" + "#"*30 + "\n" + ( - "try:\n" - " import sys\n" - " if sys.platform == 'win32':\n" - " import ctypes\n" - " kernel32 = ctypes.windll.kernel32\n" - " process_list = (ctypes.c_uint * 10)()\n" - " num_processes = kernel32.GetConsoleProcessList(process_list, 10)\n" - " if num_processes <= 2:\n" - f" input('{pause_prompt_str}')\n" - "except:\n" - " pass\n" + pause_prompt_str = _("\\nProgram execution completed, press Enter to exit...").replace('\\n', '\n') + + pause_code = ( + "# --- QPyPack Auto-injected Console Pause ---\n" + "import atexit\n" + "def _qpypack_pause():\n" + " try:\n" + " import sys\n" + " if sys.platform == 'win32':\n" + " import ctypes\n" + " if ctypes.windll.kernel32.GetConsoleProcessList((ctypes.c_uint * 10)(), 10) <= 2:\n" + f" input({repr(pause_prompt_str)})\n" + " except:\n" + " pass\n" + "atexit.register(_qpypack_pause)\n" + "# -------------------------------------------\n\n" ) - temp_file = Path(tempfile.gettempdir()) / f"_qpypack_temp_entry_{int(time.time())}_{orig_path.name}" - temp_file.write_text(code + pause_code, encoding='utf-8') + temp_file = orig_path.parent / f"_qpypack_temp_{orig_path.name}" + try: + temp_file.write_text(pause_code + code, encoding='utf-8') + except PermissionError: + temp_file = Path(tempfile.gettempdir()) / f"_qpypack_temp_{orig_path.name}" + temp_file.write_text(pause_code + code, encoding='utf-8') + return temp_file, True, "" except Exception as e: - self.progress.emit(f"[WARN] Pause code injection exception: {e}") + self.progress.emit(_("[WARN] Pause code injection exception: {error}", error=str(e))) return orig_path, False, "" @@ -2757,7 +3108,7 @@ class PackingThread(QThread): err_desc = last_err.group(2) err_pos = last_err.start() - line_no = "未知" + line_no = _("Unknown") file_name = script_name file_line_matches = list(file_line_pat.finditer(log_text)) @@ -2781,6 +3132,7 @@ class PackingThread(QThread): def run(self): os.environ["NUITKA_ACCEPT_DOWNLOADS"] = "yes" engine = self.params['engine'] + app_name = self.params.get('app_name', 'app').strip() or 'app' pip_idx = self.params.get('pip_index_url', '').strip() pip_backup = self.params.get('pip_index_backup', '').strip() is_temp = False @@ -2789,28 +3141,129 @@ class PackingThread(QThread): failed_packages = [] try: - self.progress.emit(_("[INFO] Initializing isolated build environment...")) + self.progress.emit(_("[INFO] Analyzing source code and project dependencies...")) script_path = Path(self.params['script_path']).resolve() script_dir = script_path.parent + + try: + compile(script_path.read_bytes(), script_path.name, 'exec') + except SyntaxError as e: + err_type = type(e).__name__ + msg = _("[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.", + file=script_path.name, type=err_type, line=e.lineno or _("Unknown"), desc=e.msg or "Invalid syntax") + return self.build_finished.emit(False, msg, []) + + self.progress.emit(_("[INFO] Performing pre-flight environment checks...")) + out_mode = int(self.params.get('out_mode', 0) or 0) + custom_out = (self.params.get('custom_out_dir') or '').strip() + target_out_dir = Path(custom_out) if (out_mode == 1 and custom_out) else script_dir + try: + target_out_dir.mkdir(parents=True, exist_ok=True) + test_file = target_out_dir / ".qpypack_write_test" + test_file.write_text("test") + test_file.unlink() + except Exception as e: + return self.build_finished.emit(False, _("[ERROR] Output directory is missing write permissions: {error}", error=str(e)), []) + + if self.params.get('use_reqs'): + custom_reqs = (self.params.get('reqs_file') or '').strip() + if custom_reqs and not Path(custom_reqs).exists(): + return self.build_finished.emit(False, _("[ERROR] Requirements file not found: {path}", path=custom_reqs), []) + + for r_type, src, dst in (self.params.get('add_data_list') or []): + if not Path(src).exists(): + return self.build_finished.emit(False, _("[ERROR] Additional resource file/directory not found: {path}", path=src), []) + + free_disk = get_free_disk_gb(script_dir.as_posix()) + if free_disk < 0.5: + return self.build_finished.emit(False, _("[ERROR] Insufficient disk space (Available: {free:.1f} GB). At least 0.5 GB is required to safely initialize the build environment.", free=free_disk), []) + + system_python_exe = get_python_executable() + if not system_python_exe or not shutil.which(system_python_exe): + return self.build_finished.emit(False, _("[ERROR] Python interpreter is invalid or not found: {path}", path=system_python_exe), []) + + if is_cloud_sync_path(script_dir): + self.progress.emit(_("[WARN] Target project is in a Cloud Sync directory (e.g. OneDrive/Dropbox). Cloud sync may temporarily lock build files.")) + build_script_path, is_temp, err_msg = self.sanitize_script(script_path) - if not build_script_path and err_msg: return self.finished.emit(False, f"[ERROR] I/O Exception: {err_msg}", []) + if not build_script_path and err_msg: + return self.build_finished.emit(False, f"[ERROR] I/O Exception: {err_msg}", []) script_posix = build_script_path.as_posix() system_python_exe = get_python_executable() - self.progress.emit(_("[INFO] Python interpreter path: {path}", path=system_python_exe)) script_imports = set() try: script_imports = extract_imports_via_ast(script_posix, system_python_exe) except Exception as e: - self.progress.emit(f"[WARN] AST Analysis Exception: {e}") + self.progress.emit(_("[WARN] AST Analysis Exception: {error}", error=str(e))) + + known_mappings = self.params.get('mappings', DEFAULT_MAPPINGS.copy()) + known_mappings_lower = {k.lower(): v for k, v in known_mappings.items()} + + def get_canonical_pypi_name(raw_name): + clean = raw_name.strip().lower().replace('_', '-') + return known_mappings_lower.get(clean, clean).lower() + + def parse_req_line(line): + line = line.strip() + if not line or line.startswith('#') or line.startswith('-'): + return None, None + m = re.match(r'^([a-zA-Z0-9_\-\.]+)(.*)$', line) + if m: + pkg_raw = m.group(1) + canon_name = get_canonical_pypi_name(pkg_raw) + + if canon_name.lower() != pkg_raw.lower(): + full_spec = canon_name + else: + full_spec = line + return canon_name, full_spec + return None, None + + final_dependencies = {} + reqs_declared_pkgs = set() + auto_detected_pkgs = set() + auto_added_supplements = set() + + if self.params.get('use_reqs'): + custom_reqs = self.params.get('reqs_file', '').strip() + req_file = Path(custom_reqs) if (custom_reqs and Path(custom_reqs).exists()) else (script_dir / "requirements.txt") + if req_file.exists(): + try: + if is_cloud_locked(req_file): raise ValueError("Requirements file is locked") + raw_req = req_file.read_bytes() + try: req_content = raw_req.decode('utf-8-sig') + except: req_content = raw_req.decode(locale.getpreferredencoding(), errors='ignore') + + for line in req_content.splitlines(): + canon_name, full_spec = parse_req_line(line) + if canon_name: + final_dependencies[canon_name] = full_spec + reqs_declared_pkgs.add(canon_name) + except Exception as e: + self.progress.emit(_("[WARN] Read requirements.txt warning: {error}", error=str(e))) + + local_modules = {p.stem.lower() for p in script_dir.iterdir() + if (p.is_file() and p.suffix.lower() in ('.py', '.pyw', '.pyd', '.so')) or (p.is_dir() and (p / '__init__.py').exists())} + + for m in script_imports: + if m in STD_LIBS or m.lower() in local_modules: continue + canon_name = get_canonical_pypi_name(m) + 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] Initializing isolated build environment...")) + self.progress.emit(_("[INFO] Python interpreter path: {path}", path=system_python_exe)) if self.params['use_venv']: 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()]): - return self.finished.emit(False, _("[ERROR] Failed to create virtual environment. Current Python environment might be missing necessary modules or have restricted permissions."), []) + 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() self.progress.emit(_("[INFO] Synchronizing and upgrading pip package manager...")) @@ -2818,150 +3271,114 @@ class PackingThread(QThread): else: python_exe = system_python_exe + if self.params.get('use_pipreqs'): + self.progress.emit(_("[INFO] Scanning project source code via pipreqs...")) + sandbox_dir = Path(tempfile.mkdtemp(prefix="qpypack_sandbox_")).resolve() if not self.params.get('use_pipreqs_dir', False) else script_dir + if not self.params.get('use_pipreqs_dir', False): + shutil.copy2(build_script_path, sandbox_dir / build_script_path.name) + + pipreqs_pkg = f"pipreqs=={self.params['pipreqs_version']}" if self.params.get('pipreqs_version') else "pipreqs" + self.run_pip_install(python_exe, [pipreqs_pkg, "-q"]) + temp_pipreqs = Path(tempfile.gettempdir()) / f"qpypack_pipreqs_{int(time.time())}.txt" + + pypi_server = re.sub(r'/simple/?$', '/pypi', pip_idx, flags=re.I).rstrip('/') if pip_idx else None + pipreqs_cmd = [ + python_exe, "-m", "pipreqs.pipreqs", sandbox_dir.as_posix(), + "--encoding", "utf-8", "--force", "--savepath", temp_pipreqs.as_posix() + ] + if pypi_server: pipreqs_cmd.extend(["--pypi-server", pypi_server]) + + success_pipreqs = self.run_cmd(pipreqs_cmd, timeout=120, silent_error=True) + + if success_pipreqs and temp_pipreqs.exists(): + try: + pipreqs_lines = temp_pipreqs.read_text(encoding='utf-8', errors='ignore').splitlines() + for line in pipreqs_lines: + canon_name, unused_spec = parse_req_line(line) + if canon_name: + auto_detected_pkgs.add(canon_name) + if canon_name not in final_dependencies: + final_dependencies[canon_name] = unused_spec + auto_added_supplements.add(canon_name) + except Exception as e: + self.progress.emit(_("[WARN] Parse pipreqs output warning: {error}", error=str(e))) + temp_pipreqs.unlink(missing_ok=True) + + if not self.params.get('use_pipreqs_dir', False) and sandbox_dir.exists(): + robust_rmtree(sandbox_dir) + engine_pkg = "nuitka" if engine == "Nuitka" else "pyinstaller" if engine == "Nuitka" and self.params.get('nuitka_version'): engine_pkg = f"nuitka=={self.params['nuitka_version']}" elif engine == "PyInstaller" and self.params.get('pyi_version'): engine_pkg = f"pyinstaller=={self.params['pyi_version']}" - self.progress.emit(_("[INFO] Installing build engine [{pkg}] and core compilation dependencies...", pkg=engine_pkg)) - core_pkgs = [engine_pkg] + engine_pkgs = [engine_pkg] if engine == "PyInstaller": - core_pkgs.append("pillow") + engine_pkgs.append("pillow") elif engine == "Nuitka": - core_pkgs.append("zstandard") - self.progress.emit(_("[INFO] Nuitka Tip: If prompted to download GCC/MinGW compiler on first build, please ensure stable network connection.")) + engine_pkgs.append("zstandard") + + self.progress.emit(_("[INFO] Resolving project dependencies...")) + if reqs_declared_pkgs: + self.progress.emit(" • " + _("Declared in requirements.txt ({count}): {pkgs}", count=len(reqs_declared_pkgs), pkgs=', '.join(sorted(reqs_declared_pkgs)))) + else: + self.progress.emit(" • " + _("Declared in requirements.txt: None")) + + self.progress.emit(" • " + _("Discovered via scanner ({count}): {pkgs}", count=len(auto_detected_pkgs), pkgs=', '.join(sorted(auto_detected_pkgs)))) - self.run_pip_install(python_exe, ["-q"] + core_pkgs) - - if self.params.get('use_reqs'): - custom_reqs = self.params.get('reqs_file', '').strip() - if custom_reqs and Path(custom_reqs).exists(): - req_file = Path(custom_reqs) + if auto_added_supplements: + self.progress.emit(" • " + _("Auto-patched missing ({count}): {pkgs}", count=len(auto_added_supplements), pkgs=', '.join(sorted(auto_added_supplements)))) + else: + self.progress.emit(" • " + _("Manifest complete (No missing packages)")) + + self.progress.emit(" • " + _("Build engine packages ({count}): {pkgs}", count=len(engine_pkgs), pkgs=', '.join(sorted(engine_pkgs)))) + + final_install_dict = {} + for spec in engine_pkgs + list(final_dependencies.values()): + m = re.match(r'^([a-zA-Z0-9_\-\.]+)(.*)$', spec.strip()) + if m: + base_name = m.group(1).lower() + has_ver = bool(m.group(2).strip()) + if base_name in final_install_dict: + existing_has_ver = bool(re.match(r'^[a-zA-Z0-9_\-\.]+[=>= (3, 13): + cmd.append("--zig") + self.progress.emit(_("[INFO] Python 3.13+ detected: Using Zig compiler (--zig) as C backend.")) + else: + cmd.append("--mingw64") + self.progress.emit(_("[INFO] Using MinGW64 compiler (--mingw64) for C backend.")) + + free_disk = get_free_disk_gb(script_dir.as_posix()) + if free_disk < 3.0: + self.progress.emit(_("[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.", free=free_disk)) + cores = self.params.get('cpu_cores', os.cpu_count() or 2) cmd.append(f"--jobs={cores}") + + if self.params.get('upx'): + cmd.append("--enable-plugin=upx") + upx_dir_custom = (self.params.get('upx_path') or '').strip() + if upx_dir_custom and Path(upx_dir_custom).exists(): + upx_exe = Path(upx_dir_custom) / ("upx.exe" if os.name == "nt" else "upx") + if upx_exe.exists(): + cmd.append(f"--upx-binary={upx_exe.as_posix()}") + else: + cmd.append(f"--upx-binary={upx_dir_custom}") - if self.params['onefile']: cmd.append("--onefile") - else: cmd.append("--standalone") - - if self.params['noconsole']: - cmd.append("--windows-console-mode=disable") - if sys.platform == "darwin": cmd.append("--macos-create-app-bundle") + if self.params['noconsole']: + if os.name == "nt": + cmd.append("--windows-console-mode=disable") + if sys.platform == "darwin": + cmd.append("--macos-create-app-bundle") else: - cmd.append("--windows-console-mode=force") - + if os.name == "nt": + cmd.append("--windows-console-mode=force") + + is_mac_bundle = (sys.platform == "darwin" and self.params['noconsole']) + if self.params['onefile'] and not is_mac_bundle: + cmd.append("--onefile") + elif not is_mac_bundle: + cmd.append("--standalone") + if icon_path: if os.name == "nt": cmd.append(f"--windows-icon-from-ico={icon_path}") - elif sys.platform == "darwin": cmd.append(f"--macos-app-icon={icon_path}") + if sys.platform == "darwin": cmd.append(f"--macos-app-icon={icon_path}") cmd.append(f"--include-data-files={Path(icon_path).resolve().as_posix()}={Path(icon_path).name}") if os.name == "nt": @@ -3066,20 +3556,29 @@ class PackingThread(QThread): comp = self.params.get('ver_comp', 'mycompany').strip().lower().replace(" ", "") bundle_id = f"com.{comp or 'anonymous'}.{app_name.lower().replace(' ', '')}" cmd.append(f"--macos-signed-app-name={bundle_id}") - - imports_lower = {m.lower() for m in script_imports} + + hidden_list = [i.strip().lower() for i in (self.params.get('hidden_imports') or '').split(',') if i.strip()] + imports_lower = {m.lower() for m in script_imports} | set(hidden_list) + if 'pyqt5' in imports_lower: cmd.append("--enable-plugin=pyqt5") elif 'pyqt6' in imports_lower: cmd.append("--enable-plugin=pyqt6") elif 'pyside2' in imports_lower: cmd.append("--enable-plugin=pyside2") elif 'pyside6' in imports_lower: cmd.append("--enable-plugin=pyside6") if 'matplotlib' in imports_lower: cmd.append("--enable-plugin=matplotlib") - if 'tkinter' in imports_lower: cmd.append("--enable-plugin=tk-inter") + if any(tk in imports_lower for tk in ('tkinter', 'pysimplegui', 'customtkinter', 'turtle', 'easygui', 'ttkbootstrap')): + cmd.append("--enable-plugin=tk-inter") - for imp in self.params.get('hidden_imports', '').split(','): - if imp.strip(): cmd.append(f"--include-module={imp.strip()}") + if 'ttkbootstrap' in imports_lower: + cmd.append("--include-package=ttkbootstrap") + cmd.append("--include-package-data=ttkbootstrap") + + if 'numpy' in imports_lower: cmd.append("--enable-plugin=numpy") + + for imp in (self.params.get('hidden_imports') or '').split(','): + if imp.strip(): cmd.extend([f"--include-module={imp.strip()}"]) - for r_type, src, dst in self.params.get('add_data_list', []): + for r_type, src, dst in (self.params.get('add_data_list') or []): src_path = Path(src).resolve().as_posix() if r_type == 'dir': cmd.append(f"--include-data-dir={src_path}={dst}") @@ -3089,29 +3588,66 @@ class PackingThread(QThread): else: nuitka_dst = os.path.normpath(os.path.join(dst, filename)).replace('\\', '/') cmd.append(f"--include-data-files={src_path}={nuitka_dst}") - for excl in self.params.get('exclude_modules', '').split(','): + for excl in (self.params.get('exclude_modules') or '').split(','): if excl.strip(): cmd.append(f"--nofollow-import-to={excl.strip()}") - + if self.params.get('lite_mode'): - self.progress.emit(_("[INFO] Lite mode enabled, executing size reduction strategy...")) + self.progress.emit(_("[INFO] Lite mode enabled, applying bytecode optimization (-OO) and stripping dev modules...")) if not self.params.get('use_venv'): self.progress.emit(_("[WARN] Strongly recommend checking [Virtual Environment] to maximize lite mode effect.")) - - lite_excludes = ['pip', 'setuptools', 'distutils', 'wheel', 'pydoc'] - for ex in lite_excludes: - if engine == "PyInstaller": cmd.append(f"--exclude-module={ex}") - elif engine == "Nuitka": cmd.append(f"--nofollow-import-to={ex}") - - if engine == "Nuitka": - self.progress.emit(_("[INFO] Enabled Nuitka optimization directives...")) + + if engine == "PyInstaller": + cmd.append("--optimize=2") + safe_dev_excludes = ['unittest', 'doctest', 'pdb', 'pydoc', 'test', 'pytest', 'IPython', 'binder', 'tkinter.test'] + for ex in safe_dev_excludes: + cmd.append(f"--exclude-module={ex}") + elif engine == "Nuitka": cmd.append("--python-flag=-OO") + cmd.append("--enable-plugin=anti-bloat") + cmd.append("--lto=yes") cmd.append(script_posix) success = self.run_cmd(cmd, cwd=script_dir.as_posix()) - if self._is_cancelled: return self.finished.emit(False, "[INFO] Build Cancelled.", failed_packages) - self.progress.emit(_("[INFO] Core compilation completed, extracting and archiving built files...")) + if not success: + log_text = "\n".join(self.all_raw_logs) + if any(kw in log_text for kw in ["NoSpaceLeft", "No space left on device", "[Errno 28]"]): + self.progress.emit(_("[ERROR] Build aborted: Insufficient disk space (NoSpaceLeft / Errno 28). Please clean up drive space (at least 5 GB free space recommended) and try again.")) + elif any(kw in log_text for kw in ["Allocation error", "not enough memory", "ZstdError", "out of memory"]): + self.progress.emit(_("[WARN] Memory allocation exception caught (ZstdError / OOM). Triggering memory protection fallback: Retrying in single-thread mode...")) + clean_cmd = [arg if not arg.startswith("--jobs=") else "--jobs=1" for arg in cmd] + self.all_raw_logs.clear() + success = self.run_cmd(clean_cmd, cwd=script_dir.as_posix()) + + if not success and icon_path: + log_text = "\n".join(self.all_raw_logs) + icon_err_keywords = ["Failed to add resources", "error code 22", "UpdateResource", "Resource modification failed", "Failed to add"] + if any(kw in log_text for kw in icon_err_keywords): + self.progress.emit(_("[WARN] Icon resource writing blocked (possibly locked by system/antivirus), triggering fallback protection...")) + self.progress.emit(_("[INFO] Stripping icon parameters and automatically rebuilding...")) + + clean_cmd = [] + skip_next = False + for arg in cmd: + if skip_next: + skip_next = False + continue + if arg == "--icon": + skip_next = True + continue + if arg.startswith(("--windows-icon-from-ico=", "--macos-app-icon=")): + continue + if icon_path in arg and "--include-data-files=" in arg: + continue + clean_cmd.append(arg) + + self.all_raw_logs.clear() + success = self.run_cmd(clean_cmd, cwd=script_dir.as_posix()) + + if self._is_cancelled: return self.build_finished.emit(False, _("[INFO] Build Cancelled."), failed_packages) + + self.progress.emit(_("[INFO] Compilation completed, archiving built files...")) src_out = None if engine == "PyInstaller": if sys.platform == "darwin" and self.params['noconsole']: @@ -3132,8 +3668,8 @@ class PackingThread(QThread): if dist_dirs: src_out = dist_dirs[0] else: src_out = self.temp_out_dir / f"{app_name}.dist" - out_mode = int(self.params.get('out_mode', 0)) - custom_out = self.params.get('custom_out_dir', '').strip() + out_mode = int(self.params.get('out_mode', 0) or 0) + custom_out = (self.params.get('custom_out_dir') or '').strip() if out_mode == 1 and custom_out: try: final_out_dir = Path(custom_out) @@ -3142,7 +3678,12 @@ class PackingThread(QThread): else: final_out_dir = script_dir - final_out = final_out_dir / (src_out.name if src_out else f"{app_name}{ext}") + if sys.platform == "darwin" and self.params['noconsole']: + final_out = final_out_dir / f"{app_name}.app" + elif self.params['onefile']: + final_out = final_out_dir / f"{app_name}{ext}" + else: + final_out = final_out_dir / app_name if success and src_out and src_out.exists(): try: @@ -3151,8 +3692,10 @@ class PackingThread(QThread): else: final_out.unlink(missing_ok=True) shutil.move(src_out.as_posix(), final_out.as_posix()) except Exception as e: + success = False self.progress.emit(_("[ERROR] Product transfer failed, file might be occupied by system process or lack permission: {error}", error=str(e))) else: + success = False self.progress.emit(_("[ERROR] Could not locate valid executable product in temporary build directory: {path}", path=str(src_out))) if success and final_out.exists(): @@ -3163,24 +3706,18 @@ class PackingThread(QThread): log_file.write_text('\n'.join(self.all_raw_logs), encoding='utf-8') self.progress.emit(_("[INFO] Build log exported to: {path}", path=log_file.as_posix())) except: pass - self.finished.emit(True, _("[SUCCESS] Compilation completed, output path: {path}", path=final_out.resolve().as_posix()), failed_packages) + self.build_finished.emit(True, _("[SUCCESS] Compilation completed, output path: {path}", path=final_out.resolve().as_posix()), failed_packages) else: err_info = self.detect_python_syntax_errors() if err_info["is_code_error"]: - msg = _("[Syntax Error] Source program has syntax or indentation errors!\n - File: {file}\n - Type: {type}\n - Line: near {line}\n - Desc: {desc}\n\nTip: This is an error in the source code logic. Ensure it runs locally before compiling.", + msg = _("[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.", file=err_info['file'], type=err_info['type'], line=err_info['line'], desc=err_info['desc']) else: - if self.params.get('concise_log', True) and self.all_raw_logs: - self.progress.emit(_("\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!")) - self.progress.emit('\n'.join(self.all_raw_logs[-100:])) - msg = _("[FAILED] Compilation interrupted with exceptions, refer to the log for troubleshooting.") - self.finished.emit(False, msg, failed_packages) - + msg = _("[FAILED] Compilation interrupted with exceptions, please click 'Detailed Mode' above the log window for troubleshooting.") + self.build_finished.emit(False, msg, failed_packages) + except Exception as e: - if self.params.get('concise_log', True) and self.all_raw_logs: - self.progress.emit(_("\n!!!!!!!!!! [Diagnostic Traceback: Full raw log due to execution exception in this step] !!!!!!!!!!")) - self.progress.emit('\n'.join(self.all_raw_logs[-100:])) - self.finished.emit(False, f"[ERROR] {str(e)}", failed_packages) + self.build_finished.emit(False, f"[ERROR] {str(e)}", failed_packages) finally: if is_temp and build_script_path and build_script_path.exists(): try: @@ -3207,7 +3744,7 @@ class PackingThread(QThread): if p and p.exists(): robust_rmtree(p) app_name = self.params.get('app_name', 'app') - for p in ["__pycache__", f"{app_name}.build", f"{app_name}.dist", f"{app_name}.onefile-build"]: + for p in ["__pycache__", f"{app_name}.build", f"{app_name}.onefile-build"]: robust_rmtree(script_dir / p) spec_file = script_dir / f"{app_name}.spec" @@ -3215,34 +3752,6 @@ class PackingThread(QThread): try: spec_file.unlink() except: pass -class SmoothSlideOverlay(QWidget): - - def __init__(self, parent, pix_old, pix_new, direction): - super().__init__(parent) - self.pix_old = pix_old - self.pix_new = pix_new - self.direction = direction - self.progress = 0.0 - self.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents) - - def set_progress(self, p): - self.progress = p - self.update() - - def paintEvent(self, event): - painter = QPainter(self) - painter.setRenderHint(QPainter.RenderHint.SmoothPixmapTransform) - painter.setRenderHint(QPainter.RenderHint.Antialiasing) - - w = float(self.width()) - p = self.progress - - x_old = -w * p * self.direction - x_new = w * (1.0 - p) * self.direction - - painter.drawPixmap(QPointF(x_old, 0), self.pix_old) - painter.drawPixmap(QPointF(x_new, 0), self.pix_new) - class MainWindow(QMainWindow): def __init__(self): super().__init__() @@ -3250,15 +3759,21 @@ class MainWindow(QMainWindow): self.thread = None self.analysis_thread = None self.current_state = "idle" + + load_config() + self.init_style() self.init_ui() I18N.language_changed.connect(self.retranslate_ui) + self.retranslate_ui() + + def init_style(self): self.setWindowTitle(f"{__app_name__} {__version__}") - self.setMinimumSize(740, 680) - self.resize(780, 680) + self.setMinimumSize(560, 460) + self.resize(760, 580) icon_path = get_resource_path("icon.ico") if os.path.exists(icon_path): @@ -3287,8 +3802,8 @@ class MainWindow(QMainWindow): self.main_panel = QWidget() layout = QVBoxLayout(self.main_panel) - layout.setSpacing(15) - layout.setContentsMargins(20, 20, 20, 20) + layout.setSpacing(12) + layout.setContentsMargins(20, 20, 20, 16) self.drop_area = DropArea(self) self.drop_area.fileDropped.connect(self.on_script_selected) @@ -3297,18 +3812,48 @@ class MainWindow(QMainWindow): self.log_container = QWidget() log_lay = QVBoxLayout(self.log_container) log_lay.setContentsMargins(0, 0, 0, 0) - self.log = QTextEdit() - self.log.setReadOnly(True) - self.log.setFixedHeight(120) - self.log.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) - self.log.customContextMenuRequested.connect(self.show_log_context_menu) - log_lay.addWidget(self.log) + + log_header = QHBoxLayout() + log_header.setContentsMargins(5, 0, 5, 2) + self.log_title = QLabel(_("Execution Log")) + self.log_title.setStyleSheet("color: #5f6368; font-weight: bold; font-size: 13px;") + + self.btn_toggle_log_mode = QPushButton() + self.btn_toggle_log_mode.setCheckable(True) + self.btn_toggle_log_mode.setCursor(Qt.CursorShape.PointingHandCursor) + self.btn_toggle_log_mode.setStyleSheet(""" + QPushButton { background-color: transparent; color: #1A73E8; border: none; font-size: 12px; font-weight: bold; } + QPushButton:hover { color: #1B66C9; text-decoration: underline; } + """) + self.btn_toggle_log_mode.clicked.connect(self.on_log_mode_toggled) + + log_header.addWidget(self.log_title) + log_header.addStretch(1) + log_header.addWidget(self.btn_toggle_log_mode) + + self.log_stack_widget = QWidget() + self.log_stack = QStackedLayout(self.log_stack_widget) + self.log_stack.setContentsMargins(0, 0, 0, 0) + + self.log_concise = QTextEdit() + self.log_detailed = QTextEdit() + + for text_edit in (self.log_concise, self.log_detailed): + text_edit.setReadOnly(True) + text_edit.setMinimumHeight(80) + text_edit.setMaximumHeight(160) + text_edit.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) + text_edit.customContextMenuRequested.connect(self.show_log_context_menu) + self.log_stack.addWidget(text_edit) + + log_lay.addLayout(log_header) + log_lay.addWidget(self.log_stack_widget) self.log_container.hide() layout.addWidget(self.log_container) btn_layout = QHBoxLayout() btn_layout.setSpacing(12) - btn_layout.setContentsMargins(0, 5, 0, 0) + btn_layout.setContentsMargins(0, 0, 0, 0) self.btn_left = AnimatedButton("") self.btn_left.setFixedSize(44, 44) @@ -3336,6 +3881,11 @@ class MainWindow(QMainWindow): self.stacked_layout.addWidget(self.settings_panel) self.stacked_layout.setCurrentWidget(self.main_panel) + is_concise = self.settings_panel.concise_log_check.isChecked() + self.btn_toggle_log_mode.setChecked(not is_concise) + self.btn_toggle_log_mode.setText(_("Detailed Mode") if is_concise else _("Concise Mode")) + self.log_stack.setCurrentWidget(self.log_concise if is_concise else self.log_detailed) + self.status_bar = self.statusBar() self.status_label = QLabel(_("Status: Ready")) self.status_bar.addWidget(self.status_label) @@ -3386,11 +3936,35 @@ class MainWindow(QMainWindow): self.update_ui_state(self.current_state) + if hasattr(self, 'log_title'): + self.log_title.setText(_("Execution Log")) + is_concise = self.settings_panel.concise_log_check.isChecked() + self.btn_toggle_log_mode.setText(_("Detailed Mode") if is_concise else _("Concise Mode")) + if self.current_state == "idle": self.set_status(_("Status: Ready")) + self.drop_area.label.setText(_("Python Packaging, Reimagined.")) + self.drop_area.sub_label.setText(_("Drop Python source code to start")) + elif self.current_state == "ready": mode_suffix = _(" [Console]") if not self.settings_panel.noconsole_check.isChecked() else _(" [No Console]") self.set_status(_("Status: Loaded {filename}{mode}", filename=Path(self.script_path).name, mode=mode_suffix)) + self.drop_area.label.setText(_("Loaded: {filename}", filename=Path(self.script_path).name)) + self.drop_area.sub_label.setText(_("Ready, waiting for build.")) + + elif self.current_state == "building": + self.set_status(_("Status: Packaging ({engine}) ...", engine=self.settings_panel.engine_combo.currentText())) + + elif self.current_state == "done": + self.set_status(_("Status: Build Completed")) + self.drop_area.label.setText(_("Build Successful")) + self.drop_area.sub_label.setText(_("Open output directory or reset workspace.")) + + elif self.current_state == "failed": + self.set_status(_("Status: Build Failed")) + self.drop_area.label.setText(_("Build Failed")) + self.drop_area.sub_label.setText(_("Check log output below for troubleshooting.")) + elif self.current_state == "building": self.set_status(_("Status: Packaging ({engine}) ...", engine=self.settings_panel.engine_combo.currentText())) elif self.current_state == "done": @@ -3408,13 +3982,13 @@ class MainWindow(QMainWindow): self.thread.wait() if self.analysis_thread and self.analysis_thread.isRunning(): - self.analysis_thread.terminate() - self.analysis_thread.wait() + self.analysis_thread.requestInterruption() + self.analysis_thread.wait(1000) if hasattr(self,'settings_panel') and hasattr(self.settings_panel, 'scanner_thread'): if self.settings_panel.scanner_thread and self.settings_panel.scanner_thread.isRunning(): - self.settings_panel.scanner_thread.terminate() - self.settings_panel.scanner_thread.wait() + self.settings_panel.scanner_thread.requestInterruption() + self.settings_panel.scanner_thread.wait(1000) super().closeEvent(event) @@ -3540,20 +4114,24 @@ class MainWindow(QMainWindow): self.show_error_log(_("[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again.")) return - if self.script_path and self.script_path != path: + if self.script_path != path: self.settings_panel.icon_edit.clear() self.settings_panel.hidden_edit.clear() + self.settings_panel.exclude_edit.clear() self.settings_panel.add_data_list.clear() + self.settings_panel.reqs_file_edit.clear() + self.settings_panel.out_dir_edit.clear() + self.settings_panel.name_edit.clear() self.script_path = path self.drop_area.set_loading(Path(path).name) self.set_status(_("Status: Parsing {filename}...", filename=Path(path).name)) if self.analysis_thread and self.analysis_thread.isRunning(): - self.analysis_thread.terminate() - self.analysis_thread.wait() + self.analysis_thread.requestInterruption() + self.analysis_thread.wait(1000) - self.analysis_thread = ScriptAnalysisThread(self.script_path) + self.analysis_thread = ScriptAnalysisThread(self.script_path, get_python_executable()) self.analysis_thread.analysis_done.connect(self.on_analysis_finished) self.analysis_thread.start() @@ -3567,7 +4145,12 @@ class MainWindow(QMainWindow): self.settings_panel.ver_comp.setText(author) self.settings_panel.ver_desc.setText(desc) - gui_libs = {'pyqt5', 'pyqt6', 'pyside2', 'pyside6', 'tkinter', 'wx', 'kivy', 'libavg'} + gui_libs = { + 'pyqt5', 'pyqt6', 'pyside2', 'pyside6', 'tkinter', 'wx', 'kivy', 'libavg', + 'pysimplegui', 'customtkinter', 'turtle', 'easygui', 'pygame', 'arcade', + 'dearpygui', 'flet', 'webview', 'remi' + } + has_gui = any(lib in {m.lower() for m in script_imports} for lib in gui_libs) self.settings_panel.noconsole_check.setChecked(has_gui) @@ -3578,27 +4161,33 @@ class MainWindow(QMainWindow): auto_icon = None if self.settings_panel.auto_icon_check.isChecked(): - preferred_extensions = [".ico", ".icns", ".png", ".svg"] - if sys.platform == "darwin": preferred_extensions = [".icns", ".png", ".svg", ".ico"] - elif sys.platform == "linux": preferred_extensions = [".png", ".svg", ".ico", ".icns"] - + ext_priority = [".ico", ".png", ".jpg", ".jpeg", ".svg"] + if sys.platform == "darwin": + ext_priority = [".icns", ".png", ".svg", ".ico"] + name_priority = ["logo", "icon", "app", "favicon", Path(path).stem] + + auto_icon = None found = False - for ext in preferred_extensions: - for name in ["icon", "logo", "ICON", "LOGO"]: - trial = script_dir / f"{name}{ext}" - if trial.exists(): - auto_icon = trial - self.settings_panel.icon_edit.setText(trial.resolve().as_posix()) - found = True - break + for ext in ext_priority: + for name in name_priority: + for n_variant in [name, name.lower(), name.upper(), name.capitalize()]: + trial = script_dir / f"{n_variant}{ext}" + if trial.exists() and trial.is_file(): + auto_icon = trial + found = True + break + if found: break if found: break + + if auto_icon: + self.settings_panel.icon_edit.setText(auto_icon.resolve().as_posix()) self.drop_area.set_success(Path(path).name, custom_icon_path=auto_icon) mode_suffix = _(" [Console]") if not has_gui else _(" [No Console]") self.set_status(_("Status: Loaded {filename}{mode}", filename=Path(path).name, mode=mode_suffix)) - if not self.log_container.isVisible(): self.toggle_log() - self.log.clear() + self.log_concise.clear() + self.log_detailed.clear() self.append_log(_("Loaded: {filename}", filename=path)) self.btn_main.setEnabled(True) self.update_ui_state("ready") @@ -3616,6 +4205,27 @@ class MainWindow(QMainWindow): return sp = self.settings_panel + + raw_py = sp.python_path_combo.currentText().strip() + if " (Python " in raw_py: + raw_py = raw_py.split(" (Python ")[0].strip() + if not raw_py: + raw_py = get_python_executable() + + if not raw_py or not shutil.which(raw_py): + msg = QMessageBox(self) + msg.setIcon(QMessageBox.Icon.Warning) + msg.setWindowTitle(_("Python Environment Required")) + msg.setText(_("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).")) + + btn_down = msg.addButton(_("Download Python"), QMessageBox.ButtonRole.ActionRole) + btn_cancel = msg.addButton(_("Cancel"), QMessageBox.ButtonRole.RejectRole) + + msg.exec() + if msg.clickedButton() == btn_down: + __import__('webbrowser').open("https://www.python.org/downloads/") + return + app_name = sp.name_edit.text().strip() or Path(self.script_path).stem engine = sp.engine_combo.currentText() @@ -3636,24 +4246,52 @@ class MainWindow(QMainWindow): except: pass icon_path_str = sp.icon_edit.text().strip() + + if icon_path_str and not Path(icon_path_str).exists(): + self.show_error_log(_("[ERROR] The specified icon file does not exist: {path}", path=icon_path_str)) + return + temp_icon_file = None - if icon_path_str and Path(icon_path_str).exists(): + if icon_path_str: + icon_path = Path(icon_path_str) needed_ext = "ico" if os.name == "nt" else ("icns" if sys.platform == "darwin" else "png") - - if icon_path.suffix.lower() != f".{needed_ext}": - temp_ico_name = f"qpypack_temp_icon_{int(time.time())}.{needed_ext}" - temp_ico = Path(tempfile.gettempdir()) / temp_ico_name + + is_valid_native_icon = False + if icon_path.suffix.lower() == f".{needed_ext}": + try: + with open(icon_path, 'rb') as f: + header = f.read(4) + if needed_ext == "ico" and header == b'\x00\x00\x01\x00': + is_valid_native_icon = True + elif needed_ext == "icns" and header == b'icns': + is_valid_native_icon = True + except: + is_valid_native_icon = False + + if is_valid_native_icon: + icon_path_str = icon_path.as_posix() + else: + temp_ico = Path(tempfile.gettempdir()) / f"qpypack_sanitized_icon_{int(time.time())}.{needed_ext}" if convert_image_to_format(icon_path.as_posix(), temp_ico.as_posix(), needed_ext): icon_path_str = temp_ico.as_posix() temp_icon_file = temp_ico.as_posix() + else: + icon_path_str = icon_path.as_posix() add_data_items = [sp.add_data_list.item(i).data(Qt.ItemDataRole.UserRole) for i in range(sp.add_data_list.count())] main_pip = sp._get_url_from_combo(sp.pip_source_combo) backup_pip = sp._get_url_from_combo(sp.pip_backup_combo) + 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() + if k and v: mappings[k] = v + params = { 'engine': engine, + 'mappings': mappings, 'script_path': self.script_path, 'app_name': app_name, 'onefile': sp.onefile_check.isChecked(), @@ -3665,7 +4303,7 @@ class MainWindow(QMainWindow): 'reqs_file': sp.reqs_file_edit.text().strip(), 'hidden_imports': sp.hidden_edit.text(), 'add_data_list': add_data_items, - 'upx': sp.upx_check.isChecked() if engine == "PyInstaller" else False, + 'upx': sp.upx_check.isChecked(), 'upx_path': sp.upx_path_edit.text().strip(), 'cpu_cores': sp.cores_spin.value(), 'exclude_modules': sp.exclude_edit.text().strip(), @@ -3688,12 +4326,13 @@ class MainWindow(QMainWindow): 'pipreqs_version': sp.pipreqs_ver_edit.text().strip() } - self.log.clear() + self.log_concise.clear() + self.log_detailed.clear() if not self.log_container.isVisible(): self.toggle_log() self.thread = PackingThread(params) self.thread.progress.connect(self.append_log) - self.thread.finished.connect(self.on_pack_finished) + self.thread.build_finished.connect(self.on_pack_finished) self.thread.start() self.set_status(_("Status: Packaging ({engine}) ...", engine=engine)) @@ -3701,7 +4340,7 @@ class MainWindow(QMainWindow): self.drop_area.start_build_anim() def on_pack_finished(self, success, msg, failed_pkgs=None): - self.append_log("\n" + "━"*50 + "\n" + msg) + self.append_log("\n" + msg) self.drop_area.stop_build_anim() play_alert(success) @@ -3718,7 +4357,7 @@ class MainWindow(QMainWindow): if failed_pkgs: warn_msg = _("Dependency Missing Warning: {pkgs} failed to install. Check log for details.", pkgs=", ".join(failed_pkgs)) self.show_notification(warn_msg, 6000) - err_log = _("[ERROR] Build completed, but the following dependencies failed to install during pre-build:\n\n 👉 {pkgs}\n\n⚠️ Tip: The program might crash at runtime due to missing modules!", pkgs=", ".join(failed_pkgs)) + err_log = _("[ERROR] Build completed, but the following dependencies failed to install:\n\n - {pkgs}\n\nNote: The application might raise ModuleNotFoundError at runtime.", pkgs=", ".join(failed_pkgs)) self.show_error_log(err_log) def open_dist(self): @@ -3729,50 +4368,101 @@ class MainWindow(QMainWindow): if target.exists(): try: - if os.name == 'nt': os.startfile(target) - elif sys.platform == 'darwin': subprocess.call(('open', target.as_posix())) - else: subprocess.call(('xdg-open', target.as_posix())) + QDesktopServices.openUrl(QUrl.fromLocalFile(target.resolve().as_posix())) except: pass + def reset_all(self): self.script_path = "" self.settings_panel.name_edit.clear() self.settings_panel.icon_edit.clear() self.settings_panel.hidden_edit.clear() + self.settings_panel.exclude_edit.clear() self.settings_panel.add_data_list.clear() - self.log.clear() + self.settings_panel.reqs_file_edit.clear() + self.settings_panel.out_dir_edit.clear() + self.settings_panel.ver_ver.setText("1.0.0") + self.settings_panel.ver_comp.setText("My Studio") + self.settings_panel.ver_desc.setText("Python Executable") + self.log_concise.clear() + self.log_detailed.clear() if self.log_container.isVisible(): self.toggle_log() self.drop_area.reset() self.set_status(_("Status: Workspace Reset")) self.update_ui_state("idle") + + def on_log_mode_toggled(self, checked): + is_concise = not checked + self.settings_panel.concise_log_check.setChecked(is_concise) + self.btn_toggle_log_mode.setText(_("Detailed Mode") if is_concise else _("Concise Mode")) + self.log_stack.setCurrentWidget(self.log_concise if is_concise else self.log_detailed) def append_log(self, msg, is_error=False): - if is_error: - safe_msg = msg.replace('<', '<').replace('>', '>').replace('\n', '
') - self.log.append(f'{safe_msg}') - else: - self.log.append(msg) - - self.log.ensureCursorVisible() - + concise_lines = [] + for line in msg.split('\n'): - line = line.strip() - if not line: continue + line_strip = line.strip() + if not line_strip: continue - if line.startswith(("[INFO]", "[WARN]", "[SUCCESS]", "[FAILED]", "[ERROR]")): - clean_text = line - for prefix in ("[INFO]", "[WARN]", "[SUCCESS]", "[FAILED]", "[ERROR]"): - if clean_text.startswith(prefix): - clean_text = clean_text[len(prefix):].strip() - break + if is_error: + concise_lines.append(line) + continue - if self.current_state == "building" and clean_text: - if len(clean_text) > 35: clean_text = clean_text[:32] + "..." + is_concise_kept = False + valid_prefixes = ( + "[INFO]", "[WARN]", "[SUCCESS]", "[FAILED]", "[ERROR]", "[Syntax Error]", + "•", "---", "━", "!" + ) + + if any(line_strip.startswith(p) for p in valid_prefixes): + concise_lines.append(line) + is_concise_kept = True + + if self.current_state == "building": + if any(k in line for k in ("Nuitka", "Scons", "PyInstaller", "Compiling", "Building", "Linking")): + clean_sub = re.sub(r'^(Nuitka-Scons:|Nuitka:|INFO:\s*PyInstaller:|\d+\s+INFO:\s*)', '', line).strip() + if clean_sub and len(clean_sub) > 3 and not clean_sub.startswith("Used command line"): + if len(clean_sub) > 60: clean_sub = clean_sub[:57] + "..." + self.drop_area.sub_label.setText(clean_sub) + + engine_name = self.settings_panel.engine_combo.currentText() + target_text = _("Status: Packaging ({engine}) ...", engine=engine_name).replace("Status: ", "").replace("状态: ", "") + if self.drop_area.label.text() != target_text: + self.drop_area.label.setText(target_text) + self.drop_area.label.setStyleSheet("QLabel { background: transparent; color: #1A73E8; font-size: 16px; font-weight: bold; border: none; }") + + if not is_concise_kept: + concise_lines.append(f"[BUILD] {clean_sub}") + + elif line_strip.startswith(("[INFO]", "[WARN]", "[SUCCESS]", "[FAILED]", "[ERROR]")): + clean_text = line_strip + for prefix in ("[INFO]", "[WARN]", "[SUCCESS]", "[FAILED]", "[ERROR]"): + if clean_text.startswith(prefix): + clean_text = clean_text[len(prefix):].strip() + break + if len(clean_text) > 40: clean_text = clean_text[:37] + "..." self.drop_area.label.setText(clean_text) self.drop_area.label.setStyleSheet("QLabel { background: transparent; color: #1A73E8; font-size: 16px; font-weight: bold; border: none; }") + concise_msg = '\n'.join(concise_lines) + + if concise_msg: + self._render_text_edit(self.log_concise, concise_msg, is_error) + + self._render_text_edit(self.log_detailed, msg, is_error) + + + def _render_text_edit(self, text_edit, msg, is_error): + if is_error: + safe_msg = msg.replace('<', '<').replace('>', '>').replace('\n', '
') + text_edit.append(f'{safe_msg}') + else: + text_edit.append(msg) + text_edit.ensureCursorVisible() + 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; } @@ -3782,24 +4472,27 @@ class MainWindow(QMainWindow): """) act_copy = menu.addAction(_("Copy")) - act_copy.setEnabled(self.log.textCursor().hasSelection()) - act_copy.triggered.connect(self.log.copy) + act_copy.setEnabled(current_log.textCursor().hasSelection()) + act_copy.triggered.connect(current_log.copy) act_select_all = menu.addAction(_("Select All")) - act_select_all.triggered.connect(self.log.selectAll) + act_select_all.triggered.connect(current_log.selectAll) menu.addSeparator() act_clear = menu.addAction(_("Clear Log")) - act_clear.triggered.connect(self.log.clear) + act_clear.triggered.connect(self.log_concise.clear) + act_clear.triggered.connect(self.log_detailed.clear) act_save = menu.addAction(_("Export Log...")) act_save.triggered.connect(self.save_log_file) - menu.exec(self.log.mapToGlobal(pos)) + menu.exec(current_log.mapToGlobal(pos)) def save_log_file(self): - content = self.log.toPlainText() + current_log = self.log_stack.currentWidget() + content = current_log.toPlainText() + if not content.strip(): return self.show_notification(_("No log content.")) diff --git a/qpypack/requirements.txt b/qpypack/requirements.txt new file mode 100644 index 0000000..2b5901e --- /dev/null +++ b/qpypack/requirements.txt @@ -0,0 +1,4 @@ +Pillow==12.3.0 +pyside6==6.11.1 +pyside6_addons==6.11.1 +pyside6_essentials==6.11.1