Desktop helper that extracts untranslated gettext .po strings to JSON and writes translations back by msgid, so entries cannot land on the wrong line.

Warning
The PyInstaller EXE is unsigned. Windows SmartScreen may warn on first launch. The tool never overwrites the source .po; pick a new output path.
One-click deploy this repository with GitHub Deploy Desk.
Get the deployer: https://github.com/axioxmedia/github-deployer
Paste this repo URL into Deploy Desk: https://github.com/axioxmedia/PO_Translator_Assistant_GUI
Read the README in the app, then confirm deploy.
That is the supported install path. Use the source / EXE steps below only if you are already building from a local checkout.
Platform | Package | Guide |
|---|---|---|
Windows 10/11 |
| Python 3.11+ on PATH, close any running EXE, then |
Development | Run from source |
|
git clone https://github.com/axioxmedia/PO_Translator_Assistant_GUI.git
cd PO_Translator_Assistant_GUI
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python app.pypython app.py --web serves only the local UI at http://127.0.0.1:8787.
build_exe.batOr:
powershell -ExecutionPolicy Bypass -File .\build_exe.ps1Output: dist\PoTranslatorDesk.exe. If the window fails to start, send dist\po_translator_desk.log.
Area | Included |
|---|---|
Extract | Writes untranslated rows ( |
Apply by msgid | Dictionary match on |
Safe output | Writes a new |
Progress | Total / done / pending / percent plus a local log pane |
Header pass | Sets |
Desktop UI | Dark glass layout, zh/en switch, native file dialogs |
Local only | Binds |
Pick the source .po.
Extract untranslated → save untranslated.json.
Fill msgstr in that JSON with an editor or an AI chat. Keep the array shape.
Apply translations → write {stem}.zh_CN.po.
Show progress on the source or the output file.
JSON shape:
[
{
"id": 1,
"msgid": "Welcome to our platform",
"msgstr": "欢迎来到我们的平台"
}
]Rows with an empty msgstr are skipped on apply.
Minimum | Recommended | |
|---|---|---|
OS | Windows 10 x64 for the EXE | Windows 11 |
RAM | 4 GB | 8 GB |
Disk | 200 MB for the app | SSD |
Python from source | 3.11+ | 3.12 |
WebView2 ships with current Windows 10/11. No GPU and no third-party translation key are required.
pywebview desktop window
│ HTTP on 127.0.0.1
FastAPI + uvicorn
├── GET /api/defaults
├── POST /api/pick
├── POST /api/inspect
├── POST /api/extract
└── POST /api/apply
static HTML / CSS / JS
axioxmedia.py (packer watermark + OS title)
Layer | Path | Responsibility |
|---|---|---|
Window |
| Port pick, uvicorn thread, pywebview, dark title bar |
Brand |
| OS-language window title and packer mark |
API |
| PO parse, JSON extract, msgid apply |
UI |
| i18n, paths, stats, log |
Pack |
| Onefile EXE with |
The windowed EXE has no console. ensure_stdio() and log_config=None keep uvicorn from crashing when sys.stderr is None.
This desk-app keeps the v1.3 Tkinter match rules: single-line msgid / msgstr blocks and msgid dictionary apply.